一、技术方面面试
在某种程度上来说,技术面试重要到能够决定你是否被聘用。在技术岗位方面,在个人品德没有问题的前提下,招聘公司对技术是最关心的。
我现在并不能给你分析具体的面试题,因为与笔试题相比,面试题千变万化,不同的公司有不同的技术方向,即使是在一个公司内,技术面试题也会因为项目、岗位、面试官的不同而不同。下面我说一些在技术面试中需要注意的地方,和大家一起做一个交流。
不要对一些问题只给出简单的“会”或者“不会”的回答。在技术面试中,比较常见的问题是:“你会不会技术A?”或者“你懂不懂技术A?”,按照我们的思维定式,看起来好像回答“会”或者“不会”就可以了,其实不是这样。面试官是想从这个问题开始,尽可能多的了解你在技术A方面的情况,如果你能对你的“会”再多做一些说明就更好了。例如,你可以说,“会。我比较熟悉技术A,因为在去年的一个项目中,技术A是主要的技术之一。我作为项目组成员之一,在半年的项目开发期内一直使用它。”。如果你对技术A不太熟悉,你也可以做一个简单说明:“有点抱歉,我没有专门的技术A实战经验。但是,我从一些技术文章中看到过相关的介绍。我想,根据我的项目经验,只要有机会,在实际项目中学习,我可以比较快速的掌握它。”这里有一个基本原则,所有你所说的都应当是真实的,例如你说你有实力很快掌握它。我在这里不是教你撒谎,只是希望你向面试官表达地更充分一些。
不要以为所有的技术你都需要熟悉。面试题有两类,一类是考察你对一门技术的深入程度,另一类是考察你的技术广度。面试官考察你的技术广度的时候,可能提及多个技术方向以及相关的名词,其中你有不会的或者不熟悉的,是很正常的事情。不要因为回答了几个“不会”就暗自得出一个结论:“完了,我肯定没有希望了。”,其实不是这样,面试官会综合考虑的。例如,我在面试测试工程师的时候,我会考察他(她)的测试能力、开发能力、数据库、外语、对一些特定产品的熟悉程度等多个方面,最后得出一个综合的评价。一旦你给自己一个不能通过面试的暗示后,你的心就会发慌,你在面试中的表现就会越来越差,这个时候,你离期望的职位就越来越远了。
不要夸夸其谈。如果面试官的问题正好是你熟悉的,这是好事,但是一定要避免夸夸其谈。在我们的传统文化中,不喜欢不谦虚的人。另外,一旦你夸夸其谈了,你可能就变得浮躁,容易说一些错误的表述,而一旦出现技术上的错误,面试官对它会很敏感,它会成为你的硬伤。
如果遇到一些特别的问题,不要惊慌。我的一个朋友告诉我,微软公司曾经对她做过一次面试,其中有一道题:“你如何测试一个杯子。”。这个问题在现实工作中是不存在的,因为大家应聘的是软件测试工程师,而不是做杯子的技师。这个问题很特别,你难免会有些惊讶,换了是我也会这样。我想告诉你的是,既然这个问题在实际测试工作中不会出现,为什么微软公司仍然把它列为技术面试题呢?其实,面试官只是想考察你的应变能力和发散性思维,想通过这个问题看看你的思维过程和思维能力,面试官也不会有一个统一的答案。你只需要陈述你的想法即可,想到什么就说什么。如果你一听这个问题就不知所措或者直接说“不会”,面试官就会给你定下一个否定的看法。
以上都是一些锦上添花的技巧,真正决定你在技术面试中的通过率的是你的技术实力,这是你能否找到一份技术工作的本源。
二、人事方面面试
所谓人事面试,就是由人事专员(俗称HR)对候选人做面试。这个环节因为没有具体技术问题,相对来说“虚”一点。有的公司里,人事面试只作为技术面试的补充,录用决策最终由技术面试官做出决定。但也有很多公司里人事面试的结论对最终录用决策起到决定性作用。
那么,在人事面试中,HR会考察什么呢?
与技术面试中主要关注技术有所不同,HR的主要任务是,从候选人的穿着、言谈举止中去感觉候选人的性格、工作态度、合作能力、稳定性等等。我们来具体分析一下:
关于外表
在面试中,穿着应当端庄。端庄的外表容易给人留下认真、在意这个工作机会、尊重应聘公司的良好形象。我相信大家都不会穿着奇装异服去面试,但仍然有几点需要注意,例如衣服不要太脏,不要破,纽扣打开不要过低(男性也要注意这一点),头发不要蓬乱,不要馒头大汗等等。另外,人也应当比较干净,我记得有一次见到一位候选人,几个手指甲里全是黑泥,让人“敬畏”。
关于言谈举止
有的时候,你发现HR的问题特别简单,无论谁都会回答。那你有没有想过,这么简单的问题HR为什么还要问呢?他们并不是在浪费时间,对他们来说,有的时候更看重你说话的姿态、预期、手势等等,你所说的内容有的时候被略过了。我不止一次得到HR给我关于候选人的负面反馈,说有的候选人说话的时候小动作不断,不专心;或者一边说话一边晃动,太随意。这一方面,只要你重视人事面试,潜意识就会对身体有所约束,给对方留下的印象自然就好得多。
其他问题
HR也会问到这些问题,比如你为什么从上家公司离职?你怎么考虑自己的职业规划?你希望到一家什么样的公司工作?除了申请的这个职位之外,你还有什么可以考虑的职位?你以前的薪水是多少,这次期望拿到多少?等等。你可以事前准备一下,因为有些问题确实需要回答的委婉一些,或者避免面试官的误解。
三、面试的心理变化
刚开始参加工作的时候,我对面试总是很恐惧,既担心简历无法通过初筛,也担心即使简历通过筛选,因为面试经验不多以及基础知识不扎实而导致发挥不好。我刚开始拿着普通的简历(专业不是计算机,作品也没多少)也得到了一线大厂的面试机会,但是因为根本没有准备,也不知道怎么准备。自然地,那次面试我表现得不好,也没有得到 Offer。
恐惧也使我不想浪费时间去面试不同类型的公司。我当初并不知道对比其他求职者,自己的优势和劣势在哪里,也不知道如何去准备面试,面试官看重的是哪些方面,更不知道自己到底值多少钱。现在回过头看,我觉得当初只是在欺骗自己,我真正担心的是即使自己认真准备简历和面试也对结果毫无影响,更不敢去想如果放弃某个 Offer,找不到其他工作怎么办。
工作了几年,当我有了越来越多的面试官的经验之后,我越来越发现认真准备简历和面试是非常重要的,因为毫无准备就来面试的求职者真的太多了。而且互联网公司招聘到合适的工程师实在非常难,有计算机基础知识,有项目经验,愿意学习而且愿意来这家公司,实在不好找。所以只要求职者能证明自己有一定的计算机水平并且愿意努力,市场上还是有非常多机会的。
这篇文章我把这几年作为面试者和面试官身份的的经验給大家,希望大家可以从中学到一些面试的技巧,找到心仪的工作。
四、简历怎么写
简历准备可以参考我们的另外一篇文章如何写一份更好的简历,我筛选过超过千份简历,遇到太多太多千篇一律毫无重点的简历,凡描述都是熟练精通xxx框架,凡个人项目经验都是博客加爬虫。而且面试官都知道,越优秀的求职者,越重视自己的简历。求职者需要从面试官的角度来思考与筛选简历,几个要点是要注意的:
1. 突出优势
简历并不是越长越好,最好的简历长度是一到一页半,列出你最优秀的项目经验以及奖项。至于语言或者框架,只是简单接触过的话就不用写上去了。面试官问你有没有学过其他的时候才说出来。(假如你只是学过简单接触过 Go 却写在简历上,却被一些基础问题问倒了,这样反而会给面试官留下不好的印象,他会认为你对简历中的其他你真正熟练的语言也不太了解。)常见的错误写法是:
精通 django 框架,熟悉 Python 语言
可以修改为:
精通 django 框架,是 django 的 Top100 代码贡献者。熟悉 Python 语言,理解 Python 垃圾回收,迭代器,装饰器等常用对象的实现原理
多花几分钟的时间,就能在求职者的简历里面脱颖而出了。
2. 给出证明
前期负责前后端API设计,后期负责实时流消息处理应用系统构建和实现
面试官无法知道你做得怎么样,建议根据“发生什么事”,“你做了什么”,“结果怎么样”三个点来修改。同时这里必须出现数据作为参考,例如:
推动团队转用 Graphql 为新的 API 接口规范,从而减少 20% 的日均请求量,并节省了两台服务器资源。后期负责实现使用 RTSP 协议进行实时流消息处理,经过测试与优化,接口请求响应时间平均为 40ms,同时架构了能支持 50万 日活量的缓存服务器与后台服务器。
在项目中做的每一个选择必然是有原因的,而且必然会对项目产生影响。而在简历的项目经验中就是要把你产生最大的影响那部分写上去(删库就不用写了)。如果只是想面试官问到的时候再回答吧,面试的时候紧张,很容易忘记具体的数字以及细节。如果项目经验不多,可以把学校的专业排名(50⁄1000),员工考评(10⁄1000),优秀员工这些指标都加上去。不要觉得没有用,这绝对是大多数求职者忽视但是重要的点,这证明了你被学校 / 公司认可,起码比较靠谱。简历中如果既有一些较新的技术(例如 Rust,Go,当然你要真的了解),又有经典的必备的技能,那么就一定能够吸引到面试官的眼球。
五、面试阶段
当你得到了面试的机会,开始进入重头戏了,无论你的履历如何出众,都不能对面试掉以轻心。我遇过不少简历不错但是面试一塌糊涂的求职者(很多公司都对伪造简历零容忍),结果当然没有录用他们。起码翻转二叉树要会写吧 :D,面试一般会有几轮:
5.1 HR 电话确认
HR 会和你聊下天,确保你了解这个岗位的基本信息。也可能问几个关于你简历的问题,这轮只是考核下你的基础信息是否正确,看看你的谈吐是否正常(相信我,很多求职者如果不看自己的简历,连自我介绍都做不到)这轮放轻松,实话实话就好。
5.2 远程面试(不一定)
这是技术面试的第一轮,可能会通过电话或者视频问一些技术问题,也可能是通过把算法题目发在在线文档,然后让你去解决。一般都是算法,数据结构的基础问题。如果遇到难的也不需要担心,提供解题的思路,即使最后不能 bug free,起码也能向面试官证明你的实力。
5.3 家庭作业(不一定)
这轮并不常见,有的公司会让你实现一个小模块或者小工具。主要考核你实际情况下的开发能力。这点就要靠平时积累了,如何设计 API,使用什么设计模式,都有讲究。维护好的 commit messages 以及文档都很重要。平时多看看开源项目源码就好。Python 的话我推荐看 Requests 源码,常用而且简单易懂。
5.4 现场面试
-
提问
-
测试用例
-
思考
-
阐述
-
伪代码
-
代码
-
检查
面试官会根据简历问一些项目上的问题,例如这个项目为什么要这么设计,开发过程中遇到最大的困难是什么。大厂的话,算法题是跑不掉的,面试官会出几道算法题写在白纸或者白板上。我明白很多求职者不喜欢白板面试,也觉得白板面试没什么意义。不过在我面试的求职者中,白板面试能力强的在实际工作中表现得也比较优异。白板面试确实难,不但对于你,对于其他求职者也是。要是你能做到,别人做不到,你就能在众多求职者中突围而出。 简述一下解算法题的几个步骤:
出个经典题目 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% 地了解题目,才能解决题目。不要觉得提问得多显得愚蠢,提问得多代表你在思考,没有问题我反而会担心求职者是不是之前做过这题,或者根本没有思路。
-
这是一个有序数组吗? 不是(注意这里有个小陷阱,虽然在Example中给出的是一个有序数组,但是实际题目并没说这是一个有序数组,所以要考虑无序以及为空等边界条件)
-
数组可以包含负数吗? 不可以
-
如果数组为空或者只包含一个数字,是没有答案吗?对的
-
时间复杂度和空间复杂度有限制吗?没有
题目就转变成
一个只包含正整数的无序数组,要求返回两个不同的数组索引值,它们对应的数组元素的和正好等于目标数,如果数组为空或者只包含一个数字的话没有答案,其他情况有且只有一个答案。
这样就能排除一些边界情况了。然后写测试用例
测试用例
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
检查
把测试用例带进去代码中检查,然后看看哪里可能会有问题,做出修改。
5.5 非技术问题
接下来面试官可能会问一些非技术的问题:
-
Q: 为什么选择这家公司?
-
A: 面试之前对起码要浏览过公司的网站,了解公司有什么产品,这样既可以防止遇到皮包公司,或者小作坊欠薪拖薪。
-
Q: 你曾经面临最大的专业挑战是什么?你是怎么战胜它的?
-
A: 这个一定要准备好,不能说没什么挑战,没什么挑战代表你没有认真去思考,就算是最简单的增删改查或者前端的动效,背后的原理,网络协议的原理,你都应该去了解。对你在简历中的每一个项目,你都应该能说出里面最大的挑战,最有趣的部分是什么,这样面试官才能真正理解你在项目中做了什么,学习到什么。
-
Q: 是什么为什么你选择离开你现任公司?你从你上一家公司学到最重要的是什么?
-
A: 大多数求职者不喜欢这个问题,也不知道怎么回答。这个问题你能回答好的话就能拉出距离了。我觉得答案其实很简单,你们公司的项目有更好的发展前景/我想挑战自己在这一方面的能力等等。至于说旧公司薪酬太低,工时太长,没前途这些就免了。
-
Q: 你的长期工作目标是什么?
-
A: 这个看个人,转管理的话可能会加一轮问管理方面的问题,转资深工程师的话可以讲下自己打算钻研哪个方向,大数据,人工智能,区块链都可以。
5.6 求职者提问
这点非常重要,要预防你到了新公司之后,发现公司文化不适合你,再马上找新工作的话就不好了。
-
Q: 你们新老员工的比例是多少?厉害的工程师有多少?研究生的比例有多少?
-
A: 这个问题其实揭示了公司的文化,如果新员工非常多,公司也不算新的话,那么代表流动率很高,公司文化可能不是很好。第二个问题其实就是问有没有大牛,有多少。有厉害的工程师总比没有要好得多,进步的速度也更快。一个公司如果有比较多优秀的工程师的话,代表是不错的公司。
-
Q: 如果我入职的话,会有入职培训吗?会被分到哪个项目组,项目组的成员构成是怎样?
-
A: 这个可以了解公司的架构是不是清晰,个人职责划分是否明确。如果面试官回答不了这个问题,或者支支吾吾的话。即使你进去的话可能要兼顾几个项目,维护老项目。这些都要问清楚,你才知道自己大概的工作量有多少。维护旧项目虽然头疼,但是上线压力不大。如果新旧一起来,就要考虑自己是否适合这样的工作强度。
-
Q: 我入职的前三个月,要完成什么工作来证明我的能力呢?
-
A: 这个问题其实为下一个问题准备,如果我工作表现优秀的话,公司会不会有对应的奖励?
-
Q: 多久进行一次调薪,工作绩效是如何计算的?是按项目收益,还是主管决定?
-
A: 这个也是了解公司有没有实施奖励制度,通常回答准备中的都要留个心眼,可能一年都不会调薪。
-
Q: 公司的五险一金是按什么比例缴的,是按最低标准还是可以自己缴纳更高比例?
-
A: 一般这个会问 HR,如果小公司的话,也可以直接问工程师。五险一金看似没多少,但是每个月累积下来就很多了,这个需要和面试官确认。
-
Q: 我今天面试的表现怎样,如果通过之后我还会经过多少轮,怎样的面试流程?
-
A: 首先可以了解自己的不足,积累经验。也可以开始为下一轮复试做准备
六、 总结阶段
一次面试过来,可能筋疲力尽了。回想下自己哪里可以做得更好,简历哪里可以修改的。统计学告诉我们不要选择第一家面试的公司,多面试几家。不要欺骗自己,认真去思考每家的优点和缺点,和你的好朋友聊聊,寻求他们的建议。如果没有拿到 Offer 也没关系,重复上面的步骤,继续努力。两年前我连想都不敢想到美国的大公司工作,而现在的我就在为 Google 的面试做准备,就算我现在进不了 Google 又有什么关系呢?我还是在准备过程中学到很多知识。我很享受这段时间。相信自己,努力和汗水总会能得到回报的。
刚开始参加工作的时候,我对面试总是很恐惧,既担心简历无法通过初筛,也担心即使简历通过筛选,因为面试经验不多以及基础知识不扎实而导致发挥不好。我刚开始拿着普通的简历(专业不是计算机,作品也没多少)也得到了一线大厂的面试机会,但是因为根本没有准备,也不知道怎么准备。自然地,那次面试我表现得不好,也没有得到 Offer。
恐惧也使我不想浪费时间去面试不同类型的公司。我当初并不知道对比其他求职者,自己的优势和劣势在哪里,也不知道如何去准备面试,面试官看重的是哪些方面,更不知道自己到底值多少钱。现在回过头看,我觉得当初只是在欺骗自己,我真正担心的是即使自己认真准备简历和面试也对结果毫无影响,更不敢去想如果放弃某个 Offer,找不到其他工作怎么办。
工作了几年,当我有了越来越多的面试官的经验之后,我越来越发现认真准备简历和面试是非常重要的,因为毫无准备就来面试的求职者真的太多了。而且互联网公司招聘到合适的工程师实在非常难,有计算机基础知识,有项目经验,愿意学习而且愿意来这家公司,实在不好找。所以只要求职者能证明自己有一定的计算机水平并且愿意努力,市场上还是有非常多机会的。
这篇文章我把这几年作为面试者和面试官身份的的经验給大家,希望大家可以从中学到一些面试的技巧,找到心仪的工作。
从整体上看,在人事面试中,最重要的是看重它,不要因为它“虚”,觉得HR不懂技术而掉以轻心。