1, 做计划, 并同时写博客
在四个月的时间里, 我首先按照 Java 后端路线图 (两个图结合着参考学习) 安排好复习计划, 每个知识点都安排一段时间. 比如我可能花一天时间复习 "Java 反射", 两天时间复习 "设计模式", 一周的时间用于复习 "JVM 虚拟机". 我一般会在月初做好整个月的计划, 然后根据进度做一些微调.
2,"写博客整合知识点"
3, 做项目, 也刷算法
跟着牛客网的项目课做了, 这两个项目都使用 SpringBoot 快速开发, 并且用到一些常用的后端技术比如 Redis, 云存储, 以及一些常见 web 框架, 除此之外还涉及到了 Solr, 爬虫等技术. 虽然项目不算很难, 但是我在这段时间里很快地熟悉了完整项目开发的流程, 并且每天做迭代, 通过 Git 来跟进版本, 每个版本都会写清所做的内容, 这也让我对项目的架构非常熟悉.
在项目之余, 我也找一些常用的后端组件来跑一跑 demo, 以便让我对这些技术有一个直观的了解, 比如面试常问的 dubbo,zookeeper, 消息队列等组件. 这些尝试也让我在理解它们的原理时更加得心应手了.)
4,"坚持刷题, 注重方法"
首先我重新刷了一遍剑指 offer, 并且对每道题目进行总结, 尽量保证每一道题都可以记在脑子里, 众所周知剑指 offer 中的题是面试时非常喜欢考的, 所以先搞定这部分题目是最为关键的.
搞定剑指 offer 之后, 当然还要刷 LeetCode 了, LeetCode 题目这么多, 怎么选择呢, 我没有按照 tag 刷, 也没有按照顺序刷, 而是参考当时一个大佬的 LeetCode 刷题指南来进行刷题的, 他把每个类型的题目都做了归纳, 每部分只放一些比较经典的题目. 所以我前后大概刷了 100 多道 LeetCode 的题目, 并且在第二遍刷题复习的时候, 我也对这些题目做了一份总结.
除了上面两个经典题库, 我还着重刷了大厂的历年真题, 这部分我主要是通过牛客网的历年真题题库来完成刷题的. 说实话, 真题是非常重要的, 因为公司出的题目不像平时的那些算法题, 可能会出得非常奇葩, 所以你如果不提前适应的话会比较吃亏. 完成这部分题目之后, 我对算法题的复习也基本告一段落了.
算法第四版: 入门书籍, 非常好.
算法主要靠刷题, 剑指 offer 应对面试手撕代码, 刷几遍不重要, 重要是理解, 熟练.
leetcode 刷题. leetcode 刷题顺序看自己, 可以按照 tag 刷, 可以刷 leetcode 前两页, 或者前 150 题. 一天两道题, 早日成为大佬. 我是按照一个大佬的顺序刷的 . https://github.com/CyC2018/CS-Notes .
慕课网也有一些算法视频, 可以看下.--- 玩转算法视频 leetcode 分门别类详细解析
(1),Java 基础
Java 是一门纯粹的面向对象的编程语言, 所以除了基础语法之外, 必须弄懂它的 oop 特性: 封装, 继承, 多态. 此外还有泛型, 反射的特性, 很多框架的技术都依赖它, 比如 Spring 核心的 IoC 和 AOP, 都用到反射, 而且 Java 自身的动态代理也是利用反射实现. 此外还有 Java 一些标准库也是非常常见, 比如集合, I/O, 并发, 几乎在 Web 并发中无处不在, 也是面试经常被问到的, 所以在自学 Java 后端之前, 不妨先打好这些基础, 另外还有 Java8 的一些新特性, 也要重点关注, 比如 Lambda 表达式, 集合的 Stream 流操作, 全新的 Date API 等等.
java 基础 + java 集合 + java 并发多线程 + java I/O+jvm
推荐书籍: 疯狂 java 讲义 + java 并发编程的艺术 + 深入理解 java 虚拟机
另外我发现看书的效率很低, 所以我一般结合视频来复习, 比如 java 并发编程的艺术, 这本书作为多线程复习还是不错的, B 站有马士兵多线程的视频. 深入理解 java 虚拟机这本书, 其实没有必要全部看完, 应对面试看第二章 (java 内存区域介绍), 第三章(垃圾收集算法和回收策略) 第七章(类加载机制) 第 12,13 章(java 内存模型与线程 + 线程安全与锁优化, 这部分可以和多线程结合看一下).
「Java 编程思想」这本书是 Java 界的圣经, 但是才开始不推荐学习, 我在这里推荐你们一开始先看「Java 核心技术」, 这本书讲得比较通俗易懂, 初学者比较能接受. 关于视频推荐, 推荐毕向东老师讲的 Java 基础教程.
(2), 数据库
关于 sql 方面: MySQL 教程 http://www.runoob.com/mysql/mysql-tutorial.html (http://www.runoob.com/mysql/mysql-tutorial.html)
了解一些基础语法之后, 就直接跟着视频的老师做一些表操作实战练习, 比如单表查询, 多表查询等. 需多加练习, 不要只看懂了就行, 因为工作中写得一手简练的 sql 是非常重要的. 在项目一直秉承着 sql 语句是能避免多表查询就避免多表查询, 能够分开多条语句就分开多条语句, 因为这里涉及到多表查询性能和数据库扩展的问题.
MySQL 必知必会: 入门书, 可以快速浏览一遍
高性能 MySQL: 这本书比较厚, 可以当做查阅书, 边学习边看.
关于 JDBC 方面: JDBC 教程(https://www.yiibai.com/jdbc/), JDBC 获取连接对象源码分析(http://objcoding.com/2017/07/03/JDBC/)
需要弄懂 JDBC API 的用法, 其实它只是一组规范接口, 所有数据库驱动只要实现了 JDBC, 那么就可以通过标准的 API 调用相应的驱动, 完全不用知道驱动是怎么实现的, 这就是面向接口编程的好处. 而且对于 JDBC 可以直接看视频去理解的, 跟着视频做了一个基于 Apache Dbutils 工具做了一个具有事务性的小工具, 我特意用思维导图总结了一下:
jdbc-utils 源码地址: https://github.com/objcoding/jdbc-utils (https://github.com/objcoding/jdbc-utils)
(3),Web 基础
曾经开源中国创始人红薯写了一篇文章「初学 Java Web 开发, 请远离各种框架, 从 Servlet 开发 https://www.oschina.net/question/12_52027 」, 我觉得他说的太对了, 在如今 Java 开发中, 很多开发者只知道怎么使用框架, 但根本不懂 Web 的一些知识点, 其实框架很多, 但都基本是一个套路, 所以在你学习任何框架前, 请把 Web 基础打好, 把 Web 基础打好了, 看框架真的是如鱼得水.
关于 Http 协议, 这篇文章就写得很清楚: Http 协议(https://www.cnblogs.com/ranyonsue/p/5984001.html)
关于 Web 基础这方面数据推荐, 我当时是看的是「Tomcat 与 Java Web 开发技术详解」, 很详细地讲解了整个 Java Web 开发的技术知识点, 但现在看来, 我觉得里面讲的有一些技术确实有点老旧了, 不过可以了解一下 Java Web 开发的历史也是不错的. 所以在 Web 基础这方面我都是看某客的崔老师讲的「超全面 Java Web 视频教程」, 讲得很详细很生动, 还有实战项目!
关于 JSP, 你只要了解它其实就是一个 Servlet 就行了, 关于它的一些标签用法, 我认为可以直接忽略, 因为现在互联网几乎没哪间公司还用 JSP, 除了一些老旧的项目. 现在都是流行前后端分离, 单页应用, 后端只做 API 接口的时代了, 所以时间宝贵, 把这些时间重点放在 Servlet 规范上面吧.
关于 Tomcat, 它是一个 Web 容器, 我们写的后端项目都要部署到 Web 容器才能运行, 它其实是一个遵循 Http, 通过 Socket 通信与客户端进行交互的服务端程序: Tomcat 结构及处理请求过程(http://objcoding.com/2017/06/12/Tomcat-structure-and-processing-request-process/)
(4),Web 主流框架
Java Web 框架多如牛毛, 等你有一定经验了, 你也可以写一个 Web 框架, 网上很多说 Spring,Struts2,Hibernate 是 Java 三架马车, 我只想说, 那是很久远的事情了, 我严重不推荐 Struts2,Hibernate, 相信我, 一开始只需要上手 Spring,SpringMVC,Mybatis 就可以了, 特别是 Spring 框架, 其实 Spring 家族的框架都是很不错的.
但是提醒一点就是, 千万不要沉迷于各种框架不能自拔, 以会多种用法而沾沾自喜, 导致知其然而不知其所以然.
Spring 其核心思想就是 IoC 和 AOP:
谈谈对 Spring IoC 的理解(https://blog.csdn.net/qq_22654611/article/details/52606960/)
Spring 面向切面编程 http://objcoding.com/2017/08/25/Spring-AOP/ (http://objcoding.com/2017/08/25/Spring-AOP/)
SpringMVC 它的思想是全部请求统一用一个 Servlet 去做请求转发与控制, 这个 Servlet 叫 DispatcherServlet:
SpringMVC 初始化过程(http://objcoding.com/2017/06/14/SpringMVC-initialization-process/)
SpringMVC 处理请求过程(http://objcoding.com/2017/06/15/SpringMVC-processing-request-process/)
Mybatis 它可实现动态拼装 sql, 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集:
mybatis 入门教程 http://www.mybatis.org/mybatis-3/zh/index.html (http://www.mybatis.org/mybatis-3/zh/index.html)
Mybatis 深入浅出系列(http://www.cnblogs.com/dongying/tag/Mybatis深入浅出系列/)
(5),Web 框架进阶
使用了 SSM 框架后, 你会觉得框架也不过这么回事, 如果你对 Spring 有过大概了解, 你也会产生想写一个「山寨版」Spring 的心思了, 一个轻量级 Web 框架主要具备以下功能:
可读取用户自定义配置文件, 并以此来初始化框架;
具备 Bean 容器, 管理项目的类的对象生命周期;
具备依赖注入, 降低类之间的耦合性;
具备 AOP 功能, 使项目可进行横向编程, 可不改变原有代码的情况增加业务逻辑;
具备 MVC 框架模式.
其实除了 SSM 之外, Web 框架可谓是百家齐放, 其中以 Spring 全家桶最为耀眼, 在这里我极力推荐两个 Spring 家族框架: SpringBoot 和 SpringCloud.
SpringBoot 弥补了 Spring 配置上的缺点, 再也不用为繁杂的 xml 费劲精力了, 堪称是 Java 后端开发的颠覆者, 推荐书籍「Java EE 开发的颠覆者: SpringBoot 实战」
SpringBoot 构建 Web 项目 http://objcoding.com/2017/05/03/SpringBoot/ (http://objcoding.com/2017/05/03/SpringBoot/)
SpringBoot 自动化配置源码分析(http://objcoding.com/2018/01/30/The-principle-of-Spring-Boot-automation-configuration/)
自定义 SpringBoot Starter(http://objcoding.com/2018/02/02/Costom-SpringBoot-Starter/)
(https://github.com/objcoding/spring-boot-starter-tutorial)
SpringCloud 是一个微服务架构, 能够将项目按照业务分成一个个微服务, 每个微服务都可独立部署, 服务之间互相协调. 当一个项目越来越大时, 随之而来的是越来越难以维护, 此时将项目拆分成若干个微服务, 单独维护, 单独部署, 也可以降低项目不同业务间的耦合度. 推荐书籍「Spring Cloud 与 Docker 微服务架构实战」, 这本书将 Docker 与微服务完美地结合在一起, 堪称完美!
Spring Cloud 中文官网 https://springcloud.cc/ (https://springcloud.cc/)
史上最简单的 Spring Cloud 教程 http://blog.csdn.net/column/details/15197.html (https://blog.csdn.net/forezp/column/info/15197)
我写的有关于 Spring Cloud 的博客:
SpringCloud 微服务架构之服务注册与发现 http://objcoding.com/2017/05/07/SpringCloud(1)/ (http://objcoding.com/2017/05/07/SpringCloud(1)/)
SpringCloud 微服务架构之服务消费者 http://objcoding.com/2017/05/10/SpringCloud(2)/ (http://objcoding.com/2017/05/10/SpringCloud(2)/)
SpringCloud 微服务架构之断路器 http://objcoding.com/2017/05/15/SpringCloud(3)/ (http://objcoding.com/2017/05/15/SpringCloud(3)/)
SpringCloud 微服务架构之服务网关 http://objcoding.com/2017/05/20/SpringCloud(4)/ (http://objcoding.com/2017/05/20/SpringCloud(4)/)
(6), 其他技术
Redis: 一个高性能的 key-value 数据库, 当有并发量很高的请求时, 将数据缓存在 Redis 中, 将提高服务器的响应性能, 大大减轻数据库的压力.
Redis 中文官网 http://www.redis.cn/ (http://www.redis.cn/)
Redis 教程 http://www.runoob.com/redis/redis-tutorial.html (http://www.runoob.com/redis/redis-tutorial.html)
Redis 设计与实现: 这本书基本是 Redis 讲的最好的, 可以结合 B 站视频学习.
Git: 世界上最先进的分布式版本控制系统, 建议所有初学者从命令行开始使用 Git!
Git 官网 https://git-scm.com/ (https://git-scm.com/)
最全 Git 教程 https://git-scm.com/book/zh/v2 (https://git-scm.com/book/zh/v2)
Git 的一些常用命令 http://objcoding.com/2017/08/12/Git/ (http://objcoding.com/2017/08/12/Git/)
Maven: 一个用于构建项目的工具, 将项目间的依赖通过 xml 完美地组织到一起, 可通过编译插件将项目编译成字节码文件. 还有类似的 Gradle 也是不错的选择.
maven 的 pom.xml 文件详解(http://www.cnblogs.com/hafiz/p/5360195.html)
Linux: 至少要求常用的命令会用, 能够在 Linux 环境下部署项目.
Linux 命令大全 http://man.linuxde.net/ (http://man.linuxde.net/)
最全的 SSH 连接远程终端教程(http://objcoding.com/2017/10/31/The-most-complete-SSH-connection-remote-terminal-tutorial/)
鸟哥的 Linux 私房菜: 了解常用命令.
Docker: 简直是项目部署神器啊, 来不及解释了, 看我 Docker 系列博客, 开启 Docker 之旅吧! 推荐书籍「Docker 技术入门与实战」, 中国首部 Docker 著作!
Docker 实战(一) http://objcoding.com/2017/12/01/Docker(1)/ (http://objcoding.com/2017/12/01/Docker(1)/)
Docker 实战(二) http://objcoding.com/2017/12/07/Docker(2)/ (http://objcoding.com/2017/12/07/Docker(2)/)
Docker 实战(三) http://objcoding.com/2018/02/06/Docker(3)/ (http://objcoding.com/2018/02/06/Docker(3)/)
(https://github.com/objcoding/docker-deploy-tutorial)
(7), 开发工具
工欲善其事, 必先利其器, 以下是我推荐的一些开发工具:
Intellij IDEA:Java 开发最好的 IDE, 这个是公认的, 我一开始是用 Eclipse 的, 后来用了 Intellij IDEA, 才发现 Eclipse 就是一坨屎, 所以我以过来人劝你们不要使用 Eclipse, 直接 Intellij IDEA!
IntelliJ IDEA 使用教程 http://www.phperz.com/special/83.html (http://www.phperz.com/special/83.html)
iTerm2:macOS 最好用的终端!
iTerm2 使用指南 http://wdxtub.com/2016/03/20/iterm2-guide/ (https://wdxtub.com/2016/03/20/iterm2-guide/)
Chrome: 人生苦短, 请用 Chrome, 来不及解释了, 快上车!
Postman: 很好用的一个接口调试工具.
Postman 官网 https://www.getpostman.com/ (https://www.getpostman.com/)
(8), 设计模式,
一直觉得设计模式可以和 Java 基础一块学, 所以把它放在这里. 当然, 一些真正使用到设计模式的地方, 譬如 JDK 的集合类, IO 流等等, 也需要足够重视.
HeadFirst 设计模式: 重点了解单例模式, 工厂模式, 观察者模式, 等等, 可以看看 B 站视频
(9),Jvm 基础与调优
JVM 是提供 Java 程序运行的一个进程, 学习 JVM 知识, 也是我们的必经之路. 除了看懂《深入理解 jvm 虚拟机》以外, 我们还要学习的内容就是 JVM 调优, 使用合适的工具诊断问题, 最后解决问题.
这部分内容在面试中呈现的不仅仅是 GC, 内存分区, 以及类加载器, 也包括了我所说的 JVM 调优问题.
(10), 数据相关
关系数据库 MySQL
这个不必多说, 人手都要会, 不管是基础的 crud, 索引, 抑或是进阶的存储引擎, 分布式方案等, 我们都需要对应掌握.
缓存
如 Redis,memcache 一类的缓存, 作为后端开发者的我们也需要对应掌握, 当然, 它们的高级特性, 以及分布式方案, 也是必备的知识点.
搜索引擎
基于 Lucene 的 Solr,Elasticsearch 这类搜索引擎, 本质上也是数据源, 但是并不是后端必备的内容, 不过学一学也没有坏处啦.
大数据
海量数据处理的场景越来越多, 大数据技术如 hadoop,storm 等也越来越火, 但是大数据应用一般会由专业的大数据工程师来做, 所以我们学一些基本内容也就足够了.
(11), 算法和数据结构
算法一直是校招同学面前的一座大山, 作为后端同学来讲, 除了基本的数据结构算法以外, 也要会一些高级的算法, 譬如 dp, 搜索, 贪心等等.
另外, 通过 LeetCode 等题库来刷题的方式来巩固算法也是公认的好办法了.
(12), 分布式
最后一个部分, 也是内容最多, 覆盖面最广泛的部分了. 分布式相关的技术实在太多了, 我们这里也会做一下简单的归纳.
Web 架构
先了解 Web 架构的发展会对分布式的学习有更好的理解, 毕竟架构的发展也对应着分布式技术的发展.
分布式理论
这部分内容包括分布式的发展演化, base 理论和 cap 理论等等, 学习分布式技术之前, 最好能对这部分概念有一定了解.
一致性问题
强一致性的解决方案: 事务和锁, 弱一致性的方案: 消息队列.
分布式 session
一个常见的问题, 也有多种解决方案
分布式缓存
和上面说的缓存一样, 只不过这里侧重缓存的分布式方案
分布式数据库
这里指的数据库的分布式方案, 也包括 hbase 这种分布式数据库.
负载均衡
负载均衡也是一个值得探讨的话题, 一般我们讨论的是七层和四层负载均衡.
消息队列
消息队列是一个比较复杂的分布式组件, 我们可以了解常用消息队列比如 amq,kafka 等的实现.
服务化
服务化的核心包括 rpc, 服务注册中心等等. 分布式服务相关技术也是后端同学必须掌握的内容.
虚拟化
虚拟化同样不是后端同学必须掌握的内容, 只不过现在越来越多的服务部署方式使用的是 docker 和云服务的方式. 所以了解一下也没有什么不好的.
(13), 计算机网络
计算机网络自顶向下方法. 这本书先讲应用层和传输层, 非常好, 我们也一般只需要重点掌握这两层. 前四章可以看下.
TCP/IP 协议卷一: tcp/ip 是常考的, 可以看下.
(14), 操作系统
来源: https://www.cnblogs.com/wyb2126/p/10859313.html