溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java 征途:行者的地圖

發(fā)布時(shí)間:2020-07-17 16:41:59 來(lái)源:網(wǎng)絡(luò) 閱讀:142 作者:沙漏半杯 欄目:編程語(yǔ)言

第一張,基礎(chǔ)圖

 以前覺(jué)得用 Delphi 寫 C/S 架構(gòu)的程序沒(méi)什么意思,Java 當(dāng)時(shí)提出的 J2EE 規(guī)范概念,企業(yè)級(jí)架構(gòu)感覺(jué)各種高大上,壓抑不住內(nèi)心的欲望就這么開(kāi)啟了 Java 的征途。 老實(shí)說(shuō),當(dāng)時(shí)一進(jìn)入 Java 世界的大門就暈了,各種規(guī)范、概念和英文縮寫詞能把人整的暈暈乎乎。


J2SE

J2EE

J2ME

JSP

JDBC

JMS

EJB

JNDI

JDBC

JTA

隨便回憶了下當(dāng)時(shí)一進(jìn)來(lái)咋一看到的東西,很多陌生的英文名詞縮寫(幸好那時(shí) Java 還沒(méi)有各種框架百花齊放,要不更暈了),根本不知道該從哪里入手學(xué)起。 而正好同學(xué)有本 JSP 的書(shū),所以我就從 JSP 入手了。老實(shí)說(shuō)那真是本爛書(shū),我現(xiàn)在連名字都不記得了,大概記得是從一些例子入手搭建起一個(gè) JSP 的 Demo 站點(diǎn)。 被各種環(huán)境、容器問(wèn)題虐了千百遍后終于跑起了個(gè)例子,從本機(jī)瀏覽器終于看到例子里的頁(yè)面,有一秒鐘的成就感,然后就是茫然。 因?yàn)槲腋靖悴欢@一切是怎么工作的,它們的原理是什么? 繞了一大圈,走了很多彎路,如果再給我一次重來(lái)的機(jī)會(huì),我會(huì)從基本 Java 語(yǔ)言基礎(chǔ)開(kāi)始。


什么是基礎(chǔ)?Java 是一門面向?qū)ο笳Z(yǔ)言,最重要的概念是對(duì)象,而其所有的語(yǔ)法不過(guò)都是圍繞它展開(kāi)。 而其他程序的基本的結(jié)構(gòu)和變量:順序、循環(huán)、分支,有之前的其他語(yǔ)言基礎(chǔ)不過(guò)就是換了個(gè)形式而已。 理解了對(duì)象,那么圍繞對(duì)象的概念:類、接口都是自然的延伸。 當(dāng)然掌握了核心概念和基本的語(yǔ)法,也不過(guò)就是能寫個(gè) Hello World 的水準(zhǔn),但重點(diǎn)是你的起點(diǎn)對(duì)了,征程就近了。


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


關(guān)于基礎(chǔ),在我眼中最核心和重要的部分并不多,我這里簡(jiǎn)單列下:


核心概念 

對(duì)象模型

接口設(shè)計(jì)

類庫(kù) 

lang

collections

concurrent

io

這里核心概念就不多寫了,基本體現(xiàn)在所有 Java 的代碼庫(kù)中,伴隨始終,差別只在理解和抽象的適度與否。 JDK 那么多庫(kù),這里只列了上面幾個(gè),lang 里面其實(shí)最重要的我想說(shuō)的是 String,這是很多人都忽略的。 C 里沒(méi)有 String 的概念,Java 則提供了這個(gè)對(duì)象,但沒(méi)能好好理解并用好這個(gè)對(duì)象,以后會(huì)讓你踩無(wú)盡的坑,還反復(fù)踩。 不信去搜搜關(guān)于各種字符編碼亂碼的低級(jí)問(wèn)題有多少,除此還有由于 String 引發(fā)的各種性能問(wèn)題。 由 String 這個(gè)核心對(duì)象發(fā)散出去關(guān)于字符的編碼,字符的字節(jié)表達(dá)(大端、小端、網(wǎng)絡(luò)字節(jié)序),對(duì) GC 的影響,正則表達(dá),模式匹配,這可能是 Java 里內(nèi)涵最豐富的對(duì)象了。


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


好了,當(dāng)完成可上面這些基礎(chǔ)內(nèi)容的學(xué)習(xí)后,我們得到了第一張地圖,像下面這樣。

Java 征途:行者的地圖



第二張,技能圖

即使掌握了第一張圖要在 Java 的世界自由馳騁還是有點(diǎn)小困難的。 現(xiàn)在 Java 的一個(gè)主流使用場(chǎng)景是后端開(kāi)發(fā),這一領(lǐng)域在它的上一個(gè)時(shí)代是 J2EE(現(xiàn)在叫 Java EE) 的天下,又稱為 Java 企業(yè)版。 J2EE 包含的內(nèi)容很多,核心是 EJB。當(dāng)時(shí)我剛在學(xué)校里累死累活學(xué)完分布式對(duì)象技術(shù),以 CORBA 和 EJB 為例來(lái)實(shí)作。 又看了好幾本 EJB 設(shè)計(jì)模式和最佳實(shí)踐的書(shū),然后還沒(méi)畢業(yè)進(jìn)入公司一實(shí)習(xí)發(fā)現(xiàn)大家說(shuō)現(xiàn)在不用 EJB 了,我們用一個(gè)叫 Spring 的東東。 IoC、DI 等新的英文縮寫又出現(xiàn)了,一口老血還沒(méi)來(lái)得及噴出,又重新振作開(kāi)始新的學(xué)習(xí)征程。


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


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


那么作為一個(gè) Java 工程師我到底要掌握多少框架才夠?這是一個(gè)偽命題,因?yàn)檎莆斩嗌賯€(gè)都不會(huì)夠。 核心的熟練掌握幾個(gè),泛泛了解大量的,掌握快速學(xué)習(xí)框架的能力才是解決之道。 還是以 SSH/SSI 為例,專業(yè)前端分工的趨勢(shì)越發(fā)明顯,徹底解放了后端 Java 工程師的苦惱。 以 Spring 為例的框架解決了大量通用型的問(wèn)題,今天的 Spring 比當(dāng)初大了幾十倍不止吧(把所有以 Spring 冠名的子項(xiàng)目算上的話),都是解決特定的通用問(wèn)題。 所以當(dāng)你寫代碼時(shí)突然想寫個(gè)以 Util 命名的類時(shí),停住想想這是一個(gè)解決通用問(wèn)題的類么,不妨搜搜現(xiàn)成的類庫(kù),比如說(shuō)不定 Apache Commons 里就有你需要的代碼。 通用類庫(kù)和框架讓我們解放出來(lái)專注業(yè)務(wù)邏輯與效率,這很可能是你的代碼最有價(jià)值的部分,有程序員可能會(huì)抱怨這些沒(méi)技術(shù)含量,而我認(rèn)為能用最有效的技術(shù)實(shí)現(xiàn)業(yè)務(wù)價(jià)值最大化才是最有技術(shù)含量的事。


框架如兵器,十八般(遠(yuǎn)不止十八)兵器我未必樣樣會(huì),但我們得有一樣能力,如張無(wú)忌學(xué)太極劍一樣,臨敵學(xué)劍還能勝之。 這里面的訣竅不在學(xué)習(xí)招式,好比你也許覺(jué)得你 Hibernate 用法掌握的爐火純青又如何,一上線數(shù)據(jù)庫(kù)卻先崩潰了。 這里的本質(zhì)還在理解關(guān)系(SQL)數(shù)據(jù)庫(kù),現(xiàn)在也許還需要加上對(duì)特定非關(guān)系(NoSQL)數(shù)據(jù)庫(kù)的原理與機(jī)制的理解,甚至包括對(duì) O/R 映射模型的本質(zhì)理解。


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

Java 征途:行者的地圖



第三張,延伸圖

而第三張圖,我已無(wú)法再給出一個(gè)我認(rèn)為稍具普適性的建議。 到了這個(gè)階段每個(gè)人的成長(zhǎng)發(fā)展方向會(huì)受其環(huán)境和實(shí)際情況影響,我以自身為例稍加說(shuō)明。 進(jìn)入互聯(lián)網(wǎng)公司后這幾年,Java 技術(shù)的發(fā)展開(kāi)始從 J2EE 容器化的單一應(yīng)用向 SOA 和微服務(wù)發(fā)展變遷。 規(guī)模化的分布式系統(tǒng)成為常態(tài),所以我更多的相關(guān)工作便集中于此領(lǐng)域。 一方面縱深挖掘繼續(xù)補(bǔ)全知識(shí)盲區(qū),比如分布式程序的基礎(chǔ)是 RPC 調(diào)用,RPC 的本質(zhì)是網(wǎng)絡(luò)加對(duì)象序列化。 相應(yīng)就去徹底搞懂 TCP 的原理,Unix/Linux 下網(wǎng)絡(luò)編程模型,幾種不同的網(wǎng)絡(luò) IO 模型。 然后再上升到 Java 基于此提供的網(wǎng)絡(luò)編程模型,BIO(阻塞)、NIO(非阻塞)和 AIO(異步IO),并結(jié)合實(shí)際工作實(shí)踐去深入理解。


在這個(gè)過(guò)程接觸了大量不同的 RPC 技術(shù),從 Java 自帶的 RMI 到 WebService 技術(shù)規(guī)范。 之后一些更簡(jiǎn)潔、性能更強(qiáng)大的 RPC 框架層出不窮,如 Hessian、Thrift 等等。 不同框架的本質(zhì)依然如一,隨著服務(wù)化的發(fā)展基于 RPC 框架又進(jìn)一步衍生出提供額外增值功能的服務(wù)框架,如阿里開(kāi)源的 Dubbo。 隨著工作實(shí)踐的深入,向下有可能又會(huì)進(jìn)入 JVM 層面去分析對(duì)象的內(nèi)存使用,線程的調(diào)度運(yùn)行和延時(shí)情況。 這個(gè)階段發(fā)揮核心作用的依然是前面說(shuō)的快速學(xué)習(xí)并應(yīng)用于工作實(shí)踐的能力。


與縱深的另一面是橫向擴(kuò)展,隨著工作性質(zhì)的變化也可能需要更寬廣的技術(shù)知識(shí)面。 比如成為架構(gòu)師后,對(duì)技術(shù)知識(shí)面的廣度要求某些方面會(huì)更高。 有方法的技術(shù)學(xué)習(xí)和涉獵技巧讓你能更快擴(kuò)張技術(shù)寬度,站在更高維度來(lái)審視不同的技術(shù)方向和產(chǎn)品,最有效的做出合適的技術(shù)決策。


在這個(gè)階段的每個(gè)人都可能面臨不同的環(huán)境和實(shí)踐,所以這階段形成的地圖會(huì)千差萬(wàn)別。 下面是我的第三張圖,僅供走在 Java 征途上的同行者們參考。 而按這千差萬(wàn)別的地圖走過(guò)的路徑,正巧構(gòu)成獨(dú)一無(wú)二的你。

Java 征途:行者的地圖



即使你現(xiàn)在還沒(méi)地圖,但也別茫然而永遠(yuǎn)的駐足不前。 保持前進(jìn)總會(huì)找到路,其實(shí)我就是這么過(guò)來(lái)的,一直以來(lái),不敢止步。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI