想必大家看过很多文章,都是教大家如何面试,比如之前很火的《吊打面试官 xxx》系列,你以为掌握了某个知识点,就真的能吊打面试官么?你来吊打我一个试试?
我之前也面过很多大厂,不限于阿里、腾讯、滴滴、百度、字节、新浪,遇到过形形色色的面试官,然后近几年也一直在大厂当面试官。
这篇文章就以面试官的角度,给大家讲述我这些年的面试心得和感悟,希望能对大家有所帮助。
给我的第一感受就是,今年的就业形势更严峻了,主要体现在各大公司的招聘名额缩减,然后也感觉今年的学生更卷了!
下面的面试经验仅限于大厂,如果是小厂的话,就不需要这么高要求,但是如果你都能过,那小厂真的随便进。
1. 代码考察
如果你想进大厂,这个是一道无法跨越的坎。
对于一面,算法必须是我们重点考察的内容,面试官一般会出 1-2 道中等难点系数的算法题,时间不超过 35 分钟,比如重排链表。
一般要求直接写进阶版的代码,即空间复杂度 O(1)。
先是考察算法思路。
在写代码前,面试官会让你先思考 5 分钟,然后再讲一下思路,如果牛头不对马嘴,大概率就要 Pass,如果给的方案不太好,面试官会稍微进行引导,也有很多能直接给出最佳方案的。
下面就开始撸代码,时间控制在 15-25 分钟。
线上编程一般用牛客网,代码是需要能正常运行的,如果代码写完了,运行不出来,印象会大打折扣。
不过线上编程,有个问题就是不能 debug,遇到问题就只能凭眼力排查了。
如果是纸上手写代码,个人感觉难点稍微小一些,因为只需要撸出来,不用考虑能否运行。
好的代码质量也可以加分,下面是我之前面试的一位武大的学生写的,方法封装得好,运行直接一遍过。
public class Solution {
public void reorderList(ListNode head) {
if(head==null){
return ;
}
ListNode mid = middleNode(head);
ListNode l1 = head;
ListNode l2 = mid.next;
mid.next = null;
l2 = reverseList(l2);
mergeList(l1,l2);
}
public ListNode middleNode(ListNode head){
ListNode slow = head;
ListNode fast = head;
while(fast.next!=null&&fast.next.next!=null){
slow = slow.next;
fast= fast.next.next;
}
return slow;
}
public ListNode reverseList(ListNode head){
ListNode pre = null;
ListNode cur = head;
while(cur!=null){
ListNode temp = cur.next;
cur.next=pre;
pre = cur;
cur = temp;
}
return pre;
}
public void mergeList(ListNode l1,ListNode l2){
ListNode temp1;
ListNode temp2;
while(l1!=null&&l2!=null){
temp1 = l1.next;
temp2 = l2.next;
l1.next = l2;
l1 = temp1;
l2.next = l1;
l2 = temp2;
}
}
}
复制代码
可能有粉丝会说,这道题有点难,其实我前 2 年面试,基本只考察链表的反转,但是今年僧多粥少,我们不加点难度,那咋区分呢?
2. 面试环节
如果两道算法题都过了,或者过了一道,另外一道因为时间原因没有写出来,但是思路没问题,就会进入面试环节。
可能又有粉丝会跳出来问,“那如果第一道算法题都没有过,那是不是就结束了呢?” 其实为了不让面试者难堪,面试官一般都会凑够 30 分钟,后面也会象征性地问一下基础知识,不过也有的面试官会直接 Pass。
由于大部分时间都用来写代码,只有不到 30 分钟的时间来考察知识点,所以面试的问题不会太多,但考察可能会更有重点。
比如 MySQL,我们会问 4 种事务的隔离级别?然后问什么是幻读?幻读产生的原因?如何避免幻读?避免幻读需要用到什么锁?如何手动去加这个锁?
这些问题基本都是由浅入深,能回答到最后一个问题的同学,遇到的不多。
如果你连 MySQL 几种事务隔离级别都不知道,基本就不会问你 MySQL,直接下一个知识领域。
再比如 Spring,我们会问是否知道循环依赖?Spring 如何解决循环依赖?为什么要用三级缓存,不是两级?能否直接去掉第二级缓存?如果不能去掉,为什么?第三级缓存存的是什么?如果你回答对象工厂,这个工厂里面存的又是什么?
大部分同学只能回答前几问,能全部回答出来的,也是凤毛麟角。
对于 Java 并发编程,我们会问线程池的工作原理,然后详细考察拒绝策略、任务队列,如果这块考察通过,会再问几个关键字的内存屏障、重排序、内存模型等相关知识。
有的面试官会比较好,会先问一下面试者,哪块知识掌握得比较好,有的面试官就直接问你对某个知识掌握如何,然后再依次深入,不经过基本都是围绕设计模式、MySQL、Redis、操作系统、计算机网络、Java、JVM、Spring、消息队列等知识展开。
3. 个人意愿
个人意愿也是面试官非常看重的内容。
下面以杭州阿里举例,如果你直接问他,你想来阿里么?这不废话嘛,我来面试,肯定是想通过,即使不想来,我嘴上也会说想,拿着 Offer 找 Offer,不香么?
面试官会看面试者的籍贯,如果简历上没有写,我们就会问一下,如果你籍贯是浙江,或者老家就在杭州,是非常加分的,因为这种同学留杭州的概率很大。
不过我也遇到籍贯不是浙江,但非常想来杭州阿里的同学,他给我两点理由,第一是他本硕都是杭州读的,在这里呆了 7 年,最关键是她女朋友是杭州本地人,你说这种情况,留杭州意愿能不大么?
写到这里,大家是不是又学到一招,如果你籍贯不是本地,你谈了 N 年的女朋友在本地,是不是很加分? 那没有女朋友呢?你就 New 一个呗,都说到这个份了,要是还不懂,那我。。。喷你一口老血。。。
4. 注意事项
大家面试时,不要紧张,其实我之前遇到的面试官,性格都非常不错,不仅不会刁难你,还会对你慢慢引导,不过不排除那种极少个别恶心的,面个试都吊炸天的那种,这种我遇到过,当时直接去 TMD!
面试过程中,要实事求是,如果不会的,可以直接说不会,这样面试官就会换个问题去考察你,如果你说比较了解,结果连稍微深入的问题都答不上来,面试官可能会觉得你掌握好的知识也就这个程度,其它的估计更不行。
学会引导,并不是所有的面试官都会先问你哪块知识掌握得比较好,然后再去深挖,因为这要求面试官的水平比较高。很多面试官上来会问你对某块是否了解,比如 MySQL,然后再去问,如果刚好触发到你的知识盲区,可以适当引导一下面试官,让他能问你熟悉的领域。
注意个人形象,比如之前面了一个学生,他一直在那清嗓子,然后倒吸嗓子吐痰,声音还特别大,然后思考时,一直在那一个劲嘀咕,也会减些印象分。
985/211 的学校,确实会优先考虑,专业和计算机相关的双 985、211 会非常吃香,如果你是非计算机专业,但是学校确实很好,有自己的技术广度和深度,也会考虑。
5. 写到最后
面试其实是一个双方博弈的过程,前提是自己肚子足够有货,我记得我当年校招,虽然谈不上 Offer 收割机,但也是非常不错的。
然后今年的就业形势更严峻,大家一定要提前做好充分的准备,如果有任何问题,也可以加我微信进行沟通。
最后祝愿大家都能拿到心仪的 Offer,加油!