Java 征途:行者的地圖

前段時間應 CSDN 邀請審覈 Java 知識庫內容,藉此我也有機會好好梳理了下本身的 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 征途上的同行者們參考。 而按這千差萬別的地圖走過的路徑,正巧構成獨一無二的你。

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


寫點文字,畫點畫兒,「瞬息之間」一切都變了。以爲不錯,可長按或掃描二維碼關注。
圖片描述

相關文章
相關標籤/搜索