系統設計(架構師)指南3系統設計面試

来源:https://www.cnblogs.com/testing-/archive/2023/09/12/17666276.html
-Advertisement-
Play Games

##一、定義 **使用原型實例指定待創建對象的類型,並且通過複製這個原型來創建新的對象。原型模式是一種創建型模式。** ##二、描述 **包含以下三個角色:** ![](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構建:按時間倒序聚合好友的帖子,構建新聞源。

參考資料

3.1.3 步驟3深入設計

在這一步,您和您的面試官應該已經實現了以下目標:

  • 商定總體目標和功能範圍
  • 勾勒出整體設計的高層次藍圖
  • 獲得面試官對高層次設計的反饋意見
  • 根據面試官的反饋,對深入設計的重點領域有了一些初步想法

您應與面試官一起確定架構中的組件並確定其優先順序。值得強調的是,每次面試都是不同的。有時,面試官可能會暗示她喜歡關註高層設計。有時,對於資深候選人的面試,討論的可能是系統性能特征,重點可能是瓶頸和資源估算。在大多數情況下,面試官可能希望你深入探討一些系統組件的細節。對於URL縮短器,深入探討將長URL轉換為短URL的哈希函數設計很有意思。對於聊天系統,如何減少延遲以及如何支持線上/離線狀態是兩個有趣的話題。

時間管理至關重要,因為您很容易被細枝末節所迷惑,而無法展現自己的能力。您必須準備好向面試官展示自己的信號。儘量不要涉及不必要的細節。例如,在系統設計面試中,詳細談論Facebook feed排名的EdgeRank演算法並不理想,因為這會耗費大量寶貴時間,也無法證明你設計可擴展系統的能力。

3.1.3.1 示例

至此,我們已經討論了新聞源系統的高層次設計,面試官對你的建議很滿意。接下來,我們將研究兩個最重要的用例:

  1. Feed發佈

  2. 新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 分鐘
釘釘或微信號: pythontesting 微信公眾號:pythontesting
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在第14屆中國資料庫技術大會(DTCC2023)上,華為雲資料庫運維研發總監李東詳細解讀了GaussDB運維繫統自動駕駛探索和實踐。 ...
  • SQL文件鏈接在最下麵 MySQL子查詢相關使用 子查詢的實質:一個 select 語句的查詢結果能夠作為另一個語句的輸入值。子查詢不僅可用於 where 子句中,還能夠用於 from 子句中,此時子查詢的結果將作為一個臨時表(temporary table)來使用。 一、 單行子查詢 1、 查詢“ ...
  • 引言 Apple MDM (Mobile Device Management) 字面理解就是一種管理移動設備的方式,覆蓋 iOS 5 及更高版本的 iPhone/iPod touch/iPad、Mac OS X 10.7 及更高版本的 Mac、TVOS 9 及更高版本的 Apple TV,標題中的 ...
  • Vue2安裝JSX支持 有時候,我們使用渲染函數(render function)來抽象組件,而渲染函數使用Vue的h函數來編寫Dom元素相對template語法差別較大,體驗不佳,這個時候就派 JSX 上場了。然而在Vue3中預設是帶了JSX支持的,而在 Vue2 中使用 JSX,需要安裝並使用 ...
  • 作為一名全棧工程師,在日常的工作中,可能更側重於後端開發,如:C#,Java,SQL ,Python等,對前端的知識則不太精通。在一些比較完善的公司或者項目中,一般會搭配前端工程師,UI工程師等,來彌補後端開發的一些前端經驗技能上的不足。但並非所有的項目都會有專職前端工程師,在一些小型項目或者初創公... ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 如何避免寫出屎山,優雅的封裝組件,在面試官面前大大加分,從這篇文章開始! 保持單向數據流 大家都知道vue是單項數據流的,子組件不能直接修改父組件傳過來的props,但是在我們封裝組件使用v-model時,不小心就會打破單行數據流的規則, ...
  • 存儲相關 Vuex 和本地存儲(如localStorage)以及 cookie 存儲(如 document.cookie)之間有一些關係,但它們是不同的概念,用於不同的目的。 Vuex: Vuex 是 Vue.js 的官方狀態管理庫,用於在 Vue.js 應用程式中管理應用程式的全局狀態。 Vuex ...
  • React18 Hooks+Arco-Design+Zustand仿微信客戶端聊天ReactWebchat。 react18-webchat基於react18+vite4.x+arco-design+zustand等技術開發的一款仿製微信網頁版聊天實戰項目。實現發送帶有emoj消息文本、圖片/視頻預 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...