Java 學習歷程

陳鋆發表於2010-03-12

最近論壇上看到好幾個朋友都在問,如何學習 Java的問題,”我已經學習了J2SE,怎麼樣才能轉向J2EE?”, “我看完了Thinking in Java, 可以學習J2EE了麼?”.於是就有了寫這篇文章的想法,希望能幫助初學者少走一些彎路。也算是對自己幾年來學習Java的一個總結吧.

  在開始之前有必要再討論一下J2ME, J2SE, J2EE這些概念。J2SE, The Micro Edition of the Java 2 Platform. 主要用於嵌入式Java,如手機,PDA等等。J2SE, Java 2 Platform, Standard Edition, 我們通常所說的JDK(Java Development Kit)包含在此,是J2EE的基礎。J2EE, Java 2 Platform, Enterprise Edition , 就是所謂的企業級Java. 這些只是從API級別上的劃分,實際上Sun給J2EE的定義是:開發基於元件的多層的企業級應用的規範。也就是為各種不同的技術定義一個Java的規範,使這些不同的技術結合起來,在Java平臺上構建強壯的企業級應用。從這一點來看,J2EE這個概念應該是涵蓋J2ME, J2SE的。比如一個典型的J2EE應用,網上商店, 它支援web 方式下訂單,也支援手機下訂單。顯然必須用到J2SE,J2ME. 所以也就不存在所謂的從J2SE轉向J2EE的問題了,只是後者包含的範圍更廣而已。

來看看Sun給出的J2EE 相關技術主要分為幾大塊。
1. Web Service技術
-  Java API for XML Processing (JAXP)
-  Java API for XML Registries (JAXR)
-  Java API for XML-based RPC (JAX-RPC)
-    SOAP with Attachments API for Java (SAAJ)

2. 元件模型技術(Component Model Technologies)
-  Java Servlet
-  JavaServer Pages
-  JavaServer Faces
-  Enterprise JavaBeans
-  Java Message Service
-    J2EE Connector Architecture

3 .管理技術(Management Technologies)
-  J2EE Deployment Specification
-  J2EE Management Specification
-  J2EE Client Provisioning
-    Java Authorization Contract for Containers

4.其他相關技術(Other J2EE Technologies)
-  JDBC
-  Java Data Objects (JDO)
-  CORBA (Java IDL and Java RMI-IIOP)
-  JavaMail
-  Transactions
   如此之多的技術難免使初學者無所適從,望而卻步。即使是一位經驗豐富的J2EE 開發者,又有幾個人敢說J2EE相關的技術我都熟練掌握了。不過作為一名普通J2EE應用程式的開發者來說,我們只需要重點學習其中的一部分技術就可以了,對於其他部分只要做到心中有數,哪天需要用到了知道跑哪裡去找到資料就行了。以我個人的觀點,下面這些技術是一般J2EE應用開發人員所必須熟練掌握的。Java Server Page, Java Servlet, Enterprise JavaBean, JDBC, Transactions.  還有JAXP等XML相關技術,Java Message Service, Java Mail, JDO等等是最好應該掌握的。其他Management Technologies,Connector Architecture等等主要是給容器提供商中介軟體提供商參考的,應用開發者不需要怎麼關心,等用到了再去學習也不遲.

語言學習篇
  首先是J2SE基礎.學習一門新技術,無外乎閱讀和實踐了. 而一本好的參考書對於初學者來說顯得格外重要. 現在市面上的 Java書籍可以說是鋪天蓋地, 質量也是良莠不齊, 令初學者無所適從. 所以還是先推薦幾本書籍吧. 目前對於 Java基礎知識,大家一般都比較推薦兩本書, <<Thinking In Java>> 和 << Core Java(TM) 2, Volume I?Fundamentals >>.  第一本書不必多說了, Bruce Eckel 的大作, Jolt獲獎書籍. 內容比較全面, 基本涵蓋了java語言的方方面面. 這本書提供了相當豐富的例子, 非常有利於對學習內容的瞭解. 另外書中第一部分對於OO基本書籍的介紹, 我覺得對於剛接觸OO的人來說幫助會很大. 而且此書是Open Source的, 可以從作者網上下載http://www.mindview.net/Books/TIJ/而對於習慣於讀中文版的學習者來說, 侯捷翻譯的中文版是不錯的選擇.  要說這本說的缺點可能就是對於初學者來說厚了一點, 這也是一些人並不推薦此書作為初學者學習用書的原因吧. 後面一本<<Core Java(TM) 2, Volume I?Fundamentals>>, 目前已經是第七版了, 單從它出版的次數來看也可以看出此書受歡迎的程度, 這本書特點也是講述比較全面系統, 基本上一路啃下來的話Java語言基礎應該算過關了. 缺點也是太厚了, 有點像參考手冊, 前面部分花了不少篇幅講  Swing和Applet,可能對初學者不是很有用.  還有一些像<< Java in a nutshell>>也是比較不錯的基礎書籍.
學習了基本的語言基礎,別忘了最重要也是最有用的資料還是JDK文件. 從你學習java的第一天開始JDK文件應該是常備手頭了. 如果你碰到問題首先想到的是到論壇上去提問而不是查閱Jdk文件, 那先別繼續往下學習了,學會查JDK文件先. 不誇張的說在我們的初學者論壇中60%的問題是光查一下JDK文件就能解決問題的. 最新JDK Documentation下載地址http://java.sun.com/j2se/1.4.2/download.html(目前最新版是J2SE5 http://java.sun.com/j2se/1.5.0/download.jsp)不能光說不練, 同一下載頁面把JDK給下載回來. 安裝完後有一點我想提一下, 安裝路徑下有一個src.zip(有些jdk版本是src.jar), 好東西啊---JDK原始碼, 老是有人在論壇上問哪裡有JDK原始碼下載, 你說東西就放在你家裡還到處找. 有了這個有些問題就需要在論壇上跟人家爭來爭去了,翻開原始碼瞧一下什麼疑問都沒有了. 幾個最重要的命令列工具是
javac  : 編譯原始檔到class檔案
java:     執行class
jar : 打包工具.
Javadoc :  生成java doc的工具.
對於初學java的人來說, 我不推薦使用IDE而 直接用文字編輯器, 然後用命令列編譯執行. 這樣有利於理解CLASSPATH, PATH這些最基本概念. CLASSPATH是初學者比較容易感覺迷惑的地方.現在的 IDE太聰明瞭, 給個名字就給你自動生成java source code, 自動編譯. 可能你執行完了你的第一個Hello World 程式, 還不知道java 和 javac是用來做什麼的. 至於實際的專案開發, 一款合適的IDE還是十分重要的, 我們稍後再對java 開發工具做一些介紹.


J2EE 基礎和Java語言進階

   學習完語言基礎, 就可以比較自然地轉入J2EE實際技術的學習了. J2EE實在是比較龐雜, 而EJB, Servlet , 這些核心技術是作為每一個J2EE開發人員所需要掌握的. 關於servlet,  我比較推薦<<Core Servlet and JSP 2Edition>>和<<More Servlets and Java Server Pages>>, 第一本是Sun推薦的Servlet教材. 第二本是當年Amazon最暢銷Java書籍, 五星級書籍. 這本書機械工業出版社有中文版叫<<Servlet 與JSP權威指南>>,感覺翻譯得還可以, 第二版好像還沒有看到有中文版. 兩本書都全面系統地介紹了JSP和Sevlet知識, 從web伺服器配置, JSP, Servlet基本程式設計, 標記庫(Tag Lib), 過濾器, 事件框架都有很好地描述. 提供地例子也比較實用. 對於EJB學習, 比較著名有兩本書, << Enterprise JavaBeans, 3nd Edition>> 和<< Mastering Enterprise Java Beans Third Edition>>, 兩位作者Richard Monson, Ed Roman都是屬於業界重量級人物.而Richard Monson本身就是EJB規範專家組成員.對我來說, 兩本書難分優劣, 第二本書有個好處就是可以免費下載http://www.theserverside.com/books/wiley/masteringEJB/index.tss.
還是那句話,不能光說不練, 不過J2EE 的練習做起來有一點麻煩, 應用伺服器是不可少的, 最好還得準備個輕量級的資料庫. 下面簡單介紹一下這些工具.
web伺服器(Servlet Container)方面有.
Tomcat.   http://jakarta.apache.org/tomcat/
Jetty:      http://jetty.mortbay.org/jetty/
應用伺服器常用的有,
Jboss:        http://www.jboss.org/products/index
Weblogic:   http://www.bea.com/framework.jsp?CNT=index.htm&FP=/content/products/server
WebSphere: http://www-128.ibm.com/developerworks/downloads/ws/was/?S_TACT=105AGX28&S_CMP=DLMAIN.
Tomcat, Jetty, Jboss都是Open Source. Weblogic 和 WebSphere是J2EE伺服器中的老大級人物, 價格也不菲. 不過對於開發者有免費的試用版下載.
如果單單只是學習Servlet, 推薦使用Tomcat, 它是Sun官方指定的Servlet, JSP規範的參考實現.. 對初學者最重要的是它使用比較簡單, 自帶文件比較齊全, 使用者眾多, 有什麼問題容易在論壇上面得到幫助. 如果學習EJB的話, 推薦使用Jboss, 不僅僅是因為它是Open Source的,主要是配置比較簡單, 使用方便. 比如說對於連線資料庫, 對於常用的MySQL, Oracle , MS SQL等等都提供了Sample Config檔案, 直接拿過來做些小改動扔到Deploy目錄下就可以用 DataSource了, 部署J2EE應用也簡單, 把整個 .ear或者.war扔到deploy下就可以了. 唯一不方便的地方是從 Jboss3.0開始, 它的文件開始收費了. 但是對於一些基本的配置, 在網上還是非常容易找到的, 畢竟它太流行了. 至於 Weblogic, 也比較容易使用, 不過比起Jboss來個頭大了很多, 通過強大的管理介面使得一些常用的配置工作變得十分簡單.  和Jboss比起來它的文件就太多了, 簡直是有點羅裡八嗦, 比如要部署一個.ear檔案, 一般我們也就是直接扔到domain下的applications目錄下就會自動deploy了, 但是要看它的文件可是長篇大論, 容易嚇著初學者, 以為這又是什麼高深的學問. 至於WebSphere, 個人不推薦初學者使用, 相比前倆個Server比較難使, 而且狂吃記憶體.不過在企業級市場這個傢伙表現不俗, 畢竟是出生於IBM這樣的豪門.
資料庫方面, 目前常見的主要有PostgreSQL, MySQL, Oracle, MS SQL, DB2等等.前面兩個是開源資料庫, 後面幾個基本上壟斷著大部分的資料庫市場. 對於初學者用來做做EJB, JDBC的練習, 我推薦MySQL, 理由還是很簡單, 開源軟體不要錢, 個頭小使用方面, 使用者眾多文件齊全. 下載地址http://www.mysql.com/products/mysql/.  PostgreSQL也可以考慮, 不過國內使用者遠不如MySQL多, 所以要在論壇上問起問題來就少方便一些了, 下載地址http://www.pervasive-postgres.com/downloads/. 至於後面那些比較重量級的資料庫, 為了做做練習而言就不用考慮了, 我們也花不起這個錢啊.

學習完J2EE 的這些具體技術, 這個時候進行基本的 J2EE 開發應該是不成問題了. 此時應該考慮提高自己的程式碼質量了. 這裡我強烈推薦Martin Fowler的<<Refactoring: Improving the Design of Existing Code >>, 這本書不是一本非常實際的書, 作者完全是手把手地教你如何提高程式碼質量, 從具體地程式碼中告訴你什麼是程式碼的Bad Smell, 如何去掉這些Bad Smell. 不少書評是這麼說的, 這本書對於初級,中級的讀者幫助是立杆見影的.至少 就我接觸到的幾個學習程式設計不久的程式設計師, 編碼質量在短期內都有很大提高. 當然重構(Refactoring)這一概念並不只針對Java語言的, 它對所有OO語言都是適用的. 重構的概念是如此深入人心,以至於今天幾乎所有流行的 IDE工具都有對重構的支援. 這裡我還想再推薦一本<<Effective Java>> . 從C++ 過來的程式設計師都知道<<Effective C++>>在C++領域的地位, 至今還流傳著這樣的趣話, C++程式設計師分為兩種, 一種是讀過<<Effective C++>>的, 另一種是沒有讀過C++的. 雖然這本<<Effective Java>>在Java領域的影響也許沒有那麼大, 但對於Java程式設計師絕對有相當的指導價值. 作者是Sun公司的Joshua Bloch,  java Collection framework 的設計者. 作者站在JDK設計者的角度向你介紹他的Best Practice, 應該這樣做而不應該那樣做, 對於JDK中某些API設計的缺陷他也毫不袒護的指出. Java語言之父James Gosling為此書寫的前言是這麼說的” I sure wish I had had this book ten years ago. Some might think that I don't need any Java books, but I need this one”. 這本書會讓你覺得原來你對Java還是有很多東西不瞭解的. 舉個例子來說, 物件的equals方法, 我們認為它很簡單, 也許你每天都在為你新寫的Class過載這個方法, 但是你在過載的時候注意過“自反”, “對稱”, “傳遞”這些必須要考慮的因素, 你是否同時還小心謹慎的過載了hashcode這個方法? 如果沒有, 建議你要讀一下這本書. 讀完這本書,你會覺得離Java的距離更近了. 上面兩本書都出過中文版, 後面一本<<Effective Java>>還有兩個版本的中文版, 第一次翻譯的比較差一點, 後來機械工業出版社 又委託潘愛民先生重新翻譯了一遍.同一本書在同一個出版社連續被翻譯了兩次也說明國內出版界對這本書還是比較重視的. 
這個階段, 在看書的同時, 可以結合著學習一些優秀的開源專案的原始碼. 這些開源專案的程式碼風格, 註釋都是值得借鑑的. 實在太懶也別忘了手頭上還有個Jdk的原始碼. 其實也不用刻意去找原始碼, 在實際的J2EE專案開發中, 基本上都會用到一些優秀的開源專案.  Framework可能會用到Spring, Struts, Log機制基本上都會JarkartaCommons Log或者Log4j,  單元測試會大多會用Junit, 結合專案閱讀一下其中的一些原始碼, 既可以提高自己又對專案會有所幫助, 說不定因此而得到PM的賞識呢. 一舉兩得, 何樂而不為呢. 呵呵, 有點扯遠了. 過了初學者階段,該學會如何找到適合自己的Java書籍了. 歷經數十載, 今天的Java技術已經變的如此之龐雜, 我相信即使窮淨一個人畢生之精力也不可能把Java所有的相關技術都學通, 何況新技術還在層出不窮地推出, 3年之前誰會知道Struts會成為Web框架事實上的工業標準. 2年之前誰會知道Hibernate會在今天獨領風騷.  既然已經不能指望一次性把java技術的方方面面都學個通, 在實際中也只能是需要什麼技術再學習什麼技術了. 而能否選擇一本好的參考書籍帶來的就是事半功倍和事倍工半 的效果. 所以我覺得花點時間放在選擇書籍上面還是很值得的, 否則你在後面只會花更多的時間. 下面我談談自己選擇書籍的一些經驗, 不一定正確. 首先看作者, 像上面提到的那些書的作者, 都是業界鼎鼎大名的, 選擇他們的書一般錯不了. 大家看的書多了, 自己胸中自然也會有一個list, 哪些作者是信得過的.二看出版社, 計算機書籍方面,  Oreilly, Addison-Wesley都是公認比較好的出版社. 對於目前比較流行的Java技術, Oreilly的<<XXXX  in  Action>>系列是不錯的選擇. 另外我還會去看看Amazon網站(http://www.amazon.com/)的書評, 一般小於3星級的書我都不會考慮. 還有一個好去處theserverside,http://www.theserverside.com/的書評, 這裡的書評比較有趣,往往都有很激烈的爭論, 裡面經常會看到一些名人在發言.我要向所有Java 學習者推薦, 如果我的收藏夾裡面只能存放兩個網站,我會選擇java.sun 和theserverside. 在這裡你可以瞭解最新的Java動態, 可以學習第一手的Java資料, 可以看到Java高手們(裡面不乏業界大腕)激烈辯論.
到此階段, Java Developer的基本功底應該算是打好了吧,往後就是不斷學習嘍. 結束這一段之前,最後再介紹一本書Oreilly 的<<Java Threads, Second Edition >>, 因為我覺得多執行緒程式設計屬於 Java基本功, 每一個想學好Java的人都應該好好掌握.

 

提高篇
在這個階段應該從軟體架構, Framework層次上來學習了. 作為物件導向的聖經<<Design Patterns>>, 這本書是不得不推薦的. 不用再多說了, 這本在物件導向領域地位完全是屬於教父級別的.  不管你學習的是什麼OO語言, 不管你現在是用.Net還是J2EE開發, 這本書都是你進階之路上的必讀之書. 而<<Core J2EE Patterns>>則專門針對於J2EE來討論設計模式, 書中Sun Java Center的資深設計師描述了J2EE關鍵技術的模式. 最佳實踐,設計策略和經過驗證的解決方案. 對於每一個希望成為J2EE 架構師或者設計師, 這本書值得一讀. 學習設計模式的時候,建議是結合實際的原始碼來看, 比如看看Junit原始碼, 你可以看到很多設計模式優雅的實現, 作者之一Erich Gamma本身 就是<<Design Patterns>>的作者. 至於J2EE的設計模式, Sun還開闢了專門的空間http://java.sun.com/blueprints/patterns/,  裡面有對常用模式的討論又提供了詳細的原始碼樣例. 正如Grady Booch所說, 模式對於普遍問題提供了通用的解決方案, 利用模式就等於擁有一個強大的專家隊伍.  如果你還沒有學習, 現在就開始吧. 此外對於物件導向方法論, 極限程式設計的思想也應該有所瞭解http://www.extremeprogramming.org/ . 對於J2EE專案的具體實施, Rod Johnson的<<Expert One-on-One J2EE Design and Development (Programmer to Programmer)>>也很有價值, 該書以作者豐富的實戰經驗向我們展示如何用盡可能簡單的解決方案構建J2EE 應用, 書中作者第一次提出這樣的觀點, 很多時候, J2EE應用完全沒有必要用到EJB, 對於言必稱EJB的廣大J2EE開發者來說, 怎麼說也有點驚世咳俗的味道. 當然, 作為Servlet和JDO兩個專家組的成員, 這可不是作者信口胡騶的. 今天風靡Java世界的Spring 框架最初便是源於此書, 而IOC, AOP等概念更是被時下的java開發者掛在嘴邊. 最後, 作為對Java的深入學習, Java技術的各個Specification也有必要一讀. 暫時就寫到這裡吧.

 

 

相關文章