一、作計劃,並同時寫博客php
在四個月的時間裏,我首先按照Java後端路線圖(兩個圖結合着參考學習)安排好複習計劃,每一個知識點都安排一段時間。好比我可能花一天時間複習「Java反射」,兩天時間複習「設計模式」,一週的時間用於複習"JVM虛擬機」。我通常會在月初作好整個月的計劃,而後根據進度作一些微調。html
二、「寫博客整合知識點」java
三、作項目,也刷算法mysql
跟着牛客網的項目課作了,這兩個項目都使用SpringBoot快速開發,而且用到一些經常使用的後端技術好比redis,雲存儲,以及一些常見Web框架,除此以外還涉及到了solr,爬蟲等技術。雖然項目不算很難,可是我在這段時間裏很快地熟悉了完整項目開發的流程,而且天天作迭代,經過Git來跟進版本,每一個版本都會寫清所作的內容,這也讓我對項目的架構很是熟悉。
在項目之餘,我也找一些經常使用的後端組件來跑一跑demo,以便讓我對這些技術有一個直觀的瞭解,好比面試常問的dubbo,zookeeper,消息隊列等組件。這些嘗試也讓我在理解它們的原理時更加駕輕就熟了。)linux
四、「堅持刷題,注重方法」git
首先我從新刷了一遍劍指offer,而且對每道題目進行總結,儘可能保證每一道題均可以記在腦子裏,衆所周知劍指offer中的題是面試時很是喜歡考的,因此先搞定這部分題目是最爲關鍵的。
搞定劍指offer以後,固然還要刷LeetCode了,LeetCode題目這麼多,怎麼選擇呢,我沒有按照tag刷,也沒有按照順序刷,而是參考當時一個大佬的LeetCode刷題指南來進行刷題的,他把每一個類型的題目都作了概括,每部分只放一些比較經典的題目。因此我先後大概刷了100多道LeetCode的題目,而且在第二遍刷題複習的時候,我也對這些題目作了一份總結。github
除了上面兩個經典題庫,我還着重刷了大廠的歷年真題,這部分我主要是經過牛客網的歷年真題題庫來完成刷題的。說實話,真題是很是重要的,由於公司出的題目不像平時的那些算法題,可能會出得很是奇葩,因此你若是不提早適應的話會比較吃虧。完成這部分題目以後,我對算法題的複習也基本告一段落了。web
算法第四版:入門書籍,很是好。面試
(1)、Java基礎redis
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)
瞭解一些基礎語法以後,就直接跟着視頻的老師作一些表操做實戰練習,好比單表查詢、多表查詢等。需多加練習,不要只看懂了就行,由於工做中寫得一手簡練的 sql 是很是重要的。在項目一直秉承着 sql 語句是能避免多表查詢就避免多表查詢,可以分開多條語句就分開多條語句,由於這裏涉及到多表查詢性能和數據庫擴展的問題。
關於 JDBC 方面:JDBC 教程(https://www.yiibai.com/jdbc/)、 JDBC 獲取鏈接對象源碼分析(http://objcoding.com/2017/07/03/JDBC/)
須要弄懂 JDBC API 的用法,其實它只是一組規範接口,全部數據庫驅動只要實現了 JDBC,那麼就能夠經過標準的 API 調用相應的驅動,徹底不用知道驅動是怎麼實現的,這就是面向接口編程的好處。並且對於 JDBC 能夠直接看視頻去理解的,跟着視頻作了一個基於 Apache Dbutils 工具作了一個具備事務性的小工具,我特地用思惟導圖總結了一下:
jdbc-utils源碼地址:jdbc-utils(https://github.com/objcoding/jdbc-utils)
(3)、Web基礎
曾經開源中國創始人紅薯寫了一篇文章「初學 Java Web 開發,請遠離各類框架,從 Servlet 開發」,我以爲他說的太對了,在現在 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、Struts二、Hibernate 是 Java 三架馬車,我只想說,那是好久遠的事情了,我嚴重不推薦 Struts二、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/)
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)
Mybatis 深刻淺出系列(http://www.cnblogs.com/dongying/tag/Mybatis%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA%E7%B3%BB%E5%88%97/)
(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/)
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/)
spring-boot-starter-tutorial(https://github.com/objcoding/spring-boot-starter-tutorial)
SpringCloud 是一個微服務架構,可以將項目按照業務分紅一個個微服務,每一個微服務均可獨立部署,服務之間互相協調。當一個項目愈來愈大時,隨之而來的是愈來愈難以維護,此時將項目拆分紅若干個微服務、單獨維護、單獨部署,也能夠下降項目不一樣業務間的耦合度。推薦書籍「Spring Cloud 與 Docker 微服務架構實戰」,這本書將 Docker 與微服務完美地結合在一塊兒,堪稱完美!
Spring Cloud 中文官網(https://springcloud.cc/)
史上最簡單的 Spring Cloud 教程(https://blog.csdn.net/forezp/column/info/15197)
我寫的有關於 Spring Cloud 的博客:
SpringCloud微服務架構之服務註冊與發現(http://objcoding.com/2017/05/07/SpringCloud(1)/)
SpringCloud微服務架構之服務消費者(http://objcoding.com/2017/05/10/SpringCloud(2)/)
SpringCloud微服務架構之斷路器(http://objcoding.com/2017/05/15/SpringCloud(3)/)
SpringCloud微服務架構之服務網關(http://objcoding.com/2017/05/20/SpringCloud(4)/)
(6)、其餘技術
Redis:一個高性能的 key-value 數據庫,當有併發量很高的請求時,將數據緩存在 Redis 中,將提升服務器的響應性能,大大減輕數據庫的壓力。
redis 中文官網(http://www.redis.cn/)
redis 教程(http://www.runoob.com/redis/redis-tutorial.html)
Redis設計與實現:這本書基本是Redis講的最好的,能夠結合B站視頻學習。
Git:世界上最早進的分佈式版本控制系統,建議全部初學者從命令行開始使用 Git!
Git 官網(https://git-scm.com/)
最全 Git 教程(https://git-scm.com/book/zh/v2)
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/)
最全的 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)/)
Docker 實戰(二)(http://objcoding.com/2017/12/07/Docker(2)/)
Docker 實戰(三)(http://objcoding.com/2018/02/06/Docker(3)/)
docker-deploy-tutoria(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)
Iterm2:macOS 最好用的終端!
Iterm2 使用指南(https://wdxtub.com/2016/03/20/iterm2-guide/)
Chrome:人生苦短,請用 Chrome,來不及解釋了,快上車!
Postman:很好用的一個接口調試工具。
Postman 官網(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)、計算機網絡