在BAT这种大厂里,只要肯吃苦,技术和工资进步的速度会超出你想象,我在上海,按当前价格算,通常在大厂里干个三四年,好歹房子的首付应该能有,并且这种房子还不是太偏远过小的。html
进大厂确实须要必定的实力,但若是单单技术好,没有其它的技巧,估计确实也有些难度。不过话说来,哪怕是二本出身,哪怕技术通常,只要肯上心加方法得当,工做后3年进大厂应该不是难事。在本文里,就将针对起点通常技术通常的同窗,给出具体的进大厂操做指南。java
大厂里也有只有2,3年开发经验的初级开发,并且其中有些同窗的学校可能也就是个二本,或许他们进大厂前,资历技术和你也差很少。甚至能够这样说,只要找到渠道去面试,外加适当的准备技巧,进大厂其实比进一些面试要求比较苛刻的小公司更容易。linux
就拿一些步骤来讲吧,简历方面,只要有适当的分布式组件经验就至少能获得面试机会,面试时,固然若是光会增删改查固然不行,不过面试问到的题目以及提问的方式,网上多了去了,本文也会涉及,关键第一要适当看分布式技术,第二要结合项目说,这对初级开发而言,也不难。甚至当有些项目比较缺人时,面试的标准更会下降。面试
我给你们量化一下进大厂的须要花费的努力和时间吧。第一大概天天用1个小时看资料运行代码准备说辞,每周大概累计用10个小时,通过2个月其实该看得就差很少了,而后再用2个月用几个小公司面试练手,就能够去大厂投简历了。若是一切顺利什么都好说,万一不成,换个项目组,或者多面几家大厂,面个3,4次,应该也能行了。用时间努力应该不是问题,努力的方向可能未必你们都知道,具体的后文将详细展开redis
首先要让你的简历过筛选,不然没面试机会。能过筛选的简历通常长什么样?算法
1 硕士,一本大学,1,2年经验,并且最近项目里包含分布式组件等值钱技术。spring
2 若是大学通常, 本科学历,估计要运气,看不一样的项目组,可能会须要再多1年左右的项目经验,若是项目组着急要,或公司招聘需求高时,其实不看学校。sql
3 这点很重要,别太频繁跳槽,最好最近1年没跳槽经历,并且最近在职,不是长时间处于离职状态。数据库
简历上项目经验这块能够本身挖掘,但若是有不利的因素,尽可能用时间冲淡。数组
1 学校通常,找个有高并发背景的项目,体如今简历上,最多两年就够了。
2 最近跳槽太频繁,找个公司窝个一年左右,最好是最近一年半没跳槽经历。若是有超过1个月的离职状态,也能够经过连续上班个1,2年来淡化。
3 刚从培训班里出来,也去找个小公司干一年半载的,但要积累分布式项目经验。
你们注意没,这部分一直在强调分布式组件的技术,具体而言是netty,redis,mycat,kakfa等高并发的技术,工做年限是一方面,另外你简历最近的项目里,这些分布式组件的实践技能必定要体现出来,若是你让大厂的面试官感受你第一相关技术年限不足,第二只会增删改查,那么对不起,你没面试机会。还有,若是你实际能力很强,但简历上看不出,面试官直接认为你不行。
数据结构是大厂面试必问的点,网上这些题目太多了,并且答案均可以准备。不过若是要进大厂,最好能举一反三。
先用红黑树举例,除了要能讲基本数据结构,插入删除节点能操做外,能够再引到ConcurrentHashmap底层数据结构上,用该对象的底层代码来讲明,其实这和你的项目能力无关,事先准备下就好了,但若是你回答红黑树问题时顺带引出底层代码,甚至还能够从ConcurrentHash引到并发方面的问题,这样面试官就不会认为你光会理论。
再说比较经常使用的链表数组等,这些第一能够和Java里的ArrayList等对象一块儿讲,第二能够顺带引出快速失效和遍历等底层代码,这样也能让面试官感受你基础扎实。
至于HashMap,这方面都被问烂了,网上的解析文太多了,但你们在回答好理论问题和底层代码后,也能够进一步展现锁和并发的话题。
总之,数据结构的问题是必问了,在这个环节,不少初级开发候选人甚至连底层代码层次的问题都回答很差,而你通过准备,不只能触类旁通地展现你对底层代码的理解,更能借机展现锁和并发等技术点,首先就能给面试官留下个好印象。至于笔试写算法,这种网上题目更多了, 事先更能够准备。
先给些提问的方式,好比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超时以及防穿透的实现细节,其实这些技术并不深,但对初级开发的要求并不高,正是由于后者具有分布式组件的项目经验,因此虽然两位都录用了,但后者的工资要高于前者。
调试和部署项目的能力对初级和高级开发来讲绝对是亮点,并且哪怕是大厂的候选人,也不是每一个人都会。这块你若是说了,面试官未必会细问,只要听你讲的没大问题便可,并且这块不在于用到技术的深浅,而在于你知道这方面的实践要点。
在我以前的博文里,如何准备Java面试?如何把面试官的提问引导到本身准备好的范围内?,给出了准备压测的实践要点,从而你们能够看到,面试官不在意你压测方面解决过的问题,也不在意涉及到的技术,只关心你有这方面分析和解决问题的经验。
一样你能够在面试前准备些分析和解决问题的步骤,这以前也已经提到过,这里再给个例子。好比cat等监控系统上频繁报内存用量高,这时你看日志或dump,而后发现了问题,问题根源太多了,除了刚才提到的redis缓存没释放,更能够是netty堆外内存没处理好。好吧这些涉及到的技术太深,那么给些简单的,好比由于HashMap用好没clear,或者数据库对象没关,或线程池建立时用无限队列缓存任务,而后你搜oom缘由,再去找其它缘由,你项目里遇到的就能够看成你亮点的说辞。
再说部署方法,你能够看些zk加dubbo部署的配置文件,也能够看些redis各类集群的部署配置,若是你感受有余力,再看些灰度发布切流量的配置,其实看会了也就是一两句代码的问题,但你结合部署这个大题目说出来,立意就不一样了,由于高级开发(以及架构师)不只要会写代码,更要会部署组件。
面试官:介绍下你的经历和项目经验?
候选人,介绍教育背景(二本三本都没关系),有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源码,并解决过服务暴露的问题,而后很大概率能有机会说出。
或者你没机会说出压测技能,就能够假惺惺地问,大家项目里会不会作压测?压测时怎么发请求?怎么监控?而后能够在交流过程当中说你的亮点。其它的亮点也照此准备。
理想状况下,你面试的结果和技能无关,和项目经验的长短也无关,只和你简历上的项目和技术介绍有关,和你事先的准备亮点说辞有关。
但若是单纯准备不去实践,任何面试官都能摸清你的底细,这点别有任何幻想。由于一方面你准备的点未必全,第二你准备的项目说辞未必很好地打过草稿,中间可能会有漏洞,这时你就须要找些小公司来尝试了。
这怎么作:准备按大厂面试的标准准备,而后处处去投小公司的简历,记住先别着急找大公司,尽可能别在大公司里留下面试不成的记录,最好一周面个两家。
刚开始面试的时候,你会发现你的说辞漏洞百出,甚至会被看穿你的底细,但别灰心,第一收集面试官的问法,第二不断练习亮点技能结合项目的说法,第三再不断挖掘你的亮点技能,这个时间段里,小公司的面试官会尽职地弥补你面试中的弱点。
何时能出师?第一面试官确实能问分布式组件的实践经验,而不是单纯问理论,第二此类面试你经过三家,第三并且你是大优点经过,而不是可上可下地经过。
这个时候你就能信心十足地去挑战大厂了,这个时候如何找进大厂的渠道呢?
1 在招聘网上等渠道,多接触几个猎头,明和他们说你要进大厂,好比bat或者公司名称。不是每一个时间段大厂都有招聘名额,没关系就等,并且等的时间不会太长,最多2个月。
2 找内推,好比你们在网上看到有面试成功的文章,就联系下。
这里推荐是找猎头,由于猎头方便打探你面试结果,并且面试成了更能帮你最大程度争取工资,同时万一没面成,你能够和猎头说,你想面这家公司的其它项目岗位。若是你本身投简历,未必能获得这样的遍历。
当你充分准备,并准备好的说辞通过小公司的检验后,通常问题就不大了,万一再失败,或者找该公司其它岗位,或者找其它大厂,最多面个3次应该也就成了。
仍是这句话,其实进大厂,获得的也就是个能经过加班从而快速提高技能和收入的机会,并且大厂每一年的招聘名额都很多,进大厂不难。网上我就见过很多毕业3年内的同窗进大厂,我身边的,我见过硕士就1年经验进拼多多,本科2年经验进阿里,至于3到5年经验进大厂的人,我都记不过来了。
进大厂除了能提高技能外,收益也比较可观,好比工做3年,能有20k*16个月的收入,找个其它行业,这些资历能有对应收入的,并很少没,并且进大厂后,作个3,4年进能够继续升级到架构师,达到年入五六十万的收益(这还算平均水平),退能够像我这样进个外企,工资外加平时出书出视频,在上海也不至于饿死。
可能很多同窗如今看大厂须要仰视,但其实作的准备也就这么回事,时间用够,多看视频教程,少干无益的消遣,估计顶了天了,2年努力真的足够了,1年洗白简历,1年准备,这还算多了。但若是固步自封,或者虽然努力但始终不敢迈出面试的步骤,那么可能真只能在小公司里随遇而安了。
感谢你们看完长文,本文写了有3个半小时,并且篇幅足够,若是你们感受能够,请多多点赞,有问题也能够多写评论。
版权说明:
若是要转载本文,请先征得本人赞成。