前言
大多数面试只要满足以下三点即可达到准入门槛,特别是对于校招同学
讲清楚项目
有对应岗位的知识体系/基础知识
对研发岗来说会写代码
达不到准入门槛的面试是怎样的?
对于项目,比如算法项目评价指标讲不清楚。对于基础知识,比如说出一些违背常理的话,比如JavaScript是java的语言拓展。对于代码考核,至少对于leetcode中等题,在面试官提示下能写出来。
大部分候选人认真准备踏实学习其实都能达到准入门槛,甚至对于卷中卷的算法岗位也是如此,但是在面试中表现出来却不是那回事。这篇文章主要帮助这些同学在面试者更好发挥自己达到岗位准入门槛。
面试流程
技术岗的面试主要包括三个部分
可能穿插智力题或场景题,对于智力题,答不出来并不影响面试是否通过,场景题一般也能根据自己以往经验扯两句,因此,本文主要关注于项目,基础知识和算法题。
一个模拟面试流程可能为下面所示:
面试官:同学先进行自我介绍
同学:面试官您好,我是blabla
面试官:简历中提到做过xx项目,可以详细介绍一下吗(开始扣项目细节)
同学:这个项目是为了解决blabla
若干轮问答后
面试官:那xx算法内部机制怎样有了解吗(开始通过项目拓展基础知识)
若干轮问答后
面试官:给你出一道场景题/智力题
同学:Blabla
若干轮问答后
面试官:共享屏幕,我们来写一下代码吧(开始出算法题)
做完题后
面试官:你还有什么要问我的吗?
.......
面试官:谢谢你的时间!
自我介绍
互联网技术岗的自我介绍环节其实并不会非常重要,大部分情况下,你在做自我介绍的时候,面试官都在忙着翻你的简历,想着要问什么问题,毕竟平时要工作写代码那么忙,是没空提前看你的简历的。甚至我觉得自我介绍的时候穿插几句“巴拉巴拉巴拉”面试官都不会注意到(不信的同学下次面试可以试试。
但是,总有些情况下,面试官会认真听,这时候怎么突出自己呢。
一个正常国内大厂的面试,其实总是围绕着你做过的项目来进行的,很多八股(基础知识)问答,其实也是围绕着项目来答的。因此,互联网技术岗位自我介绍的第一个核心点就是突出做过项目的特点。
第二个核心点我觉得是突出自己的特点,比如有同学算法题能力很强,拿过国际编程竞赛如ACM-ICPC的奖牌等等,觉得面试算法题都没有问题,于是这时候可以强调一下,暗示面试官算法题可以出难一点没有问题。
因此我的自我介绍模板是先告知自己的基本情况,如毕业院校,目前状态(在职/待职,在哪工作等),接着简要介绍做过的项目以及涉及的领域(尽量引导面试官往自己熟悉的方向上靠)。最终,简要说一下自己的获奖情况/技术特长等。
自我介绍的核心是突出自己和项目的亮点。这个亮点可以是跟别的候选人相比自己的特长,可以是项目和部门业务很接近。
判断是否通过面试
据我多次面试经验和其他人的交流心得,对于互联网技术岗位,面试官一般会设置一个门槛,达不到这个门槛就算缺人也不会招进来。达到这个门槛后开始择优录用,所谓ranking。而技术岗的面试主体包括简历上项目,基础知识和手写算法题,因此围绕这三个部分,如何才算通过了这个门槛?
对于简历项目,至少要讲清楚做了啥,让面试官相信项目是你做的。
对于基础知识,不需要所有都答出来,但至少要有一半能够答上来,或者有某些领域有非常深入的了解
算法题:至少要在面试官提示下能把至少一题做出来,不要求bug free,要求有一定的代码思路
因此,面试官会有一部分问题针对项目是否讲得清楚,一部分问题针对基础知识,最后再让做一个算法题。
通常情况下,三个部分都要达到要求。极少数情况下,比如简历项目非常牛,对于算法岗发表了一系列成体系的顶会论文一作,这种情况下算法题一点都不会也没有太大关系。
项目介绍
如何进行项目介绍
在互联网技术岗的面试过程中,经常需要进行项目的介绍,面试官会先让你介绍一下自己的项目,然后围绕着项目问问题。一种情况是让你介绍完项目后,才开始进行问答。还有可能中途打断你进行问答,取决于不同的面试官。提问的内容大多围绕着项目的技术点。那么介绍项目的时候,如何让面试官比较好地get到整个项目的整体状况和自己的亮点呢?
一开始建议先介绍项目的背景,突出要解决什么问题。通过什么输入,要拿到什么输出。
接着介绍最简单的解决方案
在最简单的解决方案上,如何一步步作改进,每一步改进说出对应的痛点
业界最成熟的方案/目前最通用的方案是怎样,该方案与目标场景为何不适配
最终方案和业界最成熟的方案/目前最通用的方案的主要区别和改进
项目问答的核心点是突出项目解决的问题以及你的方案与业界/学界最成熟的方案有何亮点。
基础知识
算法岗位的基础知识主要有几个部分
传统机器学习模型
深度学习模型
DNN:让推导反向传播等
CNN
RNN(LSTM,GRU)
Transformers
batch norm/layer norm等
drop out
各种激活函数区别
评价指标
正则化
尽管算法岗的知识涉及许多,但是在面试中无需答出每个问题,只要基本常识问题不出错(比如说逻辑回归用于回归问题这种)加上答出60%左右的题基本可以通过这部分的考察,达到准入门槛。如果有自己的亮点如某一种算法了解非常深入,比如SVM各种推断以及各个部分涉及原理等,会有很大的加分项。
基础知识问答部分的核心是不追求答出所有题目,但最好有长项。
算法题
最后一个环节很多公司喜欢考察算法题,其实leetcode前两百刷完国内大部分面试题目都能手到拈来。核心知识点无非那几个,比如搜索(DFS,BFS),动态规划,二叉树,链表,各种大模拟,单调栈等等。甚至前面问题答得好这部分还会放水,比如直接让你挑个排序算法写写就让你过了。
但是,总有一些情况面试官出一道你完全没思路的题目,这时候如何处理呢?
处理办法一:跟面试官说,这题太难了,我不太懂,能不能换一题。这是一种有效的办法,不浪费时间而且也非常可行,但慎用,只用在那些很难理解比如leetcode天际线之类的题,因为这种情况下面试官再出一题你做不出来就完球了。
处理办法二:在面试官一步步提示下做题,可以直接问面试官能给点提示吗?提示完同学自己可以再说一下自己的想法,主要是分析一下复杂度是否可行(基本时空复杂度分析还是要掌握的)等,然后再慢慢写。好的情况下,基本上面试官会一步步把思路都告诉你,而你只需要负责实现就好。这其实也是算法题考察的目的,考察你会不会写代码,而不是考察你会不会做脑筋急转弯。
算法题的面试其实是比自己做题要来得简单的,因为有面试官的帮忙,大部分情况下还不用bug free通过所有测试用例,只需要写个代码思路就可以,而思路在某些情况下还是面试官给的。
算法问答的核心是多跟面试官沟通。
反问环节
一般面试官在面试完之后都会问一句,“你有什么想问的吗?”其实面试到了这个点,在面试官心理是否达到通过门槛面试官心理已经有数了。
基本上很少人会通过反问环节力挽狂澜从未通过问面试官问题问到通过。
冒犯的问题
但是有不少人会问一些比较冒犯的问题,比如:
通常情况下,面试官是不能告知面试结果的。而且,同学,你是来面试的,尽管有些情况下确实你就是想拿一个公司来练手,至少在面试的时候也不应该表现出来。
打哈哈问题
如果对面试部门已经了解得非常清楚,并且非常想去目标部门,那么可以问一些无关痛痒的问题,比如
探讨一下技术未来几年会怎么发展
目前所在领域大家都在攻克的难关是什么
开放性地讨论一下为什么难关存在
目前技术难关解决进度如何
聊一下团队氛围等等
然后愉快结束这次面试
双向选择问题
面试其实是一个双向选择的过程,反问环节是一个更深入了解目标部门的机会(虽然大部分情况下不会透露一些非常不好的缺点),但其实可以问一些部门所做的工作内容,业务发展等情况,看是否感兴趣。
比如:
不好的问题比如
总之,尽可能结合面试岗位情况,问清楚业务和工作内容,根据自己的知识储备,看业务是否有盼头,自己是否适合/感兴趣。