谷歌是如何做代码审查的

Mark CC and SS

本文的作者 Mark CC


在上一篇文章中提到过,我已经不在Google工作了。我还没有想清楚应该去哪里—有两三个非常好的工作机会摆在我面前。因为在这段做决定时间里,我不再受雇于任何人,我想可以写一些专业性的东西,一些很有趣,但也会在同事和管理工作中导致关系紧张的东西。

Google是一个非常优秀的公司。他们做出了很多令人称赞的东西—既是公司外部,人们可以看到的东西,也是公司内部。有一些在公司内部并不属于保密的事情,在外部并没有给予足够广泛的讨论。这就是我今天要说的。

让Google的程序如此优秀的一个最重要的事情看起来是非常的简单:代码审查。并不是只有Google做这个事情—代码审查已经被广泛的认可为一种非常好的做法,很多人都在这样做。但我还没有看到第二家这样大的公司能把这种事情运用的如此普遍。在Google,没有程序,任何产品、任何项目的程序代码,可以在没有经过有效的代码审查前提交到代码库里的。

所有人都要经过代码审查。并且很正规的:这种事情应该成为任何重要的软件开发工作中一个基本制度。并不单指产品程序——所有东西。它不需要很多的工作,但它的效果是巨大的。

从代码审查里能得到什么?

很显然:在代码提交前,用第二群眼睛检查一遍,防止bug混入。这是对其最常见的理解,是对代码审查的好处的最广泛的认识。但是,依我的经验来看,这反倒是它最不重要的一点。人们确实在代码审查中找到了bug。可是,这些在代码审查中能发现的绝大部分bug,很显然,都是微不足道的bug,程序的作者花几分钟的时间就能发现它们。真正需要花时间去发现的bug不是在代码审查里能找到的。

代码审查的最大的功用是纯社会性的。如果你在编程,而且知道将会有同事检查你的代码,你编程态度就完全不一样了。你写出的代码将更加整洁,有更好的注释,更好的程序结构——因为你知道,那个你很在意的人将会查看你的程序。没有代码审查,你知道人们最终还是会看你的程序。但这种事情不是立即发生的事,它不会给你带来同等的紧迫感,它不会给你相同的个人评判的那种感受。

还有一个非常重要的好处。代码审查能传播知识。在很多的开发团队里,经常每一个人负责一个核心模块,每个人都只关注他自己的那个模块。除非是同事的模块影响了自己的程序,他们从不相互交流。这种情况的后果是,每个模块只有一个人熟悉里面的代码。如果这个人休假或——但愿不是——辞职了,其他人则束手无策。通过代码审查,至少会有两个人熟悉这些程序——作者,以及审查者。审查者并不能像程序的作者一样对程序十分了解——但他会熟悉程序的设计和架构,这是极其重要的。

当然,没有什么事情能简单的做下来的。依我的经验,在你能正确的进行代码审查前,你需要花时间锻炼学习。我发现人们在代码审查时经常会犯一些错误,导致不少麻烦——尤其在一些缺乏经验的审查者中经常的出现,他们给了人们一个很遭的代码审查的体验,成为了人们接受代码审查制度的一个障碍。

最重要的一个原则:代码审查用意是在代码提交前找到其中的问题——你要发现是它的正确。在代码审查中最常犯的错误——几乎每个新手都会犯的错误——是,审查者根据自己的编程习惯来评判别人的代码。

对于一个问题,通常我们能找出十几种方法去解决。对于一种解决方案,我们能有百万种编码方案来实现它。作为一个审查者,你的任务不是来确保被审查的代码都采用的是你的编码风格——因为它不可能跟你写的一样。作为一段代码的审查者的任务是确保由作者自己写出的代码是正确的。一旦这个原则被打破,你最终将会倍感折磨,深受挫折——这可不是我们想要的结果。

问题在于,这种错误是如此的普遍而易犯。如果你是个程序员,当你遇到一个问题,你能想到一种解决方案——你就把你想到的方案作为标准答案。但事情不是这样的——作为一个好的审查者,你需要明白这个道理。

代码审查的第二个易犯的毛病是,人们觉得有压力,感觉非要说点什么才好。你知道作者用了大量的时间和精力来实现这些程序——不该说点什么吗?

不,你不需要。

只说一句“哇,不错呀”,任何时候都不会不合适。如果你总是力图找出一点什么东西来批评,你这样做的结果只会损害自己的威望。当你不厌其烦的找出一些东西来,只是为了说些什么,被审查人就会知道,你说这些话只是为了填补寂静。你的评论将不再被人重视。

第三是速度。你不能匆匆忙忙的进行一次代码审查——但你也要能迅速的完成。你的同伴在等你。如果你和你的同事并不想花太多时间进行代码复查,你们很快的完成,那被审查者会觉得很沮丧,这种代码审查带来的只有失望的感觉。就好象是打搅了大家,使大家放下手头的工作来进行审查。事情不该是这样。你并不需要推掉手头上的任何事情来做代码审查。但如果中途耽误了几个小时,你中间还要休息一会,喝杯茶,冲个澡,或谈会儿闲话。当你回到审查现场,你可以继续下去,把事情做完。如果你真是这样,我想没有人愿意在那干等着你。

[英文原文:Things Everyone Should Do: Code Review ]
分享这篇文章:

35 Responses to 谷歌是如何做代码审查的

  1. bzhao says:

    share下大家公司的代码部署流程

  2. amaozhao says:

    原来代码审查的作用是这个,受教了

  3. ppretender says:

    昨天公司还发了这篇文章来学习,影响很大啊。

  4. Aaron says:

    好文章,值得推荐。但有趣,且可惜的是,这篇翻译显然没有人review过,有几处明显漏字了“我想没有(人)愿意在那干等着你”

  5. xwsoul says:

    代码审查这样的机制其实是一双无形的眼睛,无形中在程序员编写代码的时候会提高其代码的质量.我在上上家公司其实对于程序的Bug和什么其实还是抱着一股懒散的态度,当去了上家公司的时候,产品部门对于一些页面显性Bug以及功能上的逻辑缺陷的注意力会相当的高,虽然不会责怪程序员,但是程序员在编写代码的时候总是觉得有人在盯着自己编码,因此代码的Bug率也会下降很多…

  6. nscboy says:

    受益匪浅啊.现在知道为什么原来参与的代码审查会那么痛苦,并且还以失败结束.

    • yuhuashi says:

      感同身受。
      好的代码审查至少要遵循两个原则:
      1.审查者不要根据自己的编程习惯来评判别人的代码,要尊重作者的思路;
      2.多鼓励,少批评。

  7. 戕龙生 says:

    最后一段翻译的有问题。

  8. AhahaGe says:

    good article, wonderful

  9. peter says:

    多鼓励,少批评
    我觉得代码审查最大的意义在于分享和学习
    如果真想叫真,最好还是用些工具来做,比较有说服力,例如 fortify等工具

  10. shaopx 对这篇文章的反应是赞一个
  11. 李伟 对这篇文章的反应是赞一个
  12. 对这篇文章的反应是赞一个
  13. adsdfad 对这篇文章的反应是赞一个
  14. 张增天 对这篇文章的反应是很实用
  15. wwah 对这篇文章的反应是很实用
  16. wp701019 对这篇文章的反应是赞一个
  17. caoq 对这篇文章的反应是很实用
  18. 安健逞 对这篇文章的反应是很实用赞一个
  19. zhijing 对这篇文章的反应是赞一个
  20. ZongLiang says:

    挺不错的, 尤其是 审查者不要根据自己的编程习惯来评判别人的代码,要尊重作者的思路 这个方面,我发现我之前很多时候看别人的代码都会犯这个错,会根据自己的思路及编码习惯来评价别人的代码。这个必须得改改了

  21. liujiahua  这篇文章
  22. jin 对这篇文章的反应是很实用
  23. Stone 对这篇文章的反应是赞一个
  24. 何顺  这篇文章
  25. Dave Lee 对这篇文章的反应是很实用
  26. 流水仁家 says:

    多鼓励,少批评固然没错。审查提的好建议也该采纳!毕竟改进才能提高,一个人的认知毕竟有限!我倒是希望提出好的建议,共同提高才好!

  27. zws says:

    我也经常犯这样的错误,以后代码审查要谨记原则了,为对方检查逻辑错误,而不是编写风格要跟自己一致

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据