《软件工程》在软件工程的知识域组织方面参考了IEEE和ACM提出的“软件工程的知识体系(SWEBOK)”的基本框架,比较全面、系统地反应了软件工程的全貌,从理论与实践的视角介绍了软件工程的基本原理、概念和技术方法。全书共18章,在内容结构上可分为软件工程与项目管理、结构化开发方法、面向对象的开发方法及软件工程高级专题4个部分。在每章后面都附有思考与练习题,供读者复习巩固之用。
《软件工程》汲取了国内外软件工程的精华,并融人了作者多年在教学与科研过程中对软件工程的理解与经验总结。在内容上既兼顾了传统、实用的软件开发方法,又引入了软件工程领域比较新颖的技术和方法,并结合一个贯穿全书的具体案例加以介绍。《软件工程》的另一个特点是介绍了许多软件工程度量与估算的技术与方法,突出了软件工程学科工程化、可度量的特点。
《软件工程》可作为计算机相关专业本科生或研究生的教材,同时也可作为软件工程领域专业人员的参考书。
《软件工程》特色:内容涵盖软件工程理论与实践的最新发展,以具体案例为驱动,贯穿结构化方法与面向对象方法的全过程,软件项目管理内容符合美国项目管理学会(PMI)的主要体系框架,软件度量使软件工程成为可量化的学科。
面向对象程序设计(OOP)技术是当前主流的程序设计技术。和传统的面向过程的程序设计技术相比,面向对象程序设计技术具有明显的优势。这种优势主要体现在以下几个方面:
(1) 传统的面向过程的程序设计方法忽略了数据和操作之间的内在联系,程序中的数据和操作它们的方法分离,而面向对象程序设计技术将程序要处理的数据和处理它们的方法封装在一起,构成一个统一体——对象。程序中用对象模型来建模现实世界中的事物。这样就使得空间模型的结构和问题空间模型的结构相一致。使用面向对象的方法解决问题的思路更加符合人类一贯的思维方法。
(2) 面向对象的封装技术为程序提供了更好的数据安全性。
(3) 面向对象的继承技术为程序提供了更好的可重用性。
(4) 面向对象的多态调用技术使程序具有更好的可扩展性。
(5) 和传统的面向过程的程序设计方法相比,面向对象的程序设计技术更适合开发大型的图形界面应用程序。
目前,常用的面向对象的编程语言有C++、Java、C#等。
C++语言是由C语言发展演变成的一种面向对象的程序设计语言。它既具备C语言面向过程设计方法的特点,同时又支持面向对象的程序设计方法。它是目前程序员使用最多的编程语言之一。
本书以C++语言为基础,阐述面向对象的编程原理。本书的特色是内容全面、语言简洁易懂、重点突出,是一部面向大学本科计算机科学相关专业的入门教材。
为了使读者能够透彻理解面向对象编程的原理和方法,本书使用了大量自编的例程。全部例程的源代码均使用Visual C++ 6.0编写,并编译通过。
本书由董正言主编,张聪、刘文涛、阮灵等老师也参加了部分章节的编写工作。
由于学识水平和时间的限制,疏漏和不妥之处在所难免,敬请批评指正。
作者
2010年5月
第1章 软件工程概述
1.1 软件的定义与特点
1.1.1 什么是软件
1.1.2 软件的特点与本质
1.1.3 “没有银弹”——复杂性是“软件危机”的本质原因
1.2 软件工程的定义及研究的内容
1.2.1 科学、工程与技术的界定
1.2.2 软件工程的定义与原理
1.2.3 软件工程的3个要素
1.2.4 软件开发方法——对客观世界的认知观
1.2.5 软件工程与相关科学的关系
1.3 软件工程的教育与知识体系
1.3.1 软件工程的教育体系
1.3.2 CC2005的4个方向专业规范
1.3.3 软件工程的知识体系——SWEBOK
1.4 软件工程的标准
1.4.1 软件工程标准化的意义
1.4.2 软件工程的国际标准与体系
1.4.3 国家标准
1.5 计算机辅助软件工程
1.6 软件工程人员的职业道德与行为准则
本章小结
思考与练习
第2章 软件过程
2.1 软件过程
2.1.1 过程及其特征
2.1.2 软件过程的公共框架
2.2 软件过程模型
2.2.1 理解软件过程模型
2.2.2 瀑布模型
2.2.3 演化软件过程模型
2.2.4 快速原型开发方法
2.2.5 统一软件过程
2.2.6 核心工作流
2.2.7 形式化方法模型
2.2.8 软件复用一一基于构件的开发方法
2.2.9 第4代技术
2.2.10微软公司的软件过程模型
2.3 软件过程改进
2.3.1 软件能力成熟度模型——CMM与CMMI
2.3 CMM/CMMI的应用及面临的问题
2.3.3 个体软件过程
2.3.4 团队软件过程
2.3.5 CMM、TSP、PSP三者的关系
本章小结
思考与练习
第3章 软件工程领域下的项目管理
3.1 项目管理的历史实践
3.1.1 远古的伟大工程实践
3.1.2 沟通的故事——巴比伦塔的倒塌
3.2 软件项目管理的范围与内容
3.2.1 什么是项目管理
3.2.2 软件项目管理的范围
3.2.3 人员
3.2.4 产品
3.2.5 过程
3.2.6 项目
3.3 软件项目管理的活动一一从这里开始
3.3.1 软件项目管理的活动概述
3.3.2 项目沟通与需求管理
3.3.3 软件项目计划的制定
3.3.4 项目范围与管理
3.3.5 3-:作分解结构
3.3.6 软件项目的组织
3.4 项目进度管理
3.4.1 项目里程碑
3.4.2 人员与工作量分配
3.4.3 项目进度管理的可视化工具
3.4.4 项目管理软件及其功能
本章小结
思考与练习
第4章 软件项目估算
4.1 软件项目估算概述
4.1.1 什么是估算
4.1.2 软件项目估算的特点
4.1.3 软件项目估算的复杂性分析
4.1.4 软件项目估算的相关内容
4.2 项目规模估算
4.2.1 基于代码行的规模估算
4.2.2 功能点估算
4.2.3 基于计划评审技术的规模估算
4.3 工作量估算
4.3.1 用代码行与功能点估算工作量的例子
4.3.2 基于数学模型的工作量估算
4.3.3 COCOMO模型
4.3.4 COCOMOⅡ模型
4.3.5 Putnam模型
4.4 软件成本估算
4.4.1 软件项目成本的组成
4.4.2 软件成本的估算方法
4.4.3 估算技术的应用与评价
4.5 项目进度估算
4.5.1 三点估算方法
4.5.2 项目进度获取值分析——项目计划与实际进展的定量比较
4.6 软件工程经济学
4.6.1 经济学与工程经济学
4.6.2 软件工程经济学研究的基本问题
4.6.3 资金的时间价值
4.6.4 软件工程经济学中的成本效益评价技术
本章小结
思考与练习
第5章 软件质量管理
5.1 软件质量及其特性
5.1.1 难以定义和度量的软件质量
5.1.2 软件质量特性
5.1.3 软件质量保证及其活动
5.2 软件配置管理
5.2.1 制定项目的配置计划
5.2.2 软件配置项及其标识
5.2.3 版本控制
5.2.4 变更控制
5.2.5 正式技术复审
本章小结
思考与练习
第6章 软件风险管理
6.1 软件项目的风险管理
6.1.1 风险与项目风险
6.1.2 软件项目风险与管理
6.1.3 软件风险的定义
6.1.4 软件风险的类型
6.2 软件风险管理的体系框架
6.2.1 常见风险管理过程框架
6.2.2 软件风险管理的一般过程
6.3 风险识别
6.3.1 风险识别过程
6.3.2 风险识别的方法与工具
6.4 风险分析
6.4.1 风险分析过程
6.4.2 风险分析的技术与工具
6.5 风险规划
6.5.1 风险规划过程
6.5.2 风险规划的工具与技术
6.6 风险监控
6.6.1 风险监控过程
6.6.2 风险监控的技术与方法
6.6.3 风险监控与管理计划——RMMM计划
本章小结
思考与练习
第2篇 结构化开发方法
第7章 面向过程的结构化分析
7.1 系统工程
……
第3篇 面向对象的开发方法
第11章 面向对象概述
第12章 面向对象分析
第13章 面向对象设计
第14章 面向对象测试
第15章 面向对象系统的技术度量
第4篇 软件工程高级专题
第16章 敏捷过程开发
第17章 Web工程
第18章 形式化方法
附录A 软件工程和知可视化表征
瀑布模型强调系统开发应有完整的周期,且必须完整地经历周期中的每一个开发阶段。由于该模式强调系统开发过程需有完整的规划、分析、设计、测试及文件等管理与控制,因此能有效地确保系统品质,它已经成为业界大多数软件开发的标准。
“线性”是人们最容易掌握并能熟练应用的思维方法。当人们碰到一个复杂的“非线性”问题时,总是千方百计地将其分解或转化为一系列简单的线性问题,然后逐个解决。然而在实践中,过程很少能够以纯线性的方式进行。应提倡以一种迭代的方式重复地使用瀑布模型,通过回到前面的阶段或改变前一阶段的结果的迭代是非常普遍的。但是,很多人忽视了这一点。
线性顺序模型过程的缺点也是非常明显的,主要有以下几点。
(1)实际的项目很少按照该模型给出的顺序进行。
(2)项目初期用户常常难以清楚地给出所有需求,而这恰恰是线性顺序模型所必须给出的。
(3)用户必须有耐心,程序的运行版本要等到项目开发晚期才能得到。大的错误如果到检查运行程序时才被发现,后果可能是灾难性的。
(4)开发者常常被不必要地耽搁。项目组某些成员不得不等待组内其他成员先完成其依赖的任务。
尽管如此,瀑布模型仍然是软件工程中应用最广泛的过程模型。很显然,它比起软件开发中随意的状态要好得多。
2.2.3演化软件过程模型
人们已经越来越认识到软件就像所有复杂系统一样要经过一段时间的演化。业务和产品需求随着开发的发展常常发生改变,想找到最终产品的一条直线路径是不可能的。
演化模型是利用一种迭代的思想方法,它的特征是使软件工程师渐进地开发逐步完善的软件版本。主要包括增量模型和螺旋模型两种范型。