背景
大家在平时学习的时候,有没有这样的疑惑,对于某个知识点不懂,于是在网上找文章或者视频,然后去学习。虽然文章或者视频的内容也没什么错,但是学完之后总是感觉好像差了一点什么,没讲透的东西。或者看完某篇文章,然后觉得掌握这个知识点了,但是在后面的面试里遇到这个知识点相关的知识点还是答不上来。为什么会有这种现象呢。其实原因主要有
- 网上找到的资料不系统,没有针对问题的前因后果分析不能把问题相关的技术栈串联起来行程体系,只能针对某个具体问题套进入解法,很难扩展问题的场景,泛化出相关问题的解法。
- 互联网灌水的内容太多,有干货的内容本身就比较少,大家的博客又都是互相抄,很难有创新,这导致某些知识被夸大,偏离原本的知识涉及到的技术非本来意图,误导人理解。
针对这种现象,让我们来提出解决这个问题的行动 - A计划
实施
目的
A计划的目的,是为了让大家能系统的掌握某一个技术,或者理论,达到在应对相关技术问题的时候,能做到游刃有余的解答。不敢说能让大家百分百都能解决相关技术上遇到的实际问题,但是一定要让大家有基本的解决相关问题的思路。
标准
只是提出一个"系统的掌握某个技术或者理论"的目标,当然很难让大家有对这个目标的实感,让我们来对一个程序员的技术水平做一个分级来让大家更加实际的体会出这个目标。大家在平时看博客或者简历时,应该经常会看到类似的词句"精通XXX技术","熟悉XXX原理"那么这些精通,熟悉到底是学习到了什么程度呢。我们可以对一个技术或者理论的掌握程度划分4档,了解,掌握,熟悉,精通,以大家常用的mysql举例
- 了解 知道常用api的用法,能使用这个框架编写常见的需求,以mysql为例的话,就是能写sql。
- 掌握 看过一些博客或者文章,能理解核心的原理并且解释清楚,以mysql为例的话,就是能解释里面的一些原理,比如B+树,MVCC等等
- 熟悉 系统的学习过这一门技术,或者看过核心的源码,能对源码核心设计做出相应的解释,以mysql为例的话,能说出来一条sql从client发送到服务器,经过连接器,词法分析器,语法分析器,优化器,执行引擎,每一步都做了什么,并且结合理论分析数据页的写入组织过程以及要考虑的问题以及解决问题的设计点。
- 精通 是这一门技术或者框架的contributer,或者竞品的contributer,能手搓框架的核心组件或者实现某个理论。以mysql为例就是你能手搓mysql的常用引擎。
通过这种划分,大家应该对技术的水平层次有一个感性的认识,但是我们知道,技术的学习是线性的,并不是从某个阶段直接就跳转到另外一个阶段,所以让我们来细化一下这个划分出来的阶段。
-
了解-C级 根据对框架常用API和用法的熟悉程度,我们可以划分为C,C+,C++,一般在开发中,需要我们使用某个以前没用过的技术,就处于这个阶段,比如要求用apollo替换config-server做配置中心,虽然不了解apollo的原理或者工作过程,但是引入依赖集成配置,让服务器能拉取到在配置中心的配置,详细任何一个java程序员都能手到擒来。
-
掌握-B级 根据对框架原理的掌握程度,我们划分为B,B+,B++。这也是在实际开发中,大部分程序员的技术水平,在使用过某些技术一定时间后,尝试去学习这个技术的核心原理,当然这个阶段受限制于学习的方式和渠道,效果也会有差异。在团队中,程序员的技术栈水平均分布一般都在B,B+左右,少部分程序员能做到大部分技术栈B+的同时还对某个技术深入到B++级别,这种人一般是团队的骨干。
-
熟悉-A级 到达A级水平要求能对框架的整体有个全面的认识并且能针对核心原理做出详实的解释,或者根据能说出来核心源码的执行过程,根据对框架整体或者细节认识程度我们分为A,A+,A++。。到这个阶段基本就和一般的程序员拉开了差距。程序员能把某一项技术达到A级就已经是团队里这个方向的技术专家了,而且持续学习迭代到A级的过程是很难的,如果某一项技术水平能到A级,那么他其他的技术水平一般不会太差,保底会B+的水平。这种人一般是团队或者业务部门里的技术专家。
-
精通-S级
开源项目contribute,手搓大于一切花里胡哨的理论,这种人才一般处于大厂架构师或者中厂总监的级别,根据对开源框架的贡献程度和行业领导力可以分为S,S+,S++。其实到这个级别,个人之间技术上的细枝末节的差别已经不太大了(或者非常大,类似人和狗之间的差别),更多的是差别是不同技术路线之间之间差别的体现。这种人级别太高,不在我们讨论的范围内,只做这么一个划分。
目标
在确定了水平的层次后,那么我们的学习要到什么程度呢。我们不妨想一下,我们学习的目的是为了什么,其实目的很简单,为了让自己技术更牛逼,面试更有信息。甚至可以简化为,技术牛逼不牛逼都不重要,面试里一定要表现的牛逼。我們可以划分一下难度。我们把面试的难度划分为标准,困难,噩梦
- 标准 问题知识点集中在B级,辅以少量B+难度的知识点。
- 困难 问题知识点集中在B+级,提出少量B++级的知识点。
- 噩梦 问题知识点起步B++级,上不封顶
当然,以上是对面试里问题知识点的划分,但是每场面试里都需要讲清楚的项目,自我介绍,以及部分比较高级面试会额外考察的候选人业务能力,团队能力并不在这个等级划分里。但是这些问题的储备也不是靠学习技术知识点能准备出来,需要大家自己去准备。
大家可以发现,其实大部分的面试问题难度都集中在B,B+级别上,我们将着重讲解这个区间会涉及到一些技术点。当然这些技术点本身也有重点和非重点的区别,我们还要根据知识点的重要程度,划分出不同的学习程度,这样来帮助我们理清楚目标。我们把对知识点的学习程度分为4个程度
- 了解 知道有这个知识点,并且知道做了什么事情。比如知道mysql中buffer pool的作用是什么,但是不知道buffer pool中数据页的组织方式和刷盘机制。
- 理解 知道这个知识点,并且能根据类似的知识点推导出来。比如没看过知道java hash map的结构,但是不知道redis的hash结构实现,可以尝试从java的hash结构推导redis的hash结构怎么设计的。
- 熟记 能讲清楚这个知识点的前因后果,或者组件的运行过程,或者原理。比如能熟记mysql B+树的原理
- 默写 能出来,大部分知识点不需要大家能写出来,除了少部分常用设计模式或者轻量级的数据结构。
我们的目标是能够游刃有余的应对标准的面试,并且也能解答困难的面试里的常见面试题,对于不怎么常见的面试题,我们可以说出来思路。至于噩梦级别的面试,大家大部分情况下遇不到,如果遇到了,大概率是面试官不想要你(或者面试官特别脑残,想PUA你一下),如果遇到了直接准备下一家的面试即可。
通过这个阶段的划分,大家也能看出来,大部分情况下我们需要做的是熟记或者理解B,B+级的知识点,对于B++级的知识点能了解即可,如果你能理解,那么一般能给面试官留一下一个技术还不错的印象。那么怎么达到这个目标呢,我们怎么做,以A级为目标的进行系统的学习,为什么是A级呢,因为取法其上仅得其中,我们把目标订到A级,如果保持学习,最后保底也能达到B+级别的水准。如果更加认真一些,B++级别也不是不可能,这也是为什么我把这个计划取名“A计划”的原因。
自我介绍
上面介绍了我们接下来的学习的目标,那么肯定会有机智的宝宝问了,你说A级就A级,你什么水平,凭什么教我们啊。那么也给大家做一下自我介绍,我本人工作8年,一直从事java后端。曾在美团,蚂蚁等公司任职,职位高级java开发,职级P6(其实这个职位只做个参考,因为P6的层级里水平分布非常不均匀,大部分顶着高级开发,资深开发,架构师title的人也很水)。我在4月份曾经输出过一篇JVM垃圾回收器的文章,分别被阿里云技术团队和阿里云国际(这两个团队不是同一个,选题都是分开的,一个主要面向国内开发者一个主要面向国外)站收录在阿里云的技术博客上。
连接我贴在下面。
www.alibabacloud.com/blog/a-deta…
贴这个链接上来是为了给大家树立一个信心,放心学,质量有保障。接下来的时间,我会更新一些文章,来讲解面试里常用技术栈的知识点。文章我采取视频免费观看,文章原文收费的方式,对文章资料感兴趣的可以联系我的微信。当然,不管收费不收费,我都会在视频里解释清楚一个知识点的,这一点大家放心。
今天的开篇就到这里,谢谢大家。另外,如果需要加粉丝群可以在微信公众号回复 9527 加使徒的微信,备注进群。