上周我粉刷了一下家中的厨房,这一过程使我联想到了结对编程。
我和我的搭档之前也有过装饰房间的经验,而且出来的效果也让我们感到十分自豪。但换成了我自己来做的话,尽管我具有良好的技能与知识,但最终的效果也不那么理想。我对此产生了疑问:为什么是这样?
原因在于,如果是我一个人在工作的时候,我会不自觉地变得有些懒散和松懈——只要出来的效果“够好”并且能正常工作,那就行了。而如果我的搭档也在身边,我就会和她争先恐后地去抢着拿装饰用的遮护胶带,因为我知道我们两个人一定能把工作完成得很出色。
一起工作能够让我们对工作的质量产生更大的自豪感,我们会发现自己变得更加用心,因为我们希望自己的搭档也能够为这项工作感到自豪。它的好处还不至于此,因为我们还能从中得到更大的乐趣。
当我不小心将油漆稍稍刷出了边界的时候,我才留意到之前的那位粉刷匠(可恶的前任房客)也把油漆漆出了边界,我只是重复了一个已经存在的问题。那么我有没有停下来去思考一下能否借此机会修复之前所发生的错误呢?没有,因为我的心里有个声音始终在提醒我:“我说过我今天必须要把事情做完”,因此我就把这一目标当作了最重要的事。由于我过于专注手头上的活,而没有想过我这样做会把事情弄得更糟,至少在下次解决问题之前还需要经过很长的时间。我没有在工作的进行中选择修复一些小问题,而是让问题雪上加霜,然后把这个问题丢到我的“琐事清单”中(这个清单只会越来越长,从来也不会变短)。
此外,我还使用了错误的油漆!其实我清楚地知道一个生气勃勃与充满活力的厨房应该使用什么样的油漆,我不需要一个“高级”粉刷匠或者装潢师来告诉我这一点。我只需要有一个人能帮一下我,或者让我去帮一个某个人也行,去跑一趟商店并买回正确的油漆就可以了。但现在我只能使用手上仅有的这种死板的白色油漆了。
当我的搭档下班后来到我房间的时候,他“检阅”了一下我的工作。他并没有指出粉刷出了边界的问题。是啊,何必要提它呢?他并不打算让我重做一遍,现在再指出这一点已经太迟了。这一点只能在下一次粉刷的时候作为“前车之鉴”了,但其实正如我之前所说的一样,并不是我不知道正确的做法是什么,我只是单纯的没有那么做。他也没有注意到我使用了错误的颜料,不过我还是诚实地告诉了他,因此他也做好了明年重刷一次的心理准备。
我最终完成了厨房的粉刷,它看起来还行,但我也并不会感到特别自豪。在工作结束后再让人检阅我的结果,只会放大我所范下的一些错误,让我感到难过。这些问题都应该在当场指出,事后诸葛亮于事无补,协作的效用是无可替代的。
单纯从结论来说,让两个人一起粉刷一间房间看起来似乎是在这件任务上花费了更多的时间,但这两个人也会受到彼此之间的鼓舞,而尽力高质量地完成工作。反之,一个人完成的工作结果虽然“还过得去”,但在一年之后又不得不重新来过。之前所谓的节省下来的时间最终也都消失不见了。
幸运的是,至少我们这对粉刷匠和装潢师都住在这个房间里,而且至少还要待上 1 年,希望到了那时还能够记得住从这次粉刷中所学到的东西。但如果因为某些原因,我们必须要搬离此处的话,那我们只能像那个可恶的前任房客一样,将这些问题留给新房客们去解决了。
结对编程
我相信你已经看到了,以上内容完全可以对应到结对编程中去。以下是由这次粉刷过程中所看到的一些关键点:
- 在工作中找到更强的自豪感
- 更强的动力
- 更高的专注程度(我前面忘了提到我在过程中一共有多少次停下来去查看我的 Facebook 帐号了……!)
- 减少了累积的技术债务
- 减少了缺陷与可笑的错误
- 减少了检阅与重做的时间
- 共同学习会使记忆更牢固
这些优点合在一起就会增加你所产出的代码的质量,而且还不需要你付出更多的时间。而且这些代码的知识现在就有两个团员能够理解,而不仅是你一个人。
结对编程的意义远不只是帮助初级开发者从高级开发者这里学到知识,它的意义在于共同打造一个解决方案。
如果以上这几点是结对编程所产生的结果,那就有必要看一下一个优秀的结对需要具备哪些素质。我与我的搭档能够配合无间并不是出于偶然,而是由于我们之间的关系存在一些重要的特性,才能够达到良好的效果。
良好的关系(relationship)合作关系(partnership)所需要的六个 C。:
交流(Communication)—— 良好的合作需要沟通,而不是在搭档犯错的时候袖手旁观,而在之后每次出现意见分歧的时候就旧事重提!此外,也不要一个人在那里安静地忙着粉刷,否则你的观察者会很快停止对你的关注。你应该做的是,一边工作一边保持沟通,让搭档有机会表达意见。这样你也能够受到鼓舞和激励,因此你们也能够为一些大工程共同分担责任。
自信(Confidence)——在与搭档合作时,要有自信能够解决所遇到的障碍,也要能够承担风险。此外,不要担心某些建议或许看起来很傻就不去提,如果两人中有一个人因为不安而感到拘束,这种结对就不是很高效。
Ron Jeffries 在这里(浏览文件最下方)讲了一个很好的故事,那是他首次进行结对编程的经历,他从一位“傲慢的”年轻人那里学到了不少东西。你要意识到你为你的搭档所带来的价值,即使你的搭档比你更资深。先不说别的,即使是开口问一些很“傻”的问题也会带来很大的好处,它会挑战开发者所坚持的一些假设与习惯。人们不会因为你提出了一些有助于他们清空固有的己见就对你咆哮的!
妥协(Compromise)—— 为了对自信加以平衡,你必须做好妥协的准备。在你们的工作不断推进的同时,你也要保持开明,并准备接受彼此的意见与风格。即使你认为你知道最快的解决方法,也应将你的搭档的想法作为一种选择。因为对新意见的接受和促进会使你得到双倍的具有创造力的观点,而不是减半。
舒适(Comfortable)—— 请放轻松。对搭档的反馈要表现得积极、耐心和大方。重要的一点是要建立起一种良好的关系,使你们都能够没有顾虑地表达出想法。当然,这还取决于你们的空间有多大,请保证你坐姿舒适,有足够的地方放置玻璃酒水杯,能清楚地看到显示器,而且你们两人都能很方便地操作电视遥控器键盘和鼠标。
改变(Change)—— 结对编程的方式有多种,它们都强调了作出改变的重要性。
如果在结对编程中应用番茄工作法技术(Pomodoro),那就需要你们有规律地互换你们的角色,这可以始你们保持醒觉,并且更加投入。
如果使用乒乓(Ping Pong)结对编程方法,那么其中一人要编写单元测试,而另一个人要编写出通过该测试的代码。频繁地进行角色互换仍然非常重要,你依然可以使用番茄工作法来使这一过程正规化。
我的搭档不愿意接受拆开组合而换一个新搭档,但你毕竟需要保证事物的新鲜感。 我鼓励交换搭档,因为如果你每天都和同一个人进行结对,迟早你们会开始上火。好的做法是在团队之内进行轮换,每隔一日或者半日彼此交换任务,以此对团队中正在开展的工作都做到心里有数。这一点是实现知识共享和跨技能工作的最高方式,经过证实,这种方法能得到非常好的结果。
尝试一下(Give it a Chance)—— 如果你从来没有尝试过结对编程,接受这一过程或许不是非常自然。要你接受它,承诺会在一个月的时间内进行尝试,并接受这种方式并不容易。在最糟糕的情况下,你可能会对它感到厌恶,并且这个月的效率很低下。但在最好的情况下,你会接受这种方式,并且整个团队都将更为专注和得到鼓舞,团队成员们将为你们所共同努力得到的成果感到自豪。
开始尝试
我们已经表明了结对编程带来的各种好处:高标准、共同责任感以及乐趣!但是你需要为进行结对做好准备。仅仅是让两个人一起坐在显示器前面并不会让这一切自动发生,只要一点点努力,小心仔细地检查和接受它,这一切就会开发发生。
如果你和你的团队已经决定要采用结对编程,这里有些很好的资源能够帮助你们开始这一过程,举例如下:
- 我个人很喜欢 Laurie Williams 的这篇论文,它展示了结构编程中的许多优秀实践的基本原理。
- 如果你是新手,这里有一份简单的列表,其中列举了你在这个过程中可能会遇到的问题,并帮助你积极地克服它们。
- 如果你开始尝试之后感到有些不对劲,你可以从 Zee Spencer 的这篇文章中学到一些关于建立良好关系结对的指导。
关于作者
Victoria Morgan-Smith是金融时报(Financial Times)的一位高级项目经理,从 2009 年开始就开始领导团队了。在这之前,她曾有 9 年的开发经验。这一背景使得她能够不断寻找有趣的方式进行指导和促进工作,并且激励团队成为自我组织良好的团体。她对团队外部的合作也很有热情,通过敏捷原则来分析怎样交付可评估的商业价值。
查看英文原文: Pair Painting
评论