转贴自 候杰网站
选义按部 考辞就班
人的理解力可以无穷,但人的记忆力有限。
当本身实力发展到某个层次,
实力不是靠「警敏强记」来判别或完成,
而是要知道哪里可以找出正确而适用的资料。
●理解无穷,记忆有限
一位老读者写 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。
●读者来函
送件者: <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 就可以把自己锻炼成百战金刚。一切都掌控在你自己手里,成也由你,败也由你。