极限编程里面有一个比较有争议实践就是结对编程。很多团队的管理者在谈到结对编程的时候,第一反应是浪费时间:本来一个人可以干的事情要安排两个人干,不是浪费时间吗?那结对编程到底会不会浪费时间呢?结合我们禅道团队自身十几年的结对编程实践,跟大家做一下分享。
首先来定义一下什么是结对编程。很多朋友可能觉得自己的团队从来没有实施过结对编程,但其实每个开发团队都做过。最常见的场景就是遇到了棘手的Bug,一个人解决不了,拉上另外一个同事,一块讨论,一块交流,然后把这个问题解决了——这就是一种结对编程。再比如新人来了,团队指定一位师傅来带他。这位师傅跟新人坐到一块,演示解决问题的思路方法,跟新人讨论具体问题的思路方法,或者跟新人一块写点代码打打样,这也属于结对编程的范畴。
很多朋友会认为两个人在较长的时间里面坐在一台电脑面前编程,才是结对编程。但其实结对编程(或者结对工作)是一种很自然的协作方式,无处不在、无时不在。
再来看大家比较关心的关于结对编程效率的问题。要想做完全的度量其实很难,因为很难找出来两组编程能力完全一样的团队来进行对比测试。但从我们自己团队十几年的结对编程实践来看,结对编程并不会降低效率,甚至结对编程的效率会比独自编程更高。我们来具体分析看。
从编程角度来讲,无外乎两个工作:第一是快速地找到解决方案(设计),第二是快速地实现它(编码)。在寻找解决方案的时候,往往会出现两种情况:
- 第一种是迟迟找不到解决的方案,卡住;
- 第二种是很草率地找一个方向开始编程,最后发现此路不通,只能推倒重来。
所以首先要解决的是如何快速找到合理的解决方案。俗话说,三个臭皮匠,顶个诸葛亮。两个人互相沟通,互相交流,一方面可以更好的澄清需求,另一方面结合各自的经验,取长补短,可以快速地形成有效的解决方案。单独一个人容易犯错,但两个人共同犯错的几率就低很多了。
再来看编码过程常遇到四种问题。第一种是因为编程能力或者业务不熟练导致的编码效率比较低。第二种问题是编程过程中的低级错误导致的浪费。第三种就是因为考虑不周而导致的逻辑问题。第四种就是因为各种不专注而产生的状态切换造成的浪费。从精益角度来讲,这其实都是浪费,而结对编程可以有效减少这几种浪费。比如:
- 老带新的方式可以帮助帮助新手了解常见的编程技巧和业务细节;
- 结对编程的特点提供了编码过程的第三视角,很多低级错误可以第一时间被发现并解决;
- 结对过程中是两个人频繁交换电脑控制权的过程,需要两个人精力高度集中,也可以避免思考不周而导致的逻辑问题;
- 自己一个人编程的时候很容易被电话、微信等意外中断,现在旁边坐了一个小伙伴,就不好意思总是看手机了,两个人可以一块集中精力工作较长时间。
所以从设计和编码两个方向来看,结对编程都可以有效提升编程的效率。除此之外,结对编程还有其他几个好处。除了前面我们提到的老带新之外,还可以有效促进业务知识、编程经验在团队内部的分享传承,进而促进代码的集体所有权,形成统一的编码规范,形成真正意义上的团队协作。也可以为内部轮岗、避免单点打下坚实的基础。
结对编程可以有很多种方式。我们在处理一些比较核心问题的时候,会采用强结对的方式,两个人会固定的工作一个迭代。在禅道里面创建任务时,也会指派给一个用于跟踪结对编程工作量的账号,比如叫xxx组合之类的。平时我们会采用弱结对的方式,人员的组合也会灵活变动。我们在结对编程的时候会有两套键盘鼠标,任何一个同事随时都可以接管键盘来进行编码工作。
极限编程里面的实践都是相辅相成的。结对编程可以促进代码集体所有权、编码规范这些实践的推行,同时反过来说,集体所有权和编码规范又是结对编程的基础。
面向对象编程,请从结对开始。:)