第1章 软件工程学概论 1
1.1 软件的基本概念 1
1.1.1 软件与软件特性 1
1.1.2 软件的分类 2
1.2 软件危机 4
1.3 软件工程 5
1.3.1 软件工程的基本原理 6
1.3.2 软件工程学科包含的领域 7
1.4 软件工程的方法、工具与环境 8
1.4.1 软件工程的方法、工具与环境 8
1.4.2 软件开发的基本策略 11
1.5 软件过程与软件生命周期 12
1.5.1 软件过程 12
1.5.2 软件生命周期的各个阶段 13
1.6 常见的软件过程模型 16
1.6.1 瀑布模型 16
1.6.2 快速原型模型 17
1.6.3 演化模型 18
1.6.4 螺旋模型 19
1.6.5 喷泉模型 20
1.7 小结 21
习题1 22
第2章 项目分析与软件需求分析 23
2.1 软件项目的问题定义 23
2.2 软件项目可行性分析 24
2.3 软件系统的需求 27
2.3.1 功能需求 27
2.3.2 非功能需求 28
2.3.3 软件需求分析的风险 30
2.4 用户需求获取 31
2.5 软件需求文档与规格说明 33
2.5.1 自然语言描述 33
2.5.2 结构化描述 34
2.5.3 软件需求文档 35
2.6 系统流程图 36
2.7 数据流图 38
2.7.1 数据流图的符号 38
2.7.2 设计数据流图的步骤和示例 39
2.7.3 数据流图中命名的可理解性 41
2.7.4 数据流图的用途 42
2.7.5 数据流图中的数据字典 43
2.8 实体-联系图 46
2.9 需求分析中使用的其他图形工具 48
2.10 面向数据流的建模 51
2.11 需求有效性验证 53
2.12 实例分析——教材征订业务分析 54
2.13 小结 58
习题2 58
第3章 软件总体设计 60
3.1 总体设计 60
3.2 软件总体设计原理 64
3.2.1 设计原理 64
3.2.2 启发式规则 71
3.3 描绘软件结构的图形工具 73
3.3.1 层次图和HIPO图 73
3.3.2 软件结构图 74
3.4 映射数据流到软件结构 75
3.4.1 变换流 75
3.4.2 事务流 76
3.4.3 变换映射(变换分析) 76
3.4.4 事务映射(事务分析) 78
3.4.5 设计优化——精化软件结构 79
3.5 数据库结构设计过程 80
3.6 实例分析 81
3.7 小结 83
习题3 84
第4章 软件详细设计 85
4.1 结构化程序设计 86
4.1.1 结构化的控制结构 86
4.1.2 结构化程序设计的实现方法 87
4.1.3 结构化程序设计的特点 88
4.2 用户界面设计 88
4.2.1 黄金规则 89
4.2.2 用户界面的分析与设计 90
4.2.3 界面分析 92
4.2.4 界面设计步骤 94
4.3 程序算法设计工具 96
4.3.1 图形化设计工具 97
4.3.2 表格式设计表示 101
4.3.3 程序设计语言 102
4.3.4 程序算法设计工具的比较 103
4.4 面向数据结构的设计方法 104
4.4.1 Jackson数据结构图 104
4.4.2 改进的Jackson图 105
4.4.3 Jackson方法的设计过程 105
4.5 程序复杂度的概念及度量方法 108
4.6 小结 111
习题4 111
第5章 软件实现 113
5.1 软件编码 113
5.1.1 编码目的 113
5.1.2 程序设计语言的选择 114
5.1.3 良好的编程实践 115
5.1.4 程序员的基本素质 117
5.2 软件测试基础 118
5.3 测试设计和管理 120
5.3.1 错误曲线 120
5.3.2 软件测试配置 120
5.3.3 测试用例设计 122
5.4 软件测试过程 124
5.4.1 软件测试基本原则 125
5.4.2 软件测试的步骤、测试信息流 126
5.4.3 软件测试组织与人员 127
5.5 软件测试的基本方法 128
5.5.1 软件测试方法与技术 128
5.5.2 软件测试的误区 130
5.6 软件测试策略 132
5.6.1 测试策略 132
5.6.2 单元测试 133
5.6.3 集成测试(组装测试) 135
5.6.4 确认测试(有效性测试) 139
5.6.5 系统测试与验收测试 140
5.7 白盒测试 142
5.7.1 逻辑覆盖法 142
5.7.2 基本路径测试法 146
5.8 黑盒测试 149
5.8.1 等价类划分法 149
5.8.2 边界值分析法 150
5.8.3 错误推测法 151
5.8.4 状态测试法 151
5.9 回归测试 152
5.10 软件调试 153
5.10.1 软件调试的目的与原则 154
5.10.2 软件调试技术 154
5.10.3 调试技巧 156
5.11 小结 156
习题5 156
第6章 软件维护 159
6.1 软件维护的基本概念 159
6.2 软件维护的任务和分类 160
6.3 软件维护过程 161
6.4 维护的管理 164
6.5 预防性维护 169
6.6 软件维护的副作用 170
6.7 软件文档与编写要求及方法 171
6.7.1 软件文档的重要性与分类 171
6.7.2 软件文档应该满足的要求 173
6.7.3 对软件文档编制的质量要求 174
6.7.4 软件文档的管理和维护 175
6.8 软件逆向工程和再工程 176
6.9 小结 178
习题6 178
第7章 面向对象软件工程方法学 179
7.1 面向对象的概念 179
7.2 从认识论看面向对象方法的形成 181
7.2.1 软件开发——对事物的认识和描述 181
7.2.2 语言的鸿沟 181
7.2.3 面向对象编程语言的发展使鸿沟变小 182
7.2.4 软件工程学的作用 183
7.3 面向对象方法的基本概念 186
7.3.1 面向对象的基本概念 186
7.3.2 面向对象的主要特征 186
7.4 统一过程与统一建模语言 187
7.4.1 统一过程概述 187
7.4.2 统一过程生命周期 189
7.4.3 统一建模语言 192
7.5 迭代和增量过程 194
7.5.1 为什么采用迭代和增量的开发方法 194
7.5.2 迭代方法是风险驱动的 198
7.5.3 通用迭代过程 198
7.5.4 一次迭代产生一个增量结果 200
7.5.5 在整个生命周期上的迭代 200
7.5.6 由迭代过程来演化模型 202
7.6 小结 202
习题7 203
第8章 用例驱动 204
8.1 用例驱动开发概述 205
8.2 为什么使用用例 206
8.2.1 根据需求的价值捕获用例 207
8.2.2 用例驱动开发过程 207
8.3 确定客户需要什么 208
8.4 需求工作流 209
8.5 领域模型 211
8.6 业务模型 212
8.7 补充需求 216
8.8 初始需求 216
8.9 初始需求:考勤系统实例研究 218
8.9.1 聆听 218
8.9.2 确定参与者 219
8.9.3 确定用例 220
8.9.4 简要说明用例 222
8.9.5 描述用例模型 223
8.10 继续需求流:考勤系统实例研究 224
8.10.1 区分用例的优先级 224
8.10.2 详细描述用例 225
8.10.3 构造用户界面原型 230
8.11 修订需求:考勤系统实例研究 233
8.12 测试工作流:考勤系统实例研究 241
8.13 需求规格说明书 242
8.14 小结 243
习题8 243
第9章 面向对象分析 244
9.1 分析工作流 244
9.2 分析模型 246
9.3 确定分析包 248
9.3.1 处理分析包之间的共性 248
9.3.2 确定服务包 249
9.3.3 确定分析包间的依赖 250
9.4 提取实体类 251
9.4.1 实体类的提取 251
9.4.2 面向对象分析:电梯问题实例研究 251
9.4.3 功能建模:电梯问题实例研究 252
9.4.4 实体类建模:电梯问题实例研究 253
9.4.5 动态建模:电梯问题实例研究 256
9.4.6 测试工作流:电梯问题案例研究 257
9.5 提取边界类和控制类 260
9.6 初始功能模型:考勤系统实例研究 260
9.6.1 划分用例等级 260
9.6.2 寻找候选对象 264
9.7 分析类 268
9.7.1 确定职责 268
9.7.2 确定属性 269
9.7.3 确定关联和聚合 269
9.7.4 确定泛化 270
9.7.5 捕获特殊需求 270
9.8 初始类图:考勤系统实例研究 271
9.8.1 寻找“Login”中的关系 271
9.8.2 寻找“RecordFime”中的关系 272
9.8.3 寻找“ExportTimeEntries”中的关系 272
9.9 描述分析对象间的交互 273
9.10 用例实现:考勤系统实例研究 274
9.10.1 为“Login”添加假设的行为 274
9.10.2 为“Login”构建顺序图 275
9.11 分析包 277
9.12 类图递增:考勤系统实例研究 278
9.13 测试流与分析工作流中的规格说明文档 279
9.14 小结 280
习题9 281
第10章 构架为中心 282
10.1 构架概述 283
10.2 为什么需要构架 284
10.3 用例和构架 285
10.4 建立构架的步骤 287
10.4.1 构架基线是一个“小的、皮包骨的”系统 287
10.4.2 使用构架模式 288
10.4.3 描述构架 289
10.4.4 构架设计师创建构架 291
10.4.5 构架师 291
10.4.6 建立构架的过程 292
10.5 构架描述 293
10.6 建立软件构架:考勤系统实例研究 296
10.6.1 确立目标 296
10.6.2 将类分组并评估每个类 297
10.6.3 展示技术 301
10.6.4 抽取子系统 302
10.6.5 应用原则和目标对构架进行评估 303
10.7 小结 304
习题10 304
第11章 设计和模式 305
11.1 设计在软件生命周期中的作用 305
11.2 设计工作流 307
11.3 设计模式 311
11.3.1 设计原则 311
11.3.2 模式简介 312
11.3.3 设计模式的优势与应用 316
11.4 规划设计工作 316
11.4.1 建立整个设计目标 317
11.4.2 建立设计准则 318
11.4.3 寻找独立的设计工作 318
11.5 设计包或子系统 319
11.6 设计工作流:考勤系统实例研究 319
11.7 HTMLProduction框架 320
11.7.1 设计目标 320
11.7.2 按目标进行设计 323
11.7.3 填充细节 332
11.7.4 实现工作流 335
11.8 TimeCardUI包 338
11.8.1 评审 338
11.8.2 针对目标进行设计 340
11.8.3 用例设计 341
11.8.4 实现工作流 344
11.9 设计度量与用于设计的CASE工具 344
11.10 小结 345
习题11 346
第12章 面向对象实现 347
12.1 实现在软件生命周期中的作用 347
12.2 实现工作流 349
12.2.1 构架实现 349
12.2.2 系统集成 350
12.2.3 实现子系统 352
12.2.4 实现类 353
12.2.5 执行单元测试 354
12.3 集成 356
12.4 测试工作流 360
12.5 用于实现的CASE工具 364
12.6 小结 366
习题12 366
第13章 软件复用和构件技术 368
13.1 复用的概念 368
13.2 复用的障碍与复用技巧 369
13.3 对象和复用 372
13.3.1 OO方法对软件复用的支持 372
13.3.2 复用技术对OO方法的支持 373
13.4 构件及构件技术 374
13.4.1 构件 374
13.4.2 构件技术模型 375
13.4.3 当前主流构件模型 375
13.4.4 构件的开发与复用 377
13.5 设计和实现期间的复用 378
13.6 复用及互联网 381
13.7 小结 382
习题13 382
第14章 现代软件工程 383
14.1 现代软件工程发展的主要技术特点 383
14.2 开源软件运动 385
14.2.1 开源软件的定义与由来 385
14.2.2 Oss项目的优势与开发经验 387
14.2.3 如何看待开源软件 388
14.3 领域工程 389
14.3.1 基于领域工程的软件开发概述 389
14.3.2 基于构件的软件工程 390
14.3.3 领域工程建模过程 391
14.4 敏捷软件开发过程及实践 392
14.4.1 敏捷思想与实践原则 392
14.4.2 支持敏捷软件开发的技术和管理手段 394
14.4.3 极限编程 396
14.4.4 其他敏捷软件开发方法 397
14.5 测试驱动开发 398
14.5.1 测试驱动开发思想 398
14.5.2 支持测试驱动开发的软件工具 400
14.5.3 测试驱动开发过程 401
14.6 现代软件工程其他新方法 401
习题14 404
附录:软件工程师职业素质及道德规范 405
F1.软件工程师职业素质 405
F2.软件工程师道德规范 406