第一章 引言 1
1.1 问题所在 1
1.1.1 看来功能无穷的计算机 1
1.1.2 数字电子技术的发展 3
1.1.3 程序人员是科学家,是工程师,还是艺术家? 4
1.1.4 缺乏程序工程和设计技术 5
1.1.5 根深蒂固的计算机硬件的经营管理思想 6
1.2 问题的严重性 6
1.2.1 软件代价高 6
1.2.2 软件错误的影响 8
1.2.3 软件修改和软件维护问题 10
1.2.4 我们能软件标准化吗? 11
1.2.5 本世纪最后廿年内的计算机行业 12
1.3 我们是怎样处理问题的? 13
1.3.1 对问题的认识 13
1.3.2 新方法和新技术 14
1.4 将来的希望 15
1.4.1 已经改进的语言和工具 15
1.4.2 扩大新方法的应用 16
1.4.3 程序证明和自动化程序设计 16
1.5 各章概述 17
1.5.1 设计 17
1.5.2 复杂性 17
1.5.3 测试 18
1.5.4 可靠性 18
1.5.5 管理 18
问题 19
参考文献精选 22
教科书 22
期刊和杂志 24
第二章 程序设计工具和技术 25
2.1 介绍 25
2.1.1 设计过程的特点 25
2.1.2 合成与迭代 26
2.1.3 现代设计技术 26
2.2 “自顶向下”和“自底向上”设计 28
2.2.1 引言 28
2.2.2 设计原理和原则 28
2.2.3 例子:一个字处理系统 31
2.3 设计表示法 34
2.3.1 引言 34
2.3.2 流程图 35
2.3.3 伪代码 40
2.3.4 HIPO图 42
2.3.5 华纳-欧尔图 45
2.3.6 受推荐的设计表示技术 48
2.4 结构程序设计 49
2.4.1 引言 49
2.4.2 结构程序设计的规则 49
2.4.3 结构设计的一些例子 51
2.4.4 结构程序设计技术 59
2.4.5 结构程序设计的优缺点 62
2.4.6 各种语言的结构程序设计 64
2.4.7 程序证明 68
2.5 数据定向设计技术 70
2.5.1 引言 70
2.5.2 数据流程图 71
2.5.3 例子:工资单程序的数据流程图 75
2.5.4 其他技术 77
2.6 模块设计 78
2.6.1 引言 78
2.6.2 模块的耦合和加强 78
2.6.3 模块程序设计的优缺点 80
2.6.4 模块接口的规范 81
2.7 程序设计方法 83
2.7.1 自动化程序设计 83
2.7.2 冗余程序设计 83
2.7.3 程序设计的风格 84
2.7.4 防错性程序设计 87
2.8 语言实施的影响问题 89
2.8.1 引言 89
2.8.2 用高级语言与汇编语言来进行程序设计 90
2.8.3 语言对可靠性和生产率的影响比较 95
2.8.4 语言的标准 96
2.9 软件工具 97
2.9.1 引言 97
2.9.2 软件开发设施 99
2.10 小结 100
问题 101
第三章 复杂性、存贮及处理时间分析 115
3.1 引论 115
3.1.1 软件开发阶段的分析 115
3.1.2 定量度量的必要性 117
3.2 复杂性度量 117
3.2.1 复杂性度量的类型 117
3.2.2 复杂性的启发式变量 118
3.2.3 指令计数 119
3.2.4 研究程序复杂性的一种统计方法 120
3.2.5 自然语言的Zipf定律 121
3.2.6 广义Zipf定律 126
3.2.7 Zipf定律应用于计算机语言 128
3.2.8 在设计开始时估计语言符号的长度 134
3.2.9 和“软件物理”的关系 135
3.2.10 复杂性作为错误数目和开发时间的函数 143
3.2.11 图论的复杂性度量 150
3.3 存贮量需求 155
3.3.1 引言 155
3.3.2 对一个数据受限例子的存贮分析 157
3.3.3 预测 157
3.3.4 存贮量限制对于程序开发的影响 159
3.4 处理时间 160
3.4.1 引言 160
3.4.2 算法复杂性 160
3.4.3 算法处理时间分析 161
3.4.4 分析和预测 164
3.5 小结 166
问题 167
第四章 程序测试 173
4.1 引论 173
4.1.1 测试的重要性 173
4.1.2 测试的范围 174
4.1.3 与可靠性、设计、以及管理的相互作用 176
4.1.4 测试的多样性 178
4.1.5 测试术语的定义 178
4.2 关于测试过程的统计学 178
4.2.1 引言 178
4.2.2 测试的时数 179
4.2.3 发现和改正时间 180
4.2.4 困难性与时间 180
4.3 测试的原理和类型 183
4.3.1 引言 183
4.3.2 模块测试 183
4.3.3 综合测试 183
4.3.4 自顶向下测试与自底向上测试 183
4.3.5 混合测试 185
4.3.6 回归测试 187
4.4 测试方法的比较 187
4.4.1 引言 187
4.4.2 各种方法的特点 188
4.4.3 方法的比较 188
4.5 排错 188
4.5.1 引言 188
4.5.2 排错技术 191
4.5.3 排错策略 191
4.5.4 编译程序诊断 194
4.6 测试的图模型 194
4.6.1 引言 194
4.6.2 图的覆盖和路径 195
4.6.3 路径测试 196
4.6.4 路径的数目 196
4.6.5 程序路径与图路径 202
4.7 测试数据的选取 206
4.7.1 引言 206
4.7.2 实用测试 207
4.7.3 产生测试数据的准则 210
4.8 穷举测试 213
4.8.1 引言 213
4.8.2 可能的错误源 213
4.8.3 穷举测试 213
4.8.4 穷举测试的不可处理性 214
4.8.5 一个附加的测试维 214
4.9 模拟、情景、和运行测试 215
4.9.1 引言 215
4.9.2 模拟 215
4.9.3 情景测试 215
4.9.4 运行测试 216
4.9.5 模拟运行混合测试 216
4.9.6 其它有关测试 217
4.10 测试的分类 217
4.10.1 引言 217
4.10.2 分类原理 217
4.10.3 完全性和连续性检查——0型 218
4.10.4 执行所有图路径——1型 218
4.10.5 执行所有程序路径——2型 220
4.10.6 穷举测试——3型和4型 220
4.11 小结 221
问题 221
第五章 软件可靠性 227
5.1 引言 227
5.2 软件可靠性概念 227
5.2.1 概率模型和确定性模型 227
5.2.2 故障模式 229
5.2.3 随机取样间隔 229
5.3 可靠性理论 229
5.3.1 可靠性数学 229
5.3.2 故障率 230
5.3.3 软件可靠性定义 232
5.4 软件修复和软件有效性概念 233
5.4.1 引言 233
5.4.2 停机时间 233
5.4.3 软件修复 233
5.4.4 软件有效性定义 234
5.5 软件错误和故障 235
5.5.1 引言和定义 235
5.5.2. 错误、规范修改和纠错 236
5.5.3 新旧错误 237
5.5.4 错误分类和起因 238
5.5.5 数据收集实验 239
5.6 估算一个计算机程序的差错数 244
5.6.1 引言 244
5.6.2 除错数据 245
5.6.3 累积错误和错误率模型 250
5.6.4 残留错误数ET的估算 254
5.6.5 排错期内的错误生成 258
5.7 可靠性模型 265
5.7.1 引言 265
5.7.2 随机模型 267
5.7.3 差错——比例(宏)模型 268
5.7.4 其他宏模型 272
5.7.5 可靠性实验数据 275
5.7.6 宏模型常数的估算 276
5.7.7 二项式错误模型 282
5.7.8 结构(微)模型 283
5.8 有效性模型 288
5.8.1 引言 288
5.8.2 基本多态马尔柯夫模型 288
5.8.3 系统有效性表示式 289
5.8.4 多态马尔柯夫模型的解 290
5.8.5 多态马尔柯夫模型Ⅰ和Ⅱ的求解结果 292
5.8.6 近拟求解法 293
5.8.7 模型的推广 294
5.9 数据收集、存贮和检索 295
5.9.1 引言 295
5.9.2 软件数据收集中的问题 295
5.9.3 两个术语失真的例子 296
5.9.4 硬件可靠性的数据收集史——与软件领域的类似和差别 297
5.9.5 数据库作为研究工具使用 298
5.9.6 特殊类型的存贮数据 298
5.9.7 多级存贮 299
5.10 小结 300
问题 301
第六章 管理技术 306
6.1 引言 306
6.1.1 对软件开发方法学的要求 306
6.1.2 企业内和企业外的软件开发 307
6.1.3 质量保证 309
6.1.4 生存周期的管理 309
6.1.5 本章要点 310
6.2 需求、规范和初期设计 310
6.2.1 软件合同的签订 310
6.2.2 软件需求 312
6.2.3 软件规范 314
6.2.4 实例 315
6.3 对性能、可靠性和质量的度量 317
6.3.1 性能的度量 317
6.3.2 可靠性 320
6.3.3 质量度量法 321
6.4 成本估计 326
6.4.1 引言 326
6.4.2 每条指令的开发成本 327
6.4.3 成本估计模型 329
6.4.4 理论上的优点与实际中的困难 335
6.4.5 几种成本模型的比较 336
6.4.6 奖惩型成本模型和担保型成本模型 338
6.5 对系统开发过程的管理 340
6.5.1 基本观点和方法 340
6.5.2 里程碑和等时线 340
6.5.3 设计、质量和管理标准 342
6.5.4 人——程序员或经理都是系统中的一个单元 344
6.5.5 修改控制 347
6.5.6 人力和计算机资源的调度模型 348
6.5.7 生产率和程序大小规模之间的关系 354
6.5.8 设计审查 356
6.5.9 示范和验收测试 357
6.6 软件的维护 359
6.6.1 引言 359
6.6.2 文档 359
6.6.3 维护费用模型 361
6.6.4 正在发展中的动态模型 363
6.7 已有的成就 364
6.7.1 引言 364
6.7.2 SAGE空防系统 364
6.7.3 SAFEGUARD反弹道导弹系统(ABM系统) 366
6.7.4 SABRE航空公司订票系统 369
6.7.5 MULTICS分时系统 372
6.7.6 UNIX操作系统 374
6.8 结论 377
问题 378
附录A 概率论概要 381
附录B 可靠性理论概要 410
附录C 图论概要 449