第1章 软件工程的范畴 1
1.1历史方面 2
1.2经济方面 4
1.3维护性方面 4
1.3.1维护的传统和现代观点 5
1.3.2交付后维护的重要性 7
1.4需求、分析和设计方面 8
1.5小组编程方面 9
1.6为什么没有计划阶段 10
1.7为什么没有测试阶段 11
1.8为什么没有文档阶段 11
1.9面向对象范型 11
1.10正确看待面向对象范型 14
1.11术语 15
1.12道德问题 17
本章回顾 18
进一步阅读指导 18
习题 19
第一部分软件工程概念 23
第2章 软件生命周期模型 23
2.1理论上的软件开发 23
2.2 Winburg小型实例研究 23
2.3 Winburg小型实例研究心得 25
2.4野鸭拖拉机公司小型实例研究 26
2.5迭代和递增 26
2.6修订的Winburg小型实例研究 29
2.7迭代和递增的风险和其他方面 30
2.8迭代和递增的控制 32
2.9其他生命周期模型 32
2.9.1编码-修补生命周期模型 32
2.9.2瀑布生命周期模型 32
2.9.3快速原型开发生命周期模型 34
2.9.4开源生命周期模型 34
2.9.5敏捷过程 36
2.9.6同步-稳定生命周期模型 38
2.9.7螺旋生命周期模型 38
2.10生命周期模型的比较 41
本章回顾 41
进一步阅读指导 42
习题 43
第3章 软件过程 44
3.1统一过程 45
3.2面向对象范型内的迭代和递增 46
3.3需求流 47
3.4分析流 47
3.5设计流 49
3.6实现流 50
3.7测试流 50
3.7.1需求制品 50
3.7.2分析制品 50
3.7.3设计制品 51
3.7.4实现制品 51
3.8交付后维护 52
3.9退役 52
3.10统一过程的各阶段 53
3.10.1开始阶段 53
3.10.2细化阶段 55
3.10.3构建阶段 55
3.10.4转换阶段 55
3.11一维与二维生命周期模型 56
3.12改进软件过程 57
3.13能力成熟度模型 57
3.14软件过程改进方面的其他努力 60
3.15软件过程改进的代价和收益 60
本章回顾 61
进一步阅读指导 62
习题 62
第4章 软件小组 64
4.1小组组织 64
4.2民主小组方法 65
4.3传统的主程序员小组方法 66
4.3.1《纽约时报》项目 67
4.3.2传统的主程序员小组方法的不实用性 67
4.4主程序员小组和民主小组之外的编程小组 68
4.5同步-稳定小组 69
4.6敏捷过程小组 70
4.7开源编程小组 70
4.8人员能力成熟度模型 71
4.9选择合适的小组组织 71
本章回顾 72
进一步阅读指导 72
习题 73
第5章 软件工程工具 74
5.1逐步求精法 74
5.2成本-效益分析法 78
5.3分治 79
5.4关注分离 79
5.5软件度量 79
5.6 CASE 80
5.7 CASE的分类 81
5.8 CASE的范围 82
5.9软件版本 84
5.9.1修订版 85
5.9.2变种版 85
5.10配置控制 85
5.10.1交付后维护期间的配置控制 87
5.10.2基准 87
5.10.3产品开发过程中的配置控制 87
5.11建造工具 88
5.12使用CASE技术提高生产力 88
本章回顾 89
进一步阅读指导 89
习题 90
第6章 测试 92
6.1质量问题 92
6.1.1软件质量保证 93
6.1.2管理独立 93
6.2非执行测试 94
6.2.1走查 94
6.2.2管理走查 94
6.2.3审查 95
6.2.4审查与走查的对比 96
6.2.5评审的优缺点 96
6.2.6审查的度量 97
6.3执行测试 97
6.4应该测试什么 97
6.4.1实用性 98
6.4.2可靠性 98
6.4.3健壮性 98
6.4.4性能 98
6.4.5正确性 99
6.5测试与正确性证明 100
6.5.1正确性证明的例子 100
6.5.2正确性证明小型实例研究 102
6.5.3正确性证明和软件工程 103
6.6谁应当完成执行测试 104
6.7测试什么时候停止 105
本章回顾 105
进一步阅读指导 106
习题 106
第7章 从模块到对象 108
7.1什么是模块 108
7.2内聚 110
7.2.1偶然性内聚 110
7.2.2逻辑性内聚 111
7.2.3时间性内聚 111
7.2.4过程性内聚 112
7.2.5通信性内聚 112
7.2.6功能性内聚 112
7.2.7信息性内聚 113
7.2.8内聚示例 113
7.3耦合 114
7.3.1内容耦合 114
7.3.2共用耦合 114
7.3.3控制耦合 115
7.3.4印记耦合 116
7.3.5数据耦合 117
7.3.6耦合示例 117
7.3.7耦合的重要性 118
7.4数据封装 118
7.4.1数据封装和产品开发 120
7.4.2数据封装和产品维护 121
7.5抽象数据类型 125
7.6信息隐藏 126
7.7对象 127
7.8继承、多态和动态绑定 130
7.9面向对象范型 131
本章回顾 133
进一步阅读指导 133
习题 134
第8章 可重用性和可移植性 136
8.1重用的概念 136
8.2重用的障碍 138
8.3重用实例研究 139
8.3.1 Raytheon导弹系统部 139
8.3.2欧洲航天局 140
8.4对象和重用 140
8.5设计和实现期间的重用 141
8.5.1设计重用 141
8.5.2应用框架 141
8.5.3设计模式 142
8.5.4软件体系结构 143
8.5.5基于组件的软件工程 144
8.6其他设计模式 144
8.6.1 FLIC小型实例研究 144
8.6.2适配器设计模式 145
8.6.3桥设计模式 145
8.6.4迭代器设计模式 146
8.6.5抽象工厂设计模式 147
8.7设计模式的种类 149
8.8设计模式的优缺点 150
8.9重用及互联网 151
8.10重用和交付后维护 151
8.11可移植性 152
8.11.1硬件的不兼容性 152
8.11.2操作系统的不兼容性 153
8.11.3数值计算软件的不兼容性 153
8.11.4编译器的不兼容性 154
8.12为什么需要可移植性 156
8.13实现可移植性的技术 157
8.13.1可移植的系统软件 157
8.13.2可移植的应用软件 157
8.13.3可移植的数据 158
8.13.4模型驱动结构 158
本章回顾 159
进一步阅读指导 159
习题 160
第9章 计划和估算 162
9.1计划和软件过程 162
9.2周期和成本估算 163
9.2.1产品规模的度量 164
9.2.2成本估算技术 166
9.2.3中间COCOMO 167
9.2.4 COCOMO11 170
9.2.5跟踪周期和成本估算 170
9.3软件项目管理计划的组成 171
9.4软件项目管理计划框架 171
9.5 IEEE软件项目管理计划 172
9.6计划测试 174
9.7计划面向对象的项目 175
9.8培训需求 175
9.9文档标准 176
9.10用于计划和估算的CASE工具 176
9.11测试软件项目管理计划 176
本章回顾 176
进一步阅读指导 177
习题 177
第二部分 软件生命周期的工作流 180
第10章 第一部分的关键内容 180
10.1软件开发:理论与实践 180
10.2迭代和递增 180
10.3统一过程 183
10.4工作流概述 183
10.5软件小组 184
10.6成本-效益分析法 184
10.7度量 184
10.8 CASE 184
10.9版本和配置 185
10.10测试术语 185
10.11执行测试和非执行测试 185
10.12模块性 185
10.13重用 186
10.14软件项目管理计划 186
本章回顾 186
习题 186
第11章 需求 188
11.1确定客户需要什么 188
11.2需求流概述 189
11.3理解应用域 189
11.4业务模型 190
11.4.1访谈 190
11.4.2其他技术 190
11.4.3用例 191
11.5初始需求 192
11.6对应用域的初始理解:MSG基金实例研究 192
11.7初始业务模型:MSG基金实例研究 194
11.8初始需求:MSG基金实例研究 196
11.9继续需求流:MSG基金实例研究 197
11.10修订需求:MSG基金实例研究 198
11.11测试流:MSG基金实例研究 203
11.12传统的需求阶段 209
11.13快速原型开发 209
11.14人的因素 210
11.15 重用快速原型 211
11.16需求流的CASE工具 212
11.17需求流的度量 212
11.18需求流面临的挑战 213
本章回顾 214
进一步阅读指导 214
习题 215
第12章 传统的分析 217
12.1规格说明文档 217
12.2非形式化规格说明 218
12.3结构化系统分析 219
12.4结构化系统分析:MSG基金实例研究 224
12.5其他半形式化技术 225
12.6建造实体-关系模型 226
12.7有穷状态机 227
12.8 Petri网 231
12.9 Z 234
12.9.1 Z:电梯问题实例研究 234
12.9.2 Z的分析 236
12.10其他的形式化技术 236
12.11传统分析技术的比较 237
12.12在传统分析阶段测试 238
12.13传统分析阶段的CASE工具 238
12.14传统分析阶段的度量 239
12.15软件项目管理计划:MSG基金实例研究 239
12.16传统分析阶段面临的挑战 239
本章回顾 239
进一步阅读指导 240
习题 241
第13章 面向对象分析 244
13.1分析流 244
13.2抽取实体类 245
13.3面向对象分析:电梯问题实例研究 245
13.4功能建模:电梯问题实例 研究 246
13.5实体类建模:电梯问题实例研究 247
13.5.1名词抽取 248
13.5.2 CRC卡片 249
13.6动态建模:电梯问题实例研究 249
13.7测试流:面向对象分析 251
13.8抽取边界类和控制类 257
13.9初始功能模型:MSG基金实例研究 257
13.10初始类图:MSG基金实例研究 258
13.11初始动态模型:MSG基金实例研究 260
13.12修订实体类:MSG基金实例研究 261
13.13抽取边界类:MSG基金实例研究 262
13.14抽取控制类:MSG基金实例研究 263
13.15 用例实现:MSG基金实例研究 263
13.15.1 Estimate Funds Availablefor Week用例 263
13.15.2 Manage an Asset用例 268
13.15.3 Update Estimated AnnualOperating Expenses用例 271
13.15.4 Produce a Report用例 271
13.16类图递增:MSG基金实例研究 276
13.17测试流:MSG基金实例研究 277
13.18统一过程中的规格说明文档 277
13.19关于参与者和用例更详细的内容 278
13.20面向对象分析流的CASE工具 279
13.21面向对象分析流的度量 279
13.22面向对象分析流面临的挑战 279
本章回顾 280
进一步阅读指导 281
习题 281
第14章 设计 283
14.1设计和抽象 283
14.2面向操作设计 284
14.3数据流分析 284
14.3.1小型实例研究:字数统计 285
14.3.2数据流分析扩展 287
14.4事务分析 289
14.5面向数据设计 290
14.6面向对象设计 290
14.7面向对象设计:电梯问题实例研究 291
14.8面向对象设计:MSG基金实例研究 293
14.9设计流 297
14.10测试流:设计 298
14.11测试流:MSG基金实例研究 299
14.12详细设计的形式化技术 299
14.13实时设计技术 299
14.14设计的CASE工具 300
14.15 设计的度量 300
14.16设计流面临的挑战 301
本章回顾 301
进一步阅读指导 302
习题 302
第15章 实现 304
15.1编程语言的选择 304
15.2第四代语言 306
15.3良好的编程实践 308
15.3.1使用一致和有意义的变量名 308
15.3.2自文档代码的问题 309
15.3.3使用参数 310
15.3.4为增加可读性的代码编排 310
15.3.5嵌套的if语句 310
15.4编码标准 311
15.5代码重用 312
15.6集成 312
15.6.1自顶向下的集成 312
15.6.2自底向上的集成 314
15.6.3三明治集成 314
15.6.4面向对象产品的集成 315
15.6.5集成的管理 315
15.7实现流 315
15.8实现流:MSG基金实例研究 315
15.9测试流:实现 316
15.10测试用例选择 316
15.10.1规格说明测试与代码测试 316
15.10.2规格说明测试的可行性 316
15.10.3代码测试的可行性 317
15.11黑盒单元测试技术 318
15.11.1等价测试和边界值分析 319
15.11.2功能测试 320
15.12黑盒测试用例:MSG基金实例研究 320
15.13玻璃盒单元测试技术 322
15.13.1结构测试:语句、分支和路径覆盖 322
15.13.2复杂性度量 323
15.14代码走查和审查 324
15.15 单元测试技术的比较 324
15.16净室 325
15.17测试对象时潜在的问题 325
15.18单元测试的管理方面 327
15.19何时该重实现而不是调试代码制品 327
15.20集成测试 328
15.21产品测试 329
15.22验收测试 329
15.23测试流:MSG基金实例研究 330
15.24实现的CASE工具 330
15.24.1软件开发全过程的CASE工具 330
15.24.2集成化开发环境 330
15.24.3商业应用环境 331
15.24.4公共工具基础结构 331
15.24.5环境的潜在问题 332
15.25测试流的CASE工具 332
15.26实现流的度量 332
15.27实现流面临的挑战 333
本章回顾 333
进一步阅读指导 334
习题 335
第16章 交付后维护 337
16.1开发与维护 337
16.2为什么交付后维护是必要的 338
16.3对交付后维护程序员的要求是什么 338
16.4交付后维护小型实例研究 340
16.5交付后维护的管理 341
16.5.1缺陷报告 341
16.5.2批准对产品的修改 341
16.5.3确保可维护性 342
16.5.4迭代维护造成的问题 342
16.6面向对象软件的维护 342
16.7交付后维护技能与开发技能 344
16.8逆向工程 345
16.9交付后维护期间的测试 345
16.10交付后维护的CASE工具 346
16.11交付后维护的度量 346
16.12交付后维护:MSG基金实例研究 346
16.13交付后维护面临的挑战 346
本章回顾 347
进一步阅读指导 347
习题 347
第17章UML的进一步讨论 349
17.1 UML不是一种方法 349
17.2类图 350
17.2.1聚合 350
17.2.2多重性 350
17.2.3组合 352
17.2.4泛化 352
17.2.5关联 352
17.3注解 353
17.4用例图 353
17.5构造型 353
17.6交互图 354
17.7状态图 355
17.8活动图 357
17.9包 358
17.10组件图 358
17.11部署图 359
17.12 UML图回顾 359
17.13 UML和迭代 359
本章回顾 359
进一步阅读指导 359
习题 359
第18章 新兴技术 361
18.1面向层面技术 361
18.2模型驱动技术 363
18.3基于组件技术 364
18.4面向服务技术 364
18.5面向服务技术和基于组件技术的比较 364
18.6社交计算 365
18.7 Web工程 365
18.8云技术 366
18.9 Web 3.0 366
18.10计算机安全 366
18.11模型检查 367
18.12目前和未来 367
本章回顾 367
进一步阅读指导 367
附录 368
附录A学期项目:巧克力爱好者匿名 368
附录B软件工程资源 370
附录C需求流:MSG基金实例研究 371
附录D结构化系统分析:MSG基金实例研究 371
附录E分析流:MSG基金实例研究 373
附录F软件项目管理计划:MSG基金实例研究 373
附录G设计流:MSG基金实例研究 375
附录H实现流:MSG基金实例研究(C++版) 380
附录I实现流:MSG基金实例研究(Java版) 380
附录J测试流:MSG基金实例研究 380