第一章 软件危机和软件工程 1
1.1 计算机系统的发展简史 1
前言 1
1.2 软件危机 2
1.2.1 什么是软件危机 2
1.2.2 产生软件危机的原因 3
1.2.3 解决软件危机的途径 6
1.3 软件工程 7
1.3.2 可行性研究 8
1.3.1 问题定义 8
1.3.3 要求分析 9
1.3.4 一般设计 9
1.3.5 详细设计 10
1.3.6 编码和单元测试 10
1.3.7 综合测试 10
1.3.8 软件维护 10
1.4 技术审查和管理复审 11
1.4.1 必须进行审查和复审 11
1.4.2 技术审查的标准和审查小组的组成 12
1.4.3 技术审查过程 13
1.5 小结 14
第二章 问题定义和可行性研究 15
2.1 问题定义 15
2.2 可行性研究的任务 16
2.3 可行性研究的步骤 16
2.3.4 重新定义问题 17
2.3.3 导出新系统的高层逻辑模型 17
2.3.2 研究目前正在使用的系统 17
2.3.1 复查系统规模和目标 17
2.3.5 导出和评价供选择的解法 18
2.3.6 推荐行动方针 18
2.3.7 草拟开发计划 18
2.3.8 书写文档提交审查 19
2.4 系统流程图 19
2.4.1 符号 20
2.4.2 例子 21
2.4.3 分层 21
2.5 数据流图 22
2.4.4 用途 22
2.5.1 符号 23
2.5.2 例子 24
2.5.3 用途 27
2.6 数据字典 28
2.6.1 数据字典的内容 29
2.6.2 定义数据的方法 29
2.6.4 数据字典的实现 30
2.6.3 数据字典的用途 30
2.7.成本/效益分析 31
2.7.1 成本估计 32
2.7.2 成本/效益分析的方法 33
2.8 小结 35
第三章 要求分析 36
3.1 要求分析的任务 36
3.1.1 确定对系统的综合要求 36
3.1.4 修正系统开发计划 37
3.1.5 开发模型系统 37
3.1.2 分析系统的数据要求 37
3.1.3 导出系统的逻辑模型 37
3.2 分析过程 38
3.2.1 沿数据流图回溯 39
3.2.2 用户复查 39
3.2.3 细化数据流图 40
3.2.4 修正开发计划 40
3.3 图形工具 41
3.3.1 层次方框图 41
3.2.6 审查和复审 41
3.2.5 书写文档 41
3.3.2 Warnier图 42
3.3.3 IPO图 43
3.4 超高级语言 44
3.4.1 Shell语言的命令表 45
3.4.2 Shell变量 45
3.4.3 Shell语言的条件结构 46
3.4.4 Shell语言的循环结构 47
3.5 软件工具和对软件要求的验证 48
3.6 小结 49
4.1.1 设想供选择的方案 51
4.1.2 选取合理的方案 51
第四章 一般设计 51
4.1 一般设计的过程 51
4.1.3 推荐最佳方案 52
4.1.4 功能分解 52
4.1.5 设计软件结构 52
4.1.6 数据库设计 52
4.1.9 审查和复审 53
4.2.1 模块化 53
4.2 软件设计的概念和原理 53
4.1.8 书写文档 53
4.1.7 制定测试计划 53
4.2.2 抽象 55
4.2.3 信息隐蔽和局部化 55
4.2.4 模块独立 56
4.3 启发式规则 58
4.3.1 改进软件结构提高模块独立性 58
4.3.2 模块规模应该适中 58
4.3.3 深度、宽度、扇出和扇入都应适当 58
4.3.4 模块的作用域应该在控制域之内 59
4.3.5 力争降低模块接口的复杂程度 60
4.3.6 设计单入口单出口的模块 61
4.3.7 模块功能应该可以预测 61
4.4 图形工具 61
4.4.1 层次图和HIPO图 61
4.4.2 结构图 62
4.5 面向数据流的设计方法 64
4.5.1 概念 64
4.5.2 变换分析 65
4.5.3 事务分析 72
4.5.4 设计优化 73
4.6 小结 74
第五章 详细设计 75
5.1 结构程序设计 75
5.2 详细设计的工具 78
5.2.1 程序流程图 78
5.2.2 盒图(N_S图) 79
5.2.3 判定表 80
5.2.4 过程设计语言(PDL) 82
5.2.5 模块开发文件夹 82
5.3.1 Jackson图 83
5.3 Jackson程序设计方法 83
5.3.2 改进的Jackson图 84
5.3.3 Jackson方法 84
5.4 Warnier程序设计方法 90
5.4.1 Warnier图的用途 90
5.4.2 Warnier方法 91
5.4.3 Warnier方法的辅助技术 97
5.5 程序复杂程度的定量度量 101
5.5.1 程序图 101
5.5.2 环形复杂度的计算方法 102
5.5.3 环形复杂度的用途 103
5.5.4 其他度量方法 103
5.6 小结 104
第六章 软件蓝图 105
6.1 软件蓝图方法论 105
6.1.1 对软件蓝图的要求 105
6.1.2 三级设计 106
6.1.3 蓝图语言 107
6.1.4 蓝图的书写风格 107
6.2.1 直接描述数据 109
6.2 软件蓝图的构成 109
6.2.2 高级数据运算符 111
6.2.3 丰富灵活的控制操作 113
6.2.4 显式描述软件结构 114
6.3 词法扫描程序的规格说明 117
6.3.1 输入串 118
6.3.2 输出串 118
6.3.3 扫描程序的语法 119
6.4 词法扫描程序的A级设计 120
6.4.1 选取数据元素设计数据流 120
6.4.2 设计控制流 121
6.4.3 划分模块 122
6.4.4 定义模块 123
6.4.5 书写A级蓝图 123
6.5 词法扫描程序的B级设计 124
6.5.1 精化数据流 124
6.5.2 组织模块 124
6.5.3 构造过程访问结构 124
6.5.4 书写B级蓝图 126
6.6 词法扫描程序的C级设计 126
6.6.1 选取更多数据元素 126
6.6.2 详细描述数据流 127
6.6.4 书写C级蓝图 128
6.6.3 构造其他访问结构 128
6.7 小结 129
附录6.1 词法扫描程序的A级蓝图 129
附录6.2 词法扫描程序的B级蓝图 131
附录6.3 词法扫描程序的C级蓝图 136
附录6.4 软件设计语言SDL-1的语法 142
7.1 程序设计语言 146
7.1.1 程序设计语言分类 146
第七章 编码 146
7.1.2 程序设计语言的特点 147
7.1.3 选择一种语言 150
7.2 程序设计途径 151
7.2.1 写程序的风格 151
7.2.2 程序设计方法论 153
7.2.3 程序设计自动化 154
7.2.4 程序设计工具 154
7.2.5 程序设计环境 156
7.3 小结 156
8.1 基本概念 157
第八章 测试 157
8.1.1 软件测试的目标 158
8.1.2 黑盒测试和白盒测试 158
8.1.3 软件测试的步骤 159
8.1.4 测试阶段的信息流 160
8.2 单元测试 161
8.2.1 单元测试考虑 161
8.2.2 单元测试过程 163
8.3 集成测试 165
8.3.1 自顶向下结合 166
8.3.3 不同集成测试策略的比较 167
8.3.2 自底向上结合 167
8.4 验收测试 168
8.4.1 验收测试的范围 169
8.4.2 软件配置复查 169
8.5 设计测试方案 169
8.5.1 逻辑覆盖 170
8.5.2 等价划分 173
8.5.3 边界值分析 176
8.5.4 错误推测 177
8.5.5 实用测试策略 177
8.6 调试 178
8.6.1 调试技术 180
8.6.2 调试策略 181
8.7 软件可靠性 183
8.7.1 基本概念 183
8.7.2 估算平均无故障时间的方法 184
8.7.3 程序正确性证明 186
8.8 自动测试工具 187
8.8.1 测试数据生成程序 187
8.8.2 动态分析程序 187
8.9 小结 188
8.8.3 静态分析程序 188
8.8.4 文件比较程序 188
第九章 维护 190
9.1 软件维护的定义 190
9.2 维护的特点 191
9.2.1 结构化维护与非结构化维护的对比 191
9.2.2 维护的代价 191
9.2.3 维护的问题 193
9.3.2 定量度量可维护性 194
9.3.1 决定软件可维护性的因素 194
9.3 可维护性 194
9.3.3 可维护性复审 195
9.4 维护过程 195
9.4.1 维护组织 195
9.4.2 维护报告 196
9.4.3 维护的事件流 196
9.4.4 保存维护记录 198
9.4.5 评价维护活动 198
9.5.2 数据的副作用 199
9.5.3 文档的副作用 199
9.5.1 编码的副作用 199
9.5 维护的副作用 199
9.6 文档 200
9.6.1 软件文档的组成 200
9.6.2 文档工具 201
9.7 小结 202
第十章 管理技术 203
10.1 成本估计 203
10.1.1 成本模型分类 203
10.1.2 参数方程 204
10.1.3 标准值法 205
10.1.4 COCOMO模型 207
10.2 进度计划 209
10.2.1 Gantt图 209
10.2.2 工程网络 211
10.2.3 估算进度 212
10.2.4 关键路径 214
10.2.5 机动时间 214
10.3 人员组织 216
10.3.1 程序设计小组的组织 216
10.3.2 主程序员组 217
10.4 质量保证 218
10.4.1 软件质量 218
10.4.2 质量保证 219
10.5 项目计划 220
10.5.1 项目计划的内容 220
10.5.2 项目报告 221
10.5.3 变动控制 221
10.6 软件管理工具 222
10.7 小结 222
A.1.1 使用环境 223
A.1 问题定义 223
附录A 一个工资支付系统的分析和设计过程 223
A.1.2 问题定义 224
A.1.3 关于规模和目标的报告书 224
A.2 可行性研究 225
A.2.1 澄清系统规模和目标 226
A.2.2 研究现有的系统 226
A.2.3 导出高层逻辑模型 228
A.2.4 精化系统规模和目标 229
A.2.5 导出供选择的解法 230
A.2.7 草拟开发计划 233
A.2.6 推荐行动方针 233
A.2.8 写出文档提交审查 234
A.3 要求分析 234
A.3.1 沿数据流图回溯 235
A.3.2 正式文档 236
A.3.3 定义逻辑系统 239
A.3.4 细化数据流图 239
A.3.5 结束标准 241
A.3.6 技术审查和管理复审 241
A.4.1 导出供选择的方案 242
A.4 系统设计 242
A.4.2 选择合理的方案 243
A.4.3 结束标准 244
A.4.4 推荐最佳方案 249
A.4.5 技术审查和管理复审 250
A.5 详细设计 251
A.5.1 设计文件和测试数据 251
A.5.2 工资支付程序的结构设计 252
A.5.3 用IPO图描述工资支付程序的模块 255
A.5.4 检查设计结果 262
A.6.1 编码 263
A.5.5 审查 263
A.6 实现和维护 263
A.6.2 文档 264
A.6.3 调试 264
A.6.4 结构化预排 265
A.6.5 系统测试 265
A.6.6 培训 265
A.6.7 维护 266
A.7 小结 266
B.1.1 外部编辑命令 268
附录B 一个交互式的正文编辑程序的设计 268
B.1 设计规格说明 268
B.1.2 编辑命令 269
B.1.3 输出信息 270
B.2 A级设计 271
B.2.1 系统组织 271
B.2.2 正文文件 271
B.2.3 两个工作模式 273
B.2.4 数据元素 273
B.2.5 过程 274
B.3 A级蓝图 276
B.4 C级设计 279
B.4.1 数据元素 279
B.4.2 控制数据元素 281
B.4.3 编辑过程 281
B.4.4 输入模式的过程 282
B.4.5 编辑模式的过程 284
B.5 C级蓝图 289
本书主要参考文献 317