摘要
结对编程是敏捷软件开发中的重要实践活动,然而国内业界对结对编程如何提高软件开发效率的实现并不明确。作者根据亲身敏捷软件开发过程的经验,深入探讨了其对提高软件开发效率的实际作用。
正文
结对编程是极限编程(XP)的十二个实践之一,是指两位程序员肩并肩地坐在同一台电脑前合作完成同一个设计、同一个算法以及同一段代码,并且两人的角色可以随时互换。XP认为结对编程能提高软件开发效率,很多国外软件企业都在热衷于结对编程,Facebook程序员肯特•贝克(Kent Beck)表示:“结对程序员之间的交流非常充分,你甚至可以再也不用言语进行交流。你只要简单描述再结合着手势就可以。”Grockit***执行官罗伊•吉尔伯特(Roy Gilbert)表示,这种模式已经证明非常成功,他的程序员“正在继续推广这种做法。”而IBM还为结对编程推出了协同开发工具ECF。
然而,结对编程在国内确处于一个尴尬的境地,业界对其如何提高软件开发效率的理论并不明确,也有认为不但不能提高效率,反而会降低效率的观点。本文作者根据亲身经历,结合查阅国外的很多资料,将结对编程提高软件开发效率的心得与各位读者分享。
在正确认识结对编程如何提升软件开发效率之前,首先要认清对结对编程理解的两个误区。
误区一,两个人工作效率比一个人高
这个误区又分为两种情况。一种是简单地认为两个人做事应该更快,的确,日常的生活和工作经验都告诉我们,一般情况下,两个人合力做一件事,是比一个人独立来做要快的。两个程序员合力写一个程序,应该比一个人来写这个程序速度快。但国内商业软件公司开发的实际情况是,如果有两个人,那么就要写两个程序,而不是只给你一个程序的任务。让两个人顺序完成两个程序,效率显然比每人负责一个程序,并行开发两个程序来的低。所以这个说法是不符合国情的。
另一种情况是所结对编程时,两个人可以相互讨论来解决遇到的问题,要比一个人冥思苦想的效率高。初看这种说法很有道理,但现实是在商业软件开发公司中,对于一个熟练的软件工程师来说,并不是经常遇到难题,大部分时候收到的需求都是能很快想到解决方案的,根本没有做大量讨论的必要。而但碰到疑难问题的时候,还有很多更加有效率的方法,比如直接寻求相关技术专家的帮助,或者召集多位编程达人做一次头脑风暴等,结对编程在这点上说提高软件开发效率是很勉强的,作者认为反而是降低效率。
误区二,防止偷懒,提高效率
这个说法在国外的资料上没有,但是国内的很多培训和资料上都有提到过。它说如果单独工作,在遇到困难的时候,并不是所有人都立刻积极地去解决问题,这时或许会上网和网友聊聊天,看看无关的网站等等。有可能因为工作的打断,大半天的时间都浪费了。而结对编程有一种相互督促的作用,在一边工作疲惫状态不好使,另一边会起一个鼓励和激发斗志的作用。
但是这个说法其实只是一厢情愿,由于软件开发是很讲究团队配合意识的,所以软件开发公司内的同事关系基本都很融洽的。两个关系好的同事坐在一起的时候,不但不会互相监督,反而会互相掩护。
以上是作者认为国内业界对结对编程认识的两个误区,那么结对编程是如何提高软件开发效率的呢?
提高代码走查效率
在当今的软件工程概念中,代码走查是一个很重要的过程。代码走查的目的是提高软件的质量,以及可维护性,经过走查的代码是能够更容易地被项目组其他成员看懂的。然后代码走查的成本不低,有经验的软件工程师都清楚,要一个开发人员完全理解另一个人的代码是一件不容易的事情,不只是代码编程习惯的不同会导致阅读代码的困难,在复杂的业务逻辑下,不同的开发人员的设计思路也有很大不同的,导致不同的人对代码的理解有很大差异。所有很多时候代码走查紧紧只是看看代码中是否有语法上的错误,是否符合编程规范,而要发现业务逻辑上的深层错误是很困难的,以至很多浮躁的软件开发公司甚至直接省略代码走查这个步骤。
结对编程则正是提高代码走查效率和质量的非常有效的手段。两个开发人员坐在一起,共同思考和讨论设计思路,轮流编写程序代码,轮流走查另一个人在写的代码,代码走查和编码并行开展,而不是等完全编码之后才做代码走查,产生的程序代码风格是两个人都能接受的。这样就不存在要一个人去理解另一个的代码的问题,实际是两个人共同理解代码。而且由于两个人的思想盲区要远小于一个人的思想盲区,所以能够在编码过程中及时地发现程序在业务逻辑实现上的深层问题,大大提高代码走查的效率和质量。对于包含代码走查阶段的软件开发过程而言,结对编程是能大大提升软件开发效率的。
结对编程还有很多优点,比如提高软件代码的质量,促进知识传递,降低新员工学习成本等。除此之外,作者还发现结对编程还有一个很大的优点,就是能让敏捷开发所倡导的共同责任理念落到实处。
敏捷开发强调项目是整个项目团队共同拥有的,所以项目的问题是项目团队所有成员的责任,而不只是某个人的责任,项目团队的所有成员应该共同努力来解决和避免所有的项目问题。结对编程则能很好地体现这个理念,在结对编程中两个人频繁变换角色,对于程序代码存在错误,就很难分清是谁的责任,甚至很难分清楚哪里的代码是谁写的,所以代码问题至少是结对的两个人的共同责任,从根本上促进了共同责任的理念。