2018-10-31 Code Review 在丁香医生前端团队的实践

时间过得很快,转眼间 Code Review 机制在丁香医生前端团队已经运作一年多了。今年4月初时,将团队在 Code Review 方面的一些经验在丁香园前端团队进行了分享,各个业务线的前端同学们逐步开始尝试 Code Review 机制,目前也有了一定的收获。是时候将这些实践经验落实到文字上,来和更多的朋友们进行交流了。

起因

世上没有无缘无故的爱,也没有无缘无故的恨。同样,也没有无缘无故的 Code Review。最开始时,丁香医生前端有2个人,基本上是1人在做丁香医生 SPA 项目,1人做丁香医生管理后台项目。

将时间点放到17年初,团队从2个人变为了3个人,此时主要有三个前端项目(丁香医生 SPA、丁香医生管理后台以及丁香医生 Hybrid App)在迭代,其中主要是 SPA 项目会涉及到三个人的交叉维护。这个阶段便会开始暴露出一些小问题。比如:

  • 编码风格不一致
  • 有些他人写的业务逻辑,在交叉维护时,需要花更多的时间上手
  • 一些低级的 bug 在代码部署到测试环境才被发现

为了解决这些问题,我们决定开始尝试 Code Review。项目的代码是托管在公司内网的 Gitlab 上的,于是我们会开始摸索着基于 GitLab 中项目的 Merge Request 进行他人代码的 Code Review。

17年 Q2 时,我们开始频繁的迭代丁香医生小程序,同时运营团队也会开始提出一些运营类H5的需求。团队成员有4人了。随着新鲜血液的加入,我们遇到了新的问题:

  • 新人的加入提高了团队代码风格的差异性
  • 在不是很了解现有项目的基础上,实现的新功能代码会产生冗余
  • 谁来为新成员的代码质量和成长负责?(注意:这是重要的一点)

此时我们依旧在做 Code Review,但实际上并没有严格的去执行,也没有一个关于 Code Review 的标准供大家遵守。

毫无疑问的一点:随着丁香医生业务的发展,这些问题是需要被解决的,否则长远来看无论是对于团队还是团队成员,都是有较大伤害的。

17 年 Q3 时,团队已经有 6 个人了。每加入一个新人,上述问题的复杂度就会增加一些。为了解决这些问题,团队决定将 Code Review 作为一项基本制度,严格去执行。

如何去做 Code Review?

前提

在开始严格的去做 Code Review 之前,我们确定了三点基础规范。

  1. 基于项目版本控制,统一项目遵守的 Git 分支模型
  2. 对于 JavaScript,使用统一的 Eslint 规则
  3. 结合团队成员现有风格,明确统一的代码规范

工具

使用的工具就地取材,依旧是 GitLab。整个 Code Review 流程在 GitLab 项目中有两个点比较关键:Merge Request(简称:MR)、Discussion(简称:Diss)。

在这两点基础上,我们确定了几个角色:

  • Owner(需求负责人,代码改动提交者,MR 发起者)
  • Reviewers(MR 参与者,前端团队的同事,可能不止一个人。负责 Review 代码。)
  • Disser(某个 Reviewer。对某个 MR 发起 Discussion 的人。)

流程

  1. 对 GitLab 上需要进行 Code Review 的项目进行设置(Settings - General - Merge request settings - Only allow merge requests to be merged if all discussions are resolved)。
  2. Owner 在本地开发环境,某分支(以某功能分支 feat-example 为例)做好功能开发,充分自测后将代码推送到 GitLab。
  3. Owner 基于 feat-example 分支,发起目标分支为 develop 分支的 MR。MR 需要有尽可能详细的描述。比如:需求文档地址,做了哪些修改,某个功能的设计实现思路,需要哪几位 reviewer 对本次 MR 进行 Code Review 等。推荐使用 MR 模板。
  4. Owner 成功发起 MR 后,通过团队协作工作告知 Reviewers 有 MR 需要进行 Code Review,以及 MR 的紧急程度。
  5. Reviewers 基于 MR 进行进行 code review。如果对 MR 有任何问题,在 GitLab 上针对具体代码进行 comment(发起 Discussion),review 完成后通知 Owner 结果(本次 MR 通过 / 本次 MR 有 n 个 Diss)。如果有 Diss,Owner 需要对每一个 Diss 进行回复,直至所有 Diss 的状态变更为 Resolved。
  6. Owner 对 MR 进行 merge 操作,并在测试环境发布代码,通知相关 QA 同学测试,QA 测试通过后由 QA 通知产品和设计师进行验收。(此处有一个细节:Owner 如果确定可以进行 merge 操作?我们想到有两个方案:1. 以 Reviewers 通知 Owner 为准 2. 以 Reviewers 给 MR 点赞为准,因为 GitLab 上是可以对 MR 进行点赞操作的。目前团队采用的是第2种方式。)
  7. 如果测试或者验收环节发现问题,Owner 需要对代码进行修改,然后发起新一轮的 MR,直至测试环境代码通过验收。
  8. 和 QA 同学确认代码可以发布至生产环境,并进行代码发布,通知 case 相关同学某功能已上线。

原则

在执行 Code Review 过程中,我们有一些原则需要遵守:

  • Owner 发起 MR 之前的代码需要进行充分自测
  • 代码版本控制 commit 的粒度不要太大
  • 不阻塞他人的工作,尽快响应他人的 Code Review 请求(这一点比较考验团队成员的合作精神、团队意识。同时也要求开发者要合理安排自己的时间,要有能力随时放下手中的工作,随时继续手中的工作)
  • 如果某个 MR 紧急,可以告知 Reviewers
  • 除有必要,否则 Owner 不要在提测验收阶段删除分支(例如勾选“remove source branch when merge request is accepted.”),应等待分支合入master分支后移除,避免预发/测试分支重建时被遗漏。
  • 定期回顾和总结 Code Review 执行情况(比如在团队周会时进行)

边界

清楚了 Code Review 流程之后,其实还有一些边界情况需要考虑。我会将团队目前采用的处理策略写出来供参考。

  1. 周末出现线上紧急 bug 要遵循 Code Review 流程吗?可以不进行 Code Review,以快速修复 bug 为主。
  2. 某个需求(项目)留给开发时间非常紧张时怎么办?可以不进行 Code Review,优先保证按时需求(项目)上线。
  3. 团队内部项目、组内同学个人发起的兴趣项目是否需要进行 code review?决定权在项目 Owner。
  4. MR 遇到代码冲突怎么办?建议在 code review 之后,由 Owner 将代码拉取到本地进行 merge 并解决冲突,然后将最新代码推送到 GitLab(此时 GitLab 上 MR 会自动 merge 掉)。

收获

坦言,在一个从未进行过 Code Review 的团队想把这个机制运作起来,并不是一件容易的事情。尤其是在决定开始进行 Code Review 后的起步阶段。但是如果能认准方向,团队的成员齐心协力朝着既定的方向去走,最终会获得如下的收获的:

  • 团队成员代码风格统一
  • 减小了项目交叉维护的阻力
  • 使新成员更快速融入团队
  • 避免了低级 bug 在测试环境出现
  • 良好的技术交流氛围

待完善

上面描述的这个机制并不是完美的。目前我可以想到的可以优化的点如下:

  • 优化编码规范(技术本身在发展,团队成员的水平在提高,随之之前定下来的编码规范也会适当的进行优化)
  • Check List(这一点实际上目前团队已经开始做了。当业务具有一定复杂度后,某些业务逻辑的迭代难免会牵扯较多已有业务,此时如果有一份 Check List,会帮助 Owner 及 Reviewers 更好的进行 Code Review)
  • 激励机制
  • 代码测试用例(主要是指业务代码增加测试用例。目前团队也开始进行了一些尝试。)
  • 自动化

写在最后

将团队在使用的 Code Review 机制以文字的形式沉淀下来,主要是想分享给更多的人。如果这些文字对某些人、某些团队有帮助,那对于我来说是一件令人欣慰的事情。如果能接收到关于优化现有机制的指点,也会是一件令人开心和感激的事情。

此外,还想表达的一点是:丁香医生前端团队是一个非常在意每一个团队成员成长的团队。

我猜,你可能猜到接下来我要说什么了。

是的,随着丁香医生业务的发展,我们需要优秀的前端同学加入我们,一起茁壮肆意成长。更多关于团队的介绍,可以参考请问丁香医生前端团队怎么样?

作者:丁香园F2E
链接:https://juejin.im/post/5b97d684e51d450ea363092f
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容