C++ 代码整洁之道:C++17 可持续软件开发模式实践 (11):构建安全体系 2.1

阅读数:7 2019 年 12 月 4 日 18:47

C++代码整洁之道:C++17可持续软件开发模式实践(11):构建安全体系 2.1

(测试的必要性)

内容简介
本书致力于讲述 C++ 整洁代码之道!如果你想让自己写的代码更加整洁,那么这本书适合你阅读。本书需要熟悉 C++ 语言的基本概念,才能有效的掌握其中的内容。如果你只是想从 C++ 开发开始,并且没有 C++ 语言的基础知识,你应该首先选择一个好的 C++ 入门的练习项目。此外,本书也不包含任何深奥的技巧和杂乱的知识点。我知道 C++ 有很多令人兴奋的技巧,但这些通常不是整洁代码的精神,也不是现代 C++ 的代码风格。除此之外,这本书为了帮助 C++ 程序员提高技能水平,并举例说明如何编写易于理解的、灵活的、可维护的和高效的 C++ 代码。即使你是一个经验丰富的 C++ 开发人员,这本书中也有一些值得学习的地方,我认为这些值得学习的地方能够促进你的工作。书中所提出的原则和实践可以应用于新的软件系统,有时被称为“绿地项目”,以及具有悠久历史的遗留系统,通常被称为“棕地项目”。

1962:NASA 的水手一号
水手一号太空飞船于 1962 年 7 月 22 日发射升空,计划飞向金星执行星际探索任务。由于它的定向系统出了一个问题,导致它的 Atlas-Agena 二级发射火箭工作异常,并在发射后不久便与地面控制中心失去联系。
幸运的是,在火箭设计与建造阶段就已经考虑到了这种情况。于是发射火箭的导航系统接过了控制权并开启自动驾驶模式。然而,由于导航系统软件设计问题,它下达了一个错误的控制指令,导致火箭偏离航线并且不能调整方向,而火箭的前进方向变成了地球上的人口密集区域!
在火箭发射 293 秒后,现场的地区安全官员下达了销毁火箭的命令。在 NASA 的一份检测报告中1显示,这次事故是由于控制系统源代码中的一个拼写错误导致的,代码中缺少了一个“-”号。而这一失误造成的损失高达 1850 万美元,在当时这可是一笔不小的损失。
1 美国宇航局国家空间科学数据中心 (NSSDC): Mariner 1, http://nssdc.gsfc.nasa.gov/nmc/spacecraft-Display.do?id=MARIN1 , retrieved 2014-04-28。

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

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

1986:THERAC-25 医用加速器灾难
这一事件可以说是软件开发历史上最轰动的一次失败。THERAC-25 是一款放射治疗设备,它由加拿大国有企业,加拿大原子能有限公司,Atomic Energy of Canada 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 个小时内产生的经济损失远高于这一数字。

C++代码整洁之道:C++17可持续软件开发模式实践(11):构建安全体系 2.1

购书地址 https://item.jd.com/12599914.html?dist=jd

评论

发布