第1章 软件工程概述 1
1.1 计算机软件 1
1.1.1 软件的定义 1
1.1.2 软件的特点 2
1.1.3 软件的分类 3
1.2 软件的发展和软件危机 6
1.2.1 软件发展阶段 6
1.2.2 软件危机 8
1.2.3 软件危机的解决途径 9
1.3 软件工程 10
1.3.1 软件工程定义 10
1.3.2 软件工程要素 11
1.3.3 软件工程的目标和原则 11
1.3.4 软件工程基本原理 12
1.4 通信软件工程 14
1.4.1 通信系统 14
1.4.2 通信软件 16
1.4.3 通信软件工程 19
1.5 软件工程知识体系 20
1.5.1 软件工程知识体系指南简介 20
1.5.2 软件工程知识体系知识域 21
习题 23
第2章 软件生命周期模型 24
2.1 软件工程过程 24
2.2 软件生命周期 24
2.3 软件过程模型 25
2.4 传统软件生命周期模型 26
2.4.1 瀑布模型 26
2.4.2 V模型和W模型 28
2.4.3 原型方法 30
2.4.4 演化模型 38
2.4.5 增量模型 39
2.4.6 螺旋模型 40
2.4.7 喷泉模型 42
2.4.8 构件组装模型 43
2.4.9 快速应用开发模型 44
2.5 新型软件生命周期模型 45
2.5.1 RUP 45
2.5.2 敏捷模型 51
习题 54
第3章 系统需求分析及可行性分析3.1 基于计算机系统的系统分析 55
3.1.1 计算机系统工程 55
3.1.2 系统需求识别 56
3.2 可行性分析 57
3.2.1 可行性分析的任务和步骤 57
3.2.2 经济可行性分析 57
3.2.3 技术可行性分析 60
3.3 系统体系结构建模 61
3.3.1 构建系统级体系结构 62
3.3.2 系统结构的规格说明定义 64
3.3.3 分配与权衡 65
3.4 系统流程图 66
3.4.1 符号 66
3.4.2 示例 67
3.4.3 分层 68
3.5 系统分析的总结 68
3.5.1 系统规格说明书 68
3.5.2 可行性分析报告模板 69
习题 71
第4章 软件需求分析 72
4.1 什么是“需求” 72
4.1.1 需求的定义 72
4.1.2 需求分析失败的案例 73
4.2 软件需求分析的目标及任务 74
4.3 软件需求分析建模的原则和方法 75
4.3.1 数据建模 76
4.3.2 功能和行为建模 77
4.3.3 问题划分 77
4.4 软件需求工程 77
4.5 软件需求分析过程 79
4.5.1 需求获取的对象及注意事项 79
4.5.2 需求获取 80
4.5.3 需求类别 83
4.5.4 需求分析与综合 84
4.5.5 需求建模 85
4.5.6 编制需求分析文档 86
4.5.7 需求确认 88
4.5.8 需求分析评审 88
习题 89
第5章 结构化需求分析 90
5.1 结构化分析发展简史 90
5.2 分析模型的结构 91
5.2.1 数据建模与范式 91
5.2.2 功能建模与数据流图 95
5.2.3 系统行为建模 101
5.2.4 数据词典 104
5.3 软件需求规格说明书 110
习题 112
第6章 软件设计 113
6.1 软件设计的目标 113
6.2 软件设计的历史和变迁 113
6.3 软件设计在开发阶段中的重要性 114
6.4 软件设计的过程 115
6.5 软件概要设计的步骤 115
6.5.1 制定设计规范 115
6.5.2 软件系统结构的总体设计 115
6.5.3 处理方式设计 116
6.5.4 数据结构设计 116
6.5.5 可靠性设计 116
6.5.6 编写概要设计阶段的文档 117
6.5.7 概要设计评审 117
6.6 软件详细设计的步骤 117
6.7 软件设计原则 118
6.7.1 抽象化 119
6.7.2 模块化 120
6.7.3 信息隐藏 121
6.7.4 模块的独立性 121
6.7.5 降低模块间耦合度的方法 126
6.8 软件设计基础 127
6.8.1 自顶向下,逐步细化 127
6.8.2 系统控制结构 127
6.8.3 结构划分和结构图 128
6.8.4 数据结构 129
6.8.5 软件过程 130
6.9 软件体系结构简介 131
6.9.1 软件体系结构概述 131
6.9.2 软件体系结构的定义 131
6.9.3 软件体系结构三要素 132
6.9.4 软件体系结构风格 133
习题 141
第7章 结构化设计方法 142
7.1 系统功能结构图结构 142
7.1.1 系统结构图中的模块 142
7.1.2 变换型数据流与变换型系统结构图 143
7.1.3 事务型数据流与事务型系统结构图 143
7.2 变换映射 145
7.3 事务映射 147
7.4 变换-事务混合型的系统结构图 148
7.5 改进系统功能结构图的启发式原则 149
7.5.1 模块功能的完善化 149
7.5.2 消除重复功能,改善软件结构 149
7.5.3 模块的作用范围应在控制范围之内 150
7.5.4 尽可能减少高扇出结构 150
7.5.5 避免或减少使用病态连接 151
7.5.6 模块的大小要适中 152
7.5.7 设计功能可预测的模块,避免过分受限制的模块 152
7.5.8 软件包应满足设计约束和可移植性 152
7.6 数据设计和文件设计的过程与原则 153
7.6.1 数据设计 153
7.6.2 文件设计 154
7.7 设计的后处理 155
7.7.1 处理说明 155
7.7.2 接口说明 155
7.7.3 数据结构说明 155
7.7.4 概要设计评审 156
7.7.5 设计的优化 156
7.8 详细设计 157
7.8.1 程序流程图 157
7.8.2 N-S图 158
7.8.3 PAD 159
7.8.4 判定表 160
7.8.5 PDL 162
7.9 界面设计 163
7.9.1 置用户于控制之下 164
7.9.2 减少用户的记忆负担 164
7.9.3 保持界面一致 165
7.9.4 界面设计模型 165
7.9.5 用户界面设计过程 166
7.9.6 界面设计需要注意的常见问题 166
7.9.7 界面设计评估和优化 168
7.10 HIPO设计工具 169
7.10.1 可视目录表 169
7.10.2 IPO图 170
7.10.3 利用HIPO进行迭代式细化设计 171
7.11 Jackson系统开发方法 172
7.11.1 JSD方法的步骤 172
7.11.2 Jackson程序设计方法 172
7.11.3 Jackson的三种结构冲突类型 175
习题 177
第8章 面向对象基础 178
8.1 面向对象基本思想 178
8.2 面向对象的主要概念和基本原则 180
8.2.1 主要概念 180
8.2.2 基本原则 184
8.3 几种经典的面向对象分析和设计方法 188
8.3.1 OOA/OOD 188
8.3.2 Booch方法 189
8.3.3 对象建模技术 190
8.3.4 面向对象软件工程方法 191
8.4 统一建模语言简介 191
8.4.1 UML的出现和发展 191
8.4.2 UML概述 192
8.4.3 UML中的扩展机制 194
8.4.4 UML中的图 195
8.4.5 基于UML的面向对象软件开发过程 227
习题 228
第9章 面向对象分析 229
9.1 面向对象分析综述 229
9.2 用例建模 231
9.2.1 确定系统边界 232
9.2.2 识别参与者 232
9.2.3 识别用例 234
9.2.4 其他需求分析工件 246
9.3 创建领域模型 246
9.3.1 识别概念类 246
9.3.2 添加关联 249
9.3.3 添加属性 252
9.4 绘制系统顺序图 252
9.5 创建系统操作契约 255
习题 258
第10章 面向对象设计 259
10.1 面向对象设计综述 259
10.2 把模型层次化 260
10.2.1 用户界面层 261
10.2.2 控制器/处理层 261
10.2.3 业务/领域层 262
10.2.4 持久化层 262
10.2.5 系统层 262
10.3 面向对象设计原则 263
10.3.1 单一职责原则 263
10.3.2 开闭原则 264
10.3.3 里氏替换原则 266
10.3.4 依赖倒置原则 267
10.3.5 接口隔离原则 269
10.3.6 组合/聚合复用原则 270
10.3.7 迪米特法则 271
10.4 设计用例实现方案 271
10.4.1 类职责分配模式 272
10.4.2 类职责分配 276
10.4.3 持久化层设计 284
10.4.4 创建设计类图 288
10.4.5 startUp用例 292
习题 293
第11章 软件实现 294
11.1 软件实现概述 294
11.1.1 软件实现的目标 294
11.1.2 软件实现的任务 294
11.2 程序设计语言与集成开发环境 294
11.2.1 程序设计语言简介 294
11.2.2 程序设计语言的选择 296
11.2.3 集成开发环境简介 297
11.2.4 集成开发环境的选择 298
11.3 程序设计方法 298
11.3.1 结构化程序设计方法 298
11.3.2 面向对象程序设计方法 300
11.4 程序设计风格 303
11.4.1 源程序文档化 304
11.4.2 数据说明 304
11.4.3 语句结构 305
11.4.4 输入和输出(I/O) 306
11.4.5 错误处理 307
11.5 程序效率 308
11.5.1 讨论效率的准则 308
11.5.2 算法对效率的影响 308
11.5.3 存储效率 308
11.5.4 输入/输出效率 309
习题 309
第12章 软件测试 310
12.1 软件测试基础 310
12.1.1 软件测试概述 310
12.1.2 软件的可测试性 311
12.1.3 软件测试的对象 313
12.1.4 软件测试信息流 313
12.1.5 软件测试步骤 314
12.1.6 软件测试流程 315
12.1.7 软件测试与软件开发各阶段的关系 316
12.1.8 程序错误的分类 316
12.2 软件测试方法与技术 319
12.2.1 测试技术分类 319
12.2.2 白盒测试技术 321
12.2.3 黑盒测试技术 328
12.2.4 测试方法选择的综合策略 333
12.2.5 针对专门环境和应用的测试 333
12.3 软件测试过程 335
12.3.1 单元测试 335
12.3.2 集成测试 337
12.3.3 确认测试 338
12.3.4 系统测试 339
12.3.5 何时停止测试 340
12.4 面向对象的测试方法 341
12.4.1 面向对象测试与传统测试的区别 342
12.4.2 面向对象的测试模型 342
12.4.3 面向对象分析的测试 343
12.4.4 面向对象设计的测试 345
12.4.5 面向对象编程的测试 346
12.4.6 面向对象的单元测试 347
12.4.7 面向对象的集成测试 348
12.4.8 面向对象的系统测试 349
12.5 程序的静态分析方法 350
12.5.1 源程序静态分析 350
12.5.2 人工测试 351
12.6 软件调试方法 352
12.6.1 调试过程 352
12.6.2 调试原则 353
12.6.3 主要调试方法 354
12.7 软件测试工具 356
12.7.1 软件测试工具分类 356
12.7.2 常用的软件测试工具简介 357
12.8 软件的可靠性 360
12.8.1 基本概念 360
12.8.2 软件可靠性衡量方法 360
习题 362
第13章 软件维护 364
13.1 软件维护概述 364
13.1.1 软件维护的定义 364
13.1.2 软件维护的分类 364
13.1.3 影响软件维护工作量的因素 365
13.1.4 软件维护中的典型问题 366
13.2 软件维护活动 366
13.2.1 维护机构 366
13.2.2 软件维护申请报告 367
13.2.3 软件维护工作流程 367
13.2.4 软件维护记录及其评价 369
13.3 修改程序的步骤和副作用 369
13.3.1 分析和理解程序 370
13.3.2 修改程序 370
13.3.3 修改程序的副作用 371
13.3.4 重新验证程序 372
13.4 软件的可维护性 373
13.5 软件的逆向工程和再工程 376
13.5.1 基本概念 376
13.5.2 逆向工程 377
13.5.3 软件再工程 378
习题 383
第14章 软件项目管理 384
14.1 项目和软件项目 384
14.2 项目管理一般过程 385
14.3 软件项目管理过程 386
14.4 风险分析 388
14.4.1 风险识别 389
14.4.2 风险量化 392
14.4.3 风险应对计划制定 394
14.4.4 风险监控 395
14.5 软件项目度量 395
14.5.1 软件度量 395
14.5.2 软件项目规模度量 398
14.6 软件项目估算 401
14.6.1 明确软件项目范围 402
14.6.2 估算项目资源 403
14.6.3 估算成本和工作量 404
14.7 项目进度安排 415
14.7.1 工作量与人数关系 417
14.7.2 工作量分配 417
14.7.3 项目任务及其关系 418
14.7.4 进度安排 419
14.8 项目跟踪和调整 423
14.9 项目组织结构 425
习题 428
第15章 软件过程管理 429
15.1 软件过程框架 429
15.1.1 通用过程框架 429
15.1.2 过程模式 432
15.2 软件过程建模 434
15.2.1 软件过程特点 434
15.2.2 软件过程建模技术 435
15.2.3 ISO/IEC 12207-1995的过程分类 438
15.2.4 过程模型裁剪 444
15.3 软件能力成熟度模型 444
15.3.1 软件过程能力 444
15.3.2 软件组织的成熟性 445
15.3.3 CMM背景 446
15.3.4 CMM内容 447
15.3.5 CMM层次结构 450
15.3.6 CMM应用 454
15.4 能力成熟度模型集成 456
15.4.1 阶段式CMMI 456
15.4.2 连续式CMMI 459
15.4.3 CMMI和CMM的对比 460
15.5 软件过程改进模型 461
15.6 个体软件过程 464
15.7 小组软件过程 466
习题 468
第16章 软件质量管理 469
16.1 软件质量相关概念 469
16.1.1 软件质量 469
16.1.2 质量控制 470
16.1.3 质量保证 471
16.1.4 质量成本 471
16.2 软件质量模型 471
16.2.1 软件质量特性 471
16.2.2 Boehm软件质量模型 472
16.2.3 McCall软件质量模型 475
16.2.4 ISO软件质量模型 478
16.2.5 软件质量特性之间的竞争 479
16.3 软件质量度量与评价 480
16.3.1 软件质量度量方法 480
16.3.2 软件质量评价方法 481
16.3.3 几个重要质量特性的度量 482
16.4 软件质量保证 489
16.4.1 质量保证的概念 489
16.4.2 软件质量保证活动 490
16.4.3 质量检查 492
16.4.4 软件评审中的正式技术评审 493
16.5 软件质量保证实施 497
16.5.1 软件质量保证体系 497
16.5.2 质量目标、度量方法和质量保证实施步骤 500
16.6 软件配置管理 502
16.6.1 软件配置管理基本概念 502
16.6.2 软件配置管理过程 504
16.7 ISO9000质量标准简介 509
16.7.1 质量管理体系标准的产生 510
16.7.2 ISO9000族标准的构成 512
16.7.3 质量管理原则 513
16.7.4 质量管理体系基础 514
16.7.5 质量管理体系要求 518
16.7.6 ISO9000族标准的特点及实施意义 519
习题 519
第17章 软件工程标准与环境17.1 软件工程标准 520
17.1.1 软件工程标准化的意义 520
17.1.2 软件工程标准的制定与推行 521
17.1.3 软件工程标准的类型与层次 522
17.1.4 软件工程的国家标准 525
17.2 软件文档 527
17.2.1 什么是软件文档 527
17.2.2 软件文档的作用 528
17.2.3 文档的分类 528
17.2.4 软件文档的工作 529
17.2.5 对文档编制的质量要求 530
17.2.6 文档的管理和维护 531
17.3 软件开发环境 532
17.3.1 软件开发环境概述 532
17.3.2 软件开发环境分类 533
17.3.3 软件开发环境的特点 534
17.3.4 软件开发环境的组成与结构 535
17.4 软件工具 535
17.4.1 软件工具的基本概念 536
17.4.2 软件工具的发展 536
17.4.3 软件工具的作用与功能 537
17.4.4 软件工具的分类 537
17.5 计算机辅助软件工程 538
17.5.1 CASE相关概念 538
17.5.2 CASE分类 540
17.5.3 集成化CASE环境 541
17.5.4 CASE生存期 544
17.5.5 CASE与软件工程 544
17.5.6 常用CASE工具简介 545
习题 549
参考文献 550