鐘擺效應——歷史教你的務實選擇

一句話總結:版本庫策略的演進是一個鐘擺——從全放一起、拆成微服務、合回 Monorepo、再到務實的混合策略。理解這個擺動,你就不會追風了。

結論先講:如果你現在問我「該用 Monorepo 還是 Multirepo」,我的答案是「看情況」——但如果你真的不知道,從 Multirepo 開始,因為合在一起永遠比拆開來容易。

版本庫策略的四個時代

階段一(2000s-2010s):什麼都放一起。一個 repo 一個 app,前端後端 shared library 全在一起。本質上就是未經管理的 Monorepo。問題:沒有模組邊界,everything depends on everything。

階段二(2010s-2015s):拆成微服務 + Multirepo。微服務興起,每個服務一個 repo。帶來了部署獨立性和團隊自治。問題:跨服務的變更痛苦、版本飄移嚴重、工具鏈各自為政。

階段三(2015s-2020s):看到 Google 用 Monorepo,我們也來。Lerna、Nx、Turborepo 成熟了,大家開始把東西合回去。問題:CI 變慢、工具鏈變複雜、團隊自治被限制。

階段四(2020s-現在):務實的混合策略。經歷過前面的洗禮後,越來越多團隊走向混合——相關性高的放同一個 Monorepo,獨立性高的各自一個 repo。

這個鐘擺告訴我們:沒有終極答案,只有當下最適合的選擇。

混合策略長什麼樣?

一個實際的例子:

  • Monorepo A:前端應用群(web、admin、mobile)+ 共用 UI 元件 + 工具函式
  • Monorepo B:後端微服務群 + 共用 proto 定義
  • 獨立 Repo C:ML Pipeline(完全不同的技術棧)
  • 獨立 Repo D:Infrastructure as Code(SRE 團隊獨立管理)

相關的放一起、不相關的分開。簡單、務實、不追風。

決策前問自己這些問題

  • 團隊多少人?超過 30 人可能需要 Multirepo 的自治優勢
  • 服務之間有多少共用程式碼?共用越多,Monorepo 優勢越大
  • 部署節奏一致嗎?不一致的話 Monorepo 會造成不必要的牽制
  • 有能力維護 Monorepo 工具鏈嗎?
  • CI 能在 10 分鐘內完成嗎?
  • 團隊熟悉 Nx / Turborepo 嗎?

系列總結

面向MonorepoMultirepo
原子性變更天然支援需要跨 repo 協調
CI/CD 複雜度
程式碼共享簡單直接需要發佈套件
團隊自治較受限天然支援
工具鏈投資
新人上手Clone 一次搞定需要 clone 多個

不要因為 Google 用 Monorepo 就跟著用,不要因為聽起來很酷就跟著用。評估你的實際情況,做最務實的選擇。

系列文章:

延伸閱讀:

「最好的 repo 策略不是最潮的那個,是讓你的團隊最不痛苦的那個。」