天天看點

給小迷妹的一點肺腑之言!

我今年 51 歲(誇張手法)了,使用 Java 開發将近 30 年了,目前還在技術一線。

(嗯,其實我隻有 18 歲,為了讓自己說話顯得有資曆些,就一本正經的胡說八道了,嘿嘿,别杠,要杠就杠國文老師教的好)

雖然我是科班出身,但其實大學除了會談戀愛,就剩下會打遊戲了,Java 其實學的一塌糊塗。之是以畢業後還能找到工作,完全是因為當年“物以稀為貴”。

但是,自從我參加工作後,真的是使出了吃奶的力氣,去不停地梳理學習路線啊,找學習資料啊,自己動手去做練手項目啊,加上工作中的日積月累,就真的成為“Java 領域的優質創作者”了!

之前有小迷妹要我分享一些學習 Java 的小心得,是以我想把這些年的經驗一股腦的全部分享出來了,希望能幫助學弟學妹們在日常的學習當中少走一些彎路。

給小迷妹的一點肺腑之言!

01、Java 學習的重點是什麼

1)基礎知識

建議大家先讀一下我整理的這份 GitHub 上星标 115k+ 的 Java 教程,裡面涵蓋了 Java 所有的知識點,包括 Java 文法、Java 集合架構、Java IO、Java 并發程式設計和 Java 虛拟機,内容不多,隻講重點。

如果時間安排得比較得當的話,讀完這份教程大概也就 2 周的時間。有了這份 Java 教程作為甜點,學習 Java 的效率就會大幅度提升!

給小迷妹的一點肺腑之言!

然後如果你想看書的話,推薦《Java 核心技術卷 1》。不要問我為什麼不推薦《Java 程式設計思想》,因為後者雖然是一本聖經,但更适合有程式設計經驗的人讀,别問我為什麼知道,因為我當年就差點被勸退。另外,作者在緒論裡也說了閱讀這本書的前提條件。

本書假定你對程式設計有一定程度的熟悉:你已經知道程式是一些語句的集合,知道子程式/函數/宏的概念,知道像“if”這樣的控制語句和像“while”這樣的循環結構等等。

子程式/函數/宏這些概念其實在《C程式設計語言》一書裡有提到,是以如果有時間的話,還是可以先讀一讀這本書的,不要花費太多時間,看懂指針這些可以先跳過,等會寫了“hello world”這樣的小程式後再回頭去看可能會更容易了解一些。

如果你想看線上教程的話,其實可以看一看我的《教妹學 Java 專欄》,更輕松活潑,在 GitHub 上已經開源。

https://github.com/itwanger/Tech-Sister-Learn-Java
給小迷妹的一點肺腑之言!

再貼一個 CS 小姐姐的評語:

給小迷妹的一點肺腑之言!

如果你想看視訊教程的話,推薦尚矽谷和動力節點的視訊課,可以到 B 站上去看,有彈幕,學習起來會不那麼枯燥。不過,這兩份視訊教程的内容實在是太多了,以至于有些内容是可以跳過的,這樣能節省不少時間。比如說:

  • 環境變量配置
  • editplus 的安裝
  • 單行注釋
  • 多行注釋
  • 文檔注釋
  • 變量的定義
  • 三元運算符
  • JDK 的安裝
  • PATH 環境變量的配置
  • 變量
  • 資料類型
  • 循環控制語句 if、if-else、while
  • MyEclipse
  • 等等

我沒列全哈,像視訊教程中的這些内容,其實都是可以跳過的,有些是已經過時了,比如說 editplus、MyEclipse,現在一般直接用 VS Code 和 Intellij IDEA;有些已經不需要了,比如說 JDK 的安裝、PATH 環境變量的配置,有了 Intellij IDEA 後,這些都不需要了;有些不需要重複學習了,因為《教妹學Java》專欄和《GitHub 星标 115k+ 的 Java 教程》裡都介紹過了。

因為是自學,是以特别需要及時回報,就像打遊戲時候的通關獎勵一樣,每升一級都會給你送裝備,這樣就會更有動力。怎麼給自己獎勵呢?就是記筆記,一是可以梳理思路,溫習知識,二是可以當做備忘錄,友善以後複習。

當你看到自己的筆記一天一天增多時,你就會感覺渾身充滿了力量。如果不記筆記,過一段時間你可能就忘記了你曾經學過什麼,就會很沮喪。

給大家一個建議,把自己的這些學習筆記分門别類儲存好,在 GitHub 上建個 repo,把它們放進去,包括敲過的那些代碼。這樣做的好處就是,你敲過的那些“爛代碼”可以永久性質的儲存在網際網路上,甚至有可能被 GitHub 搬運到南京冷凍起來,哈哈。

Java 基礎當中,并發程式設計和 Java 虛拟機是難點,你可能在自學的過程中感受到阻力很大,沒關系的,如果一時半會學不會,是可以暫時跳過去學其他知識的,并不是說,一定要把并發程式設計和 Java 虛拟機全部吃透,你才能過下一關。

這一點和打遊戲可能還有些不同,打遊戲的話,這關的 boss 沒打過,下一關的地圖就重新整理不出來;學習不是這樣的,這個知識點沒學會,你是可以去學另外一個知識點的,等你把另外的知識點學會了,加上自己了解能力的增強,可以重新回過頭來學習的。

像 Java 虛拟機,很少有人能在自學階段就完全吃透的,因為很多性能優化的問題必須通過線上的一些問題真刀真槍的幹一仗,才能有所收獲。

2)Spring

網上總一些人,會很偏激,認為學 Spring 全家桶沒什麼用,他的理由是技術疊代太快,架構遲早是會被淘汰的,等你學會了,沒準架構就過時了。

還有一些人會杠,怎麼 Java 程式員變成了 Spring 程式員呢?

怎麼說呢?對于 Java Web 開發來說,Spring 已經成為和 Java 核心庫一樣的基礎設施,如果你想成為一名合格的 Java 程式員,Spring 是必經之路。

另外,一個很重要的點,就是,自學的過程中,你是沒有時間或者沒有能力徒手撸一個像 Spring 這樣強大的架構的。有了 Spring,就有 AOP 和 IoC,意味着你可以做一些企業級的開發了。

再說,Spring 是建立在 Java 之上的一個架構,核心就是 AOP 和 IoC,如果 Java 基礎不牢的話,也學不會 Spring。

怎麼才能更好的了解 AOP 和 IoC,我在之前的文章裡有介紹過。如果你想看到更專業的回答,AOP 可以翻到《碼農翻身》的 187 頁,認真地看一看。

IoC 可以看一看沈世鈞老師在知乎上的一篇文章,我認為解釋得很清晰:

https://zhuanlan.zhihu.com/p/64001753

Spring 中最經常用的一個子產品是 SpringMVC,是建立在 IoC 和 Servlet 的基礎上的,如果不懂 IoC 就搞不明白 SpringMVC 的配置,如果不懂 Servlet 就搞不懂 Spring 是如何注入以及攔截請求的。

再說說 Spring Boot。在沒有 Spring Boot 之前,開發一個 Web 項目的時候需要很多配置,比如說配置 web.xml,加載 Spring 和 SpringMVC;配置資料庫連結、配置 Spring 事務;配置日志檔案;還要部署 Tomcat 來運作 Web 項目,但有了 Spring Boot 之後,一切都從簡了。

當你想開發一個練手項目,比如說圖書管理系統的時候,就變得很輕松。直接打開下面這個網址:

https://start.spring.io/

然後選擇 Maven、Java 和基礎的依賴,比如說 SpringMVC、MyBatis、RabbitMQ 等等。

給小迷妹的一點肺腑之言!

再然後點選 generate 就可以生成一個初始化好的 Web 項目了。解壓後将其導入到 Intellij IDEA,打開主程式,增加一些内容,如下:

@SpringBootApplication
@RestController
public class HelloSpringBootApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloSpringBootApplication.class, args);
    }

    @RequestMapping("hello")
    public String hello() {
     return "Hello World";
 }
}
           

複制

運作主程式,在浏覽器位址欄通路

http://localhost:8080/hello

,就可以看到效果了,簡直不要太簡單了!有了這個基礎,你就隻關心具體的業務實作就行了,嗯,對,CRUD 就行了。

Spring 本身有很多優秀的設計理念在内,學習 Spring 架構的過程,其實也就加強了 Java 基礎知識的學習,等掌握了 Spring,你會發現:“哦,原來 Java 可以幹這麼多事情啊!”

Spring 怎麼學?可以到 B 站上看一下江南一點雨的視訊教程,我推薦過很多次了,不隻是因為我們關系好,更重要的是,他的視訊品質很高,很值得推薦給大家。

給小迷妹的一點肺腑之言!

如果你想把 Spring 學好的話,隻看視訊是不夠的,你得動手去實戰,那麼我和江南一點雨共同打造的 vhr 項目就很值得推薦給大家:

https://github.com/lenve/vhr

一個前後端分離的人力資源管理系統,文檔非常全面,特别适合自學。

強調一點哈,Spring Boot 的出現,并不意味着 Spring 和 SpringMVC 已經過時了,從設計目的上來說,Spring Boot 隻是實作了 Spring 的自動裝配,降低了項目搭建的難度。

從技術角度來說,Spring Boot 的底層依然是 Spring 的核心機制,也就是 AOP 和 IoC,Spring Boot 隻是一個承載者。在我看來,學習 Spring 的正确路徑應該是 Spring -> Servlet -> Spring MVC -> Spring Boot。

3)其他知識

比如說 MySQL、MyBatis、Redis 等等這些,甚至包括一些前端的知識,比如說 Vue、JavaScript、CSS 等等,你在做練手項目的時候是繞不開的,但經過 Spring 和 Java 基礎知識的洗禮後,再學習這些内容就會容易得多。

當然了,Java 的知識體系是非常龐大的,還有很多其他的知識點需要掌握,但不着急,可以放到工作以後邊用邊學。

我大學階段雖然蹉跎了歲月,但參加工作後,知道自己與實際工作要求的差距後,真的是有花大力氣彌補差距。幸好,程式設計是一個由混亂到清晰的過程,很多知識點都是有關聯的,如果一時間碰到了解不了的知識點,不必沮喪,也不要氣餒,每個人都一樣,并不是因為你學習差導緻的。

像 Java 中的 Comparator 接口,就和 CPU 執行比較的機制是類似的(參照《程式是怎樣跑起來的》)。假設要比較累加寄存器中存儲的 XXX 值和通用寄存器中存儲的 YYY 值,執行比較指令後,CPU 的運算裝置就會隐式的進行 XXX-YYY 的減法運算,結果為正表示 XXX 比 YYY 大,零表示相等,結果為負表示 XXX 比 YYY 小。

你看,是不是還挺有意思的?CPU 竟然和 Comparator 接口串聯起來了。

02、哪些 Java 知識不需要再學了

作為一名 51 歲的老 Javaer,見證了 Java 的太多技術變遷,包括:

IDE,從學生時代的 MyEclipse,到工作後的 Eclipse 和 NetBeans,再到最近些年“不可一世”的 Intellij IDEA。

Web 開發,從最初的 SSH 到 SSM,再到現在“一統天下”的 Spring Boot。

那到底哪些 Java 知識已經“過時”,沒必要繼續學習了呢?我判斷的依據主要是:

  • 實際開發是否用到
  • 是否有助于加深對技術的了解
  • 對面試是否有幫助

為了不引起大可不必的戰争,我這裡采用 @沈世鈞 老師的觀點,他本人是知乎上程式員話題下的優秀答主,是以如果有人覺得不适,那就别聽我倆的,該怎麼學就怎麼學,就當沒看見,沒聽見。

https://www.zhihu.com/question/305924723/answer/557800752

1)JSP

MVC(Model–View–Controller)大家應該都聽說過,是軟體工程中的一種架構模式,把軟體系統分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller)。

JSP,全稱 Jakarta Server Pages,也被稱為 JavaServer Pages,由 Sun 公司主導建立的一種動态網頁技術标準,可以将 Java 代碼和特定變動的内容嵌入到靜态的頁面當中,實作靜态頁面為模闆,動态生成部分内容的效果。

可以說是 Java 後端程式員開發前端頁面的福音,我七八年前為一家客戶開發的電商系統就用了 JSP,目前這套電商系統仍然在使用當中。

随着“前後端分離”模式的流行,JSP 已經變得不合時宜了,網際網路公司已經抛棄了這種模式,轉到徹底的“前後端分離”,後端負責提供服務接口(REST),前端(H5)通過接口發送和擷取資料(JSON)。

是以沈世鈞老師的建議是“完全可以放棄 JSP 的學習”,我持同樣的觀點。

2)Struts

Struts 是 Jakarta 項目中的一個子項目,采用 Servlet / JSP 的技術,算是一個經典的基于 MVC 模式的應用架構。但随着 Spring 的發展壯大,尤其是 SpringMVC 的利劍出鞘,Struts 已經被拍死在沙灘上了,盡管 SpringMVC 在設計之初,參照了很多 Struts 的優秀設計理念,但現實就是這麼殘酷,成王敗寇。

是以沈世鈞老師的建議是“不要再學習 Struts 了,從 SpringMVC 開始吧!”,我持同樣的觀點。

3)Hibernate

其實在我一開始參加工作的時候,項目中用的就是 Hibernate,是以算是印象非常時刻了。Hibernate 的設計初衷是為了最大可能地解放程式員,完全隔離資料庫,實作徹底的 OR 映射,但物極必反,大量的配置導緻 Hibernate 在使用的過程中變得沉重。

前些年,我接觸過一個更輕量級的架構,叫 JFinal,它的 SQL 語句基本上就寫在 Java 類中,反而讓我覺得更舒服和自然。

而近些年流行的 MyBatis,就做得比較溫和,沒有一股腦的隻支援配置,它也支援 SQL,進而帶來了靈活性。

是以沈世鈞老師的建議是“不需要再學習 Hibernate 了,學 MyBatis 就夠了!”,我持同樣的觀點。

4)Applet

Applet 誕生于 1990 年代中期,可以說是 Java 一炮走紅的功臣之一,但時過境遷,Applet 這種頁面插件技術已經被淘汰了,就連 Flex、Flash 這種表現力更豐富的浏覽器插件也已經淘汰了。

5)Swing

提到 Swing,肯定有些人又要杠,說 IDEA 不就是 Swing 開發的嗎?這種思維方式我是能了解的。

提一嘴 Applet 吧,當年 Java 在誕生之初就差點夭折了,幸好網頁浏覽器突然爆了,而 Applet 可以作為浏覽器插件為網頁提供更強的生命力,就一下子讓 Java 起死回生了。

現實中的桌面應用,要麼用 C++(MFC),要麼用 C#(WinForm、WPF),确實很少使用 Swing 了。Intellij IDEA 确實是例外,還有人杠 Eclipse 也是 Swing 開發的,其實不是的,Eclipse 是用 IBM 優化過的 SWT/JFace 開發的。

還有人杠 Swing 可以做五子棋啊、天天跑酷等等所見即所得的小遊戲啊,能提高初學者對程式設計的興趣啊,能提升初學者的程式設計思維啊,能打學習 Java 的基礎能力啊,比學習 Spring 全家桶強多了,況且架構是早晚會被淘汰的東西。

嗯。。。。。。我叫不醒一個裝睡的人,(逃

6)JDBC

Java Database Connectivity,簡稱 JDBC,是 Java 用來和資料庫通信的基礎架構,後來還發展出了一個 JTA(Java Transaction API)規範,《碼農翻身》這本書裡也用了較大的篇幅來介紹 JDBC。

按理說,JDBC 是挺重要的一塊内容,但在執行 JDBC 的增删改查操作時,如果每一次操作都需要打開一次連接配接,然後操作,然後關閉連接配接,那麼建立和銷毀 JDBC 連接配接的開銷就太大了。為了避免頻繁地建立和銷毀 JDBC 連接配接,就有了 JDBC 連接配接池,可以更好的複用已經建立好的連接配接。

像 HikariCP、Druid,是目前使用最廣泛的 JDBC 連接配接池,于是 JDBC 的學習優先級就排的越來越靠後了。

再次重申,**以上肯定有武斷之處,如果你發現,上面說的很多不大必要去學的都學了,沒關系,學了肯定有好處,開闊下思路。**這次強行圓回來,嗯,這樣應該就不會杠了。

最後,提醒大家一點,就是不要在語言上限定自己,比如說我是 Java 程式員,對其他的程式設計語言都特别排斥,這樣的想法很可能就把路走窄了!

在學習階段,可以專注于一門程式設計語言,比如說 Java,徹徹底底把 Java 這條學習路線梳理清楚了,再去切換到其他賽道,你就會感覺很輕松。

我大學階段是沒有學 C 語言的,但後來發現如果要學習作業系統的話,C 語言是必須學的,再加上我妹當時也在學 C 語言,她們老師講的聽不懂,是以我就補了一段時間的 C 語言,除了指針那塊确實比較繞以外,沒發現特别難的地方。

重要的是,原來有一些 Java 裡面了解的不是很清晰的概念,比如值傳遞,竟然在學習 C 語言後豁然開朗了。

有了 C 語言作為基礎後,再讀《深入了解計算機系統》和《程式是怎樣跑起來的》,就會感覺沒那麼上頭了。

Java 的整個知識體系是非常龐大的,想要學得好,必須得挑重點,不能一鍋端,否則一個月,甚至一個學期,你都不會感覺有什麼明顯的進步。

好了,我是二哥呀,我們下期見~