臭名昭著的软件错误用例
迪斯尼的_狮子王_,1994-1995
- 1994年秋天,迪斯尼公司发布了第一个面向儿童的多媒体光盘游戏——狮子王动画故事书(The Lion King Animated Storybook)。由于迪斯尼首次进军儿童游戏市场并进行了大量促销宣传,结果销售额非常可观,该游戏成为孩子们节假日的“必买游戏”。然而却飞来横祸。12月26日,圣诞节的后一天,迪斯尼公司的客户支持电话开始响个不停。很快电话支持技术员们就淹没在来自于愤怒的家长并伴随着玩不成游戏的孩子们的哭叫的电话之中。报纸和电视新闻进行了大量报道。
- 后来证实,迪斯尼公司未能对市面上投入使用的许多不同类型的PC机类型进行广泛的测试,软件在极少数系统中工作正常——例如在迪斯尼程序员用来开发游戏的系统中——但是大多数公众使用的系统中却不能运行
英特尔的奔腾浮点除法缺陷,1994
- 在计算机的“计算器”程序中输入以下算式:
(4195835/3145727)*3145727-4195835
如果答案是0,就说明计算机没问题。如果得出别的结果,就表示计算机使用的是带有浮点除法缺陷的老式英特尔奔腾处理器——这个软件缺陷被烧录在一个计算机芯片中,并在制作过程中反复生产。
- 这件事情引人关注的并不是这个软件缺陷,而是英特尔公司解决问题的方式:
- 他们的软件测试工程师在芯片发布之前进行内部测试时已经发现了这个问题。英特尔的管理层认为这没有严重到要保证修正,甚至公开的程度。
- 当软件缺陷被发现时,英特尔承诺通过新闻发布和公开声明试图弱化这个问题的已知严重性。
- 受到压力时,英特尔承诺更换有问题的芯片,但要求用户必须证明自己受到缺陷的影响。
- 舆论大哗。最后,英特尔为自己处理软件缺陷的行为道歉并拿出4亿多美元来支付更换问题芯片的费用。现在英特尔在Web站点上报告已发现的问题并认真查看客户在互联网新闻组里的反馈意见。
美国航天局火星极地登陆者号探测器,1999
- 1999年12月3日,美国航天局的火星极地登陆者号探测器试图在火星表面着陆时失踪。一个故障评估委员会(Failure Review Board,FRB)调查了故障,认定出现故障的原因极可能是一个数据位被意外置位。最令人警醒的问题是为什么没有在内部测试时发现呢。
- 结果是空难性的,但是背后的原因却很简单。登陆探测器经过了多个小组测试,其中一个小组测试飞船的脚折叠过程,另一个小组测试此后的着陆过程,前一个小组不去注意着地数据位是否置位——这不是他们负责的范围;后一个小组总是在开始测试之前复位计算机、清除数据位。双方独立工作都做的很好,但是合在一起就不是这样了。
爱国者导弹防御系统,1991
- 美国爱国者导弹防御系统是里根总统提出的战略防御计划(即星球大战计划)(Strategic Defense Initiative, SDI)的缩略版本,它首次应用在海湾战争中对抗伊拉克飞毛腿导弹的防御战中。尽管对此系统赞誉的报道不绝于耳,但是它确实在对抗几枚导弹中失利,包括一次在沙特阿拉伯的多哈击毙了28名美国士兵。分析发现症结在于一个软件缺陷,系统时钟的一个很小的计时错误积累起来到14小时后,跟踪系统不再准确。在多哈的这次袭击中,系统已经运行了100多个小时。
千年虫问题,大约1974
- 20世纪70年代早期的某个时间,某位程序员(假设他叫Dave)正在为本公司设计开发 工资系统。他使用的计算机存储空间很小,迫使他尽量节省每一个字节。Dave自豪地将自己的程序压缩得比其他任何人都紧凑。他使用的其中一个方法是把4位数的年份,例如1973,缩减为2位数,73.因为工资系统相当依赖于日期的处理,所以Dave需要节省大量昂贵的存储空间。他简单地认为只有在到达2000年,那时他的程序开始计算00或01这样的年份时问题才会发生。虽然他知道会出这样的问题,但是他认定在25年之内程序肯定会升级或替换,而且跟眼前的任务比现在计划遥不可及的未来更加重要。然而这一天毕竟是要到来的。1995年,Dave的程序仍然在使用,而Dave已经退休了,谁也不会想到如何深入到程序中检查2000年兼容问题,更不用说去修改了。
- 估计全球各地更换或升级类似Dave程序以解决潜在的2000年问题的费用已经达数千亿美元。
危险的预见,2004
- 1994年4月1日,在一些互联网用户组上贴出了一条消息,是关于互联网上发现了一封将病毒嵌入在几张JPEG格式图片的邮件的,而且很快就传播开了。消息警告说只要简单地打开或查看受病毒感染的图片,病毒就会感染你的PC机,甚至还警告说该病毒会破坏你的显示器,其中又数索尼的Trinitron显示器最易被破坏。
- 警告受到广泛关注,并且很多人把自己机器上的JPEG文件都清除了,有些系统管理员甚至阻止系统通过e-maill接收JPEG图片。最终人们知道这个是发布在“愚人节”的一个玩笑。专家发表意见说,不可能在查看一幅图片时,病毒感染你的PC机。不管怎样,图片只是一些数据,,它不是可执行的程序代码。
- 10年后,2004年的秋天,一个原形(proof-of-concept)病毒被制造出来,证明了JPEG图片可以带病毒并且在查看时感染系统。软件更新补丁也很快发布以防止病毒的扩散。不管怎样,像这种原本正常的图片通过某种传播手段,造成互联网的灾难性破坏,可能只是一个时间问题。
软件缺陷的官方定义
只有至少满足下列5个规则之一才称发生了一个软件缺陷(software bug):
- 软件未实现产品说明书要求的功能。
- 软件出现了产品说明书指明不应该出现的错误。
- 软件实现了产品说明书未提到的功能。
- 软件未实现产品说明书虽未明确提及但应该实现的功能。
- 软件难以理解、不易使用、运行缓慢或者——从测试员的角度看——最终用户会认为不好。
为什么会出现软件缺陷
- 产品说明书成为造成软件缺陷的罪魁祸首有不少原因。在许多情况下,说明书中没有写;其他原因可能是说明书不够全面、经常更改,或者整个开发小组没有很好地沟通。为软件做计划是极其重要的,如果没有做好,软件缺陷就会出现。
- 软件缺陷的第二大来源是设计。这是程序员规划软件的过程,好比是建筑师为建筑物绘制蓝图。这里产生软件缺陷的原因与产品说明书是一样的——随意、易变、沟通不足。
“说不出来就做不到。”此话用到软件开发和测试身上再合适不过了。
- 程序员对编码错误太熟悉了。通常,代码错误可以归咎于软件的复杂性、文档不足(特别是升级或修定过的代码的文档)、进度压力或者变通的低级错误。一定要注意,许多看上去是编程错误的软件缺陷实际上是由产品说明书和设计方案造成的。经常听到程序员说:“这是按要求做的。如果有人早告诉我,我就不会这样编写程序了。”
- 剩下的原因可以归为一类。某些缺陷产生的原因是把误解(即本来正确的)当成缺陷。还有可能缺陷多处反复出现,实际上是由一个原因引起的。一些缺陷可以归咎于测试错误。不过说到底,此类软件缺陷只占极小的比例,不必担心。
软件缺陷修复的费用
软件缺陷修复的费用随着时间推移呈指数级增长的。
例如前面迪斯尼狮子王实例,问题的根本原因是无法在流行的PC平台上运行。假如早在编写产品说明书时,有人已经研究过什么PC机流行,并且明确指出软件需要在该种配置上设计和测试,付出的代价就小得几乎可以忽略不计。如果没有这样做,还有一个补救措施是,软件测试员去搜集流行PC样机并在其上验证。他们可能会发现软件缺陷,但是修复费用要高很多,因为软件必做调试,修改,再测试。开发小组还应把软件的初期版本发给一小部分客户进行试用,这叫beta测试。那些被挑出来代表庞大市场的客户可能会发现问题。然后实际情况是,缺陷被完全忽视,直到成千上万的光盘被压制并销售出去。而迪斯尼公司最终支付了投诉电话费、产品召回、更换光盘,以及又一轮调试、修改和测试的费用。如果严重的软件缺陷到了客户那里,就足以耗尽整个产品的利润。
软件测试员究竟做什么
软件测试的目标是尽可能早的找出软件缺陷,并确保其得以修复
注意 要记住,“修复”缺陷并非指一定要改正软件。可以是指用户手册中增加一段注释或为用户提供特殊的培训。这可能需要改变市场部门宣传的数据或者甚至推迟缺陷部分功能的发布。软件测试人员虽然在追求完美,确保缺陷被修复,但软件测试的实质则是另外一回事。千万不要在无法达到完美上纠缠和兜圈子。
优秀的软件测试员应具备的素质
- 他们是群探索者
- 他们是故障排除员
- 他们不放过任何蛛丝马迹
- 他们具有创造性
- 他们是群追求完美者
- 他们判断准确
- 他们注重策略和外交
- 他们善于说服
软件测试很有趣
软件测试员的一个基本素质是打破砂锅问到底。他们喜欢找出那些难以捉摸的系统崩溃。他们乐于处理最复杂的问题。这是他们平凡生活中的乐趣。
此外,在软件编程方面受过教育很重要,能够使测试更加高效(检查代码,自动化测试)。
某领域的专业知识对查找该领域软件的缺陷有莫大的帮助。毕竟编写软件是为了解决现实中的问题。