软件生存期模型
Created: 2024-03-05 Tue 16:42
软件生存期模型 也称为 软件过程模型 , 是从软件项目 需求定义 直至 软件 运行维护 为止, 跨越 整个生命周期 的系统 开发 、 运行 和 维护 所实施的 全部 过程 、 活动 和 任务 的 结构框架 。
在20世纪80年代之前, 瀑布模型 一直是唯一被广泛采用的 软件生存期模型 。
传统软件工程方法学的 软件过程 基本上可以用 瀑布模型 来描述。
%%{init: { 'theme': 'forest', 'fontFamily': 'Times New Roman, KaiTi' }}%%
graph LR
A["需求分析<br>--------<br>验证"] --> B["规格说明<br>--------<br>验证"]
B --> C["设计<br>--------<br>验证"]
C --> D["编码<br>--------<br>测试"]
D --> E["综合测试"]
E --> F["维护"]
Figure 1: 传统的瀑布模型
%%{init: { 'theme': 'forest', 'fontFamily': 'Times New Roman, KaiTi' }}%%
graph LR
A["需求分析<br>--------<br>验证"] --> B["规格说明<br>--------<br>验证"]
B --> A
B --> C["设计<br>--------<br>验证"]
C --> B
C --> D["编码<br>--------<br>测试"]
D --> C
D --> E["综合测试"]
E --> D
E --> F["维护"]
F .-> B
F .-> C
F .-> D
F .-> G["变化的需求<br>--------<br>验证"]
G .-> B
Figure 2: 实际的瀑布模型
%%{init: { 'theme': 'forest', 'fontFamily': 'Times New Roman, KaiTi' }}%%
graph LR
A["需求建模"] ==> B["概要设计"] ==> C["详细设计"] ==> D["编码"] ==> X(["可执行软件"])
X ==> E["单元测试"] ==> F["集成测试"] ==> G["系统测试"] ==> H["验收测试"]
E --> D
E --> C
F --> C
F --> B
G --> B
G --> A
H --> A
Figure 3: V模型
快速原型 是快速建立起来的可以在计算机上运行的程序, 它所能完成的 功能 往往是
最终产品功能 的一个 子集 。
%%{init: { 'theme': 'forest', 'fontFamily': 'Times New Roman, KaiTi' }}%%
graph LR
A["需求分析<br>--------<br>验证"] --> B["规格说明<br>--------<br>验证"]
B --> C["设计<br>--------<br>验证"]
C --> D["编码<br>--------<br>测试"]
D --> E["综合测试"]
E --> F["维护"]
F .-> B
F .-> C
F .-> D
F .-> G["变化的需求<br>--------<br>验证"]
G .-> B
Figure 4: 快速原型模型
- 有助于满足用户的 真实需求 ;
- 原型系统已经通过与用户的交互而得到 验证 ,产生的规格说明文档能够正确地描述用户需求;
- 软件产品的开发基本上是按 线性顺序 进行;
- 因规格说明文档正确描述了用户需求,后续开发过程 不会进行较大返工 ;
- 开发人员通过建立原型系统已经学到很多东西,因此,在设计和编码阶段 发生错误的可能性比较小 ;
- 快速原型的本质是 快速 ,一旦需求确定,便可抛弃原型或在原型的基础上进行开发。
增量模型 也称为 渐增模型 ,是Mills等人于1980年提出来的。 使用增量模型开发软件时,把软件产品作为一系列的 增量构件 来 设计 、 编码 、 集成 和 测试 。 每个构件由多个相互作用的模块构成,并且能够完成特定的功能。
%%{init: { 'theme': 'forest', 'fontFamily': 'Times New Roman, KaiTi' }}%%
graph LR
A["需求分析<br>--------<br>验证"] --> B["规格说明<br>--------<br>验证"]
B --> C["概要设计<br>--------<br>验证"]
C --> D["针对每个构件<br>完成详细设计、编码和集成<br>经测试后交付给用户"]
D --> D
D --> E["维护"]
E .-> D
Figure 5: 增量模型
%%{init: { 'theme': 'forest', 'fontFamily': 'Times New Roman, KaiTi' }}%%
gantt
title 软件系统
dateFormat YYYY-MM-DD
section 增量1
分析 : a1, 2022-01-01, 2d
设计 : a2, after a1, 2d
编码 : a3, after a2, 2d
测试 : after a3, 2d
section 增量2
分析 : b1, 2022-01-02, 2d
设计 : b2, after b1, 2d
编码 : b3, after b2, 2d
测试 : after b3, 2d
section 增量3
分析 : c1, 2022-01-03, 2d
设计 : c2, after c1, 2d
编码 : c3, after c2, 2d
测试 : after c3, 2d
section 增量4
分析 : d1, 2022-01-04, 2d
设计 : d2, after d1, 2d
编码 : d3, after d2, 2d
测试 : after d3, 2d
Figure 6: 增量构件开发
- 将 软件产品 分解成一系列的 增量构件 ,在 增量开发迭代 中 逐步加入 ;
- 构件 需 规模适中 ,并且新构件集成到已有软件所形成的新产品必须是 可测试 的。
采用 增量模型 比采用 瀑布模型 和 快速原型模型 更需要 精心的设计 。
螺旋模型 最初是Boehm于1988年提出来的。 该模型将 瀑布模型 与 快速原型模型 结合起来, 并且加入两种模型均忽略了的 风险分析 。
螺旋模型 的 基本思想 是, 使用原型及其他方法来尽量降低风险。
理解这种模型的一个简便方法, 是把它看作在 每个阶段 之前都增加了 风险分析过程 的 快速原型模型 。
%%{init: { 'theme': 'forest', 'fontFamily': 'Times New Roman, KaiTi' }}%%
graph LR
A["风险分析<br>--------<br>快速原型<br>--------<br>验证"] --> B["风险分析<br>--------<br>规格说明<br>--------<br>验证"]
B --> C["风险分析<br>--------<br>设计<br>--------<br>验证"]
C --> D["风险分析<br>--------<br>编码<br>--------<br>测试"]
D --> E["风险分析<br>--------<br>综合测试"]
E --> F["维护"] .-> G["风险分析<br>--------<br>变化的需求<br>--------<br>验证"]
F .-> B
F .-> C
F .-> D
G .-> B
Figure 7: 简化的螺旋模型
Figure 8: 完整的螺旋模型
在螺旋模型中, 软件过程 表示成一个 螺线 , 而不是像以往的模型那样表示为一个具有回溯的活动序列。
在螺线上的每一个 循环 表示过程的一个 阶段 。
螺线上的每一个循环可划分为 4个象限 ,分别表达了 4个方面的活动 。
Figure 9: 喷泉模型\(^{[*]}\)
喷泉模型 是典型的 面向对象生命周期模型 。 喷泉 一词体现了 迭代 和 无间隙 特性。 图中代表 不同阶段的圆圈相互重叠 , 这表示 两个活动之间存在重叠 。
名词 | 翻译 |
---|---|
Analysis | (需求)分析 |
Requirements Specification | 需求规格 |
Design | 设计 |
Coding | 编码 |
Testing and Integration | 测试与集成 |
Operation | 运行 |
Maintenance | 维护 |
Evolution | 进化(进一步开发) |
Grady Booch Ivar Jacobson James Rumbaugh
目前, 统一过程和UML广泛应用在各种各样的面向对象项目中。
Figure 10: Iterative Development
Figure 11: 统一过程模型
统一过程中有6个 核心过程工作流(Core Process Workflows) 。
统一过程中有3个 核心支持工作流(Core Supporting Workflows) 。
统一过程 有4个阶段,均以 里程碑 结束。 里程碑 意图是捕捉 项目生命周期中的点 , 这些点上可能进行重大的 管理决策 和 进展评估 。
基于构件的开发 是利用预先包装的 构件 来构造应用系统。 构件可以是 组织内部开发的 ,也可以是现有的 商业成品构件(Commercial Off-The-Shelf, COTS) 。
基于构件的软件工程(Component-Based Software Engineering, CBSE) 强调使用可复用的软件 构件 来设计和构造基于计算机的系统。
通常来讲, 构件 是计算机软件中的一个模块化的构造块。
OMG(Object Management Group) 统一建模语言规范给出的 构件 定义如下:
系统中 模块化的 、 可部署的 和 可替换的 部件 , 该部件 封装 了 实现 并 暴露 一系列 接口 。
国际上第一本软件构件专著 《构件化软件—超越面向对象编程》(Szyperski) 给出的 构件 定义如下:
一个构件是一个 组装单元 ,它具有约定式规范的 接口 ,以及明确的 依赖环境 。 构件可以被独立部署,由第三方组装。
Figure 12: 基于构件的开发模型
CBSE软件团队针对每一系统需求并不急于进行设计,而是询问如下问题。
- 现有的商业成品构件 是否能够实现该需求?
- 内部开发的可复用构件 是否能够实现该需求?
- 可用构件的接口 与待构造系统的体系结构是否相容?
团队可以试图 修改 或 去除 那些不能用 COTS 或 自有构件 实现的系统需求。 如果不能 修改 或 去除 这些需求,则必须 应用软件工程方法构造满足这些需求的新构件 。
基于构件的开发模型中, 需求分析 和 设计 建模活动开始于 识别可选构件 , 这些构件
- 有些设计成 通用的 软件 模块 ,
- 有些设计成 面向对象的 类 或 软件包 。
不考虑构件的开发技术, 基于构件的开发模型 由以下步骤组成。
2001年,以Kent Beck为首的敏捷联盟发表了 敏捷软件开发 宣言。
我们正在通过亲身实践以及帮助他人实践的方式来揭示更好的软件开发之路, 通过这项工作,我们认为:
- 个体和交互 胜过 过程和工具 ;
- 可工作软件 胜过 宽泛的文档 ;
- 客户合作 胜过 合同谈判 ;
- 响应变更 胜过 遵循计划 。
也就是说,虽然上述内容中 右边 的各项很有价值, 但我们认为 左边 的各项具有更大的价值。
Ivar Jacobson 给出以下论述:
- 敏捷团队是能够适当相应 变更 的灵活团队。 变更就是软件开发本身, 软件构建过程 有变更、 团队成员 在变更、使用新 技术 会带来变更, 各种变更都会对开发的软件产品以及项目本身造成影响。 我们必须接受 支持变更 的思想, 它应当根植于软件开发中的每一件事中, 因为它是软件的心脏与灵魂。
- 敏捷团队意识到软件是团队中所有人 共同 开发完成的, 这些人的 个人技能 和 合作能力 是项目成功的关键所在。
在 Jacobson 看来,普遍存在的 变更 是敏捷的基本动力, 软件工程师必须加快步伐以适应 Jacobson 所描述的快速变更。
从本质上讲,敏捷方法是 为了克服传统软件工程中认识和实践的弱点 而形成的。 敏捷开发可以带来多方面的好处,但它并 不适用于所有项目及产品 。 一般来说,敏捷方法更适合具有以下 特征 的软件开发项目。
敏捷联盟定义了以下 12 条敏捷原则:
并不是每一个敏捷模型都同等使用这 12 项原则, 一些模型可以选择 忽略 或 淡化 一个或多个原则的重要性。
极限编程(eXtreme Programming, XP) 是 使用最广泛的敏捷过程 , 其相关思想和方法最早出现于20世纪80年代后期, 但直到2000年Kent Beck撰写的《Extreme Programming Explained: Embrace Change》一书出版, 它才引起软件业的极大关注。
XP使用 面向对象方法 作为推荐的开发范型, 它包含了 策划 、 设计 、 编码 和 测试 4个框架活动的规则和实践。
敏捷过程模型中除了 适用最广泛的XP ,还有许多其他 敏捷过程模型 ,它们也在行业中使用。 较 普遍 的有以下几种: