本文來源于網頁設計愛好者web開發社區http://www.html.org.cn收集整理,歡迎訪問。本文作者:王森
臺灣交通大學科技管理研究所
[email protected]
前言:
    最近這半年的講師生涯之中,遇到不少從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的時候跟我說,程式設計師和巫師沒啥兩樣,只不過他們靠烏龜殼和咒語,而我們靠的是程式語言.我們總是人家在煮米粉,我們再喊燒,一大堆會寫病毒的高手,一大票善於破解的高手.但是就是做不出世界級的軟體.當然,這也罵到我自己了,但是我真的是對軟體業沒啥貢獻就是了。
非官方觀點,歡迎大家來信討論.
[email protected]