本文是公众号读者再见伐木机投稿的面试经历
mysql
在此感谢伐木机同窗的分享程序员
===================================面试
扫描下方海报二维码,试听课程:
redis
(课程详细大纲,请参见文末)算法
写在前面:spring
首先作个自我介绍,楼主男,渣本毕业,坐标帝都,差 4 个月 4 年工做经验。本次面试了几家独角兽和一线大厂,都拿了offer,几乎100%的命中率。sql
在整个面试过程当中,石杉老师的指导给了我很大的帮助,所以将这次面试的经历以及我的学习方法经过老师的公众号分享出来,但愿能帮到我们更多的程序员兄弟。数据库
首先想说说我写本文的思路,不少朋友的面经多是本身的一些经验之谈,也多是一坨很长的各个公司遇到的面试题设计模式
我很了解你们的这种诉求与渴望,毕竟本身也看过N篇面经。然而,并非说你看了这篇文章就能够马上变强,饭要一口一口吃,路要一步一步走数组
下面的内容第一部分是经验+学习方法,第二部分是如何准备你的面试
个人复习历程:
阶段一(学习方法之“记忆宫殿-联想记忆”):
在我一年前给本身定下要去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常见,经常使用的在我这里都能解答。
第二轮是把本身简历上每个点吃透,项目吃透,能把机器配置到流量大小,每个应用层的流量,极限的一些基本参数都得记住,同时天天挑一个重点面试题看,而后能表述出来。
第三轮也就是最后一轮,自我面试,假设本身是面试官看到你的简历会问什么,越详细越好
找你的简历的每个漏洞去问(下面我会详细的分析你该如何准备你的简历,你的项目,你所写的知识点)
而后我以前收集的不少整轮面试题,我会专门挑一个小时时间,自我进行回答复述,算是自我演练面试的过程,过后进行复盘......
总结学习方法:
至此我要总结一下学习方法:
构建好本身的知识体系,空间联想,不断重复,记忆曲线
刻意练习,多交流,多接受不一样的意见,拓展思路
明白本身哪个环节薄弱,专项针对,好比我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
线程池,hashmap,并发相关的集合
CAS,volatile,synchronized(1.6以后的锁升级),原子类
网络的NIO,类加载过程,三次握手四次握手,一次http请求的过程
这些常见的问题起码应该烂熟于心,固然有些东西说的越深刻越好,最好能涉及到硬件,震慑到面试官
举个例子,每次我聊到CAS:
我会提到底层的MESI协议
会聊到高速缓存的结构
会聊到Modified,Exclusive,Shared,Invalid四种状态如何切换
会聊到缓存加锁以后引入的一些写缓冲器,和无效队列问题
再提到release,acquire,store,load屏障分别作了什么,怎么保证可见性,有序性等等等
因此聊到你擅长的,你就狠狠的喷。
4.稍微深刻的题目拓展
日常作一些稍微难的题目其实会拔高本身的思考的能力,我来举几个例子,我以AQS为例子
addWaiter和enq方法中新增一个节点为何先将新节点的prev置为tail,再尝试cas,而不是cas成功以后来构造节点之间的双向连接?
唤醒节点为何从tail往前遍历?
unparkSuccessor有新线程争锁是否有漏洞?
aqs如何保证队列活跃?
Propagate状态的节点存在的意义?
等等等
5.本身简历上写的每个知识点要吃的透透的,而且可以独立描述5min,仍是要把别人能讲懂的那种
6.自我攻防战,天天最好能针对你的项目找漏洞,再找到解决方案,相似“左右互搏”
有些游戏大神不都这样,天天可能只打两三把游戏,可是水平很高
那是由于别人在脑海中打游戏,演练每一种状况,每个细节,同时结合一些网上的面经,进行模拟考试,自我演练。
时间过得很快,文章已经接近了尾声,在复习和快速成长的一年中认识到了不少大佬,你们也对我都进行了不少的帮助,这里要十分感谢他们
也有不少朋友催我出一份面经,目前能想到的只有这么多,后续会继续补充,但愿这篇文章对你们有帮助,你们有什么问题能够后续加微信进行询问......
写在最后的一点感悟:
我这我的挺爱玩游戏的,爱玩dota,玩了七八年了,也玩LOL。
我常常把游戏比作是人生,历来没有主动点投降,即便背靠的世界之树已经快凋谢,但我坚信必定能找到对手失误的时候,而后一波把别人打趴下。
我常常挂在嘴上的口头禅:怕,你就会输一生。因此不管什么时候何地,保持本身的竞争意识,和本身比,亦或是和优秀的人比,都会不断促进本身的前进......
不服输,你就不会输!
END
《21天互联网Java进阶面试训练营(分布式篇)》详细目录,扫描图片末尾的二维码,试听课程