敏捷结对编程实践

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