Code Review: 超越“审、查、评”的代码回顾
http://news.cnblogs.com/n/532148/

文/TWInsights-伍斌
Code Review 应该是软件开发团队“共同学习、识别模式和每日持续”的过程,而不是带有“审、查、评”等令人感到紧张气氛的过程。
Code Review 的目的,是团队成员聚在一起共同学习,而不是相互“挑错”。在相互挑错的场合里,人的内心会本能地封闭起来,来抗拒那些针对自己的批评意见。相互挑错所造成的紧张气氛,会让程序员对 Code Review 望而却步,从而情绪低落,这会让 Code Review 的效果大打折扣。而人们常用的“代码评审”或“代码走查”这些 Code Review 的称谓中所出现的“审、查、评”等字眼,会诱发“挑错”的气氛,所以我觉得还是把 Code Review 称为“代码回顾”好一些。如果大家放弃“挑错”,来“共同学习”,那么在代码回顾里要学习什么呢?
代码回顾的学习重点,是团队成员共同识别模式。这里的模式指的是程序员编写代码的习惯,包括“好模式”和“反模式”。像富有表达力的类名、单一职责的方法、良好的格式缩进等等,都是“好模式”。而像那些令人迷惑的缩写、几百行的一个类文件、负责的 if-else 嵌套等等,都是“反模式”。团队成员通过阅读最近编写的测试代码和生产代码,来一起识别“好模式”和“反模式”,既是团队成员之间相互学习的过程,也是团队整体达成编写整洁代码共识的过程。
既然代码回顾的学习重点是识别代码编写的好模式和反模式,那么代码的作者就不是重点。在代码回顾的过程中,完全可以不提谁是代码的作者,而只提“好模式”和“反模式”,这样能让作者放松心态,更好地接受合理的建议。
既然代码回顾的学习重点是识别代码编写的好模式和反模式,那么在代码回顾中发现的 bug 也不是代码回顾活动的重点。老虎也有打盹儿的时候,谁不犯错儿呢?好模式和反模式,其实就是编程的好习惯和坏习惯。代码回顾应该重在识别编程习惯,而不是找 bug。
另外需要注意的是,一些高手在代码回顾时,即使代码本身已经符合整洁代码的要求,他们也会不自觉地提出自己的不同写法,甚至会提出另一种全新的设计。高手们提出这些看法,虽然很有价值,但都不是代码回顾所关注的。高手们可以在代码回顾会后,私下再找作者沟通,这样能令代码回顾会议更专注和高效。
代码回顾的形式,应该是每日持续进行的。因为只有这样,才能持续改进团队的代码编写水平。要想能让代码回顾每日持续下去,一方面要像上面讲的那样,不“审、查、评”,不针对作者去找 bug,来去除“挑错”的紧张气氛,营造“识别模式”来“共同学习”的环境,吸引团队成员长期参与;另一方面,也需要将每日代码回顾的时间控制在半小时以内。因为代码回顾的重点是识别模式,而模式就是习惯,习惯在很少的代码中就能体现出来。看过一些代码并识别出一些好习惯和坏习惯后,即使再看更多的代码,也不会识别出更多种类的习惯。基于这一点,每日的代码回顾仅需要在半小时内大家一起看 200~300 行随机抽取的当天编写的代码就够了。
下面是我在客户现场实践上述“代码回顾”的具体做法:
- 团队7~8 位程序员,下班前半小时聚在会议室里,在一位主持人的引导下做代码回顾;
- 主持人问:“咱们今天回顾哪段新写的代码?”一位志愿者在投影仪上调出今天编写的一段代码的新旧对比图;
- 主持人说:“我们知道,如果代码编写得好,那么不是作者的人就能在没有作者帮助的情况下读懂。我希望一位不是这段代码作者的志愿者,来为大家解释一下这段代码是做什么的。”一位非作者的志愿者上来逐行解释代码,并回答大家的疑问。
- 主持人等代码解释完后,问大家:“这段代码大家还有看不懂的地方吗?”如果有问题,包括作者在内的参会者都可以回答问题,但大家都不提谁是作者。
- 大家都看懂代码后,主持人问:“大家说说这段代码有没有好的编写模式咱们可以继续发扬?”最初几次代码回顾,好的模式很少。但是即使这样,也一定要找出一些好模式,比如“缩进很好”,“花括号的位置放得很好”,诸如此类。以后几次代码回顾,要尽量找那些被改正过来的曾经的反模式,比如“这段代码用到了方法提取,且命名富有表达力,改掉了昨天’长方法’的反模式”。只识别反模式,不识别好模式,会让代码回顾退化到令人生畏的代码审查,打掉大家长期坚持的积极性。
- 提完了好模式,主持人问:“大家说说这段代码有没有可以改进的反模式?”大家开始提反模式,注意不要提谁是作者。
- 主持人在整个过程中注意计时,快到半小时的时候,可以这样结束代码回顾:“今天时间也快到了,代码回顾的重点在识别模式,而不是看全部的代码。希望大家继续发扬今天识别到的好模式,另外在明天代码回顾时,把今天识别到的反模式改进为好模式。”
把 Code Review 称作“代码回顾”吧,而不要称作令人紧张的“代码评审”或“代码走查”,把它打造成软件开发团队“共同学习、识别模式和每日持续”的过程,来有效提升团队代码内在质量。
注:本文参考了 Shawn Wildermuth 在 Pluralsight.com 上的培训视频 Lessons from Real World .NET Code Reviews
内容来源:ThoughtWorks 洞见
Code Review: 超越“审、查、评”的代码回顾的更多相关文章
- <转>如何进行code review
转自: http://pm.readthedocs.org/zh_CN/latest/codereview/howto.html 如何进行code review? code reivew是保障代码质量 ...
- 漫谈Code Review的错误实践
从刚开始工作时到现在,已经写了7年的代码,大部分代码都被人review过,自己也review了很多人的代码.在上一家公司的时候,我负责的一轮面试是专门进行Code Review的练习和经验谈. 通过在 ...
- 【转载】 漫谈Code Review的错误实践
原文地址: https://www.cnblogs.com/chaosyang/p/code-review-wrong-practices.html ------------------------- ...
- 我们是怎么做Code Review的
前几天看了<Code Review 程序员的寄望与哀伤>,想到我们团队开展Code Review也有2年了,结果还算比较满意,有些经验应该可以和大家一起分享.探讨.我们为什么要推行Code ...
- Code Review 程序员的寄望与哀伤
一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产环境上出了问题,有潜在的 bug. 事后分析,是生产环境的一些微妙差异,使得这种 bug 场景在线下测 ...
- Code Review Tools
Code Review中文应该译作“代码审查”或是“代码评审”,这是一个流程,当开发人员写好代码后,需要让别人来review一下他的代码,这是一种有效发现BUG的方法.由此,我们可以审查代码的风格.逻 ...
- code review作业
下面是对结对编程队友12061166 宋天舒的code review 五个优点: 1.代码的风格优秀,注释不多,但是必要的注释还是有的,比如: // 三种模式 // mode1仅统计单个单词 // m ...
- 什么是Code Review(转)
Code Review是一种通过复查代码提高代码质量的过程,在XP方法中占有极为重要的地位,也已经成为软件工程中一个不可缺少的环节.本文通过对Code Review的一些概念和经验的探讨,就如何进行C ...
- 什么是Code Review
Code Review 是一种通过复查代码提高代码质量的过程,在XP方法中占有极为重要的地位,也已经成为软件工程中一个不可缺少的环节. 本文通过对Code Review的一些概念和经验的探讨,就如何进 ...
随机推荐
- nginx学习时使用EditPuls编辑conf.xml
一.Nginx简介:是一个使用c语言开发的高性能的http服务器及反向代理服务器 二.由于在linux环境中使用vim修改配置文件相对困难.为此,我们可以借助EditPlus将虚拟机上面的目录引用到E ...
- [hadoop][会装]hadoop ha模式安装
1.简介 2.X版本后namenode支持了HA特性,使得整个文件系统的可用性更加增强. 2.安装前提 zookeeper集群,zookeeper的安装参考[hadoop][会装]zookeeper安 ...
- JS判断客户端是否是iOS或者Android手机移动端
var u = navigator.userAgent; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > - ...
- .NET Core、.NET Standard、Xamarin和.NET Framework对比
近日,微软发布了.NET Core 2.0,但是开发人员中间仍然存在一些疑惑,就是.NET Core..NET Standard.Xamarin和.NET Framework有什么不同. .NET F ...
- leetcode 之Set Matrix Zeroes(10)
设置两个布尔数组,记录行和列是否存在0.需要注意的是如何将行或列设为0. void setZeros(vector<vector<int>> &matrix) { in ...
- java的collection集合
# 原创,转载请先留言 1.集合的由来 数组的长度是固定的,当需要增加或减少元素时需要对数组重新定义,太麻烦了.java内部给我们提供了集合类,能存储任意对象,长度可以改变的,随着元素的增加而增加,随 ...
- transition结合:after,:before实现动画
div代码 <div class='div'> hover </div> css代码 .div{ width:200px; height:100px; line-height: ...
- poj 1724(最短路+优先队列)
ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13436 Accepted: 4921 Descriptio ...
- Linux 基础——开山篇
为什么要开始学习Linux命令? 首先当然是因为工作需要了,现在的工作是负责银行调度的系统的源系统接入的工作,经常要到生产部署版本.所以……买了一本<Linux命令行与shell脚本编程大全&g ...
- WordPress 一键置顶文章(推荐用SM Sticky Clicky Star)
在 WordPress入门 之 发布新文章和管理文章 中,倡萌已经简单提到可以在文章编辑界面或者快速编辑界面设置置顶文章,但是如果你想在后台文章列表中添加一键置顶文章的功能,不妨试试 Quick St ...