前言

從電機社畢業一年多了,但偶然聽聞當屆社員在某圈子搞出了大八卦,為了避免電機社員走歪並順便散發一點老人臭,故撰本文,頒行全社,永矢咸遵(沒)。

在這個 Cursor 、 Copilot 或 Gemnini 橫行的 2025 年,寫程式變得前所未有的簡單,甚至我在撰文的同時在我右手邊傻逼微軟還加了一整個窗口問我要不要 Build with Agent 。在這種按個 Tab 或是用自然語言描述一下自己想幹嘛就可以生成的開發模式下,「雖然我不知道這段在寫什麼,但跑起來好像沒問題」這樣的狀況已經氾濫了,甚至有人會說工程師要被取代了(來自脆姐): sb on Threads

Note

本文並非反對使用 AI 工具,AI協作在提升效率上非常有用。
重點在於「依賴」與「理解」之間的平衡。

Vibe Coding 的問題

LLMs 之本質上乃為一機率預測機器。其並非真正理解了程式中的邏輯,而是直接預測下一個 token 出現機率。這導致幾個大家都遇過的著名傻逼問題:

  1. 一本正經的胡說八道(幻覺)
  2. 喜歡局部最佳解,忽略全局架構
  3. 無視 technical debt 直到你整套掛掉

1. 安全性

AI 為了讓你的程式跑起來,會選一個最簡單的路徑,這裡現場示範要他寫一個 SQL 查詢功能:

ts
// 傻逼 Gemini 為了方便直接把字串組在一起,導致可以隨便 SQL Injection
const query = `SELECT * FROM users WHERE username = '${userInput}'`;
db.execute(query);

看起來能跑,功能也正常,但如果我今天在 userInput 填了 ’ OR '1'='1,你就賽博裸奔了,這就是問題:他看起來是對的,也確實是對的,但不太對。

警告

你看不懂程式碼在幹嘛,你也就無法 review 他。 SECURITY FIRST!!

2. 上下文禮崩樂壞

LLM 受限於 context window ,雖然現在有些模型可以一口氣讀很多 tokens,但仍難以維持專案一致性。簡單回憶一下就好,如果你常用 AI 寫心得報告(這我)那你一定遇過,貼給他的文本甚至他自己的內文裡本來就已經提過的東西,過了幾段文字之後又再一提一次,那你在用 AI 拉屎的時候也同樣很容易遇到以下狀況:

  • 風格炸裂:檔案 A 用 async/await,檔案 B 突然用 Library.then(),因為 AI 算了不同時期的資料。
  • 重複造輪子:你明明在 lib/utils.ts 裡寫了一個日期格式化工具,但 AI 忘記了而在新的 component 裡又寫了一個一模一樣的 function。
  • Dependencies 地獄:AI 可能會引用一個已經被 deprecated 的套件,或者引入一個很肥的庫只為了解決一個小問題。

然後你就會炸出一坨 spaghetti code

3. Debug 地獄

寫程式的核心能力倒不是寫(好啦也是),而是讀和除錯,如果你一無所知 Vibe 出一坨屎你會完全沒辦法解決。

提示

舉例
你的網頁突然 500 Internal Server Error
莊園和:看 Log -> 發現問題 -> 修改設定
王品和:把錯誤訊息丟給 ChatGPT -> 給出的方案看不懂反正貼貼看 -> 貼上又錯 -> 再丟一次 💥💥💥

你不知道程式碼原本是怎麼運作的,就無法正確地問問題,也無法正道地解決問題, AI 雖然能幫你寫,但目前還無法理解你的系統的狀態。

結語

Vibe Coding 很爽,按一按就多巴胺和成就感爆炸,但為了你自己技術成長,以及為了不要讓接手你專案的人想哭,請務必掌控好你的程式碼。

重要

如果你本來就很強,AI 會讓你看起來變強 10 倍。但如果你基礎根本不穩,完全依賴 AI 只會讓你產生虛偽的自信,然後在遇到真正的技術時撞牆。

下次當你偷按 Cmd + K 時,請停下來捫心自問一下:「這段炸了我知道怎麼修嗎?」「他寫的我看得懂嗎?」。


enzh-twja