结对编程

结对编程 (Pair Programming) 是一种敏捷软件开发实践,指两个程序员并排坐在一台电脑前,面对同一个显示器,使用同一个键盘和鼠标一起工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员 (或导航员) , 两个程序员定期互换角色。他们在一起完成需求分析、系统设计、编码、单元测试、整合测试 (Integration Test) 、写文档等工作。基本上所有的开发环节都一起肩并肩地、平等地、互补地进行工作 (如图1所示) 。

  • 有利于提升项目质量,减少Bug;
  • 有利于知识传递,降低学习成本;
  • 多人熟悉同一段代码,减少项目风险;
  • 与别人一起工作会增加责任和纪律性等。

尽管结对编程有诸多诱人的优点,但实行结对编程实践的却为数不多,其主要原因可能有:

  • 结对编程需要投入更多的资源;
  • 结对双方需同时注意力集中,否则效率更低;
  • 结对人员能力要求相适,否则起不到观察者的作用,甚至产生依赖;
  • 不成功的配对,经常引发争吵,产生内耗,导致团队不和谐等。

结对编程是颇具争议的敏捷实践之一,除上述一些优缺点外,可能大家还有更多不同的看法,但分析利弊不是本文所要讨论的重点。

实践经验

就我所在的项目团队而言,6人左右的开发团队需要支持多个中小型独立产品的需求开发,在繁重的业务压力下,用户价值的快速交付是首要的,所以想尝试共用一台电脑进行结对开发的实践只能是一种奢望。让团队开发人员尽可能熟悉相互间的产品代码,提升项目开发效率以及保证良好的项目质量,是我们在项目开发过程中需要重点解决的问题。

我们试图通过集体Code Review和设计交流分享等活动,来提升代码质量以及相互间业务代码的熟悉度,但一直收效甚微。问题主要在于这种集中式活动时间较难安排,人多交流效果不佳,性价比不高。后来,得益于公司的导师机制,在一对新人和导师身上,找到了敏捷结对的原型。由于他们的紧密合作,遇到问题及时沟通,新人在项目进度和质量都有不错表现,很好地融入了团队。在后续的项目过程中,我们不断地尝试和优化这种结对形式,逐渐形成相对固定的工作方法。

与XP结对编程相比,敏捷结对编程最为显著的差异是结对进行需求分析、系统设计和问题讨论,但分别编码实现,通过过程中频繁的Review来实现结对的效果。开发人员两两结对,共同认领开发任务,一起对所承担的开发任务负责。在需求理解、设计阶段双方一起设计和讨论,然后分工各自编码实现,并通过Code Review以确保实现与设计一致。对结对过程中发现的问题,随时沟通和讨论。由于产品业务逻辑相对不是特别复杂,所以通过这种小范围、高效的沟通,可以解决项目中的绝大部分问题,实现更高的开发效率并确保代码质量。

给我们带来了哪些好处?

  • 提升项目质量。结对开发人员在需求理解、设计思路上进行了充分的沟通和讨论,能尽早地发现和解决问题,避免前期因需求理解偏差、设计缺陷问题造成返工。
  • 知识传递。对于新员工或经验略逊的开发人员,通过经常性的沟通和讨论,能迅速地进入角色和积累经验,发挥了传帮带的作用。
  • backup,规避项目风险。结对人员之间互为backup,有利于团队成员之间熟悉业务代码,若有人员异动时有利于项目风险控制。论新老结对还是强弱结对,都要尽力避免一方对另一方产生依赖,要给新人足够的成长和锻炼空间,让其独立思考和解决问题,并允许在可控范围内尝试失败,以获取宝贵经验得到成长。否则,团队只会多一个执行者,结对难以达到预想的效果。同时,一定程度的独立活动,可以让大家保留自己的工作习惯,而且形式更为自由和灵活。当然,大家可能会有疑问,如何保证结对人选中资深工程师工作的正确性,因为新人和弱者很有可能无法提出想要的Review帮助。这个问题在我们的结对中不可避免,有选择地邀请其他资深专家Review,也许会是个不错的解决方案,特别是对于一些重要的复杂业务逻辑。参加结对的工程师应具备独立思考和解决问题的能力,并且具备较好的团队协作意识。否则,不仅不能有好的结对效果,反而会带来一些新问题。此外,结对也不仅限在研发工程师之间,研发和测试工程师之间或同产品经理之间的结对,同样可以带来不错的效果。

_结对编程(Pair Programming)是一个编程模式(Programming pattern)。两个程序员并排坐在一台电脑前,面对同一个显示器,使用同一个键盘,同一个鼠标一起工作。他们一起分析,一起设计,一起写测试例子,一起编码,一起单元测试,一起整合测试(Integration Test),一起写文档等。基本上所有的开发环节都一齐肩并肩地,平等地,互补地进行开发工作。

结对编程不是一个人简单地看着另一个在做什么——在卓有成效的配对工作里,这两个合作伙伴常常工作在不同抽象层次,一个人关注的是为实现眼前目标而编写的代码的细节,而另一个人考虑的是更大的前景和下一步要做的事情,这两个人的角色频繁进行更换。这是一项高强度的、严密的,且常常令人疲劳的活动,但是能够创造出经过深思熟虑的高质量代码。

——Laurie Williams &Steve Hayes

本贴是关于敏捷开发-结对编程(Pair Programming) 的内容聚集的帖子。欢迎跟贴,提供:

  1. 结对编程相关的研究资料和资源

  2. 实施结对编程在国内或自己公司所遇到的阻力

  3. 实践结对编程时,遇到的具体问题

  4. 如何让我们的结对编程做得更好

  5. 对2和3问题的解决方案

说明: 描述问题时,最好能给出具体的例子,这样讨论不会太偏向于理论研究。

https://www.jianshu.com/p/d79cef4296b8

结对编程是「极限编程 (eXtreme Programming) 」里的一个实践。

结对编程技术是指两位程序员坐在同一工作台前开发软件。

结对编程有三种形式:

键盘鼠标式

顾名思义,就是一个人操作键盘,一个人操作鼠标。当然,这种方式越来越不常用,因为程序员们以使用命令行和快捷键为荣,能用到鼠标的地方越来越少了。

Ping-Pong 式

这种是采用 TDD (测试驱动开发) 时常用的方式,A 写测试,B 实现和重构,然后 B 写下一个测试,A 来实现和重构。

领航员-驾驶员式/Navigator-Driver

其中一名开发人员被称为驾驶员 (Driver) ,另一位被称为领航员 (Navigator) 或观察员 (Observer) 。

Navigator 的注意力放在如何实现宏观目标,以及 Review Driver 编写的代码。 Driver 编辑代码,关注的是短期目标,代码细节。需要强调的是,Navigator 之所以叫这个名字,说明他不只是在一旁观看,他因为不操作键盘,想的会比较快,他要引领 Driver 的思路。同时,他在 Review 代码的时候,不要立即指出 Driver 编码中的小错误,那样容易打断 Driver 的思路,因为有可能 Driver 已经发现了,但想先把整个写完再去修复,以保持思路连贯,Navigator 可以在确认对方没有发现的情况下提示对方。

作者: SeabornLee

链接: https://www.jianshu.com/p/d79cef4296b8

來源: 简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。