原文:www.enginego.org
刚开始参加工作的时候,我对面试总是很恐惧,既担心简历无法通过初筛,也担心即使简历通过筛选,因为面试经验不多以及基础知识不扎实而导致发挥不好。我刚开始拿着普通的简历(专业不是计算机,作品也没多少)也得到了一线大厂的面试机会,但是因为根本没有准备,也不知道怎么准备。自然地,那次面试我表现得不好,也没有得到 Offer。
恐惧也使我不想浪费时间去面试不同类型的公司。我当初并不知道对比其他求职者,自己的优势和劣势在哪里,也不知道如何去准备面试,面试官看重的是哪些方面,更不知道自己到底值多少钱。现在回过头看,我觉得当初只是在欺骗自己,我真正担心的是即使自己认真准备简历和面试也对结果毫无影响,更不敢去想如果放弃某个 Offer,找不到其他工作怎么办。
工作了几年,当我有了越来越多的面试官的经验之后,我越来越发现认真准备简历和面试是非常重要的,因为毫无准备就来面试的求职者真的太多了。而且互联网公司招聘到合适的工程师实在非常难,有计算机基础知识,有项目经验,愿意学习而且愿意来这家公司,实在不好找。所以只要求职者能证明自己有一定的计算机水平并且愿意努力,市场上还是有非常多机会的。
这篇文章我把这几年作为面试者和面试官身份的的经验給大家,希望大家可以从中学到一些面试的技巧,找到心仪的工作。
我很喜欢 Google 前 CEO 施密特分享的一个故事,他刚到 Google 的时候,Google 还只是个小的创业公司。他一开始以为 Google 和其他公司没什么两样,直到有一个周五,拉里佩奇在用谷歌搜索一些关键字的时候,他发现出现了一些不相干的广告推荐(这个情况我们现在在国内最大的搜索引擎也经常看到)。施密特以为接下来就是开几个会议,然后分到具体的工程师手上解决。但是拉里佩奇没有这么做,他用纸条写下”These Ads Suck!“,附上相关的截图贴在布告栏上就回家了。接下来的 72 小时彻底改变了施密特的认知。在周一凌晨 5点,有几位并不是负责广告业务的工程师发来一份邮件,从头到尾阐述了这个问题产生的原因,他们的解决方案,以及这个计划对公司有什么影响。他们从公司的角度去思考,自愿自发地用周末的时间去解决并不属于自己范畴的问题。
这样的员工我想就是每个公司都需要的:
所以求职者的简历与面试中必须能体现出这几点品质。举个例子,要在简历或者面试中展现自己喜欢学习计算机知识,与其笼统地说:
热爱计算机,喜欢学习计算机系统的知识。
可以改为:
喜欢阅读计算机系统的书籍,完成《深入理解计算机系统》80% 以上的习题。并在博客(链接)分享学到的知识。
面试官在筛选简历看到的时候就会自然地打开博客,进一步地了解求职者(恭喜你,击败了其他 80% 的求职者)。另外,一些软技能,例如团队合作能力也是面试官非常注重的一点,面试过程中如果被问到有没有带领团队的经验,即使没有也不要简单地回答没有,可以这样回答:
“我在以往的项目中与团队成员都能融洽相处,并且每个月都会做定期的技术分享互相学习,虽然没有带团队的机会,但是相信自己能够做到。”
当然这些回答不可能一下子能想到,面试方面的技巧必须多练。重要的是在职期间定期找几家公司面试练练手,一方面能知道市场的行情,找到其他更好工作机会,另一方面本身自己就有工作,等于手拿一个 Offer,面试的时候就能比较放松。未雨绸缪对于一位工程师尤为重要。等到离职再找工作就比较晚了。
找新工作之前,求职者需要先认真思考下几个问题,一份工作中你最看重的是哪些方面?
有时候薪酬远不及公司名气与规模 / 工程师文化重要,有的公司能聚集一批优秀的工程师,那么只要认真待一两年,进步速度远比其他地方快,以后跳槽也会更加容易。有的厂则能提供大量隐性的福利(国内可以参考腾讯)。求职者需要真正地去思考自己想要去怎么样的公司。工作和找男女朋友一样,找你喜欢的,而不是找你能找到的。前几家公司的选择对你的职业规划会有很大的影响,大公司还是小公司,和你个人的性格或者职业规划有直接的关系:
在国内来说,除了一些很 geek 的小公司,一般的小公司并没有那么自由,加班也可能很多。所有我觉得一开始选择大公司往往是不错的选择,之后跳槽的选择范围也更多。了解自己的想法之后,求职者可以根据自己的着重点,筛选公司,修改简历,复习常见面试题以及准备向面试官提问的问题。 最后这部分的提问非常重要,我常常期待求职者在面试结束后能问一些问题,但是很多求职者却没有,一方面怕面试官会觉得自己有很多要求,留下的印象不好,另一方面根本没有想好要问什么。这点我觉得非常不明智,公司和员工就是互相选择的,一定要多提问题,了解公司的文化以及岗位的职责。才不至于刚入职就因为不适应而要离开。这点我们在面试阶段会介绍。
仔细分析自己的优势是什么,然后在简历以及面试过程中突出,优势可以从这几点入手,后面是面试官的理解:
其中,必须根据自己的目标岗位强调自己的优势。例如,如果求职者要面试的是开发工程师,就应该突出项目经验以及对框架的熟悉程度,如果面试的是研究岗位,那么论文与文章的数量就比较重要。
随时准备并不是鼓励频繁地跳槽,而是要有随时有跳出舒服圈的准备,也许求职者已经很满意现在的工作,薪酬,觉得习惯而且安逸。不过如果公司突然倒闭,或者部门被裁减,还能找到这样或者更好的工作吗?我建议各位,每两三个月可以去面试一两家公司,因为你已经有不错的工作了,所以可以带着轻松的心态去面试,同时也可以增加面试的经验。
简历准备可以参考我们的另外一篇文章如何写一份更好的简历,我筛选过超过千份简历,遇到太多太多千篇一律毫无重点的简历,凡描述都是熟练精通xxx框架,凡个人项目经验都是博客加爬虫。而且面试官都知道,越优秀的求职者,越重视自己的简历。求职者需要从面试官的角度来思考与筛选简历,几个要点是要注意的:
简历并不是越长越好,最好的简历长度是一到一页半,列出你最优秀的项目经验以及奖项。至于语言或者框架,只是简单接触过的话就不用写上去了。面试官问你有没有学过其他的时候才说出来。(假如你只是学过简单接触过 Go 却写在简历上,却被一些基础问题问倒了,这样反而会给面试官留下不好的印象,他会认为你对简历中的其他你真正熟练的语言也不太了解。)常见的错误写法是:
精通 django 框架,熟悉 Python 语言
可以修改为:
精通 django 框架,是 django 的 Top100 代码贡献者。熟悉 Python 语言,理解 Python 垃圾回收,迭代器,装饰器等常用对象的实现原理
多花几分钟的时间,就能在求职者的简历里面脱颖而出了。
前期负责前后端API设计,后期负责实时流消息处理应用系统构建和实现
面试官无法知道你做得怎么样,建议根据“发生什么事”,“你做了什么”,“结果怎么样”三个点来修改。同时这里必须出现数据作为参考,例如:
推动团队转用 Graphql 为新的 API 接口规范,从而减少 20% 的日均请求量,并节省了两台服务器资源。后期负责实现使用 RTSP 协议进行实时流消息处理,经过测试与优化,接口请求响应时间平均为 40ms,同时架构了能支持 50万 日活量的缓存服务器与后台服务器。
在项目中做的每一个选择必然是有原因的,而且必然会对项目产生影响。而在简历的项目经验中就是要把你产生最大的影响那部分写上去(删库就不用写了)。如果只是想面试官问到的时候再回答吧,面试的时候紧张,很容易忘记具体的数字以及细节。如果项目经验不多,可以把学校的专业排名(50⁄1000),员工考评(10⁄1000),优秀员工这些指标都加上去。不要觉得没有用,这绝对是大多数求职者忽视但是重要的点,这证明了你被学校 / 公司认可,起码比较靠谱。简历中如果既有一些较新的技术(例如 Rust,Go,当然你要真的了解),又有经典的必备的技能,那么就一定能够吸引到面试官的眼球。
其他能力就是团队协作能力以及解决问题的能力,如果你已经在开源项目有不错的贡献,那么面试官就不用担心团队协作能力。至于解决问题的能力,你可以在项目经验中可以列出解决的比较复杂的问题,例如 “解决了服务端同时推送 10万 台设备的的并发与资源占用过多问题”。这样面试官就知道你既有团队协作能力又有解决难题的能力。面试题就不会出那么难了。 其实很多公司在面试的时候都会出一些非常难的题,并不要求面试者一定要解决,而是要看面试者在遇到难题的时候会怎么面对,是思考一下就放弃,是寻求面试官提示,还是从多个角度去解决问题。如果在简历中已经体现了这一点,那么面试的时候就能略微放松了。
这个大家可能接触得比较少,如果你准备去面试一家非常喜欢的公司,面试之前,你应该先进行模拟面试,模拟面试的意思是让另外一名工程师充当面试官,对你进行面试,然后再把面试过程中的优点和缺点反馈给你。模拟面试既可以让你的朋友当面试官来面试你,也可以去找几家有类似岗位的公司。因为当你本来就没有一定要进该公司的想法,那么心态自然就能放轻松,带着轻松的心态去面试的话更能发挥好,给自己信心,同时也可以问问面试官自己哪里不足,可以加强的。经过总结后,锻炼自己面试的技巧,包括技术的基础,以及如何问问题。当你面试得多了,会发现问题其实都差不多,下次遇到也知道怎么回答了。
当你得到了面试的机会,开始进入重头戏了,无论你的履历如何出众,都不能对面试掉以轻心。我遇过不少简历不错但是面试一塌糊涂的求职者(很多公司都对伪造简历零容忍),结果当然没有录用他们。起码翻转二叉树要会写吧 :D,面试一般会有几轮:
HR 会和你聊下天,确保你了解这个岗位的基本信息。也可能问几个关于你简历的问题,这轮只是考核下你的基础信息是否正确,看看你的谈吐是否正常(相信我,很多求职者如果不看自己的简历,连自我介绍都做不到)这轮放轻松,实话实话就好。
这是技术面试的第一轮,可能会通过电话或者视频问一些技术问题,也可能是通过把算法题目发在在线文档,然后让你去解决。一般都是算法,数据结构的基础问题。如果遇到难的也不需要担心,提供解题的思路,即使最后不能 bug free,起码也能向面试官证明你的实力。
这轮并不常见,有的公司会让你实现一个小模块或者小工具。主要考核你实际情况下的开发能力。这点就要靠平时积累了,如何设计 API,使用什么设计模式,都有讲究。维护好的 commit messages 以及文档都很重要。平时多看看开源项目源码就好。Python 的话我推荐看 Requests 源码,常用而且简单易懂。
面试官会根据简历问一些项目上的问题,例如这个项目为什么要这么设计,开发过程中遇到最大的困难是什么。大厂的话,算法题是跑不掉的,面试官会出几道算法题写在白纸或者白板上。我明白很多求职者不喜欢白板面试,也觉得白板面试没什么意义。不过在我面试的求职者中,白板面试能力强的在实际工作中表现得也比较优异。白板面试确实难,不但对于你,对于其他求职者也是。要是你能做到,别人做不到,你就能在众多求职者中突围而出。 简述一下解算法题的几个步骤:
出个经典题目 Two Sum:
Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice. 给出一个整数数组和一个目标数,返回两个索引值,它们对应的数组元素的和等于目标数,只有一个答案。
例子:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
这阶段的提问非常重要,因为你要 100% 地了解题目,才能解决题目。不要觉得提问得多显得愚蠢,提问得多代表你在思考,没有问题我反而会担心求职者是不是之前做过这题,或者根本没有思路。
题目就转变成
一个只包含正整数的无序数组,要求返回两个不同的数组索引值,它们对应的数组元素的和正好等于目标数,如果数组为空或者只包含一个数字的话没有答案,其他情况有且只有一个答案。
这样就能排除一些边界情况了。然后写测试用例
target = 9
# 测试用例
[],
[1],
[2, 7],
[2, 5, 7],
[5, 4, 2],
空的,只有一个元素,正序,逆序,正常情况都写下来,面试官会对你考虑到那么多情况而加分。
先想想会用什么数据结构,链表,哈希表,堆,栈,二叉树,哪个结构能解决这个问题?如果真的没有思路的话,思考了之后,可以请面试官给点提示,这个其实也是团队合作的一种表现,请求提示不一定面试官就觉得你能力不行。
边思考边向面试官说出你的思路,虽然你的思路可能比较乱。但是没关系。要大声肯定地说出自己的想法,同时可以向面试官提问,比看着题目 10分钟 不知所措要好得多。我面试过几位求职者,虽然他们没有顺利地完成算法题,但是能一直说出自己的思路,给我留下不错的印象。就像我之前说的,有些难题,面试官并不是期望你都能答对,只不过想知道你遇到难题是如何思考的,所以阐述自己的想法是非常重要的。
如果数组长度小于2,返回False
建立一个哈希表
遍历数组每一个元素:
如果目标值减去元素值在哈希表中
返回该索引与当前索引
否则把当前索引与值添加到哈希表中
时间复杂度为O(n),空间复杂度为O(n)
这题算简单:
class Solution(object):
def twoSum(self, nums, target):
# 如果数组长度少于2的话,无解
if len(nums) <= 1:
return False
tem_dict = {}
for i in range(len(nums)):
# 检测这个元素是否曾经出现过
if nums[i] in tem_dict:
return [tem_dict[nums[i]], i]
else:
tem_dict[target - nums[i]] = i
把测试用例带进去代码中检查,然后看看哪里可能会有问题,做出修改。
接下来面试官可能会问一些非技术的问题:
这点非常重要,要预防你到了新公司之后,发现公司文化不适合你,再马上找新工作的话就不好了。
一次面试过来,可能筋疲力尽了。回想下自己哪里可以做得更好,简历哪里可以修改的。统计学告诉我们不要选择第一家面试的公司,多面试几家。不要欺骗自己,认真去思考每家的优点和缺点,和你的好朋友聊聊,寻求他们的建议。如果没有拿到 Offer 也没关系,重复上面的步骤,继续努力。两年前我连想都不敢想到美国的大公司工作,而现在的我就在为 Google 的面试做准备,就算我现在进不了 Google 又有什么关系呢?我还是在准备过程中学到很多知识。我很享受这段时间。相信自己,努力和汗水总会能得到回报的。
———— e n d ————