本书全面系统地讲授软件工程的理论与实践,力求从不同的角度帮助读者迅速掌握软件工程的理论、方法和思路。全书共分软件工程基础、软件项目管理、传统的软件工程、面向对象的软件工程、软件工程的最新技术等五个部分。内容主要包括:软件工程概论、软件过程、软件建模语言、软件项目、团队管理、软件配置管理、系统设计、软件测试、面向对象的分析与设计、编码实现、基于构件的软件工程、客户服务器与Web软件工程;设计模式等。
本书理论与实践相结合,采用案例教学并附有大量习题便于读者学习掌握。本书既可作为高等学校相关专业的教材或教学参考书,也可作为软件设计人员的自学用书。
第l部分软件工程基础
第1章软件工程概论
1.1软件
1.1.1软件的定义
1.1.2软件的特征
1.1.3软件的应用
1.2软件工程
1.2.1软件的发展历史
1.2.2软件过程的概念
1.2.3软件工程的概念
1.2.4软件工程的要素
1.2.5软件工程的目标
1.3软件工程的活动
1.3.1建模
1.3.2问题求解
1.3.3知识获取
1.3.4决策知识
1.4自测练习
1.5自测练习参考答案
第2章软件过程
2.1软件过程框架
2.2软件的生存周期和瀑布模型
2.3原型实现模型
2.4演化软件过程模型
2.4.1增量模型
2.4.2螺旋模型
2.5微软解决框架过程模型
2.5.1过程定义
2.5.2目标驱动
2.5.3基于风险管理的开发调度
2.5.4按产品版本发布
2.5.5支持项目管理
2.5.6靠改进特性与固定资源来激发创造力的战略
2.5.7同步——稳定开发法
2.6基于构件的开发模型
2。7极限编程
2.7.1目标与活动
2.7.2实践方法
2.7.3XP——演化模型
2.7.4XP应用的限制
2.8软件过程能力成熟度模型
2.8.1CMM简介
2.8.2关键过程域
2.8.3CMM与ISO
2.8.4CMM的应用
2.9自测练习
2.10自测练习参考答案
第3章软件工程建模语言
3.1建模的概念
3.1.1系统及模型和视图
3。1.2概念和现象
3.2统一建模语言
3.2.1为什么需要UML
3.2.2UML简介
3.3UML图形符号
3.3.1用例图
3.3.2类图及对象图和包
3.3.3构件图和配置图
3.3.4消息
3.3.5状态图
3.3.6/顷序图
3.3.7协作图
3.3.8活动图
3.3.9四种图的运用
3.4自测练习
3.5自测练习参考答案
第2部分软件项目管理
第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.2.4产品
4.2.5过程
4.2.6项目计划
4.3项目生存周期
4.4项目拥有者
4.5关键管理技能
4.5.1明白领导和管理的区别
4.5.2交流技巧
4.5.3谈判能力
4.5.4解决问题的能力
4.5.5影响组织
4.6项目管理的基本思想和技术
4.6.1成本/进度综合控制
4.6.2蒙托卡罗模拟技术
4.6.3项目进展评价技术
4.6.4网络计划技术
4.6.5项目管理的可视化技术
4.7自测练习
4.8自测练习参考答案
第5章团队管理
5.1团队模型
5.1.1组织原则
5.1.2微软解决方案框架团队模型
5.2自测练习
5.3自测练习参考答案
第6章项目计划
6.1项目计划简介
6.1.1影D向项目估算的因素
6.1.2软件范围的确定
6.1.3项目所需资源
6.2项目估算
6.2.1项目估算的方法
6.2.2软件规模估算
6.2.3经验估算模型
6.3项目计划的制定与提交
6.4自测练习
6.5自测练习参考答案
第7章风险分析和管理
7.1软件风险
7.1.1风险的概念
7.1.2风险策略
7.1.3软件风险的类别
7.2风险识别
7.3风险预测和评估
7.3.1建立风险表
7.3.2评估风险影响
7.3.3风险评估
7.4风险的缓解和监控与管理
7.4.1建立有效处理风险策略
7.4.2RMMM计划
7.4.3交流风险
7.5自测练习
7.6自测练习参考答案
第8章项目进度计划与控制
8.1项目进度计划
8.1.1进度计划
8.1.2自顶向下与自底向上的计划
8.1.3基本步骤
8.2项目跟踪与控制
8.2.1进度安排
8.2.2关键路径
8.2.3跟踪进度
8.2.4百分比值分析法
8.2.5赢得值法
8.3MicrOsOhPrOiect2000
8.3.1简介
8.3.2功能
8.4自测练习
8.5自测练习参考答案
第9章软件质量保证
9.1软件质量
9.1.1软件质量的定义
9.1.2软件质量控制的含义
9.1.3软件质量保证的含义
9.1。4软件质量成本的含义
9.2软件质量保证
9.2.1软件质量保证的历史
9.2.2SQA活动
9.2.3统计软件质量保证
9。2.4开发正确的产品
9.3软件评审
9.3.1阶段评审
9.3.2正式评审
9.3.3项目完成后评审
9。4软件复杂性与可靠性
9.4.1软件复杂性
9.4.2软件可靠性
9.4.3软件的容错技术
9.5软件质量度量模型
9.5.1不同的人对软件质量关心的重点不同
9.5.2软件质量特性
9.6自测练习
9.7自测练习参考答案
第10章软件配置管理
10.1软件配置项及基线
10.1.1软件配置项
10.1.2基线
10。2配置管理过程
10.2.1配置对象标识
10.2.2版本控制
10.2.3变更控制
10.3一个配置管理的工具——VisualSourceSafe
10.4自测练习
10.5自测练习参考答案
第3部分传统的软件工程
第11章需求工程
11.1基本概念
11.1.1业务过程工程
11.1.2产品工程
11.1.3需求工程
11.2需求获取
11.2.1需求获取方式
11.2.2提高获取的效率
11.2.3原型与场景
11.3需求分析建模
11.3.1为什么需要建模
11.3.2建模的方法
11.3.3结构化分析
11.3.4数据建模
11.3.5功能建模
11.3.6控制模型
11.3.7数据字典
11.3.81DEF方法
11.4软件需求规约及评审
11.4.1需求规约
11.4.2规约的评审
11.5自测练习
11.6自测练习参考答案
第12章系统设计
12.1系统设计的概念
12.1.1软件设计模型
12.1.2设计目标和原则
12.1.3设计基本方法
12.1.4设计文档
12.2数据设计
12.2.1数据三模式的概念
12.2.2数据库设计的原则
12.2.3数据仓库
12.3体系结构设计
12.3.1体系结构是通用的
12.3.2主机/终端结构
12.3.3客户机/B艮务器结构
12.3.4多层分布式结构
12.3.5体系结构的选择
12.3.6系统模块结构
12.4人机界面设计
12.4.1界面设计是综合艺术
12.4.2界面设计的黄金规则
12.4.3界面设计
12.4.4界面设计的问题
12.4.5界面设计原型技巧
12.5过程设计
12.5.1结构化程序设计
12.5.2过程设计模板
12.6自测练习
12.7自测练习参考答案
第13章软件测试
13.1测试目标和原则
13.1.1测试目标
13.1.2测试规则
13.1.3可测试性
13.1.4测试方法
13.2测试用例设计
13.2.1白盒法
13.2.2黑盒法
13.2.3针对专门环境的测试
13.3测试计划
13.4软件测试过程
13.4.1软件测试步骤
13.4.2单元测试
13.4.3集成测试
13.4.4确认测试
13.4.5一些常见的可用性问题
13.5测试和调试
13.5.1调试和测试的区别
13.5.2调试的困难
13.5.3调试的方法
13.5.4测试准备
13.6自测练习
13.7自测练习参考答案
第14章软件技术度量
14.1软件技术度量的框架
14.1.1度量准则
14.1.2有效软件度量的属性
14.2需求分析度量
14.2.1基于功能的分析模型测量
14.2.2分析规约质量的度量
14.3设计模型度量
14.3.1体系结构度量
14.3.2过程设计度量
14.3.3人机界面的度量
14.4源代码度量
14.5对测试的度量
14.6对维护的度量
14.7自测练习
14.8自测练习参考答案
第4部分面向对象的软件工程
第亚5章面向对象的概念
15.1面向对象的概念化
15.1.1项目概念化
15.1.2面向对象的范型
15.1.3面向对象的软件工程
15.1.4面向对象的管理
15.2类与对象
15.2.1又寸象的识别
15.2.2对象和类
15.3面向对象的要素
15.3.1对象的关系
15.3.2面向对象的特性
15.4面向对象的建模
15.4.1目标
15.4.2面向对象的模型
15.4.3面向对象的开发方法
15.5自测练习
15.6自测练习参考答案
第16章面向对象的分析
16.1面向对象的分析与设计
16.2案例分析——图书管理系统
16.2。1需求规格说明
16.2.2需求规格说明的细化
16.2.3需求规格说明的验证
16.3需求分析
16.3.1需求分析的过程
16.3.2用UM巳建模
16.4以用例为中心的需求分析方法
16.5自测练习
16.6自测练习参考答案
第17章面向对象的设计
17.1面向对象的设计概述
17.1.1面向对象的设计目标
17.1.2类设计与产品设计
17.2对象的存储
17.2.1对象存储方法
17.2.2对象序列化
17.2.3对象属性的永久保留
17.2.4对象存储的评价
17.2.5图书管理系统的对象存储
17.3进程体系结构
17.3.1多节点建模与进程间的通信
17.3.2实例
17.4用户界面
17.4.1用户界面设计
17.4.2用户界面的交互样式
17.4.3图书管理系统的界面
17.5类设计
17.5.1类架构
17.5.2系统分解
17.5.3类图的附加符号
17.5.4交互图
17.6类设计的目标及其验证
17.6.1代码重用
17.6.2良好设计的类与方法
17.6.3数据的完整性
17.6.4类设计的验证
17.7方法设计
17.7.1确定方法
17.7.2创建优质的方法
17.8自测练习
17.9自测练习参考答案
第18章编码实现
18.1程序设计的发展
18.1.1程序设计的方法
18.1.2软件开发环境的发展
18.1.3软件开发模式的发展
18.2开发策略
18.2.1自顶向下的开发与自底向上的开发
18.2.2自底向上和自顶向下的结合
18.2.3线程方法
18.3编码计划
18.4编程风格
18.4.1简单性
18.4.2注释和内部文档
18.5编码标准
18.5.1一般规则
18.5.2模块化规则
18.5.3声明
18.5.4可执行的命令
18.6超类设计和超类对象的实现
18.6.1识别超类
18.6.2面向对象方法的超类实现
18.7自测练习
18.8自测练习参考答案
第19章面向对象的测试
19.1基本概念
19.1.1测试的定义
19.1.2面向对象测试
19.1.3错误及故障和失效
19.2测试计划
19.2.1计划内容
19.2.2预期结果
19.2.3测试用例
19.3面向对象的测试过程
19.3.1面向对象的单元测试
19.3.2面向对象的集成测试
19.3.3面向对象的系统测试
19.3.4面向对象的测试步骤
19.3.5软件内部测试的自动工具
19.4面向对象系统与面向过程系统的测试
19.4.1面向对象系统测试的复杂性
19.4.2有关测试的一些问题
19.5案例分析——测试图书馆管理系统
19.5.1LMS的测试计划
19.5.2LMS的单元测试
19.5.3LMS的测试用例
19.6配置管理的测试
19.7自测练习
19.8自测练习参考答案
第5部分软件工程的最新技术
第20章基于构件的软件工程
20.1构件
20.1.1构件技术
20.1.2构件属性
20.2基于构件的系统开发
20.2.1系统结构分层和逻辑与数据分离
20.2.2选择和评价已有的构件
20.2.3构件的使用
20.2.4实现构件技术必须具备的条件
20.3构件的开发
20.3.1构件的设计
20.3.2领域工程
20.4构件和中间件
20.4.1中间件是构件存在的基础
20.4.2构件思想对中间件的作用
20.4.3中间件的分类
20.4.4基于中间件的开发系统模型
20.4.5中间件面临的一些问题
20.5软件构件的标准
20.5.1OMG/CDRBA
20.5.2EJB和J2EE
20.5.3MicrosoftDCOM及WindowsDNA
20.6自测练习
20.7自测练习参考答案
第21章客户月艮务器与Web软件工程
21.1计算机系统体系结构
21.1.1计算机系统结构
21.1.2C/S系统结构
21.2C/S系统
21.2.1C/S系统构成
21.2.2分布应用子系统的指导原则
21.2.3分布应用举例
21.3C/S系统开发
21.3.1C/S系统设计
21.3.2C/S系统结构设计
21.3.3C/S系统数据库设计
21.3.4提高C/S系统,陛能的方法
21.4基于Web系统
21.4.1C/S与B/S
21.4.2B/S工程
21.4.3B/S系统设计
21.4.4B/S系统测试
21.4.5B/S系统管理
21.5自测练习
21.6自测练习参考答案
第22章设计模式
22.1设计模式简介
22.1.1设计模式产生于建筑学和人类学
22.1.2再工程与模式化运动
22.1.3软件模式与模式语言
22.1.4面向模式的软件再工程
22.1.5软件再工程首先面对反面模式
22.1.6从再工程过程中抽象软件模式
22.2基本设计模式
22.2.1创建型模式
22.2.2结构型模式
22.2.3行为模式
22.2.4学习设计模式的意义
22.3应用设计模式
22.3.1包装程序设计模式
22.3.2桥接设计模式
22.3.3迭代程序设计模式
22.3.4单实例设计模式
22.4自测练习
22.5自测练习参考答案
参考文献
软件工程的飞速发展促使软件工程理论不断地更新。实际上软件工程的发展大大超过了软件工程理论的发展。摩尔定律驱动着硬件同时也在带动着软件产品的更新换代。当人们在争论网络互联协议标准的时候,基于TCP/IP协议的Interne几乎一夜之间普及全世界,使这种争论瞬时变得毫无价值。当人们苦苦研究着面向对象的数据库理论时,XML数据库迅速占领了面向对象数据库市场。这样的例子举不胜举,它们充分说明了软件工程的理论大大滞后于软件工程实践。正如在软件工程中技术标准的制定常常滞后于新技术的使用那样,许多实践经验还来不及总结。因此,软件工程的理论往往是不完备的,它虽然是实践经验的总结,但是这种总结不一定像数学定律那样完全定量、得到充分的证明和普遍适用。它往往采用有限样本证明,可能部分是定性的、当前公认的,就像TCP/IP协义是当前大家公认的网络互联协议标准那样。
所以学习软件工程显然不能像学习高等数学那样。首先它是一门工程学。必须投身于软件开发的实践,才能真正领悟软件工程的精髓。软件工程学适合于有一定软件开发经历的学生学习。其次,它是一门年轻而不断发展的学科。在软件工程里没有“公理和定理”,只有“原理和准则”。软件工程学教科书需要不断更新,抛弃事实上已经不采用的软件工程理论、方法和技术,比如经典系统分析设计的一些方法,如Jackson方法,所谓“事务设计和变换设计”等。要紧密结合当前软件技术的发展,这正是当前国内教科书迫切要做的,否则就不能对当前软件工程实践起指导作用。
本书共分软件工程基础、软件项目管理、传统的软件工程、面向对象的软件工程、软件工程的最新技术五个部分。内容主要包括:软件工程概论、软件过程、软件工程建模语言、软件项目、团队管理、项目计划、风险分析和管理、项目进度计划与控制、软件质量保证、软件配置管理、需求工程、系统设计、软件测试、软件技术度量、面向对象的分析与设计、编码实现、基于构件的软件工程、客户服务器与Web软件工程、设计模式等。
软件工程是一门应用学科,软件工程的教育必须与实践相结合,对软件工程概念的理解只有身临其境才能得到。因此必须采用案例教学和案例习题才能取得好的教学效果。本书尽量用实例来解释概念,用案例来演绎方法和原理,同时提供大量的练习题,以便让读者能够思考并尝试解决实际的问题。
软件工程的教育必须基于问题的解决。软件的实质是人们以计算机编程语言为桥梁,将客观感知世界映射于计算机世界中去,以解决人们在客观感知世界中要解决的问题。而外部世界中存在一些我们可以感知却无法用语言来表达的东西。因此,应该让学生明白不能简单地用正确和错误来判别解决方案,要鼓励学生用自已的理解去解释概念,同时对标准方案进行评价和改进。本书在自测练习题中有意识让学生明白这一点,去选择比较适合的答案。同样本书案例的解决方案也不是惟一的,而是针对具体的需求有多种解决方案。
本书力求在全面系统讲解软件工程理论与实践的同时,引入更多的新知识,从不同的角度帮助学生掌握软件工程的方法、思路和技术,帮助学生真正理解和灵活应用有关知识,并通过大量练习来增强解决问题的能力。
本书编写的目的就是试图根据最新软件工程实践来完善软件工程方法学体系。它是一本采用案例教学较为详细地讨论面向对象开发思想、方法和技术的教学参考书。
本书是作者根据多年软件工程的实践和教学而编写的。适合作为相关专业的大学生和研究生的教材或教学参考书。在学习本书前最好有软件开发的经历,并且能够使用一门编程语言或工具。这样学习的效果会更好。编者欢迎你的指正、建议和意见,请发E—mail给:qingyuw@sohu.com。感谢我的夫人席与华的支持。另外,史明生、王宝蓉、乔纪纯、王乃康、张一千、孙宝申、韩祥文、陈文章、王世英、刘世平、刘荫庭、王禺秋等参加了本书的讨论、编写和审校,在此一并致谢。
作者
2004年5月