Pair Programming(结对编程)
这些天一直跟Leader共同做一个UserStory,觉得两个人一起编程,不管是进度,还是准确度,以及工作时的心情和态度,都跟一个人编程时有很大的差别。Leader 说,你可以查一下什么是Pair Programming,呵呵,一看,还真的大开眼界,受益匪浅。
Pair Programming, 即结对编程,是一种敏捷软件开发的方法,极限编程的组成部分。英文定义如下:
Pair programming is an agile software development technique in which two programmers work together at one workstation. One, the driver, types in code while the other, the observer (or navigator), reviews each line of code as it is typed in. The two programmers switch roles frequently.
While reviewing, the observer also considers the strategic direction of the work, coming up with ideas for improvements and likely future problems to address. This frees the driver to focus all of his or her attention on the "tactical" aspects of completing the current task, using the observer as a safety net and guide.
Pair Programming的优点。
一、Pair 可以最大化的提高工作效率。 软件开发并不只是程序员堆砌代码的过程,它更多的是一个创新的过程,是一个发现问题、分析问题、解决问题的过程。一个人编程时,往往有了一丝零碎的想法就开始编写代码。写完代码之后,忽然发现这个方案行不通,只好废弃这些代码,重新开始新的想法。当一个人在遇到疑难问题时,很容易走入“死角”。而Pair则不同,一个人有了想法,首先要表达出来,让自己的同伴理解,经过深刻的讨论,一致认可之后才开始编写代码。一个人编写代码,另一个则在旁边思考,会为下一步的工作提出建设性的意见。发现了问题可以及时的指正。大大的提高了代码质量。
一个人一天有效工作时间不超过3-4个小时。两个人一起Pair。一个人编写代码,另一个人则从设计的角度思考下一步的工作,有了想法之后,互相讨论,再互换角色。在开发过程中,设计思考和编码实现不停的进行交换,保持了良好的开发节奏。同时可以互相督促,使彼此更加认真的工作。遇到问题和压力时,可以一起面对,互相鼓励。可以一起分享解决问题的成就和乐趣。
二、Pair 是知识传播的最好途径。 很多软件公司都建立有自己的知识库,有的还建立自己的培训部门,甚至高薪聘请一些专家做技术培训。但发现效果并不理想。培训之后,开发人员面临实际的项目,还是一片茫然。而与有经验的同事一起Pair则是在实际项目中学习,具有非常强的针对性。你学到的不仅是一些技术和技巧,更多是他们思考问题方式、解决问题的方法。和各种不同经验的同事一起Pair,你的经验和能力可以得到快速的提高。
在ThoughtWorks公司,如果你要加入一个项目,完全不用担心它使用的技术和涉及的业务。只要你有一定的基础,和有经验的同事一起Pair能让你很快熟悉和掌握它们。
三、Pair 可以打造出最佳的合作团队。 团队是有组织有计划的,合理有效地利用各种资源,进行最佳的组合。Pair并不是一对固定的伙伴,我们鼓励在团队中经常交换Pair伙伴。这时我们发现,项目不再是一个人的事情,也不是两个人的事情,而是整个团队的事情。
通过Pair,大家可以在最短的时间内完成磨合。Pair很好的促进了团队的沟通交流,经常一起合作Pair的伙伴,彼此了解、熟悉,很多都是工作和生活上的好友。在这样的团队里,大家很乐意互相协助,一起分享知识,分享快乐。
在听过我们一番热情洋溢的阐述之后,某些项目管理者会点头并且认可Pair带来的力量。但,我们也听到了一些拒绝Pair的声音。下面是我们听到的拒绝Pair的最主要的理由,当然也包括了我们的辩解。
一、 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的学生认为自己比一个人的时候更专著,紧凑和由纪律的工作,而且是持续的。而独立工作的学生也可以专著和紧凑的工作,但往往不持续。
- 在紧张时间安排和繁重的工作压力下,独自工作的学生很容易蜕变为没有纪律的程序员。
二、人手不够。 也许,在你的公司,昨天又有一个老员工递交了辞职申请。老板看着一张张新的面孔,很无奈的摇了摇头。招聘员工并不困难。但如何让新员工快速进入角色,掌握公司的技术和业务呢?
人员的流动一直是让很多软件公司非常困扰的问题。特别是老员工的离去,也就意味着公司多年的技术和业务积累的流失。
而在Pair工作的团队中,几乎不用担心这个问题。Pair可以快速的进行知识传递,通过Pair和Pair伙伴的交换,知识不再是掌握在一个人的手中,而是整个团队一起共享。
三、开发者不能很好的合作,Pair 对开发者要求太高。 真的要求很高吗?看看求职简历,不是每个开发者都口口声称自己具有很好的团队合作精神吗?如果你不能很好的和别人Pair,团队精神又从何谈起呢?
那任何两个人都可以搭配进行Pair吗?
不,Pair对开发者是有要求的。它要求开发者乐意和别人沟通、合作,要求开发者能够彼此尊重,愿意和别人分享自己的知识。这不正是我们一直倡导的团队合作精神嘛!
Pair的搭配是一个有趣的问题。有人说,最好的搭配就是两个人能力相当。其实不然,Pair应该是一种多样的变换组合。在Pair的团队中,经验丰富的开发者有责任带领新人,传知授道解惑,同时可以享受传道的乐趣。新人,更应主动找有经验的伙伴Pair,快速学习提高自己。Pair的核心就是沟通,只要两个人能很好的进行沟通,那么他们就可以很好的搭配。
关于Pair的实施,其实并不困难。我们需要的只是经验,当然经验也只会来源于实践。
部分摘自:http://en.wikipedia.org/wiki/Pair_programming
部分摘自:http://www.blogjava.net/moxie/archive/2006/09/14/69714.html