如何在团队里做代码评审 code review

内容纲要

两个 code review 案例

先分享我参与某团队代码评审的案例

我曾经被某个团队邀请参加代码评审,要评审的业务我没有参与,也不了解;邀请来的也很突然,一个同事走到我工位旁,说 xx 会议室有个 code review, 你也参加一下吧,就这样跟着同事到了会议室,投影里直接就是用 eclipse 打开的代码
人到齐后,开发人员就开始讲代码了
前半程我是懵逼的,只能听其他参与评审的同事发问,听着听着我品味出来了,大部分参与的人都是懵逼的,保持沉默;有一个比较活跃的同事,问的问题也基本不涉及业务——比如,他的问题是调用远程接口时如果失败,有无重试机制,是怎样的重试机制
后来我听明白业务了,这是一个订单支付回调的业务,第三方支付在用户完成支付以后,回调我方的通知接口,我方再执行订单状态修改、发货等后续业务——能搞明白的主要原因是我以前做过类似的开发,所以我也发现了问题:在第三方支付回调我方通知接口时,我方的接口可能会返回失败,这样可能导致死循环——我的建议是先返回成功,订单状态修改和发货等操作异步处理

再分享一个我的代码被评审的案例

我曾经在上级主管要求下组织过一次代码评审,由于业务比较复杂,参与的人基本没有在业务逻辑上提出什么意见和建议,倒是有个同事提了个关于缓存的问题,当时把我搞懵逼了
出于性能考虑,我的程序里把数据库里的对象全部加载到本地缓存,用 map 来存储,这个同事的问题是:如果有人修改了 map 里缓存的对象怎么办?
我回答,我的 map 用到了 google 的 Guava 库里的不可变 map,这个答案明显是答非所问的,因为当时我完全没有考虑过被缓存对象自身被修改的问题,一时之间没有正确理解他的问题
他的这个问题对我有很大的启发,后来我解决了他提出的问题:被缓存的对象应该做到不可变,即该对象只有 get 方法,不能有 set 方法,对象的所有属性都用 final 修饰

问题

我参与过的大多数代码评审,实际上都有些共性的问题

  • 代码评审几乎都是应领导要求而开展的,组织者邀请的评审人员,基本是本部门或者跨部门团队的一些高级开发人员
  • 组织是无序的,好一点的能提前一天通知;不好的就是临时通知,立马参加,完全没有准备的时间
  • 就算是提前通知的,很少能提供要评审代码的原始需求、设计等相关文档;即便提供了,真正认真看过的人也是极少的,这导致了要评审的代码,其业务逻辑对于多数的参与者是未知的,参与者在前半程基本是懵圈的状态,往往只能就业务逻辑以外的编码规范、系统架构、某些中间件的使用上进行评审
  • 多数的参与者是在打酱油,整场评审下来要么一言不发,要么敷衍的问几个无关紧要的问题,对他们来说参与代码评审就是浪费时间
  • 参与者付出了时间,却没有任何收获
  • 缺少反馈,评审过程中提出的问题有没有解决,建议有没有采纳,谁也不知道

我的看法

代码评审有没有用?当然是有用的,比如我就在代码评审里发现了自己开发中的一个盲点

但是,前述代码评审的做法是存在优化空间的,一次有组织的代码评审,至少邀请 5 个以上的高级开发人员,其中大部分人大部分时间在打酱油,这是不是人力上的一种浪费?
另外,是否考虑过初、中级的开发人员,还有测试同学,也是可以且有必要参与代码评审的?

代码评审不仅仅是评审某一段具体的代码——程序员职业生涯里要写的代码太多,不可能做到每段代码都被评审,如果想靠代码评审保证软件质量是不现实的
代码评审应该是软件过程里的一个链条,要和其他过程串起来,比如设计、测试等,从而保证软件开发质量
就比如说测试吧,测试同学参加代码评审,有助于了解业务逻辑的实现,更有利于他们进行测试用例的设计

代码评审要让所有人都参与进来,除了被评审的同学,评委是否也能从代码评审里学习到什么呢?比如说,设计缺陷或者程序 bug,很多时候是具有共性的,在评审中指出后,也可以警醒其他开发人员比如说在座的评委。

所以我觉得中级或者初级开发人员、测试同学也应该参与到代码评审中来,而参与并不一定是要指出问题,提出建议——单纯的依据标准进行评价也是一种参与

最后,代码评审结果要有反馈,问题是否解决、建议是否落实,应该要有人负责

我的实践

  • 代码评审是例行的,每周进行
  • 参与的人员,除了相关的开发人员,还包括测试人员
  • 代码评审不能从代码开始讲起,要从需求、设计开始
  • 评审哪些维度,标准是什么?需要明确
  • 评审要有反馈

最后,给出我的团队实行过的代码评审制度供参考


xxx 团队代码评审制度

概述

为了规范编码过程,保障代码质量,提升开发技能,服务端开发组将开展例行的代码评审活动

制度

若无特殊情况,代码评审作为一项例行的工作每周进行

时间

每周 4 晚 19:00~21:00

参与人员

  • 主讲
    • 服务端开发组成员,以周为单位轮流担任,顺序为[刘备-关羽-张飞-赵云]
    • 特殊情况组长可以调整顺序
  • 评委:
    • 服务端开发组其他人员
    • 主讲、评委邀请的其他部门或小组的同学
  • 观察
    • 部门内任何感兴趣的人士(主要是测试同学)

角色说明

  • 主讲
    • 评审的组织者和召集者,包括预定会议室,发送会议邀请,汇总评价,输出评审报告等
    • 代码的编写或维护人员
    • 提供要评审的代码及其设计
    • 进行必要的业务背景、设计思路、代码实现的讲解
    • 回答评委的问题、质疑
  • 评委
    • 评审:指出代码里不符合开发规范、未贯彻设计思路、有错误、理解困难的代码,要求主讲进行解释
    • 打分:对本次评审做出量化的评价
  • 观察
    • 观察和评委的区别是不用打分

评审流程

主题选择

主讲需准备 3 个主题,由评委随机抽取一个作为本次评审的主题。主题可以是

  • 一个客户端接口
  • 一个 task
  • 一个 mq 消息的消费者
  • 运营后台的某个操作
  • 公共组件

背景知识

主讲介绍本次评审主题相关的业务需求及设计,设计以流程图或序列图的方式展现

代码评审

主讲开始讲解代码,评委可以随时提问

评价

代码评审完成,主讲收集各评委的评分并汇总

总结报告

完成代码评审后输出总结报告,第二天下班前通过邮件发送给所有评委和观察:收件人为所有评委,抄送所有观察,邮件标题为“xxx服务端代码评审报告”,报告格式如下

评分

评分包含 2 个部分,如下

  • 规范分,0 – 10 分
  • 难度分,0 – 3 分

评审开始后,主讲打印如下表格发给每个评委,并在评审结束后从评委回收评分表

如何在团队里做代码评审 code review

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Scroll to top
粤ICP备2020114259号 粤公网安备44030402004258