精華區beta CompBook 關於我們 聯絡資訊
【回首下望塵寰處】 侯捷 jjhou@ccca.nctu.edu.tw 1999.01.14 第一次發表於 清大.楓橋驛站(140.114.87.5).電腦書訊版(Computer/CompBook) ----------------------------------------------------------- ●讀者來函 以下是 judy 的來信: > 我在光華商場和資訊展分別購買了您所著的 <Polymorphism in C++> > 和所譯的 <Inside The C++ Object Model>,心中真是感觸萬千, > 依稀記得以前唸書的時候嚴謹與細緻的心境,而今見到閣下的著作 > 真是感動又有些許的感慨了 !! > > AnyWay,請您教我如何在 C++ 領域漸至佳境以至 > 到讀您的書可以心領神會 -- 心曠神怡的地步好嗎? > > 我近一年的工作是在工廠自動化的方面,Including > 物流,生管,與設備/PLC 連線 ,LAN 的架設,資料庫 > 的建立維護...等,我會 VB/95(前端),Oracle/UNIX, > C for UNIX(設備/PLC 連線),就這些。企業文化的逼趕 > 常讓我覺得無能無法完成理想的產品,能做到好用就 > 不錯了…,此無奈也,我一直很期待能用純物件導向 > 的藝術重新架構我們的這一每案大同中異的程式核心。 > > 我的求學背景可能與您有些相同,建中 => 交大機棫 > => 台大機控制組,或可能曾是學長學弟也不一定喔..^_^ > 我的問題很很初步,請您給我多指導好嗎? > > 1.如何在較短時間內將 C++ 學好,步驟如何? 我想先 > 瞭解其精神再進入實作對嗎 ? > 2.我覺得 C++ 似乎很費時難寫但架構性完整擴充性 > 佳,對嗎,值得嗎? > 3.學了C++ 後要在 WINDOWS 上Program 可不夠,還 > 得學 Visual C++ 用MFC 才行豈不是很費時 ?? > 4.那 Bolard C++ Builder 又如何呢? 直接用 BCB 不是最 > 快嗎 ? C++,VC++,BCB...之間的學習相關性是如何呢? > 5.在WINDOWS 上如何運用 C++ 呢,要作出像 Access, > Excel 等表格式的畫面是否大工程呢 ? > 6.我欠缺學習方向與指引,時間又有限走錯方向怕就沒 > 得玩了玩完了,我得珍惜每一次可以改寫程式的機會。 > > 請給我指導, > 期待您的回音 …… > > p.s NCTU,, what a wonderful place ... ●感動 或許因為次數的關係,或許因為文字深度的關係,我對於讀者來信 簡單寫著「你出了一本好書」、「對我幫助很大」、「感謝你的用心」 這類話語,漸漸只引來一抹微笑與5分鐘愉快的心情,便可回到現實。 但是收到像 judy 這樣蘊含深刻感情的信,即便只三言兩語,卻能 觸發我的心弦,久久不已。 武漢讀友王凱先生,講了一句我很喜歡的話。他說: 『銷售量可以表現一本書的價值; 讀者如何看待一本書,更可以表現它的價值。』 很開心我的寫作與精心安排的學習歷程,得到讀者共鳴。1998/12 月份的 <資訊生活雜誌> 中有一篇關於 <多型與虛擬> 的介紹,也 很讓我感動。一看就知道該文作者把 <多型與虛擬> 讀得熟透。 靜下來想想,有人如此仔細地閱讀我的一字一句,我就簡直…簡直是… 實在不知道該怎麼說! ●斑斑血淚話滄桑 在 C++ 和 MFC 的學習道路上,我接觸到太多人的斑斑血淚了。 我很平庸,和各位每天週遭都會接觸到的一大堆人一樣,所以我 並不是一夜昇天地頓悟了 C++ 的物件導向精神。我也並非一夜 昇天地接受了 MFC 的工作模式。我目前所擁有的心得,和絕大多數 過來人一樣,是經過許多學習,許多思考,許多蘊釀,許多發酵, 才得到的些許果實。 我講這話的意思是,朋友們在這條路上的學習挫折與困頓,我都 非常瞭解。做為一個學生,在羽翼未豐階段遇到天才型老師, 是最大的不幸。天才型老師不知人間疾苦,他完全不明白在他看來 如此簡明的道理為什麼你不懂。天才適合投入研究,不適合投入教育。 我這個絕對平庸的老師,卻能夠知道眾生的困厄,知道你的惶恐與苦難。 因為我都經歷過。 ▲1.如何在較短時間內將 C++ 學好,步驟如何? 我想先 瞭解其精神再進入實作對嗎 ? 物件導向的精神,依我看,除了少數天賦異稟的高材之外,很難 一蹴而及 -- 特別對已有其他電腦語言基礎的人而言。為什麼? 因為你愈有傳統程式語言的基礎,你就愈知道「每件事情的發生, 都該有人動手」的遊戲規則,你就愈習慣尋求程式中那根應該要有 且脈絡分明的動線。C++ 編譯器卻為我們做掉了太多事情,隱藏了 太多動線;語言本身的彈性又太大了,大到一向在框框裡循規蹈矩 的我們不太容易體會與接受。 有一天你站在學成的山巔,回首下望塵寰處,會感概那些動線那些機制 隱藏得多俐落,那些 operator overloading 和 virtual mechanism 多麼美妙,polymorphism 和 template 多麼神奇。但那是顧盼自得 回首前塵的時刻。學習階段中,這些美好性質卻成為前進的阻力。 你明明知道電腦是死的,它卻怎麼能擁有 polymorphism 這樣的能力呢? 又怎麼做到 generalization 這樣的性質呢? 為什麼腦海裡老有個疙瘩?因為你未曾訪過一遍關鍵性的內部機制。 照說,本來不應該這樣子學習物件導向的。物件導向應該是讓人覺得 「一切就那麼自然」的一種性質。可是太多人初學時總不自然,而訪 過一遍關鍵性內部機制,又帶給那麼多人美好的心得(從我的讀者來 函獲知)。所以,我總是持這樣的論調。 Kraig Brockschmidt(Inside OLE 作者)在為 "Understanding ActiveX and OLE" 一書所寫的序文中有個比喻: 『粒子物理學家瞭解,物質宇宙是由基本粒子以及左右其行為的 基本方程式構成,其他萬物都由這些基本元素衍生而來。這樣清澈 的認識通常只在一小群受過訓練的門徒之間留傳,他們能夠接觸到 這個領域的一些近乎秘傳的重要知識。至於一般大眾,由於未曾 受到如此的啟蒙,只能看到從核心演化出來的炫目複雜度。由於 缺乏基本的橋接,大部份人認為基礎物理令人費解而且不易親近。 對許多人而言,COM 有點像是基礎物理學的一個分支:令人費解 而且不易親近。』 大家一定看得出來這段話的重點。導至許多人認為基礎物理令人 費解而且不易親近的原因,是「未受啟蒙以至缺乏基本的橋接」。 我覺得用在任何一個技術領域,這個比喻都是合宜的。以 C++ 而言, 基本的橋接知識就是物件模型、虛擬機制等等關鍵性內部架構。 我正在做一項實驗。我正在教小學六年級的姪子 C/C++,看看他接受 物件導向觀念的情況如何?這項實驗結果,可以對我之於 OOP 的教育 看法帶來一些佐證或推翻。 其實個案並不具統計意義。目前具有統計意義的數據就是,我們看到 太多光在 C++ syntax 和 C++ semantics 層面學習而成效不彰的例子; 即使會寫程式了,會寫不小的程式了,心中的疙瘩仍在。我們又看到 許多從 object model 切入而成效良好的例子。 C++ 該怎麼學?請參考「C++ 的沉迷與愛戀」(侯捷/1998)一文。 我能夠給的最具體意見就是:找一本好書,和一位好老師。找一位 好老師有實際上的困難,所以找一本好書就成為最可實踐而成本低廉 的建議。 好書在哪裡?請參考「C++ 的沉迷與愛戀/侯捷 1998」或 「主廚推薦 侯捷菜單/1999」一文。裡頭列出好幾本書, 適合各種層次的人閱讀。 > 我想先瞭解其精神再進入實作對嗎 ? 因人而異。物件導向的抽象觀念與精神,日常生活中信手捻來俯拾皆是, 但如果缺乏具象的實作手法,一旦你要把精神與實務融為一爐,卻 發現它們像水和油一樣地涇渭分明。 所以 OO concept 和 OOP 一定要雙頭並進。你不能夠光說不練, 你也不能夠光練不想。 judy 已是多年的工程師了,programming 經驗已有相當基礎, 不妨多面向地做點嘗試。無論如何,隨時寫點小程式實驗一下 自己的想法,是很重要的。 集中火力,在數個星期甚至數個月之內,讓自己全心處於 OO 思維模式之中,使 OO 思考成為一個烙印,我想也是很有幫助的。 是嘛,要撞就撞點深刻痕跡出來,不要船過無痕,功夫全白費了, 下次又重頭來過。 ▲2.我覺得 C++ 似乎很費時難寫但架構性完整擴充性佳, 對嗎,值得嗎? C++ 不甚好學,但學會後很好用,資源也很豐富。學習 C++ 是 值得的,即使要轉到 Java 也快得很。至於你所謂的費時和難寫, 我不很清楚你的意思。 C++/OOP 的哲學在於讓人寫出重複使用性高的 software components, 也在於讓人使用別人寫好的重複使用性高的 software components。 這其實互為表裡。 ▲3.學了 C++ 後要在 WINDOWS 上 programming 可不夠,還 得學 Visual C++ 用 MFC 才行,豈不是很費時 ?? 這便是我剛剛說的,學習使用別人寫好的「重複使用性高的 software components」。MFC 就是一大套 C++ class library。MFC 有其複雜度, 但學會它(最重要是它的組織架構),你便可輕鬆在 Windows 環境上 開發應用程式。 說到費不費時,如果不使用現成的 MFC 或 OWL 或 VCL(都是用於 Windows 環境上的 class library),鐵定更費時。 所以,先學 C++,然後學一套 C++ class library(規模大到可稱 為 framework 者),已幾乎成為必趨之路。 ▲4.那 Bolard C++ Builder 又如何呢?直接用 BCB 不是最 快嗎 ? C++,VC++,BCB...之間的學習相關性是如何呢? 先學好 C++。然後在 VC++ 或 BCB 或(其他 framework 產品) 之間挑一個。學 VC++ 主要是學如何運用 MFC,學 BCB 主要是學 如何運用 VCL。 ▲5.在WINDOWS 上如何運用 C++ 呢,要作出像 Access, Excel 等表格式的畫面是否大工程呢 ? 如果你使用 VC++(MFC)或 BCB(VCL),就不算大工程。 ▲6.我欠缺學習方向與指引,時間又有限走錯方向怕就沒 得玩了玩完了,我得珍惜每一次可以改寫程式的機會。 慎選一本適合自己的好書,做為起點。這就是我對你的忠告。 again,「C++ 的沉迷與愛戀/侯捷/1998」和「主廚推薦 侯捷菜單/1999」 列出好幾本書,適合各種層次的人閱讀。 --- the end  -- ※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ Mail: jjhou@ccca.nctu.edu.tw