第一期逆天 bug 写完后,我又继续深入了解了一下程序员这种生物究竟还有什么小巧思没有被发现
果然,程序老哥的灵机一动还在发力,没想到世界上这种让人感到匪夷所思逆天bug多到还能让我出第二期
这第二期的神人程序们依然让人摸不着头脑废话不多说!还是老样子,用我最直接、最真相、最不绕弯、最硬核的调查带大家进入今天的盘点希望大家看得开心!
![]()
程序员魅力时刻
一、还治什么病啊,批量生产绿巨人得了
上世纪 80 年代,加拿大原子能公司(AECL)推出了一款高科技放疗机 Therac-25,
(这AECL也是超级大厂,大概给盒友介绍一下,AECL给中国建过秦山三期核电站,被评为当时我国的最佳核能项目,也是当时中国核电站建设周期最短的项目,核能领域有好多世界级成就,总之就是屌爆了!爆!)
![]()
拥有令人信服的石头:AECL 镇厂之宝(划掉)
不得不说, Therac-25 的设计理念甚是超前,工程师知道大家时间紧,看病要请病假扣工资,毕竟一寸光阴一寸金,这种我从小就会背的格言他们加拿大人也会
所以,这台机器能同时做电子束治疗和 X 射线治疗 !
这集神了,超级二合一,但是就这个卖点不够爆啊这么先进的机器能不能再叠一点正面buff上去呢?
能的,兄弟包能的,当时房价那么贵,高科技又太占地方?没事,拆点零件做小一点就行了可是拆什么好呢?大部分零件都有重要作用啊!
各位天才盒友也想到了吗!
![]()
其实这集不止程序老哥在发力
诶!没错,俗话说艺高人胆大!艺高不高不知道,他们胆子倒是真不小,他们做了一件至今为止都让人感觉到大胆震惊的操作
他们把上一代机器里那些笨重的硬件安全锁全部拆掉。压缩了相当一部分的体积!
等等?安全锁?那还得了?!
不是哥们,当阑尾呢说切就切?
![]()
Therac-25 的后代,其实长得差不多
这种安全锁的拆卸怎么可能说拆就拆?
这种行为连我这种外行都知道不能这么干,他们这些当时顶尖的设计师以及工程师岂会不知?果然,设计师犹豫了,拆不拆好呢?
在这时,软件工程魅力时刻降临!团队程序老哥们自告奋勇,挺身而出!
野生的程序老哥跳了出来!
那时的程序员展现出了当时的软件工程是如此成熟、如此聪明,有了如此聪明的软件,还要物理保险装置干嘛!
![]()
感觉这图我能用一个系列
那还说啥了,拆之!定心丸都有了!程序老哥就这样凭借着出色的技术俘获了团队的芳心。
于是,Therac-25在克服了成本问题(拆零件降成本)、占地问题(拆零件降低占地)以及前沿的多功能设计(两种治疗模式)等诸多困难后,搭配着程序员的巨聪明安全小软件上市了。
我又要拿出这张图了:
![]()
老图重看
但是医疗这种东西,肯定还是经过大量验证的,这机器能正常上市,说明他的奇妙 bug 也许不是那么容易触发……吧
我们一起来研究一下这台机器带大家当医生实习一下:
刚刚不是说了这东西俩模式吗电子束模式和 X 射线模式,大家可能不懂,通俗点说就是洒洒水模式和绿巨人模式。
![]()
绿巨人就是用最右边的γ射线制造出来的(划掉)
给大家科普一下,涨涨知识,依旧是祖传比喻,可能不太准确,大概这个意思:
电子束模式(洒洒水模式):用低功率电子 → 扫描磁铁(一个零件)把它们摊平 → 像花洒一样均匀洒在皮肤表面,跟沐浴一样,这个高中物理学过
X 射线模式(绿巨人模式):高功率电子 → 轰击钨靶 → 产生 X 射线 → 经过滤过器(一个零件)整形 → 像光芒万丈的手电筒一样照进体内
机器简单好用,实习生都能用好(实习生小伏笔)
到目前为止都风平浪静,实习生们一步一步按照说明书仔细操作,慢慢选择
俗话说得好,一回生,二回熟,三回巧,这不巧了吗 这些实习生越用越六,手法逐渐娴熟!一切都在蒸蒸日上!
![]()
蒸蒸日上!
然后 bug 就出来了,程序老哥没想到这种医疗大事有人设置模式的时候不慢慢一步一步来,而是熟能生巧赶着下班快捷键按到飞起(准确来说那时候不是快捷键,应该叫光标指令与键盘箭头键)
然后按太快了程序没反应过来,就把绿巨人模式的强度均匀地像洒洒水模式一样把人笼罩在万丈光芒之下! 我吃奥!
![]()
按这么快干嘛啊
你们机器给我操作好了啊!按那么快干什么!
这件事大概就是这样。
但毕竟是重大医疗事故,还是需要解释一下 bug 在哪,这种 bug 稍微高级点,不像上一期那俩傻子一样猎奇但是只能说异曲同工
![]()
放疗机
问题其实就是软件的竞态条件出了问题,我在实践调查的网站上看到数据是当时的仪器大约八秒检查一次输入和数据
实习生按的慢一直没出问题,操作快的老资历反而栽了 坏了,吃了太厉害的亏所以当时高考考满分我是拒绝的做人不能太厉害。
言简意赅和盒友解释:就是机器还没准备好,输入太快立马执行下一条指令,软件就会跳过安全检查,来不及检查就去处理下一条指令了,检查前摇太长被打断施法了
但这件事在当时的先进软件工程保护下,岂能没有对策!
![]()
还有救吗
有!怎么能没安全保障呢?
Therac-25(1985–1987),看名字都知道他有老前辈,那就是著名的 Therac-6 以及 Therac-20 系列,当时为了杜绝写太多新代码导致不安全和引入新 bug,相当多的代码是使用神奇的程序员小键盘写成的,盒友请看图:
![]()
程序员必备奇妙小键盘
是的,和上一期那俩傻子事件一样,复制粘贴还在发力
但您猜怎么着,这个 bug 他的前辈就有,当时运行的很不错就直接粘贴过来了。
可前面的机子没有拆安全锁啊哥们,安全锁一直在给这个 bug 兜底
我好像记得……这 Therac-25 为了省空间安全锁可是全拆了的
你没记错,于是,两年间,剂量大到足以产生无数绿巨人的辐射就这样洒在了可怜的患者身上
我甚至看到有的报道说存在比正常剂量大了快一百倍的情况,一百倍啊这可是。
短短两年,记录在案的重大级医疗事故就有六起。
两年六起大规模辐射过量这个数字是很严重的了,大家不要觉得很少
我进一步查了一下,当年Therac-25 全北美似乎有十一台,六台发生过重大事故,还死亡了三人,多人重伤(烧伤以及永久残疾) 相当于全北美有超过一半的机器因为这个 bug 产生了重大事故!
看剂量也是把火箭筒当手枪打了,坏点子全使患者身上了!
当时很多人治疗感觉全身火辣辣的,以为是说明效果很好,不是啊!是灼伤啊! 此贴从这里开始,变得沉重了起来。
这次事故直接催生了医疗设备行业的许多强制性规定,但完全不能算做了好事。 可惜的是,奖池还在累加,这件事上还有高手。
![]()
还有高手?
都说了这期和上期的俩傻子有异曲同工之妙上集的俩坑这机器一次性全踩了 正常机器准备好了的写法大概是整个变量储存一下准备状态:
ready = 1 # 意思是机器准备好了
简单举例子,看不懂没关系,我会用我的祖传比喻解释一下发生了什么,总之就是这帮神人程序猿写的是:
ready = ready + 1 # 意思是每次准备好后,准备次数加1
大概程序团队的视角看就是:
“诶嘿嘿,我倒要看看我这种绝世天才写出来的绝佳济世救民的机器总共准备了多少次,救了多少条人命我来写个变量存储一下机器准备了几次就可以知道了,好聪明呀”
捏马的,当时这个储存变量最大只能储存 0 到 255,第 256 次准备就溢出了(存不下了的意思),相当于第 256 次之后完全清空,从此之后直接跳过安全检查
卧槽!绿巨人被这剂量照这么一下都得缩回去啊你踏马的 谁教你这么写的
还捏马:我看看我救了几个人。
刚刚操作慢点的实习生还能免去第一个 bug 不去祸害患者,现在这机器演都不演了是吧,华佗来了按一下都要倒一个无辜患者
![]()
患者.jpg
二、神之妙手,紧急救援
不过这一期不像火箭,爆了就没法挽救了 AECL 后面紧急调来了开发团队和工程师,试图力挽狂澜,他们在研究之后快马加鞭给所有用户发了解决方案 当时的解决方案是这样说的:
“我们修不好这个 bug”
不敢写了
这些人在干什么
搞得我现在在怀疑我在写什么
![]()
结构示意
后面就是AECL漫长的装死期和死不承认,指责那些操作者操作不对。
后续迫于压力也提出了别的解决方案,我找到的解决方案是:
“别用回退键,输错了就用重置机器然后重新输”
![]()
人类何在
直到 1987 年,Therac-25 被 FDA (就是美国食药监局)强制召回,AECL 面临多起诉讼,这场风波才匆忙结束。
就像我前文说的,这个案例直接催生了全球医疗软件安全标准(比如 IEC 62304),也成为全世界软件工程课堂上的必讲案例。
因为上期和这期的三个案例太脑残了,怕有盒友质疑是不是假的
其实三件事都有据可查这三起都是相关领域的知名重大事故
所以有时候一个小失误就会酿成巨大的悲剧,写程序的盒友一定要小心啊
这里面还有许多值得考究的细节,比如有趣的神人互喷环节和推卸责任环节
大家感兴趣可以去具体搜搜 总之,引用盒友的名言:
十年研发一场空,开了 short 见祖宗
(鉴于有盒友不懂程序,粗略解释一下就是 short 装不了多少容易存不下数据溢出酿成大错!就和文章案例一样,算了,解释完没那么好笑了,不解释了)
![]()
合影!
(声明:本文无 AI 纯手撸,盒友比较喜欢我写的没润色的屎那我以后就不用 AI 写镶金屎了写了好久查了好久,希望盒友喜欢,可点一个小小的赞乎?)
![]()
程序员之头脑风暴!
最后,感谢观看!推荐一个我喜欢的严肃向太空模拟游戏(并非)
祝大家周一快乐!如果感兴趣想看看其他程序员的灵机一动,可以看看第一期:
差点绷住,人类史上震惊世界的逆天bug们!程序老哥的小巧思大赏!
更多游戏资讯请关注:电玩帮游戏资讯专区
电玩帮图文攻略 www.vgover.com
