我先大致说一下需要学习的点,然后下面有归类了学习的顺序,大家先通读一遍,之后在自己规划下属于你自己的学习顺序。
一、Java 技术栈的学习
1、Java 基础入门
一开始肯定要了解一波 Java 语言的特性,很多人都关心一开始看什么资料,其实我不推荐入门阶段看的太多太杂,因为你不知道哪些是有用的,哪些是过时的,或者在目前阶段用不到的。
对于初学者尤其是没有一点编程基础的人来说,要渡过这个从零到一的过程,往其实是非常艰难的,挫败感会非常强,所以找到一份合适的资料,还是挺有必要。
下面这些学习资料都是我曾经读过或者看过的,没看过的我也不会介绍。还是那句话,资料和视频都是辅助,顶多领你入门,剩下的还是靠自己。
学习思路:首先 Java 基础没啥好说的,随便找个视频快速看就可以了,我推荐上学堂Java高琪第一季;不过我当时的看了第一季和第二季,这里其实也建议看到第二季,也就看到 242 集,然后 第一季在 147 ~161 集是一个小项目,这个项目不想做可以不用做,我当时没做,或者你想看书也可以看书,就看《Java核心卷1》吧。
看完基础的可以看《Java编程思想》,这本书也很好,解决了我很多疑惑,不过有点难度,我是选择性看的,具体这本书如何读 + 重点章节,说明:Java编程思想怎么读+重点章节
2、Java 进阶
想要靠 Java 来吃饭,单单靠看书刷视频肯定是不够的,咱们还得深入学习一波 Java 语言的特性,为了让大家学起来更加有针对性,我总结了如下核心知识:
集合模块(超重点):主要是包括各种常用集合:例如 Set(包括HashSet,TreeSet), Map(包括 HashMap,HashTable),List(包括ArrayList,LinkedList)等等,最核心的就是 hashMap,concurrenthashMap,ArrayList,LinkedLis 这几个,这几个源码必须看,,这部分,主要是看文章 + 自己看 JDK 源码学习。
多线程(超重点):synchronize,volatile,这两个优先学,比较简单,之后学习线程池,并发包(如lock等等),有点难度,推荐看《Java 并发编程艺术》+《Java并发编程实战》,这两本就够了,《Java并发编程艺术》感觉得看三四遍才行,第一遍看了就忘光了,第二遍会有其他的收获,第三遍就可以吊打面试官了,这本书重点章节 + 如何阅读星球有写了:《Java并发编程艺术》如何阅读+重点章节
各种文件流(不怎么重点):file,inputStream,outputStream等等,反正就是各种文件流,看书时你们自然会看到,这部分必须多实践,只有时间,才能真的理解不详细介绍。
虚拟机(超重点):虚拟机是必须学习的了,重点是GC部分,推荐看《深入理解Java虚拟机:JVM 高级特性与最佳实践》,一本就差不多够了,多看四五遍就行了,这本书如何阅读也已经写了:《深入理解Java 虚拟机》阅读及其重点章节指南
其他:还有很多,如反射,注解,异常等。反射要了解他的一些应用,异常也挺重要,注解就一般般。
3、JavaWeb 入门
学了上面那么多,啥程序、网站也没写出来,有点难受?没事,这个时候,我们就要开始撸网站了,如果是以 Java 作为开发语言的,那么 JavaWeb 是必须学的了。这个时候你可以入门学习下这些(注意,不用深入,快速找个视频入门就可以了)
我下面列举一下 Javaweb 都是指哪些知识:
1、mysql、html+css+js 、 tomcat、xml等。推荐看视频,自己去B站搜索 JavaWeb的视频,那么哪里不会补哪里,这些知识,几个小时就可以入门一门的了。至于 msyql,入门推荐看《mysql不知必会》,之后可以看书或者看视频,具体视频这里暂时没有推荐。
2、servlet+jsp 系列。
不建议直接学习框架,也是应该先学习 servlet,这些底层才是最重要滴。servlet可以跟着视频学,至于 jsp 其实很少用了,不过还是可以了解一下。
4、框架的学习框
Servlet 写太麻烦了,只有认真学过 servlet 的人才能吹框架的好处,所以必须先学 servlet 再来学习框架,主要有三大框架:Spring + SpringMVC + Mybatis。
其实 SpringMVC 也是属于 Spring 吧,MVC 只是一种思想,这里学习顺序是先建议学习 Spring,直接看视频入门学习就可以了,后面再买书,掌握到什么程度?最后是要能知道一些原理,例如IOC,AOP的原理,使用了什么设计模式等等。
SSM 的视频可以在 B 站找,学完就找个练手的项目,或者你不想练手 ssm 也可以了,问题不大。
不过现在搭 ssm 太麻烦,基本都是用 SpringBoot 了,所以 SpringBoot 也必须,可以学完 SSM,目再学 SpringBoot,之后得做一些 springboot 的项目。
5、中间件的学习
必须学的中间件:redis,Redis 基本面试必问,工作也基本的都会使用到,所以必须掌握,推荐书籍《Redis 设计与实现》、《Redis开发与运维》。两本书刷完,就差不多了,或者说时间不是特别多的,刷完《Redis开发与运维》也行,这本书的重点内容我写过:
其他的话,像消息队列啊,分布式等相关框架,有时间也可以学习一波,项目用到在学吧
6、2个完整的项目
把上面的 Java 基础以及框架学了,就要做个完整的项目了,我只能说,项目非常非常重要,因为面试的过程,一定会问项目,而且必须是你自己亲自做过的项目,假如你只是看视频,没有动手实践,很容易就会被问懵。所以一定一定一定要亲自动手做一个项目。
而且在未来,项目会被越来越看重,实践能力也会越来越看重,至于项目怎么找?这个大家可以花点钱买,或者找一找盗版也行,至于 B 站上的项目,很多适合练手,一般质量都比较一般吧。
技术栈的话,个人是推荐 Springboot + redis + mq,或者也可以自己造个轮子,比如RPC,比如实现一个文件系统,或者实现一个关系型数据库等,这些都是不错的项目,另外如何做了很多人都做过的项目,建议一定要改个名字 + 自己加一些东西上去。
二、数据结构与算法的学习
大学第一学期你入门了某种语言之后,就要开始学习数据结构与算法。当然,不一定是第一学期,对于非科班的也一样,也是建议这个学习顺序。当然,你有自己的目标,完全可以按照自己的来。
我的文章是主写数据结构与算法的,我秋招也是靠着这个优势拿到 offer 的,所以我认为数据结构与算法是非常非常重要的,可能你会听到工作都基本没用到这些知识啊,或者库函数都帮我们封装好了啊,我们干嘛要学。
如果你这样想的,那你就错了。对于想要找工作的来说,这方面的知识是必考的,所以你得学;对于已经工作的来说,这方面的知识,可以让你学习到很多设计思想,所谓 数据结构 + 算法 = 程序,而且你学了这个,你会发现学习其他知识,上手的特别快。综上,数据结构与算法必学。
好吧,上面扯了这么多,就是告诉你,数据结构与算法的重要性,好了,下面我介绍下入门数据结构必学的有哪些,不过你跟着书本的学习顺序来就是了。
1、基础数据结构的学习
1、时间复杂度、空间复杂度
2、链表、队列、栈
3、树(二叉树,查找二叉树、AVL树,红黑树等)
4、图(图有好多种算法,深度/广度搜索,最短路径、最小生存树等)
如果你是科班的,那么这些我觉得你大一第二学期都学完是最好的了,没学完也问题不大,有些人可能是先教《离散数学》这本课,为数据结构与算法做铺垫。
书籍推荐:《大话数据结构》、《数据结构与算法分析:C语言描述版》,学哪一本?都可以,问题不大,我当时学的是第二本。大家记得根据自己的语言去学,我上面列举的,都是用 c 语言来实现的,这里我也写过如何阅读:《数据结构与算法分析–xx语言描述版》怎么读+重点章节
2、算法的学习
在大一大二,真心建议你们把算法基本功打好,后面就真的没啥时间刷题之类的了,因为无论你以后要学习哪个方向的,算法都是实用的,会一些算法,说话也都自信了。算法的学习,刷题是必须的了,但不建议盲目刷题,而是先学习一些算法思想,在找对应的题刷,要学的主要有:
1、十大排序算法
2、递归、贪心、回溯、动态规划、枚举等
推荐书籍:《阿哈算法》、《算法设计与分析基础》适合入门;《算法第四版》、《算法导论》、《编程之美》适合进阶
视频:这种还是挺建议看书,我没看过视频,,这里就不介绍了。
3、保持算法的学习
算法的学习,真的是靠积累的,而刷题是必须的。而且学校都会举办一些比赛,这里还是比较建议大家去参见的,这样也能让你更加有激情着去学习。当然,每年都会有很多 ACM 编程大赛,要不要参加呢?这个看你了,也不是说参加就一定好,看你自己吧,具体可以参考我之前一篇文章说的:我是继续打 acm 还是把精力花到学习其他技能去?
大家可以在 leetcode 长期保持刷题,一天一两道,或者一个星期三四道都行。
另外,如果时间不多的,那就把《剑指offer》刷个一两遍就行了。
三、计算机基础的学习
看过我文章的都知道,我一直强大计算机基础的重要性,所以这里必须列举要学的有哪些。刚才说了选择一门语言深入,你在深入学习的过程中,肯定也在学习学校开设的专业课,包括:计算机网络 + 操作系统 + 数据库 + 汇编 + 计算机组成原理 + 编译原理 等等。
其实给他们排优先级是不大好的,这样给他们排,感觉容易被大佬喷,不过没办法,对于小白来说,我还是想排以下顺序
1、计算机网络 + 操作系统
2、数据库 + 计算机组成原理(数据库相应你们可能已经先学过 MySQL 了)
3、汇编 + 编译原理
不过呢,比较重要的是计算机网络 + 操作系统 + 数据库,这三门我单独拿出来说一下重点吧。
四、计算机网络
无论你是从事啥岗位,无论是校招还是社招,计算机网络基本都会问,特特是腾讯,字节,shopee,小米等这些非 Java 系的公司,问的更多。这块认真学,一个半月就可以搞定了。
计算机网络就是一堆协议的构成,下面是一些比较重要的知识点,学的时候可以重点关注下。
物理层、链路层:
- MTU,MAC地址,以太网协议。
- 广播与 ARP 协议
网络层
- ip 地址分类
- IP 地址与 MAC 地址区别
- 子网划分,子网掩码
- ICMP 协议及其应用
- 路由寻址
- 局域网,广域网区别
传输层(主要就是 TCP)
- TCP首部报文格式(SYN、ACK、FIN、RST必须知道)
- TCP滑动窗口原理,TCP 超时重传时间选择
- TCP 拥塞控制,TCP 流量控制
- TCP 三次握手与四次挥手以及状态码的变化
- TCP连接释放中TIME_WAIT状态的作用
- SYN 泛洪攻击
- TCP 粘包,心跳包
- UDP 如何实现可靠传输
- UDP 与 TCP 的区别
- UDP 以及 TCP 的应用场景
应用层
- DNS 原理以及应用
- HTTP 报文格式,HTTP1.0、HTTP1.1、HTTP2.0 之间的区别
- HTTP 请求方法的区别:GET、HEAD、POST、PUT、DELETE
- HTTP 状态码
- HTTP 与 HTTPS 的区别
- 数字证书,对称加密与非对称加密
- cookie与session区别
- 输入一个URL到显示页面的流程(越详细越好,搞明白这个,网络这块就差不多了)
书籍推荐:零基础可以先找个视频看看,然后有了一定基础可以看《计算机网网络:自顶向下》这本书,这本书建议看两遍以及以上,还有时间的可以看《TCP/IP详解卷1:协议》。
五、操作系统
操作系统和计算机网络差不多,不过计算机网络会问的多一些,操作系统会少一些,总结起来大致:
1、进程与线程区别
2、线程同步的方式:互斥锁、自旋锁、读写锁、条件变量
3、互斥锁与自旋锁的底层区别
4、孤儿进程与僵尸进程
5、死锁及避免
6、多线程与多进程比较
7、进程间通信:PIPE、FIFO、消息队列、信号量、共享内存、socket
8、管道与消息队列对比
9、fork进程的底层:读时共享,写时复制
10、线程上下文切换的流程
11、进程上下文切换的流程
12、进程的调度算法
13、阻塞IO与非阻塞IO
14、同步与异步的概念
15、静态链接与动态链接的过程
16、虚拟内存概念(非常重要)
17、MMU地址翻译的具体流程
18、缺页处理过程
19、缺页置换算法:最久未使用算法、先进先出算法、最佳置换算法
书籍推荐:《现代操作系统》
六、MySQL
数据库一般主流的有 MySQL 和 Oracle,不过建议大家学习 MySQL 了,因为大部分公司都是使用 MySQL,也是属于面试必问,而且工作中 MySQL 也是接触的最多的,毕竟工作 crud 才是常态。
下面这些是我认为比较重要的知识点:
1、一条 sql 语句是如何执行的?也就是说,从客户端执行了一条 sql 命令,服务端会进行哪些处理?(例如验证身份,是否启用缓存啥的)。
2、索引相关:索引是如何实现的?多种引擎的实现区别?聚族索引,非聚族索引,二级索引,唯一索引、最左匹配原则等等(非常重要)。
3、事务相关:例如事务的隔离是如何实现的?事务是如何保证原子性?不同的事务看到的数据怎么就不一样了?难道每个事务都拷贝一份视图?MVCC 的实现原理(重要)等等。
4、各种锁相关:例如表锁,行锁,间隙锁,共享锁,排他锁。这些锁的出现主要是用来解决哪些问题?(重要)
5、日志相关:redolog,binlog,undolog,这些日志的实现原理,为了解决怎么问题?日志也是非常重要的吧,面试也问的挺多。
6、数据库的主从备份、如何保证数据不丢失、如何保证高可用等等。
7、一些故障排查的命令,例如慢查询,sql 的执行计划,索引统计的刷新等等。
对于 2-4 这四个相关知识,面试被问到的频率是最高的,有时候面试会让你说一说索引,如果你知道的多的话就可以疯狂扯一波了,具体可以看我写的 MySQL 学习路线:肝完了,我的 MySQL 学习之路
七、Linux 补充(选学)
八股文大家基本都知道是啥,不过很多人都没有把 Linux 写上去,其实 Linux 的范围很大,例如 Linux 内核啊,Linux 网络编程等等。
这种不同的岗位可能需要掌握的要求不同,所以我也不讲这些,今天主要帮大家捋一捋 「Linux 基础」这块,就是面试中有可能会问到的,这块需要准备的还是比较少的,下面做一些汇总,方便帅友们到时候可以更加有针对性去复习。
另外,基础操作命令我就不说了,就说一些需要注意的点
基础
1、文件系统:主要就是要了解下 inode,block,superblock,block bitmap 这些关键词的含义。
2、目录的大致含义:例如像 proc 这个目录就放一些进程相关的信息,默认软件安装在 usr 目录等等,这其实是一种规范,这个要大致了解下。
3、文件一些属性:例如有些文件可读,可写,可执行,对应 rwx 权限这些, 通过 d 可以知道这个一个目录等等。
4、软连接与硬链接
5、VIM 的几种模式区别了解一一下
进程与内存等(这块是重点)
1、几个进程命令:ps,top,pstree,netstat,这几个进程要自己用一用,工作后经常用到的,重点学习了解下。
2、Linux 进程的一些状态,记得好几种:R,D,S,Z,T 这五种,要了解下。
3、孤儿进程,僵尸进程 要知道(重要),然后还得知道如何解决这种情况,例如出现大量僵尸进程怎么办
4、中断相关:软中断啊,不可中断状态啊
5、内存中的 Cache 和 buffer 的区别
6、了解 Swap 区
7、SiGCHLD 信号,waitpid() 和 wait() 函数
几种重要的 IO 模型
1、同步,异步。
2、阻塞与非阻塞
3、select,epoll
4、NOI与IO
一些命令
如果可以,find,grep 这几个搜索相关的命令学下,因为项目会打印日志,我们需要捞日志来分析,就会经常用到 find,grep 这些,到时候面试官问到你也可以说。
项目故障排查
这块其实就是和实际工作比较靠近,做项目有时候会用到啥的,上面的优先学的,有空了再学一学这些
1、通过工具来追踪进程的栈轨迹,就是分析异常的原因,例如用 top 和 jstakc 来定位
2、掌握一些分析进程 IO,CUP,内存的工具,例如 pidstat
3、用 jsp,jstack 来分析死锁原因,一般就是通过栈信息来查看。
学习资料指导
有时间 + 零基础的,就看下《鸟哥Linux私房菜》这本书吧,讲的很细,可以看下,跟着做实验,容易做的实验可以跟着做,麻烦的就不需要了,看前面基础的部分就行,后面的可以不看了。
但是呢,这本书只是入门,其实很多没讲的,例如 select,epoll,僵尸进程啥的啊,这种一般,你们哪个不同就看找对应的文章就行,通过文字来逐个了解突破哦。
暂时先说这么多,后面再慢慢补充了,我说的这些都是我自己当时学过的,可能不是那么全,但是核心的基本都说了。
八、学习的顺序
对于Java,算法,计算机基础的学习顺序,假如你时间多,例如你大一或者大二,那么我觉得可以按照这个学习顺序:
1、先选一门语言入门,例如 C 语言或者 Java
2、之后学习数据结构与算法
3、之后一边学习我上面说的 Java 技术栈,一边学习计算机基础,优先学操作系统+计算机网络+数据库
假如你很急,时间不多了,那么我建议你先说我上面说的 Java 相关的知识,然后做项目,之后再回过头来学习算法和基础知识。
九、总结
我觉得对于大学四年来学,上面这些是最核心的,也是必须学的。但是仅仅是上面这些还是不够的,上面的这些一两年就可以学完的。所以你还有很多其他时间,那么你可以学一些自己感兴趣的,多折腾,多抖鼓,而我上面学的,希望你都学。
最后,是希望各位还在校的学生,大一可以好好浪,但也要保持应有的学习时间,之后,就好好学习吧。不管你是名校还是非名校,我觉得你在只要这几年认真学,进大公司的几率,真的非常大,这绝对不是鸡汤。
评论(3)
打卡++
打卡
打卡