大內高手專欄:
回首過去,展望未來
作者:蔡學鏞
2004 年 12 月
.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 足以帶領我們走入下一個十年。
意見與支援
您有任何問題、意見或建議嗎?您可以透過下列電子郵件與作者連絡:
xy.cai@msa.hinet.net
更多資訊
想知道大內高手專欄的其他文章嗎?請至此專欄所有列表