写点什么

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

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

    阅读完需:约 7 分钟

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

关注

评论

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

【愚公系列】2022年11月 微信小程序-Request网络请求的封装

愚公搬代码

11月月更

云原生系列四:Yelp 如何在 Kubernetes 上运行 Kafka

叶秋学长

kafka Kubernetes 云原生 11月月更

还担心接口乱糟糟?快来试试“斯瓦格”在线文档管理平台!

wljslmz

华为云 接口管理 swagger 11月月更

Redis 的 Sentinel 系统

月明风清

redis Sentinel 系统 哨兵机制

易观千帆 | 2022年9月银行APP月活跃用户规模盘点

易观分析

金融 手机银行

Vue组合式函数(二)封装一个请求

Augus

Vue3 11月月更

SQL Sever提供的字符串类型

乔乔

11月月更

美图是如何搭建压测监控一体化平台的?

TakinTalks稳定性社区

压测平台

HTML学习笔记(二)

lxmoe

html 前端 学习笔记 11月月更

从零到一带你构建可靠的大型分布式系统,不愧是IT领域又一神作!

Java永远的神

Java 分布式 程序人生 后端 架构师

从3开始,在业务系统中增加分页功能

闫同学

go语言 11月月更 后端系统

【LeetCode】爱生气的书店老板Java题解

Albert

算法 LeetCode 11月月更

学生管理系统考试试卷存储方案设计

乖乖IvyShine

微服务架构组件总结篇

邱学喆

负载均衡 Spring Cloud 注册中心 配置中心 熔断服务

QUIC不是TCP的替代品

俞凡

TCP 网络 QUIC

去哪儿的常态化容量保障是怎么做的?

TakinTalks稳定性社区

永续合约交易所的开发有哪些特征?

W13902449729

合约交易所开发 区块链交易所开发

Java中的static关键字详解

共饮一杯无

Java 关键字 11月月更

Java中的内部类与匿名内部类详解

共饮一杯无

Java 内部类 11月月更 匿名内部类

【kafka运维】TopicCommand运维脚本

石臻臻的杂货铺

kafka Kafka实战 kafka运维 11月月更

图片懒加载

源字节1号

软件开发

Go语言入门13—并发

良猿

Go golang 后端 开发 11月月更

随机森林-概述

烧灯续昼2002

Python 机器学习 算法 sklearn 11月月更

Grafana 最新开源项目 Phlare 速体验

Grafana 爱好者

云原生 可观测性 Grafana 11月月更

SQL 碎碎念,你可能用不到但不能不知道的数据库技巧(2)

百里丶落云

数据库 后端 11月月更

JavaScript基本数据类型和引用数据类型详解

肥晨

js 11月月更 数据结构js

下一代TCP: 网络演进的平台

俞凡

TCP 网络

架构实战营模块 4 作业

陌生流云

#架构实战营

超全!前端面试题大汇总

肥晨

前端面试题 11月月更 超全前端面试题

pyside6 qml 支持更新液位的伪3D圆柱

Mr_No爱学习

简单剖析开发:区块链杠杆合约交易所的核心优势

W13902449729

区块链交易所 合约交易所开发

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