代码审查和不良编程习惯

标签: 心得体会 代码审查 | 发表时间:2014-03-06 00:23 | 作者:Aqee
出处:http://www.vaikan.com

有时候,做为一个程序员,我觉得我的职业生涯会被我开发软件使用的开发工具和技术架构明显的分割成几个阶段。一部分是因为使用的编程语言——在大学时是 Smalltalk,在Gog Creek公司是C#和Python,而另一方面是开发工具。我在Fog Creek公司里工作了8年,在那里,我们有一个非常固定的技术架构:bug管理、客户支持和文档管理用 FogBugz;开发管理用 Trello;代码审查用 Kiln;版本控制用 Mercurial;编码用Vim和 Visual Studio ;持续集成用我们的内部工具Mortar;随着时间的流逝,这些工具在慢慢的变化,但变化从来都是缓慢逐步的,一个组件一个组件的。所以,我的工作流程和工作效率一直没有巨大的变化。

大概一个月前,我加入了 Knewton公司,整个技术架构一下子完全变了。Visual Studio换成了 IntelliJ;Mortar换成了 Jenkins;Mercurial换成了Git;FogBugz换成了 JIRA

也许你会觉得这会让我头大,还会有些不知所措,但事实上并不是这样,这些工具的改变并没有对我的工作流程产生多大的影响。我发现Git和Mercurial惊人的相似,JIRA基本上是一个半成品的FogBugz,而IntelliJ算是和Visual Studio差不多吧。也许我需要从新学习一些快捷键和了解按钮的位置,但事实上我的开发模式没有实质的变化。

但有一个例外:我不喜欢使用 Gerrit做代码审查。不喜欢它的原因并不是它的程序写的很烂;不喜欢的原因是它的流程会鼓励一种不良编程习惯。

Knewton公司对代码审查非常、非常的看重。这非常好,因为我也是这样,而且我开发过整套关于代码审查的工具。所以,我的意思绝对不是反对代码审查。

而且,Gerrit的设计跟最初的 Kiln 原型的设计几乎完全一致。代码审查的实施有两种基本的方式: pre-merge,是指在代码进入主代码库之前进行代码审查。和 post-commit,是指之后审查。新版本的Kiln对两种方式都支持,但在2008年,当Tyler和我通过一个项目——也就是Kiln的前身——在Django Dash中取胜时,我们俩都认同pre-merge的工作流程。直接提交到主代码库是不允许的;你需要先创建一个审查区,把修改的代码放进去,讨论,然后,等待批准,系统会自动合并这些代码。这一种是我最欣赏的工作流程,所以Kiln一直支持这种方式(通过“Read and Branch”权限),而巧的事,这也是Gerrit唯一支持的方式,按理说我应该喜欢它才是。

kiln

我差一点就喜欢它了,但问题出在一个致命问题上: 代码审查的粒度。在Kiln中,审查是基于 被修改的相关代码。而在Gerrit里,审查是基于 单次代码修改提交。在Kiln中,一个单一审查会涉及很多次代码提交,审查的批准和拒绝是整体的,而Gerrit里审查的是一次孤立的提交。

这两种方法模式在各自的阵营里都有大量的受欢迎的系统实现。GitHub和Bitbucket都和Kiln一样都属于“批量提交”审查阵营,而Review Board, Barkeep, 和 Phabricator 都加入了“单一提交”审查阵营。所以,情况并不是我所说的某一种方式、某一款软件是对的,而其它都是错的。但我还是要坚持说,批量审查的方式是对的,而其余的都是错的,因为 单一提交审查系统在鼓励一种不良编程习惯。

单一提交审查系统有两个最根本的问题:

  1. 它在向你暗示各个修改提交之间没有关联。经常的,每当我实现一个新功能时,我都会有三个步骤:首先,重构现有的代码,让代码整洁,方便添加新功能;接下来,加入新功能;最后,写单元测试代码。功能越复杂,各个步骤里越有可能各自包含多个逻辑步骤。如果能将多个不同的提交放的一个代码审查中进行,那你就可以简单的将这些修改分组提交。但如果使用的是单一提交审查系统,那就是在迫使我将所有修改全部完成后进行一次全量提交。这样一来,重构的代码,新添加的代码,都混在一起,让人非常不爽,而且在审查过程中需要我付出大量额外的精力来指出各部分代码都是干嘛的。你也许会争辩,说你可以把修改的代码拆分提交,每一个提交对应一次审查。但事实上这样做会更糟。最好的情况下,你可以把测试程序和新功能代码分开提交,可以把重构代码和后加代码分开提交,但真正的问题是,众多的单一修改审查系统都怂恿对某个提交在 孤立的状态下进行批准,这完全会和你的愿望 相反。于是,“一次提交一次审查”的折中就从“麻烦”变成了“危险”。的确不是一种改进。
  2. 它在怂恿你隐藏历史记录。版本控制系统的最重要的功能就是告诉你代码演变的历史、是如何变成今天这个样子的。我经常会查看昨天代码是什么样的,上周二下午2点代码是什么样的,期间发生了什么变化。很多时候是因为我发现代码以前好用而现在不行,我想知道为什么。而更多时候,我是想知道为什么会对代码做这样的修改。关联的上下文是什么?动机是什么?如果你总是保持所有代码一次提交——为了审查,那我就丧失了很多历史信息:所有我能找到的就是一次完整软件的一次提交,完全没有开发过程中的过程信息。

这就是我为什么对Gerrit极度失望的原因。并不是Gerrit是一个糟糕的软件,而是他在鼓励一种在使用版本控制时不良的开发习惯。这就是为什么所有工具中唯独不喜欢它的原因,是唯一让我对放弃Kiln感到失望的系统。

本文由 外刊IT评论网( www.vaikan.com)原创发表,文章地址: 代码审查和不良编程习惯,[英文原文: Code reviews and bad habits ]

你也许会喜欢这些文章:

  1. 谷歌是如何做代码审查的
  2. 事后诸葛亮:如何写出没有bug的软件
  3. 代码审查:好事?坏事?
  4. 代码审查不是用来……
  5. 代码审查:ThoughtBot官方给出的代码审查指导原则




相关 [代码审查 编程 习惯] 推荐:

代码审查和不良编程习惯

- - 外刊IT评论网
有时候,做为一个程序员,我觉得我的职业生涯会被我开发软件使用的开发工具和技术架构明显的分割成几个阶段. 一部分是因为使用的编程语言——在大学时是 Smalltalk,在Gog Creek公司是C#和Python,而另一方面是开发工具. 我在Fog Creek公司里工作了8年,在那里,我们有一个非常固定的技术架构:bug管理、客户支持和文档管理用 FogBugz;开发管理用 Trello;代码审查用 Kiln;版本控制用 Mercurial;编码用Vim和 Visual Studio ;持续集成用我们的内部工具Mortar;随着时间的流逝,这些工具在慢慢的变化,但变化从来都是缓慢逐步的,一个组件一个组件的.

结对编程 VS 代码审查:对比开发者文化

- - ITeye资讯频道
从上一份工作到现在的这份工作,我从结对编程的开发文化过渡到同行代码审查,这个转变过程是一个非常有趣的经历. 我认为我要记录下些我所注意到的变化. 你可以找到很多标题是/(结对编程|代码审查)的(利|弊)/这种样式的文章,这些文章的作者都可以给出一套清晰且有说服力执行方案. 我认为只要权衡它们的利弊,这两种方案都是非常有效率的.

每日站会、代码审查、结对编程 之开源中国实践

- - 翟志军
在我来到开源中国之后,尝试将每日站会、代码审查、结对编程这三种编程实践带入团队. 而这个过程,我个人觉得是一项非常宝贵的体验. 先介绍下目前我们团队的结构:3名Java开发,1名前端,2名实习. 以下我不会详细介绍它们分别是什么,也无意讨论它们有什么好处坏处,本文侧重分享在实践它们的过程可能遇到的问题,以及我们是如何处理的.

代码审查过程

- - 博客园_知识库
   英文链接: Code Review Processes.   对我而言,把代码产品化而没有合适的审查流程,就像是一场抽抽乐游戏. 代码当然也有可能会挺好,不过总还是有一定概率某人的哪块积木没抽好,然后一切就轰然崩塌. 无论是采用持续集成服务、结对审查、QA审查,还是所有这些方案的组合,都可以大大降低引入风险的概率.

C/C++编程的现代习惯

- - idea's blog
相对于汇编语言是一门操作 CPU 寄存器的语言, C/C++ 是一门操作内存的语言, 这是传统的观点. 但现代的程序应用开发, 大多是把 C/C++ 当作一门应用层语言, 所以必须适当地减少对内存的关注. 这也是本文所要讲的 - C/C++ 编程的现代习惯.. 在一些古董级的编程书里, 你绝对看不到返回结构体或者类的实例, 它们告诉你"不能返回局部变量的内存".

Google 是如何做代码审查的

- litefy - python.cn(jobs, news)
在上一篇文章中提到过,我已经不在Google工作了. 我还没有想清楚应该去哪里—有两三个非常好的工作机会摆在我面前. 因为在这段做决定时间里,我不再受雇于任何人,我想可以写一些专业性的东西,一些很有趣,但也会在同事和管理工作中导致关系紧张的东西. Google是一个非常优秀的公司. 他们做出了很多令人称赞的东西—既是公司外部,人们可以看到的东西,也是公司内部.

代码审查中应该做的事

- China Moon - Solidot
威客 写道 "Mark Chu-Carroll从Google离职后,虽然已经收到了很多offer,但还没有决定去哪里. 他在其博客中分享了一些关于代码审查的趣事(中文). Google确实是一家很酷的公司. 不论是在公司内部或是外部,Google都做了很多让人赞叹的的事情. 这里我想介绍一些不涉及商业机密,但鲜为外人所知的事情.

敏捷代码审查指南

- - 博客 - 伯乐在线
“通过一次真正彻底地代码审查(code reviews),仔细阅读你的代码,找出问题,这是我知道的最好的方式去检测早期的bug,但是他们很少去这样干过. 某种意义上是因为他们花了大量的时间去写好代码,但是我认为主要是因为绝大部分 程序员害怕其他人审查自己的代码. 作为专业的程序员我们要克服阻力,如果你不愿意别人阅读你的代码,然后只是按照自己的意愿写,如果其他人没法读懂它,又怎能让别人使用呢.

代码审查(Code Review)清单

- - 博客 - 伯乐在线
代码审查可以帮助提高代码质量,避免由于代码习惯而造成的 bug. 下面列出的这些要点因该可以作为大部分代码审查的指导,如果是 Java 应用的话,这些建议应该被视作最佳实践. Javadoc 应该在每一个类和方法中添加. 如果是修复某个 bug,应该添加 bug ID. 走捷径的方法或者复杂的逻辑要有解释.

我所钟爱的代码审查

- - 译言-电脑/网络/数码科技
This is pretty standard fare for developers in the "real world", but I have never heard of an academic research group using them, and had never done code reviews myself before joining Google..