1.1软件危机


1.1.1软件危机的介绍


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


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


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

  • 对软件开发成本和进度的估计常常很不准确;

  • 经常出现用户对“已完成的”软件产品不满意的情况;

  • 软件产品的质量往往达不到要求;

  • 软件通常是很难维护的;

  • 软件产品往往没有适当的文档资料;

  • 软件成本在计算机系统总成本中所占的比例逐年上升;

  • 软件开发生产率提高的速度远远不能满足社会对软件产品的日益增长的需求。


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


1.1.2产生软件危机的原因


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


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


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


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


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


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


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


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


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


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


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


1.1.3消除软件危机的途径


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

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

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

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


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


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