《系统架构设计师》第5章 软件工程基础知识 系统总结
本章是架构师考试的核心模块之一,分值占比约12-19分(综合知识),案例分析题也频繁涉及。以下按教材原章节结构逐节梳理。
5.1 软件工程概述
核心概念
| 概念 | 要点 |
|---|---|
| 软件工程定义 | 将系统化、规范化、可量化的方法应用于软件开发、运行和维护,并对这些方法进行研究 |
| 软件工程三要素 | 方法、工具、过程(教材原话,高频考点) |
| 核心目标 | 在给定时间/成本内,交付具有正确性、可靠性、可维护性等质量属性的产品 |
软件生命周期
软件从产生到废弃的全过程,标准划分为六个阶段:
- 可行性分析与计划- 确定项目是否值得做
- 需求分析- 确定"做什么",产出《需求规格说明书》
- 设计阶段- 概要设计(架构设计)+ 详细设计
- 编码实现- 代码编写
- 测试- 验证质量
- 运行与维护- 交付后持续活动
理解记忆:“可需设编测维”(口诀:可惜设备测绘)
常见考查形式
- 选择题:软件工程三要素判断(注意:文档是产物,不是核心要素)
- 选择题:生命周期各阶段任务对应
5.2 软件过程模型(软件开发模型)
这是极高频率考点,每年必考,必须熟练掌握各模型的特点、适用场景和优缺点。
5.2.1 瀑布模型
| 维度 | 内容 |
|---|---|
| 核心特征 | 线性顺序、阶段依赖性、文档驱动、需求冻结 |
| 优点 | 流程清晰、易于管理、里程碑明确 |
| 缺点 | 需求变化适应差、风险滞后(测试阶段才发现问题代价巨大) |
| 适用场景 | 需求明确且稳定的项目(如军工、航天、二次开发) |
5.2.2 原型模型
| 维度 | 内容 |
|---|---|
| 核心特征 | 快速构建原型、用户演示反馈、逐步明确需求 |
| 分类 | 快速原型(抛弃型)、演化原型(演进为最终产品) |
| 适用场景 | 需求不明确、模糊的项目 |
5.2.3 螺旋模型
| 维度 | 内容 |
|---|---|
| 核心特征 | 迭代 +风险驱动,每轮包含四个象限:计划→风险分析→工程→评估 |
| 优点 | 强调风险分析,适合大型高风险项目 |
| 缺点 | 风险分析需要专门技术,成本高 |
5.2.4 增量模型 vs 迭代模型
| 模型 | 特点 | 比喻 |
|---|---|---|
| 增量模型 | 分块开发、分块交付,每个增量是完整可运行产品 | 拼图:一块块增加 |
| 迭代模型 | 反复精化,每轮完成完整开发循环,功能由少到多 | 升级:一遍遍优化 |
5.2.5 敏捷模型
敏捷宣言核心价值观:
- 个体和交互 > 过程和工具
- 可工作的软件 > 面面俱到的文档
- 客户合作 > 合同谈判
- 响应变化 > 遵循计划
主要敏捷方法:
| 方法 | 核心实践 | 侧重点 |
|---|---|---|
| XP(极限编程) | TDD(测试驱动开发)、结对编程、持续集成、重构 | 工程实践、代码技术 |
| Scrum | Product Backlog、Sprint(冲刺)、每日站会、评审/回顾会 | 项目管理流程 |
| FDD(特性驱动开发) | 5个核心过程,定义6种角色 | 人+过程+技术 |
适用场景:需求多变、需要快速适应市场的项目(互联网产品)
5.2.6 统一过程模型(RUP)
| 维度 | 内容 |
|---|---|
| 核心特征 | 用例驱动、以架构为中心、迭代增量 |
| 四个阶段 | 初始阶段(确定范围)→ 细化阶段(确立架构)→ 构造阶段(产品构建)→ 移交阶段(交付部署) |
| 4+1视图 | 逻辑视图、开发视图、过程视图、物理视图 + 场景(用例视图) |
高频考点:4+1视图各视图的关注点(选择题)
- 逻辑视图:功能、类、对象
- 开发视图:代码组织、模块、包、分层
- 过程视图:并发、线程、性能
- 物理视图:硬件部署、拓扑结构
- 场景:驱动、验证
5.2.7 喷泉模型
面向对象的软件过程模型,具有迭代性和无间隙性,各阶段重叠,支持复用。
5.2.8 净室软件工程
基于数学理论(函数理论)和抽样理论,追求零缺陷或接近零缺陷,强调正确性验证而非传统模块测试。
缺点:理论性强、数学要求高、正确性验证耗时、普通工程师需要加强训练。
5.2.9 基于构件的软件工程(CBSE)
| 维度 | 内容 |
|---|---|
| 核心理念 | “购买而不是重新构造”,强调通过可复用构件组装系统 |
| 构件特征 | 可组装性、可部署性、文档化、独立性、标准化(5个特征) |
| 组装方式 | 顺序组装、层次组装、叠加组装 |
| 主要活动 | 需求概览→识别候选构件→修改需求→架构设计→构件定制适配→组装创建系统 |
5.2.10 形式化方法模型
建立在严格数学基础上的软件开发方法,主要活动是生成计算机软件形式化的数学规格说明。
高频考点速查表
| 模型名称 | 核心关键词(看到这些词就选它) | 适用场景 |
|---|---|---|
| 瀑布模型 | 线性、文档驱动、需求冻结 | 需求明确、二次开发 |
| 原型模型 | 快速原型、用户参与、抛弃/演化 | 需求不明确 |
| 螺旋模型 | 风险分析(最重要关键词) | 大型、复杂、高风险 |
| 增量模型 | 拼图、分批交付、第一个可运行 | 需尽早使用系统 |
| RUP | 用例驱动、架构中心、4阶段 | 复杂企业级应用 |
| XP | 结对编程、TDD、重构 | 需求模糊、小团队 |
| Scrum | 冲刺、Backlog、站会 | 需求模糊、管理聚焦 |
常见考查形式
- 选择题:给场景判断最适合的开发模型(每年必考)
- 案例分析题:项目陷入困境,分析问题原因并给出改进建议
考试技巧:看到“风险”关键词 → 选螺旋模型;看到“需求明确” → 选瀑布;看到“需求多变、小步快跑” → 选敏捷/Scrum
5.3 需求工程
核心概念
需求工程是一系列与需求相关的活动,核心目标是明确“软件要做什么”。
需求分类(高频考点)
| 需求类型 | 定义 | 示例 |
|---|---|---|
| 功能需求 | 系统“做什么”的具体功能 | 用户登录、数据导出Excel |
| 非功能需求 | “做得怎么样”的质量约束 | 响应时间≤2秒、年停机≤8小时 |
| 约束需求 | 技术选型、环境等限制 | 必须基于Java开发 |
易错点:非功能需求包括性能、安全性、可靠性、可用性、可维护性、可移植性
需求工程核心活动
- 需求获取:访谈、问卷调查、原型法、观察
- 需求分析:建模(用例图、数据流图等),消除歧义
- 需求规格说明:编写SRS(软件需求规格说明书)
- 需求验证:评审、原型验证,确认完整性、一致性
- 需求变更管理:流程:申请→评审→批准→实施→验证
- 需求追踪:建立RTM(需求追踪矩阵),关联需求、设计、测试用例
需求分析建模方法
| 方法 | 核心工具 | 特点 |
|---|---|---|
| 结构化分析 | DFD(数据流图)、数据字典、ERD、STD | 数据流程驱动 |
| 面向对象分析(OOA) | 用例图、类图、活动图、序列图 | 对象驱动 |
常见考查形式
- 选择题:判断功能需求vs非功能需求
- 案例分析题:需求变更处理流程
5.4 软件设计
设计基本原则
| 原则 | 核心含义 |
|---|---|
| 抽象 | 忽略细节,关注本质特征 |
| 模块化 | 系统分解为高内聚、低耦合的模块 |
| 信息隐藏 | 模块内部细节对外不可见 |
| 高内聚低耦合 | 内聚:模块内部元素关联度;耦合:模块间依赖程度 |
高内聚类型(由低到高):偶然内聚→逻辑内聚→时间内聚→过程内聚→通信内聚→顺序内聚→功能内聚(最佳)
低耦合类型(由低到高):无直接耦合→数据耦合→标记耦合→控制耦合→外部耦合→公共耦合→内容耦合(最差)
SOLID原则(面向对象设计)
| 缩写 | 原则 | 核心含义 |
|---|---|---|
| S | 单一职责原则 | 一个类只负责一项职责 |
| O | 开闭原则 | 对扩展开放,对修改关闭 |
| L | 里氏替换原则 | 子类必须能替换父类 |
| I | 接口隔离原则 | 多个专门接口优于一个总接口 |
| D | 依赖倒置原则 | 依赖抽象(接口),而非具体实现 |
记忆口诀:“S-单职,O-开闭,L-里替,I-隔离,D-倒置”
结构化设计 vs 面向对象设计
| 维度 | 结构化设计 | 面向对象设计 |
|---|---|---|
| 核心 | 功能分解、数据流 | 对象交互、封装/继承/多态 |
| 表示工具 | DFD、结构化流程图 | UML(类图、序列图、组件图等) |
常见考查形式
- 选择题:判断高内聚低耦合类型、SOLID原则理解
- 案例分析题:给出类图,分析设计问题
5.5 软件测试
测试级别(从低到高)
| 测试级别 | 测试对象 | 测试依据 | 常用方法 |
|---|---|---|---|
| 单元测试 | 单个模块/类 | 详细设计 | 白盒测试 |
| 集成测试 | 模块间接口 | 概要设计 | 自顶向下/自底向上/三明治/一次性 |
| 系统测试 | 完整系统 | 需求规格 | 黑盒测试(性能、安全、压力) |
| 验收测试 | 用户验收 | 合同/需求 | α测试(开发方现场)、β测试(用户现场) |
记忆技巧:单元→集成→系统→验收,依次对应:详设→概设→需求→合同
测试方法
| 方法 | 特点 | 典型技术 |
|---|---|---|
| 白盒测试 | 清楚内部逻辑,针对代码结构 | 逻辑覆盖、路径覆盖 |
| 黑盒测试 | 不考虑内部实现,针对功能 | 等价类划分、边界值分析、因果图 |
软件维护类型
| 类型 | 定义 |
|---|---|
| 改正性维护 | 修复错误(bug修复) |
| 适应性维护 | 适应外部环境变化(如OS升级) |
| 完善性维护 | 扩充功能或改善性能 |
| 预防性维护 | 为未来可维护性做修改 |
高频考点:给场景判断维护类型
常见考查形式
- 选择题:测试方法判断、维护类型判断
- 案例分析题:测试策略设计
5.6 基于构件的软件工程
本节核心内容已在5.2.9中涵盖,补充以下要点:
构件定义与特征
构件是一个独立分发和部署的单元,通过接口对外提供服务。
三个必须记住的特征:
- 自包含与独立性:可独立部署
- 不可拆分的部署单元:作为整体安装
- 没有外部可见状态:外部黑盒,通过接口交互
构件组装类型
- 顺序组装:构件按顺序调用
- 层次组装:构件形成层次结构
- 叠加组装:在已有构件上叠加新功能
常见考查形式
- 选择题:构件特征判断
- 案例分析题:构件复用方案
5.7 软件项目管理
核心管理领域
| 管理领域 | 核心内容 |
|---|---|
| 进度管理 | WBS、PERT/CPM、Gantt图 |
| 配置管理 | 版本控制、变更控制、配置审计 |
| 质量管理 | 质量计划、质量保证、质量控制 |
| 风险管理 | 识别、分析、应对、监控 |
进度管理关键计算(PERT)
三点估算法公式:
关键路径法(CPM):
- 关键路径:项目中最长的路径(决定总工期)
- 总时差 = 关键路径工期 - 包含该作业的路径工期
- 总时差 = 该作业可以延迟而不影响总工期的时间
软件能力成熟度模型(CMMI)
| 等级 | 名称 | 特征 |
|---|---|---|
| 1级 | 初始级 | 过程无序,依赖个人能力 |
| 2级 | 已管理级 | 过程为项目服务,有基本规范 |
| 3级 | 已定义级 | 过程为组织服务,标准化 |
| 4级 | 定量管理级 | 过程可度量、可监控 |
| 5级 | 优化级 | 持续改进,数据驱动 |
记忆口诀:“初重定管优”(初级→重复→定义→管理→优化)
常见考查形式
- 选择题:CMMI等级判断、关键路径计算
- 案例分析题:项目延误分析、配置管理问题
附:本章应试要点汇总
考试频率分布
| 章节内容 | 分值占比 |
|---|---|
| 软件工程整体 | 12-19分(综合知识) |
| 其中:开发模型 | 2-3分 |
| 需求工程 | 约2分 |
| 系统分析与设计 | 2-3分 |
案例题高频命题角度
- 项目陷入困境:需求不明确却用瀑布模型 → 建议改用敏捷/原型
- 架构质量问题:用4+1视图分析架构合理性
- 测试策略:根据项目特点设计测试方案
论文题可能主题
- “论敏捷开发在××项目中的应用”
- “软件架构设计与软件质量保证”
- “论软件过程改进”
理解与记忆方法汇总
| 内容 | 记忆方法 |
|---|---|
| 开发模型选择 | 口诀+场景对应表 |
| 软件生命周期 | “可需设编测维” |
| 4+1视图 | 功能→逻辑,代码→开发,并发→过程,硬件→物理 |
| CMMI等级 | “初重定管优” |
| 测试级别 | 单元测代码(详设),集成测接口(概设),确认测需求,系统测环境 |
| α/β测试 | α在A(开发者现场),β拜拜(用户现场) |
易错点提醒
- ❌ 文档是软件工程核心要素 → ✅ 三要素是:方法、工具、过程
- ❌ 敏捷开发无文档 → ✅ 敏捷是“轻文档”不是“无文档”
- ❌ 非功能需求不重要 → ✅ 架构师最应关注非功能需求
- ❌ 增量模型=迭代模型 → ✅ 增量是加法,迭代是升级
- ❌ α测试在用户现场 → ✅ α在开发方,β在用户方