第1章 软件工程的基本概念与原理 1
1.1 软件工程学科的诞生 1
1.1.1 软件及其特点 1
1.1.2 软件生产的发展 2
1.1.3 软件危机 3
1.1.4 软件工程的诞生 5
1.2 软件工程的基本概念和原理 6
1.2.1 软件工程的定义 6
1.2.2 软件工程面临的主要问题 6
1.2.3 软件工程的目标 6
1.2.4 软件生存周期 7
1.2.5 软件工程的基本原理 9
1.3 软件工程研究的主要内容 10
1.3.1 软件开发过程 10
1.3.2 软件工程技术 10
1.3.3 软件项目管理 11
1.3.4 计算机辅助软件工程 11
本章小结 11
习题 12
第2章 软件开发过程 13
2.1 软件过程 13
2.1.1 软件过程概念及理论基础 13
2.1.2 软件过程讨论的主要内容 13
2.2 常见的软件过程模型 14
2.2.1 边改边做模型 14
2.2.2 瀑布模型 14
2.2.3 演化模型 16
2.2.4 增量迭代模型 19
2.2.5 喷泉模型 20
2.3 软件过程的新发展 21
2.3.1 敏捷过程与极限编程 21
2.3.2 统一过程模型RUP 24
2.3.3 软件过程改进与CMM 27
本章小结 32
习题 33
第3章 软件项目管理 34
3.1 软件项目管理概述 34
3.1.1 软件生产的特殊性 34
3.1.2 软件项目管理的重要性 34
3.1.3 软件项目管理的主要内容 35
3.2 软件规模估算 35
3.2.1 代码行技术 35
3.2.2 功能点技术 36
3.2.3 估算方法 37
3.3 软件项目工作量估算 38
3.3.1 静态单变量模型 38
3.3.2 动态多变量模型&. 39
3.3.3 COCOMO2模型 39
3.4 软件项目进度控制 41
3.4.1 估算开发时间 41
3.4.2 Gantt图 41
3.4.3 工程网络 42
3.4.4 工程进度估算 43
3.4.5 关键路径 44
3.4.6 机动时间 44
3.5 软件项目人员组织 45
3.5.1 民主制程序员组 45
3.5.2 主程序员组 46
3.5.3 现代程序员组 47
3.6 软件质量保证 49
3.6.1 软件质量 49
3.6.2 软件质量保证措施 49
3.7 软件配置管理 51
3.7.1 软件配置 51
3.7.2 软件配置管理过程 52
本章小结 53
思考题 54
第4章 软件项目可行性分析与初步计划 55
4.1 可行性分析的任务 55
4.2 可行性分析的步骤 56
4.2.1 审查系统规模和目标 56
4.2.2 调查目前正在使用的系统 56
4.2.3 导出新系统的高层逻辑模型 57
4.2.4 导出和评价供选择的方案 57
4.2.5 推荐行动方针 57
4.2.6 草拟项目计划 58
4.2.7 编写文档提交审查 58
4.3 系统流程图 58
4.3.1 基本符号 59
4.3.2 绘制方法 60
4.4 数据流图 60
4.4.1 基本符号 61
4.4.2 绘制方法 61
4.4.3 数据流图的用途 62
4.5 成本/效益分析 63
4.5.1 成本估算 63
4.5.2 成本/效益分析的方法 64
4.6 可行性分析报告 66
4.6.1 主要内容 66
4.6.2 参考格式 66
本章小结 67
思考题 68
综合题 68
第5章 需求分析 69
5.1 需求分析概述 69
5.1.1 需求分析的任务 69
5.1.2 人员组织 70
5.1.3 分析师的角色 70
5.1.4 需求分析的活动和原则 70
5.2 结构化分析方法 72
5.2.1 结构化分析的概念 72
5.2.2 细化数据流图 73
5.2.3 实例 75
5.3 数据流程图的绘制 76
5.3.1 数据流图的布局 76
5.3.2 符号的组合应用 76
5.3.3 避免线条交叉 77
5.3.4 抽象数据流的应用 77
5.3.5 编号规则 78
5.3.6 命名规则 78
5.3.7 父图与子图的平衡 78
5.4 编制数据字典 79
5.4.1 定义数据的方法 79
5.4.2 数据字典的内容及格式 80
5.5 加工逻辑的分析与表达 81
5.5.1 结构式语言 81
5.5.2 策略表 82
5.5.3 策略树 83
5.5.4 层次方框图 83
5.5.5 Warnier图 84
5.5.6 IPO图 85
5.6 软件需求验证与评审 85
5.6.1 从哪些方面验证软件需求 85
5.6.2 验证软件需求的方法 86
5.6.3 软件需求评审 86
本章小结 86
思考题 87
第6章 总体设计 88
6.1 总体设计的过程 88
6.1.1 方案设计 89
6.1.2 软件结构设计 91
6.1.3 数据库设计 93
6.1.4 制定测试计划 93
6.1.5 书写文档 93
6.1.6 审查和复审 94
6.2 设计原理 94
6.2.1 模块化 94
6.2.2 抽象 95
6.2.3 逐步求精 95
6.2.4 信息隐藏和局部化 95
6.2.5 模块独立性 96
6.3 启发性设计原则 100
6.3.1 改进软件结构,提高模块独立性 100
6.3.2 模块规模应该适中 100
6.3.3 深度、宽度、扇出和扇入都应适当 100
6.3.4 模块的作用域应该在控制域之内 101
6.3.5 力争降低模块接口的复杂程度 102
6.3.6 设计单入口单出口的模块 102
6.3.7 模块功能应该可以预测 102
6.4 描绘软件结构的图形工具 102
6.4.1 层次图和HIPO图 102
6.4.2 结构图 103
6.5 面向数据流的设计方法 104
6.5.1 面向数据流的设计原理 104
6.5.2 变换分析 105
6.5.3 事务分析 106
6.5.4 结构优化 107
6.5.5 设计过程 107
6.6 实例 107
6.6.1 确定变换中心 107
6.6.2 确定主控制模块,产生第一张结构图 108
6.6.3 分解与优化 109
6.6.4 一个抽象的例子 110
本章小结 112
思考题 112
第7章 详细设计 113
7.1 代码设计 113
7.2 数据库设计 115
7.2.1 数据库设计的相关概念 115
7.2.2 数据库设计的任务 116
7.2.3 概念模型 116
7.2.4 概念模型到数据模型的转换策略 118
7.3 规范化理论 119
7.3.1 规范化的概念 119
7.3.2 非规范化形式 119
7.3.3 第一范式 120
7.3.4 第二范式 121
7.3.5 第三范式 121
7.3.6 实例 121
7.4 数据库设计实例 123
7.4.1 数据库设计的步骤 123
7.4.2 实例 123
7.5 系统平台设计 125
7.5.1 计算机处理方式 125
7.5.2 软硬件选择 125
7.5.3 网络设计 125
7.5.4 系统环境的配置 125
7.6 对话设计 126
7.6.1 对话设计的原则 126
7.6.2 对话设计的基本类型 126
7.7 输入/输出设计 126
7.7.1 输出设计 126
7.7.2 输入设计 127
7.8 处理过程设计 128
7.8.1 盒图(N-S图) 128
7.8.2 问题分析图(PAD图) 129
7.9 编写系统设计说明书 129
本章小结 129
思考题 130
第8章 软件实现 131
8.1 软件实现综述 131
8.1.1 软件开发环境 131
8.1.2 软件开发工具 131
8.1.3 关于编程与测试 132
8.2 编程 132
8.2.1 编程语言 132
8.2.2 编码风格 133
8.3 软件测试基础 136
8.3.1 软件测试的目标 136
8.3.2 软件测试准则 136
8.3.3 测试方法 138
8.3.4 测试步骤 140
8.3.5 测试阶段的信息流 141
8.4 单元测试 142
8.4.1 测试重点 142
8.4.2 代码审查 143
8.4.3 计算机测试 144
8.5 集成测试 145
8.5.1 自顶向下集成 146
8.5.2 自底向上集成 147
8.5.3 不同集成测试策略的比较 147
8.5.4 回归测试 148
8.6 确认测试 148
8.6.1 确认测试概述 149
8.6.2 软件配置复查 149
8.6.3 Alpha和Beta测试 149
8.7 白盒测试技术 150
8.7.1 概述 150
8.7.2 逻辑覆盖 150
8.7.3 控制结构覆盖 154
8.8 黑盒测试技术 158
8.8.1 概述 158
8.8.2 等价类划分 158
8.8.3 边界值分析 160
8.8.4 错误推测 161
8.9 调试 161
8.9.1 调试过程 161
8.9.2 调试途径 162
8.10 软件可靠性 164
8.10.1 基本概念 164
8.10.2 估算平均无故障时间的方法 165
本章小结 166
思考题 167
第9章 软件维护 168
9.1 软件维护的内容 168
9.2 软件维护的特点 169
9.2.1 非结构化维护和结构化维护 169
9.2.2 软件维护的困难性 169
9.2.3 软件维护的费用 170
9.3 软件维护的实施 170
9.3.1 维护的组织 171
9.3.2 维护的流程 171
9.3.3 维护技术 174
9.3.4 维护的副作用 174
9.4 软件的可维护性 175
9.4.1 可维护性定义 176
9.4.2 可维护性的度量 176
9.4.3 提高可维护性的方法 176
本章小结 179
思考题 179
第10章 从结构化到面向对象 180
10.1 方法论的形成与发展 180
10.1.1 软件工程追求的目标和要解决的主要问题 180
10.1.2 软件工程方法论的形成 180
10.1.3 什么是方法论 181
10.1.4 为什么要研究方法论 182
10.1.5 有哪些方法论 182
10.2 结构化方法的缺陷与面向对象的优势 184
10.2.1 传统的和结构化的方法存在的问题 184
10.2.2 面向对象的优势 185
10.3 面向对象的基本概念 188
10.3.1 对象与类 188
10.3.2 消息与责任 190
10.3.3 操作与方法 191
10.3.4 继承与多态 191
10.3.5 封装与接口 192
10.4 UML 192
10.4.1 概述 193
10.4.2 UML模型的基本内容 193
10.4.3 UML的语义扩展 194
10.4.4 模型的组织结构 195
10.5 UML提供的常用图 196
10.5.1 Use Case图 196
10.5.2 类图 196
10.5.3 序列图 201
10.5.4 协作图 202
10.5.5 状态图 202
10.5.6 活动图 203
10.6 面向对象的建模过程 204
10.6.1 过程框架与迭代策略 204
10.6.2 模型演进 204
本章小结 208
思考题 209
第11章 面向对象的需求获取 210
11.1 用例图 210
11.1.1 用例 210
11.1.2 角色 211
11.1.3 关系 211
11.2 活动图 212
11.3 状态图 213
11.4 获取需求活动 214
11.4.1 建立描述用户业务的用例模型 214
11.4.2 演化出目标系统用例模型 216
11.4.3 构造用户界面原型 216
11.5 实例 217
11.5.1 实例描述 217
11.5.2 描述局部功能需求的Use Case报告 218
本章小结 220
思考题 221
第12章 面向对象的分析与设计 222
12.1 全局分析 222
12.1.1 选用构架模式 223
12.1.2 识别关键抽象 223
12.1.3 标识“分析机制” 224
12.1.4 选定分析局部 225
12.2 局部分析 227
12.2.1 提取分析类 227
12.2.2 转述需求场景 230
12.2.3 整理分析类 236
12.3 全局设计 239
12.3.1 确定核心元素 240
12.3.2 引入外围元素 242
12.3.3 优化(模型)组织结构 249
12.4 局部设计 250
12.4.1 实现需求场景 250
12.4.2 实现子系统接口 254
12.5 细节设计 255
12.5.1 精化属性与操作 255
12.5.2 明确类之间的关系 257
本章小结 259
思考题 259
第13章 面向对象的测试 260
13.1 面向对象测试的特点 260
13.2 面向对象的测试策略 261
13.3 测试阶段性成果 262
13.4 测试人员职责分工 263
13.5 测试步骤 264
13.5.1 制定测试计划 264
13.5.2 设计测试用例 264
13.5.3 测试构件的实现 265
13.5.4 执行集成测试 265
13.5.5 执行系统测试 266
13.5.6 评估测试 266
本章小结 266
思考题 267
附录A 软件工程职业道德规范和实践要求 268
附录B 参考教学计划 274
附录C 试题样卷 277
参考文献 278