Titan專欄

          用文字來(lái)整理生命

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            44 隨筆 :: 49 文章 :: 19 評(píng)論 :: 0 Trackbacks
           

          1997.06

          觀古今於須臾
          撫四海於一瞬

          選義按部
          考辭就班

          人的理解力可以無(wú)窮,但人的記憶力有限。

          當(dāng)本身實(shí)力發(fā)展到某個(gè)層次,
          實(shí)力不是靠「警敏強(qiáng)記」來(lái)判別或完成,
          而是要知道哪里可以找出正確而適用的資料。


          ●理解無(wú)窮,記憶有限

          一位老讀者寫(xiě) mail 給我,信上說(shuō):『我發(fā)現(xiàn)一件事,自從在臺(tái)大資訊周遇到您,直到 1997 Run!PC 5月號(hào),您一直在安撫新鮮人。在發(fā)現(xiàn)自我方向之前,那些人(包括我)都曾相當(dāng)迷惘。您的文字和溫和的態(tài)度讓這些人可以安心前進(jìn)。感謝您!!』

          寫(xiě)作六年,最初接觸的年輕讀者,有一些已經(jīng)從高中進(jìn)入了大學(xué),甚至研究所。原本我的寫(xiě)作層面從未考慮學(xué)生,我是為工程人員寫(xiě)的。卻沒(méi)有想到慢慢地在學(xué)子之間有了一些影響。有一次元智開(kāi)學(xué),一位研究生來(lái)找我,告訴我因?yàn)槲业墓膭?lì),他發(fā)奮考上了研究所,并拿出當(dāng)年我寫(xiě)給他的信。前述那位老讀者也是,一年半載未聯(lián)絡(luò),他已經(jīng)從大同工學(xué)院考上清大資訊所。

          看到這些朋友的精進(jìn),我真是高興莫名。我自己當(dāng)然也要更精進(jìn),不然拿什麼以對(duì)讀者?現(xiàn)在學(xué)生們,厲害的,真的很厲害。這學(xué)期 Windows 作業(yè)系統(tǒng)課程,我給的期末作業(yè)是讓同學(xué)們分組將 Matt Pietrek 的「Windows 95 系統(tǒng)程式設(shè)計(jì)大奧秘」各章程式仔細(xì) trace,向大家做報(bào)告。有一組同學(xué)的表現(xiàn)就令我刮目相看,不僅自行研究書(shū)上未提到的 Callgate 技術(shù)和 Universal Thunk 技術(shù),還找出原作者未交待清楚的一些細(xì)節(jié)。

          人的理解力可以無(wú)窮,但人的記憶力有限。當(dāng)本身實(shí)力發(fā)展到某個(gè)層次,實(shí)力不是靠「警敏強(qiáng)記」來(lái)判別或完成,而是要知道哪里可以找出正確而適用的資料。我對(duì)那一組同學(xué)最感興趣的就是,他們?nèi)剂四男?shū)籍、哪些資料、以及他們是在什麼時(shí)候開(kāi)始接觸那些相關(guān)資訊的。

          我還在業(yè)界任職的時(shí)候,就已經(jīng)觀察到,比較有發(fā)展?jié)摿Φ耐拢己軙?huì)整理資料。資料的整理方法言人人殊,但都有條不紊。要整理資料,先要有資料,所以這些同事也都是收集資料的高手,不論書(shū)籍、雜志、期刊、報(bào)紙、光碟、磁片、規(guī)格書(shū),不論紙面的或電子的,收羅萬(wàn)象,檢索迅速。要達(dá)到這種境界,你要有方法,有毅力。或許還要一點(diǎn)點(diǎn)財(cái)力。不過(guò),除了書(shū)籍比較貴之外,其他資料都還算便宜,甚至從 Internet 上免費(fèi)可得。



          ●為汝安心

          能夠在資訊世界里悠然自得,真令人羨慕(雖然那些人,包括我,其實(shí)也都是鴨子劃水,水底下忙碌得很)。悠然自得的境界需要按部就班地訓(xùn)練才能到達(dá)。好多讀者寫(xiě)給我的信中,問(wèn)到 C 語(yǔ)言的學(xué)習(xí)方式、Assembly 語(yǔ)言的學(xué)習(xí)方式、MFC 的學(xué)習(xí)方式、Windows programming 的學(xué)習(xí)方式。一一回答而未能給大局觀,猶如管中窺豹,未能得其全貌。我決定以一次較大的篇幅,為汝安心。我決定從一個(gè)語(yǔ)言初學(xué)者的立場(chǎng)出發(fā),Windows programming 則是我設(shè)定的終極目標(biāo)。我走的路線是 C/C++ 路線。這樣的假設(shè)有幾個(gè)考量因素:

          1. Windows 是當(dāng)今 PC 上最普及的作業(yè)系統(tǒng),也是你就業(yè)時(shí)最可能面臨的平臺(tái)。
          2. C/C++ 是計(jì)算機(jī)科學(xué)的主流語(yǔ)言,學(xué)術(shù)界與工業(yè)界通用。
          3. 我的專長(zhǎng)是這些,所以我能說(shuō)的也只是這些。

          我將在每一個(gè)階段提出我的看法,并舉出一些好書(shū)給你叁考。我舉出的書(shū)絕大部份是原文書(shū),這并不代表國(guó)內(nèi)沒(méi)有相關(guān)好書(shū)(但它的反面也不一定就成立),而是因?yàn)槲易约航佑|了許多原文書(shū),資訊也多由彼而來(lái)。這些原文書(shū)大多有中譯本,好壞就請(qǐng)自行評(píng)斷了。

          以下出現(xiàn)的出版社簡(jiǎn)名,其全名是:

          A.W.:Addison Wesley
          M.P.:Microsoft Press
          IDG :IDG Books
          M&T :M&T Books
          R&D :R&D Publications

          ●先器後道:從 C/C++ 語(yǔ)言出發(fā)

          程式語(yǔ)言沒(méi)有練好,什麼都是空談。現(xiàn)在的 C/C++ 編譯器忒也龐然大物一個(gè),初學(xué)者如果未經(jīng)指點(diǎn),常會(huì)以為買了一套 C++Builder 或 Visual C++ 或 Symantec C++ 或 Optima++...,就是要直接開(kāi)始在整合環(huán)境底下寫(xiě) Windows 程式。我當(dāng)然不認(rèn)為是他們野心過(guò)大,妄想一步登天;他們是因?yàn)椴恢烙泻?jiǎn)化的環(huán)境和簡(jiǎn)化的 Windows 程式。

          在這個(gè)階段,語(yǔ)言的練習(xí)應(yīng)該獨(dú)立於任何作業(yè)系統(tǒng)之外。也就是,你學(xué)習(xí)的應(yīng)該是 ANSI(美國(guó)國(guó)家標(biāo)準(zhǔn))C/C++,你寫(xiě)的程式拿到任何作業(yè)平臺(tái)上應(yīng)該皆能原始碼相容。我建議,在 Win32 環(huán)境下,你要以 command line 方式編譯聯(lián)結(jié)程式,并使用 console mode。

          所謂 command line 方式,就是在 Windows 環(huán)境下開(kāi)一個(gè) DOS 視窗,將工具環(huán)境以 PATH 和其他環(huán)境變數(shù)(如 LIB 和 INCLUDE) 設(shè)定好,然後在 DOS 提示號(hào)下直接編譯聯(lián)結(jié)你的程式;完全不使用開(kāi)發(fā)工具提供的整合環(huán)境。以 Visual C++ 為例,假設(shè)你把它安裝在 E:\MSDEV,於是你可以設(shè)計(jì)一個(gè)批次檔(.bat)如下:

          @echo off
          set TOOLROOTDIR=E:\MSDEV
          rem
          set PATH=E:\MSDEV\BIN;D:\WIN95;D:\WIN95\COMMAND
          set INCLUDE=E:\MSDEV\INCLUDE;E:\MSDEV\MFC\INCLUDE
          set LIB=E:\MSDEV\LIB;E:\MSDEV\MFC\LIB
          set INIT=E:\MSDEV


          每當(dāng)想要使用 command line 編譯聯(lián)結(jié)程式,就先在 DOS 視窗中執(zhí)行上述批次檔,將工具環(huán)境設(shè)定好。

          然後,你可以開(kāi)始練習(xí)寫(xiě)程式。使用任何文字編輯器輸入你的原始碼,存檔,然後在 DOS 視窗中編譯聯(lián)結(jié)。以 Visual C++ 為例,你可以這麼做:

          cl test.c <Enter>



          cl test.cpp <Enter>

          CL.EXE 是 Visual C++ 的編譯器名稱。它會(huì)在編譯完成後自動(dòng)呼叫聯(lián)結(jié)器 LINK.EXE,將你的程式所需要的函式庫(kù)(C runtime library)自動(dòng)聯(lián)結(jié)進(jìn)來(lái)。

          你所寫(xiě)的這些 C/C++ 程式,雖然是 ANSI 標(biāo)準(zhǔn),但因?yàn)槭窃?Windows 環(huán)境下以 Windows 開(kāi)發(fā)工具建造而成,所以它們的執(zhí)行檔是屬於 PE 檔案格式,也就是 Win32 可執(zhí)行檔格式,只不過(guò)它們沒(méi)有用到任何 GUI(圖形使用者介面)而已。這種 Win32 程式又稱為 Win32 console 程式,也是一般所謂的 DOS-like 程式。

          常常接到讀者的 mail,希望我推薦 C/C++ 方面的好書(shū)。由於 C/C++ 的學(xué)習(xí)對(duì)我已經(jīng)是遙遠(yuǎn)的回憶,當(dāng)初自學(xué)以及朋友間互相討論的成份比較多,閱讀的經(jīng)驗(yàn)比較少,而晚近的許多相關(guān)書(shū)籍我又沒(méi)有完整看完過(guò),所以沒(méi)有辦法給你推薦名單。有一些經(jīng)典名著,出自大師之手,例如 K&R 的 "The C Programming Language"(有譯本),Bjarne Stroustrup 的 "The C++ Programming Language"(A.W.,有譯本),對(duì)初學(xué)者不見(jiàn)得是最佳選擇。初學(xué)者需要詳盡、親切、范例多的導(dǎo)入書(shū),大師的書(shū)卻往往學(xué)術(shù)味重,言簡(jiǎn)意賅。當(dāng)然,等你到達(dá)一定程度,還是應(yīng)該把大師的書(shū)看一看。言簡(jiǎn)意賅之中,可能有許多微言大義。



          ●可直接學(xué)習(xí) C++ 嗎?

          回答這個(gè)問(wèn)題前,需要先做點(diǎn)厘清。C++ 其實(shí)是 C 語(yǔ)言的超集(super set),所有 C 語(yǔ)言的關(guān)鍵字、指令、修飾詞、特性、標(biāo)準(zhǔn)的 runtime 函式庫(kù),都應(yīng)該相容到 C++ 之中。所以,基本上沒(méi)有所謂「避開(kāi) C 語(yǔ)言,直接學(xué)習(xí) C++」的可能。你看,很多時(shí)候 C/C++ 是寫(xiě)在一起的,形影不離。
          倒是,你可以不學(xué) C++,純以 C 闖天下。在 Windows 程式設(shè)計(jì)領(lǐng)域中就是以所謂的 SDK 來(lái)撰寫(xiě)程式。也就是以純粹的 raw Windows API 來(lái)寫(xiě)程式。不過(guò),物件導(dǎo)向的觀念與技術(shù),歷經(jīng)數(shù)十年的驗(yàn)證,已經(jīng)證明其價(jià)值,并且已被大家接受,蔚為主流,你若放棄 C++,會(huì)折損自己不少實(shí)力與工作機(jī)會(huì)。

          To be or not to be,that is the question!(語(yǔ)出 莎士比亞/哈姆雷特)呵呵,To C or not to C,that is the question too!



          ●OOA/OOD

          C/C++ 語(yǔ)言的基礎(chǔ)功夫完成之後,你面臨第一個(gè)分岔點(diǎn)。是要繼續(xù)在物件導(dǎo)向(OO)領(lǐng)域中精進(jìn),進(jìn)入物件導(dǎo)向分析(OOA)和物件導(dǎo)向設(shè)計(jì)(OOD)領(lǐng)域?還是要開(kāi)始選擇一個(gè)特定的作業(yè)平臺(tái),學(xué)習(xí)其上的程式技術(shù)?這兩者不是平行線,它們最終是要相互為用的。對(duì) OOA/OOD 有愈多的了解,使用起 Windows 開(kāi)發(fā)工具中的C++ 類別庫(kù)(MFC 或 OWL 或 Open Class 或 VCL)自然愈能胸有成竹,而不是隨波擺蕩。但是,當(dāng)然,你也可以先進(jìn)入 Windows 程式設(shè)計(jì)領(lǐng)域,慢慢再回頭接觸 OOA/OOD。

          我與同夥的幾位老朋友曾經(jīng)十分瞧不起 OOA/OOD,每次去聽(tīng)些課程,回來(lái)就彼此嘲諷:又浪費(fèi)了一整天。一個(gè)原因是:臺(tái)上的老師自己連 OOP(Programming)都不夠?qū)嵙Γ勈颤N OOA/OOD?沒(méi)有據(jù)以實(shí)現(xiàn)觀念的載具,一切將只是魏晉玄談。另一個(gè)原因是:臺(tái)下的我們自己的 OO 基礎(chǔ)也不夠好,對(duì)於聽(tīng)來(lái)的觀念,無(wú)法產(chǎn)生有效的具體意識(shí)。

          我們瞧不起 OOA/OOD,是因?yàn)槲覀冏约捍直桑且驗(yàn)槲覀冏约旱某潭炔坏健H绻约撼淌綄?xiě)多了,也用心揣摩過(guò) classes 該怎麼設(shè)計(jì)怎麼分類,自己有過(guò)一些想法,再來(lái)看 OOA/OOD 的書(shū),收獲就會(huì)大得多。

          OOA/OOD 的流派不少,Booch 是相當(dāng)有名的一個(gè)流派,他著有 "OO Analysis and Design with Application"(無(wú)譯本),相當(dāng)出名。



          ●SDK Programming

          如果你不喜歡一下子進(jìn)入太多的理論世界,你希望早點(diǎn)寫(xiě)出漂漂亮亮的 Windows 程式,激勵(lì)自己一下,那麼在學(xué)會(huì) C 語(yǔ)言之後,可以選擇 SDK programming 做為下一步。

          SDK 是個(gè)通稱,任何環(huán)境都可以提供自己的 Software Development Kit(SDK)供程式員在其環(huán)境上開(kāi)發(fā)應(yīng)用程式。然而因?yàn)?Windows SDK 太有名了,一直被延用其名,竟成了一個(gè)專用術(shù)語(yǔ)。"SDK programming" 其實(shí)就是以未加包裝的 Windows API 撰寫(xiě) Windows 程式的意思。如果你在這個(gè)層面上寫(xiě)程式,可以在任何一套 Windows 開(kāi)發(fā)工具中暢行。

          這個(gè)領(lǐng)域我推薦兩本好書(shū):

          1. Charles Petzold/M.P.:"Programming Windows 95"(有譯本)
          2. Jeffrey Richter & Jonathan Locke/M&T:"Windows 95 : A Developer's Guide"(有譯本)。

          前者幾乎是這個(gè)領(lǐng)域的圣經(jīng),有非常廣泛的取材和很棒的內(nèi)容。後者的技術(shù)層次定位更高,特別選擇了 hooking、subclassing、window class...等一些稀有主題。

          有些書(shū)評(píng)人對(duì)於 Petzold 書(shū)籍的 95 版沒(méi)有太高評(píng)價(jià),但是對(duì)於其前身(3.0 版和 3.1 版)卻又推崇備致。噢,一本書(shū)怎麼可能在「組織結(jié)構(gòu)不變,僅是做 16/32 位元移植」的改版情況下,落差如此大呢?不可能!書(shū)評(píng)人對(duì)於新版沒(méi)有太高評(píng)價(jià),是因?yàn)樗麄兊钠谕撸浟诉@是改版書(shū)。以看新書(shū)的角度去評(píng)論改版書(shū),會(huì)有誤差出現(xiàn)。

          Jeffrey 的書(shū)籍名實(shí)不副 -- 內(nèi)容很棒,其名不彰。這本書(shū)也是改版書(shū),先前已有 3.0 和 3.1 兩版。

          在這個(gè)領(lǐng)域里鉆研,或許你還需要一些 Windows API 手冊(cè)。各家整合開(kāi)發(fā)工具的線上手冊(cè)固然是不錯(cuò),但電子有電子的好處,書(shū)面有書(shū)面的優(yōu)點(diǎn)。帶著本手冊(cè),可以當(dāng)小說(shuō)隨手翻翻,累積印象,就不會(huì)在大做苦工之後才發(fā)現(xiàn),原來(lái)有現(xiàn)成的 API 可用。Waite Group 出版了好幾本 Win32 API 手冊(cè),像是 "Win32 Programming API Bible"、"Windows 95 API How To" 等等(皆無(wú)譯本),每個(gè) API 并附使用范例,頗具叁考價(jià)值。不過(guò)我發(fā)現(xiàn)其中頗有誤謬,你必須和線上手冊(cè)交叉使用才保險(xiǎn)。

          SDK programming 也可以使用 C++ 語(yǔ)言。我的意思是你自己為自己包裝一些類別,也就是自己把 Windows API 包裝得更高階一些。早期 Borland 推出其C++ 2.0 版(市面上第一套可支援 Windows 的 C++ 編譯器),就是訴求讓程式員自己做這樣的包裝(彼時(shí)尚未有主流的類別庫(kù)產(chǎn)品如 OWL 或 MFC 或 VCL,只有一個(gè)小有名氣的 "Zinc" 產(chǎn)品)。這樣的訓(xùn)練或許實(shí)際用處不大,因?yàn)楝F(xiàn)在已有主流的類別庫(kù)產(chǎn)品(不少人甚至是為了使用那些類別庫(kù)才決定開(kāi)始學(xué)習(xí) C++)。然而,曾經(jīng)歷練過(guò)這樣訓(xùn)練的人,OOA/OOD 的實(shí)力必有增長(zhǎng)。

          Paul Dilascia 有一本 "Windows++ : Writing Reusable Windows Code in C++" (A.W.,無(wú)譯本),便是這個(gè)層面的著作。這位作者現(xiàn)今是非常知名的 MFC 技術(shù)專欄作家,我一直期待他出一本 MFC 書(shū)籍,苦候不至。



          ●Windows 作業(yè)系統(tǒng)/系統(tǒng)程式設(shè)計(jì)

          學(xué)習(xí) SDK Programming,最大好處是能夠清楚看清 Windows 系統(tǒng)的 "message based、event driven" 的觀念。另一個(gè)好處是藉由 API 函式,你可以相當(dāng)程度地了解作業(yè)系統(tǒng)的基層動(dòng)作。當(dāng)然,後者需要一些書(shū)籍來(lái)輔助,在 SDK programming 書(shū)籍上是不容易看到對(duì)此有太多介紹的。即便有,層面也不夠廣。

          Windows 作業(yè)系統(tǒng)領(lǐng)域我推薦五本書(shū):

          1. Matt Pietrek/A.W.:"Windows Internals"(有譯本)
          2. Matt Pietrek/IDG :"Windows 95 System Programming SECRETS(有譯本
          3. Jeffrey Richter/M.P.:"Advanced Windows 3rd edition"(有譯本)
          4. Walter Oney/M.P.:"System Programming for Windows 95"(有譯本
          5. Garen Hazzah/R&D:"Writing Windows VxDs and Device Drivers" 2nd edition(未進(jìn)口)

          第一和第二本書(shū)由同一位作者撰寫(xiě),分別針對(duì) Win31 和 Win95。兩本書(shū)并沒(méi)有太多重覆的地方,Win95 之中屬於 16 位元的那一部份,凡是在第一本書(shū)中提過(guò)的,第二本書(shū)就不提了。Pietrek 的探討是以三種形式進(jìn)行:內(nèi)部資料結(jié)構(gòu)、API 虛擬碼、系統(tǒng)程式設(shè)計(jì)。三種形式都非常重要,而以內(nèi)部資料結(jié)構(gòu)尤然。你要充份了解 Windows 作業(yè)系統(tǒng),一定要好好看看這兩本書(shū)。我正引領(lǐng)鵠望 Pietrek 有沒(méi)有一本 "Windows NT Internals" 或 "Windows NT System Programming SECRETS" 這樣的書(shū)。書(shū)名不重要,要認(rèn)就要認(rèn)作者。

          第三本書(shū)站在比較高階的層面,也就是 API 層面,來(lái)看系統(tǒng)。Jeffrey 并不挖掘系統(tǒng)內(nèi)部資料結(jié)構(gòu),也不講述 API 虛擬碼,他只是非常詳盡地告訴你一些與系統(tǒng)核心有關(guān)的 API 如何使用,并給你許多出色的范例程式。那些與核心有關(guān)的 APIs 并不太容易在沒(méi)有詳細(xì)解說(shuō)的情況下無(wú)師自通,因?yàn)樗鼈兊娜?shù)通常都很多,牽扯的意義也很廣。這本書(shū)的重要性不亞於第二本。

          第四本書(shū)和第五本書(shū)主要訴求在虛擬機(jī)器和虛擬裝置驅(qū)動(dòng)程式(VxD)的層面。它們也可以歸類為 DDK Programming 領(lǐng)域,稍後我再來(lái)介紹。放在這里主要是提醒你,它們和作業(yè)系統(tǒng)有非常密切的關(guān)聯(lián)。



          ●以 Console 程式練習(xí) system programming

          進(jìn)入作業(yè)系統(tǒng)層次,大概免不了就要接觸到行程(process)、執(zhí)行緒(thread)、模組(module)、位址空間、虛擬記憶體、檔案等題目。這些屬於作業(yè)系統(tǒng)基本教義派的題目都不牽扯圖形介面,因而 console 是很理想的練習(xí)環(huán)境。我的意思是你可以在 console 程式中練習(xí)CreateProcess、CreateThread、VirtualQuery、CreateFile 等等Win32 API。若需要輸出資料來(lái)觀察,只要 printf() 就可以了,不必大費(fèi)周章去處理視窗、對(duì)話窗、列示清單。

          印象中很少書(shū)籍介紹 console 程式設(shè)計(jì)。其實(shí)的確也沒(méi)有什麼好介紹的,console 程式就是 DOS-like 程式,并且允許你直接呼叫 Win32 API,如此而已。舉個(gè)例子:

          // filename : test.c
          // building : cl test.c
          #include <windows.h>

          void main(int argc, char *argv[])
          {
          STARTUPINFO si;
          PROCESS_INFORMATION pi;

          GetStartupInfo(&si);
          CreateProcess("D:\\WIN95\\NOTEPAD.EXE",
             NULL, NULL, NULL,
             FALSE, 0, NULL, NULL,
             &si, &pi );
          }


          這個(gè)程式執(zhí)行起來(lái),會(huì)另產(chǎn)生一個(gè) NOTEPAD 行程。你以 "cl test.c" 做編譯聯(lián)結(jié)動(dòng)作,所有必要的函式庫(kù)(包括 C runtime 函式庫(kù)和 Windows DLLs 的import 函式庫(kù))都會(huì)自動(dòng)被聯(lián)結(jié)進(jìn)來(lái)。



          ●Application Framework

          SDK 的基礎(chǔ)有了之後,你可以留在那個(gè)領(lǐng)域繼續(xù)精進(jìn)。但是看到別人三兩下子就做出一個(gè)自己一星期也做不出來(lái)的程式畫(huà)面和功能,很少有人不痛心疾首,吁嗟呻吟,大嘆身不逢時(shí)時(shí)不我予。汗水其實(shí)不會(huì)白流,不過(guò)看準(zhǔn)時(shí)機(jī)也要趕快下車,換一班快速列車,讓過(guò)去的汗水所植基的東西有更大的發(fā)揮。

          有一些開(kāi)發(fā)工具大廠,把 Windows API 及必要的資料包裝在一個(gè)個(gè)的 C++ 類別之中,讓使用者站在他們的肩膀上,看得更高更遠(yuǎn)。有沒(méi)有在平面電扶梯上走路的經(jīng)驗(yàn)?桃園機(jī)場(chǎng)出入境站內(nèi)有一些平面電扶梯,在上面走路,每個(gè)人都好像神行太保,輕松漫步就比梯外的人滿頭大汗還要快。Application framework(一種凝聚性很強(qiáng)的 C++ 類別庫(kù))就像那電扶梯。

          市面上的 application framework 產(chǎn)品有好幾套,真正引領(lǐng)風(fēng)騷的,當(dāng)推 MFC 和 OWL 二者。前者是 Microsoft 產(chǎn)品,後者是 Borland 產(chǎn)品。由於這種產(chǎn)品中的 C++ 類別彼此關(guān)系密切,因此同一個(gè)產(chǎn)品的應(yīng)用程式的「基本長(zhǎng)像」也就十分類似。也因此這些產(chǎn)品都搭配程式碼產(chǎn)生器,以及各式各樣高度自動(dòng)化的輔助工具。

          這種產(chǎn)品功能強(qiáng)大,用起來(lái)很爽,但是要學(xué)得好不容易。我看過(guò)太多因?yàn)榛A(chǔ)不穩(wěn)而跌下馬來(lái)摔得鼻青臉腫的例子。面對(duì)這種東西,學(xué)習(xí)者首先必須擁有不錯(cuò)的 C++ 基礎(chǔ),那自然是不消說(shuō)的。此外,對(duì)於 C++ 虛擬函式的精義,必須徹底了解,才知道自己到底在干什麼。

          通常,學(xué)習(xí) VC++ & MFC(或 BC++ & OWL)的人,可分兩類。第一類人只有 C 基礎(chǔ),一心希望趕快通往物件導(dǎo)向的圣堂,希望趕快做出又炫又酷的程式。他們以為 VC++ 或 BC++ 是一種新的 C++ 語(yǔ)言,或以為那是一種「Windows 程式語(yǔ)言」。他們迫不及待地把整合環(huán)境上的wizards(或 experts)玩?zhèn)€痛快,東拉西扯,卻不知其實(shí)只是胡搞瞎搞,搞得自己一頭霧水。他們東湊一個(gè) class,西湊一個(gè) class,有樣學(xué)樣,東施效顰。初期進(jìn)展頗為驚人,把程式湊成一個(gè)怪物卻渾然不覺(jué)。等到束手無(wú)策了,信心也全失了,於是自己給自己下了個(gè)結(jié)論:MFC(或 OWL)是全世界最爛的東西,大怪獸一個(gè)!

          另一類人不太一樣,他們或許也只有 C 的基礎(chǔ),但是愿意先把 C++ 的基礎(chǔ)打好,尤其在虛擬函式痛下功夫。他們學(xué)習(xí) MFC(或 OWL)的本體架構(gòu),企圖了解那樣一個(gè) application framework 是如何建筑起來(lái)的。研究的主題包括 Message Mapping、Command Routing、Runtime Class、Persistence...。數(shù)百個(gè) MFC(或 OWL)類別不熟悉?不會(huì)用?沒(méi)關(guān)系,那只是手冊(cè)查閱的功夫而已,架構(gòu)弄懂才最重要。這種人初期進(jìn)度緩慢,可能會(huì)被速食派人士嘲笑。但假以時(shí)日,誰(shuí)笑誰(shuí)就不知道了。

          我自己對(duì)於 OWL 不熟,沒(méi)有能力介紹好書(shū)給你。至於 MFC,我推薦四本書(shū):

          1. 侯俊杰/松崗:"深入淺出 MFC"(第2版)
          2. David Kruglinski/M.P:"Inside Visual C++ 4th edition"(前一版有譯本,新版未知)
          3. Jeff Prosise/M.P.:"Programming Windows 95 with MFC"(有譯本)
          4. George Shepherd & Scot Wingo/A.W.:"MFC Internals"(無(wú)譯本)

          第一本書(shū)用來(lái)建立對(duì) MFC 架構(gòu)的通盤(pán)了解,涵蓋上述我提到的所有重要主題。內(nèi)容雖然很深,但因?yàn)檠驖u進(jìn),示意圖也多,并不難看。第二本書(shū)提供許多范例,并以 Visual C++ 工具大量輔助 MFC 程式設(shè)計(jì)。第三本書(shū)也提供許多范例,MFC 架構(gòu)方面的解釋比第二本多,但比第一本書(shū)少得多。它完全不使用 Visual C++ 工具。第四本以挖掘 MFC 原始碼的方式來(lái)介紹 MFC 架構(gòu),層面比第一本深且廣,但比較難看。

          我建議的閱讀順序亦如上排列。



          ●RAD(Rapid Application Development)

          有資格被稱為 RAD 產(chǎn)品的,當(dāng)屬 Visual Basic、Delphi、C++Builder 三者了。Optima++ 好像也是,但我沒(méi)有什麼接觸。這里我要談的是 C++Builder。

          C++Builder 對(duì)程式開(kāi)發(fā)的幫助層面,和 MFC(或 OWL)又不太一樣。這個(gè)工具可說(shuō)是 components software(以元件組成軟體)的實(shí)踐者。每一個(gè)元件有 properties、methods、events 三個(gè)性質(zhì),分別代表其資料、可執(zhí)行的行為、以及可反應(yīng)的狀態(tài)。你在整合環(huán)境中選拉一堆元件,很快就可以把一個(gè)應(yīng)用程式的使用者介面兜起來(lái)。比較困難的地方在於如何讓元件和元件之間產(chǎn)生關(guān)聯(lián),那需要寫(xiě)點(diǎn)程式碼。程式碼雖然簡(jiǎn)短,卻也絕對(duì)需要 C++ 的良好基礎(chǔ),以及對(duì) VCL 各元件的相當(dāng)程度的了解。雖然 VCL 的架構(gòu)和 MFC 或 OWL 都不相同,但如果你曾經(jīng)用過(guò) MFC 或 OWL,并且曾經(jīng)在架構(gòu)上面花功夫,再來(lái)看 VCL 自然是比較容易進(jìn)入狀況。觸類旁通嘛!

          C++Builder 是個(gè)好產(chǎn)品。它不但與 VC++ 和 BC++ 競(jìng)爭(zhēng),層次又比兩者更高一層。至於你該選擇 MFC 或 OWL,還是該選擇 C++Builder?若以工具的優(yōu)秀度考量,我投後者一票。但是關(guān)於就業(yè)市場(chǎng),考量的因素還有許多;不論你的選擇如何,似乎都是個(gè)賭注。



          ●DDK Programming

          DDK 是微軟的一套工具。DDK Programming 是個(gè)統(tǒng)稱,意指撰寫(xiě)驅(qū)動(dòng)程式(DRV),或虛擬裝置驅(qū)動(dòng)程式(VxD)。這個(gè)領(lǐng)域需對(duì)作業(yè)系統(tǒng)有比較多的了解,因?yàn)闋可娴募夹g(shù)層面比較低階。

          高階語(yǔ)言如 C++ 在此領(lǐng)域較不管用,assembly 語(yǔ)言反而成為主流。再佐以 C 語(yǔ)言應(yīng)該是最好。雖然,也有一些整合環(huán)境工具如 VToolsD 提供協(xié)助,允許你以 C/C++ 撰寫(xiě)虛擬裝置驅(qū)動(dòng)程式,但 assembly 語(yǔ)言仍然得精通,因?yàn)槟愠3P枰幚矶询B、暫存器...,需要考慮機(jī)器碼的長(zhǎng)度、速度。這些都是學(xué)習(xí) assembly 語(yǔ)言時(shí)獲得的知識(shí),高階語(yǔ)言不管那個(gè)。

          這個(gè)領(lǐng)域我推薦兩本書(shū)。如果你對(duì) DDK programming 沒(méi)有興趣,這兩本書(shū)也可以歸類在作業(yè)系統(tǒng)領(lǐng)域里,對(duì)你還是有幫助:

          1. Walter Oney/M.P.:"System Programming for Windows 95"(有譯本)
          2. Garen Hazzah/R&D:"Writing Windows VxDs and Device Drivers" 2nd edition(未進(jìn)口)

          第一本書(shū)是學(xué)習(xí) VxD programming 的極佳書(shū)籍,從最基礎(chǔ)講起,相當(dāng)詳細(xì)。第二本書(shū)提供許多設(shè)計(jì)精良的示意圖,非常難得。事實(shí)上它也真的很「難得」,臺(tái)灣沒(méi)有進(jìn)口。



          ●Java 程式設(shè)計(jì)

          如果你有 C++ 基礎(chǔ),又用過(guò) MFC(或 OWL),那麼老實(shí)講,要進(jìn)入 Java 殿堂,真是輕松。Java 的語(yǔ)法與 C++ 十分類似,Java 的 API(不以單純的函式呈現(xiàn),而是以類別庫(kù)形式呈現(xiàn))則活脫脫就是另一個(gè) application framework。



          ●讀者來(lái)函

          送件者: <b83140163@ntou66.ntou.edu.tw>
          收件者: jjhou@ccca.nctu.edu.tw
          主旨: 資訊人的生涯規(guī)劃
          日期: 1997年4月26日 PM 12:22

          侯先生你好:
          小弟經(jīng)常在 RUN!PC 雜志上拜讀您的大作,也深覺(jué)很有收獲,尤其在讀了「EQ 價(jià)更高」一文後,產(chǎn)生了另一個(gè)想法,希望您能抽空為我回答。或許這也可能是其他人心中的疑問(wèn)。

          小弟因聯(lián)考的關(guān)系,目前就讀非資訊相關(guān)科系,但是從國(guó)
          中開(kāi)始,便對(duì)電腦資訊產(chǎn)生了極大的興趣。高中時(shí)候已多有涉獵,進(jìn)
          入大學(xué)之後,并未忘情於電腦,并嘗試自我學(xué)習(xí)。但是自己跟資訊相關(guān)科系的同學(xué)相比,在他們專注學(xué)習(xí)的情況下,有漸行漸遠(yuǎn)的感覺(jué)。感到惶恐,也擔(dān)心自己被資訊業(yè)界快速變化的洪流所淹沒(méi)。您作為資訊界的代表人物之一,不知有何想法或建議呢?


          「作為資訊界的代表人物之一」,這一點(diǎn)我談不上。我把自己定位在「高階技術(shù)的導(dǎo)引者」。是的,導(dǎo)引者而已!在各個(gè)領(lǐng)域真正從事專案計(jì)劃的工程師,都擁有比我更深入更實(shí)際的經(jīng)驗(yàn)。我比較廣,而他們比較精。說(shuō)到廣,其實(shí)我也不過(guò)是在 C/C++、SDK、MFC、Windows O.S 這一條線上而已。

          真的,我不清楚,以現(xiàn)在資訊量這麼龐大,PC 軟硬體進(jìn)步這麼快速的情況下,有志在資訊領(lǐng)域?qū)崿F(xiàn)人生抱負(fù),卻不是科班出身的年輕朋友,是否有太大的機(jī)會(huì)。「科班」所代表的文憑或身份,并不是考量重點(diǎn),我所想的,亦即您所言,「在別人專注學(xué)習(xí)的情況下,彼此有漸行漸遠(yuǎn)的感覺(jué)」。

          我本身是個(gè)自學(xué)案例,但我可是在大學(xué)時(shí)代看過(guò)、用過(guò)打卡機(jī)的A世代人唷。那個(gè)時(shí)代的復(fù)雜度與今日不可以道里計(jì)。即使我其實(shí)是在大學(xué)畢業(yè)服役之後回鍋才對(duì)電腦引發(fā)興趣,那時(shí)候電算環(huán)境的復(fù)雜度仍然與今日不可以道里計(jì)。當(dāng)時(shí)一切因陋就簡(jiǎn),PC 作業(yè)系統(tǒng)不過(guò)就是個(gè) MS-DOS,可以完全攤在手掌心里;最炫的軟體開(kāi)發(fā)工具不過(guò)就是 Turbo Pascal,進(jìn)入繪圖模式畫(huà)個(gè)簡(jiǎn)單的曲線圖就開(kāi)心得嗄嗄叫。沒(méi)有選單、沒(méi)有圖形人機(jī)介面、沒(méi)有物件導(dǎo)向、沒(méi)有整合環(huán)境、沒(méi)有 wizards、沒(méi)有 experts... 沒(méi)有,什麼都沒(méi)有!有的是記憶體 640K、硬體 20MB、Hercules 卡、單色螢?zāi)弧⒕裴橖c(diǎn)榘陣印表機(jī)...。

          我不知道,現(xiàn)在這麼大的資訊量,這麼多的技術(shù)和這麼多的工具需要同時(shí)學(xué)習(xí)的情況下,資訊科系以外的同學(xué)們,即使你們依然保持高度興趣和高度自持力,頭懸梁錐刺骨,「衣帶漸寬終不悔」的感覺(jué)能夠維持多久?

          我真的不知道呀!

          小弟有以下問(wèn)題希望您能回答,謝謝!!

          一、您喜歡在資訊界中工作,是因?yàn)槟男l件呢?


          讓自己永保朝氣蓬勃。不會(huì)有「被新世界遺棄」的孤寂感。

          二、一般資訊人對(duì)工作上會(huì)有哪些不滿意的地方?
          或是工作上會(huì)遇到哪些困擾呢?


          會(huì)在走出學(xué)校後走入資訊業(yè),通常是因?yàn)楸旧淼拇_對(duì)資訊感興趣,不然可能校內(nèi)早就轉(zhuǎn)系走人,或離開(kāi)學(xué)校後馬上就表明心跡了。排除「沒(méi)有興趣」的因素後,我想資訊人對(duì)工作的最大不滿意,大概是「永遠(yuǎn)有學(xué)不完的東西」。在我這個(gè)歲數(shù),進(jìn)入人生的這個(gè)位置,我清楚自己該掌握什麼,該舍棄什麼,所以龐大的資訊量對(duì)我威脅不那麼大(雖然也不小)。但是對(duì)於還沒(méi)有事業(yè)基礎(chǔ)的年輕朋友,他們必須(或自己認(rèn)為必須)努力把十八般武藝起碼也搞好十四般,那就得花很多很多的時(shí)間精力。

          其他理工領(lǐng)域的進(jìn)步?jīng)]有這麼快,有些領(lǐng)域甚至學(xué)一套可以吃一輩子。沒(méi)有「活到老學(xué)到老」的心理準(zhǔn)備的朋友們,此行莫入!

          至於普遍的困擾則是:「這麼辛苦,我能夠做到幾歲?」這是工程師們一個(gè)普遍的危機(jī)意識(shí)。我的工研院老同事就笑指我的光明頂(日漸光明的頭頂)說(shuō):『看你能做到幾時(shí)!』

          三、在準(zhǔn)備從事資訊相關(guān)的職業(yè)前,應(yīng)有甚麼樣的自我準(zhǔn)備或是訓(xùn)練?

          您講的是職業(yè),而不是學(xué)業(yè),那表示您已經(jīng)完成了自我基本訓(xùn)練(不然就進(jìn)不了職場(chǎng)羅)。我想,那麼,心理建設(shè)是最重要的。老話一句,活到老,學(xué)到老。其實(shí),興趣是最重要的,有了興趣做後盾,吃苦當(dāng)做進(jìn)補(bǔ)。沒(méi)有興趣,再輕松的工作也是無(wú)聊,虛度人生而已。

          我工作的時(shí)候,常常做到肉體和精神的負(fù)荷將至極限,才放下來(lái),抒發(fā)一下。靜一靜,喝杯咖啡,回想剛剛完成的成績(jī),想著想著興致又來(lái)了,又坐到電腦前面干活。出國(guó)旅游的時(shí)候,飛機(jī)上的漫長(zhǎng)光陰就是我瀏覽整理MSJ、DDJ、WDJ 等期刊的最好機(jī)會(huì)(我總是帶一袋子)。你要怎麼解釋一個(gè)人瘋狂的干勁兒呢?辛苦但是快樂(lè),唯「興趣」二字可以解釋。

          四、面對(duì)壓力與挫折,您如何面對(duì)?在工作成果滿意與不滿意中如何取得協(xié)調(diào)?

          這好像在做家庭訪問(wèn)了。年歲相差太遠(yuǎn),心境與作法都不會(huì)相同,也不容易感染。此題免了吧。

          五、您當(dāng)初如何下定決心從事這一行的呢?當(dāng)初做了甚麼樣的自我準(zhǔn)備?

          我不知道「這一行」是指我進(jìn)入資訊界,還是指我進(jìn)入資訊寫(xiě)作界。如是前者,因?yàn)榕d趣所在,就進(jìn)去了。如是後者,因?yàn)橛X(jué)得可以有比較大的貢獻(xiàn)和發(fā)揮,就轉(zhuǎn)過(guò)來(lái)了。至於自我準(zhǔn)備,大約就是把本質(zhì)學(xué)能的基礎(chǔ)打好吧。「電腦技術(shù)專業(yè)作家」的頭銜似乎還沒(méi)有尊榮到可以讓小朋友做為「我的志愿」,或年輕朋友做為「心目中理想的十大行業(yè)」,我自己是在...呃...寫(xiě)作之後才開(kāi)始學(xué)習(xí)寫(xiě)作的。當(dāng)然,每個(gè)人對(duì)文字的掌控能力與風(fēng)格,即使沒(méi)有刻意培養(yǎng),也可能在從小環(huán)境或耳濡目染的情況下發(fā)展出不同的水準(zhǔn),而那會(huì)大大影響行文的順暢與可讀性。

          如果有心在資訊工業(yè)界發(fā)展,最重要的「自我準(zhǔn)備」就是把基本功(作業(yè)系統(tǒng)、語(yǔ)言能力、資料結(jié)構(gòu)、演算分析...)學(xué)好。常常追逐哪一種開(kāi)發(fā)工具的哪一個(gè)最新版本的哪一個(gè)很炫的功能,是舍本逐末。如果有心在資訊寫(xiě)作界,「自我準(zhǔn)備」就還包括組織能力和文字能力。尤其是組織能力。有志於此的一些朋友告訴我,希望多做些翻譯工作然後再開(kāi)始創(chuàng)作,但是各位要知道,單純的翻譯,如果沒(méi)有特別用心,對(duì)於組織能力沒(méi)有絲毫幫助。

          六、從事這一行有無(wú)充分的在職進(jìn)修機(jī)會(huì)?

          一般而言資訊公司主管都相當(dāng)清楚這一行的一日千里,所以稍具規(guī)模者應(yīng)該都會(huì)提供進(jìn)修機(jī)會(huì)。如果你說(shuō)的是「留職停薪修碩士博士」這種大 case,那恐怕要研究單位或很大很大的公司才有。一般的技術(shù)研討會(huì)、新技術(shù)(產(chǎn)品)發(fā)表會(huì)、國(guó)外電腦大展等叁加機(jī)會(huì),應(yīng)該是不少的。科學(xué)園區(qū)和工研院里頭的這種機(jī)會(huì)就非常非常多。不過(guò),您的表現(xiàn)是否足以膺此「種子」重任,則是後話。

          七、您對(duì)於非資訊相關(guān)科系畢業(yè),但有志從事資訊工作者,有什麼建議?> 如何建立一個(gè)自我學(xué)習(xí)的方法,以免有閉門(mén)造車之憾?

          唯有比別人更努力,才有機(jī)會(huì)。別忘了別人也非常努力,而且占盡優(yōu)勢(shì)。避免閉門(mén)造車之憾,應(yīng)多培養(yǎng)大局觀,最簡(jiǎn)單的方法就是多看雜志和期刊(國(guó)內(nèi)國(guó)外都要)。對(duì)大學(xué)生而言,期刊似乎有點(diǎn)嚇人,但多接觸自然就有機(jī)會(huì)。No Touch,No Chance。

          八、一個(gè)資訊人是否真的會(huì)忙得沒(méi)有休閑娛樂(lè)的空閑?

          很有可能。我住的這棟大樓 190 戶里頭有一半以上在交大、清大、工研院、科學(xué)園區(qū)工作,其中又有許多在資訊領(lǐng)域,所以基本上我滿清楚我們這些人類的生活形態(tài)。年輕的朋友們忙著專案進(jìn)度、還要抽空進(jìn)修充實(shí)自己,未婚者以公司為家是很常見(jiàn)的事。同事們常常下班後相約吃個(gè)飯,再回辦公室充電。年長(zhǎng)的朋友們有了點(diǎn)事業(yè)基礎(chǔ),但還是要忙著主持計(jì)劃、撥空進(jìn)修充實(shí)自己(否則怎麼帶個(gè)個(gè)頭角崢嶸的弟兄們)。

          要說(shuō)能夠固定時(shí)間看個(gè)電影,唱個(gè)卡拉OK,甚至周日去爬爬山,我真的很少遇過(guò)。

          九、面對(duì)資訊日新月異快速更替的洪流下,您是否會(huì)有怕跟不上或是將來(lái)跟不上的焦> 慮呢?如果有,您是如何克服的呢?

          有啊。我常和同輩朋友們彼此消遣:『唷,還沒(méi)被淘汰啊?雜志上的名詞還跟得上吧?什麼時(shí)候轉(zhuǎn)行呀』。吐吐苦水可以排遣情緒。但追根究底,怕跟不上,就加倍努力。

          十、您認(rèn)為一個(gè)資訊人應(yīng)有怎樣的生涯規(guī)劃?

          剛出校門(mén),一定是做 programming 的工作。既然有興趣做為後盾(沒(méi)有的話就免談了),請(qǐng)把十八般武藝好好學(xué)學(xué)。名門(mén)名校的身段放下來(lái),高學(xué)歷的身段放下來(lái)。實(shí)務(wù)經(jīng)驗(yàn)都沒(méi)有,又要擺身段,徒惹一頓笑而已。基本功扎實(shí)了,要開(kāi)始注意專案怎麼規(guī)畫(huà)、人力怎麼安排、規(guī)格書(shū)怎麼開(kāi)、文件怎麼寫(xiě),培養(yǎng)自己做為主管的能力。當(dāng)然,此期間,表達(dá)能力、分析能力的培養(yǎng)一樣也不能少。人際關(guān)系更不能因?yàn)榧夹g(shù)的提升而降低。所謂千兵易得,一將難求,技術(shù)以外的能力,往往是決勝的關(guān)鍵。

          我的好朋友,曾銘源先生(Run!PC 前「美東隨筆」專欄作者),去美三年,年薪從四萬(wàn)調(diào)整到...不可說(shuō)的程度,被公司倚為「絕對(duì)不可或缺的人物」。他付出了許多許多,而成果豐碩。走這一行,前途完全在自己手里。

          很多同學(xué)抱怨資訊界實(shí)在太辛苦。但我提醒各位一點(diǎn),念資訊的人,自我掌握度非常高。其他科系的學(xué)生要怎麼樣才能夠自力做出點(diǎn)成績(jī)?除了死K書(shū),怎樣才能夠擁有實(shí)務(wù)經(jīng)驗(yàn)?整個(gè)土木系四年我也不過(guò)就叁觀了北橫榮華壩和臺(tái)中港而已,要說(shuō)實(shí)務(wù)經(jīng)驗(yàn)?zāi)鞘前朦c(diǎn)沒(méi)有。念機(jī)械的人怎樣才能夠設(shè)計(jì)一個(gè)機(jī)構(gòu)并且自己把它做出來(lái)?念電子的人哪有機(jī)會(huì)自己 layout 一塊板子?念生化的人,不上實(shí)驗(yàn)室哪有機(jī)會(huì)自己培養(yǎng)一只菌?

          很多很多領(lǐng)域,都需要很大的旁助力,才有辦法 do something。但資訊系學(xué)生,一臺(tái) PC 就可以把自己鍛煉成百戰(zhàn)金剛。一切都掌控在你自己手里,成也由你,敗也由你


          posted on 2006-01-08 15:49 Titan 閱讀(683) 評(píng)論(0)  編輯  收藏 所屬分類: 候捷老師的文筆

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 天镇县| 新建县| 淮阳县| 兰考县| 沙坪坝区| 虎林市| 隆尧县| 吉安市| 满洲里市| 宁城县| 宝鸡市| 姜堰市| 民丰县| 得荣县| 贡山| 宁津县| 石嘴山市| 新余市| 蓝山县| 汶川县| 丹棱县| 墨脱县| 河津市| 嘉祥县| 六枝特区| 车致| 清苑县| 巴林右旗| 乌拉特后旗| 郴州市| 光山县| 宣化县| 阳泉市| 宾阳县| 绩溪县| 扎赉特旗| 彭州市| 五台县| 十堰市| 怀安县| 烟台市|