本书按照典型的软件开发过程来组织内容,旨在培养学生具备软件工程思想及实际软件开发的能力。全书共10章,主要内容包括软件工程的起源,软件工程相关概念,软件工程方法、过程和工具,软件可行性研究及需求分析,软件设计,软件编码及实现,软件测试与维护,面向对象的软件工程,软件工程中涉及的管理方面的内容,如软件规模估算、进度计划、人员组织、软件开发风险管理等,以及课程设计方面的内容。本书可以作为普通高校计算机相关专业“软件工程”课程的教材,也可以供学习软件工程(包括参加计算机等级考试或相关专业自学考试)的读者使用参考。
前 言
软件工程是应用计算机科学技术、数学、管理学的原理,运用工程科学的理论、方法和技术,研究和指导软件开发和演化的一门交叉学科。随着科技的发展,软件工程已成为计算机科学及其相关专业的一门重要的必修课,其教学目的在于使学生掌握软件工程的基本概念和原则,培养学生使用工程化的方法高效地开发高质量软件的能力,以及进行项目管理的能力。
软件工程是一门理论与实践并重的课程。本书在讲述软件工程的基本概念、原理和方法的基础上,详细而全面地介绍了可以实际用于软件开发实践的各种技能,旨在使学生通过有限课时的学习后,不仅能对软件工程的原理有所认识,而且能具备实际开发软件的各种技能,比如按照标准和规范编写文档等。
本书共10章,内容涉及软件工程的基本原理和概念、软件开发生命周期的各个阶段、软件工程管理的相关内容,以及课程设计。在第10章中,除了介绍如何进行课程设计外,还举了一个可供模仿的课程设计案例——“Web Publishing System”。此案例的文档尽管是以英文呈现的,但相应地都有中文文档(包括源代码、用户手册、部署文档等),可通过扫描二维码获取,或在华信教育资源网上获取,网址:http://www.hxedu.com.cn;同时,本书电子教案等相关教学资源也可通过此网站获取。
本书的教学安排建议如下:
章节 内容 学时数
第1章 软件工程概述 2~4
第2章 可行性研究及需求分析 4~6
第3章 软件设计 4~6
第4章 软件编程 2
第5章 软件测试与维护 4~6
第6章 面向对象方法与UML 4~6
第7章 面向对象分析 4~6
第8章 面向对象设计与实现 4~6
第9章 软件工程管理 2~4
第10章 课程设计 2
建议先修课程:计算机导论、面向对象程序设计、数据结构、数据库原理等。
建议理论教学时数:32~48学时。
建议实践教学时数:16~32学时。
教师可以按照自己对软件工程的理解适当地删除一些章节,也可以根据教学目标,灵活地调整章节的顺序,增减各章的学时数。
本书作者一直在北京航空航天大学软件学院担任软件工程课程的教学工作,总结了自己多年软件工程教学与实践的经验。曾洪立、吕彼佳、姜彦华参与了本书的素材收集与资源整理工作。在本书编写的过程中,还得到了丛硕、任彬、王启菡、邓博洋、左宗源、杨晨、蔡哲源、寇宇增的支持,在此对他们表示感谢。也感谢其他对本书有贡献的同人。
由于软件工程是一门新兴学科,软件工程的教学方法本身还在探索之中,加之我们的水平和能力有限,本书难免有疏漏之处。恳请各位同人和广大读者给予批评指正,也希望各位将实践过程中的经验和心得与我们交流(yunxianglu@hotmail.com)。
编 著 者
吕云翔,任职于北京航空航天大学,具有多年的软件开发、项目管理、计算机教学经验。
目 录
第1章 软件工程概述 1
1.1 软件 1
1.1.1 软件的概念及特点 1
1.1.2 软件的分类 2
1.2 软件危机 3
1.2.1 软件危机的表现与原因 3
1.2.2 软件危机的启示 4
1.3 软件工程 5
1.3.1 软件工程的概念 5
1.3.2 软件工程研究的内容 5
1.3.3 软件工程目标和原则 6
1.3.4 软件工程知识体系 7
1.3.5 软件工程的发展 8
1.4 软件过程概述 9
1.5 软件生命周期 10
1.5.1 软件生命周期的概念 10
1.5.2 传统软件生命周期的各个阶段 10
1.6 软件过程模型 11
1.6.1 瀑布模型 12
1.6.2 快速原型模型 12
1.6.3 增量模型 13
1.6.4 螺旋模型 14
1.6.5 喷泉模型 14
1.6.6 基于组件的开发模型 15
1.6.7 统一软件开发过程模型 16
1.6.8 敏捷过程与极限编程 17
1.6.9 几种模型之间的关系 19
1.6.10 选择软件过程模型 20
1.7 软件过程模型实例 20
1.8 软件开发方法 22
1.9 软件工程工具 23
小结 25
习题 26
第2章 可行性研究及需求分析 28
2.1 可行性研究 28
2.1.1 项目立项概述 28
2.1.2 可行性研究的内容 28
2.1.3 可行性研究的步骤 29
2.2 需求分析 30
2.2.1 需求分析的任务 30
2.2.2 需求分析的步骤 31
2.2.3 需求管理 33
2.2.4 需求分析的常用方法 34
2.3 结构化分析概述 34
2.4 结构化分析方法 35
2.4.1 功能建模 36
2.4.2 数据建模 39
2.4.3 行为建模 40
2.4.4 数据字典 42
2.4.5 加工规格说明 43
2.5 结构化分析图形工具 44
2.5.1 层次方框图 44
2.5.2 Warnier图 45
2.5.3 IPO图 46
2.6 结构化分析实例 46
2.7 软件开发计划书编写指南 49
2.8 需求规格说明书编写指南 54
小结 59
习题 59
第3章 软件设计 62
3.1 软件设计的基本概念 62
3.1.1 软件设计的意义和目标 62
3.1.2 软件设计的原则 62
3.1.3 软件设计的分类 66
3.2 结构化软件设计概述 67
3.3 结构化设计与结构化分析的关系 67
3.4 体系结构设计 68
3.4.1 表示软件结构的图形工具 68
3.4.2 面向数据流的设计方法 70
3.4.3 面向数据结构的设计方法 72
3.5 接口设计 77
3.5.1 接口设计概述 77
3.5.2 界面设计 78
3.6 数据设计 79
3.7 过程设计 81
3.7.1 程序流程图 81
3.7.2 N-S图 82
3.7.3 PAD图 83
3.7.4 结构化语言 84
3.8 结构化设计实例 85
3.9 软件设计说明书编写指南 88
小结 92
习题 93
第4章 软件编程 95
4.1 编程语言 95
4.1.1 编程语言的发展与分类 95
4.1.2 选择编程语言需考虑的因素 98
4.2 编程风格 99
4.3 软件编程实例 103
小结 105
习题 105
第5章 软件测试与维护 107
5.1 软件测试的基本概念 107
5.1.1 软件测试的原则 107
5.1.2 软件测试模型 108
5.2 软件测试的分类 110
5.3 测试用例 112
5.3.1 测试用例编写 112
5.3.2 测试用例设计 112
5.3.3 测试用例场景 112
5.4 软件测试方法 113
5.5 黑盒测试 113
5.5.1 等价类划分法 114
5.5.2 边界值分析法 116
5.5.3 错误推测法 116
5.5.4 因果图法 117
5.5.5 决策表法 119
5.5.6 场景法 120
5.5.7 黑盒测试选择 122
5.6 白盒测试 122
5.6.1 代码检查法 122
5.6.2 静态结构分析法 123
5.6.3 程序插桩技术 123
5.6.4 逻辑覆盖法 123
5.6.5 基本路径法 125
5.6.6 白盒测试方法选择 127
5.6.7 白盒测试与黑盒测试比较 127
5.7 软件测试的一般步骤 128
5.8 单元测试 128
5.8.1 单元测试概述 128
5.8.2 单元测试内容 129
5.8.3 单元测试方法 129
5.9 集成测试 130
5.9.1 集成测试概述 130
5.9.2 集成测试分析 130
5.9.3 集成测试策略 131
5.10 系统测试 134
5.10.1 系统测试概述 134
5.10.2 系统测试类型 134
5.11 验收测试 136
5.11.1 验收测试概述 136
5.11.2 验收测试内容 136
5.11.3 α测试和β测试 136
5.12 回归测试 137
5.13 软件调试 138
5.13.1 调试过程 138
5.13.2 调试途径 138
5.14 软件测试实例 138
5.15 测试分析报告编写指南 144
5.16 软件维护 147
5.16.1 软件维护的过程 147
5.16.2 软件维护的分类 149
5.16.3 软件的可维护性 150
5.16.4 软件维护的副作用 151
5.16.5 软件再工程技术 152
小结 153
习题 154
第6章 面向对象方法与UML 157
6.1 面向对象的软件工程方法 157
6.1.1 面向对象的基本概念 157
6.1.2 面向对象的软件工程方法的特征与优势 158
6.1.3 面向对象的实施步骤 159
6.2 统一建模语言(UML) 160
6.2.1 UML简述 160
6.2.2 UML的特点 160
6.2.3 UML的应用范围 161
6.2.4 UML的图 161
6.2.5 UML“4+1”视图 162
6.3 静态建模机制 163
6.3.1 用例图 163
6.3.2 类图和对象图 165
6.3.3 包图 169
6.4 动态建模机制 170
6.4.1 顺序图 170
6.4.2 协作图 171
6.4.3 状态图 172
6.4.4 活动图 173
6.5 描述物理架构的机制 174
6.5.1 构件图 174
6.5.2 部署图 175
小结 175
习题 176
第7章 面向对象分析 179
7.1 面向对象分析方法 179
7.1.1 面向对象分析过程 179
7.1.2 面向对象分析原则 180
7.2 面向对象建模 181
7.2.1 建立对象模型 182
7.2.2 建立动态模型 186
7.2.3 建立功能模型 189
7.2.4 3种模型之间的关系 190
7.3 面向对象分析实例 190
小结 195
习题 195
第8章 面向对象设计与实现 197
8.1 面向对象设计与结构化设计 197
8.2 面向对象设计与面向对象分析的关系 197
8.3 面向对象设计的过程与规则 197
8.3.1 面向对象设计的过程 197
8.3.2 面向对象设计的原则 199
8.4 面向对象设计的启发规则 200
8.5 系统设计 200
8.5.1 系统分解 201
8.5.2 问题域子系统的设计 202
8.5.3 人机交互子系统的设计 205
8.5.4 任务管理子系统的设计 208
8.5.5 数据管理子系统的设计 209
8.6 对象设计 211
8.6.1 设计类中的服务 211
8.6.2 设计类的关联 213
8.6.3 对象设计优化 214
8.7 面向对象设计实例 217
8.8 面向对象实现 221
8.9 面向对象的软件测试 221
小结 224
习题 224
第9章 软件工程管理 226
9.1 软件估算 226
9.1.1 软件估算的概念 226
9.1.2 软件估算的方法 227
9.1.3 软件估算的原则与技巧 228
9.2 软件开发进度计划 229
9.2.1 Gantt图 229
9.2.2 PERT图 229
9.3 软件开发人员组织 230
9.3.1 民主制程序员组 230
9.3.2 主程序员组 230
9.3.3 现代程序员组 231
9.4 软件开发风险管理 231
9.4.1 软件开发风险 231
9.4.2 软件开发风险管理 232
9.5 软件质量保证 233
9.5.1 软件质量的基本概念 233
9.5.2 软件质量保证的措施 235
9.6 软件配置管理概述 235
9.6.1 软件配置管理术语 235
9.6.2 配置管理的过程 238
9.6.3 配置管理的角色划分 239
9.7 软件工程标准与软件文档 240
9.7.1 软件工程标准 240
9.7.2 软件文档 241
9.8 软件过程能力成熟度模型 243
9.9 软件项目管理 244
9.9.1 软件项目管理概述 244
9.9.2 软件项目管理与软件工程的关系 245
9.10 软件复用 245
小结 247
习题 248
第10章 课程设计 250
10.1 课程设计指导 250
10.2 案例――“Web Publishing System” 255
10.2.1 Software Project Plan 255
10.2.2 Software Requirements Specification 263
10.2.3 Software Design Specification 284
10.2.4 Software Testing Report 313
小结 324
习题 324
附录A 词汇与缩略语 325
附录B 案例――Web Publishing System(通过扫描二维码获取中文文档和源代码) 330
附录C 部分习题参考答案 331
参考文献 349