图片来源@视觉中国
文 | 郭华
1973年,苏联开始在基辅修建切尔诺贝利核电站,除了满足乌克兰的用电需求外,还希望借此向世界展示苏联“和平利用核能”的形象。
差不多同时,加拿大一家造核电站的公司AECL,成立了医疗部门,开始开发放射治疗仪。
核能有三个主要的应用领域,分别是核武器、核动力、核医学。一般来说,后两者被认为是和平的,且越靠后就越和平。
AECL全称Atomic Energy of Canada Limited,成立于1952年,由加拿大国家控股,其使命就是和平利用核能,所以AECL开发放射治疗仪似乎天经地义。不过AECL的医疗部门并不是从头开始的,他选择了和法国的CGR公司合作,然后把CGR的两款老产品进行升级,变成了自己的新产品,分别起名为Therac-6和Therac-20。
这算借腹生子?还是借子生子?都不重要,重要的是孩子已经有了。
可能是这两款产品让AECL站稳了脚跟,也可能是双方在市场上产生了分歧,总之因为一些未公开的原因,AECL和CGR的合作在1981年终止。
这年,切尔诺贝利的第三个反应堆建成开始发电,按照预期,六个反应堆都建成后切尔诺贝利将成为苏联最大的核电站。
AECL的脚步也没有暂停,他在结束合作的一年后推出了Therac-25。
Therac-25有很多特别之处。
在AECL的产品体系中,后缀表示辐射能量,Therac-6的能量是6MeV,Therac-20是20MeV,Therac-25就是25MeV。所以他的能量是最大的,更大的能量意味着能够触达更深的病灶。而且他更先进,因为他能够完全由软件进行控制——就像2007年的iPhone、2010年的特斯拉一样,更发达的软件就是先进的表现,至少是现今的表象。借助于发达的软件,他省去了很多硬件,甚至包括安全锁,所以他的成本也更低。
更重要的,他是AECL的亲儿子。
1983年,加拿大总领事馆在美通社新闻中对其进行了隆重发布,并在随后交付出了11台,其中5台在美国,6台在加拿大。巧合的是,后来发生爆炸的切尔诺贝利四号反应堆也是在这年上线的。
辐射的衡量单位是伦琴。
在切尔诺贝利爆炸的反应堆旁站十分钟,受到辐射量大概是5000伦琴。
Therac-25在事故中给患者施加的剂量是切尔诺贝利的4倍,能够达到20000伦琴以上,是常规治疗的100倍。
而短期内全身接受1000伦琴的剂量便会致人死亡。
所以说如果切尔诺贝利像一个核弹,那么Therac-25就像一个杀手,披着治病救人的外衣反复作案——在1985-1987年间,他总共制造了6起事故,其中4人死亡,2人重伤。
Therac-25系列事故的本质就是AECL的失控——他的软件无法控制他的硬件,他也控制不了他的软件,而他的软件和硬件一起,又正在控制着核辐射。
1985年6月,美国佐治亚州的肯尼斯通肿瘤中心,第一起。
这是一次胸部肿瘤的常规放射治疗,射线强度预期200伦琴,照射位置为前胸,患者是一名61岁女性。但治疗开始后不久,患者便感觉到了剧烈的灼烧感,随后前胸的照射点、后背的贯穿性对应位置都出现了红肿,这很像辐射伤。医生立即停机并联系了AECL。
三天后,AECL回了电话,表示过量辐射是不可能的。
患者不认可这个结论,医院又给不出其他合理解释,于是患者便把医院和AECL一块告上了法庭。但AECL始终拒绝承认Therac-25有问题,再加上治疗当天Therac-25的打印功能被禁止了,当时的机器参数并没有备份,所以该起诉讼最终庭外和解。
患者的胸部被切除,后来经过测算,当时的辐射强度大概在15000伦琴到20000伦琴之间。
这起事故发生在美国,美国有个FDA(食品药品监督管理局),但Therac-25上市并没有经过FDA的测试。
FDA的上市认可有两种,一种是PMA(Pre-market Approval)),一种是510K。PMA需要厂家充分证明该设备的安全性,并通过FDA组织的临床试验与实验室测试。而510K则轻松的多,只要证明该设备与市场上已存在的设备具备等同性即可。
Therac-25上市用的是510K,大概是因为他与Therac-20具有某种意义上的等同性。
实际上不仅FDA没有对Therac-25进行过独立测试,AECL也没有,他在1986年提交给FDA的事故报告里承认了这一点。
AECL表示一直以来所有设备(Therac-6、Therac-20、Therac-25)上的软件都是一块进行测试的,没有单独对Therac-25进行过完整测试。Therac-25的很多代码是从Therac-6中移植过来的,大概AECL认为测过Therac-6就相当于测过Therac-25了吧。
另外还需要一提的是,Therac-6的代码都是法国伙伴CGR编写的。
后来的事实证明,AECL对这些代码知之甚少。
1985年7月,加拿大安大略省癌症基金会,第二起。
和第一起类似,患者在治疗过程中感觉到了剧痛和灼烧感,但诡异的是,明明是辐射过量,Therac-25显示器却多次报出了“No DOSE delivered (没有剂量传输)”信息。
随后AECL派了工程师去调查,无法复现错误。
但他还是表现出了一副控制了局面的样子。
他“猜测”问题是由电路故障导致的,然后基于这个猜测,AECL召回Therac-25进行了改造。根据说明,这次改造可以将安全性提升5个数量级,也就是原来的10万倍。
不知道这个数字是怎么来的,更不知道为什么如此安全,AECL还是在改造说明中建议用户使用Therac-25时最好进行“目视检查”。
这起事故的患者三个月后死亡,后来经过测算,当时的辐射强度大概在13000伦琴至17000伦琴之间。
1985年12月,美国雅基玛谷纪念医院,第三起。
这次事故中的Therac-25刚刚经过了AECL的所谓5个数量级安全性的改造。
和之情的情况类似,先是病人在放疗后身体出现了疑似过量辐射的红斑,于是医生联系AECL,之后便是AECL的否认三连:先回复不可能,然后表示从没有出现过类似的情况,最终猜测可能是其它原因。而且这次AECL还附了一个两页纸的说明,详细列举了Therac-25不可能过量辐射的理由。
医生没有办法,最终只能在院方的报告中将事故原因归为未知。
病人没有死亡,但留下了残疾和伴随终生的疼痛。
debug是查找软件bug的过程,其中的关键是复现。
所谓复现,是指找到bug发生的条件,然后模拟这些条件,让bug重复发生。前面事故一件件发生,而AECL始终没有成功复现过问题。
直到第四起和第五起。
这两起都发生在一个地方,前后间隔不过三周,本质就是一次天然复现。
1986年3月,美国东德克斯说肿瘤中心,第四起。
事故的迹象都是一样的,患者的症状也是一样的,AECL的回复同样是一样的:不可能、没听说、应该是其它原因。
这次AECL给出的其它原因是漏电,大概因为患者在描述当时的感觉时说像遭受了电击,并听到了滋滋声吧。
和之前一样,AECL靠着否认三连又一次控制了局面。
但很快,第五起就发生了。
1986年4月,美国东德克斯说肿瘤中心,第五起。
第五起和第四起发生在同一个地方,对医院和患者来说,这显然是一种巨大的不幸。但对整个事件来说,这却像一种幸运,因为正是如此才让Therac-25的bug现了原形。
不过复现bug的不是AECL,而是这个医院的医生。
第五起事故发生后,他不再相信AECL三周前给出的解释,开始自己调查事故原因。
他发现两次事故中,一个共同点是操作员都修改过处方。
图1是Therac-25的电脑输入界面。Therac-25支持两种射线模式,一种是X射线,一种是电子束,在正常的流程中,操作员依次从左上角输入到右下角,输入患者姓名、射线类型、射线能量等参数,最终光标会停到右下角,也就是绿色高亮的位置。
在这两次事故中,操作员均是在一切都输入完成后发现了错误:射线类型(BEAM TYPE)一栏应该是E(电子束),但错误输入成了X(X射线)。于是他移动光标对其进行了修改,然后又将光标移回了绿色高亮位置,随后点击确认,启动治疗。
图1 Therac-25的操作界面
但这个操作还不能保证复现问题,经过反复试验,医生找到了其中的关键,那就是时间,时间要快。
确切的说,修改要在八秒以内,这样bug就能稳定复现。
然后在医生的帮助下,AECL终于找到了Therac-25的bug。
图2 Therac-25 伪代码片段
实际上这个bug相当简单,仅仅是一句放错了位置的代码(见图2),但其隐蔽性要结合Therac-25的操作流程(图3)来解读才能显现出来。
图3 Therac-25执行流程图
把大象装冰箱要分三步,用Therac-25进行治疗也要分三步:第一步,操作员输入处方;第二步,Therac-25根据处方进行机器设置;第三步,开始治疗。正常情况下,三步顺序执行没有任何问题。
但这两次事故中操作员修改处方数据,实际上形成了一种并行。
并行是计算机领域的一个术语,指多件事同时执行,很多简单问题一并行就变的难以理解。
Therac-25的原始射线非常集中,而这对人体危害是很大的,所以Therac-25会在射线路径上放置一系列磁铁,来对射线进行分散。
设置磁铁的伪代码见图2。
如果懂一些编程的话,应该可以发现其标黄的用以清除标记位的指令(注释3)放错了位置,应该放在Magnet函数的循环外(注释4)。
不懂编程也没关系,只需要知道这段代码有bug,而这个bug会让Therac-25在调节磁铁的时候,忽略操作员对处方进行的修改。
调整磁铁需要8秒钟左右,这8秒,便是Therac-25的死亡窗口。
在这两起事故中,操作员的修改均发生在这个窗口内,所以修改都没有生效,也就是说,Therac-25实际执行的是X射线模式。
在Therac-25的设计中,X射线模式的能量只有一种,就是系统最大的25MeV,然后用一个射线过滤器来调节高强度的原始射线,将其减弱到治疗所需强度。
只不过这个过滤装置需要手工放置到照射路径上,而在这两次事故中显然都没有,因为操作员都以为正在执行的是电子束模式!
所以悲剧就这样发生了。
患者受到了原始的高强度射线的照射,事故中他们听到的滋滋声不是电流声,而是射线测量器被射线穿透后发出的声音,就像把42度量程的体温计扔到开水里一样,它已经饱和失效了。
后来经过测算,当时的辐射强度为25000伦琴,是站在爆炸的切尔诺贝利反应堆旁边十分钟接受的量的5倍。
两名患者均在不久后死亡。
第五次事故发生后,医生把事故和复现事故的详细步骤告知了AECL。
AECL立即给所有用户发了一份声明,告知Therac-25存在问题,并给出了修改方案:
禁止向上移动光标。
就这么简单。
然后他又给FDA做了汇报。
这是AECL第一次正式给FDA汇报问题,前面四起事故中,只有第二起(发生在加拿大)AECL告知了美国的FDA,但只含糊的说Therac-25存在一个需要“目视检查”的问题,而且他还进行了召回。
不过AECL到底还是晚了一步,在此之前,FDA已经获得了来自德克萨斯州健康部门的“非法”汇报,并且已经开始调查AECL的问题了。
说“非法”,是因为当时的美国法律只要求医疗设备的制造商汇报问题,并没要求医院等使用者,所以FDA一直不知道发生了这么多起事故。实际上当时FDA对医院发生的、因医疗设备问题而引起的伤亡事故所知不足1%。Therac-25事件后,美国对这条规则进行了修改,同样要求使用者向FDA汇报问题。当然这都是后话。
当时FDA很快否定了AECL那个禁止向上移动光标的用户声明,并要求他按照《健康与安全辐射控制法》的规定进行整改,具体包括:通知所有购买者、调查问题、确定解决方案、提交对应的改进计划。
这时时间是1986年4月,惊世骇俗的切尔诺贝利大爆炸也发生在这一个月。
1986年5月,FDA再次要求AECL重新通知用户,详细说明问题,并提交改进计划。
这时Therac-25的用户也坐不住了,他们联合起来,举办了第一届Therac-25用户大会。
从某种意义上来说,这很像一种自救:事故在不断发生,而厂家给出的信息总是令人失望,对问题避重就轻,对改进夸大其词。作为用户,他们至少享有知情权。用户聚在一起,讨论了事故的详细经过,然后开始共同寻找解决方案。AECL也派人参加了会议,他们表示之前没透露太多信息完全是不想引发谣言,AECL绝对没有keep things quite的公司政治。
用户讨论后要求增加硬件锁。
AECL拒绝了他们,理由是多余。
但他表示自己正在开发一个能够把Therac-25的安全性再提升几个量级的补丁。这个补丁于1986年6月13发布,叫补丁V1。
不过FDA马上否定了补丁V1,并要求AECL给出详细测试计划。
AECL表示测试计划很难,但可以再加一个补丁,于是在1986年12月22日发布了补丁V2。
V2上线后的第25天,第六起事故发生了。
1987年1月,美国雅基玛谷纪念医院,第六起。
第六起和第三起发生在同一个地方。
在用户和FDA的压力下,AECL很快查明了问题。
简单来说,这起事故是由另一个bug引起的。和之前的一样,单从本身看,这个bug本身也不是什么大问题,仅仅是一个字节使用不当而已,但它们的影响都是致命的。
至此,AECL的信任被消耗的差不多了,哪怕他宣布立即上线之前被否定的硬件锁,也没有再让大家相信Therac-25的安全性。
FDA很快下线了所有的Therac-25。
AECL继续孜孜不倦的开发补丁。1987年7月21日,他发布了最后一版补丁,第5版,所以叫补丁V5。
但这个补丁并没有V5起来,后面的日子里,Therac-25江河日下。
1988年,AECL重组了开发Therac-25的医疗部门,将其更名为Theratronics,并试图打包卖给别人,未遂。
1991年,因为Therac-25的问题,FDA禁止了该公司的全部产品线。
2005年,Theratronics公司解散。
Therac-25事件后,FDA开始仔细研究医疗软件设备的审查标准,并逐渐发展成了现行的IEC62304(2006版,国内对应为YY/T0664)。这也是现在医疗软件开发过程管理的基本标准。
Therac-25其实就是一种机器人。
自机器人被发明,甚至被幻想出来开始,关于它不听话了要怎么办的担忧就没有停过。
而且这并不像科幻小说那么遥远,你肯定听过自动驾驶的故障,也用过只知道绕圈子息事宁人的智能客服,从广义上来说,这都是机器对你的碾压。
给牛顿写了墓志铭的英国人蒲柏有这么一句诗:
To err is human; to forgive, divine。
犯错是人性,宽恕是神性。
或许比起等待机器产生自我意识,然后要求它们凭借善良本性,遵循阿西莫夫的机器人三定律来,这会是一个更理性的选择。
毕竟我们都知道人不能因噎废食。
参考资料:
1.[Threac-25], https://en.wikipedia.org/wiki/Therac-25
2.[Medical Devices : The Therac-25], Nancy Leveson
3.[ An Investigation of the Therac-25 Accidents],Leveson, Nancy G.; Turner, Clark S
4.[Fatal Dose - Radiation Deaths linked to AECL Computer Errors],http://www.ccnr.org/fatal_dose.html
更多精彩内容,关注钛媒体微信号(ID:taimeiti),或者下载钛媒体App
2022-09-14 钛媒体 App发布了 《星巴克加码中国市场,未来三年要新增开3000家门店|钛快讯》的文章
2022-08-11 钛媒体 App发布了 《白云山麾下公司虚抬药价“把戏”,被拆穿了》的文章
2022-07-06 钛媒体 App发布了 《为了帮00后卷王找到工作,简历修改师们拼了》的文章
2022-07-06 钛媒体 App发布了 《威尼斯向游客收“进城费”,国内城市如何借鉴?》的文章
2022-03-25 钛媒体 App发布了 《蔚来2021年财报发布:年营收361亿元,整车毛利率达到20.1%》的文章