Java發展歷程

J2SE:懷胎

Java的歷史可以追溯到1991年4月,Sun公司的James Gosling領導的綠色計劃(Green Project)開始着力發展一種分佈式系統結構,使其能夠在各種消費性電子產品上運行,他們使用了C/C++/Oak語言。由於多種原因,綠色計劃逐漸陷於停滯狀態。

直至 1994年下半年,由於Internet的迅猛發展和環球信息網的快速增長,第一個全球信息網絡瀏覽器Mosaic誕生了;此時,工業界對適合在網絡異構環境下使用的語言有一種非常急迫的需求;Games Gosling決定改變綠色計劃的發展方向,他們對Oak進行了小規模的改造,就這樣,Java在1995年的3月23日誕生了!Java的誕生標誌着互聯網時代的開始,它能夠被應用在全球信息網絡的平臺上編寫互動性及強的Applet程序,而1995年的Applet無疑能給人們無窮的視覺和腦力震盪。

但沒有相應的開發庫而只靠Java語言來進行開發肯定是困難重重,所以Sun公司在1996年的1月23日發佈了JDK 1.0來幫助開發人員的開發。JDK包括兩大部分:運行環境和開發工具。緊跟着,Sun公司在1997年2月18日發佈了JDK 1.1。JDK1.1相對於舊版本最大的改進,是推出了JIT(Just-In-Time)編譯器,另外一個改進是AWT 1.1。

在JDK 1.1時代,Java平臺分爲PersonalJava與EmbeddedJava,前者比較適用於運算資源和內存豐富的設備,而資源有限者適用於後者。這樣的分類明顯不符合時代發展的潮流,所以,Java平臺處處蘊藏着新的翻天覆地的革命……

J2SE1.2:誕生

JDK 1.2在1998年12月4日的隆重發布,標誌着Java2平臺的誕生。Java 2的J2SE 1.2時代是一個大變革時代,它進行了如下的三大革命:

● 市場推廣革命

Sun公司在Java 1.2版以後將JDK 1.2改名爲J2SDK,將Java改名爲Java 2。在1999年Sun公司還將Java 2平臺分爲三大塊:J2SE,J2EE,J2ME。這次市場推廣革命順應了網絡急速發展的潮流,對Java 2平臺的發展起到了很好的催化劑的作用。

● API供應標準革命

而隨着供應商的不同,Java的API分爲三大類:

Java Core API:由Sun公司制定的基本的API,所有的Java平臺都應該提供。

Java Optional API:由Sun公司制定的擴充API,Java平臺可以有選擇地提供。

特殊API:由特殊廠商或者組織提供的API。

● API制定過程的革命

如果你有需求不能通過遵循標準的API來實現,可以向JCP提出制定新的API的請求,經過審覈,你的請求可能被通過或者駁回;如果是被通過,則開始進入制定該API的程序。

J2SE 1.2時代進行的這些革命形成的制度一直沿用到現在,對Java技術的發展形成了深遠的影響。

除了上述的三大革命,Java 2還支持並新增了許多新特性,最受追捧的當屬Swing庫。Swing是輕量級的API,它不但有各式各樣先進的組件,而且連組件風格都可抽換。Swing出現之後,大家很快地就不太使用AWT了。Java 2還廢棄了一些API,最重要的莫過於Thread類中對suspend(),resume()和stop()等方法的廢棄。由於JDK 1.1的集合類庫中的Vector類和HashTable類都考慮了同步,在平常的使用中影響效率,所以Java 2專門添加了對應的非同步類,並完善了集合類庫。

J2SE1.3:拓廣

Java 2平臺推出後,得到了市場的強烈反響,所以,在2000年5月8日推出的J2SE 1.3對J2SE 1.2的改進,主要是對各種已有API的加強和對新API的拓展。

數字運算:加入了java.lang.StrictMath,方便我們的一般的數字運算。

新的Timer API:相信大家對其中的java.util.Timer和java.util.TimerTask一定不陌生。

Collections包:加入了一些新的API,方便我們的使用。

虛擬機停止鉤子:J2SE 1.3還加入了一個強大的功能,那就是虛擬機停止鉤子(Virtual Machine Shutdown Hooks),這個功能使得我們能夠在虛擬機停止時完成我們自己的操作,比如關閉網絡連接或者保存會話狀態或者清除臨時文件等等。

DNS服務:在JNDI接口方面,加入了一個DNS服務的實現。

Jini實現:J2SE 1.3包含了一個Jini實現,這使得我們可以方便地把諸如打印機、攝像機和磁盤驅動設備插入現有網絡中,並且能自動搜索已在網上的設備可以提供的服務並享用這些服務。

XML支持:由於計算機網絡和XML技術的快速發展, J2SE 1.3在Optional API中引入了Java API for XML包。

HotSpot虛擬機:J2SE 1.3引入了HotSpot虛擬機。在Solaris版的JDK 1.3中,已經不支持傳統的虛擬機,而Windows版的JDK 1.3同時支持傳統虛擬機和HotSpot虛擬機。

從上面的分析可以看出,J2SE 1.3主要是對J2SE 1.2查漏補缺和拓展新的API。從應用領域方面考慮,J2SE 1.3已經涵蓋了數據庫、WEB、多媒體、網絡、電話、影像、加解密、圖形等等大部分的信息技術領域。

在這個時期Java 2還有一個重要活動就是推出SCSL(Sun社區源代碼許可)許可協議。Sun公司開放源代碼項目的“女1號”Danese Cooper在1999年加入公司,負責Sun(包括Java)和開放源代碼社區之間的協調工作。Sun一直儘可能在贏利和開放源代碼之間尋求更好的平衡。

Java的大行其道引起了Microsoft的警惕並直接導致了.Net的產生,這同時也宣佈了Java作爲獨一無二的Internet平臺地位的結束。這兩個對手在較量中相互學習,現在在技術架構上的目標上已趨相同。

J2SE 1.4:快速

J2SE 1.4平臺的推出發生在2002年2月13日,由於此前在Java平臺和.NET平臺間發生了規模浩大的孰優孰劣的論戰,而論戰中,Java平臺最大的缺點就是性能問題,所以J2SE 1.4平臺把性能的改善放在了最重要的位置。

HotSpot虛擬機:HotSpot虛擬機能夠很大程度上提高性能,所以J2SE 1.4已經不支持傳統的虛擬機。現在,啓動應用程序應該通過-client或者-server選項來啓動。

鎖機制:由於舊版的HotSpot虛擬機的鎖機制會導制嚴重的性能和功能問題,J2SE 1.4已經改寫了該鎖機制。

安全API:JCE、JSSE和JAAS這三大安全API從optional API移到了core API中。這樣,J2SE 1.4的安全域(SecureRandom)實現可以利用操作系統提供的安全機制,以便縮短應用程序的啓動時間。

RandomAccess標記接口:加入了RandomAccess標記接口,如果一個List實現了該接口,則表示它支持快速的隨機訪問,這樣可以提高List訪問的速度。

LinkedHashMap:加入了LinkedHashMap,這是一個插入排序的Map實現,但它的運行速度和HashMap一樣快。

反射:很多產品中都要使用反射(Reflection)機制,但大家知道,反射是相當耗時的,所以,J2SE 1.4中重寫了java.lang.reflect.Field、java.lang.reflect.Method.invoke()、java.lang.reflect.Constructor.newInstance()和Class.newInstance()等方法,使得我們利用反射也能寫出高性能的應用程序。

64位計算:J2SE 1.4支持64位計算。

新的I/O API:J2SE 1.4在API層面最大的變動,就是它更新了原有的java.io包,以及加入了一組更有效率更多功能的New I/O API。

斷言和日誌處理:J2SE 1.4版本在Java語言層面上加入了斷言(assert關鍵字),在API層面上加入日誌處理API,這些爲程序的調試提供了強有力的支持。

從上面的分析可以看出,Java 2平臺在經過數年的發展後,已經比較成熟穩定,J2SE 1.4主要是對平臺的性能進行較多的考慮和修改。在分佈式程序方面,1.4版比1.3版的運行效率提高了一半以上;而在客戶端程序方面,1.4版比1.3版的效率提高了1/3。

J2SE 1.4版是J2SE第一個參與了 Java共同體過程(JCP)的J2SE版本。 像Borland、Compaq、Fujitsu、 SAS、 Symbian、 IBM這樣的公司,和Sun一起定義並發展了J2SE 1.4規範。在開放、良好的文檔編撰與管理的過程中,形成了一個高質量的、代表了Java共同體的多樣性的規範。

J2SE5.0:易用

在2004年十月J2SE 5.0發佈的時候,Sun公司這樣解釋這次版本名稱不是J2SE 1.5而是J2SE 5.0的原因:“從Java誕生至今已有9年時間,而從有J2SE算起也有5個年頭了;在這樣的背境下,將該版本號從1.5改爲5.0可以更好的反映出新版的J2SE的成熟度、穩定性、可伸縮性、安全性。”

J2SE的這次變更之重大和意義之深遠,的確也值得我們爲之把版本號變換到J2SE 5.0。我們再看看Sun公司網站對J2SE 5.0的features描述:“通過增強Java平臺的力量,允許開發者更容易地使用,Java編程語言的這些改進將吸引大量各種Java開發者”,這是“Java技術發展歷程的一個重要里程碑” 。從這個描述我們可以看出,J2SE 5.0最大的目標是通過提供易用性而吸引各種開發者(當然包括以前的C/C++開發者) ,而它對以前版本的修改並不僅僅是API的升級,而且包括對Java語言層面的改進,被譽爲是”自Java問世以來的最大一次語言標準變化”。

訪問環境變量:最初的Java語言有一個訪問環境變量的方法System.getenv(),但因爲Java宣稱的”Write Once,Run AnyWhere”特性,所以在JDK 1.0中去掉了這個能夠訪問平臺專有信息的方法。在J2SE 5.0中,它又來了,並有所擴充。由此可見J2SE 5.0對編程方便性的重視程度。

泛型:J2SE 5.0提供了強大的泛型機制,讓程序員可以減少代碼重複,這個變化應該可以吸引小部分的C#開發人員吧。

增強的for循環:爲了克服普通for循環的代碼臃腫特點,J2SE 5.0提供了增強的for循環,我們現在可以這樣寫一個for循環:

public void printAll(Collection coll)

{

 for(String str : coll)

 {

  System.out.println(str);

 }

}

怎麼樣?是不是簡單了很多?

自動的裝箱/拆箱:

可變參數數目J2SE 5.0開始支持Varargs(不固定自變量個數),J2SE 5.0中還加入了以前拋棄的枚舉和C風格的格式化輸出,這應該是爲了吸引以前的C開發者吧。畢竟,在C開發中枚舉和格式化輸出用的是太多了。

併發 J2SE 5.0中加入了java.util.concurrent包,並向集合框架中加入了Queue接口,J2SE 5.0還爲各種集合提供了併發情況下的實現。

Properties類增強 由於XML的普及性應用,J2SE 5.0爲java.util.Properties類加入了從XML文件中裝載屬性和把屬性值存儲到XML文件中的方法。

Annotation功能J2SE 5.0提供了註解(annotation)/元數據(metadata)功能,相信以後的大部分應用產品都將充分利用它的註解而實現產品的各種特性。

其它J2SE 5.0還在多線程(併發機制)、安全、國際化、UI等方面進行了大規模的變更,使得我們能夠更方便地進行Java開發。

其實,上面的這些變更,並不是我們程序員非要不可的內容。我們完全可以通過自己的辦法來達到這些變更實現的功能。但J2SE 5.0的目標就是讓我們程序員能夠更加方便地進行開發,所以,我們在基於J2SE 5.0開發時,應該能夠明顯的體會到它的易用性。

展望

時至今日,J2SE已經發展爲一個覆蓋面廣、效率高、易用性強的技術平臺(見如下的J2SE API體系結構圖),但Java並沒有停止前進的腳步。Mustang版本的J2SE正在緊鑼密鼓的開發當中,按以前的慣例,每兩年會發佈一個全新的J2SE版本,所以Mustang開發版對應的J2SE 6.0發佈版將在2006年完成。

2005年5月23日是Java技術十週年慶典日,在這十年的發展中,Java平臺吸引了四百萬開發者,在網絡計算遍及全球的今天,更是有17.5億臺設備使用了Java技術。作爲Java技術的基礎,J2SE的功績不可掩沒,我們期望J2SE伴隨Java平臺一路走好!

 

 Java開發環境的過去、現在和將來

1995年3月23日,San Jose Mercury News登出一篇題爲“Why Sun thinks Hot Java will give you a lift”的文章,在那篇文章裏預言Java技術將是下一個重大事件,這個預言現在看來並不僅僅是商家的宣傳伎倆,雖然文章是當時Sun的公關經理 Lisa Poulson安排撰寫的。從世人知道Java那一刻起到現在,算起來已經過去整整十年,回顧過去的十年值得總結的東西有許多,但在這裏筆者只想就Java 開發環境談些個人的想法與朋友們交流一下。

現在的軟件開發人員在整個軟件的開發生命週期裏,也許會根據需要使用各式各樣的開發工具來完成相對複雜的開發任務,而在幾十年以前,人們還只是使用文本編輯器、編譯器和Debugger進行開發,對於這個階段的開發環境人們稱之爲CLEs(Command Line Environments)。 而當人們發現如果將那些單獨分開的開發工具集成起來就可以有效的提高開發效率時,IDEs(Integrated Development Environments)就出現了。Java的出現儘管只有十年,但其開發環境也大至經歷了從CLEs到IDEs再到XDEs這三個階段,現在即將進入CDEs階段。在上述Java開發環境發展過程中,有許多值得我們大家關注的地方。

Java開發環境的歷史回顧

縱觀過去十年Java開發環境的發展,大致可以粗略的劃分爲如下幾個階段:

●  1995,命令行開發環境CLEs

●  1996-2000,集成開發環境IDEs

●  2001-2004,擴展開發環境XDEs

●  2005至今,協同開發環境CDEs

1995年,不平凡的一年,這一年Java 獲得了成功。可令人尷尬的是在1995年並沒有一個令人滿意的Java開發環境,開發人員在進行Java編程時,大多使用文本編輯器編輯源程序,然後再使用命令行的方式進行編譯處理。那時的Java開發環境還處於CLEs時代,開發效率非常低,這預示着在Java開發工具上會有一番激烈的競爭。

有人稱1996年爲互聯網年,有人卻稱之爲Java年,還有人稱之爲Web開發年,但不論如何稱呼1996年,它都反映了一個事實:Bill Joy將Java與互聯網相結合的策略取得了成功。這一年的9月Sun推出了其Java開發環境-Java WorkShop,這是一款基於瀏覽器的Java開發工具,但由於當時 Java在許多方面還不成熟,所以實際上Java WorkShop並不成功,同年發佈的Symantec Visual Cafe由於還是採用C/C++語言進行開發,所以性能與成熟度上就比WorkShop好得多。提到Visual Cafe就不能不提Eugene Wang,因爲Eugene Wang常常是與計算機間諜這個詞同時出現的人物,有人甚至講當時Symantec的老闆Gordon Eubanks與Eugene Wang簽約時,也同時簽下了監獄裏的一個單元。Visual Cafe就是由Eugene Wang進行主要策劃的,它是在同一年發佈的Java開發環境中,唯一解決了與數據庫連接問題的開發環境,帶有一套可以與數據庫相連接的組件,無需太多編程使用拖拽的方式就可完成大部分工作,這一優點使得Visual Cafe受到了Java開發人員的歡迎。這一年IBM收購了OTI公司,從而得到了Dave Thomas的弟子John Duimovich、Dave Thomson、Mike Wilson等一大批軟件精英,這之中還包括“生活在技術刀鋒上的開發者”Brian Barry。

1997年,由於微軟壟斷案,使得微軟在Java開發環境上的努力受到了限制,Visual Cafe由於界面直觀易用,可以很容易地連接各種數據源等功能再次受到開發人員的歡迎。這一年IBM發佈VisualAge for Java。VisualAge for Java是面向代碼庫的開發環境,它提供代碼庫和項目管理以便於開發團隊在 C/S環境下進行項目開發。但由於大多數Java開發人員比較熟悉面向文件的開發環境,還不太習慣面向代碼庫的開發,再加上VisalAge for Java對系統資源的要求比較高等因素,使得VisualAge for Java一開始未被Java開發人員所認可。

1998年至2000年比較成功的Java開發環境是JBuilder,這是由於Borland較好的把握住 J2SE、J2EE和J2ME發佈後,Java技術升級的時機,全面支持Java1.1和Java1.2開發平臺,它還提供了多種工具方便用戶從舊的平臺遷移到新的Java平臺。JBuilder本身80%是基於JDK1.2進行開發的,它支持JavaBeans, Enterprise JavaBeans, JDBC等方面的應用開發,可以連接多種關係數據庫。爲支持分佈式應用開發,JBuilder還集成了 VisiBroker ORB、JSP server、數據庫和EJB AppServer,並提供Open Tools API便於第三方工具集成。上述種種的優點使得JBuilder一舉超越Visual Cafe,成爲當時最受歡迎的Java開發環境。在衆多Java開發環境中,1999年IBM發佈的VisualAge for Java Micro Edition是比較有特色的開發環境,它是由Erich Gamma和與Erich Gamma有“焦不離孟、孟不離焦”之稱的John Wiegand共同進行設計的,採用了Java 擴展機制,並集成了JUnit測試框架,其當時所採用的架構深深地影響了後來Eclipse1.0所採用的架構。同時,通過VisualAge for Java Micro Edition的開發,那些來自“未來世界”(Smalltalk們總認爲他們來自計算機的未來世界)的軟件精英們,全面徹底地對Java技術進行了評估,得出了許多結論性的東西,這之中包括現在鬧得沸沸揚揚的Swing和SWT對比。此外,Sun將其收購的NetBeans變成了開源的Java IDE也是一件不大不小的事情。

縱觀1996年至2000年這五年時間裏,隨着Java及其相關開發應用的發展,Java開發環境也不斷的完善,從CLEs進入到IDEs階段。爲了提高Java開發人員的開發效率,Java開發環境主要從兩個方面進行改進與提高。一方面是提高集成在Java IDEs當中開發工具的性能和易用性,另一方面是將Java開發環境儘可能的覆蓋到整個軟件的開發生命週期。隨着基於WEB,採用N-層結構的應用開發成爲Java開發人員主要從事的開發任務,Java開發環境需要支持越來越多的技術,比如:XML、JSP、EJB和CORBA等,這就造成了Java IDEs的規模變得越來越大,許多Java開發環境都集成了數據庫、JSP Server和AppServer,軟件的研究人員將上述IDEs不斷膨脹的現象稱爲“IDEs大爆炸”。

“IDEs大爆炸”現象發生以後,有關Java開發環境是走少而精的發展方向,還是走大而全的發展方向就成了廣大Java開發人員關注的問題。2001年Java開發人員達到了200萬,成爲每個軟件供應商都無法忽視的力量,這一年JetBrains推出了Java開發環境少而精的代表: IntelliJ IDEA。 IntelliJ IDEA明確的表示只做最好的Java代碼編輯器,不做什麼文件都可以編寫的編輯器。它關注Java開發人員的工作實際並將這些工作進行了優化。由於減掉了一些可有可無的工具,所以價格上相對合理公道。當年IntelliJ IDEA擊敗JBuilder成爲最受Java開發人員歡迎的Java開發環境,不過2002年隨着JBuilder將大而全的功力再提升一步,將UML建模工具、JUnit測試框架以及Apache Struts等開發工具集成進來,大而全的發展方向又一次受到Java開發人員追捧。最全還是最好似乎使Java開發人員在選擇Java開發環境時處於兩難狀況,但實際上當Eclipse 1.0發佈時,這個問題已經得到了初步的解決,最好和最全是可以兼顧的。

Eclipse的出現不是從天上掉下來的,也不是某個天才拍腦袋想出來的,它是一羣軟件精英們集體智慧的結果。早在1998年IBM就打算開發新一代的工具平臺以便將它現有的各種開發工具統一起來,並減少開發各種工具時重複的勞動,同時希望在新的平臺上建立新的Java開發環境。經過一段時間的準備, IBM開始建立起一個開發團隊,人員構成主要來自VisualAge for Java Micro Edition和VisualAge for Java兩個項目的開發人員,選擇的標準是過去10年至少開發過5到6個IDE。此外,IBM還聯合了9家公司共同成立了一個開源組織Eclipse基金會,將Eclipse提供給開發人員使用,並在開源社區的幫助下進一步完善Eclipse本身。Eclipse在最初設計時,插件模型是靜態的,不能實現插件的即插即用功能,即便是大受歡迎的Eclipse 2.1也還是靜態的。所以到2004年發佈Eclipse 3.0時,Eclipse進行了重大改進,採用OSGi的插件模型,初步實現了插件的即插即用功能,至此一個完美的、可擴展的開發環境展現在Java開發者面前,這時Java開發人員已經達到300萬。

Java開發環境的現狀

2004年Eclipse 3.0的發佈極大刺激了Eclipse用戶的增長,經過一年以後,Java開發人員現在使用Java開發環境的狀況是如何的呢?看了下面的表格裏的數據也許可以瞭解一個大致的狀況。

首先需要指明的是上述的數據並不是當前Java用戶使用Java開發環境的準確反映,但我們可以從中瞭解一個大致的狀況。現在的Java環境可以分爲三個集團,第一集團是Eclispe它大約佔據1/3的份額,第二集團是 IntelliJ IDEA、NetBeans 和JBuilder佔據另外1/3的份額,相互之間旗鼓相當,第三集團是以JDeveloper和WSAD爲代表的十幾種Java開發環境佔據剩下的 1/3份額,但每種開發環境佔總份額的比重不超過5%。我們考察Eclipse、intelliJ IDEA、NetBeans 和JBuilder這些主流開發環境,可以發覺它們有一個共同的特點那就是可擴展,儘管在實現手段上各有不同。這就是爲什麼稱現在的Java開發環境爲XDEs(eXtended Development Environments)的原因,IDEs已經死亡了4年,專業的開發人員需要了解這個事實,因爲XDEs也快死了。

由於市場的壓力,一個軟件企業不僅要提高開發人員個體的工作效率,還要提高整個開發團隊以及整個企業的開發效率,但在現有的Java開發環境XDEs下無法完全做到這些,所以新一代開發環境CDEs (Collaborative Development Environments)就產生。Grady Booch和Alan W. Brown的研究表明一個程序員一天工作時間的分配是這樣的:分析佔16%(從5%到40%不等), 設計佔14%(從1%到40%不等),編程佔16%(從0%到60%不等),測試佔10%,打電話佔3%,閱讀佔7%(電子郵件,文檔,月刊和雜誌),參加開發會議佔10%,無關的會議佔7% 。從這些數據可以發現,開發人員用於交流的時間約佔工作時間的1/3,開發人員的相互交流非常重要。可是現有的主流Java開發環境一般僅將分析、設計、編程和測試等工具集成進來,卻未包括用於交流的工具,這顯然不合理。因此,所謂CDEs就是將用於人與人、人與團隊以及團對於團隊進行交流的工具集成進來的開發環境,比如,CDEs常具有發送電子郵件、進行及時通訊和屏幕分享等功能,通過實現無損耗過程的交流提高開發團隊的開發效率。

現在已經商業化的CDEs是CodeBeamer Collaborative Development Platform和CodePro AnalytiX,上述兩款軟件都提供Eclipse的插件,可以與Eclipse集成在一起,使Eclipse升級成爲一個CDEs。大家肯定知道Borland已經宣佈開發基於Eclipse的新版JBuilder-“Peloton”,Peloton就是一個CDEs(Collaborative Development Environments),當它明年上半年發佈時,就意味着Java開發環境進入CDEs時代,現在Java開發環境還處於XDEs與CDEs交替的階段。

Java開發環境的未來

在可以看得見的將來,Java的開發環境還會是以CDEs的形式存在。開源組織或開發工具供應商將會努力爲軟件的開發創建一個絕對光滑的平面 (Frictionless Surface),實現無損耗的開發過程,以提高開發效率。爲了實現無損耗的開發過程,Java的開發環境將會關注以下幾個方面:

●  起步階段方面

●  協作開發方面

●  維護開發團隊有效溝通方面

●  多個任務的時間協調方面

●  相互協商方面

●  資料有效性方面

但這裏必須承認未來Java開發環境是如何具體去實現無損耗的開發,還需要時間給與答案,因爲現在所能採用的方法未必是最好的,比如,使用面向文件的 CVS進行協同開發就有需要改進的地方。

總結

羅裏羅唆一大堆,歸納起來不過就是:一個目的、三種手段以及一條規律。

一個目的:十年Java開發環境的演變,其目的就是爲了提高開發效率。

三種手段:

●  提高集成在Java開發環境中開發工具的性能和易用性

●  將Java開發環境儘可能的覆蓋到整個軟件的開發生命週期

●  集成人與人、人與團隊以及團對於團隊進行交流的工具

一條規律:軟件開發環境的發展過程是從CLEs到IDEs再到XDEs最後進入CDEs,這是由Grady Booch總結出來的,套在Java開發環境上也適用。

 

 Java虛擬機的10年

Java虛擬機的起源與構造

當我們說到“Java”這個詞的時候,指的是四個相互關聯的概念:Java語言、Java API、Java Class文件格式、Java虛擬機。整個Java體系是基於Java 虛擬機構造的,正因爲如此,才能實現Java的安全性和網絡移動性。Java並非是第一個採用“虛擬機”概念的體系,但卻是第一個得到廣泛運用的虛擬機平臺。 “虛擬”,是一種隔離物理資源與邏輯資源的手段。Java虛擬機的“虛擬”,則是用來隔離物理機器、底層操作系統與Java語言規範實現的手段。

雖然Java是一種面向對象的語言,我們平時大量使用的,是對象間的多態、組合(Composition)、委派(Delegation),但當我們討論虛擬機的時候,我們看見的基本概念卻是“棧(Stack)”和“堆(Heap)”。根據馮諾依曼的“存儲計算”模型,所有的代碼都保存在代碼空間中,隨着程序計數器指針的變化進行程序的執行、跳轉。Java虛擬機中沒有寄存器的概念,方法調用是採用“棧”進行的,這是一種安全、簡潔的方法。

Java虛擬機通過類裝載器支持對類的隔離,這也是Java實現安全性的基礎。每個類都具有自己的命名空間,在具有不同安全級別的沙箱中運行,因此不會產生低安全級別的代碼來越權訪問高級別代碼的機會。類裝載器的出現是Java虛擬機與大部分用C實現的虛擬機的顯著不同之處。

Java虛擬機的另外一個顯著特點就是實現了自動的垃圾收集。在往常,寫程序的時候要牢記對象之間的關聯,在每個程序塊中假若申請了對象空間,就必須在出口釋放掉,方法調用往往同時也就是對象的邊界。而自動垃圾收集帶給開發者的最大好處,就是可以非常方便地從整體上把系統的對象組織成一張對象圖,只需往這張圖中添加對象,維護對象之間的關聯,卻不需要自己做複雜的清掃工作。正是有了這種思維單純的對象圖的支持,OR Mapping(關係數據庫與對象映射)技術在最近得以大行其道,設計模式也更容易被Java羣體所接受。

虛擬機的優化

1995年第一代的Java出臺之時,其虛擬機執行是依靠“字節碼解釋器(Byte Code Interceptor)”的,也就是說每條指令都由虛擬機來當場解釋執行,這造成速度令人抓狂地緩慢。更有甚者有人開始總結許多的“速度優化經驗”,比如說:“儘量把所有的代碼都放在較大的方法中執行”與“少用接口”等等,這完全與Java語言的設計目的背道而馳,現在看起來是多麼可笑的奇談怪論,當時卻是很多程序員津津樂道的經驗之談。無他,Java本身執行太慢了。Java生命的前十分之三就是如此緩慢地渡過的。

於是,Sun的工程師開始拼命想着提高執行速度。JIT靜態編譯器的出現是在1996年十月,Sun放出了第一個編譯器。JIT編譯器在每段代碼執行前進行編譯,編譯的結果爲本地靜態機器碼,執行速度有了質的提高。Symantec公司當時憑藉其傲人的JIT編譯器,在整個Java界受到熱烈的追捧。在其後的1998年,Java 1.2發佈的時候,附帶了JIT編譯器,從此Java的使用者終於可以拋開上面說的那些奇怪的“速度優化經驗”了。

JIT靜態編譯器雖然可以解決一些問題,但是性能仍然和C/C++有很大的差距。對一段程序而言,一名優秀的程序員是如何來改進運行速度的呢?首先,他不會傻到把所有的代碼都來優化,他會觀察、思考到底哪段代碼對整體性能影響最大?然後集中精力來優化這一段代碼。按照經驗,整個程序 10%-20%的代碼,會佔據 80%-90%的運行時間。用這種方法,在同樣的時間、付出同樣程度的努力後,這名優秀的程序員使整個程序的性能得到了很大程度的優化。HotSpot引擎,就是模仿人工的這種方法進行優化的。在程序運行的開始,Java代碼仍然解釋執行,但HotSpot引擎開始進行採樣(Profiling)。根據採樣的結果,決定某段程序是佔用較多運行時間的,就認爲它是“HotSpot”,它也就是目前程序的瓶頸, 引擎開始啓動一個單獨的線程進行優化。因爲不象原始的 JIT編譯器那樣無差別的編譯所有代碼,HotSpot引擎可以集中精力來對HotSpot代碼進行深度優化,這樣這部分代碼執行起來更加迅捷。之前的靜態編譯器只能按照預定的策略進行編譯優化,而HotSpot引擎的優化是基於採樣的結果的,因此這種方法對所有的應用程序都有效。1999年3月27日,Sun放出了第一個HotSpot引擎。在隨後的2000年5月的JDK 1.3中,包含了HotSopt引擎,這也使1.3成了一個具有里程碑意義的發行版本。到這裏,Java的十年生命,已經過去了一半。

HotSpot代表的是一種動態編譯的技術。對Java這種大量使用委派、組合等面向對象特性的程序來說,動態編譯比起靜態編譯來有顯著的優勢。比如Method Inlining。方法的調用是一個很耗時的操作,假若可以把方法調用直接內嵌到調用者的代碼中,就可以節省大量的時間, 這被稱爲“Method Inlining”。因爲涉及到類的重載,靜態優化很難確切知道哪些屬性、方法被重載,因此很難對method進行合併,只好在方法內部進行靜態編譯,假若每個方法都很小,靜態優化能起到的作用也就比較小。而動態編譯因爲可以完全隨時掌握類的重載情況,就可以把相關的方法合併進行深度優化。現代的Java程序,特別是在設計模式教育得到普及之後,大量使用類的繼承、委派,形成了很多短小的方法,動態編譯的優勢就更加明顯。

自從出現了HotSpot之後,整個Java界爲之一振。

最近的五年,就是繼續優化的五年。繼續進行優化的方法有幾條路,一是研究新的採樣算法。因爲採樣關係到不同的優化策略,會對整體性能有比較大的影響。二是研究深度優化的方法。三是研究垃圾收集的算法。垃圾收集會帶來程序短暫的停頓,這會帶來負面的用戶體驗。於是,如何提高垃圾收集的效率,減少延遲,出現了五花八門的算法,比如漸進式收集、火車算法等。在多處理器的時候,如何利用多處理器進行並行收集也是研究的一個熱點。這方面,BEA的JRocket走在了前面。

現實生活中的虛擬機

最後,讓我們來盤點一下目前市面上可見的各個虛擬機。

首先要提到的,毫無疑問是Sun的虛擬機。作爲大衆心目中的“官方實現”,Sun擁有最大的用戶羣,並且擁有“兼容基準”的地位,其他虛擬機都必須要考慮和Sun虛擬機的兼容性問題。比如 JRocket就會在某些特殊情況下表現出和Sun不同的特性,可能對程序運行有影響。不過Sun也的確沒有讓廣大用戶失望,雖然在早期性能比不上Symantec,後來在1.2 的時候性能又被IBM超越,但Sun一直在努力革新,特別是 1.4.2之後,性能有了長足的進步。雖然JDK 1.5的虛擬機在性能上沒有什麼提高,但是增強了穩定性,據說修改了8000處bug,真是讓人汗流不止。原來我們在1.4.2下面一直在享受這麼多bug啊。

其次是老牌勁旅IBM。IBM的JDK在1.3的時代創下了最好的性能記錄,從此樹立了高端形象。特別是在其WebSphere產品中得到了很好的評價。其JDK也是最早支持64bit的JDK之一。到了現在,IBM JDK在高端仍然是和BEA可以一拼的。

然後是後起之秀,BEA的JRocket。說到BEA突然在JVM領域一夜之間異軍突起,多少讓人有些瞠目,不過它採取的戰略特別簡單:自己沒有,索性花錢買了在此領域深有研究的JRocket,在前面加上BEA的標誌就可以了。JRocket瞄準高端服務器市場,在多處理器環境下有不俗的表現。

除此之外,還有幾個開放源代碼的JVM值得一提。首先就是大名鼎鼎的JikesRVM。說起其大名,大多數人都知道Jikes編譯器是 IBM開發的,效率比同等的javac編譯器高得多,很多開發者都使用Jikes編譯器來取代javac。而JikesRVM則是IBM開源出來的一整套虛擬機技術,包含了JIT,GC的完整實現,在其網站上也有衆多的論文,實在是想要深入研究JVM者的絕佳資源(http://jikesrvm.sourceforge.net)。

Kaffe是一個老牌的JVM,不過現在已經很少聽到了。作者撰寫此文時,www.kaffe.org網站已經沒有響應,也不知道現在的情況如何了。

GNU則有兩個計劃:GCJ和GNU classpath。GNU classpath是一個底層實現,而GCJ是支持java的預編譯器。

結束語

時光流轉,轟轟烈烈的Java虛擬機性能爭論彷彿還在耳邊迴響,現在新的爭論卻已經是“Java的性能是否已經超越C/C++”。Joakim Dahlstedt 是 JRockit 的主要架構設計師之一,他堅持認爲,Java絕不是一種速度慢,效率低的語言,JVM 是一個關鍵的組件,確保了系統的部署與運行和開發一樣快速、輕鬆。特別是在目前開發趨勢是採用大量預製的框架時,動態編譯有可能比C/C++這樣的靜態優化獲得更好的性能。

 

 Java十年有成-談J2ME的發展歷史

Java本來就是爲了嵌入式系統而生

1990年12月,Sun內部由James Gosling、Patrick Naughton以及Mike Sheridan成立了一個叫做Green Team的小組。Green Team小組的主要目標,是要發展一種新架構,而這種架構必須能夠在消費性電子產品作業平臺上運行,現在我們普遍認識的PDA、手機或是信息家電(IA),都是屬於這種架構的目標平臺。接着,Green Team在1992年的9月3號,發表了一款由Java 技術之父 James Gosling所領軍研發,名叫Star Seven(*7)的機器,研發出一部交互式的掌上型家用娛樂裝置,可透過使用動畫觸碰式屏幕的使用者接口來控制其它電子設備。

經過了13年的時間,現在我們檢視J2ME的發展歷史,我們可以發現,雖然在1999年,Java被切割成J2SE、J2ME、J2EE,所以有了J2ME這個名詞的出現。但是Java並非1999年開始纔開始發展嵌入式系統上的應用。其實,Java本來就是爲了嵌入式系統而發展的一種架構。即使目前大家多半將Java的應用聚焦於企業上的J2EE應用。但是嚴格來說,J2ME纔是Java真正“迴歸本心”的領域。

半路殺出的Personal Java

Personal Java是正規Java版本的一個分支,其目的在於能夠讓PDA或高階手機執行Java程序,目前在Windows Mobile或Symbian OS(僅限採用UIQ或Nokia Series 80的行動電話)平臺上都可以開發Personal Java應用程序。

雖然從Java 1.0發表之後,Java就被廣泛地使用在桌上型應用程序以及Applet的開發上,但是,從Java 1.1開始,Java又回到了它一開始的老路-也就是嵌入式系統方面的應用,在當時Sun Microsystems發表了Embedded Java與Personal Java(也有人簡稱爲PJava)這兩項規格。Personal Java的規格是從Java 1.1之中所分支出來,因此Personal Java的規格是根據Java 1.1的規格而制定的,但是並非Java 1.1的全部規格都包含進來,所以Personal Java只能算是Java 1.1平臺的子集合。

Personal Java特別適合用在具有豐富圖形顯示能力的消費性電子產品上面,於是我們可以發現Sun Microsystems網站上對於Personal Java的參考實作是建立在Windows Mobile產品(過去叫做Pocket PC)上頭的。

在1999年,一般PDA或手機的能力,離Personal Java所需要的硬件條件仍有很大的一段差距,因此Personal Java並不是一個很成功的產品。因此Sun Microsystems在此時將Java區分成J2SE、J2EE、J2ME這三塊,希望可以重新塑造整個架構,尤其是J2ME,希望Java可以在嵌入式系統的領域有所發展。

J2ME從何而來?

談到J2ME,大家就會聯想到KVM這個名詞, KVM的設計者Antero Taivalsaari,最早在Sun Microsystems參與Spotless Project,這個項目纔是J2ME的最早起源。由於Antero Taivalsaari曾經在世界知名電信設備製造商工作,所以他有了在手機上開發JVM的概念,後來得到公司支持,就有了各位所知的KVM(K Virtual Machine)。

最早應用KVM的產品,就是一個可以在Palm OS上執行的KJava。KJava並不算是一個正式產品,只能算是一個概念測試產品。開發人員會開發名爲Spotlet的應用程序,透過工具和KVM的輔助,應用程序就可以在PDA上執行。雖然KJava早已成爲過去式,但是仍有電信廠商使用這個名詞,作爲手機上Java平臺的名稱,不過,已經不是真正的KJava了。有了KJava的發展經驗,Sun着手設計J2ME的架構,讓J2ME可以應付未來嵌入式系統的發展。

J2ME整體架構

J2ME最基本的規範制定在JSR-68(Java規格編號第68號),在此規格里頭定義了J2ME的技術架構。根據此規範,J2ME由三種類型的規範堆棧而成,分別是Configuration、Profile以及Optional Packages。這三種類型的規範定義由其它的規範所定義。

在最底層的Configuration規範,定義了硬件所必須具備的能力,比方說硬件至少具備多少ROM、RAM,CPU的頻率最少應該是多少,連接網絡時頻寬至少要多快。Configuration規格之中定義了一組低階的API,這代表Java至少必須提供的低階功能,這組低階的API就是核心類別函數庫的子集合。

在Configuration之上的規範稱爲Profile。Profile針對各種不同機器的特性定義了高階的API,這些高階的API通常都是與其它平臺不相關的擴充類別函數庫。這些高階API決定了該種機器上Java程序的撰寫方法。比方說行動通訊裝置(手機、PDA等)這類型裝置上Java程序的撰寫方式,以及能夠調用的API,都定義在MIDP(Mobile Information Device Profile)之中。

就算是同類型的裝置,有些功能也不一定具備(有些廠商的機器可能有,有些廠商的機器可能沒有,例如手機上的照相機、和絃鈴聲等),這些功能就定義在“廠商選擇性實現套件(Optional Package)”之中,比方說,有的廠商會提供簡單的數據庫管理系統(DBMS)在該裝置上,那麼他們就會實現JDBC Optional Package。不提供數據庫管理系統的廠商就不需要實現JDBC Optional Package。所以稱作廠商選擇性實現套件。

所謂的廠商選擇性實現套件,意思是說,這是一組和其它規格(或API)沒有任何相依性的類別函數庫,如果廠商願意提供這樣的功能給程序設計師(通常是因爲硬件具有充分的能力可以完成規格之中所制定的功能),就會將這組類別函數庫實現出來,程序設計師也可以利用這些功能開發出功能更多的應用程序。

MIDP工業標準

雖然J2ME架構完整,但是目前的發展,除了Personal Profile之外,最大的應用在於架構在CLDC之上的MIDP。目前所有標示可以支持Java的手機,所支持的都是MIDP,幾乎所有的無線通訊廠商皆採用MIDP作爲其開發程序的標準。

在MIDP 1.0的時代,由於規格上本身的功能不足,使得許多廠商不得不加入自己專屬的API,例如震動、背光、聲音等擴充功能(例如:Nokia UI API),以彌補MIDP平臺的不足。

到了MIDP 2.0,增加了許多衆所期盼的功能,但是,即使規格更清楚了,即使很多新功能都已經由JCP制定成標準的Optional Packages,這些問題依然無解。市面上的MIDP平臺仍然處於混亂狀態。開發者必須在執行時期偵測各種專屬API和Optional Package的存在,這會增加多餘的程序代碼。平臺的混亂會造成在某個裝置上可以順利安裝及執行,而到了其它裝置時,有可能無法執行,甚至有可能連安裝都有問題,所以開發者通常要開發好幾種版本的MIDP應用程序供各種廠牌、各種型號的裝置使用。

爲了解決上述問題,進一步提高MIDP應用程序的可移植性,Sun Microsystems以MIDP 2.0規格爲核心,設計了JTWI規格。未來的無線通訊平臺,將不會只有符合MIDP 2.0規格,而是必須要符合JTWI規格。這將是J2ME軟件在可移植性上的一大突破。JTWI(Java Technology for Wireless Industry)是一個統合性的規格,其目的是爲了確保MIDP軟件的可移植性。所以JTWI規格除了規範無線通訊平臺(特別是手機)所必須支持的J2ME標準之外,也對既有規格中模糊不清的地方與以加強。所以新款的手機爲了加強移植性,都會支持JTWI標準。JTWI只是一個統合性的規範,並沒有制定任何新功能,目的只是要統一當前平臺混亂的現象,讓J2ME應用程序更具可移植性。JTWI主要分成幾個部分:

1 .規定平臺必須支持的API。

2 .統一的應用程序執行環境。

3 .既有規格的理清與加強。

在規定平臺必須支持的API的部分,JTWI規定至少必須支持CLDC 1.0、MIDP 2.0以及WMA 1.1:

所以,只要廠商宣稱支持JTWI平臺,那麼代表一定支持CLDC 1.0、MIDP 2.0以及WMA 1.1規格之中的所有功能。另外,廠商可以根據裝置本身的能力,將CLDC 1.0提升成CLDC 1.1,可以加入MMAPI 1.1。因此實際上JTWI平臺會有一下幾種組合方式:

其中,CLDC 1.1 + MIDP 2.0 + WMA 1.1 + MMAPI 1.1是最完整、功能最強平臺。

在統一應用程序執行環境方面,過去讓J2ME應用程序開發者最爲頭大的問題有以下幾項:

● 應用程序的大小可以多大?

● 執行時期的內存有多少可以使用?

● 有多少內存空間可以作爲永久儲存之用?

由於規範中對於J2ME應用程序本身的大小和執行環境沒有很詳細地規範,使得每家廠商都有自己的規範,比方說Nokia限制應用程序最大隻能30 KB,Motorola則可以支持50 KB以上的應用程序。這些規範都嚴重地困擾着開發人員。這些問題在JTWI之中都獲得改善。

JTWI定義了應用程序的標準大小(Standard-size Application)。JTWI規定,可以執行J2ME應用程序的行動通訊裝置,至少可以容許大小爲64 KB以上的程序主體(JAR文件)、5 KB以上的應用程序描述文件(JAD文件)、以及30 KB以上的永續儲存空間、執行時期的內存(Heap Memory)爲256 KB。上述大小隻是底線,廠商可以視裝置的實際能力支持更大的內存空間。標準應用程序大小(Standard-size Application)將成爲一個計算用的單位,舉例來說,廠商會說這個裝置可以安裝20個標準應用程序,開發者所撰寫的程序可以說這個程序需要佔掉3個標準應用程序的空間。

至於對既有規格的理清與加強的部分,我們將在往後章節一一說明。最重要的一點是,JTWI規定,該裝置所支持的任何媒體格式(例如圖片、聲音、影像等)都應該能夠使用HTTP 1.1獲取,也就是說,存取這些媒體時所使用的URL都必須能夠接受http作爲存取的通訊協議。

 

 J2EE五年: 從起源到目的

起點

在“J2EE”這個縮略語被第一次介紹給世人的時刻,也許沒有幾個人可以預料出它在日後的奇特歷程。那是在1999年6月的JavaOne年會上,時任Sun公司Java企業開發部門主管的Mala Chandra興奮地預告了Java世界的這位新成員。那些不熟悉背景的聽衆們,揣摩着她演說中出現的一串串全新術語,表情大概又是驚喜、又是迷惑:一個完整的“多層企業開發架構”、以“容器”和“組件”的形式提供服務、一套“廠商中立的開放技術規範”、對開發者隱藏了不同平臺和“中間件”的技術細節、實現了企業級應用間的“無縫集成”等等。在今天的開發者看來,這些似乎都已經是老生常談,但在當時的場景下,閃動在幻燈片上的每一個口號,都意味着聽衆們事後又要經歷一段困難的學習過程。

幸虧Chandra有一副了不起的口才;這位本科念建築學的印度裔高層主管,談起軟件架構來也有特強的空間想象力。她清晰地說明了設計J2EE架構的兩個初衷:首先,對於廠商,J2EE意味着一套開放標準,加入這個標準,他們的產品就可以運行在各種不同的操作系統和工作環境下,成爲一個成熟的企業運算體系中可替換的部件;其次,對於開發者,J2EE是一套現成的解決方案,採用這個方案,企業應用開發中的很多技術難題(包括跨平臺移植、事務處理、安全性等等)就會迎刃而解,“信息像一條不間斷的河流,經過各種各樣的平臺和設備,從企業應用系統的這一端流向那一端”。

要想理解這段話在當時的實際效應,我們仍然要把時間指針撥回1999年。除了預備迎接千年蟲之外,99年你做了什麼?爲了回答這個犀利的問題,我翻出6年前的工作記錄,發現了自己那時參與的一個項目的規格說明書,它正好能提供一幅“Java企業開發”在1999年的標準照。這是一家日本知名IT廠商的企業信息管理系統,運行在NetScape 3.0 Gold瀏覽器中的Java Applet界面,通過一個專用的中間層系統與Oracle 8數據庫連接。這個中間層已經相當現成、完善,能夠提供遠程對象調用、事務處理等一系列的底層服務;留給我們的任務只是完成服務器端業務對象代碼,以及相應的客戶端交互開發。

除了Applet客戶端有些特別之外,上述系統與今天常見的J2EE架構很接近;尤其是業務對象編碼也由home類、PK(主鍵)類、entity類等部分構成,很多機制都與EJB如出一轍——只不過這些類並沒有繼承javax.ejb包的接口,而是採用了專用的API。它與EJB之間的相似不像是偶然的,設計者肯定參照了Sun在1997年底推出的EJB 1.0技術規範。

換言之,在J2EE誕生伊始的語境中,市面上已經存在着很多程度不一的“準J2EE中間件”了。它們主要用於解決三大類問題:事務處理、分佈式對象管理和Web請求處理。首先,事務處理管理器(Transaction Processing Monitor)一直是高端企業計算領域的熱門產品,著名的應用服務器廠商BEA,正是通過收購事務處理軟件Tuxedo進入中間件市場的。另一方面,從90年代初開始,越來越多的人把“N層分佈式對象架構” 當成傳統的客戶端/服務器架構的替代方案。那時剛剛興起的CORBA技術是推動這一趨勢的重要力量(比如說,前面提到的那個由日本廠商自行開發的專用中間層,就採用了CORBA作爲基礎架構)。最後,Java技術在Web領域中的應用也是當時初露頭角的熱點。1997年6月,Sun在發佈一款“Java Web Server”的同時第一次公佈了Servlet API;沒想到這項技術副產品(連同1998年問世的JSP)正好迎合了廠商的戰略需要。對於上面提到的N層架構來說,HTTP服務是一個非常理想的前端;所以基於Java的Web引擎,也在此時成了企業級Java解決方案的一個必不可少的部分。

Java、Web、事務、分佈式對象,這幾股開發潮流匯合在一處,形成了當時最熱門的產品“應用服務器(Application Server)”或“中間件(Middleware)”。爲了給定語“最熱門”作個註釋,我們可以參照一下BEA公司在1998年收購Web應用服務器廠商Weblogic的成交價:1.92億美元。而這並不是一樁孤立的收購,NetScape和Sun也以相近的價格買下了另外兩家企業Kiva和NetDynamics。而這也正是J2EE規範出臺的背景:幾乎所有要廠商都推出了、或是正在趕製自己的應用服務器產品,但這個“應用服務器”究竟應該是什麼東西,競爭者們又各有表述、莫衷一是。

說到這裏,我們才梳理出了J2EE技術規範的第一個版本在1999年12月問世的實際意義。首先,它爲Java企業開發提供了一幅清晰的全景,各項分支技術在這個領域中的地位和作用得到了客觀、準確的定義。至此大家纔對一個Java企業解決方案的構成要素有了基本共識。其次,它使用“容器”和“組件”等概念描繪了Java企業系統的一般架構,明確地劃分了中間件廠商和應用開發者的職責所在。最後(但絕非最不重要地),J2EE通過一套公開標準規定了應用服務器產品的具體行爲,在執行此標準的廠商產品之間實現了一定程度的可替換性和互操作性。當時的媒體用“B2B開發的默認標準”之類的說法歡呼這項里程碑式的成就——那些撰稿人哪裏知道,在J2EE與那個被稱爲“B2B” 的短命新貴之間,其實並不會有太多故事發生;同樣,他們也不會想到,J2EE要想成爲一種真正成熟的開發範式,前方還有一段遠爲艱辛的旅程。

社區的形成

記得Kruglinski在名著《Inside Visual C++》的某個版本中給出了一個Web瀏覽器的代碼例子;在這一節的開頭他說到:如果你幾年前開發了一個Web瀏覽器,那肯定會給你帶來上千萬的收益;但如果你現在纔想到開發這個東西——那也就是個C++語言的練習罷了。在今天的程序員眼中,應用服務器似乎也成了價格低廉(如果不是全然免費)的日用消費品。所以,想要理解它們在那幾年的大行其道,就非得藉助Kruglinski這樣的智慧不可。在1999年底,市面上可以找到30種以上自稱“Java應用服務器”的產品,可見當時這類軟件是網絡風險投資的寵兒。但是此時出臺的J2EE規範就像是一陣席捲整個產業的勁風,在一夜之間,所有人都有了判斷什麼是一個“應用服務器”的權威途徑。

爲了獲得一張J2EE競技場的入場券,各家廠商面臨兩項考驗:首先,要具有能夠覆蓋J2EE中所有主要技術的產品線。這在當時是一項非常苛刻的要求,在沒有開源產品可供參照的情況下,短時間內推出包括EJB容器、Web引擎和JMS中間件的整體解決方案,這決不是隨便哪家創業公司都能辦到的。完成了若干次成功的併購之後,BEA在這一點上搶佔了先機,完整的產品線使它成了人們心目中的首選J2EE平臺提供商。其次,要讓產品通過Sun的J2EE兼容性測試。要做到這一點同樣不易:就連IBM的WebSphere也一時還沒達到百分之百的EJB支持。到2000年底爲止,共有15家廠商能夠提供完整的J2EE解決方案,其中9家(包括Sun本身)實現了“J2EE兼容”,他們中間包括了日後這個領域的主要競爭者。毫無疑問,這是一次非常殘酷的行業洗牌,但留在場內的廠商也相應地形成了推動J2EE發展的主體力量。

上面說過,在它的孵化階段,Sun的J2EE團隊主管是女強人Mala Chandra,她本人雖不是工程師出身,但對技術有着很強的感知能力和想象力;J2EE一出臺就能夠爲人們提供一幅完整、直觀而不失深邃的圖景,此中當然有Chandra本人的大量貢獻。在她直接領導下工作的幾位工程師,也都是Sun內部非常傑出的人才。無論是制定了JDBC、JMS等規範的Mark Hapner、JavaMail的設計者Bill Shannon,還是EJB的主要設計者Vlada Matena,後來都是業界一言九鼎的技術領袖。這個班子的合作時間並不太長:2000年左右的那個時期正是IT界創業的黃金年月,Chandra很快就和Sun公司Java部門的總裁(也是創造Java的功臣之一)Alan Baratz一起,到一家剛起步的Email中間件公司Zaplet淘金去了;捷克裔的開發天才Matena也離開Sun開辦了自己的公司。留下的兩個人Hapner和Shannon先後擔任了J2EE技術的首席設計師。

多年以後,Hapner回憶起J2EE初創的那個時期,深感如今Sun對Java的左右能力已經大不如前:“現在,Java事實上屬於整個技術社區,它的發展有賴全體參與者的推動。”的確,如今Sun已經不太可能重演當年的開拓性功績,很難再爲一個已經成形的領域重繪版圖。但正如上文所說,即使是在1999年,J2EE設計者們面對的也不是一張從未着墨的白紙。他們的設計始終要以各大廠商的現有產品爲出發點,這也是天才的設計師們做出的設計卻遠非完美的原因之一:與從頭設計一門全新的編程語言不同,J2EE規範從一開始就是各方博弈和妥協的產物。

很容易注意到,J2EE與Java社區的決策機制JCP(Java Community Process)是幾乎同步產生的。J2EE下屬的各種技術規範,包括1.4版之後的J2EE本身,都作爲待決規範議案(JSR,Java Specification Request)被納入了JCP的議程。這些議案的審議過程很少是一帆風順的,幾乎每一個都要經歷18個月以上的拉鋸戰。在多項技術規範的審議過程中,我們都見到了這樣的現象:最初列名審議委員會的某家主要廠商,沒能等到該規範通過就已經被收購或倒閉了。與微軟在.NET平臺上的乾剛獨斷相比,J2EE發展中的這個“牛步”特徵雖說是審慎和民主的表現,但終歸不符合軟件演化應有的速度。

J2EE社區中的另一股重要力量,當然是種類極爲豐富的開放源代碼項目。2002年以來,在J2EE領域的各個層面上,幾乎所有主流產品都有來自開源項目的替代方案,在其中很多位置上,開源產品反而是勝過商業產品的首選。但請別誤解,這裏的“開源”並不意味着完全的自動自發,J2EE世界中的開源項目也與Linux或PHP世界頗爲不同。在很多非常成功的J2EE開源項目背後,我們都能發現商業機構的推動作用:Apache的Jakarta社區是IBM扶植的結果;實現了開源應用服務器JOnAS的ObjectWeb,則是許多法國IT廠商(包括若干政府部門)合資支持的一個聯盟組織……這些有商業背景的開源項目資金雄厚,人員齊整;更重要的是,從投資者到開發者,參與這些項目的很多人都體現了軟件工業中難得的非功利心態,因而最終推出的產品質量甚至高於同類型的商業軟件。在主流廠商之外,它們是支撐J2EE大廈存在的一組基石。

另一方面,不少開發者也間接地通過自己的開源產品獲得了可觀的盈利。這些人大多以免費的開源產品爲依託,以收費方式提供附加的諮詢、方案實施以及技術支持服務。Marc Fleury,開源應用服務器的JBoss創始人,不無矛盾地把自己倡導的這種商業模式稱爲“職業開源開發”。

無論叫它什麼,高端產品的開源化/免費化運動註定要在J2EE產業的發展過程中製造顯著的後果。“JBoss的行徑惡化了J2EE的商業環境,”這是McNealy先生2002年的著名論斷。他的推理過程如下:只有做好商業推廣,J2EE產品才能最終擊潰邪惡的.NET平臺;但開源服務器會降低主流廠商的銷售利潤;銷售利潤越低,用於商業推廣的預算就越少;因此,整個J2EE陣營都將受損於JBoss。

但在狂熱的開源運動支持者看來,以上論證的大前提就是可疑的。“難道只有會做廣告的軟件纔是好軟件?MySQL有過多少廣告預算”爭論的雙方都認爲對手誤解了軟件商業模型的實質。究竟誰才掌握了這裏的真理呢?也許只有根據J2EE的未來——也就是它的目標和終點(Telos)——才能做出最終的裁決。

技術的離心力

考察事物的演化,通常有兩種對立的方法。考古學家(Archaeologist)探究肇始和起源;目的論者(Teleologist)則揭示目的和終點。對於前者,“開端(希臘語Arche)”從根本上決定了此後的發展,參天大樹的繁茂都包含在種子最初的萌芽中;而對於後者,“目的(Telos)”纔是事物的根本和旨歸:誰沒見過樣態完善的樹,誰也就沒法弄懂種子到底是怎麼回事。

在J2EE五年之後,人們只能交替地用這兩種目光審視它的演化歷程。它的起源與它的目的、“它從何處來”與“它往何處去” 的問題緊密地交織在一起,誰拾起了其中的一個,誰也就要連同另一個一起回答。

今天的J2EE在多大程度上符合它的初衷?回答這個問題並不涉及對J2EE技術成敗的評判,而只是要考察一下:它是否還運行在最初開闢的那個空間之中。在事務處理、對象分佈化和Web請求處理這三個方面中,也許J2EE對事務和Web保持了一貫的忠誠。我們記得Fleury喜歡重複的一個信條:“He who owns the transactional Web owns the Web(誰掌握了帶事務處理的Web,誰就掌握了Web)”Web接口是今天大部分J2EE應用暴露的唯一接口;而雖然事務處理的常用方法已經有了很大改變(藉助AOP機制,很多非EJB架構的系統也自如地實現了聲明式的事務處理),但對事務的重視當然仍將是J2EE開發中的要素之一。

換言之,在5年的演化中,J2EE發生的最大變化可能就在於它放棄了對“分佈式對象模型”的強調。EJB2.0引入的本地接口使得Web層與EJB層可以運行在同一個Java虛擬機中,從而使Web容器與EJB容器的物理分離部署變成一種昂貴的冗餘;J2EE 1.4以後版本支持的Web Services兼容性,使得客戶端可以通過粗粒度的Web接口調用遠程服務——這兩次變化事實上都是在論證“分佈式對象架構”的無用性。人們發現,同一系統的各個分層最好採用細粒度接口調用,並且運行在同一個進程中;之所以劃分不同的層次,與其說是爲了實現物理上的可擴展性,不如說是設計美學上的考慮。而對於異質系統之間的調用,則應該儘量選用異步的、粗粒度的服務接口(所以Web Services成爲了非常理想的選擇)。換句話說,傳統上的“分佈式對象架構”,現在看來似乎只適合於銀行遠程支付等要求極爲苛刻的應用場景,而絕不是所有J2EE應用都該考慮的標準方案。

前面描述的離心現象畢竟還遵循了J2EE發展的內在邏輯,說到底,EJB的革新和Web Services的引入更多地是主流廠商倡導的結果。但在近年來,還有一股更強勁的離心潮流在深刻地影響着J2EE的演進,它肇始於上文提到的開源軟件運動。最初它只在Rickard Oberg的動態代理RMI設計與JBoss服務器的微內核架構中顯露過邪惡的一角,但是兩三年來,經過多個項目、各種技術雜誌/論壇/Blog的折射和放大,它已經形成了一個名爲“輕量級容器架構”的完整解決方案,並暴露出完全取代傳統EJB架構的終極野心。按照這一運動信徒們的說法,J2EE的發展史上只出現過一個錯誤——不幸的是,這個錯誤名叫EJB。與EJB提供的重量級架構不同,藉助AOP和IoC機制,輕量級容器能夠最大程度地降低代碼對於專用接口的依賴性,以簡短、輕便、專注、可移植的方式實現業務對象。從“輕量級容器架構”這個詞被髮明出來的那一刻起,人們對J2EE遠景的考慮就發生了根本性的分裂:Sun和大部分主流廠商更多地關注於“Web Services”和“快速開發工具”這些利潤增長點,而一部分離經叛道的獨立專家和開發者則認爲,如果不把輕量級容器納入規劃,J2EE的發展藍圖就註定無足稱道。其實,雙方爭執的關鍵是傳統意義上的“應用服務器”的存亡——如果所有企業級服務都可以通過AOP機制提供給普通Java對象,如果管理業務對象生命週期的可以是一個最微不足道的“微內核”,那麼深盔重鎧的應用服務器還有什麼存在理由?而如果失去了應用服務器的這個產品類型,那些靠這項銷售起家的廠商又將何以自處?

正是在這裏,兩個陣營之間存在着最深刻的利益分歧;而這場爭執的結局當然也將決定J2EE(乃至Java企業開發)的最終走向。或許兩年之後,我們將從紛爭中勝利者一方的角度重述J2EE的整部歷史——或許兩年之後的J2EE本身也將隨着紛爭的解決而成爲歷史。但讓我們換個樂觀的口吻:問世五年,J2EE的歷史仍在持續的創生之中;此時善待這樹種的人,也必在今後的樹蔭下獲得它的祝福。

 

 java十年-十大組織

Sun : 因爲Java而永被榮光

文/孟巖

Sun是1980年代初期由斯坦福大學三位年輕學生創立的公司。與一般人的印象不同,“SUN”的本意並不是企圖剽竊天上那顆溫暖的恆星的威名,而是“斯坦福大學網絡”的意思。Sun在“前Java”時代就因爲SPARC芯片、Solaris操作系統和“網絡就是計算機”的口號而爲人所知。1990年12月,Sun啓動了一個看上去沒什麼意思的嵌入式軟件項目。然而,基於C++的開發很快遇到了麻煩。一個創新型技術公司的特色立刻顯示出來,一羣天纔不是去深入C++,而是另闢蹊徑,發明了Java。這個傳奇故事已經盡人皆知,但是其中所包含的精神卻始終令人望空凝思。

Java的發明,使得Sun真正有機會在軟件的歷史天空中放射出太陽的光芒。Sun發明了Java,並且在長達十年的時間裏始終走在Java大潮的最前端。Sun是Java的老家,是Java慈愛的母親,這一切任何人都改變不了。雖然Sun似乎沒能夠從Java中獲得應有的金錢回報,但這絲毫沒有挫傷Sun對於Java的母愛,還有對於Java大潮的捨我其誰的領導氣概。

所有人都迷戀富有的感覺,但是也遲早會意識到錢不是世上最寶貴的東西。這個世界並不缺少會賺錢的公司,但是能夠靠着創新型技術推動整個世界進步的公司卻是鳳毛麟角。Sun應該感到驕傲,他們將因爲Java而在歷史的天空裏發射出太陽的光芒。

 

IBM : Java經濟的最大受益人

文/惡魔

Sun公司是Java的發明人,但IBM卻是Java最大的受益者。是IBM搶佔了利潤豐厚的應用服務器市場的頭把交椅,是IBM在Java技術上投入最多的金錢,擁有最大的影響力和最好的開發者社區。可以毫不誇張地說,Java使IBM的軟件體系得到復興,在某種意義上,甚至可以說,是Java創造了這種復興。Java之後又來了Linux,這種建造在不屬於自己的平臺上以獲得成功的理念更是變得非常有影響力。正是這種理念鑄就了今天IBM “按需計算,服務爲王”的王者風範。

2004年三月,IBM以Java的解放者的姿態藉機向Sun發難。IBM公司負責新興技術的副總裁史密斯在一封公開信中表示,IBM願意與Sun合作成立一個項目,意在通過開放源代碼開發模式管理Java的開發工作。

牆內開花,牆外香。面對IBM的成功,到底是誰妒嫉呢?或許去程序的社區中逛逛聊聊,明眼人是不難發現事實真相的。也許Sun應該好好向IBM學習經營之道。儘管利潤額不如硬件及服務部門,但IBM軟件部門的利潤率是最高的——高達85%的利潤率足以令人驚歎。在最近的一個季度裏,IBM軟件部的利潤率上升了8%,其中WebSphere產品組的利潤率上升了14%。

正是IBM在開源和Java上的全身心地投入又秉承開放性的原則,今日的Java才能以日進千里的速度將許多競爭對手遠遠拋在後面。Java 10年,IBM功不可沒。

 

BEA : 用AppServer影響Java陣營

文/霍泰穩

十年前誕生的Java並不是一開始 就那麼引人注目的,雖然用Applet也曾爲互聯網絡帶來一抹亮色,但畢竟只是Toy。在企業級應用市場上,Java一直沒有什麼起色,雖然Java的支持者一直在鼓吹它有着大型企業級應用的強悍功能。過高的期望與低能的產品,一時間頗讓人懷疑Java的路是否已經走到了盡頭?可以說是WebLogic Server的出現逐漸打消了人們的顧慮,BEA公司慧眼獨具在2001年收購的這個產品將人們的目光吸引到電信、金融、政府等Java企業級應用方面,WebLogic Server以其優良的性能讓人們看到Java應用廣闊的未來。雖然隨後在Java應用服務器方面出現了像IBM公司的WebSpere、開源軟件JBoss等Java應用服務器,但WebLogic Server幾乎佔領世界前500強所有企業的應用服務器市場地位依然無法撼動。

Java現在已經不單純是一個語言,從另一方面它也代表着開放與創新。很多以Java產品爲基礎的公司或者從事Java開發的程序員骨子裏都有着開放與創新的烙印,BEA公司的發展深深地印證了這一點。與合作伙伴的密切合作向Java社區貢獻產品基礎源代碼、加入權威開源組織參與Java標準的制定等證實着BEA的開放,而其產品從WebLogic Server一種拓展到WebLogic Platform、WebLogic Portal、WebLogic Workshop等其它領域又證實着它的創新能力。

 

Oracle : 早起的鳥兒有蟲吃

文/孟巖

Oracle的老闆拉里?艾利森是有名的混世魔王和花花公子,所以儘管他也是軟件產業成功人士的代表,卻絕不是程序員們心目中的英雄,程序員們畢竟不是央視《對話》節目裏羣衆演員,沒必要爲了節目需要而對權貴財閥們做出一副賤骨頭狀。但是,任何人都不能不欽佩Oracle在技術上的前瞻性和堅決性。Oracle是1996年獲得Java許可證的,緊接着就大膽地將Java作爲戰略性的發展方向而予以全面支持。要知道當時Java的前景並不是十分確定的,而Oracle的堅決投入,使得它在後來的Java世界中搶得一席之地。1998年9月發佈的Oracle 8i爲數據庫用戶提供了全方位的Java支持。Oracle 8i成爲第一個完全整合了本地Java運行時環境的數據庫,開發者用Java就可以編寫Oracle的存儲過程,這意味着可以僅在Oracle數據庫中就完成幾乎全部的應用開發。J2EE興起後,Oracle更是有心進入開發工具市場,因而購買了JBuilder的源碼,並在此基礎上開發出JDeveloper。如今Oracle除了數據庫穩居第一之外,在Java開發工具世界裏也自成一派。這一切不能不歸功於當初的眼光遠大。

Apache : 開源軟件的品牌保證

文/陶文

Java程序員的日常工具箱中,我們可以發現Ant、Tomcat、Log4、Lucene這些鼎鼎大名的開源產品。而它們的共同點在於,都是由Apache Software Foundation社羣中傑出的開發者開發的開源項目。Apache這個名字在Java的世界中實在太出名了,以至於“Apache”這六個字母成爲開源項目品質保證的代名詞。Apache是自由開源的一面旗幟,其Apache License更是成爲商業友好的License的首選,只SourceForge上就有1000多個以Apache License授權的項目,其流行程度可見一斑。

但是,如我們所知,Apache最早聞名IT界是靠高性能的Web服務器,其歷史甚至和Java一樣長。Apache對於Java的偏愛,以及其發展的速度也映射出了Java繁榮的一角。現在去它的主頁上看看,滿目望去全部都是Java的開源項目,早就不光是其C服務器的老本行了。Apache對Java最大的貢獻就是提供了這麼一個精品的開放舞臺,讓傑出的開發者和成熟的開源項目走到一起,共同給Java語言提供一個豐富的工具倉庫。對於一種語言、一個平臺來說,其庫的豐富程度對於開發者來說的重要性再怎麼強調也不爲過。勿庸置疑,Aapache上會出現越來越多的Java開源項目,而我們開發者也將更多地得益於這令人目不暇接的繁榮。

 

TheServerSide : 論壇的專業精神

文/劉天北

成立於2000年5月,TSS最初以一本書而廣爲人知。它的創始人Ed Roman同時也是J2EE名著《Mastering EJB》的作者;Roman運營着一個J2EE諮詢/培訓公司TheMiddlewareCompany(簡稱TMC),TSS當時是TMC的下屬部門;爲了擴大企業的影響,Roman在TSS網站上免費發佈了那本書的電子版。J2EE程序員要吃下這個香餌,就得在論壇中註冊;註冊的同時,多半也會看一眼論壇的內容;一看之下,大部分人都被吸引住,成了社區的忠實成員。

TSS究竟有什麼吸引人的祕訣?首先,它有一支能力過人的運營團隊,除了Roman本人之外,其中還有好幾人都是J2EE領域的頂尖專家;第二,TSS和TMC定期會推出專家研討會/視頻訪談、技術白皮書、評測報告,通讀TSS提供的這些內容,基本上就可以把握技術的當前趨勢。但這還不是全部。最可貴的還是TSS的社區風格:他們深諳技術,但不盛氣凌人;思想敏銳,但不因此缺乏審慎和大局感。其中大多數人都已在自己的開發領域頗有建樹,在TSS上的活動既給他們提供了與同行進行深度交流的機會。一個新成員進入社區,就像參加了一個起點很高的專業俱樂部,這不是一個求解“怎樣設置JAVA_HOME環境變量”之類問題的地方。事實上,在J2EE技術發展的若干轉折點上,TSS都起到了關鍵的推動作用。

幾經易主之後,J2EE諮詢培訓公司TMC在2004年關閉;TSS則被IT媒體集團TechTarget收購。我們期待着它更加繁榮的未來。

JBoss : 職業開源軟件組織

文/劉天北

J2EE的嬰兒期,“應用服務器”原本是“昂貴”的代名詞。但從1999年起,Marc Fleury和Rickard Oberg等人就已經着手改變這種狀況。他們開發的開源EJB容器當時叫做“EJBoss”,在Sun公司的干預下(注意,“EJB”是註冊商標),JBoss獲得了今天的名字。雖然從問世起就一直受到關注,但JBoss第一個達到產品化標準的版本可能是它的2.2版。它的易用讓人一見難忘:除了標準部署描述符,無需編寫專用的xml配置文件。Oberg自豪地說,“我們的架構並不是按照EJB規範指定的路線設計的,因此也沒有走大多數應用服務器走過的彎路。”

Jboss 3.x版本保持了一貫的創新精神,在用戶中間獲得了更廣泛的認可。但是,文檔要收費下載、在郵件列表上提問常常會遭到Fleury等人的斥責。無疑,JBoss的創始者也意識到了自己的幼稚:開源軟件只能靠服務盈利,賣文檔賺錢有限、罵用戶當然更損害企業形象。

雖然以Oberg爲首的許多程序員退出了開發隊伍(其中很多人成了JBoss的死敵),在開源軟件領域也面臨JOnAS Geronimo等新老對手的競爭,但JBoss還是以不斷推出的新版本站穩了腳跟。在技術上,它是策動J2EE演進的重要力量:擬議中的EJB 3也要追隨Jboss 4倡導的開發範式,以至於二者的代碼樣本之間的差別幾乎難以分辨;在商業上,JBoss與Sun公司言和修好,甚至還獲得了數量可觀的風險投資。JBoss已經像擁護者預期的那樣,成爲了應用服務器領域的Linux。

 

Borland : 深度介入Java

文/左輕候

除了Sun以外,也許沒有一家公司 像Borland這樣深層地介入Java。Borland開發了最早的Java編譯器之一,Borland的工程師參與了早期JDK的設計,Borland的JBCL(JavaBeans Component Library) 技術也成爲後來Java Bean規範的基礎。但是Borland對Java世界最大的影響還是JBuilder。

1997年11月,Borland JBuilder 1.0發佈。雖然第一個版本相對於競爭對手並沒有表現出明顯的優勢,但是Borland憑藉深厚的技術實力和正確的市場策略,不斷地超越了對手。JBuilder 3.5成爲業界第一個100%基於Java架構的開發工具,並且市場份額很快超過了50%。在隨後的版本中,JBuilder持續改進對團隊開發、J2EE架構、Mobile技術等方面的支持,最終成爲了Java開發工具市場,特別是大型企業級Java開發市場中的霸主。JBuilder的成功,很大一個原因來自於Borland堅持的平臺中立性,即對不同廠商的解決方案提供一視同仁的支持。

2005年初,隨着Eclipse社區的迅速崛起,Borland進入了Eclipse的董事會,成爲戰略開發者(Strategy Developer) ,並宣佈將推動Borland的其它產品與Eclipse的集成。在隨後發佈的一份文件中,Borland宣稱JBuilder的未來版本將放棄原有的PrimeTime架構,而基於Eclipse架構。這個代號爲“Peloton”的版本預計於2006年下半年發佈。

Borland對Java的另外兩個主要貢獻來自Together和BES(Borland Enterprise Server)。Together是著名的建模工具,能夠與包括JBuilder在內的許多開發工具進行集成,全球市場份額佔有率排名第二。BES AppServer是一種J2EE服務器,在全球市場份額佔有率上次於WebLogic和WebSphere,排名第三。

 

JCP : Java世界的聯合國

文/黃海波

當聯合國正在爲安理會改革問題 吵得如火如荼時,Java世界的“聯合國安理會”已經成功地運作了七個年頭。JCP(Java Community Process)在1998年由Sun發起成立,目標是通過一個開放、合作和鼓勵參與的非盈利組織來發展和推進Java和相關的技術。正是由於JCP計劃的推出可以讓所有對Java感興趣的軟硬件廠商,個人和組織都能參與到技術規範的制定和發展過程中,協調各方的興趣和利益、集思廣益,纔可以讓Java在短短的幾年內異軍突起,成爲可以和微軟開發平臺抗衡的一個主流開發語言。JCP計劃既然是一個組織,自然也有一定的架構。JCP組織架構主要包括PMO(Program Management Office)、JCP成員、EC、EG。事實上,JCP的架構就好像一個Java世界的聯合國。雖然也有不少人批評JCP成爲各派利益的角力場,因而效率低下;但是,它畢竟爲Java的順利發展很好地掌握了方向。

 

微軟與Java : 不得不說的故事

文/孟巖

微軟跟Java不對付,地球人都知 道。跟Sun和解了又怎麼樣?  .NET跟Java就是競爭對手,沒什麼說的。但是有點IT掌故的人都知道,微軟並非一開始就跟Java過不去。當年比爾?蓋茨盛讚Java是“長期以來最好的程序設計語言”,而且很早就購買了Java許可證。但是微軟作爲村裏的老大,看着人家的兒子茁壯呈長,不由得生了私心雜念,搞起了小動作,在Visual J++中加入了一些破壞純潔性的東西。單獨來看,Visual J++是COM時代微軟最棒的開發工具,用WFC寫Windows應用程序和COM組件實在是一種享受。但是放在Java大家庭裏,這個傢伙就顯得多少有點不懷好意。一場官司下來,微軟被逐出Java大家庭,Visual J++無疾而終。以後的事情盡人皆知,.NET出籠,利齒直指Java,幾年撕咬下來,沒佔着便宜也沒吃大虧,如今也算是南北朝對峙,二分天下有其一。設想如果當時微軟能夠摒棄帝國主義心態,正確對待Java,與其他人一起共建美好的Java“共產主義社會”,那麼今天我們的軟件開發世界應該會美好得多。可惜黃粱一夢,終究是螞蟻的喜事。2004年,微軟與Sun實現了和解,但願到Java 20週年的時候,我們能更正面地描述微軟對Java發揮的作用。

 

 

 java十年-十大產品

Sun JDK :Java的基石

文/莫映

衆所周知,流傳於市的JDK不單Sun一家,比如IBM的JDK、BEA的JRocket、GNU的GCJ,以及如Kaffe這樣的開源實現,不一而足。但是,根正苗紅的Sun官方JDK一直以來都是備受矚目的主流,它對Java社區的影響也是舉足輕重。

1996年1月,Sun在成立了JavaSoft部門之後,推出了JDK 1.0,這是Sun JDK(Java Development Kit)的首個正式版本;當年12月,JDK1.1出爐。該版除了對前序版本部分特性做了改進以外,重寫了AWT,採用了新的事件模型。1998年12月,JDK 1.2正式發佈。此時的類庫日臻完善,API已從當初的200個類發展到了1600個類。在1.2版本中引入了用100%純Java代碼寫就的Swing,同時,Sun將Java更名爲Java 2。

1999年,Java 技術形成了J2SE、J2EE和J2ME三大格局。Sun向世人公佈了Java HotSpot性能引擎技術的研究成果。HotSpot旨在進一步改善JVM性能,提高Java ByteCode的產生品質,加快Java應用程序的執行速度。J2SE 1.3發佈於2000年;2002年2月間,J2SE 1.4問世,這是有JCP參與以來首個J2SE的發行版本。2004年9月30日,代號爲“Tiger”的J2SE 5.0終於出籠了,這次發佈被譽爲Java平臺歷來發佈中特性變動最大的一次。包括泛型在內的若干重大語法改進、元數據支持,包括多線程、JDBC在內的多項類庫改進,都令廣大Java程序員激動不已。自此,Sun的官方JDK(J2SE Development Kit)已經步入了一個新的高度。

 

Eclipse :以架構贏天下

文/惡魔

IBM是在2001年以4000萬美元種子基金成立Eclipse聯盟,並且捐贈了不少程序代碼。如今,該組織有91個會員,包含許多全球最大的軟件商。根據Evans Data公司的資料,Eclipse是目前最受歡迎的Java開發工具。

Java廠商若要共同對抗微軟,彼此之間就要有共同的開發工具才行。

在Eclipse平臺上,程序員可使用好幾種不同的語言。在前端方面,用戶可整合多種工具來撰寫Plug-in程序或Unit Test。Eclipse最大的特色就在於其完全開放的體系結構,這代表任何人都可下載並修改程序代碼,給Eclipse寫插件,讓它做任何你能想到的事情,即所謂“Design for everything but nothing in particular”。

Eclipse基金會的架構比較特別,反映出企業現今對於開放原始碼計劃也越來越積極主動。Eclipse不像一般開放源碼軟件容許個人的捐獻程序,該基金會是由廠商主導。不論是董事會成員或者是程序贊助者幾乎都來自於獨立軟件開發商(ISVs)的員工。

Eclipse首席執行官Mike Milinkovich說,這種廠商會員制是特意設計的;他說Eclispe軟件開發快速就是因爲會員制的關係,同時又加上開放源碼開發模式的臨門一腳。這與一般透過標準組織的做法全然不同。 這其實正好驗證了一句老話:“開放即標準”。

JUnit/Ant : 讓Java自動化的絕代雙驕

文/劉鐵鋒

在Java程序員必備的工具中,共 同擁有且交口稱讚的恐怕就非JUnit、Ant莫屬了。一個是單元測試的神兵利器,一個是編譯部署的不二之選,它們讓Java的開發更簡單。

JUnit由XP和TDD的創始人、軟件大師Kent Back以及Eclipse架構師之一、設計模式之父Erich Gamma共同打造。名家的手筆和理念使得JUnit簡單而強大,它將Java程序員代入了測試驅動開發的時代。JUnit連任了2001、2002年“Java World編輯選擇獎”以及2003年“Java World最佳測試工具”和2003年“Java Pro最佳Java測試工具”等衆多獎項,深受Java程序員好評。

Ant是開源項目的典範,它讓IDE的功能更加強大,從Sun的NetBeans到JBuilder,主流的IDE中處處都有它的身影。“Another Neat Tool”原是它的本名,但這已經漸漸不爲人知。它徹底地讓部署自動化,而程序員需要做的僅僅是幾條簡單的配置命令。和JUnit一樣,Ant也榮獲了衆多的殊榮:2003年JavaWorld“最有用的Java社區開發的技術編輯選擇獎”, 2003年Java Pro“最有價值的Java部署技術讀者選擇獎”,2003年“JDJ編輯選擇獎”,也讓Ant受到的多方的認可。

Ant對JUnit的全面集成,則使得一切都變得更加完美。只需簡單地配置,從自動測試到報告生成,從編譯到打包部署均可自動完成。強大的功能,簡單的配置,讓Java程序員高枕無憂。實可謂讓Java自動化的絕代雙驕。

Websphere : 活吞市場的大鯨

文/jini

1999年, IBM與Novell簽訂合作協議,成功地提供電子商務的解決方案給予原先使用NetWare的用戶。同年更是推出了WebSphere Application Server 3.0,並且推出WebSphere Studio與VisualAge for Java讓工程師可以快速開發相關的程序。2001年,IBM更是宣佈將應用服務器、開發工具整合在一起,與DB2、 Tivoli及Lotus結合成爲一套共通解決方案,如今、IBM更是併入了Rational Rose ( UML tools )讓開發流程更是完整化。

Sun在Web Services的策略方面遠遠落後於微軟與IBM, 當他們手拉手在研訂Web Services規範, 加上IBM買硬件送軟件或是買WebSphere送DB2的策略讓企業大佬們紛紛轉向IBM的陣營, Sun才驚覺大勢已去。WebSphere複雜的安裝,深奧的設定,難以理解的出錯訊息不斷地挑戰開發者的耐心與毅力。

IBM如今已經不是將WebSphere定義爲單一產品,它已經是一個平臺的代名詞。它裏面的產品目前包含了應用服務器、商業整合、電子商務、 數據訊息管理、網絡串流、軟件開發流程、系統管理、無線語音等等。非常多樣化,也讓企業界願意相信WebSphere可以帶給他們一套完整的解決方案。同時, IBM也在推廣SOA的概念, 簡單來說, 利用Web Service的耦合性與工作流程的整合, 爲企業內部打造以服務爲導向的架構。

IBM捐獻出Eclipse帶給Java開發人員對IDE的重新掌握。未來是否會捐獻出WebSphere的哪一個部分成爲OpenSources, 或許, 又是改寫Java世界的時刻了。

 

WebLogic : 技術人的最愛

文/jini

1995年, BEA成立了, 初期以Tuxedo數據轉換的產品爲基礎, 成長之迅速是歷年來最強的企業。 1998年, BEA推出以Java爲基礎的網絡解決方案, 提供了完整的中間層架構, 更同時支持EJB 1.0 及微軟的COM組件, 方便的管理接口擄掠了工程師的心。 在IBM和Oracle尚未準備好迎擊的時候, BEA已經席捲企業應用平臺的市場。 WebLogic無論在市場領先度與技術領導性與策略遠觀性都優於當年的所有應用服務器廠商。

如今WebLogic不僅僅是應用平臺服務器的名稱, 而是BEA對於整個企業解決方案的總稱, 無論是WebLogic Portal或是WebLogic Integration配合着Workshop開發環境, 來自微軟的UI開發團隊讓Workshop幾乎達到所見即所得。 接着, 在下一個版本之中, BEA的BeeHive開放源代碼計劃將釋出中間層控件的開發模塊, 並且與Eclipse合作共同打造新一代的開發環境。 如此強而有力的技術支持, 更是讓顧客願意使用WebLogic平臺的最大原因。

代號爲“Diablo”的 WebLogic Server 9.0小惡魔已經出現了, 目前雖然僅僅是BETA版, 以Portlet 方式打造的管理接口與完整且美妙的WebServices支持, 實在很難找到可以挑剔的地方, 雖然去年被IBM的技術性推銷超越了市場佔有率, 不過接下來SOA的平臺競爭現在纔開始, BEA的LOGO也加入“Think liquid”並且推出新的AquaLogic平臺做爲數據服務平臺, 可見, Java的應用服務器的戰爭, 還會繼續進行着。

 

JBuilder : Java開發工具的王者

文/劉鐵鋒

Java的開發工具中,最出名的莫過於Borland公司的JBuilder了。對於一些沒有弄清楚開發工具與JDK的區別的Java入門者來說,JBuilder就如同Visual C++之於C++,以爲JBuilder就是Java的全部。比起捆綁在服務器上銷售的JDeveloper,JBuilder應該是唯一的僅靠自身的實力而佔領了大部分市場的Java商用開發工具了。而JBuilder作爲Java 開發工具的王者,其奪冠之路並非一帆風順。直到Java的天才Blake Stone成爲JBuilder的Architect之後,JBuilder 2.0以及3.0才逐漸推出。2000年3月14日,JBuilder 3.5的推出別具意義,它成爲了業界第一個用純Java打造的開發工具,也風靡了整個Java開發工具市場。在同年11月份推出的JBuilder 4.0乘勝追擊,衝破了50%的市場佔有率,成爲了真正Java開發工具的王者。

Borland以每半年左右推出一個新版本的速度,讓衆多的對手倒在了沙場。而Microsoft因爲與Sun的官司,也使得一個強大的對手退出了戰爭。2001年,加入了對企業協作支持的JBuilder 5以及強化了團隊開發工具的JBuilder 6打敗了最後一個對手Visual Age For Java。2002年JBuilder 7推出之後,再也沒有其他廠商與JBuilder競爭。

孤獨的王者並沒有停下腳步,在2003年到2005年間,JBuilder也仍然延續了其半年一個版本的速度,推出了8、9、10、2005四個版本。強大的功能以及持續的改進,也讓Java程序員多了一分對能夠在開發工具市場上與Microsoft血拼十數年的Borland的敬仰。

 

Oracle : Java人永遠的情結

文/熊節

在林林總總的數據庫之中,有一種尤其令人又愛又恨、印象深刻,那就是關係型數據庫市場的“大佬”——Oracle。

從公司的角度,Oracle和Sun有着諸多相似之處,例如:兩家公司都擁有一位個性鮮明的CEO。早在Java誕生之初的1995年,Oracle就緊隨NetScape從而第二個獲得了Java許可證。從那以後,Oracle對Java的鼎力支持是Java能夠在企業應用領域大獲成功的重要原因之一。

所有J2EE程序員都知道,Oracle的JDBC驅動雖然與Oracle數據庫配合良好,但在不少地方使用了專有特性。其中最爲著名的就是“CLOB/BLOB問題”,諸如此類的問題給開發者帶來了很多麻煩。爲了同時兼顧不同的數據庫,他們不得不經常把自己的一個DAO(數據訪問對象)寫成兩份版本:針對Oracle的版本和針對其他數據庫的版本。有不少人爲了開發便利,捨棄了數據庫之間的可移植性,將自己的產品綁定在Oracle的專有特性上。

Oracle提供的Java開發工具也與此大同小異。不管是數據庫內置的Java支持還是JDeveloper IDE, Oracle的Java工具都和Oracle數據庫有着千絲萬縷的聯繫。看起來,只要Oracle還是數據庫市場上的“頭牌”,瞭解、學習Oracle的專有特性,周旋於Oracle特有的問題和解決方案之中,就將仍舊是J2EE程序員在數據庫基礎和SQL之外的必修功課。對Oracle的愛與恨,也將仍舊是Java人心頭一個難解的情結。

 

Struts、Hibernate : 讓官方框架相形失色的產品

文/劉鐵鋒

好的框架能夠讓項目的開發和維護更加便捷和順利。相比Sun官方標準的遲鈍以及固執,開源框架也更得到Java程序員的共鳴。Struts以及Hibernate就是這樣一類產品,它們簡單、優雅,更讓官方的產品相形失色。

談起Struts,不可避免地就要提及MVC(Model-View-Controller)的理念。而準確地講,MVC的提出卻最早源於JSP的標準。在1998年10月7號,Sun發佈的JSP的0.92的規範中提出的Model 2就是MVC的原型。在1999年12月Java World的大會中,Gavind Seshadri的文章最早闡述了Model 2就是一種MVC的架構,同時也提及了MVC架構是一種最好的開發方法。2000年3月,由Craig McClanahan發佈的Struts成爲了最早支持MVC的框架。Struts在設計上雖然存在一些詬病,但是不可否認的是,它使得Java Web應用的開發更加簡潔和清晰,也讓更多的程序員愛上了Java,並開始遺忘官方的JSP。時至今日,比起如WebWork、Tapestry以及Sun官方的JSF,Struts或多或少存在些不足,但是衆多成功項目的實施,仍然使其牢牢佔據的Java Web應用框架的首位。

Hibernate則在某種程度上改變了人們對構建J2EE的思路。相比其EJB的Entity Bean的映射技術,Hibernate則顯得更加簡潔和強大。五分鐘就能把Hibernate跑起來,讓更多的Java程序員享受到了開發的樂趣。第15屆Jolt大獎中,最優秀數據庫、框架以及組件的獎項中,Hibernate當仁不讓獲得頭籌;不僅如此, Hibernate甚至還影響了官方的標準。在衆多Java程序員翹首以待的EJB 3.0的規範中,Hibernate得到了支持。

Java開源的繁榮不僅讓衆多Java的開發者享受到了更多的便利,甚至影響了官方的標準。恐怕這也是作爲Java人獨有的樂趣之一吧。

 

PetStore : J2EE人的必修課

文/陶文

很少有一個例子項目如PetStore這 般廣爲人知,而這很大程度上要歸功於Sun很“英明”地把PetStore做成一個只展示架構而在性能調優上留下了大大餘地的例子。圍繞着性能話題,產生了頗爲有趣的廠商之間以及平臺之間的Pet Wars。除去這些關於性能的流言蜚語乃至中傷,PetStore在展示J2EE1.3平臺的架構、演示什麼叫分層方面還是有着很大的功勞的。而且PetStore在架構方面的豐富性使得其成爲J2EE的那些輕量級小兄弟們展示自身的一個必選科目。

不談那些圍繞PetStore的口水,那些數不盡的盜版,PetStore給開發新手帶來的最重大的影響,我想應該是架構的觀念而不是性能,也不是業務。做爲一種技術的Demo,這無可非議。但是如果你是一個新手,跟着PetStore亦步亦趨地學習J2EE開發,難免會陷入過度設計、華而不實之類的困境。圍繞着.NET的PetStore的克隆PetShop展開的架構與性能的大討論,是不是也在促使我們學習新技術時應該以解決問題爲導向呢?特別是當你想把一個如PetStore這般的Sample Project的技術照搬到你的現實世界的Real Project來時。

 

 java十年-十大人物

James Gosling : Java之父

文/陶文

作爲Java之父,James Gosling的名字可謂是耳熟能詳。當人們評論一種編程語言時,總喜歡捎帶着把下蛋的母雞一起帶上。Java做爲中國的編程語言學習者餐桌上有限的那麼幾樣餐點中的流行款式,自然是讓James Gosling風光不已。雖然James Gosling現在已經不是領導Java發展潮流的領軍人物了,做爲Sun的開發者產品組的CTO,怎麼算來也是身居高位了,俗事纏身吧,但是這並不妨礙其對於Java一如既往的愛護,表達着各式各樣鮮明的觀點,引發一場又一場的爭論。

James Gosling是很愛Java的——是啊,哪有當父母的不愛自己的孩子的呢。James Gosling也是很愛Sun的——是啊,哪有當領導的不愛自己的公司的呢。於是我們在批評.NET的安全性的隊伍前頭,在褒揚Java性能的隊伍前頭,在抨擊SWT開倒車的隊伍前頭,在給NetBeans大唱讚歌的隊伍前頭,我們都看到了James Gosling的身影。無論對錯、偏見或者固執,至少說明了Gosling的鮮明個性絲毫沒有受到年齡的影響。也許也只有這種天才而偏執的人物才能創造出Java這般偉大的語言來吧。

 

Bill Joy : 軟件業的愛迪生

文/徐昊

Joy生於1954年,1982年與Vinod Khosla, Scott McNealy和Andy Bechtolsheim一起創建了Sun Microsystems,並從那時起擔任首席科學家,直到2003年離開。他是一位令人崇敬的軟件天才,他在軟件和硬件的歷史上留下了無數令人仰止的傳奇。

在上個世紀80年代早期,DARPA與BBN達成協議,準備將Vinton Cerf和Bob Kahn設計的TCP/IP協議添加到Berkeley UNIX中。Bill Joy被委派來完成這項任務,然而他卻拒絕將BBN的TCP/IP協議棧添加到BSD中,因爲在他的眼中BBN的TCP/IP實現還遠不夠好,於是他就寫了一個高性能的TCP/IP協議棧。John Gage回憶道,“BBN和DARPA簽署了鉅額合同來實現TCP/IP協議,然而他們的員工所編寫的代碼遠沒有一個研究生所做的好。於是他們邀請Bill Joy參加他們的一個會議,這位研究生穿着一件T-Shirt就出現了,他們詢問他,‘你是如何做到的呢?’Bill回答說,‘這是非常簡單的一件事,你讀一下協議然後就可以編碼了’”。除了TCP/IP協議,基於分頁的虛擬內存系統最早也是由Bill Joy添加到Berkeley UNIX內核當中的。同時他還是vi、csh、早期Pascal編譯器的作者。

關於Bill Joy驚人的軟件才能流傳最廣的一個傳奇是,據說他在上研究生的時候,想看看自己能不能寫一個操作系統出來,於是就在三天裏寫了一個非常簡陋,但是可以使用的Unix系統, 傳說就是BSD的前身。雖然如此誇張的才情令人難以置信,但是考慮到主角是Bill Joy,還是有一定的可信度的。Bill Joy碩士畢業之後,決定到工業界發展,於是就到了當時只有一間辦公室的Sun, 他作爲主要設計者參與了SPARC微處理器的設計,負責設計最爲關鍵的一部分電路。這樣兼精軟硬件的天才實在是讓人不得不佩服啊。1995年,Sun發佈了轟動世界的Java語言。當然,Bill Joy對Java也作出了不少的貢獻,首先是JINI——一種針對分佈式服務的基礎連接技術。任何可以內嵌JVM的電子設備都可以通過JINI相互連接;JXTA是基於Java的P2P協議,允許互聯網上的軟件進行點對點交流和協作。

這個其貌不揚的瘦高個,有着凌亂的亞麻色頭髮,被《財富》雜誌譽爲“網絡時代的愛迪生”的技術狂人,在短短的二十年間,創造了無數令人心動的軟件。在MIT的BBS上曾有一個帖子,說微軟電話面試有一道題,問“Who do you think is the best coder, and why?”雖然回覆的帖子中大家都聲明列舉的best coder排名不分先後,然而大多數人仍把Bill Joy列在第一位,或許可以從一個側面驗證Bill Joy在廣大Programmer心目中的地位吧。

Joshua Bloch :  Java 2 元勳

文/莫映

早在1996年,適逢Java剛剛嶄露頭角,年內好事連連。先是1月份發佈JDK 1.0,然後是5月底在舊金山召開首屆JavaOne大會,年末又是JDK 1.1緊跟其後。正是在Java技術如火如荼、大展拳腳的背景之下,Joshua Bloch來到了Sun,開始了他帶領Java社區步入“迦南美地”的漫長曆程。

很快,他被從安全組調入核心平臺組,從事底層API設計。至此以後,每逢JDK的重大版本發佈,總能在其中見到Joshua的“妙筆”。JDK 1.1中的java.math、1.4中的assertions,還有大家所熟識的Collections Framework皆是Joshua一手打造。其中的Collections Framework還獲得了當年的Jolt大獎。到了J2SE 5.0研發階段,身爲平臺組構架師的Joshua接掌了Tiger大旗,其核心地位已然無人可以替代。作爲Tiger的代言人和領路人,沒有誰比Joshua更清楚Tiger。相信大家一定還記得Joshua當年仿效英國詩人William Blake所做的詠Tiger詩八首,優雅的筆調,透出大師深厚底蘊的同時,也道出了Tiger的幾大重要特性,這些特性是自JDK 1.1引入Inner Class以來,Java最大的語法改進。

Java風雨十年,從JDK 1.1到J2SE 5.0,Joshua實在功不可沒。難怪有人戲言,假如將James Gosling比作Java之父,那麼Joshua就是一手將Java “哺育”成人的Java之母。Joshua對Java的貢獻還不止於JDK,提起他的大作《Effective Java》(Addison Wesley, 2001),相信Java粉絲們一定耳熟能詳。該書榮膺2002年度Jolt大獎,且備受James Gosling推崇。書中57條頗具實用價值的經驗規則,來自Joshua多年來在JDK開發工作中,尤其是Collections Framework設計中的實踐心得,各個有理有據,剖析深入,也足見其深厚功力。該書對Java社羣的影響,猶如C++社羣中的《Effective C++》。Joshua對JCP的貢獻也不小。他是JSR201和JSR175的領導者,前者包含了Tiger四大語言特性,後者則爲Java提供了元數據支持。此外,他還是JSR166的發起人之一(該JSR由Doug Lea領導),並且是許多其他JSR的參與者。Joshua目前是JCP爲數不多的幾個執行委員會成員之一。

Joshua Bloch給人的印象是謙遜平和,行事低調而不喜拋頭露面,一個典型的技術人員和實幹家。不過即便如此,也絲毫不會減弱他對Java技術的卓越貢獻和對Java社區的絕對影響力。有人說,如果他能更彰顯一些,就很有可能成爲Java開發者中的領軍人物,就有如Don Box之於微軟社羣。

2004年7月初,就在Tiger發佈在即之時,就在Jusha Bloch剛剛榮獲Sun“傑出工程師(Distinguished Engineer)”的稱號之時,他突然離開Sun而去了正值發展態勢迅猛的Google。當他離開Sun的消息在TSS發佈之後,衆多擁躉表達了懷念與不捨之情。一年過去了,我們還沒有獲知Joshua的任何近聞,似乎又是他行事低調的一貫作風所致,不知他在Google狀況如何。希望Joshua依然能繼續“摩西未盡的事業”,以他的影響力推動Java社羣繼續前行。據稱,《Effective Java》的下一版會加入Java 5.0的部分,讓我們翹首以待吧。

Bruce Eckel : 功勳卓著的機會主義分子

文/孟巖

Bruce Eckel原本是一位普通的彙編程序員。不知道是什麼因緣際會,他轉行去寫計算機技術圖書,卻在此大紅大紫。他成功的祕訣不外乎兩點:超人的表達能力和捕捉機會的能力。他最早的一本書是1990年代初期的《C++ Inside & Out》,隨後,在1995年他寫出了改變自己命運的《Thinking in C++》。如果說這本書充分表現了他作爲優秀技術作家的一面,那麼隨後他寫作《Thinking in Java》並因此步入頂級技術作家行列,則體現了他作爲優秀的機會主義分子善於捕捉機會的另一面。寫作中擅長舉淺顯直接的小例子來說明問題,語言生動,娓娓道來,特別適合於缺乏實踐經驗的初學者。因此《Thinking in Java》儼然成爲天字第一號的Java教科書,對Java的普及與發展發揮着不可忽略的作用。不過公允地說,Bruce Eckel的書欠深刻。比如在“Thinking in…”系列中對設計模式的解說就有失大師水準。這一方面是因爲書的定位非常清晰,另一方面也是因爲Bruce太過分心趕潮流,未能深入之故。TIJ之後,他預言Python將火,就匆匆跑去寫了半本《Thinking in Python》。後來Python並未如期而旺,於是他也就把書稿撂在那裏不過問了,機會主義的一面暴露無遺。我們也可以善意的猜測一下,他的下一個投機對象會是什麼呢?Ruby?.NET?MDA?總之,是什麼我都不奇怪。

Rickard Oberg :J2EE奇才

文/熊節

Oberg的作品很多,流行的代碼生成工具XDoclet和MVC框架WebWork都出自他的手筆。這兩個框架有一個共同的特點,即它們的功能雖然簡單,但設計都非常優雅靈活,能夠很方便地擴展新功能甚至移植到新環境下使用。優雅的設計源自Oberg的過人才華,簡單的功能則折射出他玩世不恭的人生態度。正是這兩種特質的融合,才造就了這個不世出的奇才。

1999年,JDK 1.3發佈,其中帶來了一個重要的新特性:動態代理(Dynamic Proxy)。當所有人都還在對這項新技術的用途感到迷惑時,Oberg發現用它便可以輕鬆攻克EJB容器實現中的一些難關。這一發現的產物就是一本《Mastering RMI》,以及大名鼎鼎的JBoss應用服務器。但Oberg很快又讓世人見識了他的玩世不恭。由於和總經理Marc Fleury在經營理念上不合,Oberg抱怨“法國的天空總讓我感到壓抑”,甩手離開了自己一手打造的JBoss。此後的幾年裏,他和老友Hani Suleiman不斷地對JBoss的“專業開源”模式和Marc Fleury的商人味道冷嘲熱諷,讓衆人爲他的孩子氣扼腕嘆息。

2002年10月,微軟推出Petstore示例應用的.NET版本,並宣稱其性能比Java Petstore高出數倍。正是Oberg深入分析這個示例應用的源代碼,在第一時間指出它大量運用了SQL Server專有的特性,性能對比根本不具參考價值。後來Oberg又先後關注了AOP和IoC容器,兩者都成爲了J2EE架構的新寵。

 

Doug Lea : 世界上對Java影響力最大的個人

文/KIT

如果IT的歷史,是以人爲主體串接起來的話,那麼肯定少不了Doug Lea。這個鼻樑掛着眼鏡,留着德王威廉二世的鬍子,臉上永遠掛着謙遜靦腆笑容,服務於紐約州立大學Oswego分校計算器科學系的老大爺。

說他是這個世界上對Java影響力最大的個人,一點也不爲過。因爲兩次Java歷史上的大變革,他都間接或直接的扮演了舉足輕重的腳色。一次是由JDK 1.1到JDK 1.2,JDK1.2很重要的一項新創舉就是Collections,其Collection的概念可以說承襲自Doug Lea於1995年發佈的第一個被廣泛應用的collections;一次是2004年所推出的Tiger。Tiger廣納了15項JSRs(Java Specification Requests)的語法及標準,其中一項便是JSR-166。JSR-166是來自於Doug編寫的util.concurrent包。

值得一提的是: Doug Lea也是JCP (Java小區項目)中的一員。

Doug是一個無私的人,他深知分享知識和分享蘋果是不一樣的,蘋果會越分越少,而自己的知識並不會因爲給了別人就減少了,知識的分享更能激盪出不一樣的火花。《Effective JAVA》這本Java經典之作的作者Joshua Blosh便在書中特別感謝Doug是此書中許多構想的共鳴板,感謝Doug大方分享豐富而又寶貴的知識。這位併發編程的大師級人物的下一步,將會帶給Java怎樣的衝擊,不禁令人屏息以待。

Scott McNealy :SUN十年來的掌舵者

文/KIT

McNealy,Sun的CEO、總裁兼董事長。他曾經狂傲的說:“摧毀微軟是我們每個人的任務。”這位英勇的硅谷英雄,似乎帶頭起義,試圖組織一個反微軟陣線聯盟,以對抗微軟這股龐大的托拉斯惡勢力。他時常口出驚人之語,在公開場合大肆的批評微軟,並曾經說微軟的.NET是.NOT。

Scott McNealy先後畢業於哈佛大學及史丹佛大學,分別持有經濟學學士學位及企管碩士。1982年MBA畢業的他和三個同學共同合夥創建了Sun,並於1984年成爲Sun的執行官。“要麼吞了別人,不然就被別人吞了”是Scott McNealy的名言錄之一。他擅長以信念帶動員工,鼓舞士氣。極富自信的他,對於認定的事,總是堅持自己的想法,因此有人形容他是一個剛愎自用的決策者。

身爲Sun這艘船的掌舵者,Scott McNealy能夠看多遠,Sun就能走多遠。Scott McNealy認爲將來軟件界是一個只有服務,沒有產品的世代。他希望打造出Sun不是一個純靠硬件賺錢的公司。從Open Source到Open Solaris,Sun希望可以成爲提供整合性解決方案的服務廠商。Solaris 10 + UltraSPARC是否可以像Scott McNealy希望的是下一匹世紀黑馬呢?Sun是否能以股價來證明華爾街分析師及普羅大衆的誹短流長?Scott McNealy是否能帶領着Sun成爲繼微軟之後的下一個巨人,一場場IT界的爭霸戰值得我們拭目以待。

Rod Johnson : 用一本書改變了Java世界的人

文/ 劉鐵鋒

Rod在悉尼大學不僅獲得了計算機學位,同時還獲得了音樂學位。更令人吃驚的是在回到軟件開發領域之前,他還獲得了音樂學的博士學位。有着相當豐富的C/C++技術背景的Rod早在1996年就開始了對Java服務器端技術的研究。他是一個在保險、電子商務和金融行業有着豐富經驗的技術顧問,同時也是JSR-154(Servlet 2.4)和JDO 2.0的規範專家、JCP的積極成員。

真正引起了人們的注意的,是在2002年Rod Johnson根據多年經驗撰寫的《Expert One-on-One J2EE Design and Development》。其中對正統J2EE架構的臃腫、低效的質疑,引發了人們對正統J2EE的反思。這本書也體現了Rod Johnson對技術的態度,技術的選擇應該基於實證或是自身的經驗,而不是任何形式的偶像崇拜或者門戶之見。正是這本書真正地改變了Java世界。基於這本書的代碼,Rod Johnson創建了輕量級的容器Spring。Spring的出現,使得正統J2EE架構一統天下的局面被打破。基於Struts+Hibernate+Spring的J2EE架構也逐漸得到人們的認可,甚至在大型的項目架構中也逐漸開始應用。

Rod Johnson的新作《Expert One-on-one J2EE Development without JEB》則更讓人吃驚,單單“Without EJB”一詞就會讓大多數J2EE架構師大跌眼鏡了。不過Rod Johnson可能僅僅是想通過“Without EJB”一詞表明應該放開門戶之見。這也是Rod Johnson一貫的作風,。也許正是這種思想,促使得Rod Johnson創建了Spring,真正改變了Java世界。

 

Alan Kay :Java的精神先鋒

文/徐昊

Sun的官方Java教材中有一句話,說Java是“C++的語法與Smalltalk語義的結合”。而Smalltalk的創造者就是Alan Kay。

Alan Kay於1970年加入Xerox公司的Palo Alto研究中心。早在70年代初期,Alan Kay等人開發了世界上第二個面嚮對象語言Smalltalk,因此,Alan Kay被譽爲Smalltalk之父。2003年,Alan Key因爲在面向對象程序設計上的傑出貢獻,獲得了有計算機界的諾貝爾獎之稱的ACM Turing Award。

Alan Kay成名於Smapltalk和OOP,而Java雖然在語言上類似於C,但是在語義上非常接近Smalltalk,很多Java中的設計思想在Alan Kay的文獻中找到根源,也有些人將Alan Kay尊爲Java思想的先驅。不過遺憾的是似乎Alan Kay老先生對Java並不買賬,反倒攻擊說Java是存在致命缺陷的編程語言,Java的成功不是由於Java本身的內在價值,而是其商業化的成功。Alan Kay欣賞的是Lisp,他認爲Lisp是軟件的麥克斯韋方程,其中的許多想法是軟件工程和計算機科學的一部分。看來擁有Alan Kay這樣一位重量級的Java先驅仍是我們Java一廂情願的單戀吧。

 

Kent Beck : 領導的敏捷潮

文:劉鐵鋒

Beck全家似乎都瀰漫着技術的味道。生長在硅谷, 有着一個對無線電癡迷的祖父,以及一個電器工程師父親。從小就引導Kent Beck成爲了業餘無線電愛好者。

在俄勒岡州大學讀本科期間,Kent Beck就開始研究起模式。然而在他最終拿到計算機學位之前,他卻是在計算機和音樂中交替學習。似乎Java大師都能夠有這樣的能耐,另一Java大牛Rod Johnson同樣也擁有音樂學的博士學位。

Kent Beck一直倡導軟件開發的模式定義。早在1993年,他就和Grady Booch(UML之父)發起了一個團隊進行這個方面的研究。雖然著有了《Smalltalk Best Practice Patterns》一書,但這可能並不是Kent Beck最大的貢獻。他於1996年在DaimlerChrysler啓動的關於軟件開發的項目,才真正地影響後來的軟件開發。這次的傑作就是XP(極限編程)的方法學。

和軟件開發大師Martin Fowler合著的《Planning Extreme Programming》可謂是關於XP的奠基之作。從此,一系列的作品如《Test Driven Development: By Example》,《Extreme Programming Explained: Embrace Change》讓更多的人領略到了極限編程的精髓,也逐步導致了極限編程的流行。

Kent Beck的貢獻遠不僅如此。對於衆多的Java程序員來說,他和Erich Gamma共同打造的JUnit,意義更加重大。也許正式這個簡單而又強大的工具,讓衆多的程序員更加認可和信賴極限編程,從而引起了Java敏捷開發的狂潮吧。

 

 java十年-十大事件

1990-1994:Java緣起

文/孟巖

Larry Wall說,優秀程序員應有的三個特點:懶惰、急躁和傲慢。Java就是誕生在一羣懶惰、急躁而傲慢的程序天才之中。

1990年12月,Sun的工程師Patrick Naughton被當時糟糕的Sun C++工具折磨的快瘋了。他大聲抱怨,並威脅要離開Sun轉投當時在Steve Jobs領導之下的NeXT公司。領導層爲了留住他,給他一個機會,啓動了一個叫做Stealth(祕密行動)的項目。隨着James Gosling等人的加入,這個項目更名爲Green。其目標是使用C++爲嵌入式設備開發一種新的基礎平臺技術,James Gosling本人負責開發一個SGML編輯器。正如人們事後分析的那樣,這位天才的程序員太懶惰,所以沒有把C++學好,開發中碰了一頭包;太急躁——所以不願意停下來讀讀Scott Meyers的新書《Effective C++》;太傲慢——所以輕易地決定開發一中新的編程語言。他把這種語言命名爲C++++--,意思是C++“加上一些好東西,減去一些壞東西”。顯然這個糟糕的名字不可能長命百歲,很快這種頗受同伴喜愛的小語言被命名爲Oak。

到了1992年9月,Oak語言連同Green OS和一些應用程序一起發佈在稱做Start 7的小設備上,從而使之有了第一次精彩的亮相。隨後,Sun開了一家名爲FirstPerson的公司,整個團隊被轉移到這家公司裏研發機頂盒,以投標時代華納公司的一個項目。這幫天才被技術狂熱所鼓舞,開發出了一個高交互性的設備,結果沒想到時代華納公司和有線電視服務商並不願意用戶擁有那麼大的控制權,從而在競標之戰中敗給了SGI。Oak的鋒芒之銳,竟然把客戶都給嚇懵了。Sun沮喪地關閉了FirstPerson,召回了整個團隊。事實證明,傳統行業中那些腦滿肥腸的保守主義者是腐朽沒落的。回去!回到激情澎湃的IT產業,抓住互聯網的大潮,這纔是出路!1994年,Oak被命名爲Java,針對互聯網的新一輪開發如火如荼,一切已經就緒,熔岩在地下奔流,火山即將噴發。

1995: Java香濃世界

文/馬偉

1995年,Sun正式對外公佈了Java,並且發佈了JDK 1.0。這種外形酷似C++,卻包含一顆Smalltalk般純潔的面向對象之心的全新程序設計語言及其平臺,幾乎在一夜之間就成爲軟件產業的新寵兒。Java當時僅僅被用來爲網站製作一些動態應用,諸如動畫圖片之類,但這仍然引起了很多Web開發者們的注意,他們非常渴望有一種安全的語言,可以在靜態的HTML網頁上製作動畫圖片。Sun最終把Java集成到NetScape瀏覽器。同時因爲它具有“只寫一次,隨處運行”的特性,而引起了很多開發者的注意,他們可以再也不用爲了使程序能夠在不同型號的硬件上運行而耗費大量的時間來編譯代碼了。

當時的Web瀏覽器的出現也爲Java的出現起到了很好的推動作用,通過Java和Web瀏覽器的結合,人們似乎看到了什麼,有人甚至預言PC將在一兩年內退出歷史的舞臺,取而代之的是基於Java的瀏覽器應用程序,通過網絡計算設備來進行應用。Java的出現爲當時的軟件產業帶來了無限的遐想。

1996:Java大躍進,盟主地位就此定

文/馬偉

SUN在1996年一開始首先成立了JavaSoft組織,並在1月23日正式發佈自己的Java 1.0,作爲20世紀業界出現的最重要的技術之一,Java引起了編程世界的革命。直到現在,Java仍然是互聯網上最流行的語言。

在Sun正式發佈Java 1.0之後,Java這門新生的語言就擁有了自己的會議——JavaOne,這次會議初試啼音就吸引了600多名參與者。除了擁有這麼多的積極參與者來進行Java的開發之外,各大知名公司也紛紛向Sun申請Java的許可。一時間,NetScape、惠普、IBM、Oralce、Sybase甚至當時剛推出Windows 95的微軟都是Java的追隨者。

Java的應用就像是世界上的頂級玩家們組成的一個公開聯盟,告訴全世界我們大家就是都在用着Java。也正是因爲如此,Java也找到了自己的歸宿。現在的J2EE已經成爲中大型企業級應用的標準,成爲承接數據庫和Web之間的一個重要橋樑。

當年Java的機會實在太多了,以至於很難知道到底該做什麼。最終Java在應用服務器市場獲得了難以取代的地位,也確定了J2EE的發展方向,並且仍將延續下去。

1997-2001:  微軟與Sun的Java官司

文/孟巖

Java誕生的1995年,正是微軟在軟件產業地位達到巔峯的時代,Windows 95發佈時的風光場面給人們留下的深刻印象至今難忘。儘管如此,作爲最卓越的技術領袖,比爾?蓋茨仍然敏銳地注意到Java。當他了解了Java的一些細節之後,給予了這樣的評價:“Java是很長時間以來最優秀的程序設計語言。”基於此,微軟於1996年3月申請並獲得了Java許可證。微軟對於Java的這一熱情態度在當時大大提高了人們對Java的興趣和信心,但也有不少人擔心微軟會依靠自己強大的影響力在標準之外另立標準,從而破壞Java的純潔性。

果然,從1997年發佈Visual J++的第一個版本開始,微軟就開始在Java中摻入自己的私有擴展。這毫無疑問引起Sun的高度重視。1997年10月,Sun向美國加州地方法院起訴微軟公司違反兩公司就微軟使用Java技術所簽定的合同,指控微軟公司在自己的Java產品中做了“不恰當的修改”,違反了合同中承諾向用戶提供Java兼容產品的條款。這一官司曠日持久,直到2001年1月雙方達成和解,微軟將繼續提供採用Sun開發的Java技術的現有產品(包括測試版)。不過,Sun有限制地僅對包括Java 1.1.4的微軟產品提供許可。到了2001年7月,微軟公佈新版的Windows XP將不再支持Sun的JVM,並且推出了.NET平臺與Java分庭抗禮。

現在回過頭去看,當時的這一場官司對Java世界產生了深遠的影響。如果沒有這一場官司,也許很多Java程序員都在使用Visual J++,基於WFC開發Windows客戶端程序,同時不得不面對被兩個不同的事實標準所分裂的Java世界。

1998:Java 2平臺發佈

文/陶文

1998年,Java 2平臺正式發佈。經過了三年時間的發展、熱熱鬧鬧的攻關宣傳、紅紅火火的衆廠商的熱情參與,Sun終於知道Java適合幹什麼了。對比Java剛發明時的技術定位,與Java的戲劇性觸“網”的那段歷史,Java 2平臺的發佈可真算得上是有的放矢了。根據官方的文檔,Java 2是Sun意識到“one size doesn’t fit all”之後,把最初的Java技術打包成三個版本的產物,也就是著名的J2ME、J2SE、J2EE。

之所以說Java自從Java 2平臺發佈之後,進入了現代。那是因爲之前的歷史怎麼看來都和現在程序員日常開發使用的技術無什麼關係,比如Applet,已經很少有人使用了。Java 2之後的歷史就不一樣了,至少人們在推崇輕量級開發,猛批EJB時還不時會引用J2EE這個詞是如何誕生的。而Java 2的三大版本中,除了J2EE得到了長足發展和廣泛使用之外,J2ME也在手機市場上取得了遍地開花的結果。相較之下,J2SE難免落寞,只剩SWT這個血統不純的傢伙在Rich Client迴歸的時代吸引着人們的眼球了。無論今天看來當時的Java 2有多麼的不成熟,至少經過市場和時間的檢驗,Java 2規劃出來的三大方向把Java技術指向了光明的方向是勿庸置疑的。

1998:JCP成立並正式運作,

Java開源社羣開始蓬勃發展

文/黃海波

1998年,JCP組織成立,並且開始把握Java的發展方向。JCP組織的開放性,不但使得所有對Java感興趣的商業公司可以參與Java的發展,更重要的是JCP允許個人、非盈利組織、學校等加入,這就給Java帶來了巨大的活力。隨之興起的Java開源運動的最大貢獻是實現和鼓勵了知識共享,在衆多熱情的開源程序員們的努力和分享下,很多原先只被商業公司掌握的技術、思想和產品可以被所有需要的開發人員免費或者以較低的價格獲得使用權, 並通過開放源代碼更容易的獲得反饋和改進意見從而進一步演化發展。我們知道,所謂知識不是孤立發展認知,而是人們的經驗,認識是思考交流和積累的產物。而開源運動所帶來的開放、反饋、交流的風氣正是符合人類社會知識形成和發展的規律。

開源運動起源於西方的發達國家,有其現實背景和文化根源。1990年代可以說是IT產業的一個黃金時代。信息時代的興起對IT人員,特別是軟件人員有着巨大的需求。而軟件開發又是一種類似藝術創作的腦力活動,和所有的藝術家、作家們一樣,在作品打上自己的印記並流傳在世界上是每一個創作人員的夢想。互聯網時代下的高收入的舒適生活,早九晚五的編寫公司的代碼並不能滿足很多有激情的軟件開發人員的夢想,再加上西方傳統的基督教文化中十分推崇的分享和交流,開源的出現和興起也就水到渠成了。今天,開源運動已經不僅僅是一些個人天才程序員們的遊樂園地,而是發展成爲一項開源軟件產業。

1998:WebLogic打開J2EE的魔匣

文/霍泰穩

Java語言的出現使得互聯網絡有了良好的交互性能,但這些很“酷”的技術僅被人們認爲是一些小花招,它還無法消除企業級用戶對它的懷疑。1998年,BEA公司宣佈收購WebLogic公司,並接着推出由Sun公司第一個授權使用J2EE許可證的WebLogic Server應用服務器,這個Java版的AppServer一推出就引起業界極大的興趣。WebLoigc Server以其對標準的支持、強悍的運算能力和安全的架構設計等特性也很快征服了那些懷疑J2EE應用的人們。推出市場後不到一年,WebLogic Server就成爲業內第一Java應用服務器。

這裏我們援引一些當時著名諮詢公司的調查數據來說明問題,“在IDC的報告中,BEA在應用服務器和交易服務器領域市場份額第一;在Gartner的報告中,BEA WebLogic Server擁有業內最廣泛的EJB應用安裝基礎;在Giga Group的報告中,BEA WebLogic Server市場份額佔32%”。

因爲應用服務器市場極大的發展潛力,在WebLogic Server之後,其它的很多公司也推出了自己的AppServer,如IBM的WebSphere、Sun公司的iPlanet等,逐漸地應用服務器取代了傳統意義上的各類中間件,成爲企業應用的基礎平臺。應用服務器的出現使得Java有了真正意義上的發展。

 

2002-2004: Sun與微軟的法律碰撞最終以喜劇收場

文/惡魔

2003年4月2 日,Sun與微軟達成16億美元的法律和解。如果不是晚了一天,許多人會以爲這是一個在4月1日愚人節開的玩笑。儘管當時所有人都像是看到“太陽從西邊出來了”那樣張大了嘴巴,但這的確是事實。

根據兩家公司達成的版權協議,雙方會爲採用對方的技術而支付專利費用,微軟向Sun提前支付3.5億美元使用費,Sun則承諾,如果Sun集成微軟的某些技術,也會向微軟付款。

毫無疑問,“私下了結”的方式對雙方而言都是最好的結果。就在協議簽署的當天,在美國舊金山由Sun和微軟爲“拋棄十年恩怨、攜手合作“舉行的新聞發佈會上,儘管比爾?蓋茨沒有到場,但這並沒有防礙現場看起來異常輕鬆的氣氛。麥克尼利和鮑爾默各自穿了一件密歇根州底特律“Red Wings”曲棍球隊的運動服,並談及了一起在哈佛大學讀書的經歷,麥克尼利還說:“當時我們兩人是非常要好的朋友,當然我們也有吵架的時候。”人與人當然可能成爲終生的知己,但是公司與公司之間有的只能是利益上的分分合合。

2000-2004: JBoss和Eclipse

——Java開源軟件的王者

文/莫映

Java和開源幾乎就是天生的一對,這可以從無比興盛繁榮的Java開源軟件社區得到佐證。目前最有影響力的Java開源軟件項目,要數JBoss和Eclipse。可以說,幾乎所有的Java開發人員都獲多或少的聽到過或接觸和使用過它們。前者是目前最優秀、應用最爲廣泛的企業級開源J2EE應用服務器,後者是功能完全可以替代商業產品的Java IDE。二者的覆蓋功能之全、支持工具之廣、子項目之多,幾乎可以僅憑藉它倆來完成企業應用的開發構建到部署實施的全過程,而軟件開發者和客戶也都可以最大程度上享受高質量,高可靠Java開源軟件所帶來的低成本優勢。

JBoss和Eclipse的巨大成功,幾乎令各自領域的商用競爭者抓狂,其中BEA的WebLogic和IBM的WebSphere在商業利潤上受到JBoss的巨大侵蝕,而Borland的JBuilder、JetBrains的IDEA等諸多優秀的商用開發工具也不得不面對Eclipse獨大的現實。JBoss的CEO兼創始人 Marc Fleury曾直言不諱地表示,希望佔據市場主導地位。“我們希望打敗IBM,成爲中間件領域裏最大的廠商。”JBoss在4.0以前還只是以一個Group存在,盈利手段主要靠服務和銷售文檔。但在最近,JBoss已經發展成爲一個有限公司,並吸納多家風險投資,專注於獲取利潤爲目標之一的第二代開源軟件模式(JBoss自己稱爲“Professional Open Source”)的創新和運營。這區別於以理論研究爲愛好的學院型開源或大公司爲基礎的非盈利組織開源,如Linux和Apache。當然JBoss的這種運營方式勢必會導致更多的代碼控制和專有修改權,但按JBoss的說法是這樣更能獲得企業客戶的信賴。JBoss的這種模式是否能獲得成功還要我們拭目以待。

不管JBoss和Eclipse的未來發展如何,JBoss和Eclipse的成功已經讓我們看到了Java開源軟件的威力,祝願它們一路走好。

2004:Java 5.0

文/莫映

2004年9月30日,代號爲“Tiger”,研發歷時近三年的J2SE 5.0發佈正式版本,這是Java平臺歷來發佈版本中改動面波及最大的一次。

縱觀Tiger,“Ease of development”是其核心主題,這一點着重體現於語言特性上的改進,這在很大程度上,簡化了開發人員日常的編程任務,以往一些瑣碎的手工勞動都代之以輕鬆自然,而又安全可靠的自動化實現。其中的註解功能,以及隨之而來的聲明式編程,還對構築於J2SE 5.0之上的J2EE 5.0產生了巨大影響。儘管Tiger在語言特性上做了很大的動作,但作爲Java技術的基礎支撐,這些改動都是深思熟慮的結果。

Tiger發佈至今也有大半年了,那麼Sun又是如何規劃J2SE的未來藍圖的呢?據悉,J2SE的下兩個版本分別是代號爲“Mustang”的J2SE 6.0和代號爲“Dolphin”的J2SE 7.0,預計Mustang將於明年發佈。在吸取了Tiger研發週期過長的教訓之後,Sun副總裁Graham Hamilton表示,Mustang的發佈週期將不會那麼長。並且,Sun還將“Becoming more open” 作爲Mustang的主題之一。未來JCP對Java技術的影響將會愈加深入,而整個研發過程也將會愈加透明。Mustang在正式發佈前的內部版本也會陸續見諸於衆,如此,廣大Java開發者便可以更加及時的瞭解到Java發展的最新情況。在語言層面上的擴展依然會比較謹慎,比如像AOP這樣的當下熱門技術,依然不太可能會見諸其中。據Hamilton所言,一個有可能被引入的語法特性被稱作“friends”import機制,它將使由多個包組成的大型項目變得易於管理。

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