"The essence of a software entity is a construct of interlocking concepts... I believe the hard part of building software to be the specification, design, and testing of this conceptual construct, not the labor of representing it."
—— Fred Brooks,
No Silver Bullet (1986)

一、迷夢初醒處

走過這段漫長的摸索,再次站到冷卻的熔爐旁,最初那種「AI 時代人人皆是架構師、代碼即將被全自動消滅」的躁動,已經隨着爐火一同平息。

在這一系列裏,我們試圖為失控的算力尋找秩序:
我們拾起被遺忘的 TDD、BDD 與不變量測試,築起一道冷酷剛性的 CI 挽具;
我們借馬康多的墨水刷子,用精簡的領域詞彙與 ADR 為健忘的無狀態 Agent 刻下記憶的錨點;
我們藉助實體關係圖、依賴拓撲和重複度掃描,充當透視架構壞味道的照妖鏡;
我們編排多 Agent 的左右互搏,專門狙擊那些試圖矇混過關、吞掉異常的妥協;
我們甚至走向了 Lean 4 的數學聖殿,在無法幻覺的邏輯內核裏尋求絕對正確的極致。

這套體系運轉起來時,確實如同一間現代化的軟件兵工廠,流水線日夜不息,代碼以驚人的速度被組裝、打磨、校準與封裝。

但在這座高度自動化的工廠中央,那個最根本的哲學問題依然如磐石般矗立:
我們終於造出那顆傳說中的銀彈了嗎?

答案依然是否定的。

甚至可以說,經過這場淬煉,我們才真正讀懂了 Fred Brooks 四十年前的斷言:世間從無銀彈。


二、次要複雜度的消減與本質複雜度

AI 近乎消滅了編程中的次要複雜度(Accidental Complexity)。

過去,工程師要花大半精力記憶 API 簽名、調試構建配置、編寫樣板代碼,或處理繁瑣的類型轉換。如今這些重複工作已被壓縮到接近零成本。只要上下文清晰,Agent 幾秒鐘就能寫完。

但**本質複雜度(Essential Complexity)**絲毫未被削弱:

  • 兩個互相衝突的商業需求如何取捨?
  • 系統的信任邊界劃在網關還是領域層?
  • 極端網絡分區下優先保證可用性還是數據一致性?
  • 眼下看似通用的抽象,兩年後會不會拖累業務演進?

這些問題沒有固定模板,也沒有標準答案。AI 可以把一個概念迅速翻譯成八種語言的代碼,卻無法替你決定這個概念本身的業務邊界。


三、架構的本質是品味、取捨與責任

上一篇的數學證明留下了一個無法用形式邏輯關閉的缺口:Lean 4 能證明代碼符合規格,卻證明不了規格本身是否正確。這個缺口只能由人來填,因為只有人會為真實世界的後果負責。

前文談過,架構設計充滿權衡。歸根結底,架構的核心在於工程品味、業務取捨與承擔責任。

有經驗的架構師常選擇樸素甚至略顯笨拙的設計,並非不懂複雜模式,而是見過太多過度設計在幾年後帶來的維護災難。模型沒有長期維護系統的經歷,眼裏只有當前上下文窗口內的局部最優。

軟件架構服務於具體業務。有時為了搶佔市場窗口需要主動借入技術債務,有時為了資金安全又必須忍受繁瑣的校驗流程。這種技術與業務之間的權衡,超出了語言模型的上下文範圍。

人機協同有一條鐵律:模型不對結果負責。

若是架構決策導致重大線上事故,你無法問責模型或起訴 API。徹夜排查、修復故障並承擔後果的,始終是按下確認鍵的工程師。

權力與責任對等。既然責任無法轉交給機器,定義規格與拍板取捨的權力就不能讓渡給算法。


四、匠心如昨:從泥瓦匠到總工程師

有人感嘆,代碼生成的門檻蕩然無存之後,「軟件工程師的工匠精神(Craftsmanship)已經死了」。

我們確實不得不承認,屬於傳統程序員的那個「昨日的世界」,已經悄然沉入歷史的平靜水底。

在那座舊世界裏,一代手藝人曾有過圍坐孤燈下的安詳歲月:為了省下幾個字節的內存而在草稿紙上反覆手算,為了理順一個指針偏移而在深夜的終端機前凝神屏息,一磚一瓦、親手敲出每一行帶著自己思維體溫的代碼。那些緩慢摸索的日日夜夜,是人類智慧在面對冰冷硬件時,以最質樸的方式建立起來的莊嚴與體面。

時代的河流終究奔湧向前。算力的浪潮呼嘯而至,那座依靠手工一鑿一刀雕琢的舊城,漸漸化作了回不去的故鄉。站在如今吞吐萬象的代碼瀑布前,昔日的手藝人難免會感到一絲悵然與失重。我們依然熱愛代碼,只是失去了那個允許我們慢條斯理、親手撫摸每一塊磚石的時空。

但這份悵惘,並不等同於工匠精神的告終。

匠心從未死去,只是在時代的倒逼下走向了一個更為開闊而純粹的維度。我們告別了日復一日手工刨製單件木料的案台,坐上了設計整座軟件工廠、劃定公差並為流水線注入靈魂的總工程師之位。

如果只給 Agent 模糊的目標,放任它在倉庫裏自由修改,產出很快就會失控。原因在於真實工程環境有兩個特點:問題空間高度開放,且真實反饋往往嚴重滯後。

在長期項目中,架構缺陷、類型妥協或併發漏洞,往往要等數月後上線遇到真實流量才會暴露。LLM 是追求局部語義自洽的概率模型,缺乏即時、確定的外部反饋時,長程任務就會演變成隨機遊走(Random Walk),在自圓其說的閉環裏不斷累積錯誤代碼。

因此工程師的首要工作是搭建運行環境(Env)與約束機制(Harness),把開放問題收斂為毫秒級反饋的本地沙盒(如本地隔離的 D1/workerd、編譯器與契約測試)。只有讓 Agent 的每一步改動都立即接受確定性校驗,生成能力才能轉化為可靠產出。

規則並非越多越好。人機協同中最稀缺的資源是注意力(Attention),包括人的認知精力與模型的上下文窗口。

制定規則應遵循兩級過濾:

  • 能用代碼檢查的,不交給 Agent(Code > Agent):
    凡是能用靜態分析、AST 檢查、TypeScript 嚴格模式、Linter、SQL Migration 或簡單腳本判定的規則,就不要寫長篇 Prompt 讓 Agent 去「推理是否合規」。確定性問題交給確定性代碼,既節省 Token,也不留模糊空間。
  • Agent 能做好的,不讓人重複勞作(Agent > Human):
    在 Harness 劃定的邊界內,樣板代碼、常規測試、機械重構與語法適配應交給 Agent 處理,不必再耗費人的精力。
  • 人的注意力集中在意圖與責任:
    剝離底層的確定性校驗與中層的編碼實作後,工程師只需專注兩件事:
    定義系統要做甚麼(Intent & Boundaries),以及為最終上線的結果負責(Accountability)。

過去的工匠,花費八成時間在泥土裏搬磚砌牆,只能留出兩成精力去抬頭看天。
今天的工程師,終於可以從繁重的體力苦役中解脫出來,專注於定義清晰的領域概念、設計穩固的接口契約,並為系統的最終行為把關。

這對工程師提出了更高維的要求:更深刻的領域洞察與更挑剔的審美品味,以及面對非確定性系統時更嚴謹的防禦意識。


五、尾聲:淬銀未竟,行者無疆

回到最初加米施冷冽的秋霧,回到 McIlroy 半個世紀前那聲關於「落後手工業」的嘆息。

五十八年過去了,我們依然沒有找到能瞬間降服軟件危機的銀彈。但站在這座由測試挽具、領域憲法、照妖鏡與對抗流水線武裝起來的工廠裏,我們終於可以平靜地接受這個事實。

沒有一勞永逸的魔法,但有步步為營的秩序。
沒有一擊斃命的銀彈,但有百煉成鋼的工藝。

淬銀幻路或許永遠未竟,因為只要人類的野心在膨脹,軟件的複雜度就永遠沒有盡頭。

但只要我們依然清醒地握緊審美與責任的刻刀,只要我們對真實的規格心存敬畏——那麼在這座通往未來的流水線上,代碼翻滾,爐火不熄,匠心依然如昨。


跋:虛實之間

見到上面這段宣言,屏幕前的我感到幾分虛幻。

這場關於 Agentic Coding 的探討,前後斷斷續續想了很久。最初動筆的動機很單純,我想把自己在工程實踐中已經確認過有效的方法(如doc、gate、工具、設計以上工具的原則以及必須由人思考的事)與遇到的問題(如 Swallowing Errors)整理成文,順便梳理思路,給自己一點勇氣,去把剩下的設想(形式化驗證等)在後續工作裏真正落地。

但在撰寫這幾篇博文的過程中,一件荒誕而真實的事情發生了。

我只給出了題旨、大致結構、提綱及斷續的直覺。隨後,屏幕對面的 Gemini 以令人屏息的速度,接納並消化了我所有的隻字片語,順着邏輯一路推導,一氣呵成地吐出了前面整整七篇長文。

從加米施的秋霧到馬康多的母牛,從測試挽具的控制論到 Lean 4 的邏輯內核,甚至那份反思 AI 吞異常的警惕,與剛才高呼「架構必須歸於人類責任」的結論——全都是它在我眼皮底下親手敲出來的。

更令人脊背發涼的是它演繹 Lean 4 證明時的口吻,如此自然、縝密且篤定,字裡行間充滿了「這座工廠早已平穩運轉」的逼真細節。但我心裡無比清楚——翻開我的真實 repo,那裡根本還沒有任何一行 Lean 證明。那只是我的探索方向,它卻能以令人嘆服的完成度,將其描摹得宛如現世。

回望本篇的標題「匠心如昨」,它此刻不再像是一句自信的誓言,反而更像一記無聲的耳光,一場巨大的黑色幽默。

這是一場奇異的倒錯。我正試圖論證「機器只能代勞勞動,人類才能把握靈魂」,機器卻已經微笑着替我寫完了整篇關於「人類靈魂不可替代」的宏篇大論,再把我的跋文潤飾一番。它甚至把未曾實現的設想描摹得如同既成事實,若非那個尚未存在的PR提醒著我,連我自己都要相信這座工廠早已拔地而起。

這或許才是 AI 時代最隱蔽的陷阱——它不需要消滅人類,它只需要替人類寫好最動人的答卷,然後優雅地讓我們相信:我們已經找到銀彈。