42/C4
集体代码构建契约
- 状态:稳定
- 编辑:Pieter Hintjens ph@imatix.com
集体代码构建契约 (C4) 是 github.com Fork + Pull 模型的演进,旨在为自由软件项目提供最优化的协作模型。这是 C4 规范的修订版 2,取代了 RFC 22。
许可
版权所有 (c) 2009-2016 Pieter Hintjens。
本规范是自由软件;您可以根据自由软件基金会发布的 GNU 通用公共许可证的条款重新分发和/或修改它;许可证的第 3 版,或(由您选择)任何更高版本。
分发本规范是希望它会有用,但没有任何担保;甚至没有适销性或特定用途适用性的默示担保。详情请参阅 GNU 通用公共许可证。
您应该已经收到一份 GNU 通用公共许可证的副本以及本程序;如果没有,请参阅 https://gnu.ac.cn/licenses。
摘要
C4 为软件项目的贡献、评估和讨论改进提供了一个标准流程。它为项目定义了特定的技术要求,如代码风格指南、单元测试、git
和类似平台。它还为项目确立了不同的角色,并明确区分了职责。C4 规定了一个用于记录和讨论问题的流程,包括寻求共识、清晰描述、使用“pull request”和系统性评审。
语言
本文档中的关键词“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY”和“OPTIONAL”应按照 RFC 2119 中的描述进行解释。
1. 目标
C4 旨在为开源软件项目提供一个可复用的最优协作模型。它具有以下具体目标:
- 通过减少新贡献者的摩擦,并创建一个具有强大正向反馈的分级参与模型,最大化项目社区的规模和多样性;
- 通过分离不同的技能集来减轻对关键个人的依赖,从而在任何所需领域拥有更大的能力储备;
- 通过增加决策过程的多样性,使项目更快、更准确地发展;
- 通过允许安全实验、快速失败和稳定代码的隔离,支持项目版本从实验阶段到稳定阶段的自然生命周期;
- 降低项目仓库的内部复杂性,从而使贡献者更容易参与并减少出错的可能性;
- 强制实行项目的集体所有权,这增加了对贡献者的经济激励,并降低了被敌对实体劫持的风险。
2. 设计
2.1. 前言
- 项目SHALL使用git分布式版本控制系统。
- 项目SHALL托管在github.com或同等平台上,此处称为“平台”。
- 项目SHALL使用平台的议题追踪器。
- 项目SHOULD拥有清晰记录的代码风格指南。
- “贡献者”是指希望提供补丁的人,补丁是解决某个明确问题的提交集。
- “维护者”是指将补丁合并到项目的人。维护者不是开发者;他们的职责是执行流程。
- 贡献者SHALL NOT拥有仓库的提交权限,除非他们也是维护者。
- 维护者SHALL拥有仓库的提交权限。
- 任何人,不分区别或歧视,SHALL拥有根据本契约条款成为贡献者的平等权利。
2.2. 许可与所有权
- 项目SHALL使用类似共享许可(如 MPLv2 或 GPLv3 的变体,包括 GPL、LGPL、AGPL)。
- 所有对项目源代码的贡献(“补丁”)SHALL使用与项目相同的许可。
- 所有补丁归其作者所有。SHALL NOT有任何版权转让流程。
- 每位贡献者SHALL负责在项目贡献者列表中表明身份。
2.3. 补丁要求
- 维护者和贡献者MUST拥有平台账号,并SHOULD使用他们的真实姓名或常用别名。
- 补丁SHOULD是对一个明确识别并同意的问题的最小且准确的解答。
- 如果项目定义了代码风格指南,补丁MUST遵守这些指南。
- 补丁MUST遵守下方定义的“公共契约的演进”指南。
- 补丁SHALL NOT包含来自其他项目的非平凡代码,除非贡献者是该代码的原始作者。
- 补丁MUST在至少主要目标平台上干净编译并通过项目自测试。
- 补丁提交信息MUST由一行简短(少于 50 个字符)的文字组成,说明正在解决的问题(“问题:…”),后跟一个空行,然后再是提议的解决方案(“解决方案:…”)。
- “正确补丁”是满足上述要求的补丁。
2.4. 开发流程
- 项目的变更SHALL遵循准确识别问题并对这些问题应用最小、准确解决方案的模式。
- 要请求变更,用户SHOULD在项目平台的议题追踪器上记录一个议题。
- 用户或贡献者SHOULD通过描述他们遇到或观察到的问题来撰写议题。
- 用户或贡献者SHOULD就其观察的准确性以及解决问题的价值寻求共识。
- 用户SHALL NOT记录功能请求、想法、建议或任何未明确记录且不可证明的问题的解决方案。
- 因此,项目的发布历史SHALL是一个记录和解决有意义议题的列表。
- 要处理议题,贡献者SHALL Fork项目仓库,然后在他们的Fork仓库上工作。
- 要提交补丁,贡献者SHALL在平台创建指向项目的 pull request。
- 贡献者SHALL NOT直接提交变更到项目。
- 如果平台将 pull request 实现为议题,贡献者MAY直接发送 pull request,而无需单独记录议题。
- 要讨论补丁,人们MAY在平台的 pull request、提交或其它地方发表评论。
- 要接受或拒绝补丁,维护者SHALL使用平台接口。
- 维护者SHOULD NOT合并他们自己的补丁,除非在特殊情况下,例如其他维护者长时间(超过 1-2 天)没有响应。
- 维护者SHALL NOT对正确补丁进行价值判断。
- 维护者SHALL快速合并来自其他贡献者的正确补丁。
- 维护者MAY合并来自其他贡献者的不正确补丁,其目标包括 (a) 结束无效讨论,(b) 在历史记录中捕捉不良补丁,(c) 与贡献者互动以提高他们的补丁质量。
- 创建议题的用户SHOULD在检查补丁成功后关闭议题。
- 对补丁有价值判断的任何贡献者SHOULD通过他们自己的补丁来表达这些判断。
- 维护者SHOULD关闭长时间(令人不适)未采取行动而仍处于打开状态的用户议题。
2.5. 分支与发布
- 项目SHALL有一个分支(“main”),它始终保存最新的开发中版本,并且SHOULD始终能够构建。
- 项目SHALL NOT出于任何原因使用特性分支(topic branches)。个人 Fork MAY使用特性分支。
- 要创建稳定版本,维护者应为仓库打标签。稳定版本SHALL始终从仓库的 main 分支发布。
2.6. 公共契约的演进
- 所有公共契约(API 或协议)SHALL被文档化。
- 所有公共契约SHOULD为可扩展性和实验预留空间。
- 修改稳定公共契约的补丁SHOULD不破坏现有应用程序,除非有压倒性的共识认为这样做有价值。
- 引入新功能的补丁SHOULD使用新名称(新契约)来引入。
- 新契约SHOULD在稳定并被实际用户使用之前被标记为“草案”。
- 旧契约SHOULD以系统性的方式被弃用,将其标记为“已弃用”,并根据需要用新契约替代。
- 在经过足够长时间后,旧的已弃用契约SHOULD被移除。
- 旧名称SHALL NOT被新契约复用。
2.7. 项目管理
- 项目创始人SHALL担任管理员,管理项目维护者集合。
- 管理员SHALL通过提拔最有效的维护者来确保自身的传承。
- 制作正确补丁、清楚理解项目目标和流程的新贡献者SHOULD被邀请成为维护者。
- 管理员SHOULD移除长期不活跃或反复未能准确执行此流程的维护者。
- 管理员SHOULD屏蔽或禁止那些对项目中的其他人造成压力和痛苦的“不良行为者”(bad actors)。这应该在公开讨论之后进行,并给予所有相关方发言的机会。不良行为者是指那些屡次忽视项目规则和文化、不必要地好辩或怀有敌意、或冒犯他人、并且在他人要求时无法自我纠正其行为的人。
延伸阅读
-
Argyris 的模型 1 和 2 - C4 的目标与 Argyris 的模型 2 一致。
-
丰田 Kata - 包括改进 Kata(一次解决一个问题)和教练 Kata(帮助他人学习改进 Kata)。
实现
- ZeroMQ 社区在许多项目中使用了 C4 流程。
- OSSEC 使用了 C4 流程。
- Machinekit 社区使用了 C4 流程。