第一期逆天 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
