第1篇 软件工程与项目管理 3
第1章 软件工程概述 3
1.1 软件的定义与特点 3
1.1.1 什么是软件 3
1.1.2 软件的特点与本质 4
1.1.3 “没有银弹”——复杂性是“软件危机”的本质原因 6
1.2 软件工程的定义及研究的内容 9
1.2.1 科学、工程与技术的界定 9
1.2.2 软件工程的定义与原理 10
1.2.3 软件工程的3个要素 11
1.2.4 软件开发方法——对客观世界的认知观 12
1.2.5 软件工程与相关科学的关系 14
1.3 软件工程的教育与知识体系 15
1.3.1 软件工程的教育体系 15
1.3.2 CC2005的4个方向专业规范 17
1.3.3 软件工程的知识体系——SWEBOK 18
1.4 软件工程的标准 20
1.4.1 软件工程标准化的意义 20
1.4.2 软件工程的国际标准与体系 21
1.4.3 国家标准 22
1.5 计算机辅助软件工程 23
1.6 软件工程人员的职业道德与行为准则 24
本章小结 25
思考与练习 26
第2章 软件过程 27
2.1 软件过程 27
2.1.1 过程及其特征 27
2.1.2 软件过程的公共框架 28
2.2 软件过程模型 29
2.2.1 理解软件过程模型 29
2.2.2 瀑布模型 29
2.2.3 演化软件过程模型 30
2.2.4 快速原型开发方法 33
2.2.5 统一软件过程 34
2.2.6 核心工作流 36
2.2.7 形式化方法模型 37
2.2.8 软件复用——基于构件的开发方法 37
2.2.9 第4代技术 39
2.2.10 微软公司的软件过程模型 39
2.3 软件过程改进 41
2.3.1 软件能力成熟度模型——CMM与CMMI 41
2.3.2 CMM/CMMI的应用及面临的问题 44
2.3.3 个体软件过程 45
2.3.4 团队软件过程 46
2.3.5 CMM、TSP、PSP三者的关系 47
本章小结 47
思考与练习 48
第3章 软件工程领域下的项目管理 49
3.1 项目管理的历史实践 49
3.1.1 远古的伟大工程实践 49
3.1.2 沟通的故事——巴比伦塔的倒塌 50
3.2 软件项目管理的范围与内容 51
3.2.1 什么是项目管理 51
3.2.2 软件项目管理的范围 52
3.2.3 人员 53
3.2.4 产品 55
3.2.5 过程 57
3.2.6 项目 57
3.3 软件项目管理的活动——从这里开始 58
3.3.1 软件项目管理的活动概述 59
3.3.2 项目沟通与需求管理 59
3.3.3 软件项目计划的制定 61
3.3.4 项目范围与管理 62
3.3.5 工作分解结构 63
3.3.6 软件项目的组织 65
3.4 项目进度管理 66
3.4.1 项目里程碑 67
3.4.2 人员与工作量分配 68
3.4.3 项目进度管理的可视化工具 69
3.4.4 项目管理软件及其功能 70
本章小结 72
思考与练习 72
第4章 软件项目估算 74
4.1 软件项目估算概述 74
4.1.1 什么是估算 74
4.1.2 软件项目估算的特点 75
4.1.3 软件项目估算的复杂性分析 75
4.1.4 软件项目估算的相关内容 77
4.2 项目规模估算 78
4.2.1 基于代码行的规模估算 79
4.2.2 功能点估算 80
4.2.3 基于计划评审技术的规模估算 82
4.3 工作量估算 83
4.3.1 用代码行与功能点估算工作量的例子 84
4.3.2 基于数学模型的工作量估算 84
4.3.3 COCOMO模型 85
4.3.4 COCOMOⅡ模型 87
4.3.5 Putnam模型 90
4.4 软件成本估算 91
4.4.1 软件项目成本的组成 91
4.4.2 软件成本的估算方法 92
4.4.3 估算技术的应用与评价 95
4.5 项目进度估算 98
4.5.1 三点估算方法 98
4.5.2 项目进度获取值分析——项目计划与实际进展的定量比较 99
4.6 软件工程经济学 101
4.6.1 经济学与工程经济学 101
4.6.2 软件工程经济学研究的基本问题 101
4.6.3 资金的时间价值 102
4.6.4 软件工程经济学中的成本效益评价技术 106
本章小结 108
思考与练习 108
第5章 软件质量管理 111
5.1 软件质量及其特性 111
5.1.1 难以定义和度量的软件质量 111
5.1.2 软件质量特性 112
5.1.3 软件质量保证及其活动 114
5.2 软件配置管理 115
5.2.1 制定项目的配置计划 116
5.2.2 软件配置项及其标识 117
5.2.3 版本控制 118
5.2.4 变更控制 120
5.2.5 正式技术复审 121
本章小结 123
思考与练习 124
第6章 软件风险管理 125
6.1 软件项目的风险管理 125
6.1.1 风险与项目风险 125
6.1.2 软件项目风险与管理 127
6.1.3 软件风险的定义 129
6.1.4 软件风险的类型 130
6.2 软件风险管理的体系框架 131
6.2.1 常见风险管理过程框架 131
6.2.2 软件风险管理的一般过程 133
6.3 风险识别 134
6.3.1 风险识别过程 134
6.3.2 风险识别的方法与工具 135
6.4 风险分析 138
6.4.1 风险分析过程 138
6.4.2 风险分析的技术与工具 139
6.5 风险规划 143
6.5.1 风险规划过程 143
6.5.2 风险规划的工具与技术 144
6.6 风险监控 144
6.6.1 风险监控过程 144
6.6.2 风险监控的技术与方法 146
6.6.3 风险监控与管理计划——RMMM计划 147
本章小结 147
思考与练习 148
第2篇 结构化开发方法 153
第7章 面向过程的结构化分析 153
7.1 系统工程 153
7.1.1 系统论 153
7.1.2 系统工程 154
7.1.3 系统工程层次结构 155
7.1.4 业务过程工程 156
7.1.5 产品工程 156
7.2 需求分析 157
7.2.1 需求分析概述和特点 158
7.2.2 软件需求分析的目标 159
7.2.3 需求分析的过程 159
7.2.4 需求获取技术 161
7.3 结构化分析方法 162
7.3.1 数据流图 163
7.3.2 状态图 178
7.3.3 实体-关系图(E-R图) 178
本章小结 180
思考与练习 180
第8章 面向过程的结构化设计 182
8.1 软件设计的基本概念和原理 182
8.1.1 抽象 182
8.1.2 信息隐蔽 183
8.1.3 模块化设计 183
8.1.4 模块独立 184
8.1.5 耦合 184
8.1.6 内聚 185
8.1.7 结构图 186
8.2 软件总体设计的任务和目标 187
8.3 结构化软件设计 188
8.3.1 基本概念 188
8.3.2 变换分析 191
8.3.3 事务分析 194
8.4 过程设计 197
8.4.1 程序流程图 198
8.4.2 盒式(N-S)图 199
8.4.3 PAD 200
8.4.4 PDL 201
8.4.5 判定表 203
8.4.6 判定树 203
8.5 Jackson设计方法 204
本章小结 208
思考与练习 208
第9章 面向过程的结构化实现 211
9.1 概述 211
9.2 编码 211
9.2.1 软件编码的基本概念 211
9.2.2 程序设计语言的选择 212
9.2.3 编码风格 213
9.3 软件测试 213
9.3.1 软件测试的概述 213
9.3.2 软件测试方法 215
9.3.3 软件测试步骤 224
9.4 调试 229
9.5 软件测试文档 231
本章小结 232
思考与练习 232
第10章 软件的技术度量 234
10.1 软件度量的基本概念 234
10.1.1 测量、测度、度量、指标和估算 234
10.1.2 软件度量的分类 235
10.1.3 软件度量的目的 235
10.1.4 有效软件度量的属性 235
10.2 分析模型的度量 236
10.2.1 基于功能点的度量 236
10.2.2 bang度量 237
10.2.3 规格说明质量的度量 239
10.3 设计模型的度量 239
10.3.1 体系结构设计度量 239
10.3.2 构件级设计度量 241
10.4 源代码度量 244
10.5 对测试的度量 246
10.6 对维护的度量 246
10.7 软件质量的度量 247
本章小结 251
思考与练习 252
第3篇 面向对象的开发方法 257
第11章 面向对象概述 257
11.1 面向对象的基本思想 257
11.2 面向对象软件开发方法的优缺点 259
11.3 面向对象的基本概念 260
11.3.1 对象 260
11.3.2 类 261
11.3.3 属性和方法 261
11.3.4 抽象、封装和信息隐藏 261
11.3.5 继承 262
11.3.6 多态 263
11.3.7 关联 264
11.3.8 协作 264
11.3.9 聚合 265
11.3.10 持久性 265
11.4 统一建模语言:UML概述 266
11.4.1 UML的发展历程 266
11.4.2 UML的特点 267
11.5 UML的视图 268
11.5.1 用例图 269
11.5.2 类图 269
11.5.3 对象图 270
11.5.4 顺序图 271
11.5.5 协作图 272
11.5.6 状态图 272
11.5.7 包图 273
11.5.8 部署图 273
11.6 面向对象软件的开发过程 274
11.7 UML建模工具 275
11.7.1 商用建模工具 275
11.7.2 开源UML建模工具 276
本章小结 276
思考与练习 277
第12章 面向对象分析 279
12.1 收集需求 280
12.1.1 面向对象的软件需求概述 280
12.1.2 系统范围 281
12.1.3 参与者 282
12.1.4 用例 284
12.1.5 用例图 285
12.1.6 用例规约 285
12.1.7 使用包组织用例 288
12.2 基于类的建模 289
12.2.1 识别类 289
12.2.2 CRC建模 291
12.2.3 分析类的职责 293
12.2.4 寻找协作者 294
12.2.5 通过场景验证CRC模型 294
12.2.6 CRC建模的优缺点 296
12.3 类模型 296
12.3.1 类、属性和方法 297
12.3.2 类的层次结构 297
12.3.3 关联 297
12.3.4 聚合 298
12.3.5 类图 298
12.4 动态交互建模 299
12.4.1 顺序图 300
12.4.2 协作图 302
12.4.3 活动图 302
12.5 基于控制行为建模 304
本章小结 305
思考与练习 306
第13章 面向对象设计 309
13.1 划分分析模型 310
13.2 系统逻辑架构 312
13.2.1 经典3层架构 312
13.2.2 多层架构 313
13.3 类模型设计 314
13.3.1 类的设计 314
13.3.2 接口设计 315
13.3.3 属性、方法建模 316
13.3.4 对象之间可见性设计 316
13.3.5 用例迭代实现 317
13.3.6 重构 318
13.4 类的设计原则 319
13.4.1 开闭原则 319
13.4.2 Liskov替换原则 320
13.4.3 依赖倒置原则 322
13.4.4 接口分离原则 322
13.5 设计模式 324
13.5.1 单件模式 324
13.5.2 抽象工厂模式 325
13.6 对象持久性建模 327
13.6.1 映射对象 328
13.6.2 继承关系映射 328
13.6.3 关联和聚合映射 330
13.6.4 持久性框架 331
13.7 部署建模 331
本章小结 332
思考与练习 333
第14章 面向对象测试 335
14.1 全生命周期面向对象测试 336
14.2 面向对象测试策略 336
14.2.1 面向对象的单元测试 337
14.2.2 面向对象的集成测试 337
14.2.3 面向对象的确认测试 337
14.3 基于场景的模型测试 338
14.3.1 场景设计 338
14.3.2 测试用例设计 339
14.4 类测试 340
14.4.1 类的代码检查 340
14.4.2 覆盖和路径测试 341
14.4.3 类的随机测试 341
14.4.4 类的划分测试 341
14.5 类间测试 342
14.5.1 多个类测试 342
14.5.2 从类的行为模型导出的测试 343
本章小结 343
思考与练习 344
第15章 面向对象系统的技术度量 345
15.1 OO度量的识别特征 345
15.1.1 局部化 346
15.1.2 封装 346
15.1.3 信息隐蔽 346
15.1.4 继承 346
15.1.5 抽象 346
15.2 分析、设计模型的度量 347
15.3 OO项目的度量 348
15.4 面向类的度量 349
15.4.1 CK度量套件 349
15.4.2 LK度量组 352
15.4.3 MOOD度量套件 353
15.5 面向操作的度量 355
15.6 面向对象测试的度量 356
本章小结 356
思考与练习 357
第4篇 软件工程高级专题 363
第16章 敏捷过程开发 363
16.1 敏捷的定义 364
16.1.1 什么是敏捷 364
16.1.2 什么是敏捷过程 365
16.2 敏捷过程模型 365
16.2.1 极限编程 365
16.2.2 自适应软件开发 367
16.2.3 动态系统开发方法 369
16.2.4 Scrum 370
16.2.5 Crystal 372
16.2.6 特征驱动开发 373
16.2.7 精益开发 375
16.3 设计自己的敏捷方法 378
本章小结 378
思考与练习 379
第17章 Web工程 380
17.1 基于Web的系统及应用 380
17.1.1 Web应用的发展 380
17.1.2 Web应用的特点和分类 383
17.1.3 Web应用的开发团队 384
17.2 Web工程 386
17.3 Web工程技术 386
17.3.1 Web服务器技术 387
17.3.2 Web开发技术 388
17.3.3 Web辅助技术 389
17.4 Web工程的层次 391
17.4.1 质量 391
17.4.2 过程 392
17.4.3 方法 393
17.4.4 工具 395
17.5 Web工程过程 395
17.5.1 分析 396
17.5.2 设计 398
17.5.3 测试 403
17.5.4 发布、维护 408
本章小结 408
思考与练习 408
第18章 形式化方法 409
18.1 形式化方法简介 409
18.1.1 形式化方法的引入 409
18.1.2 形式化方法的分类 410
18.1.3 形式化规格方法的主要思想 411
18.2 Petri网 411
18.2.1 基本概念 411
18.2.2 Petri网的性质 415
18.2.3 Petri网的分析 417
18.2.4 实例:ATM系统 423
18.3 Z语言 424
18.3.1 基本概念 424
18.3.2 模式运算 426
18.3.3 操作模式 430
18.3.4 实例:ATM系统 431
18.4 形式化方法的优缺点 432
18.5 形式化方法的发展 433
本章小结 433
思考与练习 434
附录A 软件工程和知识可视化表征 436