第一部分 软件过程 2
第1章 软件工程的范围 2
1.1 历史方面 3
1.2 经济方面 5
1.3 维护方面 5
1.4 规格说明和设计方面 8
1.5 群体编程方面 9
1.6 面向对象的范型 10
1.7 常用术语 13
进一步阅读 15
本章回顾 15
问题 16
第2章 软件过程及问题 17
2.1 客户、开发人员和用户 18
2.2 需求阶段 19
2.3 规格说明阶段 20
2.4 计划阶段 21
2.5 设计阶段 22
2.6 实现阶段 23
2.7 集成阶段 23
2.9 退役 24
2.8 维护阶段 24
2.10 软件产品中的问题:本质问题和非本质问题 25
2.10.1 复杂性 26
2.10.2 一致性 27
2.10.3 可变性 27
2.10.4 不可见性 28
2.10.5 没有银弹吗 28
本章回顾 29
进一步阅读 29
问题 30
3.1 边做边改模型 31
第3章 软件生命周期模型 31
3.2 瀑布模型 32
3.3 快速原型模型 34
3.4 增量模型 36
3.5 螺旋模型 39
3.6 各种生命周期模型的比较 42
3.7 能力成熟度模型 43
3.8 ISO 9000 45
进一步阅读 46
本章回顾 46
问题 47
第4章 逐步求精、CASE和其他商用工具 48
4.1 逐步求精 48
4.2 成本效益分析 52
4.3 计算机辅助软件工程CASE 53
4.4 CASE的范围 54
4.5 软件版本 57
4.5.1 修订版本 57
4.6 配置控制 58
4.5.2 变体版本 58
4.6.1 产品维护期间的配置控制 60
4.6.2 基线版本 60
4.6.3 产品开发期间的配置控制 61
4.7 构造工具 61
4.8 CASE技术提高了生产力 62
4.8 软件度量 62
本章回顾 63
进一步阅读 63
问题 64
5.1 质量问题 66
第5章 测试原理 66
5.1.1 软件质量保证 67
5.1.2 管理的独立性 67
5.2 基于非执行的测试 68
5.2.1 走查 68
5.2.2 走查的管理 68
5.2.3 审查 69
5.2.4 审查和走查的比较 70
5.4 需要测试些什么 71
5.3 基于执行的测试 71
5.2.5 审查的尺度 71
5.4.1 实用性 72
5.4.2 可靠性 72
5.4.3 健壮性 73
5.4.4 性能 73
5.4.5 正确性 73
5.5 测试与正确性证明的比较 74
5.5.1 正确性证明的举例 75
5.5.2 正确性证明的事例研究 77
5.5.3 正确性证明和软件工程 78
5.6 由谁来执行基于执行的测试 80
5.7 何时结束测试 81
本章回顾 81
进一步阅读 82
问题 82
第6章 对象 84
6.1 什么是模块 84
6.2 内聚性 87
6.2.1 偶然内聚性 87
6.2.2 逻辑内聚性 88
6.2.3 暂时内聚性 89
6.2.4 过程内聚性 89
6.2.5 通信内聚性 89
6.2.6 信息内聚性 89
6.2.7 功能内聚性 90
6.2.8 内聚性举例 90
6.3 耦合 91
6.3.1 内容耦合 91
6.3.2 共用耦合 92
6.3.4 特征耦合 93
6.3.3 控制耦合 93
6.3.5 数据耦合 94
6.3.6耦合举例 95
6.4 数据封装 96
6.4.1 数据封装和产品开发 98
6.4.2 数据封装和产品维护 99
6.5 抽象数据类型 103
6.6 信息隐藏 104
6.7 对象的概念 106
6.8 多态性和动态联编 108
6.10 重用 110
6.9 对象的内聚性和耦合 110
6.11 重用实例研究 112
6.11.1 Raytheon的导弹系统部 112
6.11.2 东芝软件工厂 113
6.11.3 NASA软件 113
6.11.4 GTE Data Services 114
6.11.5 HP公司 114
6.12 重用和维护 115
6.13 对象和生产率 116
进一步阅读 117
本章回顾 117
问题 118
第二部分 软件过程的各个阶段 122
第7章 需求阶段 122
7.1 需求分析技术 122
7.2 快速原型 123
7.3 人的因素 124
7.4 作为一种规格说明技术的快速原型 125
7.5 快速原型的重用 127
7.6 快速原型的其他用途 128
7.7 快速原型的管理意义 129
7.8 有关快速原型的经验 130
7.9 联合式应用设计 131
7.10 需求分析技术的比较 131
7.11 需求阶段的测试 131
7.12 需求阶段的CASE工具 132
7.13 需求阶段的度量 132
7.14 MSG实例研究:需求阶段 133
7.15 MSG实例研究:快速原型 134
问题 135
进一步阅读 135
本章回顾 135
第8章 规格说明阶段 137
8.1 规格说明文档 137
8.2 非形式化规格说明 138
8.3 结构化系统分析 139
8.4 其他的半形式化技术 145
8.5 实体关系模型 145
8.6 有穷状态机 147
8.7 Petri网 152
8.8.1 电梯问题:Z 156
8.8 Z 156
8.8.2 对Z的分析 158
8.9 其他的形式化技术 159
8.10 规格说明技术的比较 160
8.11 规格说明阶段的测试 160
8.12 规格说明阶段的CASE工具 160
8.13 规格说明阶段的度量 161
8.14 MSG实例研究:结构化系统分析 161
问题 163
进一步阅读 163
本章回顾 163
第9章 面向对象的分析阶段 166
9.1 面向对象范型与结构化范型的比较 166
9.2 面向对象的分析 167
9.3 电梯问题:面向对象的分析 168
9.3.1 类模型 168
9.3.2 动态建模 170
9.3.3 功能建模 172
9.4 面向对象的生命周期模型 174
9.6 MSG实例研究:面向对象的分析 176
9.5 面向对象分析阶段中的CASE工具 176
本章回顾 178
进一步阅读 178
问题 178
第10章 计划阶段 181
10.1 项目开发周期和开发成本估计 181
10.1.1 产品规模的度量 182
10.1.2 成本估计技术 185
10.1.3 中级CDCOMO 186
10.1.4 跟踪开发周期和成本估计 188
10.2 软件项目管理计划的组成部分 189
10.3 软件项目管理计划的结构 190
10.4 IEEE软件项目管理计划 190
10.5 测试计划 193
10.6 面向对象项目的规划 194
10.7 培训需求 195
10.8 文档标准 195
10.9 计划阶段的CASE工具 195
10.10 计划阶段的测试 197
进一步阅读 198
10.11 MSG实例研究:计划阶段 198
本章回顾 198
问题 199
第11章 设计阶段 201
11.1 设计和抽象 201
11.2 面向行为的设计 202
11.3 数据流分析 202
11.3.1 数据流分析的例子 203
11.3.2 扩展 206
11.4 事务分析 207
11.5 面向数据的设计 208
11.6 Jackson系统开发 208
11.6.1 JSD概述 209
11.6.2 为什么要在本章介绍Jackson系统开发 210
11.6.3 电梯问题:Jackson系统开发 210
11.6.4 JSD分析 216
11.7 Jackson、Warnier和Orr的技术 217
11.8 面向对象的设计 218
11.10 面向行为的设计、面向数据的设计和面向对象的设计之比较 221
11.9 详细设计 221
11.11 与实时系统有关的困难 222
11.12 实理系统设计技术 223
11.13 设计阶段的测试 223
11.14 设计阶段的CASE工具 224
11.15 设计阶段的度量 224
11.16 MSG实例研究:面向对象的设计 225
本章回顾 228
进一步阅读 228
问题 228
12.1 编程语言的选择 230
第12章 实现阶段 230
12.2 第四代语言 232
12.3 结构化程序设计 234
12.3.1 结构化程序设计的历史 234
12.3.2 为什么goto语句是有害的 235
12.4 良好的编程习惯 237
12.5 编码标准 240
12.6 程序员组的组织 241
12.7 民主制程序员组方法 242
12.8 典型的主席制程序员组方法 243
12.8.1 New York Times项目 244
12.8.2 典型的主席制程序员组方法的不切实际性 245
12.9 超越主席制程序员组和民主制程序员组的方法 245
12.10 可移植性 247
12.10.1 硬件的不兼容性 248
12.10.2 操作系统的不兼容性 249
12.10.3 数值软件的不兼容性 249
12.10.4 编译器的不兼容性 250
12.11 为什么要支持可移植性 253
12.12.1 可移植的系统软件 254
12.12.2 可移植的应用软件 254
12.12 获得可移植性的技术 254
12.12.3 可移植的数据 255
12.13 模块重用 256
12.14 模块测试事例的选择 256
12.14.1 规格说明测试与代码测试的比较 256
12.14.2 规格说明测试的可行性 257
12.14.3 代码测试的可行性 257
12.15 黑盒模块测试技术 258
12.15.1 等价测试和边界值分析 259
12.16.1 结构化测试:语句、分支、路径覆盖 260
12.15.2 功能测试 260
12.16 玻璃盒模块测试技术 260
12.16.2 复杂性度量 262
12.17 代码走查和审查 263
12.18 模块测试技术的比较 263
12.19 Cleanroom 264
12.20 测试对象 264
12.21 模块测试的管理方面 266
12.22 测试分布式软件 268
12.23 实时软件的测试 269
12.25 MSG实例研究:黑盒测试事例 270
12.24 实现阶段的CASE工具 270
本章回顾 272
进一步阅读 272
问题 273
第13章 实现和集成阶段 275
13.1 实现和集成 275
13.1.1 自顶向下的实现和集成方法 276
13.1.2 自底而上的实现和集成方法 277
13.1.4 面向对象产品的实现和集成方法 278
13.1.3 三明治式实现和集成方法 278
13.1.5 实现和集成阶段的管理问题 279
13.2 实现和集成阶段的测试 279
13.3 用户图形界面的集成阶段测试 279
13.4 产品测试 280
13.5 验收测试 280
13.6 实现和集成阶段的CASE工具 281
13.7 整个软件过程的CASE工具 281
13.11 集成环境 282
13.10 工具箱环境 282
13.9 面向结构的环境 282
13.8 基于编程语言的环境 282
13.11.1 过程集成 283
13.11.2 工具集成 283
13.11.3 其他形式的集成 285
13.12 商业应用的开发环境 285
13.13 公用工具的基础结构 286
13.14 各类环境的比较 286
13.15 实现和集成阶段的度量 286
本章回顾 287
13.16 MSG实例研究:实现和集成阶段 287
进一步阅读 288
问题 288
第14章 维护阶段 290
14.1 为什么维护是必须的 290
14.2 维护人员需要什么 291
14.3 维护实例研究 292
14.4 维护管理 293
14.4.1 错误报告 293
14.4.2 授权产品更改 293
14.4.4 反复维护的问题 294
14.4.3 确保可维护性 294
14.5 面向对象的软件维护 295
14.6 开发技能与维护技能之比较 297
14.7 逆向工程 297
14.8 维护阶段的测试 298
14.9 维护阶段的CASE工具 298
14.10 维护阶段的度量 299
本章回顾 299
进一步阅读 299
问题 300
结束语——JAVA:软件工程的实例研究 301
第三部分 附录 307
附录A 艺术商人Osbert Oglesby 307
附录B 软件工程资源 309
附录C MSG实例研究:快速原型模型 311
附录D MSG实例研究:结构化系统分析 322
附录E MSG实例研究:软件项目管理计划 325
附录F MSG实例研究:设计 329
附录G MSG实例研究:黑箱测试用例 337
附录H MSG实例研究:源代码 339
参考文献索引 376