结对编程(英语:Pair programming)是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。两个程序员经常互换角色。
在结对编程中,观察员同时考虑工作的战略性方向,提出改进的意见,或将来可能出现的问题以便处理。这样使得驾驶者可以集中全部注意力在完成当前任务的“战术”方面。观察员当作安全网和指南。结对编程对开发程序有很多好处。比如增加纪律性,写出更好的代码等。
结对编程是极端编程的组成部分。
一些研究发现程序员结对工作与单独工作相比,会写出更短的程序,更好的设计,以及更少的缺陷。研究发现缺陷率降低15%到50%,会由于程序员的经验以及任务的复杂度而不同。结对编程比单独编程相比,通常会考虑更多的设计选项,达成更简单,更易维护的设计;程序员们也会更早地捕捉到设计的缺陷。结对编程与一个程序员承担同一个任务相比工作会完成的更快。结对的程序员经常发现当他们一同工作时表面上“不可能”的问题变得容易,或更加快速,或至少有可能解决。
然而,一个2007年的元分析得出结论“结对编程并非一致地有利或有效的”,这是因为是否结对编程选择以外的许多因素在编程任务的产出上起着很大的最用。元研究发现结对编程往往一定程度地缩短了开发时间,而且对代码质量产生了正的边际效益,但是结对编程大大增加了开发人员的工时;也就是说与单独编程相比花费大大增加了。作者指出有关结对编程的研究遭遇了发表偏倚,有些不利于结对编程的研究要么没有开展研究,要么没有投稿,要么没有被授受发表。他们得出结论“你不可能期待又快又好又便宜。”
虽然编码通常比一个程序员单独工作更快地完成,但是总的程序时间(程序员数目× 花费的时间)增加了。管理者需要在工作更快的完成以及缩减测试和调试时间和更高的编码成本之间平衡。这些因素的相对权重在不同的项目、不同的任务之间也不同。对于那些程序员没有完全理解的任务上,程序员期待更多的创造性,挑战,以及高复杂度,此时使用结对编程最有帮助。在简单的,程序员都完全了解的任务上,结对编程导致生产力的净下降。
在两个程序员工作时,两个程序员之间传递着知识。他们分享关于系统细节的知识,并且互相学习编程技巧。新的员工很快地获得团队的习惯,并学习到系统的细节。“混杂结对编程”,即每个程序员轮流与团队中的所有其他程序员结对编程,而不是仅与某个程序员编程,使得系统的知识在整个团队中传播,减少了程序员离开团队带来的风险。
结对编程通常会带来纪律和时间管理的提升。程序员在与结对的伙伴一同工作时,较少地可能忽略编写单元测试,花时间上网或处理个人电子邮件,或偷工减料。结对的伙伴“让他们保持诚信”。人们更不愿意打断两个结对编程的人,而单独工作的人却容易被打断。