这篇文章在博客园看到的,作者 hsm_computer,真的是一篇好文,对于大家来说,有很好的指导意义,要学会实事求是,谎言总有被拆穿的那一天。此文中的做法并不是恶意为难面试者,或者挑刺炫耀。面试本身就是一场淘汰赛,个人认为作者的观点和做法很客观,玻璃心的读者就别看了,有意见可以讨论,不接受任何乱喷。
原文如下。
我在博客园里乃至其它地方看到有不少对培训班出身的程序员的评价,其实至少在我面试时,培训班出来的程序员没有原罪。
我也面试不少程序员,从高级开发到初级开发都有,有985和211名校出身的,也有大专学习通过培训班积累IT经验的。我见过有候选人正大光明地把培训经历写在简历上,也见过候选人千方百计地想把培训经验掩饰成项目经验。对我来说(相信其它大多数技术面试官都一样),我只需要考量候选人的以往商业项目经验和实际技能,看下是否匹配本岗位。
至于候选人的技能来来自哪里?说句笑话,如果候选人面试时不露破绽,把培训项目说成商业项目,我真无法鉴别。在本文里,我第一将从面试角度,纠正当前对培训班的一些观点,第二从培训班的角度,来分享下我如何在面试时甄别商业项目的方法。
在开篇前,我引用两段俗语,第一,外行看热闹,内行看门道。第二,一力降十会。至于为什么要引用?本人绝非空穴来风,请大家自行体会。
一、培训项目如果被看穿,是会被扣去这段时间的项目经验
目前大多数培训学校都会把学习项目包装成商业项目,因为他们也知道商业项目的含金量更高。如果我在面试时判断出候选人的项目是从培训班里得到的,我会给出如下的判断。
第一,候选人掌握对相应的技术,比如Spring MVC,也能通过学习项目加深了对此的了解,这是不用质疑的。
第二,这段时间的项目经验,不能算是商业项目经验,这对候选人来说是相当不利的。
因为不少职位是有硬性的项目年限标准,比如2年,而且最近半年最好是在用相关的技术。如果候选人被发现最近半年的项目是从培训学校里学到的,可能有些公司会不在乎,但至少我会被要求详细写下这一情况,如果该候选人没有其它补偿优势(一般都不会有),那么面试就结束了。而且,不少从培训班里出来的候选人,有实战性的项目经验或许只限于此,那么再被扣除后,就真的没有商业项目经验了。
如下是我对培训班出身的程序员给出的比较客观的看法,如果你从培训班里出来后,也有多年的开发经验了,这些商业项目经验达到了职位的客观标准,那么一切都好说,至少我了解到的面试官不会因此卡候选人,但如果没实际项目经验,比如从培训班出来后第一份工作,那么如果被卡,绝非是你的培训班出身,而是缺乏商业项目经验。
第一类,我最近在面试中,发现有不少简历上描述的项目非常高大全,比如项目里用到了Spring Cloud里的所有组件,什么Eureka,Ribbon,Zuul等都用了一遍,或者在项目里,大数据分析的,分布式组件相关的技术也都用了一遍。而候选人的工作年限就3年。
或者,有候选人会在一个项目里,把分布式组件全都用一遍,比如Dubbo, nginx,kafka等,但从项目的需求上来看,无需用那么多的组件。
第二类,比如xx电商系统,xx财务软件,xx教学管理软件,xx图书馆管理软件。汗颜,其实我当年也这样写过。当然,我也列不全,但大家都做过毕业设计项目,凡是看上去像毕业设计的项目,一般真就有可能是学习项目。
而且我往往会见到这样的情况:在一个时间段里,从猎头等途径得到一批项目经验很相似的简历,比如都电商项目,需求和描述以及技术用得基本相似,但公司名不同,这种情况往往大家心知肚明。
第三类,候选人在项目里,干了非常多的模块。我们知道,哪怕是资深开发,在项目里,能把一两个模块做精就够可以了,但我就见过不少候选人,在项目里,用了短短两三个月,就做了很多模块,这样的工作效率和开发情况非常不符,这一般也会被列入怀疑对象。
遇到这类项目,我不会武断地立即给出定论,而是会通过下面的盘问方式,来把候选人绕晕,以此来甄别是哪类项目。
其实候选人应该比面试官更熟悉项目以及其中用到的技术,所以如果真的是商业项目经验,应该对各方面能自圆其说,至少不能相互矛盾。
所以遇到疑似学习项目,我一般会有如下的询问方式。
方式1,询问技术是否和项目背景匹配。比如某简历中提到用Kafka,我就会问。
第一,你是否了解kafka的细节?如果了解,先问些基本问题,以此来确认是否用过。
第二,kafka用在项目里哪个模块里,具体是实现哪个业务?一般来说,哪怕是学习项目,这也能说清楚。
第三,关键点在这里,询问使用kafka的必要性。我会问,xx需求点,确实是实现了消息通讯的功能,但实际通讯量并不高,用一般的Dubbo调用足以应对,那为什么还要大费周章地用kafka?甚至还要用kafka集群?或者我干脆提问,kafka是消息中间件,但xx需求里并没有发消息通讯的需求,为什么要用?
通过这种提问,一般简历中是学习项目,候选人可能会了解kafka技术细节,但由于没在项目里配过,所以很难讲清楚为什么要用这个技术,这样就露馅了。
方式2,一般候选人把学习项目放入简历,往往比较难搞清楚一些技术细节,或者没真实配置过,所以我会问些配置部署方面的问题。
比如某简历中有dubbo,我就会问,项目里是如何配置dubbo,具体来说,你为了让远端能调到dubbo,一般会在哪些配置文件里做什么配置?或者,你提供的dubbo服务,如果设置超时等待时间和重试次数。
根据面试结果,一般在学习项目里,能实现功能即可,候选人一般不会注意这些配置方面的细节,而这些加恰恰是商业项目里一定会用到的,所以通过这个问,往往一抓一个准。
方式3,询问项目的商业价值。比如,我见过不少候选人做过xx物流系统,xx电商系统,xx人事管理系统。
遇到这类系统,我就会问:目前市面上这类大型网站够多了,这些系统如果做成上线后,如何同现有的竞争?候选人往往说不知道。我会进一步问,这个系统有没有上线?网址是什么?客户是谁?开发周期有多少?凡是涉及到这类项目细节了,候选人往往就会漏洞百出,比如业务10个人月即可完成的,会被说成20个,或者干脆推说不知道。
遇到这种情况,而且候选人其它问题再回答不好,那么我真能确信是学习项目了。
方式4,就问一些矛盾的技术细节。比如候选人列出某项目里用到一些分布式技术,比如同时用到nginx和spring cloud里的zuul以及Ribbon。我们知道,在项目里,nginx和ribbon都能实现负载均衡,但往往就用一套,但真有候选人会写两个都用。类似的,候选人在写项目时,由于往往是东拼西凑的,所以未必对技术了解很透彻,所以出现矛盾的地方会很多。
所以我往往就说:在你项目里,xx和xx技术并存了,它们是实现同一套功能,你们为什么会用两套?往往候选人就无法自圆其说了。
其实我自认为在上部分的质疑并不苛刻,或者是对简历中项目描述里的矛盾点提出疑问,或者就问些只要做了项目就一定能了解的非常基本的点,但就这些比较简单的质疑,真的排查出绝大多数的学习项目。
大家看了以后一定会非常慌,别怕,这里我会列出商业项目的准备要点。有人看了就会问了,如果根据这里的准备方式准备后来找我面试,能不能过?我一定回答是,不能过,因为我面试的技巧是,运用之妙,存乎一心,是无法用文字形容的。而我给出的准备要点由于是落了文字,所以终属下乘。
那么看了我的技巧有什么帮助?第一遇到不那么专业的面试官,或者项目紧眼开眼闭的面试官,就能过,第二,我介绍面试技巧的博文多少也能给出些实用技巧。所以一定能帮助大家提升面试成功率。好了,言归正传,下面列些准备商业项目的要点。
1、尤其是经历过培训班的同学,可能大家对技术把控不怎么深,所以在简历中,应当只列你熟悉的技术。比如你项目里就列了1个亮点,而且你能说清楚,那么这是个加分项,但你如果列了3个,只讲清楚2个,1个被问倒了,面试官会进一步质疑你在项目里是否用到这个技术,再进一步会质疑你项目的真实性。
而且,你列好了以后,可以请你的培训老师或者比较资深的朋友帮忙把把关,看下技术是否有矛盾点,而且针对每个技术,你要和实际项目结合起来,能讲清楚为什么要用这个技术?遇到需要大费周章的分布式集群,你还得能说有什么需求(往往是性能要求)要值得你配置集群。
2、从项目的盈利角度再回顾下,目前很多项目不是从头开始做,比如做个在线购物,这一定亏,如果面试官从这点来质疑你,你很难自圆其说。但如果你做的是维护项目,比如维护一个历史项目,或者干脆维护历史项目里的一个模块,而不是什么都从头做起,那么可信度就大大提升了。
3、别说你在项目里只做开发。一般来说,你在项目里,除了做开发之外,还会适当做自测或数据库部署或项目部署等工作,如果你说在项目里还通过ant或maven等方式打包项目,或或通过jenkins部署过程序,或者再加上通过看日志排查过问题,那么你说这个项目是商业项目,这可信度就大大提升。
4、这点其实我原本不想列上的,即所谓“哪怕吹牛也要打草稿”。这里我倒不是鼓励大家自己编造项目经验(事实上我更反对),但我真见过不少候选人在描述项目背景,项目持续时间和在哪个公司里做的项目这些关键因素时,和简历有冲突,而且在我质疑时也说不清楚。还是这句话,你做的项目你自己都说不清楚,那么我真有足够的理由来怀疑这个是学习项目,而不是商业项目。
其实,在我写的《Java Web轻量级开发面试教程》和《Java核心技术及面试指南》这两本书里,列了更多准备项目描述的经验。
上述四点里,关键是第一点,即准备项目里用到的技术,以此来提升项目的可信度。其实我在最近面试java后端开发的感受:如果就以平时项目经验来面试,通过估计很难——再论面试前的准备这篇博文里已经讲过相关技巧,这里再深入讲解些准备技巧。
1、准备技术使用的必要性,要让面试官感觉确实有必要使用这个技术。
我见过不少候选人对技术准备比较好,但忽视了“实用必要性”的说辞。尤其在些培训班里,项目是老师给的,学生确实也已经理解,而且理解很透彻,但在培训班的项目里无法模拟高并发的场景,所以我用“必要性”真就排查出不少培训项目。
比如在项目里用到了分布式消息通讯中间件kafka,但如果你的项目只部署在一台服务器上,那么这就属于没必要用,或者模块间的通讯量不多,用单机版的kafka即可,也无需用集群。但如果你说,应用访问量足够大,或者模块以微服务的形式部署在不同机器上,且模块间通讯量大,有必要用消息中间件异步来处理,那么说用到kafka,这才能说得过去。
2、不仅要准备理论知识,更要适当准备实践类问题。
我自己也知道,如果候选人通过看资料,或者上培训班,可以对使用性技术了解很深,真就可以以假乱真。所以我往往会通过一些配置方面的问题来提问。比如我就问,使用nginx时,你在配置文件里配置过哪些元素?这类问题只要做过,一定能说得上。对此,你在介绍项目时甚至不该等面试官来问,主动说些配置环境,设置数据库索引,设置Linux里JVM参数等方式,再不济你可以说下项目是如何打成jar包部署到服务器上的,这样一定能增加项目的可信度。
3、相比前两点,这点就比较好准备。我在面试的时候,见到大多数的候选人,对于比较值钱的技术,比如Spring Cloud里的负载均衡组件,只会简单地使用,而不知道原理。对此,我给出的评价是,了解xx技术,但只会简单使用。相比之下,你可以看些底层的实现,或者画出基于分布式的框架图,这样,我的评语就会升级到“在项目里用过xx技术,而且了解底层,对xx技术有一定的了解”。
4、这点我在其它博文里也反复提到,由于重要,所以这里再重复一次,你要讲清楚这个技术对项目有什么帮助,具体来说,在性能上或部署上有什么帮助,比如你说用到了jenkins,通过它的“一点即可部署”功能可以实现自动化部署,或者,通过用到了数据库集群,能应对高并发的场景,或者用到了JVM监控和优化,能解决项目因OOM而导致的性能下降。如果你能有条理地说,因为我项目里有xx问题,所以我们用了xx技术,而且讲清楚这个技术是如何解决实际问题的,哪怕就凭这点,我就能相信这个项目是商业项目,而非学习项目。
我身边有不少朋友就是从培训班出来的,现在也发展得不错。不过,如果从培训班出来后第一份工作就找大厂,比如大的互联网公司或者大型外企或者知名公司,这类先例不是没有,但很难,毕竟培训项目要包装成商业项目经验,这总是有破绽的,况且不少同学在进培训班之前没有相关经验。
所以建议大家从培训班后,找个一般的公司,积累些实战经验,这绝非难事,毕竟一般公司里的普遍面试要求是“能干活即可”,不过话说回来,培训班经历外加2到3年的实际项目经验,这真就和科班出身的程序员没什么差别了。说句不该说的话,这时你把两三年前培训班的学习经验改成项目经验,这真能蒙混过不少面试官了,但别来蒙我。
我见到过发展途径是,培训班后第一份工作很苦,尤其是试用期阶段更得996,但坚持过半年后,能立足,这个阶段开始刷题外加准备分布式高并发的技术点,外带积累项目经验,过了3年,如果能力一般就可以通过外派的形式进大厂,如果能力可以,真就能进BAT了。
在本文里,我列了些作为面试官甄别商业项目经验的技巧,在此基础上也给出了准备面试时商业项目经验的方式。其实本文对大多数做IT的朋友多少有些帮助,但我自认为,对培训班出身想从事程序开发的朋友帮助更大。
精彩回顾
♡ 程序员究竟能干多少年?
♡ 互联网公司各岗位真实工作内容起底
♡ 一次尴尬的采访和程序员的传奇脑洞!
♡ 天一冷,程序员都穿上格子衫
♡ 史上最真实的行业鄙视链曝光
♡ IT公司老板落水,各部门员工怎么救
♡ 宿命之战:程序员VS产品经理
♡ 作为一个前端,可以如何机智地弄坏一台电脑?
♡ 程序员跟产品经理打起来了,这是一个需求引发的血案...
♡ 后端说,你个前端不会用 headers吧,我怒了!
♡ 有个厉害的程序员女朋友是什么体验?
♡ 多年来,程序员经常加班的真相终于揭开了…