限时领|《AI 百问百答》专栏课+实体书(包邮)! 了解详情
写点什么

把代码评审做一百万次,学会了这些宝贵经验

  • 2020-01-31
  • 本文字数:2392 字

    阅读完需:约 8 分钟

把代码评审做一百万次,学会了这些宝贵经验

LinkedIn 的每个团队都使用同样的代码评审工具和流程,任何一个工程师都可以评审别人的代码,甚至可以为其他团队贡献代码。


LinkedIn 是全球知名的职业社交网站,在全球范围内有数亿用户。该公司的工程技术团队实力同样强劲,最出名的就是开源了 Kafka 等一系列流行技术。


2 年前,LinkedIn 的代码评审总量达到了里程碑式的一百万次。为此,LinkedIn 社交网络服务工具部门负责人分享了一路下来他总结的代码评审经验和教训。



阅读和评审代码是工程师每天都要做的事情。但是,这与正式的代码评审流程有所不同,正式的代码评审要求每一个代码变更在进入生产环境之前都要经过其他团队成员的评审。LinkedIn 从 2011 年开始将代码评审作为开发流程不可或缺的一部分。我们的代码评审目标是尽可能顺畅地在快速增长的团队中进行。好的代码评审(有意义且有用的评审注释)有助于提升整个公司的水平。在 LinkedIn,代码评审是质量保证和知识分享的一部分,并让整个工程文化朝着更好的方向发展。


在公司层面实现代码评审最大的一个好处是可以提高开发流程标准化水平。LinkedIn 的每个团队都使用同样的代码评审工具和流程,任何一个工程师都可以评审别人的代码,甚至可以为其他团队贡献代码。这也解决了诸如“我可以修复他们的 bug,但我不知道该怎么构建和提交”之类的问题,促进了各个技术部门之间的协作。


将代码评审作为开发流程不可或缺的一部分有助于形成一种健康的反馈文化:工程师乐于在工作的各个领域提供或接受反馈,而不仅仅是在代码层面,因为反馈已经成了日常工作的组成部分。在我们看来,提供和接受反馈都是很好的成长机会。事实上,高质量的代码评审是 LinkedIn 员工晋升的一个重要参考因素,因为它为工程师的技术能力提供了有力的证明。


在过去几年,我们总结出了一些最佳实践和技巧。下面以问答的形式提供了一些指南,帮助代码评审人员和被评审人员“榨干”代码评审的最后一滴油水。

我真的了解“为什么”代码要这么写吗?

为了促成最好的代码评审,每一个代码提交都应该包含设计概要,大致解释一下做出代码变更的动机是什么。如果只能从代码中推敲出代码变更背后的缘由,是很难实现高质量的代码评审的。代码提交者应该主动提供变更说明,把它们包含在提交日志里,这样也有助于提高代码文档的质量。

我提供了正向的反馈吗?

在一个到处都是聪明人的公司,获得干净的代码和整洁的测试覆盖率是理所应当的。正因为如此,代码评审一般都只关注代码中出现的问题。但问题是,大部分人需要从正向反馈中获得参与感和鼓舞,即使是工程师也不例外。如果评审人员发现代码中有值得称道的地方,就要把它们指出来,并给以正向的反馈。这样有助于提升团队士气,而且正向的反馈通常具有感染力。对于代码评审注释,任何正向的反馈都应该是明确的,如果认为代码写得好,就要说清楚好在哪里。

我的代码评审注释够清楚吗?

不管是正面的还是负面的反馈,每一个注释都应该能够清楚地表达评审人员的想法。面对太过简陋的评审注释,代码提交者根本无法领会评审人员的意图,尽管这些东西对于评审人员来说是显而易见的。如果有疑问,过度解释总比简陋的反馈要好得多,因为简陋的反馈会导致更多的问题,需要来回沟通,浪费时间。评审人员可以在注释里写上“减少重复”、“提升覆盖率”或者“让代码更容易测试”,等等。这样做除了可以让评审人员的注释更清晰明了,也有助于让团队达到更高的设计水准。

我是否认可代码提交者所付出的努力?

我们应该认可努力工作的人,不管其产出的成果是什么,这样有助于培养高士气的团队。有些代码质量不高,需要反复修改。对于这类情况,我们应该肯定代码提交者的努力工作,即使他们需要返工。最好的方式是在高质量的评审注释中加入适当的解释,认可好的想法(提交的代码中总有好的方面),并使用礼貌用语,比如“谢谢”。

这是个有用的评审注释吗?

通过问自己这个问题,可以很容易地知道一个评审注释是否是必要的。对于工程师来说,代码评审应该是有用的开发工具,而不是无用的负担。如果你觉得某个评审注释不是必需的,就把它删掉。比如,代码格式问题就不是一个必需的评审注释。代码风格和格式这类事情应该让自动化工具来做,工程师不应该关注这些问题。

“测试完毕”里的内容够详尽吗?

在 LinkedIn,每一个提交的代码变更都必须包含“测试完毕”部分。以 GitHub 为例,开发者在提交代码时会把“测试完毕”的内容放在 PR 描述里。“测试完毕”应该包含哪些信息?这取决于代码变更的重要程度和测试覆盖率。如果变更引入新的或者修改过的条件性复杂度,就有必要进行单元测试。在集成测试覆盖率不高的情况下,有些变更需要进行手动测试。对于这类情况,“测试完毕”部分应该包含测试场景描述和测试结果。如果代码变更会导致程序的输出发生变化,“测试完毕”部分需要包含新的测试结果。

我是不是太“学究”了?

有些代码评审注释里包含了太多信息,以至于一些不是很重要的建议把重要的问题——真正需要修复的问题——给“埋没”掉了。太痴迷于抠细节容易拖慢评审速度,还会挑起评审人员和代码提交者之间的矛盾。清晰的评审期望和积极正向的代码评审文化有助于避免出现拖沓冗长的评审。

总结

总的来说,正式的代码评审流程有助于提升代码质量,促进团队互相学习和知识共享。如果每个团队成员都能够意识到两件事情,他们的工作质量都将得到提升:既然我的代码需要经过评审,那就好好写。评审中反馈的每一个问题我都要解决,所以,为了以后不浪费时间,从一开始就要把代码写好。当代码评审成为一种习惯,整个团队都会很自觉地提供或接受反馈,这是成长和进步的关键。


我们从 LinkedIn 过去的一百万次代码评审中学到了很多,并希望从下一个一百万次评审中学到更多。在代码评审上投入越多,获得的代码评审效果就越好,提交的代码质量也越高,最终产品的质量也更高。高质量的代码评审是会“传染”的!

英文原文

LinkedIn’s Tips for Highly Effective Code Review


2020-01-31 09:3611545
用户头像
小智 让所有人认同的文字称不上表达

发布了 408 篇内容, 共 400.4 次阅读, 收获喜欢 1985 次。

关注

评论 1 条评论

发布
用户头像
注释 -> 评论
2020-08-28 12:57
回复
没有更多了
发现更多内容

20 图 |6 千字|缓存实战(上篇)

悟空聊架构

redis 缓存 缓存穿透 缓存击穿 缓存雪崩

「 社区建设功勋奖名单公布」—— InfoQ 写作平台【 1 周年盛典 】

InfoQ写作社区官方

1 周年盛典 热门活动

百度大脑开放日福州站-智能制造与安全生产专场报名啦

百度大脑

百度大脑 开放日

Android实现文档在线预览功能

寻找生命中的美好

android pdf预览 文档预览

谈谈中台架构之交易中台

艾小仙

云管平台如何纳管多云资源?

嘉为蓝鲸

云计算 运维自动化 cmp 混合云 多云管理平台

轻松带你学习java-agent

华为云开发者联盟

Java Trace Java虚拟机 java-agent 挂载

网易有道 ASR 团队斩获 Interspeech 2021 算法竞赛两项冠军

有道技术团队

AI 算法竞赛

事件分发机制Android,熬夜整理Android面试笔试题,精心整理

欢喜学安卓

android 程序员 面试 移动开发

三步法助你快速定位网站性能问题

华为云开发者联盟

html 网站 网站优化 Performance面板 瀑布图

Flink + Hudi 在 Linkflow 构建实时数据湖的生产实践

Apache Flink

flink

分布式锁之Redis实现

Sakura

4月日更

4行指令解决pip下载Python第三方库太慢问题(pip更换国内下载源)

不脱发的程序猿

Python pip 4月日更 Python库安装

yarn 集群的架构和工作原理

五分钟学大数据

hadoop YARN 4月日更

微服务的演化

箭上有毒

4月日更

实践案例丨Pt-osc工具连接rds for mysql 数据库失败

华为云开发者联盟

MySQL 数据库 pt-osc工具 rds for mysql

事件分发源码,Android事件分发机制收藏这一篇就够了,威力加强版

欢喜学安卓

android 程序员 面试 移动开发

亮相 LiveVideoStackCon,透析阿里云窄带高清的现在与未来

阿里云CloudImagine

视频编解码 视频处理

飞桨分布式训练又推新品,4D混合并行可训千亿级AI模型

百度大脑

百度 AI 飞桨

什么是Selenium?使用Selenium进行自动化测试

码语者

DevOps selenium

没想到【成功的计算机视觉应用】居然是这样部署的!

澳鹏Appen

人工智能 自动驾驶 机器学习 大数据 计算机视觉

Kubernetes入门——Kubernetes应用部署

百度开发者中心

Kubernetes #技术课程#

5个超好用的Instagram图片下载工具推荐

科技猫

分享 下载 教程 图片 Instagram

阿里巴巴的“双11”高并发秒杀终极版教程!(Java语言设计)

Java架构追梦

Java 阿里巴巴 架构 面试 秒杀架构设计

nginx 搭建简单图片服务器实现负载均衡

Java小咖秀

nginx 服务器 图片

手把手教你从数据预处理开始体验图数据库

NebulaGraph

数据库 数据预处理

GitHub开源:17M超轻量级中文OCR模型、支持NCNN推理

不脱发的程序猿

人工智能 GitHub 开源 OCR 4月日更

【转载】提高系统开发效率的“银弹”——X-series可视化大规模应用开发工具集

赫杰辉

2021年IT行业八大趋势预测

禅道项目管理

自动化 数字化 技术债 行业趋势

anyHouse - Android 仿写 ClubHouse

anyRTC开发者

android 音视频 WebRTC RTC 语音社交

https如何使用python+flask来实现

华为云开发者联盟

Python flask https ssl HTTP协议

把代码评审做一百万次,学会了这些宝贵经验_文化 & 方法_Szczepan Faber_InfoQ精选文章