软件危机曾经是软件界甚至整个计算机界最热门的话题。为了解决这场危机,软件从业人员、专家和学者做出了大量的努力。现在人们已经逐步认识到所谓的软件危机实际上仅是一种状况,那就是软件中有错误,正是这些错误导致了软件开发在成本、进度和质量上的失控。
有错是软件的属性,而且是无法改变的,因为软件是由人来完成的,所有由人做的工作都不会是完美无缺的。问题在于我们如何去避免错误的产生和消除已经产生的错误,使程序中的错误密度达到尽可能低的程度。
事例1
  20世纪70年代,一位程序员在开发公司的工资系统时,迫于计算机存储空间的限制,他将4位数的日期缩减为2位数,如1973记为73,从而节省了可观的存储空间。然而,世界各地更换或升级2000年问题的程序所花的费用超过了数亿美元。


事例2
  1994年秋天,迪斯尼公司发布了第一个面向儿童的多媒体光盘游戏Lion King Animated Storybook(狮子王动画故事书)。为此,该公司大力宣传促销,销售额十分可观。然而,公司客户支持电话很快响个不停,电话里传来家长的愤怒斥责和孩子玩不成游戏的哭声。原来,迪斯尼公司没有对市场上投入使用的各种PC机进行正确的测试,软件在开发人员的系统上一切正常,而在一些大众使用的常见系统中却不能运行。


事例3
  美国爱国者导弹防御系统曾应用于海湾战争对抗伊拉克的飞毛腿导弹,普遍受到赞誉。但是,它也确实发生了几次对抗失利,其中一枚在沙特阿拉伯的多哈击毙28名美国士兵,而问题的症结在于导弹的软件包含一个累加计时故障。一个很小的系统时钟错误积累起来就可能拖延14个小时,从而造成跟踪系统失去准确度。


  上述都是软件错误的实例,那么究竟什么是软件错误呢?在这里,我们将符合以下5条规则的软件问题定义为软件错误:
  (1) 软件未达到产品说明书标明的功能;
  (2) 软件出现了产品说明书指明不会出现的错误;
  (3) 软件功能超出了产品说明书指明的范围;
  (4) 软件未达到产品说明书虽未指出但应达到的目标;
  (5) 软件测试人员认为软件难以理解、不易使用、运行速度缓慢、或者最终用户不满意。
  我们以计算器为例说明软件错误的概念。计算器的产品说明书可能声明它能够准确无误地进行加、减、乘、除运算,在测试过程中,如果计算器进行加法运算时产生错误结果,那么根据规则(1)判断是软件错误;如果电池电量不足导致计算器计算错误,那么根据规则(4)也是软件错误;如果测试人员感觉计算器按键不方便,或者计算器显示不清楚,那么根据规则(5)都是软件错误。
  软件系统的开发涉及一系列的生产活动,而在这个过程中,人们可能犯很多错误。错误可能发生在设计阶段,也可能在整个过程的开始阶段就发生了,例如对目标定义得不正确或不完善。因为人们的活动和通信都不可能做到完美无缺,所以软件开发的同时伴随着质量保证活动。