最后
如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!
先用红黑树举例,除了要能讲基本数据结构,插入删除节点能操作外,可以再引到ConcurrentHashmap底层数据结构上,用该对象的底层代码来说明,其实这和你的项目能力无关,事先准备下就行了,但如果你回答红黑树问题时顺带引出底层代码,甚至还可以从ConcurrentHash引到并发方面的问题,这样面试官就不会认为你光会理论。
再说比较常用的链表数组等,这些第一可以和Java里的ArrayList等对象一起讲,第二可以顺带引出快速失效和遍历等底层代码,这样也能让面试官感觉你基础扎实。
至于HashMap,这方面都被问烂了,网上的解析文太多了,但大家在回答好理论问题和底层代码后,也可以进一步展示锁和并发的话题。
总之,数据结构的问题是必问了,在这个环节,很多初级开发候选人甚至连底层代码层次的问题都回答不好,而你经过准备,不仅能举一反三地展示你对底层代码的理解,更能借机展示锁和并发等技术点,首先就能给面试官留下个好印象。至于笔试写算法,这种网上题目更多了, 事先更可以准备。
4 大厂更多考的是并发方面的能力,同时更要结合项目说
先给些提问的方式,比如netty,先问重要组件和工作流程,再问序列化,服务暴露等事先细节,再问读写索引半包粘包等问题,其实对初级开发而言,问到这里就差不多了,如果要找个高级开发,可能再会结合底层代码问。分布式组件有很多,其它组件,比如mycat,也是先问用法,比如如何设置分库规则,再问底层细节,比如底层代码如何把sql定位到具体的库上。再如redis,可以先会问些数据结构以及基本用法,再问些诸如集群等方面的细节。
哪怕去面大厂的高级开发,准备分布式并发这块其实也不是问题,因为很多人在之前其实基本没相关项目经验,其实都是在背题,你只要在面试时,让面试官感觉略微比别人多些项目经验即可,下面给些准备的方法。
先看几套面试题,这些面试题其实都大同小异,都会比较深地涉及到底层源码和实践要点,先把理论题背熟。这些点虽然不少,但其实都是体力活,背书么,这种事应该没难度。该背哪些素材呢?我之前看到的吊打面试官系列就不错。其实当大家看了几套题以后,会发现分布式组件的值钱技术,也就这么多。
其实很多候选人仅仅停留在这个地步,如果你做了后继步骤,就比大多人强了。在背熟以后,再给一些技术找些项目的背景,这些技术未必要深,但一定要结合项目的业务。比如就说最基本的redis,你说你之前的项目是某数据处理模块(项目可以按实际说),并发量大概每秒1k,如果都把请求压到数据库,数据库受不了,所以就用redis集群,然后准备些集群的大致配置方式。在用的时候,结合业务,用到了里面string等数据结构,用的时候会设置超时时间,以防缓存一直在内存,同时为了防止穿透,会把null也缓存起来。同时量力而行,就别再说redis事务了。
请注意结合业务说技术的时候,未必要涉及过于细节的点,比如不用涉及到redis的线程模型没,但首先得说些配置值(比如集群配置值和超时配置的方式),让面试官感觉你确实在项目里用过,其次要讲些项目里用到的经验,比如redis要用集群,防止单点失效,设置的超时时间最好后面带个随机秒,以防一个时间点里大批量缓存失效,一下子去拿数据库从而导致压力过大。
这里仅仅给出了redis,另外,mycat,kafka,netty, zookeeper,dubbo等,也照此办理,这样哪怕你平时用得不多,但也能让面试官感觉这方面你有实际的项目经验。
确实分布式组件这块要说好不容易,为了让面试官感觉你有这方面的经验,或者作为没说好问题时的补救措施,你最好再整理些实际解决过的问题。
准备问题时先讲问题是如何发现的,比如日志里频繁报oom异常,或者干脆系统登不上,再说你是什么查的,无非是通过linux命令看日志,或者用dump看内存镜像,再说问题原因,比如dubbo超时时间过长导致请求卡住,或者redis没设超时时间导致内存oom,这些点网上一搜也是一大堆。
而且你分析问题原因时,更可以借机让面试官感觉你熟悉分布式组件的底层源码,比如你准备些netty底层读写索引(或零拷贝)的源码,面试时当你说你解决过因netty半包等原因而导致的问题时,可以借机抛出。
再准备些画龙点睛的说辞,当你结合项目以及你解决过的问题说出分布式组件技术时,再说出这些点,立即能让面试官高看你,这些点可以是基于kafka的防幂等机制,也可以是zk整合dubbo的源码,这种值钱技术和源码太多了。由于找这些点是体力活,所以本人在这里就懒得再列了。
再啰嗦下,准备分布式技术说辞时,一定要结合项目,哪怕你平时用得很少,但可以找网上的资料,但找到后一定要融入到项目里。这里给个例子,某初级开发候选人也很用心,背了很多分布式题,基本有问必能回,但当面试官让结合之前项目经验说用到的技术时,他说不上,另一位其实分布式底层细节了解不深,但就能结合项目说些redis超时以及防穿透的实现细节,其实这些技术并不深,但对初级开发的要求并不高,正是因为后者具备分布式组件的项目经验,所以虽然两位都录用了,但后者的工资要高于前者。
5 充分展示调试和部署项目的能力
调试和部署项目的能力对初级和高级开发来说绝对是亮点,而且哪怕是大厂的候选人,也不是每个人都会。这块你如果说了,面试官未必会细问,只要听你讲的没大问题即可,而且这块不在于用到技术的深浅,而在于你知道这方面的实践要点。
同样你可以在面试前准备些分析和解决问题的步骤,这之前也已经提到过,这里再给个例子。比如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年准备,这还算多了。但如果固步自封,或者虽然努力但始终不敢迈出面试的步骤,那么可能真只能在小公司里随遇而安了。
给你们推荐一套阿里内部出品贼火的Java面试手册,如有需要可点击文末名片,扫码即可免费领取,无套路!
Java基础+集合+多线程+JVM
-
Java基础
-
Java 基本功
-
Java 语法
-
数据类型
-
方法(函数)
-
Java 面向对象
-
集合
写在最后
可能有人会问我为什么愿意去花时间帮助大家实现求职梦想,因为我一直坚信时间是可以复制的。我牺牲了自己的大概十个小时写了这片文章,换来的是成千上万的求职者节约几天甚至几周时间浪费在无用的资源上。
上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源
上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源