1、软件危机
软件危机是指在计算机软件开发和维护过程中所遇到的一系列严重问题。
软件危机包含两方面问题:如何开发软件,以满足对软件日益增长的需求;如何维护数量不断膨胀的已有软件。
2、软件危机的典型表现
(1)对软件开发成本和进度的估计不准确
(2)用户对“已完成的”软件系统不满意的现象经常发生
(3)软件产品的质量往往靠不住
(4)软件常常是不可维护的
(5)软件通常没有适当的文档资料
(6)软件成本在计算机系统总成本中所占的比例逐年上升
(7)软件开发生产率提高的速度,跟不上计算机应用迅速普及深入的趋势
3、产生软件危机的原因
(1)软件是计算机系统中的逻辑部件而不是物理部件
(2)软件规模庞大,程序复杂性随着程序规模的增加而呈指数上升
(3)对软件开发和维护有不少糊涂观念,采用了错误的方法和技术
(4)忽视软件需求分析的重要性,认为软件开发就是写程序并设法使之运行
(5)对用户要求没有完整准确的认识就匆忙着手编写程序
(6)一个软件从定义、开发、使用和维护、直到最终被废弃,要经历一个漫长的时期
(7)一个软件产品必须由一个完整的配置组成,主要包括程序、数据和文档等成分
(8)在软件开发的不同阶段进行修改需要付出的代价是很不相同的
(9)轻视维护是一个最大的错误
4、消除软件危机的途径
(1)应该对计算机软件有一个正确的认识
(2)应该充分认识到,软件开发是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目
(3)应该推广使用在实践中总结出来的开发软件的成功的技术和方法,并且研究探索更好更有效的技术和方法
(4)应该开发和使用更好的软件工具
5、软件工程
软件工程是从管理和技术两方面研究如何更好的开发和维护计算机软件的一门新兴学科。采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它。
6、软件工程的本质特征
(1)关注于大型程序的构造
(2)中心课题是控制复杂性
(3)软件经常变化
(4)开发软件的效率非常重要
(5)和谐地合作是开发软件的关键
(6)软件必须有效地支持它的用户
(7)由具有一种文化背景的人替具有另一种文化背景的人创造产品
7、软件工程的基本原理
(1)用分阶段的生命周期计划严格管理
(2)坚持进行阶段评审
(3)实行严格的产品控制
(4)采用现代程序设计技术
(5)结果应能清楚地审查
(6)开发小组的人员应该少而精
(7)承认不断改进软件工程实践的必要性
8、软件工程方法学
(1)软件工程包括技术和管理两方面的内容,是技术与管理紧密结合所形成的工程学科。所谓管理就是通过计划、组织和控制等一系列活动,合理地配置和使用各种资源,以达到既定目标的过程。通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学,也称为范型。
(2)软件工程方法学的三要素:方法、工具、过程
(3)目前使用最广泛的软件工程方法学:传统方法学 & 面向对象方法学
<1>传统方法学(以算法为核心,功能分解):也称为生命周期方法学或结构化范型。采用结构化技术来完成软件开发的各项任务,并使用适当的软件工具或软件工程环境来支持结构化技术的运用。
①优点:把软件生命周期划分成若干个阶段,降低了整个开发过程的困难程度
②缺点:当软件规模庞大时,或者对软件的需求是模糊的或会随时间变化而变化时,开发出的软件往往不成功;而且维护起来仍然很困难
<2>面向对象方法学(以对象为核心,对象分解):面向对象方法把数据和行为看成是同等重要的,它是一种以数据为主线,把数据和对数据的操作紧密地结合起来的方法。
①要点
a.程序中任何元素都是对象,复杂的软件对象由简单的软件对象组合而成
b.把所有对象都划分成类,每个类都定义了一组数据和方法
c.按照父类和子类的关系,把若干个相关类组成一个层次结构的系统
d.对象彼此间仅能通过发送消息互相联系
②优点:降低了软件产品的复杂性,提高了可理解性,简化了开发和维护工作;促进了软件重用
9、软件生命周期
软件生命周期由软件定义、软件开发和运行维护三个时期组成。
每个时期的具体划分:
(1)软件定义:问题定义、可行性研究、需求分析
(2)软件开发:总体设计、详细设计、编码和单元测试、综合测试。其中前两个阶段又称为系统设计,后两个阶段又称为系统实现。
(3)运行维护(软件维护)
10、软件过程
软件过程是为了获得高质量软件所需完成的一系列任务的框架,它规定了完成各项任务的工作步骤。软件过程定义了运用技术方法的顺序、应该交付的文档资料、为保证软件质量和协调软件变化必须采取的管理措施,以及标志完成了相应开发活动的里程碑。
使用生命周期模型(过程模型)简洁地描述软件过程。生命周期模型规定了把生命周期划分成哪些阶段及各个阶段的执行顺序。
(1)瀑布模型
适用于功能、性能明确,完整、无重大变化的软件系统开发
①特点:阶段间具有顺序性和依赖性;推迟实现的观点;质量保证的观点
②优点
可强迫开发人员采用规范的方法
严格规定了每个阶段必须提交的文档
要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证
对文档的约束,使软件容易维护,降低软件预算
③缺点
模型过于理想化, 实际的项目开发很难严格按模型进行
“瀑布模型是由文档驱动的”是它的一个主要缺点,软件产品交给用户之前,用户只能通过文档了解产品
很可能最终开发出来的软件产品不能真正满足用户的需要
(2)快速原型模型
适用于可以以原型模型作为软件开发模型;进行产品移植或升级时,或对已有产品原型进行客户化工作时
①原理
第一步快速建立一个反映用户主要需求的原型系统,让用户通过实践来了解目标系统的概貌。之后用户提出修改意见,开发人员按照用户的意见快速地修改原型系统,再次请用户试用,循环往复直至用户认为系统确实满足所有需求。开发人员据此书写规格说明文档,根据文档开发出的软件便可以满足用户的真实需求。
②优点
快速原型模型是不带反馈环的,即软件产品的开发基本上是线性顺序进行的
规格说明文档正确地描述了用户需求
减少在设计和编码阶段发生错误的可能性
③缺点
准确的原型设计比较困难
不利于开发人员的创新
(3)增量模型(渐增模型)
适用于进行已有产品升级或新版本开发
①原理:把软件产品作为一系列的增量构件来设计、编码、集成和测试
②优点
能在较短时间内向用户提交可完成部分工作的产品
逐步增加产品功能,减少了全新的软件可能给客户组织带来的冲击
③缺点
软件必须具备开放式体系结构
很容易退化为边做边改模型
(4)螺旋模型
适用于内部开发的大规模软件项目
①原理:使用原型及其他方法来降低风险,可以看成在每个阶段前增加了风险分析的原型模型
②优点
对可选方案和约束条件的强调有利于已有软件的重用,也有助于把软件质量当作软件开发的一个重要目标
减少过多测试或测试不足所带来的风险
维护只是模型的另一个周期,在维护和开发之间没有本质区别
③缺点
风险驱动
需要丰富的风险评估经验和专门知识,如果未能够及时标识风险,会造成重大损失
(5)喷泉模型(迭代模型)
适用于面向对象的软件开发过程
①优点:提高开发效率、缩短开发周期
②缺点:难于管理