07-软件工程

07-软件工程(基于第7小时)

软考-系统架构设计师 | 第2篇 架构设计专业知识 出题形式:单项选择题 + 案例分析题 | 分值占比:3-6 分 教材参考:第7章


0. 考点分析

本小时主要学习软件工程、需求工程、系统分析与设计、净室软件工程、基于构件的软件工程、软件项目管理等内容。考察侧重概念知识和管理知识。根据考试大纲,本小时知识点会涉及单项选择题和下午案例分析题,约占8-15分,论文也会有涉及。

软件工程是以工程的管理方法去管理软件项目,涉及的知识点很多,是上午题和案例题的"重头戏"。像结构化和面向对象在三门考试中都会出题。


1. 核心知识点

1.1 软件工程基础

软件危机6大表现

  1. 软件开发进度难以预测
  2. 软件开发成本难以控制
  3. 软件功能难以满足用户期望
  4. 软件质量无法保证
  5. 软件难以维护
  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. 初始级
  2. 已管理级
  3. 已定义级
  4. 量化管理级(核心特征:过程性能可预测,与已定义级区别)
  5. 优化级

1.4 需求工程

软件需求3层次

  • 业务需求:组织机构或客户对系统的高层次目标
  • 用户需求:用户使用产品必须完成的任务
  • 功能需求:开发人员必须实现的软件功能

需求工程5阶段

  1. 需求获取
  2. 需求分析
  3. 形成需求规格(文档化)
  4. 需求确认与验证
  5. 需求管理

SRS(软件需求规格说明书)

  • 包含:功能需求 + 非功能需求 + 约束
  • 约束又分:设计约束 + 过程约束
  • 批准的SRS是需求开发和需求管理之间的桥梁

需求管理活动

  • 变更控制
  • 版本控制
  • 需求跟踪
  • (注意:文档管理不属于需求管理活动)

需求跟踪

  • 目的:建立与维护"需求—设计—编程—测试"之间的一致性
  • 两种方式:正向跟踪 + 逆向跟踪 = 双向跟踪
  • 工具:需求跟踪矩阵

CCB(变更控制委员会)

  • 由项目所涉及的多方成员共同组成
  • 决策机构,不是作业机构
  • 通过评审决定项目能否变更,但不提出变更方案

需求获取6步骤

  1. 开发高层的业务模型
  2. 定义项目范围和高层需求
  3. 识别用户角色和用户代表
  4. 获取具体的需求
  5. 确定目标系统的业务工作流
  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特征

  1. 可组装型:所有外部交互通过公开定义的接口
  2. 可部署性:可作为独立实体在构件平台上运行
  3. 文档化:必须完全文档化
  4. 独立性:应独立,如需其他构件服务需显示声明
  5. 标准化:必须符合某种标准化的构件模型

主流构件模型

  • Web Services模型
  • Sun EJB模型
  • 微软.NET模型

CBSE过程6步骤

  1. 系统需求概览
  2. 识别候选构件
  3. 根据发现的构件修改需求
  4. 体系结构设计
  5. 构件定制与适配
  6. 组装构件创建系统

CBSE vs 传统软件开发

  • 早期需要完整需求(识别可复用构件)
  • 早期阶段根据可利用的构件细化和修改需求
  • 架构设计完成后可能需要修改构件
  • 开发过程就是组装构件的过程(有时需要开发适配器)
  • 架构设计阶段特别重要,决定和限制了可选构件的范围

构件组装3方式

  • 顺序组装
  • 层次组装
  • 叠加组装

接口不兼容3类:参数不兼容、操作不兼容、操作不完备

  • 解决:编写适配器构件

1.9 软件项目管理

软件进度管理6过程

  1. 活动定义
  2. 活动排序
  3. 活动资源估计
  4. 活动历时估计
  5. 制定进度计划
  6. 进度控制

WBS(工作分解结构)

  • 把项目按原则分解为任务,任务再分解为工作
  • 以可交付成果为导向
  • 处于计划过程的中心

SCM(软件配置管理)

  • 标识、组织和控制修改的技术
  • 目的:使错误降为最小并最有效提高生产效率
  • 核心内容:版本控制 + 变更控制

SQA(软件质量保证)

  • 目的:使软件过程对管理人员可见
  • 主要任务:SQA审计与评审、SQA报告、处理不符合问题
  • 软件质量认证:ISO 9001 + CMM

风险管理

  • Boehm:风险估计(辨识+分析+排序)+ 风险控制(计划+处理+监督)
  • Charette:分析(辨识+估计+评价)+ 管理(计划+控制+监督)

2. 关键概念速查

概念定义/说明常见考点
瀑布模型结构化开发方法使用阶段不可并行
原型模型解决需求难一次确定抛弃型/演化型
螺旋模型快速原型+瀑布模型强调风险分析
极限编程XP测试先行敏捷方法
ScrumSprint迭代+Product Backlog侧重项目管理
FDD首席程序员+类程序员特征驱动开发
RUP用例驱动+架构中心+迭代增量4+1视图
4+1视图逻辑+实现+进程+部署+用例5种视图
CMMI 5级初始/已管理/已定义/量化/优化量化管理=可预测
SRS软件需求规格说明书功能+非功能+约束
CCB变更控制委员会决策机构非作业机构
数据流图DFD4元素:数据流/处理/存储/外部项父图子图平衡
耦合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. 高频考点

  1. 5大软件过程模型对比(5年12考):瀑布/原型/螺旋/敏捷/RUP的特征与适用场景
  2. 4+1视图对应角色:逻辑-用户、实现-程序员、进程-集成人员、部署-工程师
  3. CMMI 5级:初始→已管理→已定义→量化管理→优化(量化管理=可预测)
  4. 耦合7类型排序(从低到高):非直接<数据<标记<控制<通信<公共<内容
  5. 内聚7类型排序(从高到低):功能>顺序>通信>过程>时间>逻辑>偶然
  6. 设计原则:高内聚、低耦合
  7. 结构化编程3种基本结构:顺序+分支+循环
  8. DFD 4基本元素:数据流+处理+数据存储+外部项
  9. OOD 3类对象:实体类/控制类/边界类
  10. ORM 3框架:Hibernate(全自动)+ MyBatis(半自动)+ JDO(Java标准)
  11. 软件测试4阶段:单元(程序员自己)→集成→系统→验收
  12. 净室软件工程CSE:正确性验证而非测试
  13. CBSE 3种组装方式:顺序+层次+叠加
  14. 需求管理活动:变更控制+版本控制+需求跟踪(不含文档管理)
  15. CCB定位:决策机构不是作业机构
使用 Hugo 构建
主题 StackJimmy 设计