「架構圖不就是畫出幾個方塊、幾條連線,說明系統長什麼樣子?跟 AI 會不會寫錯程式碼有什麼關係?」
這個問題背後藏著一個常見誤解:把「架構」當成「畫出系統長什麼樣」的文件工作。但架構真正發揮作用的地方,從來不是那張圖本身,而是圖背後那條看不見的規則——當有人(或有 AI)要改一個東西的時候,這個改動被允許影響到哪裡、不被允許影響到哪裡。 架構的本質不是規範「這個功能該怎麼實作」,那是設計模式、coding style 的層次;架構規範的是「這個改動的影響範圍能收斂到哪裡」。
這件事對 AI 特別重要,重要到值得單獨用一整篇來講。
先把兩件常被混在一起講的事情分開。
第一件事是「這個功能該怎麼實作」——用什麼設計模式、變數怎麼命名、要不要抽一個 helper function。這個層次的決定,即使做錯了,影響範圍通常侷限在這個函式、這個類別本身,改壞了頂多是這一小塊程式碼難讀、難維護,不會波及到看起來毫不相干的地方。
第二件事才是架構真正在管的:「當我改了這裡,還有哪裡會被牽動?」——這個資料庫連線只能被哪一層呼叫、這個介面背後允許有哪些實作、這個模組能不能被另一個模組直接 import。這個層次的決定如果做錯,代價往往不是「這段程式碼比較亂」,而是「一個看起來局部的改動,實際上牽動了系統另一端你完全沒想到的地方」。
架構的價值,不在於它規定了「正確的寫法」,而在於它先幫你劃好了『如果寫錯了,代價會被限制在多大範圍』這條線。 好的架構不保證每一行程式碼都寫對,但保證寫錯的時候,錯誤不會無限擴散。
人類工程師改程式碼時,即使系統沒有明確的架構邊界,通常也會靠著對系統的長期記憶,本能地避開一些「感覺會出事」的改法——這種直覺是長期泡在同一個系統裡累積出來的,帶著隱性的風險評估。
AI 沒有這種長期浸泡的直覺。它面對的是一段被截取出來的程式碼,能看到的範圍取決於這次任務給它多少 context。如果系統本身沒有明確的架構邊界,AI 只能靠「這樣改看起來邏輯合理」來判斷安全性,而『看起來合理』跟『實際安全』之間的落差,正是這整個系列反覆討論的核心問題。
架構邊界替 AI 把這個判斷題,從「你自己想清楚這樣改會不會有問題」,換成一個更小、更客觀的問題:「這個改動有沒有越界」。第一個問題需要對整個系統的全面理解,第二個問題只需要知道「這裡是不是允許被改的範圍」。
用一組對照來看這個差異:
❌ 沒有清楚邊界的系統:
「這個函式看起來只是查一下使用者資料,
直接在這裡加一段快取邏輯應該沒問題。」
→ AI 的判斷依據是「看起來合理」,
但這個函式可能被十幾個不同情境呼叫,
加的快取邏輯會不會在某個情境下讀到過期資料,
AI 完全沒有機制知道
✅ 有清楚邊界的系統:
「快取邏輯不屬於這一層的職責,
這一層的邊界只允許處理『查詢並回傳結果』,
快取要嘛不做,要嘛要先確認這是不是
上一層或下一層該負責的事。」
→ AI 的判斷依據變成「這個改動有沒有越界」,
邊界本身已經替它排除了一整類危險的改法
第二個版本裡,AI 甚至不需要完全理解這個函式被誰在什麼情境下呼叫,光是「這不屬於這一層的職責」這條邊界規則,就足以擋下一個原本可能造成問題的改動。
不是所有技術決定都值得升級成架構問題來討論。一個實用的判斷方式是問自己:「如果這裡改錯了,錯誤會不會擴散到我原本沒打算碰的地方?」 如果答案是「不會,頂多這個函式本身邏輯要修」,那通常只是實作細節的問題;如果答案是「會,而且擴散的路徑我一時說不清楚」,那就是架構邊界該介入的地方。
這個提問方式也可以直接拿來檢視現有系統:挑一段程式碼,問「如果 AI 現在要改這裡,它能不能光靠讀這段程式碼本身,就判斷出改動不會波及其他地方?」如果答案是否定的,代表這裡缺乏清楚的架構邊界,值得優先補強。
回想你手上系統裡一段你會「小心翼翼」去改的程式碼:讓你小心的原因,是這段邏輯本身複雜難懂,還是因為你說不清楚改了它會不會影響到其他地方?如果是後者,這其實是一個架構邊界不清楚的訊號,而不是這段程式碼寫得不好。
明天要看一個具體的架構工具:Repository 分層,怎麼把 AI 對資料庫存取邏輯的改動範圍,實際收斂到一個資料夾裡。