第一篇 传统的软件工程 2
第1章 软件工程引论 2
1.1 软件产品的概念与特征 2
1.1.1 软件产品的概念与分类 2
1.1.2 软件产品的特征 3
1.1.3 软件发展的阶段划分 4
1.2 软件危机 5
1.2.1 软件危机及其表现 5
1.2.2 产生软件危机的原因 6
1.2.3 解决软件危机的途径 7
1.3 软件工程的产生及其发展 8
1.4 软件工程的技术基础 9
1.5 软件工程过程的概念 10
1.6 几种软件过程模型 12
1.6.1 线性顺序模型 13
1.6.2 原型模型 14
1.6.3 快速应用开发模型 14
1.6.4 演化软件过程模型 15
1.7 过程技术 17
1.8 软件重用技术 18
1.9 计算机辅助软件工程工具 19
1.10 小结 21
习题 21
第2章 系统工程基础与软件可行性研究 23
2.1 基于计算机的系统 23
2.1.1 基于计算机的系统概述 23
2.1.2 计算机系统工程 24
2.2 系统需求识别 27
2.2.1 系统分析的目标 27
2.2.2 系统分析过程 27
2.3 可行性研究与分析 28
2.3.1 效益度量方法 29
2.3.2 成本—效益分析 30
2.3.3 技术分析 31
2.3.4 方案制定与评估 32
2.4 系统体系结构建模 32
2.4.1 建立系统结构流程图 32
2.4.2 系统结构的规格说明定义 35
2.5 系统定义与评审 35
2.5.1 系统定义文档模板 35
2.5.2 系统定义的评审 36
2.6 小结 37
习题 37
第3章 结构化需求分析与建模 38
3.1 需求分析 38
3.1.1 需求分析的任务 38
3.1.2 需求分析的步骤 39
3.1.3 需求分析的原则 39
3.2 数据建模 40
3.2.1 实体—关系模型 40
3.2.2 数据建模的其他工具 42
3.3 功能建模 44
3.3.1 数据流图的基本符号 44
3.3.2 数据流与加工之间的关系 45
3.3.3 数据流模型的建立方法 45
3.3.4 建立数据流模型的原则 47
3.4 行为建模 48
3.4.1 状态迁移图 48
3.4.2 Petri网 49
3.5 数据字典 51
3.5.1 数据字典的基本符号 51
3.5.2 数据字典中的条目及说明格式 51
3.5.3 加工逻辑的描述 53
3.5.4 数据字典的建立 55
3.6 结构化需求分析的若干技术 55
3.7 验证软件需求 57
3.7.1 软件需求规格说明的主要内容 57
3.7.2 软件需求的验证 57
3.8 小结 58
习题 59
第4章 结构化软件设计 60
4.1 软件设计中的基本概念和原理 60
4.2 体系结构设计概述 64
4.2.1 体系结构设计的任务 64
4.2.2 体系结构设计中可采用的工具 66
4.2.3 体系结构设计的原则 67
4.2.4 体系结构设计说明书 69
4.3 面向数据流的体系结构设计方法 70
4.3.1 数据流图的类型 70
4.3.2 面向数据流的体系结构设计过程 70
4.4 详细设计概述 74
4.4.1 详细设计的任务 74
4.4.2 详细设计可采用的工具 75
4.4.3 详细设计的原则 79
4.4.4 详细设计说明书 80
4.5 面向数据流的详细设计方法 80
4.6 面向数据结构的设计方法 82
4.7 小结 86
习题 86
第5章 软件编码 88
5.1 程序设计语言 88
5.1.1 程序设计语言的分类 88
5.1.2 程序设计语言的特性 89
5.1.3 程序设计语言的选择 90
5.2 编码风格及软件效率 92
5.2.1 编码风格 92
5.2.2 软件效率 95
5.3 程序复杂度的概念及度量方法 95
5.3.1 程序图 96
5.3.2 程序复杂度的度量方法 97
5.4 小结 99
习题 99
第6章 软件测试技术 100
6.1 软件测试基础 100
6.1.1 软件测试的概念、目的和原则 100
6.1.2 软件测试的过程 102
6.1.3 软件测试的方法 103
6.2 白盒测试技术 104
6.2.1 白盒测试概念 104
6.2.2 白盒测试的用例设计 105
6.3 黑盒测试技术 108
6.3.1 黑盒测试概念 108
6.3.2 黑盒测试的用例设计 108
6.4 软件测试计划和测试分析报告 115
6.5 软件测试策略 117
6.5.1 单元测试 118
6.5.2 集成测试 120
6.5.3 确认测试 123
6.5.4 系统测试 124
6.6 小结 125
习题 125
第二篇 面向对象的软件工程 130
第7章 面向对象技术总论 130
7.1 概述——面向对象方法论 130
7.2 面向对象技术的基本概念 132
7.2.1 类 132
7.2.2 对象及对象实例 132
7.2.3 消息机制 134
7.3 面向对象技术的基本特点 134
7.3.1 封装性 134
7.3.2 继承性 135
7.3.3 多态性 136
7.3.4 抽象性 138
7.4 面向对象分析方法 139
7.5 面向对象技术与程序结构 141
7.5.1 概述 141
7.5.2 重构 142
7.5.3 一个程序结构改进(重构)的例子 144
7.6 面向对象软件工程 148
7.6.1 传统的面向对象软件工程 148
7.6.2 现代的面向对象软件工程 149
7.6.3 RUP过程 150
7.6.4 UML简介 153
7.7 设计模式(Design Pattern)与框架(Framework) 155
7.7.1 设计模式的基本概念 155
7.7.2 设计模式举例——Abstract Factory(抽象工厂)模式 156
7.7.3 框架的基本概念 157
7.7.4 框架的应用 158
7.7.5 框架开发与软件重用 159
7.7.6 框架的分类及开发原则 160
7.8 基于构件的软件体系结构(Com/Dcom、Corba、Internet) 160
7.9 面向对象分析解决(描述)问题的模式 161
7.10 小结 163
习题 164
第8章 业务模型 165
8.1 业务模型概述 165
8.2 业务建模的目的及内容 166
8.2.1 业务建模的目的 166
8.2.2 业务建模的内容 166
8.3 业务建模流程和任务 166
8.4 业务建模中使用到的UML元素和版型 168
8.4.1 业务系统(Business System) 168
8.4.2 业务目标(Business Goal) 168
8.4.3 业务规则(Business Rule) 169
8.4.4 业务参与者(Business Actor) 170
8.4.5 业务工人(Business Worker) 171
8.4.6 业务实体(Business Entity) 171
8.4.7 业务事件(Business Event) 172
8.4.8 业务用例(Business Use Case) 173
8.4.9 业务用例实现(Business Use Case Realization) 177
8.4.10 业务用例与业务用例实现的区别 178
8.5 业务建模举例 178
8.5.1 业务目标(部分) 178
8.5.2 组织结构 179
8.5.3 岗位设置和职责 180
8.5.4 业务参与者(部分) 180
8.5.5 业务用例模型 180
8.5.6 业务对象模型 181
8.6 小结 181
习题 182
第9章 需求分析与用例模型 183
9.1 需求分析 183
9.1.1 系统需求和需求描述 183
9.1.2 需求类型 183
9.1.3 需求与用例模型 184
9.2 Actor及其关系 184
9.2.1 Actor 184
9.2.2 如何发现Actor 185
9.2.3 Actor之间的关系 186
9.3 用例及其关系 186
9.3.1 用例(Use Case) 186
9.3.2 用例的版型(Stereotype)及用例观点 188
9.3.3 用例之间的关系 188
9.4 用例图和用例模型 193
9.4.1 参与者与用例之间的关联 193
9.4.2 用例图 194
9.4.3 用例模型 195
9.5 用例规格说明 196
9.5.1 概述 196
9.5.2 用例的描述模板 196
9.5.3 通过用例描述来获取系统的功能 197
9.5.4 用例的描述方法及举例 198
9.6 用例描述中常见的错误举例 200
9.7 使用用例方法发现和确定系统功能需求 203
9.7.1 通过Actor来发现用例 204
9.7.2 通过业务用例和业务流程来发现用例 205
9.7.3 多视角的建模 206
9.8 小结 206
习题 207
第10章 分析设计与对象模型 208
10.1 类和对象的定义 208
10.1.1 类的定义 208
10.1.2 类的定义讨论 208
10.1.3 类的程序语言定义及和现实世界类的映射 209
10.1.4 类的高级概念 211
10.2 对象、类之间的关系 213
10.2.1 泛化(Generalization) 213
10.2.2 关联(Association) 214
10.2.3 聚集(Aggregation) 216
10.2.4 依赖(Depandancy) 217
10.3 抽象类和接口 218
10.4 分析模型(Analysis Model) 219
10.4.1 边界类(Boundary) 219
10.4.2 控制类(Control) 220
10.4.3 实体类(Entity) 221
10.4.4 分析模型举例 222
10.5 设计模型 223
10.6 抽象类和接口的设计原则 225
10.6.1 缺省抽象原则DAP(Default Abstraction Principle) 225
10.6.2 接口设计原则IDP(Interface Design Principle) 225
10.6.3 黑盒原则BBP(Black Box Principle) 226
10.6.4 不要具体化超类原则DCSP(Don't Concrete Supperclass Principle) 226
10.7 类图 227
10.8 领域设计(Domain Design) 227
10.8.1 概述 227
10.8.2 领域建模 228
10.8.3 领域分析 228
10.8.4 领域工程 228
10.9 面向对象设计的原则 229
10.9.1 单一职责原则(SRP) 229
10.9.2 开闭原则(OCP) 229
10.9.3 Liskov替换原则 231
10.9.4 依赖倒置原则(DIP) 237
10.9.5 接口分离原则(ISP) 238
10.10 对象模型与关系模型 240
10.10.1 概念模型的表示方法 240
10.10.2 对象模型和关系模型的相互转换 241
10.11 小结 242
习题 242
第11章 系统结构与包模型 243
11.1 包的概念 243
11.2 包之间的依赖关系 243
11.3 包的版型 244
11.4 用包表示的系统高层结构 244
11.5 设计包的原则 245
11.5.1 重用等价原则(REP) 245
11.5.2 共同闭包原则(CCP) 245
11.5.3 共同重用原则(CRP) 246
11.5.4 非循环依赖原则(ADP) 246
11.5.5 稳定依赖原则(SDP) 246
11.5.6 稳定抽象原则(SAP) 246
11.6 小结 247
习题 247
第12章 系统动态特性与对象交互模型 248
12.1 动态模型概述 248
12.2 交互图 248
12.2.1 概述 248
12.2.2 顺序图 248
12.2.3 顺序图中的对象 249
12.2.4 顺序图中的消息 249
12.2.5 建立顺序图的方法和步骤 250
12.2.6 通信图(Communication Diagram) 250
12.2.7 通信图中的元素 251
12.2.8 顺序图和通信图的比较 251
12.3 状态图 252
12.3.1 概述 252
12.3.2 状态图中的基本概念 253
12.3.3 状态图的工具支持 254
12.4 活动图 254
12.4.1 概述 254
12.4.2 活动图中的基本概念 254
12.4.3 活动图的用途 256
12.4.4 活动图的工具支持 257
12.5 UML2.0的活动图 257
12.6 小结 258
习题 259
第13章 构件模型和部署模型 260
13.1 代码实现与构件模型 260
13.1.1 概述 260
13.1.2 构件(Component)和构件图(Component Diagram) 260
13.1.3 构件(Component)图的作用 261
13.2 部署图(Deploy Diagram) 262
13.3 小结 262
习题 262
第14章 面向对象测试基础 263
14.1 面向对象的单元测试 263
14.2 面向对象的集成测试 264
14.3 面向对象的确认测试与系统测试 264
14.4 设计测试用例 265
14.4.1 测试用例概述 265
14.4.2 面向对象概念对测试用例设计的影响 265
14.4.3 类测试用例设计 266
14.4.4 类间测试用例设计 267
14.4.5 测试用例设计举例 268
14.5 小结 270
习题 270
第三篇 软件工程项目管理 272
第15章 软件工程项目管理基础 272
15.1 项目管理的范围 272
15.2 人员角色管理 273
15.2.1 项目参与者 273
15.2.2 项目负责人 274
15.2.3 软件项目组的组织结构 274
15.2.4 小组内的协调和通信 275
15.3 问题管理 277
15.4 过程管理 277
15.5 小结 278
习题 278
第16章 软件度量 280
16.1 软件度量 280
16.2 面向规模的度量 281
16.3 面向功能的度量 281
16.4 软件质量的度量 284
16.4.1 影响软件质量的因素 284
16.4.2 软件质量度量 285
16.5 在软件过程中集成度量数据 286
16.5.1 建立基线 286
16.5.2 度量数据的收集、计算和评价 287
16.6 小结 288
习题 289
第17章 软件计划 290
17.1 软件范围界定 290
17.2 资源需求 292
17.3 项目估算 293
17.3.1 基于问题分解的估算 294
17.3.2 基于过程分解的估算 296
17.3.3 经验估算模型 296
17.3.4 COCOMO模型 297
17.3.5 软件方程式 299
17.3.6 自动估算工具 300
17.4 软件项目计划的结构 300
17.5 项目计划的分解求精 302
17.5.1 任务的确定与并发处理 302
17.5.2 制定明细的开发进度计划 303
17.6 计划跟踪监督 304
17.7 计划执行情况的度量与计划调控 305
17.8 小结 305
习题 306
第18章 软件工程风险管理 307
18.1 软件风险 307
18.2 风险识别 308
18.3 风险预测 309
18.3.1 建立风险表 309
18.3.2 风险评估 310
18.4 风险缓解、监控与管理 311
18.5 RMMM计划 313
18.6 小结 314
习题 314
第19章 软件质量保证 315
19.1 软件质量与SQA 315
19.1.1 软件质量 315
19.1.2 SQA活动 316
19.2 软件复审 316
19.2.1 软件复审简介 316
19.2.2 软件缺陷对成本的影响 317
19.2.3 缺陷的放大和消除 317
19.3 正式的技术复审 319
19.3.1 复审会议的组织 319
19.3.2 复审报告和记录保存 320
19.3.3 复审指南 320
19.4 基于统计的质量保证 321
19.5 软件可靠性 322
19.5.1 可靠性和可用性 322
19.5.2 平均无故障运行时间的估算 323
19.6 SQA计划 324
19.7 小结 325
习题 326
第20章 软件配置管理 327
20.1 软件配置管理的任务 327
20.1.1 基线 327
20.1.2 软件配置项 329
20.2 SCM过程 330
20.3 软件配置中对象的标识 331
20.4 版本控制 332
20.5 变更控制 333
20.6 配置审核与状态报告 335
20.6.1 配置审核 335
20.6.2 配置状态报告 335
20.7 小结 335
习题 336
第四篇 软件工程过程模型 338
第21章 能力成熟度模型 338
21.1 CMM的发展过程 339
21.2 CMM体系结构 340
21.2.1 CMM的等级结构 340
21.2.2 CMM的内部结构 341
21.2.3 关键过程域的结构 342
21.3 CMM关键过程域 343
21.4 小结 344
第22章 个人软件过程(PSP) 345
22.1 PSP的基本概念 346
22.1.1 PSP的基本原则 346
22.1.2 PSP的结构 347
22.2 PSP过程简介 348
22.2.1 需求定义与概念设计 348
22.2.2 产品规模与资源估算 348
22.2.3 制定进度表 349
22.2.4 开发产品阶段 349
22.3 PSP的数据收集与度量 350
22.3.1 时间数据的收集与度量 350
22.3.2 产品规模数据的收集与度量 350
22.3.3 质量数据的收集与测量 351
22.4 PSP质量管理 354
22.4.1 缺陷与质量 355
22.4.2 工程师的质量职责 355
22.4.3 尽可能早地清除缺陷 355
22.4.4 缺陷预防 355
22.5 PSP与设计 356
22.6 PSP的发展 356
22.6.1 个体度量过程PSP0和PSP0.1 357
22.6.2 个体规划过程PSP1和PSP1.1 357
22.6.3 个体质量管理过程PSP2和PSP2.1 357
22.6.4 个体循环过程PSP3 357
22.7 小结 358
第23章 小组软件过程 359
23.1 TSP的由来与发展 359
23.2 工程协作与工程小组 360
23.3 小组协作的条件 360
23.4 保证小组工作的有效性 361
23.5 TSP的目标与工作 362
23.5.1 TSP的目标 362
23.5.2 小组操作过程 362
23.5.3 TSP流程 363
23.6 启动一个TSP小组 364
23.7 基于TSP的协同工作 368
23.7.1 领导职责 368
23.7.2 人际交流 368
23.7.3 工作跟踪与计划维护 369
23.7.4 平衡工作负载 370
23.8 TSP的质量管理 370
23.8.1 质量计划 371
23.8.2 识别质量问题 375
23.8.3 发现和阻止质量问题 377
23.9 小结 377
参考文献 380