正值春招,相信很多程序员小伙伴都在紧张地准备面试。力扣特别邀请和采访了硅谷资深技术面试官沈老师,站在面试官的角度和大家聊一聊 国内外技术面试中的考察点以及算法学习经验,帮助大家充分准备技术面试。
一、面试官背景介绍
大家好,我在美国硕士毕业之后进入硅谷一线公司工作,现在已经工作接近七年。毕业后我面试过Apple,Google,Facebook,Amazon 等十家公司获得了八个 Offer,最后选择在苹果公司工作。工作三年后跳槽去了Facebook,跳槽过程中面试了Snap,Netflix,Slack,Google 等公司,通过了所有的技术面试。我在 Facebook 的最后一年担任工程师经理,期间有不少中美独角兽前来联系。我选取了其中一些比较有意思的公司进行了交流,拿到了阿里钉钉,字节跳动,以及三家美国独角兽公司的 Offer,目前在一家硅谷创业公司担任 tech lead 的职位。
在工作的过程中,我也乐于帮助公司筛选人才,在所有任职的公司都担任面试官。我个人也对准备和应对面试比较有心得,之前和朋友一起出版过程序员面试相关的书籍,最近在准备一些算法内容讲解和技术干货的内容,后面会分享给大家。
下面,我就针对 技术面试中大家会遇到的一些常见问题做一些解答,希望对大家有所帮助。
二、面试前准备
Q1:在面试前,面试者应该如何有针对性地准备技术面试?
面试的第一步就是投简历,面试者首先要准备一份有吸引力的简历。作为技术求职者,简历中之前做过的项目是突出自己水平的重中之重。
已有工作经验的求职者
对于已有工作经验的求职者而言,之前的工作项目,特别是有大量代码量或者技术难度的项目需要重点描述。描述的过程中需要回答这三个问题:做了什么,怎么做的(比如用了什么框架,什么算法),最后实现了什么样的效果。如果项目和所要申请的公司有很大的匹配度,那么恭喜你,你会有更大的机会被邀请参与面试。公司看重的是你的能力和经验,像写命题作文一样地在简历中突出这两点可以提升你的竞争力。
刚毕业或者即将毕业的学生
对于刚毕业或者即将毕业的学生而言,可能实际的工作和项目经验就不是那么多。但是很多课程项目,大作业,毕业论文,都可以当成业界经验来描述。
优先级可以参考这个顺序:
之前的业界实习,毕业设计或者毕业论文,课程大项目,开源项目的贡献等等。
在准备完简历之后,你需要对简历的内容进行模拟问答。首先要准备一个简短的自我介绍,涵盖自己的背景,求职目标等。对于简历上写的项目,都需要提前准备,做到对答如流。对于每个项目,你一般需要准备两个版本:
简单版本:可以讲清楚这个项目实现了什么,你在其中的角色是什么,你最后实现了什么功能;
深入版本:准备项目的技术难点和细节,比如说可以利用若干个开源方案解决这个问题,为什么最终选择了这个方案,其中的取舍是什么。在简历之外,还需要准备一些行为问题,也就是所谓的文化面试。包括如何应对压力,和队友产生分歧的时候怎么处理等等。这些可以搜索一下网上常见的问题。
在你进行了充分的准备之后,就可以开始你的求职之路。首先你需要选择合适的公司和职位。在选择面试公司的时候,应该根据 自己的风险偏好 决定公司的成熟度。
上市公司在工作安全性方面会更好,但是可能工作的上升通道有限,并且公司的股票价值也许增长空间不大。创业公司受经济周期的影响更大,有倒闭破产的可能,但是一旦成功,与之对应的收益也非常大,甚至可能在你三十岁左右就能财富自由。
所以,根据自己的风险偏好选择目标公司,才不至于有看着大公司想发财,去了小公司怕被裁,这样错配的情况。在选择面试职位的时候,应该 根据自己的能力和知识结构,选择对应的职位,尽量不要选择技术差异比较大的不同方向,这样会过分分散自己的准备精力。对于应届毕业生而言,可能选择职位是一个难点,在硅谷,很多科技公司对于学生是统一招聘,即不设特定的职位,通过面试后再选组。而国内的笔试,校招面试,也是比较普适的,所以只要能够表现出自己的知识储备和技术基础就行。
如果有幸通过了简历筛选进入到面试流程,那么在面试之前,对于每个需要面试的公司,都应该做一些尽职调查。包括 了解公司的业务范围,所要面试组的技术框架,这样一来可以在面试中和面试官拉近关系,二来也是对自己负责,了解未来东家的工作氛围和技术实力。
三、面试过程
Q2:算法一直是技术面试考察的重点,在技术面试中考验候选人算法水平的目的是什么?
国内外公司在技术面试中都会考察算法,特别是对于刚毕业的学生,其所占的比重更大。在校招笔试的过程中,大量问题都穿插着算法。面试过程中,算法的实力更是决定你 Offer 的大小,是不是能拿到阿里星等特殊 Offer 的关键因素。
在技术面试中考验候选人的算法水平,我个人觉得是非常有必要的。对于成百上千次查询,可能算法的优劣并不明显,但是考虑到 Facebook,Google,淘宝这种量级,算法复杂度常数时间的差异都能决定用户体验,更不用提如果算法有量级上的差异了,这种差异甚至能决定一个业务能做和不能做的区别。此外,算法面试还是模拟工作中解决一个实际问题的最好方式。在面试过程中,通过面试官给定一个问题,面试者对问题进行细化,通过若干次算法迭代实现最好的解决方案,不正是在工作中反复出现的场景么?
Q3:国内外公司算法面试的流程是什么样的,在内容和形式上有什么区别?
整体而言就算法面试来说,国内外的面试方法大致相同。一般都是给出一个类似于力扣上的编程问题,需要面试者在给定时间内给出时间和空间复杂度最优的解法,并且编程实现它。
在解决问题的时候,算法和数据结构就像一对孪生兄弟,会交织在一起。原因在于,好的算法往往要有数据结构的支撑,而数据结构本身的实现,比如散列表,红黑树,有包含了算法优化的精髓。
面试官通过观察面试者对于算法和数据结构的了解程度,就能比较准确地判断面试者的水平。比如初级面试者听说过散列表,中级面试者知道关于散列表的一些算法,而高级面试者就可能知道散列表算法的实现方式,并且可以对 Java 或者 C 自带的散列表实现发表看法,指出它们的优势和不足,并且权衡什么时候应该使用语言自带的散列表,什么时候应该使用第三方开源库的解决方案。这些细节都会影响最后的定级和 Offer。因此,面试者需要十分重视算法能力的提升。
Q4:在技术面试中面试官主要考察面试者的哪些方面?
在面试过程中,技术水平是第一要素。学历,特别是对硅谷公司而言,并不是特别重要。谷歌还有高中没毕业的学生被录取作为工程师。从面试官的侧重点来说,一般硅谷的全天面试分为 5~7 轮,具体分配如下:一般有至少两轮的算法面试,侧重于算法和数据结构,需要在白板或者电脑上当场写一到两个编程问题;一轮系统设计面试,比如设计一个分布式系统的架构,设计一套客户端和服务端的函数接口,设计手机软件的一些库函数等等;一轮文化 / 背景面试,考察面试者之前的项目深度,并且判断面试者是否能够比较好的融入公司环境;一轮招聘老板面试,也是侧重于面试者的经验以及和团队合作的能力。
在国内的面试中,校招和社招的区别是比较大的。对于刚毕业的学生来说,没有太多项目经验,会更看重你的学习能力和技术热情。
Q5:在面试过程中如遇到不会的算法问题,应如何积极应对?
对于一个算法问题,我们一般都需要完成如下五步:
1)明确题意
了解面试官想要我们解决一个什么问题,有哪些需要处理的边界条件。
2)描述一个大致算法
从最基础的暴力解法逐步优化到最优解。在这一步,如果我们没有思路,可以不妨从比较小的情况开始考虑,找找规律。比如说,要求求解 n 的情况,那我们不妨先看看 n=1 的时候应该怎么解决,n=2 的时候怎么解决,等等。这时候,先获得一个暴力解法可以确保至少有一个可行的解答。并且在说完自己的思路之后,面试官也会给出一些提示。在描述算法的时候,可以利用方框图,伪代码等工具,方便自己之后的面试过程。
3)实现代码
这里需要注意命名和格式的规范性,处理边界条件,并且能够灵活应用子函数,使得自己的整体思路更为清晰,增加代码的可读性。在实现的过程中,可以向面试官解释一下每一块代码在做什么。如果思路卡住了,也要及时交流,告诉面试官自己在想什么,碰到了什么问题。
4)跑一个测试
很多人写完代码之后觉得大功告成,但其实代码里可能有非常明显的错误。这时候需要写一个测试用例。如果是上机面试的话,可以跑一下代码,看看对不对。如果是白板面试,那么可以自己指定一组输入数据,根据代码,一步一步的去“运行”自己的程序,写出每一步的状态,看看能不能跑出预想的结果
5)描述算法复杂度
最后一步需要让面试官知道我们对算法的了解深度,以及如何评判一个算法的优劣。
Q6:有一些面试者自认为表现良好,和面试官交流不错,为何没有进入下一轮面试?
正如上面说的,技术面试并不仅仅是一个你问我答的过程,而是一种思维方式,以及做事方式的体现。很多人还是以为技术面试就是考试,面试官出个题,我写一下,最后点一个运行键,答案对了就算过。的确不否认算法的结果最终决定面试的成功与否,但同样不应该否认面试过程的重要性。如果在解答过程中没有做好上述五步的任何一步,都有可能造成自我感觉良好但没有通过的情况。举个例子,比如说面试者第一步没有做到位,那么很有可能面试者会漏掉一些边界情况,甚至于写的代码和要求的方向不相同,这时候,你代码写得再好也是南辕北撤。
Q7:在面试过程中,面试者有哪些表现会让面试官印象深刻,有哪些表现会影响下一轮面试?
在面试中比较重要的加分项包括这几点:
1)面试者有较好的技术背景
这个和本身的实力有关,面试前部分的内容也有提到,对自己简历的打磨和准备有关。
2)能够系统性地去分析和解决一个问题
在前面的内容也有提到,能比较好地完成“解题五步走”。
3)能够快速并且正确的实现最优解法
比较重要的失分项包括这几点:
1)交流有障碍
不明确问题就开始写答案,写出来的回答和问题没有太大关联。
2)没有办法想出解决方案
很容易卡住思路。一旦没有想法之后也不会通过合理的沟通获得提示。
3)代码实现能力差
很多失败的面试者能够想到一些思路,但是把思路转化为代码的能力很弱,没法写出可以正常运行的解答。
当面试者了解这些加分项和失分项以后,面试官对你的印象就不是非常重要了。有些面试者喜欢通过面试官的语气,表现,甚至是交谈内容,来揣测自己的面试情况,这个其实我个人觉得没有必要。原因在于每个面试官的性格不同,有的人就是比较热情,有的人就是比较内向,通过面试官的反应来揣测自己的面试表现,反而可能给自己不利的心理暗示。在了解了面试评判的这把尺子之后,好好表现自己的实力才是最重要的。
四、面试总结
Q8:如果有几个候选人的表现基本差不多,如何确定最终 Offer?
硅谷很多科技公司,特别是有名的那几家互联网公司,都是所谓的 “按标准招聘”。也就是说,只要面试者通过了公司的面试标准,都可以给 Offer。当然有些公司也会对某个特定的职位,同时面试一些候选人,选择其中的一个。不管哪种方式,最终都是根据技术水平,经验和面试表现来决定。
Q9:作为面试官你有哪些面试建议?
面试不是学校的考试,而是一个双向交流的机会。不单单是公司在选择候选人,也是候选人选择公司的机会。任何一次面试都是学习的机会,能够在一轮面试中了解公司的更多信息,了解行业的更多情况,了解业界的技术,所以不需要有太大的心理包袱,觉得面试官就是高高在上,最终,两者应该是一个对等的关系。
同时,面试具有一定的偶然性,并不存在你进不了一家小公司,那么一定去不了谷歌这样的一线大公司,但是反过来说,你所作出的准备,积累的能力以及花费的时间,都能够使得这种偶然性最终变成一种必然性。当水平和面试经验累积到一定程度的时候,就能做到面一家进一家的境界。
Q10:作为面试者有什么给大家的算法学习建议?
首先需要系统性地学习一些基本内容。算法和数据结构至少要修过大学课程。在校期间,如果有机会一定要选修相关课程。如果没有这些条件,那么现在网上的资源也非常多,所以完全可以选择名校的公开课,去系统性地学习一下。
在有了基础的铺垫之后,需要进行大量的操练。力扣平台是我见过最好的在线编程平台,不单单有公司分类,题型分类,还有难度分类。我个人建议这样的顺序:
1)对于题型进行分类攻克
比如这周就是专攻二叉树,那么可以做一下二叉树的简单和中等难度的题目。
2)对于难度进行突破
在分类总结了针对题型的解题方法之后,需要在难度上有所突破。这里可以选择一些高频的困难题,挑战一下自己。开始可能会觉得比较困难,但没有关系,哪怕一天就看懂了一两道题目的解答,也是一种进步。在攻克难题的过程中,多看力扣社区的讨论,对于不熟悉的方法,可以回到课本或者网上资源,进行查缺补漏。
3)对于要面试的公司,花时间准备一下该公司的高频题
这一步并不是说寄希望于面试的时候能碰到一样的题目,只是了解一下公司的面试风格。比如,有的公司可能就喜欢问递归的题目,有的公司因为偏向系统层,就喜欢问比特操作,等等。
4)在适当的时候也可以参加一些力扣周赛
考验自己在有时间限制的情况下,能否给出漂亮的解答。
Q11:如果面试失利,如何总结面试教训,争取下一轮面试拿到 Offer?
刚才我们说过,不论面试成功与否,都是一次学习的机会。对于每次面试不了解的问题,都应该去网上查一下解答。对于自己表现得不好的地方,也可以去思考如何改进,如何准备,如何在下次碰到类似的问题的时候表现得更好。
小结
看完硅谷资深技术面试官沈老师详细的面试解答,相信很多同学都对技术面试有了更加深刻的了解。从现在开始,你可以根据技术面试的各项要求逐一准备起来。后续我们还会邀请沈老师为大家做一些算法学习内容的分享,各位小伙伴们可以持续关注力扣。
最后,祝大家都能在春招中收获满意的 Offer!
本文作者:沈老师
声明:本文归作者版权所有,如需转载请联系。文章封面图来源于网络,如有侵权联系删除。
,