先说说我们公司现在的做法,一个团队被人为地分为两个阵营:Senior Developers和Junior Developers,比例差不多是1:1,Senior Developers就担负着对Junior Developers的代码进行Review的职责,每天Review一次,对有问题的代码写上comments,然后也check in到代码库中。这种comments有特殊格式(比如//\\CodeReview:blah blah),要求Junior Developers每天下班前一小时去代码库中找这种格式的comments,然后修复自己的有问题的代码,修复时删除Reviewer留下的Comments。把Review的Comments也check in到代码库,本意是说让任何东西都有记录。

  我对Code Review的理解是,最好的形式是“结对编程”,特地查了下Wiki对Code Review的定义,明确讲了“Pair Programming”是Code Review的一种形式。我个人非常喜欢pair,甚至到了在写一些重要代码时,没人跟我pair我都不想写代码的程度。然而现实中,大部分人对pair是排斥的,尤其是那些对软件开发似懂非懂的项目经理们——他们直觉上认为那会让生产力减半。

  那就回到现实,在一个不允许进行“结对编程”的团队里,怎么做Code Review 比较好呢?说说我的想法:

  1,Code Review在某种意义上是一种“反馈系统”。软件开发中存在太多的“反馈系统”。尤其是在“敏捷”中,追求更多的“反馈”,也追求更快的“反馈”,比如Iteration,Daily meeting,TDD,face-to-face communication……不一而足。“反馈周期”总是越短越好,“结对编程”的反馈周期为0,它是“即时”的反馈系统,这也是我认为它是最好的Code Review的原因之一。那么除开“结对编程”,怎么让Code Review的“反馈周期”变短呢?像我们公司一天一次Review的做法,也许已经很短了,但显然还有更快的,比如每次Check in时Review。

  2,check in前review本身也不一定就更快,如果有人2天才check in一次代码,那还不如daily的review呢。所以就需要结合另外一个理念:check in as often as possible。以我自己的经验,在有活干的时候,check in频率在30分钟到2小时是正常的。有时会超过2小时,但那要么是有特殊原因,要么我就感觉自己写代码的方式出了问题。

  3,顺便说句题外话:看到不少程序员的一个“通病”是,完全没法在短时间内check in,他们一旦开工(尤其是做一个比较大的模块时),一发不可收拾,这边写一个类,还没写完,突然又想到要写另一个类,这样写了很多代码,你过去让他check in,他会告诉你再等等,因为他的代码现在还没法通过编译(这跟把没通过编译的代码check in的人比,还是很有人性的)。事实上,一个高手的必备技能之一就是让自己的代码处于不安全状态的时间越短越好。这种不安全包括不能通过编译,不能通过现有的单元测试,不能通过整个应用程序的smoke test……。对有这种“通病”的程序员来说,TDD是剂良药,我个人也认为他是一个分水岭:这世界上有两种程序员,一种会TDD,另一种不会TDD。个人意见,就不展开叙述了。

  4,我们公司的做法还有哪些问题?作为Reviewer,我要去找哪些代码在今天被修改过,这很费时间,如果有个工具帮忙会好点,比如有些系统可以把每次check in产生的diff发送mail给reviewer。但是,很多时候,事情的本质不会通过一个工具得到改变。本质是什么?是这种Code Review的做法是基于“push”的一个做法——Reviewer被push去review代码,然后把Review的Comments提交到代码库,Junior Devs被push每天去搜索那些comments,然后修复它们。

  5,有没有一种基于“pull”的做法?我以前一家公司,有设置一个简单的check in policy:每次check in时,必须在note里填上reviewer的名字。这样,每个人check in前就会主动找人给他Review,我感觉这有点“pull”的意思。

  6,另外一个问题是:比如某人写了一天的代码,Reviewer在第二天Review后发现他的代码设计有比较大的问题(但是能work),那么在第三天,这个人会去重构他的代码以达到更好的设计吗?基本上是不会的。那这样的review有何意义呢?

  7,这里牵涉到Code Review到底要Review什么的问题,我觉得至少可以分三种:一是小的issue(比如命名规范,代码标准);二是大的issue(比如内存泄露);最后是那种非“issue”,而是设计是否优雅简单,代码是否干净可读的问题,这种问题不会导致程序出错,在短期内甚至没有任何问题,只会在一段时间之后引起维护成本,可扩展性之类的问题。我觉得越是一个成熟的团队,Review时花在最后一种情况的时间会越多。可是这种东西,有时没有一个标准,更多的是一种程序员之间的交流和互相学习。而把Reviewer的comments冷冰冰地记录在“不良代码”的上方,然后被Review的人每天默默地修复那些“不良代码”的行为,是不是完全忽视了这一点呢?

  8,总之,code review要注意达到一些目标:快速反馈,简单有效,知识传播……

  一些零散想法,不成体系。不知道大家在公司有没有做Code Review?是怎么做的呢?

原文http://www.cnblogs.com/CaiAbin/archive/2011/04/09/2010706.html

大家是怎么做Code Review的?的更多相关文章

  1. 我们是怎么做Code Review的

    前几天看了<Code Review 程序员的寄望与哀伤>,想到我们团队开展Code Review也有2年了,结果还算比较满意,有些经验应该可以和大家一起分享.探讨.我们为什么要推行Code ...

  2. 如何在python脚本开发做code review

    在软件项目开发中,我们经常提到一个词“code review”.code review中文翻译过来就是代码评审或复查,简而言之就是编码完成后由其他人通过阅读代码来检查代码的质量(可编译.可运行.可读. ...

  3. 转:我们是怎么做Code Review的

    我们是怎么做Code Review的   前几天看了<Code Review 程序员的寄望与哀伤>,想到我们团队开展Code Review也有2年了,结果还算比较满意,有些经验应该可以和大 ...

  4. Code Review 程序员的寄望与哀伤

    一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产环境上出了问题,有潜在的 bug. 事后分析,是生产环境的一些微妙差异,使得这种 bug 场景在线下测 ...

  5. <转>如何进行code review

    转自: http://pm.readthedocs.org/zh_CN/latest/codereview/howto.html 如何进行code review? code reivew是保障代码质量 ...

  6. 什么是Code Review(转)

    Code Review是一种通过复查代码提高代码质量的过程,在XP方法中占有极为重要的地位,也已经成为软件工程中一个不可缺少的环节.本文通过对Code Review的一些概念和经验的探讨,就如何进行C ...

  7. 什么是Code Review

    Code Review 是一种通过复查代码提高代码质量的过程,在XP方法中占有极为重要的地位,也已经成为软件工程中一个不可缺少的环节. 本文通过对Code Review的一些概念和经验的探讨,就如何进 ...

  8. Code Review 程序员的寄望与哀伤【转载】

    一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产环境上出了问题,有潜在的 bug. 事后分析,是生产环境的一些微妙差异,使得这种 bug 场景在线下测 ...

  9. 基于GitLab的Code Review教程

    一.前言 1.本文主要内容 GitLab Code Review机制说明 Git Workflow 与 Git Code Review Workflow GitLab Code Review 配置说明 ...

随机推荐

  1. 字符串匹配(hash算法)

    hash函数对大家来说不陌生吧 ? 而这次我们就用hash函数来实现字符串匹配. 首先我们会想一下二进制数. 对于任意一个二进制数,我们将它化为10进制的数的方法如下(以二进制数1101101为例): ...

  2. 利用Canvas进行绘制XY坐标系

    首先来一发图 绘制XY的坐标主要是利用Canvas setLeft和setBottom功能(Canvas内置坐标的功能) 1.首先WPF中的坐标系都是从左到右,从上到下的 即左上角位置(0,0)点,所 ...

  3. Code First操作Mysql数据库

    前面博客也讲了,自己做一个网站,选用的是MVC+EF Code First+MySql+EasyUI,先说下技术选型.一.为什么选择MVC? 因为之前自己做的系统大部分是webForm,MVC的之前也 ...

  4. Bootstrap系列 -- 10. 网格布局

    一. 实现原理 网格布局是通过容器的大小,平均分为12份(可以修改),再调整内外边距,和表格布局有点类似但是也存在区别. 实现步骤如下: (1) 数据行.row 必须包含在容器.container 中 ...

  5. GBDT(MART) 迭代决策树简介

    以下对GBDT的介绍深入浅出,非常易懂 转自:http://blog.csdn.net/w28971023/article/details/8240756 GBDT(Gradient Boosting ...

  6. JavaScript学习笔记- 正则表达式常用字符集及方法

    正则表达式修饰符(修饰符 可以在全局搜索中不区分大小写) i(ignoreCase)执行对大小写不敏感的匹配 g (global)     执行全局匹配(查找所有匹配而非在找到第一个匹配后停止) m( ...

  7. Hibernate之Annotation(注解的方式,非映射)

    在hibernate 3.0之后,可以建立一个符合JPA标准的Annotation,以hibernate3.3.2GA为例 Annotation 以 hibernate Annotation 3.3. ...

  8. GO语言数组和切片实例详解

    本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...

  9. linux基础-第十三单元 硬盘分区、格式化及文件系统的管理二

    第十三单元 硬盘分区.格式化及文件系统的管理二 文件系统的挂载与卸载 什么是挂载 mount命令的功能 mount命令的用法举例 umount命令的功能 umount命令的用法举例 利用/etc/fs ...

  10. 【PKUSC 2015的一道数学题】

    有9个人,每三个人中至少有两个互相认识,求证这里面至少有4个人互相认识 PKU官方题解: 引理:二染色K6中一定有同色K3. 证明:考虑某一个点,它一定连出至少三条同色边(不妨设为红边),这三条边连的 ...