在这篇回答里,就讲以我常规的面试流程为例,说下java方面大致会问什么问题,以及如何确认候选人达到招聘要求。
先说面试前准备,可能有些面试官是拿到简历直接问,而且是在候选人自我介绍时再草草浏览简历,但我不是这样。
1 问招人的项目经理,这个岗位需要的技术什么,比如必须Spring boot,有数据库调优经验优先考虑,要有2到3年相关经验等等。问清楚了,我就好在面试中组织自己的问题。
2 浏览候选人的简历,找出不利点和加分项。
不利点包括,候选人的学历,非计算机相关专业,候选人的经历看上去像培训班经历,或者项目看上去像自学的,或者最近半年不是做Java,或有超过3个月的未在职时间,或者频繁跳槽。
加分项包括,有获奖经历,或者像我一样出过书,或者有大厂经历,或者最近的项目技术和招聘的很匹配等等。
这里说一下,哪怕在简历中发现再多的不利点,面试也会继续,但这些不利点会写在最后的面试结论中。
3 最重要的是,整理候选人Java相关项目经验和所用的技术。
比如候选人用了spring boot,redis,kafka等技术,那么就划下来,面试时会问。
面试前我大概会用5分钟做上面所说的准备,这是必须的,是对招聘项目组负责,也是对候选人负责,在这个时间点上,候选人大概率是已经到会议室了。
下面开始面试。
1 首先是寒暄,比如要不要喝水,过来时方便吗?这样做的目的是让候选人放松。
2 然后进入到自我介绍阶段,如果候选人没有主动说出以前的项目和公司状况,我会进一步提问。
候选人一般会说自己的年龄,工作经历,之前所在的公司和掌握的技术。此时,如果候选人说的工作情况和简历上不符,那么我会重点问,以排查虚假简历。
3 随后进入到介绍项目的阶段,这可以说是正式面试的开始。
在这个过程中,我希望候选人用2,3分钟,大致介绍之前项目的情况,用到的技术,涉及到的亮点。但不少候选人会大谈特谈项目的需求,而忽视项目用的技术和两点钟,那么我就会打断,着重提问,这个项目中用到哪些技术?如果候选人简历上写了还用到分布式组件实现高并发,我就会着重问些情况。问题的格式是,我看你简历上写了用到xx技术,结合你的项目需求,说下使用这个技术的必要性。
也就是说,通过项目介绍,我开始询问候选人相应技术(当然是招聘所需技术)在项目中的使用情况,不会过多涉及到技术细节。
如果候选人这个项目真做过,一般能说得上为什么要使用这个技术,比如项目并发量达到5000tps,所以要用nginx做分布式部署,因为支付模块是异步的,所以用kafka做消息队列等。但如果候选人项目是编的,那么大概率是只会说技术,没法说为啥要用这个技术。由此能确认技术的项目经验。
4 然后大致问下项目的开发流程和上线流程,这块如果候选人不知道怎么说,我也会引导。
比如问,你们项目是github还是其它什么方式来管理代码?用Maven还是gradle来管理项目?用(jenkins)什么来部署发布?测试工具是什么(比如junit或其他自动化测试工具)。这方面我只是询问用什么,不会展开问怎么用。这样问的目的一方面是考核候选人的项目开发能力,另一方面也是排查虚假项目。
5 随后是结合候选人在简历上写的技术提问。这块会按如下层次来问,比如我看到候选人写了用Redis做缓存,我第一层会问,为什么要用?无非是数据库压力大所以要用。第二层问,怎么用?无非是用Jedis或RedisTemplate等组件,第三层问,结合一个需求告诉我怎么用?无非是,遇到xx缓存需求,设置键是什么,值是是什么。
如果只是招个初级开发,那么问到这个程度就可以了。如果是应聘高级开发,那么我还会深入提问,比如你用到的Redis数据结构是什么?如何做持久化。如果是招资深开发或架构,那么我再问神深点,比如redis集群怎么搭,redis集群失效了怎么办?redis怎么和数据就交互,有没有遇到缓存穿透问题?
候选人只要简历上写到的值钱技术,比如kakfa,mycat等,我都会逐一询问。这里请注意我的文法,不是简单地问语法,而是结合项目问怎么用。同时,我也会经常去网上看些redis面试题,但我不会直接问,也是会让候选人结合项目说下,相关技术(比如防穿透)怎么在你项目中实现。
6 结合简历上项目以及技术提问这个阶段,我心里会有期望,比如对初级开发的期望是会Spring boot增删改查,对高级开发的期望是要有基本的分布式组件使用经验等等。所以我不在乎候选人有多少问题没回答上,但我在乎候选人的基本盘稳不稳固。
比如面初级开发的时候,我结合项目提问,发现候选人能用Spring boot+JPA(外加其他组件其他注解)做增删改查,其实候选人技术方面已经成功一半了。后面的技术问题哪怕你没说好,只要别太差,一般能过。但如果候选人在基本盘技术方面可上可下,那么就得再通过后面的问题来确认能否过面试了。
7 后面是我(面试官)自由发问,我一般会从Java核心,数据库,(Spring Boot)框架,分布式组件方面问问题。这些问题网上都有,我就不一一展开说明了。
我会把这些问题分为基础,调优和高深三类。初级开发只要求回答出基础问题。高级开发要求回答到调优程度,再高级些岗位需要知道高深类问题。毕竟不同级别的开发在工作中对应的职责不同。
比如Java核心方面,final用法,treeset和hashSet差别等,这些能直接背到答案的,属于基础。Spring boot方面,常用的jpa注解或Spring boot方面注解以及Spring boot开发流程相关问题也属于基础问题。
调优方面的问题好理解,比如你是怎么排查OOM问题的,你是怎么排查数据库性能问题,再展开下数据库索引,缓存等用法。
高深方面包括底层源码,比如ArrayList底层源码。还包括解决实际问题的经验,比如你是如何排查Redis超时问题的,是怎么排查kafka重发导致不幂等问题的。
这里多啰嗦几句。根据我面试的结果,大多数初级开发只能回答出基础类问题,这虽然能达到要求,但通过背题或准备,初级开发也能回答出更高层次的问题,如果回答出了,这就是初级开发的加分项。
但是不少高级开发甚至工作经验在7年以上的资深开发,我看他们简历上项目经验比较丰富,但依然说不好调优或比较高深的问题,这样就很吃亏。毕竟面试官是通过面试来确认候选人的能力,你平时项目做得再好,面试说不好,你的能力一定会被低估。低估的后果就是过不了面试,或者是薪资被打折。
同时,虽然我自认为我面试能力还行,但偶尔也会漏过一些会说但实际能力不达标的候选人,比如某个岗位是按4年经验给工资的,某候选人经我面试时,能表现出这种能力,但进项目组以后,被发现只具备2年开发的能力。遇到这种情况,项目经理会私下和我说,但我不会有事,毕竟我面过以后,项目经理会再面一轮,招进来能力不符的,他也有责任。
这里只展开面试官的角度记录下我见到的情况,至于怎么提升面试经验,大家可以看我相关文章,我有空也会多写此类文章。
面到这里其实我该问的问题都问好了。 我已经结合了项目确认了候选人的技术,也从java核心,数据库,框架和分布式组件等角度综合确认了候选人的能力。但我自认为我还算比较为候选人考虑,所以我后面会给候选人一个自由发挥的机会。
我会问两个问题:
1 你有哪些能帮助你应聘成功的亮点?
2 你还有哪些技术亮点刚才没有机会说明?同时再给几个方向,比如比如oom调优,数据库调优,分布式组件使用,底层源码分析等。
如果候选人能说出有具体的亮点或优势,我会记录在案。
如果是外企面试,我会考核英语能力,无非是,用英语自我介绍,介绍最熟悉的技术和最熟悉的项目。
最后问些非技术的问题,比如期望工资,到岗时间。如果候选人在简历中有不利因素,比如频繁跳槽,我会问下原因。这时我只是记,不会发表任何意见。
当然还有例行公事的一问,我的问题问完了,你有什么问题?完事以后技术面试就结束了。
此时一般会让候选人等会,我会根据面试提问形成面试报告,面试报告一般分三部分。
1 结合岗位需求,说明候选人在java核心,数据库,框架和分布式组件等等方面的情况,是达标,勉强达标还是不达标。为了量化,一般还会给出例子,比如会写这位候选人的能力和组里xx的能力很相似。
2 列出加分项和不利点。前文也已经说过,加分项包括,能加班,年轻,有大厂经历,有海外经历,拿过奖,出过书或博客等能帮助候选人应聘成功的要点,不利点包括,最近频繁跳槽,最近半年的项目背景技术和所需的不匹配,有长时间不在职等。
需要强调的是,候选人如果在面试中表现出的一些不利因素也会记录下来,比如说话太冲,回答问题条理性不强或性格方面不适合团队协作等。
3 第三部分就是结论,结论无非是,通过,不通过,可上可下有继续面试价值,或者是,虽然本组不适合,但可以推荐给其他组面试。
毕竟人家到现场来一次也不容易,所以如果通过,或者可上可下,或者哪怕有继续面试的价值,项目经理一般都会再去面下。如果是可让其他组面试,也会有其他面试官过去沟通。 也就是说,如果你是到现场面试,在技术面试结束后,没有继续被面, 那么面试结果可能就未必好。至于后面项目经理怎么面,就和技术面试无关了,就不再继续展开了。
也写了这么多了,最后做个总结。
1 本文以我做技术面试官为例,讲述了一次面试的大概流程。其中没有展开写具体问哪些问题,因为这很容易查到,但写了结合项目综合考核候选人能力的问法。
2 从文本里大家可以看到,其实面试能力和实际技术开发能力不是一回事,技术能力一般但面试能力强,照样能过面试,反之亦然。
3 本人既然知道如何考核候选人能力,那同样也知道候选人高效准备面试的技巧,不过这和问题无关,所以就不再展开。感兴趣的朋友可以看我其他文章。或者这个回答如果点击量大,我也会再来更新一波。
最后祝广大朋友都顺利通过面试,早日实现技能和薪资双丰收。