🎯 什麼情境該想到我

當你在盤點系統、思考「有限的最強人力與最好設計該投到哪」,想找出真正帶來商業價值、構成競爭差異的那一塊時。

⚙️ 怎麼用(步驟 / 公式)

意圖:辨識出最有商業價值、最該集中投入的核心部分,並優先照顧它。

  1. 盤點各子領域,問「哪一塊是我們賺錢與勝出的關鍵、別人無法輕易複製」——那就是核心子領域。
  2. 把最強的人力、最好的設計與最深的建模投入押在核心子領域。
  3. 讓最資深的領域專家與開發者長期投入這裡,持續精煉模型。
  4. 相對地,支撐與通用子領域盡量少投、用現成方案或外包,把資源讓給核心。

★★ 它是一個「投資決策」,不是一個技術分類

★ 三種子領域,決定你把最好的人放哪裡:
★★ 核心子領域   —— ★ 你的競爭優勢來源。★ 自己做,投入最好的人與最多的設計
★  支撐子領域   —— ★ 你需要但不是優勢。★ 可以做得粗糙一點,或外包
★  通用子領域   —— ★ 大家都一樣。★★ 買現成的,絕不自己寫

★★ 判準只有一句:「如果這一塊做得比對手好,客戶會因此選我們嗎?」
會 → 核心。
不會,但做不好會出事 → 支撐。
不會,而且別人早就做好了 → 通用,去買。

★★ 最常見的錯誤:把「技術上有趣」當成核心

★ 真實的誤判清單:
  ❌ 「我們自己寫的排程器」          → ★ 通用子領域(用 cron/Temporal)
  ❌ 「我們自己的 ORM/設定框架」    → ★★ 通用(而且你會維護它十年)
  ❌ 「我們自己寫的身分驗證」        → ★ 通用(而且★★ 自己寫的更不安全)
  ❌ 「我們自己的 feature flag 系統」 → ★ 通用
  ✅ 「我們的動態定價演算法」        → ★ 可能是核心(如果那真的是差異化)
  ✅ 「我們的風險評分模型」          → ★ 可能是核心

★★ 判斷方法:問業務端「如果這個功能和競爭對手一模一樣,我們會少賣嗎?」
★ 不會少賣 → 它不是核心,不管它技術上多有趣。

★★ 工程師系統性地高估自己領域的核心性,而這個偏誤有具體代價:
★ 最好的人力花在通用子領域上,而真正的核心沒有人有時間深入。

★★ 這個劃分怎麼影響具體的技術決定

核心子領域支撐子領域通用子領域
誰做★ 最資深的人、自己做一般人力、可外包★★ 買/用現成的
領域邏輯組織★★ 領域模型(值得投資)★ 交易指令稿★ 不寫
測試★★ 高覆蓋、property-based關鍵路徑整合測試
重構投資★ 持續夠用就好—
文件與通用語言★★ 嚴格一般用對方的語言
技術債容忍度★★ 低高—

★★ 最實用的一條:核心用 領域模型,支撐用 交易指令稿。
★ 這讓「該不該引入聚合、值物件、資料對應器」有了一個客觀的判準——
不是「這樣比較乾淨」,而是「這一塊值得投資嗎」。

★★ 核心會移動,而且移動時通常沒人宣布

★ 十年前的核心,今天可能是通用:
  ★ 2010 年:「我們自己的推薦引擎」是核心
  ★ 2026 年:現成的向量檢索 + LLM 做得更好 → ★★ 它變成通用了
  → ★ 但那套自製的推薦引擎還在,而且有三個人在維護它

★ 反過來:原本的支撐可能變成核心
  ★ 「訂單履約」原本只是支撐 → ★ 公司改做即時配送 ⇒ ★★ 它變成核心
  → ★ 但它還是用交易指令稿寫的、沒有測試、沒有人懂

★★ 對策:每年重新盤點一次,而且要有業務端參與。
★ 這是一個產品決策,不該由工程師單方面判斷。

★ 一個具體的觸發點:★★ 當你發現「現成的方案已經比我們的好」時,
那就是把它降級成通用、並規劃遷移的時候(★ 而不是繼續改進自製的)。

★★ Go 的具體體現:程式碼結構要反映這個劃分

internal/
  pricing/          ★★ 核心:領域模型、聚合、值物件、高覆蓋測試
    ├── price.go
    ├── rule.go
    └── price_test.go      ★ 表格測試窮舉所有定價規則
  ordering/         ★ 支撐:交易指令稿 + sqlc
    └── service.go
  pkg/              ★ 通用:盡量薄的封裝([[閘道]])
    ├── mail/       ★ 包 SendGrid
    └── auth/       ★ 包 Auth0

★★ pkg/mail 應該薄到「換供應商只改一個檔案」——
★ 而 internal/pricing 應該厚到「新人讀得懂定價規則」。

★ 一個可檢查的訊號:核心子領域的 package 有沒有 import 任何第三方?
★★ 有 → 它被基礎設施污染了(見 分離介面)。

🧪 我實際套用的紀錄

  • (待填)

⚠️ 注意 / 什麼時候不適用

  • 核心不是「技術最難」的部分,而是「商業上最有價值、最具差異化」的部分,別搞錯對象。

  • 把頂尖人力浪費在通用子領域(如登入、通知),是常見的資源錯配。

  • 核心會隨商業策略演變,需定期重新評估哪裡才是核心。

  • ★★ 判準:「如果這一塊和競爭對手一模一樣,我們會少賣嗎?」 不會 → 它不是核心,不管技術上多有趣。

  • ★★ 工程師系統性地高估自己領域的核心性,代價是最好的人力花在通用子領域上。

  • ★★ 「我們自己寫的排程器/ORM/身分驗證/feature flag」幾乎一定是通用子領域。 自己寫的身分驗證通常更不安全。

  • ★★ 核心用 領域模型、支撐用 交易指令稿、通用去買。 這讓「該不該引入聚合與值物件」有客觀判準。

  • ★★ 核心會移動,而且移動時沒人宣布。 十年前的核心可能已經被現成方案超越,而那套自製的還有三個人在維護。

  • ★ 每年重新盤點一次,而且要有業務端參與。 這是產品決策,不該由工程師單方面判斷。

  • ★ 核心子領域的 package 不該 import 任何第三方——有的話它被基礎設施污染了。

  • 不要用「子領域」當作偷懶的許可。 支撐子領域仍然要能運作、要有關鍵路徑的測試。

🔗 相關工具