目录

什么是代码审查?

代码审查是一种让其他开发者评估、审查代码的方式,目的是在代码合并和发布之前,确保或提升代码的质量。

代码审查是什么,它们是如何工作的?

代码审查又可以被称作为同行评审,它在确保代码库质量方面扮演着重要的角色。

代码审查是对代码进行系统的评估。这个评估的目的是找出代码中的错误,提升代码的质量,并且帮助开发者更好地理解源代码。

当软件开发者完成了代码编写后,代码审查就成为了软件开发过程中的一个关键环节。这一环节可以让其他开发者在代码被合并到某个分支(如功能分支或主分支)之前,对编写的代码给出第二意见,确保代码的解决方案和实现是正确的。代码审查也可以帮助识别代码中的错误、逻辑问题、未考虑到的边界情况或其他潜在问题。

进行代码审查的人,被称为评审者,可以来自于任何团队或组织,只要他们对相关领域有深入的了解。如果某段代码涉及多个专业领域,那么最好有两位或更多的领域专家来共同进行代码审查。

为什么代码审查很重要?

代码审查流程的建立对于不断优化和改进代码是至关重要的,它可以避免将不稳定的代码交付给客户。为了提高代码的质量,并确保每段代码都至少被另一个团队成员审查过,代码审查应该成为软件开发团队日常工作流程中的一个环节。

除此之外,代码审查流程也在整个组织中起到了传递和分享知识的作用。基于这些考虑以及其他的一些原因,2022年进行的全球DevSecOps调查中,有76%的开发者认为代码审查是“非常有价值”的。

代码审查的好处是什么?

  • 分享知识:当团队成员做出代码变更后,其他软件开发者通过对这些变更进行代码审查,可以学习新的技巧和方法。初级的开发者可以通过代码审查从资深的团队成员那里吸收经验,这种学习方式与在成对编程中分享技能和思路的方式类似。通过代码审查在整个组织内部传递知识,可以确保没有任何一个人成为团队中的薄弱环节,每个人都有能力参与审查并给出反馈。当团队成员需要休假时,这种知识共享还确保了其他成员对项目的熟悉程度,从而不影响工作进度。
  • 提前发现错误:相比于在功能发布后找到错误然后紧急发布修复补丁,更好的做法是在错误暴露给客户前就及时发现并解决它们。将审查过程放在软件开发生命周期的早期,比如通过单元测试,可以帮助开发者在还对问题有深刻了解时进行修复。因为当在开发生命周期的后期进行审查时,开发者往往难以回忆起写那部分代码时的思路和原因。静态代码分析提供了一种低成本而高效的方法来确保满足业务和客户需求。
  • 保持一致性:因为开发者来自各种各样的背景和受过不同的培训,所以他们的编码风格可能会各不相同。如果团队希望代码有统一的编码风格,代码审查能帮助确保每个人都按照同样的标准来写代码。对于多个人参与贡献代码的开源项目,这尤为重要。代码审查确保了在代码被合并之前,已经有维护者对其进行了评估。
  • 增强安全性:当安全专家参与有针对性的代码审查时,代码审查可以提供高水平的安全性。应用程序安全性在软件开发中至关重要,而代码审查有助于检测安全问题并确保合规性。安全团队成员可以审查代码以寻找潜在的安全漏洞,并向开发者报告这些威胁。代码审查是自动扫描和检测安全漏洞的测试的重要补充。
  • 增加合作:当团队成员一起协作创建解决方案时,他们会更强烈地感到对工作的归属。作者和审查者可以共同找到满足客户需求的最有效解决方案。在软件开发生命周期中加强合作非常重要,以防止信息孤立,并维护各团队之间的无缝工作流程。要成功进行代码审查,开发者需要树立一个以合作开发为基础的代码审查思维。
  • 提高代码质量:代码审查是确保发布高质量代码和高质量软件的重要方式。了解代码库的人类审查员可以发现自动化测试可能会忽略的代码质量问题。他们甚至可以帮助你减少技术债务。

代码审查有哪些缺点?

  • 延长发布时间:代码审查过程可能会延迟软件发布,因为审查者需要与作者合作来讨论问题。根据审查者的工作负担,他们可能无法像作者期望的那样快速完成审查。这个问题可以通过使用包含自动化测试来发现错误的代码审查工具来解决。自动化工具是一种有效的方式,可以释放开发者的时间,使他们能够专注于更大的软件工程问题,而不仅仅是强调简单的代码格式错误。
  • 分散注意力:开发者通常有繁重的工作任务,代码审查可能会使他们的注意力从其他高优先级的任务上转移。团队成员可能被迫在完成自己的任务或停止自己的工作以进行代码审查之间做出选择。无论哪种情况,都会导致组织中的工作延迟。为了减少这个问题,团队成员可以采用审查者轮盘制度或创建一个领域专家名单,以确保单个开发者不会被过多的审查请求淹没。
  • 大型审查意味着更长的审查时间:如果开发者必须对大规模的代码变更进行审查,他们可能需要花费大量时间来检查代码。大型代码审查难以评估,开发者可能会自然而然地快速进行审查,以便及时完成,从而导致反馈质量下降。通过采用增量代码开发方法,可以避免这个问题,因为这样审查者可以多次查看小的代码段,而不是一次性查看大规模的变更。

代码审查的四种方法

通过为团队选择最合适的代码审查方法可以减少一些缺点,以下是四种常见的代码审查方法:

配对编程:配对编程涉及两名开发人员实时协作,其中一名编写代码(驾驶员),另一名审查代码(导航员)。团队成员共同合作,以确定挑战的最有效解决方案。团队成员分享知识,并通过共同探讨思路和利用他们的专业知识快速克服困难。

配对编程的好处

  • 传递知识
  • 防止信息孤岛
  • 解决复杂问题
  • 提高士气
  • 发现更多错误
  • 可以远程进行

配对编程的缺点

  • 耗时
  • 可能会被滥用
  • 难以衡量

肩上审查:在肩上审查中,有两名开发人员,即作者和审查者,可以亲自或通过共享屏幕合作。作者会解释已经完成的更改提议并解释所选择的解决方案的原因,而审查者则会提出问题并提供建议,类似于团队成员在配对编程会话期间的合作方式。作者可以在审查过程中进行一些小的更改,并在稍后记录较大的修复。

肩上审查的好处

  • 易于实施和完成
  • 可以远程进行
  • 比配对编程更快

肩上审查的缺点

  • 审查者可能与代码脱节
  • 审查的速度取决于作者的进展
  • 缺乏客观性
  • 没有验证是否进行了更改
  • 难以衡量

工具辅助审查:团队可能会决定使用工具来节省时间并确保发布最高质量的代码。工具辅助审查可以自动收集已更改的文件并显示差异,或者使提供反馈并通过评论进行对话变得更容易,并集成了静态应用安全测试(SAST)以帮助识别和修复漏洞。

最佳看待工具辅助审查的方法是将其视为其他审查类型的补充。自动化工具是执行代码标准、识别漏洞、收集指标和文件的有效方法,但一些团队可能会诱使完全依赖工具,从而不再让团队成员参与代码审查。工具应该被看作是代码审查的扩展,以增强审查过程。

工具辅助审查的好处

  • 更容易收集指标
  • 自动化工具释放开发人员的注意力

工具辅助审查的缺点

  • 需要开发人员维护工具
  • 成本较高
  • 仍然需要团队成员进行审查

邮件传递审查通常用于处理较小的问题和代码片段。它们可以通过电子邮件或源代码管理系统进行。在邮件传递审查中,作者会将包含代码更改的电子邮件发送给审查者。邮件传递审查与肩上看审查相似,因为它们可以轻松实施,不需要学习十分陡峭的学习曲线或指导阶段来教导作者如何进行更改。

邮件传递审查的好处

  • 易于实施和完成
  • 促进远程、异步审查
  • 可以通过源代码管理系统自动进行审查

邮件传递审查的缺点

  • 收集文件需要耗费时间
  • 难以跟踪对话
  • 没有明确的审查结束日期
  • 没有验证是否进行了更改
  • 难以衡量审查的效果

关于代码审查的一些建议

  1. 限制代码审查的时长,以保持审查的高效性。确定适合你团队的最佳实践,比如规定审查不超过一个小时或代码不超过200行,并鼓励团队成员遵守这一标准。
  2. 让每个人都参与到代码审查过程中,无论是新手还是资深团队成员。代码审查是帮助新团队成员快速熟悉代码库的绝佳方式,他们可以通过审查他人的代码学习,同时也应该让资深开发者审查他们的代码。确保每个人都参与到你的代码审查流程中,这样当有人休假或离开团队时,调整会更加容易。
  3. 分散代码审查请求。很容易出现少数开发者承担了大部分代码审查任务的情况,这对他们、其他团队成员和代码库都不利。你可以创建一个领域专家名单或者采用审查者轮流制来避免这种情况。
  4. 多提问题并提供有助于理解的上下文。在审查他人的代码时,尽力帮助双方在这个过程中共同学习。如果你不确定为什么他们选择了与你不同的方法来实现某个功能,请提问。如果你对如何改进他们的代码有建议,请在评论中解释为什么提出这些建议。这不仅有助于双方学习,还可能节省时间。