姑且不论对不对,开拓一下视野也不错啊
.NET 的年齡計算方式有兩種:「虛歲」的計算方式是,從 2000 年六月,微軟正式宣佈 NGWS(Next Generation Windows Services)開始計算;「實歲」的計算方式是,從 2002 年第一季 .NET Framework 1.0 正式釋出開始計算。虛歲是 4.5 歲,實歲是 2.5 歲,平均起來是 3.5 歲。
在台灣,老一輩的人常說,一個孩童三歲時,就可以看出他的資質潛力。對於 .NET 來說,我們的確已經看到 .NET 所展露的光芒,雖然在 Java 的光環籠罩之下,.NET 的光芒略顯薄弱。Java 和 .NET 是類似的技術,所以會互相競爭,互相牽制。Java 氣勢越旺,.NET 自然就會顯得黯淡。
由於 Java 和 .NET 互相競爭,所以常常有人會拿兩者來比較,我們要注意到比較的基準點(Baseline)為何。拿 .NET 1.0 和 Java(JDK)1.0 來比較,對於 Java 是不公平的,因為 .NET 1.0 比 Java 1.0 晚六年才推出,所以 .NET 1.0 自然是比 Java 1.0 來得先進許多。當年 Java 1.0 剛推出時,只有 8 個 package,勤勞一點的學生或程式員,可能只需要兩個月就可以把 Java 學得透徹。但是,拿 .NET 1.0 和同一時間的 Java 1.4 比較,也不公平,因為,Java 已經推出六年,自然力累積了許多資源和人氣,這方面當然是 .NET 目前比不上的。
換個理性的角度來看,科技產品的生命週期有四個階段,分別是萌芽期、成長期、成熟期、衰退期,請參考圖 1。經過了近十年的耕耘,Java 目前正處於成熟期前端,還有成長空間,但是成長比例不會太大,估計經過 3~5 年會步入明顯的衰退期;而 .NET 正處於成長期前端,即將展現爆發力(Longhorn 可能是關鍵)。
圖
圖 1
固然 .NET 現在居於頹勢,但 Java 也不是一路順風地達到現在的境地,Java 成長的歷史也是有許多波折,姑且不論 1990年~1994 年之間,Java(當時還不叫做Java)在 PDA、Set-Top Box 上所遭遇的挫敗,即使在 1996 年 JDK 1.0 推出之後,道路依然坎坷。
我在 1995 年就開始使用 Java,一路看著 Java 成長茁壯。我還記得,1996 年時,Java Applet 搭著 Internet 的便車,Java 引發一股學習熱潮,許多人趕著投入這個新技術,台灣的 IT 出版社也翻譯了一大堆 Java 原文書。但是仍然有許多人持觀望的態度,因為當時有許多關於 Java 的 FUD(Fear / Uncertainty / Doubt,恐懼 / 不確定性 / 疑慮)。為了推廣 Java,當時 Sun 一直努力地破除這些 FUD。
在 1997、1998 年時,Java 熱潮稍退,因為大家發現 Java 其實還不成熟,GUI 太陽春(當時是AWT),程式執行速度太慢(JIT 技術不成熟),記憶體耗費量太大(GC 算法不成熟),Java Applet 也不太實用(VM 啟動時間長,applet 下載時間也很長),API 也不齊全。當時,台灣的 IT 出版社倉庫都堆了滿坑滿谷的 Java 書賣不掉,叫苦連天。
到了 Java 2 推出之後,Java 將大家的興趣導引到 Servlet(以及後來的 JSP),Java 才又漸漸地抓住大家的眼球。後來又出現了 EJB,使得 Java 具備現代化的四層式架構(4-tier Architecture),J2EE 成為大企業的首選技術。同時手機漸漸普及,J2ME 平台也被加入高檔的手機上。Java 已經佔領 Server 和手機平台。相較之下,在這段期間,微軟並沒有太積極的動作。
.NET 現在的情況,有一點類似 1997 年和 1998 年的 Java,許多人對 .NET 仍存有各種 FUD,.NET 的技術一直在快速地進步,但是市場接受度卻又遠不如預期。Java 的培訓班爆滿,.NET 培訓班則冷冷清清。IT 書店裡,暢銷的書都是 Java 的書。
Java 的榮景,讓 Java 的程式員很難有危機意識。事實上 Java 有太多的包袱,包括了:Sun 的把持、JCP 過程冗長、新舊技術的整合度。這些都是危機。
Sun 把持住 Java,不願意放開 Java 的掌控權。微軟至少把 C# 和 CLI 提交到 ECMA 和 ISO 制訂成公開的標準,這一點值得向來標榜開放的 Sun 好好學習。不過,ASP.NET、ADO.NET、Windows Forms、GDI+ 等重要的 API 並未提交到 ECMA 和 ISO。
Novell Mono 已經依據 ECMA 的標準實作了開放源碼的 .NET 平台,可以在 Linux、MacOS、Windows 上執行。DotGNU Portable.NET 也是一個類似 Mono 的計畫,但是步伐比較慢。以設計架構來說,DotGNU Portable.NET比 Mono 更有潛力移植到更多平台。
Java 進步的速度很慢,光是利用 JCP 來制訂一個 API,取得諸多廠商的共識,就可以搞個兩三年,JCP 在標準的制訂上,曠日廢時。相較之下,.NET 進步的速度就很快,因為全部都關起門來做,一下子就可以完成。我常常覺得,Java 就像是台灣,雖然民主,但是大家你一言我一語,吵吵鬧鬧,例如:台灣只不過要蓋一條高速鐵路,嚷了十多年,經過多次變更設計,變更包商,以及追加預算,才 能完工(2005年年底)。同樣的工程,在中國大陸,只要政府一聲令下,沒人敢囉唆,估計只需要兩年就可以完工了!
通常新的技術會比舊技術更好,因為新技術可以從舊技術學到優點,且新技術可以摒除舊技術的缺點。NET 比 Java 誕生的時間晚了六年,許多方面都比 Java 先進,當然是無庸置疑。我的意思並不是 Java 這六年停滯不前,事實上,Java 仍在進步中,只是有許多縫縫補補、修修改改的地方。例如,XML 和 Web Services 是在這六年之間出現的技術,所以 .NET 對於 XML 和 Web Services 的整合可以說是天衣無縫,但 Java 是後來才把 XML 和 Web Services 整合進來,且整合的程度比不上 .NET。
Java 有上述的問題,但 .NET 也有一些問題。.NET 目前面臨的最大問題是:使用族群建立緩慢,微軟形象讓人卻步,.NET 技術尚未齊備。
在使用族群方面,經過了多年的耕耘,Java 已經培養出一群忠誠的使用者,但是 .NET 這方面尚在起步。除了 IT 業界不斷地培養 Java 工程師之外,大學的教科書內容幾乎都是用 Java,這些學生未來進入社會很可能仍會使用 Java。.NET 尚未建立龐大的使用族群。也因此,以台灣來說,台灣微軟花了大把銀子在平面媒體行銷,包括在電子時報、IT Home 等資訊媒體,甚至連台灣商業週刊等非資訊媒體,都看得到相關的廣告。動態的行銷,包括PDC、TechEd.、修練講座、產品發表會…等活動,直接走入人 群,接觸客戶。電子的行銷,包括 MSDN 中英文網站、微軟 TechNet Flash 新聞信…等,提供技術新知。另外,還有多得拿不完的教學光碟,讀不完的線上文件,看不完的 Microsoft Press 出版品…。不過,根據我的瞭解,似乎還在耕耘期,還沒到大量收成的時候。
不過,微軟這兩年的確是到處挖 Java 的牆角,我看到美國有一些 Java 程式員或作者已經轉換旗幟,改投入 .NET 門下。過去這三年多,我花了不少時間在 .NET 上,對於 .NET 的認識越來越深,也修正了對於 .NET 原先的一些誤解和意識型態,漸漸地認同 .NET 的許多技術理念。姑且不論我們對於微軟是褒是貶,單純就技術本身來看,.NET 的確是很卓越的。我並不是唯一一個這樣想的人。以「Thinking in Java」等技術書籍廣受歡迎的 Bruce Eckel 也是如此。他原本認為 C# 和 .NET 只是 Java 的模仿者,並無新意,但是在深入瞭解之後,才發現 C# 和 .NET 其實是改良版的 Java,不管在各方面,都有比 Java 更突出之處。
微軟很努力地在推銷 .NET,但是投資和回收不太成比例,問題可能在「微軟的形象」上。事實上,在大多數 IT 技術人員的心中,微軟的形象的確是不太好,所以,當大家有其他強勢的技術可用時,可能就不會選擇微軟的技術,因為不想受到微軟的箝制,這是 IT 業界很普遍的想法。選擇 Java 技術,至少可以選擇不同公司的 OS(例如:Linux、Solaris、AIX),不同公司的應用伺服器(application server)(例如:IBM WebSphere、BEA WebLogic、SunONE)。Java 是一個規格(specification),而不是一個產品,所以有許多產品可以選擇。但是 .NET 是一個產品,而不是一個規格(提交到 ISO 的那部分除外),沒有別的選擇(我很好奇,Mono 算不算一個選擇,畢竟微軟沒有授權他們使用 ASP.NET 等 API)。固然 .NET 平台上有許多程式設計語言可以選擇,但是對於大多數的公司來說,這並不是什麼天大的優點。(Java VM 上除了 Java 語言之外,另一個勉強算成功的語言是 Jython,這遠比不上 .NET 平台上多元化的語言)。
另一個 .NET 的問題在於:.NET 技術並未齊備,畢竟 .NET 還年輕。但是這個問題將會漸漸消失。從 .NET 1.0 到 1.1,我們看到 .NET 有許多進步的地方,而且這兩年有越來越多 .NET API 出現(例如 Managed DirectX)。在微軟傾全公司力量挹注下,.NET 技術迅速地演進,像是吞了一整罐波菜的大力水手(Popeye)。我們可以預期,在 .NET Framework SDK 1.2(也就是 .NET 2.0)推出之後,會如同 JDK 1.1 到 JDK 1.2(Java 2)一般,是個大躍進。
.NET 最厲害的地方,在於它的技術整合。微軟把許多技術都整合進 .NET,這樣的威力,在未來將漸漸顯現出來。Microsoft SQL Server 整合進 .NET,IIS 整合進 .NET,甚至連未來的 Windows(Longhorn)作業系統,也會整合進 .NET。
微軟去年買下 Connectix 公司的 Virtual PC 產品,許多人並不重視這件事,但這對於微軟的 .NET 策略是很有幫助的。過去,在 Windows XP 上面執行 Win32 程式,如圖 2 (A)所示。微軟希望大家多多開發 .NET 應用軟體,將這個局面轉變成圖 2 (B)。等到 2006 年下一版的 Windows Longhorn 推出之後,.NET 已經變成 Windows 作業系統的核心(Win32 API 被廢棄不用,取而代之的是 .NET 的 WinFX API),就可以全面 .NET 化了,如圖 2 (C)所示。為了推廣 Longhorn,微軟勢必要讓舊有的 Win32 應用軟體也能在 Longhorn 上面執行,所以會整合進 Virtual PC,如圖 2 (D)所示。2006 年,Longhorn 正式推出之後,.NET 很可能會進入高度成長期。
圖
圖 2
即使你是 Linux 的愛好者,你也應該注意到 Mono 平台的出現,已經宣告 .NET 正式進入跨平台的時代。在 Linux 平台上面開發軟體,除了 Java、C++/Qt/KDE,你還有另一個選擇:Mono。在 Novell 的支援下,Mono 一直在進步中。
以史為鏡,可以知興替。如果你瞭解近二十年的軟體產業發展史,你會發現微軟挫敗的機會很小,即使是在頭幾場戰役失敗,也會在整場戰爭中獲勝。換句話 說,.NET 挫敗的機會不大。在 Office 軟體大戰中,WordPerfect、Ami Pro、Lotus 123 如今安在?在作業系統大戰中,OS/2 也已經銷聲匿跡。在瀏覽器大戰中,Navigator 如今只整剩下小小的疆土。你一定可以舉出更多這樣的例子。延續微軟在 PC 平台上的壟斷局面、配合日益擴大的 Windows Server 市場佔有率、以及漸漸有起色的 PDA/Smart Phone 市場,.NET 的趨勢是必然的。所以,我們的問題不在於「要不要用 .NET」,而是在於「何時開始使用 .NET」。
如果你讀過管理大師「彼得聖吉」(Peter M. Senge)的《第五項修練》一書(The Fifth Discipline),你一定知道什麼是遞延效應。讓我舉一個簡單的例子,也是實際的例子:
台灣的農夫往往會因為某種農產品價格好,大家都搶著種植同一種農產品,等到一段時間過後,大家的農產品都成熟上市,供過於求,導致市場價格太低,所以農夫甚至不再花錢請工人來收成農產品,而是任由農產品在田裡腐爛。
一個農產品從種植到收成需要數個月的時間,所以在決定該種什麼農產品的時候,應該考慮到以後市場需求的是什麼,而不是考慮現在市場需求的是什麼。由 於「精通」.NET 知識可能需要費時兩三年以上,技術人員應該盡量提早學習 .NET 以為因應。我認為固然目前對於 Java 程式員的需求仍大,但是我們的眼光應該看遠一點。
也請你先將意識型態放在一旁,好好地端詳 .NET 技術。你會發現,光從技術面來看,.NET 的確是相當先進而穩固。.NET 足以帶領我們走入下一個十年。