敏捷开发:人比流程重要
20世纪60年代开始的软件危机引发了人们对软件开发的思考,并由此诞生了《软件工程》这门学科。它将软件开发分为需求分析、设计、编码、测试、维 护等几个阶段的瀑布式开发软件方法至今仍然在大多数软件开发组织沿用。然而,《软件工程》学及其瀑布式开发方法并没有彻底解决软件危机。如何满足不断变化 的软件需求一直就是传统软件开发方法无法解决的难题。
而敏捷开发正是为了解决上述问题而提出,从2001 年敏捷开发方法正式出现以来,越来越多的开发人员开始接受这一方法,市场也出现了一批以敏捷开发为主要方法的软件开发和咨询服务公司。 ThoughtWorks公司就是其中的佼佼者,日前,本报记者专访了ThoughtWorks公司中国区总经理郭晓,请他就如何实施敏捷开发等问题进行 介绍。
颠覆传统软件开发方法
敏捷开发作为一种开发方法始于2001年,当时全球非常有名的10多位软件开发的大师集中在一起,对当时出现的一些新的编程方法进行归纳,并用敏捷这个词来概括这几种类似的方法流程。
“只要你的软件开发方法遵循敏捷的四条原则(即个体和交互胜过过程和工具、工作的软件胜过面面俱到的文档、客户合作胜过合同谈判、响应变化胜过遵循计划), 就算是敏捷一类的开发方法。比如ThoughtWorks自身的实践就集成了Scrum和极限编程,是这两种方法的组合体。” 郭晓告诉记者。
郭晓从20世纪90年代开始接触极限编程等敏捷开发方法,其后的10多年一直从事敏捷开发,后来又从事软件开发的管理工作,这使得他可以从更高的层次上来看敏捷这种对大多数程序员仍然比较陌生的开发方法。郭晓认为,敏捷宣言最为核心的思想有两点。
一个是人比流程重要。敏捷和传统的开发方式最大的不同点在于,传统的软件开发方式遵循了20世纪大规模工业化生产的思路: 每个人在这个流水线上负责一项工作,只要流程设计得完美,人就不重要,这也是《软件工程》学所追求的一种境界。而实际上,软件开发是一个知识性、创造性的 工作,是不可能完全模仿流水线的。敏捷开发强调一批有软件开发能力的人组成一个团队,至于团队使用哪种敏捷方法,完全由团队根据自己的特点来决定。它强调 流程是为人服务的,重视发挥人最大的创造力。
另一个是能够工作的软件其价值要比文档重要。传统的软件开发 方法分为需求分析、设计、编码等不同的阶段,分别由不同的人负责,文档在其中扮演驱动力的角色,不同角色通过文档来进行知识传递和交互。而敏捷开发认为文 档是为软件服务的,强调通过快速迭代和持续集成,让各种不同角色的人员可以基于目前已经开发出的软件进行直接沟通交流。这就带来了两个好处: 快速反馈和紧密的协作。
“重视交付、紧密协作、快速反馈正是敏捷的特殊之处,这些特点保证了敏捷开发能够满足变化的需求。”郭晓说,“而用传统的软件开发方法开发出的软件成功与否很大程度上建立在需求分析是否有足够的远见,能把未来的需求都考虑在内,而实际上,这几乎是不可能的。”
结对编程有必要吗?
说起敏捷开发也就不能不提到它的结对编程,敏捷开发要求代码的编写应该同时有两人参与,两人共同使用同一台电脑、一个键盘和一个鼠标。在采访过程中,记者特意向郭晓提出了这一疑问: 结对编程有必要吗?
郭晓告诉记者,结对编程在大多数情况下是适合的。在正常情况下,一个程序员并不是整天都在敲键盘输代码,他要思考,实际上真正敲键盘的时间只有 20%~30%。因此,两个人共同使用同一套电脑,并不意味着效率下降。敏捷开发要求一个人在编写代码的同时,另一个人对这个代码进行评审,评估代码是否 正确、是否有更佳的编写方法,然后相互沟通交流。这样写出的代码质量要远远高于单个人写。
结对编程的另一个好处是降低了项目风险。现代软件开发分工很细,每个软件开发人员独立负责一部分,一旦程序员离职或者换岗对于软件开发会很不利。而结对编程时,每段代码都至少有两个人了解,人员变动给项目带来的风险要低得多。
结对编程还有一个好处是有助于传、帮、带。通过结对编程,项目新来者可以很容易地融入进来,而这个过程不损失代码数量,还能够带来知识的共享等好处。
郭晓补充说,虽然敏捷开发强调敏捷编程,但并不是机械地要求任何代码都要结对完成。对于一些很简单、众所周知的代码,也可以只由一个人负责。
实际上,记者曾参观过ThoughtWorks公司的软件开发现场。记者看到,在大多数公司常见的格子间不见了,取而代之的是一个个长方形的大圆桌。这里的 开发人员以两个人为一组,虽然两个人面前各有一个显示器,但都接在同一个主机上,其中一个人在编代码,另一个在进行评审。
“我们的实际经验也证明了这种方法的先进性。我们有员工反映说,结对编程增加了他们的工作压力,因为结对时,两人几乎不再会做与工作无关的事情了。” 郭晓笑着说。
敏捷开发能走多远?
敏捷作为一种软件开发方法其先进性和合理性毋庸置疑,但是这种方法的适用范围如何?它适合大型软件开发组织采用吗?
“敏捷开发从2001年正式提出来的时候就有人提出,它不适合于大型软件开发团队、不适合于周期长的项目。事实上,这些年来,这些说法正在不断地被突破。”郭晓说,“当然敏捷本身也在不断扩展,从而能够适应越来越广的领域。”
郭晓介绍说,ThoughtWorks公司自己就曾在100人的项目上采用过敏捷开发。实际上,ThoughtWorks就是因此才和敏捷开发结缘的。
1999 年的ThoughtWorks还只是一个从事软件开发的公司。当时有一个100多人参与的大项目陷入了被动,不得已请来了业界颇负盛名、后来被称为敏捷开 发“教父”的Martin Fowler和Ward Cunningham来做咨询工作。他们通过引入敏捷开发让公司摆脱了困境。这也让ThoughtWorks感受到敏捷开发方法的魔力。另一个例子是英国 电讯(BT),它在印度有一个1.8万人的开发团队,在英国本土和其他地方也有几万人的开发团队,它现在几乎所有的软件项目都是用敏捷的方法来开发的。
当然,敏捷开发作为一种软件开发方法也并不是万能的,也存在一些局限。换句话说,要保证敏捷开发成功需要一些前提条件。
郭晓说: “敏捷开发要和客户紧密地沟通,才能够不断地获得客户的反馈。而实际上,通常客户很忙,抽不出这么多时间。另外,还有一些产品开发依赖于产品经理来了解需求,而他其实并不是真正的客户,这给敏捷开发带来困难。”
此外,客户对开发方的充分信任也是敏捷开发成功很有必要的一个条件。敏捷开发最佳的应用场景是用户不断提出新的需求,而项目合同价格也随着需求不断调整。郭 晓说,这在实际开发过程就是一个问题,特别是第一次合作时,客户就会很担心项目的最终成本。而如果是公司自己的开发队伍,这将不是问题。从这个角度上说, 敏捷开发最大的市场是公司内部的开发团队。
“不管怎么说,这几年我们已经明显感受到接受敏捷开发思想的人越来越多,从要求我们提供咨询服务的客户数量可以看出这种趋势。我们相信,敏捷开发一定会确立自己在软件开发领域的一席之地的。”郭晓信心十足地说。