软件开发模型是在软件生存周期基础上构造出的由软件开发全过程中的活动和任务组成的结构框架,也称为软件生存周期模型或软件过程模型。
一、瀑布模型
最早出现的软件开发模型是瀑布模型。
思想:各阶段的衔接顺序,犹如瀑布流水,自上而下、逐级下落。前一阶段结束后才能开始后一阶段工作,前一阶段的输出是后一阶段的输入。
主要特点:
阶段间具有顺序性和依赖性。前一阶段结束后才能开始后一阶段工作,前一阶段的输出是后一阶段的输入。
推迟实现观点,尽可能推迟程序的物理实现。
强调质量保证观点。每个阶段必须完成规定的文档,每个阶段结束前完成文档审查,以便及早改正错误。
是一种文档驱动模型。
主要优点:
原理简单,容易掌握。
各阶段间都有验证和确认环节,以便进行质量管理。
主要用于支持结构化方法。
主要缺点:
缺乏灵活性,不能适应用户需求的变化。
缺乏演化性,返回上一级的开发需要付出十分高昂的代价。
是现线性的软件开发模型,回溯性很差。
适用场合:
适合于软件需求比较明确或很少变化,并且开发人员可以一次性获取到全部需求的场合。
适合开发技术比较成熟、工程管理比较严格的场合。
一般用于低风险项目,适合开发人员具有丰富经验,对软件应用领域很熟悉的场合。
二、快速原型模型
原型模型主要用于挖掘需求。类似于工程上先制作“样品”,试用后做适当改进,然后再批量生产一样。
优点:
增强了开发者与用户间的交流,有助于满足用户的真实需求。
用户可及早得到有用的产品,可及早发现问题,随时纠正错误。
减小技术、应用风险,可降低开发费用,缩短开发时间。
缺点:
缺乏丰富而强有力软件工具和开发环境。
对设计人员水平及开发环境要求较高。
在多次重复改变原型的过程中,程序员会厌倦。
难于做到彻底测试,更新文档较为困难。
适用场合:
预先不能确切定义需求的软件系统,或需求多变的系统。
开发人员对设计方案没信心或对将要采用的技术手段不熟悉或把握性不大。
快速原型模型可作为单独的过程模型使用,也常被作为一种方法或实现技术应用于其他的过程模型中。
三、渐增模型
渐增模型也叫增量模型。其实质上是分段的线性模型,是一种非整体开发模型。
思想:把软件产品作为一系列增量构件来设计、编码、集成和测试,在项目开发过程中,以一系列的增量方式来逐步开发系统。
增量方式包括增量开发和增量提交两个方式。
渐增模型的优点:
渐增模型是瀑布模型的一个变体,可以看作重复执行的多个瀑布模型,具有瀑布模型的所有优点。还有以下优点:
可分批次提交软件产品,方便用户及时了解软件开发进展情况,及早发现问题。
以组件为单位进行开发,降低了软件开发风险。
开发顺序灵活。优先级最高的服务首先交付。
缺点:
由于对整个软件系统的需求没有一个完整的定义,会给总体设计带来麻烦。
在把每个新的增量构件集成到现有软件结构中时,必须不破坏原来已开发出的产品。
软件的体系结构必须是开放的,即向现有产品中加入新构件的过程必须简单、方便。每次增量开发的产品都应当是可测试的。可扩充的。
使用场合:
软件产品可以分批次地进行交付。
待开发的软件系统能够被模块化。
软件开发人员对应用领域不熟悉、难以一次性地进行系统开发时。
项目管理人员把握全局的水平较高。
对软件需求把握不准确、设计方案有一风险的软件项目。
四、喷泉模型
“喷泉”一词体现了迭代和无间隙特性。
迭代是指开发软件系统时某些部分经常需要重复进行多次,相关功能在每次迭代中随之加入演进的系统;无间隙是指在软件开发活动各阶段(分析、设计和编码等)之间无明显边界。
特点:
各阶段相互重叠,反应了软件过程的并行性。
以分析为基础,资源消耗呈塔形,在分析阶段消耗资源最多。
反映了软件过程迭代的自然特性,从高层反悔低层无资源消耗。
强调增量开发,依据分析一点、设计一点的原则,不要求一个阶段的彻底完成,整个过程是一个迭代的逐步提炼过程。
是对象驱动模型,对象是所有活动作用的主体,也是项目管理的基本内容。
五、螺旋模型
螺旋模型是在结合瀑布模型与快速原型模型基础上演变而成的,并且加入了风险分析。
思想:使用原型及其他方法来尽量降低风险。
步骤:
制定计划。
风险分析。
工程实施。
客户评估。
缺点:要求开发人员必须具有丰富的风险评估经验和专门知识。
六、迭代模型
迭代产品包括产生产品发布(稳定、可执行的产品版本)的全部开发活动和要使用该发布必需的所有其他外围元素。实质上,它类似小型的瀑布式项目。
优点:
降低了在一个增量上的开发风险。
降低了产品无法按照既定进度进入市场的风险。
加快了整个开发工作的进度。
迭代过程这种模式使适应需求的变化会更容易些。
缺点:
项目风险高。
七、V模型
通过开发和测试同时进行的方式来缩短开发周期,提高开发效率。
优点:
适用于功能很明确的项目,先有测试案例,开发出的程序通过测试案例进行验证。
缺点:
V模型仅仅把测试过程作为需求分析、系统设计及编码之后的一个阶段,忽视了测试对需求分析,系统设计的验证,需求的满足情况一直到后期的验收测试才被验证。
八、敏捷开发方法
敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。
优点:
个体和交互胜过过程和工具。
可以工作的软件胜过面面俱到的文档
客户合作胜过合同谈判
响应变化胜过遵循计划
缺点:
敏捷注重人员的沟通,忽略文档的重要性,若项目人员流动太大,又给维护带来不少难度,特别项目存在新手比较多时,老员工比较累。
九、RUP
又称为统一过程,这是一种基于构件开发的方法。具有用例驱动、以基本架构为中心、迭代和增量的特点;在时间上分为四个连续的阶段,即初始阶段、细化阶段、构建阶段和交付阶段。
优点:
RUP是建立在非常优秀的软件工程原则基础上的,基于结构化的过程开发。
RUP提供了几个方法,这些方法提供了对开发过程的非常直观的管理。
缺点:
RUP仅仅包含了开发过程,它没有完全覆盖软件过程。
RUP不支持组织内的多项目开发,导致组织内的大范围的重用无法实现。
RUP缺少开发商的支持。
十、演化模型
根据用户的基本需求,通过快速分析构造出该软件的一个初始可运行版本,这个初始的软件通常称之为原型,然后根据用户在使用原型的过程中提出的意见和建议对原型进行改进,获得原型的新版本。重复这一过程,最终可得到令用户满意的软件产品。
优点:
任何功能一经开发就能进入测试以便验证是否符合产品要求。
帮助导引出高质量的产品要求。
提供机会去采取早期预防措施,增加项目成功的机率。
大大有助于早期建立产品开发的配置管理,均衡整个开发过程的负荷。
提高质量与效率。
使用户可以在新的一批功能开发测试后,立即参加验证,以便提供非常有价值的反馈。
缺点:
如果所有的产品需求在一开始并不完全弄清楚的话,会给总体设计带来困难及削弱产品设计的完整性,并因而影响产品性能的优化及产品的可维护性。
如果缺乏严格的过程管理的话,这个生命周期模型很可能退化为一种原始的无计划的“试-错=改”模式。