作者: jjhou (jjhou) 看板: CompBook
標題: 選義按部,考辭就班
時間: Sun Jun 1 20:36:34 1997
觀古今於須臾,撫四海於一瞬
【選義按部,考辭就班】
本文登於 RunPC 1997.06
侯俊傑 jjhou@ccca.nctu.edu.tw
----------------------------------------------------------------------------
●理解無窮,記憶有限
一位老讀者寫 mail 給我,信上說:『我發現一件事,自從在台大資訊週遇到您,
直到 1997 Run!PC 5月號,您一直在安撫新鮮人。在發現自我方向之前,
那些人(包括我)都曾相當迷惘。您的文字和溫和的態度讓這些人可以安心前進。
感謝您!!』
寫作六年,最初接觸的年輕讀者,有一些已經從高中進入了大學,甚至研究所。
原本我的寫作層面從未考慮學生,我是為工程人員寫的。卻沒有想到慢慢地在
學子之間有了一些影響。有一次元智開學,一位研究生來找我,告訴我因為
我的鼓勵,他發奮考上了研究所,並拿出當年我寫給他的信。前述那位老讀者
也是,一年半載未聯絡,他已經從大同工學院考上清大資訊所。
看到這些朋友的精進,我真是高興莫名。我自己當然也要更精進,不然拿什麼
以對讀者?現在學生們,厲害的,真的很厲害。這學期 Windows 作業系統課程,
我給的期末作業是讓同學們分組將 Matt Pietrek 的「Windows 95 系統程式
設計大奧秘」各章程式仔細 trace,向大家做報告。有一組同學的表現就令我刮目相看,
不僅自行研究書上未提到的 Callgate 技術和 Universal Thunk 技術,還找出
原作者未交待清楚的一些細節。
人的理解力可以無窮,但人的記憶力有限。當本身實力發展到某個層次,
實力不是靠「警敏強記」來判別或完成,而是要知道哪裡可以找出正確而
適用的資料。我對那一組同學最感興趣的就是,他們參考了哪些書籍、
哪些資料、以及他們是在什麼時候開始接觸那些相關資訊的。
我還在業界任職的時候,就已經觀察到,比較有發展潛力的同事,
都很會整理資料。資料的整理方法言人人殊,但都有條不紊。
要整理資料,先要有資料,所以這些同事也都是收集資料的高手,不論
書籍、雜誌、期刊、報紙、光碟、磁片、規格書,不論紙面的或電子的,收羅萬象,
檢索迅速。要達到這種境界,你要有方法,有毅力。或許還要一點點財力。不過,
除了書籍比較貴之外,其他資料都還算便宜,甚至從 Internet 上免費可得。
●為汝安心
能夠在資訊世界裡悠然自得,真令人羨慕(雖然那些人,包括我,其實也都是鴨子划水,
水底下忙碌得很)。悠然自得的境界需要按部就班地訓練才能到達。
好多讀者寫給我的信中,問到 C 語言的學習方式、Assembly 語言的學習方式、
MFC 的學習方式、Windows programming 的學習方式。一一回答而未能給
大局觀,猶如管中窺豹,未能得其全貌。我決定以一次較大的篇幅,為汝安心。
我決定從一個語言初學者的立場出發,Windows programming 則是我設定的
終極目標。我走的路線是 C/C++ 路線。這樣的假設有幾個考量因素:
1. Windows 是當今 PC 上最普及的作業系統,也是你就業時最可能面臨的平台。
2. C/C++ 是計算機科學的主流語言,學術界與工業界通用。
3. 我的專長是這些,所以我能說的也只是這些。
我將在每一個階段提出我的看法,並舉出一些好書給你參考。我舉出的書絕大
部份是原文書,這並不代表國內沒有相關好書(但它的反面也不一定就成立),
而是因為我自己接觸了許多原文書,資訊也多由彼而來。這些原文書
大多有中譯本,好壞就請自行評斷了。
以下出現的出版社簡名,其全名是:
A.W.:Addison Wesley
M.P.:Microsoft Press
IDG :IDG Books
M&T :M&T Books
R&D :R&D Publications
●先器後道:從 C/C++ 語言出發
程式語言沒有練好,什麼都是空談。現在的 C/C++ 編譯器忒也龐然大物一個,
初學者如果未經指點,常會以為買了一套 C++Builder 或 Visual C++
或 Symantec C++ 或 Optima++...,就是要直接開始在整合環境底下寫 Windows 程式。
我當然不認為是他們野心過大,妄想一步登天;他們是因為不知道
有簡化的環境和簡化的 Windows 程式。
在這個階段,語言的練習應該獨立於任何作業系統之外。也就是,你學習的應該
是 ANSI(美國國家標準)C/C++,你寫的程式拿到任何作業平台上
應該皆能原始碼相容。我建議,在 Win32 環境下,你要以 command line 方式
編譯聯結程式,並使用 console mode。
所謂 command line 方式,就是在 Windows 環境下開一個 DOS 視窗,
將工具環境以 PATH 和其他環境變數(如 LIB 和 INCLUDE) 設定好,然後
在 DOS 提示號下直接編譯聯結你的程式;完全不使用開發工具提供的整合環境。
以 Visual C++ 為例,假設你把它安裝在 E:\MSDEV,於是你可以設計
一個批次檔(.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
每當想要使用 command line 編譯聯結程式,就先在 DOS 視窗中執行
上述批次檔,將工具環境設定好。
然後,你可以開始練習寫程式。使用任何文字編輯器輸入你的原始碼,
存檔,然後在 DOS 視窗中編譯聯結。以 Visual C++ 為例,你可以這麼做:
cl test.c <Enter>
或
cl test.cpp <Enter>
CL.EXE 是 Visual C++ 的編譯器名稱。它會在編譯完成後自動呼叫
聯結器 LINK.EXE,將你的程式所需要的函式庫(C runtime library)自動
聯結進來。
你所寫的這些 C/C++ 程式,雖然是 ANSI 標準,但因為是在 Windows 環境下
以 Windows 開發工具建造而成,所以它們的執行檔是屬於 PE 檔案格式,
也就是 Win32 可執行檔格式,只不過它們沒有用到任何 GUI(圖形使用者介面)
而已。這種 Win32 程式又稱為 Win32 console 程式,也是一般所謂
的 DOS-like 程式。
常常接到讀者的 mail,希望我推薦 C/C++ 方面的好書。由於 C/C++ 的學習對我已經
是遙遠的回憶,當初自學以及朋友間互相討論的成份比較多,閱讀的經驗比較少,
而晚近的許多相關書籍我又沒有完整看完過,所以沒有辦法給你推薦名單。
有一些經典名著,出自大師之手,例如 K&R 的 "The C Programming
Language"(有譯本),
Bjarne Stroustrup 的 "The C++ Programming Language"(A.W.,有譯本),對初學者
不見得是最佳選擇。初學者需要詳盡、親切、範例多的導入書,大師的書卻
往往學術味重,言簡意賅。當然,等你到達一定程度,還是應該把大師的書
看一看。言簡意賅之中,可能有許多微言大義。
●可直接學習 C++ 嗎?
回答這個問題前,需要先做點釐清。C++ 其實是 C 語言的超集(super set),
所有 C 語言的關鍵字、指令、修飾詞、特性、標準的 runtime 函式庫,都
應該相容到 C++ 之中。所以,基本上沒有所謂「避開 C 語言,直接學習 C++」的
可能。你看,很多時候 C/C++ 是寫在一起的,形影不離。
倒是,你可以不學 C++,純以 C 闖天下。在 Windows 程式設計領域中
就是以所謂的 SDK 來撰寫程式。也就是以純粹的 raw Windows API 來寫程式。
不過,物件導向的觀念與技術,歷經數十年的驗證,已經證明其價值,並且已
被大家接受,蔚為主流,你若放棄 C++,會折損自己不少實力與工作機會。
To be or not to be,that is the question!(語出 莎士比亞/哈姆雷特)
呵呵,To C or not to C,that is the question too!
●OOA/OOD
C/C++ 語言的基礎功夫完成之後,你面臨第一個分岔點。是
要繼續在物件導向(OO)領域中
精進,進入物件導向分析(OOA)和物件導向設計(OOD)領域?還是要開始
選擇一個特定的作業平台,學習其上的程式技術?這兩者不是平行線,它們
最終是要相互為用的。對 OOA/OOD 有愈多的瞭解,使用起 Windows 開發工具中的
C++ 類別庫(MFC 或 OWL 或 Open Class 或 VCL)自然愈能胸有成竹,而不是
隨波擺盪。但是,當然,你也可以先進入 Windows 程式設計領域,慢慢
再回頭接觸 OOA/OOD。
我與同夥的幾位老朋友曾經十分瞧不起 OOA/OOD,每次去聽些課程,回來
就彼此嘲諷:又浪費了一整天。一個原因是:台上的老師自己連 OOP(Programming)
都不夠實力,談什麼 OOA/OOD?沒有據以實現觀念的載具,一切將只是魏晉玄談。
另一個原因是:台下的我們自己的 OO 基礎也不夠好,對於聽來的觀念,
無法產生有效的具體意識。
我們瞧不起 OOA/OOD,是因為我們自己粗鄙,是因為我們自己的程度不到。
如果自己程式寫多了,也用心揣摩過 classes 該怎麼設計怎麼分類,
自己有過一些想法,再來看 OOA/OOD 的書,收穫就會大得多。
OOA/OOD 的流派不少,Booch 是相當有名的一個流派,他著
有 "OO Analysis and Design with Application"(無譯本),相當出名。
●SDK Programming
如果你不喜歡一下子進入太多的理論世界,你希望早點寫出漂漂亮亮
的 Windows 程式,激勵自己一下,那麼在學會 C 語言之後,可以
選擇 SDK programming 做為下一步。
SDK 是個通稱,任何環境都可以提供自己的 Software Development Kit(SDK)
供程式員在其環境上開發應用程式。然而因為 Windows SDK 太有名了,一直被
延用其名,竟成了一個專用術語。"SDK programming" 其實就是以
未加包裝的 Windows API 撰寫 Windows 程式的意思。如果你在這個層面上
寫程式,可以在任何一套 Windows 開發工具中暢行。
這個領域我推薦兩本好書:
1. Charles Petzold/M.P.:"Programming Windows 95"(有譯本)
2. Jeffrey Richter & Jonathan Locke/M&T:"Windows 95 :
A Developer's Guide"(前一版有譯本,新版尚未見到)。
前者幾乎是這個領域的聖經,有非常廣泛的取材和很棒的內容。
後者的技術層次定位更高,特別選擇了 hooking、subclassing、
window class...等一些稀有主題。
有些書評人對於 Petzold 書籍的 95 版沒有太高評價,
但是對於其前身(3.0 版和 3.1 版)卻又推崇備致。噢,
一本書怎麼可能在「組織結構不變,僅是做 16/32 位元移植」的
改版情況下,落差如此大呢?不可能!書評人對於新版沒有太高評價,是因為他們
的期望太高,忘記了這是改版書。以看新書的角度去評論改版書,會有誤差出現。
Jeffrey 的書籍名實不副 -- 內容很棒,其名不彰。這本書也是改版書,先前已
有 3.0 和 3.1 兩版。
在這個領域裡鑽研,或許你還需要一些 Windows API 手冊。各家整合開發工具
的線上手冊固然是不錯,但電子有電子的好處,書面有書面的優點。
帶著本手冊,可以當小說隨手翻翻,累積印象,就不會在大做苦工之後才
發現,原來有現成的 API 可用。Waite Group 出版了好幾本 Win32 API 手冊,
像是 "Win32 Programming API Bible"、"Windows 95 API How To" 等等(皆無譯本),
每個 API 並附使用範例,頗具參考價值。不過我發現其中頗有誤謬,
你必須和線上手冊交叉使用才保險。
SDK programming 也可以使用 C++ 語言。我的意思是你自己為自己包裝一些
類別,也就是自己把 Windows API 包裝得更高階一些。早期 Borland 推出其
C++ 2.0 版(市面上第一套可支援 Windows 的 C++ 編譯器),
就是訴求讓程式員自己做這樣的包裝(彼時尚未有主流的類別庫產品如 OWL 或 MFC
或 VCL,只有一個小有名氣的 "Zinc" 產品)。這樣的訓練或許實際用
處不大,因為現在已有主流的類別庫產品(不少人甚至是為了
使用那些類別庫才決定開始學習 C++)。然而,曾經歷練過
這樣訓練的人,OOA/OOD 的實力必有增長。
Paul Dilascia 有一本 "Windows++ : Writing Reusable Windows Code in C++"
(A.W.,無譯本),便是這個層面的著作。這位作者現今是非常知名
的 MFC 技術專欄作家,我一直期待他出一本 MFC 書籍,苦候不至。
●Windows 作業系統/系統程式設計
學習 SDK Programming,最大好處是能夠清楚看清 Windows 系統所謂
的 "message based、event driven" 的觀念。另一個好處是藉由 API 函式,
你可以相當程度地瞭解作業系統的基層動作。當然,後者需要一些書籍來輔助,
在 SDK programming 書籍上是不容易看到對此有太多介紹的。即便有,層面也不夠廣。
Windows 作業系統領域我推薦五本書:
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(未進口)
第一和第二本書由同一位作者撰寫,分別針對 Win31 和 Win95。兩本書並沒有
太多重覆的地方,Win95 之中屬於 16 位元的那一部份,凡是在第一本書
中提過的,第二本書就不提了。Pietrek 的探討是以三種形式進行:
內部資料結構、API 虛擬碼、系統程式設計。
三種形式都非常重要,而以內部資料結構尤然。你要充份瞭解 Windows 作業系統,
一定要好好看看這兩本書。我正引領鵠望 Pietrek 有沒有一本 "Windows NT Internals"
或 "Windows NT System Programming SECRETS" 這樣的書。書名不重要,
要認就要認作者。
第三本書站在比較高階的層面,也就是 API 層面,來看系統。Jeffrey 並不挖掘
系統內部資料結構,也不講述 API 虛擬碼,他只是非常詳盡地告訴你一些與系統
核心有關的 API 如何使用,並給你許多出色的範例程式。那些與核心有關
的 APIs 並不太容易在沒有詳細解說的情況下無師自通,因為它們的參數通常
都很多,牽扯的意義也很廣。這本書的重要性不亞於第二本。
第四本書和第五本書主要訴求在虛擬機器和虛擬裝置驅動程式(VxD)的層面。
它們也可以歸類為 DDK Programming 領域,稍後我再來介紹。放在這裡主要是
提醒你,它們和作業系統有非常密切的關聯。
●以 Console 程式練習 system programming
進入作業系統層次,大概免不了就要接觸到
行程(process)、執行緒(thread)、模組(module)、位址空間、虛擬記憶體、
檔案等題目。這些屬於作業系統基本教義派的題目都不牽扯圖形介面,
因而 console 是很理想的練習環境。我的意思是你可以在 console 程式中練習
CreateProcess、CreateThread、VirtualQuery、CreateFile 等等
Win32 API。若需要輸出資料來觀察,只要 printf() 就可以了,不必大費週章去
處理視窗、對話窗、列示清單。
印象中很少書籍介紹 console 程式設計。其實的確也沒有什麼好介紹的,
console 程式就是 DOS-like 程式,並且允許你直接呼叫 Win32 API,如此而已。
舉個例子:
// 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 );
}
這個程式執行起來,會另產生一個 NOTEPAD 行程。你以 "cl test.c" 做
編譯聯結動作,所有必要的函式庫(包括 C runtime 函式庫和 Windows DLLs 的
import 函式庫)都會自動被聯結進來。
●Application Framework
SDK 的基礎有了之後,你可以留在那個領域繼續精進。但是看到別人三兩下子
就做出一個自己一星期也做不出來的程式畫面和功能,很少有人不痛心疾首,
吁嗟呻吟,大嘆身不逢時時不我予。汗水其實不會白流,不過看準時機
也要趕快下車,換一班快速列車,讓過去的汗水所植基的東西有更大的發揮。
有一些開發工具大廠,把 Windows API 及必要的資料包裝在一個個的 C++ 類別之中,
讓使用者站在他們的肩膀上,看得更高更遠。
有沒有在平面電扶梯上走路的經驗?桃園機場出入境站內有一些平面電扶梯,
在上面走路,每個人都好像神行太保,輕鬆漫步就比梯外的人滿頭大汗還要快。
Application framework(一種凝聚性很強的 C++ 類別庫)就像那電扶梯。
市面上的 application framework 產品有好幾套,真正引領風騷的,
當推 MFC 和 OWL 二者。前者是 Microsoft 產品,後者是 Borland 產品。
由於這種產品中的 C++ 類別彼此關係密切,因此同一個產品的應用程式的
「基本長像」也就十分類似。也因此這些產品都搭配程式碼產生器,
以及各式各樣高度自動化的輔助工具。
這種產品功能強大,用起來很爽,但是要學得好不容易。我看過太多
因為基礎不穩而跌下馬來摔得鼻青臉腫的例子。面對這種東西,學習者
首先必須擁有不錯的 C++ 基礎,那自然是不消說的。此外,對於 C++ 虛擬函式的精義,
必須徹底瞭解,才知道自己到底在幹什麼。
通常,學習 VC++ & MFC(或 BC++ & OWL)的人,可分兩類。第一類人
只有 C 基礎,一心希望趕快通往物件導向的聖堂,希望趕快做出又炫又酷
的程式。他們以為 VC++ 或 BC++ 是一種新的 C++ 語言,
或以為那是一種「Windows 程式語言」。他們迫不及待地把整合環境上的
wizards(或 experts)玩個痛快,東拉西扯,卻不知其實只是胡搞瞎搞,
搞得自己一頭霧水。他們東湊一個 class,西湊一個 class,有樣學樣,
東施效顰。初期進展頗為驚人,把程式湊成一個怪物卻渾然不覺。等到
束手無策了,信心也全失了,於是自己給自己下了個結論:MFC(或 OWL)是全世界
最爛的東西,大怪獸一個!
另一類人不太一樣,他們或許也只有 C 的基礎,但是願意先把 C++ 的基礎
打好,尤其在虛擬函式痛下功夫。他們學習 MFC(或 OWL)的本體架構,
企圖瞭解那樣一個 application framework 是如何建築起來的。研究的主題
包括 Message Mapping、Command Routing、Runtime Class、
Persistence...。數百個 MFC(或 OWL)類別不熟悉?不會用?沒關係,
那只是手冊查閱的功夫而已,架構弄懂才最重要。這種人初期進度緩慢,
可能會被速食派人士嘲笑。但假以時日,誰笑誰就不知道了。
我自己對於 OWL 不熟,沒有能力介紹好書給你。至於 MFC,我推薦四本書:
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"(無譯本)
第一本書用來建立對 MFC 架構的通盤瞭解,涵蓋上述我提到的所有重要主題。
內容雖然很深,但因為循序漸進,示意圖也多,並不難看。
第二本書提供許多範例,並以 Visual C++ 工具大量輔助 MFC 程式設計。
第三本書也提供許多範例,MFC 架構方面的解釋比第二本多,但比第一本書少得多。
它完全不使用 Visual C++ 工具。第四本以挖掘 MFC 原始碼的方式來
介紹 MFC 架構,層面比第一本深且廣,但比較難看。
我建議的閱讀順序亦如上排列。
●RAD(Rapid Application Development)
有資格被稱為 RAD 產品的,當屬 Visual Basic、Delphi、C++Builder 三者了。
Optima++ 好像也是,但我沒有什麼接觸。這裡我要談的是 C++Builder。
C++Builder 對程式開發的幫助層面,和 MFC(或 OWL)又不太一樣。
這個工具可說是 components software(以元件組成軟體)的實踐者。
每一個元件有 properties、methods、events 三個性質,分別代表
其資料、可執行的行為、以及可反應的狀態。你在整合環境中
選拉一堆元件,很快就可以把一個應用程式的使用者介面兜起來。
比較困難的地方在於如何讓元件和元件
之間產生關聯,那需要寫點程式碼。程式碼雖然簡短,卻也絕對需要 C++ 的
良好基礎,以及對 VCL 各元件的相當程度的瞭解。雖然 VCL 的架構和 MFC 或 OWL 都
不相同,但如果你曾經用過 MFC 或 OWL,並且曾經在架構上面花功夫,
再來看 VCL 自然是比較容易進入狀況。觸類旁通嘛!
C++Builder 是個好產品。它不但與 VC++ 和 BC++ 競爭,層次又比兩者更高一層。
至於你該選擇 MFC 或 OWL,還是該選擇 C++Builder?若以工具的優秀度考量,
我投後者一票。但是關於就業市場,考量的因素還有許多;不論你的選擇如何,
似乎都是個賭注。
●DDK Programming
DDK 是微軟的一套工具。DDK Programming 是個統稱,意指撰寫驅動程式(DRV),或
虛擬裝置驅動程式(VxD)。這個領域需對作業系統有比較多的瞭解,因為
牽涉的技術層面比較低階。
高階語言如 C++ 在此領域較不管用,assembly 語言反而成為主流。
再佐以 C 語言應該是最好。雖然,也有一些整合環境工具如 VToolsD 提供
協助,允許你以 C/C++ 撰寫虛擬裝置驅動程式,但 assembly 語言仍然得精通,
因為你常常需要處理堆疊、暫存器...,需要考慮機器碼的長度、速度。
這些都是學習 assembly 語言時獲得的知識,高階語言不管那個。
這個領域我推薦兩本書。如果你對 DDK programming 沒有興趣,這兩本書
也可以歸類在作業系統領域裡,對你還是有幫助:
1. Walter Oney/M.P.:"System Programming for Windows 95"(無譯本)
2. Garen Hazzah/R&D:"Writing Windows VxDs and Device Drivers" 2nd
edition(未進口)
第一本書是學習 VxD programming 的極佳書籍,從最基礎講起,相當詳細。
第二本書提供許多設計精良的示意圖,非常難得。事實上它也真的很「難得」,
臺灣沒有進口。
●Java 程式設計
如果你有 C++ 基礎,又用過 MFC(或 OWL),那麼老實講,要進入 Java 殿堂,
真是輕鬆。Java 的語法與 C++ 十分類似,Java 的 API(不以單純的函式
呈現,而是以類別庫形式呈現)則活脫脫就是另一個 application framework。
我以圖一總結我對這條學習路線的討論。
+----------+------------------+------+--------------+
| | MFC(OWL) | | |
| OOA/OOD +---+ C++Builder | +--+ DDK |
| | | |programming|
+--------------+--+-----------+ Windows | |
| C++ (OOP) + SDK | O.S. | |
+-----------------+-----------+---------+-----------+
| C + Assembly |
+-----------------------------+---------------------+
圖一
●讀者來函
> 送件者: <b83140163@ntou66.ntou.edu.tw>
> 收件者: jjhou@ccca.nctu.edu.tw
> 主旨: 資訊人的生涯規劃
> 日期: 1997年4月26日 PM 12:22
>
> 侯先生你好:
> 小弟經常在 RUN!PC 雜誌上拜讀您的大作,也深覺很有收穫,尤其在讀了「EQ 價更
> 高」一文後,產生了另一個想法,希望您能抽空為我回答。或許這也可能是
> 其他人心中的疑問。
>
> 小弟因聯考的關係,目前就讀非資訊相關科系,但是從國
> 中開始,便對電腦資訊產生了極大的興趣。高中時候已多有涉獵,進
> 入大學之後,並未忘情於電腦,並嘗試自我學習。但是自己跟資訊相關科系的同
> 學相比,在他們專注學習的情況下,有漸行漸遠的感覺。
> 感到惶恐,也擔心自己被資訊業
> 界快速變化的洪流所淹沒。您作為資訊界的代表人物之一,不知有何想法或建議呢?
「作為資訊界的代表人物之一」,這一點我談不上。
我把自己定位在「高階技術的導引者」。是的,導引者而已!
在各個領域真正從事專案計劃的工程師,都擁有比我更深入更實際的
經驗。我比較廣,而他們比較精。說到廣,其實我也不過是在 C/C++、SDK、MFC、
Windows O.S 這一條線上而已。
真的,我不清楚,以現在資訊量這麼龐大,PC 軟硬體進步這麼快速的情況下,
有志在資訊領域實現人生抱負,卻不是科班出身的年輕朋友,是否有
太大的機會。「科班」所代表的文憑或身份,並不是考量重點,我所想的,
亦即您所言,「在別人專注學習的情況下,彼此有漸行漸遠的感覺」。
我本身是個自學案例,但我可是在大學時代看過、用過打卡機的
A世代人唷。那個時代的複雜度與今日不可以道里計。即使
我其實是在大學畢業服役之後回鍋才對電腦
引發興趣,那時候電算環境的複雜度仍然與今日不可以道里計。當時一切因陋就簡,
PC 作業系統不過就是個 MS-DOS,可以完全攤在手掌心裡;最炫的軟體開發工具
不過就是 Turbo Pascal,進入繪圖模式畫個簡單的曲線圖就開心得嘎嘎叫。
沒有選單、沒有
圖形人機介面、沒有物件導向、沒有整合環境、沒有 wizards、沒有 experts...
沒有,什麼都沒有!有的是記憶體 640K、硬體 20MB、Hercules 卡、單色螢幕、
九針點矩陣印表機...。
我不知道,現在這麼大的資訊量,這麼多的技術和這麼多的工具需要同時學習的情況下,
資訊科系以外的同學們,即使你們依然保持高度興趣和高度自持力,
頭懸樑錐刺骨,「衣帶漸寬終不悔」的感覺能夠維持多久?
我真的不知道呀!
> 小弟有以下問題希望您能回答,謝謝!!
> 一、您喜歡在資訊界中工作,是因為哪些條件呢?
讓自己永保朝氣蓬勃。不會有「被新世界遺棄」的孤寂感。
> 二、一般資訊人對工作上會有哪些不滿意的地方?或是工作上會遇到哪些困擾呢?
會在走出學校後走入資訊業,通常是因為本身的確對資訊感興趣,不然可能校內
早就轉系走人,或離開學校後馬上就表明心跡了。排除「沒有興趣」的因素後,
我想資訊人對工作的最大不滿意,大概是「永遠有學不完的東西」。在我
這個歲數,進入人生的這個位置,我清楚自己該掌握什麼,該捨棄什麼,所以
龐大的資訊量對我威脅不那麼大(雖然也不小)。但是對於還沒有事業基礎的
年輕朋友,他們必須(或自己認為必須)努力把十八般武藝起碼也搞好十四般,
那就得花很多很多的時間精力。
其他理工領域的進步沒有這麼快,有些領域甚至學一套可以吃一輩子。
沒有「活到老學到老」的心理準備的朋友們,此行莫入!
至於普遍的困擾則是:「這麼辛苦,我能夠做到幾歲?」這是工程師們一個
普遍的危機意識。我的工研院老同事就笑指我的光明頂(日漸光明的頭頂)說:
『看你能做到幾時!』
> 三、在準備從事資訊相關的職業前,應有甚麼樣的自我準備或是訓練?
您講的是職業,而不是學業,那表示您已經完成了自我基本訓練(不然
就進不了職場囉)。我想,那麼,心理建設是最重要的。老話一句,活到老,
學到老。其實,興趣是最重要的,有了興趣做後盾,吃苦當做進補。
沒有興趣,再輕鬆的工作也是無聊,虛度人生而已。
我工作的時候,常常做到肉體和精神的負荷將至極限,才放下來,抒發一下。
靜一靜,喝杯咖啡,回想剛剛完成的成績,想著想著興緻又來了,
又坐到電腦前面幹活。出國旅遊的時候,飛機上的漫長光陰就是我瀏覽整理
MSJ、DDJ、WDJ 等期刊的最好機會(我總是帶一袋子)。你要怎麼解釋
一個人瘋狂的幹勁兒呢?辛苦但是快樂,唯「興趣」二字可以解釋。
> 四、面對壓力與挫折,您如何面對?在工作成果滿意與不滿意中如何取得協調?
這好像在做家庭訪問了。年歲相差太遠,心境與作法都不會相同,
也不容易感染。此題免了吧。
> 五、您當初如何下定決心從事這一行的呢?當初做了甚麼樣的自我準備?
我不知道「這一行」是指我進入資訊界,還是指我進入資訊寫作界。
如是前者,因為興趣所在,就進去了。如是後者,因為覺得可以有
比較大的貢獻和發揮,就轉過來了。至於自我準備,大約就是把本質學能的
基礎打好吧。「電腦技術專業作家」的頭銜似乎還沒有尊榮到可以讓小朋友做為
「我的志願」,或年輕朋友做為「心目中理想的十大行業」,
我自己是在...呃...寫作之後才開始學習寫作的。當然,每個人對文字的
掌控能力與風格,即使沒有刻意培養,也可能在從小環境或耳濡目染的情況下發展出
不同的水準,而那會大大影響行文的順暢與可讀性。
如果有心在資訊工業界發展,最重要的「自我準備」就是把
基本功(作業系統、語言能力、資料結構、演算分析...)學好。常常追逐
哪一種開發工具的哪一個最新版本的哪一個很炫的功能,是捨本逐末。
如果有心在資訊寫作界,「自我準備」就還包括組織能力和文字能力。
尤其是組織能力。有志於此的一些朋友告訴我,希望多做些翻譯工作然後
再開始創作,但是各位要知道,單純的翻譯,如果沒有特別用心,
對於組織能力沒有絲毫幫助。
> 六、從事這一行有無充分的在職進修機會?
一般而言資訊公司主管都相當清楚這一行的一日千里,所以稍具規模者應該都
會提供進修機會。如果你說的是「留職停薪修碩士博士」這種大 case,那
恐怕要研究單位或很大很大的公司才有。一般的技術研討會、
新技術(產品)發表會、國外電腦大展等參加機會,應該是不少的。科學園區和工研院
裡頭的這種機會就非常非常多。不過,您的表現是否足以膺此「種子」重任,
則是後話。
> 七、您對於非資訊相關科系畢業,但有志從事資訊工作者,有什麼建議?
> 如何建立一個自我學習的方法,以免有閉門造車之憾?
唯有比別人更努力,才有機會。別忘了別人也非常努力,而且佔盡優勢。
避免閉門造車之憾,應多培養大局觀,最簡單的方法就是多看雜誌和
期刊(國內國外都要)。對大學生而言,期刊似乎有點嚇人,但多接觸
自然就有機會。No Touch,No Chance。
> 八、一個資訊人是否真的會忙得沒有休閒娛樂的空閒?
很有可能。我住的這棟大樓 190 戶裡頭有一半以上在
交大、清大、工研院、科學園區工作,其中又有許多在資訊領域,
所以基本上我滿清楚我們這些人類的生活形態。年輕的朋友們
忙著專案進度、還要抽空進修充實自己,未婚者以公司為家是很
常見的事。同事們常常下班後相約吃個飯,再回辦公室充電。
年長的朋友們有了點事業基礎,但還是要忙著主持計劃、
撥空進修充實自己(否則怎麼帶個個頭角崢嶸的弟兄們)。
要說能夠固定時間看個電影,唱個卡拉OK,甚至週日去爬爬山,我真的很少遇過。
> 九、面對資訊日新月異快速更替的洪流下,您是否會有怕跟不上或是將來跟不上的焦
> 慮呢?如果有,您是如何克服的呢?
有啊。我常和同輩朋友們彼此消遣:『唷,還沒被淘汰啊?雜誌上的
名詞還跟得上吧?什麼時候轉行呀』。吐吐苦水可以排遣情緒。但追根究底,
怕跟不上,就加倍努力。
> 十、您認為一個資訊人應有怎樣的生涯規劃?
剛出校門,一定是做 programming 的工作。既然有興趣做為後盾(沒有的話就免談了),
請把十八般武藝好好學學。名門名校的身段放下來,高學歷的身段放下來。
實務經驗都沒有,又要擺身段,徒惹一頓笑而已。基本功紮實了,要開始
注意專案怎麼規畫、人力怎麼安排、規格書怎麼開、文件怎麼寫,培養自己
做為主管的能力。當然,此期間,表達能力、分析能力的培養
一樣也不能少。人際關係更不能因為技術的提昇而降低。
所謂千兵易得,一將難求,技術以外的能力,往往是決勝的關鍵。
我的好朋友,曾銘源先生(Run!PC 前「美東隨筆」專欄作者),去美三年,
年薪從四萬調整到...不可說的程度,被公司倚為「絕對不可或缺的人物」。
他付出了許多許多,而成果豐碩。走這一行,前途完全在自己手裡。
很多同學抱怨資訊界實在太辛苦。但我提醒各位一點,唸資訊的人,
自我掌握度非常高。其他科系的學生要怎麼樣才能夠自力做出
點成績?除了死K書,怎樣才能夠擁有實務經驗?整個土木系四年
我也不過就參觀了北橫榮華壩和台中港而已,要說實務經驗那是半點沒有。唸
機械的人怎樣才能夠設計一個機構並且自己把它做出來?
唸電子的人哪有機會自己 layout 一塊板子?唸生化的人,不上實驗室
哪有機會自己培養一隻菌?
很多很多領域,都需要很大的旁助力,才有辦法 do something。但資訊系學生,
一台 PC 就可以把自己鍛鍊成百戰金剛。一切都掌控在你自己手裡,
成也由你,敗也由你。
--
※ Origin: 楓橋驛站 ◆ Mail: jjhou@ccca.nctu.edu.tw ("J.J.Hou")
※ X-Info: Mave -> ric.bbs@ptt.csie.ntu.edu.tw
※ X-Sign: 0ROAARCPHX3LdM/nbAt. (99/07/09 6:51:24 )