如何做代码评审(Code Review)。
Code Review 主要是在软件开发的过程中,对源代码进行同级评审,其目的是找出并修正软件开发过程中出现的错误,保证软件质量,提高开发者自身水平。
两个概念
Commit:可以单独保存的源代码的最小改动单位。PR:Pull Request,一次代码提交请求。一个PR可以包含一次Commit,也可以是多个。提交后,页面上会显示这次提交请求的代码和原代码的所有不同之处,即本次PR的所有改动。
请求提交后,其他工程师可以在 PR 的页面上提出意见和建议,也可以针对某一些代码的改动进行讨论,也可以给整体评价。代码的作者也可以回复这些意见和建议,或者按照建议进行改动,新的改动将为本次 PR 中提交新 Commit(也可以覆盖之前的 Commit)。
代码合并规则
一般情况下,所有的 PR 都必须有至少一个人认可,才能进行合并。如果改动的内容涉及多个项目,则需要每个项目都有相关人员认可才能合并。
在代码合并之前,进行 Code Reivew 的工程师们会在 GitHub 的相关页上给出各种评论,页面是共享的,这些信息大家都能看到。
有些评论是询问,代码的作者直接回复或解释就行,有些是指出代码的问题,代码作者可能会据此改动,也可能不会同意,那就需要回复评论,阐述观点。有时候一个实现细节,讨论的主题可以多达十几条或几十条,最终需要达成一致才能进行合并。
帮助别人成长,而不是帮对方写代码
从对方的角度来说,代码写不好,可能是对业务不熟悉,对编程语言不熟悉,也可能是对公司代码的整体架构不熟悉。
- 耐心指出哪里有问题,这样下次可能就知道该怎么做了。
- 让对方明白代码应该怎么写,一定程度上是在复制你的生产力。
写代码是一个学习过程,怎么做一个好的代码审核人更是一个学习和成长的过程。自己绕过一个坑不难,难的是看到别人那么走,远远地你就能告诉他那里有个坑,而他在你的指导下,以后也会帮忙指出别人的类似问题。
提交代码的类型
在进行 Code Review 之前,要搞清楚提交的代码到底是干嘛的,然后进行针对性的审核。
代码提交一般分成四类:
bug修复。- 代码优化。如:文件的移动和拆分,函数的重构等。
- 系统迁移。包括代码库拆分,用另一种语言重写等。
- 新系统和新功能。
Code Review 注意事项
-
从代码提交者的角度,在代码审核中需要注意如下问题:
- 为什么要进行
PR?原因一定要在提交的时候写得非常清楚,才能帮助审核者理解这个改动是不是合理。这在以后需要进行回溯或追踪系统变化时,也是很有益的。 PR要尽可能保持目标的单一性。除非是极其明显的单词拼写问题,尽量不要引入不是这个PR目的的改动。- 找谁审核?一般有两个机制:
- 在
GitHub艾特对应组,同步到组里所有人,相关的人看到后去审核; - 组内设置规则,有人改动了代码即通知到整个组。
- 在
- 一定确保所有的改动都是通过测试的。
- 为什么要进行
-
从代码审核者的角度:
审核的粒度要多细?是不是每次审核都要花很多时间?当然,如果时间足够,自然是看得越细越好。如果特别忙的时候,可以做一些筛选。如:
- 可以看一下算法或者编程思路,然后加一个评论 “算法部分看来没有问题”;
- 也可以只看你关心的部分,然后加评论 “支付部分没问题”,或者 “API 部分没问题”。
- 还可以再
@一些你觉得可以对其他部分加评论的人。
另外,如果是新人的代码,尽可能在以下方面加以审查:
- 代码格式方面。
- 代码可读性方面。如:
- 函数不要太长;
- 所有的变量名要能说明它的用意和类型;
- 不要有嵌套太多层的条件语句或者循环语句;
- 不要有一个太长的布尔类型判断语句;
- 如果不可避免有一些注释,则一定要保证注释准确且与代码完全一致。
- 业务边界和逻辑死角问题。
- 错误处理。
- 确保测试用例覆盖到了所有的功能路径。如果开发者能够预见到其他人的代码改动会引发自己的代码问题,一定要增加额外的测试用例防止这种情况的发生。
- 代码质量和规范。遵循公司制定的编程规范,如:
- 有重复的代码段,就应该提取出来公用;
- 不要在代码里随意设常数,所有的常数都应该文件顶部统一定义;
- ......
- 代码架构。包括:
- 代码文件的组织方式,函数是不是抽象到 lib 或者 helper 文件里;
- 是不是应该使用继承类;
- 是不是和整个代码库的风格一致;
API的定义是不是RESTful的;- ......
公司层面的支持
- 统一的代码提交和审核流程与工具,并确保大家使用同样的工具,遵循相同的流程。
- 鼓励员工帮助别人审核代码,甚至可以做到效绩评估中。
- 制定统一的编程规范和代码风格。
两个人在编程习惯和约定俗成上不一定达成共识。如果在不违背公司风格指南的情况下,没必要一定让对方和你有一样的习惯。如果你真的觉得这样做更好,可以委婉地提出来。