在本文中,我们将总结来自一些公司的官方工程博客的经验教训。为什么要做代码评审?除了作为一种质量保证的工具,代码评审还有哪些好处?代码评审如何帮助提升团队能力?
本文最初发表于 blogboard.io(《Code Review Best Practices - Lessons from the Trenches》),由 InfoQ 翻译并分享。
我们将涵盖这些话题:
除了明显的质量保证外,代码评审还有其它好处。
我们将介绍在代码评审中寻找什么的一般建议,为什么有一个评审清单是有益的,并且你将得到一个相当长的清单,你可以用它作为自己的评审清单。
如果你已经做过一些代码评审,你就会知道它们不仅仅对阻止 bug 有用。我们将总结代码评审作为学习和团队纽带工具的益处。
针对拉取请求作者的经验教训。有一些经验法则一致指出,准备一个拉取请求有助于使评审更顺利。
针对评审者的经验教训,关于你的评论的措辞和语气如何会对整个评审工作的有效性产生巨大的影响。
这些话题都是相对独立的,因此如果你对某个特定的话题感兴趣,可以直接跳过。
显然,代码评审的首要目的是评审引入的变化的质量。我的意思是,字典中评审的定义准确地说明了这一点
评审(review,名词) - 对如有必要实行改变意图的某件事的正式评估。
当然,代码就是代码,有很多东西可以自动检查和测试,所以在实际的代码评审中实际上需要检查的内容有细微差别。我们会在下一节介绍这一点。
另一方面,代码评审是变更(现在通常是一个拉取请求)作者与一个或几个评审者之间的一种交流形式。因此,它的作用不仅仅是防止引入 bug 或者保持代码库在风格和架构上的一致性。
如果做得好,代码评审有助于加速团队之间的学习,为所有团队成员创造心理安全,有助于建立和交流最佳实践,教授适当的沟通,并提高团队活力。如果做得差,它们会使所有上述情况恶化。
代码评审有很多方法可以帮助维护代码库和产品的质量标准。最终,它落实在捕获很难进行自动测试级别的错误,例如架构不一致。另外,自动化测试的代码也应该被评审,所以有一个元级别的评审可以有助于 QA。
在提供高效的代码评审(Giving High Leverage Code Reviews)中,Casey Rollins 提倡使用一个清单,列出所有需要注意的常规事项。
当我评审一个拉取请求时,我通常会做多个“来回”,每次专注于一个属性。我从头开始,先考虑单个属性来审查拉取请求,然后再继续考虑下一个属性。当我检查完清单之后,我会提交评审。 这个清单从一般检查到特定检查,因为首先关注高级别的属性很重要。如果你建议整个类或方法进行重构,那么再建议更改其中的某个变量名是没有意义的。
你可以有自己的清单,也可以将其作为团队或项目的共享清单。关于检查清单的有用性有大量的材料。在Getting Things Done中,David Allen 提出了一个简单的想法——我们的大脑在处理信息方面很在行,但在存储和回忆信息方面很糟糕。这就是为什么检查清单是一种很好的方法,在外部存储和分解一个计划的或重复的任务。
根据几篇文章(1, 2, 3)编译而成,下面是在评审代码变更时要注意的事项列表:
这是一个很长的列表。除此之外,一条老生常谈的建议是不要用代码评审取代静态代码分析工具。如果你的评审大部分都是关于代码格式、变量命名和字符顺序的,那么最好将自动化代码分析工具包含到你的开发工作流中。
在来自 PayPal 工程的高效代码评审:更好的产品、团队和工程师(Effective Code Reviews: Bettering Products, Teams, and Engineers)中,Gabriel McAdams 指出了与团队活力相关的代码评审的几个重要好处:
在来自 Palantir Blog 的代码评审最佳实践(Code Review Best Practices)中,Robert Flink 列出了通过代码评审实现知识分享和社交的几种方式:
代码评审应该被看作是一种团队工作。一旦你以这种方式看待它们,就会发现双方——作者和评审者——都有各自不同的责任。
在 Medium 工程博客的这篇短文中,Xiao Ma 描述了一种不同的视角如何改变代码评审的方式、反馈的方式,以及每一方的人如何通过对代码评审采取积极的心态而受益。
当我们谈论拉取请求作者的责任时,有一些在所有代码评审指南中都重复出现的关键事项。
最常被提起但是最不明显的一条建议,是代码评审中沟通语气的重要性。
在 Kickstarter Engineering 的一篇文章代码评审中的谨慎沟通指南(A Guide to Mindful Communication in Code Reviews)中,Amy Ciavolino 列出了许多改进代码评审双方沟通的技巧。用 Amy 的话来说:“全面快速的代码评审需要技术技能。但除此之外,代码评审也是一种沟通、教学和学习的形式。无论是作为代码的作者还是评审者,在沟通中考虑周到可以使代码评审对每个人都更有价值。"
这篇文章包含了一些技巧,教你如何在做评审时注意作者和过程的目的:
bug 就是 bug,拼写错误就是拼写错误,这无可回避。但即使这是一个明显的错误,通常也有很多种传递信息的方式。代码评审中充斥这样的评论“这重复了;修复这个...;感觉很慢。让它再快一点;阅读风格指南”,无论作者是谁,可能都感觉过于苛刻。
在提供高效的代码评审(Giving High Leverage Code Reviews)中很好地指出了这一点:
代码评审的核心是,你在向你的同事提供反馈,虽然可能很难。但是接受反馈更难。你团队中的每个人都在努力做到最好,所以在传递信息时要小心。例如,如果你指出一个错误或者问一个问题,让它成为一种团队行为,而不是某个人的错。这可能是这样的:“我们可以删除这个文件中的一些重复代码吗?”而不是“你漏了一个边缘情况”。
Alejandro Lujan Toro提供了几个严厉评论的实际示例,你可以轻易将这些转变为更具建设性的语气:
少一点 | 多一点 |
---|---|
将这移到Markdown | 将这个文档移动到我们的Markdown README文件中怎么样?那样,我们可以更容易地分享给其它用户。 |
阅读谷歌的Python风格指南 | 我们应该避免单字符的变量名。改为board_size或size怎么样? |
这感觉太慢了。让它再快点。闪电般的快。 | 这个算法很容易阅读,但我担心其性能。我们可以用大型数据集来测测它的效率。 |
Bool还是int? | 你为什么选择布尔值而不是整数值? |
诀窍就是将代码评审作为一个团队工作来做。在建议修改时,尝试更多地使用我们而不是你。Amy Ciavolino建议,如果你心情不好而无法给出周到的反馈,你就不应该开始评审:
当你开始评审时,也要考虑一下你的总体感受。给出善意和周到的反馈需要时间和精力。如果你很饿、很累、很匆忙或者有很多会议等等,不要评审代码或者发出一个评审。你首先需要修复这些事情。如果你不关心自己,你也就不能关心他人。
一旦你意识到代码评审不仅仅是发现 bugs,这就很自然了。也许你从拉取请求中学到了一些东西,或者作者投入了大量的精力并且对细节表现出令人印象深刻的关注。让他们知道这些。
对新手来说,在代码评审中给予表扬尤其重要。在如何让好的代码评审变得更好(How to Make Good Code Reviews Better)中, Gergely Orosz 建议,代码评审对于新手来说应该是一种积极的体验:
更好的代码评审会特别注意让新加入者的前几次评审成为一次很好的体验。评审者应该同理心看待这样的事实,新加入者可能还不知道所有的编程风格,并且可能对代码的某些部分还不熟悉。这些评审投入额外的精力来解释替代方案和指向指南。它们在语气上也很积极,对作者建议的代码库的最初几处修改表示赞赏。
作者介绍:
Drazen Zaric 是一名分析师/数据科学通才,在激烈竞争的移动游戏行业的数据工程、数据仓库设计、产品分析、数据科学和产品管理方面很有经验。
原文链接:
领取专属 10元无门槛券
私享最新 技术干货