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

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最快的方式之一。
第二:更好的知识共享和信息交流,促进团队协作。
结对中可以互相分享代码的上下文,交换对代码的理解,促进质量改进和团队协作,同时也使得代码集体所有制成为可能,减少团队对某些成员的依赖,降低团队风险。
第三:促进团队成员的沟通,提升团队凝聚力。
通过结对,成员间彼此熟悉,增深了解,从而能够更好的协作完成任务。

如何进行结对?

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


  • 1.领航员和驾驶员(Driver-Navigator) - 键霸出没请小心。
    驾驶员编写实现当前任务的代码,而领航员需要引领代码的编写并负责审查代码。除此之外,领航员通常还要考虑当前的实现方法是否正确,是否有别的做法,它是否会影响到其它功能模块,下一步是什么。驾驶员的主要任务是跟上领航员,负责完成代码的编写,保证代码质量。需要特别指出的是,微小的语法错误,多一个空行等错误,IDE会帮助我们纠正,是驾驶员关注的职责,而领航员只需进行提醒,结对时无需将此作为主要关注点。
    合作场景:适应于各种组合,尤其一老一新组合。

  • 2.乒乓模式
    这里需要提及极限编程的另一实践:测试驱动测试。结对双方可以一个人编写失败的测试,一个人写实现通过测试;然后交换角色,不断循环。对于结对双方经验相当的情况下,由于交互和交换的频率很快,就如打乒乓一般,所人们戏称这种方式为结对的乒乓模式。
    合作场景:适用于各种组合,尤其双方经验相当的场景。乒乓模式由于它的角色分工清晰,交换频率相对较快,所以乒乓模式可以帮助精力不集中的小伙伴快速融入,也是避免键霸出现的一个很好的方式。

  • 3.鼠标和键盘模式
    这是驾驶员和领航员的一种具体表现方式,其中一方使用鼠标,是领航员;另一方使用键盘完成代码的编写,是驾驶员。
    合作场景:适用于一老一新组合。
    有统计结果显示,好的结对工作效率是大于单兵作战的,能用较少的时间产生高质量的代码。那么为了保证结对的高效和高质量,我们还需要注意哪些呢?

    几点Tips


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

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

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

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

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

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

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

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

    总结

    结对并不阻止个人的独立思考,它给我们带来了诸多软件协作的好处,但结对也不是所谓的坐在一起就可以了。结对不是一成不变的,需要根据目前的任务灵活确定是否适合结对。
    我认为想要做好结对,首要的是有效沟通。
    一首打油诗说的好:
    好结对成长快,互相监督与学习,感情信任日日增。
    坏结对伤害大,手机上网人心离,团队早晚要散伙。
    新人们不要怕,键盘牢牢握手中,勇气反馈早成长。
    老人们不着急,系统把控在心中,沟通分享影响大。
    有了这些姿势,文章开头那些问题你是不是已经有答案了呢?
    题图来自网络,其它均由禚娴静提供。


  • 最后编辑于
    ©著作权归作者所有,转载或内容合作请联系作者
    • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
      沈念sama阅读 141,621评论 1 298
    • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
      沈念sama阅读 60,780评论 1 254
    • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
      开封第一讲书人阅读 93,376评论 0 211
    • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
      开封第一讲书人阅读 40,770评论 0 174
    • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
      茶点故事阅读 48,482评论 1 252
    • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
      开封第一讲书人阅读 38,637评论 1 172
    • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
      沈念sama阅读 30,297评论 2 267
    • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
      开封第一讲书人阅读 29,094评论 0 165
    • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
      爱写小说的胖达阅读 28,855评论 6 228
    • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
      沈念sama阅读 32,420评论 0 213
    • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
      茶点故事阅读 29,200评论 2 213
    • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
      茶点故事阅读 30,521评论 1 224
    • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
      爱写小说的胖达阅读 24,181评论 0 31
    • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
      沈念sama阅读 27,065评论 2 213
    • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
      茶点故事阅读 31,424评论 3 202
    • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
      开封第一讲书人阅读 25,590评论 0 8
    • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
      开封第一讲书人阅读 25,947评论 0 163
    • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
      沈念sama阅读 33,406评论 2 230
    • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
      茶点故事阅读 33,509评论 2 229

    推荐阅读更多精彩内容

    • 第一次听说结对编程的时候,我觉得太反直觉了,两个人用一台电脑写代码,效率不就下降了一半吗?后来我在团队里去尝试引入...
      SeabornLee阅读 4,834评论 8 27
    • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
      passiontim阅读 170,365评论 25 707
    • 1、从文章中学到的重要概念: ①树欲静而风止,子欲养而亲待。 ②生命即使逝去但它会以其他的方式延续下去。 2,...
      黎明夕阳阅读 174评论 0 0
    • ​引子 有人的地方就有江湖,有江湖的地方就有较量。有人靠独门祖传一指禅横行江湖很多年,有人研究意外得来的武林绝学秘...
      米粒millyjourney阅读 13,711评论 1 6
    • 初识蒋捷,我以为她是个女词人,那时候我读高中,偶然读之“流光容易把人抛,红了樱桃,绿了芭蕉。”莫名的喜欢。 那个时...
      北风后面阅读 931评论 1 3