极限编程里面有一个比较有争议实践就是结对编程。很多团队的管理者在谈到结对编程的时候,第一反应是浪费时间:本来一个人可以干的事情要安排两个人干,不是浪费时间吗?那结对编程到底会不会浪费时间呢?结合我们禅道团队自身十几年的结对编程实践,跟大家做一下分享。

首先来定义一下什么是结对编程。很多朋友可能觉得自己的团队从来没有实施过结对编程,但其实每个开发团队都做过。最常见的场景就是遇到了棘手的Bug,一个人解决不了,拉上另外一个同事,一块讨论,一块交流,然后把这个问题解决了——这就是一种结对编程。再比如新人来了,团队指定一位师傅来带他。这位师傅跟新人坐到一块,演示解决问题的思路方法,跟新人讨论具体问题的思路方法,或者跟新人一块写点代码打打样,这也属于结对编程的范畴。很多朋友会认为两个人在较长的时间里面坐在一台电脑面前编程,才是结对编程。但其实结对编程(或者结对工作)是一种很自然的协作方式,无处不在、无时不在。

再来看大家比较关心的关于结对编程效率的问题。要想做完全的度量其实很难,因为很难找出来两组编程能力完全一样的团队来进行对比测试。但从我们自己团队十几年的结对编程实践来看,结对编程并不会降低效率,甚至结对编程的效率会比独自编程更高。我们来具体分析看。

无结对,不编程!_敏捷开发

从编程角度来讲,无外乎两个工作:第一是快速地找到解决方案(设计),第二是快速地实现它(编码)。在寻找解决方案的时候,往往会出现两种情况:第一种是迟迟找不到解决的方案,卡住;第二种是很草率地找一个方向开始编程,最后发现此路不通,只能推倒重来。所以首先要解决的是如何快速找到合理的解决方案。俗话说,三个臭皮匠,顶个诸葛亮。两个人互相沟通,互相交流,一方面可以更好的澄清需求,另一方面结合各自的经验,取长补短,可以快速地形成有效的解决方案。单独一个人容易犯错,但两个人共同犯错的几率就低很多了

再来看编码过程常遇到四种问题。第一种是因为编程能力或者业务不熟练导致的编码效率比较低。第二种问题是编程过程中的低级错误导致的浪费。第三种就是因为考虑不周而导致的逻辑问题。第四种就是因为各种不专注而产生的状态切换造成的浪费。从精益角度来讲,这其实都是浪费,而结对编程可以有效减少这几种浪费。

比如老带新的方式可以帮助帮助新手了解常见的编程技巧和业务细节;结对编程的特点提供了编码过程的第三视角,很多低级错误可以第一时间被发现并解决;结对过程中是两个人频繁交换电脑控制权的过程,需要两个人精力高度集中,也可以避免思考不周而导致的逻辑问题;自己一个人编程的时候很容易被电话、微信等意外中断,现在旁边坐了一个小伙伴,就不好意思总是看手机了,两个人可以一块集中精力工作较长时间。

所以从设计和编码两个方向来看,结对编程都可以有效提升编程的效率。除此之外,结对编程还有其他几个好处。除了前面我们提到的老带新之外,还可以有效促进业务知识、编程经验在团队内部的分享传承,进而促进代码的集体所有权,形成统一的编码规范,形成真正意义上的团队协作。也可以为内部轮岗、避免单点打下坚实的基础。

结对编程可以有很多种方式。我们在处理一些比较核心问题的时候,会采用强结对的方式,两个人会固定的工作一个迭代。在禅道里面创建任务时,也会指派给一个用于跟踪结对编程工作量的账号,比如叫xxx组合之类的。平时我们会采用弱结对的方式,人员的组合也会灵活变动。我们在结对编程的时候会有两套键盘鼠标,任何一个同事随时都可以接管键盘来进行编码工作。

极限编程里面的实践都是相辅相成的。结对编程可以促进代码集体所有权、编码规范这些实践的推行,同时反过来说,集体所有权和编码规范又是结对编程的基础。

面向对象编程,请从结对开始。:)