前端系統設計面試:用心智模型把一個 client-server 架構逐層加壓到微前端
文字解析 · 1 支影片 · 產生於 2026-10-01 00:54
章節(19)
1. Outline
- 起點 · Real Frontend System Design (from a Senior Engineer)
從一句「來蓋 Amazon」開始,先拆功能/非功能需求並導出 UI 與狀態,再讓每一個非功能需求逼出一層新架構,最後停在微前端+monorepo 的組織級擴展。
2. YouTuber 的思維推導
Real Frontend System Design (from a Senior Engineer)
theSeniorDev · 48m25s · 字幕 en · vision=on (使用者指定 vision=true。影片是投影片+架構圖驅動的講解,每個 scale level 都以圖示呈現,逐張讀圖才能對照文字說明。) · YouTube
預估 vs 實際耗時
| 階段 | 預估 | 實際 |
|---|---|---|
| fetch | 6s | 2s |
| segment | 2m07s | 4m40s |
| shot | 1m49s | 16s |
| analyze | 20m00s | 25m00s |
| render | 5s | – |
作者的出發點是一個反直覺的主張:前端系統設計面試不該用「背範例」的方式準備,因為題目永遠換,只有心智模型能遷移。於是他選了一條可以一路走到底的敘事線:先把一句空泛的題目(「來蓋 Amazon」)拆成功能需求與非功能需求,用功能需求導出 UI 草稿,再從草稿逐塊抽出狀態、決定狀態該放在元件樹的哪一層,接著把狀態翻成 API 模型。走到這裡他刻意讓 REST 撞牆——一次瀏覽要打五支 API(under-fetching)——並宣告最陽春的 client-server 架構到此為止。
後半段他改用「加壓」的方式推進:每引入一個非功能需求,就逼出一層新架構。想快 → 先算出尖峰每小時 1.36 億頁面瀏覽的規模,再用光速與 TCP/TLS 來回次數證明延遲來自物理距離 → CDN(Level 1);動態內容也要快 → CSR 白畫面 → SSR → 邊緣運算 → 分散式唯讀資料庫(Level 3),並用 CAP 定理標出代價;要撐更多流量 → 先用快取消除請求,再加 API Gateway、BFF、GraphQL、負載平衡(Level 4);要好維護 → 康威定律說團隊結構決定系統結構,所以拆團隊就要拆系統 → 微前端,再用 design system 補回視覺一致、用 monorepo 補回工具鏈一致(Level 7)。最後用可用性(單點故障與 active-passive)、無障礙、資安三個較短的段落收邊,並補上 SEO 與可觀測性兩個加分題。
整條線的隱含結論是:架構不是一次選好的,而是被一個個非功能需求逼出來的;面試要展示的正是這個「被逼出來」的推理過程,而不是最終那張圖。
推理鏈:每段留給下一段的線索
每一列是一段,箭頭後的字是這段留給下一段的線索。點段落標題跳到該段。
- 別背題目,要學心智模型 → 路線圖畫好了,但第一階還沒開始:一句「來蓋 Instagram」要怎麼變成可以動手的東西?下一段從拆需求開始。
- 功能與非功能需求(飛機比喻) → 分類有了,但功能需求還只是一串句子。下一段要把它變成看得見的東西:一張 UI 草稿。
- 從使用者故事到低保真草稿 → 畫面有了,但畫面背後要記住哪些東西才能動起來?下一段開始從這張草稿上把狀態一塊一塊摳出來。
- 抽狀態與不可再簡測試 → 現在知道有哪些狀態了,但還不知道它們該放在元件樹的哪一層。下一段處理狀態的高度。
- 狀態的高度:lifting state → 狀態的位置定了,而且我們發現它之所以要抬高,是因為要拿去打 API。那 API 該長什麼樣?下一段開始建模。
- REST 建模與 under-fetching → 功能需求已經被一個 client-server 架構滿足了,但它撐不住規模。真正的系統設計從非功能需求開始——下一段先把非功能需求收斂成一張清單。
- 六大非功能需求與該問的問題 → 問題清單有了,但問完得到的是一堆數字。下一段示範怎麼把「每月 21.1 億次造訪」這種模糊大數,推成能決定架構的具體規模。
- 流量估算:back of the envelope → 規模算出來了,也知道沒有單一伺服器撐得住,而且七成流量在同一個頁面上。那第一個要處理的非功能需求是什麼?下一段從前端最優先的 web performance 開始。
- Core Web Vitals 與 UI 動靜光譜 → 光譜的靜態那端最容易處理,但要先知道慢是從哪裡來的。下一段從光速與網路實體結構開始算延遲。
- 網路延遲與 CDN(scale level 1) → 靜態資產的延遲解掉了,但畫面上會動的那一半還是得回伺服器。下一段處理動態內容的效能。
- 從白畫面到邊緣運算(scale level 3) → 效能這條線走完了,但整套架構的壓力全落在源站上。下一段換一個角度處理可擴展性:與其把請求送得更快,不如讓請求根本不發生。
- 用快取消除請求 → 能省的請求省完了,剩下的請求還是要打到後端,而後端已經是一堆微服務。下一段處理那些真的躲不掉的請求。
- API Gateway 與 BFF → 資料的入口整理好了,但第 6 段那個「一次瀏覽打五支 API」的問題還沒真正解掉,而且流量現在全壓在 BFF 上。下一段同時處理這兩件事。
- GraphQL 與水平擴展(scale level 4) → 到這裡效能與可擴展性都有解了,但整個前端仍然是一整塊、由一個大團隊維護。下一段換一個維度:可維護性。
- 康威定律與微前端(scale level 5) → 系統拆開了,團隊也小了,但立刻出現兩個新問題:各自為政會長得不一樣,換團隊的人也會迷路。下一段補這兩個洞。
- Design system 與 monorepo → 效能、可擴展性、可維護性都有了,但整張架構圖裡還藏著幾個「壞掉就全倒」的位置。下一段檢查可用性。
- 可用性、單點故障與 active-passive → 拓撲層面的問題到此收束。剩下兩個非功能需求靠的不是架構而是實作紀律——下一段處理無障礙與資安。
- 無障礙與資安速查 → 六項非功能需求都處理完了。最後還有兩個常被追問的加分題——下一段收尾。
- SEO 與前端可觀測性
3. 逐段說明
Real Frontend System Design (from a Senior Engineer)
1. 別背題目,要學心智模型 0:00–0:58
作者先否定「背 Spotify、Instagram 怎麼做」這類準備法,主張前端系統設計面試該練的是可遷移的心智模型。他預告全片會走過 web performance、前端可擴展性、無障礙、大型狀態建模、SSR 與邊緣運算,並用一條主線把架構從最基本的 client-server 一路加壓到 scale level 7(微前端、微服務、負載平衡、CDN、design system)。

推理因為題目會換而模型不會換,所以作者把整支影片的目標訂成「交給你一組可遷移的心智模型」,並先攤開路線圖:web performance、前端可擴展性、無障礙、大型狀態建模、SSR、邊緣運算,最後用一條 scale level 的階梯把這些東西串起來,從最陽春的 client-server 一路加到微前端、微服務、負載平衡、CDN、design system。
AI 補充這個開場其實已經預告了全片的敘事結構:不是「介紹七個技術」,而是「同一個系統被加壓七次」。畫面上的 scale level 卡片是階梯的第一階,之後每加一個非功能需求,畫面就會回到同一張架構圖再長出一塊。要留意的是這套 level 編號是作者自創的教學工具,不是業界標準,面試時可以借用它的順序來組織回答,但不必背編號。另外作者說的是「用在任何面試」,實際上這條線也直接對應真實專案的演進順序——多數團隊都是先有 client-server,再被效能與人數逼著往上加。
2. 功能與非功能需求(飛機比喻) 0:58–2:50
面試通常以一句很空的「來蓋 Instagram」開場,第一步是把它拆成需求。作者用飛機比喻分兩類:功能需求是飛機要有的座位、起落架、引擎,也就是它要完成什麼;非功能需求是航程、油耗、碳排、落地噪音,也就是它怎麼做到。對應到前端,功能需求由使用者看得到、摸得到的 UI 滿足,非功能需求則是效能、可擴展性、安全性。

推理因為要讓「需求」這個抽象詞可操作,所以作者換成飛機當載體:座位數、起落架、引擎、機身結構是功能需求,也就是這架飛機「要做到什麼」;航程、平均油耗、碳排、落地噪音是非功能需求,也就是它「怎麼做到」。接著他把比喻收回前端:功能需求由使用者看得到、摸得到的 UI 滿足,非功能需求則落在效能、可擴展性、安全性這些看不見的地方。
- Cnon-functional requirement:系統以什麼品質做到(多快、撐多少人、多安全),會產出架構;幾乎都可量化→ 畫地圖
- A飛機比喻:座位數、引擎是功能需求;航程、油耗、噪音是非功能需求→ 批判類比
AI 補充這個切法之所以重要,是因為它決定了面試前半場與後半場的分工:功能需求會產出畫面與資料結構,非功能需求會產出架構。很多人卡住是因為把兩者混著談——一邊畫 UI 一邊講 CDN,結果兩邊都講不深。飛機比喻還藏了一個好用的檢查:非功能需求幾乎都可以被量化(航程幾公里、油耗幾公升),所以當你講不出數字時,通常代表你把它當成形容詞在講(「要很快」),而不是當成需求在談。
3. 從使用者故事到低保真草稿 2:50–4:16
作者以 amazon.com 的商品列表頁當範例,把功能需求寫成使用者故事:瀏覽商品、加入購物車、評分評論、線上下單付款。從這些故事就能導出第一版 UI,也就是低保真 mockup;有些面試會直接給你,有些要你自己畫。這張草稿是後面抽狀態、設計 API 的唯一依據。

推理因為功能需求要落地成畫面,所以作者選 amazon.com 的商品列表頁當範例,先把功能需求寫成幾條使用者故事——瀏覽商品、加入購物車、評分與評論、線上下單付款——再從這些故事畫出第一版低保真 mockup。他也提醒:有些面試會直接給你這張圖,有些要你自己畫。
AI 補充選商品列表頁不是隨手挑的,作者後面會用數據證明它是流量最集中的頁面;先鎖定一個頁面,是為了讓後續每個決策都有具體對象可以指。另一個值得學的動作是「低保真」三個字:面試中畫得越精緻越浪費時間,草稿只需要能讓你指著某一塊說「這裡需要一個狀態」。這張圖在後面會被反覆使用——抽狀態指它、算讀寫比例指它、切微前端也指它——所以它其實是整場面試的共用座標系。
術語:low-fidelity mockup
4. 抽狀態與不可再簡測試 4:16–6:11
狀態要越少越好,因為狀態佔記憶體又會觸發 re-render。從 mockup 逐塊掃出需要的狀態:品牌清單的 loading/error/data、使用者選的品牌、購物車、分頁、商品列表的 loading/error/data。抽完後跑「不可再簡測試」——試著拿掉任一個狀態變數,若 UI 就做不出來,才確定它是必要狀態。接著把它們落成實際資料結構:狀態原始值(selected brand、current page)與領域實體(product、product brand)。


推理因為狀態既佔記憶體又會觸發 re-render,作者先立下「越少越好」的原則,再帶著這個原則逐塊掃過草稿:品牌清單要從後端抓,於是有 loading / error / data;使用者要勾選品牌,是使用者互動造成的狀態;購物車、分頁同理;商品列表本身又是一組 loading / error / data。抽完後他加了一道驗收動作——不可再簡測試——逐一嘗試拿掉每個狀態變數,若 UI 仍能運作,那個狀態就不是必要的。最後把結果落成兩類資料:狀態原始值(selected brand 是字串或字串陣列、current page 是數字)與領域實體(product、product brand)。
- Cstate:為畫出目前畫面必須記住的最小資訊;來源只有 data fetching 與 user interaction 兩種→ 畫地圖
- Pirreducibility test:逐一拿掉每個狀態變數,UI 還做得出來就砍掉→ 練習
- E最常見錯誤:把篩選後的商品陣列另存一份,它其實是商品陣列 + 選中品牌的推導結果→ 存+演練
AI 補充畫面上那張圖把每個箭頭標成 Data Fetching 或 User Interaction,這其實是一個實用的分類法:狀態的來源只有兩種——外部資料進來,或使用者動作進來。用這兩個標籤掃過畫面,比憑感覺列狀態更不容易漏。不可再簡測試看起來像形式,實際上它擋掉的是最常見的錯誤:把「可以算出來的東西」存成狀態(例如把篩選後的商品陣列另存一份,而它其實是商品陣列加上選中品牌的推導結果)。作者也示範了面試裡合法的減負動作——他直接宣告購物車狀態超出範圍——這在真實面試中通常會被接受,但要主動說出口,而不是默默略過。
5. 狀態的高度:lifting state 6:11–9:02
狀態有三種高度:local、shared local、global,複雜的轉換各自可再套 reducer pattern。元件樹是倒著長的,使用者看到的是最底層的葉子,所以狀態應該放在真正用到它的最底層,能不往上抬就不抬。原則是「as low as possible, as high as necessary」。回到範例,current page 要拿去打 API,得抬到與商品資料請求同層;品牌篩選也會影響同一個請求,於是三者都被抬成同層的 shared local state。


推理因為要談位置,作者先把位置變成三個刻度:local、shared local、global,並補一句每一層都可以在轉換複雜時套用 reducer pattern。接著他用一個反直覺的圖說明元件樹是倒著長的——使用者看到的是最底部的葉子——所以狀態應該從最底層開始放,能不抬就不抬,原則是「as low as possible, as high as necessary」。回到範例,current page 必須拿去打 API,所以要抬到與商品資料請求同層;品牌篩選也會影響同一個請求,於是三個狀態最後都被抬成同層的 shared local state。
- Clifting state:狀態被抬高不是因為很多元件要用,而是它成了某個副作用(API 請求)的輸入→ 畫地圖
- R三個刻度 local / shared local / global;原則「as low as possible, as high as necessary」→ 存+回想
- Ecurrent page 與 brand filter 都要打同一支商品 API,所以被抬到與商品請求同層→ 存+演練
AI 補充這裡有一個容易被略過的因果:狀態被抬高不是因為「很多元件想用」,而是因為它成了某個副作用(這裡是 API 請求)的輸入。找到那個副作用發生的位置,狀態的高度就確定了,不必憑感覺猜。另外作者只說了 global state 的例子是驗證資訊,沒說的是抬高的代價——每次改變會讓整個子樹重算,這正是第 4 段講的「狀態會觸發 re-render」在架構層的回音,也是為什麼要用 as low as possible 當預設。至於這段結尾那句「先讓狀態很 global 再往上抬」,方向與他整段的主張相反,實際做法是相反的:從最低層開始,只在必要時往上。
術語:lifting state
「make sure you start with your state being very global and then raise it as high as necessary but as low as possible」
6. REST 建模與 under-fetching 9:02–13:26
把狀態翻成後端 API:先用 REST 觀點看待 product、product brand 這些實體。細看會發現單一 product 實體撐不住——價格常變、評分由評論算出、送達時間隨地址重算——於是一個實體被拆成五個,各自有自己的 REST endpoint,篩選與分頁一律用 query parameter 掛在同一個 endpoint 上。代價是:一次頁面瀏覽至少要打五支後端 API,這就是 REST 的 under-fetching。到這裡功能需求已能被最陽春的 client-server 架構滿足,但它撐不住規模。




推理因為狀態要翻成後端契約,作者先用 REST 的眼光看待前面抽出的實體,把 product 展開成 price、name、description、rating、category、deliveryTime。展開後問題就浮出來:價格會頻繁變動且有幣別、評分是由評論算出來的、送達時間隨使用者地址即時重算——這三個都不該壓在 product 這一層。於是一個實體被拆成五個,各自有自己的 endpoint,而篩選與分頁不另開端點,一律用 query parameter 掛在原本的資源上。最後他把代價點名:一次前端頁面瀏覽至少要打五支後端 API,這就是 under-fetching,並宣告最陽春的 client-server 架構到此為止。
- Cunder-fetching:REST 資源切得越乾淨,一個畫面要組的資源越多;一次瀏覽打五支是 client-server 極限→ 畫地圖
- R拆實體判準:欄位的變動頻率、生命週期、計算來源跟主體不一樣就拆出去→ 存+回想
AI 補充拆實體的判準值得單獨記住:不是「欄位多不多」,而是「這個欄位的變動頻率、生命週期、計算來源和主體一不一樣」。價格會單獨改、評分是聚合結果、到貨時間依賴另一個輸入(地址),三者都不屬於 product 自己的生命週期,所以各自獨立。這條判準在後端叫聚合邊界,在前端則直接決定你要打幾支 API、能不能分別快取,後面談快取策略時會再用到同一組資訊。要注意 under-fetching 是 REST 資源導向的必然結果而不是設計失誤:資源分得越乾淨,一個畫面要組的資源就越多。作者在這裡刻意讓 REST 撞牆,是因為它是後面 BFF 與 GraphQL 的動機來源。
術語:client-server architecture
7. 六大非功能需求與該問的問題 13:26–15:52
非功能需求關心使用者分布、裝置、法規、以及變更成本。作者收斂成六項:web performance、client scalability、availability/fault tolerance、web accessibility(A/AA/AAA)、maintainability、web security。他強調資深度不只看你答什麼,更看你問什麼,並示範一串好問題:預期流量多少、有無時段或地理的分布差異、有無 Prime Day 這種尖峰、使用者主要用什麼瀏覽器與裝置、載入速度是否關鍵、無障礙有無法規要求、有無特殊資安考量。


推理因為非功能需求太發散,作者先框出它們關心什麼——使用者是誰、分布在哪、用什麼裝置、有無法規、以及變更成本——再收斂成六項:web performance、client scalability、availability 與 fault tolerance、web accessibility、maintainability、web security。接著他轉了一個彎:資深度不只由答案決定,也由你問的問題決定,於是給出一串可以直接背的提問——預期多少流量、有無時段或地理分布差異、有無 Prime Day 這種尖峰、主要瀏覽器與裝置是什麼、載入速度是否關鍵、無障礙有無法規要求、有無特殊資安顧慮。
AI 補充這六項不是隨意排序的,它們正好是本片後半段的章節目錄,而且順序有意義:效能與可擴展性先談,因為它們會改變架構圖;可維護性接在後面,因為它改變的是團隊與 repo;無障礙與資安放最後,因為它們主要靠實作紀律而不是拓撲。至於那串提問,真正的價值不在禮貌,而在於每個問題都會夾住一個後面要做的決策——問裝置是為了決定 bundle 預算與圖片尺寸,問尖峰是為了決定要不要為峰值容量付錢,問法規是為了決定無障礙要做到哪一級。作者提到無障礙的等級時把 A / AA / AAA 唸得含糊,記住三級即可:A 是最低、AA 是多數法規要求的水準、AAA 最嚴格。
8. 流量估算:back of the envelope 15:52–19:10
作者查出 amazon.com 每月來自美國約 21.1 億次造訪,東西岸分布平均,週二到週四為高峰、晚上 7 到 10 點是尖峰時段,7 成以上流量來自行動裝置。接著逐步收斂:月 21.1 億 → 週 5 億 → 週二到四 2.5 億 → 週四 1.25 億 → 尖峰小時 2100 萬次造訪,再乘上每次造訪平均 6.8 個頁面,得到尖峰每小時約 1.36 億次頁面瀏覽。重點不是數字精準,而是能把一個模糊的大數推到具體的每秒/每小時請求量。另外 59% 購買發生在行動裝置、70% 造訪落在商品搜尋頁,決定了後續最佳化的戰場。



推理因為「21.1 億」本身不能決定任何事,作者先補齊四項條件:來自美國的月造訪 21.1 億、地理分布平均、週二到週四為高峰且晚上七到十點是尖峰、行動裝置佔七成以上。接著逐步收斂:月 21.1 億 → 週 5 億 → 週二至四 2.5 億 → 週四 1.25 億 → 尖峰小時 2100 萬次造訪;再乘上每次造訪平均 6.8 個頁面,得到尖峰每小時約 1.36 億次頁面瀏覽。他強調重點不是算得準,而是能把模糊大數推到具體的每小時/每秒請求量,並在推導中和面試官一起講清楚每一步的假設。最後兩個數字定了戰場:59% 的購買發生在行動裝置、70% 的造訪落在商品搜尋頁。
- Pback of the envelope:每一步都是「總量 × 一個佔比」,佔比來自前面問出的分布→ 練習
- E美國月 21.1 億次造訪 → 尖峰每小時 1.36 億次頁面瀏覽;59% 購買在行動、70% 造訪在搜尋頁→ 存+演練
AI 補充這段的方法論比數字重要:每一步都是「總量 × 一個佔比」,而每個佔比都來自上一段問出來的問題。這也是為什麼提問要先做——沒有那些分布資訊,你只能停在月造訪數,推不出尖峰。值得補的是這個推導刻意保守:它假設週內與時段的集中度只有 50%,實際電商的尖峰集中度通常更高,而 Prime Day 這類事件作者直接排除在外,因為為峰值容量長期付費是另一個成本決策。行動佔比則同時決定了兩件事——JavaScript 要輕(CPU 弱)、圖片可以更小(螢幕窄),後者反而是可以拿來占便宜的地方。
術語:back of the envelope calculationdimensional analysis
9. Core Web Vitals 與 UI 動靜光譜 19:10–21:34
前端系統設計與後端最大的差別,是第一順位話題是 web performance,而它只有兩件事:載入多快、回應輸入多快。量化方式是 Core Web Vitals,作為前端的 SLI(service level indicator):LCP 與 CLS 管初次載入,INP 管重新渲染與互動回應。接著作者提出關鍵提問——你的 UI 有多靜態或多動態?從媒體/部落格(極靜)、電商(靜中帶動)、社群(大量互動)到企業 SaaS 與 Uber(極動),不同位置決定了要用哪種最佳化手段。


推理因為前端與後端系統設計的第一順位不同,作者先把 web performance 推到最前面,並把它拆成兩件事:載入多快、回應輸入多快。為了讓它可討論,他引入 Core Web Vitals 當作前端的 SLI——LCP 與 CLS 管初次載入,INP 管互動回應。接著他丟出決定後續路線的提問:你的 UI 有多靜態或多動態?並畫出一條光譜,從媒體與部落格(幾乎全靜態)、電商(內容多但互動也多)、社群(大量使用者產生內容與即時互動),一路到企業 SaaS 與 Uber(狀態極多、內容極少)。
- CCore Web Vitals 是前端的 SLI:LCP / CLS 管初次載入,INP 管互動;還要一條目標線才算 SLO→ 畫地圖
- RUI 動靜光譜:靜態端靠複製資產(CDN),動態端靠移動運算(SSR / edge),電商在中間兩套都做→ 存+回想
AI 補充這條光譜是全片的分岔點:靜態那端靠複製資產解決(下一段的 CDN),動態那端靠移動運算解決(SSR 與邊緣運算),而電商剛好卡在中間,所以兩套都得做——這正是作者選 Amazon 當例子的理由。另外要分清 SLI 和 SLO 的差別:Core Web Vitals 是指標本身(量出多少),你還需要一條目標線(例如 LCP 的 p75 要在 2.5 秒內)才構成目標。也要注意這些指標是以真實使用者的分布來看的,用自己的筆電量出來的數字通常過於樂觀,要靠真實使用者端的監控才補得上這一塊。
10. 網路延遲與 CDN(scale level 1) 21:34–24:28
先算物理極限:光纖中光速約每秒 30 萬公里,舊金山到紐約單程約 9 毫秒,人類感知「慢」的門檻是 100 毫秒,看似綽綽有餘。但實際封包要在多個交換節點間轉手,一次來回要 140–160 毫秒;TCP 建連要三次來回,加上 TLS 的 HTTPS 至少四次,光是建立連線就約 600 毫秒。消除這段延遲最簡單的方法是把靜態資產複製到離使用者最近的 edge location,這就是 CDN,也就是 scale level 1:client + server + CDN。



推理因為要證明延遲不是程式寫得爛,作者從基礎設施算起:光纖裡光速約每秒 30 萬公里,舊金山到紐約約 2654 公里,單程約 9 毫秒,而人要覺得慢得超過 100 毫秒——看起來完全不是問題。接著他戳破這個樂觀:封包不會直線飛,要在一連串交換節點間轉手,一次來回實測約 140 到 160 毫秒;再加上 TCP 建連與 TLS 交握的來回次數,光是把連線建起來就要好幾百毫秒。既然延遲來自距離,最直接的解法就是把靜態資產複製到離使用者最近的節點,也就是 CDN,於是架構長到 Level 1:client + CDN + server。
- CCDN:延遲 = 來回次數 × 地理距離,把靜態資產複製到 edge location 是唯一能同時砍每次來回的手段→ 畫地圖
- ESF→NY 光速單程 9ms,實測來回 140–160ms,再加 TCP + TLS 建連要好幾百 ms→ 存+演練
AI 補充這段真正要教的是一個推理姿勢:先算物理下限,再看實際值差多少,差距就是可最佳化的空間。作者的具體數字要打點折——TCP 建立連線是一次來回(SYN、SYN-ACK 之後就能送資料),而 TLS 1.3 把交握壓到一次來回、續連甚至可以 0-RTT,所以現代 HTTPS 大約是兩次來回而不是四次;若走 HTTP/3(QUIC),TCP 與 TLS 的交握還會合併。但這不影響結論:來回次數乘上地理距離就是你付不起的成本,而縮短距離是唯一能同時砍掉每一次來回的手段。也要注意 CDN 在這一階只解靜態資產,動態路徑仍然要回源站,這個缺口是下一段的起點。
術語:network latency
「when it comes to TCP plus TLS that's HTTPS you need at least four round trips」
11. 從白畫面到邊緣運算(scale level 3) 24:28–29:16
動態內容用 React/Vue/Angular 這類框架時,使用者先拿到空 HTML,下載 JS、初次渲染、抓資料、再渲染,中間就是白畫面。SSR 讓伺服器先取資料並預渲染 HTML,使用者立刻看到內容,再靠 rehydrate 補上互動性。但 SSR 又把延遲問題請回來了——每次動態路徑都要回伺服器。於是把渲染搬到 edge functions(跑 Node 之類的執行環境、部署在離使用者近的節點),再把資料庫的唯讀副本也推到邊緣,靜態資產、運算、資料三者都貼近使用者。代價由 CAP 定理說明:既然要 partition tolerance,就得在一致性上讓步,唯讀副本同步有延遲;金融不能接受,社群可以。這就是 scale level 3。





推理因為動態畫面需要框架來管狀態與互動,作者先把純客戶端渲染的成本攤開:使用者拿到的是一份幾乎空的 HTML,只有一個掛載用的 div,接著下載 JavaScript、初次渲染、抓資料、再渲染,中間就是白畫面,使用者可能以為網站壞了而離開。第一層解法是 SSR:伺服器先取資料、預先渲染好 HTML 送出,使用者立刻看到內容,再由 hydration 把互動補上。但 SSR 又把上一段的延遲問題請回來了,因為每個動態路徑都要回源站。第二層解法是把渲染搬到邊緣函式——同樣的程式碼部署在離使用者近的節點。可是邊緣函式仍要回中央資料庫取資料,於是第三層是把資料庫的唯讀副本也推到邊緣。三樣東西(資產、運算、資料)都貼近使用者後,作者用 CAP 定理標出代價:副本同步有延遲,資料可能不是最新的,金融場景不能接受,社群場景可以。這一整套就是 Level 3。
- Cserver-side rendering:伺服器先取資料渲染好 HTML,解 CSR 白畫面;hydration 前看得到按不動→ 畫地圖
- ALevel 1 到 3 是同一招用三次:把資產、渲染、資料依序搬近使用者,每次看「還剩哪段路最長」→ 批判類比
- RCAP 的正確講法:網路分區發生時,一致性與可用性只能挑一個;唯讀副本選可用性、換來最終一致→ 存+回想
AI 補充這一段其實是同一招用了三次:把東西搬近使用者。理解它的關鍵是看每一次搬完之後「還剩哪一段距離沒被解決」——搬完資產剩渲染,搬完渲染剩取資料,搬完資料才收斂。這個「找出剩下那段最長的路」的習慣,比記住 SSR 或 edge function 的定義更有用。要補的是 hydration 的代價:預渲染的 HTML 讓使用者「看得到」,但在 JavaScript 下載並接手之前是「按不動」的,這段空窗會直接反映在第 9 段的 INP 上,也是後來 streaming SSR、islands、React Server Components 這些做法想縮短的部分。至於 CAP,影片的表述繞了一圈,正確的說法是:網路分區發生時,你只能在一致性與可用性之間挑一個;唯讀副本這個設計選的是可用性,換來的是最終一致性。
術語:server-side renderingedge computing
「because we have the partitioning guarantee, we'll use the consistency guarantee」
12. 用快取消除請求 29:16–31:40
可擴展性是「使用者變多而效能不掉、最好連程式都不用改」。作者主張最好的擴展手段是先消除請求,判準是問「哪些資料讀遠多於寫」。商品圖片與標題讀很多寫很少,適合快取;價格與到貨時間則讀寫都頻繁,不適合。CDN 本身就實作了 HTTP 快取,越不常變的資產可以設越積極的快取策略;此外 CDN 還順手做資產最佳化——壓縮通常省下約 25% 傳輸量、圖片轉成 WebP、甚至 JS minification。


推理因為可擴展性的定義是「使用者變多而效能不掉、最好連程式都不用改」,作者主張最有效的擴展是先消除請求,而判斷哪些請求可以消除的問題只有一個:哪些資料讀遠多於寫?回到商品列表頁逐塊看——商品圖片與標題被讀上百萬次卻很少變動,適合快取;價格與到貨時間則讀寫都頻繁,不能這樣處理。接著他指出 CDN 本身就實作了 HTTP 快取,資產送到客戶端時就帶著保存指示,越不常變的東西可以設越積極的策略。他順帶補上 CDN 的另一項紅利:資產最佳化——壓縮通常省下約 25% 傳輸量、圖片轉成 WebP、甚至做 JS minification。
AI 補充「讀寫比」這個判準其實是第 6 段拆實體那條判準的回音:當時把價格、評分、到貨時間從 product 拆出去,理由是它們的變動頻率不同;現在同一份資訊直接決定了誰可以被快取多久。這說明資料建模不是純學術動作,它會一路影響到快取策略與請求量。要補的是快取真正的難題不在設定,而在失效:積極的策略讓過期資料活得更久,所以實務上會把「內容變了就換檔名」(雜湊檔名+長期快取)當成預設,而不是靠縮短快取時間。壓縮那個 25% 也視內容而定——文字類資產壓縮率遠高於此,已經壓過的圖片則幾乎壓不動。
13. API Gateway 與 BFF 31:40–34:34
壓力全落在伺服器上,而後端多半已切成微服務。第一步加 API Gateway:它是反向代理,把 HTTPS、快取、授權這類重複工作集中做一次,對內轉成 HTTP 讓服務間通訊更快。第二步加 BFF(backend for frontend):一個由前端團隊擁有的中介層,按畫面需要的形狀組資料,背後去打各微服務,等於實作 facade pattern。好處是前端不必等微服務排期就能出功能,還能一個 client 一個 BFF(桌機一個、行動一個),這也是前端工程師被期待要有全端知識的原因。



推理因為畫面上每個區塊都要向不同的微服務要資料,作者先加一層 API Gateway:它是反向代理,把 HTTPS、快取、授權這類每個服務都要做的重複工作集中做一次,對內轉成一般 HTTP,讓服務之間的通訊更輕。接著他加第二層 BFF:一個按畫面需要的形狀來組資料的中介層,前端只跟它說「這個畫面要這些東西」,由它去打各個微服務再拼起來,也就是 facade pattern。BFF 的關鍵不在技術而在歸屬——它由前端團隊擁有,所以出功能不必等微服務排期;而且可以一個 client 一套(桌機 BFF、行動 BFF),互不干擾。作者順勢點出這就是前端工程師被期待要有全端知識的原因。
- Cbackend for frontend:按畫面形狀組資料的 facade,由前端團隊擁有,一個 client 一套→ 畫地圖
- RAPI Gateway 解「重複實作」(HTTPS、快取、授權做一次),BFF 解「形狀不匹配」(領域切 vs 視圖切)→ 存+回想
AI 補充這兩層常被混為一談,但它們解的問題不同:API Gateway 解的是橫切關注點(每個服務都要做的事只做一次),BFF 解的是形狀不匹配(後端按領域切、畫面按視圖切)。判斷你需要哪一個,就看你的痛點是「重複實作」還是「前端要打很多支再拼」。BFF 的代價也值得先想清楚:它是一個必須部署、監控、擴展的服務,且每多一個 client 就多一份要維護的程式;當畫面差異不大時,一個 BFF 加參數往往比兩個 BFF 划算。另外 BFF 由前端團隊擁有這件事,其實已經是下一個章節(可維護性與康威定律)的伏筆——它是用組織邊界來換交付速度。
14. GraphQL 與水平擴展(scale level 4) 34:34–36:58
在 BFF 上加 GraphQL,就能用一次查詢取多個資源,直接解掉開頭那個 under-fetching:原本一次瀏覽五支 API,現在變成一次查詢,由 BFF 的 resolver 分頭去取再組成單一 JSON。附帶好處是前端能只要它需要的欄位,對流量敏感的行動使用者特別有利。流量現在集中在 BFF,所以用水平擴展:加負載平衡器,依 round robin 或最少連線數把流量分給多個相同實例。這就是 scale level 4。


推理因為 BFF 已經是「按畫面組資料」的位置,作者在它上面加 GraphQL:前端用一次查詢就取到多個資源,由 BFF 的 resolver 分頭去打各微服務再組成單一 JSON 回傳,原本一次瀏覽五支 API 變成一次查詢。附帶的好處是前端可以只要它需要的欄位,不多不少,對流量敏感的行動使用者特別有價值。至於流量集中在 BFF 的問題,他用最直接的水平擴展處理:加一台負載平衡器,依 round robin 或最少活躍連線數把流量分給多個相同的 BFF 實例。這一套就是 Level 4。
- CGraphQL:一次查詢取多個資源、只要需要的欄位;解的是「形狀」不是「速度」,後端服務一支都沒少→ 畫地圖
- R面試提 GraphQL 要主動說代價:查詢複雜度要限制、快取比 REST 難→ 存+回想
AI 補充GraphQL 解的是「形狀」而不是「速度」——它把多次來回換成一次來回,但後端該打的服務一支都沒少,只是移到 BFF 內部並行處理。也因此它引進了自己的新問題:查詢複雜度需要限制(否則一個惡意查詢可以打爆後端)、快取比 REST 難(不再是一個 URL 對應一份資源,要靠正規化的客戶端快取或持久化查詢)。這些是面試中提到 GraphQL 時值得主動說出來的取捨。水平擴展這邊也有一個前提沒被說破:實例必須是無狀態的,同一個使用者的下一個請求才能被送到任何一台;session 一旦存在實例記憶體裡,加機器就會出錯。
術語:over-fetching
15. 康威定律與微前端(scale level 5) 36:58–39:24
可維護性是「擴充系統有多容易」。就算後端已微服務化,前端仍是單體,而康威定律說組織設計出的系統會複製自己的溝通結構;團隊一大,溝通線就爆炸(3 人 3 條、14 人 91 條),作者舉了一個 45 人開 1.5 小時 daily standup 的真實案例。依貝佐斯的兩個披薩原則要拆團隊,而依康威定律,拆團隊就得拆系統:把前端單體拆成微前端——各自獨立、各自網域、各自發版,由一個 shell 在執行期組起來給使用者看。這是 scale level 5。


推理因為可維護性談的是擴充系統的容易程度,作者先搬出康威定律:組織設計出的系統會複製自己的溝通結構。接著他把「團隊太大」量化成溝通線的數量——3 人 3 條、14 人 91 條,畫面上那張圖讓成長速度一目瞭然——並補上一個真實案例:某公司 45 人共用一個單體應用,每天開 1.5 小時的站立會議,九成內容與你無關。既然貝佐斯的兩個披薩原則說團隊該拆,而康威定律說系統會長成團隊的樣子,那要拆團隊就得先拆系統。於是前端單體被拆成微前端:各自獨立、部署在不同網域、各自發版,由一個 shell 在執行期把它們組起來呈現給使用者。這就是 Level 5。
- CConway's law:系統會複製組織的溝通結構;溝通線隨人數平方成長 → 拆團隊就得先拆系統 → 微前端→ 畫地圖
- E3 人 3 條溝通線、14 人 91 條;某公司 45 人共用單體,每天 1.5 小時站立會議九成與你無關→ 存+演練
AI 補充這段的推理鏈值得單獨記:溝通成本隨人數呈平方成長 → 大團隊必然低效 → 拆團隊 → 依康威定律必須同時拆系統 → 微前端。倒過來看也成立,而且更常用:如果你的系統邊界和團隊邊界對不上,痛苦會出現在每次發版的協調上。微前端的代價作者沒展開,但面試中值得主動提:重複的相依套件會讓總下載量變大、跨應用的路由與狀態共享變複雜、樣式與版本容易失控。這也直接說明了為什麼下一段必須補兩樣東西——沒有那兩樣,微前端會退化成一堆看起來不像同一個網站的應用。
術語:two-pizza teamshell application
16. Design system 與 monorepo 39:24–41:47
微前端拆開後產生兩個新問題。第一是視覺不一致:解法是 design system——一套內部共用的 UI 元件庫,通常以 npm 套件發佈,目標是加快開發(不必每個團隊重刻表單和日期選擇器)與跨微前端的視覺一致。第二是程式品質與人員流動:各自的 repo 會各有 lint 規則、TypeScript 設定、測試環境與套件版本,於是全部收進 monorepo——共用建置系統、共用品質工具、共用套件,甚至共用部署流程(各應用產出 docker image 再由 monorepo 工具一起部署)。這是 scale level 7,擴展的是組織。


推理因為視覺一致性沒了,作者先補 design system:一套內部共用的 UI 元件庫,通常以 npm 套件發佈給所有微前端使用。它的兩個目的很明確——加快開發(不必每個團隊各自重刻表單、日期選擇器)與跨應用的視覺一致。第二個洞是程式品質與人員流動:各自的 repo 會各有 lint 規則、TypeScript 設定、測試環境與套件版本,於是他把所有應用收進同一個 monorepo,共用建置系統、共用品質工具、共用套件,甚至共用部署流程——各應用產出 docker image,再由 monorepo 的工具一起部署到各自的網域。附帶效果是透明度:任何人都能讀到公司幾乎所有原始碼。這一層他稱為 Level 7,擴展的對象是組織。
AI 補充這兩樣東西要一起看,才看得出它們在補同一件事:微前端把系統拆開換取自主,而 design system 與 monorepo 把「該一致的部分」重新收攏,避免自主變成失控。分辨兩者的分工很有用——design system 統一的是使用者看到的東西,monorepo 統一的是工程師碰到的東西。實務上兩者都有代價:design system 需要專責維護,否則會變成沒人敢改的化石;monorepo 需要投資工具(受影響範圍偵測、遠端建置快取),否則 CI 時間會隨 repo 成長線性惡化。要注意的是這裡的 scale level 編號不連續(作者從 Level 5 直接跳到 Level 7),記順序就好。
「that would be our scale level number seven where we scale our organization」
17. 可用性、單點故障與 active-passive 41:47–43:42
可用性靠的是分布模式,而 CDN、負載平衡器、唯讀副本這些為了擴展而加的東西,同時也提高了可用性:任一 edge location、任一實例、任一副本掛掉都能把流量導去其他健康的節點。但負載平衡器與主資料庫本身變成單點故障——一掛全系統倒(DNS 伺服器也是典型例子)。作者補了一個 active-passive 模式:兩台負載平衡器,一台接流量、一台待命,主的掛了立刻切過去。前端工程師不需要會實作,但要有這層心智模型。

推理因為可用性靠的是分布,作者先指出一個順帶的好消息:前面為了效能與擴展加進來的元件本來就有冗餘——CDN 的某個 edge location 掛了可以改導其他節點,負載平衡器後面的實例掛了可以只送給健康的,唯讀副本掛了還有其他副本。但接著他把壞消息點名:負載平衡器與主資料庫本身只有一份,它們是單點故障,DNS 伺服器也是同類。解法是他當作彩蛋補上的 active-passive 模式——放兩台負載平衡器,一台接流量、一台待命,主的失效就立刻切過去。他也提醒前端工程師不需要會實作,但要有這層心智模型。
AI 補充這段的實用價值在於一個檢查動作:對著自己畫的架構圖,逐個元件問「這個只有一份嗎?」凡是只有一份的,就是可用性的天花板。要補的是 active-passive 不是免費的——待命那台平常閒置卻要付費,而且切換需要偵測失效與轉移流量(通常靠健康檢查加虛擬 IP 或 DNS 切換),這段空窗就是實際的停機時間。另一個常被忽略的是:待命節點必須被定期演練,否則真的要切的時候往往才發現它的設定早就過期了。
術語:active-passive pattern
18. 無障礙與資安速查 43:42–46:07
無障礙的做法:一切用語意化 HTML(h1、list、footer 這類),實在做不到才用 aria 屬性,且應是例外不是常態;tab 順序要與畫面視覺順序一致;用 axe 這類外掛在開發階段就測。常見反例是 React 開發者習慣多包一層 div/span。資安則要能講清楚主要攻擊:中間人(用 HTTPS 加密)、XSS(不要執行使用者給的內容,別用 dangerouslySetInnerHTML)、CSRF(重要操作加二階段驗證)、SQL injection(後端用 ORM)、DDoS(流量過濾、Cloudflare 這類大網路、rate limiting)。


推理因為無障礙的大部分收益來自預設值,作者的第一條就是盡量用語意化 HTML,這樣許多無障礙行為是免費的;真的做不到時才用 aria 屬性,而且應該是例外;tab 順序要與畫面的視覺順序一致(用語意化 HTML 通常自然成立);最後在開發階段就用 axe 這類工具測,而不是上線後才補。他點名最常見的反例是 React 開發者習慣多包一層 div 或 span。資安部分他採速查表的形式,要求你能講清楚主要攻擊與對策:中間人(全站 HTTPS)、XSS(不要把使用者內容當程式執行,別用 dangerouslySetInnerHTML)、CSRF(重要操作加第二因素)、SQL injection(後端用 ORM)、DDoS(流量過濾、Cloudflare 這類大型網路、rate limiting)。他也回頭補了一句:CDN 的節點分布本身就讓攻擊者很難打垮系統。
- R無障礙四條:語意化 HTML 優先、ARIA 是例外、tab 順序等於視覺順序、開發期就用 axe 測→ 存+回想
- R資安速查:MITM→HTTPS、XSS→不執行使用者內容+CSP、CSRF→SameSite+token、SQLi→ORM、DDoS→過濾+限流→ 存+回想
AI 補充這兩份清單看起來像背誦題,但有一條共同邏輯值得抓住:預設安全比事後檢查便宜。語意化 HTML 是無障礙的預設值,ORM 的參數化查詢是 SQL injection 的預設值,框架預設跳脫輸出是 XSS 的預設值——這些做法之所以有效,是因為它們讓「做對」比「做錯」更省事。要補兩點:第一,CSRF 的標準對策其實是 SameSite cookie 與 CSRF token,第二因素只適合真正高風險的操作,對每個寫入請求都要求二次驗證並不可行;第二,XSS 的防線除了不執行使用者內容,還包括 Content Security Policy,它是在你不小心漏掉時擋下來的第二層。無障礙的等級(A / AA / AAA)在第 7 段已經提過,這裡的四條做法就是把 AA 拿下來的最短路徑。
術語:man-in-the-middle attack
19. SEO 與前端可觀測性 46:07–48:25
兩個加分題。SEO:前面做的事幾乎全都順便幫到 SEO——SSR 交給爬蟲預渲染好的 HTML、語意化 HTML 讓頁面對爬蟲有意義、Core Web Vitals 高 Google 排名更好。可觀測性是團隊理解系統現況的能力:集中式的 log 與告警(Datadog)、真實使用者監控看實際 Core Web Vitals(Sentry)、產品分析做功能決策與 A/B 測試(Amplitude)、網站分析看轉換漏斗(Google Analytics)、以及處理使用者資料必備的 consent manager。最後把這些分析工具丟給 web worker 執行,主執行緒才不會被拖慢。

推理因為前面的決策已經順帶解決了 SEO,作者只需要把連結指出來:SSR 交給爬蟲的是預先渲染好的 HTML,比空殼容易消化;語意化 HTML 讓頁面結構對爬蟲有意義;Core Web Vitals 高則直接影響 Google 排名。第二個加分題是可觀測性,也就是團隊理解系統現況的能力,他按用途分了五類工具:集中式的 log 與告警(Datadog)、真實使用者監控看實際的 Core Web Vitals(Sentry)、產品分析決定要擴充哪些功能與做 A/B 測試(Amplitude)、網站分析看廣告漏斗與轉換(Google Analytics)、以及處理使用者資料時必備的 consent manager。最後他補上一個效能上的收尾:把這些分析工具丟給 web worker 執行,主執行緒才不會被自己加的工具拖慢。
AI 補充SEO 這段其實驗證了全片的核心主張——好的非功能需求決策會互相加成,而不是彼此交換。同一個 SSR 決定同時買到了首屏速度、可被爬蟲索引與更好的排名;同一個語意化 HTML 決定同時買到了無障礙與 SEO。這也是面試中把「順帶解決了什麼」講出來的價值所在。可觀測性那五類工具的分野值得記牢,因為它們回答的問題完全不同:log 回答「壞了嗎」,RUM 回答「使用者實際體驗多快」,產品分析回答「他們在用什麼」,網站分析回答「他們從哪來、有沒有轉換」,consent manager 回答「我們有沒有權利收這些」。最後那個 web worker 的提醒是全片最後一個閉環:第 9 段說 INP 量的是主執行緒被塞住的程度,而分析工具正是塞住它的常見元兇。
4. 總結
作者的整條推理鏈是這樣接起來的:先主張面試要學的是可遷移的心智模型而非背範例,於是用飛機比喻把需求拆成功能與非功能兩類;功能需求導出低保真 UI 草稿,草稿上逐塊抽出必要狀態並用不可再簡測試驗收,狀態的位置則由「哪裡發生副作用」決定,得到 lifting state 的判準。狀態要打 API,於是把實體按變動頻率拆成五個 REST 資源,代價是一次瀏覽要打五支 API——under-fetching 就此登場,也宣告陽春 client-server 架構的極限。後半段改由非功能需求驅動:先把六項需求列成清單並示範該問哪些問題,再用信封背面估算把「每月 21.1 億次造訪」推成尖峰每小時 1.36 億次頁面瀏覽,證明單機不可能;接著用光速與來回次數證明延遲來自距離,導出 CDN(Level 1);動態內容再走一遍 CSR 白畫面 → SSR → 邊緣運算 → 分散式唯讀資料庫(Level 3),並以 CAP 標出一致性的代價。可擴展性則先用讀寫比決定哪些請求可以被快取消除,剩下的請求交給 API Gateway 收攏共通事務、BFF 按畫面組資料、GraphQL 把五次來回收成一次、負載平衡做水平擴展(Level 4)。最後換維度:康威定律說團隊結構決定系統結構,所以拆團隊要先拆系統 → 微前端(Level 5),再用 design system 補回視覺一致、monorepo 補回工具鏈一致(Level 7);收尾檢查單點故障與 active-passive,補上無障礙與資安的實作清單,並指出 SSR、語意化 HTML、Core Web Vitals 這些決策順帶把 SEO 也解決了。全片的隱含結論是:架構不是一次選好的,而是被一個個非功能需求逼出來的,面試要展示的正是這個被逼出來的過程。
勘誤總整理
確定錯誤/已過時見仁見智(取決於版本或情境)
| 段落 | 原話(transcript 逐字) | 說明 |
|---|---|---|
| 5. 狀態的高度:lifting state 9:02 |
「make sure you start with your state being very global and then raise it as high as necessary but as low as possible」 | 這句把方向講反了。同一段前面的原則是「as low as possible, as high as necessary」——從元件樹最低層開始放,只在有共用需求或副作用需要時才往上抬。照字面「start with your state being very global」做,會得到一份什麼都在頂層的狀態,正是這段要避免的結果。 依據: 同段 8:06 前後作者自己的表述:lifting state is a necessary evil, only if it's really necessary |
| 10. 網路延遲與 CDN(scale level 1) 22:32 |
「when it comes to TCP plus TLS that's HTTPS you need at least four round trips」 | 這是 TLS 1.2 時代的數字。TLS 1.3(RFC 8446,2018)把交握壓到一次來回,續連可用 0-RTT;TCP 本身是一次來回即可送出資料。因此現代 HTTPS 建連約兩次來回,換算約 300 毫秒而非影片說的 600 毫秒;走 HTTP/3(QUIC)時傳輸層與加密交握合併,還會更短。結論(距離造成的延遲要靠縮短距離解決)不受影響,但數字別直接背去面試。 依據: RFC 8446(TLS 1.3, 2018)1-RTT handshake / 0-RTT resumption;RFC 9000(QUIC, 2021) |
| 11. 從白畫面到邊緣運算(scale level 3) 28:19 |
「because we have the partitioning guarantee, we'll use the consistency guarantee」 | 這句把 CAP 的取捨講反了,也和他自己下一句「資料可能不一致」矛盾。CAP 的正確讀法是:分散式系統必須容忍網路分區(P 不是可以放棄的選項),因此在分區發生時只能在一致性(C)與可用性(A)之間二選一。地理分散的唯讀副本選的是可用性,代價是最終一致性。另外 CAP 只描述分區期間的行為,平時的取捨其實是延遲與一致性(PACELC)。 依據: Gilbert & Lynch 對 CAP 的形式化證明(2002);Abadi 的 PACELC(2012) |
| 16. Design system 與 monorepo 41:47 |
「that would be our scale level number seven where we scale our organization」 | 這裡的編號跳號了。影片實際出現過的階層是 Level 0(純 client-server)、Level 1(加 CDN)、Level 3(邊緣運算+分散式資料庫)、Level 4(API Gateway+BFF+負載平衡)、Level 5(微前端),接著直接跳到 Level 7,中間的 2 與 6 沒有對應的畫面。這是自創的教學編號而非業界標準,記住演進順序即可,別把數字當共通語言用在面試裡。 依據: 影片內出現的階層標題投影片(0:45、12:58、24:05、29:05、36:45、39:00) |
5. 推薦三個下一步
1. 往下挖深:把 Core Web Vitals 變成能動手改的清單
影片把 web performance 定為前端系統設計的第一順位,卻只用 LCP/CLS/INP 當量尺,沒說每個指標實際被什麼拖慢、該怎麼量與怎麼修。這是整條推理鏈裡最常被面試官追問細節的缺口。
YouTube 搜尋:Core Web Vitals optimization LCP INP INP debugging long tasks web performance audit Chrome DevTools
2. 往旁邊對照:微前端的反方意見與 modular monolith
影片用康威定律直接推出微前端,但沒有談它的代價(重複相依、跨應用狀態、版本失控),也沒有比較「不拆系統只拆模組」這條路。聽過反方論點,才知道什麼規模下該拆、什麼規模下不該。
YouTube 搜尋:micro frontends downsides modular monolith vs micro frontends module federation problems
3. 往上應用:拿一場完整的前端系統設計模擬面試練手
本片給的是骨架與順序,但沒有示範在時間壓力下怎麼取捨、怎麼回應面試官的追問。看一場真實節奏的模擬面試,能把這套心智模型從「看得懂」變成「講得出來」。
YouTube 搜尋:frontend system design mock interview frontend system design interview news feed senior frontend interview whiteboard
- 接著看 ←15 Frontend Concepts Every Senior Dev Has Mastered · Core Web Vitals、CSR/SSR、hydration、CDN 在那站建立,這站直接拿來當架構決策的輸入
- 接著看 ←Every Frontend Architecture Pattern Explained in 23 Minutes · SSR、CDN、GraphQL、微前端在架構演化站被系統性建立,這站當成可選零件逐層裝上
- 相關 —Frontend System Design Explained w/ Senior Engineer (Microfrontends, Monorepo, MCP UI, Reactjs) · 同一批零件、兩種組織法:一站用驗證時間串起推理鏈,一站用 scale level 逐層加壓
- 接著看 →Real Senior Frontend System Design Interview 2026 (AI Coding Included) · 這站的需求拆解、流量估算與 scale level 順序,在那場完整模擬面試裡被實際跑一次
- 相關 —Top 15 Frontend Interview Questions for 2026 (wa/ Senior Engineer) · 共用 CAP、CDN、edge computing、read replica:一站是分題速答,一站是一條完整推理線
- 相關 —How Senior Frontend Engineers Think in System Design Interviews · 同一場面試的兩面:一站教沒答案時怎麼決定,一站給可以拿來決定的心智模型清單
- 接著看 ←Frontend System Design at Scale (The Senior Dev Playbook) · 把這站的十三項檢查面向,實際套進一題從需求推到微前端的完整案例
- 接著看 ←15 Fullstack Concepts Every Frontend Should Know · TLS、快取、REST/GraphQL、Gateway、BFF 在這站建立,那站直接當零件用
- 接著看 ←How Frontend Engineers can master the Full-stack · CAP、唯讀副本、水平擴展被用進一場完整的系統設計題
- 接著看 →The 3 Skills That Separate Architects From Senior Developers · 那站逐層加壓做出架構決策,這站補上決策要怎麼換算成成本、風險、價值
- 接著看 ←Frontend System Design: Performance API, Chrome, React Profiler · 這站把 web worker 當成待驗證的假設,那站把它當成 scale level 的零件用
- 相關 —Core Web Vitals Explained: LCP, INP & CLS · 面試情境裡會用到這裡的 Core Web Vitals 與 Web Worker 結論
- 相關 —How to scale WebSockets to millions of connections · 共用 load balancer、round robin、fault tolerance、horizontal scaling:一站專講 WebSocket,一站放進完整系統設計
- 相關 —WebSockets Aren’t as Reliable as You Think.. Here's Why · 都談 load balancer、round robin、horizontal scaling,一個在系統設計面試、一個在 WebSocket 實作