程序員面試指南,你離大廠Offer不遠(yuǎn)了

圖by: 石頭 @ 長白山
關(guān)于作者:程序猿石頭(ID: tangleithu),現(xiàn)任阿里巴巴技術(shù)專家,清華學(xué)渣,前大疆后端 Leader。用不同的視角分享高質(zhì)量技術(shù)文章,以每篇文章都讓人有收獲為目的,歡迎關(guān)注,交流和指導(dǎo)!
在這篇文章 面試 Google, 我失敗了 | Google 面經(jīng)分享?中,分享了 Google 中國的面試流程和體驗(yàn),并分享了 HR 小姐姐給提供的英文版的 Google 面試指南。
但不少讀者反饋本來想仔細(xì)讀讀的,但一看到是英文版就頭大了。其實(shí),石頭想說,作為碼農(nóng)從業(yè)者,我們閱讀基本的英文文獻(xiàn)的能力還是應(yīng)該具備的,不然怎么面向 StackOverflow 編程呢?
啥?說啥叫面向 Stack Overflow 編程,看看如下視頻(注意有聲音)就知道了。
哈哈,為了方便大家,本篇文章,我將結(jié)合原來英文版的 Google 面試指南的主線,根據(jù)自己的理解對(duì)文章進(jìn)行修改,然后結(jié)合自己面試國內(nèi)大廠的經(jīng)驗(yàn)給大家闡述。其實(shí)石頭覺得,各大公司針對(duì)程序員崗位的面試流程來講是相對(duì)比較通用的,只是有的公司在算法(Code)環(huán)節(jié)要求會(huì)更高一些,比如 Google,Airbnb (之前也面過 Airbnb,被完虐),包括國內(nèi)的頭條等。?
因?yàn)檫@份面試指南相對(duì)比較通用,因此石頭直接把題目從?Google 面試指南改為大廠面試指南了。下面就直接來說重點(diǎn)吧。
了解你投遞的崗位
首先最重要的就是了解你要投遞、面試的崗位具體的工作內(nèi)容和職責(zé),一般還需要了解對(duì)應(yīng) hc 的職級(jí)。一般而言,公司招聘都是一個(gè)蘿卜一個(gè)坑,蘿卜太大或太小都不一定合適。比如有的公司,預(yù)期是招聘 P7 級(jí)別的,但你剛畢業(yè)兩三年,可能希望就不大。本來只想招聘 P6,結(jié)果來了一個(gè) P8 的候選人肯定不合適,所以有時(shí)候面試沒通過并不是候選人不夠優(yōu)秀,也有可能是候選人過于優(yōu)秀。
這里分享一個(gè)國內(nèi)部分互聯(lián)網(wǎng)公司職級(jí)薪酬對(duì)比圖,大家可以參考一下。

互聯(lián)網(wǎng)大廠薪資對(duì)應(yīng)關(guān)系,圖來源:曾加@知乎
下面闡述下原文中的 Google 的 SWE 崗位。
SWE 其實(shí)就是 Software Engineer 的縮寫,就是一般的碼農(nóng)崗位啦。Google 的 SWE 崗位根據(jù)不同的項(xiàng)目,可能需要參與到項(xiàng)目的各個(gè)流程中,比如:調(diào)研(研究),設(shè)計(jì)架構(gòu),做計(jì)劃,開發(fā)測試以及發(fā)布等各個(gè)周期。
涉及到具體的產(chǎn)品可能需要處理大規(guī)模的數(shù)據(jù),需要提供詳細(xì)的解決方案,將具體的方案落地時(shí)可能會(huì)涉及到技術(shù)的方方面面。有點(diǎn)“全棧工程師”的味道。
Google 是一家技術(shù)驅(qū)動(dòng)型公司,招聘各種技術(shù)人才來處理各種技術(shù)難題,影響的用戶都是數(shù)千萬上億級(jí)別的。設(shè)計(jì)到的具體產(chǎn)品包括:AdWords,Chrome 瀏覽器,Android,Youtube Google 云和 Google 地圖等等,Google 的工程師正在通過各種各樣的技術(shù)來改變世界。
面試 Tips
在面試過程中,期望了解到候選人的思考過程,不僅僅是考察技術(shù)能力,同時(shí)也會(huì)考察候選人到底是怎么來解決具體問題的。候選人需要和面試官來回溝通確認(rèn)來明確和佐證自己的觀點(diǎn)。
在面試過程中可能會(huì)遇到一些開放式的問題。這個(gè)時(shí)候也不用緊張,可以和面試官來溝通明確具體問題的邊界,一步一步來解決。
當(dāng)回答一個(gè)問題的時(shí)候,候選人需要多嘗試思考一些優(yōu)化的方案。很多情況下,可能最開始的解法不一定是最優(yōu)的。如果可能的話,在最開始回答問題的時(shí)候,可以直接先給面試官一個(gè)暴力的解法,這樣方便在很短的時(shí)間之內(nèi)明確你是否真的了解清楚了題意。

面試過程中,并不一定真的會(huì)在 IDE 上編譯和跑通代碼。但最好刻意提前在白板或者紙上聯(lián)系寫代碼。注意要想清楚一些邊界的條件,不要遺留一些明顯的 bug。但不用糾結(jié)一些具體的很小語法錯(cuò)誤,只要讓面試官明確意思即可,比如不用糾結(jié)substring的參數(shù)到底是(startIndex, length) 還是 (startIndex, endIndex)。
電話面試
電話面試一般會(huì)涉及到數(shù)據(jù)結(jié)構(gòu)和算法,大概也就是 20~30 行代碼,你可以用你自己最熟悉的編程語言。注意代碼有良好的可讀性,并且足夠魯棒。
你可能會(huì)被問一個(gè)很開放的問題,需要你跟面試官溝通明確問題的邊界,具體的需求; 問題明確后,你需要向面試官解釋你的算法思路; 然后需要有能力將上面的算法思路轉(zhuǎn)成代碼。因?yàn)闀r(shí)間有限,不會(huì)要求你給一個(gè)完美的解法的。可以先寫出一個(gè)解法來,然后再逐步優(yōu)化。注意一些邊界的 case。確實(shí)在真實(shí)的面試場景中這一步就會(huì)卡掉很多人。在石頭的這篇“從一道面試題談?wù)勔痪€大廠碼農(nóng)應(yīng)該具備的基本能力 ”文章中 也闡述了自己作為面試官面試的時(shí)候遇到的各種場景。 逐步優(yōu)化你的代碼,自己主動(dòng)寫測試用例來測試解決其中的 bug。一定要自己主動(dòng)多思考、自測,而不要等到面試官來提示你或者指出你的bug。在面試當(dāng)中,你主動(dòng)思考寫測試用例會(huì)有加分的。
編碼(算法)面試
Coding: 至少用一門你熟悉的編程語言(不限,推薦 C++,Java,Python,Go 或者 C)實(shí)現(xiàn)給定的題目。從代碼中會(huì)考察一些基本的API、面向?qū)ο蟮脑O(shè)計(jì),編碼和測試,包括各種邊界條件的處理。注意會(huì)重點(diǎn)關(guān)注解題目過程中的理解和溝通能力,而非背誦。
算法: 可能會(huì)涉及到 排序/搜索/分治/動(dòng)態(tài)規(guī)劃/貪心/遞歸,具體數(shù)據(jù)結(jié)構(gòu),以及也有可能會(huì)涉及到 Dijkstra 和 A* 等算法,需要你會(huì)算法復(fù)雜度的分析。推薦你在下筆(下手)之前,最好先和面試官溝通大致思路。
排序: 常見的排序算法,時(shí)間/空間復(fù)雜度,各自適用的使用場景分析。例如 快排/歸并/堆排序/插入/基數(shù)排序等等;知道比如在有一些特殊的場景下,可能插入排序或者基數(shù)排序會(huì)優(yōu)于常見的快排、歸并或者堆排序。
數(shù)據(jù)結(jié)構(gòu): 數(shù)組/鏈表/堆/棧/hash/數(shù)/二叉樹等;知道具體什么算法搭配什么數(shù)據(jù)結(jié)構(gòu)。
數(shù)學(xué): 可能會(huì)涉及到離散數(shù)學(xué)、組合數(shù)學(xué)等。這在 Google 還相對(duì)比較常見。例如選取問題 -- N 個(gè)中選 K 個(gè)的方法等;
圖: 有一些問題可能常常會(huì)涉及到圖相關(guān)算法,例如距離,搜索,連通性,環(huán)的檢測。你需要知道常見的圖的表達(dá)方式(例如矩陣/鄰接表),并理解各種表達(dá)方式的優(yōu)缺點(diǎn)。圖的遍歷方式 bfs/dfs 等,算法復(fù)雜度和代碼實(shí)現(xiàn)。
遞歸: 遞歸和迭代的轉(zhuǎn)換;
系統(tǒng)設(shè)計(jì)
系統(tǒng)設(shè)計(jì)問題會(huì)考察候選人如何將理論知識(shí)和經(jīng)驗(yàn)到現(xiàn)實(shí)的具體問題場景中來。
比如常見的話題可能會(huì)包括:接口,類繼承關(guān)系,分布式系統(tǒng)等。在特定的場景中,一定的約束條件下,如何設(shè)計(jì)出可擴(kuò)展性強(qiáng)的系統(tǒng),如何平衡比如簡單性、性能、魯棒性。
在系統(tǒng)設(shè)計(jì)過程中,需要你熟悉各種互聯(lián)網(wǎng)技術(shù),比如路由,域名解析,負(fù)載均衡,防火墻等等。
可能還會(huì)涉及到如一些圖的遍歷,分布式系統(tǒng),以及如何抽象顯示生活中的一些問題,變成產(chǎn)品設(shè)計(jì)。設(shè)計(jì)的知識(shí)點(diǎn)可能會(huì)包括:具體的 API,二叉樹,緩存,MapReduce,索引,倒排索引,編譯器,內(nèi)存緩存,網(wǎng)絡(luò)等等。
系統(tǒng)設(shè)計(jì)題目一般在面試中都會(huì)有,我在面試 Google、之前面試 Amazon 等都有一輪面試主要考察這個(gè)點(diǎn)。這里可以結(jié)合一些比如面向?qū)ο蟮脑O(shè)計(jì)原則等來解答,考慮系統(tǒng)可擴(kuò)展性等。可能面試官會(huì)讓你不斷優(yōu)化,直到你回答不上來為止。我理解面試官其實(shí)不是真正想要從你這里得到一個(gè)最優(yōu)解,只是希望在這個(gè)過程中考察你的思維方式等。
操作系統(tǒng)也是其中的一個(gè)考察點(diǎn),需要了解進(jìn)程、線程,并發(fā)(并行),鎖,信號(hào)量等等概念以及他們的實(shí)現(xiàn)機(jī)制。知道一些基本的比如死鎖是怎么發(fā)生的以及如何避免,進(jìn)程、線程的區(qū)別,他們的調(diào)度資源是什么。
參考資源
書籍
就不貼書的購買鏈接了,英文原版可能比較難啃,這些都是很經(jīng)典的書籍。
Cracking the Coding Interview[1] By: Gayle Laakmann McDowell Programming Interviews Exposed: Secrets to Landing Your Next Job[2] By: John Mongan, Eric Giguere, Noah Suojanen, Noah Kindler Programming Pearls[3] By:Jon Bentley Introduction to Algorithms[4] By: Thomas Cormen, Charles Leiserson, Ronald Rivest, Clifford Stein
(快告訴我,我不是一個(gè)人
)。不過還是想計(jì)劃慢慢啃一啃的。
如果針對(duì)面試臨時(shí)抱佛腳的話,根據(jù)面試崗位推薦看看 More 開頭的幾本(例如C++/Java的),《編程之美-微軟技術(shù)面試心得》、《程序員的自我修養(yǎng)-裝載、鏈接與庫》、《程序員面試寶(金)典》等。
然后值得收藏細(xì)品的還有《深入理解計(jì)算機(jī)系統(tǒng)(Computer Systems: A Programmer's Perspective,CSAPP)》、《TCP/IP 詳解》系列、《計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)》系列(Donald E.Knuth 的神書)等。
以下部分內(nèi)容就直接引用 Google 面試指南的參考資源了,對(duì) Google 感興趣的可以跟蹤鏈接去深入了解,在此推薦都了解下 Google 大數(shù)據(jù)的 “三駕馬車” —— MapReduce、GFS、BigTable。
關(guān)于 Google
Company - Google[5] The Google story[6] Life @ Google[7] Google Developers[8] Open Source Projects[9] Github: Google Style Guide[10]
面試準(zhǔn)備
How we hire[11] Interviewing @ Google[12] Candidate Coaching Session: Tech Interviewing[13] CodeJam: Practice & Learn[14] Technical Development Guide[15]
Google Publications
The Google File System[16] Bigtable[17] MapReduce[18] Google Spanner[19] Google Chubby[20]
為了方便,我將此文做成了 PDF,你只需要在公眾號(hào)后臺(tái)回復(fù) “Google面試指南” 即可獲得本文(包含英文原版)。
參考資料
Cracking the Coding Interview:?https://books.google.ie/books?id=nlgWywAACAAJ&dq=Cracking+the+Coding+Interview&hl=en&sa=X&ei=hUTtUfXVCoSg4gS5v4C4BQ
[2]Programming Interviews Exposed: Secrets to Landing Your Next Job:?https://books.google.com/books/about/Programming_Interviews_Exposed.html?id=9_by-rpCSSUC&hl=en
[3]Programming Pearls:?https://books.google.com/books/about/Programming_Pearls_2_E.html?id=vyhrriC6qcEC&hl=en
[4]Introduction to Algorithms:?https://books.google.com/books/about/Introduction_to_Algorithms.html?id=VK9hPgAACAAJ&hl=en
[5]Company - Google:?https://www.google.com/about/our-company/
[6]The Google story:?https://www.google.com/about/our-story/
[7]Life @ Google:?https://www.youtube.com/user/lifeatgoogle
[8]Google Developers:?https://developers.google.com/
[9]Open Source Projects:?https://opensource.google.com/projects
[10]Github: Google Style Guide:?https://github.com/google/styleguide
[11]How we hire:?https://careers.google.com/how-we-hire/
[12]Interviewing @ Google:?https://careers.google.com/how-we-hire/interview/
[13]Candidate Coaching Session: Tech Interviewing:?https://www.youtube.com/watch?v=oWbUtlUhwa8
[14]CodeJam: Practice & Learn:?https://code.google.com/codejam/past-contests
[15]Technical Development Guide:?https://techdevguide.withgoogle.com/
[16]The Google File System:?https://research.google.com/archive/gfs.html
[17]Bigtable:?https://research.google.com/archive/bigtable.html
[18]MapReduce:?https://research.google.com/archive/mapreduce.html
[19]Google Spanner:?https://research.google.com/archive/spanner.html
[20]Google Chubby:?https://research.google.com/archive/chubby.html
-?掃下面二維碼,獲取一份編程視頻資料?-
