對(duì)主流技術(shù)的分析和總結(jié)
一、引言
我為什么要寫(xiě)這篇文章
首先,我要限定我文章的范圍,我討論的問(wèn)題局限于桌面應(yīng)用開(kāi)發(fā)領(lǐng)域和企業(yè)應(yīng)
用開(kāi)發(fā)領(lǐng)域,所以我的結(jié)論并不適用于整個(gè)軟件開(kāi)發(fā)界,比如我說(shuō)C語(yǔ)言已經(jīng)退出
歷史舞臺(tái),這對(duì)于寫(xiě)嵌入式系統(tǒng)的人和編寫(xiě)操作系統(tǒng)內(nèi)核的人來(lái)說(shuō)顯然是錯(cuò)了。
我寫(xiě)這篇文章的目的主要是:
* 簡(jiǎn)單的介紹并評(píng)價(jià)當(dāng)前主流技術(shù)
* 比較當(dāng)前的主流技術(shù)
* 預(yù)計(jì)技術(shù)的演變
如果你想做程序員或者已經(jīng)是個(gè)程序員,你可能會(huì)面對(duì)這些困惑:
* 學(xué)什么語(yǔ)言呢?Delphi、C++、VB、Java、C#、PHP、Python?
* 選擇什么開(kāi)發(fā)工具呢?Delphi、VC、C++Builder、JBuilder?
當(dāng)你已經(jīng)入了門(mén),有了一定的基礎(chǔ)之后(可能已經(jīng)通曉了幾種語(yǔ)言),你會(huì)面臨
進(jìn)一步的困惑:
* MFC和VCL之間是什么關(guān)系?
* J2EE到底是什么?.Net到底是什么??jī)烧哂惺裁幢举|(zhì)的區(qū)別,我應(yīng)該學(xué)習(xí)哪一個(gè)呢?
* COM那么復(fù)雜,為什么很多地方都用到它?我必須學(xué)習(xí)它嗎?
如果是作為一個(gè)軟件公司,如果不是那么大,如果你的公司還沒(méi)有一個(gè)真正的技
術(shù)上的靈魂人物,那么你也會(huì)面臨同樣的困惑。技術(shù)問(wèn)題紛繁復(fù)雜,讓你不知所
從,而且真正的精通每一項(xiàng)技術(shù)都需要巨大的時(shí)間和人力的投入,你怎么辦?選擇
哪種技術(shù)作為公司的主流技術(shù)呢?選擇的方向是否正確是個(gè)關(guān)乎你的公司的生死存
亡的問(wèn)題。
你面臨著這些困惑嗎?如果是,那么請(qǐng)讓我試著為你撥云見(jiàn)日。
我的故事
在我上大學(xué)之前,我從沒(méi)見(jiàn)過(guò)計(jì)算機(jī)。大學(xué)的時(shí)候,正是Dos和FoxBASE的年代,
也正是計(jì)算機(jī)軟件開(kāi)發(fā)世界幾件偉大的事情發(fā)上的時(shí)候:(Windows3.1、Borland
C++ 3.1、Visual Basic 1.0 的推出也是偉大的事情,但那時(shí)候我還不知道計(jì)算機(jī)
為何物)Widnows95推出,并開(kāi)始應(yīng)用;Visual Basic 5.0推出,開(kāi)發(fā)工具中第一次
出現(xiàn)了成熟的、被廣泛應(yīng)用的Auto Code Completion技術(shù);Java推出;ASP技術(shù)開(kāi)
始盛行,Windows DNA技術(shù)被理解和接受;標(biāo)準(zhǔn)C++誕生;Visual C++6.0 推出;J2EE
規(guī)范推出。
成為一個(gè)程序員對(duì)我而言并不順利,因?yàn)槲也皇强瓢喑錾怼N胰腴T(mén)的程序語(yǔ)言是
FoxBASE,這讓我一直對(duì)FoxBASE有種特殊的感情,我也正是通過(guò)Visual FoxPro3.0
轉(zhuǎn)寫(xiě)Windows程序的,如果沒(méi)有它,我也許就不會(huì)成為一個(gè)程序員了。后來(lái),在大
學(xué)期間接觸到了InterDEV,那是個(gè)寫(xiě)ASP程序的開(kāi)發(fā)工具,還有Java,也是那時(shí)候
接觸的,當(dāng)時(shí)有點(diǎn)盲目崇拜的意思(我想我喜歡Java的一個(gè)原因可能是剛開(kāi)始學(xué)C
的時(shí)候很受挫折)。畢業(yè)之后,我就是憑借著自己寫(xiě)的一個(gè)ASP網(wǎng)站找到了自己的
第一份工作——說(shuō)來(lái)慚愧,我從來(lái)也沒(méi)有成為一個(gè)C程序員。我真正的熟悉Java是在
我翻譯了一本Java數(shù)據(jù)結(jié)構(gòu)的書(shū)和寫(xiě)了一套完整的GIS系統(tǒng)之后(說(shuō)起此事,我要
感謝一下我的公司,但因?yàn)檫@些故事與本文的主題無(wú)關(guān),所以這里就不多說(shuō)了)。
再后來(lái),我自己學(xué)習(xí)了標(biāo)準(zhǔn)C++和COM技術(shù)。
有點(diǎn)像履歷表了是嗎?提到這些,我只是希望作為讀者的你能夠了解一下我的知
識(shí)體系,從而能夠知道我大概要講些什么;同時(shí)也希望你能夠原諒我可能犯的錯(cuò)誤
——我在這里說(shuō)的話(huà),并不一定就是最后的結(jié)論,雖然“共同探討”這個(gè)詞幾乎是粗制
濫造的書(shū)的作者專(zhuān)用語(yǔ)了,但我在這里引用它是真誠(chéng)的,我愿意看到你的反饋。
要涉及的話(huà)題
在開(kāi)始文章的正題之前,我先大概地介紹這篇文章將會(huì)涉及到哪些知識(shí)。如果你
是初學(xué)者,希望你不要被嚇倒,這雖然是一篇技術(shù)文章,但我不會(huì)過(guò)多的討論技術(shù)
細(xì)節(jié),如果你不懂我說(shuō)的這些東西,也沒(méi)關(guān)系,我本來(lái)就希望通過(guò)我的文章幫助你
做出一個(gè)選擇,不再走很多人已經(jīng)走過(guò)的彎路,你這要記住結(jié)論就可以了,隨著你
知識(shí)的增長(zhǎng),以后你會(huì)漸漸明白;如果你已經(jīng)通曉了這些技術(shù)或其中的大部分,那
么我相信讀了這篇文章你會(huì)有一些另外的收獲。
主流的程序設(shè)計(jì)語(yǔ)言: C++、Delphi(Object Pascal)、Java、C#
桌面應(yīng)用程序框架:MFC、VCL、QT、Java AWT\SWING、.Net
企業(yè)應(yīng)用程序框架:Windows DNA(ASP、COM、COM+)、J2EE、.Net Framework
開(kāi)發(fā)工具:Visual Basic、Delphi、Visual C++、C++ Builder 、Visual C#
二、正文
好了,現(xiàn)在讓我們開(kāi)始我的正文吧。
首先,我來(lái)完成這篇文章的第一個(gè)目標(biāo):介紹并評(píng)價(jià)當(dāng)前主流技術(shù)。我指的今天
的主流技術(shù)是:
* 程序設(shè)計(jì)語(yǔ)言:C++\Delphi(本來(lái)應(yīng)該是Object Pascal,但為了簡(jiǎn)單,我就語(yǔ)
言和工具混為一談吧)\Java\C#(雖然他剛剛推出,但因?yàn)槲④洖橹畠A注了大量心
血,一定會(huì)成為一種重要的開(kāi)發(fā)語(yǔ)言)
* 桌面應(yīng)用程序框架:MFC\VCL
* 企業(yè)應(yīng)用程序框架:Windows DNA\J2EE\.Net
* COM技術(shù):我單獨(dú)提出這項(xiàng)技術(shù),是因?yàn)樗鼰o(wú)法簡(jiǎn)單的被視為語(yǔ)言、桌面應(yīng)用程
序框架或企業(yè)應(yīng)用程序框架,它與這些都有關(guān)系。
2.1 程序設(shè)計(jì)語(yǔ)言
2.1.1 C++
語(yǔ)言的演進(jìn)最初要從二進(jìn)制代碼和匯編說(shuō)起,但那太遙遠(yuǎn)了。我們就從面向過(guò)程的
語(yǔ)言說(shuō)起吧(包括Basic\C\Fortran\Pascal)。這種面向過(guò)程的高級(jí)語(yǔ)言終于把計(jì)
算機(jī)帶入了尋常的應(yīng)用領(lǐng)域。其中的C語(yǔ)言因?yàn)樗暮?jiǎn)單和靈活造就了Unix和
Windows這樣的偉大的軟件。面向?qū)ο蟮恼Z(yǔ)言是計(jì)算機(jī)語(yǔ)言的一個(gè)合乎邏輯的進(jìn)
化,因?yàn)樵跊](méi)有過(guò)多的影響效率、簡(jiǎn)單性的前提下提供了一種更好的組織數(shù)據(jù)的方
法,可以程序更容易理解,更容易管理——這一點(diǎn)可能會(huì)引出不同意見(jiàn),但事實(shí)勝于
雄辯,C++終于讓C語(yǔ)言的領(lǐng)地越來(lái)越小,當(dāng)今還活著的計(jì)算機(jī)語(yǔ)言或多或少的都具
備面向?qū)ο蟮奶卣鳎赃@一點(diǎn)并不會(huì)引起太多困惑。C++的成功很大程度要?dú)w因
于C,C++成為它今天的樣子是合乎邏輯的產(chǎn)物。因?yàn)樵诿嫦蜻^(guò)程的時(shí)代,C幾乎已
經(jīng)統(tǒng)一天下了。今天著名的語(yǔ)言象Java\C#都從C借鑒了很多東西,C#本來(lái)的意思就
是C++++。
其實(shí)C++曾經(jīng)很有理由統(tǒng)一面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的天下來(lái)著,但可惜的是,C++
太復(fù)雜了。即使是一個(gè)熟練的程序員,要你很清楚的解釋一些問(wèn)題你也會(huì)很頭痛。
舉幾個(gè)還不是那么復(fù)雜的例子來(lái)說(shuō):
對(duì)=的重載\成員轉(zhuǎn)換函數(shù)\拷貝構(gòu)造函數(shù)\轉(zhuǎn)化構(gòu)造函數(shù)之間有什么區(qū)別和聯(lián)系呢?
這樣定義一個(gè)類(lèi)成員函數(shù)private: virtual void MemFun() = 0; 是什么意義呢?
int (*(*x(int))[4])(double); 是什么意思?
還有其他的特征,比如說(shuō)可以用來(lái)制造一種新語(yǔ)言的typedef和宏(雖然宏不是C+
+的一部分,但它與C++的關(guān)系實(shí)在太密切了),讓你一不小心就摔跤的內(nèi)存問(wèn)題
(只要new 和delete就可以了嗎?有沒(méi)有考慮一個(gè)對(duì)象存放在容器中的情況?)……
諸如此類(lèi),C++是如此的復(fù)雜以至于要學(xué)會(huì)它就需要很長(zhǎng)的時(shí)間,而且你會(huì)發(fā)現(xiàn)即
使你用C++已經(jīng)好幾年了,你還會(huì)發(fā)現(xiàn)經(jīng)常有新東西可學(xué)。你想解決一個(gè)應(yīng)用領(lǐng)域
的問(wèn)題——比如說(shuō)從數(shù)據(jù)庫(kù)里面查詢(xún)數(shù)據(jù)、更改數(shù)據(jù)那樣的問(wèn)題,可是你卻需要首先
為C++頭痛一陣子才可以,是的,你精通C++,你可以很容易的回答我的問(wèn)題,可是
你有沒(méi)有想過(guò)你付出了多大的代價(jià)呢?我不是想過(guò)分的譴責(zé)C++,我本人喜歡C++,
我甚至建議一個(gè)認(rèn)真的開(kāi)發(fā)普通的應(yīng)用系統(tǒng)的程序員也去學(xué)習(xí)一下C++,C++中的一
些特性,比如說(shuō)指針運(yùn)算\模板\STL幾乎讓人愛(ài)不釋手,宏可以用幾個(gè)字符代替很
多代碼,對(duì)系統(tǒng)級(jí)的程序員來(lái)說(shuō),C++的地位是不可替代的,Java的虛擬機(jī)就是C++
寫(xiě)的。C++還將繼續(xù)存在而且有旺盛的生命力。
2.1.2 Java和C#
Java和C#相對(duì)于C++的不同最大的有兩點(diǎn):第一點(diǎn)是他們運(yùn)行在一個(gè)虛擬環(huán)境之
中,第二點(diǎn)是語(yǔ)法簡(jiǎn)單。對(duì)于開(kāi)發(fā)人員而言,在語(yǔ)法和語(yǔ)言機(jī)制的角度可以把Java
和C#視為同一種語(yǔ)言。C#更多的是個(gè)政治的產(chǎn)物而不是技術(shù)產(chǎn)物。如果不是Sun為
難微軟的話(huà),我想微軟不會(huì)費(fèi)盡心力推出一個(gè)和Java差不多的C++++,記得Visual
J++嗎,記得WFC嗎?看看那些東西就會(huì)知道微軟為Java曾經(jīng)傾注了多少心血。而且
從更廣泛的角度來(lái)說(shuō),兩者也是非常相似的——C#和Java面對(duì)的是同樣的問(wèn)題,面向
應(yīng)用領(lǐng)域的問(wèn)題:事務(wù)處理、遠(yuǎn)程訪問(wèn)、Web service、Web頁(yè)面發(fā)布、圖形界面。
那么在這一段中,我暫且用Java這個(gè)名字指代Java和C#兩種語(yǔ)言——盡管兩者在細(xì)節(jié)
上確實(shí)有區(qū)別。
Java是適合解決應(yīng)用領(lǐng)域的問(wèn)題的語(yǔ)言。最大的原因Java對(duì)于使用者來(lái)說(shuō)非常簡(jiǎn)
單。想想你學(xué)會(huì)并且能夠使用Java需要多長(zhǎng)時(shí)間,學(xué)會(huì)并且能夠使用C++要多長(zhǎng)時(shí)
間。由于Java很大程度上屏蔽了內(nèi)存管理問(wèn)題,而且沒(méi)有那么多為了微小的性能提
升定義的特殊的內(nèi)容(比如說(shuō),在Java里面沒(méi)有virtual 這個(gè)關(guān)鍵字,Java也不允
許你直接在棧上創(chuàng)建對(duì)象,Java明確的區(qū)分bool和整型變量),他讓你盡量一致的
方式操作所有的東西,除了基本數(shù)據(jù)類(lèi)型,所有的東西都是對(duì)象,你必須通過(guò)引用
來(lái)操作他們;除了這些之外,Java還提供了豐富的類(lèi)庫(kù)幫助你解決應(yīng)用問(wèn)題——因?yàn)?BR>它是面向應(yīng)用的語(yǔ)言,它為你提供了多線程標(biāo)準(zhǔn)、JDBC標(biāo)準(zhǔn)、GUI標(biāo)準(zhǔn),而這些標(biāo)
準(zhǔn)在C++中是不存在的,因?yàn)镃++并不是直接面向解決應(yīng)用問(wèn)題的用戶(hù),有人試圖在
C++中加入這些內(nèi)容,但并不成功,因?yàn)镃++本身太復(fù)雜了,用這種復(fù)雜的語(yǔ)言來(lái)實(shí)
現(xiàn)這種復(fù)雜的應(yīng)用程序框架本人就是一件艱難的事情,稍后我們會(huì)提到這種嘗試——
COM技術(shù)。漸漸的,人們不會(huì)再用C++開(kāi)發(fā)應(yīng)用領(lǐng)域的軟件,象MFC\QT\COM這一類(lèi)的
東西最終也將退出歷史舞臺(tái)。
2.1.3 Delphi
Delphi是從用C++開(kāi)發(fā)應(yīng)用系統(tǒng)轉(zhuǎn)向用Java開(kāi)發(fā)應(yīng)用系統(tǒng)的一個(gè)中間產(chǎn)物。它比C++
簡(jiǎn)單,簡(jiǎn)單的幾乎象Java一樣,因?yàn)樗暮?jiǎn)單,定義和使用豐富的類(lèi)庫(kù)成為可能,
而且Delphi也這么做了,結(jié)果就是VCL和其他的組件庫(kù)。而另一方面,它又比運(yùn)行
于虛擬環(huán)境的java效率要高一些,這樣在簡(jiǎn)單性和效率的平衡之中,Delphi找到了
自己的生存空間。而且預(yù)計(jì)在未來(lái)的一段時(shí)間之內(nèi),這個(gè)生存空間將仍然是存在
的。可以明顯的看出,微軟放棄了這個(gè)領(lǐng)域,他專(zhuān)注于兩方面:系統(tǒng)語(yǔ)言C++和未
來(lái)的Java(其實(shí)是.Net)。也許這對(duì)于Borland來(lái)說(shuō),是一件很幸運(yùn)的事情。如果我
能夠給Borland提一些建議的話(huà),那就是不要把Delphi弄得越來(lái)越復(fù)雜,如果那
樣,就是把自己的用戶(hù)趕到了C++或Java的領(lǐng)地。在虛擬機(jī)沒(méi)有最終占領(lǐng)所有的應(yīng)
用程序開(kāi)發(fā)領(lǐng)域之前,Delphi和Delphi的用戶(hù)仍然會(huì)生存得很好。
2.2 桌面應(yīng)用程序框架
目前真正成功的桌面應(yīng)用程序框架只有兩個(gè),一個(gè)是MFC,一個(gè)是VCL,還有一些
其他的,但事實(shí)上并未進(jìn)入應(yīng)用領(lǐng)域。遺憾的是我對(duì)兩個(gè)桌面應(yīng)用程序框架都不精
通。但這部不妨礙我對(duì)他做出正確的評(píng)價(jià)。
2.2.1 MFC
MFC(還有曾經(jīng)的OWL)是SDK編程的正常演化的結(jié)果,就象是C++是C的演化結(jié)果一
樣。MFC本身是一件了不起但不那么成功的作品,而且它過(guò)時(shí)了。這就是我的結(jié)論。
MFC凝聚了很多天才的智慧——當(dāng)然,OWL和VCL也一樣,侯捷的《深入淺出MFC》把這些
智慧擺在了我們的面前。但是這件東西用起來(lái)估計(jì)不會(huì)有人覺(jué)得很舒服,如果你一
直在用Java、VB或者Delphi,再回過(guò)頭來(lái)用MFC,不舒服的感覺(jué)會(huì)更加強(qiáng)烈。我不
能夠解釋MFC為什么沒(méi)有能夠最終發(fā)展成和VCL一樣簡(jiǎn)單好用的桌面程序框架,也許
是微軟沒(méi)精力或者沒(méi)動(dòng)力,總之MFC就是那個(gè)樣子了,而且也不會(huì)再有發(fā)展,它已
經(jīng)被拋棄了。我有時(shí)候想,也許基于C++這種復(fù)雜的語(yǔ)言開(kāi)發(fā)MFC這樣的東西本身就
是錯(cuò)誤的——可以開(kāi)發(fā)這樣的一個(gè)框架,但不應(yīng)當(dāng)要求使用它的人熟悉了整個(gè)框架之
后才能夠使用這個(gè)系統(tǒng),但很顯然,如果你不了解MFC的內(nèi)部機(jī)制,是不太可能把
它用好的,我不能解釋清楚為什么會(huì)出現(xiàn)這種現(xiàn)象。
2.2.2 VCL
相比之下VCL要成功的得多。我相信很多使用VCL的人可能沒(méi)有像MFC的用戶(hù)研究MFC
那樣費(fèi)勁的研究過(guò)VCL的內(nèi)部機(jī)制。但這不妨礙他們開(kāi)發(fā)出好用好看的應(yīng)用程序,
這就足夠了,還有什么好說(shuō)的呢?VCL給你提供了一種簡(jiǎn)單一致的機(jī)制,讓你可以
寫(xiě)出復(fù)雜的應(yīng)用程序。在李維的Borland故事那篇文章中曾經(jīng)說(shuō)過(guò),在Borland
C++3.1推出之后Borland就有人提出開(kāi)發(fā)類(lèi)似C++ Builder一類(lèi)的軟件,后來(lái)竟未成
行。是啊,如果C++Builder是在那個(gè)時(shí)候出現(xiàn)的,今天的軟件開(kāi)發(fā)領(lǐng)域?qū)?huì)是怎么
樣的世界呢?真的不能想象。
也許再過(guò)一段時(shí)間,這些都將不再重要。因?yàn)樾律恼Z(yǔ)言如Java和C#都提供了類(lèi)
似于VCL的桌面應(yīng)用程序框架。那個(gè)時(shí)候,加上Java和C#本身的簡(jiǎn)單性,如果他們
的速度有足夠塊,連Delphi這種語(yǔ)言也要消失了,還有什么好爭(zhēng)論的呢?只是對(duì)于
今天的桌面程序開(kāi)發(fā)人員來(lái)說(shuō),VCL確實(shí)是最好的選擇。
2.3企業(yè)應(yīng)用程序框架
2.3.1 Windows DNA
Windows DNA的起源無(wú)從探究了。隨著.Net的推出,事實(shí)上Windows DNA將成為歷
史的陳?ài)E。Windows DNA雖然是幾乎所有的企業(yè)應(yīng)用程序開(kāi)發(fā)人員都知道的一個(gè)名
詞,但我相信Windows DNA事實(shí)上應(yīng)用的最廣泛的是ASP而不是COM+。真正的COM開(kāi)
發(fā)有多少人真正的掌握了呢,更不要提COM+(我有必要解釋一下:COM+是COM的執(zhí)行
環(huán)境,它提供了一系列如事務(wù)處理、安全等基礎(chǔ)服務(wù),讓?xiě)?yīng)用程序開(kāi)發(fā)人員盡量少
在基礎(chǔ)架構(gòu)設(shè)計(jì)上花精力)——當(dāng)然我這里指的COM開(kāi)發(fā)不是指VB下的COM開(kāi)發(fā),所以
要這么說(shuō),是因?yàn)槲矣X(jué)得如果不能理解用C++進(jìn)行COM開(kāi)發(fā),也就不能真正的理解
COM技術(shù)。如果以一種技術(shù)沒(méi)有被廣泛理解和應(yīng)用作為失敗的標(biāo)志,那么Windows
DNA實(shí)際上是失敗了,但這不是它本身的錯(cuò),而是基于C++的COM技術(shù)的失敗造成
的。多層應(yīng)用、系統(tǒng)開(kāi)發(fā)角色分離的概念依然沒(méi)有過(guò)時(shí)。
2.3.2 J2EE
J2EE是第一套成功的企業(yè)應(yīng)用程序開(kāi)發(fā)框架。因?yàn)樗咽聞?wù)處理、遠(yuǎn)程訪問(wèn)、安全
這些概念帶入了尋常百姓家。這種成功我認(rèn)為要?dú)w因于Java的簡(jiǎn)單性。Java的簡(jiǎn)
單,對(duì)于J2EE容器供應(yīng)商來(lái)說(shuō)一樣重要。開(kāi)發(fā)一個(gè)基于Java的應(yīng)用服務(wù)器要比基于
C++的更容易。而且由于Java的簡(jiǎn)單性,應(yīng)用系統(tǒng)開(kāi)發(fā)者出錯(cuò)的機(jī)會(huì)也會(huì)少一些,
不會(huì)像C++的開(kāi)發(fā)者那樣受到那么多挫折。開(kāi)發(fā)基于Java的企業(yè)應(yīng)用系統(tǒng)的周期會(huì)
更短,這恐怕是不容爭(zhēng)辯的事實(shí)。不論如何,是J2EE讓事務(wù)處理、遠(yuǎn)程訪問(wèn)、安全
這些原來(lái)幾乎都是用在金融系統(tǒng)中的概念也被一般的企業(yè)用戶(hù)使用并從中獲得利益。
2.3.3 .NET
.Net有什么好說(shuō)的呢?其實(shí),它不過(guò)是微軟的J2EE。事務(wù)處理、安全、遠(yuǎn)程訪
問(wèn),這些概念在.Net中都找得到。更有力的說(shuō)明是,微軟也利用了.Net實(shí)現(xiàn)了一個(gè)
Pet Store。所以,.Net與J2EE幾乎是可以完全對(duì)等的。但微軟確實(shí)是一家值得尊
敬的公司——我指從技術(shù)上,象Web form這種東西,我相信很多Web應(yīng)用開(kāi)發(fā)者都?jí)?BR>想過(guò)甚至自己實(shí)現(xiàn)過(guò),但Sun卻一直無(wú)動(dòng)于衷,而且似乎Borland也沒(méi)有為此作過(guò)太
多努力,好像有過(guò)類(lèi)似的東西,但肯定是不怎么成功——Borland已經(jīng)很讓人敬佩
了,我們也許無(wú)法要求太多。
2.4 COM技術(shù)
COM應(yīng)當(dāng)是個(gè)更廣泛的詞匯,其實(shí)我覺(jué)得AxtiveX、OLE、Automation、COM+都應(yīng)當(dāng)
提及,因?yàn)槿绻悴焕斫釩OM,上面的東西你是無(wú)法理解的。而且,我只是想說(shuō)明
COM是一種即將消亡的技術(shù),僅僅說(shuō)說(shuō)COM的復(fù)雜性和他的問(wèn)題就夠了,所以不會(huì)提
及那些東西。
為什么會(huì)出現(xiàn)COM技術(shù)?COM的根本目標(biāo)是實(shí)現(xiàn)代碼的對(duì)象化的二進(jìn)制重用,進(jìn)而實(shí)
現(xiàn)軟件的組件化、軟件開(kāi)發(fā)工作的分工。這要求他做到兩點(diǎn):第一,能夠跨越不同
的語(yǔ)言,第二,要跨越同一種語(yǔ)言的不同編譯器。COM技術(shù)為這個(gè)目標(biāo)付出了沉重
的代價(jià),尤其是為了跨越不同的編譯器,以至于無(wú)論對(duì)于使用者而言還是開(kāi)發(fā)者而
言,他都是一個(gè)痛苦的技術(shù)。但幸運(yùn)的事,這一切終歸要結(jié)束了。
讓我們從這個(gè)目的出發(fā)看看COM為什么會(huì)成為它現(xiàn)在的樣子。
其實(shí)COM不是什么新玩意,最初的DLL就是重用二進(jìn)制代碼的技術(shù)。DLL在C的年代可
能還不錯(cuò),但到了C++的年代就不行了。原因在于如果你在.h文件中改變了類(lèi)定義
(增加或者減少了成員變量),代碼庫(kù)用戶(hù)的代碼必須重新編譯才可以,否則用戶(hù)
的代碼會(huì)按你的舊類(lèi)的結(jié)構(gòu)為你的新類(lèi)分配內(nèi)存,這將產(chǎn)生什么后果可想而知。這
就是為什么通過(guò)接口繼承和通過(guò)接口操作對(duì)象成為COM的強(qiáng)制規(guī)范的原因,能夠通
過(guò)對(duì)象的方式組織代碼是COM的重要努力。
那么著名的IUnknown 接口又是怎么回事呢?這是為了讓使用不同編譯器的C++開(kāi)發(fā)
人員能夠共享勞動(dòng)成果。首先看QueryInterface,因?yàn)镃OM是基于接口的,那么一
個(gè)類(lèi)可能實(shí)現(xiàn)了幾個(gè)接口,而對(duì)于用戶(hù)來(lái)說(shuō),你又只能通過(guò)操作接口來(lái)操作類(lèi),這
樣你必須把類(lèi)造型成某個(gè)特定的接口,使用Dynamic_cast嗎?不行,因?yàn)檫@是編譯
器相關(guān)的,那么,就只好把它放在類(lèi)的實(shí)現(xiàn)代碼中了,這就是QueryInterface的由
來(lái)。至于AddRef和Release,他們產(chǎn)生的第一個(gè)原因是delete這個(gè)操作要求一個(gè)類(lèi)
具有虛析構(gòu)函數(shù)(否則的話(huà),他的父類(lèi)的析構(gòu)函數(shù)將不會(huì)被調(diào)用),但不幸的是不
同的編譯器中虛析構(gòu)函數(shù)在vtbl中的位置并不相同,這就是說(shuō)你不能讓用戶(hù)直接調(diào)
用delete,那么你的COM對(duì)象必須提供自己刪除自己的方法;另外的原因在于一個(gè)
COM對(duì)象可能作為幾個(gè)接口在被用戶(hù)同時(shí)使用,如果用戶(hù)粗暴的刪掉了某個(gè)接口,
那么其他的接口也就不能用了,這樣,只好要求用戶(hù)在想用一個(gè)接口的時(shí)候通過(guò)
AddRef通知COM對(duì)象“我要使用你了,你多了一個(gè)用戶(hù)”,而在不用之后要調(diào)用
Release告訴COM對(duì)象“我不用你了,你少了一個(gè)用戶(hù)”,如果COM對(duì)象發(fā)現(xiàn)自己沒(méi)有
用戶(hù)了,它就把自己刪掉。
再看看詭異的HRESULT,這是跨語(yǔ)言和跨編譯器的代價(jià)。其實(shí),異常處理是物競(jìng)天
擇的結(jié)果——連一直用效率作標(biāo)榜的C++都肯犧牲效率來(lái)實(shí)現(xiàn)這個(gè)try-catch,可見(jiàn)它
的意義,但COM為了照顧那些低級(jí)的語(yǔ)言居然拋棄了這個(gè)特征——產(chǎn)生的結(jié)果就是
HRESULT。我們可以看看他是多么愚蠢的東西。首先,我們要通過(guò)一個(gè)整數(shù)來(lái)傳遞
錯(cuò)誤信息,通過(guò)IErrorInfo來(lái)查找真正的錯(cuò)誤描述,本來(lái)在現(xiàn)代語(yǔ)言中一個(gè)try-
catch可以解決的問(wèn)題,現(xiàn)在我們卻需要讓用戶(hù)和開(kāi)發(fā)者都走很多路才能解決,你
怎么評(píng)價(jià)這個(gè)結(jié)果?其次,由于這個(gè)返回計(jì)算結(jié)果的位置被占用了,我們不得不用
怪異的out參數(shù)來(lái)返回結(jié)果。想想一個(gè)簡(jiǎn)單的 int add(int op1,int op2)在COM中
竟然要變成HRESULT add(int op1,int op2,int *result),我不知道你對(duì)此作何感
想。而且由于COM的方法無(wú)法返回一個(gè)對(duì)象而只能返回一個(gè)指針,為了完成一個(gè)簡(jiǎn)
單的std::string GetName()這一類(lèi)的操作,你要費(fèi)多少周折——你需要先分配一塊
內(nèi)存空間,然后在COM實(shí)現(xiàn)中把一個(gè)字符串拷貝到這個(gè)空間,用完了你要?jiǎng)h掉這個(gè)
空間,不知道你是否覺(jué)得這種工作很幸福,反正我覺(jué)得很痛苦。
還有COM為了照顧那些解釋性的語(yǔ)言,又加入了Automation技術(shù),你有沒(méi)有為此覺(jué)
得痛苦?本來(lái)一個(gè)簡(jiǎn)單的方法調(diào)用,現(xiàn)在卻需要傳給你一個(gè)標(biāo)志變量,然后讓你根
據(jù)這個(gè)標(biāo)志變量去執(zhí)行相應(yīng)的操作。(這一點(diǎn)我現(xiàn)在仍然不明白,為什么解釋性的
語(yǔ)言需要通過(guò)這個(gè)方式來(lái)執(zhí)行一個(gè)方法)。
“我受夠了,我覺(jué)得頭痛”,你會(huì)說(shuō),是啊,我想所有的人都受夠了,所有這些因素
實(shí)際上是把COM技術(shù)變成了一頭讓人無(wú)法駕馭的怪獸。人對(duì)復(fù)雜事物的掌控能力終
究是有限的,C++本身已經(jīng)夠復(fù)雜了, COM的復(fù)雜性已經(jīng)超出了我們大部分人的控
制能力,你需要忍受種種痛苦得到的東西與你付出的代價(jià)相比是不是太不值得了?
我們學(xué)習(xí)是為了解決問(wèn)題,而現(xiàn)在我們卻需要為了學(xué)習(xí)這件事情本身耗費(fèi)太多的精
力。這些痛苦的東西太多了,我在這里說(shuō)到的,其實(shí)只是一小部分而已。計(jì)算機(jī)技
術(shù)是為人類(lèi)服務(wù)的,而不是少數(shù)人的游戲(我想COM技術(shù)可能是他的設(shè)計(jì)者和一部
分技術(shù)作者的游戲),難道我們?cè)敢獬蔀橛?jì)算機(jī)的奴隸嗎?通過(guò)一種過(guò)于復(fù)雜的技
術(shù)拋棄所有的人其實(shí)等于被所有的人拋棄,這么多年中選擇J2EE的人我相信不乏高
手,你是不是因?yàn)镃OM的過(guò)于復(fù)雜才選擇J2EE的?因?yàn)樗梢杂煤?jiǎn)單的途徑實(shí)現(xiàn)差
不多的目標(biāo)——軟件的“二進(jìn)制”重用、組件化、專(zhuān)業(yè)分工(容器開(kāi)發(fā)商和應(yīng)用開(kāi)發(fā)商
的分工)。事實(shí)上,你是被微軟所拋棄的,同時(shí),你也拋棄了微軟。
現(xiàn)在讓我們回來(lái)吧,我把你帶進(jìn)了COM的迷宮,現(xiàn)在讓我把你領(lǐng)回來(lái)。再讓我們看
看COM到底想實(shí)現(xiàn)什么目標(biāo),其實(shí)很簡(jiǎn)單,不過(guò)是代碼的二進(jìn)制重用,也就是說(shuō)你
不必給別人源代碼,而且你的組件可以象計(jì)算機(jī)硬件那樣“即插即用”。我們回過(guò)頭
來(lái)看看Java,其實(shí),這種二進(jìn)制重用的困難是C++所帶來(lái)的(這不是C++本身的錯(cuò),
而是靜態(tài)編譯的錯(cuò)),當(dāng)Java出現(xiàn)的時(shí)候,很多問(wèn)題已經(jīng)不存在了。你不需要一個(gè)
頭文件,因?yàn)镴ava的字節(jié)碼是自解釋的,它說(shuō)明了自己是什么樣子的,可以做什么
事情,不像C++那樣需要一個(gè)頭文件來(lái)解釋這些事情;也不需要事先了解對(duì)象的內(nèi)
存結(jié)構(gòu),因?yàn)閮?nèi)存是在運(yùn)行的時(shí)候才分配的。
如果我們現(xiàn)在再回過(guò)頭來(lái)解決COM要解決的問(wèn)題,你會(huì)怎么做呢?首先你會(huì)不再選
擇C++這種語(yǔ)言來(lái)實(shí)現(xiàn)代碼的“二進(jìn)制”重用,其次,你會(huì)把所有的語(yǔ)言編譯成同樣
的“二進(jìn)制” 代碼(實(shí)際上,應(yīng)當(dāng)說(shuō)是字節(jié)碼),這顯然是更聰明的做法,從前COM
試圖在源代碼的級(jí)別抹平二進(jìn)制層次的差異,這實(shí)際上是讓人在做本來(lái)應(yīng)當(dāng)由機(jī)器
做的事情,很愚蠢是嗎?但他們一直做了那么多年,而且把這個(gè)痛苦帶給了整個(gè)計(jì)
算機(jī)世界——因?yàn)樗麄冋莆罩聦?shí)的標(biāo)準(zhǔn),為了用戶(hù),為了利潤(rùn),為了能夠在
Windows上運(yùn)行,盡管你知道你在做著一個(gè)很不聰明的事情,但你還是做了。
COM技術(shù)為了照顧VB這個(gè)小兄弟和實(shí)現(xiàn)統(tǒng)一二進(jìn)制世界的野心,實(shí)在浪費(fèi)了太多的
精力。首先,落后的東西的消亡是必然的,就象C、Pascal在應(yīng)用領(lǐng)域的消亡一
樣,Basic一點(diǎn)一點(diǎn)的改良運(yùn)動(dòng)是不符合歷史潮流的做法,先進(jìn)的東西和落后的東
西在一起,要么先進(jìn)的東西被落后的東西拖住后腿,要么是同化落后的東西,顯然
我們更愿意看見(jiàn)后者,現(xiàn)在Basic終于被現(xiàn)代的計(jì)算機(jī)語(yǔ)言同化了。其次,統(tǒng)一二
進(jìn)制世界好像不是那么簡(jiǎn)單的事情,而且也沒(méi)什么必要,微軟的COM技術(shù)奮戰(zhàn)了10
年,現(xiàn)在也只有他自己和Borland支持,.Net終于放棄了這個(gè)野心。這一切終于要
結(jié)束了。過(guò)去J2EE高歌猛進(jìn)地占領(lǐng)著應(yīng)用開(kāi)發(fā)的領(lǐng)地,COM在這種進(jìn)攻面前多少顯
得蒼白無(wú)力。現(xiàn)在微軟終于也有了可以和J2EE一較長(zhǎng)短的.NET,對(duì)于開(kāi)發(fā)人員來(lái)
講,基于字節(jié)碼的組件的二進(jìn)制重用現(xiàn)在是天經(jīng)地義的事情;你不用再為了能夠以
類(lèi)方式發(fā)布組件做那么多亂七八糟的事情,因?yàn)楝F(xiàn)在所有的東西本來(lái)就是類(lèi)了;實(shí)
現(xiàn)軟件開(kāi)發(fā)的分工也很自然,你是專(zhuān)業(yè)人員,就用C#吧,你是應(yīng)用開(kāi)發(fā)人員,你喜
歡用VB.Net,你就用吧,反正你們寫(xiě)的東西最終都被翻譯成了一樣的語(yǔ)言(其實(shí)我
覺(jué)得這一點(diǎn)意義不大,因?yàn)橐恍┎荒敲春糜玫恼Z(yǔ)言被淘汰是正常的事情,C風(fēng)格成
為程序設(shè)計(jì)語(yǔ)言的主流風(fēng)格,肯定是有它的原因的,語(yǔ)言的統(tǒng)一其實(shí)是大勢(shì)所趨,
就象中國(guó)人民都要說(shuō)普通話(huà)一樣,所以我覺(jué)得Java不支持多語(yǔ)言算不上缺點(diǎn)——本來(lái)
就是一種很好看很好用的語(yǔ)言了,為什么要把簡(jiǎn)單問(wèn)題復(fù)雜化呢?)。
COM不會(huì)在短期內(nèi)死去,因?yàn)槲夜烙?jì)微軟還不會(huì)馬上用C#開(kāi)發(fā)Office和Windows的圖
形界面部分,但我相信COM技術(shù)退出歷史舞臺(tái)的日子已經(jīng)不遠(yuǎn)了,作為一般的開(kāi)發(fā)
人員,忘了這段不愉快的歷史吧——你將不會(huì)在你的世界里直接和COM打交道。
若干年以后,我想COM也許會(huì)成為一場(chǎng)笑話(huà),用來(lái)諷刺那種野心過(guò)大、鉆牛角尖的
愚蠢的聰明人。
結(jié)論
說(shuō)了很多,應(yīng)該是有個(gè)結(jié)論的時(shí)候了。我似乎做了一件冒天下之大不韙的事情,
因?yàn)槲以u(píng)價(jià)了主流技術(shù),還要試圖進(jìn)行比較,好像某個(gè)名人說(shuō)過(guò):“C++Builder也
好,Visual C++也好,能在市場(chǎng)上立足,肯定都是有自己的過(guò)人之處的,而且一個(gè)
人精通數(shù)種開(kāi)發(fā)語(yǔ)言、數(shù)種開(kāi)發(fā)工具是不可能的事情”,言下之意就是說(shuō)你不要對(duì)
這些東西妄加評(píng)論,但怎么可以不評(píng)論?好像高手都不屑于說(shuō)哪種語(yǔ)言好、哪種語(yǔ)
言壞,我不知道什么時(shí)候形成了這種風(fēng)氣。簡(jiǎn)單地說(shuō)C++比Java好或者Java比C++好
顯然是愚蠢的行為,但如果讓你用Java寫(xiě)驅(qū)動(dòng)程序,用C++開(kāi)發(fā)一個(gè)MIS系統(tǒng)是不是
愚蠢的行為呢?顯然更愚蠢。我想,作為一個(gè)獨(dú)立的能思考的人,外界的東西對(duì)你
而言總是有好有壞,而且你的生命有限,你還要享受你的生活,所以你必須做出選
擇。所以,起碼評(píng)價(jià)這些東西對(duì)我自己而言是正確的——只要我有能力評(píng)價(jià),那我就
說(shuō)出我的評(píng)價(jià)吧。
對(duì)于計(jì)算機(jī)語(yǔ)言來(lái)說(shuō),未來(lái)真正重要的語(yǔ)言只有三種C++、Java和C#。
C++將更適合于專(zhuān)業(yè)的計(jì)算機(jī)公司編寫(xiě)圖形界面系統(tǒng)(比如KDE)、虛擬機(jī)(比如
Java虛擬機(jī)或者.Net運(yùn)行環(huán)境)、殺毒軟件或者其他的盒裝軟件(比如說(shuō)
Photoshop、Dream weaver)這一類(lèi)的東西。而且C++適合程序員做學(xué)習(xí)之用,能對(duì)
C++有一定理解的程序員往往也應(yīng)該能更深刻的理解Java、C#,這有助于編寫(xiě)更好
的軟件。
如果是開(kāi)發(fā)為客戶(hù)定制的應(yīng)用系統(tǒng)Java、C#是更好的選擇。包括桌面應(yīng)用和Web應(yīng)
用。至于其他的語(yǔ)言比如VB.Net其實(shí)并沒(méi)有太大的意義。
Delphi在未來(lái)一段時(shí)間將繼續(xù)存在,而且活得不錯(cuò)。最重要的原因在于,第一它有
一套豐富的組件庫(kù),第二它效率相對(duì)算高的,第三它簡(jiǎn)單。如果虛擬機(jī)的執(zhí)行效率
趕不上Delphi,它就有存在的理由,但從過(guò)去的Visual J++來(lái)看,微軟的虛擬機(jī)做
得確實(shí)可以很好,加上.Net的組件庫(kù)和C#的簡(jiǎn)單性并不差,所以從長(zhǎng)遠(yuǎn)來(lái)看Delphi
可能不那么樂(lè)觀。
其實(shí)上面的比較也包含了桌面應(yīng)用程序框架的比較。在現(xiàn)在來(lái)說(shuō)VCL無(wú)疑最好的,
MFC已經(jīng)退出歷史舞臺(tái)。.Net中所帶的桌面應(yīng)用程序框架將最終統(tǒng)一桌面應(yīng)用領(lǐng)域
(但不包括微軟和Borland這樣的專(zhuān)業(yè)公司,因?yàn)樗麄円鞒鲎詈糜枚倚首罡?BR>的軟件)。至于Java中所帶的桌面應(yīng)用程序框架,實(shí)在讓人哭笑不得。這個(gè)結(jié)論的
變數(shù)是.Net運(yùn)行環(huán)境的執(zhí)行效率。如果.Net中的虛擬機(jī)象Java的一樣,那微軟就倒
霉了,它等于放棄了桌面應(yīng)用開(kāi)發(fā)工具領(lǐng)域,但根據(jù)微軟在Visual J++上的成就和
他推廣.Net的背水一戰(zhàn)的駕式,.Net在桌面領(lǐng)域失敗的可能性不大(但不是沒(méi)有,
起碼基于COM的技術(shù)在企業(yè)應(yīng)用領(lǐng)域幾乎可以說(shuō)是全軍覆沒(méi))。
在企業(yè)應(yīng)用程序框架領(lǐng)域,最終只有J2EE和.Net可以決一雌雄。我沒(méi)有提到
CORBA,它也可以算是企業(yè)應(yīng)用程序框架,但他的聲勢(shì)和J2EE或者.NET實(shí)在不能同
日而語(yǔ),而且最重要的是只有Borland一家大公司支持它(SUN、IBM、BEA、
Borland支持J2EE,微軟就不用說(shuō)了),所以就不詳細(xì)說(shuō)他了。
那么最終誰(shuí)會(huì)贏呢?我想微軟贏的可能性大一些。這樣說(shuō)可能讓很多人不快,而且
IBM的厲害也是有目共睹的。但這并不是純技術(shù)問(wèn)題,就象Windows NT蠶食Unix的
領(lǐng)土那樣,那時(shí)候微軟也是孤軍作戰(zhàn)。J2EE的問(wèn)題在于第一:混亂,第二,價(jià)高。
我相信很多人都對(duì)這兩點(diǎn)有過(guò)不快的經(jīng)歷。你知道寫(xiě)給Weblogic的應(yīng)用程序不是很
順利地就可以移植到Websphere上的,反過(guò)來(lái)也一樣。但.Net就不一樣了,那是微
軟一個(gè)人的作品,根本不存在移植的問(wèn)題。如果J2EE陣營(yíng)不想敗在這一點(diǎn)上,有三
個(gè)辦法,第一種就是通過(guò)制定統(tǒng)一的標(biāo)準(zhǔn)徹底消滅移植問(wèn)題,第二種是開(kāi)發(fā)一種好
用的部署工具(不能象JBuilder那么大、那么慢:),屏蔽不同的應(yīng)用程序容器之
間的區(qū)別,第三種,也是最不可能的,就是J2EE陣營(yíng)有人能夠一統(tǒng)天下。顯然,這
三種解決辦法都不太現(xiàn)實(shí)。
第二點(diǎn)價(jià)高,這是SUN、IBM、BEA、ORACLE傳統(tǒng),也是它們一直讓微軟的進(jìn)攻屢屢
得手的軟肋。我一直不太能明白他們的西就為什么那么貴。這樣想一想:微軟的
.Net SDK白送給你,BEA的Weblogic一個(gè)CPU的License兩萬(wàn),如果你兩種技術(shù)都
會(huì),如果你給客戶(hù)的系統(tǒng)報(bào)價(jià)一樣,你選哪種開(kāi)發(fā)技術(shù)?這一點(diǎn)實(shí)在讓人覺(jué)得無(wú)可
奈何。J2EE有的東西,.Net也有(除了不能跨平臺(tái)),技術(shù)上的細(xì)微差別在巨大的
價(jià)格差異面前還有什么意義呢?
當(dāng)然,SUM、IBM這些大公司也不是等閑之輩。就象Windows NT沒(méi)有消滅Unix一樣,
J2EE應(yīng)當(dāng)會(huì)像Windows NT和Unix的共存一樣和.Net共存,只是我想.Net恐怕會(huì)占上
風(fēng)。
閑話(huà)
說(shuō)完了該說(shuō)的技術(shù)問(wèn)題,說(shuō)說(shuō)閑話(huà)吧。有的話(huà)放在心里覺(jué)得不說(shuō)出來(lái)不舒服,且讓
我一吐為快:)
給入門(mén)程序員的建議
不知道我在學(xué)計(jì)算機(jī)的時(shí)候是不是走了彎路。但我想如果讓我重新開(kāi)始學(xué)寫(xiě)程序
的話(huà),我會(huì)采用一些不同的辦法。如果你也正在想成為一個(gè)程序員,這些也許會(huì)對(duì)
你有幫助。
我覺(jué)得可能大概要分幾個(gè)階段,第一個(gè)階段應(yīng)該是找一門(mén)簡(jiǎn)單的語(yǔ)言入門(mén),比如
Java或者C#都應(yīng)該比較合適,選一本簡(jiǎn)單的帶例子的書(shū)(最好不要太厚),按部就
班的把書(shū)學(xué)完。這時(shí)候可能還有些懵懵懂懂,但沒(méi)關(guān)系,可以開(kāi)始做個(gè)小小的軟件
了,重要的事你要自己用那種語(yǔ)言的方式想思考,如果有項(xiàng)目做,當(dāng)然更好。之
后,你會(huì)覺(jué)得有點(diǎn)感覺(jué)了。如果你象我一樣不是科班出身的,接下來(lái)應(yīng)當(dāng)補(bǔ)習(xí)一下
計(jì)算機(jī)專(zhuān)業(yè)的課程,我覺(jué)得最重要的是數(shù)據(jù)結(jié)構(gòu)——那些東西你可能永遠(yuǎn)都不會(huì)自己
做,C++中有漂亮的STL,Java中也為你實(shí)現(xiàn)了大部分東西,但我覺(jué)得真的有必要學(xué)
習(xí)那些內(nèi)容,這會(huì)加強(qiáng)你用計(jì)算機(jī)語(yǔ)言思考問(wèn)題的能力。在進(jìn)一步,如果你的入門(mén)
語(yǔ)言不是C++,那你可以補(bǔ)習(xí)一下C++,盡管你可能永遠(yuǎn)都不會(huì)用C++開(kāi)發(fā)程序。C++
在現(xiàn)在的計(jì)算機(jī)世界就象是普通話(huà)一樣,而且它能讓你很容易的理解其他語(yǔ)言中難
以理解的問(wèn)題。
學(xué)完了C++,那你應(yīng)當(dāng)就已經(jīng)不是一個(gè)初級(jí)程序員了,歡迎你進(jìn)入計(jì)算機(jī)軟件開(kāi)發(fā)
的世界。
印度的軟件業(yè)
我記得好像在CSDN上看見(jiàn)過(guò)一篇文章,極力的鼓吹印度的軟件業(yè)。而且我記得他
好像說(shuō)過(guò)一句很刻薄的話(huà)“我們公司那些B大的和T大的,一個(gè)一個(gè)特別牛,牛得看
不見(jiàn)人……做起界面極盡奇跡淫巧之能事……”,諸如此類(lèi),總之認(rèn)為程序員只有象印
度的高中生那樣乖乖的、懂得UML、會(huì)看Function Specification才算是真正的程
序員。我當(dāng)時(shí)覺(jué)得很不舒服。我想這個(gè)人應(yīng)該不是B或T大的——哦,別誤會(huì),我也不
是——但我覺(jué)得好像B大的T大的人沒(méi)象他說(shuō)的那樣。而且我不明白為什么中國(guó)的軟件
業(yè)為什么一定要向印度看齊?作為一家公司,你想獲取商業(yè)利潤(rùn),學(xué)習(xí)印度無(wú)可厚
非,你大可以找一大堆高中生培訓(xùn)成編程藍(lán)領(lǐng)(我沒(méi)有輕視高中生的意思,我相信
有很多“高中生”在技術(shù)領(lǐng)域取得的成就是讓我望塵莫及的),但你不應(yīng)該因此就把
有血有肉有個(gè)性的程序員扁得一錢(qián)不值。說(shuō)實(shí)話(huà),所謂的編程藍(lán)領(lǐng)不過(guò)是工廠里面
的裝配工,如果有一天工廠里面換了自動(dòng)化的設(shè)備,這些人就全成了廢人!而你要
知道并不是這些裝配工發(fā)明了自動(dòng)化機(jī)器。我想這種話(huà)用不著多說(shuō),子曰“過(guò)猶不
及”,你可以喜歡變成藍(lán)領(lǐng),但不要把問(wèn)題推向極端,把問(wèn)題推向極端往往就會(huì)犯
錯(cuò)誤。我們中國(guó)可以在某種程度上學(xué)習(xí)印度,但好像我們更應(yīng)該學(xué)習(xí)美國(guó)——只是我
們現(xiàn)在沒(méi)那么富裕——可是微軟也不是從一開(kāi)始就是這樣一個(gè)偉大的帝國(guó)的,IBM也
一樣。
附錄
參考書(shū)目
閱讀如下圖書(shū)有助于理解本文內(nèi)容。而且這些書(shū)都是好書(shū),值得一讀。
* 《標(biāo)準(zhǔn)C++寶典》
* 《C++編程思想》
* 《深入淺出MFC2e》
* 《COM技術(shù)內(nèi)幕》
* 《COM本質(zhì)論》
* 《Java編程思想》
* 《精通EJB》第二版
* 《J2EE編程指南》
* 《Delphi 6開(kāi)發(fā)人員指南》
* 《C#寶典》
* 《微軟 .Net戰(zhàn)略》