讀者來信 & 我的回覆 part3

侯捷 1999.08.26


上次我在 CompBook 回覆了 ycchang 讀者詢問關於 pointer to data member
的問題
之後,當天收到兩封很長的信。其中反應共同的情緒:

焦慮 焦慮 焦慮 焦慮 焦慮 焦慮 焦慮

希望這封信能夠解除你的部份焦慮。


●ycchang 的再次來函 1999.07.21

> 侯老師您好!
> 首先要謝謝您的回信,每天我都在等您的回信,總以為我這種小人物
> 以及自己問的小問題會讓您覺的不以為然

我真的不希望你這麼想。我不是大鯨魚,你也不是小蝦米。何況你問的問題很不錯呀。

> 關於您的來信回答使我心中的結因而迎刃而解,也使我有再
> 想重拾C++課本的一股動力和信心
>> 一個問題。你說你是大一資訊科系的準新生,這麼說
>> 你高中就開始讀 <多型與虛擬> 了嗎?你是高中電腦社員嗎?你能說說
>> 在你週遭,電腦的學習情況嗎?我很有興趣聽。
> 關於這一點,還煩請侯老師稍為耐心看完囉,可能是我的苦水,也可能是
> 眾多想成為像侯老師您一樣的電腦科系同學們的心聲.
>
> *About Me*
>
> [delete] ...但我並不灰心,因為我知道我比
> 別人找跨出一步,我雖然比別人笨拙,但我有一股好學以及打破砂鍋問
> 到底的精神,但在以好學為前提的驅使下也為我佈下了重重的問題,讓我更
> 為迷惑,讓我每天為之憂鬱.
>
> *我的疑惑*
>
> 要在電腦領域占有一席之地的人,一定要樣樣精通嗎?,在別人的
> 眼裡好似懂得越多或摸得越多別人所沒摸過的就一定是強,一定是有程度,
> 可是在我學習的路上一路走過來,我倒覺得專精最重要,

你說的沒錯。

學習太多語言或太多工具,對一般資質的人而言,恐怕是「太多的廚子壞了湯」。許多同學面試時口中天花亂墜,拿出手來卻是樣樣稀鬆。這沒有用的。

> 可是又面臨到一個
> 問題 - "我所學的所專精的趕得上時代的潮流嗎?" ,我很害怕我很矛盾,同
> 時這也是驅使我在同一段時間裡去學習C++ 和JAVA的緣故,甚至希望將來在
> 大學一年級裡是在*複習*是在*精進*.

除了創造趨勢的人以及所謂的趨勢專家,沒有人敢肯定「自己所學趕得上時代的潮流嗎?」。

一法通,萬法通,並不是武俠小說才有的境界。孔老夫子不也說「吾道一以貫之」嗎。如果你對某個領域鑽研夠深,對其中原理都搞得相當清楚,那麼學習同一領域內的新技術自然左右逢源;學習不同領域的技術也可能觸類旁通。基礎奠定愈好,學習速度愈快。

變化快速的,都是膚面的東西。事物的根本之道少有改變,甚至歷久彌新。

如果老是擔心潮流與趨勢,只好現在什麼都不要動,等三年後一個不知是什麼但肯定比現在更方便好用的東西出現 :)

當然,適度瞭解技術的變遷,市場與職場的變化,並在學習方向上做適度的調整,是必要的,但不要忘了「過猶不及」這句話。

> 但在長達三個月的學習過程中,踢到
> 的鐵板不是sytax 及 sematic 上的問題 ,而是這兩種語言的OO的觀念
> 甚至您《虛擬與多型》中 Object model的眾多問題,也讓我在還沒收到您回
> 信前放棄學習C++而轉向JAVA 程式語言,因為至少JAVA 把很多OM的觀念都
> 給隱藏起來甚至能寫出更多具multimedia的程式讓我重拾信心.可是
> 我想我的想法是錯的,因為我曾經在懷疑我的OO mode 是不是專家學者們所
> 謂的OO mode,這又讓強調professional的我對它為之放棄.我很想請問侯
> 老師您一路的學習都是怎麼走過來的呢?有像我這樣獅子張口一樣什麼都想
> 把它裝到腦袋裡嗎?

為什麼寫出更多漂亮介面的程式就使你重拾信心了呢?你是否忽略了你所要學習的事物的本質所在!(當然,我知道,就教育性而言,漂亮的介面容易引起學習者的興趣)

看來你很重視 Object Model,這是好事,這可以幫助你瞭解技術的本質。但它並不是求知的最後目標 -- 除非你立志要成為研究Object Model 的學者。對你(及絕大多數資訊人)而言,學習 OO 的最終目標應該是以 OO 的觀念與技術協助開發大型軟體。

我舉我的經驗為例。我之所以研習 C++ object model,是因為當初我不瞭解為什麼 C++ 程式中有許多動作會自動執行(例如 ctor 和 dtor);我知道 virtual functions 很好用,但我不知道為什麼會有那種神奇效力。諸如此類種種,與我過去的知識牴觸,所以我必須把底層機制搞清楚,才能放開大步向前行。當我搞清楚了,我不會在學習 Java 時再來這麼「深度探索」一次,因為我已經胸中自有丘壑了。把這些心得整理下來,是因為以己度人,猜想可能很多人也有相同的困惑。我的經歷可以幫助他們快速走過這個狀態。

再舉一個例子。我研習 Windows 內部實作方式(最棒的就是那本《大奧秘》),徹底瞭解 process, thread, context switching,separate address space, dynamic linking…是怎麼實作出來的,這使我對整個作業系統了然於胸。我不會想再挖掘其他作業系統的實作方式(除非我的研究方向就是作業系統本身)。

這些基礎知識讓我處於一種十分飽足安祥的狀態。最後可能有些細節忘了,有些細節模糊褪色,沒有關係,因為我已經「走過那個狀態」。

你問起我的學習態度。你問我:

> 有像我這樣獅子張口一樣什麼都想把它裝到腦袋裡嗎?

我說,在我所選擇的路線上,我也會獅子張口。我會挖掘原理和底層機制,直到飽足為止。

這裡的重點在「選擇」與「飽足」。你(以及其他年輕朋友)一不會選擇,二不知何為飽足。這當然是因為歷練不足之故。事實上剛上大學的你還處於一個很生嫩的狀態,當然沒有什麼選擇能力和判斷能力。這種能力有很大的個人成份,教不來。但是多與師長聊聊,是不錯的。


> and 您覺的現在的我有JAVA和++的基礎該往那個方向
> 努力邁進,現在的我缺乏的是一個方向,缺乏的是一個正確的學習態度
> 其實在學長們(大一)還沒結束前,我曾拿他們的考試題目來做(JAVA),但我
> 發現一個弊端,教授教的是syntax,考得也是syntax但OO呢?似乎沒深入的去
> 提及 OO 提及 Polymorphism,反觀C++班呢?考得是繼承體系下的語法關念
> 對於polymorphism 以及 OO的概念似乎是提得很少.告訴侯老師您一件好笑
> 的事.有一次我和我學長趕作業...[delete] ...那時我心裡想,大二他們該怎麼
> 辦,大二又要接觸新課程,對大一的東西也不會再精進,難道就要一直爛
> 到大四畢業爛到就業時還不知道自己是所謂的二流程式設計師嗎?或許是
> 我好勝心太強了,甚至有學長告訴我若要太去研究所謂的OM,以及底層機制乾
> 脆去學組語好了,他們告訴我,先把那些擺一旁等學多了自然會豁然開朗,可
> 是我很想問 "是要等到要做專題遇到以前未知的底層機制而要去debug時,才
> 去買本OM的書去買本《虛擬與多型》來研究嗎?我很困惑...

有些東西學多了自然會豁然開朗;有些東西如果沒有點通,學再多也沒辦法「自然」豁然開朗。

object model 以及底層機制,和組語有什麼必然干係?

很多人的苦悶吧!一肚子迷惘,未能得良師益友解惑。

我實在也不知道能對你說些什麼。如果你的思慮超越同儕,你應該多多尋求老師的幫助。三個臭皮匠,抵不上一個諸葛亮。


>> *你高中就開始讀 <多型與虛擬> 了嗎?*
>
> 不,開始讀多型與虛擬是在我得知大一下的課本是用侯老師您所著作的《虛擬
> 與多型》一書於是我才趕緊買一本來研讀.第一次看感覺就是不一樣,有一
> 定的深度,就好比外國作家寫的書一樣,很有說服力,很有自己的見解.
> 雖然看到最後也讓我有點想放棄的感覺,因為我感覺到C++的背後又有那麼多
> 的小細節,甚至沒辦法和多型與虛擬融為一體,常會問"怎麼才能說算學完C++
> ,何時才能用C++寫出一個龐大的application呢?" 以上只是個人在吐苦水
> 若老師您覺的不以為然的話可以不做任何批評,在此也很感謝有這個機會向
> 老師您吐露心聲,在此說聲謝謝.

你的問題,常常有人問。我建議你上【侯捷網站】看看 [散文1998] 和 [散文1999],以及【無責任書評3】的 [選義按部,考辭就班] 一文。這裡節錄我的朋友徐逸輝先生(他的 OO 功力與實務經驗令我尊敬)的回答:

以下摘自 [侯捷網站/散文1999/回首下望塵寰處]:

> 1.如何在較短時間內將 C++ 學好,步驟如何? 我想先
> 瞭解其精神再進入實作對嗎 ?

短時間內(3個月內)要從完全 procedure programmng 到心領神會
oop是不太可能的,仔細看完3本書再寫上萬行程式,再重寫二次,
或可登堂入室.

> 2.我覺得 C++ 似乎很費時難寫但架構性完整擴充性
> 佳,對嗎,值得嗎?

費時難寫是初學者必定會有的看法,
架構性完整擴充性佳是稍具功力的人才寫得出來.
學OO不是值不值得的問題,是一定要學的基本玩意.

> 3.學了 C++ 後要在 WINDOWS 上 Program 可不夠,還
> 得學 Visua C++ 用 MFC 才行豈不是很費時 ??

> 4.那 Bolard C++ Builder 又如何呢? 直接用 BCB 不是最
> 快嗎 ? C++,VC++,BCB...之間的學習相關性是如何呢?

寫程式沒有不費時的,要在 UI上省時間請用VB/Delphi/C++Buider,
但寫 funcion kernal 的時間是一樣的,
用VC++,BCB 都得精通C++.VB不具OO特性.

> 5.在WINDOWS 上如何運用 C++ 呢,要作出像 Access,
> Excel 等表格式的畫面是否大工程呢 ?

用SDK很難,VC++較容易,BCB則更容易.

> 6.我欠缺學習方向與指引,時間又有限走錯方向怕就沒
> 得玩了玩完了,我得珍惜每一次可以改寫程式的機會。

學習不一定得在工作時間,利用工作學習OO是一種冒險,沒有人第一次
寫C++程式就有完整的OO在裡面,若想在工作時一次就搞定(註:很難),
請先完成第一項步驟.


> 另外值得一提的是在您*虛擬與多型*一書中我覺的有個問題
> 您在書中的建構式與解構式中曾說
> *copy constructor 在以下兩種情況下會被喚起
>
> 1.將一個object當做引數傳給一個函式
> 2.將一個object當做函式回返值
>
> 但我覺得 *定義某類別的物件時,同時以同類別的物件做為該物件的初值*
> 也應該會喚起copy constructor(參考自蔡明志 軟體的IC不是夢 p4-45)
>
> foo p = foo();
> foo object = p;
>
> 以上僅供參考,若有錯誤煩請您指正


你說的沒錯。我應該講更清楚些。以下是個小例子,做為結論:

#include <iostream.h>

class foo
{
public:
foo()
{ cout << "default constructor" << endl; /*...*/ }

foo(const foo &rhs)
{ cout << "copy constructor" << endl; /*...*/ }

foo& operator=(const foo &rhs)
{ cout << "copy assignment operator" << endl; /*...*/ return *this; }
};

int main()
{
foo p = foo(); // invoke default ctor and copy ctor
foo object = p; // invoke copy ctor

foo f1; // invoke default ctor
foo f2; // invoke default ctor
f2 =f1; // invoke copy assignment operator

return 0;
}


執行結果:

default constructor
copy constuctor
copy consructor
default constructor
default constructor
copy assignment operator


> 請問侯老師,學C++的過程中是否須要配合寫algorithm來增進解題的能力
> 呢?亦或是algoithm還不適合大一生?
> 請您抽空回答,並抱歉打擾您寶貴的時間


學 C++ 不必搭配學習 algorithm。

algorithm 這門課很重要。對大一生恐怕是太難了。不過,狹義的
algorithm 指的是像 shell sort, quick sort, bubble sort 等
尺度嚴謹的演算法,廣義來講則解決問題的程序都可視為一種
演算法。所以任何 procedures or functions 的內容也都是個
algorithm 呢。


●edward 的來函 1999.07.21

> 侯老師:
>
> 忍不住又寫了封信給您..看到您這兩天都有在CompBook回覆,
> 我想大概是因為C++ Primer中文版差不多完成了, 才有這樣的空閒吧.
> 每次看CompBook板, 總是希望能多看到您的文章, 因為對我確實有很大
> 的激勵作用.
>
> 最近放暑假了, 終於有時間可以好好看點書了, 不是說平常不看書,
> 只是看課內的書, 就是資科系唸的一些科目, 一些很理論的科目, 我還沒修過
> OS, 系統程式, 計算機結構, 嗯..為什麼提這呢? 這會和我等下說的有關...
>
> 我買您的第一本書是多型與虛擬,(其實不是第一本, 我第一本是買"侯捷"
> 的無責任書評, 但當時不知道是同一個人, 哈哈), 它所帶給我的不只是技術上的,
> 更是使我知道了不少好書, 也讓我知道是該多看點書了. 接著下來就開始留意您
> 的其他著作, 呵, 大奧秘也買了, 深入淺出MFC, COM的本質論, 另外也在圖書館
> 借了深度探索C++物件模型, Inside VC++, 還有VxD那一本....
>
> 多型與虛擬算是我看的最透徹地一本(除了後面模擬MFC的三大機制), 其他幾本
> 就看的不多了, 尤其是大奧秘和VxD, 我想是因為我對OS不了解吧! OS的書不知
> 道哪一本好, 您可否推薦一下呢? 我是比較傾向先看初淺的入門書, 我想先入門
> 要緊吧.不然看了一堆令人難懂的理論, 還是不知道是什麼.

請看 [侯捷網站/無責任書評3/Windows 系統深耕]。

如果要看一般性的(泛論型的)OS 書籍,問問系上用哪本,就看那本吧。

> 呵.買了這麼多書. 卻是一本也看不完, 但又想想您說的, 好書不要錯過, 就
> 買了放架上了......:) 我還買了Programming Windows 5/e 也還看不到十分
> 之一, 最近買了一本算是MFC的入門書, 想先會用, 再把您的深入淺出
> MFC看透徹, 真是每天看哪看, 恨不得
> 趕快把這麼多書看完. 精通十八般武藝...
>
> 除了期待您的C++ Primer中文版外, 另外還有三本書,
> 一本是Win32基本教義,另兩本
> 是多型與虛擬和深入淺出MFC的再版, 比較期待的是Win32那一本,
> 這是一本作業系統的書嗎?

是的

> 沒有作業系統的基礎能看嗎? 我想應該不行......我會進快補足
> 我OS的程度, 不過可能要留到
> 把MFC和Windows Pogramming透徹之後了,

我自己在元智教 "Windows 作業系統" 這門課。所以我對 "作業系統" 這門課有臨場教學經驗。

這門課很奇特。如果缺乏抽象觀念,一下子就具象實作,細節讓人受不了;如果沒有具象內容,老是講抽象觀念,又讓聽者如墜五里霧。資訊系開的作業系統課程,便是泛論型的 OS 課程;我開的,則是具象型(真正看到如何實作)的 OS 課程。所以元智把泛論型 OS 課程開在大三上,我的課程開在大三下,挺好。

如果兩種型態的 OS 課程混著上,更好。

你問:沒有作業系統課程基礎,能不能看《基本教義派 Windows 作業系統》?唔,我不知道。如果程式寫過不少、programming 底子還不錯、對於 process、thread、address space、dynamic linking、multitasking 有一些基本概念,應該可以看。

總之,買書前應該先在書店花點時間。

> 我在想一個最主要的問題, 就是"是不是我看書方法不對呢?"
> 看書的速度無法提昇, 實在很難看完這麼多書, 您是怎麼
> 大量閱讀的呢? 有一個好笑的想法, 您譯書譯完一本, 也
> 相當於看完了一本書..呵..不過當然不是這樣..我想您在
> 譯書前.就已經把書都看熟了.

你說的並沒錯呀,當我譯完一本書,我也相當於看完了它 -- 是
很紮實很紮實的那種閱讀。譯之前,當然我必須大略看過,評估書籍
的好壞以及自己的實力。

> 這樣想想, 那所花的時間, 應該非常的可觀.再加上書上有些程式碼要trace,
> 要coding,那更是費時. 想想自己,
> 不知道何時才能追上您呢? (有點偶像崇拜的意味了...:))
>
> 希望您能撥冗給我一些意見!謝謝!

我的閱讀比你快,那是因為我的技術底子比你好。等到你的基礎知識堆累到一個程度,你的知識累積速度也會很快。會比我快很多,因為我還必須整理出來給別人看,你可以頭也不回地向前飛奔(不過,回頭做做心得筆記,絕對有好處就是了)。

> ps. 您的《多執行緒》那一本絕版了, 我一個月前在天瓏還有看到,
> 上星期則沒了, 真後悔沒有買.

打電話給眳p,應該還有。


●edward 的來函 1999.08.24

> 侯老師:
> 在CompBook板看到您無法在1999年出版【windows基本教義派】
> 和【深入淺出MFC 3/e】,心中不免有些遺憾,不過如果您為了如期完成
> 而降低了品質,那才更令人遺憾。
> 不過有幾點疑問,原先您要在【深入淺出MFC 3/e】和【多型與虛擬 2/e】
> 兩書作交叉索引,那如果【多型與虛擬 2/e】先出版,會不會影響到
> 【深入淺出MFC 3/e】索引?

不會。我說的交叉索引不是指書後的 index,是指 cross reference。

兩書章節都已確定,所以大要式的 cross reference 是沒問題的。

> 另外,原先不沒在新書計劃看到【泛型程式設計, using STL】,真是令人
> 驚訝,這是否是原先【多型與虛擬 2/e】新增的計劃?

原本想在【多型與虛擬 2/e】中新增 template 和 STL generic programming。
但這個主題非常大,份量上也值得成為另一本書,所以分割出來。

> 最後,【windows基本教義派】您應該醞釀已經很久了,從【大奧秘】序言就
> 看到您提起您心中所期望的真正完美的windows作業系統書籍,應該要有大量
> 圖片來解說,就是指這一本【windows基本教義派】吧? 很希望您仿照
> 【C++Primer中文版】在雜誌上刊登部分稿件,讓讀者先睹為快。
> 謝謝您.

你的期盼之情,使我的寫作多一份動力。

文章放在雜誌上,漸漸使我感到頭痛。我不是責怪任何人,而是雜誌作業方式使我無能(也可以說是我撥不出這樣的時間和精力)掌控最後成品,而我愈來愈無法忍受這一點。

此外,翻譯尚可安排進度,按月完稿。寫作則是千改萬改,未交稿前一直在改,所以也沒有可能先刊登部分內容。

半夜寫稿時思及你的期盼之情,一定不感寂寞。


●Lmx 的來函 1999.08.25

我收到一封語意看起來不像是寫給我的信,可是信件的郵寄地址卻又是我的 email address。

Lmx wrote :

> 你好! 冒昧打擾! 我是侯先生的一個讀者.
> 有個小問題想請教,
> 我想找Win32程式設計的書,
> 很不幸的我找遍臺中都找不著,
> (哦! 抱歉! 我指的是基礎書.)
> 松崗近幾個月有一本, 不過實在不敢恭維,
> 我知道有本書是我要的:
> Programming Windows 95 中譯版
> 作者 Charles Petzold 譯者 侯俊傑
> 松格出版社
> 很不幸的, 松格出版社已經倒了,

我從沒譯過此書,也從未曾把書交給松格出版。

> 所以請教的問題是, 此書還有存在嗎?
> 若否, 最近剛出的
> Programming Windows 95 fifth edition
> 侯先生有打算中譯嗎?
> (如果我印象正確, 松格的那本應是四版吧?)

這本書確實的名稱叫做 Programming Windows (5/e)

我沒有打算譯這本書。這本書很棒,但是我的時間與精力有限。

另外,但願各位不要誤會,以為侯捷想譯哪本書就可以譯哪本書。外文書的譯權是由國內出版公司談簽的,而譯者當然也就是國內出版公司找的。

> 如果又否,
> 還有任何取代書嗎? (我想很難呀!)
> 有其他出版社還有四版的中譯版或原文書嗎?
>
> 在探討狐貍及 "山高月小, 水落石出" 的某書中, ^_^
> 有一章寫Win32寫的非常精闢, 但很可惜的,
> 那本是MFC的書...
> 一章也實在太少了, 只夠留口水呀!
>
> 發個勞騷, 國內MFC書籍滿山滿谷,
> 但Win32卻少得可憐耶,
> 難道大家進步太快, 才氣縱橫, 都
> "直接學C++"
> "24小時學Visual C++"
> "C++天才班"....
> 就算如此, 我想我沒此才華(殺死我也沒法24小時 ^_^')
> 所以"十年學會Visual C++"這種書可能比較適合我.
> (哇! 那會多大本? ^_^)
>
> 另外一個看法, 關於基礎書,
> 如果只算中文書吧!
> 把 深入淺出MFC 和 Inside Visual C++ 帶回家,
> 絕對可以鍛造不錯的MFC基礎, 我相信!
> 但是要請誰來帶它回家呢?
> 換句話說, 侯傑的書好, 但讀者不夠好,

天呀,您甭找罵挨了 :)

> 如果我問侯俊傑先生要懂視窗程式設計
> 要看過哪些書?
> (這個問題News group天天都有)
> 我相信侯先生的回答應最為中肯,
> 開出一堆書單, 只可惜這些榜上名書國內沒有!
> 問題出在這裡, 國內技術有斷層,
> 我想不可能不透過原文書而能打出足夠根基的.
> 謝謝!
> Lmx (天呀! 再給我多一點Win32! 其餘免談!)

原文經典好書,臺灣的譯本不夠快,不夠好,不夠大膽。

不夠快是因為:市場有限,所以報酬有限,所以專職譯者很少。
不夠好是因為:市場有限,所以報酬有限,所以吸引不了人才。
不夠大膽是因為:市場有限,所以報酬有限,所以出版公司不敢簽書。

但其實如果 (1)(2) 可以解決,(3) 也就不會是問題。出版公司以為高階技術書籍是賠錢貨,我看以臺灣目前的情況,只要好好做,一定有利潤又有名聲。

問題是,(1)(2) 如何解決?傷心呀!

--- the end