如果上天再給我一次機會,我會這樣學Java
回頭看看, 我進入Java 領域已經快15個年頭了, 雖然學的也一般, 但是分享下我的心得,估計也能幫大家少走點彎路。
[入門]
我在2001年之前是C/C++陣營, 有C和面向對象的基礎, 後來轉到Java ,發現沒有指針的Java真是好簡單, 另外Java 的類庫好用的讓人哭啊。
後來我就看《Thinking in Java》 ,《 Java 核心技術 》, 感覺也不吃力。
如果我之前沒學過別的語言,或者半路出家轉到計算機行業, 我不會先看上面那兩本, 相反我會選《Head First Java》, 這本書非常適合零基礎的小白, 讀起來輕松搞笑, 不信你看看第一頁
但是光看書也挺無趣的,不妨和視頻結合著看, 我覺得傳智播客的Java基礎視頻很不錯 (唉, 給傳智打了個廣告), 網上一搜就有,真搜不到就來我的QQ群裏吧(群號碼:523047986)
註意:視頻的好處就是能看到敲代碼的過程, 代碼是活的, 這點很爽。 如果視頻只是按PPT講編程, 果斷扔掉。
書也有書的好處,能寫成書的, 肯定是作者經過系統化思考,梳理才能形成的東西, 所以系統性比較強。
書還有其他優點, 例如可以隨便的翻, 找到重點反復的看。
所以混合著看經典書+優秀的視頻 應該是最好的入門。
Java 入門, 我不會去上培訓班,白白浪費錢 ,自學就夠了。
自學過程中如果有實戰經驗豐富的高人指導一下, 給我繪出路線圖, 指出攀登的方向,哪些地方有陷阱, 哪些地方不應該浪費時間, 我的自學就可以減少摸索,少走彎路,
很不幸, 我當年沒有遇到, 如果時光倒流, 我會想辦法找一個來指導我。
[實踐]
軟件行業的一大特點就是光看不做永遠都學不會,編碼不到10萬行都不好意思出去打招呼。
所以實踐,實踐,實踐!
在校期間,我還是會盡可能的去找項目做(參見我的另一篇文章《從現在開始豐富你的簡歷》, 回復“簡歷”查看) , 實在沒找到,也可以先把基礎打好
我上大學的時候用的是嚴蔚敏的《數據結構》, 當時我也把習題都做了一遍,考高級程序員的時候, 成績非常好。
後來我知道了一本更好的算法入門書《算法》, 如果時光能夠重來, 我還是會這本書上提到的所有數據結構和算法用Java 都實現一遍, 課後作業也爭取都做一遍。
這是個非常重要的訓練,因為我知道, 真的做了, 就會發現工作以後只要不是設計算法, 基本的數據結構沒有能難住我的。
【Java SE】
對於Java集合框架, 不但要學會用, 我還會嘗試著實現一遍,List, ArrayList, Set ,HashSet, Map ,HashSet 等等, 要是不知道怎麽寫, 看看JDK的源碼就可以了, 那裏有最好的老師。
實現一遍能更好的明白面向對象的設計, 接口,抽象類, 具體類的關系, 怎麽分離職責,會學習到設計模式中的模板方法, Iterator 等 。
值得一提的是Iterator, 很有趣, 我還清楚的記得那一年自己實現集合框架中 Iterator 的時候的激動心情啊 :-)
在實現Java 集合框架的時候, 可以順便把泛型也學了, 不學不行,要不然實現不了啊。
Java 世界裏,萬事萬物都是對象, 大家都知道封裝,繼承,多態, 但是僅僅了解這些只是入了門, 不可能做出真正的面向對象的程序。
有一本經典的書《敏捷軟件開發, 原則,模式,實踐》,裏邊詳細的講解了一個薪水支付案例,是迄今為止最好的面向對象設計的例子
我會用Java 把它實現一遍, 真正的體會一下OOD, 了解怎麽才能把合適的責任分給合適的類, 什麽叫面向接口而不是面向實現編程, 什麽是優先使用組合而不是繼承。
對於Java線程, 重點還是理解概念, 因為我知道在以後的工作中(除非從事系統級編程) ,自己寫線程/線程池的機會是非常罕見的,都被類庫,框架給封裝好了。所以重點是理解,
看書的話就當然是《Java並發編程實戰》 ,一大群大牛寫的啊。
對於Java IO, 我覺得架構設計的很優雅,典型的學院派, 可就是不太實用, 打開讀取一個文件都得用裝飾者模式包裝來包裝去, 太累了。
項目實戰中呢,也就是讀取個property 文件, xml 文件。 我還是重點去理解概念和設計吧。
不過自己寫個簡單的xml 解析器倒是不錯。
至於 AWT, Swing , 簡單看看就行了, 我不會去深入研究, Java 是典型的服務器端的語言, 開發客戶端程序的極少, 你想想, 你用Swing/AWT搞個桌面程序出來, 還得讓客戶裝個JRE才能運行, 是不是有點過分 ? 據我所知,也即是銀行的一些應用在用Swing ,AWT了。 有人可能說 Applet, 它曾經流行過, 現在早都沒人用了。
所以我不會在Swing和AWT上浪費時間。
Java Reflection 看起來沒有集合框架,線程,OO等那麽耀眼, 但它可是很多框架(SSH) 的基礎啊(回復“反射”查看相關文章), 先把基礎學會,後面的Java EE得用到它。
想真正的學好Java ,不了解Java 虛擬機怎麽可能? 《深入理解Java 虛擬機》一定得看,看完的目標就是寫個簡單的Java 反編譯器。
【做個有素養的Java碼農】
我記得08的時候, 我的IBM經理說設計模式是必備技能, 不懂設計模式的我們不能要了。
所以設計模式是必學, 其實Java裏邊用的非常多,簡直就是設計模式的活教材, 工廠方法,單例,模板方法, 裝飾者,責任鏈都有體現。
當然我會去先看一下輕松的《Head First Design》, 《設計模式》的作者之一 Eric Gamma 都大力推薦, 絕對不容錯過。
又過了幾年, 我的IBM經理又說,現在我們默認設計模式大家都會了, 敏捷實踐是必備技能 !
所以, JUnit 我得會, 重構我得會, TDD,持續集成這些最最基本的敏捷實踐也得知道, 要不然會被人鄙視啊。
作為一個有追求的Java碼農, 我寫代碼的時候要遵循Java 的編碼規範,例如類名首字母大寫, 報名要小寫, 方法名要首字母小寫...等等。
作為代碼潔癖, 我受不了臟代碼, 我會不斷的打磨自己的代碼,直到它像一個工藝品。
Java 的最佳實踐 《effective java》 怎麽能錯過? 裏邊滿滿的全是JDK的作者們總結出來的java 編程最佳用法。
不過翻譯的實在是不咋滴, 很多句子都得仔細的琢磨一下才知道什麽意思, 所以我打算錄一系列視頻講解一下,敬請期待。
【Java EE】
走了這麽遠, 終於來到Java EE了, Java 不就是寫服務器端的Web應用的嗎?
我會自己寫個Web程序, 可以考慮把上面提到的經典的薪水支付案例改造成Web 版, 用最基礎的技術Servlet/jsp/jdbc 。
然後 研究struts, 自己寫個簡單mvc框架, 在自己的Web 程序中用起來, 這叫吃自己的狗糧。
然後研究Hibenete , 自己寫個簡單的OR mapping框架, 再吃一次自己的狗糧。
然後讀一下經典的書《J2EE development without EJB》 , 對,就是spring 的作者Rod Johnson寫的, 它顛覆了大家對於重量級EJB的認識, 開啟了新的時代。
有了這本書的鋪墊, 自己寫個簡化的依賴註入也不是難事, 寫好後還是在自己的Web程序中用起來, 最後一次吃自己的狗糧。
等你做了就知道, 所有這些,都依賴Java Reflection。
再往後走, 就應該是找真正的項目做, 或者去找實習了, 那是另外一個話題了,以後再聊。
【閱讀代碼】
熟讀唐詩三百首,不會作詩也會吟
模仿是最好的學習! 多看看大牛們的代碼是怎麽寫的, 潛移默化,自己的武功也能提高。
我身邊要是有個好師傅, 跟著他,看著他編程, 提高的該有多快啊。
在學習Java SE和Java EE的同時, 我會讀一下這些源代碼:
JDK中的 Java Collection 源碼 : 老祖宗的東西絕對經典
JUnit 源碼 : 看看Eric Gamma 和 Kent beck 是怎麽通過模式來創建系統的 (回復"JUnit"查看)
SpringSide : 以Spring Framework為核心的,Pragmatic風格的JavaEE應用參考示例,是JavaEE世界中的主流技術選型,最佳實踐的總結與演示。
國人開發的,大力推薦一下。
此外我還是會研究下本世紀初著名的Jive論壇, 雖然非常古老, 雖然源碼學院派十足, 但簡直是設計模式的大本營, 都是活生生的應用的例子
裏邊有個用代理模式實現權限控制, 讓我記憶猶新。
另外如果有余力的,有興趣的話, 當然可以閱讀Struts, Spring, hibernate的源碼, 甚至參與進去開發了。
如何學習Java ,這是我這麽多年來的感受, 也只是我的一家之談。 歡迎和我交流 。
學習編程從來就不是一件容易的事情, 不可能看看視頻,看看書就學會, 需要大量的編程和實踐。 編程雖然是極為辛苦的腦力和體力勞動, 但其中蘊含的創造的樂趣也是無與倫比的。 希望每個人都能夠享受這個過程,樂在其中。
Java學習交流QQ群:523047986 禁止閑聊,非喜勿進!
如果上天再給我一次機會,我會這樣學Java