系統設計面試模擬 | 如何設計Netflix?

九章演算法發表於2017-09-27

專欄 | 九章演算法
網址 | www.jiuzhang.com

工程師們害怕系統設計面試,是因為我們在學校專案甚至在工作期間並不會做大型的系統設計,也很少有機會從頭開始搭建一個可擴充的系統。通常情況下,我們都是加入一個成熟的團隊,負責為指定元件實現功能。我們會花費大部分時間修復bug,優化程式碼和測試資料。

但是,當面試官要求你在45分鐘內設計大規模分散式系統時,你需要指出高層元件並描述它們之間如何互動的,而不是花時間說明如何通過避免緩衝區副本的方式來減少20毫秒反應時間的。

怎樣在45分鐘之內設計出Netflix

通常面試官會要求你在45分鐘內設計Netflix(或支援數億使用者的某種彈性服務)。這個問題看似無法完成,因為 45分鐘太短,根本無法詳細討論其中任何一個模組。這些服務是由成百上千名工程師耗時多年開發完成,你是不可能把所有這些工作簡明扼要的寫在5x5的白板上的。

既然完成這個問題基本是不可能的,那麼面試官到底想知道些什麼?其實他希望你給他一個的概述,定義高階模組,並儘可能簡潔地描述元件之間的互動。大概分三個階段:

  1. 畫一個大框架來表示系統

  2. 放大框架並把它打散變成5-6個模組

  3. 簡要討論每個模組的功能。計算,儲存,前端,後端,快取,佇列,網路,負載均衡等

你的面試會官會指定一兩個模組並希望你詳細討論,大部分時候他不指望你寫任何程式碼。

那麼面試中常犯哪些錯誤呢?

亂用術語

你可能覺得對於抽象層面的設計,大概在設計面試的時候胡扯就可以了。千萬不要這樣想! 你的面試官正在選擇的可是未來可能每天和他一起工作的同事,任何有經驗的面試官都會注意那些隨便說像是“No-SQL”,“Mongo DB”和“Hadoop”這些術語的人,你要隨時準備好他會問更多的細節和為什麼你選擇這些技術。如果你沒有深刻理解或著沒法證明和支援你的方法的時候,不要用比如 “GraphQL”這樣的術語或很潮的技術。

假裝你是某個方面的行家

我聽說過一些非常尷尬的情況,應聘者假裝是一個行家,但是最後發現,面試官正是該領域的知名專家。

在2006年,我面試微軟,我的面試官問我是否實現過B樹。我告訴他,我知道B樹是什麼,用於資料庫,其他不記得了。他於是換了話題。後來我發現我的面試官是James Hamilton,他是資料庫和分散式系統中最重要的專家。之後幾年,我要為微軟的Azure實現B+樹(大型B+樹儲存了TB的資料,現在我對B+樹略知一二。即便是現在,我也不敢對 James Hamilton 說我知道B+樹是什麼。)

在面試別人的時候,曾經一個應聘者告訴我他在某個程式碼庫中實現了某些功能。他不知道我加入團隊之前,曾經在那個程式碼庫上工作過。我試探了他一下,意識到他僅僅實現了程式碼庫的客戶端,並不像他說的一樣做了那麼多。

上面的事並不常見,下面的事更有可能發生:

  1. 你的面試官可能正在做你談論的技術,可以很容易地區分冒牌者和專家。
  2. 他可能已經問過了這個問題上千次,精通可能的解決方案,他一下就知道你真正理解多少。

所以千萬不要假裝是一個專家。面試你的人一定比你更瞭解這個領域,甚至可能是業界專家。

即使是熟悉的領域,也不要急於求成

熟悉的領域對你有利,但是也不要急於求成,一下跳到你知道的解決方案,所以你要做這三件事:

  1. 收集要求。
  2. 多問問題。你的面試官對你的思考過程更感興趣。
  3. 評估多個解決方案,討論利弊。

無論你是否瞭解這個領域,這樣做都有利於你的面試結果。

錯誤回答典例

(宣告:以下是一個假設的對話,如有雷同純粹巧合)。

面試官:讓我們實現Twitter。你要如何儲存所有的tweets?

候選人:我要使用NoSQL資料庫比如MongoDB。

面試官:為什麼不用MySQL?

候選人:RDBMS不可擴充套件。我們需要一個可擴充套件的資料庫,比如MongoDB或BigTable。

面試官:但是我們在Twitter儲存我們在MySQL中的所有tweets,它的擴充套件性非常好。

候選人:嗯,那也許你的規模不是那麼大。當需要更大規模的服務的時候,比如Facebook,就要使用NO-SQL解決方案。

面試官:但Facebook也使用MySQL。

候選人:我不知道他們如何擴充套件,我必須再做做功課。也許他們用MySQL由BigTable支援前端。

面試官:那好吧。我們應該在哪裡儲存我們的分析資料?

候選人:顯然在MySQL。

面試官:但是對MySQL來說太多了。我們在HDFS中儲存。

候選人:可能你們在MongoDB成熟之前搭建的Twitter。 MongoDB可以輕鬆處理tweets和分析資料。

面試官:好的,謝謝你的時間,和你交談很愉快。

如何找SDE面試資源?

如果你正在找一個準備系統設計面試的資源

看看最新發布的課程Grokking系統設計面試(Grokking the System Design Interview),它涵蓋分散式系統的基礎知識,並有互動課程,涵蓋如何設計 Instagram,Dropbox,Twitter,Facebook Messenger,Youtube ,Facebook Post Search,Typeahead,Web crawlers,Yelp和Uber / Lyft。另外,還推薦九章演算法的《系統設計班》,課程涵蓋:

資料系統設計、爬蟲系統與搜尋建議系統、Tiny URL 設計、Google 三駕馬車(Big Table / Google File System / MapReduce)、分散式系統設計、WhatsApp聊天系統設計、實時位置資訊系統等。

如果你準備程式設計面試

請看看 Coderust 2.0: Faster Coding Interview Preparation using Visualisations。它有80多個Python,Java,Javascript,C++和Ruby程式碼的問題。每個問題都有互動式的視覺化來解釋每個步驟,以便你實際上理解解決方案,而不僅僅是記住它們。另外,實踐出真知,還推薦你在lintcode.com上實戰程式設計面試題,他支援 C ++, Python, Java 語言,並且有程式碼風格檢測功能。

認為你已經準備好了,但需要一些練習

可以安排模擬面試(Mock Interview)。

推薦資料

Grokking the System Design Interview

九章演算法《系統設計班》

Coderust 2.0: Faster Coding Interview Preparation using Visualisations

Lintcode Online Judge



推薦閱讀


歡迎關注我的微信公眾號:九章演算法(ninechapter)。
精英程式設計師交流社群,定期釋出面試題、面試技巧、求職資訊等

九章演算法,IT教育領域的深耕者
九章演算法,IT教育領域的深耕者

相關文章