软件 Bug 引发的致命事故,程序员责任何在?

2018 年 10 月 29 日,印度尼西亚狮航一架波音 737 MAX 8 从首都雅加达起飞 13 分钟后,在附近海域坠毁,机上 189 人无一幸免。
2019 年 3 月 10 日,埃塞俄比亚航空一架波音 737 MAX 8 从首都亚的斯亚贝巴起飞后约 6 分钟,飞机坠落,8 名机组人员和 149 名乘客无人生还。
短短 130 多天,两起事故,346 人罹难,我们沉痛哀悼的同时,也不禁发问,究竟是什么原因导致了空难的发生?
随后根据埃航空难的最新调查报告显示,事故的疑点被指向该机型的控制系统。而最新消息显示,波音总裁丹尼斯·米伦伯格于 4 月 4 日发布声明正式承认两起空难与飞机自动防失速系统“机动特性增强系统”(MCAS)有关。为此,在许许多多的人因软件的 Bug、错误和漏洞而丧失生命的同时,肩负该软件开发的工程师是否有责任?其他软件工程师又能从中吸取什么教训?

作者 | Keri Savoca
译者 | 谭开朗
责编 | 屠敏
以下为译文:
波音737飞机的两次重大坠机事故共造成了346人死亡,经过初步调查,该公司的专用软件难辞其咎。
这不是近几年唯一一次因软件的 Bug,错误或漏洞而导致的灾难事件。某些情况下造成了大量的金钱损失,而有些情况甚至造成了重大的人员伤亡。
我们如何确保安全苛求系统的软件的可靠性?软件的失误又总该归咎于人为的失误吗?软件工程师能从中吸取什么教训呢?
历史上的灾难性软件失误
1985到1987年,由软件控制的放射治疗设备Therac-25,因人员疏忽大意而使用了超过规定剂量100倍的大剂量辐射,造成至少5名患者死亡(其他患者重伤)。
2000年也发生过一起类似的事故,由美国公司Multidata开发的软件导致数十名巴拿马患者接受了过量的辐射,其中5人因此而亡。在后续的几年时间里,又共有9名患者离开了人世,很可能同样死于过度辐射。辐射的剂量决定于系统输入数据的顺序,一旦存在差异,错误就发生了——当医生在寻找漏洞以调整软件的可用性时,错误就会加剧。没有反复核查软件计算结果的医生会被控告为谋杀罪。
1991年,一枚弹道导弹击中了沙特阿拉伯的一处美国军营,造成28人死亡,96人受伤。因一个软件的失误而停止了对导弹的拦截。
1997年,一架韩国飞机坠毁而导致228人死亡,其部分责任归咎于近地警告系统编程不良。FFA确认并纠正了该系统错误。虽然人为的失误也是此次坠机的原因之一,但近地警告系统也未能提醒空中交通管制员飞机处于近地面的危险高度。
2018年,优步一款自动驾驶汽车上的软件计算失误导致一位行人死亡。实际上,这辆车的传感器检测到行人了,但认定她是“假阳性”——就像马路上的空汽水瓶一样无关紧要——于是继续行驶。
一些人成功识别出了有缺陷的软件,但并不总能如此。1983年,苏联早期警报系统警报美国向苏联发射了5枚导弹,但负责人认为该警报是误报。但是,我们真的能指望所有的用户识别出软件错误并作出适当的调整吗?尤其是在安全受到威胁的时候。
谁是真正的责任人?
软件引发灾难的原因是多样的,但最紧要的是相关负责人没能检出潜在严重的bug,而且很可能没有尽职尽责的分析bug报告。
苹果FaceTime的漏洞,Facetime允许用户在等待接听FaceTime电话时偷听和监视他人。撰写《与苹果安全团队取得联系如此之难》的作者几乎放弃了。直到一名开发者在一篇广为流传的帖子中提到了这个bug,苹果公司才采取行动。
我在几家大公司中寻找报告软件缺陷的方法——其中的两家公司是Chase(处理敏感数据)和Dodge(已卖出数百万辆汽车)——但我找不到报告软件缺陷的方法。
Chase软件中的漏洞可能不会给用户带来直接的安全隐患,但Dodge软件中的漏洞可能会将用户置于危险之中。
实际情况是——总不能打电话给客服并要求和软件工程师谈一谈吧。
我们可以通过用户报告来了解到更多的小问题和安全问题,但当大型系统上运行的复杂代码事关人命时,又会发生什么呢?

我们应该期望飞行员注意到并曝出波音在飞行中自动化系统的问题或缺陷吗?或者,我们应该期望软件工程师进行频繁、彻底的测试与拓展用户服务吗?我们能期望工程师猜中哪些特性需要额外注意吗?飞行员是否有提前反馈在控制波音737飞机时遇到困难?
如果在代码中错入了正常剂量的辐射值,这些医生是否应该被控告为谋杀罪?对于用户正要用或可能会用到的软件,软件测试人员是否要负责?
有没有办法帮医生在他们的放射管理软件中增加一个新功能,而不是人为的试图避免错误?如果用户能够篡改软件,工程师要承担责任吗?
我们是否应该期望工程师(专攻软件开发)识别并质疑客户(针对软件的任何用途)所提出的漏洞或缺陷/效果欠佳的特性?开发人员如何能知道医生可能在软件中输入的X值呢 ?
软件的开发人员和用户之间是否有充分的沟通?
可以认为用户需对他们使用软件的行为负责,但是当安全受到威胁时又该如何呢?