技術大佬用1w+字來告訴你該讀什麼書,循序漸進,並提供百度雲盤下載地址。重要的是還有學習方法。
請肆無忌憚地點贊吧,微信搜尋【沉默王二】關注這個在九朝古都洛陽苟且偷生的程式設計師。
本文 GitHub github.com/itwanger 已收錄,裡面還有我精心為你準備的一線大廠面試題。
回想起 10 年前我學習 Java 那會,資源極度匱乏,老師給我們推薦了兩本書,一本《Java 程式設計思想》,一本《Java 開發寶典》。老師以為第一本書講理論,第二本書講實戰,完美的組合。
但實際上呢,畢業的時候,班裡面只有 13 名同學從事了軟體開發的工作,其餘 30 多名學生要麼大一的時候轉專業,要麼很早就放棄程式設計了。
《Java 程式設計思想》是本經典的好書,沒錯,但作為入門書籍的話,只會勸退。《Java 開發寶典》更是勸退書,裡面用 Java 做成的專案都很經典,比如說瀏覽器,五子棋,但小白根本駕馭不了啊!
10 年過去了,我已經擁有 10 多年的程式設計經驗了。別問,問就是加班加出來的。那我在 Java 程式設計方面已經有了自己的一些心得和體會,所以我在知乎上推薦了一個書單,閱讀人數超過了 66 萬,點贊數 1200+,說明大家都很受用,都很喜歡啊。
地址貼一下,需要的同學可以去圍觀一下。
https://www.zhihu.com/question/269505829/answer/933582331
上面這個回答裡面包含了 13 本經典的書籍,並且是按照循序漸進的方式,相信同學們看完後會來私信感謝我的。不過,這個回答已經過去了一年多時間了,我想再新增一些書單進去,仍然按照入門→進階→深入的順序。
01、入門
《Java 核心技術卷 1》
《Head First Java》
注意跳過 Swing、AWT、Applet 這些章節。當然了,你也可以看一下我寫的這些 Java 教程,比較通俗易通一些,數了數,差不多 200 篇,還是非常全面給力的。
- 《鳥哥的 Linux 私房菜》
為什麼要學 Linux 呢?因為在實際的開發工作中,專案基本上都要部署到 Linux 環境下。Windows 作為伺服器的很少,除了慢沒別的原因。
假如能夠提前掌握一些 Linux 基本操作的話,不僅簡歷上是加分項,工作中更能快人一步。
《Maven 實戰》
《Git 權威指南》
在我剛學 Java 那會,程式碼只能在本地,要想進行版本控制的話,還得裝一個 SVN 伺服器和客戶端。另外,還不能雲同步,換臺電腦的話,基本上要把程式碼和專案依賴的 jar 包重新拷貝一遍。
要知道,程式碼都是很瑣碎的檔案,複製貼上起來非常慢;如果專案比較大的話,依賴的 jar 包也比較多,複製貼上起來就更慢了。
現在好了,有碼雲、GitHub 這些雲倉庫可以用,多臺電腦進行同步非常方便。再配合 Maven(專案構建工具) 和 Git(版本控制工具),玩起來 666 啊!
02、進階
- 《Java 程式設計思想》
《Java 程式設計思想》這本書確實沒得說,質量很高,但需要放在 Java 入門後再去讀,這樣才能真正地去理解思想。
很多沒有足夠程式設計基礎的同學,盲目自信,直接開啃這本書,然後他們發現,啃得很痛苦,這就是因為沒有根基的原因造成的,就像沒有學會走就開始跑一樣,摔得很痛。
作者在前言裡已經表明了,讀者需要知道基本的程式語句(比如 C裡面的 if 和 for),也就是說,作者假設讀者已經熟悉 C 的一些語法。可想而知,沒有程式設計基礎的同學在讀這本書的時候是多麼痛苦啊。
我就是在大學老師的誤導下開啃這本書的,第一遍,只讀了前言,就讀不下去了,晦澀,難懂。實習了一年結束後,我第二次讀這本書,仍然覺得頭大,強忍著,讀了差不多 200 頁,耐力就消耗殆盡了。
直到兩年前,我再重拾這本書,發現讀起來津津有味,每讀一個章節就產出一篇文章,這本書的價值真正地體現了。為什麼呢?因為我已經有多年的程式設計經驗,結合書中的理論知識,讀起來就有一種“恍然大悟”的感覺。
《Java 程式設計思想》不僅教我們怎麼做,還告訴我們為什麼要這樣做,這才是 Java 這門程式語言的精髓。
不過,《Java 程式設計思想》出版的時間是 2007 年,已經十多年過去了,雖然經典,但避免不了過時。但幸好,有《On Java 8》,這本書的作者就是 Bruce Eckel,即《Java 程式設計思想》的作者。事實上,《On Java 8》就是《Java 程式設計思想》的第五版,第四版用的 JDK 還是 1.5,《On Java 8》用的 JDK 已經升級到了 Java 8。
那同學們可能就要問了,《On Java 8》上哪買啊?
不用買了,雷鋒已經將這本書翻譯成中文並且開源了,訪問上面的連結就可以在 GitHub 上閱讀了。
- 《Java 網路程式設計》
《Java 網路程式設計》這本書的整體評價並不算高,但是,對於學習 Java 網路程式設計的基礎知識非常的有用。
- 《Netty 實戰》
無論是構建高效能的 Web、遊戲伺服器、推送系統、RPC 框架、訊息中介軟體還是分散式大資料處理引擎,都離不開 Netty,在整個行業中,Netty 廣泛而成功的應用,使其成為了 Java 高效能網路程式設計的卓絕框架。
- 《Effective Java》
《Effective Java》第三版一共包含了 90 條極具實用價值的經驗規則,每條規則都值得 Java 程式設計師在實戰中去參照。這本書不需要按部就班地從頭到尾讀,可以隨意挑選任意小節進行閱讀,因為每條規則相對都是獨立的,儘管它們之間會交叉引用,但並不妨礙我們隨心所欲地閱讀。
作者 Josh Bloch 非常的牛逼,曾是 Google 的首席 Java 架構師,《Java開發者雜誌》將他列為世界上最頂尖的四十名軟體人物之一。Java 之父詹姆斯·高斯林對《Effective Java》的評價也非常的高。
- 《阿里巴巴 Java 手冊》
《阿里巴巴 Java 開發手冊》這本小冊子雖然只有幾十頁,但講的主要是一些典型的開發規約、程式設計規範、以及最佳實踐,已經成為業界普遍遵循的開發規範。
最新版是嵩山版,封面就有一個掃地僧,唉,這就厲害了呀!
- 《程式碼整潔之道》
軟體的質量,不僅依賴於架構,更與程式碼質量息息相關。而程式碼的質量與其整潔度成正比關係,越整潔的程式碼,其質量毫無疑問的就會越高。
《程式碼整潔之道》的第一章,對整潔程式碼下了一個定義,每個程式設計師都應該銘記在心。
1、整潔的程式碼力求專注,每個方法、每個類都應該全神貫注於一件事;命名更要給人一種“顧名思義”的感覺。
2、整潔的程式碼簡單直接,從不隱藏設計者的意圖。
3、整潔的程式碼應當有單元測試。
4、整潔的程式碼拒絕重複,其表達力直擊人的心靈。
《Java 併發程式設計實戰》
《Java 併發程式設計之美》
《實戰 Java 高併發程式設計》
對於程式來說,如果具有併發的能力,效率就能夠大幅度地提升。對於程式設計師來說,如果精通 Java 併發程式設計的話,掙錢能力就會大幅提升,這話真的不是調侃,而是良心話啊。
這三本 Java 併發方面的書可以結合起來看,互相補充,幫助同學們在這方面快速地提高。
- 《Java 效能權威指南》
通過閱讀《Java 效能權威指南》這本書,我們可以運用 4 個基本原則最大程度地提升效能測試的效果、使用 JDK 自帶的工具收集程式的效能資料、理解 JIT(即時編譯器)編譯器的優缺點、調優 JVM 垃圾收集器、最大程度優化多執行緒等等。
《Spring 實戰》
《Spring 揭祕》
Spring 是 Java 平臺的一個開源框架,為基於 Java 構建的 Web 應用程式提供了大量的擴充支援。
1、Spring 能幫我們根據配置檔案建立以及組裝物件之間的依賴關係。
2、Spring 面向切面程式設計能幫助我們無耦合的實現日誌記錄、效能統計、安全控制。
3、Spring 能非常簡單地幫我們管理資料庫事務。
4、Spring 能與第三方資料訪問框架(如 MyBatis、JPA)無縫整合。
5、Spring 能方便的與 Java EE(如 Java Mail、任務排程)整合。
《Spring 實戰》和《Spring 揭祕》能夠幫助同學們對 Spring 有一個更加全面的瞭解和掌握。
- 《Spring Boot+Vue全棧開發實戰》
Spring Boot 是由 Pivotal 團隊提供的全新框架,其設計目的是用來簡化新 Spring 應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。簡單來說,就是 Spring Boot 其實不是什麼新的框架,它預設配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架。
Spring Boot 方面的好書不多,索性就推薦一下我的好朋友江南一點雨的書,他本人還錄製了很多免費的視訊,這些視訊配套著他的書看,絕對可以對 Spring Boot 有著充分的掌握。
這個連結是江南一點雨的教程合集,我覺得質量還是很高的,我自己在學習 Spring Boot 的時候就參照了不少。
《圖解 HTTP》
《HTTP 權威指南》
程式設計師,畢竟是搞 IT(Information Technology)的,網路這一塊還是很重要的。HTTP 全稱是 HyperText Transfer Protocal ,即:超文字傳輸協議,從 1990 年開始就在 WWW 上廣泛應用,是現在 WWW 上應用最多的協議,HTTP 是應用層協議,當你上網瀏覽網頁的時候,瀏覽器和 Web 伺服器之間就會通過 HTTP 在 Internet 上進行資料的傳送和接收。
《圖解 HTTP》和《HTTP 權威指南》很值得去讀一讀。
《高效能 MySQL》
《MySQL 必知必會》
《MySQL 技術內幕-InnoDB 儲存引擎》
MySQL 由於效能高、成本低、可靠性好,已經成為最流行的開源資料庫,隨著 MySQL 不斷的成熟,越來越多大規模的網站開始使用 MySQL,比如維基百科、Google 等。
作為一名 Java 程式設計師,MySQL 必知必會啊。
- 《MyBatis 從入門到精通》
MyBatis 是一款優秀的持久層框架,它支援自定義 SQL、儲存過程以及高階對映。MyBatis 免除了幾乎所有的 JDBC 程式碼以及設定引數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或註解來配置和對映原始型別、介面和 Java POJO(Plain Old Java Objects,普通老式 Java 物件)為資料庫中的記錄。
除了《MyBatis 從入門到精通》這本書,同學們還可以直接閱讀 MyBatis 的中文網。
《Redis 實戰》
《Redis 深度歷險:核心原理與應用實戰》
Redis 是網際網路技術領域中使用最廣泛的儲存中介軟體,它是 Remote Dictionary Service 三個單詞中加粗字母的組合。
Redis 以超高的效能、完美的文件、簡潔的原始碼著稱,國內外很多大型網際網路公司都在用,比如說阿里、騰訊、GitHub、Stack Overflow 等等。它的版本更新非常的快,功能也越來越強大,最初只是用來作為快取資料庫,現在已經可以用它來實現訊息佇列了。
可以這麼說吧,掌握 Redis 已經變成了一項後端工程師必須具備的基礎技能。
- 《RabbtiMQ 實戰指南》
RabbitMQ 是一款開源的訊息佇列系統。主要特點在於健壯性好、易於使用、高效能、高併發、叢集易擴充套件,以及強大的開源社群支援。《RabbitMQ 實戰指南》從訊息中介軟體的概念和 RabbitMQ 的歷史切入,主要闡述 RabbitMQ 的安裝、使用、配置、管理、運維、原理、擴充套件等方面的細節。
- 《Kafka 權威指南》
每個應用程式都會產生資料,包括日誌訊息、度量指標、使用者活動記錄、響應訊息等。如何移動資料,幾乎變得與資料本身一樣重要。如果你是架構師、開發者或者產品工程師,同時也是 Apache Kafka 新手,那麼這本實踐指南將會幫助你成為流式平臺上處理實時資料的專家。
- 《第一本 Docker 書》
Docker 是一個開源的應用容器引擎,開發者可以利用 Docker 打包自己的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。
《第一本 Docker 書》可以幫助我們學習到 Docker 的安裝、部署、管理和擴充套件。
03、深入
- 《深入理解 Java 虛擬機器》
《深入理解 Java 虛擬機器》這本書牛逼到什麼程度,幾乎所有寫 Java 虛擬機器方面的文章,沒有一個不在文章最後註明:本文參考字周志明老師的《深入理解 Java 虛擬機器》。假如這篇文章最後沒有註明的話,那保不準是不尊重版權。
- 《重構,改善既有程式碼的設計》
《重構,改善既有程式碼的設計》這本書在業界的名聲也非常的響,只不過看起來就需要一些精力和耐力,上面這些書看完後,可以看這一本,對於重新審視現有程式碼有極大的幫助。
- 《深入理解 Nginx》
Nginx 是非同步框架的網頁伺服器,也可以用作反向代理、負載平衡器和 HTTP 快取。《深入理解 Nginx》這本書通過還原 Nginx 設計思想,剖析 Nginx 架構來幫助我們快速高效地開發 HTTP 模組。
- 《深入剖析 Tomcat》
Tomcat 是一個 Servlet 容器,並提供了作為 Web 伺服器的一些特有功能。基本上寫過 Web 程式的 Java 程式設計師都用過 Tomcat 作為伺服器,所以有時間的話,對 Tomcat 深入剖析一下還是非常值得去做的。
- 《JDK 裡的設計模式》
這並不是一本書,而是左耳朵耗子的一個帖子,文中列出了 JDK 中 23 個經典的設計模式,非常值得一看。
《深入淺出設計模式》
《設計模式之禪》
《Head First 設計模式》
大家都聽說過,學習設計模式非常的重要,那麼為什麼這麼重要呢,設計模式到底是什麼?打個比喻學程式設計就像學武功一樣。
武功要練得很牛逼,有兩樣東西不能丟。第一,是內功;第二,是武功祕籍。內功對應到程式設計就是我們程式設計基礎能力,那程式設計的設計模式就可以想象成武術中的武功祕籍。
設計模式就是根據不同型別場景,設計優雅的(編碼)解決方案。學好設計模式有很多好處,比如,容易看懂經典程式碼中的邏輯(很多優秀的開源框架大量使用了設計模式);應對面試時對答如流(設計模是面試重點);可以編寫出優雅的解決方案(或者程式碼)。
《演算法》
《大話資料結構》
現在的大廠面試,都特別喜歡考演算法和資料結構方面的知識,把這個作為程式設計師水平高低的一個考核標準。對於大部分業務開發來說,平常更多的是利用已經封裝好的現成介面、類庫,很少需要自己實現資料結構和演算法。
但是,如果知道這些類庫背後的原理,懂得時間、空間複雜度分析,絕對可以在工作中得心應手。掌握資料結構和演算法,不管對於閱讀框架原始碼,還是理解背後的設計思想,都是非常有用的。寫出高質量,達到開源級別的程式碼,演算法和資料結構,值得我們去掌握。
《大型網站系統與 Java 中介軟體實踐》
《大型網站技術架構:核心原理與案例分析》
《億級流量網站架構核心技術》
這三本書,如果能夠駕馭得了,那基本上可以這麼說,你已經是一名不可多得的 Java 方面的高階人才了。
沒有什麼難題是百度雲盤不能解決的,別忘了雙擊螢幕給個點贊!
百度雲盤連結:https://pan.baidu.com/s/1Sy89fIClwkQpdgCJK7i2dQ 密碼:znj6 點選雲盤連結輸入後面這密碼即可下載資源。
04、學習方法
我們都經歷過學生時代(有些同學還正在經歷),同一個班級,同一個老師,為什麼成績截然不同呢,有些同學天資聰穎,學什麼都快,有些同學學習能力差,但方法得體,也能取得好成績。如果既沒有天賦,又沒有學習方法,那就只配倆字了——對,學渣(大學的我就是一個學渣,不堪回首)。
那正確的學習方法是什麼呢?
第一,善用搜尋引擎。平常需要找資料,需要解決問題,如果自己一時半會沒有方法的話,就去搜。
Google 是第一選擇,Bing 是第二選擇,微信搜尋是第三選擇。PC 端的話,Google 和 Bing 就很靠譜,基本上要找的東西,都有好的結果。手機端的話,就用微信搜,答案也很靠譜。
第二,學會提問。如果搜尋引擎找不到答案的話,不要直接把問題拋到群裡,拋給同事、領導,或者大牛,要先對問題梳理一下。
我想問什麼,我的環境是什麼,問題的描述是否足夠清楚,態度是否端正。
不要唐突,不要冒昧,還要臉皮厚,很難,對吧?這就是提問的藝術啊。
第三,善於總結和歸納。很多同學給我反饋,“二哥,怎麼總是感覺記不住啊,學完就忘啊,有什麼好的辦法嗎?”
有啊,當然有。學完一個知識點,如果需要動手去實踐,那就去敲程式碼,敲一遍,還是理解,再敲一遍。如果真的感覺自己理解,嘗試寫篇文章,把自己的學習心得分享出來,看看是否能夠教會別人。
如果自己是半瓶水,倒出去只能是半瓶水;只有自己是一瓶水,倒出去才可能多餘半瓶水,對吧?
歸納總結的好處就是把零散的知識變成體系,在腦海中構建一副藍圖,日積月累,你就會發現自己也從一條小溪變成了海洋。
順帶推薦一下費曼學習法,靈感源於諾貝爾物理獎獲得者理查德·費曼,運用費曼技巧,只需要花 20 分鐘就可以深入理解知識點。聽起來是不是很神奇?
費曼學習法的四個步驟:
第一步,能把一個孩子教懂。這有點類似我們古代的一名詩人,白居易,他希望自己的詩連老太婆都能看得懂,那就是好詩。
具體怎麼做呢?拿出一張白紙,寫下要學習的主題,想一下,怎麼把它教給一個孩子,你會講哪些,然後記下來。
同學們可以把白紙換成 iPad 了,有道雲筆記了,等等。
第二步,回顧。當我們嘗試把知識點講給小孩子的時候,可能會卡殼,那就需要把這些卡殼的點重新學習,這些點可能就是我們認知的邊界——重新學習的地方。
第三步,簡化語言。如果發現表述的文字比較複雜,不夠清晰,那就嘗試把這些內容讀出來,直到通順,直到自然,直到足夠簡練。
第四,傳授。這點雖然是可選項,但真的非常重要。如果確保自己理解了,那就把它教給別人,看你能否把別人教懂,也就是我說的善於總結和歸納。
整個思維導圖( 推薦的線上網址有百度腦圖、ProcessOn)了,或者部落格(建議使用 markdown 格式)了。
第四,多去實踐。實踐出真知,到底馬謖行不行,給他一個街亭守一守,對吧,收不住就是紙上談兵,沒啥鳥用。
GitHub 或者碼雲上有很多優秀的開源專案,挑一些優質的,down 下來,去研究研究,在原有的程式碼基礎上,嘗試做一些優化,或者增加一些功能。
自己動手去做的過程中,你會發現,哇,真的有新大陸呀!
第五,熟練使用開發工具。Intellij IDEA、VSCode 都是非常流行的開發工具,能夠幫助我們在學習和工作中變得更加高效,裡面有沒有快捷鍵,有沒有什麼騷操作,對吧?
在使用 Intellij IDEA 編寫程式碼的過程中,一定要注重程式碼規範。提前就把 SonarLint、阿里巴巴開發規約這些外掛安裝上,寫完程式碼就 check 一下,按照提示對一些不良的習慣做出修正。
第六,學好英語。這一點真的真的真的非常非常非常重要重要重要,即便是英語功底本身很差,一定不要自暴自棄,對吧?雷軍敢一句“are you ok”走天下,你怕什麼?
況且,Chrome 瀏覽器可以安裝 Google 翻譯外掛,Intellij IDEA 可以安裝 Translation 翻譯外掛,只要稍微有點英語的底子,完全不用怵的。
英語水平提高了,可以看官方的文件,可以在 Stack Overflow 上找答案,可以檢視 JDK 原始碼,等等,程式設計水平就會與日俱增啊。
第七,注意休息。身體健康非常重要,千萬不要淪為工作的機器,認為年輕的時候就應該拼命的加班,通過加班提升技術,多掙點錢。這種想法可以有,但要節制,懂嗎?
任務緊,馬上要 deadline 了,可以適當的加班,但不要一年四季 365 天都在加班。花點時間去旅遊了,讀書了,學習了,談戀愛了,享受生活了。
年輕人,不要做個“奮鬥逼”,奮鬥可以,但不要盲目。想想腦袋上的那點頭髮,就別熬夜了。一個人加班,就會有第二個人加班,第三個人加班,第四個人無休止的加班。只有大家都不去加班了,工作的良性氛圍才會有啊!
以上,希望能夠對同學們有所幫助,peace。
我是沉默王二,一枚在九朝古都洛陽苟且偷生的程式設計師。關注即可提升學習效率,感謝你的三連支援,奧利給?。
如果你覺得文章對你有些幫助,歡迎微信搜尋「沉默王二」第一時間閱讀,回覆關鍵字「面試」可以免費獲取我為你精心準備的大廠面試攻略,回覆關鍵字【666】可以免費獲取 500G 高清教學視訊,回覆關鍵字【小白】可以獲取我手寫的 10W+ 字的【Java 小白進階之路】PDF;本文 GitHub github.com/itwanger 已收錄,歡迎 star。