隱憂

侯捷  1999.04.05


●隱憂

十四年前我曾在資策會受訓半年,得到很好的教育。當時的幾位同學和學長,因為表現優異而留下來服務,進而擔任講師並負責課程規劃。我們之間也偶有聯繫。

由於他們知道我在業界與學界待過,並在某些領域中鑽研,所以與我領域相關的一些課程,有時候會請我支援,或者希望我能夠推薦講師人選。

前數天我又接到這樣一通電話。

我一直對於教育抱以熱情,又是老朋友的請託,這忙是一定要想辦法幫的。然而,我自己非但時間撥不出來,有些主題需要很多最新實務經驗而我認為自己已脫離 programming 第一線,不再有能力教這樣的課程。所以我想到的是推薦人選。

人選是有的,但是他們都不方便上陣。

技術是一回事,表達是一回事。我這些業界朋友雖然技術實力很棒,講起課來氣氛會怎麼樣,講義會做成什麼樣子,說實在的我也不是很有把握。不過,至少,在技術的場合,肚子裡有東西就不怕問,10 分貨色好歹也端得出七分來。

所以,人選是有的。

但他們都不方便上陣!

為什麼?因為他們都在業界。第一,「洩露公司機密」這頂大帽子沒人戴得起,第二,如果是十數小時甚至數十小時的課程,那就得動用上班時間,可就更敏感啦。

所以,我這個把業界介紹給教育界的想法,除了少數幾例(情況也滿特殊),沒有成功過!

其實授課和「洩露公司機密」扯不上什麼關係。授課主題通常是如 C++ 啦,物件導向啦、系統核心啦、device driver 啦、Delphi 啦、Visual Basic 啦、COM 啦…、都是基礎訓練,談不上什麼機密。

但是,對這種事敏感,是很自然的事。當事人敏感,很自然,同事間敏感,也很自然,主管敏感,更自然。真從現實面想的話:「經驗心得一語道破,大家各回公司又在業界競爭個你死我活,我豈不是拿石頭砸自己的腳?」這樣的想法也很實在。

所以,朋友的請託,雖然很想幫忙,卻是還沒有開始撥電話前,就知道了結果。

一位任主管職的老朋友,請我為他找幾位 driver 高手(他知道我認識這樣的人),「過府」請益,為他的 juniors 開個課。結果呢?不出所料,由於事出敏感(比去資策會開課還敏感,這是業界對業界耶),沒人願意賺這個外快。我就問這位朋友,如果你的工程師也被別的公司請去開幾堂課,你做何想?他聳聳肩,沒說話。

這些態度當然都是人之常情,都很自然很正常。但我覺得好可惜。業界的許多東西,許多基礎知識,大家沒有機會交流,沒有機會彼此合作以縮短工程師的養成時間。我還沒有見過哪家公司有著完善規劃讓 seniors 為 juniors 開課(多是私相授受的非正規方式),更沒有看過哪家公司與公司間彼此工程師互訓互補的情況 -- 當然啦,我並非閱人無數,這只能算是一葉知秋。

像 C/C++、Delphi、Visual Basic、VC、BCB 這類課程,在補習班還找得到,在資策會也可以找到。師資如何不知道,至少課開得起來。再上去一些,與工業實務貼近的課程,例如作業系統核心、device driver 入門與實務、網路軟體開發實務,幾乎不可能有課可上。菜鳥們只好抱著幾本書苦K,君子自強一番 :)。

有書K還好,怕的是有些東西連方向都不知道,連線索都沒有,就累了。
在業界,這是競爭下的無可奈何。若從教育的眼光,我覺得很多寶貴的時間都浪費掉了。

很可惜。
很現實。
沒辦法!


●如果我會的話

「一語道破,大家受惠」的例子,我馬上想到就是兩個。

一個例子是常在 programming 版被問起的技術:如何讓滑鼠游標移到某個文字上方後便出現一些處理過的資料。例如翻譯軟體,你以滑鼠游標移到某個英文字上頭,便出現中文意義。

如果我知道其中原理,我定會寫篇文章,再寫個小例子,讓大家都受惠。
可惜我不會這項技術。

我甚至於不敢請教做翻譯軟體的朋友,我想,無論他告不告訴我,左右都是為難。

只要有人告訴我方向是什麼,到哪裡找資料,我就心滿意足了,但是我想沒有人會告訴我這些。



●搭 File Explorer 的便車

另一個例子是,如何搭 File Explore 的便車,利用其介面與功能,將你的 objects 容納其中。例如寫一個電子相簿軟體(or something else),將每個相簿視為一個 folder,放在File Explorer 之中,讓使用者就像面對 disk 或 folder 一樣地操作這些相簿:可以預覽、開啟、摺疊、展開、右鍵可出現 popup context menu…。

最大的好處是不必從頭寫一個 browser。

我也沒有實作過這樣一個成品。不過倒是知道方向,可以說與你聽。

這需要一種所謂 shell extension 的技術。shell extension 係架構在 COM 技術之上(又是 COM!很多人大概又要嘆口氣了)。所謂 shell extension 就是讓你寫一些 COM component,增強(訂製)你的 Windows shell 功能。基本上 shell extension 分為五大類型:

a. Context menu extensions
b. Drag-drop extensions
c. Icon extensions
d. Property sheet extensions
e. Copy hook extensions
(可能還有一些新的分支,我沒有持續研究)

舉個例子,安裝了 WinZip 之後,面對任何一個 file system object 按下右鍵,你都可以在 popup context menu 中發現「壓縮」選項,這就是因為 WinZip 的安裝程式使用了 shell extension 中的Context menu extensions 技術。又例如你可以利用 Icon extensions 技術,針對某檔案 test.cpp,讓今後在上班時間所儲存的 test.cpp 檔以某種 icon 顯示,而在下班時間所儲存的 test.cpp 以另一種 icon 顯示。

Microsoft Systems Journal 曾經有兩篇文章談到 shell extension。可以做為我們進入這個技術領域的入門磚。兩篇文章的閱讀前提是,你必須懂 COM:

1. Integrate Your Applications with the Windows 95 User Interface Using Shell Extensions (Jeff Prosise, MSJ 1995.03)

這篇文章介紹 shell extension 的概念和軟體架構,並以實例示範 Context menu extensions、Property sheet extensions、 Icon extensions 三種技術。

2. Extending the Windows Explorer with Name Space Extensions (David Campbell, MSJ 1996.07)

注意,這篇文章所謂的 name space 並不是 C++ 中的 namespace! Win9x 和 WinNT 都內含一個機制,允許資訊被整合到 Windows Explorer 內部的階層狀資料結構中,這個階層狀 資料結構即被稱為 name space。name space 極類似檔案系統, 但另有許多檔案和磁碟目錄以外的物件型態。

前面我所提的電子相簿例子,和上述第二篇文章比較有關聯。不過如果你從不知道所謂的 shell extension,還是從第一篇看起比較好,因為 name space extension 正是 shell extensions 的一種。

shell extension 的技術由於與 Microsoft 太過關聯(可謂專屬技術),所以變動性頗大,要注意新的改變。

此外,你可以直接上網際網路,看看這兩份資料(感謝交大曾全隆學弟告訴我這個訊息):

1. http://www.microsoft.com/win32dev/apiext/msjnames.htm
2. http://www.microsoft.com/win32dev/apiext/namespal.htm

書籍方面,shell extension 的專書很少,截至目前我只看到:


Writing Windows Shell Extensions (Karl F. Heubaum)

很早我就在 A.W. 1997 書目上看到這本書的預告,甚至拿到了此書的前三章草稿。只可惜從此沒有下文,讓我癡癡地等,癡癡地等。據 A.W. 的朋友告訴我,此書已從最新目錄中消失,所以我想是不必再等了。


Visual C++ Windows Shell Programming (by Dino Esposito, Dino Espisito) ISBN: 1861001843, WROX Press, Dec. 1998, 700 pages, US$ 39.99

這本很新,我尚未到手,不知寫得如何。下面是從 amazon 得知的內容目錄,並非全部在講 shell extensions:

chap1 What is the Windows Shell ?
chap2 The Structure of the Shell
chap3 Working with Files
chap4 Investigating the Nature of Files
chap5 Browsing for Folders
chap6 The Shortest Path to Shortcuts
chap7 Shell Invaders
chap8 Program Executors
chap9 Icons and the Windows Taskbar
chap10 Windows Helper Libraries
chap11 Exploring the Shell
chap12 Scriptable Shell Objects
chap13 The Windows Scripting Host
chap14 Designing a Shell-Integrated Application
chap15 Shell Extensions chap16 Namespace Extensions
Appendix : A Programmer's Toolkit

BTW:技術人員不妨多注意 WROX Press 出版的書。他們的書給我的印象是料多、味美、實在,出書方向廣泛。有些很小很細的題目他們也出書,殊為難得。執著度不輸給 O'Reilly。


Programming Windows 95 User Interface (by Nancy Winnick Cluts) ISBN: 155615884X, Microsoft Press, 1995, 377 pages, US$ 34.95

這本書早就引進臺灣,不過現在大概在市面上是看不到了。電腦書市浪滔沙的速度真驚人,許多書籍都還滿有價值,卻一下子就不見了。晚來的人什麼也不知道。

本書前兩個 part 焦點在介紹 Windows 95 新增的一些 controls,如 status bars, toolbars, trackbars, progress bars, common controls, image lists, list view controls, tree view controls...。與我現在所說之 shell extension 有關的內容,集中在 part 3,雖然不是談得很深入,也是難得的資料:

part3 : Extending The User Interface
chap13 User Interface Extensions
chap14 The Shell Name Space


●多型與虛擬

網友在 BBS 上詢問,<多型與虛擬> 最新是幾刷?答案是四刷。四刷與三刷的內容完全相同,沒有任何改變。唯一的改變是版權頁上「三」刷變成「四」刷。



●侯捷網站

原定 1999.03 要完成的侯捷網站,很抱歉還沒有收工。
我從三月下旬開始安裝 FrontPage98、學習 FrontPage98、整理資料、掃描圖片、編排。

這才發現,九個年頭裡我竟然寫了這麼多東西。
就這樣,時而工作、時而休息、時而緬懷、時而感嘆…。現在,還沒有完工。什麼時候會好,我也不敢說。四月底之前或許可以。

-- the end