结对编程的正确姿势,你会了吗?

2015年度Review已经拉开帷幕,今年你都收到了哪些醉人的反馈呢?和往常一样,作为开发的我听到最多的话题当属结对了:

“我的小伙伴总拿着键盘不放,只听过麦霸,来到骚窝竟然还有键霸!”
“我总算明白为什么面前会有两个键盘子了,如果再给我一次机会(请用湖南话脑补)”
“我不知道我的小伙伴在做什么,我跟不上,很沮丧,要不玩会手机算了”
“我的小伙伴特别忙,有时候一天也找不到,我怎么办…”
“我的小伙伴是个急性子,总说‘XX你做的太慢了,客户着急要,还是我来做吧’”……

那么结对时,你的小伙伴碰到这样的问题怎么办呢?当你遇到键霸、手机哥、上网君的时候怎么破呢?

在展开之前让我们先来回顾一下结对编程的前世今生是什么。

结对编程

极限编程是由当时Smalltalk 领域的大师级人物 Kent Beck 在1996年受聘领导克莱 斯勒公司的一个综合工资项目开发 C3(Chrysler Comprehensive Compensation)中 首次采用, 并于1999年10月出版的《解析极限编程》一书中正式提出了这一软件开发方法,而我们今天要讨论的结对编程则是其中一项核心实践。

极限编程中的“极限”(Extreme)是指将我们认同的有效软件开发原理和实践应用到极限, 如: “如果集成测试很重要,那就要在一天中进行多次集成,并且反复进行回归测试”,所以我们要做持续集成。结对编程在提出时更多的是强调 “如果代码评审很好,那么我们就一直进行代码评审”,所以我们要做结对编程。简单讲,结对编程就是由两个程序员用同一台电脑完成同一个任务,由一个人负责编写代码码,另一个负责审查代码,从而能够时时刻刻的进行代码评审。

但问题来了,原先一个人工作,现在两个人了。“原来我自己写就好了,现在多一个人我还要给他讲,多浪费时间啊”;“我也讲不明白,我就是喜欢写代码而已,别逼我”(请自动脑补一个新人和一个不耐烦的老手一起编程的感觉)。这让我想起了美国AT&T公司贝尔实验室的Bjarne Stroustrup博士说过的一句话:

设计和编程都是人的活动。忘记这一点,将会失去一切。- Bjarne Stroustrup

从极限编程诞生到今天的26年历史中,如果说持续集成是应用最广泛的一个实践,那么我认为结对编程则是最具争议的实践(没有之一)。其实这也间接印证了当时Kent Beck提出的关于“极限编程是一种社会性变革”的说法。在现代互联网如此多变和快速响应的软件行业趋势下,事实已经证明软件从此不再是一个人单打独斗的工作,而是要求越来越多的多角色多任务的协作。软件行业的工作者必须要有比以往更多的沟通和协作技巧。而这对于习惯了一个人的软件开发者而言是一个巨大的挑战,必然要有一个改变和适应的过程。这也是为什么结对编程会成为最具争议的实践。文章开头的那些现象都是一个人改变做事行为的必然过程,不信你去问一问那些老一点的骚窝,哪一个不是从抢不到键盘到键霸,又从键霸到键盘无键,键在心中的一个过程。

那么结对编程除了审查代码提升代码质量,还给我们带来哪些好处呢?

结对编程的好处

第一:培养新人,促进沟通,提升团队整体能力。
通过结对,年轻的团队成员可以向其他小伙伴学习,包括快捷键、算法、语法、SQL、设计、解决问题的思路、做事方式等等,1对1面对面师傅带徒弟式的学习是新技能get最快的方式之一。

第二:更好的知识共享和信息交流,促进团队协作。
结对中可以互相分享代码的上下文,交换对代码的理解,促进质量改进和团队协作,同时也使得代码集体所有制成为可能,减少团队对某些成员的依赖,降低团队风险。

第三:促进团队成员的沟通,提升团队凝聚力。
通过结对,成员间彼此熟悉,增深了解,从而能够更好的协作完成任务。

如何进行结对?

为了达到结对的目的,保持结对有趣持续的进行,通常根据结对的双方经验不同和场景分为如下多种角色和合作模式:

{:height=”300px” width=”400px”}

  • 1.领航员和驾驶员(Driver-Navigator) - 键霸出没请小心。

驾驶员编写实现当前任务的代码,而领航员需要引领代码的编写并负责审查代码。除此之外,领航员通常还要考虑当前的实现方法是否正确,是否有别的做法,它是否会影响到其它功能模块,下一步是什么。驾驶员的主要任务是跟上领航员,负责完成代码的编写,保证代码质量。需要特别指出的是,微小的语法错误,多一个空行等错误,IDE会帮助我们纠正,是驾驶员关注的职责,而领航员只需进行提醒,结对时无需将此作为主要关注点。

合作场景:适应于各种组合,尤其一老一新组合。

  • 2.乒乓模式

这里需要提及极限编程的另一实践:测试驱动测试。结对双方可以一个人编写失败的测试,一个人写实现通过测试;然后交换角色,不断循环。对于结对双方经验相当的情况下,由于交互和交换的频率很快,就如打乒乓一般,所人们戏称这种方式为结对的乒乓模式。

合作场景:适用于各种组合,尤其双方经验相当的场景。乒乓模式由于它的角色分工清晰,交换频率相对较快,所以乒乓模式可以帮助精力不集中的小伙伴快速融入,也是避免键霸出现的一个很好的方式。

  • 3.鼠标和键盘模式

这是驾驶员和领航员的一种具体表现方式,其中一方使用鼠标,是领航员;另一方使用键盘完成代码的编写,是驾驶员。

合作场景:适用于一老一新组合。

有统计结果显示,好的结对工作效率是大于单兵作战的,能用较少的时间产生高质量的代码。那么为了保证结对的高效和高质量,我们还需要注意哪些呢?

几点Tips

  • 1.多沟通。

有一个人的工作变成了两个人的事,小伙伴们就要彼此尊重,多沟通。如果有其他的任务要暂时离开,请及时告诉你的小伙伴,以便彼此更好的安排工作,保证效率。

  • 2.确定开发任务列表(Tasking)

结对除了沟通,另一个挑战就是如何保持结对双方共同的开发节奏:一个小伙伴在做A功能,另一个小伙伴要做B功能。结对双方通过协商开发任务列表,能够提高对开发任务理解的一致性,确保开发节奏顺利进行。

  • 3.定期交换小伙伴

定期交换小伙伴可以使得知识得到充分分享,每个小伙伴都有机会充当不同的角色,了解不同的知识上下文。与此同时,新的小伙伴的加入往往可以激发新的解题思路,或帮助发现问题,同时也增加结对的乐趣。

  • 4.可持续的结对工作

真正的结对会比一人工作更专注,紧凑,所以一天8小时的结对会很累,因此结对需要定时的休息,保持合理的节奏。可与结对的小伙伴一起协商休息时间,比如一个小时或两个小时休息一次,从而保证可持续的工作。

  • 5.多给新人机会

与新加入的小伙伴结对,需要耐心,多给予她/她上手的时间与空间。通常建议开始时多讲解,多展示,给她/他学习的机会;比如一开始可以由熟悉代码的小伙伴写测试,而新加入的写实现;随后可采用鼠标键盘方式或者乒乓结对方式。

  • 6.勇敢加勇敢

对于新加入的小伙伴,如果跟不上的时候怎么办?要勇敢的叫停,打断结对的小伙伴,弄懂这个问题,这样做才是达到了结对的目的。曾经有人说我记下来回家去弄懂,我更建议及时弄清楚。就如前面提到的,结对是一个快速让自己学习和成长的机会;而且你的小伙伴通过讲解也会梳理自己的思路,能够更深入的理解这个问题或技术,互助互学。如果这个问题发现项目中其它成员也不懂的,那么我们还可以将这个对话扩展开来,分享给整个团队,提升团队的战斗力,所以更推荐及时解决,当然深度需要适当的把握。
如果结对的时候遇到键霸怎么办?作为新人自带消除键霸光环,勇敢的把鼠标默默的递过去,把键盘牢牢的握在自己的手中,“亲,辛苦了,让我试一下,我来!”。

  • 7.反馈

就如戴明环一样,做事情的环要闭合,有始有终,有序循环螺旋式改进。而反馈往往是最后一环,也是最有效的一环,是帮助自己和结对小伙伴的必要工具之一,温暖的“小黑屋”是可以经常光顾的。

  • 8.不是所有的场景都适合结对

对于那些结果需要维护,能够促进沟通、知识传递等价值的开发行为都建议结对,而诸如方案调研、一些非常简单的问题(微小的缺陷修复如拼写错误)等是可以不用结对的。

总结

结对并不阻止个人的独立思考,它给我们带来了诸多软件协作的好处,但结对也不是所谓的坐在一起就可以了。结对不是一成不变的,需要根据目前的任务灵活确定是否适合结对。
我认为想要做好结对,首要的是有效沟通。

一首打油诗说的好:
好结对成长快,互相监督与学习,感情信任日日增。
坏结对伤害大,手机上网人心离,团队早晚要散伙。
新人们不要怕,键盘牢牢握手中,勇气反馈早成长。
老人们不着急,系统把控在心中,沟通分享影响大。

有了这些姿势,文章开头那些问题你是不是已经有答案了呢?

Share Comments