Fermi Estimation
為什麼要考費米估算?
Fermi estimation 的考試用意是考驗面試者的問題解決能力跟領域相關知識,也為你的設計奠定量化基礎(有數字支撐)
在很多情況下,你不會有現成的答案跟具體的數字,你必須依賴假設跟估計來輔助你的決策,能夠快速精準的進行估算,展現了工程師的經驗老道,能夠傳達強烈的“有能力”訊號
在這種面試題目中,考官會提出沒有正確答案的問題,並觀察你的反應:
- 你會怎麼處理無標準答案的問題?
- 你怎麼做出合理的估算跟你是否知道要問什麼問題來確認有哪些變因、有哪些要估算?
- 你是否能夠一步步、有條不紊的解決複雜的問題?
- 你是否能夠說明你的思路,你怎麼一步步得到答案的?
這類問題的重點不是精確程度,而是解題思路
有估計作為基礎的設計可以傳達更強烈的訊號表現你的經驗跟資深程度
費米估算於系統設計
假設我們要設計一個新的線上影片平台,一個可參考的作法如下
- 找出要估算什麼:哪個數字是至關重要的?可能是一年所需的存儲空間
- 分解問題:分而治之,用戶數量?每個用戶上傳的影片數量?每個影片的平均大小?
- 帶入先驗知識:假設用戶為 100 萬,每個人每個月平均上傳一個五分鐘的影片,而一分鐘的高清影片約 100 MB
- 保持簡單,用戶 100 萬,每個用戶一年上傳 12 個影片,一個影片 500 MB
- 確認答案,100萬用戶 × 12影片/年 × 500MB = 6,000,000,000 MB = 6,000 TB = 6 PB
以下針對每個步驟進行詳細說明
估算什麼?
在有些面試相對單純,考官會直接告訴你哪裡需要量化估算,但有時不會,一個好策略是找出最重點的地方然後投資在上面
舉例來說,設計一個 X 的搜尋,最難的部分是 search index 怎麼處理,如果想不到的話,可以從關鍵服務(Ex: DB)的讀寫吞吐量、系統的總儲存量(記憶體&硬碟)來著手
分解問題
一個作法是 Dimensional Analysis,學術定義是「等式兩邊的物理量必須具有相同的因次」,我的理解是「單位」要能夠彼此轉換並且一致,以剛剛 X 的例子,我們可能有每日活躍用戶數(users/day)、用戶平均每日發文數(tweets/user/day)、每條推文的字數(characters/tweet),經過計算後我們可以得到總存儲需求(storage/day)
透過 Dimensional Analysis,我們可以得知在上述範例中我們使用的單位都是可以相互轉換的,也就是說上面得出的結果是「合理」的,我們可以進一步帶入實際數字下去計算
帶入先驗知識
我們假設用戶是 1,000,000,每個用戶平均發五篇文章,每篇文大約有 140 個字,套用剛剛的公式,我們可以計算出
\[1{,}000{,}000 \text{ users/day} \times 5 \text{ tweets/user/day} \times 140 \text{ storage/tweet} = 700{,}000{,}000 \text{ storage/day}\]我們可以再具體一點,假設每個字都是 utf-8,每個字平均使用 3 bytes
\[700{,}000{,}000\ characters \times 3\ bytes = 2{,}100{,}000{,}000\ bytes \approx 2.100\ TB\]就可以得出每日會需要 2.1 TB 的空間
保持簡單
收斂成簡單的幾個指標或數字,比如說考官可能會問你 1 年需要的空間,雖然你可以直接 $2.1 \text{ TB} \times 365$ ,但情況可能更複雜,我們其實可以簡化為 $2\ TB \times365$ 就好
確認答案
我們可以回顧自己的思路跟答案,看有沒有什麼錯誤跟不合理的地方
常見的錯誤是
- 估算不重要的東西
- 陷入數學困境,用簡單數學計算就好,搞得太複雜你自己卡住就很尷尬
- 數字理解嚴重錯誤,你認為網路比 Disk 讀寫更快或 GB 等級的資料內存不能處理,這種基礎錯誤會導致考官對你印象大扣分
大量的練習會讓你更擅長估算,可以參考這本書〈世界上有多少隻貓?:超速估算出一切事物,讓你看清大局的數字反應力〉