## 背景
面试作为秋招中最重要的一环,是我们拿到 offer 的关键所在。但是怎么样才能尽可能的提高面试的成功率呢,其背后其实是有一套科学的方法论的。接下来我会针对面试做详细的介绍,为了让我的说法更具有信服力,我先做个简单的自我介绍,我是 21 届的毕业生,在去年实习和秋招的 30-40 轮的面试中无一败绩(笔试倒是挂过 Hulu 的,太难了QAQ),其中包括众多大厂和一些非常牛逼的创业公司,具体可以看我的其他帖子:) 废话不多说,直接开始介绍
## 心态篇
这篇看似是鸡汤篇,但是非常重要,接下来会讲几个最本质的点,能帮助你快速搞清楚面试到底是什么,面试的目的是什么,面试的评价标准是什么。了解了这些之后,你就会明白我后面所说的东西了。
* 从公司招人的角度来看,公司想要/希望招到什么样的人。首先最希望招的人肯定是有经验的,能直接过来输出先进经验的(同行业的大牛)。另外次一点的就是熟悉相关背景,过来能直接干活的(同方向公司的正式员工/实习生)。然后就是虽然没有相关领域的知识,但是他在其他方面有不错的经验(社招转方向)或者说是基础比较扎实(校招没有相关背景的同学)。这样来看,对于公司来说,最想要的**应届生**主要分为两类:一类就是有过经历的同学,包括在同领域的其他公司实习过,或者虽然没有实习经历,但是相关知识比较扎实的同学(比如说我要投数据库内核研发的岗位,虽然我没有相关实习,但是我对数据库的原理和数据库是怎么实现的有着清楚的认知)。这类同学是最容易过面试的,因为这类同学对公司来说进来就可以很快的上手干活了。第二类就是基础扎实的同学,其背后的原因就是在计算机这个领域,学习能力要比知识本身重要的多,因为知识可以通过学习快速习得,只不过是时间问题。一个学习能力强的同学能很快上手新知识,但是为什么我们这里强调的是基础扎实呢,因为学习能力本身并不太好量化,如果一个人能证明自己在其他方面有所擅长,往往能侧面反映出自己有不错的学习能力,另外一点就是计算机方面的知识很多都是相同的,扎实的基础能让你更快的掌握相关的知识。
* 从面试官的角度来看他希望招到什么样的人,除去上面公司层面的期待。对于面试官来说,你以后大概率是他的同事或者下属。从这个角度来看,在面试中展现哪些能力更能得到面试官的青睐呢(有些能力很难展现,比如努力上进这种,所以这里特定强调了在面试中展现的能力)。一个是交流能力,因为在工作中,同事之前会存在大量的交流,如果你能很清晰/准确的表达你的想法,并能积极沟通(其中这一点也能反映出一个是不是好合作),这无疑是非常大的一项加分项。另外就是思考问题的深度,这个点往往是通过你面试中的一些回答所体现的,这点会在后面详细说明。其他的一些点就简单提一下,可能还包括你的代码能力(大家肯定都希望和 coding 能力强的人一起工作),然后你对技术本身是否有热情(看似很难发现,其实还是能看出来的,一些人谈到技术方面的东西会充满激情,侃侃而谈),当然还有其他方面,这里就不一一列举了。你可以换位思考一下,“你想和什么样的人一起工作”,这样你自己就会有答案啦。
* 面试的内容其实本质上是你和面试官知识的交集,面试官通常来说也会挑自己懂的内容和你聊,所以你们知识的交集越多,那么面试的过程肯定越愉快,通过的概率也会越大。其次就是面试是展示自己优势的过程,他不需要你能够回答出全部的问题(所以不用担心有不会的问题,或者一些问题没回答好),而是需要你能够展现你的优势,在你懂得地方有足够的闪光点。
* 然后最后一点就是面试本来就是一件玄学的事情,就算你能把自己能做的都做到最好,也不一定保证能拿到 offer,所以一定要放平心态,没面过也不要纠结,本身就有一些运气成分在,而且在这么短的面试时间里面其实是很难真正了解一个人到底是什么样的。另外就是心态上不必把面试官看的高高在上,其实可以简单把他们当作你未来的同事去平等坦诚的交流,抱着一种来向大佬学习的心态来面试,如果能在面试中学到一些东西那也算有所收获了。
## 面试前(准备阶段)
* 通常来说标准的面试分为三部分:1. 项目/实习;2. 基础知识(也就是我们通常所说的八股文);3. 算法题。接下来我们会针对这三个部分做具体的讲解。
* 首先最重要的当然是准备简历,简历的格式规范这里不做过多阐述,大家可以去网上搜一些相关技巧。这里聊一聊简历上的内容,首先一定要明确一个最最基本的原则,简历上的东西一定要是你烂熟于心的东西,不熟的东西千万不要写上去,同时对于一些写上去的东西尽可能的去深入了解。其中最重点部分是项目/实习,这里要明确自己在项目中担任的角色是什么样的(是主导项目的,还是参与协作的),然后简洁的描述一下做了哪些事情(比如说实现了什么样的功能,做了什么样的优化),取得了什么样的效果(最好要有量化指标)。然后接着我觉得是比较重要的问题,思考下面的几个问题,这些问题大部分能覆盖面试中可能遇到的问题,需要你在面试前自己多问问自己,多加练习,做到能非常流利的回答出这些问题。同时需要注意,针对你的问题,并不是所有的问题都有解答的,自己把握就好。另外不要觉得自己的项目太菜之类的,因为对面试官来说大部分在校的同学可能都没有相关的工业界经验,所以期望不会很高,但是如果你对你的项目有过深入思考,就算是一个比较简单的项目,也会给面试官留下深刻的印象。
1. 为什么需要做这个项目,当时的背景是怎么样的
2. 在项目设计阶段,调研过哪些方案,各自方案的优缺点是什么,最后为什么选择了现在的这个方案,方案的细节/具体实现能的讲一下么
3. 在整个项目的过程中,你碰到最大的问题是什么,你是怎么解决的,有没有什么收获
4. 做了哪些测试,分别是怎么做的
5. 这个项目有什么还没解决的问题么
6. 做完这个项目有哪些收获
* 基础知识和算法题的准备,这个其实没什么捷径,就看你掌握了多少。不过还是有一些技巧的,可以在面试前多看一些同公司同部门的面经,可能会有机会在面试中碰到一样的题目。然后像基础知识的准备,可能就是需要你多看多积累。同时注意把那些自己不太会的,又在面试/面经中遇到的题目记录了一下,多花点时间掌握他们,因为这些问题往往是高频题,比较有可能重复的遇到。至于算法题 ,可能要给自己定个目标,比如说每天刷多少题这样,坚持下去,会慢慢好起来的,一开始可能会很难受,后面当你慢慢有了感觉,会很顺利的。同时对于刷算法题,最好有个组织,大家可以相互交流,相互讲题(也可以自己讲给自己),毕竟面试不仅仅只是做出题目那么简单,怎么样把问题讲清楚了也是很重要的,这种能力需要慢慢在实践中培养起来。平时练习的时候多加注意,有这种意识,想着怎么样把自己的的思路讲清楚。顺便提一点,算法题算是面试中比较重要的一环,因为这个部分是不可避免的,同时也是占比比较大的一环,如果你代码能力很强,那么相对来说别人会给你更多的机会,毕竟实际的工作就是在写代码。
## 面试过程中
* 如果可以的话,可以对面试的全过程进行录音,或者对一些自己没回答好的问题做一些记录,方便回过头来进行反思和纠正,这样面试的表现才会越来越好。
* 一开始面试就是会很紧张的,面试也是一个熟能生巧的过程,当你多参加过几轮面试,自然会更自如一些。如果特别紧张的话,可以在面试前让自己安静下来,然后深呼吸调整一下。
* 面试前需要备好纸笔和水,调整好设备(耳机,麦克风,摄像头),然后提前 2-3 分钟进入面试的房间等待即可。
* 面试开始时,通常环节就是自我介绍,可以简单的聊一下教育背景(“我来自XX学校的XX专业”),项目/实习经历(”我在XX公司的XX组实习过,做过XX项目“)。另外我们要学会引导面试官,如果你在某方面很擅长,或者很了解什么。你可以在介绍的时候特别提一下(”我对操作系统很感兴趣,有过一些深入的学习‘),这样面试官肯定会留意到,然后如果面试官在这方面也比较懂,就会在接下来的面试重点考察你的这部分,这样有助于你自己展示自己的特长所在。但是有两点需要注意的是,一个是特别强调的点一定要是自己比较擅长的,另外一个是如果面试官搞过这个方向,他大概率比你更懂,所以你的用词一定要谨慎(比如说“我精通XX的”,最好改成“我对XX有过一些(深入的)了解”)。
* 一般在介绍完,面试官通常会针对你的简历进行提问。而项目/实习/比赛的这方面经历往往是会被最先考察到的,通常问的问题也逃不出上面我们讲过的范畴,如果面试官没具体问你,就是让你聊一下,你可以按照我们上面所提到的问题的顺序讲一遍,这样一定会非常加分。(“我先从这个项目的背景开始讲起,XXXXX;然后我们一开始想了一些方案,分别是XX,XX。他们之间的优缺点也很明显。经过最后的权衡,我们选择了XX,我们选择的原因是XX。它这里的具体方案是这样的XXXX。在实现过程中我们还碰到了这样的一些难点XXX,最后我们是这样解决的XXX。最后还做了一些测试,比如说XXX测试,并且在性能方面测得它提升了XXX。”)
* 然后就是一些基础知识的问答,面试官通常来说会根据你简历上所写的擅长的方向去提问,但是如果面试官问到了一些你不熟悉的东西,有一些话术在大部分情况下是适用的(比如说我自己计网掌握的不太好,而且学的时间也过去很久,基本上没啥记得了。我通常会说“计网这方面的东西学的挺久了,而且在实习中基本上没怎么涉及过,所以里面的一些内容不太记得了。但是我在操作系统/数据库/机组这方面学的比较好,然后平时用的也比较多,您这边能问一些这边相关的问题么”)。通常能把面试官引导到你所擅长的问题上面,但是一定要确保自己确实在其他方面有所擅长,所以如果一般能回答还是尽量回答。然后就是一些问题如果你不太清楚准确的答案,但是你可能有一些思路,你也可以这么说“您好,具体到这个问题我确实不太清楚,但是我之前学过XX的内容,可能对这个问题有点思路,但是不太确定是否正确,您能帮我看看么”,然后根据你思路的推到过程推到一下(比如说曾经被问过 GO 语言的垃圾回收机制,但是因为 GO 的 GC 机制更新过几次,对后来的内容不太记得。但是我记得一些常规的 GC 方式,我就实话实说,然后介绍一下有哪些常规的 GC 方式)。当然如果你真的不会并且完全没思路,还是直接说没思路,而不是瞎扯一通,不懂装懂要好。
* 然后接下来的一部分就是通常的算法题,这里有挺多技巧,同时也比较重要。
1. 首先在面试官给完题目以后,一定要明确自己确实理解清楚了题目的意思,如果不清楚一定要问清楚(有些面试官可能会模糊描述,并且作为一个考察点),同时一定要询问样例(“您好,你能给个样例说明一下么”),确定自己是否理解了的一个标注就是你可以想一组输入,然后和面试官进行确认(“您好,想再确认一下题意,您能帮我看一下么。现在我有一组这样的输入XX,根据题目里面这样的描述XX,所以最后这个输出的结果是不是XX呀,我理解的对么”)。就是一定要不断发问,不断去确认自己真正理解清楚了题目意思,才开始思考具体的算法是什么。
2. 开始想之前,先给自己一段时间思考(“您好,能和我3分钟左右先思考一下这个问题么”)。因为面试到这个时候了,通常会比较疲惫,同时也比较紧张,会难以集中注意力。所以一定要深呼吸,调整状态,迅速进入思考状态。这时候可以在纸上写写画画,先想一个基础的方案,不能想太久(>5分钟)。一定要及时和面试官交流,然后获得反馈。想到一个基础方案以后,你可以说“您好,我现在想了一个基础的解决方案,想先和您这边交流一下”。然后你描述一下你的方案,“您觉得现在的这个方案可行么,可以的话我就开始写了。还是您觉得需要一个更优化的方案”,如果面试官觉得当前的方案OK,那你就可以开始写了。如果不行的话,你要首先去确定哪里可以优化(“您觉得是这个算法本身不行是么,还是里面的一些细节的地方可以更加优化”)。你还得继续想一下哪里可以优化,然后再去找面试官要反馈,“我想了一下,我在这几个地方可能可以优化,我讲一下”,然后讲一下你自己的方案。不过有些时候可能面试官自己有一个方案和你的不太一样,理解不了你的。如果你没有很明确的方式证明自己的方案是对的,那尽量和面试官交流,去了解他的思路。
3. 在开始写以后,首先要注意的是一定要边讲边写,解释清楚每个函数,变量的含义和作用。首先可以询问一下,“面试时间有点紧张,您觉得我这边是直接讲给您听,还是在代码上写具体的注释呢”。然后开始写了以后,在代码格式和命名上一定要规范,而不是按照平时刷题时比较随意的方式,所以在平时练习时也需要尽量注意。然后在写的过程中在关键的地方需要讲解一下,因为上一步中已经和面试官已经和面试官对过思路了,所以按照上面的思路往下写就 OK 了。然后一定要在面试的过程确认面试官能够理解你现有的代码,或者在写完对照着前面的思路从头到尾和面试官讲一下。然后这时候一定不要急着和面试官说自己已经写完了,就说“基础的思路已经写好了,但是我还得代几个例子验证一下”,然后自己可以以注释的方式代码的其他地方写一些样例,然后手动代入验证一下,是否符合。发现都没问题了,在和面试官确认,并且如果有优化的点这时候也可以提一下“我觉得这个代码有几个地方还能优化一下,我可以先讲一下思路么,或者您觉得我需要直接写一下么”。
* 最后一部分往往是反问环节,这时候你可以挑一些你想问的事情了解一下,不过不一定能得到最真实的答案。你可以了解的话题包括但不限于:组里做的东西是什么,组里同学的成员结构,培养机制,同事一般上下班的节奏是怎么样的等等关于组/公司的问题。也可以问一些发展上的问题:推荐书,职业发展路径,35岁危机,面试上有哪些可以改进的地方等等问题。
## 面试后
* 尽快收拾心情,投入到下一场面试中去
* 面试中没有回答出来或者回答不好的地方自己在面试后查漏补缺,针对性的加强一下
* 总结反思一下面试中自己做的好的和不好的地方
另外最后打个广告,如果你对数据库感兴趣的话,可以看我的这个帖子,https://www.nowcoder.com/discuss/694399?source_id=profile_create_nctrack&channel=-1, 欢迎大家联系。如果你觉得这篇帖子对你不错的话,也欢迎点赞收藏和讨论~
全部评论
(2) 回帖