本文就敏捷开发和几种比较常用的传统软件开发方法:瀑布式开发、迭代式开发、螺旋开发作了对比分析。
传统软件开发
1、瀑布模型
1.1概述
1970年Winston Royce提出了著名的“瀑布模型”,直到80年代早期,它一直是唯一被广泛采用的软件开发模式,瀑布模型将软件生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,并且规定了它们自上而下、相互链接的固定次序,如同瀑布流水、逐级下落。
在瀑布模型中软件开发的各项活动严格按照线性方式进行,当前活动接受上一活动的工作结果,实施完成所需的工作内容,当前活动的工作结果需要进行验证,如验证通过,则该结果作为下一项活动的输入,继续进行下一项活动,否则返回修改,所以说其本质是线性顺序模型。
1.2特点
瀑布模型的优点是严格遵循预先计划的步骤顺序进行,一切按部就班比较严谨。
瀑布模型强调文档的作用,并要求每个阶段都要仔细验证,但是这种模型的线性过程太理想化,已不再适合现代的软件开发模式,几乎被业界抛弃,其主要问题在于:
1)各个阶段的划分完全固定,阶段之间产生大量的文档,极大地增加了工作量;
2) 由于开发模型是线性的,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发的风险;
3)早期的错误可能要等到开发后期的测试阶段才能发现,进而带来严重的后果。
1.3总结
“线性”是人们最容易理解掌握并能熟练应用的方法,当人们碰到一个复杂的非线性问题时,总是千方百计地将其分解或转化为一系列简单的线性问题,然后逐个解决。一个软件系统的整体可能是复杂的,而单个子程序总是简单的,可以用线性的方式来实现,否则干活就太累了。线性是一种简洁,简洁就是美。当我们领会了线性的精神,就不要再呆板地套用线性模型的外表,而应该用活它。
2、迭代式开发
迭代式开发也被称为迭代增量式开发或迭代进化式开发,是一种与传统的瀑布式开发相反的软件开发过程,它弥补了传统开发方式中的一些弱点,具有更高的成功率和生产率。在迭代式开发中,整个开发工作被组织为一系列的短小的、固定长度的小项目,被称为一系列的迭代,每一次迭代都包括了需求分析、设计、实现与测试。采用这种方法,开发工作可以在需求被完整地确定之前启动,并在一次迭代中完成系统的一部分功能或业务逻辑的开发工作。再通过客户的反馈来细化需求,并开始新一轮的迭代。
迭代式开发的优点如下:
1)降低风险
2)得到早期用户反馈
3)持续的测试和集成
4)使用变更
5)提高复用性
3、螺旋开发
1988年,巴利·玻姆(Barry Boehm)正式发表了软件系统开发的“螺旋模型”,它将瀑布模型和快速原型模型结合起来,强调了其他模型所忽视的风险分析,特别适合于大型复杂的系统。其核心在于不需要在刚开始的时候就把所有事情都定义的清清楚楚,而是在定义最重要的功能时去实现它,然后听取客户的意见,之后再进入到下一个阶段.如此不断轮回重复,直到得到你满意的最终产品。
螺旋模型沿着螺线进行若干次迭代,图中的四个象限代表了以下活动:
1)
制定计划:确定软件目标,选定实施方案,弄清项目开发的限制条件;
2) 风险分析:分析评估所选方案,考虑如何识别和消除风险;
3) 实施工程:实施软件开发和验证;
4) 客户评估:评价开发工作,提出修正建议,制定下一步计划。
敏捷软件开发
1、概述
敏捷软件开发又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新型软件开发方法,它是一种以人为核心、迭代、循序渐进的开发方法,相对于传统软件开发方法的“非敏捷”更强调程序员团队与业务专家之间的紧密协作、面对面的沟通、频繁交付新的软件版本、紧凑而自我组织型的团队,能够很好地适应需求变化的代码编写和团队组织方法,也更注重软件开发中人的作用。
2、敏捷原则及价值观
敏捷联盟为希望达到敏捷的人们定义了12条原则,在此不一一列出,但是并不是每一个敏捷模型都同等使用这12项原则,一些模型可以忽略或者淡化一个或多个原则的重要性,然而,它们定义了一种敏捷精神,体现了敏捷开发的价值观,即:人与人的交互优先于过程和工具;可以工作的软件优先于求全责备的文档;客户协作优先于合同谈判;随时应对变化优先于循规蹈矩。
3、“人的因素”
敏捷软件开发的拥护者们都不厌其烦的强调“人的因素”在成功敏捷开发中的重要性,正如Cockburn和Highsmith所说:“敏捷开发关注个人的才智和技巧,根据特定人员和团队来塑造过程。”这一描述的关键点在于“构造可以满足人员及团队需求的过程模型”,而非其他可选的过程模型。
如果敏捷开发团队成员希望努力维护所使用的过程的特性,则该团队成员及团队本身必须具备以下特点:基本能力、共同目标、精诚合作、决策能力、模糊问题解决能力、相互信任和尊重、自组织即项目组的自我管理。
对比分析
1、相对于瀑布开发模型
敏捷开发区别于瀑布式的特征很明显 ,敏捷开发是以一种迭代的方式推进的,而瀑布模型是最典型的预见性的方法,严格遵循遇见计划的步骤顺序进行,步骤成为衡量进度的方法。敏捷开发过程中,软件一直处于可使用状态,它将项目分成若干相互联系、可以独立运行的子程序,因此,每个阶段软件都是可见的。
2、相对于迭代式开发
两者的相同之处在于都强调在较短的开发周期提交软件。不同之处在于敏捷开发的周期可能更短,并且更加强调队伍中的高度协作。需求时刻在变,人们对于需求的理解也时刻在变,项目环境也在不停的变化,因此开发方法必须要能反映这种现实,敏捷开发方法就是属于这种适应性的开发方法,而非预设性。
另外重视交互也是一明显区别,敏捷开发更适用于小团队,比如在一个办公室工作,这样更有利于团队成员之间的交互,它也强调用户要与开发团队在一起工作,这样便于及时沟通交流,同时,“人与交互”也被列为敏捷开发价值观之首,可见其重要性。
3、相对于螺旋模型
和螺旋开发方法相比,敏捷方法强调适应性而非预见性。“螺旋模型”的核心就在于不需要在刚开始的时候就把所有事情都定义的清清楚楚,只需要定义最重要的功能并且实现它,然后听取客户的意见,之后再进入到下一个阶段。如此不轮回重复,直到得到您满意的最终产品。螺旋开发很大程度上是一种风险驱动的方法体系,因为在每个阶段之前及经常发生的循环之前,都必须首先进行风险评估。而敏捷开发,针对软件开发过程中诸多的不可预见性,强调的是适应性,适应性的方法集中在快速适应现实的变化。当项目的需求发生了变化,团队应该迅速适应,这个团队可能很难确切描述未来将会如何变化。
总结
敏捷开发是一个过程,不是一个事件。在敏捷开发的各个过程中集合了很多种传统软件开发方法,比如迭代、增量开发、瀑布、快速原型法等等,可理解为在原有软件开发方法基础上进行的整合——取其精华,去其糟粕。因此敏捷开发继承了不少原有方法的优势,这也是为什么现在敏捷开发方法为很多工程师所用。
参考文献
[1] (美)Alistair Cockburn,苏敬凯译.敏捷软件开发[M].机械工业出版社,2008,1
[2] Roger S Pressman,软件工程-实践者的研究方法[M].北京:机械工业出版社,1999.
[3] Robert C·Martin,邓辉译.敏捷软件开发——原则、模式与实践[M].清华大学出版社,2003-09-01.