年薪三百萬軟體工程師的歷程 第三集 系統設計面試

2021年9月4日 07:37
第一集:
第二集:
花了點時間準備之前面試的資料 這次第三集講的是系統面試 System Design 題目類型很直接 面試官會請你設計一個軟體 要你把框架講出來 例如: 請設計一個像fb的交友軟體 設計一個IG圖片分享軟體 設計一個疫苗預約網站 等等 題目可以各種天馬行空 一開始看到一定會覺得 這麼難的題目 一個FB多少工程師一起寫出來的 我自己一個人 要在一個小時設計出FB 到底要怎麼設計 而在我開始準備兩個禮拜之後 我發現這是內容最多 但是也是最好準備的面試 你只要把需求問清楚 清楚的流程講一遍 以及任何問題 都能唬爛出一個合理的答案 你就可以很成功的過這關 這感覺好像很簡單 而實際上練習幾次之後以及看過其他人的流程 你會發現 這跟前面的面試不一樣 程式面試常常要求答案要能全解出來 而且要用最有效率的解法 有時候面試官還會提一些test case 能夠寫得出來才能到下一輪 系統面試 考驗的是你對整個系統的架構 你不需要把程式寫出來 而是能夠逐步把程式架構畫出來 並且面對不同突發問題 提出有效的解決辦法 下面會先提供準備資料 然後再講面試流程 如何有效地走完一遍 1. 準備資料: 閱讀量非常龐大 而且需要 很多是Parallel Computing Database Horizontal Scaling的基礎 學校沒上過也沒關係 下面資料會足夠讓你準備面試 我自己是大概花了一個月 回家周末讀資料 平日上下班一小時交通時間 聽影片資源 面試模擬 一開始聽一定聽不懂 把不會的字 詞 關鍵字 寫下來 再去尋找 我自己建議是先把閱讀資料讀過一遍 再來看影片會比較清楚 1.1 閱讀資料 基本快速介紹的影片
這個影片會先快速帶你過一遍 設計流程會遇到的問題 接著是大量的閱讀 可以從這邊開始 選項1: 基礎資料以及深入學習 推薦給一個月以上準備的人
中文:
選項2: 快速基礎介紹及準備 推薦給只有兩個禮拜準備的人
其他資料
這個github project把基本的流程講得很仔細 每一個topic都還有連結額外細講 我自己是不懂的部分 會把額外連結一起讀一遍 有些影片部分如果太長 或是有課程 我會先跳過 先去閱讀資料 細節非常多 我這邊先只列裡面的大標題: (Optional部分是我自己比較少遇到 如果快面試可以先跳過 有時間再回來看) Performance vs Scalability Latency vs Throughput Availability vs Consistency - CAP Consistency Pattern Availability Patterns Domain Name System Content Delivery Network Load balancer / (optional) Reverse Proxy Application layer Database (Relational vs NoSQL) Cache Asynchronism Communication (REST/SOAP) (HTTP/UDP/TCP) 1.2 影片資源 下面這兩個影片是我覺得分析的最好的 可以直接跳到後面聽面試官講解 可惜影片現在改成私人的 可以參考逐字稿 我在第二部分面試過程的步驟 大部分也是參考這邊 Charity Donation
逐字稿
Video Upload API
逐字稿
Google系統面試模擬 設計程式上傳系統
設計IG
1.3面試前準備 這是上面提過的連結 其中有一些細節面試流程
面試模擬影片 有多餘的錢也可以在這上面請個面試官幫你模擬面試 我自己是直接看上面影片學
實作資料準備
其他實例參考資料
2 面試流程 面試開始時 面試官會給題目 譬如說 要你設計IG 下面是我總結的步驟 我筆記是英文的 下面會盡量翻譯 如果翻不好可以隨時提出修改 或是可能我講錯或是模糊的部分 也歡迎更正 2.1 Requirement 需求 在開始講你的設計之前 這是最重要的一步 這跟上一輪 OOP設計一樣 你要了解顧客想要的是什麼 而需求部分分成兩種 Functional Requirement Non Functional Requirement 面試時可以先在空白處寫下這兩個標題 Functional Requirement 下面最常問的問題: - 多少使用者 - 讀寫比例,數量: 每年或每月讀寫數 - Location 地點 程式使用地點 只有台灣/美國 還是全世界 - API - 有哪些服務會有第三方API (例如身分驗證) - 資料需要存多久 - 需要存哪些資料 - 支援的功能 (加好友, 動態, 影片上傳, 圖片上傳) 通常面試官在這邊侷限你要設計的內容 可能只會要求像是只要設計動態就好 建議在前面先問出來 幫助後面設計 如果忘記問可以再回來問 Nonfunctional Requirement - Consistency 資料庫的同步率 資料庫存入後多久會全部更新 - Availability - 一年容許多少down time
熟悉two-nine, three-nine, four-nine 面試時直接問面試官他要求幾個nine 這部分會讓你面試加分 - Partition Tolerance 分區容錯性 資料庫分區的一致性 - CAP 上述三樣選哪個 基本上只能在C跟A之間做取捨 P是必須要保證的 資料不能出錯 - ACID 通常光講CAP部分並不夠完整 可以再繼續補充 分為 atomicity 不可分割性 consistency 一致性 isolation 獨立性 durability 持久性 這部分也只要提一下說要database要遵守ACID就行了 - Scalability 可擴展性 這邊可以先提 後面資料庫再詳細設計 上面步驟建議10分鐘內能問完 有時候也要看面試官會不會補充 可能會比較久 2.2 Calculate data bandwidth and storage 計算你總共需要的流量以及儲存空間 根據你問出來的需求來計算 1m per day = 11.5/ sec (建議背起來) Data Storage 1m * 100kb = 1mb *100 * 1000 = 100gb/day = 36500gb / year = 36.5tb / year * 5 = ~200tb 5 year storage Dataspeed 11.5 * 50 bytes 這部分能計算越快越好 建議可以自己多練習熟悉這些計算 2.3 function call 這部分根據你的需求 寫出一些會用到的function 例如: 讀取朋友資料 request(userID, image, loc x, loc y, timestamp (4bytes), text) 加好友 RequestFreind(userID 1, userID 2) 可以想像平常用FB會使用什麼功能 會用到那些資料 這會幫助你下一個步驟 資料庫設計 2.4 Database Schema 資料庫 根據你上面傳輸的資料 決定要儲存的資料以及如何儲存 最簡單的話是可以用relational database 結構可以寫出來 userID1(keyID), photoID timestamp text photoID, photoPath, timestamp, location 結構也可以考慮用 No-SQL graph type 根據題目不一樣 結構也會不同 常常題目也會用到混合的資料庫 要熟悉不同題型可以參考1.3部分的資料 接著也要考慮database 要怎麼分 做哪種 sharding (詳見1.1資料) 細節放在下部分畫圖時說 2.5 Graph 結構圖 一開始一定不要把全部元素加進去 這邊開始會用到許多1.1部分 首先先畫個簡單的圖 建議按照這個流程說 通常這部分面試官也會在畫的時候 提出一些問題或需求 根據需求來更改 2.5.1 client-> webserver-> database 最簡單的伺服器 從客戶端傳到伺服器傳到資料庫 2.5.2 client->load balancer->webserver->database 這邊提到由於大量讀寫存取 所以需要加個load balancer 來分流 webserver也可以畫個兩三個來顯示分流 2.5.3 client -> load balancer ->frontend server->backend server -> cache-> database 這邊慢慢開始把一些細節零件加進去 首先分成前端後端來分散資料處理以及顯示 前端後端中間可以再增加load balancer 來分流 database 前面加個cache減少database讀取 主要可以先讀取cache 2.5.4 資料庫存取選擇 Metadata - - 根據前面CAP 需求所做的選擇 - (if consistent use SQL) , - (if availability use noSQL) Large object 大型資料 例如圖片影片 - bject storage ex: amazon s3 資料庫備份 master replica 資料庫分割 DB sharding - Vertical -> data type - Horizontal -> zip code, alphabet - Consistent hashing 2.5.5 Cache policy Cache可以直接提memcache或是rediscache 然後選擇如何儲存 -Write through -> write both at the same time, when need consistency -Write around -> doesn’t write to cache -Write back -> write to cache first, write to db later, when write heavy 2.5.6 Cache Eviction 移除方式選擇 -LRU -LFU 2.5.7 額外需求 面試官可能會提出額外需求 像是如果今天要改成服務全世界 要怎麼改變設計 這時候可以增加伺服器 資料庫數量 使用CDN 再根據問題提供不同解答 這時候就會用到1.1所提到的各種資料 2.6. 最後建議 在這過程中都是邊說邊寫或邊畫 不要停下來 拼命唬爛 面試官有問題都會停下來問你 基本上 簡單說就是拼命唬爛 總結: 各位抱歉 我知道我寫得有點亂 很多細節的概念也沒提及 要寫可能也寫不完 我主要想先分享面試時的步驟 再根據這個步驟來準備資料 很多部份我自己也還在學 希望能夠幫助到各位 也歡迎一起討論 之後有時間考慮的會分享的內容 -刷題實作 在面對困難或不會的題目 如何想出不同解法 慢慢縮減出有效率解法 -CS基礎工具 terminal/cmd cli 基礎linux指令 想分享給各位如何熟悉這些指令 曾經我也對下cmd一竅不通 -系統設計細節概念 由於這次只講了一些大概 細節部分也都沒有說 會考慮之後再補充 希望各位有一天也能轉職成功!
99
留言 16
文章資訊
4 篇文章326 人追蹤
Logo
每天有 182 則貼文
共 16 則留言
有沒有 blog 或是 Markdown 格式啊,想轉錄到自己的收藏庫……
B1 抱歉網站目前還在緩慢架構中😅😅 我推薦的話可以先收藏上面的連結 特別是github那個 整理的比較有條理 這些資料目前也是 從我之前準備面試的時候 紀錄的google doc 整理出來的 那個檔案非常的亂😅😅 那個google doc非常的亂 到時候網站上會更細節整理
輔仁大學
感覺分享到ptt 上會有更多人看到~謝謝樓主分享!
國立臺北大學
先收藏 謝謝🙏🏻
弘光科技大學
在台灣要主管階級還是經理才有這種錢吧…
B5 如果不是主管階級 像第一集 留言 彼得 提到 手指頭數的出來 Google Amazon Facebook Microsoft 台灣可能其他大硬體廠也有機會 這邊以軟體為主 詳細可以上levels.fyi上找 這篇目的其實跟第一篇github原作者一樣 分享一些心路歷程 讓大家也可以朝這方向努力 原作者他自己是花了8個月時間之後上了 我的話是先去小公司 一邊訓練軟體基礎一邊準備 在小公司兩年之後跳槽才達到目標
佛羅里達大學
出國大學畢業第一年就年薪三百萬了
B6 竟然被 cue 了,我記得 Google 要 L4 才能摸到 3M 喔 影片:
還有如果對其他軟體有興趣這篇也抓的蠻準的:
但是可能有點過期
B8 出現了!! 感謝回覆補充 最近也開始看你的歷程分享 非常用心!
國立政治大學
原po 好猛 ⋯ 剛當純軟後端junior 真的覺得自己跟屎一樣XD 有目標追了哈哈哈
B10 別這樣說 一開始都有成長期 大家也都是從不會慢慢學會的 一起加油 鼓勵可以先從現在工作上的程式學
什麼都不懂 不過看起來好像很厲害 推一個
匿名
這則留言已被刪除
已經刪除的內容就像 Dcard 一樣,錯過是無法再相見的!
B12不懂的話可以先從第一集看起 或是第一集有問題的地方也可以發問
B14 感謝支持 也去看了你分享的文章 很多很有幫助的內容!