项目管理系列之:用结对编程改善团队协作文化
在敏捷开发文化中,结对编程是作为一种非常推荐的提高工作效果的方式,被不断宣讲的。
在还不懂结对编程的人眼里,结对编程的印象是这样的......
结对编程是什么
结对编程是极限编程思想中提出的一种实践, 结对编程,简单的理解就是两个人坐在一起共同完成一个程序或一段代码。
其中,一个人主要动手编程代码,另一个人在旁边实时查看和评估代码,并帮助整理设计思路,发现问题。
两个人在一起时可以相互讨论,有效地避免了闭门造车的设计偏差,减少后期的code review时间,减少Bug出现概率,和更大的修复Bug所需的时间,以及接手他人代码的学习成本。
[图:非结对编程]
[图:结对编程]
结对编程有什么好处
可以看出,结对编程还是很有好处的。
1、编程过程就是设计贯彻过程
需求和设计都在其他人脑子里,口传太随意、编写文档形式化又太重。让掌握需求和掌握设计细节的人,和具体编码实现的人一起来开发,能够最大化的减小误解和设计传递偏差,自然也就能够比避免大量的无用功和返工,提高了整体的进度效率。
2、编程过程就是代码检查过程
每个人的编码习惯都是不同的,有些坏习惯会引入很多代码的坏味道,比如随意的命名,不进行方法封装,无设计或过度设计。一时的思路不清引入弯路,小到语法,大到解决问题的思路 ,这些都可以由坐在你旁边的小伙伴随时提醒你。写出的代码质量自然就会棒棒哒。
3、编程过程就是分享学习过程
在编程过程中,一般由新手或者某个方向经验较少的专职程序猿进行实际编码,而在结对过程中,新人能够很快的熟悉团队术语、已有的代码资产,互相学习新的技术和能力,而无需专项培训;也减少了对某个事必须只能某个人做这样的依赖,降低了整体团队的风险。
4、编程过程就是团队建设过程
结对能使大家沟通的频率大大增强,互相之间更加熟悉和融洽,信息流动顺畅,当有问题发生时,也能够开展主动和良好的协作,共同完成任务。
在有时没有小伙伴的时候,也可以用一些替代工具,比如小黄鸭工作法,用一个小黄鸭替代小伙伴,自己向小黄鸭解释自己的设计思路,在解释的过程中也能过发现思考的不足之处。
国内结对编程的难点
而在国内,含蓄害羞内敛的程序猿占了大多数,而这阻碍了结对编程在国内的推广和使用。
开发人员拒绝结对甚至宁可辞职,敏捷团队负责人也会灰心的表示,国内就算了,就这样吧。
我们知道,这的确存在很多需要克服的问题。
1、对固有习惯的保持、对更高的沟通和协作能力要求的抗拒
结对编程把独自一个人的程序员的工作细节放到另一个人眼里,大家会担心,写出的坏代码是不是会被人嘲笑,不良的思路是不是反映了自己很笨,不善言辞是不是影响了别人评价自己。而如果没有一个良好的团队开放性氛围文化做支撑和铺垫,这就会把成员推回自己的小格子里。
2、观点不一,各持己见
每个人都有自己的习惯和观点,如果对设计和代码风格,甚至是某个注释的用词都追求完美的两个人结对,就会争吵不休,无法得出结论。
3、参与感差或者使劲催促指责
A君:小伙伴在编程,嗯,没我啥事,就打一会“望着农药” (王者荣耀)吧。
小伙伴心里默默想:...... (兄弟给我玩会,你来写吧)
B君:小伙伴写得太慢了,又笨又固执,我是在受不了,还是我来写吧!!
小伙伴心里默默想:...... (暴击+10086点)
4、长时间结对非常疲劳
结对编程能使人非常专注,所以效率较高,但是也很累;没有私人碎片时间去做些工作无关的放松的事情。
若没有好的节奏,就会非常疲惫,导致拒绝结对。
建议方式
那么在极迭代看来,结对编程不是个必选项,在敏捷实践中是个可选项,依赖于团队文化是否足够敏捷和成熟。
一个开放性的团队文化是一切的基础,开放性的学习型团队,会被引导成为一个拥抱沟通、拥抱透明化、拥抱分享和学习的文化环境。
在这个环境里,大家既主动积极,又开放互助,不担心犯错误,又会具有洁癖,主动修复自己的错误。
有这样的文化基础,才能够顺利引入结对编程。
那么具体引入,也有一些适合国内的可选建议:
对于未开展TDD的团队,可以在设计澄清阶段进行框架性编写,这一阶段进行结对编程,然后自行完善实现。
这种方式能够保障需求设计传递不失真,解决描述偏差问题,而这是60%以上故障和Bug的根源。
而且能够避免长时间的持续关注,导致的关注过细,或者关注疲劳
对于已开展TDD的团队,一人写TDD失败的测试用例,一人完成代码跑通用例,然后不定期交换。
TDD是编程的最佳实践,如果已经熟悉了TDD,就可以由经验较丰富的、熟悉该项需求设计的人来编写测试用例,而经验较少的人来写具体实现,在完成时,两个人都对该功能达成了一致性的认可。在下一个需求到来时,就可以轮换角色,挑战新任务,共同进步。