最近這半年的講師生涯之中,遇到不少從VB轉到Java的學生,絕大大部分 的工程師或新進軟件開發領域的朋友都會問:"我該學.NET 還是Java ?" "該學C# 還是Java ?"相關的主題在網路上可謂暗潮洶涌,隨時可能擦槍 走火,在發表本文之前, 自己把C# Spec 深入地讀了一次 ,也大致研讀了 .NET的相關技術文章所以想想在此發表一心得,沒有什么預設立場,請大 家多多包含。
本文適用對象:
"本文內容只適用一般工程師,特殊情況不算!" 何謂特殊情況呢?以我個人為例,明明知道Delphi的原生語言是Object Pascal, 所以要用Object Pascal才能和Delhpi融為一體的感覺.可是, 開發Project 的時候,我就是莫名其妙地喜歡用C++Builder.當"程式語 言基本教義派"或"程式語言民族主義"遇到正常行為的時候,是怎么說 也說不清的。(以上是李敖先生說的話,我只把關鍵字換了,希望不會被 他告)另外一種特殊情況就是,如果您的思考方式與普通人不同,那么, 本文亦不適用於您。
首先想討論的是架構的問題:
筆者并沒有深入研究過架構,也實在不清楚網路上諸位先賢所謂的架 構指的是什么.但是我憑一個工程師的直覺可以篤定,".NET就根基架 構上一定比Java的根基架構還要好!"因為.NET的推出比Java晚了近5 年,中間還有J++與WFC的發展,如果搞了個比Java還鳥的東西,像話嗎? 只要Sun在這次帝國大反擊之後,沒有被MS弄得節節敗退,從此消失於 市場,相信它若干年後還會推出個比.NET還好的東西,然後若干年後MS 又搞出一個更好的東西.事實上,科技的演進就是如此.所以誰強誰不 強,純粹是歷史必然的結果.所以沒有什么好爭論的.至於將來誰會是 市場的霸主,就看兩家龍頭太廠誰比較會行銷,誰比較親近工程師.雖 然資訊界過去曾經好幾次重復"好東西被干掉,次級品占領市場"的歷 史.但是仍然沒有人敢斷言。
其次是壓寶誰的問題:
Sun的標語是"網路即電腦",所以在Java的策略上,Sun假設這個世界 上充滿異質平臺,所以設計Java 的時候希望以單一一個Java程式語 言為中心,讓它可以在各種平臺上執行.因此JVM要采stack machine 的設計方式,因為不管你是誰,都可以實作出stack machine.但是這 畢竟是一個不理想的世界,連Sun自己Solaris都要好幾個patch才能 使用新版的JDK.連Borland也花了三年以上的努力才讓 JBuilder可 以同時推出Windows , Linux , Solaris , Mac OS X 四種版本,可 見"Write once, run anywhere"的理想真的有其實際上的難度. Borland除了證明Sun 的理想是有機會實現的禮運大同篇,也證明經 過精心的架構設計和最佳化,加上工程師累積了許多經驗後,仍然可 以突破stack machine 先天上速度慢的原罪(雖然還是不理想,需要 用很多RAM來填補理想).Sun把其官方工具JDK搞的很難用,網路上老 是有人抱怨它是Java Developer Killer,雖然.NET Framework SDK 一樣難用,可是微軟至少還有Visual Studio.NET如果說微軟的Visual Studio.NET讓工程師感覺像在開Benz,那么Forte就很像路上隨便一 臺前方貼著Benz標記的爛公車.所以Sun實在需要多多加強.不過這 也難怪,MS是純軟件起家,Sun是純硬體起家,Sun做軟件做不過MS是 正常的事情.
反觀MS,它假設世界上只有x86的CPU,或者廣泛的說是Wintel 平臺, 并假設世界上存在許多會各種語言的工程師們.因為以此假設為策 略中心,所以設計.NET的時候CLR可以針對x86 CPU 作最佳設計,有 些指令甚至可以和op code達到1 to 1的mapping,所以速度自然跑 的快.但是叫他移到SPARC或AS/400上就麻煩大了.. 就工程師的角度,自然會偏向.NET,因為選擇很多(喔,這點有待商榷, 後面會提到),但是就3rd party 廠商的利益和老板不想被特定平臺 綁死的觀點來說,會偏向Java。 各位想, .NET的WinForm設計的那么漂亮,很可能累積了Anders離開 Borland之後的許多好點子,如果.NET出來,Borland大概真的只剩下 IDE可以做了.所以最後誰的利益勝出,很可能就會決定輸贏,
因此筆者曰:"你想信耶穌就信耶穌,想信佛教就信佛教,你心中的神 自然會帶領你走向他口中的天堂."喔,對了,如果兩邊都要壓寶的人 當然沒問題,但是請一定要小心,不要到時候上不了其中一個神所謂 的天堂,卻同時下了兩個神口中的地獄啊!
再來是Programming Model的問題: 記憶中,上一次給我驚艷感覺的時候是Delphi出來的時候,讓我第一 次覺得寫程式是很美好,很簡單的事情,可是自從那次的美好經驗之 後,一直到目前為止,都沒有任何新意讓人有耳目一新的感覺,總讓我 覺得軟件的開發方式是不是已經走到一個瓶頸了呢?Anders搞VCL的 時候,Borland說它是VB Killer, Anders 搞.NET,MS 當.NET 是Java Killer,怎么每次Anders出現的時候都會出現殺手呢? 我建議以後 改叫他enders算了,大家覺得如何?
總之,元件架構不管是VCL, JavaBean, WFC, .NET Framework,搞了 搞去都是setXXX()與getXXX()那一套,進步也只是小邁步,不是大躍 進.以前語言里頭不支援,所以要搞特殊語法,現在搞個新語言來支援, 然後把他標準化罷了.自從Jordon退休之後,NBA就變得有點不熱鬧了, 但我還真希望既Anders之後,有新一代的鬼才提出另外讓我們工程師 輕松的Programming Model呀!!
最後是語言上的問題:
C#比Java復雜多了,多了很多關鍵字,讓我覺得很復雜,先說型態好了, C#提供value type與reference type,value type還分成simple type ,enum type , struct type,reference type還分成class type , interface type , delegate type , array type.這些型態如果在配 上傳遞參數時可以選用純粹的by value , by reference(ref) , ouput (out) , parameter array感覺上還真是熱鬧哩!!c#之中我們還可以利 用unsafe關鍵字對指標直接做存取.存取權限修飾字除了固有的public, protected , private之外,也加了internal , protected internal. 在多型上,除了以前的virtual之外,也加了override關鍵字.喔,當然有 人會說我何必庸人自擾,但是如果您的汽車有類似霹靂車可以Turbo的功 能,我想任何有好奇心的人都會想找機會試看看他的極限在哪里,才不管 會不會粉身碎骨.Java程式語言的功能有限,工程師遇到特定問題通常會 找其他特定的解決方案,這么一來程式在維護上會比較容易.但是語言復 雜了,同一件事情有好多種做法,自由度變大了,工程師發揮的好,就可以 突破很多限制,實現自己夢想.但是維護上呢?
君不見有些天才可以用C簡單幾行程式寫出求PI值的程式,但是有多少人 看的懂?個人主義和團隊合作之間是有一些gap存在。語言的簡單與復雜 之間,實在是個dilemma.如果程式語言里頭都是宣告,回圈,函式呼叫這 三種基本要素,那么要設計出很復雜,功能超強的程式語言都沒問題的, 不是嗎?Sun大可在Java里頭開始引進很多C++的功能,可是它沒有,原因 何在?C#的復雜度,如果加上operator和template,那么和C++可有的拼哩!
每次上Java課程時有好多好多的VB Programmer跟我說他無法提升上來, 雖然我要負大部分的責任,但是我開始懷疑如何把VB Programmer提升到 .NET的層級呢?我說的VB Programmer當然不是少數精通各種語言,用VB 只是純粹好玩的工程師,而是指目前臺灣資訊業界的許多中堅分子和SOHO 族,當然,有人會叫我去用VB.NET, COBOL.NET,問題是,大家有沒有想過 為什么C++那么強大,可是還是很多人喜歡用C ?為什么開始有人改用Java ? 為什么雖然Pascal不是主流,可是大家還是喜歡用Delphi ?
現在打出MS的行銷廣告告訴所有工程師一個訊息:"各種語言的工程師都 可以廣納在.NET之下."相信去參加過微軟或其他研討會之後的朋友,除了 發現.NET很不錯,很棒,有很多功能是自己過去夢寐以求的功能之外,也發 現他們被MS騙了(有人跟我說他覺得他被MS拋棄了),因為他們發現過去學 的根本沒用,啥米VB.NET,要他去學那種VB,他寧愿去學C#,反正比起VB.NET 的語法,C#也沒難到哪里.
http://www.vbqa.com/discuss/vb.net/read.asp?id=11
這個論壇里頭,ChrisTorng先生說的很好: "況且 vb.net與c#的相似度,依我看比vb.net與vb6的相似度還高…^_^"
任何語言,要能夠在CLR上發揮功能,就必須符合CLS的規范,意思就是說, VB.NET不會因為它的前面有VB兩個字,就可以讓過去用VB的朋友仍然有著 絕佳的生產力.如果語法沒有擴充,您相信VB.NET寫的component可以被C# 用嗎?我是指"優美的用法",而不是旁門走道繞了一大圈之後的用法. MS在.NET Framework SDK beta 2里頭,據說把VB改回來了,雖然不知道修 正的幅度多大,那么這個新生代的VB可以發揮多少CLR的能力呢? 大家就 拭目以待羅!
我只能打個比喻,同樣的馬力,扭力以及內部裝潢,載女朋友的時候你要用 的車子是長的像BMW的樣子? 還是長的像電子花車?用VB用到很精通的情況 之下,所以的工程師都會發現,要打破任督二脈,就必須去了解COM,否則永 遠無法突破,這個在.NET里頭一樣適用,要發揮.NET的能力,最後一定往C#走. 所以要在.NET上發展程式,我絕對選原生語言C#,不會用VB.NET.因為,車子 也不會因為他長的像飛碟,就可以不用輪子行走呀!
那么,同樣是交通工具,臺北車站到天瓏,你會選飛機還是計程車? 所以有些事情,在Windows平臺上, Java或許做得到,但是做起來很復雜又不美觀的時候,我用.NET. 寫GUI程式的時候我會選VB或Delphi,至少不會像JBuilder和Visual.NET 一樣,只是個簡單的GUI,改了點property,竟然跑出一大堆讓我不知道從 何改起的程式碼.每次看到這些無聊又重復的程式碼,讓我久久無法言語。
結語:
不管是大陸還是臺灣的工程師,都存在著"廣義中國人"的劣根性,東西還 沒出來,就可以諸多猜測,跟我們電視上那些算命的半仙沒啥兩樣..而且 ,大家還真喜歡算命耶!難怪我媽看到我在讀The Art of Computer Programming的時候跟我說,程式設計師和巫師沒啥兩樣,只不過他們靠 烏龜殼和咒語,而我們靠的是程式語言.我們總是人家在煮米粉,我們再 喊燒,一大堆會寫病毒的高手,一大票善於破解的高手.但是就是做不出 世界級的軟件.當然,這也罵到我自己了,但是我真的是對軟件業沒啥貢 獻就是了。
非官方觀點,歡迎大家來信討論. moli.mt88g@nctu.edu.tw
|