架構師觀點 - API First 的開發策略
問題與答案 (FAQ)
Q&A 類別 A: 概念理解類
A-Q1: 什麼是 API First 開發策略?
- A簡: 在流程最前先定義穩定可用的 API 契約,再開發前後端與服務,確保聚焦商業領域與長期目標。
- A詳: API First 是一種將 API 視為開發起點的策略:在寫任何一行程式前先完成 API 契約(如 OpenAPI、gRPC IDL、JSON Schema),並用它作為各團隊協作的唯一依據。好處包括:早期與利害關係人驗證設計、降低跨團隊溝通成本、提升 Developer Experience(DX)、在敏捷節奏中守住長期架構目標。此策略不與敏捷/DevOps衝突,而是用契約縮短回饋迴圈、避免後期大規模破壞性變更,特別適合微服務、跨團隊協作與對外生態系的場景。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: A-Q2, A-Q3, B-Q1
A-Q2: 為什麼 API 的「First」比 API 本身更關鍵?
- A簡: 先定義契約聚焦問題本質與結構,避免實作導向分心,確保長期穩定與對齊商業領域。
- A詳: 許多團隊懂 API,但未把「先定義契約」視為首要。First 的意義是把重點放在「正確解決商業領域問題的介面設計」,先釐清結構與邊界,再落實實作。API 結構決定用戶如何使用服務,穩定契約能降低破壞性變更與整合成本,也利於早期與利害關係人(Stakeholders)溝通、用 Mock 或範例資料收集回饋,讓敏捷迭代更有效。若忽略 First,容易陷入形式合規(命名、規範)卻無法解決真正需求的反模式。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: A-Q3, A-Q23, B-Q2
A-Q3: 什麼是 API 契約(API Contract)?
- A簡: 一份明確描述介面、資料型別、流程與約束的規格文件,作為系統間協作的唯一依據。
- A詳: API 契約是對介面的正式描述,定義端點、方法、參數、資料模型、錯誤碼、安全需求、版本與行為約束等。常見形式包括 OpenAPI(REST)、gRPC IDL(Protobuf)、JSON Schema 或語言層的介面定義。契約是組織間的「合約」,不只是文件:它驅動 Mock、產生文件、測試與程式碼生成,並被納入 CI。契約讓前後端與多服務可並行開發,並支撐治理、相容性與長期演進。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: B-Q1, B-Q3, C-Q1
A-Q4: DX(Developer Experience)與 UX 有何差異?為何 API First 先顧 DX?
- A簡: UX針對使用者,DX針對開發者;先顧DX使團隊能有效組裝應用,最終也提升UX品質。
- A詳: UX(User Experience)關注最終使用者體驗;DX(Developer Experience)關注開發者使用 API、工具與文件的體驗。API First 建議先顧 DX 是因為開發者是把服務能力轉譯為產品體驗的橋樑。若 DX 差,團隊將被阻塞,UX 也難以完善。優良 DX 的元素包含清晰穩定契約、完善範例與文件、快速可用的 Mock/Sandbox、易用 SDK/範本與一致風格。先顧 DX 並非放棄 UX,而是排程優先序:讓開發者高效,UX 才更快更好地實現。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: B-Q17, C-Q8
A-Q5: API First 與敏捷/DevOps 會衝突嗎?
- A簡: 不衝突。契約先行能更早收集回饋,縮短迭代迴圈,並守住長期架構目標。
- A詳: 表面看來「先定契約再實作」像瀑布;其實契約使敏捷與 DevOps 更有效。你可在寫碼前用契約對齊利害關係人、生成 Mock 與自動化測試,讓前後端並行開發、在短迭代持續交付價值。契約也保護長期目標(架構、相容性、安全),減少後期大改的風險。敏捷關鍵在持續回饋與價值交付,API First 讓回饋更早、更聚焦於商業領域的正確性。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: B-Q2, B-Q24
A-Q6: API 經濟(API Economy)是什麼?對企業有何價值?
- A簡: 以 API 標準化輸出能力與資料,促進整合與生態系,創造新客群與商業模式。
- A詳: API 經濟強調用 API 將企業服務/資料標準化輸出,便於內外部系統整合與自動化,進而規模化,最終形成生態系。對 B2B/B2C 皆適用:供應商透過 API 嵌入客戶流程;多方整合提升效率、催生新應用。成功要素包括:穩定契約、良好 DX、清晰商業策略(定價、配額、門檻)、治理與版本管理,以及開發者入口(文件、Sandbox、支援)。這些結合可帶來新收入與客群擴張。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q22, B-Q23
A-Q7: 什麼是康威定律?對 API 設計的啟示是什麼?
- A簡: 系統結構反映組織溝通方式;API 就是團隊之間的介面設計與溝通契約。
- A詳: 康威定律指出,設計的系統結構會與組織溝通結構一致。API 是服務間的溝通介面,也反映團隊分工與協作方式。若 API 難用或充滿耦合,可能源自組織分工與責任界線不清。反之,清晰穩定的契約促成健康的團隊邊界與並行開發。這也解釋微服務與 API First 為何適合大規模團隊:它們用契約切分責任,提升協作可擴展性,並避免像共享資料庫這種脆弱耦合。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q10, B-Q15
A-Q8: 為何共享資料庫是反模式?
- A簡: 它造成強耦合與脆弱邊界,破壞服務自治與演進,違背契約導向協作。
- A詳: 共用資料庫讓多服務直接依賴同一資料結構,任何變更都可能破壞他人;測試、部署、授權與安全邊界也混亂。相對地,服務應透過 API(或事件)公開能力與資料,維持自治與演進空間。Amazon 早期內部備忘錄即要求團隊間只能用服務介面溝通,不得共用 DB。這推動了分散式思維、標準化與平台能力(如 API Gateway、消息系統),也為後續生態與平台打下基礎。
- 難度: 初級
- 學習階段: 核心
- 關聯概念: B-Q15, D-Q2
A-Q9: API 由提供方定義,還是由使用方驅動較好?
- A簡: 視情境而定;常見是提供方定義標準,同時透過使用方回饋或契約測試共同演化。
- A詳: 提供方驅動(Provider-first)利於一致與治理;使用方驅動(Consumer-driven)更貼近實際需求。成熟做法是:提供方定義風格與基本模型;透過使用方回饋、契約測試(如 Pact)共同收斂。若是公共 API,提供方主導較常見;若是內部微服務,消費者驅動可有效避免過度設計。關鍵在以契約為真相來源、用自動化驗證雙方承諾與相容性。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q20, C-Q2
A-Q10: 微服務與三層式架構在團隊協作上的差異?
- A簡: 微服務以業務能力切分服務與團隊,靠契約協作;三層式多以技術層切分,耦合較高。
- A詳: 三層式(展示、邏輯、資料)常由單一團隊管理,適合小型系統,但隨規模擴大會出現協作瓶頸。微服務以業務能力垂直切分,服務自治、獨立部署與擴展,團隊以契約協作,與康威定律一致,更適合大規模、多團隊場景。代價是分散式複雜度(通訊、資料一致性、治理)上升,這正是 API First 與治理、平台能力需要到位的原因。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q15, B-Q23
A-Q11: API 與 APP 的邊界應如何拿捏?
- A簡: API聚焦通用能力與穩定契約,APP負責體驗與組裝;複雜組合交給 BFF/SDK。
- A詳: API 並非越多越好;應維持精簡、與業務能力對齊、保持可重用性,避免把 UI 或特定流程細節塞入。易變的組合邏輯、聚合需求可放在 BFF(Backend for Frontend)或提供 SDK/範本降低使用成本。這樣既保留 API 的長期穩定,也讓應用端靈活創新。誰決定邊界取決於團隊角色(PO/架構師/Tech Lead)與產品屬性,但原則是 API 長期穩定、APP 快速迭代。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q19, C-Q5
A-Q12: 什麼是 BFF(Backend for Frontend)?
- A簡: 面向特定前端的後端層,聚合與裁剪多服務資料,降低前端複雜度。
- A詳: BFF 是位於前端與多個後端服務之間的輕量層,為特定前端(Mobile/Web/Partner)提供量身定制的介面。它將跨服務的資料聚合、排序、裁剪,並處理授權、節流、緩存等前端關注點,讓核心 API 保持精簡通用。同時 BFF 能快速跟著 UI 變更;核心服務則能穩定演進。適用於 API First 情境下的邊界分工,亦是降低前端耦合的實用手段。
- 難度: 初級
- 學習階段: 核心
- 關聯概念: A-Q11, B-Q19, C-Q5
A-Q13: 何謂「設計公式」或核心機制?為何重要?
- A簡: 由多需求抽象出的可重用機制與介面,長期穩定承載變動,降低邊際成本。
- A詳: 架構師面對多樣需求時,不直接平推功能,而是抽象出背後不變的「核心機制」與其介面(設計公式)。例如折扣引擎:規範以購物車為輸入、計算結果為輸出,將變動集中在規則插件;UI/流程以機制為基礎組裝。好處是核心可測試、穩定、可優化;邊緣功能快速變化,整體敏捷而不失穩定。API First 下,這些機制的介面就是長期契約。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q17, C-Q10
A-Q14: 抽象化在 API 設計中的角色是什麼?
- A簡: 萃取不變與共性為穩定介面,將變化留在邊緣,提升可重用與演進彈性。
- A詳: 抽象化是將多個具體需求背後的共性提煉為穩定的資源模型與操作,避免為每個場景設置獨特 API。以折扣計算為例,抽象出「計算引擎」與「規則」介面,UI 與流程不用跟著每種規則重寫。抽象化得當可降低破壞性變更、提升測試性與擴展性。抽象過度則成為過度設計,需以真實使用回饋校準抽象層級。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q13, D-Q7
A-Q15: 什麼是 API 治理?(高層概念)
- A簡: 在組織層管理 API 生命週期、風格一致性、相容性、安全與資產盤點的體系。
- A詳: 當 API 規模擴大成「API 園林」,單一專案層面的設計已不足。治理涵蓋:風格指南與 Lint、版本與相容性策略、目錄與可發現性、生命週期管理(規劃、設計、發布、營運、下架)、安全與法遵、度量與商業化策略。治理將「API 即產品」的理念落地於組織層,避免叢林失序,確保每個 API 能持續演進並創造價值。
- 難度: 中級
- 學習階段: 進階
- 關聯概念: B-Q23, B-Q18
A-Q16: 何謂「API 即產品」?
- A簡: 將 API 視為可持續經營的產品,具目標市場、定價、生命週期與支援。
- A詳: 不把 API 當附屬,而是像產品一樣經營:明確定位(內部/合作夥伴/公開)、使用者(開發者)需求、成功指標(採用率、轉換、可靠性)、營收/成本(配額、費用)、支援(文件、SDK、社群、Sandbox)、版本策略與下架計畫。這種思維能提升 DX,驅動治理與平台投資,並與 API 經濟相互促進。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q6, B-Q22
A-Q17: 為何 API 規格需自初期穩定?如何看待相容性?
- A簡: 契約變更影響面大,需控管版本與向後相容,避免破壞消費者系統。
- A詳: API 是跨系統契約,變更成本遠高於內部代碼。原則:偏向向後相容(新增不破壞的欄位/行為)、對破壞性變更採版本化與遷移期、清楚標示棄用與期限。初期多投入設計與回饋(Mock/範例/契約測試),讓結構正確、邊界清晰,降低後續破壞性變更機率。治理層需提供風格與相容性準則與驗證工具。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q8, C-Q6, D-Q1
A-Q18: 為何要在設計階段就考慮安全性?
- A簡: 安全要求影響資源模型與流程,事後補救代價高,應納入契約與體驗。
- A詳: 安全不只是認證/授權,還包括資料分類、最小權限、輸入驗證、速率限制、審計等。這些會影響資源可見性、欄位輸出、操作粒度與回應碼。設計時在契約中描述安全機制(如 OAuth2 scopes、金鑰、傳輸保護),並提供最佳實務(重試、錯誤碼)。提前設計可避免 API 泄露、越權、注入風險,亦利於一致體驗與自動化驗證。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q12, D-Q8
A-Q19: 過度設計是什麼?如何避免?
- A簡: 超出當前需求而複雜的抽象與機制,拖慢交付;用回饋與漸進抽象避免。
- A詳: 過度設計常見於過早泛化、參數爆炸、通用性過頭導致難用。避免方法:以最小可用契約起步;用真實回饋與資料驅動抽象層級;將複雜組裝放 BFF/SDK;建立去重與刪減機制;定期評審 API 使用情境;對外 API 謹慎新增破壞性功能。記住 API 的穩定性與簡潔性優先於「一次解決所有假想需求」。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: D-Q7, A-Q11
A-Q20: 架構師在敏捷團隊中扮演什麼角色?
- A簡: 守護長期目標與結構,抽象出核心機制,溝通架構並支持團隊敏捷落地。
- A詳: 在快速迭代中,架構師確保長期非功能需求與結構不被忽略:洞察需求脈絡、抽象成穩定機制與契約(設計公式)、制定邊界與風格、促進跨團隊對齊、導入平台與治理;同時用文件、視圖與指導支持開發,確保落地與相容性。必要時擔任 PO(技術型產品)、顧問或 Stakeholder,以敏捷方式塑造文化與高商業價值的交付。
- 難度: 中級
- 學習階段: 進階
- 關聯概念: A-Q13, B-Q24
Q&A 類別 B: 技術原理類
B-Q1: 契約先行(Contract-first)如何運作?
- A簡: 先定義規格為唯一真相,驅動 Mock、文件、測試與代碼生成,讓各方並行開發。
- A詳: 原理:以規格(OpenAPI/gRPC IDL/JSON Schema)作為單一真相來源。流程:1)建模領域與資源;2)編寫契約與範例;3)驗證與審核(Lint、Style Guide);4)生出文件/Mock;5)前後端並行開發;6)契約測試與相容性檢查;7)生成部分代碼/SDK;8)持續版本管理。核心組件:規格檔、Mock/文件工具、契約測試框架、CI 驗證、SDK/代碼生成器、API Gateway/Portal。此法提早對齊需求並降低整合風隙。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: C-Q1, B-Q2
B-Q2: 如何在寫碼前用契約獲取回饋?
- A簡: 用範例、Mock 與可互動文件讓利害關係人早測,收集修正意見再動工。
- A詳: 原理:讓契約成為可運行的「原型」。步驟:1)在規格中加上範例請求/回應;2)用 Mock 伺服器回應固定樣本;3)生成互動式文件(如 Swagger UI);4)讓 Stakeholders 與前端用 Mock 做 UAT/流程演練;5)收集對資源結構、欄位命名、錯誤碼與流程的意見;6)審核與修正契約。核心組件:規格、Mock 工具、文件站台、回饋渠道(Issue/PR/評審會)。好處是在成本低時修正大方向。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: C-Q3, A-Q5
B-Q3: 如何根據契約生成文件與程式碼?
- A簡: 以規格為輸入,透過工具產出文件、伺服器骨架與客戶端 SDK,確保一致。
- A詳: 原理:規格描述資源與型別,可驅動生成。流程:1)維護規格庫;2)CI 產出 HTML/Portal 文件;3)選擇語言模板生成伺服器骨架/路由;4)生成多語言 SDK;5)套入風格與授權;6)發佈套件與文件。核心組件:OpenAPI Generator/Swagger Codegen、Protobuf 工具、語言模板、Artifact Registry、API Portal。注意:生成代碼應侷限於樣板與模型,業務邏輯由工程師實作。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: C-Q8, C-Q1
B-Q4: 資源命名與階層如何設計?
- A簡: 以業務資源為中心,階層表達擁有關係,名稱簡潔一致可讀。
- A詳: 原理:API 資源映射業務實體與關係。步驟:1)辨識核心資源(如 orders, customers);2)定義父子/包含關係(/customers/{id}/orders);3)避免深層階層與過度參數;4)使用名詞複數與一致風格;5)為跨關聯用查詢/關聯資源處理。核心組件:命名規範、樣式指南、範例庫、Lint。良好命名與階層提升可發現性、可讀性與一致性,是 DX 的基礎。
- 難度: 初級
- 學習階段: 核心
- 關聯概念: A-Q14, B-Q18
B-Q5: 分頁(Pagination)應如何設計?
- A簡: 提供穩定排序與游標/頁碼機制,明確下一頁取得方式與一致性語義。
- A詳: 原理:大量資源需分批傳輸。流程:1)定義排序欄位與穩定排序;2)選擇頁碼或游標(cursor)分頁;3)回應包含下一頁指示(nextPageToken/link);4)說明一致性語義(快照或即時);5)限制最大頁大小;6)錯誤與邊界處理。核心組件:分頁參數、回應結構、索引策略、文件。游標更適合高變動資料;頁碼簡單易用。需考量併發更新時的結果一致性。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: C-Q4, D-Q4
B-Q6: 長時任務(Long-running operations)如何處理?
- A簡: 採非同步作業:提交工作返回任務資源,客戶端輪詢或回呼查詢狀態與結果。
- A詳: 原理:超時風險高的操作(匯出、訓練)應非同步。流程:1)POST 提交返回 jobId 與狀態端點;2)提供狀態/結果/錯誤查詢;3)支持取消、重試與去重;4)提供回呼或 webhook;5)保障冪等與安全。核心組件:任務資源模型、隊列/工作器、狀態機、回呼機制、超時/重試策略。好處:避免連線長時占用、提升可靠度與彈性。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: C-Q4, D-Q5
B-Q7: 如何設計冪等性與請求去重?
- A簡: 透過客戶端提供冪等鍵,伺服端記錄處理結果,重試不重複執行。
- A詳: 原理:網路重試可能造成重複執行(如重複扣款)。流程:1)對非冪等操作(POST)要求 Idempotency-Key;2)伺服端以鍵與內容做去重;3)返回同一結果;4)設定有效期;5)記錄與監控。核心組件:鍵存儲(快取/DB)、請求摘要、去重邏輯、錯誤碼。配合重試策略與超時可顯著降低重複副作用風險。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: C-Q9, D-Q6
B-Q8: API 版本與相容性如何規劃?
- A簡: 優先向後相容;必要破壞性變更採版本化、遷移期與棄用策略。
- A詳: 原理:保護既有消費者。步驟:1)風格指南定義相容性規則(可新增不可移除/變更意義);2)重大變更發新版本(路徑/標頭/協議);3)提供並行版本與明確棄用時程;4)版本映射與文件同步;5)自動化契約比對;6)觀測採用情況。核心組件:版本策略、兼容性檢查、文件門戶、分析。內部 API 可較激進,外部 API 更保守。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q17, C-Q6
B-Q9: 部分更新與部分擷取如何設計?
- A簡: 部分更新可用 PATCH 或字段掩碼;部分擷取提供選取欄位與擴展控制。
- A詳: 原理:避免傳輸與處理不必要資料。部分更新:1)採 PATCH/merge-patch/json-patch 或 updateMask;2)定義欄位掩碼與衝突處理;3)回傳更新後資源。部分擷取:1)fields= 欄位選取;2)expand= 關聯展開;3)權限過濾。核心組件:欄位掩碼解析、驗證、授權、文件。合理使用提升效能與可用性,需防止過度複雜與安全暴露。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q4, B-Q12
B-Q10: 批次操作應如何設計?
- A簡: 提供批次端點或在同端點支援多筆請求,定義部分成功與錯誤報告。
- A詳: 原理:減少連線與往返成本。流程:1)定義批次請求結構(集合輸入);2)回應逐筆結果與整體摘要;3)部分成功策略(continueOnError);4)限制批次大小;5)冪等鍵處理;6)必要時轉為非同步 job。核心組件:批次資源模型、結果彙總、限流與監控。需評估一致性需求與錯誤復原策略。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: C-Q4, B-Q6
B-Q11: 請求驗證與資料模式如何設計?
- A簡: 在契約中明確型別與約束,伺服端與邊界驗證,避免無效輸入進入核心。
- A詳: 原理:早期拒絕無效輸入可降低風險與成本。步驟:1)在規格定義型別、格式、必填、枚舉、長度;2)伺服端邊界驗證;3)一致錯誤回應模型;4)自動化產生驗證程式;5)結合安全與授權檢查;6)觀測常見錯誤。核心組件:JSON Schema/OpenAPI constraints、驗證庫、錯誤碼標準、API Gateway。將驗證前移是 DX 與安全的基本功。
- 難度: 初級
- 學習階段: 核心
- 關聯概念: B-Q12, D-Q8
B-Q12: 設計階段應如何納入安全機制?
- A簡: 契約明確描述認證授權、範圍、敏感欄位與輸出策略,並定義失敗語義。
- A詳: 原理:安全是介面設計的一部分。步驟:1)定義認證(OAuth2、API Key、mTLS);2)授權模型與 scopes;3)資料分級與欄位遮蔽;4)錯誤碼/挑戰(401/403);5)速率限制與誤用防護;6)審計與追蹤;7)對外公開最少可見欄位。核心組件:安全方案描述、門戶與金鑰管理、Gateway、審計管道。設計安全讓後續實作與審核可自動化與一致。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q18, C-Q7
B-Q13: 軟刪除(Soft deletion)與資源修訂如何設計?
- A簡: 使用狀態標記與修訂號,支援恢復、稽核與一致的讀取語義。
- A詳: 原理:避免物理刪除帶來不可逆風險。流程:1)資源加 deleted/active 標記;2)提供 includeDeleted 查詢;3)支援恢復;4)維護 revision/version,避免併發修改;5)在文件中說明讀寫語義。核心組件:狀態機、查詢過濾、修訂檢查(If-Match)、審計。軟刪除利於安全與調試,但需控管資料壓力與可見性。
- 難度: 中級
- 學習階段: 進階
- 關聯概念: B-Q16, D-Q8
B-Q14: 跨服務重試與退避策略如何設計?
- A簡: 規範可重試錯誤碼、退避演算法與上限,與冪等設計相輔相成。
- A詳: 原理:分散式系統不可避免暫時故障。步驟:1)定義可重試錯誤碼(5xx/429);2)建議指數退避+抖動;3)限制最大嘗試與逾時;4)協調冪等鍵;5)對長任務提供 job 模式;6)監控退避行為。核心組件:錯誤碼標準、用戶端 SDK 策略、觀測與警報。設計良好避免雪崩,保護下游與用戶體驗。
- 難度: 中級
- 學習階段: 進階
- 關聯概念: B-Q7, D-Q6
B-Q15: 不共享資料庫時,服務間通訊有哪些模式?
- A簡: 同步 API(REST/gRPC)與非同步事件(訊息/流),依場景選擇與組合。
- A詳: 原理:用明確介面取代隱式 DB 共享。同步:REST(資源導向、廣泛支援)、gRPC(高效、IDL 驅動,適內部)。非同步:事件驅動(發佈/訂閱)、CQRS、資料流。步驟:1)依用例選型(請求回應 vs 事件最終一致);2)定義契約(OpenAPI/IDL/事件結構);3)治理與觀測(追蹤、重試、順序);4)安全與授權。核心組件:API Gateway、訊息中介、Schema Registry、追蹤系統。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q8, A-Q10
B-Q16: 以狀態機驅動的 API 設計是什麼?
- A簡: 先定義資源狀態與轉移,再推導操作與錯誤,契約更貼近業務規則。
- A詳: 原理:多數業務以狀態與轉換表達(如訂單:新建→付款→出貨)。步驟:1)繪製狀態圖與轉移條件;2)對應操作(confirm/cancel);3)定義允許/禁止轉移的錯誤語義;4)在契約中體現狀態欄位與操作;5)測試覆蓋各狀態與邊界。核心組件:狀態機模型、驗證器、錯誤碼、契約。好處:結構清晰、防止違規操作、利於測試與演進。
- 難度: 中級
- 學習階段: 進階
- 關聯概念: A-Q13, C-Q10
B-Q17: 如何衡量與提升 DX(Developer Experience)?
- A簡: 以可用性、學習曲線與整合速度為指標,透過文件、範例、SDK 與工具改善。
- A詳: 原理:開發者是 API 的使用者。步驟:1)度量(首次成功呼叫時間、整合工時、錯誤率、NPS);2)改善文件(可互動、範例豐富);3)提供 Mock/Sandbox;4)SDK/範本與教學;5)一致錯誤與回應;6)快速支援與社群;7)蒐集回饋迭代。核心組件:Portal、分析、回饋管道、樣板庫。DX 提升直接帶動採用率與整合品質。
- 難度: 初級
- 學習階段: 核心
- 關聯概念: A-Q4, C-Q3
B-Q18: API 風格指南與 Lint 為何重要?
- A簡: 規範一致命名、結構與語義,透過 Lint 自動檢查,提升品質與可讀性。
- A詳: 原理:一致性是 DX 與治理的核心。步驟:1)制定命名、路徑、錯誤碼、分頁、安全等規則;2)建立樣例庫;3)配置 Lint 工具在 CI 驗證;4)教育與審查;5)度量違規趨勢。核心組件:風格文件、Lint 工具(OpenAPI Lint 等)、CI、教學資源。自動化保護軌道,讓大規模團隊維持品質基線。
- 難度: 初級
- 學習階段: 核心
- 關聯概念: B-Q4, C-Q1
B-Q19: 何時使用 BFF?如何與核心 API 協作?
- A簡: 當前端需要聚合與裁剪時使用 BFF,核心 API 保持通用與穩定。
- A詳: 原理:分離穩定與多變邏輯。流程:1)核心 API 以業務資源穩定輸出;2)BFF 針對前端組裝/裁剪/排序;3)BFF 實作授權、快取、節流;4)與前端協定接口與版本;5)監控 BFF 性能與錯誤。核心組件:核心服務、BFF 層、Gateway、前端。此模式避免核心 API 為滿足單一前端而變複雜,兼顧 DX 與演進。
- 難度: 初級
- 學習階段: 核心
- 關聯概念: A-Q11, C-Q5
B-Q20: 消費者驅動契約(CDC)如何運作?
- A簡: 由消費方定義期望契約,提供方以自動測試驗證,避免整合破壞。
- A詳: 原理:將使用者期望落為測試契約。流程:1)消費者生成契約(預期請求/回應);2)發布到契約庫;3)提供者在 CI 驗證契約;4)版本管理與相容性檢查;5)合併並部署。核心組件:契約格式(如 Pact)、Broker、CI、回饋機制。CDC 避免提供者過度設計與盲點,提升跨團隊協作效率。
- 難度: 中級
- 學習階段: 進階
- 關聯概念: A-Q9, C-Q2
B-Q21: 如何提供外部開發者可用的 Mock 與 Sandbox?
- A簡: 以契約產生 Mock,提供隔離資源與金鑰,支援測試資料與配額。
- A詳: 原理:降低整合門檻與風險。步驟:1)以契約產生 Mock;2)建立 Sandbox 環境、獨立金鑰與配額;3)提供測試資料集與重置機制;4)與文件、SDK 整合;5)監控使用與回饋。核心組件:Mock 工具、Portal、金鑰管理、環境隔離。Sandbox 讓外部開發者在不影響正式資料下快速試作。
- 難度: 初級
- 學習階段: 核心
- 關聯概念: C-Q3, B-Q17
B-Q22: 將 API 當產品經營需要哪些技術組件?
- A簡: 需要 Portal、金鑰與配額、分析、計費、版本與文件治理等平台能力。
- A詳: 原理:產品化需可營運與量測。組件:1)開發者入口(文件、互動試玩、註冊);2)金鑰/配額/流量控制;3)監控與用量分析;4)計費與商務;5)版本與相容性管理;6)支援與公告;7)法遵與安全稽核。流程:定義產品方案、上架、觀測與優化。與治理與 DX 提升相互促進,支援 API 經濟。
- 難度: 中級
- 學習階段: 進階
- 關聯概念: A-Q6, A-Q16
B-Q23: 什麼是 API 園林(API Garden)與如何治理?
- A簡: 企業規模的 API 資產集合;需統一目錄、風格、生命週期與平台治理。
- A詳: 原理:當 API 成長為叢林,需有序管理。步驟:1)建立 API 目錄與可發現性;2)風格與 Lint;3)生命週期(規劃、設計、發布、營運、下架);4)安全與法遵;5)度量與成本管理;6)社群與支援;7)自治與中央治理平衡。核心組件:API Portal、Gateway、契約倉庫、治理流程與工具鏈。讓大量 API 能持續演進且不失控。
- 難度: 中級
- 學習階段: 進階
- 關聯概念: A-Q15, B-Q18
B-Q24: 如何在敏捷下守住長期架構目標(Architecture Runway)?
- A簡: 用契約、風格與里程碑建立護欄,定期評審,預留資源推動非功能需求。
- A詳: 原理:將長期目標轉為可演進的護欄與計畫。步驟:1)以契約與風格固定結構;2)設定演進里程碑(版本、相容性);3)保留資源處理技術債與平台建設;4)跨團隊架構評審與 ADR;5)用度量監控狀態;6)在 Sprint 中納入架構工作。核心組件:契約/風格、治理流程、度量、評審機制。讓敏捷速度與架構穩定並存。
- 難度: 中級
- 學習階段: 進階
- 關聯概念: A-Q5, A-Q20
Q&A 類別 C: 實作應用類(10題)
C-Q1: 如何建立以 OpenAPI 為核心的 API First 流程?
- A簡: 建模→撰寫規格→Lint→Mock/文件→並行開發→契約測試→生成 SDK→版本發布。
- A詳:
- 實作步驟: 1) 與 PO/架構師建模資源與狀態; 2) 撰寫 OpenAPI 規格與範例; 3) 設 Lint 與風格檢查(CI); 4) 產生互動文件與 Mock; 5) 前後端並行開發; 6) 契約測試與相容性比對; 7) 生成 SDK/骨架; 8) 發布版本與 Portal。
- 程式碼/設定: 在 CI 中加入 openapi-lint 檢查與生成文件命令;以規格為生成 SDK 的輸入。
- 注意事項: 規格倉庫與代碼分離;規格變更走 PR 審查;以契約為唯一真相來源;版本與棄用策略明確。
- 難度: 初級
- 學習階段: 核心
- 關聯概念: B-Q1, B-Q18
C-Q2: 如何導入消費者驅動契約(Pact)進行契約測試?
- A簡: 消費者生成契約並發布,提供者在 CI 驗證,破壞相容性即失敗,確保整合穩定。
- A詳:
- 實作步驟: 1) 消費者撰寫測試產生 Pact 契約; 2) 發布至契約 Broker; 3) 提供者 CI 下載契約驗證; 4) 驗證通過才可部署; 5) 管理版本與標籤。
- 關鍵程式碼/設定: 消費者端撰寫預期請求/回應;提供者端啟動測試伺服並對應契約驗證。
- 注意事項: 僅覆蓋實際使用路徑;與 OpenAPI 對齊;搭配相容性檢查與回饋流程。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q20, A-Q9
C-Q3: 如何快速發布 API 文件與 Mock 供利害關係人試用?
- A簡: 以 OpenAPI 產生互動文件與 Mock,部署到 Portal/Sandbox,收集回饋再迭代。
- A詳:
- 實作步驟: 1) 規格加入範例; 2) 生成 Swagger UI 與 Mock; 3) 佈署文件站與 Sandbox; 4) 提供金鑰與測試資料; 5) 收集回饋(Issue/表單); 6) 修正規格再審。
- 關鍵程式碼/設定: 啟動 Mock 讀取規格回應範例;CI 自動發布文件。
- 注意事項: 標示 Sandbox 限制;隔離資料;文件與規格同步自動化。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: B-Q2, B-Q21
C-Q4: 如何為訂單資源設計穩定分頁 API?
- A簡: 定義穩定排序與游標,回應包含下一頁標記,說明一致性語義與限制。
- A詳:
- 實作步驟: 1) 選擇游標分頁(nextPageToken); 2) 固定排序(如 createdAt, id); 3) 查詢參數 pageSize、pageToken; 4) 回傳 items 與 nextPageToken; 5) 說明一致性(快照/即時)。
- 關鍵程式碼/設定: 查詢時使用索引與游標;生成下一頁 token。
- 注意事項: 限制最大頁;避免不穩定排序;紀錄一致性行為;高變動時偏好游標。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q5, D-Q4
C-Q5: 如何為行動 App 建 BFF 而保持核心 API 精簡?
- A簡: 核心 API 提供通用資源;BFF 聚合與裁剪;前端僅面向 BFF 接口。
- A詳:
- 實作步驟: 1) 盤點前端頁面資料需求; 2) 設計 BFF 端點聚合多服務; 3) 實作授權、快取與錯誤處理; 4) 與前端對齊版本; 5) 監控性能。
- 關鍵程式碼/設定: BFF 內呼叫多個核心 API,返回前端所需資料格式。
- 注意事項: 不在核心 API 內加入 UI 專屬欄位;BFF 輕量可快速變更;落實安全與限流。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q19, A-Q12
C-Q6: 如何實作版本管理與棄用策略?
- A簡: 新版採路徑/標頭區分,公告遷移期,提供並行版本與相容性檢查。
- A詳:
- 實作步驟: 1) 制定版本規範(v1/v2 或 Accept 頭); 2) 文件標示差異與遷移指南; 3) Gateway 路由多版本; 4) 監控採用率; 5) 設定棄用期限與提醒。
- 關鍵程式碼/設定: 路徑版控與 Accept 頭處理;相容性比對工具。
- 注意事項: 優先保持相容;減少重大變更頻率;提供工具協助遷移。
- 難度: 中級
- 學習階段: 進階
- 關聯概念: B-Q8, A-Q17
C-Q7: 如何在契約中設計 OAuth2 Scopes 與授權需求?
- A簡: 在規格宣告安全方案與端點需求,對應最小權限,並在文件提供範例。
- A詳:
- 實作步驟: 1) 定義安全方案與 scopes; 2) 端點標註所需 scopes; 3) 文件提供取得 token 與示例; 4) 在 Gateway 驗證; 5) 審計權限使用。
- 關鍵程式碼/設定: 契約安全區塊與每端點的 security;SDK 加入 token 攔截器。
- 注意事項: 最小權限設計;敏感欄位遮蔽;一致錯誤處理(401/403)。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q12, D-Q8
C-Q8: 如何從規格生成多語言 SDK 並發布?
- A簡: 以規格與模板生成 SDK,加入認證與重試,發布到套件倉庫並維護版本。
- A詳:
- 實作步驟: 1) 選擇語言模板; 2) 生成 SDK; 3) 加入認證、重試、分頁助手; 4) 測試與範例; 5) 發布至套件倉庫; 6) 文件與示例同步。
- 關鍵程式碼/設定: 客製化模板;加入重試與冪等鍵處理。
- 注意事項: 僅封裝通用模式;避免過度耦合;版本與契約同步發版。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q3, B-Q17
C-Q9: 如何定義建立訂單的冪等性?
- A簡: 客戶端提供 Idempotency-Key;伺服端記錄處理結果,重試返回相同回應。
- A詳:
- 實作步驟: 1) POST /orders 支援 Idempotency-Key; 2) 伺服端以鍵與請求摘要去重; 3) 儲存結果一段時間; 4) 重試回相同結果; 5) 監控鍵使用。
- 關鍵程式碼/設定: 請求頭與去重存儲;返回相同 requestId 與結果。
- 注意事項: 鍵有效期限;鍵與內容一致性檢查;敏感操作務必設計冪等。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q7, D-Q6
C-Q10: 如何以「購物車→折扣引擎→結帳結果」建模契約?
- A簡: 定義統一輸入購物車與輸出計算結果介面,規則作為可擴展插件。
- A詳:
- 實作步驟: 1) 定義 Cart(items、會員、券等); 2) 定義 CheckoutResult(應付、折扣明細); 3) 以 POST /checkout 計算; 4) 規則插件在引擎內擴展; 5) 文件範例覆蓋常見場景。
- 關鍵程式碼/設定: 統一介面模型;規格中標示欄位語義與可擴展點。
- 注意事項: 核心介面穩定;規則可演進;UI 與流程依結果組裝。
- 難度: 中級
- 學習階段: 進階
- 關聯概念: A-Q13, B-Q16
Q&A 類別 D: 問題解決類(10題)
D-Q1: API 規格頻繁破壞相容怎麼辦?
- A簡: 建立相容性規範與版本策略,契約審查與自動比對,提供遷移期與棄用計畫。
- A詳:
- 症狀: 消費者常因變更壞掉;文件與實作不同步。
- 可能原因: 未定義相容性規則;缺審查與自動化;過度即時調整。
- 解決步驟: 制定相容性準則;引入契約審查與比對;建立版本與棄用策略;在 CI 阻擋破壞性變更;開放遷移指南。
- 預防: 契約先行與早期回饋;CDC 測試;治理與度量。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q8, C-Q6
D-Q2: 團隊持續共用資料庫,如何修正?
- A簡: 以服務契約取代 DB 共享,逐步抽離存取,建立中介層與反腐化層遷移。
- A詳:
- 症狀: 一改資料結構多系統壞;部署綁死。
- 可能原因: 缺契約與服務邊界;技術債累積。
- 解決步驟: 定義服務介面;在共用處加反腐化層;逐步重定向存取到 API;建立事件/同步替代;最終封鎖直接 DB 存取。
- 預防: 治理規範禁止共享;審計與監控;教育與平台支持。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q8, B-Q15
D-Q3: 前端常被後端進度卡住,怎麼解決?
- A簡: 契約先行並提供 Mock/Sandbox,前後端並行;用 BFF 隔離變化。
- A詳:
- 症狀: 前端等待 API 完成;整合期壓縮。
- 可能原因: 無契約或契約晚出;缺 Mock/SDK。
- 解決步驟: 先出契約與範例;啟用 Mock 與互動文件;前後端並行開發;引入 CDC;以 BFF 快速適配。
- 預防: 契約審查節點;Portal 與工具鏈;DX 指標監控。
- 難度: 初級
- 學習階段: 基礎
- 關聯概念: B-Q2, C-Q3
D-Q4: 分頁結果不一致怎麼辦?
- A簡: 改用游標與穩定排序,定義一致性語義(快照/即時),必要時加版本戳。
- A詳:
- 症狀: 下一頁重複/遺漏;資料變動導致混亂。
- 可能原因: 使用頁碼+不穩定排序;無一致性定義。
- 解決步驟: 採游標分頁;固定排序鍵;若需快照,一致性時間點標記;文件說明語義。
- 預防: 設計時定義分頁策略;測試併發場景;監控錯誤。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q5, C-Q4
D-Q5: 匯出等長任務常逾時,怎麼辦?
- A簡: 改非同步 job 模式,回傳任務資源供輪詢/回呼,並設重試與取消。
- A詳:
- 症狀: 連線逾時、使用者體驗差。
- 可能原因: 同步操作時間過長;無進度回報。
- 解決步驟: 設計提交任務端點;提供狀態與結果查詢;支援取消與回呼;設冪等鍵;前端提示進度。
- 預防: 設計時識別長任務;容量規劃;超時/重試策略。
- 難度: 初級
- 學習階段: 核心
- 關聯概念: B-Q6, C-Q4
D-Q6: 重試導致重複扣款/下單,如何避免?
- A簡: 為非冪等操作設計冪等鍵與去重,規範可重試錯誤與退避策略。
- A詳:
- 症狀: 一次操作被執行多次。
- 可能原因: 網路重試;無冪等防護。
- 解決步驟: 要求 Idempotency-Key;伺服端去重並保存結果;定義可重試錯誤碼與退避;記錄審計。
- 預防: SDK 內建重試與冪等;文件強調;測試覆蓋。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: B-Q7, C-Q9
D-Q7: API 過度設計的徵兆與處置?
- A簡: 參數爆炸、難懂難用、無人採用;回歸用例,簡化契約,將組合移至 BFF/SDK。
- A詳:
- 症狀: 使用者困惑、變更成本高、迭代停滯。
- 可能原因: 過早泛化;一端點包山包海。
- 解決步驟: 盤點真實用例;砍掉冗餘參數;拆解為清晰資源;複雜組合放 BFF/SDK;建立審查機制。
- 預防: 最小可用契約;早期回饋;度量 DX 與採用。
- 難度: 中級
- 學習階段: 核心
- 關聯概念: A-Q19, A-Q11
D-Q8: 產品上線後發現安全漏洞,如何補救?
- A簡: 立即封鎖風險面、修正契約與實作、加驗證與授權,建立安全設計流程。
- A詳:
- 症狀: 未授權存取、敏感資料外洩、注入等。
- 可能原因: 設計未納入安全;輸入未驗證;權限過寬。
- 解決步驟: 熱修補丁與封鎖;修正契約(最小輸出、欄位遮蔽、scopes);加驗證與審計;進行安全測試。
- 預防: 設計納入安全;風格與 Lint 覆蓋安全;威脅建模與定期測試。
- 難度: 中級
- 學習階段: 進階
- 關聯概念: B-Q12, B-Q11
D-Q9: 團隊 API 風格不一致導致混亂,怎麼辦?
- A簡: 制定風格指南與範例,導入 Lint 與審查,在 CI 強制檢查並教育推廣。
- A詳:
- 症狀: 命名雜亂、錯誤碼不一、分頁各說各話。
- 可能原因: 無統一規範;缺自動化。
- 解決步驟: 共創風格指南;樣例庫;Lint 工具接入 CI;契約審查;培訓。
- 預防: 治理流程固化;新服務模板化;度量與持續改進。
- 難度: 初級
- 學習階段: 核心
- 關聯概念: B-Q18, B-Q23
D-Q10: 對外 API 採用率低,如何提升 DX 與生態?
- A簡: 改善入口、文件與範例,提供 SDK 與 Sandbox,建立支援與回饋機制。
- A詳:
- 症狀: 註冊少、整合慢、流量低。
- 可能原因: DX 差;缺範例/SDK;Sandbox 不友好;商業策略不清。
- 解決步驟: 打造 Portal 與互動文件;提供 SDK 與範本;Sandbox 與測試資料;支援與社群;明確方案與配額;度量與 A/B 改善。
- 預防: API 產品化經營;DX 指標化;持續訪談與回饋循環。
- 難度: 中級
- 學習階段: 進階
- 關聯概念: B-Q22, B-Q17
學習路徑索引
- 初學者:建議先學習哪 15 題
- A-Q1: 什麼是 API First 開發策略?
- A-Q2: 為什麼 API 的「First」比 API 本身更關鍵?
- A-Q3: 什麼是 API 契約(API Contract)?
- A-Q4: DX 與 UX 有何差異?為何先顧 DX?
- A-Q5: API First 與敏捷/DevOps 會衝突嗎?
- A-Q8: 為何共享資料庫是反模式?
- A-Q11: API 與 APP 的邊界應如何拿捏?
- A-Q12: 什麼是 BFF?
- B-Q1: 契約先行如何運作?
- B-Q2: 如何在寫碼前用契約獲取回饋?
- B-Q3: 如何根據契約生成文件與程式碼?
- B-Q4: 資源命名與階層如何設計?
- B-Q18: API 風格指南與 Lint 為何重要?
- C-Q1: 如何建立以 OpenAPI 為核心的流程?
- C-Q3: 如何快速發布 API 文件與 Mock?
- 中級者:建議學習哪 20 題
- A-Q6: API 經濟是什麼?
- A-Q7: 什麼是康威定律?啟示?
- A-Q10: 微服務與三層式差異?
- A-Q13: 什麼是設計公式/核心機制?
- A-Q14: 抽象化在 API 設計中的角色?
- A-Q17: 為何 API 規格需自初期穩定?
- A-Q18: 設計階段考慮安全性
- A-Q19: 過度設計是什麼?如何避免?
- B-Q5: 分頁如何設計?
- B-Q6: 長時任務如何處理?
- B-Q7: 冪等性與請求去重
- B-Q8: 版本與相容性規劃
- B-Q9: 部分更新與擷取
- B-Q12: 設計階段納入安全
- B-Q15: 服務間通訊模式
- B-Q17: 衡量與提升 DX
- C-Q4: 訂單分頁 API 設計
- C-Q5: 為行動 App 建 BFF
- C-Q6: 版本管理與棄用策略
- D-Q3: 前端被後端卡住怎解
- 高級者:建議關注哪 15 題
- A-Q15: 什麼是 API 治理?
- A-Q16: 何謂「API 即產品」?
- A-Q20: 架構師在敏捷團隊的角色
- B-Q10: 批次操作設計
- B-Q11: 請求驗證與資料模式
- B-Q13: 軟刪除與資源修訂
- B-Q14: 重試與退避策略
- B-Q16: 狀態機驅動的 API 設計
- B-Q19: 何時使用 BFF 與協作
- B-Q20: 消費者驅動契約(CDC)
- B-Q21: 提供 Mock 與 Sandbox
- B-Q22: API 產品化的技術組件
- B-Q23: API 園林與治理
- C-Q9: 建立訂單冪等性
- D-Q1: 規格破壞相容如何處理