《软件工程》根据CC2004对软件工程课程的要求,从软件的开发、维护和管理等方面阐述了软件工程的基本概念和常用方法。内容包括:软件工程基础、结构化软件开发方法、面向对象软件开发方法、软件生存期模型与软件体系结构、软件维护与管理。各章节均结合实例讲解,使读者易于理解和掌握。
《软件工程》可作为高等院校计算机专业或信息类相关专业本科生或研究生教材,也可作为软件开发人员的参考书。
《软件工程》作者具有较为丰富的教学实践及软件项目开发实践经验。在《软件工程》的编写过程中,作者参考了若干国内外相关教材,并结合各自多年的教学体会,做了多次研讨。议题始终围绕着《软件工程》如何解决好:材料的组织符合于人的认识规律;基本概念与基本方法的结合;经典方法与流行方法兼顾;以及如何体现技术性内容为主,同时提供必要的项目管理知识等原则。
·《软件工程》较全面地论述了软件工程的概念、原理和方法。在讲解理论的过程中尽量结合实例,避免抽象和枯煤的论述。
·在兼顾传统的结构化方法的同时,注重当前广为采用的面向对象方法。紧密结合当前技术的新发展,在阐述理论知识的同时侧重实用性。
·既充分重视技术性内容,使其作为初学者必须掌握的知识和技能,同时也兼顾软件工程实践中必不可少的基本管理知识。
软件工程领域的经典教材
掌握软件开发的必经之路
软件专业人员的良师益友
投身软件事业的立足根基
软件工程是计算机科学的重要分支,又是最为年轻的_T程学科。然而,它却随着信息化社会的到来和计算机在人们生产和生活各个领域的广泛应用越来越显示出重要的作用。
许多高等学校计算机专业的毕业生工作多年以后,回顾他们在校所学的专业课时,往往提到软件工程课程是工作中最为实用的课程之一。事实上,在校学生学好这门课也将使他们在今后的职业生涯中受益。出于这一认识,本书作者深深地理解组织编写好这一教材的重大责任。为此在编写过程中开展了多次讨论和交流,并且吸取了以前的教学经验和读者对过去软件工程教材的反馈意见。
本书编写时作者力图遵循的原则如下。
(1)既要强调和突出基本概念、基本方法,又要尽可能使材料内容的组织符合学生的认识规律,由浅入深,由具体到一般。
(2)既要认真对待传统的经典开发方法(如结构化方法),又要兼顾当前流行和广为采用的开发方法(如面向对象方法)。
(3)既要充分重视技术性内容,使其作为初学者必须掌握的知识,并且占有足够的分量,同时也要兼顾软件工程实践中必不可少的管理知识(如本书的后三章),而其篇幅又不可过多。
参与本书编写的作者除本人外,还有华北电力大学的马素霞教授和北京大学的麻志毅教授。他们在软件工程的教学和软件开发的实践方面均有丰富的经验。
作者十分欢迎来自各方面的意见和建议,也希望吸收这些意见和建议后,在再版修订时采纳。
郑人杰,清华大学教授。清华大学毕业后留校任计算数学专业、软件专业教师及清华大学软件中心副主任、清华同方公司 .副总工程师及顾问。现任中国软件行业协会理事、软件过程改进分会常务副会长。2009年荣获“推动中国软件产业发展杰出人物”奖。多年来在软件工程、软件质量及测试、软件过程改进方面从事教学、研究和开发工作,编写《实用软件工程》、《计算机软件测试技术》、《基于软件能力成熟度模型的软件过程改进》等书。
第1部分 软件工程基础
第1章 软件及软件工程介绍 1
1.1 软件与软件危机 1
1.1.1 软件的作用 1
1.1.2 软件的概念及特性 2
1.1.3 软件危机 3
1.2 软件工程及其基本原理 4
1.2.1 软件工程的概念 4
1.2.2 软件工程的目标 4
1.2.3 软件工程的基本原理 5
1.3 软件生命周期 6
1.4 软件工程方法学 8
1.4.1 结构化方法学 8
1.4.2 面向对象方法 9
1.5 软件工程知识体系及知识域介绍 9
1.6 软件产业的形成与发展 12
1.6.1 我国软件产业的形成 12
1.6.2 全球软件产业的发展 13
1.6.3 软件产业的发展模式 13
1.6.4 软件工程在软件产业中的作用 15
小结 15
习题 16
第2章 软件需求获取与确认 17
2.1 软件需求获取的任务 17
2.2 软件需求的获取与确认过程 18
2.3 快速原型化方法 19
2.4 基于用况的方法 20
2.4.1 系统边界 20
2.4.2 参与者 21
2.4.3 用况 22
2.4.4 用况图 27
2.5 需求管理 28
小结 29
习题 29
第2部分 结构化软件开发方法
第3章 结构化分析建模 31
3.1 软件需求分析阶段的任务 31
3.2 结构化分析方法简介 33
3.3 功能建模 33
3.3.1 数据流图的基本图形符号 33
3.3.2 环境图 34
3.3.3 数据流图的分层 35
3.3.4 实例研究 36
3.4 数据建模 38
3.4.1 数据对象 38
3.4.2 属性 39
3.4.3 关系 39
3.5 行为建模 41
3.5.1 状态 41
3.5.2 状态转换 41
3.5.3 事件 42
3.6 数据字典 43
3.6.1 词条描述 43
3.6.2 数据结构描述 44
3.7 加工规格说明 46
3.7.1 决策表 47
3.7.2 决策树 48
3.8 需求规格说明 49
3.8.1 软件需求规格说明 49
3.8.2 数据需求说明 50
小结 51
习题 51
第4章 总体设计 53
4.1 软件设计的概念及目标 53
4.1.1 软件设计的概念 53
4.1.2 软件设计的目标 53
4.2 软件设计的任务 56
4.2.1 软件设计的阶段与任务 56
4.2.2 结构化设计与结构化分析的关系 57
4.3 模块结构与数据结构 57
4.3.1 模块结构及表示 58
4.3.2 数据结构及表示 61
4.4 创建良好设计的原则 62
4.4.1 分而治之和模块化 62
4.4.2 模块独立性 63
4.4.3 提高抽象层次 68
4.4.4 复用性设计 69
4.4.5 灵活性设计 69
4.4.6 预防过期 69
4.4.7 可移植性设计 70
4.4.8 可测试性设计 70
4.4.9 防御性设计 71
4.5 面向数据流的设计方法 71
4.5.1 设计过程 71
4.5.2 典型的数据流类型和系统结构 72
4.5.3 变换型映射方法 74
4.5.4 事务型映射方法 76
4.5.5 软件模块结构的改进方法 79
4.5.6 实例研究 82
4.6 接口设计 86
4.6.1 接口设计概述 86
4.6.2 人机交互界面 87
4.7 数据设计 89
4.7.1 文件设计 89
4.7.2 数据库设计 90
4.8 软件设计规格说明 90
小结 91
习题 92
第5章 详细设计与编码 93
5.1 结构化程序设计 93
5.1.1 结构化程序设计的概念与原则 93
5.1.2 自顶向下、逐步细化的设计 过程 94
5.2 过程设计的工具 96
5.2.1 程序流程图 96
5.2.2 N-S图 99
5.2.3 PAD图 100
5.2.4 伪代码 101
5.3 程序设计语言 103
5.3.1 程序设计语言的性能 103
5.3.2 程序设计语言的分类 104
5.3.3 程序设计语言的选择 106
5.4 程序设计风格 107
5.4.1 源程序文档化 107
5.4.2 数据说明标准化 109
5.4.3 语句结构简单化 109
5.4.4 输入/输出规范化 112
5.5 程序复杂程度度量 113
5.5.1 McCabe方法 113
5.5.2 Halstead方法 115
小结 116
习题 116
第6章 软件测试 118
6.1 软件测试的基本概念 118
6.1.1 什么是软件测试 118
6.1.2 软件测试的目的和原则 119
6.1.3 软件测试的对象 120
6.1.4 测试信息流 121
6.1.5 测试与软件开发各阶段的关系 122
6.1.6 白盒测试与黑盒测试 122
6.2 白盒测试的测试用例设计 124
6.2.1 逻辑覆盖 124
6.2.2 语句覆盖 125
6.2.3 判定覆盖 125
6.2.4 条件覆盖 125
6.2.5 判定-条件覆盖 126
6.2.6 条件组合覆盖 126
6.2.7 路径测试 127
6.3 基本路径测试 128
6.4 黑盒测试的测试用例设计 131
6.4.1 等价类划分 131
6.4.2 边界值分析 134
6.5 软件测试的策略 136
6.5.1 单元测试 137
6.5.2 组装测试 139
6.5.3 确认测试 142
6.5.4 系统测试 144
6.5.5 测试的类型 144
6.6 人工测试 147
6.6.1 静态分析 147
6.6.2 人工测试的几种形式 148
6.7 调试 149
小结 150
习题 150
第3部分 面向对象软件开发方法
第7章 面向对象方法概述 153
7.1 面向对象的基本思想 153
7.2 面向对象的主要概念及基本原则 154
7.2.1 面向对象的主要概念 154
7.2.2 面向对象的基本原则 156
7.3 面向对象方法的发展史及现状简介 157
7.4 关于统一建模语言 158
小结 160
习题 160
第8章 面向对象分析 161
8.1 什么是面向对象分析 161
8.2 建立基本模型——类图 164
8.2.1 对象与类 164
8.2.2 定义属性与操作 168
8.2.3 建立关系 173
8.3 建立行为模型 187
8.3.1 顺序图 187
8.3.2 活动图 191
8.3.3 状态机图 195
8.4 建立组织模型——包图 202
8.4.1 概念与表示法 202
8.4.2 如何划分与组织包 204
小结 205
习题 205
第9章 面向对象设计与测试 207
9.1 什么是面向对象设计 207
9.2 问题域部分的设计 208
9.2.1 为复用类而增加结构 208
9.2.2 提高性能 209
9.2.3 增加一般类以建立共同协议 210
9.2.4 按编程语言调整继承 211
9.2.5 对复杂关联的转化并决定关联的实现方式 213
9.2.6 调整与完善属性 214
9.2.7 构造及优化算法 215
9.2.8 决定对象间的可访问性 215
9.2.9 定义对象 216
9.3 人机交互部分的设计 216
9.3.1 什么是人机交互部分 216
9.3.2 如何分析人机交互部分 217
9.3.3 如何设计人机交互部分 218
9.4 控制驱动部分的设计 222
9.4.1 什么是控制驱动部分 223
9.4.2 控制流 223
9.4.3 如何设计控制驱动部分 223
9.5 数据管理部分的设计 227
9.5.1 什么是数据管理部分 228
9.5.2 数据库和数据库管理系统 228
9.5.3 如何设计数据管理部分 229
9.6 面向对象测试的概念 235
9.6.1 面向对象软件测试的问题 235
9.6.2 面向对象软件测试的参考过程模型 236
9.7 面向对象测试方法 237
9.7.1 面向对象的分析与设计测试 237
9.7.2 面向对象的程序测试 237
9.7.3 面向对象的系统测试 239
小结 239
习题 239
第4部分 软件生存期模型与软件体系结构
第10章 软件生存期模型 241
10.1 软件过程框架 241
10.1.1 软件过程框架的内容 241
10.1.2 通用过程框架 241
10.1.3 典型的普适性活动 243
10.2 传统软件过程模型 243
10.2.1 瀑布模型 243
10.2.2 快速原型模型 245
10.2.3 增量模型 245
10.2.4 螺旋模型 247
10.2.5 喷泉模型 248
10.3 现代软件过程模型 249
10.3.1 基于构件的开发模型 249
10.3.2 形式化方法模型 250
10.3.3 面向方面的软件开发 251
10.3.4 统一过程 251
10.3.5 敏捷过程模型 253
小结 255
习题 256
第11章 软件体系结构 257
11.1 软件体系结构的基本概念 257
11.1.1 什么是体系结构 257
11.1.2 体系结构模式、风格和框架的概念 258
11.1.3 体系结构的重要作用 259
11.2 典型的体系结构风格 259
11.2.1 数据流风格 259
11.2.2 调用-返回风格 260
11.2.3 仓库风格 262
11.3 特定领域的软件体系结构 264
11.3.1 类属模型 264
11.3.2 参考模型 265
11.4 分布式系统结构 266
11.4.1 多处理器体系结构 266
11.4.2 客户机/服务器体系结构 267
11.4.3 分布式对象体系结构 271
11.4.4 代理 272
11.5 体系结构框架 272
11.5.1 模型-视图-控制器 272
11.5.2 J2EE体系结构框架 273
11.5.3 PCMEF与PCBMER框架 274
11.6 体系结构建模 276
11.6.1 类及其依赖性 277
11.6.2 接口及其依赖性 279
11.6.3 包及其依赖性 281
11.6.4 构件及其依赖性 282
11.6.5 结点与部署图 284
小结 285
习题 285
第5部分 软件维护与软件管理
第12章 软件维护 287
12.1 软件维护的概念 287
12.1.1 软件维护的定义 287
12.1.2 影响维护工作量的因素 288
12.1.3 软件维护的策略 288
12.2 软件维护活动 289
12.2.1 软件维护申请报告 289
12.2.2 软件维护工作流程 290
12.2.3 维护档案记录 291
12.2.4 维护评价 291
12.3 程序修改的步骤及修改的副作用 291
12.3.1 分析和理解程序 291
12.3.2 修改程序 292
12.3.3 修改程序的副作用及其控制 293
12.3.4 重新验证程序 294
12.4 软件的可维护性 295
12.4.1 软件可维护性的定义 295
12.4.2 可维护性的度量 296
12.5 提高可维护性的方法 298
12.5.1 建立明确的软件质量目标和优先级 298
12.5.2 使用提高软件质量的技术和工具 298
12.5.3 质量保证审查 298
12.5.4 改进文档 300
小结 301
习题 301
第13章 软件项目管理 302
13.1 软件项目管理概述 302
13.1.1 软件项目管理的目标 302
13.1.2 软件项目管理涉及的几个方面 302
13.2 项目估算 304
13.2.1 项目策划与项目估算 304
13.2.2 软件规模估算的功能点方法 305
13.2.3 软件开发成本估算 310
13.3 风险管理 316
13.3.1 什么是软件风险 316
13.3.2 风险管理的任务 318
13.3.3 风险评估 319
13.3.4 风险控制 322
13.3.5 做好风险管理的建议 325
13.4 进度管理 325
13.4.1 进度控制问题 325
13.4.2 甘特图 328
13.4.3 时标网状图 329
13.4.4 PERT图 329
13.5 需求管理 331
13.5.1 系统需求与软件需求 331
13.5.2 需求工程 333
13.5.3 需求变更 335
13.5.4 需求变更控制 337
13.5.5 可追溯性管理 340
13.6 配置管理 341
13.6.1 什么是软件配置管理 342
13.6.2 软件配置标识 342
13.6.3 变更管理 344
13.6.4 版本控制 348
13.6.5 系统建立 349
13.6.6 配置审核 350
13.6.7 配置状态报告 351
小结 351
习题 352
第14章 软件工程标准及软件文档 353
14.1 标准的概念 353
14.2 软件标准化的意义 354
14.3 标准的分类与分级 355
14.4 软件工程标准的制定与实施 358
14.5 软件组织内的标准化工作 359
14.6 软件文档的作用和分类 360
14.7 软件基本文档的内容要求 362
14.8 对文档编制的质量要求 366
14.9 文档的管理和维护 368
小结 369
习题 369
第15章 软件过程与软件过程改进 371
15.1 软件过程概述 371
15.2 软件生存期过程国际标准 373
15.3 软件过程成熟度 377
15.3.1 什么是软件过程成熟度 377
15.3.2 过程制度化 379
15.4 软件能力成熟度模型(CMM/CMMI) 381
15.4.1 CMM与SEI 381
15.4.2 CMM的演化 382
15.4.3 CMM族和CMMI 382
15.4.4 CMMI 1.2简介 383
15.4.5 CMMI评估 391
15.5 软件过程改进 392
15.5.1 软件过程改进的IDEAL模型 392
15.5.2 软件过程改进框架 393
15.5.3 有效的软件过程 394
小结 395
习题 396
参考文献 397
计算机技术经过了50年的发展历程,取得了突飞猛进的发展。计算机的应用领域已从单纯的科学计算发展到军事、经济、教育、文化等社会生产及生活的各个方面,推动了其他行业及领域的发展,改变了人们学习、工作及生活方式。进入21世纪,人类已从工业社会跨人了信息社会。
计算机软件系统是信息化的重要组成部分。计算机软件已形成了独立的产业,成为国民经济新的增长点和重要支柱。软件工程在软件开发中起着重要的作用,对软件产业的形成及发展起着决定性的推动作用。本章对软件、软件产业及软件工程相关的概念,软件开发的过程及方法进行简要介绍。
1.1 软件与软件危机
1.1.1软件的作用
20世纪80年代初我国大学生中知道软件的人并不多,甚至很多人从未听说过这个词,即使是当初软件专业毕业的学生也不曾想到软件的发展速度如此之快。今天的软件已无处不在,渗透到了各个行业之中。随着计算机大量进入家庭,计算机已经成为我们日常生活、学习和工作都离不开的工具,同时也改变了人们的学习方式、交流方式、思维方式及商业模式。
计算机软件已经成为世界舞台上最为重要的科技领域,商业、科学和工程都离不开软件技术。现在的软件技术具有产品和产品生产载体的双重作用。作为产品,软件显示了由计算机硬件体现的计算能力,扮演着信息转换的角色:产生、管理、查询、修改、显示或者传递各种不同的信息。而作为产品生产的载体,软件提供了计算机控制(操作系统)、信息通信(网络),以及应用程序开发和控制的基础平台(软件工具和环境)。
计算机软件的地位在50多年的时间中发生了巨大变化。硬件性能的极大提高、计算机结构的巨大变化、内存和存储容量的扩大,还有种类繁多的输入和输出方法都使得计算机系统的结构变得更加复杂,功能更加强大。计算机硬件的发展会受到物理极限的制约,而计算机软件的复杂程度却没有极限,复杂的结构和功能可以产生惊人的效果,具有无限的潜力。郑人杰,清华大学教授。清华大学毕业后留校任计算数学专业、软件专业教师及清华大学软件中心副主任、清华同方公司 .副总工程师及顾问。现任中国软件行业协会理事、软件过程改进分会常务副会长。2009年荣获“推动中国软件产业发展杰出人物”奖。多年来在软件工程、软件质量及测试、软件过程改进方面从事教学、研究和开发工作,编写《实用软件工程》、《计算机软件测试技术》、《基于软件能力成熟度模型的软件过程改进》等书。