關於對於VC/MFC/ATL的評論問題,其實我很早就想寫一篇文章來闡述自己的觀點,不過又覺得這種容易引發論戰的文章實際上是在空耗大家的時間, 不如做點實際工作. 但是現在中國程式員群體的思想走向已經到了一種非常危險的一邊倒的地步,上幾期電腦報上登出了幾名14歲的小孩子, 剛剛學會寫幾個程式, 就把VC列為自己的夢想. 我去年找工作的時候,連續被幾個公司問會不會VC,得到我的回覆之後,他們怎麼也不能相信一個學了四年C,兩年多C++,還利用“空閑”時間學習了 Java、Perl的人,一個敢於在“專長”一欄裡寫上“掌握C++”的人,居然只是對VC“略有瞭解”,我從他們的表中看出一種不屑:“你還敢說自己懂 C++?你還有時間去學別的東西?連VC都不會,水平能高到哪去?”我並沒有費力去向他們解釋VC外面的世界更精彩,因為之前我在提到STL這個詞彙的時候,已經留心他們目光,那是一種冷漠、茫然和無動於衷。一切都已經十分清楚,解釋是徒勞的,他們根本不知道VC外面還有C++。
當然不勞大家擔心,我最終還是找到了一份滿意的工作。但是這種經曆對我的觸動是很大的,因為我已經深深地感覺到,當我們中國的程式員好不容易能夠有機會以一雙開放的眼睛面向整個世界的時候,我們的思想又被迅速地封閉了起來。一個叫微軟的巨人用一隻巨大的圓規在我們的思想裡畫了一個大圈圈,並且對我們說:“天就是這麼高,地就是麼大,你們享受吧!”伊甸園的生活是快味的,但是,當我們所有人都被牢牢地限制在一個範圍之內,聽命於一個上帝的清規戒律時,我看不到我們自己的未來還有什麼希望,我甚至看不到我們自己存在的意義。
不自由,勿寧死!
我們的能力當然是有限的,在相當長的一段時間裡我們所能到達的疆界還是會遠遠地小於先驅者開拓的界域。但是我確信,就在現在,我們的能力至少可以突破微軟給我們劃定的天地。微軟是好的,她很體貼,很出色。但是不論是微軟也好,巨軟也好,在我們程式員的心中,沒有凱撒。我們可以把你當朋友,但是你別想做我們的主子!我們一定要走出去,雖然我們知道極限是存在的,很長時間裡我們是不可能超過前人的,但是我們一定要出去。我們可以因為累死而在探索的道路上而止步,但決不能在人為設定的籬笆前畏縮不前。
C+ +是我最鐘愛的語言,我願意投入一輩子的時間在她的身上。VC也是一個好東西,在Windows下我最喜歡的C++ 編輯器。MFC/ATL也都是好東西,如果將來需要,我也會認真地學習它們。但是,我心中的天地比這要寬廣的多,標準C++所定義的語言效能集和標準庫,是更加絢麗的風景線;STL所帶來的通用編程時代的曙光,更令我心馳神往;設計模式的精美與一致,面向模式編程範式的初現端倪,物件導向軟體工程的成熟與巨大希望,TAO/ACE的龐大與精緻,我們中國人自己的C**語言的動人心魄,...,讓我目不暇接的珍寶太多太多。雖然我所能接觸到的東西只是一小部分,雖然在這個過程中我更加深刻地發現自己的水平是多麼的不值一提,但是我已經可以大聲宣稱:外面的世界很精彩!
我知道我們都還是生活在現實世界中的,精神上的快樂不足以填飽轆轆饑腸。但是我們現在是在說C++啊!想想你為什麼不用更簡單、更好掙錢的VB、Java、Delphi,偏偏要把已經夠難學的VC當成自己心中的理想呢?不就是因為VC能夠代給你自由、自信和自豪嗎?如果你意識到VC同樣是道更大的籬笆牆,你為什麼不願意衝出去,擷取更大的自由、自信和自豪呢?
B.Stroustrup說:“我想大家學習C++,應該是為瞭解決哪些開創性的問題,而不是一次次地重複解決哪些已經有了成熟的架構和現成的解決方案的問題。”C++是開拓者的語言,是思想者的語言,是“高手”層次之上的語言。或許在實用性、簡單性方面,現在和將來都會有許多語言不斷地超越它。但是,我認為在相當長的一段時間裡,在構造和表達軟體工程思想和創造性軟體的開發領域,不會有什麼語言能超過它。或者說,精通了C++語言及其思想的程式員,在思想深度和對新技術的領悟能力上上是遠遠超越其他語言使用者的,我們或許應該稱這種人為程式員中的思想者。正因為如此,我認為被限制在VC的圈圈裡,不是一個C++程式員能夠容忍的。
我覺得,作為一名真正的C++程式員和自由的思想者,更應該有有一顆仁慈的心。不要整天糾纏與C++和JAVA誰好誰次的爭論,不要一聽說某軟體使用VB做的就鄙夷起來,更不要拒絕學習其他的語言。C++難學、難用,距離應用程式層面比較遠,這些問題我們應該坦率地承認,可能的話做出一些努力來改變這些情況。應該積極鼓勵把其他語言與C++混合使用,讓C++成為它們背後堅實的支撐。我不是公司的老闆,但是我覺得,如果我的企業能擁有這種水平的程式員,我會為自己的企業而驕傲,也會給他最高的薪水。
附:
我個人認為MFC實現上的缺陷:
MFC 是在89年代末,90年代初定型的,當時C++還十分不完善。在當時來講,MFC是相當先進的。但是從那以後,C++發生了(可以說是)革命性的巨大變化,與新的C++相比,MFC的體繫結構和實現機制顯得比較落後,很多優秀的C++特性都沒有被合理地應用,反而自己另起爐灶搞了一攤。而且VC這種語言也越來越不象C++了,完全為微軟自己的應用而量身定製,甚至不惜違反標準。(不過在編譯技術尤其是最佳化技術上的確還是無人能及)
MFC由幾個缺點讓我比較不滿:
1. 大量使用稀奇古怪宏, 搞的代碼不象個樣子. 真佩服有些人那麼耐心地去分析它們.
2. 訊息映射的實現機制十分笨拙. 不用繼承我可以理解, 但是為什麼不用委託, 而要用表驅動? 還是那句話, 搞的代碼不像個樣子.
3. 對於底層SDK的封裝太薄, 物件導向的感覺不足.(當然也有他的好處, 不過這畢竟是
C++!)
4. 自己另起爐灶搞了RTTI, SEH, CString, CObjXXX(Container)這些東西, 實現的又不太好, 早幾年還可以理解, 現在則完全落伍.
5. 很多場合本來是標準庫可以一展身手的地方, MFC完全沒用上.
6. 為了迎合MFC, 編譯器的很多地方都違反標準.
7. Doc/View體系的局限性, 想突破很難.
話說回來, MFC還是一套出色的工具. 但是現在它事實上已經成為了對中國C++程式員的一個威脅, 它把太多的精力和資源吸引到支路上面, 而對於主幹道上真正的好東西視而不見. 矯枉必須過, 所以我不惜得罪一大批人, 寫了上面的文章. 正如開篇所說, 我一向認為無休止的爭論是空談誤國, 該說的話已經說了, 大家可以批評討論,但我大概是不會再回到這個話題上來了.