今年从1月份开始,到5月初最终找到满意的工作,经历了三个多月的面试准备。在此总结一下我的面试准备方法。如果能把我说的这些复习好,在法国,甚至在欧洲的IT公司基本上就可以收割offer了。我面试的是软件工程师,具体来说是全栈工程师。当然,如果你想要面试的是Google, Facebook, Amazon或同级别的公司,还要在这个基础上付出更多的努力。
面试的类型和流程
先说说面试的流程吧。软件工程师的职位,不外乎电话面试,Online Test,Skype面试,onsite技术面试,和直接主管面试,client面试等等。
电话面试:当HR被你的简历吸引之后,一般会先打电话过来进行初步交流。主要的目的是了解你现在的情况,是否还在继续找工作。想要找什么样的工作等等。同时,HR会对你的能力进行基本考察。比如让你介绍一下当前工作内容,项目的情况等等。对于毕业生,会要求介绍做过的实习情况等等。有些人对电话面试比较害怕,认为自己的法语不好,可能说不清楚。其实在电话面试之前都是要认真准备的。要可以熟练地介绍自己的项目以及自己想找的职位。在投简历之前就应该准备好。要知道HR的效率是很高的。
Online Test:有的公司会在电话面试之后甩给你一个链接,让你做一套题。根据结果再决定是否继续。比较流行的有coding game,hackerrank等。我们公司招聘的时候用的是coding game,所以稍微了解一点后台的情况。Coding game是有题库的。很多公司为了减少成本,就会直接使用平台提供的题库。主要就是语言知识,程序设计,解决问题能力等方面的考察。每道题会有分数,所有题目答完会有一个综合分数。另外,很多公司没有在线测试,而是让求职者在onsite面试时做一套纸质的题目,这个在SSII很常见。
Skype面试:有的公司为了节省面试成本(尤其是美国公司),会安排Skype面试。内容和onsite面试就很像了,只是不是面对面而已。
Onsite面试:所有到公司local的面试都叫onsite。有的公司可能电话面试之后直接onsite,有的可能经过了好几轮才会让面试者onsite。这一步也是最认真的面试。一般会有项目介绍,还有技术题目的考察。求职者也可以通过onsite面试更加了解公司的情况。
主管面试:在通过技术面试之后,可能还会和将要进入的组的直接主管面谈。主要是看性格上能不能融入组里,面试者是不是有足够的motivation等。
Client面试:这个主要是对于SSII来说。在通过SSII的面试之后,还要去客户的公司面试。毕竟最后还是要到客户公司去工作的。流程主要就是一轮到两轮的onsite面试,有时还会有coding game的习题。
面试的准备
流程就谈到这,接下来按步骤说一说面试的准备吧。我用的语言是Java,所以以下的复习资料都是Java的,其他语言的只能大家自己去找资料了。不过大部分准备都是相通的。
自我介绍
关于自我介绍,重点是清晰,有重点和全局观。要清楚的描述自己当前的项目情况,也要想清楚,并描述清楚自己想面试的职位是什么。建议按照以下格式来准备项目介绍:
- 业务:公司业务是什么 项目的任务是什么
- 流程:项目以及业务的大体流程是什么,可以是数据流,也可以是工作流程。比如上下游都是什么
- 技术:工作中用到的主要技术是什么,说出重点,而且要和面试的职位有关联性
- 团队:团队的构成是什么,有几个人,开发流程是什么
- 任务:我在团队中的角色是什么,我完成了什么任务,获得了什么结果
Coding Game或者QA面试题
第一轮的面试题其实不是很难,都是基础知识的考察。对于Java来说,很多都是OCJCP的题目。如果考过OCJCP的同学,应该不觉得太难。如果想快速准备的话,这里有一套JournalDev总结的面试题,总结的非常好。建议花一些时间过一遍,足以应付大部分QA的问题了。
算法
在法国,大部分IT公司是不会考算法的。最多只是考一些简单的编程问题,最难的不过写一个排序了。但是,如果你想面试的是美国或者英国公司,那么算法是一定要准备的。不用怕,在三个月之前,我也连Merge Sort和Quick Sort也写不出来,连Heap和Tries的结构也说不清楚的。
对于算法来说,我觉得最重要的是打好基础。我觉得三个月的准备时间足够了。如果不够,半年怎么也足够了。那么如何准备呢?推荐三个资料
-
这本书从最简单的数据结构Bag,Queue和排序算法讲起,涉及了树,图论,String,Hashtable等常见的算法和数据结构。内容十分详实,而且讲解浅显易懂,远胜于算法导论。这本书直接改变了我对算法的理解,也在面试中帮了我的大忙。只有熟练掌握书里提供的基础算法,才能在实际问题中灵活变通。
-
这本书也是面试必读的书籍之一了。除了面试题,书里也对面试的流程和面试的准备进行了详细地介绍,建议通读全书。里面的算法题建议自己先思考,再看答案。如果没时间的话,也至少把答案都过一遍,记下解题的思路。
-
刷的题不在多,而在于有针对性。如果前两步都做完了,这个时候LeetCode的easy题目基本上就没有任何难度了,也会对自己的能力有了一定的了解。在真实面试中,也很少会出现hard难度的题目。大部分都是easy或者medium级别的。我觉得刷30道题左右就够了。主要是锻炼解题的思路和习惯,强化自己不太熟悉的知识点。刷题过后,也要认真看别人的solution,能学到不少思路和小技巧。选题也是一个窍门,那种解法比较单一,需要动脑筋或者特殊知识点的题目,大公司是不会考的。大公司比较爱考的是基础算法的变体,或者是有很多解法的问题。所以,第一步的基础要打好。
系统设计题目
系统设计题目主要是看平时的积累。对于junior来说,一般不会涉及到。这一部分也是我经验欠缺的地方。我的准备主要有如下几步:
- 熟悉常见系统的组成部分。比如Proxy,Load Balancer,缓存。对于分布式系统要熟悉CAP theroy,对于数据库要熟悉partition和sharding等概念。推荐文章: http://www.aosabook.org/en/distsys.html
- 了解常见的系统的架构。这个主要考平时的积累和观察了。我平时会订阅infoq或者国内开发者头条等文章的推送,经常有国内公司大型系统架构方面的文章分享。
- 针对性地准备系统设计题目。其实面试时的系统设计题目也是有一定的解题套路的。推荐Grokking the System Design Interview系列教程。免费的内容有一些基本的讲解和两道真题的详细解答,我觉得足够了。
Behavioral Question
重要的事情说三遍:
BQ一定要认真准备!
BQ一定要认真准备!
BQ一定要认真准备!
要把BQ的重要性提高到和技术问题一样。我自己就是Amazon的BQ挂掉了。。。关于如何准备,在Cracking这本书里有讲解。另外,我自己找到一个网站,里面列出了常见的BQ问题,建议对每一个问题都找到一个具体的例子来回答。当你积累了三十多个例子的时候,对任何问题就都能够对答如流了:https://www.mockquestions.com/interview/Behavioral/topquestions/
关于BQ的回答,我的经验是一定要说具体事例,不要泛泛而谈。
前端
前端的技术是在太广了。这一部分很大程度上也是凭借平时的积累。以前端的发展速度,半年不学习就跟不上了。
我觉得前端的知识主要涉及到如下几部分:
- 语言: JS,ES2015,TypeScript
- web:HTML5,CSS,SASS
- 框架: AngularJS,ReactJS (这边Vue用的很少)
- 工程化:npm,gulp,webpack,karma等
至少要熟悉以上技术的基本概念和用法。另外,由于前端现在技术发展十分迅猛,有丰富前端经验的程序员在市场上屈指可数,面试官对前端技术可能了解的也不是很全面。所以,面试时考察的可能不是某个知识点,而是学习的方法和能力,看面试者是否有motivation来不断进步,跟上前端的变化。
结语
说实话,我觉得我对面试的准备是相当Pragmatique的,是对面试进行的针对性训练。但是经历了这一系列准备之后,我感觉的自己编程能力确实有了提高,思维更加活跃了。认真准备,付出的努力总是会有回报的。既然选择了程序员这一行,就要活到老学到老不是吗?