對於自學Java的人來說,如何系統的,全方面的學習Java?

我今年41歲,使用Java開發將近20年了,目前還在技術一線。


雖然我是科班出身,但其實十多年走過來,無論是Java語言本身,還是相伴的工具和框架都發生了巨大變化。而我自己也是一路學習新技能,一路丟棄舊知識。


而今天回頭看,也發現自己走了很多彎路,浪費了不少時間,很是遺憾!


但是,因爲你是自學,面臨巨大的入行壓力,因此就不該付出太高的試錯成本。而應該尋找一條有重點的,高效的學習方法。否則一不小心,很有可能倒在入行的門口,前功盡棄。


但好在Java學習,總的來說還是重點突出、難點分明的,也確實存在一條高效的學習路徑。


過去半年,我不斷的盤整自己的思路,陸續寫了幾篇文章,來分享我對高效學習Java的看法。但不足之處是,這些文章都分散在不同的回答下。因此,今天剛好趁此機會,我把它們整理起來,希望對你的學習有幫助。


 


1.Java學習的重點是什麼?

從大學到現在,我使用Java已經將近20年,日常也帶實習生,還在公司內部做training,所以可以分享下我的經驗,希望對你有用。


因爲是在工作中培訓,就必然有兩個約束:實用、時間緊,因此就不能像大學那樣,把所有的知識點都面面俱到的講到。而只能挑基礎的,實用的,難理解的講。至於其他邊邊角角的知識,就一筆帶過。一則沒有時間,二則不常用,再則既使講了,學生印象也不深刻。總之一句話:“好鋼用在刀刃上”。


下面,就根據我的實踐,具體談下學習過程:


1.基礎知識


我學習java的時候,先是通讀了《Java編程思想》,然後是《Java核心技術》。當時這兩本書還不像現在這麼厚,而剛纔我把案頭的《Java核心技術》第9版翻了翻,上下兩冊已經1700多頁了,可想而知,如果要把它通讀一遍,且不說把所有的代碼都調通,就是當小說讀,估計也需要些時間。


但我現在教學依然首推《Java核心技術》,主要是體系完整,實例多,可操作性強。但對初學者,我一般是隻講前6章,也就是下面的內容:


Java程序設計概述

Java程序設計環境

Java的基礎程序設計結構

對象與類

繼承

接口與內部類

就《Java核心技術》第9版來說,也就是到250頁爲止,加把勁,1個月拿下完全沒問題。


因爲你是自學,所以建議你一定要把其中的代碼都調通,課後的作業儘量去做。除此之外,還有兩點特別重要:


#.學習筆記


因爲你是自學,不像在企業中學了就能夠實踐,印象自然特別深刻。而自學因爲沒有實踐的及時反饋,所以記筆記就顯得特別重要。因爲記筆記就像寫作一樣,是整理思路的絕佳方法。同時學習筆記也是你以後開發,面試的絕好資料。


學習編程,人跟人是不一樣的,別人覺得難理解的東西,對你卻不一定;而你覺得難理解的東西,別人可能又會覺得特簡單。而學習筆記就是自己專有的“難點手冊”,有點像高考時的“錯題本”,以後無論是在面試前,還是在日常工作中,隨時都可以翻出來看看,自是獲益匪淺。


#.分門別類保存demo


學習筆記是很好的文字資料,但編程界有句話說的特別好,所謂“no code, no text”,意思就是說:千言萬語都沒有一段代碼來的實在。


以我的經驗,在你在學習的過程中,就某個知識點,無論當時理解的多透徹,調試的多棒,只要時間一長,等到了實用的時候,肯定會碰到各種各樣的問題,一些看似簡單的東西,此時死活就是調不通,正所謂人到事中迷。這個時候,如果你手頭恰有運行良好的demo,打開參考一下(甚至直接拷貝過來),問題自然迎刃而解。而且因爲這些demo都是你親手調試出來,印象自然特別深刻,一碰到問題,在腦子中自會立刻涌現。


所以說,在學習的過程,一定要善待你調通的demo,千萬不要用完了就扔,等後來碰到困難,想要用時卻找不到,追愧莫及。正確的做法就是把所有調通的demo,分門別類的保存起來,到時候查起來自是得心應手。


這是我自己創建的java學習交流qun:六一五,七四一,六三六,這裏聚集了一幫熱愛學習java的人,如果你也在學習java,苦於一個交流分享的圈子,歡迎你的加入。


人都說“書到用時方恨少”,其實代碼也是這樣,所謂“demo用時方恨少”。


2.Spring


目前在Java EE開發中,Spring已經成爲和Java核心庫一樣的基礎設施,所以說如果想成爲一個合格的Java程序員,Spring肯定繞不開。另一方面,如果掌握了Spring體系,Java基本上就算入門了,就有能力進行一些實用級的開發了。


但Spring本身也是日漸複雜,衍生項目越來越多,但最最核心的概念依舊是IOC和AOP,掌握了這兩個概念,再把Spring MVC學會,再學習其他的衍生項目就會平滑很多。


同時,因爲Spring本身就應用了許多優雅的設計理念,所以學習Spring的過程,也是加強Java基礎知識學習的過程。因此等你掌握了Spring,原來很多你理解不透徹的Java特性,此時就會恍然大悟,包括接口、抽象類等。


我學習Spring,讀的第一本書是《Spring實戰》,坦率的說,書很一般,但市面上比它好的書,我卻沒有遇到過。還有一本《Spring源碼深度解析》也不錯,對Spring的設計理念講的尤其透徹,雖然整本書讀起來有些艱澀,但前幾章卻生動有趣,也是整本書的精華。所以建議你在學習Spring之前,先把該書的前幾章通讀一下,然後再回過頭來學習《Spring實戰》會順利很多。


以我經驗,要學透Spring,終極的方法還是閱讀源碼(我當時就是這麼幹的),待把Spring的核心源碼通讀了,人就真的自由了(所謂無真相不自由),不僅是對Spring,而是對整個Java體系。以後再遇到其他框架,大概一眼就能看出其中的脈絡,所謂到了“看山不是山”的境界。但這都是後話,可以作爲以後你努力的方向。


和學習Java基礎知識一樣,學習Spring也一定要記筆記,一定要分門別類保存demo。


老實說,Spring對初學者不算簡單,因此最好能有個好老師帶一下,不用太長時間,2個課時即可,然後就是在你遇到大的困難時,能及時的點撥下。


以我的經驗,要初步掌握Spring,大概需要1到1個半月的時間。


3.其他知識


Spring是Java編程的基礎設施,但真要進入到實際項目的開發,還有些東西繞不過,包括 MySql,Mybatis,Redis,Servlet等,但如果你經過Spring的洗禮,這些東西相對就簡單多了,以我的經驗,1個月的時間足夠了。


4.實踐


學習Java,光學不練肯定是不行的。但因爲是自學,所以就沒有實際的產品讓你練手,但也沒有關係,誰大學還沒有做過畢業設計呢?以我的經驗,大家最愛的“學生管理系統”依舊是個很好的練手系統。


別看“學生管理系統”邏輯簡單,但麻雀雖小五臟俱全,其中數據庫設計、Mybatis,Spring、SpringMVC,Servlet、Tomcat一個都不缺,絕對的練手好伴侶。


還有,雖然你的學習重點在Java,因爲要做一個完整的demo,前端的配合肯定少不了。因此就免少不了要學一些簡單的JS、HTML知識,但因爲前端本就是個很大的topic,所以一定要控制好邊界,千萬不要顧此失彼。就“學生管理系統”來說,在前端上,只要實現一個包含table、textbox、button,能發送REST請求到server,能實現學生的“增刪改查”的簡單頁面即可。


作爲一個練手項目,目標就是把Java的主要技能點串起來,所以自不求盡善盡美(也不可能),所以1個月時間足夠了。


.最後


按照上面的過程,4個月的時間剛剛好。當然Java的體系是很龐大的,還有很多更高級的技能需要掌握,但不要着急,這些完全可以放到以後工作中邊用別學。


學習編程就是一個由混沌到有序的過程,所以你在學習過程中,如果一時碰到理解不了的知識點,大可不必沮喪,更不要氣餒,這都是正常的不能再正常的事情了,不過是“人同此心,心同此理”的暫時而已。


在日常的教學中,我常把下面這句話送給學員們,今天也把它送給你:


“道路是曲折的,前途是光明的!”


祝你好運!


 


2.那些Java知識沒必要學習了

我接觸 Java已近20年了,見證了許多Java技術變遷,包括:


JavaEE框架,從百家混戰到現在Spring基本一統天下。


Web開發,從標配的SSH到現在SpirngMVC + MyBatis組合。


IDE,從當年如火如荼的JBuilder到Eclipse,再到更好用的IDEA。


我判斷的依據主要有以下幾點:


實際開發能否用到?

是否有助於加深對技術的理解?

對面試是否有用?

JSP

JSP在實際開發中,主要是作爲MVC模型中的V(View)層出現的。當然,View層的渲染技術除了JSP,還有FreeMaker、Velocity等。


JSP作爲頁面模板,在後端通過MVC框架渲染成HMTL,然後再發送到客戶端(例如瀏覽器)來呈現。這也就是我們常說的“前後端不分離”,“混合式”開發。


而當前,包括我所在的公司,以及大部分互聯網公司。要麼已經拋棄這種模式,要麼正在拋棄的路上,而轉向徹底的“前後端分離”。


在“前後端分離”模式下,後端只負責提供服務接口(例如REST),而前端(例如HTML5)通過接口發送/獲取,呈現數據(例如JSON格式)。


這樣,在後端,原來的MVC框架,某種意義上已經演變爲MC框架。因此,與V(View)相關的一切模板技術都失去了學習的必要,其中當然也包括JSP。所以,後來的Java學習者,我的建議是:


“完全可以放棄對JSP的學習。”


Struts

在Java後端開發中,MVC模型還是主流。而Struts作爲一個MVC框架,單從技術上來說,還是很優秀的。


但是,現在Spring實在是太強勢了,越來越成爲Java開發中的“一站式”工具包,其中的一個利器就是Spring MVC。


望名知意,Spring MVC也是一個MVC框架。而且因爲它是Spring的親兒子,自然和Spring契合的非常完美。


同時,在設計之初,Spring MVC就參照了其他MVC框架的優缺點(包括Struts),所以用起來非常爽。因此,在MVC框架領域,Spring MVC大有一統天下的趨勢。


因此現在,很多公司,老的Struts項目還在維護。但新的項目開發,更多轉向了Spring MVC。因此,如果你是Java新手,正在學習中,我的建議是:


“不要再學習Struts了,從Spring MVC開始吧!”


Hibernate

Hibernate作爲老牌的OR映射框架,功能非常強大,涵蓋面非常廣。但這既是它的優點,同時也成爲它的“負擔”,是開發人員“不能承受之重”。


Hibernate的設計初衷,是爲了最大程度的解放程序員,完全隔離數據庫,實現徹底的OR映射。程序員甚至可以不寫一行SQL語句,單通過配置就能實現對數據庫的操作。


當然,爲了實現這個目標,Hibernate也設計的非常複雜、非常精巧。就不可避免的帶來以下副作用:


學習成本高

配置複雜

調優困難

前兩點不難理解,單說“調優困難”。


因爲Hibernate的設計目標是徹底的OR映射,徹底的隔離SQL語句。但必然會帶來一定的性能損失。大部分情況下,應用如果對性能不敏感,Hibernate也沒問題。但應用一旦對性能敏感,有SQL級別調優的需求,Hibernate的優點反而成爲缺點。


雖然Hibernate也支持SQL級別的調優,但因爲框架設計的過於複雜和精巧,這就需要開發人員對Hibernate理解的非常透徹,這就帶來了更高的學習成本。


而現在最流行的MyBatis,作爲一個“混合式”,輕量級OR映射框架,既繼承了Hibernate的優點,同時也吸取了他的教訓。在支持配置的同時,又能接觸SQL,從而帶來了更多靈活性(包括調試、優化)。


當前,在實際開發中,Hibernate使用的越來越少了。大家更偏愛MyBatis這種輕量級框架。所以,對後來學習者,我的建議是:


“不需要再學習Hibernate了,學MyBatis就夠了。”


Servlet(要精通)

當然,現在不會有任何公司,再用純粹的Servlet來時實現整個Web應用,而是轉向一些更高級的技術(例如各種MVC框架)。因此,會給人一種錯覺:Servlet已經過時,後來者就不需要再學習了。


在這裏,我可以非常負責任的說:這種觀點是極端錯誤,極端不負責任的。


Servlet不僅要學,而且要學深,學透。


當前,Servlet雖然不再是一個主流web開發技術,但依然是Java Web開發技術的基礎,是Java Web容器的基石,是行業標準。而現在流行的各種MVC框架(包括SpringMVC),在最底層,還是以 Servlet爲基礎的。


爲此,我畫了一個簡單的圖(不準確,會意即可):

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNzU1NTI4,size_16,color_FFFFFF,t_70

所以,如果你想要徹底掌握某個MVC框架,則必須徹底理解Servlet。


而且,Servlet作爲一個基礎設施。精通它,不僅有助於理解各種MVC框架。即使Servlet本身,也有很多實用價值。


如果你深刻理解了Servlet的生命週期,就可以在底層做很多事情。譬如在Request進來的時候,進行攔截,進行權限的判定。也可以在Response發出的時候,進行攔截,統一檢查、統一附加。


所以,如果你正在學習Java,對Servlet,我的建議是:


“Servlet不僅要學,而且要學深,學透。”


其他

目前在國內,Java更多是作爲web後端技術出現的。因此在實際學習中,很多技術就不符合“國情”,學習的現實意義不大。下面我就簡單列舉下。


1.Applet


作爲頁面插件技術,不用多說,連flash都快被淘汰了,更無論從未流行的applet。


2.Swing


作爲桌面UI框架。且不說本身設計的咋樣。現實開發中,我接觸的桌面應用,要麼用C++(例如MFC),要麼用C#(Winform、WPF)。所以,Swing就沒有學習的必要了。


3.JDBC


作爲較低層的數據庫基礎設施,JDBC被很多框架(例如MyBatis)支持。但在實際開發中,程序員即使不瞭解也無大礙。因此,雖然我不能建議你放棄JDBC學習,但如果你時間有限,完全可以把它的優先級排低一點。


4.XML


XML現在還在廣泛應用。但作爲一個web數據傳輸格式,正在逐漸被JSON替代。所以,對Java後端學習來說,XML簡單瞭解即可。至於龐雜的XML操作API(例如XPath),完全不必學習。將來真要用到,再查也不遲。


最後

上面是我的一家之言,肯定有武斷之處,見諒!


最後,祝你學習順利。




3.非科班程序員如何補充基礎知識

非科班程序員,入了行,該如何繼續提升自己?


我是科班出身,大學也算努力,系統的掌握了計算機知識。迄今爲止,也工作了將近20年。但老實說,無論是從在實際開發中,還是個人成長,回頭看,大學學習的很多課程,其中有很多,要麼“用處”不大,要麼完全可以換個方式,更高效的學習。


其中的原因,一方面是實際開發更關注知識的“實用”,另一方面,我們的大學教學也確實與產業有點脫鉤。


因此,本文,我就從實用出發,簡單介紹下那些領域的知識有很大的學習必要性,以及如何有重點的學習。


數據結構

毫無疑問,數據結構對一名程序員來說非常重要,不是有句話說“程序 = 數據結構 + 算法”。從某個角度看,這種說法即使現在依然成立。這也說明數據結構的重要性。


但大部分的數據結構課程,關注的重點都在如何從數學上實現一個數據結構(例如堆棧、鏈表)。這從研究上來說,沒有錯。


但在實際開發中,大部分主流語言(例如Java、C#)都已經內置了常用數據結構。而且即使沒有內置的,我們也常可以在第三方庫中找到現成的實現。而且這些實現,大都經過實踐檢驗,無論是穩定性還是性能都有保證。


也就是說,對大部分程序員來說,在實際開發中,很難有需求從頭實現一個數據結構。因此,就完全沒必要像科班生那樣,從數學源頭來學習數據結構,而只需做到下面幾點:


熟悉常用數據結構的概念(例如數組、堆棧、鏈表、Map等)。

瞭解常用數據結構不同實現的差異(例如ArrayList和LinkList的差異)。

關注常用數據結構的外圍算法(例如如何對List和Map進行查找)。

關注數據結構使用中容易出錯的地方(例如是否線程是否安全等)。


當然也完全沒必要閱讀大部頭的著作,而只需瞭解關注的重點是什麼,然後再到網上搜索專題文章學習即可。至於關注的重點,可以參考《xxx面試大全》中的數據結構章節。


算法

這個要具體問題具體分析了。以我接觸的領域來說,大部分普通的業務系統都不會涉及到太複雜的算法,因此就沒必要專門在算法上投入時間。


但在一些特殊的領域,如果算法跟不上,可能“寸步難行”,例如圖形處理領域,無論是圖像的變化還是增強,無一例外都要用到矩陣變換,因此就必然涉及到線性代數的內容,順藤摸瓜,往縱深學,就必然會牽出更多的東西。


因此,對非科班生(尤其是數學不夠好的),對算法學習我是持“勸退”態度的。因爲,從職業發展來說,這實在是一條太“曲折”的路線。


一方面,目前的開發越來越趨專業化,算法一般由專門的算法團隊負責,普通軟件工程師只負責算法轉換。


以我爲例,雖然是科班出身,也系統的學習過算法,但也常有力有不逮的時候。複雜的算法既實現不了,甚至是理解不了。很多時候,我乾脆就不做實現,直接請算法工程師告訴我思路,甚至是僞代碼,而我負責轉化爲正式代碼(例如Java)。實踐證明,這種做法不僅是可行的,而且也是高效的,正所謂“術業有專攻”。


另一方面,人的精力是有限的,你完全可以把精力投入到自己更擅長的方面,例如設計、產品、架構上,從而取得“差異化”的成功。


當然,如果你“心氣”很高,一定要在算法上有所作爲,我也可以推薦你兩本書:


《算法導論》

《數學之美》

這些都是我讀過,受益良深的作品。


設計模式

設計模式,我認爲是初中級程序員,向高級程序員提升的關鍵點。


在實踐中,我見過太多程序員,前期衝勁十足,但後繼乏力,最終泯然於衆生。我不敢說所有的人如此,但有不少都是吃了設計模式的虧。


在工作的前幾年,大部分程序員都是處於熟悉語言層面的階段,也就是處於“技”的階段。這個階段,如果人還算靠譜,大概在2到3年就會過去,接下來就要進入“術”的階段。在編程領域,“術”的最典型代表就是“設計模式”。因此,設計模式的重要性再怎麼強調都不爲過。


要學習設計模式,最經典的讀物依然是GOF的《設計模式:可複用面向對象軟件的基礎》,精煉、深刻,沒有一句廢話。但這本書對初學者來說,讀起來太艱澀,一方面是作者極度追求語言的凝練,一方面代碼是用C++描述的。因此,我推薦大家閱讀《Head First設計模式》,生動有趣,而且是用Java描述的。


但是,如果精力允許,我還是建議你一定要把GOF的《設計模式:可複用面向對象軟件的基礎》閱讀一下,而且要不止一遍的讀(我就是)。這本書絕對常讀常新。


當然,學習設計模式,不僅要讀書,更要從實踐中學習。例如學習Spring框架的過程,如果你有思考,就會發現其中有太多設計模式可供借鑑。


學習設計模式,就是從實踐到理論,然後再從理論到實踐,反覆實踐,反覆思索,反覆總結的過程。當然,這也是從一個“碼農”轉變成“工程師”的過程。


軟件工程

實現一個軟件系統的過程,不僅只有編碼。還涉及到項目安排,團隊協調等一系列非技術因素。而作爲一名程序員,如果想往上更進一步,獨當一面,成爲team leader或者開發經理等管理職務。則軟件工程一定要跟上。


當然,軟件工程這麼多年也一直在進步,從原來的瀑布開發,到現在流行的敏捷開發,但無論怎麼變,有些經典的東西還是不變的。下面我就推薦幾本我認爲現在依然值得深讀的書:


《人月神話》

《人件》

《Scrum敏捷軟件開發》

當然,關於軟件工程,最好的學習方法依然是觀察。觀察你所在的團隊、所在的公司是如何處理工程問題,然後思索,閱讀,最終形成自己的方法觀。


架構 & 設計

寫出一個好程序,有幾個維度,從下到上,也是一個程序員逐步升級的過程。


第一階段,首先要保證基本功紮實,最簡單的說,要做到語法熟練、基本框架熟練,成爲一個功夫精熟的“碼農”。


第二階段,從“技”到“術”,從“碼農”到“工程師”。這個階段的關鍵技術是設計模式。在局部上,不僅追求實現功能,更關注實現的好,關注功能之外的維度,例如健壯性、低耦合、可擴展等指標。對主流框架(例如Spring),不僅會用,更有深刻的理解。


第三階段,從“術”到“道”。


這個階段,不僅在局部上追求一個模塊的好壞,而且還要從整個系統層面去掌控程序,例如保證整個程序不出現系統腐敗,如何安排資源的優先級等。這個時候就不是單一的維度,單一的技術能夠保證了。


經常有朋友問我是如何成爲一名架構師的,很難用一句話來回答。


我可以路線鮮明教你如何成爲一名優秀的軟件工程師,但至於如何成爲一名架構師,我想除了努力,運氣肯定也很重要。但無論如何,有機遇,不是還得有準備嘛?


作爲一名架構師,所靠的肯定不是單一的維度,也不是但靠純粹的讀書能獲得的。但就我來說,有些經典書的閱讀,確實給我日常的工作帶來了巨大的幫助,下面我就推薦給你:


《代碼大全》、

《重構:改善既有代碼的設計》

《設計原本》

《大型網站技術架構核心原理與案例分析》

.最後

作爲一名程序員,從技術菜鳥到大拿的路徑有很多,其中最核心的因素就是堅持和努力。學習的過程,就好像登山的過程,以我的經驗,大概有80%的人在攀登的過程中,會因爲這樣那樣的原因而掉隊。


但無論如何,我相信,只要目標明確,努力加堅持,即使是一個非科班生,也完全可以登頂。


祝順利!


 


4.Java學習的一些補充建議

關於Spring Boot

Spring Boot是目前學習和應用的熱點,所以就有不少人說:“Spring和Spring MVC已經過時,不需要再學習了”。


在我看來,上面的觀點是極端錯誤和不負責任的。


從設計目標來說,Spring Boot只是實現了Spring的自動化配置,降低了項目搭建的複雜度。


從技術上說,Spring Boot的底層依然是Spring的核心機制,包括IOC、AOP,以及實現者 - Spring容器。所以,Spring Boot作爲一個承載者。如果承載的是web項目,Spring MVC該怎麼工作,還是怎麼工作。


與“傳統”程序不同,Spring應用主要通過配置、註解,然後由Spring容器統一裝配運行。因此,如果程序員不能對底層機理做到“瞭然於胸”,則對整個系統的運行邏輯必然是“雲裏霧裏”。


因此,在實際項目中,Spring系統一旦出了問題,許多“半吊子”程序員就會感到不知所措。爲了快速“解決”問題。只得在Spring配置上胡亂折騰。所以到最後,很多Spring程序(包括業界著名公司)都被改的面目全非,腐敗不堪,充斥着各種冗餘和衝突。


而Spring Boot雖然簡化了Spring配置,但同時也使程序離Spring本質越來越遠。整個程序的運行邏輯更加“雲裏霧裏”。一旦出了問題,更加令人不知所措。


所以,從程序的健康出發,從程序員的職業發展出發。Spring Boot的開發者,反而更有必要掌握Spring的底層原理,正所謂“無真相不自由”。


而且,以我的經驗。如果你紮紮實實從Spring基礎一路走來,到了Spring Boot這裏,也就是“臨門一腳”的問題。因此,學習Spring,最“正”的路徑依然如下:


Spring -> Servlet -> Spring MVC -> Spring Boot


JPA與Hibernate

JPA作爲一個持久化規範,僅定義了OR映射的規範(包括一系列註解),但本身並沒有具體的實現。


在實際應用中,JPA的具體實現既有Hibernate,也可以通過spring和把jpa和Mybatis結合起來。但因爲Hibernate的高可配性,因此從概念設計上來說, Hibernate對JPA的實現顯得更加“自然”。


但是,無論是業界還是我本人,偏愛Mybatis的原因和JPA關係不大,關鍵是因爲Hibernate相對不夠靈活,從而帶來的高學習成本和調優成本。


當然,毫無疑問,Hibernate是一個非常優秀的框架。至於你所在的團隊是否選擇它,肯定是綜合考量的結果。其中既包括團隊的技術現狀(例如是否有Hibernate大牛),也包括項目的規模,及靈活性需求等。


而在其他文章中,我對Hibernate的觀點,主要是針對高效學習來講的,畢竟人的精力是有限的。


關於大數據

前面的兩篇文章,面向的主要是Java web開發者。


當然,Java開發,除了Web,還有大數據等方向。雖然都是學習Java,但內容肯定有所偏重。這裏我就簡單闡述下,以免對其他方向(例如大數據)的學習者有所誤導。


做大數據開發,無論是做Hadoop的Map Reducer,還是Storm的topology(拓撲),最常見的實現方式還是Java。從這一點來說,對Java基礎知識的學習,大家都是一樣的。


但差別在是否要學習Spring?這決定於你對自己的定位!


如果你把僅自己定位在數據處理上,只需編寫Map Reducer或topology,那麼你完全可以不學習Spring。


但是,一個完整的大數據系統,必然是一個綜合系統。其中包括系統配置、數據的收集、傳輸、存儲、展示等子系統。而如何把這些子系統整合成一個綜合系統,則是Spring的專長,這也是JavaEE面臨的核心問題。


因此,從系統開發角度來說,大數據開發者依然應該學習Spring。只不過從優先級上來說,完全可以把Spring往後排一下。


 


5.如何閱讀Spring源碼

因爲Spring的源代碼量非常大。如果像閱讀小說一樣,一行不拉的讀,是不現實的。所以,現實,而且有用的做法,是隻閱讀核心代碼。


至於其他邊支代碼,如果通讀,一則不現實,二則沒有必要。


但因爲Spring複雜,且設計精妙。初學者剛開始閱讀,必然會面比較茫然,不知從那裏入手。而我的做法,有一下幾個關鍵點:


1.先掌握Spring的基本用法。


在閱讀Spring源碼之前,首先要掌握Spring的基本用法,否則就找不到基本的出發點。


此時,你肯定不能完全理解Srping的運行機制。但隨着使用的熟練,一則積累了經驗,二則肯定也會有很多疑問。這不要緊,反而是好事。


隨着學習的深入。你要有自己思考:如果某個機制(例如IOC),由你來設計,該會如何實現?


2.寫幾個典型的Spring Demo


因爲你的目的是閱讀Spring源碼。所以如果一開始,就閱讀相對高階的SrpingMVC,需要理解的東西太多,必然會茫然不知所措。


因爲起始難度太大,缺乏正反饋。對很多人,甚至是直接就嚇退了。


所以,準備幾個好的Demo,這些Demo一定要層層深入,從而作爲自己閱讀源碼的出發點。


在內部培訓中,我寫過一個教程,名叫《Spring從入門到精通》,該教程總共包含5個Demo,由淺入深的順序如下:


基本Java程序示例(SimpleJavaDemo)

基本Spring示例(SimpleSpringDemo)

Spring自動織入示例(AutoWiredSpringDemo)

Spring自動掃描示例(AutoScanSpringDemo)

SpringMVC示例(SpringMVCDemo)

大家可以根據個人的情況,也編寫出自己的Demo庫。


3.邊調試,邊閱讀


例如對下面這行最普通的Spring代碼:




直接用Maven下載源碼,然後在Eclipse中Debug進去。此時,就像你平時閱讀同事的源碼一樣。帶着疑問,帶着猜測。閱讀的過程,邊驗證,邊調整,總重形成體系的思路。


記着,因爲Spring源碼複雜,且繼承體系深,所以一定要邊閱讀,邊記筆記,邊畫圖。例如下面就是我畫過的一個圖(從Eclise中截取):

20190412111314467.jpg

很重要的一點。在閱讀Spring源碼前,一定要先有自己的想法:如果這個東西(例如經典的getBean()方法)由你要設計,會怎麼做。然後帶着想法,跟(debug)進去。不斷驗證,不斷調整。


4.不需面面俱到,只抓重點。


因爲Spring源碼巨大。對閱讀者來說,也不是都有價值,所以一定要抓住重點。


要時刻記住閱讀的初心:不是爲了閱讀而閱讀,而是爲了深刻理解Spring,從而自由運用,所謂“無真相不自由”。所以只閱讀核心的,對自己有用的(這個因人而異)。下面是我當年閱讀時的讀書筆記提綱,貼出來供大家參考:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNzU1NTI4,size_16,color_FFFFFF,t_70

5.Spring閱讀的收益


通過閱讀Spring源碼,至少能有以下收穫:


#.精通Java


因爲 Spirng框架本身,就是對Java最“精妙”的運用。我敢保證,在閱讀Spring的過程,除了發現很多Java的“新”特性外。你也能學會“大神”們,是如何正確且高效的編寫Java程序。


#.學習設計


Spring框架本身就是一個“設計良好”的典型,其中大量運用到經典的設計模式,例如“觀察者模式”、“單例模式”等。因此學習Spring的過程,就是學習設計的過程。


#.深刻理解Spring用法


所謂“無真相自由”。等你學習了Spring源碼後。我敢保證,你回頭再來看自己,或別人原來寫的Spring程序,肯定會發現諸多“錯誤”。包括代碼的冗餘,衝突等。


.最後


如果你是一個初學者。剛開始閱讀Spring源碼,一定會感覺特別困難。因爲其中涉及太多新東西。但這正說明,Spring源碼是一個寶庫。


咬咬牙,扛過去,你的技術層次就會躍上一個新的臺階,甚至是質的飛躍,所謂:


“會當凌絕頂,一覽衆山小。”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章