最近在为团队招聘开发人员,筛选了200多份简历,面试了50多人,感触良多,回想当初自己多多少少也存在这些问题,想着做一个总结。
首先,面试不是闲聊,要通过短暂的时间尽可能向面试官展示你的各方面能力,不仅限于沟通表达、逻辑思维、技能掌握情况、设计能力、解决问题能力等。作为面试官一般都很忙,都在想着尽快挖掘你的能力和潜力,好结束面试专心做其它的工作,所以,面对提问的问题,要简明扼要地回答。例如,当面试官问你是否了解Spring框架,不需要从头到尾讲Spring的由来和定义,直接说“我在项目中使用Spring进行依赖注入和事务管理,具体实现了某某模块,依赖注入是如何实现的、事务管理是基于什么实现的。” 简洁有力,一语中的。面试官更关心你在实际工作中如何应用这些技术,以及对技术的探究深度和自己的思考,而不是听你背标准答案。
接下来是回答问题的节奏感。有些应聘者在面试时像挤牙膏,面试官不问不会多说一个字,真的是惜字如金。面试是展示自己能力的机会,应该主动出击,理解面试官的意图后,有条理地把相关的信息全盘托出。比如,当面试官问是否了解ThreadLocal时,可以回答:“ThreadLocal是Java中的一个类,用于解决多线程环境下变量的隔离问题,即每个线程都有自己独立的一份变量副本,互不干扰。它的实现原理是每一个Thread维护一个ThreadLocalMap映射表,映射表的key是ThreadLocal实例,并且使用的是ThreadLocal的弱引用,value是具体需要存储的Object。需要注意ThreadLocal的弱引用,当ThreadLocal没有外部强引用,在发生垃圾回收时,这个ThreadLocal一定会被回收,此时在ThreadLocalMap中出现key为null的Entry,外部将不能获取这些key为null的Entry的value,并且如果当前线程一直存活,那么就会存在一条强引用链:Thread Ref -> Thread -> ThreaLocalMap -> Entry -> value,导致value对应的Object一直无法被回收,产生内存泄露。这个问题在Java8已经做了优化,查看源码会发现,ThreadLocal的get、set和remove方法都实现了对所有key为null的value的清除,但仍可能会发生内存泄露,因为可能使用了ThreadLocal的get或set方法后发生GC,此后不调用get、set或remove方法,为null的value就不会被清除。解决办法是每次使用完ThreadLocal都调用它的remove()方法清除数据,或者按照JDK建议将ThreadLocal变量定义成private static,这样就一直存在ThreadLocal的强引用,也就能保证任何时候都能通过ThreadLocal的弱引用访问到Entry的value值,进而清除掉。”这样的回答直接把面试官后面想问的都给说了,他也就不再追问了,不仅展示了你的理解深度,还让面试官看到你的逻辑和条理性。
在面试过程中,不知道的问题不要乱说。能作为面试官的都是经验丰富的老手了,有时候一听就知道你是在瞎编胡扯。如果确实不了解,可以坦诚地说:“这个我还不太了解,但我知道啥啥啥,可以说一下它吗?” 这种回答既展示了你的诚实,也表现出你的求知欲和学习能力。比如,面试官问你了解微服务架构吗?你可以说:“微服务架构我还在学习中,但我比较熟悉单体架构和模块化设计,可以谈谈这方面的经验。”
遇到没听清的问题,千万不要装作知道。直接说:“抱歉,我没听清楚您的问题,是不是啥啥啥?”这样不仅避免了答非所问的尴尬,还显示出你对面试的认真态度和细心程度。有次面试中,一个候选人为了不显得自己不懂,随便答了一个与问题毫不相关的答案,结果不仅浪费了时间,还让人觉得不够专业。
有些同学在简历上喜欢堆砌各种项目经验,并且在面试中喜欢提及仅仅是参与过、却又并不了解细节的项目,本意是想展现自己项目的丰富度,但往往事与愿违。要尽量提你全程参与并且熟悉的项目,这样无论面试官怎么问,你都能应对自如,展示出真正的实力。比如,有同学说自己参与过一个大型电商项目,但一问具体负责了什么模块,具体用什么技术实现的,却答不上来。这种情况,面试官只会觉得你在夸大其词、肤浅,反而增加负面评价。另外,有些培训机构会让学员编造一些没做过的项目放到简历中,比如网约车系统、支付系统,这些就不要再写到简历上了,面试官也不是傻子,即使你按培训课程教授的答案对答如流,硬生生被虚假的项目经历给毁了,本来可能印象挺好的,得不偿失。
还有一个误区是喜欢在简历上罗列一堆听过但没用过的技术。这在面试时非常危险,面试官一问你答不上来,就会不断减分。没用过的技术不要写,如果被问到可以诚实地说:“这个我还没用过,但我有兴趣学习。” 这样既避免了尴尬,也表现出你的学习意愿。有次面试中,一个候选人在简历上写了精通Docker,结果一问具体怎么用、解决了什么问题,他完全答不上来。最后只能无奈地承认自己只是看过文档。
即使面试官的问题看起来很基础或者很“low”,也不要表现出轻蔑的态度。每一个问题背后,都是在考察你的基础知识和态度。认真对待每一个问题,尊重面试官,展示出你的职业素养和礼貌。有面试官喜欢问一些基础的问题,比如HashMap的底层实现,有同学一听觉得简单,就随便回答,甚至显得不耐烦。这种态度分分钟就会被淘汰,面试并不一定只考察你的技术能力,态度非常重要。
最后,回答问题时不要侃侃而谈,注意面试官的提问,有侧重点地回答。比如问到数据库优化经验,不要扯到代码优化上,要针对性地回答:“在数据库优化方面,我主要做了索引优化、查询优化,具体是通过啥啥啥操作,并且在项目中减少了慢查询,提高了响应速度。” 这样的回答既有针对性,又能展示你的专业能力。有些同学在被问到优化经验时,滔滔不绝地讲了半天性能优化,结果面试官一听,发现全是理论,缺乏实际操作经验,最终并没有打动面试官。
如果是远程视频面试,一定要提前找一个安静、独立的空间,提前调整好视频摄像头和音频输入输出,最好做一下测试,保障视频和语音效果良好,避免面试过程中出现网络延迟或中断、嘈杂声音等影响面试效果的问题。
面试不仅仅是展示自己,更是一次自我审视和提升的机会。愿每一个程序员都能找到心仪的工作,成为出色的开发工程师。
附上整理的面试思维导图,祝面试顺利!