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 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Hongten

oracle系列--第一篇 数据库基础

1.1 数据管理概述 1.1.1 什么是数据管理 与我们人类相比,计算机的最大优势就是能够高速、精准地运行,其运行的过程就是执行程序代码和操作指令、处理数据...

1072
来自专栏JAVA技术zhai

千万级流量的优化策略实战

性能优化涉及面很广。一般而言,性能优化指降低响应时间和提高系统吞吐量两个方面,但在流量高峰时候,性能问题往往会表现为服务可用性下降,所以性能优化也可以包括提高服...

6245
来自专栏phodal

使用 adr 轻松创建 “程序员友好” 的轻量级文档

是的,我又写了一个 markdown 工具,它对我来说非常有用。 上下文 在一周里,我看到了一个名为 “轻量级架构决策记录” 的技术实践。在看到了一个简单的示例...

23910
来自专栏后端技术探索

性能优化模式(纯干货!!)

性能优化涉及面很广。一般而言,性能优化指降低响应时间和提高系统吞吐量两个方面,但在流量高峰时候,性能问题往往会表现为服务可用性下降,所以性能优化也可以包括提高服...

1404
来自专栏BestSDK

苹果iOS 11 5大隐藏功能:连按五次电源键,关键时刻能救命

当苹果公司向iPhone5s以上的用户推送了IOS11系统的升级通知,而很多忠实的果粉早就已经守在系统更新页面等待新系统的降临, 。就在2017年苹果全球开发者...

5255
来自专栏企鹅号快讯

C语言真的太强大了,C几乎无处不在!

今天存在的许多C项目都是在几十年前开始的。 UNIX操作系统的开发始于1969年,其代码在1972年被重写为C语言。C语言实际上是为了将UNIX内核代码从汇编语...

5397
来自专栏喵了个咪的博客空间

phalcon-入门篇1(基本介绍与环境搭建)

#phalcon-入门篇1(基本介绍与环境搭建)# ? 本教程基于phalcon2.0.9版本 ##前言## ***先在这里感谢各位phalcon技术爱好者,我...

4705
来自专栏SDNLAB

SDN实战团分享(三十三):Hurricane分布式实时处理系统架构及SDN领域的应用

嘉宾简介:卢誉声,Autodesk软件研发工程师,从事平台架构方面的研发工作。 在此之前,他曾在思科系统(中国)研发中心云产品研发部工作,并参与了大规模分布式系...

3756
来自专栏人工智能

微信机器人-Python学习日志(1)

一直以来,这个号发的都是《狼人杀小程序的开发日志》,体现产品的思路比较多,从纯技术的角度看其实并没有很精彩。这次,来讲讲我在其他方面的探索吧。 众所周知,微信公...

5748
来自专栏ImportSource

服务之美-读《微服务设计》笔记全集(一)

最近在微信读书上读《微服务设计》一书,目前读了30%多了,其间想法有点多,现分享给大家。

1462

扫码关注云+社区

领取腾讯云代金券