Java 征途:行者的地圖

来源:http://www.cnblogs.com/aishangJava/archive/2017/08/14/7355892.html
-Advertisement-
Play Games

前段時間應因緣梳理了下自己的 Java 知識體系, 成文一篇望能幫到即將走進或正在 Java 世界跋涉的程式員們。 第一張,基礎圖 大約在 2003 年我開始知道 Java 的(當時還在用 Delphi),但到 2004 年本科畢業才開始正式決定學習 Java。 那時覺得用 Delphi 寫 C/S ...


前段時間應因緣梳理了下自己的 Java 知識體系, 成文一篇望能幫到即將走進或正在 Java 世界跋涉的程式員們。

第一張,基礎圖

大約在 2003 年我開始知道 Java 的(當時還在用 Delphi),但到 2004 年本科畢業才開始正式決定學習 Java。 那時覺得用 Delphi 寫 C/S 架構的程式沒什麼意思,Java 當時提出的 J2EE 規範概念,企業級架構感覺各種高大上,壓抑不住內心的欲望就這麼開啟了 Java 的征途。 老實說,當時一進入 Java 世界的大門就暈了,各種規範、概念和英文縮寫詞能把人整的暈暈乎乎。

  • J2SE
  • J2EE
  • J2ME
  • JSP
  • JDBC
  • JMS
  • EJB
  • JNDI
  • JDBC
  • JTA

隨便回憶了下當時一進來咋一看到的東西,很多陌生的英文名詞縮寫(幸好那時 Java 還沒有各種框架百花齊放,要不更暈了),根本不知道該從哪裡入手學起。 而正好同學有本 JSP 的書,所以我就從 JSP 入手了。老實說那真是本爛書,我現在連名字都不記得了,大概記得是從一些例子入手搭建起一個 JSP 的 Demo 站點。 被各種環境、容器問題虐了千百遍後終於跑起了個例子,從本機瀏覽器終於看到例子里的頁面,有一秒鐘的成就感,然後就是茫然。 因為我根本搞不懂這一切是怎麼工作的,它們的原理是什麼? 繞了一大圈,走了很多彎路,如果再給我一次重來的機會,我會從基本 Java 語言基礎開始。

什麼是基礎?Java 是一門面向對象語言,最重要的概念是對象,而其所有的語法不過都是圍繞它展開。 而其他程式的基本的結構和變數:順序、迴圈、分支,有之前的其他語言基礎不過就是換了個形式而已。 理解了對象,那麼圍繞對象的概念:類、介面都是自然的延伸。 當然掌握了核心概念和基本的語法,也不過就是能寫個 Hello World 的水準,但重點是你的起點對了,徵程就近了。

這個階段通過讀好書和作一些基本的練習來熟悉語言和相關類庫。 Java 起步的書籍在我的印象中《Thinking In Java》挺合適(哎,我繞了一圈才看到這本書),當然也還有些其他不錯的書,如《Introduction to Java Programming》,《Core Java》。 我的感受是這類起步書可以多弄幾本,一個知識點參照著讀,畢竟一個作者可能也有疏漏,橫向閱讀,而不是縱向把一本從頭啃到尾。 一個知識點一個知識點的抓住,搞通,一步就踩一個深深的腳印,不要到處亂跑,結果都是泛泛,起步慢點,後面才能快。

關於基礎,在我眼中最核心和重要的部分並不多,我這裡簡單列下:

  • 核心概念
    • 對象模型
    • 介面設計
  • 類庫
    • lang
    • collections
    • concurrent
    • io

這裡核心概念就不多寫了,基本體現在所有 Java 的代碼庫中,伴隨始終,差別隻在理解和抽象的適度與否。 JDK 那麼多庫,這裡只列了上面幾個,lang 裡面其實最重要的我想說的是 String,這是很多人都忽略的。 C 里沒有 String 的概念,Java 則提供了這個對象,但沒能好好理解並用好這個對象,以後會讓你踩無盡的坑,還反覆踩。 不信去搜搜關於各種字元編碼亂碼的低級問題有多少,除此還有由於 String 引發的各種性能問題。 由 String 這個核心對象發散出去關於字元的編碼,字元的位元組表達(大端、小端、網路位元組序),對 GC 的影響,正則表達,模式匹配,這可能是 Java 里內涵最豐富的對象了。

Collections 框架提供了大量常用的數據結構封裝,基本讓 Java 程式員告別了手動實現你從數據結構課程上學來的絕大部分常用數據結構。 正確理解不同數據結構的適用場景比自己能手動實現它們有用的多,沒事多看看 Collections 中的代碼,都是大師級的實現啊。 記得我學 Java 時還是 JDK 1.3,進入工作後主流是 1.4,那時是沒有 concurrent 庫的。 自己處理線程間通信時,被各種通知遺漏、早通知,死鎖搞的死去活來。 所以現在的 Java 的程式員都要幸福的多了,concurrent 又一個大師級的類庫實現,也是可以沒事多看看,多揣摩。 IO 庫,不論是文件 IO 還是網路 IO 都是 Java 程式員最常打交道的,熟悉它的 API 固然重要, 但更重要的是理解是如何對 IO 操作的抽象和建模,理解不同的 IO 模型其背後的本質與原理。

好了,當完成可上面這些基礎內容的學習後,我們得到了第一張地圖,像下麵這樣。

第二張,技能圖

即使掌握了第一張圖要在 Java 的世界自由馳騁還是有點小困難的。 現在 Java 的一個主流使用場景是後端開發,這一領域在它的上一個時代是 J2EE(現在叫 Java EE) 的天下,又稱為 Java 企業版。 J2EE 包含的內容很多,核心是 EJB。當時我剛在學校里累死累活學完分散式對象技術,以 CORBA 和 EJB 為例來實作。 又看了好幾本 EJB 設計模式和最佳實踐的書,然後還沒畢業進入公司一實習發現大家說現在不用 EJB 了,我們用一個叫 Spring 的東東。 IoC、DI 等新的英文縮寫又出現了,一口老血還沒來得及噴出,又重新振作開始新的學習徵程。

是的,EJB 在那時(2005)開始慢慢退出主流。 音樂學博士 Rod Johnson 一本 《Expert One-on-One J2EE Development without EJB》宣判了 EJB 的死刑,Spring 登上歷史舞臺。 從此 Java 進入了 Framework 大發展的時代,SSH/SSI 等技術框架組合形成了 Java 開發的主流,並持續影響至今。

Java 的框架越來越多,生態越來越大,初學者面對如此龐雜的框架,想必也是內心茫然,感覺真是學無止境,沒完沒了。 其實真實的項目中,真正用到的框架並不多,SSH/SSI 基本作為 Java Web 項目的核心框架,是你上手的核心利器,自需熟練掌握。 但知其然還需知其所以然,Spring 接管了對象創建和相互依賴管理的工作,把設計模式隱藏在框架的運用中,很多人只知用而未曾思。 Web 開發從早期的 JSP 一大亂燉(HTML + CSS + JS + Java + SQL,早期我就是把所有這些都放一個 JSP 里,想想有多難維護),到 MVC 的職責劃分。 僅僅一個 View 層也經歷了從標簽庫到頁面模版(Velocity、Freemarker)的進化,如今更徹底的前後端分離模型我更喜歡。 曾幾何時調幾個頁面的 CSS 樣式殺死了我多少時間,專業化分工是有利於效率和深度的,互聯網和移動互聯網大發展引發的 Web 版本進化,讓如今的前端複雜度已不在後端之下。

那麼作為一個 Java 工程師我到底要掌握多少框架才夠?這是一個偽命題,因為掌握多少個都不會夠。 核心的熟練掌握幾個,泛泛瞭解大量的,掌握快速學習框架的能力才是解決之道。 還是以 SSH/SSI 為例,專業前端分工的趨勢越發明顯,徹底解放了後端 Java 工程師的苦惱。 以 Spring 為例的框架解決了大量通用型的問題,今天的 Spring 比當初大了幾十倍不止吧(把所有以 Spring 冠名的子項目算上的話),都是解決特定的通用問題。 所以當你寫代碼時突然想寫個以 Util 命名的類時,停住想想這是一個解決通用問題的類麽,不妨搜搜現成的類庫,比如說不定 Apache Commons 里就有你需要的代碼。 通用類庫和框架讓我們解放出來專註業務邏輯與效率,這很可能是你的代碼最有價值的部分,有程式員可能會抱怨這些沒技術含量,而我認為能用最有效的技術實現業務價值最大化才是最有技術含量的事。

框架如兵器,十八般(遠不止十八)兵器我未必樣樣會,但我們得有一樣能力,如張無忌學太極劍一樣,臨敵學劍還能勝之。 這裡面的訣竅不在學習招式,好比你也許覺得你 Hibernate 用法掌握的爐火純青又如何,一上線資料庫卻先崩潰了。 這裡的本質還在理解關係(SQL)資料庫,現在也許還需要加上對特定非關係(NoSQL)資料庫的原理與機制的理解,甚至包括對 O/R 映射模型的本質理解。

所以,基礎像內功、框架如兵器、運用為招式,存乎一心、運用之妙,三者融會貫通,則已可在 Java 世界縱橫一方。 如上所述,基於此我們有了第二張地圖。

第三張,延伸圖

而第三張圖,我已無法再給出一個我認為稍具普適性的建議。 到了這個階段每個人的成長髮展方向會受其環境和實際情況影響,我以自身為例稍加說明。 進入互聯網公司後這幾年,Java 技術的發展開始從 J2EE 容器化的單一應用向 SOA 和微服務發展變遷。 規模化的分散式系統成為常態,所以我更多的相關工作便集中於此領域。 一方面縱深挖掘繼續補全知識盲區,比如分散式程式的基礎是 RPC 調用,RPC 的本質是網路加對象序列化。 相應就去徹底搞懂 TCP 的原理,Unix/Linux 下網路編程模型,幾種不同的網路 IO 模型。 然後再上升到 Java 基於此提供的網路編程模型,BIO(阻塞)、NIO(非阻塞)和 AIO(非同步IO),並結合實際工作實踐去深入理解。

在這個過程接觸了大量不同的 RPC 技術,從 Java 自帶的 RMI 到 WebService 技術規範。 之後一些更簡潔、性能更強大的 RPC 框架層出不窮,如 Hessian、Thrift 等等。 不同框架的本質依然如一,隨著服務化的發展基於 RPC 框架又進一步衍生出提供額外增值功能的服務框架,如阿裡開源的 Dubbo。 隨著工作實踐的深入,向下有可能又會進入 JVM 層面去分析對象的記憶體使用,線程的調度運行和延時情況。 這個階段發揮核心作用的依然是前面說的快速學習並應用於工作實踐的能力。

與縱深的另一面是橫向擴展,隨著工作性質的變化也可能需要更寬廣的技術知識面。 比如成為架構師後,對技術知識面的廣度要求某些方面會更高。 有方法的技術學習和涉獵技巧讓你能更快擴張技術寬度,站在更高維度來審視不同的技術方向和產品,最有效的做出合適的技術決策。

在這個階段的每個人都可能面臨不同的環境和實踐,所以這階段形成的地圖會千差萬別。 下麵是我的第三張圖,僅供走在 Java 征途上的同行者們參考。 而按這千差萬別的地圖走過的路徑,正巧構成獨一無二的你。

即使你現在還沒地圖,但也別茫然而永遠的駐足不前。 保持前進總會找到路,其實我就是這麼過來的,一直以來,不敢止步。

Java學習交流QQ群:523047986  禁止閑聊,非喜勿進!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 逆向工程1.什麼是逆向工程mybaits需要程式員自己編寫sql語句,mybatis官方提供逆向工程 可以針對單表自動生成mybatis執行所需要的代碼(mapper.java,mapper.xml、po..)企業實際開發中,常用的逆向工程方式:由於資料庫的表生成java代碼。2.下載逆向工程myb ...
  • 巨集觀上: 1.技術廣度方面至少要精通多門開源技術吧,研究過struts\spring等的源碼。2.項目經驗方面從頭到尾跟過幾個大項目,頭是指需求階段,包括需求調研。尾是指上線交付之後,包括維護階段。3.架構經驗方面有過分散式系統的架構和開發經驗。對於跨系統的結構優化,數據存儲的性能指標等有豐富經驗。 ...
  • Java的三大版本是什麼?它們有什麼功能?Java另一個與三有關的三大環境是什麼?它們是什麼關係?併列還是包含?Oracle公司官網UI更新後,Java又怎麼下載?小星星帶你一探究竟。 ...
  • 本篇文章講解的是在centos7.3下配置 Apache2.4 + MySQL5.7 + PHP7.1.8 一.Apache 1.查看httpd包是否可用yum list | grep httpd 2.安裝Apacheyum install httpd 3.配置servernamevi /etc/h ...
  • 上一章節,我們講解了通過mybatis的懶載入來提高查詢效率,那麼除了懶載入,還有什麼方法能提高查詢效率呢?這就是我們本章講的緩存。 mybatis 為我們提供了一級緩存和二級緩存,可以通過下圖來理解: ①、一級緩存是SqlSession級別的緩存。在操作資料庫時需要構造sqlSession對象,在 ...
  • 上一篇我們介紹了JVM的基本運行流程以及記憶體結構,對JVM有了初步的認識,這篇文章我們將根據JVM的記憶體模型探索java當中變數的可見性以及不同的java指令在併發時可能發生的指令重排序的情況。 記憶體模型 首先我們思考一下一個java線程要向另外一個線程進行通信,應該怎麼做,我們再把需求明確一點,一 ...
  • 目錄 · 初步認識 · Java里程碑(關鍵部分) · 理解虛擬機 · Java虛擬機種類 · Java語言規範 · Java虛擬機規範 · 基本結構 · Java堆(Heap) · Java棧(Stacks) · 方法區(Method Area) · 直接記憶體(Direct Memory) · 本 ...
  • 類與Class對象 類是程式的一部分,每個類都有一個Class對象,即每當編寫並且編譯一個新類的時候就會產生一個Class對象。當程式創建第一個對類的靜態成員的引用的時候,會將該類動態載入到JVM中,這個說明瞭類的構造起器也是一個靜態方法,即使在構造器之前並沒有使用static關鍵字。所以java程 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...