CHARLIE SAYS

查理如是说
DATE 2026-08-24
THEME
SERIES / ENGINEERING / P-127 · 软件工程方法论

软件工程 007:传统模式:软件开发生命周期与过程模型(瀑布模型,原型

软件开发生命周期

来源于百度百科:软件生命周期(Software Life Cycle,SLC)是软件的产生直到报废或停止使用的生命周期。软件生命周期内有问题定义、可行性分析、总体描述、系统设计、编码、调试和测试、验收与运行、维护升级到废弃等阶段,也有将以上阶段的活动组合在内的迭代阶段,即迭代作为生命周期的阶段。

软件生命周期又称为软件生存周期或系统开发生命周期,是软件的产生直到报废的生命周期,周期内有问题定义、可行性分析、总体描述、系统设计、编码、调试和测试、验收与运行、维护升级到废弃等阶段。这种按时间分程的思想方法是软件工程中的一种思想原则,即按部就班、逐步推进,每个阶段都要有定义、工作、审查、形成文档以供交流或备查,以提高软件的质量。但随着新的面向对象的设计方法和技术的成熟,软件生命周期设计方法的指导意义正在逐步减少。

软件生命周期的六个阶段

整体流程如下:

flowchart LR
    A[问题的定义和规划] --> B[需求分析]
    B --> C[软件设计开发]
    C --> D[软件编码]
    D --> E[软件测试]
    E --> F[运行维护]

问题的定义和规划

这一阶段是软件开发方和需求方共同讨论,目的是确定软件开发的目的和可行性,制定项目总体开发计划。其实就是完成一个初步需求。

需求分析

在确定软件开发可行的前提下,对软件需要实现的各个功能进行详细分析,完成 PRD 文档(产品需求文档),并提交产品部、开发部、测试部评审。这里,我们需要注意到一点:同样的需求在软件开发过程中会不断变化和深入,此时我们便需要制定需求变更计划来应对这种变化,以保证整个项目的正常进行。需求文档通过评审之后,技术部制定技术文档,并进行技术评审,评审通过进行软件开发。

软件设计开发

这个阶段主要是根据需求分析的结果,对整个软件系统进行设计,包括系统结构的设计、数据库的设计等等。软件设计又被分为详细设计和概要设计:

  • 概要设计:主要是对整个软件架构的实现,搭建架构,表述各个模块的功能,设计模块接口连接以及数据传递的实现等事务
  • 详细设计:对概要设计中表述的各模块进行详细分析,包括了对数据库的设计

软件编码

这一阶段是将软件设计开发的结构转化为计算机可以运行的代码。在编码中要制定统一、符合标准的编写规范,以保证代码的可读性、易维护性,提高代码的效率。完成模块的编码后提交测试。

软件测试

软件设计完成之后,软件需要经过严密的测试,以发现整个软件设计过程中存在的问题并加以改正。测试的方法主要有白盒测试和黑盒测试。这里我们要注意,测试之前需要制定详细的测试计划文档,并且严格按照测试计划文档进行测试,以减少测试的随意性。测试的过程主要有单元测试、集成测试、系统测试以及验收测试:

  • 单元测试:主要进行程序代码的测试,确保各单元模块被正确编译,比如有具体到模块的测试,也有具体到类、函数、方法的测试等。其实就可以理解为测试软件的每个零件,这一部分通常由开发人员来完成,一般通过白盒测试的方法进行,也就是看代码的方式
  • 集成测试:完成单元测试之后,将各个单元连接起来,形成完整的体系,然后测试软件单位之间的接口是否正确,数据是否正常传递。这一阶段也可以叫做接口测试,由测试人员完成,一般使用灰盒测试的方法
  • 系统测试:把软件系统搭建起来,按照软件规格说明中的要求,测试软件的性能、功能是否和用户需求相符合,测试软件在系统运行中是否存在漏洞等。在这个阶段就是测试整个软件系统:功能、界面、性能、安全性、易用性、兼容性等等。需要测试这个产品的详细功能,冒烟测试一般也在这个阶段完成
  • 验收测试:这一测试是在用户拿到软件之后,在其使用现场,根据前边提出的需求以及产品规格说明书来做相应的测试,这一测试是确定软件是否符合原定效果的测试

运行维护

软件维护是软件生命周期中持续时间最长的阶段。在软件开发完成并投入使用之后,由于多方面的原因,软件不能继续满足用户的需求,这时如果要延续软件的寿命,就必须对软件进行维护。软件的维护包括纠错性维护和改进型维护。

常见模型

那么如何将上述软件开发过程方法化呢?这就是过程模型。过程模型(Process Models)意图解决软件过程中的混乱,将软件开发过程中的沟通、计划、建模、构建和部署等活动(activities)有效地组织了起来。它们之间的线性(linear)、迭代(iterative)、演进(evolutionary)和平行(parallel)关系会产生不同的模型。

常见的过程模型包括:瀑布模型、原型模型、增量模型、螺旋模型等(结合软件测试在不同阶段的实现,又演化出侧重测试的软件测试模型,包括 V 模型、W 模型、H 模型、X 模型等,见下一篇)。

瀑布模型

瀑布模型(Waterfall Model)是最早出现的软件开发模型,是传统软件开发方法的代表,在软件工程中占有重要的地位,它提供了软件开发的基本框架。1970 年温斯顿·罗伊斯(Winston Royce)提出了著名的”瀑布模型”,直到 80 年代早期,它一直是唯一被广泛采用的软件开发模型。

瀑布模型将软件生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,并且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落:

flowchart TD
    A[制定计划] --> B[需求分析]
    B --> C[软件设计]
    C --> D[程序编写]
    D --> E[软件测试]
    E --> F[运行维护]

瀑布模型严格强调文档,前一个阶段的输出就是下一个阶段的输入,文档是各阶段衔接的唯一信息。所以很多开发人员好像是在开发文档,而不是开发软件,因为要到开发的后期,才可以看到软件的”模样”。

优点:

  • 让软件开发过程有序可控,为项目提供了按阶段划分的检查点。瀑布模型的每个阶段都有明确的任务,每个阶段都有明确的交付产物,都有相应的里程碑。这些让整个过程更可控,而且能及早发现问题
  • 当前一阶段完成后,您只需要去关注后续阶段
  • 它提供了一个模板,这个模板使得分析、设计、编码、测试和支持的方法可以在该模板下有一个共同的指导
  • 让分工协作变成可能。瀑布模型的六个阶段,也让软件开发产生相应的基础分工:项目经理、产品经理、架构师、软件工程师、测试工程师、运维工程师
  • 质量有保障。瀑布模型每个阶段都需要交付相应的文档,而文档的撰写和评审,可以帮助在动手之前把问题沟通清楚、想清楚。瀑布模型在编码结束后,会有严密的测试,只有测试验收通过后,才能上线发布,这些措施都让软件的质量更有保障

缺点:

  • 各个阶段的划分完全固定,阶段之间产生大量的文档,极大地增加了工作量
  • 由于开发模型是线性的,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发风险
  • 没有迭代与反馈。瀑布模型对反馈没有涉及,所以对变化的客户需求非常不容易适应,瀑布就意味着没有回头路
  • 通过过多的强制完成日期和里程碑来跟踪各个项目阶段

总的来说,瀑布模型的突出缺点是不适应用户需求的变化。它是一种软件文档的开发,把开发者变成流水线上的机器,大量重复性的工作让编程人员提不起兴趣,工作很枯燥,没有激情,编程成了一种没有创意的机械劳动。虽然现在瀑布模型已经不是最主流的开发模式,但是不管什么软件项目,不管采用什么开发模式,有四种活动是必不可少的,那就是需求、设计、编码和测试,而这四项活动都起源自瀑布模型,也是瀑布模型中核心的部分。管理人员喜欢瀑布模型的原因是把文档理解为开发的速度,可以方便地界定不同阶段的里程碑。

原型模型

快速原型模型(Rapid Prototype Model)又称原型模型,它是增量模型的另一种形式;它是在开发真实系统之前,构造一个原型,在该原型的基础上,逐渐完成整个系统的开发工作。

由于种种原因,在需求分析阶段得到完全、一致、准确、合理的需求说明是很困难的。快速原型是利用原型辅助软件开发的一种新思想:经过简单快速分析,快速实现一个原型,用户与开发者在试用原型过程中加强通信与反馈,通过反复评价和改进原型,减少误解,弥补漏洞,适应变化,最终提高软件质量。

基本步骤:

flowchart LR
    A[简单快速分析] --> B[快速实现原型]
    B --> C[用户试用原型]
    C --> D[评价与反馈]
    D -->|修改原型| B
    D -->|满足需求| E[在此原型基础上开发真实系统]

优点:

  • 原型系统已经通过与用户交互而得到验证,克服瀑布模型的缺点,据此产生的规格说明可以正确地描述用户的需求。因此,在开发过程的后续阶段不会因为发现了规格说明文档的错误而进行较大的返工
  • 开发人员通过建立原型系统已经学到了许多东西(至少知道了”系统不应该做什么,以及怎么不去做不该做的事情”),因此,在设计和编码阶段发生错误的可能性也比较小,这自然减少了在后续阶段需要改正前面阶段所犯错误的可能性

缺点:

  • 快速建立起来的系统结构加上连续的修改可能会导致产品质量低下,因此不适合大型系统的开发(适合开发小型的、灵活性高的系统)
  • 使用这个模型的前提是要有一个展示性的产品原型,因此在一定程度上可能会限制开发人员的创新
  • 所选用的原型(开发技术和工具)不一定符合主流的发展
  • 快速原型模型是不带反馈环的,软件产品的开发基本上是按线性顺序进行的

现在很多互联网企业提供了各式各样的原型设计工具,例如:Mockplus、Balsamiq、Axure 等。

螺旋模型

螺旋模型(Spiral Model)是巴利·玻姆(Barry Boehm)于 1988 年 5 月在他的文章《一种螺旋式的软件开发与强化模型》中提出的。它兼顾了快速原型的迭代的特征以及瀑布模型的系统化与严格监控,强调了其他模型所忽视的风险分析,特别适合于大型复杂的系统。螺旋模型最大的特点在于引入了其他模型不具备的风险分析,使软件在无法排除重大风险时有机会停止,以减小损失。同时,在每个迭代阶段构建原型是螺旋模型用以减小风险的途径。

螺旋模型采用一种周期性的方法来进行系统开发,这会导致开发出众多的中间版本。使用它,项目经理在早期就能够为客户实证某些概念。该模型是快速原型法,以进化的开发方式为中心,在每个项目阶段使用瀑布模型法。这种模型的每一个周期都包括 4 个阶段,由这 4 个阶段进行迭代:

flowchart LR
    A[需求定义] --> B[风险分析]
    B --> C[工程实现]
    C --> D[评审]
    D -->|进入下一周期| A

软件开发过程每迭代一次,软件开发又前进一个层次。

优点:

  • 通过原型的创建,使软件开发在每个迭代的最初明确方向
  • 通过风险分析,最大程度地降低软件彻底失败造成损失的可能性
  • 在每个迭代阶段植入软件测试,使每个阶段的质量得到保证
  • 整体过程具备很高的灵活性,在开发过程的任何阶段自由应对变化
  • 每个迭代阶段累计开发成本,使支出状况容易掌握
  • 通过对用户反馈的采集,与用户沟通,以保证用户需求的最大实现

缺点:

  • 过分依赖风险分析经验与技术,一旦在风险分析过程中出现偏差将造成重大损失
  • 过于灵活的开发过程不利于已经签署合同的客户与开发者之间的协调
  • 由于只适用大型软件,过大的风险管理支出会影响客户的最终收益

螺旋模型很大程度上是一种风险驱动的方法体系,因为在每个阶段之前及经常发生的循环之前,都必须首先进行风险评估。在需求不明确的情况下,适合用螺旋模型进行开发,便于风险控制和需求变更。

增量模型

增量模型(Incremental Model)融合了瀑布模型的基本成分(重复应用)和原型实现的迭代特征,该模型采用随着日程时间的进展而交错的线性序列,每一个线性序列产生软件的一个可发布的”增量”。产品被分解为多个组件,每个组件都是单独设计和构建的,各个构件完成后逐渐并入已有的软件体系结构中。

当使用增量模型时,第 1 个增量往往是核心的产品,即第 1 个增量实现了基本的需求,但很多补充的特征还没有发布。客户对每一个增量的使用和评估都作为下一个增量发布的新特征和功能,这个过程在每一个增量发布后不断重复,直到产生了最终的完善产品。增量模型强调每一个增量均发布一个可操作的产品。

在增量模型中,每个迭代阶段都得到开发,因此每个阶段都将经历软件开发生命周期的要求、设计、编码,最后是测试模块。每个阶段开发的功能都将添加到以前开发的功能上,在软件完全开发之前,该功能将重复。在每个增量阶段,都会进行审查,根据审查,下一阶段的决定将作出。

增量模型与原型实现模型和其他演化方法一样,本质上是迭代的,但与原型实现不一样的是其强调每一个增量均发布一个可操作产品。早期的增量是最终产品的”可拆卸”版本,但提供了为用户服务的功能,并且为用户提供了评估的平台。

增量模型的特点是引进了增量包的概念,无须等到所有需求都出来,只要某个需求的增量包出来即可进行开发。虽然某个增量包可能还需要进一步适应客户的需求并且更改,但只要这个增量包足够小,其影响对整个项目来说是可以承受的。增量模型的特征:

  • 系统被分解成许多小型开发项目
  • 部分系统是为了生成最终系统而构建的
  • 首先满足最高优先级要求
  • 一旦开发递增部分,部分的需求将被冻结

优点:

  • 人员分配灵活,刚开始不用投入大量人力资源。如果核心产品很受欢迎,则可增加人力实现下一个增量。因此,增量能够有计划地管理技术风险
  • 每次迭代后,应执行回归测试。在此测试期间,可以快速识别软件的故障元素,因为在任何单个迭代中很少进行更改
  • 测试和调试比其他类型的软件开发方法更容易,因为每次迭代时所做的更改相对较小。这允许对整个产品中的每个元素进行更有针对性的、更严格的测试
  • 客户可以响应功能并查看产品,以了解任何需要或有用的更改
  • 增量模型的灵活性可以使其适应这种变化的能力大大优于瀑布模型和快速原型模型

缺点:

  • 由于各个构件是逐渐并入已有的软件体系结构中的,所以加入构件必须不破坏已构造好的系统部分,这需要软件具备开放式的体系结构
  • 在开发过程中,需求的变化是不可避免的。很容易退化为边做边改模型,从而使软件过程的控制失去整体性
  • 如果增量包之间存在相交的情况且未很好处理,则必须做全盘系统分析
  • 随着产品增加了其他功能,可能会出现与系统体系结构相关的问题,而早期原型中并不明显
  • 由增量产生的成本可能会超过组织的成本

PS:增量理念也用于敏捷流程模型。

模型对比

模型核心思想优点缺点适用场景
瀑布模型线性顺序、阶段固定过程有序可控、分工明确、质量有保障无法适应需求变化、文档量大、风险后置需求明确且稳定的项目
原型模型先构造原型再开发真实系统尽早验证需求、减少返工连续修改导致质量低下、限制创新小型、灵活性高的系统
螺旋模型迭代 + 风险分析风险可控、灵活性高依赖风险分析经验、管理成本高大型复杂系统
增量模型分批交付可操作的增量人员分配灵活、风险分散、可尽早交付需要开放式体系结构、易退化为边做边改核心功能可优先剥离的项目

参考文章

常见模型内容主要来源于(略有调整):

系列导航

← 设计模式 007:原型模式(Prototype) 目录 Java 基础 007:异常机制详解 →
← 返回文章列表