浅谈软件工程中的代码评审

代码评审这个词相信很多做开发的同学一定不会陌生,线上故障回顾总结有代码评审和单元测试总能够被高频率的提及并作为主要的整改意见,可见代码评审对于软件工程质量保证的重要性。相对于单元测试,代码评审的普及率是相对较少,相信主要原因是代码评审的执行难度高,灵活性大,评审的方法和规则难于标准化等原因,要做好代码评审往往也困难许多,这里除了涉及到具体的技术知识和业务知识,还需要评审双方的沟通能力,表达能力,个人态度以及团队氛围等多种个人软件技能或者团队开放度。

什么是代码评审

根据维基百科的定义,代码评审是软件质量保证一种活动,由一个或者多个人对一个程序的部分或者全部源代码进阅读理解。一般来说分为作者和评审者两种角色,作者方提供代码逻辑的介绍和代码,评审者则对提供的代码基于设计,功能性和非功能性等方面认知进行阅读并提出问题。常见的评审组织形式是有同行评审(Peer Review)和小组检查 (Team Inspection)两种方式。

代码评审目的

维基百科中提到通过代码的评审发现潜在的问题是代码评审主要的目的。这是不可否认的当时提出代码审查的初衷,但从我个人的实践中发现,分享和表达是代码评审过程最主要的收获。通过代码评审可能无法发现更多的明显的问题,但是一定可以通过评审过程学习和交流发现代码中存在的优点和缺点,让新同学了解业务,让老同学知道可能有更优的设计和用法。同时让同事们在评审中交流表达自己的观点,让同学们有更多的开口机会。
image

根据Google 工程团队执行代码评审活动后发现,除了捕捉bug外,还对5大无形收益。

  • 代码评审促进团队和个人开放度
  • 代码评审提升团队交付标准
  • 代码评审激励团队协作
  • 代码评审保持安全至上
  • 代码评审构建社会认可
什么时候做代码评审

代码评审最重要的一点是非常灵活,无固定形式,随时随地都可以发起。根据Github和Apache一些开源项目的代码评审实践,往往是将PR合并到主干时进行评审并作为是否合并到Master分支的一个准入条件。对于团队办公集中且人员比较固定的组织,可以基于commit进行评审,那么对于每次需要评审的工作不会太高,时效性也容易把握。

如何执行代码评审
作者 (Author)
  • 确定待评审的代码范围

根据SamrtBear在思科的一个系统小组的研究,一个开发人员一次评审的代码在200-400之间,审查超过400行代码后效率和发现均呈下降趋势。如下图:
image

同时,一个小时审查的代码行数应该少于500行,超过500行后效率呈下降趋势。
image

  • 简单的描述代码业务逻辑以及主要的业务流程
  • 开放的心态接受评审的问题或者建议
评审者(Reviewer)
  • 准备一个检查列表
  • 了解业务逻辑和主要流程
  • 准备好一些问题,对于不确定或者不明白,尽量以问题形式跟作者沟通,而非质疑。
  • 准备一些解决方案。在提出问题时候,同时思考更好的方法或者解决方案是什么?你的方法好在什么地方?
代码评审的关注点
  • 功能性 - 功能完整,是否严格按照产品说明书实现产品的所需的功能点
  • 可读性 - 代码易读易懂,其它人能够轻松从代码中读逻辑和设计思想,命名是一个学问。
  • 可测性 - 代码能够轻松被单元测试覆盖,一般来说无法被单元测试覆盖的代码不是一个好代码
  • 可维护性 - 代码运行期间日志输出完整,运维人员或者其它人员可以从日志中了解应用的运行逻辑和状态。
  • 性能 - 天下武功唯快不破,确保代码在可度量的数据量级下面保持一个稳定的性能表现。代码是否存在性能问题,预计峰值流量能到多少。
  • 多线程,并发和锁 - 在并发或者多线程情况下,代码执行结果是否有问题。过去几个月中我们有一个应用是以Shell的方式启动任务,每一个作业一个进程。由于这种方式带来的资源利用率较低,打算改成多个作业运行在一个进程中(容器)以节省系统资源, 上线后发在存在多处线程不安全的问题,实例变量被污染导致线上问题。
  • 安全性 目前虽然有很多的扫描工具可以帮助发现代码安全的问题,但更专业的开发人员在写代码就已经注意这个问题,避免基本的SQL注入,XSS跨域等问题。有兴趣的同学可以参考OWASP CODE REVIEW GUIDE
代码评审中注意事项
  • 代码评审不仅是技术,也社会学。双方沟通表达能力决定代码评审的效率和有效性。评审者需要注意问题的方式或者语气,就事论事,不上升到精神和思想层面。而作者则需秉承一切问题都可探讨或有更好的方案的想法吸收理解他人的想法,即使评审提出不合适的问题,那么你让队友知道一个正确的方法仍然是团队和组织的收获。
  • 代码评审不应太过于关注代码风格,代码风格的检查完全可以通过IDE或者扫描工具SONARCube集成CheckStyle, PMD,FINDBUG实现。
代码评审的参考书
  1. 大厂的Java编码标准,如唯品会Java编码规范阿里Java编码规范

  2. 设计模式: Design Patterns, Elements of Reusable Object-Oriented Software

  3. 代码整洁之道: clean code-代码整洁之道

  4. 高性能Java开发: Effective Java, Third Edition

  5. 重构: Refactoring_improving_the_design_of_existing_code

  6. 代码大全: code-complete-2nd-edition-v413hav.pdf

参考文档
关于作者

王云 - 唯品会财务研发微胖中年男,常年关注架构设计,高性能应用设计,软件工程,团队管理等领域。

猜你喜欢

转载自blog.csdn.net/vipshop_fin_dev/article/details/83048909
今日推荐