有了这份程序员面试指南,你离大厂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
在面试过程中,期望了解到候选人的思考过程,不仅仅是考察技术能力,同时也会考察候选人到底是怎么来解决具体问题的。候选人需要和面试官来回沟通确认来明确和佐证自己的观点。
在面试过程中可能会遇到一些开放式的问题。这个时候也不用紧张,可以和面试官来沟通明确具体问题的边界,一步一步来解决。
当回答一个问题的时候,候选人需要多尝试思考一些优化的方案。很多情况下,可能最开始的解法不一定是最优的。如果可能的话,在最开始回答问题的时候,可以直接先给面试官一个暴力的解法,这样方便在很短的时间之内明确你是否真的了解清楚了题意。
面试过程中,并不一定真的会在 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 等,算法复杂度和代码实现。 递归: 递归和迭代的转换;
系统设计
参考资源
书籍
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
关于 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]
参考资料
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之道公众号
好文章,我在看❤️