硬核!如何全面系統(tǒng)地自學(xué)Java
大家好,我是沉默王二。
我今年 XX 歲(調(diào)皮),使用 Java 開發(fā)將近 15 年了,目前雖然不在技術(shù)一線,但仍然和 Java 形影相伴,如影隨形,每天都在相愛相殺。
雖然我是科班出身,但說實(shí)話,十多年走過來,無論是 Java 語言本身,還是它配套的工具和框架都發(fā)生了巨大的變化。我自己也是一路學(xué)習(xí)新的知識,一路丟掉廢舊的知識。
現(xiàn)在回頭來看,發(fā)現(xiàn)自己也走了不少彎路,浪費(fèi)了不少時(shí)間,真的是既遺憾又嘆息!
關(guān)注我的讀者當(dāng)中應(yīng)該有很大一部分是 Java 初學(xué)者,因?yàn)槭浅鯇W(xué),所以面臨著巨大的壓力,不能付出太高的試錯成本。而應(yīng)該尋找一條更高效的學(xué)習(xí)路線和一套行之有效的學(xué)習(xí)方法,否則一不小心,很可能會前功盡棄。
但好在 Java 的學(xué)習(xí)資料非常豐富,只要我們稍微用心去整理下,就能找出一條高效的學(xué)習(xí)路徑。過去這兩年里,我不斷地整理自己的思路,分享了不少關(guān)于 Java 方面的文章,但都過于分散,借這個(gè)機(jī)會,我打算重新梳理一遍,希望能對大家的學(xué)習(xí)有所幫助。
01、學(xué)習(xí) Java 之前先學(xué) C
自學(xué) Java 并不容易,尤其是對于非科班的同學(xué)來說。所以我強(qiáng)烈的推薦大家在學(xué)習(xí) Java 這門編程語言之前,先學(xué)一下 C 語言。如果沒有 C 語言作為基礎(chǔ)的話,在初學(xué) Java 的階段會莫名的心慌。
我上大學(xué)的時(shí)候,一上來就學(xué)的 Java,并且教材是《Java 編程思想》,真的,就感覺給看天書一樣。班里面有 80% 的人都在畢業(yè)的時(shí)候放棄了編程,很可悲的一件事,不是說 Java 這門編程語言不好,而是我們底子太差,都是第一次接觸編程,難度可想而知。
編程語言都是相通的,C 語言作為 Java 語言的母胎,還是非常值得去學(xué)習(xí)一下打打基礎(chǔ)的。其實(shí)對于我們程序員來說,學(xué)的是計(jì)算機(jī)科學(xué),而不是編程語言,語言只是工具,沒有優(yōu)劣。像我,就學(xué)過 Java、C 語言、Ruby、JavaScript 等等這些編程語言,他們之間確實(shí)有很多相似之處。如果學(xué)過 JavaScript,能很容易搞懂 Java 的 Lambda 表達(dá)式
C 語言的特殊性就在于它可能是唯一一門最適合來學(xué)習(xí)一系列計(jì)算機(jī)基礎(chǔ)的媒介,比如 Linux 操作系統(tǒng),就是用 C 語言重構(gòu)的;比如計(jì)算機(jī)網(wǎng)絡(luò),里面有很多網(wǎng)絡(luò)協(xié)議,有不同的 header 定義,這些字段用 C 語言的 union 和 struct 來操作非常便捷。Java 中雖然剔除了指針這種煩人的東西,但說白了,引用其實(shí)和指針差不多,理解了 C 語言中的指針,就能很好的理解 Java 中的引用。
當(dāng)然了,由于 C 語言的抽象程度更高,學(xué)起來也需要花費(fèi)一番功夫。對于初學(xué)者來說,我推薦大家先看一下翁愷教授的 C 語言程序設(shè)計(jì)。
B 站地址:https://www.bilibili.com/video/BV19W411B7w1
喜歡看書的同學(xué)我只推薦一本,《C Primer Plus》,可以說是學(xué)習(xí) C 語言的圣經(jīng)。豆瓣評分高達(dá) 9.1 分,包括數(shù)據(jù)類型、格式化輸入輸出、運(yùn)算符、表達(dá)式、流程控制語句、函數(shù)、數(shù)組和指針、字符串操作、內(nèi)存管理、位操作等等這些基礎(chǔ)知識都全部講解到了,非常適合系統(tǒng)學(xué)習(xí) C 語言的讀者。
在學(xué)習(xí)的過程中切記一點(diǎn),就是一定要多練多練多練,這一點(diǎn)不僅適合學(xué)習(xí) C語言,也適合學(xué)習(xí) Java 語言。有句話說得好呀,看懂了+上萬行代碼=學(xué)會了。無論是看視頻學(xué)習(xí),還是看書學(xué)習(xí),最怕的就是眼高手低,以為自己看懂了,實(shí)際上呢,離學(xué)會了還差上萬行代碼。
一開始學(xué)習(xí)會很痛苦,我也不例外,直接開干 Java 的時(shí)候,簡直就覺得自己不是塊學(xué)編程的料,有想過轉(zhuǎn)別的專業(yè),比如說機(jī)械自動化,可惜考試成績太差,沒轉(zhuǎn)成。等到敲的代碼越來越多,慢慢的就開竅了,開竅了以后,學(xué)習(xí)依然會痛苦,但再也沒有那種放棄的念頭了。
有了 C 語言的基礎(chǔ),再學(xué) Java 就容易多了!
PS:對于初學(xué)者來說,起步會很難,甚至不知道該用什么軟件來編寫代碼。我已經(jīng)提前為大家踩過坑了,強(qiáng)烈推薦 VS Code,顏值高、占內(nèi)存小、插件豐富、簡單易用。
02、學(xué)習(xí) Java 之前要安裝的軟件
工欲善其事必先利其器,戰(zhàn)斗之前我們要先配備好武器。
JDK 是 Java Development ToolKit 的簡稱,也就是 Java 開發(fā)工具包。JDK 是整個(gè) Java 的核心,包括 Java 運(yùn)行環(huán)境(Java Runtime Envirnment,簡稱 JRE),Java 工具(比如 javac、java、javap 等等),以及 Java 基礎(chǔ)類庫(比如 rt.jar),學(xué)習(xí) Java 之前必須要安裝。
已經(jīng) 2021 年了,真沒必要在記事本上敲代碼了。反正我遇到過太多的課程,包括我上大學(xué)的時(shí)候,老師一而再再而三的強(qiáng)調(diào),一定要用記事本敲出來第一個(gè)程序,并且在命令行里成功運(yùn)行起來。
這么多年下來,我覺得這個(gè)建議真的是糟糕極了。記事本和命令行,怎么能讓初學(xué)者上手呢?最起碼也得是個(gè)老江湖才行??!當(dāng)年我就差點(diǎn)被記事本和命令行勸退。
Intellij IDEA,不用說,是編寫 Java 程序的最佳 IDE,必須得掌握。初次使用的話,建議閱讀一下《IntelliJ IDEA 簡體中文專題教程》,GitHub 上已開源。
https://github.com/judasn/IntelliJ-IDEA-Tutorial
Maven 是一個(gè)項(xiàng)目管理和自動化構(gòu)建工具,基于項(xiàng)目對象模型(POM)的概念,可以管理項(xiàng)目的構(gòu)建、報(bào)告以及文檔。作為 Apache 組織中的一個(gè)頗為成功的開源項(xiàng)目,Maven 主要服務(wù)于基于 Java 的項(xiàng)目構(gòu)建、依賴管理和項(xiàng)目信息管理。有了 Maven 以后,第三方類庫管理起來就舒服多了。
Maven 安裝起來很簡單,之間看官方的文檔就行了,如果還想進(jìn)一步深入,推薦大家看一下《Maven 實(shí)戰(zhàn)》這本書,不用細(xì)看,大致過一遍就行了。
我推薦大家使用 GitHub 來作為私有的代碼倉庫,特別方便,免費(fèi)還可以云同步。我之前針對新手專門寫過一個(gè)教程,需要的同學(xué)可以點(diǎn)擊當(dāng)前鏈接去上手體驗(yàn)一下。對 Git 命令比較抗拒的話,可以通過 GitHub 桌面版來傻瓜式地操作。
順帶把 MySQL 也安裝一下吧,畢竟學(xué)習(xí)一門編程語言,如果不去操作下數(shù)據(jù)的話,就感覺這門編程語言空有皮囊卻沒有靈魂。推薦大家看一本書《MySQL 必知必會》,很薄的一本小冊子,慢的話,一周就可以看完,快的話一天就能搞定。
這一套軟件安裝完成后,基本上開發(fā) Java 的必備工具就齊活了。接下來,就可以放心大膽的進(jìn)入 Java 的世界了。
03、Java 學(xué)習(xí)的重點(diǎn)是什么
“冰凍三尺非一日之寒”,要想把 Java 學(xué)好,當(dāng)然需要花費(fèi)很長一段時(shí)間,而 Java 所涵蓋的知識點(diǎn)可以說太平洋都裝不下。來上一張勸退的思維導(dǎo)圖,羅列一下 Java 所涉及到的知識點(diǎn),一是鎮(zhèn)樓,二是讓大家感受一下 Java 這門編程語言的魅力,為什么崗位多,為什么高薪,道理其實(shí)很簡單,它的應(yīng)用場景實(shí)在是其他編程語言不能媲美的。

Java 語言的知識點(diǎn)非常多,而我們又時(shí)間緊迫,意味著只能挑重點(diǎn)、挑實(shí)用,不能面面俱到,一些不常用的知識點(diǎn)就只好假裝已經(jīng)學(xué)會了,用到的時(shí)候再去學(xué)也跟得上??傊痪湓挘骸昂娩撚迷诘度猩稀?。
入門書的話,我推薦兩本,一本《Java 核心技術(shù)卷》,一本《Head First Java》。
《Java 核心技術(shù)卷》分為上下兩冊,上冊的難度較低,可以在最短時(shí)間內(nèi)刷完,尤其是有了 C語言的編程基礎(chǔ)后,再刷這本書可以說是手到擒來。下冊涉及到的內(nèi)容有流與文件(☆)、XML、網(wǎng)絡(luò)(☆)、數(shù)據(jù)庫編程、國際化、Swing、AWT、JavaBean、安全(☆)、腳本編譯和注解處理、分布式對象、本地方法(☆),沒有標(biāo)星的內(nèi)容我認(rèn)為可以略過。
《Head First Java》更有趣一些,里面有很多小游戲,很活潑的一本書。
兩本書之間的風(fēng)格差別比較大,之前就有讀者給我反饋說,《Head First Java》有點(diǎn)駕馭不了,那就挑《Java 核心技術(shù)卷》。
刷完任意一本書后,可以看一看《Java 編程思想》,看自己是否能駕馭得了。因?yàn)樗枷氲臇|西嘛,只有經(jīng)過一些實(shí)踐后才能有所感悟,否則就像王陽明一開始對著竹子格物一樣,屁也格不出來,有了后面領(lǐng)軍作戰(zhàn)的經(jīng)驗(yàn),以及到地方上體驗(yàn)艱苦生活的感受后就開創(chuàng)了心學(xué)。
上面提到的這三本書里面都還保留了圖形程序設(shè)計(jì)的內(nèi)容(AWT 和 Swing),我認(rèn)為是完全可以跳過的,希望后面出版社再版的時(shí)候能把這些內(nèi)容全部刪除,定價(jià)估計(jì)就降了,但他們不一定會這么干。
Java 是一門面向?qū)ο蟮木幊陶Z言,所以三大特性:封裝、繼承、多態(tài)是必須要掌握的,然后是異常處理、IO、集合和并發(fā)編程。只要這些內(nèi)容掌握了,可以說 Java 的基礎(chǔ)知識就全部掌握了。

這其中的難點(diǎn)是并發(fā)編程,我并沒有把這部分放到思維導(dǎo)圖中,顯然這部分內(nèi)容學(xué)起來并不容易,但卻最能考驗(yàn)一名 Java 后端工程師的功底了。

并發(fā)編程這部分怎么學(xué)呢?我推薦另外一本非常牛逼的開源電子書《深入淺出 Java 多線程》來作為輔助和進(jìn)階,幾位阿里朋友寫的,質(zhì)量非常高,我在很早之前推薦過,可以點(diǎn)擊當(dāng)前鏈接下載離線版。
因?yàn)槭亲詫W(xué),所以強(qiáng)烈建議大家把書本上的代碼都敲一遍,尤其是在初學(xué)階段。由于不像工作后,有大量的項(xiàng)目可以實(shí)踐,所以不能得到及時(shí)的反饋,記筆記就顯得特別的重要。另外,一定要分門別類保存好自己的 demo,以便以后可以快速得找得到,尤其是一些小套路,會很有用,積累得多了,可能就變成了自己的工具庫。
一定要善待自己寫過的那些小 demo,尤其是那些已經(jīng)調(diào)通的,千萬不要扔,沒準(zhǔn)哪一天能幫上大忙。以我的經(jīng)驗(yàn),在學(xué)習(xí)的過程中,盡管某些知識點(diǎn)在當(dāng)時(shí)理解的多么透徹,但只要時(shí)間一長,或者換個(gè)開發(fā)環(huán)境,可能就完蛋,明明感覺代碼是一樣的,但就是運(yùn)行不起來。如果手頭恰好有這么一個(gè) demo,打開參考一下,甚至拷貝過來試一下,問題就會迎刃而解。
部分內(nèi)容參考自我的偶像沈世鈞老師,大家可以通過鏈接進(jìn)入他的知乎主頁看一看,絕壁是個(gè)寶藏。https://www.zhihu.com/people/zhang-xu-guang-21
大部分 Java 程序員都要從事 JavaWeb 的相關(guān)開發(fā)工作,要開發(fā) JavaWeb,自然就離不開 Spring 的系列框架。甚至可以這么說,沒有 Spring 的 Java 項(xiàng)目是不存在的。Spring 框架正在變得越來越龐大,但核心的概念仍然是 IOC 和 AOP,也就是控制反轉(zhuǎn)和面向切面編程。這個(gè)兩個(gè)概念對于初學(xué)者來說,學(xué)習(xí)曲線有點(diǎn)陡峭。我來說說 IOC 吧。
在我們編碼的過程中,通常都需要兩個(gè)或者更多的類通過彼此的合作來實(shí)現(xiàn)業(yè)務(wù)邏輯,也就是說,某個(gè)對象需要獲取與其合作對象的引用,如果這個(gè)獲取的過程需要自己實(shí)現(xiàn),代碼的耦合度就會高,維護(hù)起來的成本就比較高。假如老王是少林寺的主持,他想讓小二和尚去掃達(dá)摩院的地,代碼可以這樣實(shí)現(xiàn)。
class Xiaoer {
public void saodi() {
System.out.println("小二我在掃達(dá)摩院的地");
}
}
class Laowang {
public void mingling() {
new Xiaoer().saodi();
}
}
class Test {
public static void main(String[] args) {
Laowang laowang = new Laowang();
laowang.mingling();
}
}
Laowang 類的 mingling 方法中使用 new 關(guān)鍵字創(chuàng)建了一個(gè) Xiaoer 類的對象——這種代碼的耦合度就很高,維護(hù)起來的成本就很高,為什么這么說呢?某一天,達(dá)摩院的地又臟了,老王主持想起了小二和尚,可小二和尚去練易筋經(jīng)了,讓誰去掃地呢,老王主持想起了小三和尚,于是 Laowang 類就不得不重新下一個(gè)新的命令,于是代碼變成了這樣:
class Xiaosan {
public void saodi() {
System.out.println("小三我在掃達(dá)摩院的地");
}
}
class Laowang {
public void mingling() {
new Xiaoer().saodi();
}
public void mingling1() {
new Xiaosan().saodi();
}
}
假如小三和尚去挑水了,老王主持沒準(zhǔn)要下命令給小四和尚去掃達(dá)摩院的地。這樣下去的話,Laowang 這個(gè)類會瘋掉的。老王主持覺得自己堂堂一屆高僧,下個(gè)掃地的命令竟然這樣麻煩,他覺得很不爽。我們得替老王主持想個(gè)辦法對不對?
不如把這個(gè)掃地的差事交給老王的師弟老方吧,老方負(fù)責(zé)去叫小二和尚還是小三和尚還是小四和尚去執(zhí)行老王主持的命令。
public interface Heshang {
void saodi();
}
class Xiaoer implements Heshang {
@Override
public void saodi() {
System.out.println("小二我在掃達(dá)摩院的地");
}
public boolean isYijinjing() {
// 星期三的時(shí)候小二和尚要練易筋經(jīng)
return false;
}
}
class Xiaosan implements Heshang {
@Override
public void saodi() {
System.out.println("小三我在掃達(dá)摩院的地");
}
}
class Laofang {
public static Heshang getSaodiseng() {
Xiaoer xiaoer = new Xiaoer();
if (xiaoer.isYijinjing()) {
return new Xiaosan();
}
return xiaoer;
}
}
class Laowang {
public void mingling() {
Laofang.getSaodiseng().saodi();
}
}
如果老方確認(rèn)小二和尚在練易筋經(jīng),就叫小三和尚。老王現(xiàn)在是不是省心多了,他只管下命令,該叫誰去掃達(dá)摩院的地由他師弟老方去負(fù)責(zé)。
我們替老王想的這個(gè)辦法就叫控制反轉(zhuǎn)(Inversion of Control,縮寫為 IoC),它不是一種技術(shù),而是一種思想——指導(dǎo)我們設(shè)計(jì)出松耦合的程序??刂品崔D(zhuǎn)從詞義上可以拆分為“控制”和“反轉(zhuǎn)”,說到控制,就必須找出主語和賓語,誰控制了誰;說到反轉(zhuǎn),就必須知道正轉(zhuǎn)是什么。你看,在緊耦合的情況下,老王下命令的時(shí)候自己要通過 new 關(guān)鍵字創(chuàng)建依賴的對象(小二和尚或者小三和尚);而控制反轉(zhuǎn)后,老王要找的掃地和尚由他師弟老方負(fù)責(zé),也就是說控制權(quán)交給了老方,是不是反轉(zhuǎn)了呢?
至于 AOP 的話,就留給大家在以后的學(xué)習(xí)當(dāng)中去理解吧。掌握了這 IOC 和 AOP 這兩個(gè)概念,再把 Spring MVC 學(xué)會,再學(xué)習(xí)其他的,比如說 Spring Boot 就會平滑很多。
要學(xué)習(xí) Spring,能讀的書不多,我能想到的只有《Spring實(shí)戰(zhàn)》,坦白地說,這本書很一般,但市面上比它好的書,我還不知道。
學(xué)完 Spring,就要學(xué) SpringMVC,推薦大家看松哥的視頻,在 B 站上雖然播放量不是特別大,但我覺得內(nèi)容特別棒——畢竟好兄弟!視頻地址我貼一下。
https://www.bilibili.com/video/BV1qp4y1n7D1
然后是 MyBatis,不用找書看了,直接看官方文檔就行,講得特別好。本身 MyBatis 也沒有特別難的東西,就是一些 XML 配置和動態(tài) SQL。
Spring+SpringMVC+MyBatis 這三個(gè)框架學(xué)完,可以說你就具備了開發(fā)企業(yè)級應(yīng)用的能力了。
至于 Spring Boot,我推薦看大哥純潔的微笑的博客,訪問量在千萬級別以上,影響了無數(shù)的初學(xué)者,我個(gè)人強(qiáng)烈推薦。地址就不用我貼了,直接搜“Spring Boot”這個(gè)關(guān)鍵字應(yīng)該就可以看到他的博客地址。
簡單解釋下 Spring Boot 是什么。
Spring Boot 是由 Pivotal 團(tuán)隊(duì)提供的一個(gè)全新框架,其設(shè)計(jì)目的是用來簡化 Spring 應(yīng)用的初始搭建以及開發(fā)過程。該框架使用了特定的方式來進(jìn)行配置,從而使開發(fā)人員不再需要定義樣板化的配置。說句人話就是,Spring Boot 不是什么新的框架,它默認(rèn)配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架。
反正有了 Spring Boot 后,我們要搭建一個(gè) Web 項(xiàng)目,基本上變得輕而易舉了,不像以前還得配置 web.xml,加載 Spring 和 SpringMVC,配置數(shù)據(jù)庫鏈接池、配置 Spring 事務(wù),配置日志文件,部署 Tomcat 運(yùn)行 Web 項(xiàng)目等等。
如果說你已經(jīng)掌握了 Spring、SpringMVC、MyBatis、Spring Boot 等內(nèi)容,就有能力進(jìn)行一些真正有用的應(yīng)用項(xiàng)目開發(fā)了,比如說學(xué)生管理系統(tǒng)、商城系統(tǒng)、博客系統(tǒng)、秒殺系統(tǒng)等等。
如果你覺得這些系統(tǒng)無從下手的話,其實(shí)可以到 GitHub 或者碼云上去找,很快就能找到一大堆。為了節(jié)省大家的時(shí)間,我直接給大家推薦兩個(gè)。
vhr(微人事),一個(gè)前后端分離的人力資源管理系統(tǒng),采用 Spring Boot 和 Vue 開發(fā),松哥出品,鑒于我和松哥鐵到差點(diǎn)睡一張床的原因,他贈送了我一個(gè)貢獻(xiàn)者的榮譽(yù)——唯一一個(gè)喲。
https://github.com/lenve/vhr
mall,一套電商系統(tǒng),好朋友宏哥的,相比 vhr,上手難度會大一些。但幾乎囊括一個(gè) Java 后端工程師所需要掌握的一切技術(shù),比如說 SpringBoot、MyBatis、SpringSecurity、Elasticsearch、RabbitMQ、Redis、MongoDB、Nginx、Docker、Druid、Lombok、Swagger 等等。
https://github.com/macrozheng/mall
當(dāng)然了,要做完整的 Java Web 項(xiàng)目,前端的一些知識肯定是少不了的,但不能放太多心思,界面丑點(diǎn)無所謂,重點(diǎn)在 Java 上面。
學(xué)習(xí)編程就是一個(gè)由混沌到有序的過程,如果碰到了理解不了的知識,不要懷疑自己適不適合編程,跳過就行了,這是再正常不過的事了——必須抱有一顆越挫越勇的心,我到現(xiàn)在還有很多 Java 的知識點(diǎn)沒搞懂呢,遇到了再說。不要著急,很多知識點(diǎn)都可以放到工作以后邊用邊學(xué)。
04、哪些 Java 知識不需要再學(xué)了
張無忌在學(xué)太極拳的時(shí)候,他爹的師父張三豐老爺爺就對他喊一定要把之前所學(xué)習(xí)的武功全部忘掉,**忘得越多就會學(xué)得越快。**同樣的,自學(xué) Java 的時(shí)候一定要先知道哪些 Java 知識不需要再學(xué)了,畢竟技術(shù)的更新迭代就好像火箭一樣快,Java 的一些知識點(diǎn)早已經(jīng)過時(shí)了。如果不懂得斷舍離,那學(xué)起來就不免太痛苦了。
1)AWT 和 Swing
真不知道為什么,我之前推薦的那些入門書里還在介紹 AWT 和 Swing,這就好像不知道大清朝早已經(jīng)亡了幾百年一樣。已經(jīng) 2021 年了,誰還會用 AWT 和 Swing 去開發(fā)桌面應(yīng)用呢?有人說是為了學(xué)習(xí)事件驅(qū)動,可拉倒吧,冠冕堂皇的理由呀!
就我所知,C++ 程序員會用 MFC,C# 程序員會用 Winform 和 WPF。甚至還可以用一種更時(shí)髦的技術(shù)(比如 Electron)把 Web 網(wǎng)頁裹一層華麗的外衣,變成可執(zhí)行文件。
2)Applet
作為網(wǎng)頁插件技術(shù),Applet 壓根就沒流行起來。2010 年我在日企的時(shí)候用的 Flex 作為富客戶端,瀏覽器要 Adobe Flash Player 插件,否則就無法運(yùn)行,馬上也要淘汰了。
3)XML
XML 還沒有被淘汰,應(yīng)用的地方還有不少,比如說 Maven 的 pom.xml 文件里就還在用。但是作為一種數(shù)據(jù)傳輸格式,它正在被 JSON 替代。至于復(fù)雜的 XML 操作 API(例如 XPath)就完全沒必要學(xué)習(xí)了,如果真的用到了,再去補(bǔ)也不遲。
4)JDBC
我個(gè)人不建議再學(xué)習(xí)偏底層的 JDBC 了,尤其是對于時(shí)間寶貴的自學(xué)程序員來說。與其花這點(diǎn)時(shí)間,不如把精力投入到 MyBatis 的學(xué)習(xí)上。當(dāng)然了,如果真的有時(shí)間,真的想打基礎(chǔ),研究一下也無可厚非。
5)Struts
Struts 是早年一個(gè)優(yōu)秀的 MVC 框架,單從技術(shù)的角度來看,還是蠻不錯的。但是自從有了 SpringMVC 后,Struts 就被拍死在沙灘上了。
6)Hibernate
在我剛參加工作那會(2010 年的時(shí)候),持久層框架用的正是 Hibernate。但時(shí)過境遷,Hibernate 太重量級了,學(xué)習(xí)成本太高,取而代之的是輕量級的 MyBatis?,F(xiàn)在有一種說法就是這種對象關(guān)系映射太過死板了,不如直接寫 SQL 來得靈活,像我很喜歡的一個(gè)輕量級框架 JFinal 就更偏重于在 Java 代碼中寫 SQL,而不像 MyBatis 和 Hibernate 在 xml 文件中寫。
7)JSP
JSP 在實(shí)際開發(fā)中,主要是作為 MVC 模型中的V(View)層出現(xiàn)的。它本來是為 Java 后端程序員開發(fā)前端界面而生的,但隨著技術(shù)的發(fā)展,前后端分離的流行,JSP 的生命周期已經(jīng)到頭了。
8)Servlet
雖然 SpringMVC 的底層是以 Servlet 為基礎(chǔ)的,是 JavaWeb 容器的基石,但 Servlet 的確已經(jīng)過時(shí)了。如果后面有空余時(shí)間的話,想鉆的話可以鉆一下,對服務(wù)器端接收請求數(shù)據(jù)和向前端發(fā)送響應(yīng)數(shù)據(jù)時(shí)會有一些幫助。
我這樣的說法可能不夠可觀,不夠顧及底層知識,但自學(xué)的時(shí)間成本還是要適當(dāng)控制一下。總之,我們應(yīng)該省下更多的時(shí)間去學(xué)習(xí)前面小節(jié)提到的重點(diǎn)知識!
05、學(xué)習(xí) Java 還需要補(bǔ)充哪些知識
這部分內(nèi)容我之前梳理過。但為了這篇文章的完整性,重新搬運(yùn)過來并做了一些內(nèi)容上的優(yōu)化??催^的同學(xué)就假裝重新復(fù)習(xí)一遍,沒看過的同學(xué)準(zhǔn)備好收藏了!
1)數(shù)據(jù)結(jié)構(gòu)與算法
毫無疑問,數(shù)據(jù)結(jié)構(gòu)對一名程序員來說非常重要,還是那句話程序=數(shù)據(jù)結(jié)構(gòu)+算法,這種說法無論放在什么時(shí)候都是成立的。
大部分的數(shù)據(jù)結(jié)構(gòu)課程,關(guān)注的重點(diǎn)都在如何從數(shù)學(xué)上實(shí)現(xiàn)一個(gè)數(shù)據(jù)結(jié)構(gòu),但在實(shí)際開發(fā)中,大部分主流語言都已經(jīng)內(nèi)置了常見的數(shù)據(jù)結(jié)構(gòu),比如說 Java。也就是說,對于大部分程序員來說,實(shí)際開發(fā)中,很難有需求要從零開始實(shí)現(xiàn)一個(gè)數(shù)據(jù)結(jié)構(gòu)。因此我們只需要做到下面幾點(diǎn)。
1、熟悉常見數(shù)據(jù)結(jié)構(gòu)的概念,比如說數(shù)組、堆棧、鏈表、哈希表等。
2、了解常用數(shù)據(jù)結(jié)構(gòu)之間的差異,比如說 ArrayList 和 LinkedList,我在之前的文章中有詳細(xì)說明過,可以點(diǎn)擊鏈接去查看下。
3、關(guān)注常用數(shù)據(jù)結(jié)構(gòu)的外圍算法,比如說如何對 List 和 Map 進(jìn)行查找。
4、關(guān)注數(shù)據(jù)結(jié)構(gòu)使用中容易出錯的地方,比如說線程是否安全等。
...
B 站上浙江大學(xué)的一個(gè)數(shù)據(jù)結(jié)構(gòu)的課還不錯,很系統(tǒng)很經(jīng)典,適合小白入門。視頻地址如下:
https://www.bilibili.com/video/BV1JW411i731
以我接觸的領(lǐng)域來說,大部分普通的業(yè)務(wù)系統(tǒng)都不會涉及到太復(fù)雜的算法,因此我沒有在算法上投入過多時(shí)間。但如果你將來要從事一些特殊的領(lǐng)域,如果算法跟不上,可以說是“寸步難行”,比如說圖形處理領(lǐng)域,無論是圖像的變化還是增強(qiáng),無一例外都要用到矩陣變換,因此就必然涉及到線性代數(shù)的內(nèi)容,再往深處學(xué)的話,必然會牽扯出更多的知識。
所以學(xué)習(xí)算法要視情況而定,如果想走算法崗,那么《算法第4版》、《算法導(dǎo)論》、《數(shù)學(xué)之美》、《編程珠璣》、《劍指offer》這些書都要耐著性子啃一啃。
如果想進(jìn)大廠,或者對算法有著強(qiáng)烈的興趣,可以到 GitHub 上看一看 labuladong 的算法小抄,這個(gè)倉庫我也看了,總共 60 多篇原創(chuàng)文章,都是基于 LeetCode 的題目,涵蓋了所有題型和技巧,而且做到了舉一反三、通俗易懂,絕不是簡單的代碼堆砌。離線版可以點(diǎn)擊鏈接下載。
2)設(shè)計(jì)模式
我認(rèn)為設(shè)計(jì)模式是初中級程序員邁向高級程序員的必經(jīng)之路。有不少程序員,前期沖勁十足,但后繼乏力,都是吃了設(shè)計(jì)模式的虧。在工作的前幾年,大部分程序員都處于熟悉編程語言的階段,也就是處于“技”的階段,隨后就要進(jìn)入“術(shù)”的階段了。在編程領(lǐng)域,“術(shù)”的典型代表就是“設(shè)計(jì)模式”。
我自己推薦的一本書是《設(shè)計(jì)模式之禪》,代碼是用 Java 實(shí)現(xiàn)的,讀起來比較輕松,也更符合國內(nèi)程序員的閱讀習(xí)慣。另外就是我上次推薦的 Refactoring Guru 網(wǎng)站,里面附帶的圖片非常精美,閱讀起來的視覺效果會比較豐富。

在線閱讀地址如下所示:
https://refactoring.guru
離線版可以通過下面這個(gè)鏈接下載(無套路,不需要解壓密碼):
3)JVM 和源碼
JVM 是相對難吃透的一個(gè)環(huán)節(jié),但卻十分的重要,尤其是在遇到一些性能瓶頸的時(shí)候。初學(xué)者很難搞懂,所以我希望大家能在儲備了大量的實(shí)戰(zhàn)經(jīng)驗(yàn)后再來深入的理解 Java 虛擬機(jī)。
JVM 屏蔽了與具體操作系統(tǒng)平臺相關(guān)的信息,使得 Java 程序只需要生成在 Java 虛擬機(jī)上能運(yùn)行的目標(biāo)代碼,也就是字節(jié)碼,就可以實(shí)現(xiàn)跨平臺的訴求了。JVM 學(xué)得通透的話,可以說是非常牛逼的程序員了。
推薦一本書,就是周志明老師的《深入理解 Java 虛擬機(jī)》。推薦一個(gè)視頻,尚硅谷宋紅康老師講解的,地址如下:
https://www.bilibili.com/video/av83622425
面試的時(shí)候,面試官都特別喜歡問一些源碼方面的知識,比如說 HashMap 的一些經(jīng)典問題,加載因子為什么是 0.75?哈希沖突的時(shí)候,HashMap 是如何查找并確認(rèn)元素的等等,這些問題只有通過源碼才能得出比較準(zhǔn)確的回答,對吧?
我有個(gè)同學(xué)說過一句話,給我的印象特別深刻,就是“有啥解決不了的?只要你肯閱讀源碼。”說起來源碼,我是不太建議新手去閱讀,容易勸退。不信,你讓一個(gè)小學(xué)生去讀一下《百年孤獨(dú)》,我保證他會從此對閱讀失去興趣。等有了一些編程經(jīng)驗(yàn)后,再去閱讀源碼,就會有很大的收獲。
羊哥出過一個(gè)視頻,詳細(xì)地介紹了如何閱讀 JDK 源碼,推薦給大家。地址如下:
https://www.bilibili.com/video/BV1V7411U78L
4)操作系統(tǒng)、計(jì)算機(jī)組成原理和計(jì)算機(jī)網(wǎng)絡(luò)
為什么要學(xué)習(xí)操作系統(tǒng)呢?第一,面試要考;第二,無論學(xué)習(xí)哪門子編程語言,比如說 Java、C/C++,都需要和操作系統(tǒng)打交道,像 Java 中的多線程技術(shù),其實(shí)是由操作系統(tǒng)來負(fù)責(zé)進(jìn)程和線程管理的;第三,學(xué)習(xí)操作系統(tǒng),還能學(xué)到內(nèi)存分配方面的知識。
我推薦清華大學(xué)的《操作系統(tǒng)》課,雖然清華大學(xué)的校門進(jìn)不去,清華大學(xué)的視頻課還是可以白嫖的嘛。地址如下:
https://www.bilibili.com/video/BV1js411b7vg
眾所周知,計(jì)算機(jī)是由 CPU、內(nèi)存、顯示器這些設(shè)備組成的硬件,但我們大學(xué)畢業(yè)后,往往從事的是軟件方面的開發(fā)工作。那怎樣才能在硬件和軟件之間自由穿梭呢?答案就是學(xué)好計(jì)算機(jī)組成原理。弄明白了計(jì)算機(jī)的組成原理,也就對整個(gè)軟件開發(fā)有了一個(gè)系統(tǒng)的認(rèn)知,不論是計(jì)算機(jī)的硬件原理,還是軟件架構(gòu),都能很好的駕馭,隨之而來的,我們的職業(yè)發(fā)展機(jī)會也就更多了。
如果想深入學(xué)習(xí)計(jì)算機(jī)組成原理的話,我推薦哈工大的這門視頻課,整體評價(jià)非常高。地址如下:
https://www.bilibili.com/video/BV1WW411Q7PF
當(dāng)今這個(gè)時(shí)代,沒有網(wǎng)絡(luò)簡直無法生存,哪怕是在電梯里的一分鐘,我都受不了那種手機(jī)沒有網(wǎng)絡(luò)的狀態(tài)。我們所學(xué)的編程知識,如果脫離了網(wǎng)絡(luò),將變得毫無意義,因?yàn)闆]有哪個(gè)編程語言是要在單機(jī)環(huán)境下運(yùn)行的。
計(jì)算機(jī)網(wǎng)絡(luò)方面的視頻我推薦湖科大教書匠的《計(jì)算機(jī)網(wǎng)絡(luò)微課堂》,制作得非常用心,是一部不可多得的佳作。
https://www.bilibili.com/video/BV1c4411d7jb
這部分不推薦大家看書,比較枯燥,不如直接刷視頻來得直接。
5)項(xiàng)目管理與架構(gòu)
實(shí)現(xiàn)一個(gè)軟件系統(tǒng)的過程,不僅只有編碼,還涉及到項(xiàng)目安排,團(tuán)隊(duì)協(xié)調(diào)等一系列非技術(shù)因素,如果想從一名程序員走向管理崗,成為 team leader 或者開發(fā)經(jīng)理,軟件工程方面的知識就必須得跟得上。
這里我推薦幾本不錯的經(jīng)典書,其中有一本鄒欣老師的書,他剛出任 CSDN 副總裁,希望 CSDN 能在他的入駐后變得更好一些。他這本書的書名叫做《構(gòu)建之法》,我看過,還是很不錯的。另外還有兩本必讀,就是《人月神話》和《人件》,雖然有了歲月的痕跡,但依然值得深讀。當(dāng)然,關(guān)于軟件工程,最好的學(xué)習(xí)方法是觀察,觀察你所在的團(tuán)隊(duì)是如何處理工程問題的,然后思考,最終形成自己的方法觀。
要想寫出一個(gè)好而美的程序,需要經(jīng)過三個(gè)階段。
第一階段,有扎實(shí)的基本功,簡單點(diǎn)說,就是要做到語法熟練、框架熟練,成為一名能夠完成開發(fā)任務(wù)的“碼農(nóng)”。
第二階段,從“碼農(nóng)”到“工程師”,在局部上,不僅要能夠?qū)崿F(xiàn)功能,還能關(guān)注功能之外的維度,比如健壯性、低耦合、可擴(kuò)展等指標(biāo)。
第三階段,從“工程師”到“架構(gòu)師”,不僅在局部上追求一個(gè)模塊的好壞,而且還要從整個(gè)系統(tǒng)層面去掌控,合理安排資源的優(yōu)先級,保證整個(gè)系統(tǒng)不會出現(xiàn)腐敗等等。
要想成為一名優(yōu)秀的架構(gòu)師,除了自身的努力,也需要一點(diǎn)點(diǎn)運(yùn)氣,但靠讀書可能不夠,但這些經(jīng)典書籍還是要閱讀的,能給日常的工作帶來巨大的幫助。
《代碼大全》 《重構(gòu):改善既有代碼的設(shè)計(jì)》 《設(shè)計(jì)原本》 《大型網(wǎng)站技術(shù)架構(gòu)核心原理與案例分析》
最后
Java 程序員這條道路并不好走,不僅要學(xué)習(xí)很多新技術(shù)、新框架,還要及時(shí)補(bǔ)充必要的計(jì)算機(jī)基礎(chǔ)知識,底子硬的同時(shí)還要學(xué)會擁抱變化。
學(xué)習(xí)的過程,就好像登山一樣,大概有 80% 的人在這個(gè)過程中會掉隊(duì)。那么請相信我,只要目標(biāo)明確,努力加上堅(jiān)持,再加上一點(diǎn)點(diǎn)好運(yùn)氣,你就能登頂!
最后說一句哈,大家學(xué)習(xí) Java,是為了什么,我想大多數(shù)不是為了興趣,是吧?是為了找工作,那么終極的一步,我們需要在找工作之前刷一波面試題,然后找工作的機(jī)會也會提升很多。我推薦好朋友 Guide 哥的面試突擊,專門針對 Java 程序員的面試寶典。

通過上面這幅圖就能感受得到,非常全面,非常精彩。大家可以點(diǎn)擊我的公眾號名片在后臺回復(fù)關(guān)鍵字「面試」拉取到。
衷心的希望,大家都能在學(xué)習(xí) Java 的這條路上快樂一些,純粹一些,少聽少看一些那些焦慮文,什么 35 歲,什么學(xué)歷歧視,沉下心來,多學(xué)習(xí)一點(diǎn)知識,讓自己變強(qiáng)一點(diǎn),比什么都好!
一家之言,必然有不盡善盡美的地方,但只要能對大家的學(xué)習(xí)有些許幫助,我也就很滿足了!
這么硬核,別忘記點(diǎn)贊鼓勵下喲~
