经验分享 | 我的八股文学习路线及攻略

前几天拿到字节offer了,很开心,也有很多小伙伴私信我问了很多问题,所以在这里简单分享一下我是如何学习八股文的,文章篇幅略长,希望能帮助到有需要的同学或者也是双非大三正在迷茫的你。

【知识库分享】 很多小伙伴看了文章找我要知识库,我的建议是应该参考我的方法而不是内容。我的知识库整理好了,想看整理好的可以私信我“资料”获取

这是我的面经,整理的很详细字节后端暑期实习 一二三面(已OC|新鲜面经)

学习要点

1. 要明白的一些事情

  • 什么是八股文?八股文不是死东西,八股文本应该指计算机基础知识,考验的是面试者基础能力、广度以及深度,大厂面试往往不会很重视死八股,往往是很灵活的分析,本文我就讲讲我是如何灵活的学习的。
  • 大概学习多久?因人而异,推荐平时积累,我是累积一年,然后重点准备了半年八股
  • 八股文感觉很抽象怎么办?制作一份简历,看看别人专业技能怎么写的,这个专业技能就是你八股文学习的标准(参考后文怎么写简历)
  • 面试八股文的形式?这里提一下一些常见的八股文出法
  1. 讲讲输入URL到网页显示发生什么? 抛直球的八股题,没有一点拐弯抹角,一面很常见,二面三面如果面试官觉得你基础不错就可能见不到这种问题了。
  2. 你可以讲一下URL到网页显示,每一层具体干了什么吗?高级八股,需要面试者结合整个计算机网络分层协议去回答,考验整体能力,如果是单纯记不理解,很容易这里就被面试官拉扯没的
  3. 把我当做小白,用大白话给我讲讲计算机网络体系是怎么工作的?送分题/送命题 其实这里是考察的就很灵活了,一般我们看的文章其实也是把我们当小白来看的,关键在于你理解后是真理解了还是记住了,如果你理解了,你是能够自己组织语言描述的
  4. 谈一个你觉得你学的最好的技术点。送命题。把八股文选择机会给面试者,你选你背的很熟悉的计算机网络可能格调低了,面试官会怀疑你:就这?如果选择太深有难以达到面试官期望,所以看后文了解如何准备这个问题

讲讲我的学习路线。

之前有小伙伴给我一张学习路线图,问我怎么学,这个我大有感触:望不见底的后端开发路线,小白看了泪目,工程师看了退步。

经验分享 | 我的八股文学习路线及攻略_第1张图片

我结合这篇文章简单讲讲我的看法吧,首先上面的路线学完学懂大厂肯定稳了,但学完和学懂的人很少,因为路线不是合适每一个人,然后路线不能完全一样的学,而是作为参考。

然后讲讲我的学习路线看法(可以具体参考后文)

  • 大一大二基础阶段:计算机基础知识(计网、机组、os、数据结构、算法)初步入门 + 实战开发边开发边学springboot、Mybatis、mysql等
  • 大三八股文阶段:计算机基础知识八股文深入 + 深层次实战开发

面试前复盘准备:计算机网络+操作系统底层 + Mysql底层+Redis底层 + (JVM、多线程、Netty、分布式等选几个系统学)

像上面这种学习路线,我觉得JavaSe、SSM、servlet、jsp这些大坑给初学者也看不出来,初学者对路线本身就不是很清楚的还是多自己探索吧,怎么探索就是基于问题出发去学习,而不是基于路线,你如果对计算机体系很清楚,其实路线还是自己的最好。具体参考下文我是如何准备八股文及路线的。

2. 一定要做笔记!

先讲一下做笔记的重要性。

  1. 首先做笔记可以加深理解,一边动手一边动脑防止你大脑摸鱼,光看不思考,学习时迷迷糊糊就走神或者(。-ω-)zzz睡觉了。
  2. 其次你面试的时候比起标准八股文,你更先回忆起的是你的笔记。
  3. 等你很久没看八股文,你通过你的笔记以及之前的基础可以很快的又找回八股文的感觉

先讲一下笔记类型

  • 博客:不推荐好处就是可以给别人看,但维护成本太高,写一篇成本也高,不满足随笔记,随时更新。博客适合你在一个领域已经很厉害,然后发布一些有深度的内容,我个人觉得不适合记录笔记。

  • 知识库:推荐 什么是知识库,就是类似八股文网站一样构建树形文档结构,然后方便更新维护完善文档,相对于博客,好处就是目录维护简单,内容不是单篇发布。典型的例子就是语雀知识库。我的语雀知识库,我很愿意在这边随笔写内容,方便维护,也可以等内容累积好导出md发博客文章

  • 笔记大纲:推荐这里相对于知识库更适合随笔,文档写少了,难看,写多了臃肿,而笔记大纲(思维导图)就可以随笔记录,分点整理。当时B站看了个双非进字节的视频,我觉得每一个双非同学都有过这个问题,双非进大厂难吗,知乎百度的解答再好看也没有一个实际的例子好,所以当时我就找那个学长要了他的笔记。这份资料让我感受到思维上面的差异,我之前写这么多文章还不如简简单单用大纲自己总结,如果你被写文章束缚,那么赶快试一下幕布吧!

经验分享 | 我的八股文学习路线及攻略_第2张图片

"这是我要的一位字节大佬的笔记,最后也如他所说成功进入了大厂,我很喜欢他的笔记方式,条理清楚,每个点想补充就补充很方便,不必要像文章那样写一堆废话来填充幅度,也给了我很大的启发。后面自己很多文章也是这种类型走。"

最后讲讲我综合很多思想整理出的我自己的记录八股文的方法:推荐大概思路就是每次遇到不会的,或者八股就创建小记,这时候可以不去完善,它是出于未完成状态在那里,每次遇到合适的答案就慢慢补充内容,然后等篇幅合适的时候就去参考一些高质量的文章(比如下面TCP和UPD我先自己总结+八股文网站总结,然后我去掘金或者公众号找类似网站,看下别的大佬怎么写的修正我里面的思路,然后再归档,这样一个八股文就搞定了,也可以随时在语雀其它网站内插入小记,方便我后面整理汇总)

讲一下做笔记要点

  • 一定要自己总结!!千万不要为了让内容漂亮,就直接搬运粘贴别八股文仓库里面的东西。
  • 怎么写笔记方便怎么来,别被各种条条框框束缚。你要愿意写,才有用,但同时最好做好可行性规划,比如我笔记能不能方便保存,如果丢失能不能找回,可不可以公开分享访问,可不可以多个平台编写(像typora就只能在电脑上拉仓库才能同步,而语雀多平台云同步就很方便)

3. 基础八股文组成

首先要了解八股文的组成,这样学习的时候就清楚自己目前在学那一块了

后面学习步骤那边也会提供下面模块对应的八股文网站以及资料学习

  • 计算机基础知识:计算机网络、操作系统、数据结构、算法。
  • Java基础八股文:Java基础、Java多线程、Java JUC、JVM虚拟机、java容器、Java 8
  • Java高级八股文:SpringMVC、SpringBoot
  • 数据库八股文:Mysql、Redis
  • 中间件八股文:消息队列MQ(任意一种推荐RabbitMQ)
  • 场景问题八股文:缓存一致性解决、4G数据找系统记录(大数据题)

-------------------上面是必要,下面是加分项---------------

  • 微服务分布式:分布式、微服务、、高性能、高可用等

4. 方法的要点

首先,你要有一个做笔记的软件,你需要通过很长的时间去慢慢完善它,所以一定要满足既能清晰构建框架,又能随时更新维护的软件。其次是你要明白你要学哪些[参考上面八股文组成],然后可以构建从零开始的知识框架,这个框架不是给别人看的,不必要做的很好看,满足一些基础markdown语法自己写着舒服就行。

其次,完成初始准备你的知识库应该是空的,这时候你可以试着去参考一下一些八股文网站他们怎么归类的来构建你的知识库框架,很显然分类是有规律的,你如果自己试着去多看一些

学习步骤(待更新)

这里讲一下我是如何去逐层递进去完善我的八股文体系的

① 基于场景去学

这个阶段是处于萌新阶段,大概是大一大二刚刚学完基础语言,对于计算机体系还是一脸茫然的情况,这里可以按照我下面的几个问题或者几个场景去初步接触一些知识,大概对计算机网络、操作系统、数据库、javaweb有一个初步的概念。

  • **计算机基础知识探索阶段**:(这个阶段学习计算机基础知识,对计算机框架有一个基础概念)
  • 了解输入url到网站显示过程中发生了什么?可以通过各种技术博客视频去学习,对计算机网络建立一个最基本的印象,清楚一下计算机网络其实就是两台主机通信,细致一点是进程通信,通过多层计算机网络保证这一个实现。然后学习中把不懂的内容记录到你的笔记中,待后续去完善
  • 了解你的笔记本的组成?了解什么是CPU,什么是显卡,IO设备、内存、硬盘等,电脑加内存条和加硬盘分别是提升电脑哪些性能。
  • 了解一下你是怎么和笔记本进行交互的?一条执行是怎么被操作系统执行又反馈的。这里对应操作系统课程,可以先简单了解一下进程线程、内核态、用户态,大概清楚指令是用户发出,通过IO设备被操作系统内核读取然后执行相应的操作,进程进行相应的通信交互,然后通过用户界面反馈给用户的。
  • 了解一下数据结构,这里的场景就是实战,去写代码,完全不需要先上课。推荐就是[代码随想录](https://www.programmercarl.com/),把每一章的第一小节(基础知识) 看一遍,很直观的了解到 链表、二叉树、栈、队列、堆、hash表这些常见数据结构都是干什么的,并且配套训练,很快你就对这些内容很熟悉了,然后就深入去了解各类数据结构优缺点,时间复杂度等。
  • 了解一下算法,算法和数据结构都分不开的,也是去刷题学算法路线去学习,也不需要等老师上课再学。在线学习推荐[代码随想录](https://www.programmercarl.com/),或者[labuladong](https://labuladong.gitee.io/algo/)。书籍的话推荐《啊哈算法》该书很通俗易懂的把各种算法讲述了一遍。参考上面,去了解算法种类基本思想,动态规划,贪心算法,回溯,搜索,排序算法等都要基础学习的。
  • **动手实际操作探索阶段**:(这个阶段需要动手去实际操作,基于已有的基础去探索更多领域)
  • 开始使用任意语言,通过一些博客教程去搭建一个可以登录注册的在线网页。这个场景我是大一寒假做的,显然C语言我可以很轻松实现这个程序,唯一要解决的是怎么存储已注册信息在下一次重新打开程序能字节登录而不是清空,显然C语言可以存本地文件,但这时候需要去搭建一个网页,就需要动脑筋去想怎么写网页(学习html css js),怎么访问网页(简单了解一下网页是怎么被通过端口访问的),登录注册发送的请求的数据在哪处理(了解post get请求的发送和处理),这时候就会有基础的前后台概念了(我第一次后端是php写的按照教程来的,虽然代码没太懂,但流程就有个大概印象了),前台是页面,后台是处理前台提交请求的地方,这时候后端需要存数据就需要数据库,如果数据可以存数据库,这时候这个登录注册的网页就可以简单投入使用了。
  • 购买一台服务器,搭建个人博客。这个阶段可以学习linux服务器基本命令,同时折腾博客可以提高兴趣,进阶的可以买域名让你的博客更容易访问,使用nginx让你网站可以不需要通过端口号访问(默认80),你可以在你服务器上搭建mysql云服务器,就不会局限于本地了。还能进行更多探索,如果是偏向硬件的同学还建议购买树莓派折腾一下,做一些更好玩的内容。
  • 开始学习游戏制作,unity,虚幻3.做游戏可以让你更熟悉面向对象的概念,同时了解多线程等
  • 尝试学习JavaWeb上线一个自己的项目。之前的博客可能都是有详细的教学,而这里可以试着自学写一个简单的登录注册的javaweb项目并且上线到服务器上(传jar包启动/tomcat跑war包服务)
  • 尝试写爬虫完成一些重复性工作。暂时没想到对八股文有啥帮助,哈哈

看到这里其实你已经对 八股文有了大概了解,上面的各种场景都会让你接触到八股文框架,也就是计算机知识框架,除了中间件,微服务,redis没接触,计算机网络、操作系统、算法、数据结构、mysql,javaweb都已经被你简单探索过一遍了,这时候也应该有一个简单的知识库记录了你学习过程中的问题和理解,也对后面的深层次学习提供了基础。

② 基于八股文网站去学

在大二暑假前都可以在①阶段探索,构建自己的知识库体系,到了大二暑假肯定对很多知识都是一知半解的,这时候可以开始去看看别人的八股文网站了,看看我上面学习的计算机网络、操作系统、算法、数据结构、mysql,javaweb哪些内容是后面的重要。

③ 基于系统教程学习

系统学的方法就看经典书籍 + 看别人的成套视频

众所周知面试的八股文之分为 计网+操作系统和数据库和其它, 计算机网络和操作系统的理解至关重要。前面还要提一下这里建议的系统学是基于之前你的知识库去补充完善,而不是400多页的黑皮书/20多个小时的视频一字不差一秒不落的看完。如果之前看了别人的八股文网站会发现计算机网络重点就上面几层,重点就TCP、http这几处,所以应该把系统学放在更清楚的去搞懂TCP和HTTP,而不是把时间花在数据链路层,物理层。

计算机网络+操作系统:这两个是面试必备,也算基础,如果想和面试官来回拉扯,不好好准备还真不行,这里推荐 小林CODING的两本图解电子书《图解计算机网络》《图解操作系统》,这两本适合时间适中的同学。如果时间十分充足,可以考虑去看基本经典的书籍,我没看所以就没推荐,hh。

Mysql和Redis:我是看了极客时间的Mysql实战45讲,第一遍看完看的很迷糊,大概是对[索引、sql执行过程更清楚一点了],但后面随着长时间看其他文章又回头看,最后就对 索引、锁、隔离级别、事务、MVCC都有一个很清楚的认识了,每个点也都能讲,这些也是面试高频问题;其次是Redis,要去系统的学习搞清楚为什么快?Redis底层结构,redis 5种数据结构和场景就差不多了。

其它:其他要学的就很广泛了(SpringBoot、Java多线程,JUC,分布式,JVM,IO,netty等等),学不完怎么办?有个技巧,就是选你喜欢的学,然后再简历上重点写你会这个。比如我对Java多线程,JVM有兴趣。我就去慕课看了几个很高质量的 JAVA多线程JVM课程,彻底搞清楚JVM以及Java多线程问题,然后可以应对很多问题,比如面试官说你说说你技术方面哪块学的好(不指计算机网络+操作系统知识方面),你就可以讲你系统准备的这个(解答文章开头那个问题)。

④ 基于简历高质量文章学习

到这里差不多已经可以开始约面试了。首先你肯定要基于你的八股文知识库制作一份简历。下面简单举个例子。(尽量把你会的写前面,然后内容描述专业一点,可以参考下面)

这个阶段你的八股文知识库体系已经通过三轮学习慢慢维护的很细致了,这时候需要做的就是借鉴一些高质量文章,去修正你知识库的内容,面试前可以对照你的简历逐个去看关键词对应的一些文章。

像很多常见的问题,TCP三次握手等就去掘金或者公众号找高质量文章看一遍就行啦,然后把别人细致的地方补全你知识库,你表达不通畅的地方就借鉴看看他们怎么写的和描述的。

像操作系统有个问题 进程和线程 有什么区别,你知道大概个区别,但又不好怎么系统的描述,你去找一篇文章,你会发现写了一大堆,但还是没能抓住点去描述,导致你只能提取出 进程是资源分配的单位,线程是CPU调度的单位。然后面试问这个,你就只答这个,面试官就会不满意了,会感觉你跟个机器人一样,你借鉴别人的描述虽然能让你表达的更规范,但在面试官前面你简短的回答就是没思考死记硬背的体现。

所以应该怎么借用高质量文章去优化你的知识库和八股文表达呢,答案是看逻辑,比如我就会这样,先讲一下为什么要细分进程,然后讲一下一个程序运行是进程,一个进程为了更细致的工作就创建线程,然后下面是我的笔记,分点作答,分点就是参考的别人高质量文章,他一篇文章1000字,我就提炼出点来,而不是只记得 进程是资源分配的单位,线程是CPU调度的单位

总的来说我的所有经验就在上面了,大概总结下的话就是循序渐进,慢慢维护自己的知识库,一定要自己总结自己用,参考别人的持续更新完善自己知识库,最后就能灵活轻松应对面试官的提问啦。

经验分享 | 我的八股文学习路线及攻略_第3张图片

最后

感谢阅读,更多的java课程学习路线,笔记,面试等架构资料,私信我【资料】即可获取免费资料!

经验分享 | 我的八股文学习路线及攻略_第4张图片

你可能感兴趣的