写点什么

坚果云开发团队分享高效代码审查经验

  • 2012-11-12
  • 本文字数:2096 字

    阅读完需:约 7 分钟

代码审查是软件开发中常用的手段,坚果云开发团队最近在“月光博客”上撰文分享了高效代码审查的十个经验。和 QA 测试相比,代码审查更容易发现和架构以及时序相关等较难发现的问题,还可以帮助团队成员提高编程技能,统一编程风格等。

代码审查首先要求团队有良好的文化,同时谨慎的使用审查中问题的发现率作为考评标准

团队需要认识到代码审查是为了提高整个团队的能力,而不是针对个体设置的检查“关卡”。“A 的代码有个 bug 被 B 发现,所以 A 能力不行,B 能力更好”,这一类的陷阱很容易被扩散从而影响团队内部的协作,因此需要避免。另外,代码审查本身可以提高开发者的能力,让其从自身犯过的错误中学习,从他人的思路中学习。如果开发者对这个流程有抵触或者反感,这个目的就达不到。

在代码审查中如果发现问题,对于问题的发现者来说这是好事,应该予以鼓励。但对于被发现者,我们不主张使用这个方式予以惩罚。软件开发中 bug 在所难免,过度苛求本身有悖常理。更糟的是,如果造成参与者怕承担责任,不愿意在审查中指出问题,代码审查就没有任何的价值和意义。

关于代码审查的数量问题,坚果云团队认为要灵活的根据开发平台或者语言控制每次审查的代码规模:

根据 smartbear 在思科所作的调查,每次审查 200 行 -400 行的代码效果最好。每次试图审查的代码过多,发现问题的能力就会下降。我们在实践中发现,随着开发平台和开发语言的不同,最优的代码审查量有所不同。但是限制每次审查的数量确实非常必要,因为这个过程是高强度的脑力密集型活动。时间一长,代码在审查者眼里只是字母,无任何逻辑联系,自然不会有太多的产出。

代码审查需要带着问题去做,并且让原作者对发现的问题进行确认:

我们在每次代码审查中,要求审查者利用自身的经验先思考可能会碰到的问题,然后通过审查工作验证这些问题是否已经解决。一个窍门是,从用户可见的功能出发,假设一个比较复杂的使用场景,在代码阅读中验证这个使用场景是否能够正确工作。使用这个技巧,可以让审查者有代入感,真正的沉浸入代码中,提高效率。大家都知道看武侠小说不容易瞌睡,而看专业书容易瞌睡,原因就是武侠小说更容易产生代入感。有的研究建议每次树立目标,控制单位时间内审核的代码数量。这个方法在我们的实践中显得很机械和流程化,不如上面的方法效果好。

如果在审查中发现问题,务必由原作者进行确认。这样做有两个目的:

  • 确认问题确实存在,保证问题被解决
  • 让原作者了解问题和不足,帮助其成长

有些时候为了追求效率,有经验的审查者更倾向于直接修改代码乃至重构所有代码,但这样不利于提高团队效率,并且会增加因为重构引入新 bug 的几率,通常情况下我们不予鼓励。

利用代码审查激活个体“能动性”:

即使项目进度比较紧张,无法完全的进行代码审查,至少也要进行部分代码的审查,此时随即抽取一些关键部分是个不错的办法。背后的逻辑是,软件开发是非常有创造性的工作,开发者都有强烈的自我驱动性和自我实现的要求。让开发者知道他写的任何代码都可能被其他人阅读和审察,可以促使开发者集中注意力,尤其是避免将质量糟糕,乃至有低级错误的代码提交给同伴审查。开源软件也很好的利用了这种心态来提高代码质量。

代码审查需要轻松的、非正式的环境:

如前所述,代码审查是一个脑力密集型的工作。参与者需要在比较轻松的环境下进行该工作。因此,我们认为像某些实践中建议的那样,以会议的形式进行代码审查效果并不好,不仅因为长时间的会议容易让效率低下,更因为会议上可能出现的争议和思考不利于进行如此复杂的工作。

除了他人审查,自我审查也有良好的效果:

所有团队成员在提交代码给其他成员审查前,必须先进行一次审查。这次自我修正形式的审查除了检查代码的正确性以外,还可以完成如下的工作:

  • 对代码添加注释,说明本次修改背后的原因,方便其他人进行审查。
  • 修正编码风格,尤其是一些关键数据结构和方法的命名,提高代码的可读性。
  • 从全局审视设计,是否完整的考虑了所有情景。在实现之前做的设计如果存在考虑不周的情况,这个阶段可以很好的进行补救。

我们在实践中发现,即使只有原作者进行代码审查,仍然可以很好的提高代码质量。

代码审查结束后的回顾总结也是非常重要的:

成员在编码的时候应做随手记录,包括在代码中用注释的方式表示,或者记录简单的个人文档,这样做有几个好处:

  • 避免遗漏。在编码时将考虑到的任何问题都记录下来,在审查阶段再次检查这些问题都确认解决。
  • 根据研究,每个人都习惯犯一些重复性的错误。这类问题在编码是记录下来,可以在审查的时候用作检查的依据。
  • 在反复记录笔记并在审查中发现类似的问题后,该类问题出现率会显著下降。

最后,坚果云团队建议“使用好的工具进行轻量级的代码审查”:

“工欲善其事,必先利其器”。我们使用的是 bitbucket 提供的代码托管服务。每个团队成员独立开发功能,然后利用 Pull Request 的形式将代码提交给审查者。复审者可以很方便在网页上阅读代码,添加评论等,然后原作者会自动收到邮件提醒,对审阅的意见进行讨论。即使团队成员分布在天南海北,利用 bitbucket 提供的工具也能很好的进行代码审查。

读者朋友对代码审查工作有什么经验和建议?欢迎发表自己的看法。

2012-11-12 00:203235
用户头像

发布了 501 篇内容, 共 255.7 次阅读, 收获喜欢 60 次。

关注

评论

发布
暂无评论
发现更多内容

【云原生 | 从零开始学 Kubernetes】三、Kubernetes集群管理工具kubectl

泡泡

Docker 云计算 云原生 k8s 9月月更

Chrome操作指南——入门篇(十)调试小技巧

Augus

Chrome开发者工具 9月月更

ShareSDK Uni-app 插件

MobTech袤博科技

uni-app ios android

数字化转型趋势|汽车电子软件开发工具链必看

laofo

DevOps cicd 研发效能 持续交付 DevOps工具链

FaissPQ索引简介

转转技术团队

深度学习 Faiss 向量计算

Linux内核详细笔记目录

简说Linux内核

嵌入式 Linux内核 驱动

用多线程实现归并排序

聚变

归并排序 Lambda函数

如何根治 Script Error.

阿里巴巴终端技术

前端 终端 Script

Chrome操作指南——入门篇(八)breakpoint

Augus

Chrome开发者工具 9月月更

常用的注册中心以及他们的对比

想要飞的猪

zookeeper nacos Eureka

ESP32-C3入门教程 基础篇(七、LEDC — LED PWM 控制器)

矜辰所致

pwm ESP32-C3 9月月更

好家伙!全网开源对标P5~P7程序员技术成长路线,阿里这次是真卷

程序员小毕

Java 程序员 面试 程序人生 架构师

前端必读2.0:如何在React 中使用SpreadJS导入和导出 Excel 文件

葡萄城技术团队

前端 Excel 框架

SpringMVC初识

十八岁讨厌编程

Java 后端开发 9月月更

JavaWeb核心之ServletConfig

楠羽

Servlet 笔记 9月月更

异常场景测试

转转技术团队

测试方案 异常测试 用例设计

ESP32-C3入门教程 基础篇(六、TIMG 硬件定时器 与 软件定时器)

矜辰所致

软件定时器 ESP32-C3 9月月更

Databend 参加 PingCAP 用户峰会 2022

Databend

数据仓库 开源社区 云平台

Chrome操作指南——入门篇(九)调试小技巧

Augus

Chrome开发者工具 9月月更

赛事升级,烽烟正燃!网易云信 Innovation 2022 开发者大赛等你参加!

网易智企

开发者大赛

一刀999?怎样让你的 iPhone 手游也拥有开挂般的体验

淋雨

imazing 存档 元气骑士

客户说你的 SaaS 产品不好用怎么办?

产品海豚湾

产品经理 SaaS 客户关系管理 产品运营 9月月更

Spring事务管理

十八岁讨厌编程

Java 后端开发 9月月更

【云原生 | 从零开始学Kubernetes】四、Kubernetes之YAML文件详解

泡泡

云计算 云原生 k8s 9月月更

计算机上的高性能计算,你了解多少?

Finovy Cloud

高性能计算

如何使用禅道集成钉钉

禅道项目管理

钉钉 项目管理工具 禅道

如何避免这10类常见故障?B站数据库架构设计做了这5步……|TakinTalks稳定性社区

TakinTalks稳定性社区

数据库治理 故障治理

Spring事务角色与事务属性

十八岁讨厌编程

Java 后端开发 9月月更

百亿市场遭「卡脖子」,国产工业软件兴起正当时

ToB行业头条

中移链DDC-SDK技术对接全流程(三)

BSN研习社

Web3.0杂谈-#002(48/100)

hackstoic

Web3.0

坚果云开发团队分享高效代码审查经验_服务革新_崔康_InfoQ精选文章