节选《程序员第9期》 作者钱安川。
上周在Infoq活动中参会人员提问很多的问题就是pair program这个问题,当时针对各个问题并没有时间来详细的解答,今天看到钱安川的这篇blog,对pair做了比较详细的解释,就节选其中精华,梳理在这里,供给团队的同事们参考。
在Thoughtworks公司,开发者不仅仅是pair 编程,而且还pair做很多很多其它事情,如文档(估计是采用wiki协同编写)、学习(跟我们的小组学习估计类似)等等,看来真正的敏捷公司也是非常“XP”的,呵呵。
钱安川谈到pair的好处如下:
1、Pair 可以最大化的提高工作效率
软 件开发并不只是程序员堆砌代码的过程,它更多的是一个创新的过程,是一个发现问题、分析问题、解决问题的过程。一个人编程时,往往有了一丝零碎的想法就开 始编写代码。写完代码之后,忽然发现这个方案行不通,只好废弃这些代码,重新开始新的想法。当一个人在遇到疑难问题时,很容易走入“死角”。而Pair则不同,一个人有了想法,首先要表达出来,让自己的同伴理解,经过深刻的讨论,一致认可之后才开始编写代码。一个人编写代码,另一个则在旁边思考,会为下一步的工作提出建设性的意见。发现了问题可以及时的指正。大大的提高了代码质量。
一个人一天有效工作时间不超过3-4个小时。两个人一起Pair。 一个人编写代码,另一个人则从设计的角度思考下一步的工作,有了想法之后,互相讨论,再互换角色。在开发过程中,设计思考和编码实现不停的进行交换,保持 了良好的开发节奏。同时可以互相督促,使彼此更加认真的工作。遇到问题和压力时,可以一起面对,互相鼓励。可以一起分享解决问题的成就和乐趣。
2、Pair 是知识传播的最好途径。
很多软件公司都建立有自己的知识库,有的还建立自己的培训部门,甚至高薪聘请一些专家做技术培训。但发现效果并不理想。培训之后,开发人员面临实际的项目,还是一片茫然。而与有经验的同事一起Pair则是在实际项目中学习,具有非常强的针对性。你学到的不仅是一些技术和技巧,更多是他们思考问题方式、解决问题的方法。和各种不同经验的同事一起Pair,你的经验和能力可以得到快速的提高。
3、Pair 可以打造出最佳的合作团队
很多软件公司都建立有自己的知识库,有的还建立自己的培训部门,甚至高薪聘请一些专家做技术培训。但发现效果并不理想。培训之后,开发人员面临实际的项目,还是一片茫然。而与有经验的同事一起Pair则是在实际项目中学习,具有非常强的针对性。你学到的不仅是一些技术和技巧,更多是他们思考问题方式、解决问题的方法。和各种不同经验的同事一起Pair,你的经验和能力可以得到快速的提高。
同时针对pair带来的问题,也有很多反对的声音,主要顾虑如下:
1、 Pair 浪费资源
以前是一个人完成的工作,而现在却是由两个人一起完成。一个人在写程序,而另一个却在旁边观望。为开发人员支付报酬的老板是多么心疼那些白花花的银子。
可是,作为老板的你可曾做过统计过,每天加班工作12小时,满脸疲惫的开发人员到底为你创造了多少的价值?在这漫长的12小时中,能高效工作的时间又能有多少呢?一个开发人员每天编写几百行的代码,可是真正具有实效性的代码又有多少呢?
软件的本质就是很难用一种标准去衡量它的进度和实效性。开发人员能力的高与低、经验的多与少、工作的主动与被动,对软件开发的成本有非常大的影响。前期糟糕的代码,在后期修正,是需要付出几倍甚至更多的代价。在软件的行业里,人月和代码行永远是神话。
在1999年,犹他州立大学(University of Utah)做了一项试验。.两组学生,一组独自工作(一共13人),一组Pair(一共28人,即14对)。他们完成相同的任务(由助教预先设计和开发了测试案例)。
下面的表格(图-1)是完成相同的四个程序,独自工作和Pair工作使测试案例成功通过的百分比。

(图-1)
下面的柱状图(图-2)则是完成相同的程序,两组所花费的时间比。虽然Pair的学生在刚开始的阶段比独自工作的学生花在同样任务的时间较多,但很快Pair的学生的时间开始大幅度的下降。而独立工作的学生需要花费比Pairs更多的时间来达到接近的代码质量。

(图-2)
而且,在具体项目中。Pair会带来比上面结果更高的价值。一、在实际开发中,如果错误越多,就要花费越多的时间去修复它。在我们的试验中,没有统计修复错误所花费的时间。二、从图-1可以看出,Pair在产生高质量代码时,也即意味着对需求的准确理解。个人团队对需求理解偏差比较大,后期也要花费更大的代价来纠正。三、从图-2可以看到,Pair的团队开发能力提高很快,这是潜在的价值。在比较试验之后的问卷调查之后发现:
ü Pair能用较少的时间生产更高质量的代码。
ü Pair的学生们认为自己比一个人的时候更勤奋和更聪明的工作,因为不想让自己的partner失望。
ü Pair的学生认为自己比一个人的时候更专著,紧凑和由纪律的工作,而且是持续的。而独立工作的学生也可以专著和紧凑的工作,但往往不持续。
ü 在紧张时间安排和繁重的工作压力下,独自工作的学生很容易蜕变为没有纪律的程序员。
2、人手不够。
也许,在你的公司,昨天又有一个老员工递交了辞职申请。老板看着一张张新的面孔,很无奈的摇了摇头。招聘员工并不困难。但如何让新员工快速进入角色,掌握公司的技术和业务呢?
人员的流动一直是让很多软件公司非常困扰的问题。特别是老员工的离去,也就意味着公司多年的技术和业务积累的流失。
而在Pair工作的团队中,几乎不用担心这个问题。Pair可以快速的进行知识传递,通过Pair和Pair伙伴的交换,知识不再是掌握在一个人的手中,而是整个团队一起共享。
3、开发者不能很好的合作,Pair 对开发者要求太高。
真的要求很高吗?看看求职简历,不是每个开发者都口口声称自己具有很好的团队合作精神吗?如果你不能很好的和别人Pair,团队精神又从何谈起呢?
那任何两个人都可以搭配进行Pair吗?
不,Pair对开发者是有要求的。它要求开发者乐意和别人沟通、合作,要求开发者能够彼此尊重,愿意和别人分享自己的知识。这不正是我们一直倡导的团队合作精神嘛!
Pair的搭配是一个有趣的问题。有人说,最好的搭配就是两个人能力相当。其实不然,Pair应该是一种多样的变换组合。在Pair的团队中,经验丰富的开发者有责任带领新人,传知授道解惑,同时可以享受传道的乐趣。新人,更应主动找有经验的伙伴Pair,快速学习提高自己。Pair的核心就是沟通,只要两个人能很好的进行沟通,那么他们就可以很好的搭配。
关于Pair的实施,其实并不困难。我们需要的只是经验,当然经验也只会来源于实践。
参考资料:
http://www.pairprogramming.com/ 这是一个专门介绍和研究Pair的一个网站