Java面试官经验谈:如何甄别候选人真实的能力,候选人如何展现值钱技能

    我作Java方面的面试官也有些年头了,从校招学生到初级开发到架构师我都面试过。从技术上来说,候选人经过面试的标准可能千差万别,但归结成一句话,就是候选人达到了职位介绍的要求,且相关项目经验达到足量的年限。html

     一样做为程序员,我天然但愿全部的候选人都能成功经过面试,但做为面试官老是要忠于职责,尽可能甄别出候选人的真实能力。面试时,拿到手的候选人简历是经过筛选的,也就是说,若是候选人真的能像简历上所描述的那样,那么必定能过面试,但事实上很多候选人仅仅是“简历拿得出手”而已。在本文里,将站在资深面试官的角度,讲述如何在面试中甄别候选人能力的若干考察要点,从中广大候选人朋友能进一步了解面试的准备方式。特别地,对于一些看了若干课程的同窗,大家能够对照地看下本文里给出的检查点,看下大家当前的准备说辞可否经得起面试官的推敲。前端

1 幸存者误差,其实有很多简历甚至没法到达面试官的手上

    面试前我拿到手的简历,通常看上去都行,其实有很多简历已经被过滤掉了,我本人也作过筛选简历的工做,在我以前的博文里也分析过哪些简历能够帮你争取到面试机会,这里就再啰嗦下,讲下哪些面试得不到面试机会。vue

    1 没法证实本身在相关技术上有足量的工做或项目年限。好比某岗位须要3年Java开发经验,你简历上虽然给了一大堆项目描述,但没法总结性地写明你有3年Java开发经验,那估计面试机会。java

    2 虽然年限够,但简历上看不出本岗位须要的技术,好比本岗位须要spring cloud外带netty和dubbo,你简历上项目描述很花哨,前端有vuejs后端用ssm,还有jvm调优经验,但关键技术没,那估计也没面试机会。linux

    3 简历上有明显的缺陷或矛盾点,好比最近半年没工做,学历不够,或非计算机相关专业且技能描述过于简单,或项目时间和以前工做过的公司时间对不上。git

    其实我我的感受,那么能力再通常,至少能用简历获得小公司的面试机会,只要你的简历符合以下的条件。程序员

   1 对于社招而言,学校,专业,学历其实重要性并大,一些小厂或者外派岗位甚至更关注项目经验,但你要写清楚有足量的相关技术项目经验(好比java),且要进一步用公司和项目经历证实这点。面试

   2 写清楚你熟悉职位介绍上的技术,这一样是态度问题,你就仔细阅读每份职位介绍,而后针对性地完善项目介绍。  spring

   3 对于一些负面因素,必定要加上说明,好比你最近半年没工做,或最近跳槽太频繁,你能够给出客观理由,不是你主观上不稳定或能力差,是有其它客观因素,好比换城市发展,或者考研。数据库

2 甄别项目经历的要点和发问方式

    做为面试官,拿到简历后会通读其中的公司经历和项目介绍,以此来甄别真实的商业项目经验,哪些点比较可疑呢?

    1 好比要招个Java开发,若是候选人有培训班经历,须要确认以前的经验是否和Java相关,通常状况下,候选人以前是没作Java,这样候选人的相关工做经历年限就达不到面试要求了。

    2 小公司但作大项目,好比公司规模也就几十号人,但用半年作了一个电商系统,并且里面分布式技术都用全了,那么这种项目须要重点甄别。

    3 简历上最近的项目描述,候选人通常比较上心,此外还要看一年前或两年前的项目描述,看其中的技术是否有矛盾,好比有候选人两年前用的技术和最近项目用的技术都同样,估计是复制粘贴的,这就露馅了。

    上述甄别的目的是,确认相关技术或经历的年限,排查自编或学习的项目经历年限,好比公司给的工资是针对3年项目经验的,若是你用虚假经从来顶替,那么一方面不利于项目组,另外一方面就不利于其它候选人。

    这些疑点是须要在技术提问前确认好的,也就是说,若是疑点被确认属实,就说明候选人相关技术年限不达标,就没有继续面试的必要了,那么怎么确认?

    若是本项目组或其它项目组须要初级开发,而候选人简历上确实有疑点,通常我会明说,你xx项目看上去像学习项目,你和我说实话,若是你告诉我这些项目是真实项目,那就我按高级开发的真实项目面了,若是你告诉我是学习项目,那么我就用初级开发的标准面(或让其它项目组的面试官面),可能初级开发的工资会少,但问题相对简单。这样大多数候选人会说实话,这样两厢方便。

    若是没有初级开发岗,对于这些疑点项目,我会围绕以下的点来发问。

    1 确认项目人数,项目周期和客户方,以及项目如今是否已经上线。对于编造或学习项目,通常项目都不会上线。

    2 询问项目打包编译和部署的方式,通常的项目都用maven或gradle打包,或者用ant也算了,通常部署在linux上,出于可用性方面的考虑,会同时会部署在多台机器上。若是项目真实作过,候选人多少也能说出些,但若是是学习项目,那么回答就五花八门了,我甚至据说过部署在windows机器上的。

    3 询问项目的管理方式,好比用什么工具来管理版本(好比git或svn等),代码review是怎么作的?用什么工具来管理bug(好比jira等),用什么工具画uml图,怎么作单元测试?(好比junit)开发代码时须要注意哪些规范。这些也是真实作过项目才能知道。

    4 问你项目里怎么输出日志,你怎么经过日志来排查问题。通常上线后,日志都打在linux上,但若是是学习项目,则只能在windows上看日志了。

    5 通常真实项目至少会配两套环境,一套测试用,一套上线用,而学习项目(甚至培训班项目)只会用一套。因此我也会对应地问,你项目是怎么搭建这两套环境,这两套环境里配置文件是怎么区分的?

    经过上述方式我还真甄别出很多学习或虚假项目。其实我知道,上述甄别方式的做用有限,好比有候选人最近一个项目是真实的,但以前项目是自编的或学习项目,他彻底能够用最近一个项目的说辞套在前一个项目里,这就须要用以下的甄别说辞的发问方式了。写到这里,我不敢庆幸,更不敢幸灾乐祸,只有叹息,职责使然,不敢拿公司的信任作人情。

3 值钱技术“嫁接”到真实项目上的甄别之道

    其实在我以前的博文聊聊我当年在培训学校作开发的经历里已经提到,“半真半假”的项目经历最难甄别,这话怎么讲呢?

    候选人的公司是真实的,项目也是真实的,但候选人用了这个真实的“壳”加入了虚假的技术。好比候选人在最近的项目里明明只作了最基本的增删改查,但结合项目背景和业务应用添加了从视频课里掌握的分布式组件、性能调优以及JVM调优的说辞。甚至能够这样说,有一部分程序员就在自己项目经验不足的状况下,靠这种技巧升级到资深开发或架构师。

    做为面试官,当看到候选人在简历上有分布式之类的值钱经验时,就须要考核这些经验是真的从项目里积累的,仍是只掌握了理论经验。若是候选人在简历中还有有“培训班”、“小公司”和“转行”之类的要素,更要重点考核,以下给出具体的甄别之道。

    第一问技术的使用背景,好比分布式用在高并发,分库分表和数据库调优用在大批量数据,就请候选人告诉我,你的业务里,哪些点须要用到这些值钱技术。有些候选人值钱技术只是从网络教学视频上学的,没项目实践经验,这个一问就能问出来。

    第二问技术的最基本的用法,好比Redis缓存,就问如何以Hash表方式读取数据,对于Dubbo,怎么设置超时时间,Kafka里怎么设置消息重发,这些问题不求难,只要是用过就必定能知道,但很多候选人若是连这个都说不上,后面我就不会再问了。

    若是能回答好第二层问题,那么至少说明候选人用过,接下来会是第三层的问题,问项目里解决过哪些实际问题,再具体些,用到分布式等技术老是要解决高并发等问题,我就问,你项目的并发量是多少?为了应对这个并发量,你项目里用到哪些组件,这些组件是如何构成集群,如何部署在linux上的?

    以Redis举例,根据上述三层提问的方式,我通常会问以下的问题。

    1 你项目业务的并发量是多少?结合一个业务场景,告诉我,大家项目用到了哪些Redis数据结构?这是问技术的使用毕竟

    2 大家项目里,Redis对象的缓存时间通常设多少?(通常项目都会设,不然对象会堆积在内存里,从而致使OOM)

    3 大家Redis集群通常是怎么搭建的?(项目里,出于重用性考虑,通常都用集群,不会用单机版) 

    4 Redis持久化怎么作?消息通信机制怎么作?如何压测?这些场景在项目里大几率能用到。

    上述2到4点是问技术的用法,通常若是在项目里用过,多少会用到其中几个点,若是都说不上,那么能够说只会理论不会技术。

    5 结合项目里遇到过的一个问题,你说下如何在项目里排查Redis方面的问题?具体来讲,如何发现问题的?(无非是经过监控,经过日志,或者是用户投诉)如何分析问题的?(通常是看日志),而后如何定位和解决问题的。

    对于其它组件,好比dubbo,mycat,netty,kafka等,也是采用相似的问法,第一问如何在项目里用,第二问细节,第三问如何排查解决问题。请注意在这阶段我不问底层代码,由于当前仍是处于确认候选人技术的阶段,若是候选人过不了这关,只能说具有理论经验,这样经过看视频看资料准备的值钱技能基本就白费了。只有当能自证有项目经验,才有资格经过底层代码调优技能等细节来锦上添花。  

4 候选人说出哪些点,才能证实值钱技术有项目经验(教你准备值钱技术的方法)

    根据个人体会,若是真的达到资深开发或者架构师级别,面试时大多能靠实力过关,只要结合作过的项目和排查过的问题,稍微准备些技术细节便可,由于他们在面试中能展现本身的亮点太多了。而对于一些只会增删改查的初级开发,或者没分布式组件实践机会的程序员, 因为缺少项目经验以及亮点说辞,这些人在挑战高一级的岗位以及大公司时,难度很大,有很多人就所以长时间停留在低级岗位或小公司,直到30岁和35岁来临。

    所谓难者不会,会者不难,在这部分里,将给出一些通用性的技术整合项目经验的说辞,你们如何据此准备面试,大几率能让面试官认为,你有实践经验,毕竟面试顶多了才1小时。

    技术结合项目需求的说辞,讲清楚xx技术用到xx场景里。

    1  在这个项目的xx模块里,我用到了Redis(或其它分布式组件),缘由是这个模块的并发量达到了xx,单纯把请求压到数据库不行,因此得用Redis缓存,或者给出其它必须用分布式的缘由。

   2  在这个项目的订单处理模块里,因为某些流水表数据量太大,因此用到Mycat分库分表,具体的作法是,把百万级别的xx表拆分红10个表,按xx字段的最后一位,把数据插入到不一样的分表里。

   准备些技术的细节,并结合项目需求说出来,以下给出netty方面的说辞,至于其它技术,也请用相似的方式来组织。

   在咱们的线下商城项目里的收单和优惠券模块间,须要用netty转发收单模块的消息,在使用过程当中,咱们用到了protobuf做为netty的序列化协议,并在encode和decode方法里定义了序列化方面的代码,并且采用了netty整合线程池的作法。

    准备些解决实际问题的说辞。

    1 在测试环境里,经过cat组件会发现,咱们的订单模块常常会发现内存使用量太高,并且经过一些oom时的dump文件,会发现内存溢出时,Redis相关的内存用量太高,通过分析,发现Redis在缓存数据时,没有设置超时时间,后面再说下解决的方法。

    2 在咱们项目的测试环境里,常常会看到慢SQL的监控,通过看日志,发现是Redis并无缓存住空或者不存在的数据,因此致使把请求全走到数据库,而后说下如何更改缓存规则。

    以下再列些可能会出现问题的点:线程池设置不当会致使OOM,Dubbo调用超时时间设置过大会致使下游模块返回过慢,从而致使整条链路卡死,Kafka重发机制没设置好,从而致使不幂等的现象,再不济,能够说Java里事务隔离级别设置太高从而致使数据库链接打满,或者是集合等对象用好没关,致使OOM问题。任何一个点,均可以围绕“经过监控发现问题”,“经过看linux日志定位问题”和“给出解决方案解决问题”来讲,同时结合项目案例说明。 

5 总结,技术案例说辞+结合项目经历说明 = 面试成功

    当前网上相关分布式技术和面试等课程不少,因此一些值钱的技术说辞,好比MySQL集群,Redis缓存,秒杀系统整合等方面的技术说辞不难准备,甚至Java小白都能说得头头是道,但有很多候选人偏重于技术自己的说辞,不结合项目准备,甚至不知道要结合项目准备,能够说这已是候选人在面试中的通病。因为方法不对,这就致使有部分候选人再怎么准备也过不了面试,甚至没有面试机会。别的不说,本人用本文给出的面试问法,确实甄别出了很多只会说,不会作的候选人。

    对此,本文在介绍“甄别方法”后给出的面试说辞,乃至说辞背后包含的“结合项目准备”的方法,能够说是面试准备中的“关键少数”:不须要用太多的时间和精力准备,但不许备这方面的说辞大几率不过面试。能够这样说,这种“四两拨千斤”的面试技术,是本文价值所在,而若是你们能在面试中“顺带”地按本文给出的套路,结合项目需求叙述技术,必定能大几率地提高你们面试成功的可能性。

 

    请你们关注个人公众号:一块儿进步,一块儿挣钱,在本公众号里,会有不少精彩文章。

相关文章
相关标签/搜索