在如何准备Java面试?如何把面试官的提问引导到自己准备好的范围内?这篇博文后,提到了不少引导的说辞和技巧,如果能把面试官的提问引导到事先准备好的亮点上,一方面确实可以更有效地耗费面试时间,另一方面也能最大程度地挖掘和展示自己的亮点。
上述博文是站在战术角度讲述方法论,而本文会从“技术面试官凭什么让候选人过”这个本源性问题入手,从战略角度再讲些“面试准备”的方面和技巧,读完本文后,大家其实会豁然开朗地发现,其实提升技能和准备面试并不冲突,也就是说,只要平时多挖掘现有项目,多深入细节和亮点,准备面试也就是“随手”的事情。
1 面试问题都是围绕“相关项目经验”展开
换位思考下,如果你是面试官,候选人达到什么程度能让过?能达到职位介绍的要求,能干活。那怎么能证明能干活呢?只能是看候选人在之前项目里是否用过对应技术,比如要招个资深开发,那么要确认java框架,数据库技术,分布式组件等jd里提到的技术之前项目里是否用过,如果要招架构师,那么还得确认分布式组件方面的调优部署等技能是否有项目经验。
为什么一定要有商业项目经验呢?因为其它的培训班项目经验,或者自己调试通过的学习项目,或者再是课程设计的项目,里面也就是只要功能事先即可,顶多加些微不足道的测试和打包部署的练习,而实现功能的代码可能也就是增删改查,很少涉及到调优和分布式。
相反在用以挣钱的商业项目里,除了写代码外,还需要哪些技能呢?单元测试,jenkins部署上线,调试sql等性能,敏捷式管理等等,相信有过商业项目经验的人一定还能再列出很多,更为关键的时,在商业项目里,一定需要程序员具备通过看日志debug分析问题和解决问题的能力,而且大多数商业项目都是分布式部署的,框架组件方面的技能绝非是简单调用API。通过上述对比,大家能发现,大多数培训班项目、课程设计项目还有其它学习项目,甚至还包括编造的项目,这些含金量都没法和商业项目比。所以只要合格的面试官,面试问题一定会围绕“技术在项目里怎么用”这个点。
说到这里,不少同学可能会举出很多反例,确实在不少面试里,用自编的项目也能过关,面试官也只会浅尝辄止地问些理论问题。除却面试官本身的能力外,不少初级开发岗其实公司很低,所以要求并不高,而且如果有些项目比较缺人,或者有些小公司干脆没人愿去,所以在面试过程中降低了要求,对此候选人绝对不该因此沾沾自喜,而应当清楚认清自己的能力和公司的状况。而对于高级开发以上的开发岗,如果无法证明相关技术有足够的商业项目经验,或者年限不够,一般情况下是过不了面试的。
那怎么考察相关技能的项目经验呢?后文会展开讲,这里先用大家都做过的数据库,给出提问方式。
1 基础层面,用过哪些数据库,多少经验?Jdbc里preparedstatment的用法,以及索引的概念等,这部分通过背题,或许可以通过。
2 调优层面,索引,执行计划的技巧,比如哪些sql用不到索引,并问在项目里建过哪些索引,执行计划要看哪些要素。
3 排查问题层面,请结合实例,给出监控慢sql的做法,并讲下用执行计划等分析和解决慢sql的方法,这里就涉及到看日志监控和实际解决问题。
4 如果是资深开发和架构师岗,再问mycat, redis集群方面的问题,比如如何部署,分库规则,缓存时间等,也要求讲述分析排查和解决实际问题的经验。
也就是说,如果候选人仅仅准备业务功能点,或者只背面试题,理论不结合实际,很难通过面试,更何况不少候选人干脆是没做准备。
2 很多面试相关的问题就迎刃而解
正是因为“相关项目经验”是考核候选人的重要标准(不敢说唯一,但确实很重要),所以很多面试相关的问题一想就明白。
1 培训班学生该不该隐瞒经历?
如果看到候选人最近参加过java培训班,那么面试官或许会想,为什么要参加?之前的项目经验是不是非java?然后问下来,会发现候选人相关经验年限很短,甚至不足半年,如果一些公司和岗位对经验的年限没要求就算,如果有要求,可能候选人哪怕面试变现再出色,过面试的可能性也不大。
2 为什么有些面试官对培训班学员有偏见?
站在客观公正的立场上,至少我个人对培训班学员没有主观上的偏见,但由于培训班项目经验无法算作商业项目经验,而且候选人在培训班之前的经验可能是非开发甚至非it的,而面试要求上有相关经验的年限要求,那么面试官可能不得不遵从。
3 如果候选人从网上找个项目跑通,然后吃透里面的流程和技术,能否把此当成项目经验?
这对候选人提升技术一定有帮助,但不能算作商业项目经验,如果有些初级岗,或者是校招,有此类项目总比没有强,如过已经工作过,那么抱歉,此类项目对候选人帮助不大。
4 网上的面试题,以及基于分布式等高大上值钱的项目有用吗?
面试题是理论方面的,而面试着重考核技术的应用,而一些包含值钱技术的项目,顶了天也是学习项目。可以是通过理论和值钱的学习项目了解技术,然后一定要想办法把这些技术嵌入到你当前项目里,比如你看会了redis,同时你项目里,也做过,并排查过此类问题,两者结合准备面试说辞,这才能让值钱技术帮到你。
5 面试时,博文出书等加分项有多少帮助?
还是这句话,优先看项目经验,并且优先看大厂的项目经验。如果博文和你的书,和当前职位的相关性不大,哪怕在技术过关的前提下,最多帮你挣得一个“比较上进,学习能力强”的评价,如果技术不过关,这些帮不到你,甚至有些比较苛责的面试官还会认为你不务正业。如果博文和书确实能证明你技术的深度,那或许帮助会大些,但前提还是“能结合开发和解决过的问题,讲清楚相关技术的用法和细节”。不过这里说句大家可能不爱听的话,一些公司或项目比较着急要人,或者面试下来的候选人能力都半斤八两,那么如果有候选人有加分项,确实有帮助,但候选人更应该结合当前项目,在技术上下功夫。
和面试相关的问题还有很多,不过如果大家想明白“相关项目经验”的重要性,很多问题其实都会迎刃而解。
3 再回顾看下,为什么你都简历没面试机会
这里先不说过面试,先说如何得到面试机会,因为一方面收到的简历中,很多没面试价值,另一方面,不少候选人投再多的简历,也会石沉大海。
为什么简历没面试机会?原因说白了很简单:职位介绍上要求的技术,在简历上看不到有相关项目经验,或者相关经验年限不足。
比如有些简历上,大书特书项目业务,而看不出项目用到的技术,或者列出的技术和职位要求不匹配,或者筛选的人要费很大功夫才能总结出该位候选人的技术以及使用年限。
你简历投出去以后,如果让对方一眼就看出你技术项目经验第一很匹配,第二年限足够,至少你有面试机会。所以简历无需花哨,可以遵循如下的原则。
1 通读每份职位介绍,定制化简历,开篇总纲性给出所要求技术的使用年限,最大可能匹配。
2 介绍项目时,无需过多写业务功能,多写相关技术的使用技巧,比如分库分表怎么用的,redis用在业务里怎么用的。对于初级开发,尽可能写上调优等亮点。
3 如果可以,多写开发代码以外的技能,比如部署,测试,监控,压测方面的实践技能。
上述第2和第3点需要嵌入项目,如下给出段范例,在xx系统里,我用到了mycat,redis等技术,其中mycat是针对xx业务的xx表进行分库分表,分库字段是xxx,redis是缓存xx模块发来的数据,超时时间是xx,而且针对xx业务的长sql,我们用到了执行计划来调优。此外,在这个项目里,我参与了部署和压测等工作,在压测中,根据xx模块发来的请求,我们第一优化了jvm性能,第二用redis缓存了结果,从而实现了tps xx的效果。
从中大家感受下“技术结合业务”的写法,然后可以展开,这样一写,能清晰地让面试官感觉你在项目里用过,姑且不论实际面试效果,你至少有机会面试。
4 再论如何甄别非商业项目经验,你如何写商业项目经验
其实很多候选人也知道商业项目年限的重要性,所以会把一些学习项目改编成商业项目,甚至还会无中生有,而一些培训班辅导就业的老师还会帮助学员“增加”项目经验。
有些项目编造得比较离谱,比如候选人在比较短的时间内,以比较少的人手完成了一个电商、财务或xx管理系统的项目,而且其中包含的技术都很值钱,分布式的,云的都有。
这类项目比较好甄别,毕竟现在很多是有现成产品的,你再开发违背了商业价值,或者里面提到的技术或者和候选人年限不匹配,或者过于高大上,或者大多是没上线。此类项目的甄别方式,我在从面试官甄别项目经验的角度,说说如何在简历中写项目经验(java后端方向)这篇博文里有详细介绍。
比较难甄别的是真中有假的项目,比如某初级开发最近1年的项目经验只有增删改查,但培训班老师让他把学到的分布式组件技术嵌入到这个项目里。说真的吧,公司项目都有,还真是商业项目,说假的吧,毕竟你没用过,你实际简历上项目经验是由学习项目和商业项目嫁接而成。这种情况下,候选人如果面试时说得很好,真能过关,但论理这种做法毕竟不能算“诚信”。
其实如果候选人写简历不上心,真的商业项目还真会被当成学习项目或编造的项目。如下给出些描述商业项目的技巧。
1 如果从名字上看,会让人误解,比如xx管理系统,xx电商,那么就写上客户方是谁,做了多久,现在上线后的网址是什么。
2 写点商业项目里独有的要素,比如junit单元测试,代码质量管理方式,用到maven,sonar等,这些学习项目大多不会写。
3 写上部署,压测之类的经验,一方面这是亮点,另一方面学习项目一定不会有。
简历上体现这三点,一般就不会被误认为是学习项目,面试时,你再举例说出项目里你解决过的实际问题,比如通过日志或监控发现问题,再说下如何解决的,这样能进一步让面试官感觉这个是商业项目。
5 商业项目里,再简单的技术也能挖掘出亮点
我在面试初级和高级开发时,很多候选人没有主动展示技术亮点的意愿,当我主动问及项目亮点时,不少人只是说些业务方面的。换句话说,我需要很吃力,才能挖掘到候选人的技术亮点,而这本该是候选人的义务。可能会有候选人认为面试官不能慧眼识珠,或者感叹给到的工资很低,但如果你一方面在面试中只展示增删改查,另一方面大谈特谈非技术方面的亮点,或者给出的亮点非常不值钱,那么这就怨不得面试官了。其实,只要是个商业项目,一定能挖掘出很多亮点。
1 项目管理方面,Maven, jira, Jenkins部署,Junit单元化测试,甚至docker, k8s,这些点其实面试时没法深入问,你只要说明了,就能证实一定的项目管理和部署能力,而且这和工作年限无关,哪怕才2年经验的人同样可以展示。
2 项目监控或业务埋点,比如CAT,Zabbix,再不济可以是监控log里exception,error关键字,以此引申出通过检查日志分析并排查问题的能力,面试中,借此还能引导到JVM调优,数据库性能优化和分布式组件方面的问题。
3 Java核心这块就不说了,稍微看些资料,就能挖掘出异常处理规范,快速失效,线程并发,HashMap等问题,而且这块还可以结合底层代码讲。
4 数据库性能优化方面,可以结合索引和执行计划,如果可以再带出MyCAT。
对于初级开发而言,如果能充分展示上述方面的能力,一般的公司应该没问题,小公司就更不说了,如果再能展示分布式组件方面的能力,估计挑战下大厂也没问题。但本文的主题是结合项目展示技能,下面再给出些“技术结合项目业务”的说辞。
1 集合方面,我们项目在遍历Arraylist等对象时,需要考虑快速失效的问题,因为在测试过程中发现过此类问题,然后展开。
2 数据库方面,我们项目会对慢sql进行监控,发现后会结合索引和执行计划调优,比如在订单模块里,一个sql过慢,发现是因为表关联太多,经过调整表结构后,此类问题就解决了。
3 我们项目上线后,用zabbix监控内存,一旦发现过量,则会用dump观察镜像,并根据日志排查问题,发现过的内存问题有,在订单模块里,过量使用ThreadLocal没释放,或者是用了大量的ArrayList没clear。
4 我们项目里,由于需要从网络接口多次获得数据,所以用redis缓存数据,在实践过程中,会适当地设置超时时间,而且会用xx策略设置缓存主键,以防缓存被击穿。
从中能看到,这些说辞结合了业务,比起单纯地讲理论要好很多,你这样一说,就能让面试官确信你确实有过实战经验,如果你说得好,甚至还能让面试感觉你还有实际的排查问题解决问题的能力。而且,上述说辞都是很基本的,成本也不高,大多数项目都会用到。相比很多候选人无视这些亮点,只展示增删改查的能力,你结合项目再多挖掘些,面试官一定会认为你比别人强。
6 以一组提问方面为例,分析如何在面试中准备值钱技术
这里就以之前提到的数据库方面的问题,分析如何结合项目准备值钱技术。
1 基础层面,用过哪些数据库,多少经验?Jdbc里preparedstatment的用法,以及索引的概念等。
这部分通过背题可以通过,问题不大。
2 调优层面,索引,执行计划的技巧,比如哪些sql用不到索引,并问在项目里建过哪些索引,执行计划要看哪些要素。
先全面了解索引,执行计划等概念,了解的时候需要涉及底层。然后观察当前项目的的慢sql,看解决这些慢sql时,是怎么用到索引的,在看执行计划时,是根据哪些要素分析痛点,比如是因为没走索引还是走全表扫描,据此准备若干个例子。面试时一旦被问到,先说索引数据结构,复合索引,执行计划观察要点等理论知识,再结合你准备好的实际问题,说下如何在项目里用的。
3 排查问题层面,请结合实例,给出监控慢sql的做法,并讲下用执行计划等分析和解决慢sql的方法。
准备下观察日志,观察监控的说辞,比如讲,在项目里,是用linux的xx工具监控慢sql,或者cat监控如何配置,如何报警。再结合若干线上案例,讲下引发慢sql的原因,以及你是如何通过观察日志分析问题,最后通过什么方法解决的,解决的方法无非也是建索引,引入redis等。
4 如果是资深开发和架构师岗,再问mycat, redis集群方面的问题,比如如何部署,分库规则,缓存时间等,也要求讲述分析排查和解决实际问题的经验。
这块首先需要讲配置,比如分库规则如何配,redis超时时间怎么配,集群如何用zk管理的,讲的时候结合项目。同时也可以根据常见的问题,比如kafka消息重复消费,或者mycat遇到没分库规则的sql,说下你是怎么解决的。
或许面试官未必会照着上述思路来提问,但面试官一定会核实你的技术是否有项目经验,所以大家同样可以围绕“基础知识”、“结合项目的调优技能”、“如何监控和发现问题”以及“解决线上问题用到的技能”这些方面准备面试说辞,面试时一一展开,刚才也说了,再简单的项目也能挖掘不少值钱点,你就照着这个思路准备,一定能挖掘到不少亮点。至于该准备哪些方面的亮点?在最近面了不少java开发,据此来说下我的感受:哪怕事先只准备1小时,成功概率也能大大提升和已经提到过的如何准备Java面试?如何把面试官的提问引导到自己准备好的范围内?博文里,已经有了足量的说明。
7 以“项目经验”外带“实际解决过的问题”来容纳技术亮点
刚才已经反复提到,你在面试中给出的亮点技能需要结合项目经验,但很多同学在之前开发的模块里,用到的技能其实是非常有限的,说白了就是增删改查外带一些调优,这也是普遍现象,相反如果一个初级开发,在面试中说,之前开发的模块又有jvm调优,又有分布式组件,再外带数据库性能优化,似乎可信度不高。
对此,你可以把很多技术的实践经验归纳到“解决过的问题”上,比如你平时确实只做增删改查,这哪怕对高级开发也不丢脸,但你平时工作很上进,遇到线上问题会主动参与,比如有oom问题,或者redis缓存被击穿,或者其它因分布式组件等方面而导致的问题,你参与排查并解决,那么这些自然可以归结成相关技术的项目经验,而且你还能以此为例,展示自己分析日志解决问题的技能。
这样的话,在项目里你就有足够多的项目,来容纳网上提到的各种分布式组件以及其它值钱技能,甚至如果你有能力,还可以说参与过项目的部署上线以及压测。总之还是这句话,理论技能本身不值钱,面试官一定只关心你,如何在开发、压测、分析线上问题以及上线时,如何使用技术的。
8 总结:如果从战略上藐视问题,会发现提升技能不算个事
本文给出的观点是,在面试时,程序员该结合项目讲述各种技能,看上去这是个正确的废话,但根据本人的面试结果,在面试前能结合项目准备亮点的,而且在面试中能结合项目充分展示技能的候选人并不多,这也是本文的价值。
其实,从战略上讲,初级开发升级到高级开发需要提升的点非常有限,而高级开发提升到架构师所涉及到的技能也是能举例说明的,更何况,在面试中能证明自己达到高级职位要比在工作中证明要容易很多,所以架构师等高级岗位也就这回事,并不是可望不可及的。
但从战术上讲,由于技能只有结合项目实际才能发挥价值,所以程序员在平时工作中,绝不能只限于自己开发的业务,更要多参与解决线上问题,更要多看些值钱的技术,如果不知道哪些技术值钱,就看下比你工资高一倍人,他们精通哪些技术,你就学什么。
而且本文虽然是讲程序员如何准备面试,其实给出的方法同样适用于“程序员该如何升级”。再看我们身边,会发现一些原本基础不好,学校也一般的程序员朋友经过1,2年努力,能成功地拿到大厂的offer,也就是说,第一只要努力方向不差,第二只要肯持续上进,提升个技能其实不算个事,在这基础上再经过面试试错,进大厂然后在大厂里收入飞速提升,其实也就是个时间问题。但相反,如果只是满足于完成现有手头的工作,那么30岁以后依然在小公司间辗转,这也是在情理之中了。
最后感谢大家看完长文,本文写了有4个小时,如果大家感觉可以,请多多点赞,有问题也可以多写评论。
版权说明:
如果要转载本文,请先征得本人同意。