第一部分 产品和过程 1
第1章 产品 1
1.1 软件的发展 2
1.1.3 软件的竞争 4
1.1.2 老化的软件工厂 4
1.1.1 产业的观点 4
1.2 软件 5
1.2.1 软件特征 6
1.2.2 软件构件 8
1.2.3 软件应用 9
1.4 软件神话 10
1.3 软件:地平线上的危机 10
参考文献 12
1.5 小结 12
推荐阅读文献及其他信息源 13
思考题 13
2.1.1 过程、方法和工具 15
2.1 软件工程——一种层次化技术 15
第2章 过程 15
2.1.2 软件工程的一般视图 16
2.2 软件过程 17
2.3 软件过程模型 19
2.4 线性顺序模型 20
2.5 原型模型 22
2.6 RAD模型 23
2.7.1 增量模型 25
2.7 演化软件过程模型 25
2.7.2 螺旋模型 27
2.7.3 构件组装模型 28
2.7.4 并发开发模型 29
2.9 第四代技术 31
2.8 形式化方法模型 31
2.10 过程技术 32
2.12 小结 33
2.11 产品和过程 33
参考文献 34
推荐阅读文献及其他信息源 35
思考题 35
3.1 管理的范围 39
第3章 项目管理的概念 39
第二部分 软件项目的管理 39
3.2 人员 40
3.1.3 过程 40
3.1.1 人员 40
3.1.2 问题 40
3.2.2 项目负责人 41
3.2.1 项目参与者 41
3.2.3 软件项目组 42
3.2.4 协调和通信问题 44
3.3.2 问题分解 46
3.3.1 软件范围 46
3.3 问题 46
3.4.1 合并问题和过程 47
3.4 过程 47
3.4.2 过程分解 48
参考文献 49
3.6 小结 49
3.5 项目 49
思考题 50
推荐阅读文献及其他信息源 51
4.1 测度、度量和指标 53
第4章 软件过程和项目的度量 53
4.2.1 过程度量和软件过程改进 54
4.2 过程和项目领域中的度量 54
4.2.2 项目度量 57
4.3.1 面向规模的度量 58
4.3 软件测量 58
4.3.2 面向功能的度量 59
4.3.3 扩展的功能点度量 61
4.5 软件质量度量 63
4.4 调和不同的度量方法 63
4.5.2 测量质量 64
4.5.1 概述影响质量的因素 64
4.5.3 缺陷排除效率 65
4.6 在软件过程中集成度量 66
参考文献 67
4.7 小结 67
思考题 68
推荐阅读文献及其他信息源 69
5.1 对估算的观察 71
第5章 软件项目计划 71
5.3.1 获取定义软件范围所需的信息 72
5.3 软件范围 72
5.2 项目计划目标 72
5.3.2 一个范围定义的例子 73
5.4.1 人力资源 75
5.4 资源 75
5.4.3 环境资源 76
5.4.2 可复用软件资源 76
5.6 分解技术 77
5.5 软件项目估算 77
5.6.2 基于问题的估算 78
5.6.1 软件规模估算 78
5.6.3 一个基于LOC估算的例子 79
5.6.4 一个基于FP估算的例子 80
5.6.5 基于过程的估算 81
5.6.6 一个基于过程估算的例子 82
5.7.2 COCOMO模型 83
5.7.1 估算模型的结构 83
5.7 经验估算模型 83
5.7.3 软件方程式 85
5.8 自行开发或购买的决策 86
5.8.1 创建决策树 87
5.10 小结 88
5.9 自动估算工具 88
5.8.2 外购 88
思考题 89
参考文献 89
推荐阅读文献及其他信息源 90
6.2 软件风险 92
6.1 被动和主动的风险策略 92
第6章 风险管理 92
6.3 识别风险 93
6.3.2 商业影响风险 94
6.3.1 产品规模风险 94
6.3.4 过程风险 95
6.3.3 客户相关的风险 95
6.3.5 技术风险 96
6.3.7 与人员数目及经验相关的风险 97
6.3.6 开发环境风险 97
6.4.1 建立风险表 98
6.4 风险预测 98
6.3.8 风险因素和驱动因子 98
6.4.3 风险评估 100
6.4.2 评估风险影响 100
6.5 风险缓解、监控和管理 101
6.7 RMMM计划 103
6.6 安全性风险和危险 103
思考题 104
参考文献 104
6.8 小结 104
推荐阅读文献及其他信息源 105
7.1 基本概念 107
第7章 项目进度安排及跟踪 107
7.1.1 关于“延迟”的评注 108
7.1.2 基本原则 109
7.2.1 一个例子 110
7.2 人员和工作量之间的关系 110
7.3 为软件项目定义任务集合 111
7.2.3 工作量分布 111
7.2.2 一个经验关系 111
7.3.1 严格度 112
7.3.3 计算任务集合选择因子的值 113
7.3.2 定义适应性准则 113
7.3.4 解释TSS值并选择任务集合 114
7.5 主要任务的求精 115
7.4 选择软件工程任务 115
7.7 进度安排 118
7.6 定义任务网络 118
7.7.2 跟踪进度 119
7.7.1 时间表 119
7.9 小结 122
7.8 项目计划 122
思考题 123
参考文献 123
推荐阅读文献及其他信息源 124
8.1 质量概念 125
第8章 软件质量保证 125
8.1.2 质量控制 126
8.1.1 质量 126
8.1.4 质量的成本 127
8.1.3 质量保证 127
8.2 质量运动 128
8.3.1 背景 129
8.3 软件质量保证 129
8.4 软件复审 130
8.3.2 SQA活动 130
8.4.2 缺陷的放大和消除 131
8.4.1 软件缺陷对成本的影响 131
8.5.1 复审会议 133
8.5 正式技术复审 133
8.5.3 复审指南 134
8.5.2 复审报告和记录保存 134
8.6 SQA的形式化方法 135
8.7 统计质量保证 136
8.8 软件可靠性 137
8.8.2 软件的安全和危险的分析 138
8.8.1 可靠性和可用性的度量 138
8.9 SQA计划 139
8.10 ISO9000质量标准 140
8.10.2 ISO9001标准 141
8.10.1 ISO对质量保证系统的方法 141
参考文献 142
8.11 小结 142
思考题 143
推荐阅读文献及其他信息源 144
9.1 软件配置管理 147
第9章 软件配置管理 147
9.1.1 基线 148
9.1.2 软件配置项 149
9.2 SCM过程 150
9.3 软件配置中对象的标识 151
9.4 版本控制 153
9.5 变化控制 154
9.8 SCM标准 157
9.7 状态报告 157
9.6 配置审计 157
参考文献 158
9.9 小结 158
推荐阅读文献及其他信息源 159
思考题 159
10.1 基于计算机的系统 161
第10章 系统工程 161
第三部分 传统软件工程方法 161
10.2 系统工程层次结构 163
10.2.1 系统建模 164
10.2.2 信息工程:概述 165
10.2.3 产品工程:概述 167
10.4 信息策略计划 168
10.3 信息工程 168
10.4.1 企业建模 169
10.4.2 业务级数据建模 170
10.5 业务域分析 171
10.5.1 处理建模 172
10.6 产品工程 173
10.5.2 信息流建模 173
10.6.3 可行性研究 176
10.6.2 说明客户需要 176
10.6.1 系统分析 176
10.6.4 经济分析 177
10.6.5 技术分析 179
10.7 系统体系结构建模 180
10.8 系统建模和仿真 182
10.9 系统规约 183
10.10 小结 184
思考题 185
参考文献 185
推荐阅读文献及其他信息源 187
11.1 需求分析 188
第11章 分析概念和原则 188
11.2.1 过程的启动 189
11.2 通信技术 189
11.2.2 便利的应用规约技术 190
11.2.3 质量功能部署 192
11.3 分析原则 193
11.3.1 信息域 194
11.3.2 建模 195
11.3.3 划分 196
11.3.4 基本视图和实现视图 197
11.4.1 选择原型方法 198
11.4 软件原型 198
11.5 规约 199
11.4.2 原型方法和工具 199
11.5.2 表示 200
11.5.1 规约原则 200
11.5.3 软件需求规约 201
11.6 规约复审 202
参考文献 203
11.7 小结 203
思考题 204
推荐阅读文献及其他信息源 205
12.1 简史 206
第12章 分析建模 206
12.2 分析模型的元素 207
12.3.1 数据对象、属性和关系 208
12.3 数据建模 208
12.3.2 基数和形态 210
12.3.3 实体—关系图 211
12.4.1 数据流图 214
12.4 功能建模和信息流 214
12.4.2 针对实时系统的扩展 216
12.4.3 Ward和Mellor扩展 217
12.4.4 Hatley和Pirbhai扩展 219
12.5 行为建模 220
12.6 结构化分析的技巧 222
12.6.1 创建实体—关系图 223
12.6.2 创建数据流模型 225
12.6.3 创建控制流模型 227
12.6.4 控制规约 229
12.6.5 加工规约 230
12.7 数据字典 231
12.8.2 Jackson系统开发 233
12.8.1 数据结构化系统开发 233
12.8 其他传统分析方法概述 233
参考文献 234
12.9 小结 234
12.8.3 SADT 234
思考题 235
推荐阅读文献及其他信息源 236
13.1 软件设计和软件工程 238
第13章 设计概念和原则 238
13.2.1 设计和软件质量 239
13.2 设计过程 239
13.3 设计原则 240
13.2.2 软件设计的演化 240
13.4.1 抽象 241
13.4 设计概念 241
13.4.3 模块化 242
13.4.2 求精 242
13.4.4 软件体系结构 244
13.4.5 控制层次 245
13.4.6 结构划分 246
13.4.8 软件过程 247
13.4.7 数据结构 247
13.5 有效的模块设计 248
13.4.9 信息隐蔽 248
13.5.2 内聚 249
13.5.1 功能独立性 249
13.5.3 耦合 250
13.6 针对有效模块化的设计启发 251
13.8 设计文档 253
13.7 设计模型 253
参考文献 254
13.9 小结 254
思考题 256
推荐阅读文献及其他信息源 256
14.1 数据设计 258
第14章 设计方法 258
14.2.1 贡献者 259
14.2 体系结构设计 259
14.3.1 变换流 260
14.3 体系结构设计过程 260
14.2.2 应用域 260
14.4.1 一个实例 261
14.4 变换映射 261
14.3.2 事务流 261
14.4.2 设计步骤 262
14.5.2 设计步骤 268
14.5.1 一个实例 268
14.5 事务映射 268
14.7 体系结构设计优化 272
14.6 设计的后处理 272
14.9 人机界面设计 273
14.8.2 用户界面设计 273
14.8 接口设计 273
14.8.1 内部和外部接口设计 273
14.9.1 界面设计模型 274
14.9.3 设计问题 275
14.9.2 任务分析和建模 275
14.9.5 设计评估 277
14.9.4 实现工具 277
14.10.1 一般交互 279
14.10 界面设计指南 279
14.10.3 数据输入 280
14.10.2 信息显示 280
14.11.2 图形设计符号 281
14.11.1 结构化程序设计 281
14.11 过程设计 281
14.11.3 表格设计符号 284
14.11.5 一个PDL实例 285
14.11.4 程序设计语言 285
参考文献 288
14.12 小结 288
思考题 290
推荐阅读文献及其他信息源 292
15.1 系统考虑 294
第15章 实时系统的设计 294
15.2.1 集成和性能问题 295
15.2 实时系统 295
15.2.2 中断处理 296
15.2.4 实时操作系统 297
15.2.3 实时数据库 297
15.2.6 任务同步和通信 298
15.2.5 实时语言 298
15.3.1 实时系统分析的数学工具 299
15.3 实时系统的分析和仿真 299
15.3.2 仿真和建模技术 302
15.4 实时设计 306
参考文献 307
15.5 小结 307
推荐阅读文献及其他信息源 309
思考题 309
16.1.1 测试目标 311
16.1 软件测试基础 311
第16章 软件测试技术 311
16.1.3 可测试性 312
16.1.2 测试原则 312
16.2 测试用例设计 314
16.4.1 流图符号 315
16.4 基本路径测试 315
16.3 白盒测试 315
16.4.3 导出测试用例 318
16.4.2 环形复杂性 318
16.4.4 图矩阵 321
16.5.1 条件测试 322
16.5 控制结构测试 322
16.5.2 数据流测试 324
16.5.3 循环测试 325
16.6.1 基于图的测试方法 326
16.6 黑盒测试 326
16.6.2 等价划分 328
16.6.3 边界值分析 329
16.7.1 GUI测试 330
16.7 针对专门环境和应用的测试 330
16.6.4 比较测试 330
16.7.3 测试文档和帮助设施 331
16.7.2 客户/服务器体系结构的测试 331
16.7.4 实时系统测试 332
参考文献 333
16.8 小结 333
思考题 334
推荐阅读文献及其他信息源 335
17.1.1 验证和确认 337
17.1 软件测试的策略途径 337
第17章 软件测试策略 337
17.1.2 软件测试的组织 338
17.1.3 一种软件测试策略 339
17.1.4 测试完成的标准 340
17.3.1 单元测试考虑 342
17.3 单元测试 342
17.2 策略问题 342
17.3.2 单元测试规程 344
17.4 集成测试 345
17.4.1 自顶向下集成 346
17.4.2 自底向上集成 347
17.4.3 回归测试 348
17.4.5 集成测试文档 349
17.4.4 关于集成测试的讨论 349
17.5.1 确认测试的标准 350
17.5 确认测试 350
17.6 系统测试 351
17.5.3 Alpha和Beta测试 351
17.5.2 配置复审 351
17.6.3 压力测试 352
17.6.2 安全测试 352
17.6.1 恢复测试 352
17.7.1 调试过程 353
17.7 调试的技巧 353
17.6.4 性能测试 353
17.7.3 调试方法 354
17.7.2 心理考虑 354
17.8 小结 355
参考文献 356
推荐阅读文献及其他信息源 357
思考题 357
18.1 软件质量 359
第18章 软件的技术度量 359
18.1.1 McCall的质量因素 360
18.1.3 到量化视图的变迁 362
18.1.2 FURPS 362
18.2.2 测度原则 363
18.2.1 技术度量的挑战 363
18.2 软件技术度量框架 363
18.2.3 有效软件度量的属性 364
18.3.1 基于功能的度量 365
18.3 分析模型的度量 365
18.3.2 “撞击值”度量 366
18.3.3 规约质量的度量 368
18.4.1 高层设计度量 369
18.4 设计模型的度量 369
18.4.2 构件级设计度量 371
18.4.3 界面设计度量 373
18.5 源代码度量 374
18.6 对测试的度量 375
18.8 小结 376
18.7 对维护的度量 376
参考文献 377
思考题 378
推荐阅读文献及其他信息源 379
第19章 面向对象的概念和原则 381
第四部分 面向对象的软件工程 381
19.1 面向对象的范型 382
19.2 面向对象概念 383
19.2.1 类和对象 385
19.2.4 消息 386
19.2.3 操作方法和服务 386
19.2.2 属性 386
19.2.5 封装、继承和多态 388
19.3.1 标识类和对象 390
19.3 标识对象模型的元素 390
19.3.2 表示属性 393
19.3.4 完成对象定义 394
19.3.3 定义操作 394
19.4.1 OO的公共过程框架 395
19.4 面向对象软件项目的管理 395
19.4.2 面向对象项目的度量和估算 396
19.4.3 一种OO估算和进度安排方法 397
19.4.4 面向对象项目的跟踪过程 398
参考文献 399
19.5 小结 399
推荐阅读文献及其他信息源 400
思考题 400
20.1.1 传统方法和OO方法 402
20.1 面向对象的分析 402
第20章 面向对象分析 402
20.1.2 OOA概述 403
20.2.2 领域分析过程 406
20.2.1 复用和领域分析 406
20.2 领域分析 406
20.3 00分析模型的类属成分 408
20.4.1 使用实例 409
20.4 OOA过程 409
20.4.2 类—责任—协作者建模 410
20.4.3 定义结构和层次 414
20.4.4 定义主题和子系统 415
20.5 对象—关系模型 416
20.6 对象—行为模型 418
20.6.2 状态表示 419
20.6.1 用使用实例标识事件 419
参考文献 422
20.7 小结 422
思考题 423
推荐阅读文献及其他信息源 424
21.1 面向对象系统的设计 426
第21章 面向对象设计 426
21.1.1 传统方法和OO方法 427
21.1.2 设计问题 428
21.1.3 OOD概述 429
21.2 OO设计模型的类属成分 432
21.3.1 划分分析模型 433
21.3 系统设计过程 433
21.3.3 任务管理构件 434
21.3.2 并发性和子系统分配 434
21.3.6 人机界面构件 435
21.3.5 资源管理构件 435
21.3.4 数据管理构件 435
21.3.7 子系统间通信 436
21.4.1 对象描述 437
21.4 对象设计过程 437
21.4.2 设计算法和数据结构 438
21.4.3 程序构件和接口 439
21.5.2 在设计中使用设计模式 442
21.5.1 描述设计模式 442
21.5 设计模式 442
参考文献 443
21.7 小结 443
21.6 面向对象编程 443
思考题 444
推荐阅读文献及其他信息源 445
22.1 扩大测试的视角 447
第22章 面向对象测试 447
22.2.2 OOA和OOD模型的一致性 448
22.2.1 OOA和OOD模型的正确性 448
22.2 测试OOA和OOD模型 448
22.3 面向对象的测试策略 449
22.4 OO软件的测试用例设计 450
22.3.3 在OO语境中的有效性测试 450
22.3.1 在OO语境中的单元测试 450
22.3.2 在OO语境中的集成测试 450
22.4.3 基于故障的测试 451
22.4.2 传统测试用例设计方法的可用性 451
22.4.1 OO概念的测试用例设计的含义 451
22.4.4 OO编程对测试的影响 452
22.4.6 基于场景的测试设计 453
22.4.5 测试用例和类层次 453
22.4.7 测试表层结构和深层结构 454
22.5.2 在类级别上的划分测试 455
22.5.1 对OO类的随机测试 455
22.5 在类级别上可用的测试方法 455
22.6.1 多个类测试 456
22.6 类间测试用例设计 456
22.6.2 从行为模型导出的测试 457
参考文献 458
22.7 小结 458
推荐阅读文献及其他信息源 459
思考题 459
23.2.1 局部化 461
23.2 区别性的特征 461
第23章 面向对象系统的技术度量 461
23.1 面向对象度量的目的 461
23.3 对OO设计模型的度量 462
23.2.5 抽象 462
23.2.2 封装 462
23.2.3 信息隐蔽 462
23.2.4 继承 462
23.4.1 CK度量套件 463
23.4 面向类的度量 463
23.4.2 Lorenz和Kidd建议的度量 465
23.6 对面向对象测试的度量 466
23.5 面向操作的度量 466
23.8 小结 467
23.7 对面向对象项目的度量 467
思考题 468
参考文献 468
推荐阅读文献及其他信息源 469
24.1 基本概念 471
第24章 形式化方法 471
第五部分 软件工程高级课题 471
24.1.1 少量的形式化方法的不足 472
24.1.3 形式化方法概念 473
24.1.2 软件开发中的数学 473
24.2.1 集合和构造性规约 477
24.2 数学预备知识 477
24.2.2 集合运算符 478
24.2.4 序列 480
24.2.3 逻辑运算符 480
24.3 应用数学符号描述形式规约 481
24.4 形式化规约语言 482
24.5 用Z表示一个软件构件的例子 483
24.6 形式化方法的十条戒律 485
24.8 小结 486
24.7 形式化方法——未来之路 486
思考题 487
参考文献 487
推荐阅读文献及其他信息源 488
25.1.1 净室策略 490
25.1 净室方法 490
第25章 净室软件工程 490
25.2 功能规约 492
25.1.2 什么使得净室独特? 492
25.2.1 黑盒规约 493
25.2.3 清晰盒规约 494
25.2.2 状态盒规约 494
25.3.1 设计求精和验证 495
25.3 设计求精和验证的优点 495
25.3.2 设计验证的优点 498
25.4.1 统计的使用测试 499
25.4 净室测试 499
25.5 小结 500
25.4.2 认证 500
参考文献 501
推荐阅读文献及其他信息源 502
思考题 502
26.1.1 复用的障碍 505
26.1 管理问题 505
第26章 软件复用 505
26.1.2 硬件类比 506
26.2 复用过程 507
26.1.3 建立复用途径的一些建议 507
26.2.1 可复用的软件制品 508
26.3 领域工程 509
26.2.2 一个过程模型 509
26.3.1 领域分析过程 510
26.3.3 结构建模和结构点 511
26.3.2 领域特征 511
26.4 建造可复用构件 512
26.4.1 为了复用的分析和设计 512
26.4.2 构造方法 513
26.4.3 基于构件的开发 514
26.5 分类和检索构件 515
26.5.1 描述可复用构件 515
26.5.2 复用环境 517
26.6 软件复用经济学 517
26.6.1 对质量、生产率和成本的影响 517
26.6.2 使用结构点的成本分析 518
26.6.3 复用度量 519
26.7 小结 519
参考文献 520
思考题 521
推荐阅读文献及其他信息源 522
27.1 业务过程再工程 524
27.1.1 业务过程 524
第27章 再工程 524
27.1.2 业务过程再工程的原则 526
27.1.3 BPR模型 527
27.2 软件再工程 528
27.2.1 软件维护 528
27.1.4 几句警告 528
27.2.2 软件再工程过程模型 529
27.3 逆向工程 532
27.3.1 理解处理的逆向工程 533
27.3.2 理解数据的逆向工程 533
27.3.3 用户界面的逆向工程 534
27.4 重构 535
27.4.1 代码重构 535
27.4.2 数据重构 536
27.5 正向工程 536
27.5.1 向客户/服务器体系结构的正向工程 537
27.5.2 向面向对象体系结构的正向工程 538
27.5.3 用户界面的正向工程 538
27.7 小结 539
参考文献 539
27.6 再工程经济学 539
思考题 541
推荐阅读文献及其他信息源 542
第28章 客户/服务器软件工程 543
28.1 客户/服务器系统的结构 543
28.1.1 C/S系统的软件构件 544
28.1.2 软件构件的分布 545
28.1.3 分布应用构件的指南 545
28.1.4 连接C/S软件构件 546
28.1.5 中间件和对象请求代理体系结构 546
28.2 对C/S系统的软件工程 547
28.4 对C/S系统的设计 548
28.4.1 传统设计方法 548
28.3 分析建模问题 548
28.4.2 数据库设计 549
28.4.3 某设计方法的概述 550
28.4.4 加工设计的迭代 551
28.5 测试问题 552
28.5.1 整体C/S测试策略 552
28.5.2 C/S测试策略 553
28.6小结 554
参考文献 554
思考题 555
推荐阅读文献及其他信息源 555
29.1 什么是CASE? 557
29.2 构造CASE的积木块 557
第29章 计算机辅助软件工程 557
29.3 CASE工具分类 559
29.4 集成化CASE环境 562
29.5 集成体系结构 563
29.6 CASE中心库 563
29.6.1 在I-CASE中中心库的角色 564
29.6.2 特征和内容 564
29.7 小结 567
参考文献 567
思考题 568
推荐阅读文献及其他信息源 568
第30章 未来之路 570
30.1 软件的重要性——再论 570
30.2 变化的范围 571
30.3 人及他们建造系统的方式 572
30.4 “新”的软件过程 574
30.5 表示信息的新模式 574
30.6 技术作为推动力 576
30.7 结束语 577
思考题 578
推荐阅读文献及其他信息源 578
参考文献 578