本文作者:王森 臺灣交通大學科技管理研究所 moli.mt88g@nctu.edu.tw
前言:
最近這半年的講師生涯之中,遇到不少從VB轉到Java的學生,絕大大部分的工程師或新進軟體開發領域的朋友都會問:"我該學.NET 還是Java ?" "該學C# 還是Java ?"相關的主題在網路上可謂暗潮洶涌,隨時可能擦槍走火,在發表本文之前, 自己把C# Spec 深入地讀了一次 ,也大致研讀了.NET的相關技術文章所以想想在此發表一心得,沒有什么預設立場,請大家多多包含。也感謝洪志鵬先生愿意讓這篇文章藉由Java周報發表。
本文適用對象:
"本文內容只適用一般工程師,特殊情況不算!"何謂特殊情況呢?以我個人為例,明明知道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.e
|