2022年,学点技术管理(三十二)

211 阅读5分钟

如何做代码评审(Code Review)。

Code Review 主要是在软件开发的过程中,对源代码进行同级评审,其目的是找出并修正软件开发过程中出现的错误,保证软件质量,提高开发者自身水平。

两个概念

  1. Commit:可以单独保存的源代码的最小改动单位。
  2. PRPull Request,一次代码提交请求。一个 PR 可以包含一次 Commit,也可以是多个。提交后,页面上会显示这次提交请求的代码和原代码的所有不同之处,即本次 PR 的所有改动。

请求提交后,其他工程师可以在 PR 的页面上提出意见和建议,也可以针对某一些代码的改动进行讨论,也可以给整体评价。代码的作者也可以回复这些意见和建议,或者按照建议进行改动,新的改动将为本次 PR 中提交新 Commit(也可以覆盖之前的 Commit)。

代码合并规则

一般情况下,所有的 PR 都必须有至少一个人认可,才能进行合并。如果改动的内容涉及多个项目,则需要每个项目都有相关人员认可才能合并。

在代码合并之前,进行 Code Reivew 的工程师们会在 GitHub 的相关页上给出各种评论,页面是共享的,这些信息大家都能看到。

有些评论是询问,代码的作者直接回复或解释就行,有些是指出代码的问题,代码作者可能会据此改动,也可能不会同意,那就需要回复评论,阐述观点。有时候一个实现细节,讨论的主题可以多达十几条或几十条,最终需要达成一致才能进行合并。

帮助别人成长,而不是帮对方写代码

从对方的角度来说,代码写不好,可能是对业务不熟悉,对编程语言不熟悉,也可能是对公司代码的整体架构不熟悉。

  • 耐心指出哪里有问题,这样下次可能就知道该怎么做了。
  • 让对方明白代码应该怎么写,一定程度上是在复制你的生产力。

写代码是一个学习过程,怎么做一个好的代码审核人更是一个学习和成长的过程。自己绕过一个坑不难,难的是看到别人那么走,远远地你就能告诉他那里有个坑,而他在你的指导下,以后也会帮忙指出别人的类似问题。

提交代码的类型

在进行 Code Review 之前,要搞清楚提交的代码到底是干嘛的,然后进行针对性的审核。

代码提交一般分成四类:

  1. bug 修复。
  2. 代码优化。如:文件的移动和拆分,函数的重构等。
  3. 系统迁移。包括代码库拆分,用另一种语言重写等。
  4. 新系统和新功能。

Code Review 注意事项

  1. 从代码提交者的角度,在代码审核中需要注意如下问题:

    • 为什么要进行 PR?原因一定要在提交的时候写得非常清楚,才能帮助审核者理解这个改动是不是合理。这在以后需要进行回溯或追踪系统变化时,也是很有益的。
    • PR 要尽可能保持目标的单一性。除非是极其明显的单词拼写问题,尽量不要引入不是这个 PR 目的的改动。
    • 找谁审核?一般有两个机制:
      1. GitHub 艾特对应组,同步到组里所有人,相关的人看到后去审核;
      2. 组内设置规则,有人改动了代码即通知到整个组。
    • 一定确保所有的改动都是通过测试的。
  2. 从代码审核者的角度:

    审核的粒度要多细?是不是每次审核都要花很多时间?当然,如果时间足够,自然是看得越细越好。如果特别忙的时候,可以做一些筛选。如:

    • 可以看一下算法或者编程思路,然后加一个评论 “算法部分看来没有问题”;
    • 也可以只看你关心的部分,然后加评论 “支付部分没问题”,或者 “API 部分没问题”。
    • 还可以再 @ 一些你觉得可以对其他部分加评论的人。

    另外,如果是新人的代码,尽可能在以下方面加以审查:

    1. 代码格式方面
    2. 代码可读性方面。如:
      • 函数不要太长;
      • 所有的变量名要能说明它的用意和类型;
      • 不要有嵌套太多层的条件语句或者循环语句;
      • 不要有一个太长的布尔类型判断语句;
      • 如果不可避免有一些注释,则一定要保证注释准确且与代码完全一致。
    3. 业务边界和逻辑死角问题
    4. 错误处理
    5. 确保测试用例覆盖到了所有的功能路径。如果开发者能够预见到其他人的代码改动会引发自己的代码问题,一定要增加额外的测试用例防止这种情况的发生。
    6. 代码质量和规范。遵循公司制定的编程规范,如:
      • 有重复的代码段,就应该提取出来公用;
      • 不要在代码里随意设常数,所有的常数都应该文件顶部统一定义;
      • ......
    7. 代码架构。包括:
      • 代码文件的组织方式,函数是不是抽象到 lib 或者 helper 文件里;
      • 是不是应该使用继承类;
      • 是不是和整个代码库的风格一致;
      • API 的定义是不是 RESTful 的;
      • ......

公司层面的支持

  1. 统一的代码提交和审核流程与工具,并确保大家使用同样的工具,遵循相同的流程。
  2. 鼓励员工帮助别人审核代码,甚至可以做到效绩评估中。
  3. 制定统一的编程规范和代码风格。

两个人在编程习惯和约定俗成上不一定达成共识。如果在不违背公司风格指南的情况下,没必要一定让对方和你有一样的习惯。如果你真的觉得这样做更好,可以委婉地提出来。