软件工程--软件危机

1.1软件危机

1.1.1软件危机的介绍

软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。这些问题绝不仅仅是不能正常运行的软件才具有的,实际上,几乎所有软件都有不同程度地存在这些问题。

概括地说,软件危机包含下述两方面的问题:如何开发软件,以满足对软件日益增长的需求;如何维护数量不断膨胀的已有软件。软件危机具有长期性和症状不明显的特征。

具体地说,软件危机主要有以下一些典型表现:

  • 对软件开发成本和进度的估计常常很不准确;
  • 经常出现用户对“已完成的”软件产品不满意的情况;
  • 软件产品的质量往往达不到要求;
  • 软件通常是很难维护的;
  • 软件产品往往没有适当的文档资料;
  • 软件成本在计算机系统总成本中所占的比例逐年上升;
  • 软件开发生产率提高的速度远远不能满足社会对软件产品的日益增长的需求。

以上列举的仅仅是软件危机的一些明显的表现,与软件开发和维护有关的问题远远不止这些。

1.1.2产生软件危机的原因

在软件开发和维护的过程中存在这么多严重问题,一方面与软件本身的特点有关,另一方面也和软件开发与维护的方法不正确有关。

软件不同于硬件,它是计算机系统中的逻辑部分而不是物理部分。由于软件缺乏“可见性”,在写程序代码并在计算机上试运行之前,软件开发过程的进展情况比较难衡量,软件的质量也较难评价,因此,管理和控制软件开发过程相当困难。此外,软件在运行过程中不会因为使用使用时间过长而被“用坏”,如果运行中发生了错误,很可能是遇到了一个在开发期引入的在测试阶段没能检测出来的错误。因此,软件维护通常意味着改正或修改原来的设计,这在客观上使得软件较难维护。

软件不同于一般程序,它的一个显著特点是规模庞大,而且程序复杂性将随着程序规模的增加而呈指数上升。为了在预定时间内开发出规模庞大的软件,必须由许多人分工合作,然而,然而,如何保证每个人完成的工作合在一起确实能构成一个高质量的大型软件系统,更是一个极端复杂困难的问题,这不仅涉及许多技术问题,诸如分析方法、设计方法、形式说明方法、版本控制等,更重要的是必须有严格而科学的管理。

软件本身独有的特点确实给开发和维护带来了一些客观困难,但是人们在开发和使用计算机系统的长期实践中,也确实积累和总结出了许多成功的经验。如果坚持不懈地使用经过实践考验证明是正确的方法,许多困难时完全可以克服的,过去也确实有一些成功的范例。但是目前相当多的软件专业人员对软件开发和维护还有不少糊涂观念,在实践过程中或多或少地采用了错误的方法合技术,这可能是使软件问题发展成软件危机的主要原因。

与软件开发和维护有关的许多错误认识和做法的形成,可以归因于在计算机系统发展的早期阶段软件开发的个体化特点。错误的认识和做法主要表现为忽视软件需求分析的重要性,人为软件开发就是写程序并设法使之运行,轻视软件维护等。

事实上,对用户要求没有完整准确的认识就匆忙着手编写程序是许多软件开发工程失败的主要原因之一。只有用户才真正了解他们自己的需求,但是许多用户在开始时并不能准确具体地叙述他们的需要,软件开发人员需要做大量深入细致的调查研究工作,反复多次地和用户交流信息,才能真正全面、准确、具体地了解用户的需求对问题和目标的正确认识是解决任何问题的前提和出发点,软件开发同样也不例外。急于求成,仓促上阵,对用户要求没有正确认识就匆忙着手写程序,这就好比不大好地基就盖高楼一样,最终必然垮台。事实上,越早开始写程序,完成它所需要的时间往往越长。

必须认识到程序只是完整的软件产品的一个组成部分(编写程序所需的工作量只占软件开发全部工作量的10%—20%)在上述软件生命周期的每个阶段都要得出最终产品的一个或几个组成部分(这些组成部分通常以文档资料的形式存在)。也就是说一个软件产品必须由一个完整的配置组成,软件配置主要包括程序。文档和数据等成分。必须清除只重视程序而忽视软件配置其余成分的糊涂观念。

做好软件定义时期的工作是降低软件成本提高软件质量的关键。如果软件开发人员在定义时期没有正确全面的理解用户需求,直到测试阶段或软件交付使用后才发现“已完成的”软件不完全符合用户的需求,这时再修改就为时已晚了。

严重的问题是,在软件开发的不同阶段进行修改需要付出的代价是很不相同的,在早期引入变动,涉及的面少,因而代价也比较低;而在开发的中期,软件配置的许多成分已经完成,引入一个变动要对所有已完成的配置成分都做相应的修改,不仅工作量大,而且逻辑上也更复杂,因此付出的代价剧增;在软件“已经完成”是再引入变动,当然需要付出更高的代价。

通过上面的论述不难认识到,轻视维护是一个最大的错误。许多软件产品的使用寿命长达10年甚至20年,在这样漫长的时期中,不仅必须改正使用过程中发现的每一个潜伏的错误,而且当环境变化时(例如硬件或系统软件更新换代)还必须相应地修改软件以适应新的环境,特别是必须经常改进或扩充原来的软件以满足用户不断变化的需要。所有这些改动都属于维护工作,而且是在软件完成之后进行的,因此维护是极端艰巨复杂的工作,需要花费很大的代价。统计数据表明,实际上用于维护的费用占软件总费用的55%~70%。软件工程学的一个重要目标就是提高软件的可维护性,减少软件维护的代价。

了解产生软件危机的原因,澄清错误认识,建立起关于软件开发和维护的正确概念,还仅仅是消除软件危机的开始,全面消除软件危机需要一系列综合措施。

1.1.3消除软件危机的途径

为了消除软件危机,首先应该对计算机软件有一个正确的认识。正如上面所说,应该彻底消除在计算机系统早期发展阶段形成的“软件就是程序”的错误观念。一个软件必须由一个完整的配置组成,事实上,软件是程序、数据及相关文档的完整集合。其中,程序是能够完成预定功能和性能的可执行的指令序列;数据是使程序能够适当的处理信息的数据结构;文档是开发、使用和维护所需要的图文资料。

更重要的是,必须充分认识到软件开发不是某个个体劳动的神秘技巧,而应该是一种组织良好、管理严密、各类人员协同配合共同完成的工程项目。必须充分吸收和借鉴人类长期以来从事各种工作项目所积累的行之有效的原理、概念、技术和方法。特别要吸收几十年来人类从事计算机硬件研究和开发的经验教训。

应该推广使用在实践总结出来的开发软件的成功的技术和方法,并且研究探索更好更有效的技术和方法,尽快消除在计算机系统早期发展阶段形成的错误观念和做法。

应该开发和使用更好的软件工具。正如机械工具可以“放大”人类体力一样,软件工具可以“放大”人类的智力。在软件开发的每个阶段都有许多烦琐重复的工作需要完成,在适当的软件工具辅助下,开发人员可以把这类工作做得既快又好。如果把各个阶段使用的软件工具有机的集合成一个整体,支持软件开发的全过程,则称为软件工程支撑环境。

总之,为解决软件危机,既要有技术措施(方法和工具),又要有必要的组织管理措施。软件工程正是从管理和技术两方面研究如何更好地开发和维护计算机软件的一门新兴科学。

摘自:《软件工程》张海藩编著

软件工程--软件危机,布布扣,bubuko.com

时间: 2024-10-23 15:05:34

软件工程--软件危机的相关文章

因软件危机的产生而衍生出的软件工程

软件危机出现于20世纪60年代,计算机刚刚投入实际使用,软件设计往往只是为了一个特定的应用而在指定的计算机上设计和编制,使用依赖于计算机的机器代码或汇编语言,软件的规模比较小,设计软件往往等同于编制程序,基本上是个人设计.个人使用.个人操作.自给自足的私人化的软件生产方式. 60年代中期,大容量.高速度计算机的出现,计算机应用范围扩大,需要更多的软件服务计算机.高级语言开始出现:操作系统的发展引起了计算机应用方式的变化:大量数据处理使得第一代数据库管理系统的诞生.软件的规模越来越大,复杂程度越来

1.1软件工程概述之软件危机

典型表现 1.对软件开发成本和进度的估计不够准确.2.用户对"已完成的"软件系统不满意的现象经常出现.3.软件产品的质量往往靠不住.4.软件常常是不可维护的.(不可重用)5.软件没有适当的文档说明.6.软件成本在计算机系统总成本中占比越来越高.7.软件开发生产率提升的速度远远跟不上计算机应用迅速普及和深入的趋势.(供不应求) 原因: 1.软件不同于硬件,是一种逻辑组织形式,进度很难被衡量,管理和控制软件开发很困难.2.软件运行出错时,是开发过程中没有检测出来的bug,想要修正和维护难度

软件测试 → 第一章 基础-> 软件与软件危机

一. 软件概念 1.软件是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的完整集合.2.程序是按事先设计的功能和性能要求执行的指令序列.3.数据是使程序能正常操纵信息的数据结构.4.文档是与程序开发,维护和使用有关的图文材料. 二. 软件特性 形态特性.智能特性.开发特性.质量特性.生产特性.管理特性.环境特性.维护特性.废弃特性.应用特性 三. 软件种类 1.系统软件:操作系统 数据库管理系统 设备驱动程序 通信和网络处理程序等 2.支撑软件(工具软件) ①.纵向支撑软件

软件危机

一.软件危机定义 软件危机是指落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象. 二.软件危机表现 1.软件开发进度难以预测和控制 2.软件成本难以控制 3.用户对产品的需求难以满足 4.软件产品的质量无法保证 5.软件难以维护 6.缺少软件文档 三.软件危机原因 1.用户需求不明 1.1用户不明白软件具体需求 1.2用户对软件需求描述不精确,存在二义性 1.3用户提出修改开发功能.界面.支撑环境的要求. 1.4软件开发人员对需求的理解和用

软件工程—软件开发生命周期

正如任何事物一样,软件也有其孕育.诞生.成长.成熟以及衰亡的生命过程,一般称其为“软件生命周期”.把整个软件生存周期划分为若干阶段,使得每个阶段有明确的任务,使规模大,结构复杂和管理复杂的软件开发变的容易控制和管理.通常,软件生存周期包括: 一,问题定义.要求系统分析员与用户进行交流,弄清“用户需要计算及解决什么问题”然后提出关于“系统目标与范围的说明”,提交用户审查和确认. 二,可行性研究.一方面在于把待开发的系统的目标以明确的语言描述出来,另一方面从经济.技术.法律等多方面进行可行性分析.

[软件工程]软件上线后出现了重大bug是谁的责任

这个问题是个老问题了,但是一直没有很详细的回答过,这次看到知乎上有人提到,就回复了一下,原帖如下: https://www.zhihu.com/question/42151352/answer/99683378 我的回答: 首先,发现了问题,第一时间应该考虑的是如何解决问题,其次才是查找问题的来源避免问题的发生. 对于企业来说,问题不解决,只是纠缠问题是谁的责任,公司会被这些人直接拖垮,这时候对于企业来说最重要的就是解决问题!其次,问题解决后,再查找问题的来源,这时候才需要分类:1,需求覆盖不到

软件工程导论

软件危机与软件工程 软件危机 软件工程 技术审查和管理复审 可行性研究 可行性研究的任务 可行性研究的步骤 系统流程图 数据流程图 数据字典 成本/效益分析 需求分析 需求分析的任务 分析过程 概念模型和规范化 图形工具 验证软件需求 总体设计 总体设计的过程 软件设计的概念和原理 启发式规则 图形工具 面向数据流的设计方法 详细设计 结构程序设计 详细设计的工具 Jackson 程序设计方法 Warnier 程序设计方法 程序复杂程度的定量度量 编码 程序设计语言 程序设计途径 测试 基本概念

个人博客作业 #1

问题 1.第四章谈到了两人合作,在这个过程中倘若结对的两个人能力是相近的,如何达到高效的开发,如果两个人的能力是互补的,又如何达到高效的开发? 2.在第六章敏捷开发中,我认为软件设计的可扩展性对于敏捷开发相当重要,而软件的可扩展性应当从那些方面来考虑?即如何做到在需求不断情况下,仍不至于不停地推倒重来? 3.在第十二章谈到了用户体验,有时候确实存在用户体验和产品质量不可兼具的问题,如何抉择? 4.在软件的开发过程中是否时时需要具备有防御性编程的意识,这样可能使问题复杂化,或者仅需要按照设计规格来

课后作业—阅读笔记

软件分为系统软件,应用软件和恶意软件.软件=程序 + 软件工程 软件危机的原因:(1) 用户需求不明确. (2) 缺乏正确的理论指导. (3) 软件开发规模越来越大. (4)软件开发复杂度越来越高. 软件工程的领域:软件需求分析,软件设计,软件构建,软件测试,软件维护 软件的特点:复杂性,不可见性,易变性,服从性,非连续性,可移植,昂贵的,抽象性