第1章 绪论 1
1.1 软件概述 1
1.1.1 软件的特点 1
1.1.2 软件的发展 2
1.1.3 软件危机 2
1.2 软件工程 4
1.2.1 软件工程与方法学 5
1.2.2 软件工程的基本原理 6
1.2.3 软件工程的目标 7
1.2.4 软件工程的内容 8
1.2.5 软件工程面临的问题 8
小结 8
练习题 9
第2章 软件工程的基本理论 10
2.1 软件工程过程 10
2.2 软件生存周期 10
2.2.1 软件分析时期 11
2.2.2 软件设计时期 12
2.2.3 编码与测试时期 13
2.2.4 运行与维护时期 14
2.3 软件生存周期模型 14
2.3.1 软件生存周期模型的概念 14
2.3.2 瀑布模型 15
2.3.3 原型模型 17
2.3.4 增量模型 17
2.3.5 螺旋模型 19
2.3.6 喷泉模型 20
2.3.7 基于知识的模型 21
2.3.8 变换模型 22
2.4 软件开发方法 22
2.4.1 结构化方法 22
2.4.2 Jackson方法 23
2.4.3 维也纳开发方法 23
2.4.4 面向对象的开发方法 24
2.4.5 其他开发方法 24
2.5 软件工具与开发 24
2.5.1 软件工具箱 25
2.5.2 软件开发环境 25
2.5.3 计算机辅助软件工程 25
小结 25
练习题 26
第3章 可行性研究 27
3.1 可行性研究任务与步骤 27
3.1.1 研究任务 27
3.1.2 研究步骤 29
3.2 系统分析 30
3.2.1 系统分析员 31
3.2.2 系统分析员任务 32
3.2.3 面临的问题域 32
3.2.4 通信技术 33
3.3 分析原理 34
3.3.1 信息域 35
3.3.2 建立模型 36
3.3.3 分解 36
3.4 结构化分析 37
3.4.1 自顶向下逐层分解 38
3.4.2 结构化分析步骤 39
3.5 系统流程图 40
3.6 数据流图 41
3.6.1 基本图形符号 42
3.6.2 画数据流图 43
3.6.3 结构化分析方法的应用 46
3.7 数据字典 50
3.7.1 内容及格式 50
3.7.2 数据字典的实现 52
3.8 成本-效益分析 53
3.9 可行性研究的文档 55
3.10 项目开发计划 56
小结 56
练习题 57
第4章 软件需求分析与概念模型 58
4.1 需求分析 58
4.1.1 需求分析的特点 58
4.1.2 需求分析的原则 59
4.1.3 需求分析的任务 59
4.1.4 需求分析的方法 60
4.2 IDEF方法 63
4.2.1 IDEFO的表示 63
4.2.2 IDEFO方法的特点 64
4.2.3 建立功能模型方法 64
4.3 概念模型与规范化 66
4.3.1 数据依赖 66
4.3.2 关系模式的操作异常 67
4.3.3 范式 67
4.3.4 EAR方法 72
小结 75
练习题 75
第5章 总体设计 76
5.1 软件设计的重要性 76
5.2 设计过程 77
5.2.1 软件设计的发展 77
5.2.2 设计活动间的关系 77
5.2.3 设计与软件质量 78
5.3 软件总体设计 78
5.4 设计基本原理 80
5.4.1 抽象 80
5.4.2 细化 81
5.4.3 模块化 81
5.4.4 软件体系结构 83
5.4.5 程序结构 84
5.4.6 数据结构 85
5.4.7 软件过程 86
5.5 体系结构设计 87
5.5.1 软件结构图 87
5.5.2 模块的大小 89
5.5.3 扇出和扇入与深度和宽度 89
5.5.4 模块的藕合 90
5.5.5 模块的内聚 92
5.5.6 模块设计的一般准则 94
5.5.7 模块的作用域与控制域 95
5.6 结构化设计 97
5.6.1 数据流的类型 97
5.6.2 过程步骤 98
5.6.3 变换分析设计 99
5.6.4 事务分析设计 101
5.6.5 混合流设计 102
5.6.6 结构化设计方法应用示例 103
5.6.7 设计的后期处理 104
5.7 IDEFO图的设计方法 105
5.8 软件结构优化 105
5.8.1 软件结构设计优化准则 105
5.8.2 软件结构的HIPO图 107
小结 108
练习题 109
第6章 软件细节设计 110
6.1 细节设计的任务与方法 110
6.1.1 细节设计的基本任务 110
6.1.2 细节设计方法 111
6.2 设计表示法 112
6.2.1 结构化语言 112
6.2.2 判定表 113
6.2.3 判定树 114
6.3 结构化程序设计 114
6.3.1 结点 114
6.3.2 三种基本控制结构 115
6.3.3 正规程序 116
6.3.4 基本程序 117
6.3.5 结构化程序 118
6.4 结构化定理 118
6.4.1 程序函数 119
6.4.2 基本定理 119
6.4.3 非结构化转换为结构化 121
6.4.4 过程设计语言 123
6.5 图形工具 126
6.5.1 PAD图 126
6.5.2 盒图 127
6.6 面向数据结构的设计 128
6.6.1 Jackson图 129
6.6.2 纲要逻辑 130
6.6.3 Jackson方法 131
6.6.4 JSP应用 132
6.6.5 JSD方法 135
小结 140
练习题 140
第7章 面向对象方法学 141
7.1 传统方法学的缺点 141
7.1.1 问题的表现 141
7.1.2 问题的原因 142
7.2 面向对象的基本概念 144
7.2.1 对象(Object) 144
7.2.2 类(Class) 145
7.2.3 继承(Inheritance) 146
7.2.4 封装(Encapsulation) 147
7.2.5 消息(Message) 147
7.2.6 结构与连接 148
7.2.7 多态性 149
7.2.8 其他概念 150
7.3 对象模型 151
7.3.1 表示方法 151
7.3.2 表示结构 152
7.3.3 例子 154
7.4 动态模型 154
7.4.1 术语 154
7.4.2 表示方法 155
7.4.3 例子 155
7.5 功能模型 156
7.5.1 表示方法 156
7.5.2 与其他两种模型的关系 156
小结 157
练习题 157
第8章 面向对象分析 158
8.1 分析的基本过程 158
8.1.1 过程简述 158
8.1.2 基本模型 159
8.1.3 主要活动 160
8.2 对象的发现和标识 162
8.2.1 动机 162
8.2.2 方法 163
8.2.3 三视图模型(3VM) 163
8.2.4 语言信息分析 164
8.3 发现对象方法 166
8.3.1 系统责任 166
8.3.2 问题域研究方法 167
8.3.3 确定系统边界 168
8.3.4 发现对象 169
8.3.5 审查和筛选 171
8.3.6 建立类图的对象层 172
8.4 定义属性 174
8.4.1 对象的属性和服务 174
8.4.2 表示方法 175
8.4.3 定义属性 175
8.5 定义服务 177
8.5.1 状态转换图 177
8.5.2 行为分类 179
8.5.3 发现服务方法 180
8.6 定义结构 181
8.6.1 一般-特殊结构 182
8.6.2 发现一般-特殊结构 183
8.6.3 结构的简化 185
8.6.4 多继承与多态性 186
8.6.5 整体-部分结构 191
8.6.6 整体-部分结构表示法 192
8.6.7 发现整体-部分结构方法 193
8.7 实例连接 195
8.7.1 实例连接概念 196
8.7.2 实例连接表示法 197
8.7.3 建立实例连接方法 198
8.8 消息连接 200
8.8.1 消息的概念 200
8.8.2 表示方法 202
8.8.3 建立消息连接方法 204
8.9 建立功能模型 205
8.9.1 画基本系统模型图 205
8.9.2 画功能级数据流图 205
8.9.3 描述处理框功能 206
小结 206
练习题 206
第9章 面向对象设计 207
9.1 设计的准则 207
9.1.1 转向面向对象的设计 207
9.1.2 抽象 208
9.1.3 信息隐藏 208
9.1.4 模块化 208
9.1.5 类的设计准则 208
9.1.6 面向对象的设计基本原理 208
9.1.7 软件复用 209
9.1.8 面向对象设计的步骤 209
9.2 启发式规则 209
9.2.1 简单 209
9.2.2 设计变动尽可能小 210
9.2.3 设计结果的可懂性 210
9.3 系统分解 210
9.3.1 子系统之间的两种交互方式 211
9.3.2 组织系统的两种方案 211
9.3.3 设计系统的拓扑结构 212
9.4 设计问题域子系统 212
9.5 设计任务子系统 216
9.6 设计数据管理子系统 217
9.6.1 数据管理方法 217
9.6.2 设计数据管理子系统 218
9.7 面向对象程序设计 219
9.7.1 面向对象程序的特点 219
9.7.2 OOPL概观 219
9.7.3 OOPL的特征 220
9.8 软件重用 221
9.8.1 软件重用概述 221
9.8.2 软件重用的效果 222
9.8.3 软件重用技术 223
9.9 统一建模语言UML 224
9.9.1 UML的概念模型 225
9.9.2 UML的软件分析与开发步骤 227
小结 228
练习题 228
第10章 形式化方法 230
10.1 形式化方法的基础知识 230
10.1.1 形式化方法概念 231
10.1.2 数学知识 231
10.1.3 应用数学符号描述形式规约 242
10.1.4 形式化规约语言 244
10.2 有限状态机(FSM) 246
10.3 Petri网的基本原理 247
10.3.1 静态结构 247
10.3.2 动态特征 248
10.3.3 转移启动规则 249
10.3.4 行为特性 251
10.3.5 行为特性分析方法 254
10.3.6 结构特性分析方法 260
10.3.7 Petri网到程序结构的转换 263
10.4 净室方法学 266
10.4.1 净室方法 266
10.4.2 净室过程模型 267
10.4.3 功能规约 268
10.4.4 黑盒规约 269
10.4.5 状态盒规约 270
10.5 客户/服务器模式 270
10.5.1 系统的结构 270
10.5.2 中间件和对象请求代理体系结构 271
10.5.3 分析建模问题 272
10.5.4 对C/S系统的设计 272
小结 274
练习题 275
第11章 用户界面设计 276
11.1 界面软件设计概述 276
11.1.1 可使用性 276
11.1.2 灵活性 277
11.1.3 复杂性和可靠性 277
11.1.4 用户界面设计存在的问题 277
11.2 设计人-机交互子系统 278
11.2.1 准则 278
11.2.2 策略 278
11.2.3 设计的形式 279
11.2.4 交互工具 281
11.3 图形用户界面设计 281
11.3.1 菜单的选择 281
11.3.2 对话框 283
11.3.3 窗口 284
11.4 多媒体用户界面设计 284
11.4.1 多媒体用户界面的设计特点 285
11.4.2 虚拟现实 285
11.4.3 多通道人机交互技术 286
11.4.4 多媒体用户界面细节设计 286
11.5 用户界面模型 287
11.6 用户界面的描述方法与技术 288
11.7 用CASE工具支持界面设计 288
11.8 新一代界面的主要特征 289
小结 290
练习题 290
第12章 软件质量 291
12.1 软件质量概述 291
12.1.1 软件质量的定义 291
12.1.2 软件质量特性 291
12.1.3 软件质量特性之间的竞争 294
12.2 软件质量的度量和评价 296
12.2.1 软件质量的度量 296
12.2.2 软件质量度量的分类 297
12.2.3 软件质量评价 297
12.3 软件质量保证 300
12.3.1 软件质量保证的概述 300
12.3.2 软件质量保证原则 300
12.3.3 软件质量保证计划 301
12.3.4 软件质量保证的措施 301
12.3.5 软件质量管理小组 301
12.4 技术评审与审查 302
12.4.1 评审过程 302
12.4.2 选择参加评审的成员 303
12.4.3 评审的管理和组织 303
12.4.4 评审的方法 303
12.4.5 走查和审查 304
12.4.6 开发过程的评审 304
12.4.7 对评审的综合评价 305
12.5 软件的可靠性 306
小结 306
练习题 307
第13章 软件实现 308
13.1 程序设计语言的特性及选择 308
13.1.1 程序设计语言特性 308
13.1.2 程序设计语言的选择 309
13.2 程序设计风格 312
13.3 程序设计效率 314
13.3.1 代码效率 314
13.3.2 内存效率 314
13.3.3 I/O效率 315
13.4 冗余编程 315
13.5 软件容错技术 316
13.5.1 容错软件 316
13.5.2 容错的一般方法 317
13.5.3 容错软件的设计过程 320
13.5.4 软件的容错系统结构 320
小结 323
练习题 324
第14章 软件测试 325
14.1 软件测试概述 325
14.1.1 软件测试的目的 325
14.1.2 软件测试的原则 325
14.2 测试方法 326
14.2.1 静态测试 326
14.2.2 动态测试 326
14.3 测试用例的设计 327
14.3.1 白盒技术 327
14.3.2 黑盒技术 332
14.4 测试过程 336
14.4.1 软件测试过程中的信息 336
14.4.2 软件测试的步骤与各开发阶段的关系 336
14.4.3 单元测试 337
14.4.4 集成测试 338
14.4.5 确认测试 341
14.5 调试 342
14.5.1 调试的目的 342
14.5.2 调试技术 342
小结 343
练习题 344
第15章 软件维护 345
15.1 软件维护概述 345
15.1.1 软件维护的定义 345
15.1.2 影响维护工作的因素 346
15.1.3 维护成本 346
15.2 软件可维护性 346
15.2.1 软件可维护性的定义 347
15.2.2 可维护性的度量 347
15.3 软件维护的特点 349
15.3.1 非结构化维护和结构化维护 349
15.3.2 维护的困难性 350
15.3.3 软件维护的费用 350
15.4 软件维护的实施 351
15.4.1 维护的组织 351
15.4.2 维护的流程 352
15.4.3 维护技术 353
15.4.4 维护的副作用 353
15.5 维护“老化代码” 354
15.6 逆向工程和再工程 355
15.6.1 预防性维护 355
15.6.2 逆向工程的元素 356
15.6.3 再工程中的重构技术 357
小结 360
练习题 360
第16章 软件项目管理与计划 361
16.1 软件项目管理概述 361
16.1.1 软件管理的对象 361
16.1.2 软件开发中的资源 362
16.1.3 分解技术 363
16.2 项目管理过程 363
16.3 软件开发成本估算 364
16.3.1 软件开发成本估算方法 365
16.3.2 软件开发成本估算的经验模型 366
16.4 风险分析 367
16.4.1 风险识别 368
16.4.2 风险估算 368
16.4.3 风险评价 369
16.4.4 风险驾驭和监控 370
16.5 进度安排 372
16.5.1 软件开发小组人数与软件生产率 372
16.5.2 任务的确定与并行性 372
16.5.3 制定开发进度计划 373
16.5.4 进度安排的图形方法 374
16.5.5 项目的追踪和控制 375
16.6 软件项目的组织 375
16.6.1 软件项目管理的特点 375
16.6.2 软件项目组织的建立 376
16.6.3 人员配备 379
小结 380
练习题 381
附录 软件产品的主要文件 382
A.1 任务书 383
A.2 可行性研究报告 384
A.3 软件需求报告 388
A.4 数据要求说明书 391
A.5 概要设计说明书 392
A.6 数据库设计说明书 394
A.7 细节设计说明书 395
A.8 测试计划 396
A.9 编码与单元测试评审报告 397
A.10 用户手册 398
A.11 项目开发总结报告 400
A.12 鉴定会纪要 402