软考-05-软件工程.

3 阅读12分钟

软件工程

本模块涵盖软件工程概述、开发模型、开发方法、系统分析与设计、系统测试、系统维护与质量保证、项目管理等核心知识点。


一、软件工程概述

1.1 软件危机与软件工程

软件危机:在计算机软件的开发和维护过程中所遇到的一系列严重问题。

软件危机的表现:

  • 软件开发成本和进度估计不准确
  • 用户对已完成系统不满意
  • 软件质量不可靠
  • 软件不可维护
  • 软件成本逐年上升
  • 软件开发生产率提高速度跟不上需求增长

软件工程

  • 定义:将系统化的、规范化的、可量化的方法应用于软件的开发、运行和维护
  • 三要素:方法工具过程

1.2 软件生命周期

软件产品从概念形成到退役的整个过程。

主要阶段:

阶段主要任务产出物
可行性分析技术、经济、法律可行性可行性研究报告
需求分析确定系统功能和非功能需求需求规格说明书(SRS)
概要设计系统架构设计、模块划分概要设计说明书
详细设计模块内部算法和数据结构设计详细设计说明书
编码编写程序代码源代码
测试发现并修复缺陷测试报告
维护改正性、适应性、完善性、预防性维护维护报告

二、软件开发模型

2.1 瀑布模型

特点

  • 线性顺序执行,阶段间有因果关系
  • 每个阶段有明确的输入和输出
  • 文档驱动

优点

  • 阶段清晰,易于管理
  • 文档完整

缺点

  • 缺乏灵活性,难以适应需求变化
  • 风险暴露较晚

适用:需求明确、变化少的项目

2.2 增量模型

特点

  • 将系统分解为多个增量构件
  • 每个增量都经历完整的开发过程
  • 分批交付

优点

  • 早期获得部分功能
  • 降低开发风险
  • 适应需求变化

适用:需求较明确,但希望尽早交付部分功能的项目

2.3 演化模型(原型模型)

特点

  • 快速构建原型
  • 用户反馈,逐步完善
  • 迭代开发

类型

  • 探索型原型:明确需求
  • 实验型原型:验证方案可行性
  • 演化型原型:逐步演化为最终产品

适用:需求不明确的项目

2.4 螺旋模型

特点

  • 结合瀑布模型和原型模型
  • 引入风险分析
  • 每圈螺旋都是一个完整的开发周期

四个象限

  1. 制定计划
  2. 风险分析
  3. 实施工程
  4. 客户评估

优点

  • 强调风险分析
  • 支持用户早期参与

缺点

  • 风险分析成本高
  • 依赖风险评估能力

适用:大型、复杂、高风险项目

2.5 喷泉模型

特点

  • 面向对象开发
  • 迭代、无间隙
  • 各阶段相互重叠、反复迭代

适用:面向对象的软件开发

2.6 统一过程(RUP)

特点

  • 用例驱动
  • 架构为中心
  • 迭代和增量

四个阶段

  1. 初始:确定项目范围和目标
  2. 细化:分析问题域,建立架构基础
  3. 构建:开发剩余构件
  4. 移交:交付给用户

核心工作流

  • 6个核心过程工作流(业务建模、需求、分析设计、实现、测试、部署)
  • 3个核心支持工作流(配置与变更管理、项目管理、环境)

2.7 敏捷开发

核心价值观(敏捷宣言)

  • 个体和互动 高于 流程和工具
  • 可工作的软件 高于 详尽的文档
  • 客户合作 高于 合同谈判
  • 响应变化 高于 遵循计划

常见方法:

方法特点
极限编程(XP)测试驱动开发、结对编程、持续集成、重构
Scrum迭代冲刺(Sprint)、每日站会、产品待办列表
水晶方法根据项目规模调整方法
特征驱动开发(FDD)以特征为单位进行开发
自适应软件开发(ASD)预测、协作、学习
开放式源码开源社区协作开发

三、开发方法

3.1 结构化方法

特点

  • 自顶向下,逐步求精
  • 模块化设计
  • 面向数据流

核心

  • 结构化分析(SA):数据流图(DFD)、数据字典(DD)
  • 结构化设计(SD):模块结构图、概要设计
  • 结构化程序设计(SP):顺序、选择、循环

缺点

  • 难以适应需求变化
  • 对复杂系统建模能力不足

3.2 面向对象方法

特点

  • 以对象为基本单位
  • 封装、继承、多态
  • 更好的复用性和可维护性

主要方法

  • OMT(对象建模技术)
  • Booch方法
  • OOSE(面向对象软件工程)
  • UML(统一建模语言)

3.3 原型法

特点

  • 快速构建原型
  • 用户参与评价
  • 逐步完善

分类

  • 抛弃式原型:原型仅用于明确需求,最终抛弃
  • 演化式原型:原型逐步演化为最终系统

3.4 Jackson方法

特点

  • 面向数据结构
  • 从数据结构导出程序结构
  • 适合数据处理类系统

四、系统分析与设计

4.1 需求分析

需求分类:

类型说明示例
功能需求系统必须完成的功能用户登录、数据查询
非功能需求系统属性约束性能、安全性、可靠性
设计约束限制条件使用特定技术、平台

需求获取方法:

  • 用户访谈
  • 问卷调查
  • 现场观察
  • 原型法
  • 头脑风暴
  • 联合应用开发(JAD)

需求分析工具:

  • 数据流图(DFD)
  • 数据字典(DD)
  • 判定表/判定树
  • 状态转换图(STD)
  • 用例图

4.2 系统设计

设计原则:

  • 模块化:高内聚、低耦合
  • 抽象:隐藏细节,暴露接口
  • 逐步求精:自顶向下细化
  • 信息隐藏:封装实现细节

内聚类型(由高到低):

内聚类型说明评分
功能内聚模块完成单一功能最高
顺序内聚模块内元素顺序执行
通信内聚模块内元素操作同一数据
过程内聚模块内元素按特定步骤执行
时间内聚模块内元素同时执行
逻辑内聚模块内元素逻辑相似
偶然内聚模块内元素无关联最低

耦合类型(由低到高):

耦合类型说明评分
非直接耦合模块间无直接关系最低
数据耦合模块间通过参数传递基本数据
标记耦合模块间通过参数传递数据结构
控制耦合模块间通过控制标志交互
外部耦合模块间通过外部变量交互
公共耦合模块间通过全局变量交互
内容耦合一个模块直接访问另一个模块内部最高

设计目标:高内聚、低耦合

4.3 结构化设计

变换型数据流

  • 传入路径 → 变换中心 → 传出路径
  • 映射为:输入模块、变换模块、输出模块

事务型数据流

  • 事务中心根据输入选择执行路径
  • 映射为:事务中心模块、事务处理模块

4.4 面向对象设计

设计原则(SOLID):

  • Single Responsibility Principle:单一职责原则
  • Open/Close Principle:开闭原则
  • Liskov Substitution Principle:里氏替换原则
  • Interface Segregation Principle:接口隔离原则
  • Dependency Inversion Principle:依赖倒置原则

五、系统测试

5.1 测试原则

  • 测试是为了发现错误,而不是证明正确
  • 测试应尽早进行
  • 测试应由独立的第三方进行
  • 测试用例应包括合理和不合理的输入
  • 充分注意测试中的群集现象
  • 严格执行测试计划,排除随意性
  • 对每一个测试结果做全面检查
  • 妥善保存测试计划、用例、出错统计和最终分析报告

5.2 测试分类

按测试阶段:

阶段测试对象目的
单元测试模块/函数验证模块功能正确
集成测试模块组合验证模块间接口
系统测试完整系统验证系统满足需求
验收测试最终产品用户确认系统可用

按测试方法:

方法特点说明
静态测试不执行代码代码审查、走查、桌面检查
动态测试执行代码黑盒测试、白盒测试

黑盒测试(功能测试):

方法说明
等价类划分将输入划分为等价类,每类选一个代表
边界值分析测试边界值及边界附近的值
错误推测法凭经验推测可能的错误
因果图法分析输入条件组合
判定表驱动用判定表表示条件和动作
正交试验法用正交表设计测试用例
功能图法用功能图描述程序功能
场景法模拟用户场景

白盒测试(结构测试):

覆盖标准说明覆盖程度
语句覆盖每条语句至少执行一次最低
判定覆盖(分支覆盖)每个判定的真假分支都执行较低
条件覆盖每个条件的各种可能值都满足
判定/条件覆盖同时满足判定覆盖和条件覆盖较高
条件组合覆盖每个判定中条件的各种组合都出现
路径覆盖每条可能的路径都执行最高

McCabe复杂度(环路复杂度):

V(G) = E - N + 2P
  • E:边数
  • N:节点数
  • P:连通分量数(通常为1)

其他测试类型:

  • 回归测试:修改后重新测试,确保未引入新错误
  • 冒烟测试:验证基本功能是否正常
  • 性能测试:负载测试、压力测试、容量测试
  • 安全测试:发现安全漏洞
  • 兼容性测试:不同环境测试
  • 易用性测试:用户体验测试

5.3 调试

调试方法:

  • 试探法
  • 回溯法
  • 对分查找法
  • 归纳法
  • 演绎法

六、系统维护与质量保证

6.1 软件维护类型

类型目的占比
改正性维护修复发现的错误约20%
适应性维护适应环境变化约25%
完善性维护改进功能和性能约50%
预防性维护预防潜在问题约5%

维护副作用:

  • 修改代码的副作用
  • 修改数据的副作用
  • 修改文档的副作用

6.2 软件质量

ISO/IEC 9126质量模型:

特性子特性
功能性适合性、准确性、互操作性、安全性、功能依从性
可靠性成熟性、容错性、易恢复性、可靠性依从性
易用性易理解性、易学性、易操作性、吸引性、易用性依从性
效率时间特性、资源利用性、效率依从性
维护性易分析性、易改变性、稳定性、易测试性、维护性依从性
可移植性适应性、易安装性、共存性、易替换性、可移植性依从性

McCall质量模型:

  • 产品运行:正确性、可靠性、效率、完整性、实用性
  • 产品修改:可维护性、灵活性、可测试性
  • 产品转移:可移植性、可复用性、互操作性

6.3 软件可靠性

可靠性指标:

  • 平均失效间隔时间(MTBF)
  • 平均修复时间(MTTR)
  • 平均无故障时间(MTTF)

可靠性模型:

  • 失效时间模型
  • 缺陷计数模型

七、软件项目管理

7.1 项目管理知识领域

领域说明
范围管理确定和控制项目范围
时间管理进度计划和控制
成本管理成本估算和预算控制
质量管理质量计划、保证和控制
人力资源管理团队组建和管理
沟通管理信息分发和沟通
风险管理风险识别、分析、应对
采购管理采购计划和管理
集成管理项目整体协调

7.2 进度管理

工作分解结构(WBS)

  • 将项目分解为可管理的工作包
  • 自顶向下分解

网络图:

  • 双代号网络图(AOA):箭线表示活动,节点表示事件
  • 单代号网络图(AON):节点表示活动,箭线表示依赖

关键路径法(CPM):

  • 关键路径:网络图中最长的路径
  • 关键路径上的活动为关键活动
  • 关键路径长度决定项目最短工期
  • 关键活动的总时差为0

计划评审技术(PERT):

期望时间 = (乐观时间 + 4×最可能时间 + 悲观时间) / 6
方差 = ((悲观时间 - 乐观时间) / 6

甘特图

  • 横轴表示时间
  • 纵轴表示活动
  • 直观显示活动进度

7.3 成本管理

成本估算方法:

  • 专家判断
  • 类比估算
  • 参数估算
  • 自下而上估算
  • 三点估算

挣值分析:

指标公式说明
PV(计划值)计划完成工作的预算成本
EV(挣值)实际完成工作的预算成本
AC(实际成本)实际完成工作的实际成本
SV(进度偏差)SV = EV - PV>0 进度超前
CV(成本偏差)CV = EV - AC>0 成本节约
SPI(进度绩效指数)SPI = EV / PV>1 进度超前
CPI(成本绩效指数)CPI = EV / AC>1 成本节约
ETC(完工尚需估算)ETC = (BAC - EV) / CPI
EAC(完工估算)EAC = AC + ETC

7.4 风险管理

风险分类:

  • 项目风险:预算、进度、人员等
  • 技术风险:设计、实现、接口等
  • 商业风险:市场、策略、销售等

风险管理过程:

  1. 风险识别
  2. 风险分析(定性、定量)
  3. 风险应对计划
  4. 风险监控

风险应对策略:

  • 规避:消除风险源
  • 转移:将风险转移给第三方
  • 减轻:降低风险概率或影响
  • 接受:接受风险后果

章节要点回顾

  1. 软件生命周期:掌握各阶段的任务和产出物
  2. 开发模型:理解瀑布、增量、原型、螺旋、喷泉、RUP、敏捷等模型的特点和适用场景
  3. 开发方法:理解结构化、面向对象、原型法、Jackson方法的特点
  4. 需求分析:掌握需求分类和获取方法
  5. 系统设计:理解高内聚、低耦合原则,掌握内聚和耦合的分类
  6. 系统测试:掌握测试原则、分类,黑盒和白盒测试方法
  7. 软件维护:掌握四种维护类型的特点和占比
  8. 软件质量:了解ISO/IEC 9126质量模型
  9. 项目管理:掌握WBS、关键路径、PERT、挣值分析等方法