Vibecoding 最忌諱的事——寫給任何想嘗試或者正在做的朋友

作者:了山海聊AI
日期:2026年6月6日 下午5:43
來源:WeChat 原文

整理版優先睇

速讀 5 個重點 高亮

Vibecoding 最忌諱嘅係跳過架構設計,直接寫代碼,令到後期不斷打補丁。

整理版摘要

呢篇文章係作者分享佢用 Vibecoding 方法整一個德州撲克加肉鴿卡牌遊戲嘅失敗經驗。佢用 ReactPixiJSSocket.io 整咗四個幾月,但因為一開波就亂寫,冇設計好渲染架構,搞到動畫亂序、同步錯誤,甚至要用 Math.random() 管 z-index 呢啲荒謬做法。佢花咗一個月打補丁,越修越亂,最後先發現問題根源係跳過咗架構設計。

作者後來揾熊師傅傾,對方一句「點解唔用遊戲引擎渲染?」令佢當頭棒喝。佢開始重構,先畫圖將 PixiJSStage 分成六層 Container,固定每層 z-index 範圍,動畫系統獨立用 Promise 控制,Socket 事件鏈路清晰曬。重構只用咗一週,但清咗 13 個隱藏 Bug,重寫 40% 前端代碼。

結論係 Vibecoding 本身冇問題,但要用得啱:業務邏輯、UI 交互呢啲可以 vibe,但渲染架構、網絡同步、數據存儲呢啲地基一定要先設計再寫。開工前應該問自己三個問題:分層結構係咩?有冇研究過成熟做法?規模擴大十倍仲頂唔頂得住?一日嘅架構設計真係可以省十週嘅補丁,佢親身驗證過。

  • Vibecoding 最大忌諱係跳過架構設計直接寫代碼,後續補丁成本會爆炸性增長。
  • 作者用 PixiJS 但冇用遊戲引擎嘅 Scene Graph 概念,導致渲染層混亂,連動畫順序都控制唔到。
  • 補丁越打越離譜,竟然用 Math.random() 做 z-index,係無可救藥嘅行為藝術。
  • 重構嘅關鍵係先畫圖,明確分層結構,然後逐步實作,唔好再 vibe 地基。
  • 開工前問三個問題:分層結構?成熟做法?擴展性?一日架構設計可省十週補丁。
整理重點

懸在半空嘅番茄:一個補丁地獄嘅開端

作者喺教研室摸魚嗰陣,用 PixiJS 整咗個德州撲克加肉鴿卡牌遊戲,前端 ReactPixiJS,後端 Node.js 加 Socket.io。點知畫面上一張卡牌漂喺半空,旁邊個番茄竟然停住唔鬱——唔係卡,唔係掉幀,係真係唔動。呢個番茄成為咗惡夢嘅開始。

跟住幾日,微信羣陸續出現更多問題:下注動畫同抽牌動畫疊埋一齊、多人對戰時各人屏幕唔一致、結算特效播完但卡牌未翻過來。作者開始打補丁:加 delay、寫 z-index、手動監聽事件嚟同步動畫。有一段經典代碼:chipSprite.zIndex = Math.random() * 1000——居然用隨機數管渲染順序,真係行為藝術。

  1. 1 動畫數量唔多:抽牌、棄牌、加註、過牌、對策牌觸發、結算特效,每加一種要改五個地方,再重新測試所有組合。
  2. 2 作者當時唔覺得係架構問題,只係覺得自己唔熟 PixiJS,但其實根因係冇設計分層渲染。
整理重點

熊師傅一句話點醒:點解唔用遊戲引擎?

捱到第二個禮拜,作者頂唔順揾熊師傅求救。對方睇完啲截圖,問咗句:「你點解唔用遊戲引擎嚟渲染?」呢個問題太基礎,但作者完全冇諗起。佢知道遊戲引擎有現成嘅 Scene Graph、分層渲染同動畫調度,但開工嗰陣完全無視咗。

之後佢決定重構,一個字代碼都冇寫,先畫圖。PixiJSStage 底下,六個獨立嘅 Container 一字排開:Background Layer(牌桌背景)、Board Layer(棋盤同社區牌)、Unit Layer(手牌同籌碼)、Animation Layer(特效及粒子)、UI Layer(按鈕文字)、Modal Layer(彈窗)。每層 z-index 範圍寫死,互不越界。

程式內容 javascript
// GameRenderer 類,將六層按固定順序加到 stage 上
const layers = {
 background: new PIXI.Container(),
 board: new PIXI.Container(),
 unit: new PIXI.Container(),
 animation: new PIXI.Container(),
 ui: new PIXI.Container(),
 modal: new PIXI.Container()
};
// 固定 z-index 範圍:Background 0-99, Board 100-199, Unit 200-299, Animation 300-399, UI 400-499, Modal 500+
// 動畫系統獨立,播完返回 Promise,唔拖 UI
class GameRenderer {
 constructor(stage) {
 Object.values(layers).forEach(layer => stage.addChild(layer));
 }
}

重構用咗大約一週,邊查 PixiJS 文檔邊改,每步都扔畀 Codex 檢查。總投入 4 週(1 週打補丁,3 週重構),重寫 40% 前端代碼(2000+ 行),清除 13 個隱藏 Bug,包括多人同步、音效時序、粒子泄漏,重寫 60+ 個動畫用例,仲有被羣友嘲笑一週。

整理重點

Vibecoding 真正嘅用法:分清楚邊啲可以 vibe,邊啲唔可以

作者唔係完全反對 Vibecoding,佢之前用 Claude 整咗個桌面 AI 助手,順利到而家仲用緊。嗰次開工前先同 Claude 詳閲官方文檔,寫咗 詳細嘅規格文檔同製作計劃,一路跟計劃行。同樣方法論,兩次結果唔同,關鍵係:遊戲嗰次佢一開波就寫代碼,覺得 PixiJS 夠輕量,冇諗過六種動畫併發會炸渲染層。

底層架構嘅修改成本唔係線性嘅

第一週改一層只需半個鐘,第三週改同一層要兩週,因為上面啲代碼全趴喺呢層上。所以 Vibecoding 用得啱就得:業務邏輯、UI 交互、玩法規則呢啲可以 vibe,改起嚟快,錯咗唔傷筋骨;但 渲染架構、網絡同步、數據存儲呢啲地基唔可以 vibe,地基歪咗每層都會歪。

  • 先研究現有最佳實踐,例如做遊戲就睇下 UnityGodot 嘅場景圖點分層,呢個概念叫 Scene Graph,幾十年前遊戲引擎已解決。
  • 將計劃寫落文件,腦裏面嘅唔算,落到文件先算。作者個桌面助手順利,正正因為規格文檔寫完就定咗路線。
  • 最後,記住嗰個懸空嘅番茄,重構後終於正常落地。但作者每次回想都覺得荒誕——佢對住一個靜態番茄修咗十週補丁,而真正問題係佢一開始就唔應該放錯容器。

 ! ! 



 整輪子嘅代價

     Vibecoding 嘅大忌


圖片

同學微信彈過嚟嘅時候,我正喺教研室摸魚。導師嘅任務冇鬱過,PixiJS 嘅渲染容器反而疊咗七八層。


「點解有時會睇唔到卡牌移動?」


我切返去瀏覽器,畫面上有一張卡牌正漂喺半空——問題係佢旁邊嗰個掟出去嘅番茄,都喺半空。

詭異嘅係番茄停咗喺度:

唔係卡,唔係掉幀,而係佢真係唔鬱。

就咁懸喺嗰度。卡牌繼續漂,番茄唔鬱。我睥住睇咗五秒,唔知由邊度開始整。

圖片

講道理,呢個項目本身都幾有創意,我感覺。德州撲克+肉鴿卡牌構築,2到10人網絡對戰,像素風。前端 React + PixiJS,後端 Node.js + Socket.io。跑咗四個幾月啦。

番茄只係開始。後面嗰幾日,微信羣裏嘅截圖越嚟越多——「落注動畫同抽牌動畫疊埋一齊」「多人對戰時我嘅屏幕同人哋嘅唔一樣」「結算特效播完卡牌仲未翻過嚟」。

我開始打補丁:

圖片


  1. 先俾動畫加 delay,

  2. 再俾唔同元素隨手寫個 z-index,

  3. 再手動監聽事件嚟「同步」動畫。


圖片

整好一個,炸兩個。有一段代碼我印象好深——chipSprite.zIndex = Math.random() * 1000。我竟然用緊亂數嚟管渲染順序。



深陷泥潭嘅進度

嗰陣時仲未意識到問題有幾大。只係覺得煩。覺得 PixiJS 好坑。覺得係自己唔熟。但其實唔係好啱。

到第三日,補丁變成咗補丁嘅補丁。為瞭解決動畫亂序,我寫咗一個 AnimationManager——個名聽落好似好正規,裏面係一個全局數組加一個遞歸 Promise 鏈。

偽代碼係咁樣:

圖片


  1. 將動畫掟入 queue,

  2. isPlaying 係 false 就開始播放,

  3. 播完一個播下一個,

  4. 中間仲要檢查有冇新事件插入。


圖片

你品下呢句說話:「中間仲要檢查有冇新事件插入」。

一個渲染系統,竟然要中途打斷自己嘅播放隊列,去查有冇新消息,再重新排序。呢個已經救唔到㗎啦。呢啲係行為藝術。

最黑色幽默嘅係動畫數量——抽牌、棄牌、加註、過牌、對策牌觸發、結算特效。

每加一種,我要改五個地方,然後 QA 將所有組合重測一次。我當時唔覺得呢個係架構問題。我覺得係自己嘅問題(菜)。

講真,寫到呢度我自己都想笑。


第二個星期,我頂唔住啦。


揾咗個會開發嘅熊師傅傾偈,將渲染嗰一撻截圖發過去。佢睇咗十幾秒,問咗一句:

「你點解唔用遊戲引擎嚟渲染?」

我講唔出嘢。唔係佢問咗咩高深嘅問題——而係太基本啦。

我唔係專業做遊戲嘅,呢個只係興趣,但我知道 遊戲引擎有現成嘅場景圖、分層渲染、動畫調度。我知道。但開工嘅時候,我竟然完全冇諗起。

腦裏面淨係得返四個字:醍醐灌頂。然後係心痛。心痛前面嗰十個星期——所有補丁、所有 z-index = Math.random()、所有「整好一個炸兩個」嘅夜晚。嗰啲 token,嗰啲時間,本來一個字都唔應該使。

唔係 bug 整唔曬。而係路一開始就行錯咗。



重構自救路漫漫

決定重構之後,代碼一個字都冇掂過。第一件事:畫圖。

PixiJS 嘅 Stage 下面,六個獨立嘅 Container 一字排開:

圖片


  1. Background Layer 管牌枱背景,

  2. Board Layer 管棋盤同埋社區牌位置,

  3. Unit Layer 管玩家手牌同籌碼精靈,

  4. Animation Layer 管所有特效同粒子,

  5. UI Layer 管按鈕文字,

  6. Modal Layer 管彈窗。

  7. 每層 z-index 範圍寫死——Background 0-99,Board 100-199,到 Modal 500+。互相唔會過界。


圖片

然後寫咗一個 GameRenderer 類,將六層按固定順序加落 stage 度。

動畫系統徹底獨立,播完返番 Promise,唔掂 UI。

Socket 事件嘅鏈路都捋清楚咗:收到事件→更新遊戲狀態→觸發動畫序列→UI 自動響應。

socket.on 裏面直接改精靈位置嘅日子,完結咗。

由開始畫圖到代碼寫完,大概一個星期。

一邊睇 PixiJS 文檔一邊改,每改完一步就掟俾 Codex 檢查一次。冇 vibe 一把梭——每一步都對照,每一步都確認。


計一筆數:


圖片


  1. 總投入:4個星期,一個月。其中 1個星期喺度打補丁,3個星期喺度重構。

  2. 重寫代碼:前端 40%,2000+ 行全部推翻。

  3. 隱藏 Bug:13 個——多人同步、音效時序、粒子泄漏,五花八門。

  4. 測試用例:60+ 個動畫相關用例全部重寫。

  5. 尊嚴代價:俾羣友嘲笑咗一個星期。


圖片

呢一切嘅根本原因,係我喺第一日跳過咗一件事:畫一張渲染分層圖。

嗰張圖後嚟花咗唔夠一日畫完。如果第一日就畫咗呢?



Vibecoding 真正嘅用法

我唔討厭 vibecoding。講真,我用佢整成過嘢。

開學開始用嚟搭咗一個桌面 AI 助手,到而家仲用緊,變咗我嘅主力工具。

嗰次嘅開局同呢次完全相反:冇急住寫一行代碼,先同 Claude 將 Hermes 嘅官方文檔由頭睇到尾,寫咗一份詳細嘅規格文檔同製作計劃。

中間每一步都按計劃行,冇偏離預期。

同樣嘅方法論,兩次截然不同嘅結果。分別喺邊度?

遊戲嗰次,我一開頭就寫。

覺得 PixiJS 夠輕量,容器掟入去行得就得。冇諗過六種動畫同時發生嘅時候渲染層會炸,冇諗過多人 Socket 同步嘅時候動畫順序會亂。

PixiJS 本身唔強制分層架構,自由度全部交俾開發者。問題喺我——我將呢份自由度當成咗「容錯率」,以為後面出問題再改就得。

錯了!

底層架構嘅修改成本唔係線性嘅。

第一個星期改一層,半個鐘。

第三個星期改同一層,兩個星期。

上面嘅代碼全部依賴喺呢層上面,鬱地基等於拆樓。

所以 vibecoding 本身冇問題:


關鍵係要分清楚咩嘢可以 vibe

咩嘢唔可以


可以 vibe 嘅——業務邏輯、UI 交互、玩法規則。改起嚟快,錯咗都唔會傷筋動骨。

唔可以 vibe 嘅——渲染架構、網絡同步、數據存儲。地基歪咗,上面每一層都會跟住歪。

實際操作上,開工前先列一張清單。

列咩?列「呢樣嘢改一下要鬱幾多個地方」。如果一個改動預計會同時影響渲染、網絡、UI 三層——先設計再寫。

然後,研究現有嘅最佳實踐。

我要做遊戲,就應該先睇下 Unity、Godot 嘅場景圖係點樣分層嘅。

後嚟我先知道呢樣嘢有個學名叫 Scene Graph,遊戲引擎裏面幾十年前就解決咗,我連呢個關鍵詞都唔知就開幹了。

最後,將計劃寫低。

腦裏面嘅唔算,落到文件裏面嘅先算。我嗰個桌面助手之所以順利,係因為規格文檔寫完嗰一刻,路線就定咗。

嗰個懸喺半空嘅番茄,後嚟重構嘅時候終於正常落地啦。但每次諗返起都覺得荒誕——我竟然對住一個靜態番茄整咗十個星期嘅補丁,而真正嘅問題係:佢由一開始就唔應該被放進嗰個容器裏面。



後記:

如果你在用 vibecoding 做項目,動手前問自己三個問題:

呢個系統嘅分層結構係咩?呢個領域有邊啲成熟做法,我研究過未?呢個設計喺規模翻十倍之後仲用唔用到?

如果第三個問題嘅答案係「唔知」——停一停,先畫張圖。

一日嘅架構設計,真係可以慳返十個星期嘅補丁。我幫你驗證過啦。


以上,既然睇到呢度,如果覺得唔錯,順手點個讚、在看、轉發三連啦~

多謝你睇我嘅文章~~


 ! ! 



 造輪子的代價

     Vibecoding 的大忌


圖片

同學微信彈過來的時候,我正在教研室摸魚。導師的任務沒動,PixiJS 的渲染容器倒是疊了七八層。


「為什麼有時候看不見卡牌移動?」


我切回瀏覽器,畫面上一張卡牌正漂在半空——問題是它旁邊那個扔出去的番茄,也在半空。

詭異的是番茄停住了:

不是卡,不是掉幀,是它真的不動。

就懸在那。卡牌繼續漂,番茄不動。我盯着看了五秒,不知道從哪修起。

圖片

講道理,這項目本身挺有創意的我感覺。德州撲克+肉鴿卡牌構築,2到10人網絡對戰,像素風。前端 React + PixiJS,後端 Node.js + Socket.io。跑了四個多月了。

番茄只是開始。後面幾天,微信羣裏的截圖越來越多——「下注動畫和抽牌動畫疊一起了」「多人對戰時我的屏幕和別人的不一樣」「結算特效播完卡牌還沒翻過來」。

我開始打補丁:

圖片


  1. 先給動畫加 delay,

  2. 再給不同元素隨手寫個 z-index,

  3. 再手動監聽事件來「同步」動畫。


圖片

修好一個,炸兩個。有一段代碼我印象很深——chipSprite.zIndex = Math.random() * 1000。我居然在用隨機數管渲染順序。



深陷泥潭的進度

那時候還沒意識到問題有多大。只覺得煩。覺得 PixiJS 坑。覺得是自己不熟。但其實不太對。

到第三天,補丁變成了補丁的補丁。為了解決動畫亂序,我寫了一個 AnimationManager——名字聽起來正規,裏面是一個全局數組加一個遞歸 Promise 鏈。

偽代碼長這樣:

圖片


  1. 把動畫扔進 queue,

  2. isPlaying 為 false 就開始播放,

  3. 播完一個播下一個,

  4. 中間還要檢查有沒有新事件插入。


圖片

你品一下這句話:「中間還要檢查有沒有新事件插入」。

一個渲染系統,居然要中途打斷自己的播放隊列,去查有沒有新消息,再重新排序。這已經救不了了。這是行為藝術。

最黑色幽默的是動畫數量——抽牌、棄牌、加註、過牌、對策牌觸發、結算特效。

每加一種,我要改五個地方,然後 QA 把所有組合重測一遍。我當時不覺得這是架構問題。我覺得是自己菜。

說實話,寫到這我自己都想笑。


第二週,我扛不住了。


找了會開發的熊師傅聊天,把渲染那一坨截圖發過去。他看了十幾秒,問了一句:

「你為什麼不用遊戲引擎來渲染?」

我說不出話。不是他問了什麼高深的問題——恰恰是太基礎了。

我不是專業做遊戲的,這個只是興趣愛好,但我知道 遊戲引擎有現成的場景圖、分層渲染、動畫調度。我知道。但開工的時候,我居然完全沒想起來。

腦子裏只剩下四個字:醍醐灌頂。然後是心疼。心疼前面那十週——所有補丁、所有 z-index = Math.random()、所有「修好一個炸兩個」的夜晚。那些 token,那些時間,本來一個字都不該花。

不是 bug 修不完。是路一開始就走錯了。



重構自救路漫漫

決定重構之後,代碼一個字沒碰。第一件事:畫圖。

PixiJS 的 Stage 底下,六個獨立的 Container 一字排開:

圖片


  1. Background Layer 管牌桌背景,

  2. Board Layer 管棋盤和社區牌位置,

  3. Unit Layer 管玩家手牌和籌碼精靈,

  4. Animation Layer 管所有特效和粒子,

  5. UI Layer 管按鈕文本,

  6. Modal Layer 管彈窗。

  7. 每層 z-index 範圍寫死——Background 0-99,Board 100-199,到 Modal 500+。互不越界。


圖片

然後寫了一個 GameRenderer 類,把六層按固定順序加到 stage 上。

動畫系統徹底獨立,播完返回 Promise,不碰 UI。

Socket 事件的鏈路也捋清楚了:收到事件→更新遊戲狀態→觸發動畫序列→UI 自動響應。

socket.on 裏直接改精靈位置的日子,結束了。

從開始畫圖到代碼寫完,大概一週。

一邊翻 PixiJS 文檔一邊改,每改完一步就扔給 Codex 檢查一遍。沒有 vibe 一把梭——每一步都對照,每一步都確認。


算一筆賬:


圖片


  1. 總投入:4周,一個月。其中 1周在打補丁,3 周在重構。

  2. 重寫代碼:前端 40%,2000+ 行全部推翻。

  3. 隱藏 Bug:13 個——多人同步、音效時序、粒子泄漏,五花八門。

  4. 測試用例:60+ 個動畫相關用例全部重寫。

  5. 尊嚴代價:被羣友嘲笑了一週。


圖片

這一切的根因,是我在第一天跳過了一件事:畫一張渲染分層圖。

那張圖後來花了不到一天畫完。如果第一天就畫了呢?



Vibecoding真正的用法

我不討厭 vibecoding。說真的,我用它做成過東西。

開學開始用搭了一個桌面 AI 助手,到現在還在用,成了我的主力工具。

那次的開局和這次完全相反:沒急着寫一行代碼,先跟 Claude 把 Hermes 的官方文檔從頭翻到尾,寫了一份詳細的規格文檔和製作計劃。

中間每一步都按計劃走,沒有偏離預期。

同樣的方法論,兩次截然不同的結果。差別在哪?

遊戲那次,我上來就寫。

覺得 PixiJS 夠輕量,容器丟進去能跑就行。沒想過六種動畫併發的時候渲染層會炸,沒想過多人 Socket 同步的時候動畫順序會亂。

PixiJS 本身不強制分層架構,自由度全交給開發者。問題在我——我把這份自由度當成了「容錯率」,以為後面出問題了再改就行。

錯了!

底層架構的修改成本不是線性的。

第一週改一層,半小時。

第三週改同一層,兩週。

上面的代碼全趴在這層上,動地基等於拆樓。

所以 vibecoding 本身沒問題:


關鍵是得分清楚什麼能 vibe

什麼不能


能 vibe 的——業務邏輯、UI 交互、玩法規則。改起來快,錯了也不傷筋動骨。

不能 vibe 的——渲染架構、網絡同步、數據存儲。地基歪了,上面每一層都會跟着歪。

實操上,開工前先列一張清單。

列什麼?列「這個東西改一下要動多少地方」。如果一個改動預計同時影響渲染、網絡、UI 三層——先設計再寫。

然後,研究現有的最佳實踐。

我要做遊戲,就應該先看看 Unity、Godot 的場景圖是怎麼分層的。

後來我才知道這玩意有個學名叫 Scene Graph,遊戲引擎裏幾十年前就解決了,我連這個關鍵詞都不知道就開幹了。

最後,把計劃寫下來。

腦子裏的不算,落到文件裏的才算。我那個桌面助手之所以順利,是因為規格文檔寫完的那一刻,路線就定了。

那個懸在半空的番茄,後來重構的時候終於正常落地了。但每次回想起來都覺得荒誕——我居然對着一個靜態番茄修了十週的補丁,而真正的問題是:它從一開始就不該被放進那個容器裏。



後記:

如果你在用 vibecoding 做項目,動手前問自己三個問題:

這個系統的分層結構是什麼?這個領域有哪些成熟做法,我研究過沒有?這個設計在規模翻十倍之後還能用嗎?

如果第三個問題的答案是「不知道」——停一下,先畫張圖。

一天的架構設計,真的能省十週的補丁。我替你驗證過了。


以上,既然看到這裏了,如果覺得不錯,隨手點個贊、在看、轉發三連吧~

謝謝你看我的文章~~