##一、定義 **使用原型實例指定待創建對象的類型,並且通過複製這個原型來創建新的對象。原型模式是一種創建型模式。** ##二、描述 **包含以下三個角色:** ![](https://img2023.cnblogs.com/blog/1780813/202305/1780813-202305271 ...
3 系統設計面試
你剛剛獲得了夢想公司夢寐以求的現場面試機會。HR給你發來了當天的日程安排。掃了一眼名單,你感覺良好,直到你的目光落到了這個面試環節--系統設計面試。
系統設計面試通常讓人望而生畏。可能是"設計一款知名產品 X"這樣含糊不清的問題。問題模棱兩可,似乎寬泛得不合理。你的疲憊是可以理解的。畢竟怎麼可能有人會在一小時內設計出一款流行產品,而這款產品可是花費了成百上千名工程師的心血?
好在沒人指望你能做到。現實世界的系統設計極其複雜。例如,谷歌搜索簡單得令人難以置信;然而,支撐這種簡單性的技術之多卻著實令人吃驚。如果沒人指望你在一小時內設計出一個真實世界的系統,那麼系統設計面試又有什麼好處呢?
系統設計面試模擬現實生活中的問題解決方式,讓兩個同事合作解決一個模糊的問題,並提出符合他們目標的解決方案。問題是開放式的,沒有完美的答案。與你在設計過程中所付出的努力相比,最終的設計並不那麼重要。這可以讓你展示你的設計技巧,為你的設計選擇辯護,並以建設性的方式回應反饋。
讓我們換位思考一下,當面試官走進會議室與你見面時,她的腦子裡在想些什麼。面試官的首要目標是準確評估你的能力。她最不願意看到的是,由於會議進行得不順利,沒有足夠的信號,而給出不確定的評估。面試官在系統設計面試中需要註意什麼?
很多人認為,系統設計面試就是考察技術設計能力。其實遠不止這些。有效的系統設計面試會發出強烈的信號,顯示一協作能力、在壓力下工作的能力以及建設性地解決模糊問題的能力。提出好問題的能力也是一項基本技能,許多面試官都特別看重這項技能。
過度工程化是許多工程師的通病,因為他們樂於追求設計的純粹性,而忽視了權衡利弊。他們往往沒有意識到過度工程化系統所帶來的複合成本,而許多公司都為這種無知付出了高昂的代價。你肯定不想在系統設計面試中表現出這種傾向。其他警示還包括思想狹隘、固執己見等。
在本章中,我們將介紹一些有用的技巧,並介紹一個簡單有效的框架來解決系統設計面試問題。
3.1 有效系統設計面試的四步法
每個系統設計面試都是不同的。優秀的系統設計面試是開放式的,沒有放之四海而皆準的解決方案。不過,每次系統設計面試都有一些步驟和共同點。
3.1.1 步驟1理解問題並確定設計範圍
"老虎為什麼吼叫?教室後面有人舉起了手。"是的,吉米?"老師回答道。
"因為他餓了"。
"很好,吉米"
在吉米的童年裡,他一直是班上第一個回答問題的人。每當老師提問時,教室里總有一個孩子不管自己是否知道答案,都喜歡搶著回答問題。這就是吉米。
吉米是個王牌學生。他以快速知道所有答案為榮。在考試中,他通常是第一個答完題的人。在任何學科競賽中,他都是老師的首選。
不要像吉米一樣。
在系統設計面試中,不假思索地快速給出答案不會給你加分。在沒有透徹理解要求的情況下回答問題會讓人大跌眼鏡,因為面試不是小題大做。沒有正確的答案。
因此,不要馬上就給出解決方案。放慢速度。深入思考並提出問題,以澄清需求和假設。這一點非常重要。
作為一名工程師,我們喜歡解決棘手的問題並立即投入最終設計;然而,這種方法很可能會導致你設計出錯誤的系統。作為工程師,最重要的技能之一就是提出正確的問題,做出適當的假設,並收集構建系統所需的所有信息。因此,不要害怕提問。
當你提問時,面試官要麼直接回答你的問題,要麼要求你做出假設。如果是後者,請在白板或紙上寫下你的假設。您以後可能會用到它們。
問什麼樣的問題?提問是為了瞭解確切的需求。以下是一份問題清單,可以幫助你開始提問:
- 我們要構建哪些具體功能?
- 產品有多少用戶?
- 公司預計以多快的速度擴大規模?預計3個月、6個月和1年後的規模是多少?
-公司的技術棧是什麼?您可以利用哪些現有服務來簡化設計?
3.1.1.1 舉例說明
如果要求你設計一個新聞推送系統,你需要提出一些有助於明確需求的問題。你和麵試官之間的對話可能是這樣的:
- 應聘者:這是移動應用程式嗎?還是Web應用?還是兩者都要?
- 面試官: 都是。
- 應聘者:產品最重要的功能是什麼?
- 面試官 發佈帖子和查看好友新聞推送的功能。
- 候選人:新聞推送是按時間倒序還是特定順序排列的?特定順序意味著每個帖子的權重不同。例如,來自好友的帖子比來自群組的帖子更重要。
- 面試官 為了簡單起見,我們假設信息源是按時間倒序排序的。
- 候選人:一個用戶可以有多少個好友?
- 面試官 5000
- 應聘者:流量是多少?
- 面試官 1000萬日活躍用戶(DAU)
- 應聘者:Feed可以包含圖片、視頻,還是只有文字?
- 面試官:可以包含媒體文件,包括圖片和視頻。
以上是您可以向面試官提出的一些示例問題。重要的是要理解需求並澄清模糊之處
3.1.2 步驟2提出高層次設計並獲得認同
在這一步中,我們的目標是制定一個高層次的設計方案,並與面試官就設計方案達成一致。在此過程中,與面試官合作是個好主意。
-
提出設計的初步藍圖。征求反饋意見。把面試官當作隊友,一起工作。許多優秀的面試官都喜歡談論和參與。
-
在白板或紙上繪製包含關鍵組件的框圖。這可能包括客戶端(移動/網路)、API、網路伺服器、數據存儲、緩存、CDN、消息隊列等。
-
進行包絡(back-of-the-envelope)計算,評估你的藍圖是否符合規模限制。
如果可能,請舉出幾個具體的使用案例。這將有助於你確定高層次設計的框架。這些用例還可能幫助你發現尚未考慮的邊緣情況。
我們是否應該在這裡包含應用程式介面端點和資料庫模式?這取決於問題的具體情況。對於像"設計Google搜索引擎"這樣的大型設計問題來說,這有點太低級了。而對於為多人撲克游戲設計後臺這樣的問題來說,這倒是可以考慮的。與面試官溝通。
3.1.2.1 舉例說明
讓我們用"設計新聞源系統"來演示如何進行高級設計。在這裡,你不需要瞭解系統的實際工作原理。第11章將解釋所有細節。
在高層,設計分為兩個流程:新聞源發佈和新聞源構建。
- Feed發佈:當用戶發佈帖子時,相應的數據會被寫入緩存/資料庫,帖子會被填充到好友的新聞源中。
- Newsfeed構建:按時間倒序聚合好友的帖子,構建新聞源。
參考資料
- 軟體測試精品書籍文檔下載持續更新 https://github.com/china-testing/python-testing-examples 請點贊,謝謝!
- 本文涉及的python測試開發庫 謝謝點贊! https://github.com/china-testing/python_cn_resouce
- python精品書籍下載 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
- Linux精品書籍下載 https://www.cnblogs.com/testing-/p/17438558.html
- https://www.drawio.com/doc/faq/
3.1.3 步驟3深入設計
在這一步,您和您的面試官應該已經實現了以下目標:
- 商定總體目標和功能範圍
- 勾勒出整體設計的高層次藍圖
- 獲得面試官對高層次設計的反饋意見
- 根據面試官的反饋,對深入設計的重點領域有了一些初步想法
您應與面試官一起確定架構中的組件並確定其優先順序。值得強調的是,每次面試都是不同的。有時,面試官可能會暗示她喜歡關註高層設計。有時,對於資深候選人的面試,討論的可能是系統性能特征,重點可能是瓶頸和資源估算。在大多數情況下,面試官可能希望你深入探討一些系統組件的細節。對於URL縮短器,深入探討將長URL轉換為短URL的哈希函數設計很有意思。對於聊天系統,如何減少延遲以及如何支持線上/離線狀態是兩個有趣的話題。
時間管理至關重要,因為您很容易被細枝末節所迷惑,而無法展現自己的能力。您必須準備好向面試官展示自己的信號。儘量不要涉及不必要的細節。例如,在系統設計面試中,詳細談論Facebook feed排名的EdgeRank演算法並不理想,因為這會耗費大量寶貴時間,也無法證明你設計可擴展系統的能力。
3.1.3.1 示例
至此,我們已經討論了新聞源系統的高層次設計,面試官對你的建議很滿意。接下來,我們將研究兩個最重要的用例:
-
Feed發佈
-
新Feed檢索
圖3-3和圖 3-4顯示了這兩個用例的詳細設計,第11章將對此進行詳細說明。
3.1.4 步驟4總結
在最後一步,面試官可能會問你一些後續問題,或者讓你自由討論其他問題。以下是一些應遵循的方向:
- 面試官可能希望您找出系統瓶頸,並討論可能的改進措施。永遠不要說你的設計是完美的,沒有什麼可以改進的。總有一些地方需要改進。這是展示您的批判性思維並給面試官留下良好印象的絕佳機會。
- 給面試官總結一下你的設計可能會有幫助。如果您提出了一些解決方案,這一點尤為重要。在長時間的討論後,讓面試官恢復記憶會很有幫助。
- 錯誤案例(伺服器故障、網路丟失等)值得一談。
- 運營問題值得一提。如何監控指標和錯誤日誌?如何推出系統?
- 如何處理下一個規模曲線也是一個有趣的話題。例如,如果您當前的設計支持100萬用戶,那麼要支持1000萬用戶,您需要做出哪些改變?
-如果您有更多時間,請提出您需要的其他改進措施。
最後,我們總結了一份"該做"和"不該做"的清單。
3.1.4.1 應該
- 始終要求澄清。不要認為你的假設是正確的。
- 瞭解問題的要求。
- 既沒有正確答案,也沒有最佳答案。為解決年輕初創公司的問題而設計的解決方案與為解決擁有數百萬用戶的成熟公司的問題而設計的解決方案是不同的。確保瞭解需求。
- 讓面試官知道你在想什麼。與面試官溝通。
- 如果可能,建議採用多種方法。
- 與面試官就藍圖達成一致後,深入瞭解每個組件的細節。先設計最關鍵的部分。
- 與面試官交流想法。好的面試官會把你當作隊友來合作。
- 永不放棄。
3.1.4.2 不應該
- 不要對典型的面試問題毫無準備。
- 在未明確需求和假設之前,不要貿然提出解決方案。
- 不要在一開始就對單個組件進行過於詳細的介紹。先給出高層次的設計,然後再深入研究。
- 如果遇到困難,不要猶豫,尋求提示。
- 再次,溝通。不要在沉默中思考。
- 不要以為給出設計方案後面試就結束了。直到面試官說你完成了,你才算完成。儘早並經常征求反饋意見。
3.1.5 時間管理
系統設計面試問題通常都很寬泛,45分鐘或一個小時不足以涵蓋整個設計。時間管理至關重要。你應該在每個步驟上花費多少時間?以下是45分鐘面試時間分配的粗略指南。請記住,這隻是粗略的估計,實際的時間分配取決於問題的範圍和麵試官的要求。
- 瞭解問題並確定設計範圍: 3 - 10 分鐘
- 提出高層次設計並獲得認同:10 - 15 分鐘
- 深入設計:10 - 25 分鐘
- 總結: 3 - 5 分鐘