第一部分 软件工程介绍 3
第1章 软件工程的范畴 3
1.1 历史方面 4
1.2 经济方面 6
1.3 维护性方面 7
1.4 规格说明和设计阶段 10
1.5 小组编程方面 12
1.6 面向对象范型 13
1.7 术语 17
本章回顾 18
进一步阅读指导 18
思考题 19
参考文献 20
第2章 软件过程 23
2.1 客户、开发人员和用户 24
2.2 需求阶段 25
2.2.1 需求阶段测试 26
2.2.2 需求阶段文档 26
2.3 规格说明阶段 26
2.3.1 规格说明阶段测试 28
2.3.2 规格说明阶段文档 29
2.4 设计阶段 29
2.4.1 设计阶段测试 29
2.6 集成阶段 30
2.5.2 实现阶段文档 30
2.6.1 集成阶段测试 30
2.4.2 设计阶段文档 30
2.5 实现阶段 30
2.5.1 实现阶段测试 30
2.6.2 集成阶段文档 31
2.7 维护阶段 31
2.7.1 维护阶段测试 32
2.7.2 维护阶段文档 32
2.8 退役 32
2.9 软件生产中存在的问题:本质的和偶发的 32
2.9.1 复杂性 33
2.9.3 可变性 35
2.9.2 一致性 35
2.9.4 不可见性 36
2.9.5 没有银弹吗 36
2.10 改进软件过程 37
2.11 能力成熟度模型 37
2.12 软件过程改进方面的其他努力 40
2.13 软件过程改进的成本和效益 40
本章回顾 42
进一步阅读指导 42
思考题 43
参考文献 44
第3章 软件生命周期模型 47
3.1 建造-修补模型 47
3.2 瀑布模型 48
3.3 快速原型开发模型 51
3.4 增量模型 52
3.5 极限编程 54
3.6 同步-稳定模型 56
3.7 螺旋模型 56
3.8 面向对象的生命周期模型 60
3.9 生命周期模型的比较 61
思考题 62
进一步阅读指导 62
本章回顾 62
参考文献 63
第4章 软件小组 65
4.1 小组组织 65
4.2 民主小组方法 66
4.3 传统的主程序员小组方法 67
4.3.1 纽约时报项目 68
4.3.2 传统的主程序员小组方法的不实用性 69
4.4 超越主程序员小组和民主小组 69
4.5 同步-稳定小组 71
4.6 极限编程小组 72
思考题 73
本章回顾 73
进一步阅读指导 73
参考文献 74
第5章 软件工程工具 75
5.1 逐步求精法 75
逐步求精法示例 75
5.2 成本-效益分析法 79
5.3 软件度量 80
5.4 CASE 81
5.5 CASE的分类 82
5.6 CASE的范围 83
5.7.1 修订版 86
5.7 软件版本 86
5.7.2 变种版 87
5.8 配置控制 87
5.8.1 产品维护期间的配置控制 89
5.8.2 基线 89
5.8.3 产品开发过程中的配置控制 89
5.9 建造工具 90
5.10 使用CASE技术提高生产率 90
本章回顾 91
进一步阅读指导 92
思考题 92
参考文献 93
第6章 测试 97
6.1 质量问题 98
6.1.1 软件质量保证 98
6.1.2 管理独立 98
6.2 非执行测试 99
6.2.1 走查 99
6.2.2 管理走查 99
6.2.3 审查 100
6.2.4 审查与走查的对比 102
6.2.5 评审的长处和短处 102
6.2.6 评审的度量 102
6.3 执行测试 102
6.4 应该测试什么 103
6.4.1 实用性 104
6.4.2 可靠性 104
6.4.3 健壮性 104
6.4.4 性能 105
6.4.5 正确性 105
6.5 测试与正确性证明 106
6.5.1 正确性证明的例子 107
6.5.2 正确性证明案例研究 109
6.5.3 正确性证明和软件工程 110
6.6 谁来完成执行测试 112
进一步阅读指导 113
本章回顾 113
6.7 何时停止测试 113
思考题 114
参考文献 115
第7章 从模块到对象 119
7.1 什么是模块 119
7.2 内聚 121
7.2.1 偶然性内聚 122
7.2.2 逻辑性内聚 122
7.2.3 时间性内聚 123
7.2.4 过程性内聚 123
7.2.5 通信性内聚 123
7.2.7 信息性内聚 124
7.2.6 功能性内聚 124
7.2.8 内聚示例 125
7.3 耦合 125
7.3.1 内容耦合 126
7.3.2 共用耦合 126
7.3.3 控制耦合 127
7.3.4 印记耦合 128
7.3.5 数据耦合 128
7.3.6 耦合示例 129
7.3.7 耦合的重要性 130
7.4 数据封装 130
7.4.1 数据封装和产品开发 132
7.4.2 数据封装和产品维护 133
7.5 抽象数据类型 138
7.6 信息隐藏 139
7.7 对象 141
7.8 继承、多态和动态绑定 143
7.9 对象的内聚和耦合 145
7.10 面向对象范型 145
本章回顾 147
进一步阅读指导 147
思考题 148
参考文献 149
8.1 复用的概念 151
第8章 可复用性、可移植性和互操作性 151
8.2 复用的障碍 152
8.3 复用案例研究 153
8.3.1 Raytheon导弹系统部 153
8.3.2 东芝软件工厂 155
8.3.3 NASA软件 155
8.3.4 GTE数据服务 156
8.3.5 惠普公司 156
8.3.6 欧洲航天局 157
8.4 对象和复用 158
8.5 设计和实现阶段的复用 158
8.5.1 设计复用 158
8.5.2 应用框架 159
8.5.3 设计模式 160
8.5.4 软件体系结构 162
8.6 复用和维护 164
8.7 可移植性 164
8.7.1 硬件的不兼容性 165
8.7.2 操作系统的不兼容性 165
8.7.3 数值计算软件的不兼容性 166
8.7.4 编译器的不兼容性 167
8.8 为什么需要可移植性 170
8.9 实现可移植性的技术 171
8.9.1 可移植的系统软件 171
8.9.2 可移植的应用软件 172
8.9.3 可移植的数据 173
8.10 互操作性 173
8.10.1 COM 173
8.10.2 CORBA 174
8.10.3 COM和CORBA的比较 174
8.11 互操作性的未来趋势 175
本章回顾 175
进一步阅读指导 176
思考题 177
参考文献 179
第9章 计划和估算 185
9.1 计划和软件过程 185
9.2 周期和成本估算 186
9.2.1 产品规模的度量 187
9.2.2 成本估算的技术 190
9.2.3 中间COCOMO 192
9.2.4 COCOM0Ⅱ 194
9.2.5 跟踪周期和成本估算 195
9.3 软件项目管理计划的组成 195
9.4 软件项目管理计划框架 196
9.5 IEEE软件项目管理计划 197
9.6 测试计划 198
9.7 计划面向对象的项目 199
9.9 文档标准 200
9.8 培训需求 200
9.10 用于计划和估算的CASE工具 201
9.11 测试软件项目管理计划 201
本章回顾 201
进一步阅读指导 201
思考题 202
参考文献 203
第二部分 软件生命周期的各个阶段 209
第10章 需求阶段 209
10.1 需求获取 209
10.1.1 访谈 210
10.1.2 情景 210
10.1.3 其他需求获取技术 211
10.2 需求分析 212
10.3 快速原型开发 212
10.4 人的因素 213
10.5 作为一种规格说明技术的快速原型开发 215
10.6 复用快速原型 216
10.7 快速原型开发模型的管理含意 217
10.8 快速原型开发的试验 218
10.9 需求获取和需求分析技术 219
10.10 在需求分析阶段测试 220
10.11 需求阶段的CASE工具 220
10.13 面向对象的需求 221
10.12 需求阶段的度量 221
10.14 “空中美食”案例研究:需求阶段 222
10.15 “空中美食”案例研究:快速原型 224
10.16 需求阶段面临的挑战 225
本章回顾 226
进一步阅读指导 227
思考题 227
参考文献 228
第11章 规格说明阶段 231
11.1 规格说明文档 231
11.2 非形式化规格说明 232
案例研究:文本处理 233
11.3 结构化系统分析 233
Sally的软件商店 234
11.4 其他半形式化的技术 239
11.5 建造实体-关系模型 240
11.6 有限状态机 241
电梯问题:有限状态机 243
11.7 Petri网 246
11.8 Z规格说明语言 250
11.8.1 电梯问题:Z规格说明 250
11.8.2 Z的分析 252
11.9 其他形式化技术 253
11.10 规格说明技术的比较 253
11.11 在规格说明阶段测试 254
11.12 规格说明阶段的CASE工具 255
11.13 规格说明阶段的度量 255
11.14 “空中美食”案例研究:结构化系统分析 255
11.15 “空中美食”案例研究:软件项目管理计划 257
11.16 规格说明阶段面临的挑战 257
本章回顾 258
进一步阅读指导 258
思考题 259
参考文献 261
第12章 面向对象分析阶段 265
12.1 面向对象分析 265
12.3 用例建模 267
12.2 电梯问题:面向对象分析 267
12.4 类建模 268
12.4.1 名词提取 269
12.4.2 CRC卡片 270
12.5 动态建模 271
12.6 在面向对象分析阶段测试 273
12.7 面向对象分析阶段的CASE工具 276
12.8 “空中美食”案例研究:面向对象分析 276
12.9 面向对象分析阶段面临的挑战 281
本章回顾 281
进一步阅读指导 281
思考题 282
参考文献 283
第13章 设计阶段 285
13.1 设计和抽取 285
13.2 面向行为设计 286
13.3 数据流分析 286
13.3.1 数据流分析示例 287
13.3.2 扩展 290
13.4 事务分析 291
13.5 面向数据设计 292
13.6 面向对象设计 292
13.7 电梯问题:面向对象设计 293
13.8 详细设计的形式化技术 299
13.9 实时设计技术 299
13.10 设计期间的测试 300
13.11 设计阶段的CASE工具 301
13.12 设计阶段的度量 301
13.13 “空中美食”案例研究:面向对象设计 302
13.14 设计阶段面临的挑战 308
本章回顾 309
进一步阅读指导 309
思考题 309
参考文献 310
第14章 实现阶段 313
14.1 编程语言的选择 313
14.2 第四代语言 315
14.3 良好的编程习惯 317
14.4 编码标准 321
14.5 模块复用 322
14.6 模块测试用例选择 322
14.6.1 规格说明测试与代码测试 322
14.6.2 规格说明测试的可行性 323
14.6.3 代码测试的可行性 323
14.7 黑盒模块测试技术 325
14.7.1 等价测试和边界值测试 325
14.7.2 功能测试 326
14.8 玻璃盒模块测试技术 327
14.8.1 结构测试:语句覆盖、分支覆盖以及路径覆盖 327
14.8.2 复杂性度量 328
14.10 模块测试技术的比较 330
14.9 代码走查和审查 330
14.11 净室 331
14.12 测试对象时潜在的问题 332
14.13 模块测试的管理方面 334
14.14 何时该重写而不是调试一个模块 334
14.15 实现阶段的CASE工具 335
14.16 “空中美食”案例研究:黑盒测试用例 335
14.17 实现阶段面临的挑战 337
本章回顾 337
进一步阅读指导 337
思考题 338
参考文献 339
15.1 实现与集成介绍 343
第15章 实现与集成阶段 343
15.1.1 自顶向下的实现与集成 344
15.1.2 自底向上的实现与集成 345
15.1.3 三明治式实现与集成 345
15.1.4 面向对象产品的实现与集成 347
15.1.5 实现与集成阶段的管理问题 347
15.2 实现与集成期间的测试 347
15.3 图形用户界面的集成测试 348
15.4 产品测试 348
15.5 验收测试 349
15.8 集成化开发环境 350
15.6 实现与集成阶段的CASE工具 350
15.7 软件开发全过程的CASE工具 350
15.9 商业应用软件开发环境 351
15.10 公共工具基础结构 352
15.11 开发环境的潜在问题 352
15.12 实现与集成阶段的度量 352
15.13 “空中美食”案例研究:实现与集成阶段 353
15.14 实现与集成阶段面临的挑战 353
本章回顾 353
进一步阅读指导 353
思考题 354
参考文献 355
16.1 维护的必要性 357
第16章 维护阶段 357
16.2 对维护程序员的要求 358
16.3 维护工作案例研究 359
16.4 维护管理 360
16.4.1 错误报告 360
16.4.2 批准对产品的修改 361
16.4.3 确保软件的可维护性 362
16.4.4 反复维护造成的问题 362
16.5 面向对象软件的维护 363
16.6 维护技能与开发技能 365
16.7 逆向工程 365
16.9 维护阶段的CASE工具 366
16.8 维护阶段的测试 366
16.10 维护阶段的度量 367
16.11 “空中美食”案例研究:维护阶段 367
16.12 维护阶段面临的挑战 367
本章小结 368
进一步阅读指导 368
思考题 368
参考文献 369
附录 375
附录A Broadlands地区儿童医院 375
附录B 软件工程资料 379
附录C “空中美食”案例研究:C快速原型 381
附录D “空中美食”案例研究:Java快速原型 382
附录E “空中美食”案例研究:结构化系统分析 383
附录F “空中美食”案例研究:软件项目管理计划 389
附录G “空中美食”案例研究:面向对象的分析 393
附录H “空中美食”案例研究:C++实现的设计 394
附录I “空中美食”案例研究:Java实现的设计 407
附录J “空中美食”案例研究:黑盒测试用例 419
附录K “空中美食”案例研究:C++源代码 424
附录L “空中美食”案例研究:Java源代码 425
参考文献 427
索引 451