為什麼 Vibe Coding 的 Bug 會聚集
Agent 會針對你描述的路徑進行最佳化。你描述的是你希望發生的事,所以理想路徑會被仔細實作,而它周圍的一切則是「看起來合理」地被實作出來。看起來合理正是關鍵:程式碼編譯得過,畫面能正常顯示,但那些假設從來沒有拿到現實中驗證過。
這就是為什麼這些失誤是可以預測的。它們永遠出現在描述的邊緣地帶。
四大群集,依照它們找上你的先後順序
資料持久化。 畫面更新了,資料庫卻沒有。重新整理一次就會立刻現形。在相信任何寫入結果之前,先重新整理一次。
空狀態與錯誤狀態。 零筆結果、失敗的請求、被拒絕的輸入。這些都不在你的提示詞裡。刻意把每一種都試一遍,它們出錯的機率比理想路徑高得多。
第二個帳號。 擁有權、權限與可見性,全都是從打造這個應用程式的那一個工作階段推想出來的。趁別人還沒登入之前,自己先用另一個身分登入看看。
第四個更隱微: 昨天做好的功能。每一道新指令都可能悄悄推翻某個原本正常的功能,而沒有人會回頭檢查舊行為,因為對話早就往前走了。
能跟上提示節奏的檢查方式
手動檢查大概撐得過一個下午,之後就會開始失效,因為每下一次提示,要檢查的範圍就變大一點,而你的耐心不會。你真正需要的,是把檢查項目用白話寫下來並自動執行,這樣昨天做好的功能就會被重新驗證,不需要你特別決定要去驗。
完成設定後,這件事就落在 agent 手上,檢查便與開發同步進行,而不是變成另一件獨立的雜事。
這些都不需要用到終端機。在 TestSprite 儀表板中建立專案,用白話描述要檢查的內容,再把它指向你的應用程式。團隊裡的開發者如果偏好指令列,也可以用同樣的方式操作,相關內容都在 CLI 儲存庫。
十分鐘,抓出其中大多數問題
註冊、登出,再重新登入。 最常見的全面失敗,也是真實使用者會做的第一件事。
建立資料、重新整理,確認它還在。 可以直接抓出持久化這個群集的問題。
送出不合法的內容。 你要確認的是它會明確失敗,而不是默默地成功。
用一個全新帳號跑一次主要流程。 可以抓出權限這個群集的問題。
這些都不需要讀程式碼,而它們加起來,就能找出大部分原本會由陌生人替你發現的問題。
為什麼同一個 Bug 會一再出現
用這種方式開發,最常見的抱怨不是東西會壞,而是修好一個地方就弄壞另一個地方,而且一再重演。這不是模型的問題,而是少了一份紀錄。
每一道指令都只會依照程式碼目前的狀態來解讀,除此之外沒有別的依據。沒有一份清單記錄哪些行為本來就必須持續正常運作,所以 agent 無從得知你要求的這項變更,和你上週二訂下的某件事互相衝突。從它的角度看根本沒有衝突,因為上週二並不在現場。
寫下來的檢查項目就是那份紀錄。它們不會讓 agent 變聰明,而是讓你的意圖能夠留存下來。實際的效果是:第三、第四輪的修改不再推翻前兩輪的成果,而這正是這種開發方式開始讓人覺得可靠、而不是精疲力盡的轉捩點。
在它真正上線之前
一旦有其他人要使用這個應用程式,這些檢查就應該在每次變更時執行,而不是等你想起來才跑。
GitHub App 是一個你在 TestSprite 儀表板中設定的 webhook。它會監聽你的流程原本就會產生的部署事件,因此你的儲存庫不需要任何改動。
GitHub Actions 則是把這個步驟放進你自己的工作流程中,從終端機完成設定。
讓檢查自己跑起來
TestSprite 能讓本頁提到的那十分鐘檢查,不再需要你親手執行。每個流程你只要用白話描述一次,之後每次變更,它就會拿這些流程去跑你的應用程式。
這正好解決了大家對這種開發方式最感挫折的那一點。寫下來的檢查項目,就是「哪些行為本來就必須持續正常運作」的紀錄,所以新的指令會拿它們來驗證,而不是被孤立地解讀。修好一個、弄壞另一個的循環,不再是預設狀態。
這裡沒有任何一步需要終端機或測試檔案。在儀表板中建立專案,指向你的應用程式,然後描述上面那四項檢查。團隊裡的開發者如果偏好指令列,也可以用同樣的方式操作。
Vibe Coding 是不是本來就比較有風險?
它改變的是風險所在的位置。打錯字的風險變小了,未經檢驗的假設風險則變大了。應對之道不是回頭逐行讀程式碼,而是有系統地檢查行為。
為什麼修好一個地方會弄壞另一個地方?
因為每一道指令都是在當下程式碼的脈絡中被解讀,而不是對照一份「哪些行為本來就必須持續正常運作」的紀錄。寫下來的檢查項目就能提供這份紀錄。
我需要寫測試嗎?
不需要寫成程式碼。用白話描述流程、把它保留下來,並讓它在每次變更後自動執行。
我怎麼知道這項檢查是真的有效?
刻意弄壞某個東西,確認檢查真的會失敗。從來不會失敗的檢查,其實什麼都沒保護到,而驗證這件事只要一分鐘。
我該從什麼時候開始檢查?
在你拿給任何人看之前。現在寫一項檢查的成本是幾分鐘;等別人先發現 Bug 之後,代價就高得多了。