1.3.3 软件工程生命周期模型

一切工业产品都有自己的生命周期,软件(产品)也不例外。生命周期是软件工程的重要概念,刻画软件从产生、发展到成熟直至衰亡的过程。它把软件形成产品的整个过程划分为若干个阶段,并赋予每个阶段相对独立的任务。我们可以从软件开发模型观测出软件生命周期中每个阶段的任务。目前使用较多的软件工程生命周期模型有:瀑布模型、原型模型、进化树模型、迭代-递增模型、编码-修补模型和开源模型等。下面介绍瀑布模型和原型模型。

1.瀑布模型

瀑布模型是1970年由W. Royce首先提出的。瀑布模型把软件生命周期分为计划时期、开发时期、运行时期。每个时期又可划分为若干个阶段。计划时期可分为问题定义、可行性研究两个阶段;开发时期包括需求分析、概要设计、详细设计、编码、测试等阶段;运行时期主要进行软件的维护和重构。这反映了软件开发中串行、连贯的步骤,其优点是:每一步的结果都是可验证的,能够减少风险并给团队提供稳定的流程支持。各阶段任务说明如下。

●问题定义:这是计划时期的第一步,主要是为了弄清楚“用户要计算机解决什么问题”。该阶段是软件生命周期中最短的阶段,一般只需要一两天左右。

●可行性研究:此阶段主要是论证解决问题的方案是否可行,由此确定工程规模和目标,再由系统分析员更准确地估算出系统的成本和效益。

●需求分析:此阶段的主要任务是确定系统必须具备哪些功能,并设计出由用户确认的系统逻辑模型。这一阶段要产生的文档资料比较多,包括数据流图、数据字典、简要的数据描述等。

●概要设计:此阶段主要是建立起系统的总体结构,并画出由模块组成的软件结构图。

●详细设计:此阶段需要把问题具体化,也就是把概要设计阶段所产生出的模块图进一步细化,设计出系统的详细规格说明书。

●编码:此阶段是由程序员来完成的,主要是利用指定的语言,把设计阶段所产生的各种图和文字描述翻译成源程序。

●测试:这是开发时期的最后一个阶段,通常是先进行每个模块的测试,即单元测试,然后再将模块装配在一起进行测试,即集成测试。

●运行维护时期:这是软件生命周期的最后一个阶段,此阶段的主要任务是对已实现的软件进行维护,其目的是延长软件的使用寿命并提高软件的运行效率。软件在运行期间会由于潜在的问题而发生错误;用户在使用后也会提出一些改进或扩充软件的要求;另外软件运行的硬件、软件环境有时也会发生变化。这些情况使软件需要不断地进行维护,才能继续使用而不至于被废弃。软件维护是软件生命周期中比较长的一个阶段。

瀑布模型在软件工程中占有很重要的地位,它提供了软件开发的基本框架,非常有利于大型软件开发过程中人员的组织、管理,有利于软件开发方法和工具的研究与使用,大大提高了大型软件项目开发的质量和效率。瀑布模型强调需求、设计的作用,前一阶段完成后只需关注后续阶段,为项目提供了按阶段划分的检查点,里程碑清晰,文档也很规范。

但瀑布模型也有其不足之处:直到循环结束才能得到软件,难以适应需求的频繁变化,里程碑、完成时间点是强制的,编写文档的工作量非常大。

因此,瀑布模型适合于稳定的软件产品定义和理解透彻的技术。

2.原型模型

在生产硬件或其他有形的工业产品时,我们常常会先制造一个样机,待成功后再批量生产。原型化软件开发的思想正是从硬件的样机生产借用过来的。但硬件生产的批量大,因制造样机增加的成本仅占很小的比例;而软件则属于单件生产,如果每开发一个软件都要先制造一个原型,那么成本就会成倍增加。

当我们获得一组基本需求说明后,可以通过快速分析构造出一个小型的软件系统,以满足用户的基本要求,接着用户可在试用原型系统的过程中得到亲身感受并受到启发,以做出反应和评价,然后开发者根据用户的意见对原型加以改进。通过不断试验、纠错、使用、评价和修改,获得新的原型版本,如此周而复始,逐步减少开发者与用户沟通中的误解,从而提高最终产品的质量。

因此在建立原型系统时,经常会这样处理:原型系统仅包括未来系统的主要功能,而不包括系统的细节,例如异常处理、对非有效输入的反应等;另外,为了尽快向用户提供原型,开发原型系统应尽量使用能缩短开发周期的语言和工具。

例如,早期UNIX支持的SHELL语言是一种功能很强的高级语言,有人用这种语言来编写办公室自动化的原型系统,仅用很短的时间就完成了编码和测试,比使用其他高级语言快许多倍。虽然SHELL语言在运行时需要很大的支撑系统,运行速度也比较慢,不适合用来实现最终的系统,但用它来开发原型系统能大大加快实现速度。

从瀑布模型开始的各种模型都有一个共同点:重计划、重事先设计、重文档表达。这类方法中的集大成者要算Rational统一流程(Rational Unified Process,RUP),RUP把软件开发的各个阶段整合在一个统一的框架里。在RUP中,一个项目分为几个里程碑(milestone),每个里程碑内部有几个迭代(iteration)。需要向开发团队提供开发环境、过程和工具,并提供配置和变更管理,以更好地进行项目管理。