1.1 软件危机
随着计算机应用的日益普及,软件数量急剧膨胀。在程序运行时发现的错误必须设法改正;用户有了新的需求时必须相应地修改程序;硬件或操作系统跟新时,通常需要修改程序以适应新的环境。
1968年北大西洋公约组织的计算机科学家在西德召开国际会议,讨论软件危机的问题,在这次会议上正式提出使用了软件工程这个名词,一门新兴的工程学科就此诞生了。
1.1.1软件危机的介绍
软件危机包含下述两方面的问题:如何开发软件,以满足对软件日益增长的需求;如何维护数量不断膨胀的已有软件。
具体来说,软件危机主要有以下一些典型表现:
(1)对软件开发成本和进度的估计常常很不准确。
(2)用户对“已完成的”软件系统不满意的现象经常发生。
(3)软件产品的质量往往靠不住
(4)软件常常是不可维护的
(5)软件通常没有文档资料
(6)软件成本在计算机系统总成本中所占的比例逐年上升。
(7)软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势。
1.1.2产生软件危机的原因
忽视软件需求分析的重要性,认为软件开发就是写程序并设法使之运行,轻视软件维护等。
事实上,对用户要求没有完整准确的认识就匆忙着手写程序是许多软件开发工程失败的主要原因之一。越早开始写程序,完成它所需要用的时间往往越长。
软件开发最初的工作应是问题定义,也就是确定要解决的问题是什么;然后要进行可行性研究,决定问题是否存在一个可行的解决办法;接下来应该进行需求分析,也就是深入具体地了解用户的要求。经过上述软件定义时期的准备工作才能进入开发工作,开发时期,首先要对软件进行设计(概要设计和详细设计),软后才能进入编写程序的阶段,程序编写完成之后还需要大量的测试工作(占40%-50%)才能最终交付使用。所以编写程序只是软件开发的一个阶段,在软件开发中编写程序只占软件工程工作量的10%-20%。
根据美国一些软禁公司的统计资料,在后期引入一个变动比在早期引入相同的变动所需付出的代价高2-3个数量级。
轻视维护是一个重大的错误。实际上用于软件维护的费用占软件总费用的55%-70%。软件工程学的一个重要目标是提高软件的可维护性,减少软件维护的代价。
1.1.3消除软件危机的途径
彻底消除在计算机系统早期发展阶段形成的“软件就是程序”的错误观念。软件是程序,数据以及相关文档的完整集合。
1.2软件工程
1.2.1软件工程的介绍
软件工程就是为了经济地获得可靠的且能在实际机器上有效地运行的软件,而建立和使用完善的工程原理。(1968年第一节NATO会议上曾经给出软件工程一个早期定义)。
1,把系统的,规范的,可度量的途径应用于软件开发,运行和维护过程,也就是把工程应用于软件;2,研究1中的途径。(1933年IEEE)。
软件工程具有下述本质特性:
1,软件工程关注于大型程序的构造
多人合作用时半年以上才能写出的程序称为大型程序。
2,软件工程的中心课题是控制程序的复杂性
把问题分解,使得分解出的每个过程是可理解的,而且各部分之间保持简单的通信关系。
3,软件经常变化
4,开发软件的效率非常重要
5,和谐地合作是开发软件的关键
多人协同工作
6,软件必须有效地支持它的用户
7,在软件工程领域中通常由具有一种文化背景的人替具有另一种文化背景的人创造产品。
缺乏应用领域的相关知识,是软件开发项目出现的常见问题。软件工程师不仅缺乏应用领域的实际知识,他们还缺乏该领域的文化知识。
1.2.2软件工程的基本原理
软件工程的基本原理:软件工程的7条基本原理(软件工程专家B.W.Boehm)。这7条原理是相互独立的。
1.用分阶段的生命周期计划严格管理
2.坚持进行阶段评审
设计错误占软件错误的63%,编码错误仅占37%
3.实行严格的产品控制
4.采用现代程序设计技术
5.结果应能清楚地审查
6.开发小组的人员应该少而精
7.承认不断改进软件工程实践的必要性
1.2.3软件工程方法学
1.传统方法学
每个阶段都应该交出最新式的高质量的文档资料,从而保证在软件开发结束时有一个完整准确的软件配置交付使用。
2.面向对象方法学
它是以数据为主线,把数据和对数据的操作紧密地结合起来的方法。
面向对象方法学具有下述4个要点
(1)把对象作为融合了数据以及在数据上操作行为的统一的软件构件。用对象分解取代了传统方法的功能分解。
(2)所有对象都划分成类。
(3)按照父类与子类的关系,把若干个相关类组成一个层次结构的系统。
(4)对象彼此间仅能通过发送消息互相联系。
1.3软件生命周期
概括地说,软件生命周期由软件定义,软件开发和运行维护。
软件定义时期包括问题定义,可行性研究和需求分析。
开发时期包括总体设计,详细设计(统称为系统设计),编码和单元测试,综合测试(统称为系统实现)。
维护时期,不再进一步划分。具体上,软件再使用过程中发现新问题时应该加以改正;环境改变时应该修改软件以适应新的环境;当用户有新的要求时应该及时改进软件以满足用户的新需求。
1.问题定义
2.可行性研究
3.需求分析
4.总体设计
5.详细设计
6.编码和单元测试
7.综合测试
8.软件维护
1.4软件过程
1.4.1瀑布模型
1.4.2快速原型模型
1.4.3增量模型
1.4.4螺旋模型
1.4.5喷泉模型
1.4.6Rational统一过程
1.4.7敏捷过程与极限编程
1.4.8微软过程
1.5小结
习题1
1
2
3
4
5
6
7
8
9
10
11
12