Share via


Windows 機密文件努力一點,而不是聰明一點

Raymond Chen

對軟體開發人員來說,Windows 錯誤報告最大的優點之一,就是可以取得有關程式失敗過程的現實生活資訊。只要是在 winqual.microsoft.com 註冊的軟體廠商,都可以取得這些錯誤報告。當然嘍,您也可以在實驗室執行各種測試,但是實驗室的情況與現實生活的情況一定會有差距。這種差距很可能會產生實驗室從未發生,卻令客戶抓狂的錯誤。

幾年前,一位被產品可靠性小組指派負責一件工作的程式設計師曾告訴我這麼一個故事。該小組希望能夠解決某一個特定元件中故障和當機的前幾個原因。經過一番協商之後,雙方同意設立一個目標,也就是將這些類型的失敗數目降到原來的 2 分之 1。他們希望能夠修正導致該元件中過半故障和當機率的錯誤 (根據 Windows 錯誤報告的測量)。

我們都知道,失敗並不是採取平均分佈的方式發生的。有的失敗很罕見,有的很常見,有的則是很猖獗 (相對來說)。工程設計是一種交易遊戲;必須在資源 (時間、金錢和腦力) 有限的條件下,把資源投注在最有成效的地方。既然他們的目標是減少故障和當機率,因此明智的做法應該是研究 Windows 錯誤報告中提出的最常見錯誤、瞭解根本原因,然後再修正這些常見錯誤。

fig00.gif

Windows 錯誤報告提供有關程式失敗的現實生活資訊 (按一下以放大影像)

這位程式設計師在研究失敗資料後,發現有五種故障和當機方式佔了報告的 60 % 以上。如果程式設計師可以修正導致這五種失敗的錯誤,他就能夠把故障和當機數量降到原來的 2.5 分之 1,比他們設定的目標 2 分之 1 更好。

根據 Microsoft 自己的 Windows 錯誤報告資料分析顯示,帕雷托法則 (Pareto principle) 非常適合套用在 Windows 故障和當機的案例;也就是說,大約 80% 的失敗,是由 20% 的錯誤所導致。但是同一份研究卻揭露了更驚人的結果:有 50% 的失敗,是由 1% 的錯誤所導致。雖說並非所有的錯誤都生而平等,但是分佈的情況扭曲得這麼厲害,也很教人嘖嘖稱奇。

那位程式設計師在仔細研究過五大失敗之後,終於瞭解所有的失敗都是出自於同一個原因。故障和當機只是以不同的方式表現同一個基本錯誤罷了。因此他開發並測試了一種修正程式,然後與品管小組成員共同合作,在下一個修補程式加入這個修正程式。正因為那個修正程式,使得該元件的假設失敗率立即降到原來的 2.5 分之 1。他的任務也以相當簡單的程式碼修正程式畫下句點。

聽到這個故事時,我很訝異該元件的錯誤分佈曲線竟然比 Windows 的更加陡峭。原來半數以上的故障和當機,都只是因為一個錯誤而起。少了 Windows 錯誤報告這種東西幫忙收集資料,要深入瞭解您的程式碼,簡直是不可能的。

您一定以為可靠性小組在這麼短的時間內達到目標,應該笑得合不攏嘴吧。當然嘍,只用一個小小的修正程式,就在短短兩個星期內攻破大家達成共識的目標,焉有不高興的道理。錯,他們氣極了。

「實在無法接受 — 我們原本預期要花兩個月的,沒想到竟然這麼簡單!」原來,他們是希望程式設計師努力一點,而不是聰明一點。

Raymond Chen 的網站「The Old New Thing」以及同名著作均探討 Windows 的歷史和 Win32 程式設計。他有 80% 的洗衣工作,洗的都是他 20% 的衣服。