S1E38 矽谷資深軟體工程師後疫情時代面試心得 Facebook/Robinhood/Coinbase/DoorDash
2020 年是個動蕩不安的一年,因為疫情的關係,很多公司都在年中進行了規模不小的裁員,包含大家耳熟能詳的 Airbnb、Uber、Lyft、Yelp、LinkedIn、Mozilla、Intuit、Salesforce 以及 WeWork 等等族繁不及備載。根據 layoffs.fyi 的統計,這波裁員潮集中在今年的 3 月到 7 月,8 月以後逐漸趨緩。
這對於在這段期間要找工作的絕對不是件好事,因為很多人被裁員,意味著同樣的職缺會有更多競爭者,也因為景氣不好以及疫情不確定性的關係,很多公司開始減緩招人的腳步。不過 7、8 月以後情況逐漸好轉,隨著美國各大城市解除封城,人們意識到必須跟疫情共存好一陣子,於是實體經濟活動恢復了,美國人畢竟是擁有自由的靈魂不能隨便被囚禁的呀!最近是美國各公司的財報季,各大科技公司紛紛發布第 3 季的財報,表現都非常好,也應證了在疫情下經濟轉好的事實。
我在 8 月下旬的時候開始投遞履歷,9 月初開始電話面試,10 月中結束 Onsite 面試 (都是線上進行),面試了四間公司:Facebook、Robinhood、Coinbase 以及 DoorDash,最後拿了前三間公司的 Offer,級別都是資深工程師。在這篇文章我會分享各公司的面試流程以及體驗、我做了什麼準備、怎麼談薪水以及我最後的決定,希望可以對在美國求職的人有幫助!由於有簽保密協定的關係,我只會提到面試的流程,不會提到具體的題目以及 Offer 數字。
Medium 文章好讀版 https://bit.ly/2Ii9vLc
Apple Podcasts https://apple.co/36fLCMh
Spotify https://spoti.fi/2IcyJdv
#面試的動機
蛤!?面試不就是為了換工作嗎?對大部分的人或許是如此,但對我而言這次並沒有非換工作不可的理由。我在 Square 待了三年多,整體的滿意度一直都很好,公司的股票從我加入以後基本上都是一個上漲的趨勢,最近也來到歷史新高。一年多前從 Android 開發換到後端的 Traffic Infrastructure 組以後,更是一直處在學習的狀態,了解怎麼規模化公司的後端架構,支援更多的應用場景,工作上也需要一直動腦,思考各種方法的優缺點、我們為什麼要這樣做並且撰寫許多技術文件,負責的專案也很有影響力,最近的成果是把公司很重要的 reverse proxy 升級成 Envoy,讓系統的效能更好並且支援更多新的功能。或許因為疫情一直在家工作的關係讓我有點工作倦怠,但這個倦怠並不是源自於工作的不開心,而是真的在家太久了,很需要好好放個長假讓腦袋放空充電一下。
言歸正傳,這次面試的主要目的是測試自己的市場價值,看看自己能否適應資深工程師面試的強度,畢竟上次面試已經是四年前了 (當時的面試心得),很多當時對於面試的理解也需要進行修正,我的心態是保持開放的態度,如果遇到很好的機會,當然可以考慮換工作,沒有的話待在現在的公司也很好!另外我自己過去的主要經驗都是 Android 行動開發,在後端只有一年多的經驗,也很好奇這些公司會不會讓我面資深後端的缺,還是會將我過去經驗打折?事實證明是我多慮了,我面的這幾間公司都有把我在 Android 的年資完整算進去,最後也給了我資深軟體工程師的 Offer,Facebook 甚至幫我安排 E6 (Staff Level) 的面試,只是因為系統設計表現得不夠好,最後給我的是 E5 (Senior Level) 的 Offer。
我還蠻建議大家即便沒有特別想換工作,也可以定期去外面面試看看,在沒有非換不可的情況下,習慣面試的緊張感跟壓力,這樣會讓你以後的面試更自在,跟面試官可以像是在平常工作時一樣互動,發揮自己的實力。一開始會有這個觀念是在幾年前讀 hello, startup 這本書時看到,作者建議大家每一年定期去外面面試,審視自己的能力,進而補足自己不夠好的地方,當然我覺得每一年對一般人來說可能有點難,畢竟邊工作邊準備面試不是易事,而且還得跟公司請假去面試,但至少每兩三年可以去外面看看,避免自己的能力跟求職市場脫勾太久。在矽谷以專門招收資深工程師聞名的 Neflix 甚至在他們的文化守則裡提到:「員工的薪水取決於他們個人最高的市場價值,我們鼓勵員工去外面面試並且跟他們的主管討論,我們認為這是健康的行為。」
#資深工程師的優勢
在一般情況下,5 年以上工作經驗可以面資深工程師 (L5) 的職位,10 年以上工作經驗可以面 Staff level (L6) 以上的職位,我有約 6.5 年的工作經驗 (3 年台灣 + 3.5 年美國),所有公司都是讓我面資深工程師以上的職缺。
這次找工作我感受最深刻的事情就是:我再也不用海投一大堆公司了!四年前當我還是求職市場裡的菜雞的時候,投了超過 150 間公司,只有 1x 間公司回應我,轉換率不到 10%。這次 Facebook 跟 Robinhood 都是 recruiter 主動從 LinkedIn 聯繫我進行面試邀請,Facebook 的 recruiter 更是從 2019 年初就開始定期聯絡我,到後面我真的不好意思持續拒絕她,於是接受了面試的邀請,真的還蠻感謝她不斷地嘗試,讓我定期思考一下要不要面試。Coinbase 跟 DoorDash 我都是從官網直接投履歷,沒有透過內推,一個禮拜內就收到了 recruiter 的來信,而這也是我唯二主動申請的公司,真的從以前我找工作,到現在變成是工作機會找上我了。
另一個很大的改變是:刷題不再是最重要的一環。隨著你越來越資深,系統設計跟行為面試所佔的比例也會越來越高,而且除了年資以外,這兩種面試的表現基本上就決定了你的職等,Facebook 的 recruiter 也在電話中跟我說,針對比較資深的應徵者,Coding 的要求會比較寬容 (lenient),所以建議大家不要對刷題過度著迷,一昧的追求題數不是好事,而是應該重質不重量,題目是無限但觀念是有限的。
最後一個體悟是在拿到 Offer 之後,談判的空間變得很大。美國科技業的求職市場一直是呈現一個兩極化的狀態,對於剛畢業的人來說,競爭者多而且職缺少,公司有較高的話語權。但是當你是資深工程師以上的時候,情況就反過來了,大多數公司不管景氣如何,任何時候都在招有經驗的工程師,職缺一直開在那但總是招不滿。上次找工作的時候,能夠讓公司提高年薪 1 ~ 2 萬美金就歡天喜地了,但是這次有兩家公司給我的初始 Offer 跟最終 Offer 都差了好幾萬美金。
#準備過程
軟體工程師的面試主要分成三種:Coding、系統設計以及行為面試。我自己是花比較多時間在系統設計上面,再來是 Coding,最後是行為面試。
關於系統設計的準備,我在軟體工程師系統設計面試準備指南有比較完整的介紹,這邊補充說明一下,準備系統設計最好的方法是來自於工作,最好你工作上就是要去思考怎麼設計系統,各種方法的優缺點以及思考各種 edge case 以及解法,這樣子學到的深度跟廣度都遠多於看那些準備素材。如果工作上沒有碰到也沒關係,可以先從 system design primer 看起,理解系統設計的各種面向。另外我推薦看一些公司的 Tech talk 來了解他們實際上怎麼設計系統,為什麼要這樣做以及不同方法的 Trade-off 又是什麼,理解為什麼要做這個決定是最重要的。如果已經接近面試了,建議可以看 InterviewBit 的系統設計篇,總共有八題,我認為寫的還蠻好的,比 Grokking the System Design Interview 還深入,看個兩次完整理解以後對面試很有幫助。
Coding 的部分我還是要再強調一次,不要過度迷信刷題的數量,應該要重質不重量,重點放在在訓練你的解題思維以及邏輯思考,練習使用常見的資料結構並且把想法轉成可以執行的程式碼。剛開始寫題目的朋友,我會建議相同的題型一起刷,培養對同類型題目的敏銳度,題目難度主要以 Medium 為主,搭配少量的 Hard 題。
很多題目一開始寫不出來,或是寫不出最佳解是很正常的,如果一題你卡超過一個小時,建議可以參考討論區的最佳解,但是切忌直接照抄別人的解答,因為那可能不是最適合你的方式,比較推薦的方式是你去理解背後的演算法,清楚地知道每一個步驟,再用你自己方式寫出來,這樣即使換了一個程式語言,你應該也可以寫得出來。當你開始發現沒看過的題目你也可以自己想出最佳解,並且實作出來,程式碼也很精簡,那代表你已經成功培養出解題的思維了。
我自己還會做一件事,就是想辦法分辨好的題目跟壞的題目,有一些題目的答案很明顯就只適用於這一題,用一些很特殊且不好理解的方法、實際上工作也不可能用到,這類型的題目我就不會花太多心思在上面,如果真的被考到,我會認為這是面試官的不用心。相反地,有一些好的題目:在觀念上很實用、有好幾種解法、工作上有機會用到或是系列題,這種就很值得練習,比方說 Graph 或是 Design 題就是我很喜歡的類型。
雖然說題數不重要,還是提供我的數據給大家參考,我在寫了 50 題的時候開始安排電話面試,最後一個 Onsite 結束時寫了約 120 題,我是以比較新的題目以及高頻題為主。
最後是行為面試,要再細分的話可以分成兩種,一種是 Project Deep Dive,你選一個你最近做過的專案,解釋一下專案內容、解決了什麼樣的問題、你的角色是什麼、最後的成果以及中間遇到的困難,另一種面試是來判斷你是否符合公司的文化以及價值,衡量你過去解決衝突跟溝通的能力。不管是哪一種面試,只要你好好回顧你過去做過的事情,能夠完整講述前因後果,把自己的故事清楚地講給面試官聽,輔佐一些例子,基本上就不會有太大的問題。
#遠距面試 #VirtualOnsite
因為疫情的關係,大家都在家工作,所以所有的面試包含電話面試都改成線上視訊進行,這個情況至少要到 2021 年的夏天。遠端面試的好處就是你不需要舟車勞頓,時間安排上也比較彈性,但是壞處是跟面試官的溝通比較沒那麼順暢,線上的交流絕對是沒有實體見面來得好,而且有的面試官網路很差,我甚至有遇到差到面試官需要把影像關掉的情況。
另一個要注意的點是,系統設計的面試會需要用到線上白板來畫圖,我自己覺得沒有實體的白板順暢,主要有兩種方法,你可以使用 iPad 搭配 Apple pen,或是用鍵盤滑鼠直接拉,選一個自己習慣的方式,面試前稍微熟悉一下白板軟體的使用,面試也會比較順利。
#DoorDash
第一輪是一個小時的電話面試,前 20 分鐘聊過去的工作經驗以及這個組在做的事,後 40 分鐘 Coding。題目是一道經典的 Hard 題,我對於該題印象很模糊,於是在面試中慢慢想,最後是有跌跌撞撞的寫出來,當時自我感覺良好,面試官給我的感覺也蠻算滿意的,但是隔天還是收到了拒信。事後回想應該是因為這是經典題,所以標準相對高,我並不是一次就寫對,而是慢慢修正,所以相對於其他應徵者表現不算太突出。
#Robinhood
他們家固定有兩輪各一個小時的電話面試,第一輪前 15 分鐘給你一段程式碼,要找到潛在的 bug 並且問你要怎麼修正,後面 45 分鐘 coding,題目比較偏向 Robinhood 工作上會遇到的演算法題。第二輪是系統設計,這是我第一個系統設計面試,微緊張,原本以為表現不夠好,但從 recruiter 那得到的反饋是還蠻好的。
Onsite 出乎我意料只有三輪,一輪 45 分鐘 coding,一輪一小時的系統設計,以及 45 分鐘的 Project Deep Dive,Coding 也比較偏向實作工作上會遇到的問題,面試官提到不用特別在意效能,以實作出來並且跑過測資為主,最後 10 個測資我只過了 9 個,不算完美。接下來兩輪跟面試官都聊得蠻開心的,並且有蠻不錯的討論,最後順利拿到 Offer!面 Project Deep Dive 有個小插曲,面試官到一半網路突然掛了,他後半段只能打電話加入簡直尷尬。
#Coinbase
Coinbase 的面試體驗是所有公司裡最讚的!從面試的流程跟題目都可以感受到他們的用心,面試官的平均素質也很好,你可以感受到他們是真心想要認識你這個人,面試過程中對於很多問題都有深入地討論,對於我問的問題他們往往也能給出很好很真誠的答案。
不過他們的面試過程也是最累的,電面是一小時的 Coding,Onsite 總共有五輪,其中居然有兩輪各 90 分鐘的 Coding!你可以在自己的電腦使用平常的開發環境,並且分享螢幕,題目不是傳統的演算法題,而是要你實作一個小型專案,其中一輪是實作一個小遊戲,另一輪則是實作一個系統,最後要 call Coinbase 的 API,所以對於送出網路請求並且處理 JSON 要有一定的熟悉度才行。整體的面試過程還蠻好玩的,面試官也會幫你,但一輪 90 分鐘真的有點太久。另外有一輪一小時的系統設計,以及各 30 分鐘的行為面試跟 Hiring Manager 面試。總共五輪五小時,中間休息一小時,面完真的氣力放盡了。我對整體的表現還算滿意,沒有一輪有感覺明顯不好,最後順利拿到了 Offer。
#Facebook
雖然 Facebook 都是進去以後再經過 Bootcamp 新生訓練選組,但是應徵的時候就要分不同的 Track,主要的分類有 Product、Infrastructure、Android、iOS 以及 Machine learning,Coding 的部分應該都差不多,而系統設計會根據你選的 Track 而有所不同。recruiter 一直建議我選 Android ,畢竟我的履歷上 Android 還是佔了一大部分,她提到 Facebook 現階段非常缺 Android 的人,不過她也補充說明這不代表面試的標準會比較低就是了。我最後還是堅持選擇面 Infrastructure,這樣對我來說準備起來比較方便,不用再額外花心思準備 Android。
我的 recruiter 覺得我可能也適合面另一個職缺 Production Engineer,於是就介紹了另一個 recruiter 給我,我可以選擇同時面兩個缺,最後如果拿到兩個 Offer 可以到時候再決定。實際聊過以後我還是婉拒了,因為不想花時間準備 Linux System 面試。
我們也聊到了預期的級別,她說以我的經驗我可以選擇面 E5 或 E6,這讓我感到蠻意外的啦,平心而論我認為不管是年資和能力我都還沒有到 Staff Engineer 的水準,不過既然 E6 只比 E5 多一輪系統設計面試,我就大膽地挑戰 E6 了!
Facebook 除了系統設計是一小時以外,其餘的面試都是 45 分鐘,電話面試是一輪 coding,Onsite 總共有五輪,兩輪 coding、兩輪系統設計以及一輪的行為面試。最後 Facebook 給了我 E5 的 Offer,原因是兩輪系統設計一輪還不錯另外一輪普普,沒有達到 E6 的標準。
雖然我最後有拿到 Offer,但我還是必須說 Facebook 的面試體驗蠻差的,面試官給我的感覺是他們不在乎我這個人,只想趕快在有限的時間內盡可能地蒐集一些訊號來判斷我有沒有通過,我並不反對有效率地蒐集一些訊號,但是面試是雙向的,作為應徵者的我們同樣也在面試這間公司,面試時我也在看未來我會不會想要跟這個面試官一起工作?而 Facebook 在我的標準裡顯然是不及格的。當然也有可能是我運氣不好,剛好遇到這樣子的面試官,但這也代表 Facebook 對於面試官的訓練不夠嚴謹,導致素質參差不齊,又或者是面試體驗並不在 Facebook 優先考慮的事情,不管是什麼原因,這都是一個警訊。
這個現象在 Coding 面試尤其明顯,面試官就是在看你能不能在有限的時間快速寫出最佳解。不過我倒是沒想到在行為面試也會遇到一樣的問題,我的面試官就按著他預先準備好的問題一個一個問,大部分的時間他的眼睛都盯著螢幕在做筆記,我實在是不確定他有沒有在聽我說話,有時甚至還會問我剛剛已經回答過的內容。
除此之外,Facebook 要求在 45 分鐘內解出兩道程式題,通常都是 LeetCode 原題並且要求最佳解,即使這種面試或許對我是有利的 (其中一輪我只花了 30 分鐘就寫出兩題的最佳解,然後我們閒聊了 15 分鐘),但我認為這種填鴨式的面試方式完全不能反應一個人的工作表現,這或許可以招到一定聰明程度以上的人,但是他們不一定是個好的工程師或是很好合作的人。我認為維持這種大考式的 Coding 面試也是一種偷懶的表現,但這個面試形式卻會深深地影響招進去的人的類型,是我的話我會盡量避免跟這類型的人合作,因為我認為思考過程跟溝通比你能不能快速寫出最佳解還要重要。
如果這段文字有冒犯到在 Facebook 工作的朋友的話,我在這邊先說聲抱歉,但這確實是我面試完以後真實的感受。
#談薪水
近年來由於 levels.fyi 的關係薪水變得越來越透明,這對求職者來說是個好事,你可以知道某公司的某個級別合理的薪資範圍在哪裡。如果你對談薪水這個主題有興趣的話,可以參考這兩篇經典文章:
1. Ten Rules for Negotiating a Job Offer https://haseebq.com/my-ten-rules-for-negotiating-a-job-offer/
2. How Not to Bomb Your Offer Negotiation https://haseebq.com/how-not-to-bomb-your-offer-negotiation/
我自己談薪水的策略沒有那兩篇文章寫得那麼複雜,我認為最重要的原則是誠實,不要假裝你拿到其他公司的 Offer,也不要虛報你其他 Offer 的數字 (即便這個數字是合理的),你可以選擇性揭露你的資訊,對方問到你不想揭露的資訊時,你可以禮貌地說你不方便透露,但絕對不要說謊。
公司在給你 Offer 的時候會考慮到很多因素:年資、面試表現、現在的薪水以及職等、其他公司 Offer 以及其他的面試者等等。這其中大部分資訊我們是不會知道的,比如說每個因素佔的比重、總共有多少面試者、我們在所有面試者裡面的表現如何,而且年資跟面試表現基本上已經確定了,所以實際上你能夠用的資訊就是其他公司的 Offer 或是你現在的薪水以及職等 (當然是要比較高才有用)。
當然最有用的談判手段,就是你拒絕掉這個 Offer 也沒關係。公司招人需要成本,從一開始收履歷、電話面試到 Onsite 面試,他們已經在你身上花了這麼多時間,也給你 Offer 了,所以在這個階段公司也很希望你能加入,除非這是你夢想中的公司,你很怕談薪水所帶來的風險,不然一般來說求職者在這個階段是有比較大的話語權。
另一個建議是請把 recruiter 當成你的夥伴,通常他們是要看業績給獎金的,所以她是跟你站在同一陣線,要幫助你跟公司談出更好的薪水說服你加入。Facebook 的 recruiter 這方面做得很好,她很多資訊都很透明地分享給我,包含這個級別可以拿到最好的 Offer 以及我的面試表現,一開始給我初始 Offer 的時候還告訴我這只是標準包裹,她不預期我會接,整個很 Real!後來給我的 Offer 也比原來的高出了不少,並且我如果下定決心要加入 Facebook 的話,她可以幫我要到這個級別的頂包。
Robinhood 也對我蠻有誠意的,在過程中不斷溝通,安排我跟主管以及同事聊天,有必要的話還可以讓我跟上面的 VP 聊聊,解答我對於 Robinhood 所有的疑惑。後來在得知我有 Facebook 跟 Coinbase 的 Offer 以後,給了一個很有誠意而且超過 Facebook 的 Offer,真的是受寵若驚。Coinbase 給的 Offer 相對前兩家低了不少,而且往上談的空間不高,他們給的理由是他們現在使用的估值是兩年前募資的數字,所以實際上的股票價值遠高於那個數字,而且他們 Refresh 也會給的比較大方,讓你在四年以後薪水不會降。
#最後的決定
我在選擇公司時,通常會考慮三個點,第一個是這個職位本身,我在什麼組、負責的產品、使用的技術、發展的機會以及同事跟主管的做事風格等等,盡可能知道每天工作的樣貌,判斷自己未來的開心程度。第二個是關於公司,我會問自己兩個問題:
1. 公司的文化跟價值我是否認同?人生很短,千萬不要浪費時間在幫跟自己核心價值不合的公司賣命。
2. 我是否相信公司所描述的願景,公司在未來的 5 ~ 10 年內能持續成長並且有好的發展嗎?
第三個是薪資結構,包含了底薪、股票、簽約金、獎金以及 Refresh 等等,來預期未來幾年的薪資。
除了以上三點以外,還得考量到現在都是遠距上工,跟同事以及主管建立感情也相對比較困難,所以在新公司的適應難易度也得列入考慮。在綜合考量之下,我這次還是選擇先留在 Square,或許明年再看看有沒有更好的機會!
如果這篇文章有幫助到你,歡迎按讚拍手,有任何問題也可以在底下留言,或是私訊給我們也行!
同時也有10000部Youtube影片,追蹤數超過2,910的網紅コバにゃんチャンネル,也在其Youtube影片中提到,...
「system design面試」的推薦目錄:
- 關於system design面試 在 矽谷輕鬆談 Just Kidding Tech Facebook 的最佳解答
- 關於system design面試 在 矽谷輕鬆談 Just Kidding Tech Facebook 的最佳貼文
- 關於system design面試 在 半路出家軟體工程師在矽谷 Facebook 的最佳貼文
- 關於system design面試 在 コバにゃんチャンネル Youtube 的精選貼文
- 關於system design面試 在 大象中醫 Youtube 的最佳解答
- 關於system design面試 在 大象中醫 Youtube 的最讚貼文
- 關於system design面試 在 [心得] 國外各大公司面試經驗- 看板Soft_Job 的評價
- 關於system design面試 在 美國軟體工程師攻略(四)如何準備面試& 如何面試? 的評價
- 關於system design面試 在 donnemartin/system-design-primer · GitHub - 系統設計入門 的評價
- 關於system design面試 在 [面試][系統設計]如何設計一個像Facebook 的社交平台 - iT 邦幫忙 的評價
- 關於system design面試 在 [討論] System design系統設計 - PTT 熱門文章Hito 的評價
- 關於system design面試 在 Google 面試System Design在PTT/Dcard完整相關資訊 的評價
- 關於system design面試 在 Google 面試System Design在PTT/Dcard完整相關資訊 的評價
- 關於system design面試 在 [心得] 面試心得- Soft_Job - PTT生活政治八卦 的評價
- 關於system design面試 在 [心得] Google TW SWE 面試心得(下) - Tech_Job | PTT Web 的評價
- 關於system design面試 在 [心得] Google TW SWE 面試心得(上) - Mo PTT 鄉公所 的評價
- 關於system design面試 在 Re: [請益] 後端作品請益- 看板Soft_Job - PTT網頁版 的評價
- 關於system design面試 在 System Design | REN WEI'S BLOG 的評價
- 關於system design面試 在 Re: [請益] 臉書面試繼續與否- Soft_Job - PTT生活資訊討論 的評價
- 關於system design面試 在 [心得] 提升軟體工程師薪資的三個作法- soft_job 的評價
- 關於system design面試 在 Re: [心得] Facebook面試經驗分享- 看板Soft_Job | PTT職涯區 的評價
- 關於system design面試 在 Re: [心得] Facebook面試經驗分享- 看板Soft_Job | PTT職涯區 的評價
- 關於system design面試 在 [系统设计/OOD] 系統設計救星! 一天內手把手教你面試System ... 的評價
system design面試 在 矽谷輕鬆談 Just Kidding Tech Facebook 的最佳貼文
#就地避難在家鍛鍊寫作能力
軟體工程師系統設計面試準備指南
當你有了幾年的工作經驗以後,在找工作時一定會遇到系統設計的面試,有鑒於大部分的面試心得都是針對演算法以及資料結構的程式面試 (包括我之前寫的美國軟體工程師求職心得),對於系統設計的準備資源還真的不多,本篇要來剖析系統設計面試,介紹面試的流程、正確的心態以及準備的方向,讓大家再也不怕系統設計面試!
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 跟微服務器的重要概念,學習的深度都是其他資源無法提供的。
#總結
這篇文章我們整理了很豐富的系統設計資源,希望大家不要被這滿滿的資訊量嚇跑。
請記得,我們永遠有各種方法在短期內針對面試做準備,提升面試的表現,但這都只是一時的,沒辦法讓你一夕之間就成為專家;如果想要追求長期的持續成長,那麼沒有捷徑 — 就是養成每天學習以及閱讀的習慣,一開始真的很難看到效果,但是當你持續一週、一個月甚至是一年以後,你會明顯感受到自己的成長,這些投入的時間都是騙不了人的。
如果這篇文章對你有幫助,請拍手留言加訂閱,並且分享給更多有需要的人知道!
system design面試 在 半路出家軟體工程師在矽谷 Facebook 的最佳貼文
紀念到矽谷四年:生活、工作的比較及心得
2015 年的一月,我和親愛的老婆從美國東岸那時大雪紛飛的馬里蘭州搬到陽光普照的加州灣區。時間轉眼一下就過了 4 年, 我們也從當初的灣區菜鳥,到現在大概知曉這裡的各式生活狀況、職場秘辛。 對於矽谷,大家總是有許多憧憬、幻想,當初的我也不例外,希望在這個世界科技之都能立足,並和各國高手一起競爭、合作、參與改變世界的產品。 四年後,在矽谷這個入門工程師的領域,我算是站穩腳步,小有成就,這篇是我的回顧及心得。
2015 年一月,我們從零下還在下雪的地方穿超級厚重的外套在雷根華盛頓國家機場(DCA)上飛機,我們剛下飛機就發現晚上攝氏 10 幾度的舊金山實在好溫暖,脫下了外套後, 要拿我們 2 個大行李箱、 3 個小行李箱,隨身背包、及大外套讓我們手忙腳亂了一陣子。那時要從舊金山機場坐 Uber 到定的 Airbnb 房子,我們選擇最大容量的 Uber XL, 來接我們的大叔開一台大 SUV, 在塞完我們所有的東西後幾乎沒有什麼剩下的空間了。 40 分鐘的路程,我們到了舊金山 Glen Park 附近定的房子,我們知道房東在上夜班,她 90 歲的媽媽會幫我們開門。 在按了門鈴後,過了許久,房子才出現亮光,2 樓窗戶出現一位老太太,揮手示意她知道了。 我們於是在一樓門口等著她, 等著等、大概過了將近 5 分鐘都沒有動靜,我們一度懷疑老太太怎麼了, 正要打電話給房東時,老太太才步履蹣跚的到門口來開門,原來她只是因為走路很慢,但並沒有出什麼事。 當我們走到 3 樓的房間時,發現房間內放一張床和一個小桌子就沒有什麼空位了,我們的行李根本就放不進房間裡。 只能先拿貴重及那晚需要的東西,剩下的先暫時放在他們的車庫裡。
我們搬到舊金山之前,在馬里蘭的 Rockville 租一個 one bedroom 採光不錯的電梯公寓, 850 square feet 包水電, 一個月的租金是 $1350, 而舊金山我們租的房間是一間獨立的房子裡 4 個房間中的一間,大概只有 200 square feet,要和另外一個房間共用廁所,而整個家住了 9 個人加 3 隻狗,一個月的租金是 $1700。 我們知道舊金山的房價及房租很高,要找短期租房的更是困難,所以也只能摸摸鼻子,住在一個不是那麼舒服的地方。希望一切在我上完 3 個月的程式密集班(可以參考我之前的文章- Coding bootcamp 程式語言密集班- 從不會寫程式到3個月被矽谷科技公司雇用的終南捷徑?) 後就可以穩定下來。
在開始上課之前,我們有大概幾天的空檔,那時候 Uber 和 Lyft 剛推出共乘服務, Uber Pool 或 Lyft Line 只要 $5 就可以讓你搭車到舊金山任何地方, 而且還可以帶一個人。而舊金山的公車系統 Muni, 一個人的基本票價是 $2.25, 而且你要到的地方可能要換很多次車多花很多錢。 那時候的演算法可能還沒有很完善,我們常常上車後,司機到我們的目的地前也沒有接到共乘的人,所以和一般票價的 Uber/Lyft 沒什麼差別。 我們第一次覺得在矽谷可以嘗試新產品真是好棒!
2015 年初的舊金山不太冷,白天有到攝氏 20 多度,我們出門去 Dolores Park 的時候基本上就是穿著短袖加一個薄外套,對於在東岸生活了幾年的我們,真的很享受能在冬天公園裡曬曬太陽。
而灣區的餐廳選擇很多、不管是中式、日式、或是哪種料理,我們都可以找到沒有太貴,但就很好吃的,當然我們知道和洛杉磯 LA 的美食可能還是有差距,但我們真的很感動灣區的食物選擇及品質。
在舊金山市區上課時,我覺得最不能忍受的是 Market Street 附近的遊民,有時候一個轉彎,你就看到整條街 30~40個遊民聚集在要走的路上。 因為聽到了不少被遊民謾罵、甚至毆打的案例,通常我都會繞路而行。 但舊金山遊民數量實在太多,路上常常有許多遊民的排泄物,走路真的要很小心。 到 2019 年的現在,每次去舊金山我們還是覺得要經過遊民附近是很可怕的經驗。
那時候我每天早上 9 點到晚上 9 點在學習,要回家的路上沒什麼人,從上課到 Bart 車站 5 分鐘,及從 Glen Park 車站走回家的 15 分鐘,我每天都很害怕被搶劫或是襲擊,我會多帶一個備用錢包放一些小錢,並穿著慢跑鞋,想說希望如果真的遇上了,就把備用錢包丟到反方向、拔腿就跑,好在到搬離開舊金山時都平安沒有遇到。
矽谷的工作機會很多,以軟體工程師來說,大中小公司面試的重點不太一樣,大公司著重演算法、資料結構、 system design、小公司著重實際經驗及所要的技能是否能立即使用。 2015 年的時候,大家提到想進的夢想公司是 FLAG , FLAG 是 Facebook、 LinkedIn、 Google 這 3 間公司、A 有人說是為了順口加的,有人說是 Apple , 有人說是 Amazon。 FLG 都是相對年輕的公司、公司福利待遇類似、公司有提供三餐等等,是眾多畢業生想加入的公司。 到現在比較多人在講的是 FAANG (Facebook, Apple, Amazon, Netflix and Google), 到去年下半年前,這幾家公司的過去幾年股票漲很多, 讓投資人或是工作申請者趨之若鶩。
我 2015 年在找工作時,我主要要靠自己及朋友內推來申請職缺。 我開始在 SolarCity 工作之後, 不時的信箱或是 LinkedIn 就會收到 recruiter 寄信,詢問有沒有興趣去了解他們的公司或是面試。 而我加入 Facebook 之後, recruiter 們寄來的信就更多了。 在矽谷,1 年半 到 2 年換一個工作是很正常的, 文章像是 Employees Who Stay In Companies Longer Than Two Years Get Paid 50% Less, Why you should switch jobs every 2 to 3 years to boost your earnings 都鼓勵著大家時常去就業市場上看看自己的行情。 而前幾年許多獨角獸公司的擴張,大舉砸錢找人才, 也讓 FAANG 公司許多員工流向像是 Uber、 Airbnb、Dropbox、Pinterest、 Snapchat、Slack 等公司。
因為工作機會多,許多朋友也早就、或是後來搬到矽谷發展, 參加朋友們之間的活動, 讓我也認識許多在不同科技公司的朋友們。 在矽谷這裡, 可能認識的 3 個人就有 2 個是在科技公司工作。 軟體工程師是佔最大的比例、而 Product Manager 、Designer 等科技公司中的重要角色也是有不少人。 相對來說, 其他地區的職業傾向沒有像矽谷這裡這麼傾向科技業。
美國的產假在已開發國家中是很落後的, 但加州的父母福利在美國各州還算是還不錯的, 加州規定懷孕的媽媽在產前 4 週可以開始請 maternity leave, 產後有 12 週的 paid maternity leave 。 爸爸也有在小孩出生到一歲前的 6 週 leave。 而科技公司為了讓員工有小孩時無後顧之憂, 也會加碼提高爸媽在家照顧嬰兒時間, 最高的 Netflix 可以提供到一年的帶薪產假呢 (不知道有沒有人有親身看到請一年假的 Netflix 同事),這篇文章提供了矽谷各大科技公司的產假福利時間 Netflix parents get a paid year off and Amazon pays for spouses’ parental leave。我所在的 Facebook 是不論是爸爸或媽媽都可以請 17週的產假,公司及部門也都會盡量鼓勵大家在小孩一歲前把這個假放完,多在家陪小孩。
在生活壓力上,矽谷的工作壓力也還是蠻大的, 你的同事及朋友們,大家都是聰明人,也賭上一切在這裡努力求生。 每個人真的都非常努力的在工作中表現及爭取。 因為矽谷灣區蓋的房子數目跟不上人搬進來的速度, 房價飛漲, 100萬美金在矽谷只能在沒有那麼好地區學區買 60 年以上屋齡的小小的老房子。 相比之下, 馬里蘭最好學區 Potomac 10, 10, 10 的房子,有著可大 2、3 倍的室內室外空間及較新的屋齡, 許多也不到 100 萬美金。 有許多有小孩家庭的人, 因為受不了房價及學區, 紛紛搬離矽谷, 其中, 蠻多人選擇搬到西雅圖, 我一年半前寫的西雅圖要超越矽谷了?提到了西雅圖的崛起及人才的流動,我最近也剛好有同事調到西雅圖,薪水不變的情況下,因為不用繳交華盛頓州的收入稅、及相對低廉的生活成本,每個月可以用的稅後收入增加許多,除了冬天下雨多了些之外,生活過的很開心。
我知道每個城市都有它的優缺點, 我很感激來灣區矽谷的一切體驗, 對我來說,矽谷願意接受一個半路出家的我, 讓我有機會證明我自己, 這裡的氣候、食物、福利、及各種機會,都是很多地方沒有的。 上一個 4 年,我過的很精彩,希望下一個在矽谷的 4 年能更加適應、綻放光芒。
你的矽谷經驗或者你的美國經驗是怎麼樣呢? 歡迎一起留言討論分享。
https://brianhsublog.blogspot.com/2019/01/4YearInSilliconValley.html
system design面試 在 美國軟體工程師攻略(四)如何準備面試& 如何面試? 的推薦與評價
由於我之前回答system design 問題都是基於以往的開發經驗回答,自己沒有一個很有系統地準備方法,反而是後來找到工作之後才慢慢開始看,在這裡提供大家一些材料,讓 ... ... <看更多>
system design面試 在 donnemartin/system-design-primer · GitHub - 系統設計入門 的推薦與評價
Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. - system-design-primer/README-zh-TW.md at master ... ... <看更多>
system design面試 在 [心得] 國外各大公司面試經驗- 看板Soft_Job 的推薦與評價
背景:4~7年經驗(anonymized), 求學背景是純商, 程式100%從0自學來的
Leetcode去年訂了一年Premium之後開始刷,累積到目前700題,Medium + Hard佔約70%
2020年2月開始陸續投遞履歷,全部都是投英國/日本的職位
只有Google例外是台北辦公室(GCP)
投遞:Stripe, Yelp, Microsoft, Apple, Indeed, Google,
Facebook, Spotify, TikTok, Twitter, Lyft, Yelp, SmartNews
無聲卡: Microsoft, Lyft, Twitter, GitLab
以下面試經驗照面試時間順序排列
------
* Spotify - Software Engineer (Data)
- 透過LinkedIn投遞履歷
[ Phone - Feb ]
- coding: Valid Parentheses, 給定一字串,寫一個function來辨認是否為valid
- follow-up: 多幾個不同的Parentheses, 例如{} [] ()
- follow-up: 寫成map reduce的形式, 怎麼設計mapper & reducer
- 有沒有聽過prabalistic data structure? 給一個例子 (我給Bloom Filter)
- 一些簡單的SQL問題
[ Onsite - Mar]
早上兩面,下午兩面,中午在spotify london的飯廳跟兩個工程師吃飯,
飯後閒聊順便玩一下飛鏢,再繼續面試
- System design問題,設計一個Top 10 tracks API與實時計算系統
- Behavioural問題,tell me a situation when ....STAR類問題,
就照著過往經驗回答即可, 隨時要跟hiring manager做eye contact爭取感情加分
- Case analysis, 給一個line chart是三個國家的DAU,
並發現US DAU nose-diving, 問題出在哪?跟面試官交互討論出問題成因
主要考察邏輯分析,溝通能力
- Coding: 暖身題Fizzbuzz, 迅速寫完之後給了一些簡單的follow-up
- Coding: Longest Session.
給定一個List of 4-tuple [user_id, track_id, timestamp, time_played],
找出最長的session. -> 類似LC 56. Merge Intervals, 最佳解O(NlogN)
Follow-up: 如果input塞不進memory, 怎麼解?
我簡短回答有Disk-based or Mapreduce approach
然後我深入講了一下MapReduce怎麼寫
Spotify這職位有意思的地方是會考Case Analysis,
通常這比較常用來考data/business analyst, 還好我唸過商學院XD
[ Result ]
三天後通知結果, offer get. £105K GBP/year
------
* Indeed - Senior Software Engineer
- 透過japan-dev.com投遞履歷
[ Phone - Feb ]
使用Karat面試,可以在週末面(加分!!)
- coding: 類似LC 1143. Longest Common Subsequence, 給定兩個字串
找出最長公共子字串. 另外兩個問題我忘了,都是LC easy. 掌握好基本學理,
好好溝通你的解法並迅速implement出來就好
- 系統問題:Thread v.s. Process, thread exhaustion,
memory leak, Java GC (SOTW). container的優點...等等
[ Result ]
本來安排要3月中飛日本on-site,因為武漢肺炎爆發突然宣布hiring freeze
無限期on hold, sad
------
* Google - Software Engineer
內推, 原本推日本的缺,Recruiter說日本沒有我的專業
(日本office主要做Mobile及NLP Research), 台北/倫敦比較多GCP/Data的缺
[ Phone - Apr ]
LC Medium難度,實作time_delta函數,就是給你一個Date class跟一個正整數,
例如(2020-01-01, 5),要回傳2020-01-06. 一開始給了一個naive的O(N)解,
面試官提示問有沒有更好的解,然後我解釋了一個O(logN)的解 (但沒時間implement
還好最後有pass,感覺是溝通跟邏輯推理很重要(即使沒寫出完整的最佳解)
[ Virtual On-Site - May ]
全部都是coding interview 沒有system design
- LC Hard矩陣題, finding the size of largest submatrix sum to 0.
看過這題目的variation (LC 1074)
花了20分鐘實作O(N^3 using Kadane's algorithm)解法,寫完之後閒扯了一些
test corner cases. 這題你沒看過最佳解法的話
能想到並實作O(N^4)的prefix sum解法已經很猛了, 多做點題還是有幫助的
- LC Medium有向圖題, 這題在Leetcode上沒看過類似的,給你一個樹,
可以視為Direct graph及一個想delete的節點,找出所有detached的節點。
花了20分鐘討論,10分鐘用DFS寫了一個解答
(然後面試結束我想了一下發現了一個bug, 扼腕)
- 2題LC Easy~Medium字串題,這題也沒看過,
概念上類似finding palindromes in a list of strings,
例如mow在轉置後會等於原字串mow。第二題是follow-up,
要找出轉置後不等於原字串的,例如loom -> wool
- 2題LC Medium,N-ary tree尋找兩個node的共同祖先,
答出第一題後給了一個follow-up (如果兩個node很靠近該怎麼最佳化?)
給了一個錯誤的解法(錯把有向圖當無向圖來解),算是GG
- Behavioural, 無難度,就問一些你遇到XX狀況會怎麼做,
之前遇到甚麼衝突的情況之類的,照真實情況回答即可,
但盡量touch到Googlyness讓面試官找到signal幫你加分,
例如be friendly and approachable, focus on customer,
do the right thing之類的
[ Result ]
On-site 5天後通知表現fairly well送package到HC,
10天後通知沒過HC, 自己評估是兩個hire, 兩個leaning(hire/no-hire),
Google標準很高所以....Reject
我側面了解是要拿到三個hire以上? 這部分如果有熟悉的Googler為我解惑
我感激不盡
------
* Facebook - Software Engineer - Infra
內推(感謝Brian Hsu大大)
[ Phone - Apr ]
一題LC Medium, LC 146. LRU cache的變體
用Doubly-linked-list & Hashmap實現
被面試官提醒非常多次一些小地方有bug,感覺GG
[ 2nd Phone - Apr ]
上一個Phone interview雖然有寫出最終解答,不過中間提示太多
面試官覺得需要加麵一次, 這次是一題Easy, 不在LC上,
是tax bracket calculation (我在LC discuss中有看到),給出O(N)最佳解
另出一題Hard, LC 42. Trapping Rain Water的變體,給出3-pass O(N)次佳解,
中間卡了非常多次, 面試官不停給hint. 這輪我遇到很有意思的面試官,
寫出的feedback精細到我幾分幾秒的時候說了甚麼話都記錄下來, 簡直人體Logger
[ Virtual On-Site - June ]
On-site前recruiter説E4已經額滿,所以我要拿Offer就必須直接拿E5(Senior) offer,
不然就算表現有E4水準也不發offer,搞得我壓力很大...
面試前把所有FB tag的leetcode題刷好刷滿 每題至少刷三次
- 2 LC mediums, 實作bisect.insort_right 跟
在一個NxN矩陣尋找最長連續數字. 皆給出最佳解
- 2 LC mediums, 一題LC 3.的變形,一題LC 398.的變形,
皆給出最佳解(linear time & constant space)
- 系統設計,給幾個constraint下設計一個分散式爬蟲系統,自認表現沒有E5水準. GG
- Behavioural問題,就一般聊天,一邊看著FB的評分標準
一邊把該講的點全部都講到讓面試官好給分,因為我面E5,
需要大量強調領導經驗跟跨團隊合作,例如以下這幾點:
- INTRINSIC MOTIVATION
- BEING PROACTIVE
- PERSEVERANCE
- CONFLICT RESOLUTION
- EMPATHY
- GROWTH
- WORKING IN AN UNSTRUCTURED ENVIRONMENT
- COMMUNICATION
[ Result ]
禮拜二面試,隔一個禮拜收到結果,表現不到E5水準,
兩關coding跟system都得到hire recommendation for E4,
但behavioural面試沒有回答好,有點borderline
Recruiter的feedback是solid E4
但今年度E4已經沒有head count了 所以算reject吧
Recruiter也提到如果今年或明年的E4 head count再開可以送HC
但目前一切都還很難講,建議我不要等待,累積實力等到明年再試一次E5
------
* Stripe - Machine Learning Engineer
- LinkedIn獵頭找上
[ Phone - Jun ]
- coding: 兩題,input是一個DB table, 以JSON來表示。
一題尋找table中最小的column, 一題尋找table中最小的數個columns(tie-breaker)
e.g.
table = [{‘a’: 1, ‘b’: 2, ‘c’: 3}, {‘a’: 2, ‘b’: 1, ‘c’: 2}]
minCol(table, ‘a’) -> 回傳{‘a’: 1, ‘b’: 2, ‘c’: 3}
minCol(table, ‘b’) -> 回傳{‘a’: 2, ‘b’: 1, ‘c’: 2}
一畝上有很多Stripe面經提到一樣的題目,看來是高頻題一直重複出
[ Virtual On-Site - Jul ]
Stripe喜歡用pair programming來測試面試者,
我個人很喜歡這種面試方式,
比FB那種一個session固定給你兩題LC類型的題目要有意義多了
就算最後沒拿到offer也可以學到很多東西。
- Behavioural: 直接跟用人主管面試,可以趁機問一些組的方向跟個人成長
- Machine Learning Coding: 給一個dataset,生出一個model,
並談到各種model類型,imputation strategy, evaluation metric的選擇,
precision-recall trade-off等等
建議面試前可以到kaggle下載dataset來練習並多讀別人做機器學習的經驗
- Bug Squash: Debugging練習,給一個github codebase及幾個會報錯的test,
並寫出bug fix, 這題我當下太緊張沒寫出來, 面試完後一下就解出來了
- Coding: 寫一個class, 拿schedule當input,
產出什麼時間點要寄送什麼subject的email.
- Machine Learning System Design:
設計一個end-to-end fraud detection系統
40% ML design, 40% system design, 20% business metrics. 答的不知所云
[ Result ]
一個禮拜後通知rejection, 估計是最後一關Machine Learning System Design
我在溝通方面表現不夠好,Stripe的bar也非常高
(recruiter說這個role是EMEA區的first hire, 標準特高)
------
* TikTok(Bytedance) - Software Engineer
- 透過LinkedIn投遞履歷,妙的是面試官全是中國人,直接中文面試XD,瘋狂中英加雜
[ Phone - Jul ]
- coding 1: 給一個MxN的布林矩陣, 1代表有一個人在該位置上
如果同一個行或列上有兩個以上的人就代表他們都是非alone
最後回傳有幾個人是非alone
[0 1 1 0]
[0 0 0 1] -> return 5
[1 1 1 0]
最後給出最佳解,two pass scan
time complexity O(M*N) & space complexity O(1)
[ Phone 2 - Aug ]
- coding 2: 給一個array [5 2 1 1 2 5],
必須使用所有的元素來形成任意個subset
每個subset的和是一樣的, 尋找最大的subset數量 (依這個例子答案為2).
這題可以視為LC.698的變體(不指定k)。一開始我覺得可以用greedy,
後來討論得到counter-example後改用sort + backtracking暴力解.
[ Phone 3 - Aug ]
- 針對履歷問了非常多問題也非常細,舉幾個例,API gateway的好處是什麼
(SSL termination, throttling blah blah..),
API rate limiting具體怎麼實現(token bucket algorithm),
CAP theorem,怎麼樣避免S3上eventual consistency的問題,
訓練出來的模型怎麼存放/versioning,evaluation metric怎麼挑選,
做什麼trade-off,怎麼debug Spark jobs...等等
可以感覺出來面試官知識量很夠
- 順便問了一題coding 3: LC 56. Merge intervals
你能寫錯嗎? 練到爛了閉著眼睛都能寫出來
[ Result ]
前三輪我聽recruiter説都是得到很好的評價,
剩下應該還有一到兩關面試,
但大概是最近抖音美國被川普搞得雞犬不寧
recruiter直接ghost我,我也懶得follow-up了
* Yelp - Senior Software Engineer
- 2019年11月網路上投遞,2020年8月才收到OA邀請orz
[ Online Assessment - Aug ]
- 一題,給一連串的Review,有公司id跟使用者id,算公司間的jaccard similarity
[ Phone interview - Aug ]
- 不記得問啥了,很簡單就是
[ Onsite - Sep ]
- Behavioural interview: 過去的失敗,最驕傲的project,最困難的project等等
- System design: 設計distributed cache system
- Behavioural interview: 遇到衝突如何處理,最好給出實際例子,不然他們一律當你
是掰的
- Coding interview: 非常簡單的問題,兩個follow-up,LC easy那種
[ Result ]
面試完兩個禮拜後通知verbal offer for IC3, £125k GBP/year
優點是可以fully remote 完全不用進辦公室也沒關係
而且拿到offer之後所有的面試官都寄信給我恭喜我...汗
* Apple - Software Engineer
- 內推,當初內推選了四個職位,其中一個是AI/ML組,這是JG的組
(JG是Jeff Dean很久以前在Google的上司,2018年join Apple)
算是Apple頗具未來潛力的組,專門做Machine Learning的
- Apple組與組之間的面試風格差異非常大,僅供參考
[ Phone - Aug ]
- 針對履歷問一些問題,包括機器學習/分散式系統,都是基礎知識,
但可以感覺出來面試官知識量很夠
- coding: 給一串文本, 及兩個字, 回傳最小的距離
e.g. text = [cat dog cat dog mouse],
word1=cat word2=mouse, output為2
e.g. text = [cat dog mouse dog mouse],
word1=dog word2=mouse, output為1
e.g. text = [cat dog mouse dog mouse],
word1=mouse word2=mouse, output為2(不是0喔!!)
[ Phone 2 - Aug ]
- coding: LC 200. 加問了幾個follow-up但都很基本
太熟了,時間還沒到就結束面試了
[ Onsite - Sep ]
總共五輪面試,分成兩天,面試官幾乎都是同team或隔壁team的,
看LinkedIn發現這些人背景一個比一個兇猛,還沒join就開始有imposter syndrome了...
- 第一輪Behavioural:問了一堆技術上的問題,怎麼trade-off,怎麼lead,
怎麼解決衝突,怎麼面對同team的人的challenge等等
- 第二輪Coding: 先花了半小時討論怎麼設計一個fault-tolerant的資料處理系統,
watermark,idempotency,一些實務上會遇到的巨量資料處理問題等等
然後花十五分鐘問了一個基本的Linked List問題,把A-B-C-D反轉成B-A-D-C,
再follow-up一下如果寫成recursive call要多少個node才會產生stackoverflow
(1MB stack總共可以裝16k個call,每個call有return address/3 local variables
/1 arg/1 function reference pointer)
- 第三輪Coding: 非常模糊的問題,給一個array of log entry, 類似下面的格式
LogEntry {
user_id
query
timestamp
session_id. // NEW
reformulation_type // NEW
}
要寫出兩個function, 一個是怎麼產生reformulation type,
就是query跟query之間的關係
可以是add/delete/modify/same 等等 (這些都要自己去定義,面試官完全不說話)
一個是要你在這個log entry裡加兩個新的field.
給了一個O(NlogN)的做法,並用Jaccard similairty去產生reformulation type
這題非常新穎,我運氣好剛好想到jaccard similarity的解法
過後聽feedback說是讚譽有加
- 第四輪System design: 設計多人線上井字遊戲系統
- 第五輪Machine Learning: 問了很多簡歷上的東西,怎麼最佳化model training
之前是怎麼改善模型, 一些技術細節怎麼實現等等,
然後就開始轟炸我機器學習相關問題
例如假設今天我是蘋果工程師,會怎麼做federated learning on 1 billion devices
GBDT要取哪些模型輸出送往中央伺服器,每個epoch要多少個參數
怎麼對模型輸出動手腳以免被attacker逆向工程出真的模型(鬼才知道)
後來沈思一下,隨便亂回答一個加入Gaussian noise進去參數裡面,
結果竟然矇對了(汗)
話說這個職位並不是做ML的,所以這一輪本來是coding interview
但是因為我過去背景以及面試官背景的關係
我猜他面到一半就改弦易轍想全部都問我ML,
不愧是蘋果,夠random
面完後好奇看了一下面試官LinkedIn, 嗯劍橋PhD in ML
[ Result ]
面試完過了一個禮拜通知verbal offer for ICT4,
Fuzzy offer for anonymity: £140K ~ £170K GBP/year
總結:
Reject: Indeed(?), Google, Facebook(?), Stripe,
TikTok(?), SmartNews(做完OA就被reject了)
Offer: Spotify, Apple, Yelp
對凡人(Non ACMer/Non奧賽)而言刷題很重要,
我Leetcode買了premium後大概花11個月時間陸陸續續刷了約700題,
每天下班後穩定1~3小時左右無壓力慢慢刷,
輔佐以Elements of Programming Interviews的解題觀念。
Coding interview最重要的就是problem clarification沒有之一,
你沒有搞清楚輸出輸入跟邊界條件根本不可能寫出好的解答,
另外我強烈推薦找一兩個人幫你mock interview,
我自己透過mock解掉了很多解題面試上的盲點
結果就是除了Google之外
我今年沒有fail過任何一個coding interview.
System Design準備上我只有在Youtube上看看一些影片,
再加上一本Design Data-Intensive Application (DDIA, 軟體工程師必讀聖經本),
以及一本Streaming systems(有點太專門了), 其他都是平常設計系統的實戰經驗累積。
我有看Gro-k-k-ing the system interview, 但我覺得有些deep dive不夠深,
deep dive部分還是要靠DDIA,
system design primer
(https://github.com/donnemartin/system-design-primer)
以及follow一個大神的頻道
(https://www.youtube.com/channel/UC9vLsnF6QPYuH51njmIooCQ)
經常看LC以及一畝三分地的面試經驗有很大幫助,讓我理解各個公司面試風格的不同
(例如FB愛出LC原題每輪要解完兩題,G幾乎不考原題,
重視溝通 problem solving與逐步優化,
Amazon極重視Leadership principle,
Apple基本無法準備,完全不按牌理出牌等等).
TC(total compensation)在Blind & levels.fyi上可以找到一些參考
(但台灣幾乎沒有任何樣本可供參考, 嘆),
negotiation也是必要的,上網看看人家怎麼做,
例如這傢伙https://haseebq.com/my-ten-rules-for-negotiating-a-job-offer/
希望這些面經對大家有些幫助!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 80.2.23.126 (英國)
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1600446532.A.1E2.html
... <看更多>