相關閱讀 |
>>> 名人論史——近當代作家的史學觀點 >>> | 簡體 傳統 |
1997.06
觀古今於須臾
撫四海於一瞬
選義按部
考辭就班
人的理解力可以無窮,但人的記憶力有限。
當本身實力發展到某個層次,
實力不是靠「警敏強記」來判別或完成,
而是要知道哪里可以找出正確而適用的資料。
●理解無窮,記憶有限
一位老讀者寫 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
或
cl test.cpp
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
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。
●讀者來函
送件者:
收件者: 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 就可以把自己鍛煉成百戰金剛。一切都掌控在你自己手里,成也由你,敗也由你。
侯捷 2010-09-10 08:30:04
稱謂:
内容: