在BAT这种大厂里,只要肯吃苦,技术和工资进步的速度会超出你想象,我在上海,按当前价格算,一般在大厂里干个三四年,好歹房子的首付应该能有,而且这种房子还不是太偏远太小的。
进大厂确实需要一定的实力,但如果单单技术好,没有其它的技巧,估计确实也有些难度。不过话说来,哪怕是二本出身,哪怕技术一般,只要肯上心加方法得当,工作后3年进大厂应该不是难事。在本文里,就将针对起点一般技术一般的同学,给出具体的进大厂操作指南。
1 先从战略上藐视,进大厂也就这回事
大厂里也有只有2,3年开发经验的初级开发,而且其中有些同学的学校可能也就是个二本,或许他们进大厂前,资历技术和你也差不多。甚至可以这样说,只要找到渠道去面试,外加适当的准备技巧,进大厂其实比进一些面试要求比较苛刻的小公司更容易。
就拿一些步骤来说吧,简历方面,只要有适当的分布式组件经验就至少能得到面试机会,面试时,当然如果光会增删改查当然不行,不过面试问到的题目以及提问的方式,网上多了去了,本文也会涉及,关键第一要适当看分布式技术,第二要结合项目说,这对初级开发而言,也不难。甚至当有些项目比较缺人时,面试的标准更会降低。
我给大家量化一下进大厂的需要花费的努力和时间吧。第一大概每天用1个小时看资料运行代码准备说辞,每周大概累计用10个小时,经过2个月其实该看得就差不多了,然后再用2个月用几个小公司面试练手,就可以去大厂投简历了。如果一切顺利什么都好说,万一不成,换个项目组,或者多面几家大厂,面个3,4次,应该也能行了。用时间努力应该不是问题,努力的方向可能未必大家都知道,具体的后文将详细展开
2 尽可能洗白你的不利因素
首先要让你的简历过筛选,否则没面试机会。能过筛选的简历一般长什么样?
1 硕士,一本大学,1,2年经验,而且最近项目里包含分布式组件等值钱技术。
2 如果大学一般, 本科学历,估计要运气,看不同的项目组,可能会需要再多1年左右的项目经验,如果项目组着急要,或公司招聘需求高时,其实不看学校。
3 这点很重要,别太频繁跳槽,最好最近1年没跳槽经历,而且最近在职,不是长时间处于离职状态。
简历上项目经验这块可以自己挖掘,但如果有不利的因素,尽量用时间冲淡。
1 学校一般,找个有高并发背景的项目,体现在简历上,最多两年就够了。
2 最近跳槽太频繁,找个公司窝个一年左右,最好是最近一年半没跳槽经历。如果有超过1个月的离职状态,也可以通过连续上班个1,2年来淡化。
3 刚从培训班里出来,也去找个小公司干一年半载的,但要积累分布式项目经验。
大家注意没,这部分一直在强调分布式组件的技术,具体而言是netty,redis,mycat,kakfa等高并发的技术,工作年限是一方面,另外你简历最近的项目里,这些分布式组件的实践技能一定要体现出来,如果你让大厂的面试官感觉你第一相关技术年限不足,第二只会增删改查,那么对不起,你没面试机会。还有,如果你实际能力很强,但简历上看不出,面试官直接认为你不行。
3 数据结构方面,最好能引导到准备好的技术亮点
数据结构是大厂面试必问的点,网上这些题目太多了,而且答案都可以准备。不过如果要进大厂,最好能触类旁通。
先用红黑树举例,除了要能讲基本数据结构,插入删除节点能操作外,可以再引到ConcurrentHashmap底层数据结构上,用该对象的底层代码来说明,其实这和你的项目能力无关,事先准备下就行了,但如果你回答红黑树问题时顺带引出底层代码,甚至还可以从ConcurrentHash引到并发方面的问题,这样面试官就不会认为你光会理论。
再说比较常用的链表数组等,这些第一可以和Java里的ArrayList等对象一起讲,第二可以顺带引出快速失效和遍历等底层代码,这样也能让面试官感觉你基础扎实。
至于HashMap,这方面都被问烂了,网上的解析文太多了,但大家在回答好理论问题和底层代码后,也可以进一步展示锁和并发的话题。
总之,数据结构的问题是必问了,在这个环节,很多初级开发候选人甚至连底层代码层次的问题都回答不好,而你经过准备,不仅能举一反三地展示你对底层代码的理解,更能借机展示锁和并发等技术点,首先就能给面试官留下个好印象。至于笔试写算法,这种网上题目更多了, 事先更可以准备。
4 大厂更多考的是并发方面的能力,同时更要结合项目说
先给些提问的方式,比如netty,先问重要组件和工作流程,再问序列化,服务暴露等事先细节,再问读写索引半包粘包等问题,其实对初级开发而言,问到这里就差不多了,如果要找个高级开发,可能再会结合底层代码问。分布式组件有很多,其它组件,比如mycat,也是先问用法,比如如何设置分库规则,再问底层细节,比如底层代码如何把sql定位到具体的库上。再如redis,可以先会问些数据结构以及基本用法,再问些诸如集群等方面的细节。
哪怕去面大厂的高级开发,准备分布式并发这块其实也不是问题,因为很多人在之前其实基本没相关项目经验,其实都是在背题,你只要在面试时,让面试官感觉略微比别人多些项目经验即可,下面给些准备的方法。
1 先看几套面试题,这些面试题其实都大同小异,都会比较深地涉及到底层源码和实践要点,先把理论题背熟。这些点虽然不少,但其实都是体力活,背书么,这种事应该没难度。该背哪些素材呢?我之前看到的吊打面试官系列就不错。其实当大家看了几套题以后,会发现分布式组件的值钱技术,也就这么多。
2 其实很多候选人仅仅停留在这个地步,如果你做了后继步骤,就比大多人强了。在背熟以后,再给一些技术找些项目的背景,这些技术未必要深,但一定要结合项目的业务。比如就说最基本的redis,你说你之前的项目是某数据处理模块(项目可以按实际说),并发量大概每秒1k,如果都把请求压到数据库,数据库受不了,所以就用redis集群,然后准备些集群的大致配置方式。在用的时候,结合业务,用到了里面string等数据结构,用的时候会设置超时时间,以防缓存一直在内存,同时为了防止穿透,会把null也缓存起来。同时量力而行,就别再说redis事务了。
请注意结合业务说技术的时候,未必要涉及过于细节的点,比如不用涉及到redis的线程模型没,但首先得说些配置值(比如集群配置值和超时配置的方式),让面试官感觉你确实在项目里用过,其次要讲些项目里用到的经验,比如redis要用集群,防止单点失效,设置的超时时间最好后面带个随机秒,以防一个时间点里大批量缓存失效,一下子去拿数据库从而导致压力过大。
这里仅仅给出了redis,另外,mycat,kafka,netty, zookeeper,dubbo等,也照此办理,这样哪怕你平时用得不多,但也能让面试官感觉这方面你有实际的项目经验。
3 确实分布式组件这块要说好不容易,为了让面试官感觉你有这方面的经验,或者作为没说好问题时的补救措施,你最好再整理些实际解决过的问题。
准备问题时先讲问题是如何发现的,比如日志里频繁报oom异常,或者干脆系统登不上,再说你是什么查的,无非是通过linux命令看日志,或者用dump看内存镜像,再说问题原因,比如dubbo超时时间过长导致请求卡住,或者redis没设超时时间导致内存oom,这些点网上一搜也是一大堆。
而且你分析问题原因时,更可以借机让面试官感觉你熟悉分布式组件的底层源码,比如你准备些netty底层读写索引(或零拷贝)的源码,面试时当你说你解决过因netty半包等原因而导致的问题时,可以借机抛出。
4 再准备些画龙点睛的说辞,当你结合项目以及你解决过的问题说出分布式组件技术时,再说出这些点,立即能让面试官高看你,这些点可以是基于kafka的防幂等机制,也可以是zk整合dubbo的源码,这种值钱技术和源码太多了。由于找这些点是体力活,所以本人在这里就懒得再列了。
再啰嗦下,准备分布式技术说辞时,一定要结合项目,哪怕你平时用得很少,但可以找网上的资料,但找到后一定要融入到项目里。这里给个例子,某初级开发候选人也很用心,背了很多分布式题,基本有问必能回,但当面试官让结合之前项目经验说用到的技术时,他说不上,另一位其实分布式底层细节了解不深,但就能结合项目说些redis超时以及防穿透的实现细节,其实这些技术并不深,但对初级开发的要求并不高,正是因为后者具备分布式组件的项目经验,所以虽然两位都录用了,但后者的工资要高于前者。
5 充分展示调试和部署项目的能力
调试和部署项目的能力对初级和高级开发来说绝对是亮点,而且哪怕是大厂的候选人,也不是每个人都会。这块你如果说了,面试官未必会细问,只要听你讲的没大问题即可,而且这块不在于用到技术的深浅,而在于你知道这方面的实践要点。
在我之前的博文里,如何准备Java面试?如何把面试官的提问引导到自己准备好的范围内?,给出了准备压测的实践要点,从而大家可以看到,面试官不在乎你压测方面解决过的问题,也不在乎涉及到的技术,只关心你有这方面分析和解决问题的经验。
同样你可以在面试前准备些分析和解决问题的步骤,这之前也已经提到过,这里再给个例子。比如cat等监控系统上频繁报内存用量高,这时你看日志或dump,然后发现了问题,问题根源太多了,除了刚才提到的redis缓存没释放,更可以是netty堆外内存没处理好。好吧这些涉及到的技术太深,那么给些简单的,比如因为HashMap用好没clear,或者数据库对象没关,或线程池创建时用无限队列缓存任务,然后你搜oom原因,再去找其它原因,你项目里遇到的就可以当作你亮点的说辞。
再说部署方法,你可以看些zk加dubbo部署的配置文件,也可以看些redis各种集群的部署配置,如果你感觉有余力,再看些灰度发布切流量的配置,其实看会了也就是一两句代码的问题,但你结合部署这个大题目说出来,立意就不同了,因为高级开发(以及架构师)不仅要会写代码,更要会部署组件。
6 给出若厂面试过程的提问和回答
面试官:介绍下你的经历和项目经验?
候选人,介绍教育背景(二本三本都不要紧),有1到2年相关经验(挖掘课程设计毕业设计和工作后的经验,应该可以达到)。略微介绍项目的业务,比如我之前在xx公司做了支付系统,用到spring boot, netty, mycat等技术(准备过的亮点都可以说,分布式组件多多益善),在项目里,我不仅写代码,还参与过压测和数据库和jvm调优(抛出诱饵等来问),还解决过线上报出的redis缓存穿透,kafka消息重发导致不幂等和dubbo超时导致线上连接数打满的问题(这里多准备些分布式的问题,也坐等面试官来问)。再介绍些超出编码技能的能力,比如说,在项目里,我还用过sonar来管理项目质量,参与过jenkins发布部署脚本的编写等。(这种技术每个项目都有,你关注下,无非是写配置,但你说了就不一样了)
听你讲完项目介绍后,面试官会问分布式等问题,比如会问,你说你解决过redis缓存穿透问题,你说下如何解决的?
候选人:(回答的时候一定要结合项目),在我的支付管理系统了,支付模块会向风控模块请求公司的风控数据,但相同请求的参数会发多次,所以就用redis来缓存(大致介绍业务背景),但实际应用中,发出的请求未必全存在风控的库里,所以就穿透了。后来解决的方法是,把null值也缓存,把一些经常请求的但不存在风控表里的参数也缓存。注意这里面试官不会关注具体业务和解决方案,你只要大致说得没问题就行,比如这里你别说就用单机版的redis就行了。同样的问题解决方案多准备几套,这样你说了,面试官就会认为你在实际项目里用过。
当你讲完redis,mycat,kafka,netty等解决过的问题后,面试官会开始问些底层的细节,比如会问,你说下netty的线程模型,netty的读写索引,dubbo反序列化的协议等等,这些就属于考理论知识了,由于你事先背过,所以应该不会有太大的问题。这里面试官的用意是想摆脱你事先的准备,所以会随机发问,但你要想办法把问题点拉回来,而且争取多耗时间,这怎么做呢?
(比如问netty的线程模型),候选人:先边画边说,讲好模型后,然后立即带一句,在我们项目里,是用线程池来管理work进程(拉回到业务里),在管理进程时,还遇到过因缓存队列设成无界队列而导致的oom问题。(再次抛出诱饵坐等问),然后借机展开,以此成功耗费面试时间。而且如果按上文给出的准备步骤,你可以准备好每个组件解决过的问题,然后逐一展开。
当问好分布式组件后,面试官可能会问些数据库和java基础,这些更简单了。
面试官:你们项目的数据库是什么?
候选人:我们用到的是oracle,在项目里用到了mycat分库分表(之前说过就算了,没说过就抛出),在项目里,我还处理过长sql问题(由此引出调优亮点)。
面试官:你是什么调优的?(不由自主地被引导)
候选人:我们用到的监控方式是cat,当监控系统上发现长sql时,我们就用执行计划来分析,然后对应地建索引,或者建redis缓存,或者用with语句优化sql。然后找个准备过的sql讲下就结了。
然后面试官会问些索引之类的问题,这些你事先背些答案,讲些底层结构即可。问好数据库,面试官会问java核心,比如hashmap,线程安全不安全,或者jvm问题。这种你背好答案,同样再引申下。
候选人:对于hashmap,除了刚才我讲的底层代码外,用好以后,我们还需要立即clear,以防内存泄漏(引到内存话题)。或回答好jvm问题后,你立即说,在实际项目里,我们会监控jvm的用量,当超出70%时,就用dump文件看镜像,之前项目里我遇到的jvm问题有,netty堆外内存管理不善,ThreadLocal用好没remove,造成oom的原因太多了,大家自行准备,我不展开了。
通过上述方式,你回答好问题后,立即结合业务抛出下个诱饵,然后想办法把问题引到jvm调优,数据库调优,线程底层代码,(hashmap等)底层源码之类的问题,这样可能你本身的技术未必行,而且资历也未必够,但面试官给你的评价可能就是,第一基础扎实,第二有调优经验,第三有分布式组件的使用经验,如果面高级开发,上述三点就足够了,更何况去面初级开发,指不定还有如下的评价,比如掌握项目代码质量的提升技能,熟悉线上调试和发布的基本技能,熟悉分布式底层细节等。如果再得到这些评价,估计面架构师都够了。
这还不算完,当面试官提好问题,但你准备的亮点没机会抛出时,别不甘心,有机会抛出。
面试官:我问题问好了,你有什么要问我的?
候选人:(先套上话),如果我有幸面试成功,会进哪个项目组?然后不管面试官怎么回答,哪怕回答“这要看情况分配”也不要紧,然后继续问,(比如dubbo亮点没抛够)在你们项目里,怎么做远程调用的(揣着明白装糊涂)?面试官一般就会说dubbo了,然后交流,交流过程中不经意说句话,我们之前项目也用dubbo,所以我还看过dubbo源码,并解决过服务暴露的问题,然后很大几率能有机会说出。
或者你没机会说出压测技能,就可以假惺惺地问,你们项目里会不会做压测?压测时怎么发请求?怎么监控?然后可以在交流过程中说你的亮点。其它的亮点也照此准备。
7 多找几家小公司面试,其实有些小公司的面试难度还超出大公司
理想情况下,你面试的结果和技能无关,和项目经验的长短也无关,只和你简历上的项目和技术介绍有关,和你事先的准备亮点说辞有关。
但如果单纯准备不去实践,任何面试官都能摸清你的底细,这点别有任何幻想。因为一方面你准备的点未必全,第二你准备的项目说辞未必很好地打过草稿,中间可能会有漏洞,这时你就需要找些小公司来尝试了。
这怎么做:准备按大厂面试的标准准备,然后到处去投小公司的简历,记住先别着急找大公司,尽量别在大公司里留下面试不成的记录,最好一周面个两家。
刚开始面试的时候,你会发现你的说辞漏洞百出,甚至会被看穿你的底细,但别灰心,第一收集面试官的问法,第二不断练习亮点技能结合项目的说法,第三再不断挖掘你的亮点技能,这个时间段里,小公司的面试官会尽职地弥补你面试中的弱点。
什么时候能出师?第一面试官确实能问分布式组件的实践经验,而不是单纯问理论,第二此类面试你通过三家,第三而且你是大优势通过,而不是可上可下地通过。
8 进大厂的渠道
这个时候你就能信心十足地去挑战大厂了,这个时候如何找进大厂的渠道呢?
1 在招聘网上等渠道,多接触几个猎头,明和他们说你要进大厂,比如bat或者公司名称。不是每个时间段大厂都有招聘名额,不要紧就等,而且等的时间不会太长,最多2个月。
2 找内推,比如大家在网上看到有面试成功的文章,就联系下。
这里推荐是找猎头,因为猎头方便打探你面试结果,而且面试成了更能帮你最大程度争取工资,同时万一没面成,你可以和猎头说,你想面这家公司的其它项目岗位。如果你自己投简历,未必能得到这样的遍历。
当你充分准备,并准备好的说辞经过小公司的检验后,一般问题就不大了,万一再失败,或者找该公司其它岗位,或者找其它大厂,最多面个3次应该也就成了。
9 总结,任何时候开始努力都不晚,大厂离你当前的高度最多也就两年的距离
还是这句话,其实进大厂,得到的也就是个能通过加班从而快速提升技能和收入的机会,而且大厂每年的招聘名额都不少,进大厂不难。网上我就见过不少毕业3年内的同学进大厂,我身边的,我见过硕士就1年经验进拼多多,本科2年经验进阿里,至于3到5年经验进大厂的人,我都记不过来了。
进大厂除了能提升技能外,收益也比较可观,比如工作3年,能有20k*16个月的收入,找个其它行业,这些资历能有对应收入的,并不多没,而且进大厂后,做个3,4年进可以继续升级到架构师,达到年入五六十万的收益(这还算平均水平),退可以像我这样进个外企,工资外加平时出书出视频,在上海也不至于饿死。
可能不少同学现在看大厂需要仰视,但其实做的准备也就这么回事,时间用够,多看视频教程,少干无益的消遣,估计顶了天了,2年努力真的足够了,1年洗白简历,1年准备,这还算多了。但如果固步自封,或者虽然努力但始终不敢迈出面试的步骤,那么可能真只能在小公司里随遇而安了。
感谢大家看完长文,本文写了有3个半小时,而且篇幅足够,如果大家感觉可以,请多多点赞,有问题也可以多写评论。
版权说明:
如果要转载本文,请先征得本人同意。
原文地址:https://www.cnblogs.com/JavaArchitect/p/12665483.html