软件危机
早期时代(1960中期以前)
个体化的软件环境:编写者和使用者往往是同一个(或同一组)人
这种个体化的软件环境,使得软件设计通常是在人们头脑中进行的一个隐含的过程,除了程序清单之外,没有其他文档资料保存下来
第二个时期(1960-1970)
软件作坊:广泛使用产品软件
基本上仍然沿用早期形成的个体化软件开发方法,许多程序的个体化特性使得他们最终成为不可维护的
软件危机的介绍
软件危机包含下述两方面的问题:
- 如何开发软件,以满足对软件日益增长的需求
- 如何维护数量不断膨胀的已有软件
软件危机主要有以下一些典型表现:
- 对软件开发成本和进度的估计常常很不准确
- 用户对“已完成的”软件系统不满意的现象经常发生
- 软件产品的质量往往靠不住
- 软件常常是不可维护的
- 软件通常没有适当的文档资料
- 软件成本在计算机系统中成本中所占的比例逐年上升
- 软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势
产生软件危机的原因
- 一方面与软件本身的特点有关
- 一方面也和软件开发与维护的方法不正确有关
软件是逻辑部件而不是物理部件
软件维护通常意味着更正或修改原来的设计,这就在客观上使得软件较难维护
软件不同于一般程序,它的一个显著特点是规模庞大,而且程序复杂性将随着程序的规模的增加而呈指数上升
错误的认识和做法主要表现为忽视软件需求分析的重要性,认为软件开发就是写程序并设法使之运行,轻视软件维护
软件生命周期
- 问题定义
- 可行性研究
- 需求分析
- 开发时期
- 编写程序
- 测试工作
消除软件危机的途径
软件是程序、数据及相关文档的完整集合
程序:能够完成预定功能和性能的可执行的指令序列
数据:是使程序能够适当地处理信息的数据结构
文档:开发、使用和维护程序所需要的图文资料
1983年IEEE为软件下的定义是:计算机程序、方法、规则、相关的文档资料以及在计算机上运行程序时所必须的数据,方法和规则通常是在文档中说明并在程序中实现的
软件工程
软件工程的介绍
软件工程是指导计算机软件开发和维护的一门工程学科。采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它
1968年第一届NATO会议上给出了软件工程的一个早期定义:软件工程就是为了经济地获得可靠的且能在实际机器上有效地运行的软件,而建立和使用完善的工程原理
1993年IEEE给出了更全面更具体的定义:软件工程是(1)把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,也就是把工程应用于软件;(2)研究(1)中提到的途径
软件工程的本质特性
- 软件工程关注于大型程序的构造
- 软件工程的中心课题是控制复杂性
- 软件经常变化
- 开发软件的效率非常重要
- 和谐地合作是开发软件的关键
- 软件必须有效地支持它的用户
- 在软件工程领域中通常由具有一种文化背景的人替具有另一种文化背景的人创造产品
软件工程的基本原理
-
用分阶段的声明周期计划严格管理
以为着,应该把软件生命周期分成若干个阶段,并相应制定出切实可行的计划,然后严格按照计划对软件的开发与维护工作进行管理
-
坚持进行阶段评审
- 大部分错误时在编码之前造成的
- 错误发现与改正得越晚,所需要付出的代价也越高,因此在每个阶段进行严格的评审,以便尽早发现在软件开发过程中所犯的错误,是一条必须遵守的重要原则
-
实行严格的产品控制
当改变需求时,为了保持软件各个配置成分的一致性,必须实行严格的产品控制,其中主要是实行基准配置管理
- 基准配置(基线配置):经过阶段评审后的软件配置成分(文档或程序代码)
- 基准配置管理也称为变动控制:一切有关修改协议的建议,特别是涉及对基准配置的修改建议,都必须严格按照的规程进行评审,获得批准后才能实施修改
-
采用现代程序设计技术
采用先进的技术不仅可以提高软件开发和维护的效率,而且可以提高软件产品的质量
-
结果应能清楚的审查
为了提高软件开发过程的可见性,更好地进行管理,应该根据软件开发项目的总目标及完成期限,规定开发组织的责任和产品标准,从而使得到的结果能够清楚的审查
-
开发小组的人员应该少而精
软件开发小组的组成人员的素质应该好,而人数则不宜过多
-
承认不断改进软件工程实践的必要性
不仅要积极主动地采纳新的软件技术,而且要注意不断的总结经验
软件工程方法学
方法学(methodology):软件生命周期全过程中使用的一整套技术方法的集合,也称为范型(paradigm)
软件工程方法学的三要素:
-
方法
-
工具
-
过程
目前使用的最广泛的软件工程方法学为
-
传统方法学
-
面向对象方法学
-
传统方法学
也称为生命周期方法学或结构化范型。把软件生命周期的全过程依次划分为若干个阶段,然后顺序地完成每个阶段的任务
-
面向对象方法学
当软件规模庞大,或者对软件的需求是模糊的或会随着时间变化而变化的时候,使用传统方法学开发软件往往不成功,此外,使用传统方法学开发出的软件,维护起来仍然很困难
与传统方法相反,面向对象方法把数据和行为看成是同等重要,它是一种以数据为主线,把数据和对数据的操作紧密地结合起来的方法
具有4个要点
- 把对象作为融合了数据及在数据上的操作行为的统一的软件构建
- 把所有对象都划分成类
- 按照父类(基类)与子类(派生类)的关系,把若干个相关类组成一个层次结构的系统(类等级)
- 对象彼此间仅能通过发送消息互相联系
传统方法学强调自顶向下顺序的完成软件开发的各阶段的任务
用面向对象方法学开发软件的过程,是一个主动地多次反复迭代的演化过程。正确地运用面向对象方法学开发软件,则最终的软件产品由许多较小的、基本上独立的对象组成,每个对象相当于一个微型程序,而且大多数对象都与现实世界中的实体相对应,因此,降低了软件产品的复杂性,提高了软件的可理解性,简化了软件的开发和维护工作。面向对象方法特有的继承性和多态性,进一步提高了面向对象软件的可重性
软件生命周期
-
软件定义
-
问题定义
必须回答:要解决的问题是什么?
-
可行性研究
关键问题:对于上一个阶段所确定的问题有行得通的解决办法吗?
-
需求分析
为了解决这个问题,目标系统必须做什么?主要是确定目标系统必须具备哪些功能?用正式文档准确地记录目标系统的需求,这份文档通常称为规格说明书(specification)
-
-
软件开发
-
总体设计(概要设计)
关键问题:概括地说,应该怎样实现目标系统?
首先,应该设计出实现目标系统的几种可能的方案。通常至少应该设计出低成本、中成本和高成本三种方案
软件设计的一条基本原理就是,程序应该模块化,也就是说,一个程序应该由若干个规模适中的模块按合理的层次结构组织而成。因此,总体设计的另一项主要任务就是设计程序的体系结构,也就是确定程序由哪些模块组成以及模块间的关系
-
详细设计(模块设计)
把解法具体化,关键问题:应该怎样具体地实现这个系统呢?
这个阶段还不是编写程序,而是设计出程序的详细规格说明
详细地设计每个模块,确定实现模块功能所需要的算法和数据结构
-
编码和单元测试
关键任务:写出正确的容易理解、容易维护的程序模块
-
综合测试
关键任务:通过各种类型的测试(以及调试)使软件达到预定的要求
最基本的测试
-
集成测试
根据设计的软件结构,把经过单元测试检验的模块按某种选定的策略装配起来,在装配过程中对程序进行必要的测试
-
验收测试
按照规格说明书的规定,由用户(或用户积极参加下)对目标系统进行验收
必要时还可以再通过现场测试或平行运行等方法对目标系统进一步测试检验
-
-
-
运行维护(软件维护)
关键任务:通过各种必要的维护活动使系统持久地满足用户的需要
通常有4类维护活动:
- 改正性维护
- 适应性维护
- 完善性维护
- 预防性维护