07-软件工程(基于第7小时)
软考-系统架构设计师 | 第2篇 架构设计专业知识 出题形式:单项选择题 + 案例分析题 | 分值占比:3-6 分 教材参考:第7章
0. 考点分析
本小时主要学习软件工程、需求工程、系统分析与设计、净室软件工程、基于构件的软件工程、软件项目管理等内容。考察侧重概念知识和管理知识。根据考试大纲,本小时知识点会涉及单项选择题和下午案例分析题,约占8-15分,论文也会有涉及。
软件工程是以工程的管理方法去管理软件项目,涉及的知识点很多,是上午题和案例题的"重头戏"。像结构化和面向对象在三门考试中都会出题。
1. 核心知识点
1.1 软件工程基础
软件危机6大表现
- 软件开发进度难以预测
- 软件开发成本难以控制
- 软件功能难以满足用户期望
- 软件质量无法保证
- 软件难以维护
- 软件缺少适当的文档资料
软件生命周期:需求分析 → 软件设计 → 软件开发 → 运行维护 → 被淘汰
1.2 软件过程模型(5大模型)
1. 瀑布模型(Waterfall Model)
- 结构化开发方法使用
- 7阶段:需求分析→系统设计→程序设计→编码实现→单元测试→集成测试→系统测试→运行维护
- 特点:因果关系紧密相连,前一阶段输出是后一阶段输入,每个阶段伴随里程碑
- 缺点:需求难一次确定、变更代价高、结果难预见、阶段不能并行
2. 原型模型(Prototype Model)
- 快速原型,原型法使用
- 2阶段:原型开发 + 目标软件开发
- 2种类型:
- 抛弃型原型:需求确认后即丢弃,继续用瀑布模型
- 演化性原型:不断补充完善形成最终产品
3. 螺旋模型(Spiral Model)
- 在快速原型的基础上结合瀑布模型扩展而成
- 每个阶段4部分:目标设定、风险分析、开发和有效性验证、评审
- 适用:大型软件开发,强调其他模型忽视的风险分析
4. 敏捷(Agile)模型
| 敏捷方法 | 核心特征 |
|---|---|
| 极限编程(XP) | 高效、低风险、测试先行(先写测试代码,再写程序) |
| 水晶系列方法 | 不同的项目,采用不同的策略 |
| Scrum(并列争球法) | 侧重项目管理,Sprint迭代,从Product Backlog选最高优先级需求 |
| FDD(特征驱动开发) | 分首席程序员和"类"程序员 |
敏捷核心思想3点:
- 适应型而非可预测型
- 以人为本而非以过程为本
- 迭代增量式开发过程
5. RUP(Rational Unified Process)
- 重量级过程模型,构件化开发使用
- 二维软件开发模型,多个循环(Cycle),每个循环4个连续阶段:
- 初始 → 细化 → 构造 → 移交
- 9个核心工作流:业务建模、需求、分析与设计、实现、测试、部署、配置与变更管理、项目管理、环境
- 3大特点:用例驱动、以架构为中心、迭代和增量
RUP “4+1"视图模型
| 视图 | 对应角色 | 关注 | 常用UML图 |
|---|---|---|---|
| 逻辑视图 | 最终用户 | 功能性需求 | 类图、对象图、状态图、协作图 |
| 实现视图(开发视图) | 程序员 | 软件静态组织结构 | 包图、组件图 |
| 进程视图(过程视图) | 系统集成人员 | 非功能性需求(性能、可用性) | 活动图 |
| 部署视图(物理视图) | 系统工程师 | 软件到硬件的映射 | 部署图 |
| 用例视图 | 所有视图的中心 | 场景驱动 | 用例图 |
1.3 软件能力成熟度模型
CMM:概念模型,框架刚性、解释弹性
CMMI(5个成熟度等级)
- 初始级
- 已管理级
- 已定义级
- 量化管理级(核心特征:过程性能可预测,与已定义级区别)
- 优化级
1.4 需求工程
软件需求3层次
- 业务需求:组织机构或客户对系统的高层次目标
- 用户需求:用户使用产品必须完成的任务
- 功能需求:开发人员必须实现的软件功能
需求工程5阶段
- 需求获取
- 需求分析
- 形成需求规格(文档化)
- 需求确认与验证
- 需求管理
SRS(软件需求规格说明书)
- 包含:功能需求 + 非功能需求 + 约束
- 约束又分:设计约束 + 过程约束
- 批准的SRS是需求开发和需求管理之间的桥梁
需求管理活动
- 变更控制
- 版本控制
- 需求跟踪
- (注意:文档管理不属于需求管理活动)
需求跟踪
- 目的:建立与维护"需求—设计—编程—测试"之间的一致性
- 两种方式:正向跟踪 + 逆向跟踪 = 双向跟踪
- 工具:需求跟踪矩阵
CCB(变更控制委员会)
- 由项目所涉及的多方成员共同组成
- 决策机构,不是作业机构
- 通过评审决定项目能否变更,但不提出变更方案
需求获取6步骤
- 开发高层的业务模型
- 定义项目范围和高层需求
- 识别用户角色和用户代表
- 获取具体的需求
- 确定目标系统的业务工作流
- 需求整理与总结
需求获取方法:用户面谈、需求专题讨论会、问卷调查、现场观察、原型化方法、头脑风暴法
1.5 系统分析与设计
结构化方法(SASD)
结构化分析(SA)
- 主要手段:数据流图(DFD)、数据字典、结构化语言、判定表、判定树
- DFD 4种基本元素:数据流、处理/加工、数据存储、外部项
- 建模步骤:明确目标→确定系统范围→建立顶层DFD→构建第一层DFD分解图→开发DFD层次结构图→检查确认
- DFD规则:父图数据流必须在子图出现;一个处理至少一个输入流和一个输出流;一个存储必有流入流出;数据流至少一端是处理端
结构化设计(SD)
- 自顶向下、逐步求精、模块化
- 概要设计:模块划分,确定功能、接口、调用关系
- 详细设计:每个模块的实现算法、局部数据结构
模块3基本属性:功能、逻辑、状态
耦合类型(从低到高)
| 耦合类型 | 描述 |
|---|---|
| 非直接耦合 | 两模块无直接关系 |
| 数据耦合 | 借助参数表传递简单数据 |
| 标记耦合 | 通过参数表传递记录等复杂信息 |
| 控制耦合 | 传递的信息中包含用于控制模块内部逻辑的信息 |
| 通信耦合 | 共享输入或输出 |
| 公共耦合 | 多个模块访问同一公共数据环境 |
| 内容耦合 | 直接访问另一个模块的内部数据(最高,最差) |
内聚类型(从高到低)
| 内聚类型 | 描述 |
|---|---|
| 功能内聚 | 各个部分协同完成单一功能,缺一不可(最高) |
| 顺序内聚 | 处理元素相关,必须顺序执行 |
| 通信内聚 | 集中在一个数据结构区域上 |
| 过程内聚 | 处理元素相关,按特定次序执行 |
| 时间内聚 | 所包含任务必须在同一时间间隔内执行 |
| 逻辑内聚 | 完成逻辑上相关的一组任务 |
| 偶然内聚 | 完成一组无关系或松散关系的任务(最低) |
设计原则:高内聚、低耦合
结构化编程(SP)
- 3种基本控制结构:顺序、分支、循环
- 通过这3种结构可构造任何单入口单出口程序
- 强调:自顶向下、逐步细化、清晰第一、效率第二
面向对象方法
OOA(面向对象分析)
- 模型5层次:主题层、对象类层、结构层、属性层、服务层
- 模型5活动:标识对象类、标识结构、定义主题、定义属性、定义服务
- 基本原则:抽象、封装、继承、分类、聚合、关联、消息通信、粒度控制、行为分析
- 5个基本步骤:确定对象和类、确定结构、确定主题、确定属性、确定方法
OOD(面向对象设计)
- 类3种类型:
- 实体类:名词,永久性需要存储(如教师、学生)
- 控制类:控制用例工作(如登录验证)
- 边界类:封装用例内外流动的信息(如窗口、通信协议、接口)
OOP(面向对象程序设计)
- 基本特点:封装、继承、多态
- 继承4类:取代继承、包含继承、受限继承、特化继承
- 多态:同一操作作用于不同对象产生不同结果
数据持久化与ORM
- 持久层(Persistence Layer)专注于实现数据持久化
- 对象/关系映射(ORM)
- 主流框架:
- Hibernate:全自动ORM,跨数据库平台
- MyBatis/iBatis:半自动,手写SQL,可结合特定数据库优化
- JDO(Java Data Object):Java标准,支持关系数据库+普通文件+XML+对象数据库
软件重用2类型
- 水平式重用:不同应用领域中的软件元素(如标准函数库)
- 垂直式重用:共性应用领域间的软部件(如区块链)
逆向工程
- 通过分析已有程序,寻求比源代码更高级的抽象表现形式
- 设计恢复:逆向工程得出的设计,不一定抽象还原到原设计
- 重构:在同一抽象层级中转换系统描述
- 重构工程:对逆向工程形成的系统进行修改或重构生成的新版本
- 信息恢复4级:实现级 < 结构级 < 功能级 < 领域级(难度递增,工具支持递减)
1.6 软件测试
测试目的
- 确认软件以正确方式做了用户期望的事情
- 尽量多地发现漏洞,但不能保证发现所有
测试分类
| 分类维度 | 类型 |
|---|---|
| 程序执行状态 | 静态测试ST、动态测试DT |
| 关注实现和内部结构 | 黑盒测试、白盒测试、灰盒测试 |
| 程序执行方式 | 人工测试MT、自动化测试AT |
| 阶段划分 | 单元测试、集成测试、系统测试、验收测试 |
4阶段测试对比
| 阶段 | 测试对象 | 实施者 | 方法 |
|---|---|---|---|
| 单元测试 | 模块 | 程序员自己 | 白盒静态(静态分析、代码审查)或自动化动态 |
| 集成测试 | 组装模块 | 测试人员 | 白盒+黑盒结合 |
| 系统测试 | 完整系统 | 测试人员 | 检查是否符合SRS |
| 验收测试 | 完整系统 | 用户 | 确认系统满足用户需求 |
系统测试内容:功能测试、性能测试、健壮性测试、安全性测试
1.7 净室软件工程(CSE)
- Cleanroom Software Engineering
- 在软件开发过程中强调在软件中建立正确性的需要
- 理论基础:函数理论 + 抽样理论
- 使用盒子结构规约进行分析和设计建模
- 强调将正确性验证(而不是测试)作为发现和消除错误的主要机制
- 缺点:太理论化、忽视测试、带有传统软件工程的弊端
1.8 基于构件的软件工程(CBSE)
构件5特征
- 可组装型:所有外部交互通过公开定义的接口
- 可部署性:可作为独立实体在构件平台上运行
- 文档化:必须完全文档化
- 独立性:应独立,如需其他构件服务需显示声明
- 标准化:必须符合某种标准化的构件模型
主流构件模型
- Web Services模型
- Sun EJB模型
- 微软.NET模型
CBSE过程6步骤
- 系统需求概览
- 识别候选构件
- 根据发现的构件修改需求
- 体系结构设计
- 构件定制与适配
- 组装构件创建系统
CBSE vs 传统软件开发
- 早期需要完整需求(识别可复用构件)
- 早期阶段根据可利用的构件细化和修改需求
- 架构设计完成后可能需要修改构件
- 开发过程就是组装构件的过程(有时需要开发适配器)
- 架构设计阶段特别重要,决定和限制了可选构件的范围
构件组装3方式
- 顺序组装
- 层次组装
- 叠加组装
接口不兼容3类:参数不兼容、操作不兼容、操作不完备
- 解决:编写适配器构件
1.9 软件项目管理
软件进度管理6过程
- 活动定义
- 活动排序
- 活动资源估计
- 活动历时估计
- 制定进度计划
- 进度控制
WBS(工作分解结构)
- 把项目按原则分解为任务,任务再分解为工作
- 以可交付成果为导向
- 处于计划过程的中心
SCM(软件配置管理)
- 标识、组织和控制修改的技术
- 目的:使错误降为最小并最有效提高生产效率
- 核心内容:版本控制 + 变更控制
SQA(软件质量保证)
- 目的:使软件过程对管理人员可见
- 主要任务:SQA审计与评审、SQA报告、处理不符合问题
- 软件质量认证:ISO 9001 + CMM
风险管理
- Boehm:风险估计(辨识+分析+排序)+ 风险控制(计划+处理+监督)
- Charette:分析(辨识+估计+评价)+ 管理(计划+控制+监督)
2. 关键概念速查
| 概念 | 定义/说明 | 常见考点 |
|---|---|---|
| 瀑布模型 | 结构化开发方法使用 | 阶段不可并行 |
| 原型模型 | 解决需求难一次确定 | 抛弃型/演化型 |
| 螺旋模型 | 快速原型+瀑布模型 | 强调风险分析 |
| 极限编程XP | 测试先行 | 敏捷方法 |
| Scrum | Sprint迭代+Product Backlog | 侧重项目管理 |
| FDD | 首席程序员+类程序员 | 特征驱动开发 |
| RUP | 用例驱动+架构中心+迭代增量 | 4+1视图 |
| 4+1视图 | 逻辑+实现+进程+部署+用例 | 5种视图 |
| CMMI 5级 | 初始/已管理/已定义/量化/优化 | 量化管理=可预测 |
| SRS | 软件需求规格说明书 | 功能+非功能+约束 |
| CCB | 变更控制委员会 | 决策机构非作业机构 |
| 数据流图DFD | 4元素:数据流/处理/存储/外部项 | 父图子图平衡 |
| 耦合7类 | 非直接→数据→标记→控制→通信→公共→内容 | 低到高 |
| 内聚7类 | 功能→顺序→通信→过程→时间→逻辑→偶然 | 高到低 |
| OOD 3类 | 实体类/控制类/边界类 | 学生/登录验证/窗口 |
| ORM | 对象关系映射 | Hibernate+MyBatis+JDO |
| 单元测试 | 程序员自己,白盒静态 | 模块级 |
| CSE净室 | 正确性验证而非测试 | 盒子结构规约 |
| CBSE | 构件化软件工程 | Web Services/EJB/.NET |
| WBS | 工作分解结构 | 以可交付成果为导向 |
| SCM | 软件配置管理 | 版本控制+变更控制 |
3. 典型例题
题目1:螺旋模型基础
题目:螺旋模型在( )的基础上扩展而成。 A.瀑布模型 B.原型模型 C.快速模型 D.面向对象模型
答案:B
解析:螺旋模型是在原型模型(快速原型)的基础上结合瀑布模型扩展而成,强调其他模型忽视的风险分析。
题目2:敏捷方法识别
题目:(1)适用于程序开发人员在地域上分布很广的开发团队。(2)中,编程开发人员分成首席程序员和"类"程序员。 (1)A.水晶系列(Crystal)开发方法 B.开放式源码(Open Source)开发方法 C.Scrum开发方法 D.功用驱动开发方法(FDD) (2)A.自适应软件开发(ASD) B.极限编程(XP)开发方法 C.开放系统—过程开发方法(OpenUP) D.功用驱动开发方法(FDD)
答案:B D
解析:
- 开放式源码项目特点是程序开发人员在地域上分布很广,一般敏捷方法都强调项目组成员在同一地点工作。
- FDD(功用驱动开发方法)将编程开发人员分成首席程序员和"类"程序员两类,首席程序员是最有经验的开发人员。
题目3:需求管理活动
题目:需求管理是一个对系统需求变更、了解和控制的过程。以下活动中,( )不属于需求管理的主要活动。 A.文档管理 B.需求跟踪 C.版本控制 D.变更控制
答案:A
解析:需求管理的主要活动包括变更控制、版本控制、需求跟踪等。文档管理不属于需求管理的主要活动。
题目4:结构化编程基本结构
题目:结构化程序设计采用自顶向下、逐步求精及模块化的程序设计方法,通过( )三种基本的控制结构可以构造出任何单入口单出口的程序。 A.顺序、选择和嵌套 B.顺序、分支和循环 C.分支、并发和循环 D.跳转、选择和并发
答案:B
解析:结构化程序设计通过顺序、分支(选择)和循环三种基本的控制结构可以构造出任何单入口单出口的程序。这三种结构是Dijkstra提出的结构化定理的核心。
4. 高频考点
- 5大软件过程模型对比(5年12考):瀑布/原型/螺旋/敏捷/RUP的特征与适用场景
- 4+1视图对应角色:逻辑-用户、实现-程序员、进程-集成人员、部署-工程师
- CMMI 5级:初始→已管理→已定义→量化管理→优化(量化管理=可预测)
- 耦合7类型排序(从低到高):非直接<数据<标记<控制<通信<公共<内容
- 内聚7类型排序(从高到低):功能>顺序>通信>过程>时间>逻辑>偶然
- 设计原则:高内聚、低耦合
- 结构化编程3种基本结构:顺序+分支+循环
- DFD 4基本元素:数据流+处理+数据存储+外部项
- OOD 3类对象:实体类/控制类/边界类
- ORM 3框架:Hibernate(全自动)+ MyBatis(半自动)+ JDO(Java标准)
- 软件测试4阶段:单元(程序员自己)→集成→系统→验收
- 净室软件工程CSE:正确性验证而非测试
- CBSE 3种组装方式:顺序+层次+叠加
- 需求管理活动:变更控制+版本控制+需求跟踪(不含文档管理)
- CCB定位:决策机构不是作业机构