前言
俗话说,”三个臭皮匠顶个诸葛亮“,可见组织内的团队合作并非颠覆性理念。但在普遍倾向于自由工作的编程领域,要求两个开发人员进行结对,却比较新颖了。
结对编程是一种不断发展的软件开发技术,要求两个开发者工作在同一块代码上,分别承担类似驾驶员和导航员的职责。
整个过程中,驾驶员负责编写代码,而导航员则复杂审查并专注于行动计划。
很多研究描述了高生产力及安全可靠的产品的巨大好处,但这种观点仁者见仁。
由于该技术从一开始就被看做对宝贵编程资源的浪费,因此说服某些管理者采用结对编程往往会大吃闭门羹。事实却是,结对编程虽然多花了约 15% 的时间,但却能减少 15% 的代码缺陷 (点我了解详情)。
本文的目的是给组织提供基本的结对编程指南,同时强调使用这种技术的优势以及开发人员需要克服的挑战。压制住兴奋,让我们开始探索之旅吧!
结对编程介绍
回想一下,结对编程首先是作为极限编程软件开发技术的一个完整元素被引入。而极限编程,在 90 年代 Kent Beck 的设想下,是一套能帮助开发团队开发出优秀软件的软件标准。它强调的信息交换、清晰度、响应、确定和考虑等等,都对结对编程的理念起了决定性的引导作用。
根据 Beck 的定义,”结对编程即:互相保持任务的推进; 对系统进行头脑风暴式改进;理清思路;在同伴受阻时挺身而出以降低挫败感;让对方对团队的实践负责;配对“
它是如何工作的?
前面提到,结对编程包含工作在单一系统上的两个人(开发人员),一个人输入代码,而另一个人从旁观察或指引。通常负责打字的人称为 ”驾驶员“,而另一个被称为 ”导航员“ 的人则对编写的代码进行持续的审查和修正。在他们彼此相处的整个时间里,双方应一直保持交流,使对方能够参与并协助确定编码方向。
结对编程的目标是两个结对者能够互相分担工作负载,保证持续的开发节奏,并助力于团队的知识传播。”驾驶员“ 和 ”导航员“ 应该持续交流,这有助于提升两人的知识和效率。
总而言之,结对编程绝不仅是让两个开发人员凑在一起,然后疯狂的开撸代码。在过去的几年中,专业人士设计了在各种情况下使用的方法。通过经验和适当的实践,这些方法已经被改进和完善。
结对编程技巧
在 Weblab,我们已经使用结对技术相当一段时间了。我们通常用它来进行复杂的合并请求审查、新人辅导和 Bug 修复。我们观察了那些从未与他人一起写过代码的开发人员,和那些已经结对编程了几年的人。再次,我将写下一些关于结对编程的经验和理论,以及与这种方法相关的最广泛的使用形式。
驾驶员-导航员 角色
一般来说,结对编程已经通过 ”驾驶员-导航员“ 技术得到了推广。理想情况下,两个成员应该适时转换职责以获得更好的结果。
在这种形式的结对编程中,”导航员“ 很容易失去注意力。这可能是因为负责打字的人没有交流,或者 ”导航员“ 不想打扰他。有好几次我观察到,“驾驶员” 偶尔说一声 ”等下,我有了一个想法“, 然后埋头继续,而 “导航员” 则在刷自己的社交账号或者做一些其它无关的事情。
为了有效执行这种形式的结对编程,交流是能带来显著效果的一大法宝。不过这种水平的交流一般是结对新人所不具备的。鉴于次,我认为这种形式是结对编程更为过渡的方式,不建议新手直接使用。
”强风格“ 结对法
在 ”强风格“ 结对的方法中,“驾驶员” 不会做任何 “导航员” 没有指示去做的事情。就像 Llewellyn 所解释的:“你的想法必须经由他人的手落实到计算机”。
当 “驾驶员” 需要提出想法时,他必须将系统移交给同伴,然后以 “导航员” 的角色实施控制。这种方法使 “导航员” 完全参与其中。
在传统方法中则正好相反, “导航员” 请求移交系统来进行输入或实施自己的想法。
“乒乓” 结对法
开发人员经常使用的另一个结对编程模式是 “乒乓” 结对法。在该方法中,“驾驶员” 针对行为编写一个测试,然后交由 “导航员” 实现该行为。实现完成后,轮到“导航员” 作为新的 “驾驶员”,编写下一个测试让新的 “导航员” 去实现。
这种模式最大的挑战是需要花费时间进行重构和测试。事实上,有时我投入在测试重构的时间甚至多于编码。这可能使得实现一个特性变得很复杂,也使测试复杂化。在应用属性的地方进行渐进动作较为简单,但我们还需要注意代码的简洁性,以便以后能不费力的进行维护。类似的想法也适用于测试部分。
简而言之,“乒乓” 结对法有助于专业人士同时关注代码和测试。另外,也有助于人们有效的进行 TDD。
近期统计
在一项在线调查中,约有 96% 的程序员报告说,他们喜欢在结对编程的环境中工作,而不是独自工作。
此外,95% 的被调查程序员声称,他们在结对工作时比独自工作更自信。
结对编程对生产力和产出的影响也是积极的,因为相比个人,结对通常有更多的设计思路,还能更好的捕捉设计缺陷和错误。
盐湖城犹他大学的 Laurie Williams 已经发现,结对程序员仅比两个独立的个人程序员慢 15%,但产生的错误却少 15%。
结对编程作为招聘工具
结对编程是面试中进行能力测试的最佳方式之一。其基本思想是我们在求职者遭遇编码问题时才与他们进行交互,而大多数时候让求职者自己行动,这可能与传统的结对有所不同。
这种方法的好处之一是更接近于实际的任务处理场景。此外,还有助于公司准确地了解求职者的专业水平和能力。
作为面试官,你将有机会考察求职者接受新概念的速度、与他人合作的潜力以及完成复杂编码任务的技能水平。
结对编程常用语
结对时
- 我来写一会儿吧
- 你从旁掠阵可好?
- 我们一起开搞
- 我是这么想的
- 你是怎么想的?
- 这块代码能 work 吗? 让我们执行下单测
- 我有点累了,你呢?
- 没太 get 到点,能画出你的思路吗?
- 我们有忽略什么吗?
短暂休息
- 我们休息下吧
- 能换下角色吗?
- 我们喝杯咖啡吧
注意
- 不要强迫对方
- 在合适的时候给你同伴写代码的机会
- 开诚布公的交流
- 不要忽视休息
- 互相信任
- 辨识自己的错误
- 优先自我反思
- 放缓节奏
写在最后
结对编程适用于每个人吗?答案并不单纯。人各有异,所以结果也肯定有所不同。结对编程对某些人来说成效很好,但对另一些人却可能恰恰相反。
由于这种技术应该加强双方合作的努力,所以情况可能并非总是如此。请记住,不是每个项目都适合结对或共享编程。特别对于那种只有一个有经验的开发或者全是新手处理任务的复杂项目。在这种情况下组成新手-老手组合来改善新手的技能和熟练程度可能是一个很好的选择。
在我看来,结对编程本身并没有什么坏处,只要能为特定的项目中找到合适的程序员组合。请随时留下评论让我们知道你的意见,我们很期望得到反馈。
译自:Pair Programming Guide