瑞士起司模型(上)
原文由 Marcin Wichary 于 發布,訂閱此部落格
你聽過瑞士起司模型嗎?你有時會在描述複雜系統如何失靈的說明中看到它。通常的示意圖長這樣:

整個概念是這樣的:即使你有多層防護——就像好幾片起司——每一片上都還是有洞。通常某一片上的洞,會被前一片或後一片沒有洞的地方擋住。(例如,車子可能會在你還沒排入 P 檔時就不讓你拔鑰匙——或者,如果你不小心忘了放手煞車就開車,車子可能會對你發出警告。)但偶爾,這些洞剛好連成一線,更大的災難就發生了。
這個模型被用來分析過去的事故,也用來預防未來的事故。它有支持者,也有反對者。要談它的應用不太容易,因為最常見的例子都非常駭人。在我的書裡,我寫過Therac-25,那一章無論是研究還是撰寫都讓人很不舒服。其他常被引用的案例也同樣令人沮喪:車諾比、挑戰者號、特內里費空難、深水地平線爆炸事故。
但我想分享它,是因為在我看來它也適用於 UI 設計,有時能幫助我思考那些細節如何累積成更大的整體。
在這系列的第一篇,我們先從一個比較傳統、但沒那麼慘烈的例子開始。這是 Knight Capital Group 的故事,一家金融服務與交易公司。關於這起事故的經過,我就直接引用Henrico Dolfing 的摘要:
2012 年 8 月 1 日早上,Knight Capital Group 像往常一樣開啟系統,迎接理應平凡的交易日,然而短短幾分鐘內,公司就開始向美國股市送出大量非預期的委託單,在數十檔股票中以買高賣低的方式交易,完全不合經濟邏輯,也無法透過正常管控手段加以阻止。起初看似異常的市場波動,很快就演變成美國最大造市商之一內部的系統性失效,演算法的行為讓交易員和工程師在當下都無法完全理解。[…]
等到問題被發現、系統在約 45 分鐘後關閉時,Knight 已經在 154 檔股票上產生了超過 400 萬筆成交,涵蓋約 3.97 億股,並累積了價值數十億美元的部位,造成超過 4.6 億美元的損失[…]。這起事件的規模不僅是財務上的,更是結構性的,因為單一次部署失誤,就在一個掌管美國股市相當比重的交易系統中擴散開來。[…]
事情是這樣發生的。
很久以前,該公司打造了一個相當無聊、名叫 Power Peg 的功能,用來自動化部分交易。這個功能使用了一個標準的共用限制器,會在所有必要的交易都完成後讓它停止執行。使用數年後,這個功能在 2003 年被棄用、也不再被使用,但關鍵在於,程式碼其實從來沒有被真正移除。
在 2003 年到 2012 年之間的某個時間點,限制器的功能進行了升級,舊程式碼因此不再與之相容。所有在正式環境中的程式碼都被重寫以使用新的限制器,但 Power Peg 功能沒有,因為它已經被棄用、不再使用。
2012 年,該公司開始撰寫一套用於自動化交易的新程式。開發者決定重複使用當初用來啟動 Power Peg 的同一個軟體旗標。當時大家都知道舊程式碼還存在,而想法是舊程式碼會被新程式覆蓋掉,所以重複使用的旗標只會觸發新程式碼。
2012 年 7 月,新程式碼完成,公司開始把它安裝到所有伺服器上以覆蓋掉 Power Peg。公司原本打算把新程式碼部署到全部八台伺服器,但一個失誤導致它只部署到了其中七台。
沒有人發現這個錯誤。
到這裡,你應該就能把整件事拼湊起來了。到這個階段,我想你們許多人每多讀一段,就愈發感到揪心。
8 月 1 日,新功能的旗標被開啟。在七台伺服器上一切正常,但在第八台上,這個旗標卻喚醒了沉睡已久的舊程式碼,並讓它立刻開始執行。由於舊程式碼與新的限制器不相容,它完全不受限制,在不到一小時內就連鎖引發了數百萬筆交易,並造成大量附帶損害;隨後市場對該公司損失超過 4 億美元的消息做出反應,也導致其自身股價暴跌。
喔對了,我還沒提到——這次失誤搞垮了這家公司。(嚴格來說結果是被合併,但那似乎只是在 Knight Capital Group 幾乎倒閉後用來保全面子的說法。)
瑞士起司模型要怎麼套用到這件事上?你可以把它看成五片起司上的五個洞:
- 沒有真正移除舊程式碼是個錯誤
- 重複使用同一個旗標是個錯誤
- 沒有部署到全部 8 台伺服器是個錯誤
- 沒有讓人再次確認部署流程是個錯誤
- 在原本的限制器失效時,沒有自動偵測(甚至自動停止)失控程序的機制是個錯誤
要理解這個模型,重要的是:單獨來看,這些錯誤中的任何一個客觀上都是小錯,而且會被其他幾片起司擋下來。事實上,就算其中四個同時發生,也還不至於釀成災難。
但在這個案例中,五個錯誤完美地連成了一線。
許多對這類事故的分析會把責任歸咎於一連串事件中的單一環節——在這個案例中,往往是沒有把程式碼正確部署到八台伺服器的那位系統管理員——但這主要是因為我們喜歡有個人主導的故事,而不太擅長理解系統的故事。(就連《星際爭霸戰》都加了一個 Borg 女王。)
這起事故後來被戲稱為「Knightmare」(騎士夢魘)。在接下來的篇章中,會有更多與我們更切身相關的系統範例。
隨機一篇部落格
留言
登入後參與討論