《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 「再见伐木机」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

本文系「知识星球」再见伐木机的投稿。

江湖人称 🐔 ,你太美。

前言

前言:很多人的面经可能是自己的一些经验之谈,也可能是一坨很长的各个公司遇到的面试题,而我其实很了解大家的诉求与渴望,但并不是说你看了这篇文章就可以立刻变强,饭要一口一口吃,路要一步一步走,目前面试了几家独角兽和一线大厂,都拿到了offer,几乎是100%的成功率。

下面的内容第一部分是经验+学习方法,第二部分是如何准备你的面试

鸡汤:我这个人挺爱玩游戏的,爱玩dota,玩了七八年了,也玩LOL,但是我经常会把游戏比做是人生,我从来没有主动点投降过,即使背靠的世界之树已经快凋谢,但是我坚信一定能找到对手失误的时候一波把别人打趴下。我经常挂在嘴上的口头禅:怕,你就会输一辈子。所以无论何时何地,保持自己的竞争意识,和自己比,亦或是和优秀的人比,都会不断促进自己的前进……

现实:这一段话其实是会有很多共鸣,当然这段话其实也是我在这篇文章快结尾的时候补上的,就是在职场,在人生中,不要轻易地看不起起任何一个人,也不要以第一印象去定夺一个人,别人受到了你的嘲讽,你的偏见,但别人也会因此暗下决心,请不要让第一印象,偏见暗自在黑暗中生长,可能别人会奋起直追,当别人超过你的实力的时候,别人回过头发现,其实去报复你,去反击你之前给过的偏见的时候,却已经没有这个必要,因为不在一个Level了,就像你当年在高处确看不起低处的人一样,别人他日站在高处发现为什么要去和低处的人比较,实属可笑。当然我身边有几个这样子的例子,经历过嘲讽,经历过不屑,每天只睡三四个小时去拼了命的前进,没有任何娱乐,虽然他已经成长为一个大牛,他却说曾经的偏见的眼光给他带来了激励,但同时也带来了深深的伤害……

我的复习历程

阶段一(学习方法之“记忆宫殿-联想记忆”)

在我一年前给自己定下要去XX公司的目标之后,不间断的准备了一年,这一年中,我到处在知乎,脉脉,网上,技术群中搜寻着别人的面试题,然后看,做,遇到不会的去查阅资料进行回答然后储备到自己的知识库里……一个惊人的数字:据不完全统计,我看过的面试题可能超过上千道(所以现在别人问我一个题目,基本上都能回答出来),当然一年之中的周六日大部分时间都是去公司学习,平常的节假日回家之后当然也是看书和学习,平常工作日一般会下班之后到家抽出1-2个小时继续学习;这一年中读了大概六七个框架的源码,看了不少的书,所有的视频都是两倍速的速度来训练,所以有些人看到我看视频的时候会觉得很疯狂,别人的语速太快了,都会问我别人讲的这么快你听得懂么?其实也是训练出来的,一开始是1.2倍,到1.5倍,到1.8倍,到最后的2倍,再快的话声音就会失真了;当然读书的速度也是成倍的提升,我记得在机场候机的两个小时刷完了一本书;依稀记得过年的几天假期也仍然保持着一天至少6个小时以上的学习时间,导致一些亲戚朋友过来串门的时候都觉得我很冷漠,不理别人,当然这不算什么,因为周围遇到的几个人会更拼,有些人工作日一天持续3-4个小时学习,非工作日10个小时,有些人甚至一天可能只睡4-5个小时的时间…..

正所谓 取法其上,得乎其中;取法其中,得乎其下,但其实这一年的成长远超过我前两年浑浑噩噩的工作及生活。

tips:我当年考驾照的科目一也是这样,一晚上刷了上千道题目,第二天去考试,你可以理解为题海战术,但不仅仅是题海战术,这个时候我引申出我的学习方式的第一大杀器—-“记忆宫殿”之“空间联想”

我其实高中甚至大学的学习方法很烂,因为一直找不到我自己的学习方法,都是题海战术,靠熬夜,靠多写题目去和别人拼,后来发现成绩并没有提高,当时的我多渴望有人直接告诉我一个完美的学习方法,那我直接按照做就好了,然而事实是我在毕业之后,工作的时候才真正找到了属于我的学习方法。

所谓“记忆宫殿”之“空间联想”,并不是像卷福那样把知识点都放在脑子中,想像成自己熟悉的各个地方存放,我这里的“记忆宫殿”也是脑海中的一片连续的内存空间,像数组一样,这时候我每吸纳一个知识点,我会立刻在这片连续的内存空间中找到能和这个知识点强引用,软引用,弱引用关联的地方,将他们像树形结构一样串起来,所以当我以后想到一个知识点之后,我会立即联想到与他各种关联的知识点,脱口而出的不再是某个单一的知识点,而是既有水平横向的对比,又有纵向垂直分析的过程。

上述描述可能会有点抽象,这时候我举一个例子:假设我现在脑海中有一个知识点(为了通俗易懂,我的例子尽量平易近人),这个知识点是这样,一个结构CopyOnWriteArrayList,基于一把独占锁的读写不互斥的线程安全的结构[不清楚的可以专门看一下源码或者找网上博客去看一下],而这里我们要汲取的知识点并不是它作为一个结构被我们记住,而是它其中的思想(写时复制),所以每次当我听到COW这个东西,我大脑中的那COW一片区域会有大量相关的知识点出来,比如redis的RDB主从复制也是用的COW这种思想,说白了是一个快照的思想,而我这时候突然又提到了“快照”,这时候脑袋中的知识点很快的将关联的mysql的MVCC涌现出来,就这样一层关联一层,错综复杂,层峦叠嶂,但也丝丝入扣,环环相连,成为一颗不断壮大的知识树……

阶段二(学习方法之“口若悬河-刻意练习”)

上面说过了第一阶段其实已经把自己的目标定下来了,但是遇到一个很现实的问题,你所有遇到的面试其实都是一个和别人交流的过程,你必须将自己的优势完全展示出来,并且是让人能听的简单易懂的方式,所以第二阶段的“刻意练习”分为两部分,第一部分我会将自己学到的知识点刻意拿出来和别人讨论,比如同事,比如在一些技术群,这样不仅在交流的过程中,你会发现自己哪里说的不够严谨,不够规整,不够深入,或者说别人也会依据你所说的提出一些问题,如果你不能游刃有余的回答出来,说明这个知识点掌握的还是不够好;

第二部分其实就是“技术分享”,在团队中技术分享,或者参加线下的技术分享,这里有个好处就是,当你进行技术分享的时候,你会带着压力,你必须不仅仅是分享这个知识点,他相关的点,他横向涉及的点,以及你分享过程中别人会提问你的点,还有就是如果将这个知识点讲给一点都没接触过这个知识点的人等等,其实分享一次挑战难度会非常的大,你必须花十倍百倍的精力去准备一场面试分享,其实后来面试的时候发现,这其实也算一个加分项,你说你进行过技术分享,有时候别人会让你聊聊,甚至让你再进行分享一次,别人会觉得你是一个热爱技术,愿意进行交流的人……

​ tips:一些技术氛围比较好的技术群里面大家会经常讨论一些生产上遇到的或者面试中遇到的问题,这时候千万不要视而不见,参与进去,说出自己的想法,并且和别人讨论,让被人给你进行纠正等等,时间长了也是一种变相锻炼的过程

阶段三(学习方法之“兵临城下-三轮决战”)

我是裸辞,所以各位朋友们,搞清楚自己目前的状态,好好分析自己的状态,我分析了一下自己的情况:1.没有经济压力 2.回家去家里附近的图书馆复习准备一个月,只管复习不用去考虑别的什么杂事,每天起很早开车去图书馆占座,八点到图书馆的时候,一层就已经排了将近200个人的队伍,等八点半正式开门,我们就蜂拥而上,冲进去抢占座位,30天时间只有两天没有抢到座位,又返回家中去学习,剩下的28天几乎是风雨无阻,雷打不动的从早上八点到晚上七点时间学习,当然目标很重要,第一天就把这一个月内要复习的东西全部罗列好,每天按计划进行,我上面说的三轮是这样子,我离职之前审视了一下自己,发现我整个知识栈体系相对于外面问的东西有几个薄弱环节,我就专门针对性的去复习,举个例子,JVM比较薄弱,我就第二遍刷了周志明的书,然后同时每天跟着救火大队长的JVM专栏,并且我会主动去把所有同学提出的问题都在评论区给予他们回答,来锻炼自己,然后回去知乎上把所有R大关于JVM的回答都浏览一遍,至此为止JVM常见,常用的在我这里都能解答。第二轮是把自己简历上每一个点吃透,项目吃透,能把机器配置到流量大小,每一个应用层的流量,极限的一些基本参数都得记住,同时每天挑一个重点面试题看,然后能表述出来。第三轮也就是最后一轮,自我面试,假设自己是面试官看到你的简历会问什么,越详细越好,找你的简历的每一个漏洞去问(下面我会详细的分析你该如何准备你的简历,你的项目,你所写的知识点),然后我之前收集的很多整轮面试题,我会专门挑一个小时时间,自我进行回答复述,算是自我演练面试的过程,事后进行复盘……

总结

总结学习方法:好,我的经历和经验其实还有很多东西,但是文章毕竟只是文章,他无法去描述你所有的奋斗的过程。至此我要总结一下学习方法,这时候很多同学可能会说,你说的这些方法我都知道呀,我还是不行,这其实并不是鸡汤:你即使知道所有道理也过不好这一生,而是你能坐的下冷板凳,静下心来,不急不躁,毕竟改变最好的时间就是你看完整篇文章之后开始.

  1. 构建好自己的知识体系,空间联想,不断重复,记忆曲线

  2. 刻意练习,多交流,多接受不同的意见,拓展思路

  3. 明白自己哪一个环节薄弱,专项针对,比如我redis弱,那我这一段时间就狠抓redis,不要又看redis,又看zk,又学netty的

重点:下面是你该如何准备你的项目?

(这里我就不说单一的技术栈,知识点,这并没有什么意义,网上都能找到,很多面经都会有很多题目,这也是我整篇文章没有任何一道面试题的原因,而且现在慢慢的已经逐渐不太会问你单一的技术点了,都是结合生产实际,要你对你自己做的项目知根知底),下面我以问答的方式让你来准备你的项目。

1. 首先,你要简单能描述出你的项目

(市场切入点是什么?怎么盈利?业务模式是什么?上下游的业务有了解么?这种业务模式你觉得会有什么问题?你的项目解决了什么问题?能否在墙上画出你的项目结构图,架构图)

tips:软件工程很重要,我是被问到画出ER图,系统流程图,泳道图等等

(项目的日活?GMV?每天的访问量?一年营业额?合作商家大概多少?租户有多少?目前数据量多大?系统部署了多少台,机器是什么配置?每一层的流量大概是多少?比如打到mysql的流量有多大,mq的流量,redis的流量?线上的超时时间怎么配置的?重试怎么配置?幂等怎么做?db和cache在一致性怎么做?jvm垃圾收集用的什么算法?老年代新生代给了多大?有什么问题么?cms和g1的区别?线上为什么不用g1?目前的架构模型对于现有业务量有什么可优化的?有什么难点?以后如何扩容?数据库表的设计是怎么样的?违反了三范式会有什么问题,有什么好处?当前的数据库表设计有什么问题,有什么可优化的点?项目中有你负责模块的设计模式如何运用?能否画出这个设计模式的uml图?相比之下这种设计模式和另一种有什么区别?有什么优缺点?)

tips:我这里没有细化任何一个框架知识点的问题,是因为一个知识点比如分库分表都会带来大量的问题,我这里着重整体的项目问题,这里起码要准备三个项目的亮点难点,尤其是大厂面试官,很挑剔,那种比较一般的难点就不要拿出来说了,反而会降分

2. 第二,对于你项目中运用技术的思考,架构选型,为什么选它,架构设计,为什么这么设计?

拆分微服务的理由?为什么XX模块和XX模块没有拆开,或者拆开了?举个例子zk和eureka作为注册中心,你们选型用哪一种?针对你们业务量,和服务实例的数量应该选择哪一种?这两种模型不同,为什么说一个偏向于AP一个偏向于CP?会带来什么问题?引入新框架是否会带来新的挑战?出了问题是否能有人hold住?团队成员开发能否快速上手这个框架?

如果在面试官问你一个技术,你可以将为什么用它?你是怎么用的?用它有什么优点,缺点?备份方案?这种方式表达出来,别人会觉得你是有思考的,你相比其他竞争者是有优势的。

3. 常见问题的梳理

这部分就是很常见,外面也会必问的问题,很简单,比如spring相关的aop,ioc,mybatis相关的,dubbo,zk,netty,springcloud,springboot的starter,mq的,线程池,hashmap,并发相关的集合,CAS,volatile,synchronized(1.6之后的锁升级),原子类,网络的NIO,类加载过程,三次握手四次挥手,一次http请求的过程,这些常见的问题起码应该烂熟于心,当然有些东西说的越深入越好,最好能涉及到硬件,震慑到面试官,比如每次我聊到CAS,会提到底层的MESI协议,会聊到高速缓存的结构,会聊到Modified,Exclusive,Shared,Invalid四种状态如何切换,会聊到缓存加锁之后引入的一些写缓冲器,和无效队列问题,再提到release,acquire,store,load屏障分别做了什么,怎么保证可见性,有序性等等等,所以聊到你擅长的,你就狠狠的喷。

4. 稍微深入的题目拓展

平常做一些稍微难的题目其实会拔高自己的思考的能力,我来举几个例子,我以AQS为例子

1.addWaiter和enq方法中新增一个节点为什么先将新节点的prev置为tail,再尝试cas,而不是cas成功之后来构造节点之间的双向链接?

2.唤醒节点为什么从tail往前遍历?

3.unparkSuccessor有新线程争锁是否有漏洞?

4.aqs如何保证队列活跃?

5.Propagate状态的节点存在的意义?等等等

5.自己简历上写的每一个知识点要吃的透透的,并且能够独立描述5min,还是要把别人能讲懂的那种

6.自我攻防战,每天最好能针对你的项目找漏洞,再找到解决方案,类似“左右互搏”,有些游戏大神不都这样,每天可能只打两三把游戏,但是水平很高,是因为别人在脑海中打游戏,演练每一种情况,每一个细节,同时结合一些网上的面经,进行模拟考试,自我演练。

艿艿爆料

时间过得很快,文章已经接近了尾声,在复习和快速成长的一年中认识到了很多大佬,大家也对我都进行了很多的帮助,这里要十分感谢他们,也有很多朋友催我出一份面经,目前能想到的只有这么多,后续会继续补充,希望这篇文章对大家有帮助,大家有什么问题可以后续加微信进行询问……

你以为本文就完了?

噢不~

🐔 最近刚被蚂蚁干了,挂了。浦大喜奔!!!

想要了解为什么?后台留言回复「鸡鸡被干」。

文章目录
  1. 1. 前言
  2. 2. 我的复习历程
    1. 2.1. 阶段一(学习方法之“记忆宫殿-联想记忆”)
    2. 2.2. 阶段二(学习方法之“口若悬河-刻意练习”)
    3. 2.3. 阶段三(学习方法之“兵临城下-三轮决战”)
    4. 2.4. 总结
  3. 3. 重点:下面是你该如何准备你的项目?
    1. 3.1. 1. 首先,你要简单能描述出你的项目
    2. 3.2. 2. 第二,对于你项目中运用技术的思考,架构选型,为什么选它,架构设计,为什么这么设计?
    3. 3.3. 3. 常见问题的梳理
    4. 3.4. 4. 稍微深入的题目拓展
  4. 4. 艿艿爆料