《C++代码整洁之道:C++17 可持续软件开发模式实践》 —2 构建安全体系

举报
华章计算机 发表于 2020/02/09 13:16:44 2020/02/09
【摘要】 本节书摘来自华章计算机《C++代码整洁之道:C++17 可持续软件开发模式实践》 一书中第2章,第2.1节,作者是[德]斯蒂芬·罗斯(Stephan Roth),连少华 郭发阳 陈涛 译。

第2章

构建安全体系

测试是一项技能,虽然这可能会让一些人感到惊讶,但这是一个事实。

—Mark Fewster and Dorothy Graham,《自动化软件测试》,1999

我将测试作为本书的开篇可能会让一些读者感到意外,但请相信我,这样做有几个好处。在过去的几年中,测试已经成为衡量软件质量好坏的一个重要指标。一个好的测试策略所带来的好处是巨大的。任何测试(前提是认真设计过的)对代码质量的提高都是有好处的。在保证软件质量的所有措施中,测试是最不可或缺的一环,在本章中我将为你解释这是为何。

请注意,本章所讲的内容通常称为POUT(Plain Old Unit Testing,普通的单元测试),而不是TDD(Test-Driven Development,测试驱动开发,一种软件开发模式),后者将在本书的后面章节另外讨论。

2.1 测试的必要性

1962:NASA的水手一号

水手一号太空飞船于1962年7月22日发射升空,计划飞向金星执行星际探索任务。由于它的定向系统出了一个问题,导致它的Atlas-Agena二级发射火箭工作异常,并在发射后不久便与地面控制中心失去联系。

幸运的是,在火箭设计与建造阶段就已经考虑到了这种情况。于是发射火箭的导航系统接过了控制权并开启自动驾驶模式。然而,由于导航系统软件设计问题,它下达了一个错误的控制指令,导致火箭偏离航线并且不能调整方向,而火箭的前进方向变成了地球上的人口密集区域!

在火箭发射293秒后,现场的地区安全官员下达了销毁火箭的命令。在NASA的一份检测报告中显示,这次事故是由于控制系统源代码中的一个拼写错误导致的,代码中缺少了一个“-”号。而这一失误造成的损失高达1850万美元,在当时这可是一笔不小的损失。

如果问一些软件开发人员为什么说软件测试是有好处的而且是有必要的,我想最普遍的回答就是能够减少故障(bug)、错误(error)以及缺陷(flaw)。毫无疑问,这个回答基本正确:软件测试是QA的一个组成部分。

软件的bug通常是令人不愉快的。程序的错误行为通常让用户大为恼火,比如无效的输出或者用户最讨厌的不定时崩溃的问题,甚至诸如在文本框中的文字被截断这样的小问题,也会让用户在日常工作中痛苦不堪。最终导致的结果就是用户满意度下降,甚至用户转而使用其他产品。除了经济上的损失外,软件开发商的专业印象也会因此大打折扣,最糟糕的情况是,公司运营困难,以致大量裁员。

1986:THERAC-25医用加速器灾难

这一事件可以说是软件开发历史上最轰动的一次失败。THERAC-25是一款放射治疗设备,它由加拿大国有企业,加拿大原子能有限公司,Atomic Energy of Ca*** Limited (AECL)于1982年至1985年研发并生产,共生产了11台设备以供美国和加拿大的诊所使用。

由于质量保证体系不完善,以及开发过程中存在的其他问题,使得它的控制系统中存在严重的bug,直接导致三名病人死于过量的辐射,还有三名患者由于辐射遭受健康永久的、严重的损坏。

此次事件的调查表明,这款设备的控制系统由同一个人开发并测试,这是导致这一悲剧的诸多因素之一。

一提起电子设备,人们首先想到的就是台式电脑、笔记本电脑、平板或者智能手机,而说到软件产品,人们联想到的就是线上购物、办公软件以及信息商务系统。

但是这些只占我们在日常生活中接触到的软件和电子产品的一小部分,目前使用的绝大部分软件都是通过控制实体设备与外界相连。我们的生活由软件掌控。可以这么说,目前软件影响着我们所有人。软件无处不在并逐渐成为我们生活中必不可少的一部分。

当我们走进电梯,我们的生命就由软件掌控。飞机也由软件控制着,全世界的空中交通管制系统更是离不开软件的管理。目前,汽车上也存在着大量与互联网相连的控制软件,为我们的安全保驾护航。空调、感应门、医疗设备、火车、工厂中的生产线……无论我们想干什么,都会不由自主地与软件产生联系。随着数字革命的进步和物联网(IoT,Internet of Things)的快速发展,我们与软件的联系将会更加密切,无人驾驶汽车就是一个很好的例子。

毫无疑问的是,在这种软件密集型系统中,一旦出现bug将导致灾难性的后果。在这些系统中,任何一个错误都可能对我们的身体和生命构成威胁。试想一下,一旦飞机的控制系统出现异常,很可能导致成百上千的人死于空难,而引发事故的原因可能只是飞机自动巡航系统的if语句条件判断错误。在这种复杂的控制系统中,软件的质量是没有任何商量余地的,完全没有商量余地!

即便是在对人身安全要求没有那么严格的系统中,bug也会造成难以估量的损失,尤其是需要日积月累才会表现出来的bug。不难想象,金融软件中的漏洞将会成为且正在成为当今世界银行危机的导火索。假设一个大银行的金融软件由于bug导致每次提交请求时会重复两次,而这种行为在几天后才被发现,这将会导致什么后果呢?

AT&T电话网络的崩溃事故

1990年1月15日,美国电话电报公司(AT&T)的长途电话网络崩溃,导致9小时内高达7500万次的通话请求得不到响应。而导致这一恶果的原因,仅仅是AT&T在1989年12月,将全部114个计算机控制的交换设备升级到第四代电子交换系统(4ESS)时,部署在代码中的一条break语句。这一问题于1月15日在AT&T公司的曼哈顿控制中心首先爆发出来,随后引起连锁反应,并导致整个通信网络中近半数的设备宕机。

在此事故中,估计损失6000万美元,而在通信网络瘫痪的9个小时内产生的经济损失远高于这一数字。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。