12-软件架构演化与维护(基于第12小时)
软考-系统架构设计师 | 第3篇 架构设计高级知识 出题形式:单项选择题 + 下午案例分析题 分值占比:约 3-5 分(选择),案例分析 25 分
0. 考点分析
本小时专注于软件架构的演化和维护,包括基本概念、演化类型、原则、评估方法和维护手段。
考试特点:
- 选择题 3-5 分(演化原则、动态/静态演化、原子操作)
- 案例分析题核心(大型网站架构演化路径、演化评估)
- 论文题高频素材(架构演化、维护管理)
1. 核心知识点
1.1 软件架构演化的重要性
- 保障软件系统具备诸多好的特性
- 有效管控软件系统的整体复杂性和变化性,降低软件检修和修改成本
- 保证软件系统演化的一致性和正确性,增加便捷性
1.2 演化和定义的关系
- 软件架构包括组件、连接件和约束三大要素
- 架构演化主要关注这三大要素的添加、修改和删除
1.3 面向对象软件架构演化过程(4 类操作)
对象演化
| 操作 | 含义 | 触发场景 |
|---|---|---|
| AO(Add Object) | 添加新对象 | 系统需要添加新功能或增加架构灵活性时 |
| DO(Delete Object) | 删除对象 | 系统需要移除现有功能或降低架构复杂度时 |
消息演化(5 种操作)
| 操作 | 含义 | 触发场景 |
|---|---|---|
| AM(Add Message) | 增添一条新消息 | 对象之间需要增加新的交互行为 |
| DM(Delete Message) | 删除当前消息 | 需要移除某交互行为 |
| SMO(Swap Message Order) | 交换两条消息的时间顺序 | 需要改变两个交互行为之间顺序 |
| OM(Overturn Message) | 反转消息的发送对象与接收对象 | 需要修改某个交互行为本身 |
| CMM(Change Message Module) | 改变消息的发送或接收对象 | 需要修改某个交互行为本身 |
复合片段演化(4 种操作)
| 操作 | 含义 | 触发场景 |
|---|---|---|
| AF(Add Fragment) | 新增复合片段 | 需要增添新的控制流 |
| DF(Delete Fragment) | 删除复合片段 | 需要移除某段控制流 |
| FTC(Fragment Type Change) | 改变复合片段类型 | 需要改变某段控制流 |
| FCC(Fragment Condition Change) | 改变复合片段内部执行条件 | 改变当前控制流的执行条件 |
约束演化
| 操作 | 含义 | 触发场景 |
|---|---|---|
| AC(Add Constraint) | 添加新约束 | 需判断当前设计是否满足新约束 |
| DC(Delete Constraint) | 移除约束 | 去除某些不必要条件 |
1.4 软件架构演化方式的分类
按演化时期分(4 类)
| 类型 | 时机 | 特点 |
|---|---|---|
| 设计时演化 | 体系结构模型与代码编译之前 | 早期阶段 |
| 运行前演化 | 编译之后、执行之前 | 中间阶段 |
| 有限制运行时演化 | 特定约束满足时 | 受限运行 |
| 运行时演化 | 运行时不能满足要求时 | 动态调整 |
记忆口诀:设计时→运行前→有限制运行时→运行时(从早到晚)
静态演化 vs 动态演化
| 维度 | 静态演化 | 动态演化 |
|---|---|---|
| 需求 | 设计时演化、运行前演化 | 软件内部执行导致架构改变、外部请求重配置 |
| 过程 | 软件理解→需求变更分析→演化计划→系统重构→系统测试 | 实时调整 |
| 动态性等级 | - | 交互动态性、结构动态性、架构动态性 |
| 演化内容 | - | 属性改名、行为变化、拓扑结构改变、风格变化 |
注意:动态演化不包括"格式变化"(考题陷阱)
静态演化的原子操作
与可维护性相关(7 种):
- AMD(Add Module Dependence)— 添加模块依赖
- RMD(Remove Module Dependence)— 移除模块依赖
- AMI(Add Module Interface)— 添加模块接口
- RMI(Remove Module Interface)— 移除模块接口
- AM(Add Module)— 添加模块
- RM(Remove Module)— 移除模块
- SM(Split Module)— 拆分模块
- AGM(Aggregate Modules)— 聚合模块
与可靠性相关(10 种):
- AMS(Add Message)— 添加消息
- RMS(Remove Message)— 移除消息
- AO(Add Object)— 添加对象
- RO(Remove Object)— 移除对象
- AF(Add Fragment)— 添加片段
- RF(Remove Fragment)— 移除片段
- CF(Change Fragment)— 改变片段
- AU(Add Use Case)— 添加用例
- RU(Remove Use Case)— 移除用例
- AA(Add Actor)— 添加参与者
- RA(Remove Actor)— 移除参与者
1.5 动态软件架构(DSA)
实现动态演化的基本原理
- 运行时刻体系结构相关信息的改变可用来触发、驱动系统自身的动态调整
DSA 描述语言(按视角分)
| 视角 | 语言 |
|---|---|
| 行为视角 | π-ADL |
| 反射视角 | Pilar |
| 协调视角 | LIME |
DSA 演化工具(4 种)
- 使用反射机制
- 基于组件操作
- 基于 π 演算
- 利用外部的体系结构演化管理器
动态软件架构应用实例 — PKUAS
- 4 种类型:容器系统、公共服务、工具和微内核
动态重配置
4 种模式:
- 主从模式
- 中央控制模式
- 客户端/服务器模式
- 分布式控制模式
应用实例:可重用、可配置的产品线架构
动态配置难点:
- 约束定义困难
- 性能约束难以静态衡量
- 难以管理所有方面
- 需同时保证组件系统完整性和重配置策略的正确和安全性
1.6 软件结构演化原则(18 大原则)
| # | 原则 | 关键点 |
|---|---|---|
| 1 | 演化成本控制 | 演化成本要控制在预期范围内 |
| 2 | 进度可控 | 架构演化要在预期时间内完成 |
| 3 | 风险可控 | 经济/时间/人力/技术/环境风险在可控范围内 |
| 4 | 主体维持 | 软件演化的平均增量增长须保持平稳,主体行为稳定 |
| 5 | 系统总体结构优化 | 演化后整体结构(布局)更加合理 |
| 6 | 平滑演化 | 软件的演化速率趋于稳定 |
| 7 | 目标一致 | 阶段目标和最终目标要一致 |
| 8 | 模块独立演化 | 各模块自身的演化最好相互独立 |
| 9 | 影响可控 | 一个模块变更给其他模块带来的影响在可控范围 |
| 10 | 复杂性可控 | 必须控制架构的复杂性 |
| 11 | 有利于重构 | 演化后软件架构便于重构 |
| 12 | 有利于重用 | 维持或提高整体架构的可重用性 |
| 13 | 设计原则遵循性 | 演化不与架构设计原则冲突 |
| 14 | 适应新技术 | 软件独立于特定技术手段,可运行于不同平台 |
| 15 | 环境适应性 | 演化后软件版本容易适应新硬件/软件环境 |
| 16 | 标准依从性 | 演化不违背相关质量标准(国际/国家/行业) |
| 17 | 质量向好 | 所关注的质量指标综合效果变更好 |
| 18 | 适应新需求 | 很容易适应新的需求变更 |
关键原则对比:
| 原则 | vs |
|---|---|
| 主体维持 | 平均增量平稳 |
| 平滑演化 | 演化速率趋于稳定 |
| 目标一致 | 阶段目标和最终目标一致 |
| 系统总体结构优化 | 整体结构布局合理 |
1.7 软件架构演化评估方法
演化过程已知的评估
- 流程:将架构度量应用到演化过程中
- 通过对演化前后的不同版本的架构分别进行度量
- 得到度量结果的差值及其变化趋势
- 计算架构间质量属性距离,对相关质量属性进行评估
演化过程未知的评估
- 教材图 12.3 展示评估过程
- 通过反向工程等技术恢复架构信息
1.8 大型网站系统架构演化实例(10 阶段)
| 阶段 | 架构 | 关键点 |
|---|---|---|
| 第一阶段 | 单体架构 | 应用程序、数据库、文件等所有资源都在一台服务器上 |
| 第二阶段 | 垂直架构 | 应用和数据分离,3 台服务器:应用、文件、数据 |
| 第三阶段 | 使用缓存改善性能 | 本地缓存 + 远程分布式缓存 |
| 第四阶段 | 使用服务集群改善并发 | 负载均衡调度服务器,分发请求到集群 |
| 第五阶段 | 数据库读写分离 | 主库写、从库读,主从复制机制同步 |
| 第六阶段 | 反向代理和 CDN 加速 | CDN 部署在网络提供商机房(距离最近);反向代理部署在中心机房 |
| 第七阶段 | 分布式文件系统和分布式数据库 | 业务分库,不同业务部署不同物理服务器 |
| 第八阶段 | 使用 NoSQL 和搜索引擎 | 解决海量数据检索 |
| 第九阶段 | 业务拆分 | 一个网站拆分成多个应用,独立部署 |
| 第十阶段 | 分布式服务 | 服务化、SOA/微服务 |
核心演化逻辑:
- 解决性能 → 缓存、集群、读写分离
- 解决高可用 → 集群、读写分离、CDN
- 解决扩展性 → 业务拆分、分布式服务
- 解决海量数据 → 分布式文件系统、NoSQL
1.9 软件架构维护
维护过程(3 大内容):
- 软件架构知识管理
- 软件架构修改管理
- 软件架构版本管理
软件架构知识管理
- 架构知识 = 架构设计 + 架构设计决策
- 含义:侧重于软件开发和实现过程所涉及的架构静态演化
- 在架构文档等信息来源中捕捉架构知识
- 提供架构的质量属性及其设计依据进行记录和评价
- 需求:防止关键的设计知识"沉没"在软件架构中
软件架构修改管理
- 主要是建立一个隔离区域
- 保障该区域中任何修改对其他部分影响最小
软件架构版本管理
- 为软件架构演化的版本演化控制、使用和评价提供可靠依据
架构可维护性度量(6 指标)
| 指标 | 缩写 |
|---|---|
| 圈复杂度 | CNN |
| 扇入扇出度 | FFC |
| 模块间耦合度 | CBO |
| 模块的响应 | RFC |
| 紧内聚度 | TCC |
| 松内聚度 | LCC |
2. 关键概念速查
| 概念 | 定义/说明 | 常见考点 |
|---|---|---|
| AO/DO | 对象的添加/删除 | 对象演化 |
| AM/DM/SMO/OM/CMM | 消息的增/删/换序/反转/改模块 | 消息演化 5 种 |
| AF/DF/FTC/FCC | 复合片段的增/删/改类型/改条件 | 复合片段演化 |
| AC/DC | 约束的添加/删除 | 约束演化 |
| 设计时演化 | 编译之前 | 4 时期最早 |
| 运行前演化 | 编译之后、执行之前 | 4 时期 |
| 有限制运行时演化 | 特定约束满足时 | 4 时期 |
| 运行时演化 | 运行时不能要求时 | 4 时期最晚 |
| 主体维持 | 平均增量平稳 | 18 原则 |
| 平滑演化 | 演化速率趋于稳定 | 18 原则 |
| 目标一致 | 阶段目标和最终目标一致 | 18 原则 |
| 系统总体结构优化 | 整体结构布局合理 | 18 原则 |
| DSA 描述语言 | π-ADL(行为)/Pilar(反射)/LIME(协调) | 3 种视角 |
| 动态重配置 4 模式 | 主从/中央控制/C-S/分布式控制 | 4 种模式 |
| 大型网站 10 阶段 | 单体→垂直→缓存→集群→读写分离→CDN→分布式→NoSQL→业务拆分→分布式服务 | 演化路径 |
| 架构维护 3 内容 | 知识/修改/版本管理 | 必考 |
| 架构可维护性 6 指标 | CNN/FFC/CBO/RFC/TCC/LCC | 缩写含义 |
3. 典型例题
例题 1(演化原则辨析)
题目:在软件系统的生命周期里,软件的演化速率趋于稳定,如相邻版本的更新率相对稳定。此描述是软件架构演化的( )原则。
- A. 主体维持
- B. 系统总体结构优化
- C. 平滑演化
- D. 目标一致
答案:C
解析:
- 主体维持:平均增量增长平稳
- 系统总体结构优化:整体结构布局合理
- 平滑演化:演化速率趋于稳定 ✓
- 目标一致:阶段目标和最终目标一致
例题 2(架构维护内容)
题目:软件架构维护过程不包括( )。
- A. 架构知识管理
- B. 架构修改管理
- C. 架构版本管理
- D. 架构构件管理
答案:D
解析:软件架构维护过程包括架构知识管理、架构修改管理、架构版本管理,不包括架构构件管理。
例题 3(演化时期辨析)
题目:下列软件架构演化时期,( )是在系统设计时规定了演化的具体条件,将系统置于"安全"模式下,演化只发生在某些特定约束满足时,可以进行一些规定好的演化操作。
- A. 设计时演化
- B. 运行前演化
- C. 有限制运行时演化
- D. 运行时演化
答案:C
解析:
- 设计时演化:编译之前
- 运行前演化:编译之后、执行之前
- 有限制运行时演化:只发生在某些特定约束满足时 ✓
- 运行时演化:运行时不能满足要求时
例题 4(动态演化内容)
题目:根据所修改的内容不同,软件的动态演化不包括( )。
- A. 属性改名
- B. 行为变化
- C. 拓扑结构改变
- D. 格式变化
答案:D
解析:动态演化的内容包括:属性改名、行为变化、拓扑结构改变、风格变化。格式变化不属于动态演化内容。
4. 高频考点
4.1 必须记住的核心要点
- 架构 3 要素:组件、连接件、约束(演化关注这 3 要素的增删改)
- 对象演化 2 种:AO、DO
- 消息演化 5 种:AM、DM、SMO、OM、CMM
- 复合片段演化 4 种:AF、DF、FTC、FCC
- 约束演化 2 种:AC、DC
- 演化 4 时期(从早到晚):设计时→运行前→有限制运行时→运行时
- 动态演化 4 内容:属性改名、行为变化、拓扑结构改变、风格变化(不含格式变化)
- DSA 描述语言 3 视角:行为(π-ADL)/反射(Pilar)/协调(LIME)
- 动态重配置 4 模式:主从/中央控制/C-S/分布式控制
- PKUAS 4 类型:容器系统、公共服务、工具、微内核
- 架构 4 大演化原则对比:
- 主体维持:平均增量平稳
- 平滑演化:演化速率稳定
- 目标一致:阶段目标和最终目标一致
- 系统总体结构优化:整体结构合理
- 大型网站 10 阶段演化路径(必考)
- 架构维护 3 内容:知识/修改/版本管理(不含构件管理)
- 可维护性 6 指标:CNN/FFC/CBO/RFC/TCC/LCC
- 架构知识 = 架构设计 + 架构设计决策
4.2 易混淆对比
| 对比项 | 区别 |
|---|---|
| AO vs AM | AO 是对象的添加,AM 是消息的添加 |
| AC vs AF | AC 是约束的添加,AF 是复合片段的添加 |
| 主体维持 vs 平滑演化 | 主体维持强调增量稳定,平滑演化强调速率稳定 |
| 目标一致 vs 系统总体结构优化 | 目标一致是目标,结构优化是布局 |
| 静态演化 vs 动态演化 | 静态是预先规划的演化,动态是运行时刻的演化 |
| 设计时 vs 运行前 | 设计时是编译之前,运行前是编译之后 |
| 双机热备 vs 服务集群 | 热备是2 台服务器,集群是多节点通过 LAN 互连 |
| 架构知识管理 vs 修改管理 | 知识管理是捕捉记录,修改管理是隔离变更 |