acm-header
登录

ACM通信

ACM通信

关于结对编程,我真正需要知道的都是在幼儿园学到的


结对编程是指两名程序员在一台计算机上并肩工作,在相同的设计、算法、代码或测试上持续协作。这种方法已经被证明可以提高软件产品的生产率和质量。此外,最近的一项调查(下文称为“结对编程调查”)发现,程序员在结对编程时比单独工作时对自己的解决方案更有信心。同样地,96%的受访者认为结对编程更享受自己的工作。12].

然而,大多数程序员长期习惯于单独工作,常常抵制向结对编程的过渡。最终,大多数人都成功地完成了这一转变。本文的目标是帮助程序员成为高效的结对程序员。像Robert Fulghum在一篇文章中所阐述的那样,过渡到结对程序员并继续取得成功通常需要练习日常礼仪。在这里,我们从文章中的每一行(偶尔诗意地)来探索与成功的结对编程相关的内在教训。

坊间传闻和初步统计证据表明结对编程非常有益。极限编程(XP)是一种新兴的软件开发方法,所有的产品代码都是由合作伙伴编写的。XP最初是由Smalltalk代码开发人员和顾问Kent Beck与同事Ward Cunningham和Ron Jeffries共同开发的。XP的需求收集、资源分配和设计实践与大多数公认的方法完全不同。客户需求被写成相当非正式的“用户故事”卡片,卡片上分配了一个粗略的工作量估计。然后将这些卡片指定为一个编程对,然后开始编码。没有正式的设计过程,也没有关于整个系统规划或体系结构的讨论,两人决定代码库中的哪些代码需要添加或更改。这种做法需要使用集体代码所有权因此,无论最初的程序员是谁,任何编程对都可以修改或添加代码库中的任何代码。在这个不断扩大的代码库上不断执行大量的单元测试。

XP成功的证据是非常有趣的,但它是如此令人印象深刻,引起了许多备受尊敬的软件工程研究人员和顾问的好奇心。其成就的最大例子是1997年5月推出的规模可观的克莱斯勒综合薪酬体系。在发现重要的、初始的开发问题之后,Beck和Jeffries使用XP原则重新启动了这个开发。工资单系统每个月支付大约10,000名员工,有2,000个类和30,000个方法[1].它几乎按时投入生产,直到今天仍在运行。


大多数程序员长期习惯于单独工作,常常抵制向结对编程的过渡。然而,最终,大多数人都成功地完成了这一转变。


XP将巨大的成功归功于所有程序员专家和新手对结对编程的使用。XP提倡结对编程的热情,以至于即使是单独完成的原型也被废弃,并与合作伙伴重新编写。一个关键元素是在结对工作时执行连续的代码审查。令人惊讶的是,当另一个人在背后监视时,有多少明显的,但不被注意到的缺陷被发现了。根据(11],结果证明两个程序员一起工作的速度是两个程序员单独工作的两倍多,想到的问题解决方案是两个程序员单独工作的两倍多,同时获得更高的缺陷预防和缺陷删除,从而产生更高质量的产品。

此外,另外两项研究支持使用结对编程。著名程序员和顾问Larry Constantine在访问P.J. Plaugher的软件公司Whitesmiths, Ltd时报告了一些“动态二人组”,为协作编程提供了轶事支持。他立刻注意到一屋子成对的程序员在一台计算机上处理相同的代码。“采用了这种方法后,他们交付完成和测试的代码比以往任何时候都要快……从两个程序员终端后面出来的代码几乎100%没有bug…这是更好的代码,更紧凑,更高效,受益于两个聪明头脑的思考和两个值得信任的终端伙伴之间的稳定对话……两个程序员串连不是冗余;他认为,这是提高效率和质量的直接途径。[3.].

天普大学(Temple University)的John Nosek做了一项实验,研究了15名有经验的全职程序员,他们在自己的环境和设备中,用45分钟的时间解决一个对他们的组织很重要的挑战性问题。其中5人单独工作,10人以5对合作的形式工作。实验(团队)和对照组(个人)的条件和材料是相同的。这项研究提供了统计上显著的结果,使用双面t以及。Nosek解释道:“出乎经理和参与者的意料,所有团队的表现都超过了程序员个人,他们更享受解决问题的过程,并且对自己的解决方案更有信心。”

此外,通过在更短的时间内生成更好的算法和代码,小组完成任务的速度和效率提高了40%。大多数程序员都怀疑合作解决同一个问题的价值,认为这不会是一个愉快的过程。然而,研究结果显示,合作提高了他们的表现和解决问题过程的乐趣。8].

结对编程调查的受访者对该技术给予了压倒性的支持。其中一人说:“我强烈认为结对编程是我们团队成功的主要原因。它为我们提供了非常高水平的代码质量(几乎达到零缺陷的程度)。我们唯一犯过错误的代码不是成对编程的……利用。”

对结对编程如此成功的原因的研究揭示了许多基本原则。这些原则可以在Fulghum的文章中讨论:

回到顶部

分享一切。

在结对编程中,两个程序员被分配共同生成一个工件(设计、算法、代码等)。这两名程序员就像一个一致的、智能的有机体,用一个头脑工作,负责这个工件的每个方面。一个人在打字或写作,另一个人在不断地回顾工作。双方都是这一过程的平等参与者。说或想诸如“你在设计中犯了一个错误”或“那个缺陷是你自己造成的”之类的话是不可接受的。相反,“我们搞砸了设计,”或者更好,“我们只是通过了测试,没有任何缺陷!”双方都拥有一切。

回到顶部

公平竞争。

在结对编程中,一个人驱动(控制键盘或记录设计想法),而另一个人则持续地审查工作。即使当一个程序员明显比另一个更有经验,轮流驾驶也是很重要的,以免观察者变得脱节,感觉脱离了循环,或不重要。

不开车的人不应该是一个被动的旁观者,而应该总是积极和参与。看别人的节目就像看沙漠里的草死去一样有趣。2].在结对编程调查中,大约90%的人表示,不打字的人的主要作用是执行持续的分析、设计和代码审查。“当一方忙于打字时,另一方则在从更有战略意义的层面进行思考。这条发展路线将走向何方?它会走入死胡同吗?有没有更好的总体战略?”

回到顶部

不要打人。

确保他或她保持专注,专注于任务(当然,不要暴力)。毫无疑问,结对工作的一个好处是,每个人都不太可能浪费时间阅读电子邮件、上网冲浪或盯着窗外看,因为他们的搭档在等待不断的贡献和输入。“两个人在一起工作时,他们认为共同的时间更有价值。他们倾向于缩短通话时间;他们不浪费彼此的时间。”10].

此外,每个人都希望对方遵循规定的开发实践。“有你的伴侣在看,但是,很有可能即使你想放弃其中的一个练习,你的伴侣也不会……与单独工作相比,两人合作时忽视自己对团队其他成员的承诺的可能性要小得多。”2].

正如结对编程调查中总结的那样,“这需要更多的努力,因为节奏总是被另一个人强迫着;两人都觉得自己不能懈怠。”当每个人都让他或她的伙伴专注于任务时,巨大的生产力提高和质量提高就实现了。

回到顶部

把东西(尤其是消极的想法)放回它们该放的地方。

人的头脑是很狡猾的。如果你思考某件事的时间足够长,大脑就会认为它是事实。如果你对自己说一些消极的话,比如“我是个糟糕的程序员”,很快你的大脑就会相信你的话。然而,任何人都可以控制这种消极的自我对话,只要在它们开始潜入的时候,把它们放在它们应该在的地方。接受调查的结对程序员表示,与对自己的编程技能缺乏安全感或焦虑的人一起工作非常困难。他们往往对自己有一种防御性。有这种不安全感的程序员应该将结对编程视为一种通过不断观察和从他人那里获得反馈来提高技能的方法。

一位受访者表示,“结对编程对我来说最好的事情是持续的讨论,这让我在阐述自己对设计和编程的想法方面得到了训练。它帮助我反思这些想法,让我成为更好的设计师/程序员。”事实上,两名研究人员就软件开发中的协调技术对750名在职程序员进行了调查[7].使用最多、价值最高的沟通方式是与同伴讨论。“当一个人遇到无法独自解决的问题时,标准的反应是去找附近的同事。”当结对编程时,“附近的同事”是持续可用的。在一起,他们可以解决单独解决不了的问题,还可以帮助提高彼此的技能。

此外,消极的想法也应该被拒绝,如“我是一个很棒的程序员,但我和一个彻头彻尾的失败者配对”,以免合作关系被破坏。无论我们有多熟练,没有人是绝对正确的,不受他人的影响。约翰·冯·诺依曼,伟大的数学家和冯·诺依曼计算机体系结构的创造者,认识到自己的不足,并不断地请别人审查他的工作。的确,冯·诺伊曼的天才是毋庸置疑的。他意识到自己的人性局限性的能力使他远远超过了今天的普通程序员。普通人可以被训练去接受他们的人性——他们不能像机器一样工作,并重视它并与他人合作,以便保持在编程成功所需要的控制之下。9].

回到顶部

把你的脏东西清理干净。

结对程序员的优势在于有一个合作伙伴来帮助他们进行清理。许多人提到,许多明显的,但未被发现的缺陷是被另一个人注意到的。此外,这些缺陷可以在没有在正式的检查会议中可能产生的自然敌意的情况下被删除。已建立的软件工程技术经常强调缺陷预防和有效的缺陷删除的重要性。也许这种“越过肩膀”技术是缺陷预防和缺陷去除效率的缩影。


无论我们有多熟练,没有人是绝对正确的,不受他人的影响。


回到顶部

不要把事情看得太认真。

"无自我编程"这个想法25年前由杰拉德·温伯格在计算机编程心理学,对于有效的结对编程是必不可少的。根据配对编程调查,过度自我会以两种方式表现出来,这两种方式都会破坏合作关系。首先,“不听我的就走”的态度会阻止程序员考虑其他想法。其次,过度的自我意识会导致程序员在受到批评时产生防御心理,或者将这种批评视为不信任。

一个关于程序员寻求检查他所生成的代码的真实场景在[9].在这个特别糟糕的编程日,一个人毫无自尊地笑了,因为他的审稿人在13条语句中发现了17个错误。然而,在修复了这些缺陷之后,代码在测试和生产过程中完美地运行。如果程序员过于骄傲而不接受别人的输入,或者将这种输入视为他的不足之处,那么结果将会多么不同。对结对编程进行另一次评审设计和持续客观地编码是非常有益的方面。“人类的眼睛有一种几乎无限的能力,可以看不见它不想看到的东西……如果让程序员自己去做,他们就会忽略那些别人一眼就能看出来的最明显的错误。9].

相反,如果一个人总是和他的伙伴意见一致,以免制造紧张,那么他也会把合作的好处降到最低。为了进行有益的思想交流,应该有一些有益的分歧/辩论。值得注意的是,在过多和过少的自我表现之间有一个微妙的平衡。有效的结对程序员会在最初的调整阶段磨练这种平衡。Ward Cunningham是XP的创始人之一,也是经验丰富的结对编程员,他报告说,最初的调整阶段可能需要几个小时或几天,这取决于个人、工作性质和他们过去的结对编程经验。

回到顶部

当你伤害了别人的时候,说对不起。

在结对编程调查中,96%的程序员同意适当的工作空间布局对他们的成功至关重要。结对编程人员采取积极的行动来改善他们的物理环境,他们自己动手(用螺丝刀武装起来)。程序员必须能够并排坐着编程,同时查看电脑屏幕,并共享键盘和鼠标。极端的程序员有一个“滑动键盘/不要移动椅子”的规则。

有效的沟通,无论是在协作组内部还是与其他协作组之间,都是至关重要的。程序员无需付出太多努力,就需要看到彼此,互相询问问题,并就诸如集成问题之类的事情做出决定,以免这些问题/问题没有得到充分的讨论。程序员还可以从“无意中”听到他们可以做出重要贡献的其他对话中获益。分开的办公室和隔间会阻碍这种必要的交流。“如果有一件事能证明心理学研究被在职管理者忽视了,那就是继续使用半隔板把工作空间分成一个个小隔间. ...。就像许多国王一样,一些经理使用分而治之的策略来统治他们的臣民,但程序员需要与其他程序员接触。9].

回到顶部

开始前要洗手。

许多程序员在第一次进行结对编程任务时,对编程中协作的价值持怀疑态度,并不期望从中受益或享受这种经验。两个持怀疑态度的程序员组成一个团队当然可以实现这个自我实现的预言。在结对编程的调查中,91%的人认为“合作伙伴的参与”是结对编程成功的关键。

结对编程关系可以通过一个程序员请另一个程序员坐下来,给他们一些帮助,然后从那里继续进行,来非正式地建立起来。一旦建立了关系,就可以说:“进展得很好。我现在有一些额外的时间。今天下午有什么我可以帮你的吗?”经验表明,只要有一个非常积极和/或有结对编程经验的程序员,就可以使结对成为一个成功的协作团队。

Tom DeMarco分享了他对这种联盟的鼓舞人心的观点[4].“一个团结的团队是一群人如此紧密地团结在一起,以至于整体大于部分之和。这样一个团队的产出要比同一群人以无胶的形式工作要大得多。同样重要的是,考虑到工作本身的性质,人们从工作中获得的乐趣比你预期的要多。在某些情况下,在完成别人认为完全枯燥的任务时,团结的团队度过了一段美妙的时光. ...一旦团队开始凝聚,成功的可能性就会急剧上升。球队几乎可以势不可挡,成为成功的主宰。”

给有前途的结对程序员的建议:洗手,不要怀疑,要对成功抱有期望,用“Jell me!”来问候您的合作伙伴。这是一个前所未有的机会,两国可以合二为一。

回到顶部

冲洗。

不可避免的是,这对程序员将独立工作。在接受调查的程序员中,超过一半的人表示,当他们重新与合作伙伴合作时,他们会回顾独立完成的工作,并将其纳入到项目中。或者,极端的程序员刷新和重写独立的工作。在他们的XP经验中,大多数缺陷都可以追溯到程序员独立工作的时候。事实上,在克莱斯勒综合补偿项目首次生产前的5个月里,唯一通过单元和功能测试的缺陷是由单独编程的人编写的。在重写的过程中,作者必须按照惯例对作品进行持续的审查,从而发现额外的缺陷。

是刷新还是检查独立完成的工作可以由一对程序员来决定,或者可以鼓励这种选择,就像使用XP一样。然而,值得注意的是,没有一个接受调查的程序员在没有审查的情况下将独立完成的工作合并在一起。

回到顶部

热饼干和冷牛奶对你有好处。

因为结对程序员必须让彼此持续专注于任务,这可能是一种非常紧张和精神疲惫的经历。定期休息对于保持体力进行另一轮高效的结对编程是很重要的。在休息期间,最好断开手头的任务,并在重新启动时刷新它。建议的活动:查看电子邮件,打电话,上网,吃热饼干,喝冷牛奶。

回到顶部

过一种平衡的生活,学习一些,思考一些,每天画画,唱歌,跳舞,玩耍,工作一些。

经常与他人沟通是平衡生活的关键。“如果被问到这个问题,大多数程序员可能会说他们更喜欢一个人在一个不会被其他人打扰的地方工作。”[9].但是,与其他程序员的非正式讨论——你的搭档或任何其他人——可以有效地交换想法和有效地传递信息。例如,温伯格[9]讨论了一个大型的大学计算中心,在这里是一个公共空间,在房间的后面有一系列自动售货机。一些比较认真的学生抱怨这个公共空间的噪音太大,于是机器就被移走了。机器被移走后不久,墙上又响起了另一种抱怨:电脑顾问不够!突然,计算机顾问的队伍在房间里绕了一圈。这种变化的原因是,在自动售货机周围的非正式聊天提供了大量程序员之间的思想交流和信息传递。现在,所有这些讨论都必须由相对较少的顾问来完成。(遗憾的是,自动售货机再也没有搬回去。)

回到顶部

每天下午打个盹(或者从一起工作中休息一下)。

每天下午分头工作当然是没有必要的。但是,根据50%的受访程序员,在10% - 50%的时间里独自工作是可以接受的。许多人喜欢独自做实验原型、复杂的、深度集中的问题和逻辑思考。大多数人都同意,简单、定义良好、死记硬背的编码更有效地由单独的程序员完成,然后与合作伙伴进行评审。

回到顶部

当你走到外面的世界时,注意交通,手牵着手,互相扶持。

在结对编程中,两个程序员合二为一。两者之间不应存在竞争;两者都必须为一个单一的目的工作,就好像这个神器是由一个单一的善良的头脑产生的。对问题或缺陷的指责绝不应归咎于任何一方。这对搭档需要信任彼此的判断和彼此对团队的忠诚。

回到顶部

要意识到奇迹(以及两个大脑一起工作的力量)。

人类只能记住和学习有限的数量。因此,他们必须与他人协商以增加赏金。当两个人一起工作时,每个人都有自己的一套知识和技能。这些知识和技能的很大一部分在两者之间是通用的,允许它们有效地交互。然而,每个人的独特技能将允许他们参与互动,汇集他们的资源来完成他们的任务。“协作型的人是那些发现一种可能性,并认识到他们自己的观点、视角或才能不足以使其成为现实的人。协作型的人不会把他人视为迫使他们妥协的生物,而是把他们视为可以帮助他们发挥才能和技能的同事。6].

经验表明,两人合作提出的可能解决方案是两个人单独工作的两倍多。然后他们会更迅速地缩小范围,找到最好的解决方案,并以更好的质量更快地实施它。一位受访者表示,“这是一种强大的技术,因为两个大脑一直在关注同一个问题。它迫使人们完全专注于手头的问题。”

回到顶部

最终的想法

坊间传闻和最初的统计证据都表明,结对编程是生成高质量软件产品的强大技术。两人一起工作并分享想法,以解决软件开发的复杂性。他们持续地对彼此的工件执行检查,导致可能的最早的、最有效的缺陷删除形式。此外,他们让彼此专注于手头的任务。

然而,程序员通常习惯于单独工作。向结对编程的过渡需要打破一些个人障碍。首先,程序员必须理解相互交流的好处超过了他们共同的(也许是天生的)对单独工作和不受干扰的偏好。其次,他们必须自信地分享他们的工作,接受指导和改进建议,以提高自己的技能和手边的产品。他们必须谦逊地理解自己并非绝对正确,他们的伴侣有能力在他们所做的事情上做出改进。最后,结对程序员必须接受他或她搭档工作的所有权,因此,愿意建设性地表达批评和建议的改进。

向结对编程的过渡将有条件的孤独程序员带出他们的舒适区。然而,单靠一个程序员就不可能实现的结果的潜力使其成为伟大之旅。

回到顶部

参考文献

1.安德森(A. Anderson)、比蒂(betty)、贝克(K. Beck)等。克莱斯勒走向了“极端”。Distrib。第一版。(1998年10月),2428年。

2.贝克,K。极限编程解释:拥抱变化。1999.addison - wesley、阅读。

3.康斯坦丁,L . L。康斯坦丁人件。新泽西州恩格尔伍德悬崖的尤尔登出版社。1995.

4.德马科,T,李斯特,T, Peopleware。多塞特住宅,纽约,纽约。1977.

5.弗尔杰姆,R。我真正需要知道的都是在幼儿园学的。1988.维拉德书店,纽约,纽约。

6.Hargrove, R。掌握创造性合作的艺术.McGraw-Hill,纽约,纽约。1988.

7.克劳特,r.e.,斯特里特,洛杉矶,软件开发协调。Commun。ACM 38岁3(1995年3月),6981。

8.协同编程的案例。Commun。ACM 41(1998年3月),105108。

9.Weinberg g M。计算机编程心理学银周年纪念版.多塞特住宅,纽约,纽约。1998.

10.Wiki。结对编程设施。波特兰模式库。1999年3月16日;c2.com/cgi/wiki ? PairProgrammingFacilities。

11.Wiki。成对编程。波特兰模式库。1999年6月29日;c2.com/cgi/wiki ? ProgrammingInPairs。

12.Williams, L.结对编程问卷1999;limes.cs.utah.edu/questionnaire/questionnaire.htm。

回到顶部

作者

劳里·a·威廉姆斯(lwilliam@cs.utah.edu)是2000年春季计算机科学博士研究生,犹他州盐湖城犹他大学讲师。

罗伯特·r·凯斯勒(kessler@cs.utah.edu)是盐湖城犹他大学计算机科学系的教授和系主任。他是软件科学中心(犹他州卓越中心)的创始人。

回到顶部


©2000 acm 0002-0782/00/0800 $5.00

允许为个人或课堂使用本作品的全部或部分制作数字或硬拷贝,但不得为盈利或商业利益而复制或分发,且副本在首页上附有本通知和完整的引用。以其他方式复制、重新发布、在服务器上发布或重新分发到列表,需要事先获得特定的许可和/或付费。

数字图书馆是由计算机协会出版的。版权所有©2000 ACM, Inc。


没有发现记录

Baidu
map