系統設計(架構師)指南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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...