# [電影欣賞] DevOps 潮流下的 API First 開發策略

影片網址:
https://www.youtube.com/watch?v=xDMTP2OVROo
## 什麼是 API First?
推動 API First 的期待是什麼呢?
**API-First 方法的定義** ([14m35s](https://youtu.be/xDMTP2OVROo?t=875)):
- 先有 API,再拿 API 來開發自己的產品。而不是先有產品,再來生出 API。
- 先把 API 的 contract (就是 interface) 定出來,有了 contract 就驗證 Spec 與 Design 能不能用、好不好用 (在寫 code 之前)。
**老闆期待的 API First 是什麼** ([15m57s](https://youtu.be/xDMTP2OVROo?t=957))?
→ 有了好用的 API,就可以透過它來組合出各種產品,也減少客戶需要製客化的需求 → 可規模化
**哪些東西該作成 API?哪些不用呢?**([20m59](https://youtu.be/xDMTP2OVROo?t=1259))
- 跟 UI 高度相關的最好不要
- 以產品的角度來說,核心的功能應該有 API
- API 不見得要涵蓋所有的產品功能,cover 太多反而限制了產品發展的空間
- 儘可能取得技術與商業需求的平衡
**2002 年的 AWS 的 API 授權備忘錄** ([28m07s](https://youtu.be/xDMTP2OVROo?t=1687))
- 跨團隊的服務,只能用 API 溝通
- 沒限制只能用 HTTP API,但得是 API
- 禁止使用不恰當的技術跨團隊溝通
**流程與決策順序改變,必須先改變團隊的文化與能力** ([32m51s](https://youtu.be/xDMTP2OVROo?t=1971))
- (開讀書會…)
- 介紹 3 本書給你
## API 的開發策略
[34m53s](https://youtu.be/xDMTP2OVROo?t=2093)
- 開發流程
- contract first vs requirement first
- 分析設計方式 & Ownership
- 先由 domain 開始,而非 database schema 開發
- 安全控管的改變 (**註:我覺得是這場 talk 最重要的精華**)
- 你怎麼做 OAuth 權限設計的!?
**開發流程的改變** ([38m32s](https://youtu.be/xDMTP2OVROo?t=2312))
- Contract First

- 決定好 Contract 後,生出 Mock API,直接讓 Client 端試用。這時還不需要去管 Database 怎麼設計,直接做 e2e testing 看看有沒有什麼設計的問題。
- 擴大解說一下 Contract First ([40m31s](https://youtu.be/xDMTP2OVROo?t=2431))

- 有了 mock api 後,進行 e2e testing 每個角色都有事情可以做了
- 前端可以實作、SDK 可以實作、文件也可以寫了、QA 也能動起來了。

- 我們的作法:design spring, PoC 確認你的 contract works ([46m14s](https://youtu.be/xDMTP2OVROo?t=2774))

---
更具體的設計分隔線 (前方高能)
---
**API 設計方式的改變與標準化** [48m06s](https://youtu.be/xDMTP2OVROo?t=2886)
- 以**狀態機**表達:resource 的生命週期與可用的行為
- 通常不是 CRUD 能搞定的事,你需要狀態機。
- CRUD 能搞定的事,你 codegen 就好了啊!
會員管理實例 [50m23s](https://youtu.be/xDMTP2OVROo?t=3023)


理清狀態與可以呼叫的行為對應後,(權限部分的) 商業邏輯的整理就更加明確了:

- API Access Scope 參考範例 ([1:00:41](https://youtu.be/xDMTP2OVROo?t=3641))
- 對比典型的 CRUD API ([1:06:53](https://youtu.be/xDMTP2OVROo?t=4013))
金句誕生 ([1:07:47](https://youtu.be/xDMTP2OVROo?t=4067))
> 因為 CRUD 是系統資料存取的動作不是你 Domain 的動作,所以你很難判斷的出這件事情的意圖。那你判斷不是意圖…. 你真正要管控的是意圖,所以你的權限管制就會很困難。
>
- 設計 API 的安全機制:授權管理 ([1:10:46](https://youtu.be/xDMTP2OVROo?t=4246))
- 不同的權限管控方式:車票 vs 識別證 ([1:13:45](https://youtu.be/xDMTP2OVROo?t=4425))
- 外部使用 vs 內部使用
**思考是否會過度設計?**
[1:18:46](https://youtu.be/xDMTP2OVROo?t=4726)
**總結**
[1:23:16](https://youtu.be/xDMTP2OVROo?t=4996)
**Q & A 開始**
[1:29:12](https://youtu.be/xDMTP2OVROo?t=5352)