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