hello,大家好,今天也是鼓起了非常大的勇气来写这篇文章,也是作为对自己近20天面试的一个总结。为什么说鼓起勇气,因为看到了大家发的很多文章都是像BAT这样的大厂的,并且叙述的非常的详细,我觉得相比之下我的这些技术或经验就会逊色很多,我没有在大厂待过,并且对于自己的技术水平也是极不自信的,这次的找工作之旅,在最初阶段,也一度让我非常头疼,因为自己也是一个30岁的人了,开始的时候真的感觉到达到了一个瓶颈,我甚至都做好了两个月找不到工作的准备。
先说一个下我的个人情况,我今年30岁了,一直做java,中间还做了一段时间的java讲师,当完讲师才找的这家公司,干了还不到一年,年前的时候就被告知,年后的话可能会面临裁员,我在这家公司其实付出的挺多的,经常性加班,准确的说前期经常性的通宵,我从无怨言,我觉得我是那种技术可能不是很强,但是责任心超强的人,每个工作我都很认真的对待,我甚至想过,就在这家公司一直待下去,但是事与愿违,还是被裁了,好在给了我补偿,但是其实心情还是很低落的。所以从年后回京,我就基本在准备找工作的事情。
怎么准备呢,也得有个方向吧,所以我是先画了一个脑图(后附图片,比较简陋,勿喷),把自己要补充的内容简单列了一下,说实话还是很多的,因为现在java后端的面试随着技术的发展,也越来越难了,像是微服务,高并发,多线程,分布式等肯定是面试都会问到的内容,但是说实话这些东西未尝都是在所有的公司里都会接触到的东西,很多小公司,业务简单,可能都没有过这些经验,但是面试又肯定会问,这就产生了矛盾,那我们就必须做好这方面的准备,除此之外,还有很多的中间件的用法,也是准备面试中需要考虑到的,像redis,mq,es等。
一. 微服务初体验
为了补充图上的这些问题,当然主要是为了应对面试中会涉及到的一些微服务用法,比如dubbo,spring-cloud等,我就准备自己搭建一套工程,把这些东西集成进来,体验一下(当然如果用过这类技术栈可跳过这一部分,如果你在公司根本没接触过这类东西,可按照此方式准备)。
首先就是我们搭建一套springboot多模块项目,然后打通各模块之间的依赖关系,打通全流程(controller-service-mapper-db) 保证从浏览器发起请求,最后能把数据成功保存到数据库中(这应该比较基础,这么多年开发基本都在做这些事情),把这个作为我们的base项目,可以传到github上方便管理,还能一稍练习下git的使用。然后我们我们就先从dubbo开始,先从github上把base项目clone下来,然后去了解一下dubbo的知识(假设你对dubbo一无所知,可以在知乎上直接搜索dubbo,或dubbo原理),多看几篇技术博文,基本上能掌握以下内容就可以了:
- 什么是注册中心,什么是服务的调用者,什么是服务的消费者。
- 用dubbo的目的是什么,也就是了解我们最终的目的是为了分布式的部署项目,而dubbo帮我们完成了各个模块之间的无缝调用
ok,知道了这些内容,我们就开始准备,第一步需要一个注册中心,用来做服务的注册和发现,而和dubbo配合的一般就是zookeeper,所以安装一个zookeeper,把服务起来。然后在项目中加入两个模块,一个是service-provider, 一个是service-consumer, 我们最终的目的就是在service-consumer中能够调用到不在一个模块的service-provider, 这里要注意,要有分布式的思想,时刻想到以后我们部署的时候,这两个服务是不在一台服务器上的,甚至是部署多台的,所以肯定是网络之间的通信,但这一切dubbo都帮我们完成了,接下来怎么办?服务都有了,剩下的就是怎么玩了,直接去官网,一般官网都会有一个github的地址,然后在代码中还会有个sample, 直接把sample下载下来,按照里面的代码,跑一遍,然后搞清楚consumer怎么调用到provider (其实就两个注解,一个Service ,一个 Refenrence) 然后在配置文件中配好对应的注册中心地址,就完成了调用。这样你就知道的dubbo是怎么玩的。但这都是demo级别的,肯定不足以应对面试,接下来,就再去查一下dubbo还有哪些配置,注册中心还可以使用什么,比如怎么配置超时时间,重试次数等,在到最后一步,就是刷题,去知乎上查dubbo面试题,都看一遍,多看几篇文章,做好笔记。然后基本上就可以了。
dubbo搞个差不多之后,在去研究研究spring-cloud,也是先去搞清楚spring-cloud的原理及常规组件,先看一些类似的文章,然后自己动手在原来的base项目上开始实战,实战的话,肯定也是得有两个服务,消费者,生产者,按照上面的来,建两个模块,之后是注册中心,再建一个eureka模块,各个模块有了, 然后是服务网调用,调用的话,使用feign,再把feign集成进来,不会集成的话,可以直接搜 "springcloud集成 feign" 类似于这样的关键字, 然后集成hystrix,在集成gateway (或者zuul,但是gateway更新一些),先把服务跑通,再去研究他的底层原理和概念,然后去查一下常用配置,最后刷题,就按照这个步骤来。这就是我在准备微服务这块的一些心得,如果你之前从没接触过微服务,我觉得这种方式还是很快的。
二. 中间件初体验
中间件也是现在面试中经常问到的一些话题,所以这一块我们也要重点准备,这里我就以redis 和 rocketmq为例
redis肯定是面试必问的,并且这东西一般不管大小的公司也应该都会使用,准备的一个过程就是,先装一个,简单玩一下,然后在我们的base项目里集成一下redis, 直接用redis-starter就行了,之后试试里面的增删改查,然后通过客户端去试试,这些肯定都是最基本的,安装的时候,最好用linux系统,如果没有,可以在电脑上弄个三四台虚拟机,毕竟现在基本上也都是集群时代了。并且亲自安装一遍软件,能让我们有一些更深入的理解,比如redis怎么启动,怎么开启aof, 自己实际操作过,面试的时候才不会虚。这个弄好了以后,在弄一个redis分布式锁,这个也是Redis最为广泛的应用之一,可以试试lua脚本的调用,这样面试的时候又给自己增添了一些筹码,这一块体验完了之后,再进行扩展,比如redis实现分布式锁有什么缺点,除了Redis还有什么其他的实现方案,什么场景需要使用分布式锁,捎带处理一下。
再之后,Redis 肯定是可以做缓存的,那就试着在自己的项目中使用redis做缓存,这个方案很多,也是在网上查一查怎么实现。 这一趴弄完之后不要以为就结束了,面试官肯定会问你Redis怎么实现高可用, 所以为啥让你装三台虚拟机,就是我们得弄下集群的搭建,要不然哪有勇气面对面试官的围追堵截。 不可能说我们只用了一台吧,那挂了咋办。 集群也挺简单, 哨兵啥的也不用试,直接就Redis-cluster, 一条命令就搞定了。 有了集群以后,也在你的项目中集成一下,看看你的集群可不可用。 最后就是刷题了。 什么rdb,aof, 主从,哨兵,cluster优缺点。 集群原理,是否使用一致性hash等。怎么确定数据存到哪个节点上,怎么动态扩容。 当你自己安装了一遍再回过来看这些问题的时候,你就会发现好理解了很多。
再来说下mq, mq的话现在主流的就是kafka和rocketmq, 选择其中之一就行。因为如果面试官问你另一个,你可以说,我只用过XXX,其实影响也不大。以rocketmq为例吧,通过上面的内容,大家应该也知道了大致的流程了吧,第一步,先装一个,这次建议就直接装集群,因为所有的这类软件真用使用的时候都不可能是单机的,然后网上查资料怎么安装,给他装起来,什么多master,同步主从,异步主从,了解一下,还有nameserver, broker, provider,consumer都是啥。安装好了之后,还是在我们的项目中集成进来,通过我们的程序可以直接操作mq, 这一块就可以更深入的了解mq的用法,比如说可以通过程序体验到什么是同步消息,什么是异步消息,什么是topic, 什么是tag, 怎么发送延迟消息,怎么发送顺序消息,怎么发送,怎么消费。这一块着重说一下,rocketmq中有个一事务消息,一定把他弄明白,因为如果面试官问分布式事务的问题,你可以说我用rocketmq中的事务消息解决过,原理是什么什么。。。,这里是会给自己加分的。
除了这几个之外,大家还可以研究研究mongodb, zookeeper, memcached, 等一些其他主流中间件的用法,具体研究什么,可以去boss直聘上看看岗位要求,人家都要求什么,你就研究什么,绝对错不了。
三. 刷博客,刷文章,刷题目
每天都做这种实战性的训练其实也不够,因为很多时候也得能说,所以我们在上面这种实战型训练的同时,也得注意一些理论知识的积累,毕竟我们做了这么多也是为了说的时候发挥的更好。所以很多理论的题目也是需要准备的,比如讲解一下数据库的索引, 说一下hashmap的实现原理,什么是cap理论等等,那么怎么办,掘金是一个非常好的选择,上面的很多文章都是非常的优质,高水平的,所以写不进去代码的时候,多来看一看,这里的技术博文不会让你失望,深入浅出,很多大牛都把很多深奥的问题讲解的非常易于理解和透彻。巨人的肩膀已经有了,还不踩上去等什么呢。 这里推荐一个,敖丙[juejin.cn/user/440649…] ,文章写得真的好,我从他的文章中学到了很多,有需要的可以去看看。还有就是像知乎,简书也都可以,csdn就算了,很垃圾,大家都是互相抄,想找个内容准确的,筛选都得半天,最后发现前十个内容都一样。
如果想好好整整算法的直接去刷 力扣,因为也有一些面试是直接让用代码实现的,一般都是一些算法或者数据结构的题目。
还有设计模式,一般也会问到,所以最好的方式就是,把几种常用的设计模式,用代码去实现一下,或者找找相关的代码如何实现,这样自己就大致明白了里边的原理,主要能说出来这个设计模式的作用是什么,有哪些角色,什么场景使用。
这一块的话大家重点关注这么几类题目:
- 集合类: List, Set, Map源码实现,是否线程安全,如何扩容,使用场景
- 多线程: 实现,锁,cas,aqs,原子类, 线程安全,volatile
- jvm: 构造,类加载机制,jmm,垃圾回收算法,垃圾回收器,jvm调优
- 数据库:引擎,索引,锁,调优,事务,死锁
- 数据结构:堆,栈,树
- 算法: 排序,搜索,
- 设计模式: 策略,单例,工厂,适配器,代理,模板等
四. 一些书籍推荐
在面试过程中我也买了几本书,都是豆瓣上的高质量图书,也给大家安利一下
- 《深入理解java虚拟机》第三版,这本书真的是强烈推荐,虚拟机领域的权威著作,第三版也是刚出不久,这本书的价值真的是远超他的售价,所以建议大家买正版纸质的,支持一下作者。 这里边你把第三章,第四章多看几遍,足以应对各种关于jvm的面试。
- 《java并发编程实战》 专门讲多线程的,你把这本书搞懂,足以应对各种多线程的面试,前几章比较不好理解一定要坚持下去,我深刻的记得有一道面试题,原封不动的出自这本书,问我是不是线程安全,所以不会让你失望,这也都是面试的高频考点
- 《高性能mysql》 mysql扛鼎之作,唯一的缺点就是没有出更新的版本,目前是只支持到mysql5.6,没有新版本的特性介绍,但是原理基本相同,好好看一看,不会错。
- 《Redis设计与实现》 这本书真的是把redis的实现原理讲的明明白白,我觉得最厉害的地方是,让我读起来很轻松,很少也有那种晦涩难懂的感觉。语言简洁,一步到位。好书。
五. 不断积累总结,不断自我追问
题是做不完的,代码是敲不完的,不管你花费多久的时间去准备,也都不可能覆盖到面试官问到的所有问题,所以,差不多的时候,就要出去被虐一虐更能让我们认清自己,所以可以尝试去公司面一面,前期的时候,尽量找些小公司或者肯定不会去的公司来练手,把心仪的公司留到后面,这个原因应该不用多解释,面试的时候,有几个点注意一下,一是不要怕丢脸,干就完了;二是要做好总结,每次面试都要记录下来哪些问题没有答上,下来后一定要把这个问题解决掉,这样才能形成一种积累,同时也要向外扩散,进行自我追问,比如设想面试官如果继续向下问我,我应该怎么回答,还有一些程序和算法题,答不上的,回来一定要自己写几遍。反正就是给自己定个目标,每次都要总结,去想象这次的题目如果下次碰到应该怎么回答。
六. 整整门面
这里所说的门面主要就是简历,还有准备一套娴熟的自我介绍。
简历真的很重要,但我相信大部分人应该和我一样,一改起简历,极度没有耐心,改了没几个字,就寻思着就这样吧。这个怎么说,可能还是没有意识到简历的重要性,我是什么时候开始意识到的呢,就是连续投了几十份简历,结果却发现一个面试都没有,如果你也刚好是这种情况,那就该好好看看自己的简历了,一个好的方法就是找一个或几个关系不错的人,让他们来给你做一个客观的评价,这样比较容易找到问题。还有就是千万不要吝啬自己的文字,也不要一味的在项目中罗列技术,尽可能的突出自己的作用和特点。 比如: 独立完成xxx, 参与 xxxx, 主导xxxx, 以及产生的效果,如: 实现在项目的顺利运转并持续盈利。 类似这样的词汇,尽自己最大程度阐述自己的能力和作用,相较于技术的罗列,我觉得作用更大。
还有就是自我介绍了,这个我相信你只要面试过足够多的次数,肯定可以总结出一套适合自己的模式,要点就是尽量简洁而又全面,突出优点,扬长避短,多练几次,说的时候尽量不要卡壳。
好了,大概就写这么多吧,当然没有适合所有情况的方法,这也都是一些个人的经验,也许适合你,也许不适合你,每个人还是要结合自己的一些特点,适合自己的方法才是好方法,如果大家有想法也欢迎评论区一起交流探讨。还有就是第一次写文章,写的不是很好,大家多包涵。如果这篇文章能够对你起到的一定的帮助,不妨给个赞吧,这样我就很开心了。感谢你有耐心读到这里。你的面试一定会成功的,加油。
本文参与了 SegmentFault 思否征文「如何“反杀”面试官?」,欢迎正在阅读的你也加入。