尽管有成功的方面,但软件开发过程中还是经常会遇到一些问题,很多企业在软件方面花了大量的金钱和经历,但并不是很清楚软件到底能给他们带来什么。一些调查发现世界上很多软件项目其实都失败了,也许这是因为在软件开发过程中,很难定义成功与失败这两个不同的概念。我们在软件界就是注重怎么预见软件开发的不可预知性,我们想象出了各种各样的技术、工具以及流程使得软件开发的过程变得越来越可以控制、预测。这种方法有一个很大的问题就是无法有效评估软件开发过程的有效性。在很多其他的产业界,可以用简单的办法评价过程的进程及有效性,但是对于软件开发过程,很难用一种标准来衡量它的进度和有效性。一个结果就是很难有效判断两种有效的方法哪种更好,使得软件技术、工具以及流程方面的很多讨论都被这种现象所左右。软件开发的过程中有各种问题,并不是新提出的概念。在六十年代末期的时候北约一个软件开发室提出了软件危机的概念,因此他们提出了非常有纪律性的方法即软件工程学,试图从电子工程学、技术工程学提炼出一些东西来用于软件工程学,他们想从中提炼出一种方法,使得软件开发的流程更有预测性。过去三、四年间这种工程学的方法一直为大家普遍使用。但软件业的人在做软件的过程中发现这些方法并没有减少软件开发过程中遇到的问题,对于这种现象有很多解释。近年来有人发现软件工程学里一些基本的假设是不正确的,并使用了一些新的开发方法,我们将其统称为敏捷式开发。(相关文章:给C++初学者的50个忠告)
敏捷式开发有很多特色,今天我主要集中介绍两方面的特色,我会重点介绍一下它就软件开发文化有什么样的影响。前不久我在我的网页上发表了一篇文章“新方法”解释我对敏捷式开发的看法。下面我介绍一下敏捷式开发与传统开发相比最具特色的两点。
敏捷式开发采用适应性方法,而传统的软件工程学采用的是预测性方法。敏捷式开发是以人为主的,而传统的工程学是以过程为主的。我下面详细地介绍这两方面:
适应性和预测性的区别存在于软件工程学对软件开发过程的描述中。在传统的工程学里,核心的概念就是把设计和构建这两个过程分开进行。最开始一个阶段叫设计阶段,在这个阶段所有跟软件设计相关的重要决定就已做出了,而且以完整的形式描述出来。这项工作通常是由一小部分非常专业的人来做的,而且他们所花的时间和精力在整个项目中占着很小的一部分。这项工作完成以后,这些设计的结果,从建筑学的角度就被“建筑公司”拿去,按照设计的结果一步步构建。在描述清晰的设计图纸的基础上,你就可以据此对构建过程进行详细的规划,并进行成本的预测。但是现在大家对这种过程是否非常适合软件开发行业存在着争议。这里经常会问到一个问题,就是这个过程要花多长时间,对于这个问题有各种不同的回答。在传统的工程学中设计过程在整个项目开发过程中只占10%左右的时间,但是很多软件开发权威机构都认为软件设计过程在整个开发过程中占百分之四、五十的时间,它明显告诉我们这里有些东西是不对的。在软件开发的过程中,我们很难想象,如何真正把设计和编程完全区分过来。软件工程学领域,所有在这里从事工作的人员,都把设计的过程想象成用图表、图象的方式来描述结果的过程。很多人都有这样的经验,没有经过编程而是直接想象出的设计,在进入编程阶段有很多地方是错误的,需要改正。而且从我的观点来看,几乎没办法进行有效的设计。还有一个更重要的问题就是说,软件本身的需求是在变化的。一个项目在开发过程中需求会出现变化,需求的变化从根本上推翻了工程学方法所建立的一个基础。当工程学的人尽量减少或者控制系统将来发生变化的可能,他越这样做问题就越容易出现。既然我们没办法避免变化的发生,那么我们就想找到一种新的方法能够更有效地适应这种变化现象。这也就是敏捷式开发方法所要达到的效果。
下页更精彩:敏捷开发的特点之二