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 這一年裡,比任何教程都更真實的學習記錄。


下一篇:我是產品經理、設計師、工程師、測試員——一個人做產品的現實