差点去阿里了...... | 附 Java 学习路线
大家好,我是小北。
还记得之前我写的 吗,这个路线图在全网已经有10w+ 读者看过了,很多读者看过这个路线找到了学习方向。
我大学最初其实学的是 Java 路线,一直瞄着阿里去的,后来才中途转学 C++。
当初找实习也是面了阿里,几轮面试都过了,最后死在了 HR 手上,当然,也感谢这位 HR ,不然我现在可能还在杭州呢哈哈。
也就没有今天的编程指北了。
不过说实话,现在学 C++ 的相对 Java 来说少很多,很多学 Java 的读者也一直在催我出 Java 版。
今天更是在知乎立下了 flag:
所以这周唯一一天的休息日,就贡献给了 《史上最新 Java 版校招学习路线》,我们先看下思维导图吧:
校招的话,其实关注「Java校招」那下面就好了,其它只是整个 Java 后端的全景图。
说实话,其实想偷懒的,直接在 C++ 版本的基础上把 Java基础、JVM、Java Web 这些补充上就好了,因为CS基础知识都是共通的。
但是呢,我是贴心北,为了更好的帮助到学 Java 的同学们,还是根据 Java开发岗的要求对类似 Linux 编程、网络编程等重要性进行了调整。
先说一下,我预期中,按照这个路线学个六七成,大概需要多长时间:
-
如果你是非科班,比如传统工科,大学学过点 C 编程,其余完全不具备,那么可能需要 8 个月 - 1年 以上。
学习效率高、比较拼的可能五六个月也行(每天高强度学习十几个小时)。
-
如果你有其它语言基础、也学过操作系统、计算机网络这些 CS 必修课,那么只需要再强化突击刷题 + 系统化梳理下面试题 + 学习 Java,这个过程 6 个月足够,3个月勉强。
-
如果你本身是学 Java 的,做过项目,也学过 CS 基础课,我觉得你强化突击 1 个月就足够去面试了,主要是看一些高频面试八股文和刷 LeetCode。
当然,这些都是时间都是因人而异的,我只是给出一个我觉得合理的大概时间作为参考。
一、Java基础
第一要学的就是 Java 基础,也就是 Java SE,如果有 C 语言基础,1 个月应该很充分。
如果有 C++ 基础我估计两周就足够了?
因为实际上,把语言拆解为「语法特性的组合」,那么 Java 相对于 C 多了 面向对象、接口、异常这些东西,而 C++ 则几乎除了反射、注解不支持以外,其它都是 Java 的超集。
所以实际上对于学过 C++ 的同学,学 Java 就是换关键字,没有新的语言特性学习负担,所以我说会很快。
那么 Java SE都有哪些呢:
-
基础语法:if、else、函数 这些 -
面向对象:继承、多态 -
接口 -
异常 -
泛型 -
反射 -
注解 -
I/O:文件、网络编程
Java SE 我推荐看视频学习,不要一上来就去看书,我当时大一看的是《尚学堂高琪Java300集》,不知道多少人看过这个版本,我真觉得讲得很好。
当然,现在也可以去找一些最新出的类似视频,我就不推荐了。
看完视频,写一点单机小项目,比如我当时写的五指棋、聊天室、HTTP Server,一般这个视频里面也是有一些小项目的。
看书的话,推荐《Java核心技术 卷1》
二、Java Web
我当时是从 Java Web的基石,JSP、Servlet 开始学的,但是说实话,这两个技术确实非常老旧的。
但是我还是觉得值得学下,毕竟后来的 Spring MVC 这些东西都是为了解决 JSP、Servlet 这些在开发效率上的问题。
比如 Spring MVC 中的 DispatcherServlet 会拦截所有的请求,负责去查找有没有合适的处理器,一个前端控制器就可以,就不用去每个 Servlet 都去web.xml配置。
可以看下《Head First Servlets and JSP》这本书,虽然里面很多技术过时了,但是有时间还是可以挑一些感兴趣的章节,了解下 Java Web 的技术演变
对于 Java Web 使用类的学习都是到how2j.cn
这个网站:
基本上包含了 Java 学习的方方面面。
学 Java Web 是为了啥?
当然是 CRUD 啊,所以还需要学习数据库知识,这个时候会安装 MySQL,会用 JDBC 进行增删查改就可以了。
大概路线就是:
Servlet、Tomcat -> JDBC - > HTTP 协议-> Spring MVC -> Spring 全家桶。
完成这部分学习后,可以完整的做一个 CRUD MIS 系统,然后去整个云服务器,部署到云上。
然后让你同学都来用用哈哈哈,相信你一定会体验到 CRUD Boy 的乐趣。
基本上就算体验了完整的 Java Web 开发流程,当然,这是野路子开发流程。
三、Java深入
上面的 Java 基础和 Java Web 是实际编程中常用的东西,而这块就是面试常问的。
包括 JVM、多线程、锁。
这块主要包含以下内容:
-
类加载机制、字节码执行机制、JVM内存模型 -
GC算法 -
线程池、锁、原子类、JUC包
这里就不展开讲了,基本上就是看书为主,看博客补充。
书推荐《深入理解Java虚拟机》、《Java并发编程艺术》、《Java并发编程实战》
四、操作系统
这里其实和 C++ 的学习路劲是一致的,我就直接复制过来了。
操作系统这门课,我的感觉是易学难精,但是掌握到日常编程和面试够用还是比较容易的。
那么毕业生或者说你去准备校招面试应该达到怎样的水平:
-
OS 四大模块的理论知识: 进程与线程管理、内存管理、IO与文件系统、设备管理 -
了解 Linux 内核部分实现原理,如内存管理、进程管理、虚拟文件系统等
其中内存、进程、IO 是重点,这几块也是和编程关系最密切的,这里推荐先挑本偏理论的书看看,了解操作系统的全貌:
-
《现代操作系统》 -
《操作系统—精髓与设计原理》
不必全看,两者任选一本都不错,我自己是仔细看了第二本,因为是我们教材,同时挑着看了现代操作系统部分章节。
这部分看完你应该对下面这些话题有一个清晰认知了:
-
操作系统由哪些构成 -
进程的状态、切换、调度 -
进程间通信方式(共享内存、管道、消息) -
进程和线程的区别 -
线程的实现方式(一对一、多对一等) -
互斥与同步(信号量、管程、锁) -
死锁检测与避免 -
并发经典的问题:读者写者、哲学家就餐问题 -
为什么需要虚拟内存,MMU 具体如何做地址转换的 -
内存为什么分段、分页 -
页面置换算法 -
文件系统是如何组织的 -
虚拟文件系统(VFS)是如何抽象的 -
...
操作系统,最好的实践就是看下 Linux 内核是怎么实现的,当然不是叫你直接去啃 Linux 源码,那不是一般人能掌握的。
最好的方式是看书,书的脉络给你理得很清晰。
书籍推荐:
-
《Linux内核设计与实现》
这本书恰到好处,即讲清楚了内核实现的要点,又不会通篇源码。
这些章节属于操作系统核心部分,其它如中断处理、块 IO、设备管理根据你自己兴趣选择看下就可以了。
基本上做到这里,操作系统就没什么大问题了。
五、计算机网络
(⊙o⊙)… 不好意思,这里还是参考 C++ 版本的学习路线,因为基础课都是通用的:
另外新增一个总结吧,网络协议重点学习 TCP,TCP 除了看《自顶向下》这本书的传输层那一章以外,还可以去看部分《TCP/IP卷一》部分章节,因为这里面会对类似拥塞控制、慢启动、滑动窗口等进行非常详细的讲解。
视频的话推荐哈工大的《计算机网络》。
需要掌握的网络协议和知识:
-
HTTP、TCP、IP、ICMP、UDP、DNS、ARP -
IP地址、MAC地址、OSI七层模型(或者 TCP/IP 五层模型) -
HTTPS安全相关的:数字签名、数字证书、TLS -
常见网络攻击:局域网ARP泛洪、DDoS、TCP SYN Flood、XSS等
计网知识比较繁杂,很多同学都反映网络很难学,一大堆的网络协议,依次学完后,还是不知道网络是怎么构成的。
这就是没有用对学习方法,导致只见树木,不见森林。
学习时,推荐你抓住一条主线 「一个数据包是如何发送出去的?」
带着这个问题依次去学应用层、传输层、网络层、链路层,思考这些层之间是如何串联起来的。
这就是自顶向下的思路,那自然要推荐:
-
《计算机网络:自顶向下方法》
这本书从我们最常接触的 HTTP、FTP、SMTP 等应用层协议讲起,可以清晰看到引入各个层的作用。
比如为了区分同一个主机的不用应用,引入了传输层,并使用不用的端口号作为区别;
层层递进,逐层揭开网络,非常推荐!
还有一本书:
-
《网络是怎样连接的》
非常浅显易懂的描述了「一个数据包是如何发送出去的」,也不费时间,看惯了机工社的大黑书,看这种反而有种看小人书的感觉,有基础的话,一天左右就过完了。
只有把握住了整个网络脉络主线才不至于被纷繁复杂的网络协议所搞晕,剩下的就是不断的细化,填充这些主干上的细枝末节。
那么有哪些细节可以去填充呢?
还有最重要的 TCP 协议,TCP 也是面试和计网中最重要的概念:
-
三次握手、四次挥手 -
状态转换 -
TCP 状态中 TIME_WAIT -
拥塞控制 -
快速重传、慢启动等
这么多东西肯定需要背,但不要死记,最好带着问题去思考为什么要这样做。
这里列几个问题:
-
TCP 如何实现可靠传输的(画外音:如何基于 UDP 实现可靠传输
-
TCP 连接建立为什么不是两次握手(画外音:三次握手的充分必要性说明
-
TIME_WAIT 的存在解决了什么问题,等待时间为什么是 2 MSL
整个 TCP 的核心就是围绕着 可靠传输 + 高效传输(流量控制和窗口管理)
由于 TCP 的细节实在太多,自顶向下那本书有点不太够,所以你需要去看看:
-
《TCP/IP详解卷1:协议》
这本书不要从头看,而是挑出其中涉及到 TCP 的章节
到这里,对于整个网络以及 TCP 都应该有了一个全面而细致的认识。
但是计网中还是有一些有意思的问题,如果你没思考过,也许回答不出来。
比如:
-
为什么有了 MAC 地址还要 IP 地址,IP 地址和 MAC 地址的区别是什么? -
如何理解广播域和冲突域? -
路由器和交换机有什么区别? -
TCP 连接的本质是什么,真的是“链接”吗?(曾经被问过:Java socket 创建的 TCP 连接,对于主机挂了和 JVM 挂了有什么区别?
这些问题只有当你真正理解了才能回答出,仅仅记住协议的话,估计很难应对灵活的面试题。
此外,网络部分还需要准备 HTTP、HTTPS,推荐:
-
《图解HTTP》
最后别忘了自己回答一遍那被问烂了、写烂了的问题:
-
从 URL 输入到页面展现到底发生什么
越细越好,五百字以上吧,哈哈哈
六、网络编程
(⊙o⊙)… 这里还是会参考那个 C++ 学习路线里的,只不过 C++ 和 Java 的侧重点不同。
比如 C++ 没有一个统一的网络库,基本都是裸写 socket,但是 Java 本身的网络 API 封装得已经很好了,再加上有 netty 这种一统江湖的库。
学习路径也很清晰。
Socket API + 多线程 + 网络模型/IO模型 + IO复用
简单学下 Socket API,然后就是学习 Reactor、Proactor 模式,理解下为什么需要这个,适用什么场景就好了。
能自己写一个最好,不想写,可以直接去学习 Netty。
其实网络编程的重点不是在 socket 本身,而是线程模型 + IO模型,所以本质上还是要回到多线程。
网络编程核心的一些点:
-
进程间通信方式:信号量、管道、共享内存、socket 等
-
多线程编程:互斥锁、条件变量、读写锁、线程池等
-
五大 IO 模型:同步、异步、阻塞、非阻塞、信号驱动
-
高性能 IO 两种模式:Reactor 和 Proactor( 但是 Linux 下由于缺少异步 IO 支持,基本没有 Proactor
-
IO 复用机制:epoll、select、poll(破解 C10K 问题的利器)
不过实际工作中,除了做 Infra 开发,很少会涉及网络编程的,现在几乎都是做 Web 开发,各种框架已经帮我们做了协议解析、网络数据传输、解封包这些底层操作。
比如 SpringBoot 这种保姆级框架,基本上属于将一个框架能干的事都干完了,以至于我们开发业务只需要定义接收和返回包的数据格式,然后做逻辑处理就完了。
像序列化、解封包、IO 处理这种网络编程必备的脏活业务开发根本不会接触到。
但是网络编程技能还是很重要的,学完了,可以去写一些网络应用,比如 P2P 下载,仿QQ聊天室、文件传输等。
现在有点晚了,干脆就不写了,分两期发吧。
....... 未完待续。
另外说下,上面提到的这些书,不是说要全看,而是说你需要学这块知识,可以参考的优秀书籍有哪些。
这篇文章在看如果能超过 100 个,我就赶紧赶出思维导图剩下的部分!
大家周末愉快,我们下期见!