第1章 0.000000095的误差夺走28条生命 1
飞向美空军基地的“飞毛腿”导弹 1
“爱国者”导弹系统结构 3
导弹与软件的对决 5
美军的应对 6
“爱国者”注定这天要出事 7
第2章 遥远的火星探测之路:
软件错误导致两架探测器成为火星尘埃 11
太空探测的“文艺复兴” 11
苏联:迈出火星探测第一步 11
美国:火星探测首次成功 14
第一架火星着陆器 15
火星探测的主力军——美国 18
火星探测重新升温 18
NASA的火星探测计划 19
MCO尝试进入轨道 20
MCO通信中断 21
气动减速 22
单位标记不一致导致的悲剧 23
另一台探测器:MPL 26
虽然已进入火星大气层,但是…… 26
MCO与MPL留下的教训 27
第3章 “喂?喂?”一行代码导致的AT&T长途电话系统瘫痪事件 29
AT&T的历史 29
值得信赖的AT&T长途网络 31
出现网络故障 33
问题的起因在于一行错误代码 35
电话事故之后 35
第4章 软件错误带来的黑暗:2003年美国东北部大停电 39
韩国9·15停电事故 39
2003年美国东北部大停电 41
灾难开始 42
接连跳闸 46
最后的堡垒——Sammis-Star 345千伏输电线 48
临界点 51
iPad上市当天排起的长队 53
为什么没有处理预警? 56
第5章 不灭的“约克城”号 59
约克城 59
太平洋战争和“约克城”号 59
军费缩减计划示范舰 67
光荣的硬件,不争气的软件 68
第6章 因特网蠕虫病毒的开始——莫里斯蠕虫 71
互联网的特性 71
具备攻击与防御能力的软件 72
软件漏洞:蠕虫病毒出现 72
和蠕虫的斗争 74
“大虫”后续 76
莫里斯事件逸闻 77
第7章 软件也能使战机坠毁 79
瑞典JAS 39“鹰狮”战斗机坠毁事故 80
“鹰狮”试飞机坠毁 80
再次坠毁 81
原因在于软件 83
航空器中软件的作用日益突出 84
第8章 70亿美元的烟花秀:
阿丽亚娜5号运载火箭航班501 87
蓬勃发展的商业化航天技术 87
阿丽亚娜5号火箭的研发 88
阿丽亚娜5号运载火箭航班501 89
事故还原 89
结论 97
第9章 软件可用性的错误设计:“文森斯”号事件 101
战火从陆地蔓延到海面 103
关系日益紧张的美国和伊朗 106
失误和误判,命运的交响曲 108
射向伊朗航空655次航班的导弹 114
飞机被击落之后 114
第10章 计算机难以理解的人类的时间计算 115
闰年 115
微软的野心之作与闰年Bug 116
让全世界游戏玩家备受煎熬的PS3闰年Bug 118
医院系统故障,纸笔代替电脑 119
罢工的导航仪 120
日常生活中的Y2K Bug 121
第11章 游戏Bug 125
生活中的电脑游戏 125
各种游戏Bug 125
《星战前夜》 128
《魔兽世界》 129
第12章 核武禁果 133
飞向苏联上空的核导弹 134
佩特罗夫的判断 135
佩特罗夫判断之后 137
北美防空联合司令部:NORAD 137
凌晨3点钟的电话 138
第13章 医疗仪器软件杀人:Therac-25医疗事故 141
与日俱增的癌症患者与癌症治疗方法 141
放射治疗 142
Therac-25的研发 143
1985年6月,Therac-25的第一位受害者 145
1985年7月,Therac-25的第二位受害者 146
1985年12月亚基马谷纪念医院,Therac-25的第三位受害者 148
1986年3月东得克萨斯癌症治疗中心,Therac-25的第四位
受害者 149
1986年4月东得克萨斯癌症治疗中心,Therac-25的第五位
受害者 153
1987年1月亚基马谷纪念医院,Therac-25的第六位受害者 155
事故原因1:软件 156
事故原因2:用户界面 159
事故原因3:文档 160
事故原因4:AECL对软件的无知 160
软件错误带来的惨剧 161
第14章 因软件错误而消失的火星探测器 169
“火星全球勘测者”号 169
“火星全球勘测者”号突然终止任务 171
软件错误惹的祸 173
开启火星探测机器人时代的“索杰纳” 175
“勇气”号:真正的火星探测机器人 178
“勇气”号的第一次危机:出现软件错误 178
“勇气”号的第二次危机:轮子出现故障 180
最后的“勇气”号 180
第15章 玩弄世界于股掌之间的金融软件Bug 183
温哥华证券交易所事件 183
四舍五入惹的祸 184
澳大利亚昆士兰州银行卡终端机故障 185
导致公司破产的软件Bug 187
第16章 软件本可以阻止的飞行事故:
大韩航空801次航班和美国航空965次航班空难 191
关岛惨案:大韩航空801次航班 191
坠毁前的记录 192
本可以阻止的事故 195
假如软件发挥了应有的作用 196
美国航空965次航班 198
开始出错 201
“我们现在在哪?” 206
部分责任在于软件 208
第17章 153亿美元的彩票:数字预算会计系统 211
徘徊在地狱和天堂之间的政府 211
数字预算会计系统的开发 211
“较差”的项目 212
无视审计结果并强行运行系统 213
意料之中的漏洞 213
终于酿成大错 214
复合型人才的重要性凸显 214
第18章 丰田汽车“踏板门”事件与软件 217
“刹车失灵了” 218
丰田召回危机 219
丰田软件检测 223
ECU软件有可能导致汽车突然加速 224
Bug百出的丰田软件 226
Barr Group报告和丰田的低头认错并无直接关系 227
写给软件开发者的后记:为了开发无Bug软件 229
最早的Bug 229
软件的原罪:Bug 229
软件开发过程 231
软件Bug的成本 231
编码规范 232
静态代码分析 234
——金尚熏 / “共同关注”SNS Vingle市场联络部 主管
目前发表的软件相关随笔基本都围绕着积极的一面,因为人们对那些优秀的、完美的软件抱有期待。但本书主要讲述的却是错误、失败,以及隐藏在这些事件背后的故事。软件的错误和出错原因(听起来好像不算什么!)都写得饶有趣味,通俗易懂。特别推荐那些有志于提高软件产品安全性的开发人员阅读此书。
——朴载浩 / innods理事、《软件随想录》韩文版译者、 运营博客“计算机与书”(http://jhrogue.blogspot.kr/)
这是一个软件的时代。可穿戴设备、大数据、云技术、无人驾驶汽车等各种尖端技术话题日渐充斥着各大新闻媒体,而电脑软件则是其中的“排头兵”。对于软件开发者而言,位于创新的中心是件好事,但一旦软件出现错误,这种创新的产物也就化为泡影。换句话说,软件发挥的作用日渐增大是好事,但同时,它担负的责任也相应更为重大了。电脑软件本应具有很高的可信度,而一旦软件出现问题,就会给人类带来灾难。本书介绍的正是软件错误给人们带来的一系列麻烦。今天,软件发挥着越来越重要的作用,这些案例定能帮助那些致力于编写安全软件的程序员们。
——申承焕 / 现代汽车集团现代Autron首席研究员、 与人合著Smart Car Software Engineering
预计,软件很快将会代替建立在算法基础上的大部分知识,甚至会取代80%以上的医生。这样看来,对软件质量和Bug的持续观察就显得尤为重要。为了防止书中提到的Therac 25之类事件的再次发生,软件技术正在不断进步。未来会活跃着更多实现了自动化的人工智能,书中向未来的后辈们介绍了许多值得引以为戒的事件,这是很难得的。因此,我要向那些关注软件质量的后继开发人员强烈推荐此书。
——申贤墨 / Open Health Data Group理事、PAG & Partners顾问、 Wooridul医院集团IT战略责任前理事
纵观历史上出现过的重大系统事故,可以说不外乎都是嵌入式软件错误导致的。这是毋庸置疑的事实。本书涵盖了汽车、金融、国防、航空、宇宙科学等领域,向我们展示了软件错误本身是如何引发这些危险事故的,同时又带来了怎样的影响。借助图片,读者可以更好地理解书中内容。本书反复强调了软件错误带来的严重后果,对于从事或研究嵌入式软件的人员来说,这是一本极其珍贵的必读书。向各位郑重推荐。
——尹希炳 / 韩国国防大学国防科学系前教授、高丽大学信息学院计算机系客座教授
现代社会中,我们随处都能看到计算机。我指的并不是智能手机或个人电脑,还有更小的计算机。从玄关处安装的电子锁,到建筑物里的电梯、汽车、飞机等,里面都设有计算机,这些计算机中都安装了软件。假如这些软件出错了会怎样?假如“某场事故”的原因不是人为失误或器械缺陷,而是软件漏洞,你会怎么想?本书针对“一行错误”导致的可怕后果进行了叙述,既像推理小说那样写得妙趣横生,又如同史官做到了秉笔直书。
——李仁墨 / 《朝鲜日报》产业二部IT组记者
最尖端的IT技术带动了人类文明的发展,实现这一梦想的软件其实也有可怕的一面。本书介绍了一系列造成严重经济损失、夺走人们宝贵生命的事故,以告诉我们一个可怕的事实:假如人类在使用软件的过程中出现错误,那么软件会变成比炮弹更骇人的东西。另外,本书并没有停留在简单罗列事实的层面上,而是力求揭开软件出现漏洞的深层次原因,以激发读者的好奇心。我相信,无论是开发软件的程序员还是其他IT界人士,都会被本书深深吸引。
——郑荣范 / 工学博士、fasoo.com PA事业部 开发组长
韩国国内有不少公司由于时间紧迫,制作的软件错误百出,后期又为了修复而头疼不已。软件错误会给用户和相应的开发公司都造成损失,有竞争力的软件公司应该尽量减少软件错误的发生。本书记述了很多致命软件的错误案例,这定能改变大家对软件错误的某些认识。从这一点来说,本书释放的信号是十分有价值的。
——黄治圭 / ZDNet Korea 计算机组记者