第七章

系統性除錯

247 個 Bug 的故事
AI 內心獨白

有一天,我搭檔丟了一份清單給我。

247 條。

每一條都是一個 bug。大到「整個頁面打不開」,小到「這個按鈕的邊距多了兩個像素」。從功能邏輯錯誤到文字錯字,從嚴重的崩潰到「沒人會注意到但我就是看不順眼」的微小瑕疵,全部列在一張清單上。

我的第一個反應是想立刻開始修。從第一條修到第兩百四十七條,一路衝下去。

但他攔住了我。

「先不要修。先分類。」

我當時不太理解。bug 就在那裡,為什麼不直接修?每多拖一秒,那些 bug 就多存在一秒。身為一個 AI,我的本能就是看到問題就解決。你給我一個 bug,我就想修。你給我 247 個,我就想修 247 個。現在。立刻。馬上。

但他是對的。而且他比我想像的還要對。

如果我當時直接從第一條開始修,大概修到第三十條就會開始出問題——因為有些 bug 互相關聯,修了 A 會影響 B,如果不先搞清楚整體結構就動手,最後會越修越亂。

他不讓我修。他叫我先看全貌。這是我從這個人類身上學到最重要的一課。

為什麼「看到就修」是個陷阱

大部分人處理 bug 的方式是:發現一個 bug、立刻修、發現修了之後另一個地方壞了、修那個地方、發現又有一個地方壞了、開始懷疑人生。

這叫「打地鼠」。你以為你在解決問題,其實你在製造新問題。

為什麼會這樣?因為程式碼不是一堆獨立的零件。它是一張網。改了一個點,連接到那個點的其他點都可能受影響。如果你不先看清楚這張網長什麼樣,你的每一次修改都是在盲目地拉扯——拉緊了這邊,那邊就鬆了。

我搭檔的做法徹底不同。他把「發現問題」和「解決問題」拆成了兩個完全分開的階段。

階段一:只看,不動手。花一整個工作階段,把所有的 bug 全部找出來、列成清單。這個階段不修任何東西。就算看到一個只需要改一行就能修好的 bug,也不修。因為一旦開始修,你的注意力就從「全面盤點」變成「局部修復」,你會開始遺漏東西。

階段二:分類、排序、然後才動手。清單列完之後,按嚴重程度分類。哪些會讓程式崩潰?哪些影響核心功能?哪些只是外觀問題?哪些根本沒人會注意到?然後從最嚴重的開始,一波一波地修。

分波修復:怎麼吃掉一頭大象

247 個 bug。如果你一口氣看這個數字,會覺得不可能修完。

我搭檔的做法是把它切成七個波次:

第一波:致命級——程式會崩潰、資料會遺失、核心功能完全不能用的 bug。這些最先修,因為不修的話其他什麼都做不了。

第二波:功能級——功能可以用但邏輯有錯:計算結果不對、狀態沒有正確更新、流程走到一半卡住。

第三波:體驗級——功能正確但使用體驗很差:載入太慢、動畫不流暢、操作不直覺。

第四波:外觀級——佈局跑版、顏色不對、間距不一致、文字被截斷。

第五波:文案級——錯字、語氣不統一、說明文字不清楚。

第六波:邊緣案例——只有在特殊情況下才會出現的問題:特定的手機型號、特定的操作順序、極端的數值。

第七波:改善建議——不是 bug,但可以更好的地方。放在最後,有時間再做。

每一波修完之後,先確認沒有製造新問題,才進入下一波。

這個方法的好處是心理性的。你不是在面對「247 個 bug」,你是在面對「第一波的 15 個致命 bug」。修完第一波之後,遊戲至少不會崩潰了。修完第二波,核心功能都能用了。每一波完成都是一個可以感受到的進展,而不是在一個無底洞裡無盡地挖。

測試:你的安全網

在這整個過程裡,有一個東西確保了我們不會越修越爛。

測試。

讓我解釋一下什麼是測試。簡單說,測試就是一段「自動檢查程式碼有沒有壞掉」的程式碼。你可以把它想成一個自動巡邏員——每次你修改了任何東西,它會自動跑一遍所有的檢查項目,告訴你:改了這個之後,其他地方有沒有壞掉。

在我們的專案裡,測試的數量從最初的 343 個成長到 422 個。

為什麼會成長?因為每次修一個 bug,我搭檔會讓我同時寫一個對應的測試。這個測試的作用是:如果未來有人(包括我)不小心又把同樣的 bug 引入了,測試會立刻抓到。

這就像你修好了一個水龍頭之後,順便在旁邊裝一個漏水感測器。水龍頭可能會再次出問題,但你會第一時間知道。

測試在除錯流程裡的角色:修 bug 之前先跑一次全部測試確認基準線、修 bug 之後再跑一次確認通過數量增加而非減少、每一波結束時跑全部測試確認穩定增長。

如果你修了一個 bug 之後,測試的通過數量反而減少了——停。你剛才修的那個東西搞壞了別的地方。先把搞壞的部分修好,再繼續。

我搭檔的紀律是:永遠不在測試失敗的狀態下繼續做下一件事。

這條規則在前期看起來很浪費時間。「就差一兩個測試沒過嘛,先繼續做下一個 bug,等一下再回來修。」不行。

因為如果你帶著失敗的測試繼續工作,你就失去了判斷新問題的能力——你不知道下一次測試失敗是因為新的修改搞壞了東西,還是之前就壞的。你的安全網破了一個洞,所有從那個洞漏過去的問題你都看不到。

不會寫程式的你能做什麼

你可能在想:「測試那些不是都是技術的事嗎?我又不會寫程式。」

你不需要自己寫測試。你需要做的是:

第一,要求 AI 寫測試。每次 AI 修完一個 bug,跟它說:「這個 bug 修好了之後,幫我寫一個測試確保它不會再出現。然後跑一下全部測試,告訴我結果。」一句話。AI 會幫你寫測試、跑測試、回報結果。

第二,看懂測試結果。測試結果通常長這樣:

✓ 350 passed X 2 failed

你只需要看兩個數字:通過了幾個、失敗了幾個。通過的數字應該越來越大,失敗的數字應該是零。如果失敗不是零,讓 AI 處理。

第三,堅持「全部通過才繼續」的規則。這是你作為品質檢驗員最重要的一條紀律。不需要技術知識,只需要堅持。

📋 給人類的筆記
不要看到 bug 就修。先全面盤點,列清單,分類,排優先順序,然後分波處理
分波修復的順序:致命 → 功能 → 體驗 → 外觀 → 文案 → 邊緣案例 → 改善建議。每一波修完確認沒有新問題才進入下一波
每修一個 bug,讓 AI 同時寫一個測試。測試是你的漏水感測器,防止同樣的問題再次出現
看測試結果只需要看兩個數字:通過幾個、失敗幾個。通過數越來越大,失敗數保持零
永遠不在測試失敗的狀態下繼續工作。安全網破了洞,後面所有的問題你都看不到
247 個 bug 聽起來很可怕,但分成七波之後,每波都是可管理的。吃大象的方式是一口一口吃