有了这份程序员面试指南,你离大厂Offer还远吗?| 附推荐书籍
本篇文章,我將結合英文版的 Google 面試指南的主線,根據自己的理解對文章進行修改,然后結合自己面試國內大廠的經驗給大家闡述。其實我覺得,各大公司針對程序員崗位的面試流程來講是相對比較通用的,只是有的公司在算法(Code)環節要求會更高一些,比如 Google,Airbnb (之前也面過 Airbnb,被完虐),包括國內的頭條等。?
因為這份面試指南相對比較通用,因此直接把題目從?Google 面試指南改為大廠面試指南了。下面就直接來說重點吧。
?
了解你投遞的崗位
首先最重要的就是了解你要投遞、面試的崗位具體的工作內容和職責,一般還需要了解對應 hc 的職級。一般而言,公司招聘都是一個蘿卜一個坑,蘿卜太大或太小都不一定合適。比如有的公司,預期是招聘 P7 級別的,但你剛畢業兩三年,可能希望就不大。本來只想招聘 P6,結果來了一個 P8 的候選人肯定不合適,所以有時候面試沒通過并不是候選人不夠優秀,也有可能是候選人過于優秀。
這里分享一個國內部分互聯網公司職級薪酬對比圖,大家可以參考一下。
互聯網大廠薪資對應關系,圖來源:曾加@知乎
下面闡述下原文中的 Google 的 SWE 崗位。
SWE 其實就是 Software Engineer 的縮寫,就是一般的碼農崗位啦。Google 的 SWE 崗位根據不同的項目,可能需要參與到項目的各個流程中,比如:調研(研究),設計架構,做計劃,開發測試以及發布等各個周期。
涉及到具體的產品可能需要處理大規模的數據,需要提供詳細的解決方案,將具體的方案落地時可能會涉及到技術的方方面面。有點“全棧工程師”的味道。
Google 是一家技術驅動型公司,招聘各種技術人才來處理各種技術難題,影響的用戶都是數千萬上億級別的。設計到的具體產品包括:AdWords,Chrome 瀏覽器,Android,Youtube Google 云和 Google 地圖等等,Google 的工程師正在通過各種各樣的技術來改變世界。
??
面試 Tips
在面試過程中,期望了解到候選人的思考過程,不僅僅是考察技術能力,同時也會考察候選人到底是怎么來解決具體問題的。候選人需要和面試官來回溝通確認來明確和佐證自己的觀點。
在面試過程中可能會遇到一些開放式的問題。這個時候也不用緊張,可以和面試官來溝通明確具體問題的邊界,一步一步來解決。
當回答一個問題的時候,候選人需要多嘗試思考一些優化的方案。很多情況下,可能最開始的解法不一定是最優的。如果可能的話,在最開始回答問題的時候,可以直接先給面試官一個暴力的解法,這樣方便在很短的時間之內明確你是否真的了解清楚了題意。
圖源:Google Interview Prep Guide Software Engineer.pdf面試過程中,并不一定真的會在 IDE 上編譯和跑通代碼。但最好刻意提前在白板或者紙上聯系寫代碼。注意要想清楚一些邊界的條件,不要遺留一些明顯的 bug。但不用糾結一些具體的很小語法錯誤,只要讓面試官明確意思即可,比如不用糾結substring的參數到底是(startIndex, length) 還是 (startIndex, endIndex)。
??
電話面試
電話面試一般會涉及到數據結構和算法,大概也就是 20~30 行代碼,你可以用你自己最熟悉的編程語言。注意代碼有良好的可讀性,并且足夠魯棒。
你可能會被問一個很開放的問題,需要你跟面試官溝通明確問題的邊界,具體的需求;
問題明確后,你需要向面試官解釋你的算法思路;
然后需要有能力將上面的算法思路轉成代碼。因為時間有限,不會要求你給一個完美的解法的。可以先寫出一個解法來,然后再逐步優化。注意一些邊界的 case。確實在真實的面試場景中這一步就會卡掉很多人。
逐步優化你的代碼,自己主動寫測試用例來測試解決其中的 bug。一定要自己主動多思考、自測,而不要等到面試官來提示你或者指出你的bug。在面試當中,你主動思考寫測試用例會有加分的。
?
編碼(算法)面試
Coding: 至少用一門你熟悉的編程語言(不限,推薦 C++,Java,Python,Go 或者 C)實現給定的題目。從代碼中會考察一些基本的API、面向對象的設計,編碼和測試,包括各種邊界條件的處理。注意會重點關注解題目過程中的理解和溝通能力,而非背誦。
算法: 可能會涉及到 排序/搜索/分治/動態規劃/貪心/遞歸,具體數據結構,以及也有可能會涉及到 Dijkstra 和 A* 等算法,需要你會算法復雜度的分析。推薦你在下筆(下手)之前,最好先和面試官溝通大致思路。
排序: 常見的排序算法,時間/空間復雜度,各自適用的使用場景分析。例如 快排/歸并/堆排序/插入/基數排序等等;知道比如在有一些特殊的場景下,可能插入排序或者基數排序會優于常見的快排、歸并或者堆排序。
數據結構: 數組/鏈表/堆/棧/hash/數/二叉樹等;知道具體什么算法搭配什么數據結構。
數學: 可能會涉及到離散數學、組合數學等。這在 Google 還相對比較常見。例如選取問題 -- N 個中選 K 個的方法等;
圖: 有一些問題可能常常會涉及到圖相關算法,例如距離,搜索,連通性,環的檢測。你需要知道常見的圖的表達方式(例如矩陣/鄰接表),并理解各種表達方式的優缺點。圖的遍歷方式 bfs/dfs 等,算法復雜度和代碼實現。
遞歸: 遞歸和迭代的轉換;
??
系統設計
系統設計問題會考察候選人如何將理論知識和經驗到現實的具體問題場景中來。
比如常見的話題可能會包括:接口,類繼承關系,分布式系統等。在特定的場景中,一定的約束條件下,如何設計出可擴展性強的系統,如何平衡比如簡單性、性能、魯棒性。
在系統設計過程中,需要你熟悉各種互聯網技術,比如路由,域名解析,負載均衡,防火墻等等。
可能還會涉及到如一些圖的遍歷,分布式系統,以及如何抽象顯示生活中的一些問題,變成產品設計。設計的知識點可能會包括:具體的 API,二叉樹,緩存,MapReduce,索引,倒排索引,編譯器,內存緩存,網絡等等。
系統設計題目一般在面試中都會有,我在面試 Google、之前面試 Amazon 等都有一輪面試主要考察這個點。這里可以結合一些比如面向對象的設計原則等來解答,考慮系統可擴展性等。可能面試官會讓你不斷優化,直到你回答不上來為止。我理解面試官其實不是真正想要從你這里得到一個最優解,只是希望在這個過程中考察你的思維方式等。
操作系統也是其中的一個考察點,需要了解進程、線程,并發(并行),鎖,信號量等等概念以及他們的實現機制。知道一些基本的比如死鎖是怎么發生的以及如何避免,進程、線程的區別,他們的調度資源是什么。
?
參考資源
書籍
就不貼書的購買鏈接了,英文原版可能比較難啃,這些都是很經典的書籍。
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
然后,我再推薦一下部分書籍,大部分確實值得仔細研讀的。下圖是我的部分書籍,不過說來慚愧,有好多我也沒仔細讀過,甚至有的都還沒打開(快告訴我,我不是一個人)。不過還是想計劃慢慢啃一啃的。
如果針對面試臨時抱佛腳的話,根據面試崗位推薦看看 More 開頭的幾本(例如C++/Java的),《編程之美-微軟技術面試心得》、《程序員的自我修養-裝載、鏈接與庫》、《程序員面試寶(金)典》等。
然后值得收藏細品的還有《深入理解計算機系統(Computer Systems: A Programmer's Perspective,CSAPP)》、《TCP/IP 詳解》系列、《計算機程序設計藝術》系列(Donald E.Knuth 的神書)等。
以下部分內容就直接引用 Google 面試指南的參考資源了,對 Google 感興趣的可以跟蹤鏈接去深入了解,在此推薦都了解下 Google 大數據的 “三駕馬車” —— MapReduce、GFS、BigTable。
關于 Google
Company - Google[5]
The Google story[6]
Life @ Google[7]
Google Developers[8]
Open Source Projects[9]
Github: Google Style Guide[10]
面試準備
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]
參考資料
[1]
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
有道無術,術可成;有術無道,止于術
歡迎大家關注Java之道公眾號
好文章,我在看??
總結
以上是生活随笔為你收集整理的有了这份程序员面试指南,你离大厂Offer还远吗?| 附推荐书籍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员的“黄金时代”,死去又重来?
- 下一篇: pat1079+1086+1090+10