這個部落格,我想了兩年.
說「想」其實不太準確,更像是一種執念。早期我還不會寫前後端,也不會寫嵌入式程式碼,當時還在玩電子,偶然間看到@ushio的 B 站影片和網站,覺得很好玩,我也想試試看。後來花了半年左右的時間,從零學會寫 C 和一點點 JS/CSS,使用 Hexet 搭建了一個靜態部落格,部署在 GitHub Pages 上,也算是擁有了自己的小天地。


再后来,看到了 @Innei 的小站,设计很精致、功能也很全,当时的我看了一眼我就想要,甚至还赞助支持了,虽然后面没用上但是这钱也花的不怨 因为我摸到了 React 源码,就和我最初看到 C 一样,不过就是代码嘛,有什么大不了的,总有一天我要自己写一个。

之後,我看到了 @Innei 的小站,設計很精緻、功能也很完整,當時我看了一眼就想要,甚至還贊助支持了,雖然後來沒用上,但這筆錢花得不後悔,因為我接觸到了 React 原始碼,就像我最初看到 C 時一樣,不過只是程式碼而已,沒什麼大不了的,總有一天我要自己寫一個。
寧靜的森林
那是 2024 年,然後 24、25、26 年到現在
從那之後就停不下來了。
失控
一開始只是想給 @colmugx Hexo 主題 Nlvi 加個深淺色切換,用 Dark Reader 的 JS 糊了一個,醜,不滿意。然後學 CSS @media,再到 JS SPA 切換,TailwindCSS .dark class, 再到 SSR next-theme,最後手搓 Cookie + Head Sync Inline 腳本解決 FOUC 閃爍,我折騰了四五種方案。

但這只是冰山一角。看到 React 之後,我從石器時代的 Hexo 和 Vanilla JS 一路走到了 Next.js 13 Page Router,又拐去看 Vue、研究 SPA 路由、理解 index.html fallback,專案新建了無數次。買了伺服器,折騰 Docker、Nginx、NAS,嫌 1Panel 醜手寫了 Canopy 面板 研究 NAS 儲存陣列寫了 RFS,搞 SSL 被國內環境折磨的 acme.sh 抽風逼到用 Rust 寫了個反向代理:Vane & Lazyacme,本來只是一个晚上三小時寫出來的八百行垃圾,結果群友一怂恿,寫了四個月,HTTP/3、Zero‑Copy、Layer 模型、Flow 引擎全往裡塞。後面還有 Seam,一個全棧框架,也是天坑,以後再說吧。
過度工程
然後 AI 時代來了,焦慮又翻了一倍
最具諷刺意味的是,這些東西本來應該是在有了部落格之後,一邊記錄一邊完成的。結果部落格一再草草收場,想法越來越多,卻找不到地方記錄它們。一方面內心在譴責;說好要完成 Vane,卻做不到,只好停下;另一方面則是越做越遠的無力感。我一直記得自己想做什麼,但就是做不出來。仔細想想,我其實已經很久沒坐下來寫什麼東西了,現在回頭看,這一切都指向同一件事——過度工程。
我當時其實並不不覺得自己在跑偏。Vane?反正部落格以後也要部署,總得有個反向代理吧。Seam?反正遲早要寫全棧,不如先把我理想中的框架搞好。每一步都有理由,每一步都是"以後用得上"。但問題是,"以後"永遠不會來,因為我從未開始...
失敗
做部落格實際上不需要一個反向代理,不需要一個自研框架。而當時的我把它們當成了前置條件,作為了那個永遠 Blocking 但是卻合理的理由,但它們從來都不是。真正的前置條件只有一個:坐下來,把第一篇文章寫出來。
其實部落格不是沒動過,恰恰相反,我做了三次

第一次還是 Next.js 13 Page Router 那會。那時候我蒙懂 SPA 是什麼,SSR、SSG、ISR 這些概念一個都不清楚,但看別人說 SSR 好,那我也要用。結果寫著寫著發現自己根本不理解這些架構在解決什麼問題,做不下去了。後來呢,轉 Vue 2 純 SPA,為什麼選 Vue?說來慚愧,覺得名字好聽,反正也新,試試呗。也沒撐多久。第三次回到 React,從單 JSX 開始,學了 TypeScript,會了 TSX,理解了 CJS 和 ESM 的區別,愛上了 Reactive,用上了 Lucide、Framer Motion、Radix UI 這些日後離不開的庫——這次終於像點樣子了。但我還是失敗了,因為本質上我只是在模仿,別人用什麼我就拿來用,看起來像那麼回事,實際上根本不理解為什麼要這樣做。再加上 AI 的幻覺加持,很多東西都能跑起來一個 MVP,但 Scale Up 的時候全是坑。

後來又學了 React(Remix) Router Loader、Next.js 15 App Router、RSC,但這時候日常已經很忙了,沒什麼時間寫程式,倒也沒機會第四次失敗。現在想起來,我的網站從 Next.js 13 寫到了 Next.js 15,前腳剛遷移完成,還沒上線,Next.js 16 beta-1 就出了。
放手吧
說"想開了"其實不準確,是我累了。

AI 時代的節奏太快了。模型一個接一個迭代,新技術一輪接一輪冒出來,我越來越焦慮,好像停下來就要被超越。最瘋的時候一天寫 16 個小時代碼,Token 一天就能燒 $1.9k USD (大概 2 月的時候吧),人快廢了。但讓這一切停下來的不是什麼頓悟,就是單純的累了。在越來越緊的節奏下,最後一根稻草壓下來,我反而釋然了,想開了,擺爛了;這樣,也挺好的。
我開始放手。放棄曾經執著的東西,學會點到為止,明天的事明天再說。Vane 沒做完?先放著。Seam 還差很遠?以後再來。部落格不完美?先上線。開始完全 Vibe Coding,沒問題就不管,有問題再說。
奇怪的是,放手之後品質並沒有變差。我想這大概是因為之前那些「古法」程式設計的日子沒有白費;早在 GPT-2 時代我就開始使用 AI 了,但那時候我還在老老實實地寫每一行程式碼、理解每一個概念。那段經驗給了我底子,與其說後來 Vibe Coding 不如說是 Context Coding,該有的判斷力還在,並沒有因為放手就出什麼低階錯誤或是事故。
是之前所有的折騰,給了我現在放手的資本
原點
最終的方案反而很簡單:All in Cloudflare。R2 物件存儲、D1 Edge 資料庫、KV 做快取、Worker 跑 SSR,全部 Serverless,沒有伺服器。

這個答案諷刺嗎?太諷刺了。因為在到達這個「簡單」的終點之前,我走了一整圈彎路。曾經計畫自建,所以要管伺服器、折騰 Docker、管容器,於是寫了 Canopy 做管理面板,寫了 Lazycert 管證書,寫了 Vane 做反向代理,寫了 Twig 做資源監控埋點。一堆專案,就為了伺候一台垃圾伺服器。
存儲也是一樣。我嫌對象存儲貴,想用自己伺服器的硬碟,於是寫了 RFS 一種 vfs 為了原子去重合併單文件,甚至復活了 80‑90年代 的註冊表理念,最後還透過 FUSE 掛載起來了。結果呢,花了更多時間造了一個不那麼好的輪子,伺服器還空跑了一年,完全就是徹底的虧本生意。

最後繞了一大圈,還是回到了 Serverless,Vercel 的概念不錯,但我不喜歡 Next.js;而且 Vercel 的魔法太多了,還有那個中間件設計提前編譯跑在 Edge 上,最後仍然割裂,甚至出了幾個 CVE,還不如把所有東西都放在源站一起。相較之下 Cloudflare Worker 就很好,達到了另一種極端,小於 10 MB 的產物編譯成 WASM,能在 Edge 上執行真正的業務邏輯,這正是我想要的。除了花錢之外沒什麼缺點──但說起來也不算缺點,畢竟省下的時間就是錢。
少即是多
這句話我聽過無數遍,但花了兩年才真正理解它的含義。
回歸工程的本質:「Make it function, make it correct, then make it exceptional.」我終於走上了正軌,讓它 functional 了。現在的部落格簡陋嗎?簡陋。不完整嗎?確實不完整。但總比沒有好。如果你連上線都沒有,一直在做那個「也許需要」的東西,一直在追求看不見的完美,最後什麼都拿不出來。這不是妥協,而是工程上的取捨,反正我已經想開了。所以我想開了。不再為一個細節執著,反而走出了門。手機相簿裡已經很久沒有戶外的照片了,隨手拍了一下路邊的——已經很久沒出門了。

回頭看之前走的彎路,後悔嗎?不後悔。有些事你不自己試試,也許永遠想不明白。更何況在 AI 時代,想走我當年的老路已經基本沒有機會了,太多工作流已經被改變。另外這個專案是 Taki,100% AI Coding,但這不意味著不能長期維護,不意味著沒有人味。其實有沒有 AI 不重要,再說了,我喜歡的也不是寫程式本身,而是 Building 一個東西...