[爆卦]資料結構與演算法英文是什麼?優點缺點精華區懶人包

雖然這篇資料結構與演算法英文鄉民發文沒有被收入到精華區:在資料結構與演算法英文這個話題中,我們另外找到其它相關的精選爆讚文章

在 資料結構與演算法英文產品中有11篇Facebook貼文,粉絲數超過2,646的網紅國立陽明交通大學電子工程學系及電子研究所,也在其Facebook貼文中提到, Synopsys新思科技-2022研發替代役/預聘計畫申請開跑!(for 2022年度應屆畢業碩士、博士生) 2022年度Synopsys研發替代役/預聘計畫正式開跑啦~這次預先招募Memory Design Engineer 及Software RD Engineer人才! 如果您想當一位D...

  • 資料結構與演算法英文 在 國立陽明交通大學電子工程學系及電子研究所 Facebook 的最佳貼文

    2021-09-01 11:38:34
    有 1 人按讚

    Synopsys新思科技-2022研發替代役/預聘計畫申請開跑!(for 2022年度應屆畢業碩士、博士生)

    2022年度Synopsys研發替代役/預聘計畫正式開跑啦~這次預先招募Memory Design Engineer 及Software RD Engineer人才!

    如果您想當一位Design Engineer,研究背景為類比電路設計,熟悉HSPICE/XA/FineSim等模擬工具,Synopsys提供許多不同IP 電路設計研發的相關工作機會。
    如果您想當一位Software Engineer,熟悉C/C++&資料結構&演算法,沒有EDA相關背景也可以! Synopsys備有完善的知識庫及教育訓練。
    如果您想搶先體驗外商環境,體驗跨國合作的工作模式,趁機精進自己的專業技能,加入Synopsys, 讓你三個願望一次滿足!

    Synopsys為全球軟體前15大外商,總部位於美國矽谷,並於美洲、歐洲、亞洲不同國家皆設有軟體研發中心。
    除了長期以來是全球排名第一的IC電子設計自動化(EDA)創新公司,同時提供矽智慧財產(IP)和設計諮詢服務,也是提供「矽晶到軟體(Silicon to Software™)」解決方案的領導品牌。
    於台灣目前有1000名以上的員工,超過700位的研發人才,是在台灣的跨國軟體企業中,擁有最大規模研發團隊的公司之一,目前持續為台灣培養半導體設計軟體人才,加速國內廠商產品開發與問市的時程,強化台灣在半導體國際市場的競爭力。

    歡迎將英文履歷(含學、碩士成績單)投遞至twcampus@synopsys.com,加入Synopsys研發替代役/預聘計畫,讓我們一起探索未來!
    有任何問題歡迎來信詢問,謝謝。

  • 資料結構與演算法英文 在 李開復 Kai-Fu Lee Facebook 的精選貼文

    2020-07-02 15:56:45
    有 475 人按讚

    分享好文,中學生要學電腦嗎?
    作者:創新工場CTO、人工智慧工程院執行院長 王詠剛

    文章来自半轻人微信公众号(ban-qing-ren)
    ………………………………

    朋友的孩子高中剛畢業,已拿到美國頂尖大學(非電腦專業)的錄取通知。疫情影響,不知何時才能去學校報到。孩子想抓緊學習一下程式設計,為大學打好基礎。這孩子找我聊了一個多小時,從如何學程式設計,聊到非電腦專業和電腦專業的路徑差異,又聊到如何從不同角度認識電腦與程式設計。聊得比較寬泛,不知是否對這孩子有用。

    回想我自己的高中時代:那時雖迷戀程式設計,卻完全沒有懂行的人指導。在我們那個四線城市的廠礦中學裡,開設電腦興趣課的老師知道的資訊還沒我多。我高一時跑到北京中關村逛街,卻完全沒意識到中國第一代頂尖程式師當時就在我身邊的低矮辦公樓裡寫代碼(這話說得並不準確,比如求伯君那年就主要是在珠海做開發),鼎鼎大名的UCDOS、WPS、CCED就出自他們之手……我在當時街邊的一家書店(位置似乎就在今天的鼎好大廈對面)買到了許多種印刷品質極低劣的電腦圖書。用今天的標準看,那就是一批盜版影印或未授權翻譯的國外圖書。可那批書竟成了我高中時代最寶貴的程式設計知識來源。

    顯然,我在高中時根本就是野路子學電腦。現在後悔也沒用,當時我的眼界或能觸及的資源就那麼多。如果能穿越回30年前,我該對喜歡程式設計的自己說些什麼呢?這些年,我與世界上最好的一批程式師合作過,也參與過世界上最有價值的軟體系統研發——我所積累的一些粗淺經驗裡,有哪些可以分享給一個愛程式設計的中學生?

    【問題1】中學生要不要學電腦?

    當然要!

    每個中學生都要學。只不過——建議大部分中學生使用“休閒模式”,小部分(不超過10%)中學生使用“探險模式”。

    啊?兩個模式?那我該進入哪個模式?⟹請跳轉至【問題2】

    【問題2】選哪個模式?

    你癡迷電腦嗎?比如,你玩遊戲時會特別想知道這遊戲背後的代碼是如何編寫的嗎?再比如,就算老師家長不同意你學電腦,甚至當著你的面把電腦砸了,你也要堅持學電腦嗎?如果是,恭喜你進入“探險模式”⟹請跳轉至【問題200】

    你對數學有興趣嗎?比如,你看到街邊建築的曲線,就會在腦子裡琢磨曲線對應的函數或方程嗎?每當手裡攥著幾粒骰子,你就會不由自主地計算概率嗎?如果是,歡迎進入“探險模式”⟹請跳轉至【問題200】;當然,如果有些猶豫,也可以先進入“休閒模式”⟹請跳轉至【問題100】

    即便你對電腦和數學興趣不大,家長、老師還是強烈建議你學電腦嗎?就算你一百個沒時間一千個不願意,家長、老師還是會逼著你學電腦嗎?如果是,建議你主動進入“休閒模式”並向家長、老師彙報說“我已經按照前谷歌資深軟體工程師的專業建議在認真學程式設計了”⟹請跳轉至【問題100】

    其他情況,一律進入“休閒模式”。⟹請跳轉至【問題100】

    【問題100】休閒模式 | 主要學什麼?

    “休閒模式”將電腦視為我們生活、工作中的必備工具,主要學習如何聰明、高效、優雅地使用計算設備。這裡說的計算設備,包括所有形式的電腦、手機、遊戲機、智慧家電以及未來一定會進入生活的自動駕駛汽車。

    什麼什麼?你已經會用電腦、會玩手機、會打遊戲了?別著急,慢慢往下看。

    【問題101】休閒模式 | 我會用搜尋引擎嗎?

    我知道你會用百度搜習題答案。但,習題答案不是知識。你會用搜尋引擎來搜索和梳理知識嗎?請試著用電腦和你喜歡的搜尋引擎來解決如下兩個問題:

    (1)圓周率𝜋的計算方法有多少種?每種不同的計算方法分別是由什麼人在什麼時代提出的?借助電腦,今天人們可以將圓周率𝜋計算到小數點後多少位?將圓周率𝜋計算到小數點這麼多位元,一次大概需要花掉多少度電?

    (2)全球大約有多少個廁所?在發展程度不同的國家,分別有多少比例的人可以享用安裝了抽水馬桶的衛生廁所?為什麼比爾·蓋茨曾大力推動一個設計新型馬桶的研發專案?比爾·蓋茨的公益組織在這個專案上大約花費了多少資金,最終收到了多大的效果?

    如果你沒法快速得到上述問題的全部答案,那就給自己設一個小目標:一個月內,學會用搜尋引擎系統地獲取、梳理一組知識點的全部技巧。

    【問題102】休閒模式 | 接下來學什麼?

    建議學好典型的工具軟體。比如,我知道你會用Office了,但用Office和用Office是很不一樣的。對生活、學習、工作來說,學好、學透一個工具軟體比鑽研程式設計技巧更實用。

     你會用Excel來管理班級公益基金的預算和實際收支情況嗎?
     你會用Excel做出過去20年裡全球大學排名的演變趨勢圖嗎?
     你會用Word排版一篇中學生論文嗎?論文中的圖表和最後的參考文獻部分該如何排版?
     你會用Word編排一份班級刊物,包含封面、扉頁、目錄、插圖頁、附錄、封底等部分,可以在列印後直接裝訂成冊嗎?
     PowerPoint呢?你有沒有研究過蘋果公司發佈會上那些幻燈片的設計?當約伯斯(多年以前)或蒂姆·庫克站在幻燈片前的時候,他們的演講思路是如何與幻燈片完美結合的?

    還有哦,別忘了學學如何為數碼照片做後期,如何用電腦或手機剪視頻,如何為剪輯好的視頻配字幕,如何將照片、音樂、視頻等素材結合起來,做出一段吸引人的快手/抖音短視頻。

    最後,抽空玩玩那些設計精妙的遊戲吧,比如《紀念碑穀》、《塞爾達傳說:曠野之息》之類;同時,遠離那些滿屏廣告,或者一心騙你在遊戲裡充值花錢的垃圾。

    【問題103】休閒模式 | 不學學知識嗎?

    當然要學知識。下面每種實用的電腦知識都夠大家學一陣子了。

    (1)色彩知識:你知道同一張數碼照片在不同品牌的手機螢幕上、不同的電腦螢幕上、不同的智慧電視上顯示時,為什麼經常有較大色差嗎?你知道有一些色彩只適合螢幕顯示,不適合列印輸出嗎?你知道軟體工具裡常用的RGB、HSL之類的色彩空間都是什麼意思嗎?如何在設計PowerPoint幻燈片時選擇一組和諧美觀的色彩?

    (2)字體知識:你知道什麼是襯線字體,什麼是無襯線字體嗎?你知道網頁中常用的英文字體都有哪些嗎?你知道商務演講時最適用于幻燈片的英文字體有哪些嗎?你知道電腦和手機常用的黑體、宋體、仿宋體、楷體等中文字體分別適合哪些實際應用場合嗎?你會將不同字體混排成一個美觀的頁面嗎?

    (3)網路知識:你知道5G是什麼嗎?你知道5G和4G在通信頻寬、通信距離上的具體區別嗎?你知道什麼是路由器,什麼是防火牆嗎?你知道如何配置路由器,如何配置防火牆嗎?微信或QQ聊天時,對方發的文字、語音或視頻是如何傳送到你的手機上的?

    (4)應用知識:淘寶中搜索得到的商品資訊是從哪裡來的?商品是按什麼方式排序的?為什麼購物APP經常會推薦給你一些曾經買過、看過的商品?你知道如何為自己建立個人網站嗎?你知道如何管理微信公眾號嗎?

    (5)安全知識:你知道網路上的釣魚攻擊是怎麼回事兒嗎?你知道什麼是電腦漏洞嗎?你知道駭客為什麼想把一大批受攻擊的電腦變成可以遠端操控的傀儡機嗎?你知道為什麼現在很多手機APP都要通過短信發送驗證碼嗎?如果驗證碼被壞人截獲,你會面臨哪些風險?

    這裡只是舉例。實用的電腦知識還有很多。大家可以自己發掘。

    【問題104】休閒模式 | 我需要學程式設計嗎?

    可以學,但不是必須。即便學,也只需要根據自己的需要,學那些最能幫你解決現實問題的部分。

    【問題105】休閒模式 | 我該學什麼程式設計語言?

    在“休閒模式”裡,電腦就是工具,程式設計也是工具,夠用就好。學什麼程式設計語言,完全看你想要電腦幫你做什麼。

    • 如果你想對資料處理有更多自主權,那不妨學學Python;
    • 如果你想做簡單的交互演示程式,那就先把JavaScript學起來;
    • 如果你想更好、更快地寫論文,那不妨學學LaTeX(什麼什麼,LaTeX不是程式設計語言?你太小看LaTeX了);
    • 如果你想學做簡單的手機APP,那麼,Android手機就學Java,蘋果手機就學Swift好了;
    • 如果你只想知道程式設計是怎麼回事,那……從Python或JavaScript開始就行。其實,跟五六歲的小朋友一起學學Scratch圖形程式設計也不錯。

    【問題106】休閒模式 | 我需要學人工智慧嗎?

    在“休閒模式”裡,最需要學的不是“人工智慧的實現原理”,而是“什麼是人工智慧”,以及“人工智慧能做什麼,不能做什麼”。

    • 在手機上試一試,人工智慧做語音辨識時能做到什麼水準?哪些話容易識別,哪些話不容易識別?
    • 打開機器翻譯軟體,試一試哪些資訊翻譯得好,哪些資訊翻譯得不好?
    • 手機上的拍照軟體一般都有人臉識別功能。試一試人臉識別在什麼場景下做得好,什麼場景下做得不好?
    • 找一部講人工智慧的科幻電影,用自己的判斷解讀一下,電影裡哪些技術有可能成為現實,哪些技術存在邏輯矛盾。

    【問題107】休閒模式 | 推薦什麼參考書、參考文獻?

    書不重要,豆瓣評分7分以上的電腦應用、程式設計甚至科普類圖書都可以拿來翻翻。

    直接在知乎裡搜索你想瞭解或學習的知識點可能更有效率。

    如果你意猶未盡,覺得自己剛活動開筋骨,還想挑戰更高層次,歡迎進入“探險模式”。⟹請跳轉至【問題200】

    否則,“休閒模式”到此結束。⟹請離開此問答

    【問題200】探險模式 | 主要學什麼?

    “探險模式”需要有挑戰精神。電腦科學的世界技術演進快,脈絡複雜,要想在探索時不迷路,你得通過有順序、有系統地學習電腦知識,慢慢構建出一張可以在未來幫你走得更遠的思維地圖來。

    在“探險模式”裡,電腦就不止是一件能快速計算的工具了。電腦更像是我們大腦的一種延伸。這既包括認知能力的延伸,也包括認知邏輯的延伸。隨著學習深入,大家會逐漸體會到電腦所具有的多維度能力:

     電腦是一種可以表示不同類型資訊(數、符號、文字、語音、圖像、視頻、虛擬空間、抽象邏輯)的“資訊管理機”;
     同時,電腦也是一種可以連續執行指令以完成特定的資訊處理任務的“指令處理機”;
     同時,電腦還是一種可以在知識與邏輯層面完成特定推理任務的“知識推理機”;
     同時,電腦也是一種可以從人類給定的資料或自我生成的資料中總結規律,建立模型,自主完成某些決策的“智慧學習機”。

    “探險模式”的目標就是盡可能準確地認識電腦,掌握有關電腦運行的最基本規律。有了這些基礎。未來在大學期間或工作中,你就能更容易地設計電腦軟硬體系統,或是設計出碳基大腦(人類)與矽基大腦(機器智慧)之間的最佳協作方案。

    【問題201】探險模式 | 我的英語水準足夠嗎?

    蘋果每年秋季的新品發佈會,不加字幕的話,你能聽懂多少?

     能聽懂大部分:建議在學習電腦的過程中,盡可能使用英文教材、英文文檔。
     能聽懂小部分:建議將原來準備學電腦的時間,分出一部分來學英語。
     只能聽懂“你好”“再見”之類:⟹請離開此問答。然後,把原來準備學電腦的時間用於學英語,六個月後再回來。

    【問題202】探險模式 | 我的數學水準足夠嗎?

     如果你是數學和數學應用小能手——較複雜的數學問題總能快速找到核心思路,或快速簡化為簡單問題;很容易就能將抽象概念映射到具體的數學圖形,或將數學問題與相應的現實問題關聯在一起:請繼續探險之旅。
     如果你應付正常數學課程感到吃力:建議將原來準備學電腦的時間,分出一部分來學數學。
     如果你還搞不清楚什麼是方程、函數、集合、概率……:⟹請離開此問答。然後,把原來準備學電腦的時間用於學數學,六個月後再回來。

    【問題203】探險模式 | 為什麼強調英語和數學?

    (1)統計上說,最好的電腦參考資料大都是英文寫的,最好的電腦課程大都是用英文講的,最新的電腦論文大都是用英文發表的。

    (2)函數、方程、坐標系、標量、向量、排列組合、概率這些中學數學裡會初步學習到的數學知識,是電腦科學的基礎。

    【問題204】探險模式 | 電腦知識那麼多,正確的學習順序是什麼?

    最重要的順序有兩個。建議先從順序一開始,學有餘力時兼顧兩個順序。

    順序一:自底向上,即,自底層原理向上層應用拓展的順序。

     電腦原理的基礎知識:
     為什麼每台電腦(包括手機)都有CPU、記憶體和外部設備?
     (馮·諾依曼體系結構的)記憶體中為什麼既可以存儲資料,也可以存儲指令?
     CPU是如何完成一次加法運算的?
     程式設計語言的基礎知識:
     資料類型,值,變數,作用域……
     語句,流程控制語句……
     過程、方法或函數,類,模組,程式,服務……
     編譯系統的基本概念:
     電腦程式是如何被解釋或編譯成目標代碼的?
     演算法和資料結構的基礎知識:
     陣列,向量,鏈表,堆,棧,二叉樹,樹和圖……
     遞迴演算法,排序演算法,二叉樹搜索演算法,圖搜索演算法……
     應用層的基礎知識:
     為什麼電腦需要作業系統?設備驅動程式是做什麼的?
     網路通信的基本原理是什麼?流覽器是怎麼找到並顯示一個網頁的?
     資料庫是做什麼用的?
     虛擬機器是怎麼回事?
     人工智慧系統的基礎知識:
     先熟悉些線性代數、概率和數學優化的基礎知識。
     什麼是機器學習?從簡單的線性回歸中體會機器學習的基本概念、基本思路。
     什麼是神經網路?什麼是深度神經網路?為什麼神經網路可以完成機器學習任務?
     如何使用PyTorch或TensorFlow實現簡單的深度學習功能?

    順序二:自頂向下,即,自頂層抽象邏輯向下層具體邏輯拓展的順序。

    • 電腦的本質是什麼?
    • 什麼是圖靈機?什麼是通用圖靈機?
    • 什麼是讀取﹣求值﹣輸出迴圈(Read–eval–print Loop,REPL)?
     如何用自頂向下的方式理解(解析、解釋、編譯)一段程式碼?
    • 靜態語言和動態語言的區別?
     如何理解變數與資料類型之間的綁定關係?
    • 什麼是函數式程式設計?
     程式設計語言中,函數的本質是什麼?
     函數為什麼可以像一個值一樣被表示、存儲、傳遞和處理?

    • 什麼是物件導向?
     類的本質是什麼?
     如何用物件導向的方式定義個功能介面?
     如何依據介面實現具體功能?
    • 什麼是事件驅動?
     什麼是事件?事件如何分發到接收者?
     如何在事件驅動的環境中理解代碼的狀態和執行順序?

    【問題205】探險模式 | 如何提高程式設計水準?

    在掌握基本知識體系的基礎上,學好程式設計只有一條路:多程式設計,多參加程式設計比賽,多做程式設計題,多做實驗項目,多找實習機會——其中,能參與真實專案是最有價值的。

    【問題206】探險模式 | 該從哪一門程式設計語言學起?

     我個人推薦的程式設計入門語言(可根據情況任選):
     Python
     Java
     Swift
     C#
     JavaScript / TypeScript
     Ruby
     ……
     可能不適合入門,但適合後續深入學習的語言:
     C
     C++
     Go

     Objective-C
     組合語言
     機器語言(CPU指令集)
     Shell Script
     Lua
     Haskell
     OCaml
     R
     Julia
     Erlang
     MATLAB
     ……

    【問題207】探險模式 | 如何選參考書和參考資料?

    (1)強烈推薦的參考書和參考資料:

    • MIT、Stanford、CMU、UC Berkeley這四所大學中任何一個電腦專業方向使用的教學參考書或參考資料。網上可以查到這些學校電腦專業方向的課程體系,有的學校甚至公開了課程視頻。其中往往會列舉參考書和參考資料連結。
    • 維琪百科(英文)上的數學、電腦科學相關條目。
    • Github上star數在1000以上的開原始程式碼和開來源文件。

    (2)強烈推薦但須小心辨別的參考資料:

     知乎上的數學、電腦科學相關條目。使用時需要格外注意三件事:
     儘量只看高贊答案或高贊文章;
     辨別並避開廣告軟文;
     辨別並避開純抖機靈的故事或段子。
     Stack Overflow上的程式設計問題解答:
     自己動手實驗,辨別解答是否有效。
     CSDN上的程式設計問題解答:
     自己動手實驗,辨別解答是否有效。

    (3)其他推薦的參考書和參考資料:

     國內專業作者寫作的專業技術書籍(豆瓣評分7分以上的)。
     大廠(Google、Facebook、Microsoft、Amazon、阿裡、騰訊、百度、頭條等)資深工程師的技術公號、專欄、博客等。

     著名圖書系列:如O’Reilly的動物封面的系列圖書(請注意最新版本和時效性)。
     國內翻譯的著名技術圖書(譯本在豆瓣評分7分以上的)。

    (4)儘量避免的參考書和參考資料:

    • 已經過時的圖書或參考資料。
    • 作者或譯者人數比章節數還多的專業圖書。
    • 百度百科上的數學或電腦科學相關資料。

    什麼什麼?你這篇問答居然沒有推薦一本具體的圖書?是,沒錯。如果你覺得即便有了上面的線索,自己還是找不到好書好資料,那也許你還是適合“休閒模式”⟹請跳轉至【問題100】

  • 資料結構與演算法英文 在 矽谷輕鬆談 Just Kidding Tech Facebook 的最佳貼文

    2020-05-11 15:34:07
    有 113 人按讚

    #就地避難在家鍛鍊寫作能力

    軟體工程師系統設計面試準備指南

    當你有了幾年的工作經驗以後,在找工作時一定會遇到系統設計的面試,有鑒於大部分的面試心得都是針對演算法以及資料結構的程式面試 (包括我之前寫的美國軟體工程師求職心得),對於系統設計的準備資源還真的不多,本篇要來剖析系統設計面試,介紹面試的流程、正確的心態以及準備的方向,讓大家再也不怕系統設計面試!

    Medium 好讀版:https://medium.com/jktech/%E8%BB%9F%E9%AB%94%E5%B7%A5%E7%A8%8B%E5%B8%AB%E7%B3%BB%E7%B5%B1%E8%A8%AD%E8%A8%88%E6%BA%96%E5%82%99%E6%8C%87%E5%8D%97-acf6ab1f502f?source=friends_link&sk=ca40acf60b749cb1b32c17a868b0c1a3

    #為什麼系統設計很重要?

    在程式面試表現優異,可以讓你順利拿到 Offer;但是系統設計會決定你加入公司的職等!這也就是為什麼有些人有十年經驗只能拿到 Mid-Level (L4) 的 Offer,而有些人只有五年經驗卻可以拿到資深工程師以上 (L5+) 的 Offer。

    另外,如果你是面試 Staff 或是 Principal 級別以上的話,除了系統設計以外,有些公司還會有 Technical Leadership 的面試,來判斷你是否有能力可以跟不同的部門合作、解決問題的不確定性、帶領資淺的人然後推動並且完成一個跨部門的大型技術專案。

    簡單來說,系統設計用來判斷你是 L4 或是 L5+,Technical Leadership 面試用來判斷是 L5 或是 L6+。

    #為什麼系統設計很難準備?

    大多數應徵者在準備的時候會過度偏重於程式面試,原因也不難理解,程式問題的定義很清楚,有給定的輸入以及預期的輸出,就算你真的想不出來,LeetCode 上的討論區也有參考答案;這種有考古題可以參考的面試,對於台灣教育出來的人來說相對好準備,隨著你解的問題多了,你也會更有信心,不知不覺甚至還會刷上癮了呢!但系統設計卻非如此。

    系統設計面試的問題描述通常很模糊 (這是刻意的),沒有給定的輸入與輸出,比較沒有既定規則可以遵循,然後也沒有一個標準答案,針對不同系統你需要提出不同的解法然後分析優缺點,一樣的問題,面試官也會針對你過去經驗往不同的方向問,有些問題你工作上沒有碰過還真的回答不出來,這也就是為什麼很多人看到系統面試就怕了。

    #到底要怎麼準備?

    首先我們要先建立一個觀念:沒有任何一個人可以知道所有的技術細節

    不管你的面試官有多少年經驗,不管他們再怎麼資深,在變化快速的軟體產業,沒有人可以知道所有事情,一定有你知道而他們沒聽過的事情!

    請把系統設計當成分享你過去所學的面試,這個面試的目的在於展示你對於軟體架構能力的廣度跟深度,你必須可以給出大方向的架構,知道有哪些元件 (廣度),同時針對你熟悉的領域深入探討更多細節 (深度),並且提出幾個解決方案,分析優缺點,並且針對系統需求選擇合適的解法。

    大方承認自己對某些領域的細節不熟,也是完全沒問題的,只要讓面試官了解你知道這個東西,如果要深入了解的話你知道有哪些方向要努力,這樣就夠了,因為在大型的軟體專案裡,一定是高度分工的,不會有人同時精通手機端、前端、後端、Infra 以及嵌入式或是硬體的。

    講到這裡,相信你也知道如果真的要準備是準備不完的,這些知識是透過平常工作以及閱讀技術文章長期累積的成果,比較沒辦法臨時抱佛腳。

    #具體來說會問什麼問題

    舉例來說,一個系統設計的問題會像是這樣:如何設計 Facebook?

    這類問題的描述通常會很大而且模糊,面試官不預期而且你也不可能在 45 分鐘內就設計出這些公司花了好幾年這麼多人力設計出來的產品,所以第一步要做的事情是確認需求:是要設計動態牆、Messenger、廣告系統還是推薦系統?流量跟資料量為多少?需要支援全球的使用者嗎?

    確認完需求以後,會針對最重要的幾個使用場景設計你的 Data model 以及 API,接著畫出大的系統架構圖,大致上會包含客戶端 (手機版/桌面版)、Load Balancer (Reverse Proxy)、App Servers 以及資料庫,接著可以針對細節下去討論,這邊開始就很自由了。

    如果你是專精在資料庫,可以討論要用什麼資料庫以及資料要怎麼存可以讓特定使用場景的讀取以及寫入效能比較好,要怎麼做資料庫的 Replication 跟 Sharding 來服務更多的使用者?

    如果講到快取,哪些地方可以加快取呢 (瀏覽器前端, CDN, App Server, 資料庫)?具體來說寫入快取有哪些方式以及優缺點 (write-through, write-around, write-back)?什麼時候要失效?要讓哪些資料失效?

    如果聊到微服務器架構跟 Service Mesh,不同的服務怎麼跟其他的服務溝通? control plane 要怎麼更新 data plane 的設定?如果 control plane 掛了怎麼辦?要怎麼做 service discovery? 哪一種 Load Balancing 策略比較好 (round robin, random, least connection, ring hash, or maglev)?有些服務掛了影響到整個系統怎麼辦?什麼時候需要 circuit breaker ?

    如果你是手機開發者,怎麼實現離線瀏覽?手機要有資料庫嗎?要怎麼以及多常跟伺服器同步?API 要怎麼設計?如何實現 Infinite Loading?剛 Po 文以後要怎麼樣在自己手機上馬上看到?

    這些問題真的列舉不完,總之看到這裡你會了解為什麼我說這個面試是沒有範圍而且也準備不完的,重點應該放在跟面試官的討論,展現你在技術方面的廣度跟深度,讓面試結束的時候能夠有一個你們兩個人都同意的設計!

    #準備材料

    系統設計的資源比較分散,以下是我篩選過後覺得有用的資料,按照素材的類型作分類,也歡迎大家留言補充!

    #入門影片

    針對完全沒有概念的新手,我建議可以先從哈佛的 CS75 Lecture 9 Scalability 開始,裡面講到的很多基礎觀念都相當重要,值得一再複習,這些概念先有了以後再閱讀其他的材料會比較有感覺:

    如果你看完這篇文章後還想再多了解系統面試的形式,也可以看一個前 Facebook 工程師分享的影片:

    Distributed Systems in One Lesson 也很推,裡面提到不少業界在使用的設計模式:

    有一個需要付費的資源是 SystemsExpert,每個影片會講解一個系統設計重要的概念,我個人覺得內容有點淺所以沒有買,但是整理地還算不錯,如果你看完他們免費的影片有興趣還是可以參考一下。

    #閱讀文章

    影片是一個讓你很好理解大方向概念的方式,但是如果你要深入理解背後的原理還有怎麼運作的細節,還是得透過大量以及深度的閱讀來吸收呀!

    system design primer 整理了很多系統設計的資源,資料量很夠, 個人的建議是先快速過一遍,不要細讀,先知道總共有哪些元件,大概是做什麼用的就好,接著針對有興趣的部分在深入研究,建立自己的知識庫。

    Grokking the System Design Interview 也是很多人推薦的材料,主要是針對系統設計的問題提供範例解答,他們的答案可以當作一個參考,但面試的時候不要完全照著回答,還是得看跟面試官討論的結果來進行,但這個是需要付費的,有興趣可以用我的推薦碼註冊購買。

    如果你不想花錢或是不確定 Grokking 的文章你喜不喜歡,有一個類似的網站 Crack the System Design Interview 整理得也還不錯。

    #書籍

    唸書是一個有系統性學習的方法,如果你只想選一本書來看,就選這本大家都推的系統設計聖經 — Designing Data-Intensive Applications,簡稱 DDIA,這本書適合的對象是想要長期準備系統設計或是分散式系統的人,裡面舉的例子都是實際上業界遇到的問題,不會有以前讀教科書那種工作又用不到的感覺;但也因為是書,花了一些篇幅在講解背景知識,包含以前的系統是怎麼設計的以及如何演進到現在,對短期要準備面試的人效率會有點低,所以不適合有時間壓力的人。

    這本書我目前讀了一半,最大的收獲是它解釋了很多為什麼現代的系統要做這樣的設計,我們針對不同的系統要求可以有哪些解法,這些解法各有什麼優缺點,總之分散式系統就是我們解決了一個問題,但又會產生更多要考量的點,一切都是 trade-off。

    但這本書也不是沒有缺點的,首先我覺得是本書的英文沒有很好讀,我常常一段看了好幾遍才知道他想表達的重點是什麼,而且,有些很重要的觀念常常藏在一段文字裡用一句話帶過,但是不太重要的觀念卻使用 Bullet Point 表達;另外這本書話常常講一半,一些觀念提到了一點卻說我們後面再聊,也因為這樣,我在考慮要不要幫大家整理每一個章節的重點,翻成中文分享給大家,有興趣的朋友麻煩拍手留言告訴我!

    除此之外,Google 的 SRE Books 內容也很實在,但是每一個章節的內容是獨立的,建議大家選擇想研究的章節跳著看就好。

    最後,Distributed systems for fun and profit 的內容也很好,以分散式系統的理論為主,比較沒那麼針對系統設計面試。

    #還想閱讀更多嗎?

    我知道光是上面的資源就已經讀不完了,但是行有餘力的話,平時也可以多看看各大公司的技術部落格或是訂閱技術週刊如 TechBridge (台灣) 、HackerNews 以及 InfoQ 等等。

    此外,參考別人的經驗也是很好的方式,最近剛好幾個朋友剛找完工作,他們分享的矽谷找資深工程師工作心得分享以及2020 上半年軟工找工經驗分享也都很值得看!

    最後,在工作上使用到的技術,除了會用以外,最好也要花時間去研讀技術文件,了解他們設計的考量以及支援的場景,大部分這類型針對開發者的文件寫得會比較深入,所以也是相當好的學習素材;我自己過去一年因為工作上需要整合 Envoy 到我們公司的 Traffic Infrastructure,從他們的文件中學到很多 Service Mesh 跟微服務器的重要概念,學習的深度都是其他資源無法提供的。

    #總結

    這篇文章我們整理了很豐富的系統設計資源,希望大家不要被這滿滿的資訊量嚇跑。

    請記得,我們永遠有各種方法在短期內針對面試做準備,提升面試的表現,但這都只是一時的,沒辦法讓你一夕之間就成為專家;如果想要追求長期的持續成長,那麼沒有捷徑 — 就是養成每天學習以及閱讀的習慣,一開始真的很難看到效果,但是當你持續一週、一個月甚至是一年以後,你會明顯感受到自己的成長,這些投入的時間都是騙不了人的。

    如果這篇文章對你有幫助,請拍手留言加訂閱,並且分享給更多有需要的人知道!

你可能也想看看

搜尋相關網站