本回答长达2万+字,而且非常硬核,建议大家可以点赞收藏防止迷路。

如果你的目标是通过自学Java并找到一份不错的工作,我的回答一定要认真看完,从入门到进阶的学习路线全都规划好了,可以先看目录。有需要Java课程及资料的可以私信博主免费领取噢

但是,有些话我得先说在前头:

 

1、打牢计算机基础!打牢计算机基础!打牢计算机基础!重要的事情说三遍!

基础非常重要,不管你以后从事什么方向应用开发也好,大数据开发也要,客户端工程师也好,要想吃得开必须依赖这些基础课程:操作系统、组成原理、计算机网络、数据结构、算法、数据库

2、初学编程,建议选择一门偏底层的语言,C或C++均可以,不建议一开始就学java或python。因为学底层语言可以亲密接触到诸如内存管理等特性,有助于理解计算机基础知识。等学会了底层语言,再去学上层的语言是非常快的。

3、自学=看书+视频+Google搜索+实战。

看书的优点:体系化,比较严谨,能够完善的学习一门技术。但是缺点也有,容易陷进去,略枯燥,需要聚焦重点。而且不要一开始就抱着大块头的书去啃,也不要从头到尾啃,要抓重点。一开始掌握最基本的知识就可以,然后就可以开始实践了。

看视频会更生动,便于知识的理解,但是也会养成惰性,让你觉得自己看完已经会了,所以一定要通过写代码来检验学习效果。

博客是程序员必不可少的学习资源,近些年高质量博客、文章也越来越多。这种博客文章阅读比较方便,内容选择也比较丰富,好的博客图文并茂生动形象非常有助于理解记忆,并且博客在代码拷贝学习方面更占优势。

看博客也有一些缺点:比如博客比较碎片化,体系不太完整。还有博客质量参差不齐差距较大,甚至有的博客还出现较大的错误,所以挑选好的博客是一大挑战。

最后的实战最重要!实战是解决学编程“一看就会,一写就废”的最佳路径。

一定要理论结合实践,不要只看书或者视频,一定要多动手看代码、写代码。

好啦,讲完这三大前提,如果你觉得认同的话就继续往下看我的Java学习路径。

先贴一张本人总结的Java技术栈脑图

目前Java在是后端开发使用最广泛的语言

 

很多互联网大厂如阿里巴巴、快手、拼多多、美团等都是使用Java作为主流开发语言。

而Java的生态也是非常成熟,如spring、Netty、dubbo、RocketMQ、ElasticSearch等框架。

Java技术栈说实在的知识点很多,绝不仅仅是学一门语言和一个数据库那么简单。

要让我们的程序运行在流量洪峰下还能保证结果正确,我们需要处理好 并发问题。
实际生产环境中我们的应用一定是 分布式的,我们还需要用到各种框架(rpc服务框架、消息中间件、除了关系型数据库还可能用到nosql、 newsql),还需要掌握分布式设计知识。
当程序遇到内存飙高的问题我们排查的时候需要 掌握JVM知识
在面对复杂业务场景为了写出优雅、可维护性强的代码我们需要掌握 设计模式以及DDD(领域驱动设计)。
部分大数据场景我们还需要用到 实时计算框架flink或spark

下面来详细分享一下Java的学习路径,要想打好扎实的基础,就按照这个路线来。

(一)计算机基础课程

这是我在所有回答里面都在反复强调的,学编程一定要打好计算机基础。

科班和非科班的差距,主要在于基本理论知识。如果你是非科班自学想要达到科班的水平,计算机基础知识一定要补上。

这些基础知识的重要性体现在多个方面:有需要Java课程及资料的可以私信博主免费领取噢

第一个,面试,大厂面试基本都要考基础知识,比如算法。
第二个,更高纬度去发现问题,更能发现问题的本质,更好的解决问题,学习技术也能站在很好的纬度,学习到本质。
第三个,要想接触更高领域的技术,基础知识是一把利剑。

一个合格的程序员,应该要知道计算机体系是如何一步步构建出来的,每一步的取舍是什么,内在的逻辑是什么。

所以科班和培训机构最大区别就在于:科班选手打下的基础会更好,更能理解计算机的深层逻辑,再学习Java、python、PHP Object-c这些语言的时候会更容易上手。

基本理论这个东西,对于入门和平均水平程序员来说,可能并不见得有多大用处。

但是如果迈向高端、深入,那么这些基本功就显得很重要了。

高手不一定出身科班,但没有相应的理论打底,他绝成不了高手!

基础课程推荐的视频课程和书籍有:

1、操作系统

①MIT6.268

课程官网:https://pdos.csail.mit.edu/6.828/2018/schedule.html

网友的一些homework实现:
https://github/SmallPond/MIT6.828_OS/tree/master/xv6-public

MIT6.828 是一门公认的硬核课程,一直以来都有很高的知名度,也广受好评,是理论与实践相结合的经典

建议是在上过学校的OS课,或者阅读过操作系统导论类再来学习这门课。最好在开始之前熟悉C和汇编,也对计算机组成有一定了解。

然后只要你跟着项目一步一步走,做完 6 个实验,就能实现一个简单的操作系统内核。

lab是这门课的重点:

  • Lab1: C, Assembly, Tools, and Bootstrapping. 熟悉课程使用的工具qemu,C语言,以及汇编。讲解了bootstrapping:从计算机从通电,到开始运行操作系统,这个过程中发生了什么。
  • Lab2: Memory management. 实现虚拟内存,分页机制。
  • Lab3: User-level Environments. 实现进程管理,中断机制(interrupt),系统调用(system call),缺页处理(page fault handling)等。
  • Lab4: Preemptive Multitasking. 实现多CPU的支持,Round-Robin进程调度,Copy-on-Write机制,抢占式多任务(preemptive multitasking), 进程间通信(IPC)。
  • Lab5: File system, spawn, and sh. 实现文件系统,完善sh。
  • Lab6: Networking. 实现网络功能。

②国内哈工大的操作系统实验课
https://github/hoverwinter/HIT-OSLab

2、计算机网络

推荐standford课程cs144结合书籍《计算机网络:自顶向下方法》

课程链接:

https://www.scs.stanford.edu/10au-cs144/

https://cs144.github.io/

书籍选择《计算机网络:自顶向下方法》,豆瓣评分9.3分

这位知乎大佬 @胡津铭 有一个专栏讲如何自己实现一个TCP,强烈推荐:
CS144: 什么,你学不会TCP?那就来自己写一个吧! - 知乎

如果想找一本简单的入门书籍,推荐《图解TCP/IP》。

实战的话推荐《Wireshark网络分析就这么简单》,可以亲手尝试抓包分析数据报文的信息。

3、数据库

① standford CS145/CS245/CS346逐步递进的学习

课程链接:
CS145:Introduction to Databases Course Information
https://cs145-fa20.github.io/
http://infolab.stanford.edu/~junyang/cs145/info.html

CS245:Principles of Data-Intensive Systems
https://web.stanford.edu/class/cs245/

CS346:Database System Implementation
https://web.stanford.edu/class/cs346/2015/

②伯克利的数据库导论有需要Java课程及资料的可以私信博主免费领取噢
https://www2.eecs.berkeley.edu/Courses/CS186/

③CMU的数据库系统

数据库系统设计域实现,涵盖数据模型、存储模型、查询语言、存储架构、事务处理、恢复、并发架构等等,并结合开源和商业数据库给出案例讲解。
https://15445.courses.cs.cmu.edu/fall2020/

④书籍推荐《数据库系统概念》

4、数据结构与算法设计

①MIT 6.006 Introduction to Algorithms

MIT 6.006 是经典的数据结构和算法入门课程,涉及到排序、哈希、图论、动态规划。Lecture非常翔实,伪代码可读性强,在辅以专门的practice,用py实现的。

课程链接:
https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/

②书籍推荐《算法》,豆瓣评分9.4分。

内容全,源码示例多。

比如普林斯顿大学教材使用的就是这本书,然后有配套的教程网站,上面有很多文档和demo:
https://algs4.cs.princeton.edu/lectures/

视频:
https://www.youtube/watch?v=1QZDe28peZk&list=PLRdD1c6QbAqJn0606RlOR6T3yUqFWKwmX

建议通过可视化的方式学习算法和数据结构,能很容易看出其基本原理、各种操作是怎么实现的。

这里推荐几个非常棒的数据结构可视化网站:

(1)visualgo

https://visualgo/zh

涵盖了主流的数据结构,可视化展示,支持对其进行各种操作,以及提供了很多示例。

如二叉树,我们对其插入一个节点71,会自动进行匹配,将节点插入到正确的地方

(2)Data Structure Visualizations

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

同样是涵盖了主流数据结构和算法,提供动态演示功能。

国外大学是怎么学习计算机组成原理的-
国外的计算机专业 是如何教《计算机组成原理》这门课的? - 知乎

http://www.cs.cmu.edu/~213/
http://web.stanford.edu/class/cs107/

关于公开课,更多的可以参考这个github项目,维护了众多推荐的公开课程资源:(star 14K)
https://github/ForrestKnight/open-source-cs/blob/master/README.md
老外OSSU组织总结的自学计算机学习路径,star 92K:
https://github/ossu/compute

(二)Java语言基础

开发工具:

  • ide:Intellij Idea
  • JDK
  • 依赖管理maven


语言基础:

  • 输入输出
  • 数据类型
  • 运算符
  • 修饰符
  • 控制流程
  • 类与对象
  • 面向对象:继承、封装、多态
  • 正则表达式


进阶知识:

  • IO文件处理
  • 集合(list、map、set、queue)
  • 异常处理
  • 泛型
  • 网络编程
  • 反射
  • 注解
  • java8的新特性如lambda表达式

书籍推荐:

(1)入门强烈推荐《head first java》

语言非常轻松,相比《java编程思想》而言更适合入门。

(2)并发编程学习推荐《java并发编程实战》

豆瓣评分9.0分。深入浅出地介绍了java线程和并发,是一本完美的java并发参考手册。英文功底好的可以直接阅读原版,翻译的并不是那么好。

关于Java语言从入门到进阶的书籍阅读顺序,我的这个回答已经获得了3200+赞和收藏

(三)JV

JVM体系结构概览:


核心知识点整理:


书籍推荐:

(1)jvm学习推荐《深入理解java虚拟机》

对于理解java虚拟机内存管理、类加载机制、常用调优方法非常有用。

(2)另外推荐一本网络书籍《深入理解java内存模型》

书中首先介绍了java内存模型的抽象以及happens-before。然后详细讲解了重排序以及顺序一致性原理,最后介绍了volatile的内存语义实现以及锁机制。

(四)数据库

1、关系型数据库-mysql知识点归纳:

推荐书籍:

(1)入门篇-《MySQL必知必会》

非常薄,只有200来页,花几天时间就能刷完,SQL 语法入门好书,推荐!

这本书的特点是注重实用性,紧贴实战需要,基本没有什么理论的堆砌,完完全全就是一本实践指南。读懂后基本mysql的用没问题了。

(2)进阶篇-《高性能mysql》

本书深度讲解了mysql引擎架构、索引设计、SQL查询优化的实战技巧、复制、分片等原理,还有运维技能。

书很厚,内容非常全面,适合精读,弄清整本书,也就能精通数据库了。

2、SQL VS NoSQL VS NewSQL的区别是什么?

sql通常用来指结构化查询语言或者代指关系型数据库如mysql、PostgreSQL。

NewSQL:关系型数据模型,并提供了良好的伸缩性等特性。

他们三者之间的核心差别是什么呢?有需要Java课程及资料的可以私信博主免费领取噢

特性SQLNoSQLNewSQL
是否关系模型关系模型不遵循关系模型
ACID否,CAP
SQL支持支持schema-free两者都支持(schema-free/schema-fixed)
OLTP支持不佳不支持支持的非常好
伸缩性(scaling)垂直伸缩水平伸缩都支持
是否分布式数据库
应用场景大数据,社交网络,IOT电商,通信
示例MySQL,PostgreSQLHbase,Cassandra,DynamoDB,MongoDBVoltDB, CockroachDB, NuoDB


推荐书籍:

《Hbase权威指南》

《Cassandra权威指南》


(五)并发编程

生产环境中,我们的代码通常要应对巨大的流量,因此我们必须处理后并发问题。并发问题处理不好,会造成不可预料的损失,严重会造成巨大资损。典型的场景有库存扣减、抢优惠券等。

并发编程知识点整理:

来自网友总结:
https://www.processon/mindmap/60f618351efad454a76e1fa7
https://github/CL0610/Java-concurrency

推荐书籍:《Java并发编程实战》

(六)常用开发框架-spring

spring是一个轻量级java开发框架,最早由Rod Johnson,目的是解决企业级应用开发的业务逻辑层和其他各层的耦合问题。其最根本的使命是解决企业级应用开发的复杂性

spring的核心:控制反转(IOC)和面向切面编程(AOP)。

spring的优点

  • 解耦,简化开发。开发者可以将所有对象创建和依赖关系维护,交给spring管理。
  • AOP编程的支持。可以方便的实现对程序进行权限拦截、监控等功能。
  • 非常方便集成各种优秀框架。如mybatis、hibernate。
  • 降低javaee api的使用难度,进行了比较好的封装。

spring模块组成

Spring Core:Spring核心模块,包含控制反转(IOC)和依赖注入(DI)。
spring-beans 模块:提供了BeanFactory工厂模式的一个经典实现(Spring将管理对象称为Bean)
Spring Context:访问定义和配置对象的媒介。
Spring AOP:面向切面编程AOP实现,以动态代理技术为基础,允许定义各种拦截器,方便解耦。
Spring JDBC:提供了JDBC的抽象层,消除了JDBC编码的繁琐工作和不同数据库厂商的处理逻辑,简化JDBC。
Spring JMS:JAVA消息发送和接收服务。
Spring ORM:ORM框架支持,集成了hibernate、jpa和jdo用于资源管理、dao的实现和事务。
Spring Web:为创建Web应用程序提供支持。
Spring Test:提供了对 JUnit 和 TestNG 测试的支持、
Spring Aspects:该模块为与AspectJ的集成提供支持。
Spring Web:Spring框架支持与Struts集成,为基于web的应用程序提供了上下文。

从用户视角看:

spring在面试中问的频率非常高,是我们必须掌握使用和设计原理的开发框架。

大厂面试 Java 工程师为什么总爱问 Spring 这些问题?13 赞同 · 2 评论回答19 赞同 · 2 评论回答正在上传…重新上传取消

(七)常用开发框架-mybatis

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。

MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

官网:https://mybatis/mybatis-3/zh/index.html

(八)设计模式

设计模式是一套被反复使用、多数人知晓、经过分类的、代码设计经验的总结。

使用设计模式的作用是为了代码可重用性、增加可维护性,让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化

遵循设计模式七大原则:单一职责原则、开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、迪米特法则、合成/聚合复用原则

使用设计模式能够增加系统的健壮性,易修改性和可扩展性,当你进行开发的软件规模比较大的时候,良好的设计模式会给编程带来便利,让系统更加稳定,这些在自己编写小程序的时候是体现不出来的。

需要掌握22种核心的设计模式

(九)分布式

生产环境中我们的应用部署通常是分布式、多机器部署的,因此会涉及分布式问题的处理,如服务跨机房调用、消息通信、分库分表等等。是非常重要且有难度的一块。

这是网上搜到的淘宝3.0架构:服务化。

学习路径:

(1)这里首先推荐书籍《数据密集型应用系统设计》

这本书知识面非常广,涵盖了分布式系统设计的方方面面,将深奥的分布式知识深入浅出的讲解,非常容易懂。英文较好的可以直接读影印版,难度不大。看完这本书后,理论基本上入门了。

网上的评价都非常高:


(2)然后还需要实践

实践可以看经典的公开课,然后做配套的lab。

这里推荐mit 6.824:
https://pdos.csail.mit.edu/6.824/
https://pdos.csail.mit.edu/6.824/schedule.html

(十)大数据计算有需要Java课程及资料的可以私信博主免费领取噢

随着我们进入DT时代,数据成为最重要的资产,数据的处理变得越来越重要。

Flink 诞生于欧洲的一个大数据研究项目 StratoSphere。该项目是柏林工业大学的一个研究性项目

早期,Flink 是做 Batch 计算的,但是在 2014 年,StratoSphere 里面的核心成员孵化出 Flink,同年将 Flink 捐赠 Apache,并在后来成为 Apache 的顶级大数据项目,同时 Flink 计算的主流方向被定位为 Streaming,即用流式计算来做所有大数据的计算。

更多推荐

本人Java全靠自学并通过校招拿到阿里巴巴offer,分享一下本人自学Java的方法论