因為文章比較長,這里的BBS有限制,所以分為兩篇
*******************************
自從2005年3月8日下午16時“十年MFC經歷認識的Microsoft技術”以帖子的方式發(fā)表于CSDN論壇后,引起了許多網友得好評,使得筆者誠惶誠恐,考慮到該貼過長(人氣指數為5000),因此轉移到Blog上,許多網友對此帖的評語只好省略,在此鄙人謝過了!為感謝網友的支持,本人希望今后能發(fā)出新的帖子以回報網友對我的鼓勵,再一次謝謝!
初識MFC
我最初知道MFC大概是在1993年,那個時候Visual C++還沒面世,當時Microsoft的C++編譯器還很弱,官方的名字是Microsoft C/C++ 7.0,MFC的版本是1.0,幾乎沒有引起什么反響,那個時期最好的C++開發(fā)環(huán)境是Borland C++ 3.1,其實,大概是1992年11月份,一個偶然的機會,我領略到Borland公司的厲害,記不得在什么地方,我看到一個絕妙的集成開發(fā)環(huán)境,即Turbo C++ 3.0 for Windows,這是我記憶中第一個真正的Windows環(huán)境下的C++集成開發(fā)環(huán)境,那種激動的感覺至今仍記憶猶新,不客氣的說,當時至少在C++方面,Microsoft與Borland不是一個水平的,Borland明顯的要高于Microsoft ,Borland的產品在技術上給我留下深刻的印象。那個時候Microsoft最好的開發(fā)平臺是Visual Basic 3.0,而Borland的Delphi正處于開發(fā)階段(Delphi 的代碼名稱是:“VB Killer”)……,想起這些十幾年前的往事,我不禁感慨萬千。
十幾年來,我用過許多開發(fā)環(huán)境,關于Visual Basic,我用過最早的DOS版本,Windows版的Visual Basic我基本上全都用過,至今我還記得每個版本的VB安裝盤磁盤的盤數。同樣,我用過各個版本的Delphi,特別是Delphi 2.0,給我留下極好的印象。Delphi提供真正編譯的可視化開發(fā)環(huán)境,那個時候(1994年左右),Delphi就可以開發(fā)帶有GUI的動態(tài)鏈接庫,你可以想象,在Microsoft Access 2.0的應用程序中可以加載一個Delphi Form并進行程序交互,那種感覺真是棒極了。
Borland C++是我心中無法抹掉的遺憾,從Turbo C到C++ Builder,我深刻的體驗到Borland的輝煌和無奈,Delphi從VB Killer走到為VB護航(你可以想象Delphi一步到位的ActiveX 控件開發(fā)技術有多牛,早期的VB有多土,早期的VB不能開發(fā)動態(tài)鏈接庫,因此無法開發(fā)ActiveX 控件,想起來真令人噓唏不已),Borland C++的命運也是不濟。Borland C++ 3.1的輝煌永遠不再了,十幾年的開發(fā)工作中,我在C++上投入了大量的精力,Borland C++曾經給我?guī)頍o數的激動,然而這個經典的名字卻在與Microsoft的競爭中漸漸的流逝了……。
MFC4.0的出現,使得人們感覺Microsoft在C++方面趕上來了,這一版的MFC是Win95推出后出現在Visual C++ 4中(Microsoft沒有VC 3,VC4以前的版本是2.2、2.1、2.0、1.51、1.5、1.0)。也許是對Borland C++的潛意識的失望,我不知不覺的接受了MFC,VC 4.2推出時,我通過正常渠道購買了這個編譯器的企業(yè)版。
關于Microsoft
關于Microsoft,有無數的人要對這個名字敘說感覺,這個令人討厭的名字!不知道是喜歡還是憎惡,你是程序員,你的心思可能就要因Microsoft的存在而動,即使你用Linux,你可能也是因為Microsoft技術因素。多少年來,這個名字每天都出現在你、我、他的面前,因為你不得不面對Windows的存在,可是你憎恨這個名字嗎?你討厭這個名字嗎?我不知道是否已經對這個名字麻木了。1998年我個人訂了Microsoft MSDN Universal 版,我開始比較全面接觸這個公司的開發(fā)技術,你可以想象,1998年當你面對上百張技術光盤的時候,你就知道什么叫做“厚度”,當我們有時說出“趕上”或 “達到”Microsoft某些產品的水平的時候,可能我們缺乏對這個公司“厚度”的真實了解。進入MSDN,我感覺Microsoft簡直不是一個“公司”,而是(或者正在形成)一個“社會”。當時著名的技術網站http://www.全部的技術資料是可下載的(那個時候http://www.提供整個網站內容下載服務,大約3M左右),大名鼎鼎的www.codeproject.com還不存在。一開始,我始終潛意識在技術上對比Microsoft與Borland,應當說技術上Borland不比Microsoft弱,即使現在也有人持有這個看法,可是為什么Borland走到今天這個地步?而Microsoft卻如日中天?若干年前,這兩個公司競爭何等激烈,而現在卻是另一番“合作”的景象?可能很多人想過,如果Borland不存在,對Microsoft不是更有力嗎?其實Microsoft可能精通中國歷史,讀過《三國》、十分了解戰(zhàn)國時期的中國,其實Borland形式上的存在,對Microsoft是十分有利的,至少形式上還有競爭對手,而事實上Borland已經受控于Microsoft(Microsoft是Borland的大股東)。你可以看到一些微妙的現象:Borland為Microsoft提供了大量的人才,其中包括Delphi總設計師以及Borland C++編譯器的核心成員;同時也為Microsoft .NET提供強有力的護航服務(看看C# Builder、Delphi .NET)。1998年Microsoft 的COM技術基本已經成熟,這個技術使人感到震撼,當時Microsoft的對手們提出“OpenDoc”用于對抗“COM”,你看看“OpenDoc”陣營的幾個成員:IBM、Apple、Borland、Novell,你會感到這個陣營十分豪華、強大。但結果卻差強人意,“OpenDoc”無疾而終,而“COM”依然生機勃勃。
有人說“COM”沒落了,那么就太不了解Microsoft了。在與“OpenDoc”的競爭中,“COM”是個徹底的勝利者,在與“Java”的競爭中,“COM”成功的進化了,在這個過程中Microsoft體現了強大的吸收能力、以及無法想象的韌勁。.NET只不過是COM的“別名”而已。對于一個經驗豐富的C++程序員而言,.NET就是COM的進化,而Microsoft內部.NET就是“COM 3.0”(OLE2就是COM 2.0),而“CLR”就是一個不擇不扣的COM對象。曾經有人問我,既然牛頓時代就奠定了基礎(想想著名的牛頓-萊布尼茨公式),幾百年后的今天,數學還研究“微積分”嗎?回答當然是依然在研究!“微積分”早期是針對函數的,現代“微積分”是針對“流形(Manifold)、纖維叢(Fiber Bundle)”的,概念深奧了,可是基本思想不變,只是“微積分”的思想得到合理的延拓與進化,你了解Microsoft嗎?Microsoft Research有一批超一流的數學家在為Microsoft工作,其中一些是斐爾茲獎的得主,Microsoft正在實現如同“微積分”進化到“微分流形”一樣將“COM”進化到“.NET”。從科學概念角度上分析COM與Java,可能COM更全面、精確,從實現的成熟度上Java可能更成熟,可是你看到,Microsoft正在不緊不慢的追趕。Microsoft令人聯想起戰(zhàn)國時期的強秦。
戰(zhàn)國時期的秦國,采取“遠交近攻”“撫弱掠強”等措施傲視六國,今天的Microsoft也是這樣,VB1.0時,Microsoft推出“VBX”控件技術,眾多的小公司得以生存,Microsoft自己不開發(fā)“VBX”組件,同樣“VBX”進化為“OCX”時,Microsoft并不十分強大,可是這種試探得到眾多小公司的響應。1997年Microsoft Office 97、1998年Microsoft推出Visual Studio 6.0,給眾多中、小公司提供了生存、發(fā)展的機會,例如Microsoft Office 97中集成了Visual Basic for Application 5.0,這項技術使得幾百家軟件開發(fā)商與Microsoft簽署了VBA技術許可協議,即使AutoDesk這樣的公司都與Microsoft簽署了這個協議,這個協議使得每個集成VBA的產品的給個用戶許可為Microsoft付40$的許可費,如果你了解VSIP(Visual Studio Integration Protocol)協議,以及有多少公司簽訂了VSIP協議,你就真正感覺到Microsoft的可怕;Microsoft Office 97、Visual Studio 6.0的用戶界面十分漂亮,為什么Microsoft自己的開發(fā)工具不提供類似的軟件組件?你看到眾多第三方的Microsoft盟友紛紛推出自己的界面庫以模仿Microsoft,他們不會反對Microsoft,因為他們已經形成了使得Microsoft以及這些公司得以生存的生態(tài)圈。
Microsoft的技術儲備有多少,Microsoft之外的人很難說清楚,Microsoft中國公司也未必了解多少,1999年WTL類庫剛剛出現的時候,人們就希望WTL能得到官方的支持,或授權給一個Microsoft之外的一個公司(你能想象出Borland C++ 5.0內置的ActiveX開發(fā)機制是基于Microsoft ATL類庫嗎?),直到今天,WTL依然如故,我們完全相信,如果Microsoft強力推廣WTL,WTL完全可以流行,可是Microsoft不缺類似的技術,類似的類庫還有BCL(Base Control Library,一個用于開發(fā)輕量級ActiveX控件的類庫),Microsoft還有一個基于ATL的類庫,這個類庫用于開發(fā)ActiveX Designer,ActiveX Designer是絕大多數程序員不了解得一類對象,如果你熟悉Office開發(fā),你知道Office VBA 中有一類對象,即Form2,此外VB6.0 中的報表設計器(以及著名的Active Reporter),都屬于此類對象,用這個類庫,你可以為VB6.0以及集成VBA的系統提供定制化的可視化設計機制等等,如今ActiveX Designer已經演化為集成于Visual Studio .NET中的設計器。
向Microsoft學習
無論從什么角度評價Microsoft,我覺得Microsoft是值得我們學習的,如果說生活在這個時代有Microsoft存在是一場災難,你就應該痛恨這個家伙,但你首先要向這個家伙學習!我無意為Microsoft歌功頌德,我只是想說出十幾年我對Microsoft技術的感受。
Microsoft在研究式的開發(fā)中受益極大,如果你有興趣,你可以訪問http://research.microsoft.com/,雖然部分中國公司也有研究院,但與Microsoft相比,真有“米粒之珠,也放光華?”的感覺。2003年,我在北京的一個地方現場體驗了Microsoft亞洲研究院的招聘會,我看到中國的精英們進入Microsoft的渴望,事實上,在中國大陸,Microsoft亞洲研究院的人力資源已經延伸到各著名高校的相關專業(yè)的核心層,我感到,Microsoft幾乎不需要“求賢”,因為,只要Microsoft需要,精英們會“蜂擁而至”,每個人都有“可以理解”的理由而向往那個地方,如果為搞數學研究蜂擁到加州大學,我覺得可以理解,因為那里有數學土壤,出了成果國人也會感到自豪,因為“科學無國界”。技術是否有國界?不知道是否有定論?!想想DVD等技術專利給國內業(yè)界帶來的災難,不知道應不應該痛定思痛,在Microsoft校園招聘現場的氣氛中,我似乎明白了為什么國人“原創(chuàng)技術”少得可憐。我讀過幾本Microsoft亞洲研究院的高手寫的書,明顯可以看出,Bill gate 是他們的精神領袖以及他們對Microsoft的虔誠,國內的研究機構應當研究一下Microsoft的用人之道,Microsoft好像是三國里的人物,不知是劉備還是曹操,或者二者的混合物。我經常路過西格瑪大廈,第一次西格瑪大廈進入真有“朝圣”的感覺,也與Microsoft中國的幾個層次的人打過交道,各中滋味實在一言難盡。
在Office大戰(zhàn)中,國產軟件的確在一些方面與Microsoft進行較量,其實給人的感覺很勉強,界面上的似是而非,或用戶習慣方面的接近并不能解決根本的問題,一個好的軟件開發(fā)人員必須是一個軟件使用的高手,很難想象一個軟件操作水平很拙劣的開發(fā)人員能開發(fā)出高水平的軟件,我最早使用的軟件之一就是Microsoft Word,當時的版本是2.0,大概是1992年的事情,給我留下深刻印象的是集成于Word中的Word Basic,后來,我接觸到Excel 3.0,不出所料,Excel中集成的是Excel Basic,后來使用的Access中自然內置Access Basic 1.0,在這些軟件集成捆綁成Office之前,我就感覺這些產品的構思十分了不起,很具有Microsoft的風格,因為你知道,即使是一個DOS,Microsoft都要提供一個內置的QBasic或GW Basic。雖然關于Microsoft的產品評論很多,作為一個技術人員,我認為Microsoft的產品構思絕對是第一流的,從1994年早期的Office系列到1997年形成的Office 4.2,我認為,技術構思上均領先于我國2002年以后的Office產品,你聽說過如下說法嗎?“Dos 作為操作系統的時代,Windows是應用軟件;Windows是操作系統時,Office成為Dos時代的Windows;那么如果按此規(guī)律,Office會不會替代Windows而成為操作系統?”,現在在開發(fā)領域Visual Studio( .NET)正在成為另一個Office,你注意到了嗎?控制Visual Studio( .NET)集成開發(fā)環(huán)境的仍然是一個Basic語言引擎(Visual Basic .NET)。
與許多公司不同的是,在技術體系上,Microsoft幾乎所有的產品是息息相關的,Windows、Office、Visual Studio .NET雖然各不相同,但公共的核心即將形成,我們已經看到,核心組件方面,Office與Visual Studio .NET日漸趨于一致,例如Microsoft正在將Office 2003的核心組件VBA 6.X逐步用新的Visual Studio Tools for Office替代,而我們依然在一些似是而非的現象上與Microsoft的產品比較差距,國家采購或政府采購支持的公司,不去鉆研核心技術,只是急功近利的采用短期行為急于與Microsoft相爭,不知是否有蚍蜉撼樹的感覺,個人的體驗是,先學習Microsoft,踏踏實實的學,了解Microsoft,深入的了解,然后再喊口號。
原文出處:
http://dev.csdn.net/develop/article/65/65546.shtm#Comment
作者:孫輝
******************************
一讀感覺不錯,再度感覺孫真乃高人哦,我望塵莫及,所以在此推薦給各位,大家共同奮斗,提高自己的技術...
因為文章比較長,這里的BBS有限制,所以分為兩篇
*******************************
為什么用MFC?
經過若干年的競爭,Borland 的OWL幾乎消失了,這個OWL是個非常漂亮的C++類庫,在Borland C++ 3.1風光無限的年代,OWL真正的做到了獨領風騷。然而,Borland C++ 4.0錯過了進入32位程序的最佳時機,BC 4.0推出后不久,迎來了Win95,Borland倉促上陣,以一個小的“Pack”使得BC4可以編譯基于Win4的程序,當時的Visual C++是2.0版,支持Window16的版本為Visual C++1.51,有意思的是Borland可以用同一個編譯器同時支持Win16、Win32,而Microsoft卻不得不為Win16、Win32提供不同的編譯器。然而,非正式版本的Visual C++ 2.1與Visual C++ 2.2卻悄悄地支持了Win95的最新特征,即Win95新提供的一組公共控件,在我的印象中,Borland對Win95新特征的支持不利使得MFC與OWL的距離極大的縮短了。稍后到來的Borland C++ 4.5沒有改變這個狀況,盡管Borland C++ 5.0同時支持OWL與MFC,可是敗象已經顯露,Borland C++非常遺憾的只走到了5.5版。C++ Builder雖然形式上引入了Delphi的VCL庫,可是許多C++程序員并不買賬,因為許多以C++為樂的人更喜歡以編輯的模式進行編碼。Visual C++ 4.0的出現,在C++這個戰(zhàn)場上,Borland開始落敗了。
MFC發(fā)展到今天,已經十多年了,盡管褒貶不一,但可以肯定,十幾年的技術積累已經奠定了MFC的生存基礎,即使Microsoft的長角發(fā)布,MFC也不能推出Windows的舞臺,事實上,長角(Longhorn)之后的Visual Studio .NET仍將MFC作為一個重要的組成部分,在今年的Visual Studio .NET 2005中,MFC在C++中的位置依然如故。MFC的未來,應該不必擔心,只要你深入考察.NET類庫,你會發(fā)現,MFC的許多思想機制正悄然進入.NET,與此同時,Microsoft的第三方盟友十多年來已為MFC開發(fā)了大量的擴展庫,如果Microsoft是船,第三方盟友就是載舟之水。許多人認為MFC不發(fā)展了,其實是一種錯覺,Visual C++ 6的界面十分經典,特別是其中的Docking控制條機制,其實Visual C++ 6的IDE完全就是MFC寫的,可是MFC類庫中控制條相關的類功能很弱,為什么?你會看到許多與Microsoft友好的公司,他們很快的在MFC基礎上實現了Visual C++ 6 的Docking機制,這就是Microsoft的高明之處,Microsoft很會給盟友提供機會,其一貫的做法就是在自己的商品化產品中預先提供一些有趣的特征,使得其他一些公司進行模仿以帶動用戶群體。Borland不具備這樣的儲備。MFC第三方市場的繁榮,得益于Microsoft的策略與明智。MFC可否跨平臺?理論上完全可以,Microsoft不做,也是策略,但是有許多重要的產品Microsoft卻默許MFC移植到其他平臺,事實上,Microsoft的合作伙伴之一Mainsoft公司(Windows源碼就是從這家公司流失的),幾年來就是負責移植MFC程序移植到UINIX、Linux、AIX等操作系統之上。
新版的Visual C++中MFC已經支持.NET開發(fā)了,MFC與ATL的協作更好了。根據我的經驗,MFC、ATL與.NET庫三者完全可以融合在一起綜合應用到實際的開發(fā)工作中去,如果你是MFC行家,我希望ATL與.NET庫能成為你的忠實的左右手。那么有沒有同時支持MFC、ATL與.NET庫的程序?當然有,Visual Studio .NET IDE就是!而且Visual Studio .NET IDE還支持用ATL與.NET庫擴展的Addin。
認識Application對象
如果你熟悉Microsoft Office,你應該進一步的剖析這個大型軟件,Microsoft Office中幾乎每個程序都是可二次開發(fā)的,這一點得益于Microsoft Office內置的二次開發(fā)機制,一個是基于COM機制的VBA模型,另一個是基于.NET框架的托管模型:Visual Studio Tools for Office。作為一名程序員,你應當在技術角度解析Office的技術結構。Microsoft的大多數軟件的對象結構可以通過Visual Studio提供的工具OLE/COM Object Viewer考察其類型庫得到,通過引用類型庫,你甚至可以得到描述對象信息的C++頭文件。這樣做真是好處多多。一個典型的Office通常都有一個Application對象(或其他一個與之相當的對象),這個對象相當于軟件樞紐,在這里,我們不討論Office,借此話題說說Application對象。大多數支持擴展(Addin、Plugin)的軟件都存在類似的構造。通常,一個系統得Application對象或者是一個COM對象,或者是一個.NET對象,如果你的系統存在這類對象,你的系統就基本具備支持Addin、Plugin的機制了。一個理想的做法就是在一個MFC系統中,內置一個ATL對象或.NET對象,稍后我們給出方案如何做到這一點。設計Application對象的關鍵是如何規(guī)劃這個對象的屬性、方法、事件。如果你希望系統具備良好的擴展性,Application對象是十分關鍵的,這也是構架藝術的體現。所謂Addin(Plugin),是系統運行時根據需要加載的對象庫,Addin(Plugin)之所以可以擴展系統,關鍵的因素就是系統加載Addin(Plugin)時,將Application對象傳遞給Addin(Plugin)庫,設想一下,如果Application恰到好處的觸發(fā)了系統事件,而Addin(Plugin)庫如愿的解釋了事件,一個Addin(Plugin)庫的任務不就OK了嗎!因此Application對象是系統設計的關鍵。
如果你精通ATL對象,在你的MFC系統中添加一個ATL對象,這個任務可以用VC Wizard完成。你已經接受了一個事實,就是MFC程序中存在一個CXXXApp對象(CWinApp的派生類),現在你要做的是增加一個對應得ATL對象。這個對象可以在CXXXApp::InitInstance()中創(chuàng)建,如果ATL對象的類是CXXXAppObject,建議你在CXXXApp對象對象中增加一個成員變量,例如:CComObject <CXXXAppObject >* m_pAppObj,然后可以入下初始化m_pAppObj:
m_pAppObj = new CComObject <CXXXAppObject >;
注意程序結束時在CXXXApp::ExitInstance()中釋放m_pAppObj,語句如下:
delete m_pAppObj;
你可以將系統得關鍵屬性設置成CXXXAppObject的屬性,例如系統得標題、是否為多文檔等等。系統希望外部調用的功能可以實現為CXXXAppObject的方法,這一點取決于你的需要。系統需要外部擴展的功能,表現為CXXXAppObject的事件,關鍵是在恰當的位置觸發(fā)事件以及提供的事件參數。例如,你可以在CXXXApp::InitInstance()觸發(fā)應用程序開始的事件OnStartUp,Plugin捕獲事件后,可以進行特定的初始化(身份確認、初始信息查詢等等);
你可以在CXXXApp::ExitInstance()觸發(fā)應用程序結束事件,Plugin捕獲事件后,處理用戶需要的系統退出工作。所有的設計取決于具體設計。
如何加載Plugin,是一個有趣的問題,如果Plugin實現為一個COM范疇(Category),可以運用COM技術枚舉這個Category;可以將Plugin安裝到一個特定目錄,也可以通過注冊表。Plugin的實現可以用COM技術、也可以用.NET框架。適當的機會我會提供例子……
一些感想
一時心血來潮,就發(fā)了這個帖子,很難說是有心,還是無意。幾天前我在新浪網上看應氏杯圍棋決賽,我覺得該贏了吧,作為一個圍棋迷,我們等了十幾年,等到了屬于國人的應氏杯。記得7、8年前在還在大學工作的時候,有一次,一位同事興致沖沖的走道我面前對我說:“嗨,昨天馬XX贏了李昌鎬!”,當時我在系辦公室正在看報紙,那位仁兄見我頭都沒抬,非常不滿的搶下報紙,對我吼道:“喂!馬XX贏了李昌鎬?。∧懵牭經]有?。?!”,我對他說:“你大驚小怪個啥?!馬XX輸了李昌鎬多少盤,你知道嗎?”,馬XX幾乎一直在輸給李昌鎬,人們已經不奇怪了,偶爾贏一次,國人就把他捧得北都找不到了,李昌鎬弱冠17的時候就傲視這個世界了,可至今面孔不變,幾天前的農心杯,中日聯軍5個人,被他打個落花流水,李昌鎬是公認的世界第一,以至于有的高手知道下一個對手如果是他,就會去訂回程機票。這次應氏杯,國人竟然感謝崔哲瀚,何也?因為這個弱冠19的小子,擋住了他的大哥李昌鎬才使得應氏杯有了懸念。當國人媒體在說韓國僅李昌鎬一人厲害的時候,不知道是出何居心還是自欺欺人,李昌鎬年方30,不知道要力壓中、日多少年!面對這個名字,真有點麻木了,這個太極虎!軟件界又來了我們一向不齒的印度虎,2001年我們的軟件出口額僅是印度的四十分之一,我們震驚了,怎么可能呢?這個四十分之一水分很大,很可能更可憐!當時我在大連參加一個關于“大連軟件出口國內第一”的官方會議,那位大人在會上說:“據說,我們大連軟件出口國內排名第一,市有關領導希望今天的會議給出這個第一的數字依據,希望你們把數據報上來,去年的數據也可申報,注意,我們要的只是數據,你們仔細體會,我們根據數據,有獎勵,機會難得呀!”……。某一天,幾個朋友在我家看央視的對話節(jié)目,對話一方為國內的軟件大鱷們(用友、阿爾派等公司的老總們),另一方為印度軟件的一個代表團。當問及中、印軟件差距的時候,我們的劉老總(代表阿爾派)不以為然的說,據他的看法,我們已經快趕上(印度)了,……,言下之意頗有印度的水平不過如此的感覺,印度方的話我至今記憶猶新:“是否趕上,國際市場說的算!在中國看來,印度程序員的個性不足,技術也不怎么樣,其實是個錯覺,印度軟件首先注重個性,許多重要的美國商品化軟件都是在印度本土開發(fā)的……”,我們的輿論總是將印度程序員的水平描述的平庸至極,可是差距日漸拉開,……,圍棋、足球(不好意思談,談不出口!)、軟件,我們被近鄰嚴酷的封鎖了,樂壞了記者們、給媒體帶來了生機……
日本江戶時代的圍棋,如果一個人要想世襲一個稱號(例如:本因坊),他必須戰(zhàn)勝所有的師兄弟,然后,住進師父家的內室,你知道以后的事情嗎?以后,這個棋手,就得為師父一家做飯、帶孩子、搞衛(wèi)生……,其余的門人則一心一意的下棋,這樣的人、方式,造就了一代一代的本因坊,他們的棋譜大多數都流芳至今,這就是早期日本圍棋的悟道模式。軟件總共有多少語句?我最早接觸的計算機軟件教材是一本英文版的(影印的D版),不同于我們,那本書的作者構造了“X-語言”,他們不講什么C、Pascal、Basic,一旦缺了什么機制,就給“X-語言”添加些成分。什么C、Pascal、Basic,你感覺差不多,但現在卻分出了等級!我們駕馭語言的能力弱得很,可是我們在語言的細微之處卻很講究,不知道對不對,許多程序員也許是出于虛榮而用C++,事實上,地球人都知道,做數據庫,Delphi、VB遠比C++勝任,鋪天蓋地的C++的書,寫的東西幾乎雷同,因為,有用的或者作者不寫、或者作者不懂。有時我在想,如果國內沒有內需,會怎樣?也許軟件內需的存在,造就了中國軟件的特色,我認為國內業(yè)界并沒有充分利用中國軟件內需的存在,也許中國軟件內需的存在是軟件落后的硬傷。
我記得一部電影《神辮》,那個英雄的大辮子被洋人炸掉了,最終他成了神槍手,戰(zhàn)勝洋人用大刀、秘籍是不行的,用洋的東西戰(zhàn)勝洋的技術才是正道。我覺得,一個好的程序員必須了解軟件的歷史,學習歷史,你知道你為什么弱,別人是如何強大的。我們正在另一個戰(zhàn)場上抗美(可笑的是我們卻要趕超印度?。瑹o論Microsoft、Borland如何爭斗,無論他們誰統治誰,他們不影響美國的強大,朋友們,學習Microsoft,開發(fā)出讓國人感到牛的軟件!
這個帖子出乎本人的意料,愿意與大家共勉,希望這個帖子常在,與大家敞開心扉的交流!
FireFox與Microsoft
FireFox在一片贊揚、歡呼聲中激情登場了,也許人們真的期待已久,平靜的水面終于被扔進一塊石頭。我是IE的最早期的用戶了,1996年首次Microsoft的TED(技術教育大會),IE4還沒有發(fā)布時候,我們有機會目睹了內部版本的IE4(當時內部名稱是:納什維爾,英文名稱忘記了),那真是一次令人激動的預覽,當時IE3與Navigator 3激戰(zhàn)正酣。當你第一次看到想象中的“Active Desktop”,如果你沒有身臨其境,你不會激動。IE4本質上是一個Shell,其SDK是免費的,Navigator是基于Mozilla的瀏覽器,雖然是開源的,由于要照顧更大的共性(與操作系統無關),因此Mozilla不能充分的利用Windows的優(yōu)勢,Mozilla不能為廣大的程序員帶來所謂開發(fā)人員的“快感”,頂尖程序員可以駕馭Mozilla,以實現技術深度帶來的樂趣,最早的Navigator同時提供17個版本(注意:不是17種自然語言,而是17種操作系統),從數學角度分析,Mozilla就像一組公理,你可以以此為基礎開發(fā)不同操作系統上的瀏覽器,Navigator就是基于Mozilla的一個漂亮的結果,你能欣賞到代碼結構的優(yōu)美,然而失去的卻是功能強大的個性(要知道,Windows用戶在數量上遠大于其他操作系統用戶的總和)。普通用戶不可能讀懂Mozilla的代碼,即使懂了也不能很好的運用,這也許是Mozilla(以及大多數開源代碼)失敗的致命原因之一。IE內核聰明的抓住了開發(fā)者,你想想:對數以萬計的中、初級開發(fā)者而言,容易駕馭是首選的選擇,也是明智的。我讀過Mozilla,但我不會在開發(fā)過程中為一個具體的項目應用它。只要是瀏覽器,就不可能絕對的安全,無論是Mozilla,還是IE。當我了解到FireFox是基于Mozilla的一個新的瀏覽器,我基本上對其失去了信心,我有一個奇怪的觀點:FireFox的推出,最大的受益者絕對是Microsoft,即使Microsoft失去20%的份額,但是會導致Microsoft強化IE,Microsoft正不知道如何促使IE進化的時候,FireFox的出現無疑為Microsoft提供了機會,物種進化的原則就是競爭,FireFox就是促進IE進一步強大的催化劑。FireFox的擴展機制的確十分靈活,如果對手不是Microsoft,就很難掀起波瀾,而且當高級的開發(fā)者逐漸了解FireFox的時候,FireFox的漏洞就會漸漸暴露,試想想,如果某種Linux取代了Windows,那么,它的漏洞也會與Windows一樣多,因為那個時候,會有與研究Windows漏洞一樣多的人去研究對應得Linux的漏洞!從個人的角度上看,Microsoft也許有點“冤”,因為窺視Microsoft弱點的人實在太多了。從理論上看,計算機安全性是個永遠的話題,就像任何社會都需要警察一樣,沒有了小偷、賊、犯罪,警察也就消失了,你想想,文明是什么?野蠻能消失嗎?野蠻消失了,文明也就不存在了,高度文明就是更不存在了。人類克服了癌癥,下一個疾病會比癌癥更致命,但這并不意味著不必克服了癌癥,進步真是一種挑戰(zhàn)……
IE的技術構思肯定是個卓越的構思,IE可擴展的機制,會給Windows開發(fā)者帶來許許多多的益處。我正在計劃一片文章,介紹如何將你的對象模型與MSHTML庫實現對接,這樣,在HTML文件中可以將你的指令系統與HTML對象模型融合在一起。
話說“Hook”
在CSDN上時??吹疥P于“hook”,的問題,令我想起另一個話題,那就是游戲“外掛”。Hook提供一種改變一個Windows窗口消息處理的一種手段,通常的開發(fā)根本用不到,因此,談不上“常用”,早期的Windows,由于不能很好的支持遠東(當然包含漢字)地區(qū)的文字,因此出現了許多外掛的軟件補充Windows的不足,中文之星是一個典型的、令國人自豪的軟件,監(jiān)控軟件也許要運用hook技術,此外,很難想象什么軟件會用到hook。有人問我,能不能改變一個進程的數據處理行為,我曾經告訴他:能,也不能!感覺告訴我,hook絕大多數場合下是一種“不禮貌”的行為。曾有一段時間,我的服務器,經常有人悄悄地近來,給我增加許多超級用戶,肆意修改我的管理權限,我找到托管商,解決了這個問題,那時,我也買了幾本服務器監(jiān)聽、安全方面的書,看了幾天,我就放棄了,為什么?擔心學壞(正、邪僅在一念之差),其實,每個服務器都很脆弱,對有經驗的系統程序員而言,安全性與道德準則是聯系在一起的,軟件技術上走邪路很容易,有時我會想,如果我去設計病毒或者當黑客,會怎樣?基礎數學出身的我,數論、組合學、密碼理論統統不是問題,Windows虛擬驅動程序開發(fā),也不是問題!為什么那么多的人關心hook?國人的正道軟件寥寥無幾,可破解術卻出神入化,可惜,可惜!hook是一種底層的編成機制,能理解好hook的人,完全具備掌握一流技術的底蘊,真希望回頭……
MFC的批判
記得梁羽生先生筆下有一位正邪兼修的高手,名曰“喬北溟”(好像是這個名字),一次此人與大俠張丹楓在一個廟中相遇,喬北溟隨手操起香案上的香爐,張丹楓問他:“你的家伙稱手嗎?” ,喬北溟笑答:“以吾輩之見識,還在意手中之物是否為劍?”,張丹楓一愣,心中暗念,此人果然不同凡響……
說起MFC,許多人都會撇撇嘴,高手們會對其提出許多尖銳的批評,例如,刻板的Document-View機制,繁復的框架結構,怪異的COM實現以及令人莫名其妙的宏,等等。MFC的大而全,不僅捆住了MFC開發(fā)組的手腳,也為全面掌握MFC的愿望設置了障礙。高手們批評之余,可能忽略了一個基本的事實,這個事實就是,你的批評來自于你對MFC的深入理解,當許多人指出MFC的種種弱點時,他們或許不愿意承認:他們的技高一籌、見識超人一等是MFC帶來的,不止一次有人與我談及:“MFC的COM實現,實在差勁,看看ATL(不容否認,ATL至今仍然是開發(fā)COM的最佳C++類庫),你就會感覺MFC的臃腫……”,我們中的許多人潛意識里不知不覺的在作一件事:“當我們借助一部梯子登上一層樓的時候,我們會評價這個梯子是如何如何之糟糕?!?999年,我的一個項目中需要一個描述引擎,VBS(Visual Basic Script),是個免費的語言引擎,但功能局限極大,我聯系了美國的Summit公司,他們很快寄來了Microsoft的Visual Basic for Application SDK 6.0,當時我的團隊可謂很強,其中的幾位研究生C++修養(yǎng)很好,拿到VBA SDK時,他們對我說:“應當沒問題,我們很快就會搞定VBA SDK”,可是幾天過去了,連個例子都沒出來,原來,雖然VBA SDK提供了MFC擴展類庫(基于模版機制的MFC/ATL合成類庫),可實現得極其別扭,我接手后的當天晚上,VBA 的IDE就集成到系統中,第二天可編程對象順利出現在VBA 的IDE中,其余人覺得很奇怪,一看代碼,原來我繞過Microsoft的例子,完全是另外的實現途徑,那個時候,我感覺到,Microsoft這個家伙真的可惡,本來清晰的集成途徑,卻人為的讓你繞來繞去增加技術難度,過后想想,也可以理解,不這樣,第三方的Summit何以作技術支持?我經常想,如果沒有商業(yè)利益,許多技術應當十分簡潔、高效,這一點,Microsoft以及其他大公司都十分明白,如果一切都是最佳的實現模式,可能就另外一種局面了,復變函數論中有一個著名的定理:“復平面上處處解析的函數一定是常值函數。”, 學生們很難理解,當時我說,如果把一個省幾十個縣的最好學生組成一個班會怎樣?結果是一定有一個較差的學生(除非這個班只有一個學生?。@是個無法抗拒的定則,你想想,用天下最好的20個菜形成的酒席是什么味道?那一定是最差的!
Microsoft的MFC是值得你學習和使用的,如果你討厭這個東西或者你認為這是個邪惡的東西,你學學喬北溟,實現正邪歸一……
有感于“雞兔同籠”
小女初到北京時,對北京的教育頗為不適,鋪天蓋地的數學奧賽培訓班向她壓過來,孩子真是辛苦。她四年級時,就的對初等數論的基本內容進行強迫性的熟悉,還好,經過一段時間的努力,掌握了“雞兔同籠”、“韓信點兵”等中國經典,馬馬虎虎的能證明費馬小定理,有一天,她問我:“爸爸,大學數學什么樣?還有‘雞兔同籠’嗎?”,我說,有,我特意找了本老外寫的《Basic Algebra》,找到其中的“中國剩余定理”,小孩子接著問道:“這本書中還有中國人的數學內容嗎?”,我在習題中給她找到華羅庚老先生的“反同構定理”,小孩子又接著問:“還有嗎?”,我感到很沒面子,因為真的找不到了……
曾經的一個夢,就是當一個數學家!為此,研究生時期買了大量的數學書,當時我們系的資料室是聯合國教科文組織的藏書室,可以說,里面就是一個裝滿武功秘籍的寶庫。有一天我們打掃資料室的一個倉庫,倉庫里全是鼓鼓囊囊的麻袋包,上面落滿灰塵,手觸摸一下,能粘出幾毫米厚的灰塵,可以想象有幾年沒有打掃了。同學無意中揭開一個麻袋,我們驚呆了,里面是美國60年代各大學的數學雜志,每個雜志的名字都是響當當的,那真叫浩如煙海!當時我們就想,我們的論文能發(fā)表到其中嗎?如果僥幸發(fā)了幾篇,可想而知,我們就可以當博導了,這些比國內所謂核心期刊有分量得多的雜志,就像CSDN上的帖子一樣,很快就會被淹沒了,也許很久都不會有人參考、訪問……,有一天,我也當了老師,面臨著種種考核,于是,我們就成了論文機器,不論是否有價值,只要是核心的,你就高人一等。那個時候,我經常想起那些麻袋里的文獻……
我們整體水平的落后,導致整體的浮躁,數量上上去了,質量卻下來了。若干年后,也許我成熟了,我們這些曾經站在大學講壇上的人,沒什么好的東西講(談不上 ‘教’)給年輕的學生,記得當年我校的計算中心計劃招個培訓班,幾天過去,僅有7人報名,第8人來時,前7人就退了3人,主任感到奇怪,問學生,學生不語,其中原委并不復雜。我發(fā)此帖并沒有精心策劃,的確如某些網友所言是隨感而發(fā),“雞兔同籠”、“勾股定理”已經有了歷史地位,如果僅僅夠用,我們住草房子一樣保暖,為何建大廈呢?為什么放棄傳統的長袍、馬褂而去穿西裝革履?病毒軟件大戰(zhàn)幾乎是自殺性的內戰(zhàn),沒有撼動國外產品的分毫,我們許多人喜歡對自己人說三道四,是不是很少想一致對外?人家賣我們打折的產品,條件是附加一份“懺悔書”,而執(zhí)行者卻是我們國人,為什么?因為我們的東西匱乏!當年別人用鋼鐵武器掠奪了我們的財富,他們強大了,地痞無賴換上了紳士面孔,講起了法律,當你用D版時,人家文明的指責你,你的人力、財力、物力統統為人所用,取之于你用之于你,而我們卻依然陶醉在“雞兔同籠”、“勾股定理”的歷史成就之中,我們依然喜歡爭論“勾股定理”誰發(fā)現得更早,π是誰最先精確計算的,就像談論C++誰的水平更高一樣。
后記:
為感謝CSDN網友的支持,本人擬定陸續(xù)增加幾個新的帖子:
一、十年MFC經歷認識的Microsoft開發(fā)技術-多文檔界面開發(fā)技術:此貼討論一類多文檔界面,主窗口是一個單文檔界面,如果你愿意,你可以將多文檔窗口作為主窗口的一個視圖(CView)顯示,這類多文檔界面支持無限多個文檔類型(即可以加載任意多個文檔模板),支持(基于COM、.NET)二次開發(fā)技術以及VBA集成;
二、十年MFC經歷認識的Microsoft開發(fā)技術-可視化文檔界面設計技術:此貼討論MFC Document/View 機制的可視化實現,將給出一種所見即所得的Document/View 設計機制;其中包含如何集成ActiveX Ctrl、.NET User Control、MFC CView類對象以形成一個MFC窗體;
三、在MFC程序中如何有效的使用HTML、flash,例如,可以實現flash動畫作為一個程序的Splash以增強程序的感染力,使用HTML、flash動畫作為MDI程序的MDI用戶區(qū)的背景等等……;
四、十年MFC經歷認識的Microsoft開發(fā)技術-MFC .NET組件開發(fā)技術:介紹如何使用MFC類庫開發(fā).NET組件,例如可以用MFC開發(fā)WinForm對象,然后用于VB.NET、C#等等。
如果大家有好的建議,請與我聯系(sunhui@mail.apptemplate.com、sunhuizlz@yeah.net),如果有北京的朋友肯幫忙協助,在下不勝感激,希望得到大家的支持!