1.2 软件缺陷与软件故障
1. 什么是软件缺陷和软件故障
软件是由人来完成的,所有由人做的工作都不会是完美无缺的。软件开发是很复杂的工作,开发人员很容易出现错误,虽然软件从业人员、专家和学者付出了很多努力,但软件错误仍然存在。因此大家也得到了一项共识:软件中存在错误是软件的一种属性,是无法改变的。所以通常说软件测试的目的就是为了发现尽可能多的软件缺陷,并期望通过改错来把缺陷消灭,最终提高软件的质量。
软件错误是指在软件生存期内的不希望出现或不可接受的人为错误,软件错误导致软件缺陷的产生。
软件缺陷是存在于软件(文档、数据、程序)之中的不希望出现或不可接受的偏差,软件缺陷导致软件在运行于某一特定条件时出现软件故障,这时软件缺陷被激活。
软件故障是指软件在运行过程中产生的不希望出现或不可接受的内部状态,对软件故障若无适当措施(容错)加以及时处理,就会使软件失效。
软件失效是指软件在运行时产生的不希望出现或不可接受的外部行为结果。
2. 软件缺陷和软件故障案例
(1)“千年虫”问题
在20世纪70年代,程序员为了节约内存资源和硬盘空间,在存储日期数据时,只保留年份的后2位,如“1980”被存储为“80”。但是,当2000年到来的时候,问题出现了。比如银行存款程序在计算利息时,应该用现在的日期“2000年1月1日”减去当时存款的日期,比如“1979年1月1日”,结果应该是21年,如果利息是3%,每100元银行要付给顾客大约86元利息。如果程序没有纠正年份只存储2位的问题,其存款年数就变为–89年,这样顾客反要付给银行1288元的巨额利息。所以,当2000年快要临近的时候,为了解决这样一个简单的设计缺陷,全世界付出了几十亿美元的代价。
(2)阿丽亚娜5型火箭发射失败
1996年欧洲航天局阿丽亚娜5型火箭发射后40S火箭爆炸,发射基地2名法国士兵当初死亡,历时9年的航天计划严重受挫,震惊了国际宇航界。爆炸是由惯性导航系统软件技术和设计中的一个小失误引起的。
(3)“冲击波”病毒
2003年8月11日,“冲击波”病毒首先在美国爆发,美国的政府机关、企业以及个人用户的成千上万的计算机受到攻击。随后,“冲击波”病毒很快在Internet上广泛传播,使十几万台邮件服务器瘫痪,给整个世界范围内的Internet通信带来惨重损失。
“冲击波”病毒仅仅是利用Microsoft Messenger Service中的一个缺陷,攻破计算机安全屏障,可使安装Windows操作系统的计算机崩溃。Messenger Service的这个缺陷几乎影响当时微软公司所有的Windows系统,微软公司不得不紧急发布补丁包,修正这个缺陷。
(4)Windows 2000中文输入法漏洞
Windows 2000的交互式登录窗口存在“简体中文输入法状态识别”全漏洞,利用该漏洞,黑客可以使用交互式登录窗口从本地或远程得到一个Local System权限,利用该权限,黑客可以添加一个管理员账户,进而完全控制一台计算机,随后微软公司紧急发布补丁包,修正这个缺陷。
(5)金山词霸出现的错误
金山词霸2003和金山快译2003正式在全国各地上市以后,很多用户强烈批评这2款软件在某些词语翻译上的错误,并且当金山词霸2003的安装路径不按默认路径,或者用户使用其他以英文命名的目录路径进行安装时,系统就会出现安装完成以后无法取词和无法解释等多类错误,以至于金山公司在正式版发布几天之后就不得不发布补丁。
(6)北京奥运会门票系统故障
2007年10月30日上午9点,北京奥运会门票面对境内公众的第二阶段预售正式启动。
由于瞬间访问数量过大造成网络堵塞,技术系统应对不畅,造成很多申购者无法及时提交申请,为此,票务中心向广大公众表示歉意,并宣布暂停第二阶段的门票销售。
(7)2009年2月份Google的Gmail故障
2009年2月份Google的Gmail故障,Gmail用户几小时不能访问邮箱,应该算是最近因软件故障而受到广泛关注的事件。据Google后称,那次故障是因数据中心之间的负载均衡软件的Bug引发的。
(8)中国铁路网上订票出故障遭质疑
2012年1月为缓解数百万外出务工者春节回家买票难的问题,中国推出铁路网上订票系统,但该系统刚推出几分钟后就崩溃,这引起成千上万人的愤怒。
从上面几个典型的软件质量问题实例可以看出,由于软件本身特有的性质,只要软件存在一个很小的错误,就可能带来灾难性的后果。有错是软件的属性,而且是无法改变的,问题在于如何去避免错误的产生和消除已经产生的错误,使程序中的错误密度达到尽可能低的程度。
3. 软件产生错误的原因
软件产生错误的原因很多,为了能够预防错误,需要了解错误产生的原因,具体地说,主要有如下几方面。
(1)软件的复杂性。软件是复杂的,因为它是思想的产物。随着计算机技术的进步,软件的功能、结构日益复杂,算法的难度不断增加,但是软件却要求高精确性,任何一个环节出了差错都会导致软件出现错误。正因为这个原因,软件缺陷总是会层出不穷。
(2)交流不够、交流上有误解或者根本不进行交流。软件是复杂的,当软件的规模达到一定程度的时候,个人已经无法实现,此时出现了团队,但是如何保证队员之间思想的一致性成了问题,人与人思想之间的差异是客观存在的,交流不够、交流上有误解或者根本不进行交流,这些都会导致软件在开发和维护过程中遇到一系列严重的问题。
(3)程序设计错误。像所有的人一样,程序员也会出错。有些错误可能是随机的,程序员通常是因为一时的疏忽而造成程序设计错误。
(4)需求变化。需求变化的影响是多方面的,客户可能不了解需求变化带来的影响,也可能知道但又不得不那么做。需求变化可能造成系统的重新设计,设计人员的日程需要重新安排,已经完成的工作可能要重做或者完全抛弃,而且需求变化可能会对其他项目产生影响,硬件需求也可能要发生变化。如果有许多小的改变或者一次大的变化,项目各部分之间已知或未知的依赖性可能会增强,进而导致更多问题的出现,需求改变带来的复杂性可能导致错误。
(5)时间压力。软件项目的日程表很难做到准确,很多时候需要预计和猜测。当最终期限迫近和关键时刻到来之际,错误也就跟着来了。
(6)代码文档贫乏。代码文档贫乏或者不规范的文档使得代码的维护和修改变得异常艰辛,其后果是带来许多错误。
(7)软件开发工具。可视化工具、类库、编译器、脚本工具等软件开发工具,都会将自身的错误带到应用软件中。
事实上,无论采用什么技术和什么方法,软件中仍然会有错。采用新的语言、先进的开发方式、完善的开发过程,可以减少错误的引入,但是不可能完全杜绝软件中的错误,这些错误需要测试来发现,软件中的错误密度也需要测试来进行估计。