`
SSailYang
  • 浏览: 312782 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转】Pair Programming (结对编程)

 
阅读更多

转自:http://www.blogjava.net/moxie/archive/2006/09/14/69714.html

 

我们Pair 做任何一件事情。

                                              ——ThoughtWorks 西安Office

pair.gif

我的第一次PairPair Programming的简称,即结对编程。后面都是用Pair代替)是在ThoughtWorks公司面试进行的。那次,他们来自英国的项目经理Andy面试我,和我一起进行PairAndy问我以前是否Pair过,我说:“没有,这是我第一次Pair”。随即他就告诉我:“It’s very fun.(它非常有趣)。”

就这样,开始了我的第一次Pair,也是加入TW最重要的一轮面试。其实,刚开始很不习惯,我那可怜的英语口语,陌生的测试优先开发(TDD Test Driven Development  一种软件开发方式,先写单元测试代码,再写业务代码。我以前也写过很多单元测试,但从没有测试优先)。当我看到需求文档时,大脑几乎是一片空白,不知从何处下手。

但面试总不能就这样放弃吧。我又仔细看了一遍文档,尝试着写了几段业务代码。做在我旁边的Andy摇了摇头,从我手里拿了键盘。他说应该这样做,先写测试代码。于是他一边和我解释业务需求,一边写测试代码。并提醒我,如何去对一个复杂的功能进行分解,并且小步伐的前进。

Andy的引导下,我慢慢的进入了角色。充分理解业务之后,也就清楚了该如何写业务代码。我从Andy那里要了键盘,又写了几段代码。然后运行单元测试,绿色状态,测试成功。Andy微笑的向我竖起了大拇指。

受到鼓励的我,这是已完全放松进入状态。我们又试着完成了几个功能。这时,我们已经不只觉的渡过了2.5个小时。Pair确实是一件非常有趣的事。

进入ThoughtWorks公司之后,发现在大家不仅Pair编程,还Pair研究技术,Pair撰写文章,Pair翻译,等等。只要是Pair能完成的工作,我们就不一个人完成。甚至在生活中也出现了很多Pair的影子。在我们的西安Office里流传这样一句话:“我们Pair做任何一件事情”。两个人Pair,可以一起一起分享工作乐趣,一起承担工作压力。

这些天的Pair生活,让我深深体会到了Pair的优点。

一、Pair 可以最大化的提高工作效率。 软件开发并不只是程序员堆砌代码的过程,它更多的是一个创新的过程,是一个发现问题、分析问题、解决问题的过程。一个人编程时,往往有了一丝零碎的想法就开始编写代码。写完代码之后,忽然发现这个方案行不通,只好废弃这些代码,重新开始新的想法。当一个人在遇到疑难问题时,很容易走入“死角”。而Pair则不同,一个人有了想法,首先要表达出来,让自己的同伴理解,经过深刻的讨论,一致认可之后才开始编写代码。一个人编写代码,另一个则在旁边思考,会为下一步的工作提出建设性的意见。发现了问题可以及时的指正。大大的提高了代码质量。

一个人一天有效工作时间不超过34个小时。两个人一起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工作使测试案例成功通过的百分比。

test cases passed.png

(图-1

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

elapsed time.png

(图-2

而且,在具体项目中。Pair会带来比上面结果更高的价值。一、在实际开发中,如果错误越多,就要花费越多的时间去修复它。在我们的试验中,没有统计修复错误所花费的时间。二、从图-1可以看出,Pair在产生高质量代码时,也即意味着对需求的准确理解。个人团队对需求理解偏差比较大,后期也要花费更大的代价来纠正。三、从图-2可以看到,Pair的团队开发能力提高很快,这是潜在的价值。

在比较试验之后的问卷调查之后发现:

ü      Pair能用较少的时间生产更高质量的代码。

ü      Pair的学生们认为自己比一个人的时候更勤奋和更聪明的工作,因为不想让自己的partner失望。

ü      Pair的学生认为自己比一个人的时候更专著,紧凑和由纪律的工作,而且是持续的。而独立工作的学生也可以专著和紧凑的工作,但往往不持续。

ü      在紧张时间安排和繁重的工作压力下,独自工作的学生很容易蜕变为没有纪律的程序员。

  同时,在ThoughtWorks这样的咨询公司,每个开发者都是能够独挡一面。ThoughtWorks的开发者,在一般的软件公司都是类似项目经理或架构师的角色。你可以想象公司肯定要为他们提供不翡的待遇。可是,他们却Pair做任何一件事情,也从不认为自己是在浪费资源。相反,ThoughtWorks从实践中得出:Pair能够充分的利用每个开发者,让他们发挥最大的价值。

  二、人手不够。 也许,在你的公司,昨天又有一个老员工递交了辞职申请。老板看着一张张新的面孔,很无奈的摇了摇头。招聘员工并不困难。但如何让新员工快速进入角色,掌握公司的技术和业务呢?

    人员的流动一直是让很多软件公司非常困扰的问题。特别是老员工的离去,也就意味着公司多年的技术和业务积累的流失。

而在Pair工作的团队中,几乎不用担心这个问题。Pair可以快速的进行知识传递,通过PairPair伙伴的交换,知识不再是掌握在一个人的手中,而是整个团队一起共享。

ThoughtWorks内部,工作的调整和变换是非常频繁的。但很少会对项目造成影响。相反,这样的变换却加快了知识的传递。

 

三、开发者不能很好的合作,Pair 对开发者要求太高。 真的要求很高吗?看看求职简历,不是每个开发者都口口声称自己具有很好的团队合作精神吗?如果你不能很好的和别人Pair,团队精神又从何谈起呢?

那任何两个人都可以搭配进行Pair吗?

不,Pair对开发者是有要求的。它要求开发者乐意和别人沟通、合作,要求开发者能够彼此尊重,愿意和别人分享自己的知识。这不正是我们一直倡导的团队合作精神嘛!

Pair的搭配是一个有趣的问题。有人说,最好的搭配就是两个人能力相当。其实不然,Pair应该是一种多样的变换组合。在Pair的团队中,经验丰富的开发者有责任带领新人,传知授道解惑,同时可以享受传道的乐趣。新人,更应主动找有经验的伙伴Pair,快速学习提高自己。Pair的核心就是沟通,只要两个人能很好的进行沟通,那么他们就可以很好的搭配。

关于Pair的实施,其实并不困难。我们需要的只是经验,当然经验也只会来源于实践。

 

最后,我要说的是:我在ThoughtWorks中国,有幸多次和传说中的美女天才程序员一起Pair,其中的感觉也就不用多说了,呵呵。

 

参考资料:

http://www.pairprogramming.com/ 这是一个专门介绍和研究Pair的一个网站

联系作者:

Email:qiananchuan@gmail.com

http://moxie.blogdriver.com/moxie/index.html

分享到:
评论

相关推荐

    PairProgramming(结对编程)

    我的第一次Pair(PairProgramming的简称,即结对编程。后面都是用Pair代替)是在ThoughtWorks公司面试进行的。那次,他们来自英国的项目经理Andy面试我,和我一起进行Pair。Andy问我以前是否Pair过,我说:“没有,...

    XP实践结对编程demo

    **结对编程(Pair Programming)**是极限编程(XP,Extreme Programming)中的一项核心实践,旨在提高软件开发的效率和质量。在这个过程中,两位程序员坐在同一台电脑前,共同编写代码,一人为主程序员(Driver),...

    pair programming 摘要

    1. a quick start to know what's pair programming 2. 我们为什么需要结对编程? 3. 我们应该如何进行结对编程?

    结对编程——敏捷开发.pdf

    结对编程(Pair Programming)是敏捷开发(Agile Development)中的一种实践方法,它是指两名开发者坐在一起,共享一台电脑,共同编写代码的过程。 结对编程的优点: 1. 提高代码质量:通过结对编程,可以减少编码...

    PairProgramming:结对编程实验室

    结对编程结对编程实验室

    PairProgramming:19秋地科结对编程

    在“PairProgramming-master”这个文件名中,我们可以猜测这可能是一个项目源代码库,包含了关于结对编程的示例代码、练习或教学资源。通过研究这些内容,参与者可以更深入地理解结对编程的实际操作和益处。 总之,...

    PairProgramming:CS 125 结对编程

    在“PairProgramming-master”这个压缩包文件中,可能包含了该课程关于结对编程的相关材料,如示例代码、练习题目、项目指南等。通过这些资源,学生可以学习如何在实践中应用结对编程技巧,进一步掌握Java编程语言。...

    结对编程启示录

    通过阅读"Pair Programming Illuminated",读者不仅可以理解结对编程的理论基础,还能掌握实施这一实践的具体步骤。对于希望提升团队效率、改善代码质量的小型IT团队来说,这是一本不可多得的参考资料。

    pairprogramming:结对编程专业

    结对编程专业

    Addison Wesley - 结对编程启示录(手册)

    结对编程(Pair Programming)是极限编程(XP,Extreme Programming)的一个核心实践,通过两个人共同在一个工作站上编写代码,实现知识共享、即时错误检测和团队协作的增强。 1. **结对编程的基本概念**: 结对...

    结对编程在数据结构教学中的应用.pdf

    在数据结构的教学实践中,结对编程(Pair Programming)是一种极为有效的教学方法。结对编程是极限编程(Extreme Programming)实践中的一个环节,不仅能够帮助学生更快地掌握编程技能,还能够显著提升他们的团队...

    pairprogramming:使用结对编程完成 JavaScript 函数练习

    乔和杰米结对编程 完成附加的exercise.js 文件并编写它要求的函数。 前两个将由人 [A] 完成,而另一个人 [B] 会在不打字的情况下看着并提供帮助。 然后人 [B] 将打开他们的分叉版本并解决剩余的 2 个问题,而人 [A] ...

    Pair Programming Illuminated

    英文原版,中文书名:结对编程技术 结对编程技术是一个非常简单和直观的概念:两位程序员肩并肩地坐在同一台电脑前合作完成同一个设计。同一个算法、同一段代码或同一组测试、与两位程序员各自独立工作相比.结对...

    结对编程软件方法的研究与应用(1).pdf

    WILLIAMS和KESSLER的《Pair Programming Illuminated》可能是一部详尽的指南,详细阐述了结对编程的实施策略和最佳实践。 Kem Beck和唐东铭的《解析极限编程-拥抱变化》则可能探讨了极限编程(XP)框架下结对编程的...

    leetcode高频面试题-pair-programming:结对编程

    leetcode高频面试题内部结对编程资源 下面是我可以召集的进行结对编程会议的过程的记录。 :) 结对编程会话前的电子邮件 模板化电子邮件在结对编程会话发生的当天发送(周二/周四@下午 1 点,周日@上午 10 点) 模板...

    一种分布式网络环境下虚拟结对编程的设计方案.pdf

    结对编程(Pair Programming),作为极限编程(Extreme Programming)中的一个实践,已经被证明能够提升软件开发的质量、提高工作效率、降低人员变动带来的风险,并增强团队合作。 结对编程的核心优势包括: 1. ...

    pair-programming-presentation:关于结对编程的演讲

    结对编程演示 该演讲最初由 Go Free Range Ltd 的 Chris Roos 和 James Mead 于 2015 年 2 月 10 日在大英图书馆 FutureLearn 办公室发表。 执照 本作品采用。 :copyright: 版权所有 Go Free Range Ltd. 2015

    XPairtise - Pair Programming for Eclipse-开源

    在软件开发领域,结对编程(Pair Programming)是一种敏捷开发方法,它提倡两名开发人员同时在一个工作站上工作,共同编写代码,以此提高代码质量和团队协作。XPairtise 是一个专为 Eclipse 开发的开源插件,其目标...

    结对_csdn

    在IT领域,"结对"(Pair Programming)是一种常见的敏捷开发实践,指的是两个程序员在同一台计算机上共同编写代码。这种方式旨在提高代码质量、减少错误,并促进团队成员之间的知识共享和沟通。 在描述中的故事中,...

Global site tag (gtag.js) - Google Analytics