Bug 出現了——從恐懼到把錯誤當成學習地圖
用 AI 把想法變成真的 — 第三篇
那個讓我呆坐在椅子上的下午
做 MaiNeu 大概四個月後,有一個下午,App 突然出現了一個我完全看不懂的問題。
用戶(當時只有我自己)打開 App,登入,然後做任何需要網路的操作,都失敗。錯誤訊息是一串英文:DEVICE_NOT_FOUND。
我不知道這是什麼意思。我查了代碼、查了後端的設定,找不到任何地方有「DEVICE_NOT_FOUND」相關的設定。我嘗試登出再登入,一樣失敗。我重新安裝 App,還是一樣。
我呆坐在椅子上大概二十分鐘,心裡有個聲音說:「我是不是做了一件我根本搞不定的事?」
Bug 是開發過程的一部分——但這不讓它不恐怖
在正式說怎麼解決問題之前,我想先說一件重要的事:
Bug(程式錯誤)是開發的正常部分,不是你哪裡做錯了的懲罰。
不管是剛入門的新手,還是有十年經驗的資深工程師,每天的工作都包含「遇到問題」和「解決問題」。差別不在於「會不會遇到 bug」,而在於「遇到 bug 的時候,你的工具箱有什麼、你的心態是什麼」。
AI 改變了這個方程式。
把 bug 說清楚,AI 才能幫你
回到那個 DEVICE_NOT_FOUND 的問題。
坐了二十分鐘之後,我決定把問題告訴 Claude。但在說之前,我先整理了我知道的資訊:
- 問題什麼時候開始的(今天下午,在我做了一個特定的修改之後)
- 問題的症狀是什麼(登入成功,但所有 API 請求都回傳 DEVICE_NOT_FOUND)
- 我已經試過什麼(重新登入、重新安裝 App)
- 我沒有試過什麼(刪除後端資料庫的資料、檢查 Token 的內容)
把這些整理清楚,然後告訴 Claude:「我的 App 出現了這個問題,症狀是 X,我試過 Y,你覺得可能的原因是什麼?」
Claude 的第一個問題是:「你說你今天做了一個修改——你修改了什麼?」
我說:「我修改了登入流程,新增了一個匿名用戶的登入方式。」
Claude 說:「我猜測問題可能在這裡——你新的登入請求有沒有帶上 deviceId(設備識別碼)?」
我去查了代碼,然後——
是的。我新增的那個登入方式,忘記帶上 deviceId。後端產生的 Token 裡沒有設備資訊,所以後續所有 API 請求都因為「找不到設備」而失敗。
整個 debug 過程花了大概十五分鐘。
如果沒有 AI,我可能要花好幾個小時,逐行檢查代碼,試圖找到可能的問題。
AI debug 的真正價值:縮短「完全不知道從哪裡開始」的時間
我想說清楚 AI 在 debug 過程中真正有用的地方。
它不是魔法。你告訴它問題,它不會直接說「你第 73 行的代碼有個括號缺了一個字元」。
它真正有用的地方是:幫你生成假設。
當你遇到一個完全陌生的問題,最困難的部分不是「修復」,而是「找到可能的方向」。你需要有幾個猜測,然後一個一個去驗證。
AI 在這方面非常有用——它見過大量類似的問題,可以快速給你幾個「可能是 X 原因、可能是 Y 原因、可能是 Z 原因」的方向。
你的工作,是帶著這些假設,去驗證哪個是真正的問題。
有一種 bug,比 bug 本身更可怕
「我昨天改了 A,但今天 B 壞了,這兩件事怎麼可能有關係?」
有一次,我修改了 App 的「偏好設定同步」功能(讓你換了新手機之後,設定可以自動還原)。修完之後,App 看起來正常。但過了幾天,用戶的 App 語言設定一直被重置——每次打開 App,App 的界面語言都回到了預設值。
我完全沒想到這兩件事有關係。
告訴 Claude 之後,它問:「你的偏好設定同步,是把雲端的設定覆蓋到本地,還是合併?」
我說:「應該是覆蓋吧——把雲端的資料下載回來,替換本地的設定。」
Claude 說:「問題可能在這裡。你的雲端資料只存了部分設定(比如翻譯語言偏好),但不包含 App 界面語言——App 界面語言只存在本機。如果你把雲端資料整個覆蓋本地,那些沒有存在雲端的設定就會被刪掉,回到預設值。」
這個解釋讓我瞬間明白了問題所在,而且明白了為什麼這兩件看起來完全不相關的事有關係。
把每一個 bug 變成「你多懂了一件事」
做 MaiNeu 以前,我對 bug 的態度是:找到問題,修掉,繼續。
現在,我對每個 bug 的處理方式多了一個步驟:理解為什麼這個問題會發生。
不只是「第 73 行有一個字錯了」,而是「這個錯誤的根本原因是 X,要完全避免它,應該在設計上做 Y。」
這個習慣讓我的進步速度快了很多。因為問題的根本原因往往不是「這段代碼有 bug」,而是「我對某個系統的理解是錯的」。修掉了那段代碼,不等於修掉了錯誤的理解——如果不去弄清楚,下次還會犯同樣類型的錯。
AI 在這方面很有用:當你問「為什麼這個問題會發生」而不只是「怎麼修」,你得到的答案會讓你理解更多,而不只是解決一個問題。
給非技術讀者的類比
如果你不是工程師,可能很難理解「程式 bug」是一種什麼樣的感受。
想像你在搭積木,你要搭一座高塔。搭了一大半之後,你發現底部的某一塊積木歪掉了,整座塔開始傾斜。
Bug 就是那塊歪掉的積木。有時候它很明顯(塔已經倒了),有時候它很隱藏(塔看起來好好的,但某個角度你才看到它在傾斜)。
AI 就像一個幫你看塔的朋友——你描述塔的狀態,它幫你猜「可能是哪一塊歪了」,讓你不用每一塊都試。
但把那塊積木扶正,還是需要你自己做。
那個下午的後記
DEVICE_NOT_FOUND 的問題修好之後,我在筆記裡寫下了這個教訓:「新增任何登入方式,必須確保請求帶有 deviceId。」
這條筆記後來存進了 MaiNeu 的錯誤記錄檔(我叫它 ERRORS.md),裡面收集了所有我踩過的坑,讓我以後不會重複犯同樣的錯。
目前這個記錄檔有 81 條記錄。
每一條都是一個下午的挫折、一段對話、一個「啊,原來是這樣」的時刻。
這 81 條,是我做 MaiNeu 這一年裡,比任何教程都更真實的學習記錄。