敏捷结对编程实践
转发一篇文章,非常有意义的总结。
这,是再正常不过的事情(场景)了,不是吗?
文 / 金建法
本文主要从提升项目质量、促进知识传递及减少项目风险等角度出发,讲述作者所在团队在结对编程实践中的一些经历,以及如何避免或减少其所带来的负面影响。
你了解结对编程吗?你尝试过结对编程实践吗?也许你还未曾尝试甚至还不曾了解,那么我们一起来学习和了解敏捷结对编程实践,相信对敏捷感兴趣的你会有收获。
什么是结对编程
结对编程(Pair Programming)是一种敏捷软件开发实践,指两个程序员并排坐在一台电脑前,面对同一个显示器,使用同一个键盘和鼠标一起工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员), 两个程序员定期互换角色。他们在一起完成需求分析、系统设计、编码、单元测试、整合测试(Integration Test)、写文档等工作。基本上所有的开发环节都一起肩并肩地、平等地、互补地进行工作(如图 1 所示)。
图 1 共用一台电脑进行结对编程
上面是极限编程(eXtreme Programming,XP)对结对编程的描述,它有如下主要的优点:
有利于提升项目质量,减少 Bug;
有利于知识传递,降低学习成本;
多人熟悉同一段代码,减少项目风险;
与别人一起工作会增加责任和纪律性等。
尽管结对编程有诸多诱人的优点,但实行结对编程实践的却为数不多,其主要原因可能有:
结对编程需要投入更多的资源;
结对双方需同时注意力集中,否则效率更低;
结对人员能力要求相适,否则起不到观察者的作用,甚至产生依赖;
不成功的配对,经常引发争吵,产生内耗,导致团队不和谐等。
结对编程是颇具争议的敏捷实践之一,除上述一些优缺点外,可能大家还有更多不同的看法,但分析利弊不是本文所要讨论的重点。
实践经验
就我所在的项目团队而言,6人左右的开发团队需要支持多个中小型独立产品的需求开发,在繁重的业务压力下,用户价值的快速交付是首要的,所以想尝试共用一台电脑进行结对开发的实践只能是一种奢望。让团队开发人员尽可能熟悉相互间的产品代码,提升项目开发效率以及保证良好的项目质量,是我们在项目开发过程中需要重点解决的问题。
我们试图通过集体 Code Review 和设计交流分享等活动,来提升代码质量以及相互间业务代码的熟悉度,但一直收效甚微。问题主要在于这种集中式活动时间较难安排,人多交流效果不佳,性价比不高。后来,得益于公司的导师机制,在一对新人和导师身上,找到了敏捷结对的原型。由于他们的紧密合作,遇到问题及时沟通,新人在项目进度和质量都有不错表现,很好地融入了团队。在后续的项目过程中,我们不断地尝试和优化这种结对形式,逐渐形成相对固定的工作方法。
与 XP 结对编程相比,敏捷结对编程最为显著的差异是结对进行需求分析、系统设计和问题讨论,但分别编码实现,通过过程中频繁的 Review 来实现结对的效果。开发人员两两结对,共同认领开发任务,一起对所承担的开发任务负责。在需求理解、设计阶段双方一起设计和讨论,然后分工各自编码实现,并通过 Code Review 以确保实现与设计一致。对结对过程中发现的问题,随时沟通和讨论。由于产品业务逻辑相对不是特别复杂,所以通过这种小范围、高效的沟通,可以解决项目中的绝大部分问题,实现更高的开发效率并确保代码质量。目前,在开发流程中的主要结对活动如图 2 所示。
图 2 敏捷结对的主要活动
结对活动(如图 3 所示)给我们带来了哪些好处?
提升项目质量。结对开发人员在需求理解、设计思路上进行了充分的沟通和讨论,能尽早地发现和解决问题,避免前期因需求理解偏差、设计缺陷问题造成返工。
知识传递。对于新员工或经验略逊的开发人员,通过经常性的沟通和讨论,能迅速地进入角色和积累经验,发挥了传帮带的作用。
backup,规避项目风险。结对人员之间互为 backup,有利于团队成员之间熟悉业务代码,若有人员异动时有利于项目风险控制。
图 3 结对人员充分讨论设计细节及问题
无论新老结对还是强弱结对,都要尽力避免一方对另一方产生依赖,要给新人足够的成长和锻炼空间,让其独立思考和解决问题,并允许在可控范围内尝试失败,以获取宝贵经验得到成长。否则,团队只会多一个执行者,结对难以达到预想的效果。同时,一定程度的独立活动,可以让大家保留自己的工作习惯,而且形式更为自由和灵活。当然,大家可能会有疑问,如何保证结对人选中资深工程师工作的正确性,因为新人和弱者很有可能无法提出想要的 Review 帮助。这个问题在我们的结对中不可避免,有选择地邀请其他资深专家 Review,也许会是个不错的解决方案,特别是对于一些重要的复杂业务逻辑。
参加结对的工程师应具备独立思考和解决问题的能力,并且具备较好的团队协作意识。否则,不仅不能有好的结对效果,反而会带来一些新问题。此外,结对也不仅限在研发工程师之间,研发和测试工程师之间或同产品经理之间的结对(如图 4 所示),同样可以带来不错的效果。
图 4 研发、前端工程师测试之间结对解决问题
引入敏捷实践,贵在充分理解、结合实际,能扬长避短,且是一个适应、发展的过程,而按部就班绝对不是个好主意。有选择地结对对我们来说也许是上策,在结对的人选、场合、结对的环节等方面进行选择性的实施。
作者金建法,阿里巴巴 B2B 公司技术主管,具有多年互联网开发和项目管理经验,对 J2EE 和敏捷项目管理有着浓厚兴趣。