最近,有一位New Grads學員收到了HR的面試通知。在歡天喜地的同時,他發現HR發來了這樣一段面試tips:

毫無疑問,HR在這裡告訴這位同學:

概要:

哎,準備好了,你的面試裏有系統設計面試哦

  • 需通過提問、互動的方式釐清面試官的需求
  • 需要提出自己覺得可行的系統實施方案,並說明原因
  • 可能涉及數據結構、演算法、交互等方面的問題
  • 一般不要求代碼實現

系統設計面試,對於毫無工作經驗的應屆畢業生(new grads)來說,是非常難的。由於缺乏大規模分散式系統開發的經驗,求職者在面對系統設計問題時,甚至不知如何破題。

如何準備系統設計面試

1、釐清問題

系統設計面試的核心目的是給應聘者一個展示自己處理複雜系統能力的機會。與 coding 不同的是,系統設計問題沒有絕對正確或錯誤的答案。一個好的系統設計問題通常聽起來模稜兩可,其原因主要是想考察以下內容:

  • 你如何看待問題空間(problem space)
  • 你如何看待瓶頸(bottlenecks)?
  • 你如何消除這些瓶頸(remove these bottlenecks)?

面試例題:

請您設計一個黑匣子,使之可以容納一些物品。

在這個例題中,除了要求其能夠容納一些物品之外,沒有任何其他明確的要求。因此,需要通過提問來釐清面試官的需求。

那什麼是一個「好的」提問呢?一個好的提問可以幫助你做到以下幾點:

  • 幫助你縮小設計範圍;
  • 幫助你瞭解用戶對系統的要求;
  • 給你設計的方向;
  • 告訴你可能存在的瓶頸(bottlenecks)/問題空間(problem space)

比如在這個黑匣子的例子中,你可以問:"盒子裏裝的是什麼?它能容納多少物品?用戶羣體是?"

那麼你可能就會得到一個具體的描述,比如這是一個黃色帶有笑臉的方盒子,最多可容納 1 個網球。但這不是普通的網球,它的半徑大於等於 0.5 米,重約 1 千克。這就意味著這個盒子是被抱著而不是被提著的,因此不需要任何手柄。

因此,問清楚問題非常重要。面試官不會根據你是否在面試中問了一個具體的問題來評判你,而是根據你對問題空間的看法。

例如,如果我現在讓你設計 Twitter,你會怎麼做?你可以花幾分鐘思考一下,然後可以在紙上畫個草圖,儘可能地去涵蓋整體和深入細節,對於我個人來說,我會深入研究 API 設計和後端基礎架構,也會探索一些關於 iphone 特有的問題,也可以討論客戶端如何與中間層端點交互,如何記錄日誌,如何設計後端以確保正常運行時間等等。

2、系統地解決問題

根據我的經驗,在處理一個系統的時我會考慮以下幾個方面:

  • 系統設計目標是什麼?
  • 系統用戶是誰?
  • 系統規模是多大?
  • 這是一個新系統還是舊系統?如何處理版本控制

有了這些問題的答案後,就可以著手處理手頭的問題了,然後系統地將該問題分解成多個部件。

例題

如何設計一個咖啡訂購系統?

在這個題目中,我會思考下面這幾個部分:

  • 這臺咖啡點餐機有什麼作用?
  • 如果我製作了一個點餐機,我應該把它賣給星巴克,還是給它貼上白標(white-label)作為服務出售?
  • 如果我把它賣給星巴克,需要支持多少用戶?
  • 如果我給它貼上白標(white-label),是否將介面賣給點餐服務,再幫助客戶搭建一個後端,以便他們能夠在機器上存儲訂單?

一旦我找到了這些問題的答案,我就能對我的咖啡訂購服務有一個全面的瞭解。我的咖啡訂購服務是軟體即服務(software as a service,SAAS)。它為各種合作夥伴提供了介面。

  • 它有一個名為 addCoffeeForMerchant 的API,參數為咖啡名稱、咖啡價格和咖啡成分。
  • 它有一個名為 getCoffeesForMerchant 的GET API,可以返回指定 merchant ID 的咖啡列表。
  • merchant ID 是使用某種哈希機制生成的唯一標識符(UUID),可以與客戶進一步區分。
  • 該軟體針對只讀操作進行了優化,因為大多數客戶都只會創建一次訂單並在一天內多次讀取。
  • 它使用最近最少使用(Least-Recently-Used)的緩存機制,因為如果客戶長時間沒有下訂單,那他並不關心是否顯示緩慢。
  • 以防其中一個資料庫崩潰,它將在美國西海岸和東海岸的不同集羣中複製數據。

或者,你能想到的任何其他的咖啡訂購服務都是非常好的,這是你在優化問題。我認為這些都非常有趣,因為優化問題,思考解決方案能夠鍛煉你的思維,並讓你的大腦保持專註。

學習資源推薦

1、Intro to:Architecture and Systems Designs :來自前Facebook工程師的關於如何處理系統設計問題的 Youtube教程。網址:t.cn/EzFLeYN

2、Designing data-intensive applications :這是一本書籍,是學習如何設計規模(design pattern)的另一個好資源。它討論了 資料庫(mySQL和noSQL)是如何工作的,什麼時候使用哪一個,各種處理規模技術的利弊等。amazon網上有賣。

3、What every software engineer should know about real-time data』s unifying abstraction - 一個關於日誌和權衡的非常冗長的技術討論。我還沒有完成它,但得到了同事的強烈認可。網址:t.cn/RLftRL4

4、Grokking the System Design Interview :這是一個在線課程,教你如何詳細設計分散式系統,但課程並不是免費的。網址:t.cn/EzFLKUT

5、九章演算法《系統設計班》:這是一個在線直播課程,全面講解矽谷IT企業系統設計面試的考點,並結合矽谷IT企業工程實例進行講解,如twitter, uber, intagram, google drive設計等。網址:t.cn/EzFyZUH

歡迎關注我的微信公眾號:九章演算法(ninechapter)。

精英程序員交流社區,定期發布面試題、面試技巧、求職信息等。


推薦閱讀:
相關文章