我的直接主管是来自台湾的Ben,他非常喜欢探索新的开发模式,其中有一次他让我这个只有一年开发经验的人新人和一个工作三四年的工程师一起做结对编程。
和我一起结对的编程的L先生是一个经验非常丰富的老工程师,他写的代码质量、效率极高,跟他一起学了很多好的编程习惯
第一次尝试采用结对编程(Pair Programming)这种编程模式,虽然时间不长,但还是感觉体会颇多,拿出来与大家分享一下。
一、结对编程的优势
1.发挥"双剑合璧"的威力
俗话说"三个臭皮匠,胜过一个诸葛亮",大家在做同一件事时,集思广义发挥各自优点,可以使我分析更能切中要害。
比如在设计阶段,我们其中一个人想到采用策略模式来解决这个问题,采用一个接口作为抽象行为层。
另外一个人发现我们这些具体的算法类有一些公用行为,于是考虑用抽象类代替原来的接口作为抽象行为层,这样可以把那些公用行为上移到抽象层,大大减少了冗余代码,使设计变得更加优雅。
2.相互督促,不间断的Code Review,提高代码质量
相互督促可以使我们都能集中精力,更加认真的工作,我们对业务的理解深度相差无几,设计在我们共同讨论中产生,这样我们在进行Code Review的时候比起传统的方式就会更有效。
比如我们其中一个人,按照我们共同完成的活动图去编程,完成一小段逻辑后,另外一个人会马上给出意见,说出代码存在的潜在问题,这个潜在的问题,很可能是因为我们当时对业务理解存在偏差造成的。
很可能这个时候我们要对设计进行改动以适应业务。如果是一个人在编程,恐怕很难找到这样的问题,传统的Code Review也很难做到这一点。
任何一段代码都至少被两双眼睛看过,两个脑袋思考过,代码的质量会得到有效提高。
3.相互学习和传递经验
"三人行必有我师",相互学习对方的技能,可以提升自己水平。比如我们需要透过一个SQL语句去查找一组多次变更的合同。
这时候需要用到递归的SQL语句,其中一个人不熟悉,另外一个则对此驾轻就熟,于是很快另外一个人也就掌握了这种SQL语句的写法。
再比如我们在进行编码时可能会用到一些IDE的特性以提高我们的编码速度,比如一些快捷键的使用、抽取方法的使用,可能其中一个人不太熟悉这些IDE的特性,透过他的伙伴也就很快掌握了,大大提高了生产力。
4.可以更加愉快的工作
提醒:如果两个人都是喜欢闲聊者,请不要选择结对编程
二、结对编程的劣势
1.有效的结对编程,需要一定的磨合时间
结对编程之初,我们两个的配合还是有些不顺畅,使用IDE的习惯有差异,编码习惯有差异,甚至对某个词语的表达方式都存在差异,会影响到我们的效率。
正当我们相互磨合渐渐适应对方,我们的任务也基本结束了。
2.沟通各自意见,需要时间
两个人一起编程难免出现意见不一致的现象,出现这种情况我们采取的方式是停止手头的工作,直到讨论清楚得出结论为止,有时候我们这样的讨论可能持续时间比较长,会影响到我们的生产力。
三、得到的经验和教训
1.应该及时的进行角色轮换
我们没有进行角色轮换,一直是一个人做Driver,另外一个人做Navigator ,这样有时会因为过度思考,而导致观察力和判断力出现偏差。
建议以后进行结对编程每半天进行一次角色轮换。
2.结对编程需要相互尊重(respect)
工作及时得到同伴的肯定,自信心和成就感会增强,觉得工作很愉快,很愿意很partner一起工作,这样就会提高生产率。
3.不要在ACTION里写太多逻辑
这次结对编程采用了单元测试,在测试ACTION的逻辑时,发现因为在ACTION里写了太多逻辑,单元测试根本无法实施,如果我们将ACTION里的逻辑都移到逻辑类里,那样进行单元测试就方便多了。
4.不要用netMetting
我们在结对编程之初很喜欢用这种该方式进行相互监督,后来发现这种方式很容易造成注意力不集中,还是应该两个人都并排坐在一台电脑前,面对同一个显示器,使用同一个键盘,同一个鼠标一起工作。
后记:这篇文章是我很多年前刚工作的的时候,做的内部分享,一直保留着,很多东西写出来才能成为自己的东西。建议那些刚工作的朋友,养成总结的习惯,写写周总结,月总结,这样不断复盘,成长速度会很快。