由于我做了比较长时间的技术面试官,根据我的面试体会,不少同学收到面试后,什么准备也不会做,到时候问题就来了。
这样做的后果是:不知彼,不知己,每战必殆。哪怕侥幸面试成,工资一定会被压得很低。
其实公司肯花时间让你去面试,前提条件一定是通过你的简历,一定发现了你和公司的匹配点,也就是说,一定是有录用意向的。
在技术面试的时间段里(最长1个小时),你如果能展现你的优势那是最好的,但如果你做不到这点,简单点,让面试官感觉你达到了最低标准即可。这好比在大学里考试,有些同学对某门课的知识点完全不懂,但也有可能通过考前突击和刷题来通过考试(不作弊),而且还有可能考高分。
至于通过技术面试后,项目经理或人事的面试一般是过滤特别差的,比如考察些团队协作能力和沟通表达能力等,这对大家来说应该不是问题。所以在本文里,就以Java后端高级开发为例,讲述下面试的准备点。方法是通用的,其它方向的同学也可以以此类推。
一、至少定出2天的准备时间
面试的准备时间一般别低于2天,如果可以,再延长些,但别太长。
比如是去现场面试,可以找的借口就比较多,比如项目忙,会多,时间间隔别超过5个工作日。比如周二收到通知,就尽量约到周五,如果是是周三周四,那么别超过下周二。
电话面试的话,借口不多,一般可以约到两天后。
但不建议今天接到通知,明天就直接电话面或现场面了,一方面公司会认为你当前很闲,另一方面,你真就没太多的准备时间了。
二、一定得再次阅读公司的职位要求
就好比是考试,先得审题,大方向错了,准备就白做了。
比如,有如下的职位描述。
我们能从中挖掘出如下的技能需求点:
3年经验,熟悉常用类库
熟悉Spring和Mybatis框架
熟悉分布式中间件(比如消息,缓存等中间件)
熟悉数据库,最好是NoSQL
最好有大数据经验
而关于非技能的要求如下:
有责任心,有主动性
需要有团队合作的能力
需要有良好的编码习惯,学习能力要强。
其实,在投简历前,就可以根据上述要求微调简历,这样获得该岗位的面试机会能更大。不过在本文里,就将以上述需求为例,讲述面试前的准备。
三、在刷题前,先准备项目描述的说辞
我见到不少候选人,在面试前,就会着重刷题,比如看算法题,基础题等,这个是必要的。
不过在面试里,第一个环节一般都是项目介绍,也就是说,如果面试官通过项目,看到你的技能和职位不匹配,你甚至没有机会被问其他问题。
这里介绍些项目描述的要点:
1. 业务需求可以一笔带过,用寥寥几句话介绍项目的背景,大致做了什么,工期和人数即可,别讲太多,因为面试官不关心。下面给出一个说辞的案例。
2. 结合项目实际需求,介绍项目用到的技术,比如在上述职位描述里,要求有spring mvc,消息中间件,数据库等需求,下面同样给出各说辞的案例。
大家能看到,在上述说辞里,我们结合了案例,说出了招聘方需要的技术点,不过请注意,这里仅仅是介绍项目,结合功能点说出技术即可,别过多展开,因为一旦过度展开,就会让面试官感觉你思路不清晰,或者凭借准备有恃无恐。
3. 再结合项目,说些招聘方需要的非技术的要求。
4. 如果有,说下你在项目里的亮点,比如用到了一些比较好的技术。
大家看到,上述说辞不复杂,准备好以后,说起来估计也就2,3分钟 但就通过上述说辞,亮出了你的基本信息,而且能给面试官留下思路清晰,技术匹配的印象。
这里请注意,如果大家在项目里的技术和要求的不匹配,不建议作假,但可以通过如下的方式来做到匹配。
1. 如果你的ORM用的不是Mytabis,而是itabis或干脆hibernate,就直说用到这些,因为ORM是相通的。
2. 如果这个技术,比如Redis,在项目里用到,但你没做,你可以在了解的基础上说出来,比如说:“这个项目还用到了Reids...,redis是用在xx模块上,功能是xxx”,请注意,这里你说是项目用到了,而不是你用到了,这里,如果在后继的回答中,你对redis的用法和技能问题都能回答上,那么面试官不会介意这点。
3. 某个技术你在这个项目里没用到,但你比较熟悉,你也可以通过如下的说辞说下。
这里请务必注意,在准备项目说辞的时候,可以尽量和职位要求靠,但别太离谱。因为你说的每个技术点,在后面,面试官都可能提问。如果某个技术点你没掌握,其实问题不大,面试官本来就没要求你十全十美,但如果你说你用过某个技术,但通过后面的问题,面试官发现你其实没用过,或者掌握程度没像你说得那样好,那么这个性质就不一样了。
四、一定得准备项目描述里提到的技术
在介绍项目时,就好比是钓鱼,吸引面试官把注意力集中到你提到的技术点上。
所以在准备面试的时候,一定得先准备你项目里提到的技术(大多也是招聘要求的技术)。准备时可以按照如下的思路。
第一:一定得结合项目背景,比如大家要准备分布式缓存redis,先说在哪个项目的哪个场景里用到,比如在刚才提到的电信系统里。这样就会让面试官感觉到这个技术你实际用过,而不是简单地只有学习经验。
第二:有不少关键点,你用到以后一定是知道的,比如redis的基本数据结构,如何读和写,缓存如果击穿了怎么办?这些问题点一定得准备,所谓吹牛要打草稿。比如你可以说,在配置redis时,用到了xx配置文件的xx属性,它是干嘛的。这话不用多,但说出来以后,面试官一听就知道你真的用过。
第三:可以准备些这个技术的高级问题,比如Redis集群如何搭建,集群里一台机器失效了怎么热备转移。同样,可以讲些如何配置以及如何使用的关键点。或者,大家可以准备redis分布式锁的底层实现。
请记住,需要对你项目里提到的任何技术都按上述要求做准备,虽然有些技术你未必会被问到。
这里,如果大家在项目里仅仅是用到了基本的功能,比如redis就用了基本的读和写,但你可以适当看些高级知识点和面试题。
五、一定得准备亮点话题,并想办法往这方面绕,而且亮点话题多多益善
对于java高级开发而言,可以准备如下的话题,大家也能以此为参考,准备些其它的话题:
虚拟机内存优化
数据库性能调优
分布式高并发架构
一些热门组件,比如redis,nginx等
大数据方向的用法
java core(比如集合或多线程)方面的底层实现代码
Spring系列(比如IOC, AOP, MVC,Spring Boot, Spring Cloud)方面的底层实现代码。
要准备到什么程度:
最好结合项目实际说出真的用过这些技术。
最好往性能调优方面靠。
下面就以虚拟机为例,说下如何在面试中引出该话题,以及面试时该怎么说。其它亮点话题也可以照此准备。
第一:在简历的最近项目介绍里加上类似这样描述,“这个项目的内存要求比较高,虽然在项目里分配的对象不少,但这个项目只被分配了1G内存,所以在这个项目里,我实践了一些定位排查内存问题的技能,也做了些调优的工作“,这样面试官见到简历的描述,就会自然而然地提问了。
第二:在面试中总会有“项目介绍”这个环节,面试官会让候选人介绍最近的(或最拿得出手)的一个项目,这样大家就可以顺势说出刚才已经给出的描述。
第三:大家可以在回答数据库或集合等方面的问题时引出这个话题,比如回答完JDBC问题后,大家可以说一句,“用好的Connection对象我们会及时关闭,否则它所占用的内存对象无法被GC回收”,或者在谈及List等集合类型时,同时多说一句,“用好的集合对象我们会及时clear掉,否则这个集合也会对一些对象产生强引用,这样就会延迟对象的回收时间”。
第四:在自我总结时,可以说,有虚拟机调优的经验。
那么,在面试时,该怎么说呢?
大家可以先从堆的结构入手,进而详细说明垃圾回收的流程。
再进一步说明如何写出高性能的代码。比如物理对象(比如Connectio或IO)用好之后得及时close。大的对象用好后应当及时设置成null,以撤销强引用。集合对象用好后应当及时clear。尽量别频繁地使用String(或其它不变类)对象,这样容易产生内存碎片。
还展示监控、定位和调优方面的综合能力。这里可以说下,比如通过Jprofiler+jmeter进行JVM性能调优的方法。
大家甚至可以看些虚拟机的底层实现细节,在面试中说下,这样能大大提升自己的专业素养。
六、时间多,再去刷题
当大家在准备好项目描述,而且当项目里的技术也都准备好说辞以后,也按了上述要求准备好了亮点,这时候再去刷题。
请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
在面试时,大家可以通过上文中给出的方法,通过多抛出技术点,把面试引入准备好的范围。也就是说,如果面试官发现候选人技术可以,其它的技术问题就不会怎么问了。
在面试时,一定得通过准备主导面试官提问,否则,一旦面试官开始天马行空地问问题,大家薄弱点被暴露的机会就有可能大大增加。
七、面试题,通过准备让面试官感觉你软实力也行
面试官只有当确认候选人在责任心和团队协作能力方面没问题,才敢把他招进公司。有些面试官会通过问问题来确认这两点,但有些有经验的面试官甚至可以通过候选人回答问题的方式和说话的语气上来确认。
所以大家在面试前,首先可以按如下的要点,在平时的生活和工作中练熟良好交流方式。
第一:谈吐清晰,语速不急不缓,至少让面试官能听懂你说的话。而且力求说话果断,别吞吞吐吐的,这样能显示出你有足够的担当。
第二:交流时尽量目视面试官,语气不亢不卑,别太僵硬,说话别过于强势。脸部可以适当微笑,面试官在说话时可以适当点头互动,总之得让面试官感觉和你交流不吃力,最好还让面试官感觉乐意和你交流。
第三:应积极主动回答面试官的提问,如果没听明白问题,别僵持着等面试官进一步解释,应当主动询问。如果感觉面试官没完全理解自己的回答,或者理解有误,应当进一步主动解释,以展示积极沟通的姿态。
第四:即使不认同面试官的观点,也应当心平气和地交流,不能急躁,别轻易打断面试官的话,可以倾听完面试官的话后耐心地与之交流。有些面试官可能会故意刁难候选人,美其名曰“压力测试”,在这种情况下,候选人更应当心平气和,不能起争执。
在面试过程中,再有经验的面试官可能也无法通过实例来验证候选人的“团队协作能力”(因为在短时间内无法协作),但如果大家能给面试官留下“沟通表达没问题”、“为人和善”和“遇到难点能积极主动协调沟通”的良好印象,那么面试官一般也能认可候选人的团队协作能力。
此外,大家还可以准备如下的说辞,一旦能找合适的机会说出来,面试官更会认可大家的责任心和团队协作能力。
说辞1:(在介绍项目时)这个项目做到一半时,客户方变更了一些需求点,这给我们项目组造成了比较大的压力。在项目经理的带领下,我们都被分配了更多的任务,在这种情况下,我通过加班按时按质完成了任务,而且在做的过程中,一旦出现需求或技术方面的问题,我也会主动找同事或项目经理确认。
总之,在出现问题时,你不是退缩,而能通过加班等方式积极面对和解决问题,而且一旦有问题,你不是得过且过,而会主动确认。
说辞2:(介绍自己在项目中的角色)在这个项目组里,除了本职的开发工作外,我还会积极主动地和测试人员沟通,一方面告诉他们该怎么测,另一方面,一旦发现问题,我会和他们一起重现问题,完成修改后我也会主动告诉测试人员,让他们尽快确认。
总之,在项目里,你不仅能完成本职工作,而且还能和团队其它人员一起协作。
说辞3:(介绍项目的亮点)在项目里,我遇到一个需求点,这需要多个团队一起开发,这时我会和相关人员一起开会,确定各自的任务 点和工期,完成功能点后我们会一起联调。
说辞4:(如果面试官问你,遇到自己无法解决的问题该怎么办?)我不会推掉任务,我先会查阅资料,如果不行,我会问项目经理,在他们给出的解决方案基础上,我会细化成具体的实现代码,最后我会把实现好的功能点和项目经理确认,以求没有理解上的偏差。
在责任心和团队协作能力这两方面,不建议直接说“我有”,因为这相当于自我表扬,可信度不高,大家可以采用上述“用具体事实证明”的方式,这样面试官听了后就自然能认可大家的相关能力。