2014 年 2 月 14 日是豆瓣 CODE 项目成立两周年,同日豆瓣 CODE 团队宣布 将整个框架开源。本次开源包含 CODE 框架 以及 Mikoto、Linguist、P、CodeLive 等周边项目,感兴趣的工程师可以在这个基础上继续开发。
下面,豆瓣 CODE 的工程师们将在 InfoQ 上分享一些 CODE 背后的故事。
2012 年初,已经对 SVN 和 Mercurial 无力吐槽的豆瓣工程师们正面临一个艰难的决定:是往 Github 企业版迁移,还是自己研发一套代码管理系统。
2012 年 2 月 14 日,清风老师为豆瓣 CODE 写入了第一行代码;一周之后,一个用 Trac 改造的原型诞生了。CODE 不是一个公司项目,自始至终没有任何一个豆瓣的产品团队或工程团队为这套系统负责,但一个又一个的豆瓣工程师开始被吸引到这个项目周围,形成了一个强大的虚拟团队。
随着 Github 在国内的普及程度越来越高,越来越多的企业也开始探索自建 git 仓库之路。开源的 Gitlab 项目 开始受到部分团队的关注,但这个项目仍有较多局限性。这时,豆瓣 CODE 引起了包括淘宝在内不少同行的兴趣,并开始沟通将 CODE 开源的可能性。
作为一个面向内部设计的系统,CODE 的源代码中混杂了大量豆瓣专有系统的依赖,如果要开源出来需耗费不少的工作量,之前 清风在 C2D2 的分享 和 段念在QCon上海2013大会的分享 中都提到这一点:
虽然有种种麻烦,但豆瓣的工程师们仍然将大量工作之外的时间热情的投入到将 CODE 开源的工作当中。一开始,CODE 团队零星的 将一些底层的基础库开源,包括 Python 版本的 git HTTP 实现 GPack,git SSH 实现 Maria,Pygit2 的 wrapper Ellen 等;2014 年 2 月 14 日,豆瓣 CODE 宣布 将框架代码和周边项目代码全部公开!此时的 CODE 已经聚集了 85 位 committer 为其贡献代码,并且已经托管了 1916 个项目,其中大部分都是类似 CODE 这样的、由工程师自主发起的非官方项目。
CODE 发展两年来一直在扩展自己的定位,从单纯的代码管理系统发展为可以将设计、产品都拉进来一同协作的平台,周边衍生出大量的附加项目,从 image diff 到类 Dropbox 的文件同步工具,可谓五花八门。所有这些功能都围绕一个核心:对 git 仓库的读写。
豆瓣曾经历过大桌子开会、强制大家做 review 的岁月,而 CODE 颠覆了这一情况。CODE 团队将 code review 视为 CODE 的第二个核心功能,认为促进工程师之间的沟通是 CODE 最大的成就之一。
CODE 为每个项目设置了三个角色,分为 owner(有全部权限)、committer(有 push 和 merge 权限)、member。review 机制根据项目的不同设置了不同的规则,如产品线级别的、需要对外发布的项目,基础库等项目都需要经过严格的 review,如 东西团队
对 review 设置了如下规则:
对于松散或娱乐性项目、小工具项目,并不会那么严格的 review,这也取决于 owner 自己,他可以借这个项目寻找到一位导师,来帮助他进行 review:
对于 CODE 项目本身,所有工程师都可以向 CODE 上的任意项目提 PR,也都可以是 CODE 的 reviewer
,同时所有工程师的代码都需要经过 review 才会被 merge 到 master 分支。
发展到现在,豆瓣的 review 基本上都是自发,很少遇到需要 review 的代码堆积的情况。代码讨论区里据说时不时会出现美女图,这可能是刺激工程师们去 review 的因素之一;另外,CODE 系统本身也有奖励机制,鼓励大家去评论别人的代码。
CODE 系统的奖励机制主要有积分和勋章这两个部分。积分的规则主要就两个:
- 提交的 PR 被 merge,增加 100 点积分
- 提交的 PR 被评论,增加 5 点积分
目的就是鼓励多发 PR。一般来说,小 PR 要好过大 PR,不过有时候开发任务比较紧的时候,发出比较大的 PR 也是在所难免。
勋章系统在 CODE 早期阶段就做了进去,早期的奖励规则主要跟代码提交相关,例如给开源项目发过 Patch 并被 merge 会有相应的徽章。现在 CODE 团队对勋章系统有一些新的规划:
CODE 上没有设置惩罚机制。
相比 Github,CODE 有一些非常实用的地方,比如在提交代码入库之前可以先在 CI 里面完成自动测试,reviewer 可以直接看到代码测试是通过(绿色)还是失败(红色);代码完成 merge 之后还可以通过 DAE 直接往线上部署。持续集成、自动测试、监控、部署这些都是独立系统,与 CODE 都是靠 API 来进行交互。
对于测试的实现,豆瓣对开发者有明确的要求:
CODE 团队在下面的问答中分享了他们使用 git 的心得和经验,无论对正在使用 git 的团队还是还没有使用 git 的团队都是很好的参考。
InfoQ:你们当时从 SVN、Mercurial 转换到 CODE,这个过程好像还挺顺利的?有没有遇到过一些阻力?如何化解的?
InfoQ:对于 git,CODE 团队有没有特别的经验要分享?
InfoQ:如果现在让你们重新设计 CODE,会在哪些方面做调整和重新的规划?是否会考虑基于类似 GitLab 进行二次开发?
InfoQ:你是否会建议所有还在使用 svn 和 hg 的团队早日脱离苦海、投奔 git?
相关演讲和分享
CODE 相关开源项目列表
CODE 依赖的 Douban 开源库列表
- 段念:豆瓣网工程副总裁,本次采访的策划。
- 清风:CODE 团队 leader
- 黄小毛:CODE 团队成员
- XTao:CODE 团队成员
- 大落:CODE 团队成员
The Why·Liam·Blog by WhyLiam is licensed under a Creative Commons BY-NC-ND 4.0 International License.
由WhyLiam创作并维护的Why·Liam·Blog采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于Why·Liam·Blog (https://blog.naaln.com),版权所有,侵权必究。
本文永久链接:https://blog.naaln.com/2014/03/review-of-watercress-code-two-years/