共计 4637 个字符,预计需要花费 12 分钟才能阅读完成。
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 内核设计与实现》
这本书恰到好处,即讲清楚了内核实现的要点,又不会通篇源码。
这本书重点关注「第 3 章过程治理」、「第 5 章零碎调用」、「第 12 章内存治理」、「第 13 章虚构文件系统」、「第 15 章过程地址空间」
这些章节属于操作系统外围局部,其它如中断解决、块 IO、设施治理依据你本人趣味抉择看下就能够了。
基本上做到这里,操作系统就没什么大问题了。
五、计算机网络
另外新增一个总结吧,网络协议重点学习 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 等应用层协定讲起,能够清晰看到引入各个层的作用。
比方为了辨别同一个主机的不必利用,引入了传输层,并应用不必的端口号作为区别;
为了在不同子网间传输数据引入了网络层,并应用 IP 地址寻址路由;
网络层解决了不同子网间路由的问题,然而同一个局域网内确定主机却是通过 MAC 地址,所以引入了链路层来承载 IP 数据包;
同时为了将 IP 地址和 MAC 地址做转换映射又产生了 ARP 协定。
层层递进,逐层揭开网络,十分举荐!
还有一本书:
《网络是怎么连贯的》
十分浅显易懂的形容了「一个数据包是如何发送进来的」,也不费时间,看惯了机工社的大黑书,看这种反而有种看小人书的感觉,有根底的话,一天左右就过完了。
只有把握住了整个网络脉络主线才不至于被纷繁复杂的网络协议所搞晕,剩下的就是一直的细化,填充这些骨干上的细枝末节。
那么有哪些细节能够去填充呢?
比方 ARP 工作过程、IP 地址、IP 分片、NAT(UDP 打洞)、链路层访问控制协定等等。
还有最重要的 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 聊天室、文件传输等。