2006年05月08日

【热布克hbk】超经典(转):编程-让我欢喜 让我忧


========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================
侯俊杰
最近接连叁两件事情,让我情绪起伏颇大!

●让我欢喜

首先是几封读者来函。有一封 Shelly 的来信,大意如下:
————————————————↓
> 侯 Sir :
>
> 您好!又上门来打扰,在书局看到您多本的翻译书,
> 实在是忍不住想告诉您我的想法!
>
> 我是来谢谢您的。怎麽说呢?姑且不论英文能力,
> 看原文书总是没有看中文书来的直接啊!您也知晓,
> 许多翻译书,内容中的每个中文字都看得懂,但是整段落
> 就是不知他到底在说啥!
>
> 因此看到书的作者是您,感觉上就是一个品质的保证。
> 必定二话不说,抱回家罗!虽然眼前用不到,但是翻翻看,
> 大致上了解一下。待有空或是工作上需要,再好好的细读。
>
> 网路书局的盛行,让我也开始上网买些书,但是我只敢买
> 像您的书!有品质嘛!其他的可就不敢直接买罗,总是必
> 须到书局翻翻看,确定一下内容,才可能考虑。
————————————————-↑

另一封 Jedi 的来信,部份内容是:

————————————————-↓
> 你的书籍比市场上任何一本都好 100 倍。我不会想购买
> 任何一本中文电脑书籍,除非是你写的或是你译的。
————————————————-↑

我应该感到高兴,获得读者如此的信赖与赞美。而我也的确感到高兴!但随之而来的是悲伤。

●伤感

Jedi 任职国内一家极负盛名的软体公司,该公司的影像处理软体行销国际,获奖众多。在与我沟通的数封信之中,Jedi一再强调他是不看中文电脑书的,更不看电脑翻译书。他强调他的英文能力没有问题,他说「没有什麽比得上原文作品,所以一位数学博士必须通过英文、法文、俄文和拉丁文的考试」。

我猜他是一位数学博士。

我想起每一位大专学生可能有过的经验。老师对学生们说:『这学期的课本用的是 xxx。我对中文书没有什麽概念啦,我是不看中文书的…选这本书是因为同学们要求提一本中文书,所以我在书店中…』。言下之意就是「我声明在先…昭告天下…纯粹为了顺应同学的程度…勉为其难降格以求…并不是我认同这本书…」。

很容易你就可以在电脑圈(甚至是整个科技圈)的周遭朋友中听到、触到这样奇怪的优越感:「中文技术书籍我是不(肖)看的,我拢嘛看原文。」

虽然伤感,但我没有非难或菲薄那些人的意思。要叫人家舍弃牛排咖啡改吃烧饼豆浆,总是要给人家知道烧饼豆浆的营养在哪里,或者美味在哪里。中文书如果深度泛泛(没有营养),读来又龇牙裂嘴(没有美味),凭什麽叫人家看呢?凭民族主义吗?


●母语

不管任何人,只要是中国人,只要他的母语是中文,我不相信他的外文能力会比中文能力强。所以即使数学博士(我是指Jedi)也说:

『我读中文比读英文快!我有可能在2~3天内读完你的大奥秘,但我得花两个星期才能读完 Windows 95 System Programming SECRETS。喔,我不需要使用英文字典,但我的阅读常会被打断,在我回到原文书被打断的那一点时,你的中文书可以帮我快速重拾原来的思绪』。

他又说:『我想这是重点,你的书不能够取代原文本,但是我可以在短时间内获得多一些。』

我想起我在 Inside Visual C++ 1.5 和 4.0 的译序中说过的大话:

『让买了原文书的朋友後悔,是我的第一个目标;让买了原文书的朋友再掏一次腰包,是我的第二个目标;至於我的第叁个目标,呵呵,是让原文书滞销』。

过了好几年了,我还是以这样高远的目标来翻译书籍。凌云志,志凌云!年少轻狂语高傲,是对自己的期许。一位任职於知名软体公司(专做中文辨识、手写输入等相关软体)的朋友告诉我:『整个办公室原本都是 Windows 95 System Programming SECRETS原文本,後来静悄悄地都换上了「大奥秘」;至於「深入浅出 MFC」,本来就人手一册』。

啊,我相信我做到了年少轻狂高傲语中的第二点和第叁点。第一点嘛,对某些读者而言,我想我永远也达不到第一个目标。Jedi 的说法其实我是可以理解的,因为即使我自己,面对像侯俊杰这样的译作,我还是希望拥有一本原文本,至少在 index 上就价值不菲。


●电脑中译书

所以,不论是英文实力再好、英文阅读再没有问题、技术再专业的人,以各种角度综合评量,一本好的中译书对他还是有相当大的贡献。

可是我看到国内电脑中译书籍的整体品质,实在忧心忡忡。一本好译本淹没在 5000 本烂译本中,0.0002,以统计学的观点,那就是 zero!也难怪学有精专的人对於翻译书要弃如鄙屣,一脸不肖!美静是最有机会看到我发飙的人,常常看我边看中译本边唉声叹气,不时把出版社、译者、排版者统统痛骂一顿。再严重一点就把它们当垃圾处理掉(但是想到写笑话时派得上用场,又捡回来)!

诚如 Satan 网友所言:

> 目前市面上国内作者自己写的书深度大部分都不够,
> 这就是翻译书存在的必要性吧我想。

因为国内高阶技术书籍有严重的地中海型贫血(会致命的那种),以及因为国外有经典名作,所以,没有人会否定电脑翻译书的重要性。只不过,这个重要性读者以质来看,某些不肖出版社则以钱来看。

我真的不知道,出版社就不能够拨出一些些钱,做点累积形象的高阶技术书籍?公司的经济命脉有 DIY、Office使用秘笈、Win95 圣经宝典来扛就好了,就不能够在高阶技术书籍的中译上面多花一点点心意吗?就不能够给译者充份(或至少足够)的时间,就不能让所有用心译者的校稿心愿能够有那麽一丁点实现的机会吗?这样卑微的要求很奢侈吗?

对於不肖的出版社,这样卑微的要求真的很奢侈!

事实上高阶技术书籍,只要做得好,不但可以赚形象,也不会赔老本。软体工程师有多少?科学园区里的 juniors、seniors 有多少?大学生、研究生有多少?(老师、教授也要看的,但他们通常会获得赠书)。这麽庞大的 base 不能支撑出版社出高价请高人译出一本好书?我只能够说抢短的心理实在太低级、太没前瞻眼光、太侮辱读者。

我多次应邀到大学资讯系演讲,面对当前大学生打工翻译赚生活费的情况,总是以很严肃的态度告诉同学们不应该这麽做。重点不在「学生」这个身份上,网友 xxx 说的是:

> 找大学生来翻译我也听说确有其事,但有些大学生的程度
> 并不低於研究生喔,我们最好避免以学历看待一切。

但网友 Mave 说的更好:

> 这可不是以学历看待一切的问题,而是学生并不是专职
> 的翻译人员…,我的教授当学生时就干过这种事,他说
> 有时他也不知道原文的意思,还是硬着头皮给它翻下去,
> 所以现在他不要我们去看翻译书。一大讽刺!

真的,我不否认大学生之中有早慧优秀的例子,我自己在教学以及读者作者互动之中,就曾有过几次惊 。但这是极少数的。再就写作(含译作)而言,技术和文字表达是两码子事,没有必然关连。好吧,就算你技术好、充满热情、文笔又佳,最後一个重点来了:你的学生身份能够让你驾驭一部庞大的出版机器吗?你敢不敢说『这本书一个月完成是不可能的,我需要叁个月』?你敢不敢说『在我没有点头之前不可以付梓』?你敢不敢说『虽然已经校稿 n 次了,但这里排版不理想,请重做一次』?你敢不敢说『这里网点太疏了,读者眼睛会花,重做』?不,你不敢!我知道你不敢!出版社肯让你叁校,那叫做…哼哼…皇恩浩荡。这其实也有互动关系在,并非没有出版社愿意配合,但你敢不敢提要求呢?


网友 Mave 又说:

> 翻译的人或都有一定程度,但翻译的态度与投注的心力
> 才是书的精华所在。

我相信有一些学生有实力也有热诚,但如果你无法影响为你制作书籍的一群人(那真是一大群人)的态度,你的热诚反应到成品上也就化为 zero。


网友 DaNee 说:

> 我以前是个大学生,…基本上,个人不反对学生(尤其
> 是本科系学生)从事翻译工作,但是先决条件有二:
>
> 1. 译者必须有优於常人的文字表达能力
> 2. 译文内容必须是该学生的专长领域
>
> 我个人大学时,也从事翻译的工作,不过非我所长的东西我绝
> 对不翻,算是对自己良心负责吧!

很好,你择善固执,有所为有所不为。不过你控制得了书稿交出去後的流程吗?你控制得了因为奇怪的「市场因素」而做的莫名其妙的删减吗?或是书籍另半部的翻译品质吗?或是百般误谬的排版吗?或是莫名其妙的挂名吗?或是莫名其妙的出版序吗?或是莫名其妙的书後广告吗?你不能,面对不肖出版商,你只能固守你仅有的那 60 页交出去的样子(DaNee 说他所「包过的工程」中最大的一次只有 60 页),而且还不能保证它面世的样子!

校稿是很重要很重要的。最近我看 Advanced Windows 3rd edition 中译本,有不少让我痛心的地方,译名、排版、文字误谬…(注)。我相信是因为译者没有校稿(排版後的定稿),因为这本书的译者实力似乎不至於如此。我小心翼翼地批评这本书,不希望抹杀一位可能还有点潜力的译者。那些穷斯滥矣的中译本,我连看都懒得看,说都懒得说!

————————————————-↓
注:为了公平,我举几个 Advanced Windows 3rd edition
中译本的例子:

p.3-23 line 3 :
反之若不以此旗标建立新处理程序,则新型成会使用其父处理程序的视窗。<请问> : 「型成」是什麽?大概是行程(process)之误。但是书中绝大部份是把 process 注为「处理程序」。

p.3-25 line 27 :
如果此桌面存在,新型成将建立在此桌面上,如果…<请问> : 「型成」是什麽?大概是行程(process)之误。

p.4-23 line 1 :
如果不是从 Explorer 而是从命令列执处理程序式,则可…<请问> : 「从命令列执处理程序式」是什麽意思?大概是「从命令列执行处理程序」。

p.4-24 图4-1
原文 "Idle" 成了 "优先权",原文 "Normal" 则成了 "停顿"。
————————————————-↑


总结来讲,我不赞成学生做电脑书籍翻译。各位要打工赚生活费,很好,厚植你的实力,到学校电脑中心或外头软体公司接 case 来做。又得 programming 经验,又得team work 经验,又有钱赚。辛苦与否在其次,这样比较有意义。软体公司容不得烂东西流出去的,你的工作会在严格的监督与检验之下进行。我从没有看过哪一个行业像不肖电脑出版商那样重金钱如泰山,轻名誉若鸿毛!都已经在网路上被骂得臭头了,仍然遮着眼睛以为看不到,捂着耳朵以为听不到,我行我素干这等误人子弟的营生!


●让我忧

说到底,为什麽没有太多的专业人才进入资讯技术写作和翻译的领域呢?我们没有好人才吗?不会呀,我的好朋友在电通所,他的 OO 涵养以及多媒体大程式的掌控能力,足以写出掷地有声的书,起码叁本!我的另一位朋友,诸子百家无一不精(从 OWL、MFC、BCB、Delphi、Win32、System Kernel、VxD、pattern recognition),他的肚子里至少挖得出铿锵有声的书,五本!我在华邦、力捷、睿昱、宏 、蒙恬、友立…的朋友,哪一个不是身负绝技!要开发世界级软体,容或还需要技术方面的整合与管理;要在专长领域里制作一本书,这些人学养绰绰有馀。

我不是常常强调「技术与写作是两码子事」吗?我不是也说「技术容易写作难」吗?是的,但如果写作或翻译带来荣耀,带来经济上的安定,我相信他们愿意尝试,愿意努力。毕竟他们都同意,写(译)一本好书,意义大得不得了!

说到底,实在是因为电脑书籍的写作与翻译是一门社会地位不高的技艺。靠着不肖出版商和不肖作者的努力,电脑书籍带有一种「乌鸦鸦、骗钱啦、粗制滥造赶流行」的印象。如果是科班出身,进入这个领域会被视为「大材小用,学非所用」。

我身处这个领域,很伤心竟然有机会这麽贬低作贱自己。有一段时间,交换名片时我不知道怎麽介绍自己的工作。『我写书』,『写什麽书』?『电脑书』,『哦…』。资讯界外的人『哦』一声是二声…充满钦慕;资讯界内的人『哦』一声是四声…原来如此!自从在学校开3学分课程之後,我就统统以『我教书』一语带过尴尬时刻。

如果在 seniors 的眼中,电脑书籍作家和翻译家的社会地位不高,他们怎麽可能把生命投注在上头?


●大材小用?学非所用?

最近我终於说服了电通所的朋友,由我把他肚子里的东西挖出来。我不知道我这样劳碌命是干嘛,但我觉得好像为国内读者打了一场胜仗。平时我打败仗的时候居多!先前提的那位精通诸子百家的朋友最近要离职了,我竟留不住他花一点点时间驻足在一本他自己也非常心动的英文经典名着的翻译工作上。

科班出身者,进入这个领域常被视为「大材小用,学非所用」。奇怪咧,那麽多学音乐的人,有几个站上了国家音乐厅?又有多少人是在 Yamaha 教琴、在国中小教音乐班、在家里收学生?他们可没有把教学视为「脱离本行、学非所用」!

我真希望,每一位对於技术文字工作有热情、有期望、曾经因为看过一本好书而受到激汤鼓舞的 seniors,能在心中立一个志愿:我这一生要为我的工程师生涯留下一本掷地有声的着作或译作。

一本就好!一本就好!

Shyu、Weipo、Gauss、Xshadow、Wolfgang、ywhuang、Power、Lowrence、Mike…你们听到我的呼唤了吗?


●加油兼打气

有些朋友(通常是特别醉心於学术的朋友),有着「外文书写得那麽好了,我又不是第一本」的心结而打退堂鼓。从自我实现的角度来看,我们现在谈的是「留一份问心无愧的足迹」,不是学术论文,你管别人写过没;从知识的原创性来看,全世界 50 亿人口,知识的原创只是 only one,你的志向竟然大到要当那 No.1?你的书带给後进帮助,是因为你心得整理得好,不是因为你创造了什麽。Windows 各种技术,容我说,原创者只有一个,就是Microsoft 那群人。Matt Pietrek 的 Windows 95 System Programming SECRETS 中有许多 kernel 奥秘,J.J.Hou 的Dissecting MFC 中有许多 MFC 内部机制,Jeffrey Richter的 Advanced Windows 中有许多精良实例与解说,这些人都不能说是知识(技术)的原创者,但他们的作品有教育性的原创!他们的贡献当然是不容抹杀的。

写一本这种教育大众(也许是小众)的书,比的是技术深度,比的是文字深度,比的是心得整理,比的是动线顺畅,比的是编排悦目,比的是图解了然,比的是范例精良。唯一不必比的是「谁抢第一时间」。当你有一点点时间压力,你的出发点已经受到了一点点扭曲。时间压力是「商人」的事情,不是你「作家」的事情。

各位也不要说我陈义过高啦,不知疾苦啦!我要激发的是作家,不是商人。

●砂砺中的珍珠

有不肖出版商和不肖的作者译者,自然也有用心的出版商和用心的作者译者。我诚垦希望你们不会因为我的严厉批评而有所伤害。我没有指名说出肖与不肖,你们一定要相信,读者心中自有一把尺。

君子坦荡荡,小人长戚戚;
荣者日安安,辱者定碌碌。

我们互勉之

========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================

【热布克hbk】超经典(转):编程-观古今於须臾,抚四海於一瞬


========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================
【选义按部,考辞就班】
本文登於 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 就可以把自己锻炼成百战金刚。一切都掌控在你自己手里,成也由你,败也由你。

========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================

 【热布克hbk】超经典(转):编程-传统下的独白


========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================
侯捷 1998.01.22 第一次发表於
清大.枫桥驿站.电脑书讯 CompBook 版(140.114.87.5)
本文将发表於 RunPC 1998 叁月号(二月号来不及啦!)

●网路阅读

BBS 电脑书讯(CompBook)版有一封由 nojunkad 网友於1998/01/19 发出的信件,引起我颇大的兴趣:

> 以前满喜欢看书的,不过自从 Internet 风行後,就比
> 较少看书了。想请各位谈谈网际网路的兴起对电脑书籍
> 的影响有多少。各位接触 Internet 後,原本的阅读行
> 为有多大改变?又如何在两者之间取得平衡?谢谢。

就我而言,没有改变。我很不习惯在电脑萤幕上看长篇大论的东西 — 要消耗脑细胞的那种更是没有办法。所以我还是喜欢舒舒服服地摊开一本书,由太座奉上香浓咖啡一杯,红蓝笔各一,再展开我的学习。这也是我目前唯一可以理直气壮地说「喂,来杯咖啡」的时候。开玩笑,读书多麽神圣,怎能没有咖啡。

我之不喜欢在萤幕上看长篇大论,除了保护眼睛,和英文阅读能力多少也有关系。不过侯捷阅读电脑技术方面的英文文字尚有一般水准,不会差一般人太多,对於萤幕阅读的态度应该能够代表为数不少的资讯人。

nojunkad 网友想问的,说不定是:「如果有一本书,有电子版在网际网路上流通,可免费下载,你会买书还是抓书?」唔,这本书如果万儿八千元,我会用抓的,如果千儿八百元,我会用买的。雷射印表机印出来的东西像「报告」,质感不够,会影响阅读时的氛围。

以我自己的作品来讲,我不但不介意它们在网路上流通,供自由阅读,而且我希望愈多人看愈好,因为看过所以不想花钱买印刷品也没有关系。我没有把我的作品制成网页,是因为我没有时间。谁要将我的作品做成网页放在他的网站上,我可是欢迎得很,不过你的网页制作水准要合我的意就是了。

所以,不必再有人问可不可以转载侯捷的文字。只要是在网路上流通,您随意吧。


●原文书进口标签

我不喜欢看到我想看的东西被我不想看的东西遮起来,甚至黏起来。

偏偏在我购买外文电脑书时常常发生这种事情。

我检视书房里的电脑书籍,有松岗、峰、天珑、微科、全华、旗标…各家进口的原文书,每一家都不约而同在书背最下端贴上一张邮票大小的贴纸。黏力超强,撕它千遍也撕不掉,抠它千遍也抠不净。除了去渍油,没人奈何得了这小小一方强力贴(绝对不是便利贴)。只有峰的贴纸还算好,勉力撕下後可以整张拉起来,不会支离破碎得更丑。我询问过峰的朋友,他们的确特别用心挑过贴纸,足证事在人为。

我记得曾经读过一篇文章,报导 3M 便利贴的发明故事:曾有一段时间,厂商比的是谁黏力强,後来觉得「有点黏又不太黏」有更大的市场。

我觉得我们这些外文电脑书进口商全都没有进化。

书背下端是什麽你知道吗?是出版公司名称耶!也有可能是作者姓名耶!如果有什麽金字招牌可以因为亮相而吸引读者购买,在商言商,我不反对把它贴在书背(把整个封面贴起来我也不反对)。可是我们不会因为谁进口这本书而买它,是不是?我们会因为作者或出版社去买一本书,而他们却被「永久地」贴起来了。

我不知道外文书进口商有什麽难言之隐没有。点货方便?藉此广告?广告效果应该是没有,反广告效果倒是有。不管他们有什麽困难啦,反正我就是不高兴这麽重要的地带被他们「永久性地」伤害了。换一种「有点黏又不太黏」的贴纸可不可以?


●书痴与「天下第一页」

曾经在报纸上看过一位自称影痴的读者投书。他说:『什麽人有资格叫作影痴呢?对摄影手法品头论足?对影星轶闻如数家珍?对导演思想融会贯通?不,都还不算!看完一出电影,愿意留到(并享受)最後一刻,看完工作人员谢幕表,才有资格说自己是影痴』。他又说:『在时间就是金钱的压力下,坚持完整播放谢幕表的电影院,好像只剩长春戏院一家了!』

那,什麽人有资格叫作书痴呢?侯捷曾经收到曾奎宪读友的一封来信,很有点意思。当时【无责任书评1】出版,书後放了一张由我精心设计的读者问卷,曾先生来信这麽写:『很抱歉我不用书後的回函卡报告,因为剪下书中的任何一页,甚至是空白页,对我而言,无异於焚书坑儒,是可忍孰不可忍?』这封长信被我收录於【无责任书评1】第二刷(旗标,1994/10)中。我从善如流,建议出版社将第二刷书籍的问卷做成完全相同的一式两份,这样子撕一页下来就比较不会有遗憾。结果呢,没人理我!

曾先生当时已赴美留学,现在应该早已学成。我很怀念几位在【无责任书评】初创年代,在 Internet 还不盛行的年代,曾经亲笔写满叁两张大纸给我的读友,包括曾奎宪先生、纪俊男先生、卢静秋老师…。

好,回到所谓的书痴。我和曾先生的理念相同,不愿意伤害心爱书籍的任何一页。有些人(很罕见)把「伤害」的定义又扩张到极大,连摺都舍不得摺,更别提在上面做笔记心得眉批了。他们看起书来小心翼翼双手捧着,像礼佛一般。你碰过这种人没有?我的大学室友就如此。你别以为他看的是佛经或圣经或什麽文学大师的作品呀,他看的是高等微积分,成绩还一级棒。怪哉!

这该算是「书洁癖」吧,和「书痴」之间应该不构成充要条件。

倒有一点和影痴先生的「工作人员谢幕表」异曲同功。如果你看书看到俗称的版权页(英文书多半在书前,中文书多半在书後),看看版次(注),看看刷次,看看有的没有的;看看文字编辑是谁、技术编辑是谁、封面设计是谁、排版是谁、美工是谁…,你,书痴一个!

★注:有一位读者就很注意侯捷书籍的刷次,曾写信来安慰我说『侯大哥你好可怜唷,书籍经年累月都只一刷』。呵呵,现在有进步啦!

对身为电脑书籍读者的我们而言,当书痴就难了。中文书嘛根本没有文字编辑、技术编辑。封面、版面、美工从来也不是 credit 的重点。至於英文书嘛,谁是谁和我们有什麽关系?除了因为天王级制作人 Andrew Schulman 的出现使我曾经注意过谁是电脑书籍的技术编辑,我自己也很少注意这「天下第一页」里头谁是谁。

书籍应该有制作人,制作人应该是技术编辑和文字编辑的总合。这个位置有多重要,看看 Matt Pietrek 在其名着Windows Internals 中的一段感言:

————————————————↓
首先我要谢谢的,当然是我的编辑 Andrew Schulman。没有他这本书几乎不可能完成。当我们开始为这本书筑梦时,它看起来是那麽令人畏缩可怖。只因为我知道他可以助我一臂之力我才有勇气进行下去。几乎我所写的每一笔资料他都有令人惊讶的丰富知识,而且他也注意不让太多细节扼杀了想像空间。每次当我认为我已经钜细靡遗地涵盖了一整章细部讨论,他会以数百个毫不夸张的意见把我推回原点,促使我完成更详细的讨论。我不能够想像是否还有更好的编辑如他了。
————————————————-↑

以下则是我在 1994.01 评介 Windows Internals 时,发表的看法:

————————————————↓
我把上面这段文字翻译出来,用在提醒国内电脑书籍出版业者,一本技术书籍影响学子之甚超乎想像,出书不能不慎,建立 peer review(同僚覆审)制度有其必要。我所知道的国内电脑书籍出书过程,许多会让读者骇然。电影有制片人,唱片有制作人,为什麽电脑书籍没有?

我多麽期盼国内出现审稿制度以及群力制作单位,期盼像Schulman 这样的专家编辑。少年当立凌云志,我虽不再年少却也多麽期许自己的学养能够成为那样的编辑。但是话说回来,技术编辑可不是挂名领钱尸位素餐,如果只为了图某人某人的知名度,拉来助长声势,那真真是再没意义的事了。
————————————————↑

最近我看到一本 O’reilly 出版的 Inside Windows 95 File System,举棋不定,後来翻看「天下第一页」列出来的编辑是 Andrew Schulman,才吃了定心丸。说来可怜,古今中外电脑技术书籍的第一号制作人 Andrew Schulman,名字都还没能够排上书籍封面。这是一种…唔…出版界还不够成熟的徵象,我这麽认为。Addison Wesley 曾经有一个 The Andrew Schulman Programming Series,算是出版公司对这个位置最大的尊荣了。

国内有些书籍是以工作室、研究室的名义产出。其中一些只为壮大声势,一堆人就是一个人;而在某些严谨的工作团队里,我知道的确有着类似制作人的型态存在。集体创作没什麽不好,有强而有力的总舵手就没问题。哪一天能够把「天下第一页」做得毫不含糊:谁负责技术、谁负责文字、谁负责版面、谁负责封面…,则又是台湾电脑出版界的一大进步了。

「没有声音」是我们前副总统的写照,「没有名字」是我们某些电脑书籍工作者的写照。很佩服那些长期隐姓埋名在巨大光环下的人,我就没办法!


●正确的选书方法

听说有人看书不看序,为数且不少,令我骇然。

早些年是没什麽好骇然的。早期中文电脑书,要不没序,要不八股一堆,不看也罢!作者自序最後总要来上一句「本书仓促付梓,误谬在所难免」,大约就是我们国小国中高中写作文时活死人肉白骨(至少加 3 分)的那最後一掷:「反攻大陆,以慰国父蒋公在天之灵」。喔,你说对了,「误谬在所难免」之後通常都还会有「尚祈各界先进不吝指正」。各界先进是给他指正了,新刷新版却也未见更正。

都是屁话!

另一种 style 就是请一堆名人写序。这种情况今不能免,昔不及今。上星期一位任职大公司的好朋友告诉我他的第一本新书要出版了,他说:『上面说得好好打点一下,於是请到一位中研院的研究员写序;自己公司的大头当然也要趁机露个脸。嘿,开玩笑,一本书咧!本来想请台湾区的总经理来写,後来看看不如请大中华地区的老板来写』。我说:『好哇,未出师先气势!他们写得怎麽样!中不中肯?』朋友撇撇嘴:『还不是尽讲些官话,书根本没看。大中华那个的序还是我代写的。她一直没时间看,最後我们不管了,代她放一个 signature 就印啦』。我这同学非常无奈,但是人在江湖身不由己。怪的是,这只是一本翻译书,序也忒多了些吧!更怪的是我同学说:明明是翻译,为什麽出版社在封面写「编组著」?

同学,你涉世未深矣!

近年来电脑书序比较有看头了。什麽山高月小、什麽访仙得书、什麽鬼斧神工、什麽奇穴探险…;又是「一字之差 五百世轮回」,又是「身毁形灭 唯舌不灰」,煞有看头。尤其这访仙得书记(Visual C++ 5 视窗程式设计经典/林俊杰/峰)非常有趣,侯捷不及也。林先生以古文为体,将该书内容做一画龙点睛式的描述,生动活泼,极为出色。

序如果写得好,就是读者认识一本书及其作者的最佳窗口。我曾经在书店仔细观察过一般人把书拿下架後的动作,有不少是这样子:

1 随手掰开(通常在书本 1/2),前前後後翻个两页;
2 再随手掰开(这一次大约在书本 2/3),前後看个一页;
3 再随手掰开(这一次大约在书本 1/3), 看个半页;
4 把右手大拇指搭在封面右缘中央处,左手握住书的左侧,两手向下压,右手大拇指缓慢向右滑动,让书页呈飞舞状(这可能是一种人类进化过程的神秘习性);
5 把书本 上,翻转封底看定价;
6 皱个眉,口中嘀咕两声(抱歉,听不清楚说什麽);
7 放回原位;
8 重复 1~7 的动作。

我很惊讶他们不但不看序,连目录也没看!

朋友,选择一本书时,序和章节目录很重要!如果第一章(或第0章)有导读或架构说明更是好。如果对於这个主题你是完全的门外汉,大概选书的仪轨只能进行到这里了。如果对於主题你已有点功力,这时候就应该找个座位,翻到你最熟悉的条目,看看作者怎麽解释;再翻到似懂非懂的条目,看看作者怎麽解释。然後才决定要不要和这本书长相左右。

在书店「找个座位」?喔,书店里头有座位吗?有,松岗门市(敦化南路和信义路交叉口)有各大电脑出版社的中文书籍和杂志,也有为数众多的原文电脑书,还有舒服宽敞的座位,侯捷最喜欢去那儿选书。新骅书局(罗斯福路台大校门口附近,专营电脑书)也有座位(两年前的印象)。


●电脑书籍的排版艺术

现今的排版软体功能很强、很花、很眩。排版人员,不管是作者自己,或是出版公司的排版部门,或是独立的排版工作者,虽然受过排版训练,却没有受过版面布局训练。所以我们读者就常常被迫欣赏「杂菜面式」的排版。那就是说,什麽功能都给它露一下。反映到字形上来,你会在一本书中同时看到明体、黑体、圆体、宋体、颜体、POP 体、隶书、行书、楷书、魏碑、古篆、勘亭流,呵呵,历代书法大展!反映到颜色上来,则像打翻一缸染料 –反正四色和全彩价钱相同,不给它多上点颜色可惜。此外如页眉啦、网底啦、斜体啦、底线啦、页码啦,也都极尽变化之能事。

拜托!这些全都是兵家大忌。

侯捷排过几本书,读者的反应是「清爽乾净」(只有我爸嫌字太小)!那就不能怪我说话宏声了,让侯捷来给电脑书籍从业人员上一课排版:

1. 松紧:阅读的舒服程度,和字体大小没有绝对的关系(只要字体大过 9 号),和字距以及行距的关系比较密切。字的大小和间距如果没有和谐搭配,眼睛绝对不会舒服。

2. 颜色:不要像村姑上大街,每一种胭脂都要往脸上抹。有的颜色配在一起有肮脏的效果,绝对不能用。我看过那种全彩书籍(现在最流行了),页眉一个颜色、页码一个颜色,内文叁两个颜色,网底五六个颜色(外加渐层),有够丰富的。五色令人目盲,我总觉得素雅比俗 来得高级。

3. 字形:简明 实为要,千万别开书法大展。会让眼睛疲劳的安排,统统应该避免。我以为,一本书 3~4 种字形已是上限。

4. 斜体:仓颉造字以来,5000 年中华文化,方块字从来没有以斜体表现过,斜体中文字在我看来真是不对劲儿。如果要强化文字效果,应该利用不同的字形,不应该用斜体。

5. 留白:留白绝对有必要,一来给读者做笔记,二来让版面更雅致,增加阅读效果。只要书籍内容有料,读者绝不会误将留白视为灌水。

6. Index:技术性书籍的 index(索引)不可少,遗憾的是中文书绝少做到。我很惭愧地说我也不太会这项技术。各出版公司当然不会不知道 index 的重要,五年十年过去了,可曾要求排版部门或协力厂商好好研究研究制作 index的技术?印象中只有「资讯人」出版社对此很用心。

排版效果影响阅读效果甚巨,千万不可忽视!

●急就章 — 线上回覆

Internet 的兴起,带来很多新的社会议题和文化冲击,其中一个就是,各位是否发现,BBS 或 News 的信件文字品质十分粗糙?错别字一大落,语句不通一大落,断章取义也是一大落。我看呐,都是「线上回覆」惹出来的祸。

你在线上的心情如何?常常急如星火吧!何必呢?离线阅读不是很好吗?离线回覆不是很好吗?什麽东西都要速成、速食,东西怎麽会精致?人生又怎麽会精致?你说离线会多占硬碟空间?硬碟空间算什麽嘛,你甘愿以不知不觉养成的坏习性来换取不值钱的硬碟空间吗?2GB 才 6000 元不是?嘎,又降价了 ?!

●九指禅

前一篇文章「给作者的一封信」发表後,paulchn 网友针对我的「九指禅」给了一些建议:
> 1. 试试手写输入法
> 2. 试试语音输入法

william 网友则做了一些回应:

> 呵,连敲键盘都有困难了,还能「执笔」吗? :)
> 除非是用「握」的… :p

真的是,不能敲键盘,写字更困难。这一篇又是九指禅下的产物。我忍不住请美静来看看我的移指大法:凡要用右手中指的键,如 i、k、8,都以右手食指取代之。这麽艰困的情况下还能够一天内完成这篇文章,我有点洋洋得意。美静於是说了个故事给我听:

『我有位学姐,主修钢琴,有一次大考前一个星期伤了右手大拇指。她准备的曲目是布拉姆斯狂想曲,难度很高。怎麽办呢?凡需要用到右手大拇指的地方,她都以右手食指代替。』

我请美静当场弹一段布拉姆斯的狂想曲,从此…呃…绝口不再提我的移指大法。

— the end

========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================

【热布克hbk】超经典(转):Windows编程书评


========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================
“前言”

    大约八、九年前我开始学习程序设计时,编程方面的书籍十分缺乏,只要有一点内容的书大家都会掏钱购买,如果有了一本好书象Ray Duncan的中《Advanced Dos Progamming》, 那就被大家都当成宝贝一样人手一册珍藏。现在各家出版社都争相出版各种电脑丛书,书目让人眼花撩乱,书本价格也越来越高,难免鱼龙混杂,读者想购买书籍时不免左挑右选:难于决定哪些是真正的“经典大片”, 是值得你付出银子、精力的真经。哪些是虚有其表的作品。如有专家指点,读者就能不用费神思量了。笔者不揣浅陋,抛砖引玉,介绍一些Windows编程方面的书籍,仅供参考。

“Windows程序设计的圣经:Petzold”

C/C++语言是主流程序设计语言,Windows是当今最流行的操作系统,只要你想加入计算机软件行业,你就必须掌握这两项本领。可惜至今我们国家很多学校计算机软件专业都还没有开设Windows程序设计的课,可能用的课本还是我们10年前的课本,相当于国外20年前的水平,大部分刚走出校门的毕业生还得从头学起,这种落后情况何时才能改变。
    对于已经基本掌握C/C++语言,想学习Windows编程的读者, 《Programming Windows95》是最合适的教材。这本书大名鼎鼎,是最著名,最受好评,最为畅销的Windows编程经典著作,被誉为Windows程序设计的“圣经”。作者是Charles Petzold, 国内由清华大学出版社出版,书名《Windows95程序设计》,定价98元。
    Charels Petzold是自由专栏作家,是第一个在杂志上介绍Windows编程的作者,通过对微软Windows编程资料近半年的研究学习,他掌握了Windows编程,他发现自己能比微软更好地解释如何学习Windows 编程,于是1988年他出版了〈Progamming Windows〉一书,开始介绍的是Windows 2.0编程,现在这个版本是第四版,介绍Windows95编程,其它两个版本是windows 3.0,3.1。虽然Windows经过了将近10年的发展但这本书的大多数程序看起来没有太大变化,实际上Windows的设计原理所谓事件驱动方式本质上基本没有变化。
    Charels采用的是传统的C语言,直接调用Windows API(Appliction Progamming Interface应用程序接口),而不是流行的C++和MFC。这看来有点陈旧和过时,但实际上这种SDK编程即直接使用Windows API编程是最基础、最本质、用途最广的Windows编程方式,只有这样才能清楚体验Windows程序设计的原理:"基于消息,事件驱动方式",而且通过调用API可以深入了解Windows操作系统的基本部分。对于采用Visual Basic或者Delphi等快速程序开发工具(Rapid Appliction Development ,RAD)的程序员来说,掌握SDK编程可以进一步提高实力,设计出更高质量的程序。
    这本书取材全面丰富,涵盖了Windows编程的主要领域:消息驱动,GDI,窗口控制,资源,内存,打印,DDE等,每一方面都举出短小精悍的例子说明,新版内容也覆盖了Windows95的新概念:如多线程,增强GDI,抢先多任务,新的Win95界面控件和增强OLE等。不过很多人认为3.1版本的书是最有价值的,相比起来针对Win95版本增加的内容和深度都还差一点。但对于全面掌握Windows编程的基本概念,特别是从Dos编程转移到Windows编程,这是最好的教科书。
    这是一本大部头著作,中文版有875页,附有磁盘,英文版有1100页,书中的程序代码非常清晰,有很多注释,注释也非常清蔟,是如何进行程序编码的优秀样板,阅读别人的优秀代码是学习编程最好的方法。这本书属于典型技术派风格,文字简炼,平铺直叙,没有象通常的美国书籍有笑话,趣闻,故事来调节一下,读起来很是有点累,不过这是值得的。
    由于Charles Petzold对Windows编程推广的巨大贡献,(对于整整一代程序员来说,"到 Petzold"的书里查一下"早已成了解决Windows程序设计的法宝.),. !994年微软公司和Windows杂志给他授予了Windows先驱奖,其他六个同时获奖的人都是微软公司的Windows主要设计人员和市场人员,这也充分证明了这本书的价值.

“其它书籍”

    另外还有一本非常不错,也是介绍SDK编程的著作,Jeffery Rithter和Jonathan Locke 的《Windows编程指南》,也由清华大学出版,但实际上名字和内容有点不符,技术层次比Petzold的书要高,特别是介绍了一些高级主题如钩子函数(Hooking),子类化 (Sub Classing)等,是进一步提高实力的书籍。
    真正进行Windows程序设计,还需要有Windows API手册可供查找,虽然开发工具象Visual C++和Boland C++都有Windows API的电子文档的帮助文件,但书本也有书本的好处:可以随时翻阅。这方面的书籍有清华大学出版6本一套的《Win32编程手册》,机械工业出版社的,每个API都附有使用范例,颇具参考价值,不过有些内容不够准确,必须参照最新电子文档才能可靠使用。

"MFC领域的Petzold书籍?"

    掌握了SDK编程,你也就掌握了Windows程序设计的基础和核心。但使用SDK进行大量的程序设计也是十分痛苦的经历,好在现在有了MFC(Microsoft Foundation Class), MFC无疑是目前最重要的开发工具,大部分的商业软件最新版都是用MFC编写的。事实上很多人跳过SDK直接学习MFC编程,这样当然无可厚非,但循序渐进打下坚实的基础实际上更有好处。下一期我将介绍MFC编程方面的书籍,每一个编写Windows程序设计都希望能取得象Petzold那样的成就,MFC领域的作者也都是这样, 谁是MFC领域的Petzold书籍,请看下期。

 ========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================

【热布克hbk】超经典(转):Visual C++编程书评


========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================
“MFC的前言”

    曾经辉煌一时的编程语言工具开发软件商Borland公司在今年4月份更名为Inprise公司,对于广大忠实的Borland追随者来说,这可不是一个好消息。在Dos编程时代Turbo Pascal,Borland C++是最好的开发工具,Borland公司也曾名列美国五大软件公司之列,可到了Windows时代,微软凭借操作系统的优势终于占了统治地位,Borland的大批人员也跳槽加入了微软(Borland Delphi的主设计师成了Microsoft Visual J++的项目负责人),所以不用奇怪Microsoft的Visual C++汲取了各家技术之长,包括Borland,Phar-lap等著名公司,Visual C++成了Windows时代最流行的商用开发语言。
    Windows的开发也走向成熟,早期Windows编程只能用C语言,需要一段一段地重复调用复杂的Windows API,写冗长的消息处理Switch语句,现在大部分开发人员都使用C++进行Windows编程,工具开发商也将Windows API和必要的资料封装到一个个C++类库之中,构成所谓“应用程序框架”(Application Framework),开发人员可以使用它更高效地进行编程,这好比登高楼时用上了电梯,而原来只能辛辛苦苦一步一步慢慢爬,现在用电梯可以上得更快,上得更高,上得更轻松。
    Visual C++的“应用程序框架”类库是MFC(Microsoft Foundation Class),Borland公司提供的是OWL(Object Windows Library),OWL和MFC孰优孰劣,笔者不敢妄加评论,但现实是Borland的C++到5.02版就改出C++ Builder,类库改用Delphi的VCL(Visual Component Library)。
    MFC功能十分强大,但要学好不容易。Visual C++提供了各种Wizard和上千种C++类,如果不掌握面向对象编程OOP(Object Oriented Progamming)的技术,了解MFC的结构,很难设计出良好的程序。很可惜,国内关于这方面有内容和深度的书籍出版太少,而国外的技术书籍在国内又不容易买到,不知道有没有这样的书店可以提供购买国外原版技术书籍的服务,最好还能再打一些折扣,技术书籍的版本更新太快,国外一般书籍较早版本的技术书折扣都很低。

“绝版〈Visual C++内幕〉”

是一本关于MFC编程很不错的书籍,国外最新版是第五版,介绍Visual C++ 5.0版,国内中文版由清华大学出版社翻译出版,目前是第二版,介绍Visual C++ 2.0。作者是David Kruglinski.
    这本书面向的读者是有C和C++基础,对Visual C++较为陌生的程序员,通过一个一个范例逐步深入介绍MFC编程的方法,而且对于编程中如何使用各种工具作了详细说明,包括按下哪个按钮,从列表框选择哪一项等,对于VC的新用户来说很方便的。但这绝不是说这本书是一本入门手册,作者只是在需要的时候介绍,毕竟现在的软件使用越来越复杂了。对于水平较高的读者这本书也有足够多的高级内容可供参考学习。
    书中分了四个部分,首先快速介绍“应用程序框架”基本概念和各种工具如调试器,AppWizard,ClassWizard等,接着开始进入MFC编程话题,主要是视类(CView)的用法,通过一些简单程序如绘图,消息响应,图形滚动,对话框控制和OCX使用初步展示MFC编程的方法。
    第三部分介绍文档-视结构(Document-View),这也是MFC的核心内容,当你掌握了如何联结文档和视结构后,你会发现相比以前现在实现文件操作和打印多么方便,MFC内部使用了几千行代码支持打印预览和各种打印机,Charles Petzold的著名的〈Windows程序设计〉一书花了60页的篇幅介绍如何支持各种打印机,但使用MFC实现只有几十行代码。这部分还介绍了各种界面工具,窗口切分,帮助系统,多文档接口(MDI),动态连接库DLL等。最后部分是高级话题,介绍OLE和资料库管理ODBC,不像一般书籍关于这个内容只是蜻蜓点水,这部分内容非常丰富而且有实用价值.
    新的英文版主要增加内容大致有三个方面,首先是介绍了VC 5.0的一些新特性,其次对OLE进行了更为深入全面的介绍,包括结构化存储,组件对象模式(COM),OLE自动化等,最后是关于目前最热门的Internet技术,TCP/IP协议,Winsock,WinInet API等,关于Internet的内容只是一个快速介绍,新版内容更充实,不知道清华出版社有没有计划出本书的新版。
    英文书第五版的最后还刊登了一张作者的巨幅照片和一则令人伤感的消息,“David是一个作家,程序员,老师和户外活动者(Outdoorsman),热爱徒步旅行,爬山,滑翔伞.1997年4月17日David 死于一次跳伞意外,终年49岁。” 到VC 5.0成为绝唱,但David的书籍影响了几十万程序员,而且他活得自由自在,人生至此,也就够了。

 

“VC书籍和MFC书籍”

    全面介绍MFC的书籍国内出版太少,但关于Visual C++的书籍却不少,真不知道这些人是如何选材的,MFC才是Visual C++的核心,不掌握好MFC ,怎么设计出好的VC程序。
    机械工业出版社的一书介绍了很多MFC的应用实例,其实英文名是〈Visual C++ How TO〉,程序员进行编程时会碰到很多问题,这本书提供了很多技术解决方法,对于VC程序员颇具参考价值。
    国外关于MFC的好书还有Jeff Prosise的,Alan R. Feuer的〈MFC Programming〉,Addison Wesley公司出版的以及台湾候俊杰的〈深入浅出MFC>. Jeff和Alan的书都是全面介绍MFC编程,风格内容稍有不同,Jeff讲解更为详细精确.
    属于Addison Wesley公司的“未公开核心”系列丛书,是一本高级技术书籍,面向有Windows SDK 和MFC基础的较高水平程序员,讲解MFC的实现原理和核心技术,如何将Windows SDK和API包装,对于想成为VC高手的人来说这是一本必备书,可惜现在还没有中文版.
    候俊杰是台湾著名的技术专栏作家,写过很多畅销的Windows编程书籍,也翻译过很多著名的英文技术书籍。他技术水平很高,同时文字功夫很好,又能把握读者需求,这本书在台湾很受欢迎也就理所当然了。这本书介于和之间,既介绍了MFC的应用,又介绍了MFC的核心技术。前一半介绍Win32,C++,MFC设计基本概念,后一半从VC的演示程序Scribble出发,挖掘MFC的实现机制,书中有很多精心插图,作者把握技术脉络十分清晰,是一本值得大力推荐的好书。

“感想”

    很多国内编著的技术书号称“高级编程”,实际上只相当于是入门手册,没有多少技术含量。选择书最重要的是看作者,看他是否具有真正的水平,是否能将技术阐释清楚.国内一些编书或者翻译的人自己只是一知半解,只追求速度和效益,结果只能是误人子弟。但水平很高的人如果选材过于艰深,晦涩难懂,也很难为读者接受。台湾在这方面做得很不错,一方面好的英文版的技术书籍他们能很快翻译出版,同时自己水平提高后也能写出较好的书籍。国内应该向他们学习,技术书籍市场需求量应该很大,出版社花精力出一些精品书籍对于整个软件行业水平的提高应该有很大帮助。软件评论家总在呼吁国产精品软件,但技术水平上不去,又何来精品呢?

    后记:本文写于98年7月,发表在计算机报编程栏目。
    令人高兴的是从98年8月开始,计算机技术书籍数量和质量都有很大提高,不知道是不是看了我的文章,一笑。
    清华终于出版了Inside Visual C++,不过却是第四版,而不是最新的第五版。
    MFC的书籍也有了不少,但是好象各大出版社喜欢撞车(选同样的题材),另外候俊杰的〈深入浅出MFC>也有了中文大陆版,又华中理工大学出版社出版。

 ========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================

【热布克hbk】超经典(转):C++的沉迷与爱恋


========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================
作者:侯捷

每年的 09/28 於我都是一个特殊的日子 — 不只是因为教师节。今年很特殊地没有普天同庆,那麽我就写篇文章自己庆祝一下好了。

我於今年七月发表了一本着作 <多型与虚拟> 和一本译作 <深度探索 C++ 物件模型> ,获得很大的回响。这些作品都不是针对 C++ 的完全初学者所写,但从初阶到高阶为数众多的 C++ guy,热情地表达了他们对这些主题的喜悦。

在许多来信中,我看到一些有趣的现象,也感受到一些值得整理下来的想法。所以,根据我个人的学习过往、我的教学经验、以及周遭朋友的心得交流,写下这篇文章,或可为後学者戒。

●<多型与虚拟> 序言节录

首先让我节录 <多型与虚拟> 一书序言:

<多型与虚拟> 序 节录(侯俊杰/松岗/1998/07)

一般而言,C++ 是一个难学易用的语言。

C++ 的难学,初始在於其重重的布幕,布幕之中编译器对我们的程式码做了太多的手脚,使我们惯於循序思考的工程脑袋一无所措。及长,又面临新的思维模式,使我们必须扭转惯常的思考习惯。

C++ 的易用则在於其巨大的弹性,能够以多型(polymorphism)、虚拟(virtual)、模板(template)、泛型(generalization)等种种型式,让既有的码去处理未知的、未来的资料型态。

当然,易用必须先能用。用不好或不能用的话,「写 C++ 程式」最後就成了只是「使用 C++ 编译器」,这是大家常拿来彼此调侃的笑话。

在「难学」的背景下,「易用」是使我们依然前仆後继的动力。愈来愈多的大学资讯科系把 C++ 开在大一课程,这虽然说明 C++ 是多麽地重要,可也苦了资讯新兵们。

其实「难学」的最大症结在於,很难得有一本书,能够一针见血地指出多型与虚拟的重要性;在我们粗具语法基础之後,直接把我们导引到最核心最重要的思想,并且在建立这个思想的过程中,提供足够的必要基础。


●困难度之一

「C++ 是个难学易用的语言」,这句话相信很多人心有戚戚。C++ 的学习难度,一在於语言本身太多的「幕」,一在於 "paradigm shift" (思考模式的移转)。

传统循序语言如 C, Pascal, Basic, Fortran…,除了模样看起来稍有不同,基本上都是函式 call 来 call 去,大同小异,很容易掌握。你想做的动作,在 code 中都看得一清二楚。你所看不到的,荦荦大者也不过就是编译器为你的函式加上用以处理堆叠的一小段码(prologue 和 epilogue),这一小段码基本上做的是 housekeeping 工作,你没看到也没有关系(更好),并不影响你对程式逻辑的思考。

C++ 不一样,C++ 有太多和程式逻辑息息相关的动作是编译器为我们加上去的。换句话说 C++ 编译器为我们「加码」。如果不识清这一节,学习C++ 有如雾里看花,雾非雾,花非花。

编译器为我们的 C++ 程式加了什麽码呢?很多!物件诞生时 ctor 会被唤起,物件死亡时 dtor 会被唤起,这都是加码的结果。ctor 中设定vtpr 和 vtbl,这也是加码的结果。new 单一物件时会产生 memory block cookie,new 物件阵列时会产生一个内部结构记录着 object size 和 class ctor…,这也都是布幕後的工作。可以说,程式码中看不到而却必须完成的所有与程式逻辑有关的动作,统统都是 C++ 编译器加码後的结果。

当「继承」发生,整个情况变得稍微复杂起来。「多重继承」又更复杂一些,「虚拟继承」再更复杂一些。

这些布幕後的主题,统可归类为所谓的 C++ object model(物件模型)。如果不知道这些底层机制,你就只能够把 "make destructors virtual in base classes"(<Effective C++>, item14)或 "never treat arrays polymorphically" (<More Effective C++>, item 3)这类规则硬背下来,却不明白它的道理。
用一样东西,却不明白它的道理,林语堂如是说:『不高明』。只知道 how,不知道 why,侯捷如是说:『不高明』。

●困难度之二

C++ 的第二个学习难度在於 "paradigm shift"(思考模式的移转)。别说自己设计 classes 了,光使用别人的 classes,就都是一种思考模式和行为模式的移转。MFC(或 OWL 或 VCL)programmer 必然甚能够领略并体会我的意思。

使用所谓的 application framework(一种大型的、凝聚性强的、有着物件导向公共基础建设的 class library),你的码和 framework 之间究竟是怎样的关系呢?framework 提供的一大堆可改写的虚拟函式的意义与价值究竟在哪里呢?为什麽 framework 所设计的种种美好性质以及各式各样的演算法竟然可以施行於我们自己设计的 class types 身上呢?framework 被设计时,并不知道我们的存在呀!

这正是物件导向中的多型(polymorphism)的威力。

稍早所说的 C++ 物件模型,偏属程式设计的低层面;这里所说的思考模式移转,则是程式设计的高层面。能够把新思维模式的威力发挥得最淋漓尽致的,当推物件导向的 polymorphism(多型)和 generalization(泛型)。如果你没有使用这两项特性,等於入 C++ 宝山而空手返。

●反覆 炼,循环震荡

想像 C++ 是一把用来解决程式问题的刀,要它坚轫,要它锋利,就必须经过多次的回火,在高热和骤冷之间 炼。

初学 C++ 语法(syntax)之後,你应该尽快尝试体验 polymorphism (大致而言也就是虚拟函式的运用)。等到对 OOP 的精神有了大局掌控的能力,但对 C++ 的许多小细节不甚清楚,就是回到C++ 物件模型 炼的时机。

成长,是在高阶(polymorphism)和低阶(object model)之间反覆震荡,才能够震荡到更高的位阶,而不是平平庸庸於中阶(C++ syntax)的一滩死水。

●不要沉沦於 C++ syntax

100 个人跟我说他懂 C++/OOP,只有 10% 不到可以让我认为他没有胡吹大气。太多的人,上嘛上不到 polymorphism,下嘛又下不到object model。就这样不上不下地卡在 C++ 语法层面。大一学了C++,到大四快毕业了,连 virtual functions 是怎麽回事都期期艾艾支支吾吾说不出个道理。

有时候我觉得,太苛责同学也於心不忍,因为同学们事实上处於一种无知的状态,既不知道 C++/OOP 该怎麽学,也不知道哪些书可以教他们那麽学。所以,苛责同学,不如责怪老师。

众所周知,大学教授泰半是动口不动手,普遍的心态是「论文第一,升等为要;程式语言?哎,末流!」。「末流」课程通常由教授们轮流教,谁倒楣谁来教;於是就常常有「下学期要教 C++ 语言了,这学期寒(暑)假赶快去要本书来恶补」的情况发生。偏偏程式语言这东西,只动口不管用,一定要动手,而且要常动手。老师自己没有摸到C++/OOP 的精神,学生又能学到什麽?

有些学校资讯系并不教特定的程式语言,老师们的态度是「语言是一种自己学就好了的东西嘛,拿到大学殿堂来,哎,不入流」!於是应该好好为学生打下实际基础的课程,却天马行空地腾云驾雾起来,大谈抽象意念。饱读经书的老师们可能忽略了,一个完全没有技术基础的学子,要的不是形而上的道,而是形而下的器。

我们是先能够欣赏具象画,还是先能够欣赏抽象画?我们不都是先对毕卡索的画大骂「这是什麽东西」,直到自己的艺术涵养够丰富了、人生阅练更饱满了、能够举一隅以三隅反了、能够接触类旁通左右逢源了,才转而能够欣赏甚至进入毕卡索的抽象意境吗?

老师们各有专长,要老师们来教非彼专长的大班课、基础课,我又觉得似乎也太为难老师了。那麽,苛责老师,不如责怪学校当局。如果学校当局能够聘请经验老道又有教学热诚的工程师来教这类实务学科,不是三方皆大欢喜吗?不要说什麽制度僵化啦,难以突破啦,大学是高度自治区,礼聘几位兼任老师,不全都是系上的权责范围内吗?

当学子们在课程上学不到他要的东西,就只好闭门自修。但是,循序性(sequential)语言尚有自修学会的可能,物件导向语言嘛,以大学生的程度来讲,我认为自修实在困难,只会修出个四不像、半瓶水。

管不到学校!管不到教授!自求多福的情况下,希望看到这篇文章的你,知道 C++/OOP 该怎麽学。

●不要沉迷於 C++ semantics 和 C++ object model

对於底层知识有浓厚兴趣的朋友,下探到 object model 领域,一定会非常开心地在 object size、object layout、vptr/vtbl、以及许多布幕後的技术之间玩将起来。了解这些东西,当然是好的,但是由於一探究竟得其奥秘的快感与成就感,使得一些朋友们在这个层面里「玩」起来了,小地方玩得很精,玩得不亦乐乎,玩得忽略了 C++/OOP 的最终目标。

最终目标是 polymorphism!

我要说,在 C++ syntax 以及相对低阶的 C++ semantics 里,不要玩得太过火。过犹不及,会伤身的。C++ 经典名书内附的一些习题,在我看来颇有点玩得过火的味道。至於什麽百题精选、题库大成,除了修练基本功之外,都满无趣的东西。

Programming 应该是一种天马行空的想像力与创意的组合;如果你能够自己想题目,譬如说实作一个天体运行的 class 体系、或是实作一个生物分类(界门纲目科属种)体系,不是很有趣吗?准备资料的过程中,查查百科全书,你也因此查到了太阳系九大行星的几何资料,哈雷慧星的轨道周期,或是黑面琵鹭的「界门纲目科属种」英文名称,这难道不比钻研於 ++++i 或 —-i 或 *&*&p 之类的头脑体操题目有趣吗?(看过不少这类好笑题目,没一个记下来,只好胡乱写几个运算式。诸位应该知道我说的那种头脑体操题目)

固然,在科学与工程的领域里头,无技术无以为立,但别把自己弄得过於僵化,过於匠气。僵化与匠气是我们教育体系的最大沉疴。到了高专层次,败象显露无遗。

●名书推荐

如果没有介绍几本好书,我就是为德不卒。

让我再节录 <多型与虚拟> 的二刷感言:

<多型与虚拟> 一版二刷感言 (侯俊杰/松岗/1998/08)… C++ 相关书籍,如天上繁星,如过江之鲫。广博如四库全书者有之(如 The C++ Programming Language、C++ Primer),深奥宛如山重水复有之(如 Inside The C++ Object Model),独沽一味者有之(如 C++ Programming Style、More Effective C++),独树一帜者有之(如 The Design and Evolution of C++),另辟蹊径者亦有之(如 STL tutorial Reference Guide)。…

以下是我认为你应该要拥有的书籍。有趣的是,我才在自己班上做了一个调查(我教的是物件导向 Windows 程式设计,学生应该要有良好的 C++/OO 基础),拥有以下 1~5 本书的人举手。举手人数都很少,而且老是那几位(最高记录是拥有四本)。这让我感觉,强者恒强,弱者恒弱。悲夫!

1. C++ Primer (3/e), Lippman/A.W./1998
(听说 1999 将有中译本)

2. The C++ Programming Language (3/e), Bjarne/A.W./1997
(听说 1999 将有中译本)

以上两本书是 C++ 经典百科。就内容水平而言,我认为同为瑜亮。 普遍的印象是,第一本较易接受,第二本涩味稍重。第二本书 作者 Bjarne 是 C++ 语言的创造者,所以有其权威性。我认识的多 位 C++/OOP 高手,都是两书齐具。

3. Inside The C++ Object Model, Lippman/A.W./1996
(中译本 <深度探索 C++ 物件模型>)

全书讲解 C++ object model,上穷碧落下黄泉。内容很好,层次也高, 可惜原文书大大小小的错误繁如晨星,阅读时需小心。

4. Effective C++, Meyers/A.W./1992
(印象似有中译本,名称忘了,谁可补充说明?)

5. More Effective C++, Meyers/A.W./1996
(有中译本吗?我不知道,谁可补充说明?)

同一作者的这两本书,专讲 C++ programming 的重要观念,使你的程式 更稳健更有效率。书中许多观念涉及 C++ object model,与 (3) 书混合看, 如鱼得水。

6. Polymorphism in C++ <多型与虚拟> 侯俊杰/松岗/1998
(没有中译本 — 它本身就是中文书)

在语法粗具的基础上,直接把读者导引到最核心最重要的思想,并且 在建立这个思想的过程中,提供足够的必要基础。


我只列出一本中文书,是因为这方面的中文书我看得少,英文书看得多。「恐有遗珠之憾」这类「八方得体」的话,还是说一下好了 :)
注意,这些都只是强本固元用来扎基础的书籍而已,要观摩大型程式经验,还有诸如 Large Scale C++ Software Design(John Lakos/A.W./1996)可以阅读。

OO 的世界,不止 OOP,还有 OOA/OOD,那又是一缸子的学问和一缸子的书。

— end

 
  ========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================

【热布克hbk】超经典(转):C程序设计之四书五经


========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================

《程序员》2004/01


================================
   几年前,台湾著名技术作家侯捷先生曾经写过一篇影响很大的书评文章,叫做《MFC四大天王》。文章的意思是说在MFC的浩瀚书海中,只要认真研读和学习其中四本,就可以“五岳归来不看山”。侯先生虽以MFC为例,但是这个道理却同样适合于MFC之外的很多具体技术领域,这不能不说是一个有趣的统计现象。通常在某一个具体细分的技术领域,会自然而然地出现3-5本顶级著作,它们彼此互相配合,形成一个完整的体系。对于学习者来说,只需要认真研读这几本书,就足以升堂入室。我乐于将这种现称为“四书五经现象”。对于读者来说,如果能够找到该领域中的“四书五经”,则无论在时间上还是金钱上都是最经济的选择。好书几本,胜过烂书几捆,这个体会想必大家都有。在此,帮助大家遴选各个技术领域里的“四书五经”。


===========================


引言

自从Dennis M.Ritchie于1973年设计并实现C语言以来,计算机程序设计领域已经发生了巨大的变化。以C语言为根基的C++、Java和C#等面向对象语言相继诞生,并在各自领域大获成功。今天,C及其后裔几乎统治了计算机程序设计世界。可以这么说,C语言的诞生是现代程序语言革命的起点,它改变了程序设计语言发展的轨迹,是程序设计语言发展史中的一个里程碑。

然而,C并不仅仅是其他语言的起点和基础,否则它早已成为程序设计语言发展过程中又一个被遗弃者。和当初发明时一样,C语言今天依然至关重要。它的表达力、效率、简练、紧凑、对机器的最终控制以及跨平台的高度移植性,使其在系统编程、嵌入式编程等领域一直占据着统治地位,而C99标准的制订则再一次使C语言焕发出新的活力。下文介绍C程序设计领域中的几本好书,其中一些堪称经典。 

1. Brian W.Kernighan, Dennis M.Ritchie,《C程序设计语言》,机械工业出版社

这是迄今为止在所有程序设计语言书籍中最广受尊敬的一部经典,是任何一名C程序员的必读之作。因为出自C语言的设计者Dennis M.Ritchie和著名的计算机科学家Brian W.Kernighan之手,它被昵称为“K&R C”。是它首先引入了“Hello World!”程序,这个程序几乎成了后来任何一本入门性程序设计语言书籍中的第一个例子。

如同C语言本身简洁紧凑而极具威力一样,这本书轻薄短小而极富张力。通过简洁的描述和典型的示例,它全面、系统、准确地讲述了C语言的各个特性以及C程序设计的基本方法,内容涵盖基本概念、类型和表达式、控制流、函数与程序结构、指针与数组、结构、输入与输出、UNIX系统接口以及标准库等内容。

简洁清晰是这本书最大的特色。这本小书可以教给你许多比它厚几倍的“大部头”的知识。我认为那些动辄洋洋洒洒拼凑出好几百页乃至上千页的技术作者应该好好向K&R学一学。对于中、高级程序员而言,如果希望迅速获得C语言的严肃知识而又不愿意多花费哪怕一丁点时间,这本书就是首选。

顺便说一句,这本书的索引制作非常出色,极具实用价值,这可能首先要归功于正文部分的简明扼要。此外,尽管它看上去很像一本教程,但其实更是一本写给专业程序员的指南。如果你不具备任何其他语言程序设计背景或基本的C语言知识,这本书也许并不适合用作你的C语言启蒙读物。 

2. Perter Van Der LinDen,《C专家编程》,人民邮电出版社

C语言是严肃的程序员语言,但这并不意味着C语言书籍必须板着面孔说教。在这本被C程序员昵称为“鱼书”(封面上有一条“丑陋的”腔棘鱼)的著作中,作为SUN公司编译器和操作系统核心开发组成员之一,Peter淋漓尽致地展示了其深厚的技术沉淀、丰富的项目经验、高超的写作技巧以及招牌式的幽默。在这部作品中,作者以流畅的文字、诙谐的笔法将逸闻典故、智慧和幽默自然地融入技术描述中,读来宛若一本小说,极富趣味。

本书讲述了C语言的历史、语言特性、声明、数组、指针、连接、运行时以及内存使用等知识,揭示了C语言中许多隐晦之处,尤其深入解析了声明、数组和指针、内存使用等方面的细节。要想成为一名专家级C程序员,这些内容都是必须掌握的。和其他满是抽象例子的C语言书籍不同,这本书充满了大量的来自真实世界的C程序设计实例,它们对C程序员具有很高的参照价值。另外,每一章都以极富趣味的“轻松一下”收尾,而附录A“程序员工作面试的秘密”则是任何语言的程序员在应聘工作前增强自信的好材料。

我怀疑真正的C专家可能用不着看这本书 — 从内容到组织方式到行文风格都决定了这是一本轻松愉快的“从菜鸟到高手”的进阶读本,所以,它理应拥有更广泛的读者群。初级程序员往往更需要热情的鼓励,在阅读这本书的过程中,你定会深深地被作者对编程的激情所感染。

世间并无完美。我认为这本书的缺陷在于,和大多数平庸的C语言书籍一样,它画蛇添足地加入了一章关于C++的描述。在今天看来,这个描述既不全面也有失公允。不过,鉴于作者是在1994年从一名C程序员的角度去观察C++,这一点也就不足为奇了。 

3. Samuel P. Harbison, Guy L. Steele,《C语言参考手册(第五版)》(影印版),人民邮电出版社

在C语言参考手册类书籍里,Samuel P. Harbison 和Guy L. Steele合著的《C: A Reference Manual》是非常出色的一本。这本手册的第五版新增了对C99标准的介绍,以便满足新时期C语言学习的需要。全书共分为两大部分,第一部分专注于C语言特性,第二部分则全面讨论了C标准库。本书涵盖C99、C89、传统的C、所有版本的C运行库以及编写与C++兼容的C代码等一切知识。

这本手册只是中等厚度,但它比“比它更厚”的其他参考手册更清晰地描述了C语言的现在和过去的方方面面。整本手册技术细节描述精确,组织条理清楚,内容完备详尽而又简明扼要。可以这么说,它在广度、深度和精度方面都是出类拔萃的。对于中、高级C程序员而言,这本手册值得常备案头,它几乎肯定要比K&R的著作使用频率更高。

2004年2月1日补充:我手头有这本书的中文版:《C语言参考手册》(机械工业出版社出版)。它在很大程度上减轻了我的查阅负担,不过偶尔也增加了理解上的困难。                                                                                                 

4. David Hanson,《C语言接口与实现:创建可重用软件的技术》,机械工业出版社

C语言能够历经三十多年而不衰,一个重要的原因在于它的适应能力。在这“复用”、“面向对象”、“组件”、“异常处理”等先进机制漫天飞舞的年代,C语言仍然能够凭借它小而优雅的语言特性,在相当程度上满足现代软件体系架构提出的要求。只不过,想要达到这个程度,必须要在C的应用功力上达到最高层次。在嵌入式、系统软件以及对性能要求极高的系统开发中,开发人员必须达到这样的层次,熟练掌握C语言的高级特性,才能够同时满足效率和灵活性、复用性的要求。可惜,虽然C语言技术图书汗牛充栋,但是关注这个峰顶之域的作品却是屈指可数。David Hanson的《C Interfaces and Implementations》就是个中翘楚。

David Hanson是业内大名鼎鼎的自由编译器lcc的合作者。在这个项目中,他负责提供高度可复用的基础架构。在不断的实践中,他完全使用ANSI C形成了一整套可复用组件库。这套组件库架构清晰,性能优异,而且提供了很多高级的特性,比如类Win32 SEH的异常处理机制,可移植的线程库,高性能的内存池,丰富的可复用数据结构组件。David Hanson把他在创作这些组件的过程中所积累的心得以及对其源码的精致剖析原原本本地写在了这本书里。这样的著作,当然堪称C语言领域里的铭心绝品。难怪已故著名技术作家Richard Stevens对此书赞不绝口,他说:“这本书中的技术,对于大部分C程序员来说,已经遗忘得太久了。”对于希望能在C语言应用上达到最高层次的核心程序员而言,这本书是难得的必读之作。

其他

除了以上四本书以外,我还乐意推荐Andrew Koenig的著作《C陷阱和缺陷》(人民邮电出版社)和Deitel父子合著的《C How to Program》两本书。

Andrew Koenig是世界上屈指可数的C++专家,他的这本书可能是最薄的一本C语言经典。它简明扼要地讲述了C程序设计中的陷阱和缺陷,包括词法陷阱、语法陷阱、语义陷阱、连接、库函数、预处理器以及可移植性缺陷等,最后一章还给出了关于如何减少程序错误的建议以及前面各章问题的参考答案。尽管这个小册子成书于C89标准制定之前,然而,即使到了C99早已颁布的今天,书中提到的大多数陷阱和缺陷一如十五年前那样使我们警醒。

Deitel父子合著的《C How to Program》一直是非常好的C语言入门教程,我手头的中译本名为《C程序设计教程》(机械工业出版社出版,原书第二版)。除了对技术的正规描述(辅以许多简明扼要的例子)外,每一章后面都带有小结、术语、常见的程序设计错误、良好的程序设计习惯、性能忠告、可移植性忠告、软件工程评述、自我测验练习及答案等。整书内容清晰,组织良好,易于阅读和理解。值得一提的是,有许多入门书读完一遍即可扔掉,而这一本是个例外。

结语

以上这几本书很大程度上局限于描述C语言及标准库本身,如果希望学习更专业的、领域相关的C程序设计技术,你可以在选择阅读这几本书的基础上继续查阅专门书籍。此外,在C语言书籍领域,水平不相上下的作品有很多,这几本只是根据我自身的阅读体验而做出的推荐。

我并不是一名C程序员,我的大多数时间都花在C的后裔语言尤其是C++身上了。然而,正如你知道的那样,C++并不全是类和模板,不全是面向对象和泛型编程,在较低的层面,C++的各个实现一如既往在很大程度上兼容C。C++和C的亲密关系决定了每一本C语言经典都应该是C++程序员的读物。

这世界变化得真是太快。各色新事物层出不穷,让人眼花缭乱、目不暇接。人们也很容易被那些五光十色的花哨玩意儿所吸引,常常会忘记构筑过去、现在和未来的坚实基础。C语言就是这样的基础之一。今天,世界上有许多我们看不见的重要软件是用C语言(以及C++等)编写而成的,正是它们在默默地支撑着这个信息世界的运转。

致谢

感谢孟岩先生为本文付出的直接文字工作。

参考文献和资源

1.Brian W. Kernighan, Dennis M. Ritchie,《C程序设计语言(影印版)》,清华大学出版社,1997年。
2.Brian W. Kernighan, Rob Pike,《程序设计实践》,机械工业出版社,2000年。
3.Herbert Schildt,《C语言大全》,电子工业出版社,2001年。
4.ISO C标准化委员会,http://std.dkuug.dk/JTC1/SC22/WG14

荣耀
2003年12月
南京师范大学
www.royaloo.com
 

——————————————————————————–


========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================

  【热布克hbk】超经典(转):Win32系统编程之四书五经

========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================
 
   几年前,台湾著名技术作家侯捷先生曾经写过一篇影响很大的书评文章,叫做《MFC四大天王》。文章的意思是说在MFC的浩瀚书海中,只要认真研读和学习其中四本,就可以“五岳归来不看山”。侯先生虽以MFC为例,但是这个道理却同样适合于MFC之外的很多具体技术领域,这不能不说是一个有趣的统计现象。通常在某一个具体细分的技术领域,会自然而然地出现3-5本顶级著作,它们彼此互相配合,形成一个完整的体系。对于学习者来说,只需要认真研读这几本书,就足以升堂入室。我乐于将这种现称为“四书五经现象”。对于读者来说,如果能够找到该领域中的“四书五经”,则无论在时间上还是金钱上都是最经济的选择。好书几本,胜过烂书几捆,这个体会想必大家都有。在此,帮助大家遴选各个技术领域里的“四书五经”。

本期就从Win32系统编程开始。

    所谓的Win32开发,就是在C语言的层面上,直接使用Win32 API开发Windows应用程序或者系统程序。虽说现在直接用Win32 API开发应用程序的人已经不多了,深入理解Windows系统程序设计原理,仍然是成为Windows开发高手的必经之路。所谓的Win32,其实是一个API规范,与UNIX系统编程接口标准POSIX是同一个性质的概念。从设计上讲,Win32绝对算不上是简洁优雅,因此学习Win32系统编程,相对来说是比较困难的。Win32来源于Win16,而Win16最初设计于1980年代中早期。设计Win16的时候,Microsoft还是一家小公司,应该说能力还有限。同时,Win16的主要目标是DOS之上GUI系统,设计上偏重GUI部分,在系统编程领域考虑不多。等到设计Win32时,微软能力增强了,有心要把Win32打造成第一流的操作系统API规范,但是已经背上了Win16的历史包袱。所以相对而言,Win32的设计实在赶不上POSIX那么简介优雅。微软在随后又先后进入了COM时代和.NET时代,每一次进步都需要继续背负以前的历史包袱,使得微软的技术体系越来越复杂。微软技术的复杂性,是微软与Java竞争中的最大弱势。而对我们程序员个人来说,无论你现在是在学习和使用最新的.NET技术,还是继续坚持COM开发模型,要克服微软技术的复杂性,必须上溯到Win32。那么Win32领域的“四书五经”是那些?我们一一道来:

1. Charles Petzold, 《 Windows 程序设计(第5版)(上、下册) 》  北京大学出版社
    这本是尽人皆知的Win32 API编程经典,也称为“Petzold Book”,学习Win32 API编程的人几乎都从这本书入手。这本书的优点是落墨细致,对基本概念和基本技巧的解释非常详尽,不厌其烦。同时,这本书篇幅虽然不小,但是包容的东西并不多,基本上把重点放在GUI编程上和常规编程任务上,所以能够把很多问题讲得非常透彻。通常第一次阅读这本书,都会觉得作者行文有一些罗嗦。但是日后在开发中,却会发现,这些当时觉得罗嗦的论述,都是实际工作中值得反复查阅咀嚼的宝贵资料。这就是所谓的Petzold风格,既可做tutorial,又可做reference。
    几年前,人民邮电出版社出版过一本Charles Calvert的《 21天学通WINDOWS 95编程(上、下册) 》,那本书的定位与“Petzold Book”相似,而且写得也非常出色,在控件编程方面的阐述甚至超过了“Petzold Book”。可惜这本书完全被“Petzold Book”的光芒所覆盖。不仅国内没有再版过,而且原出版者也彻底打消了与“Petzold Book”对抗的念头。
    现在仍然用Win32 API直接开发GUI的人,恐怕是少之又少,所以这本书的意义不及当年。更公允的说,Petzold Book现在最大的意义是作为Win32的入门教材。不经过它的洗礼,很难升堂入室。

2. Jeffrey Richter, 《 Windows核心编程 》第四版  机械工业出版社
    这本书的前三版名为Advanced Windows,第四版改名为Programming Applications for Microsoft Windows。作者在前言里还特别讲了改名的原因。但是在我看来,这本书还是叫做Advanced Windows更贴切。因为这本书虽然同样是讲Win32 API,却几乎和Petzold Book没有任何重复。初级的内容完全略过不提,GUI部分也是一带而过,全书顷力与系统编程,一上来就讲Win32核心对象,从进程到线程,从DLL到SEH,从钩子到内存管理,可以说是不避艰险,迎难而上,将最复杂最微妙的细节完整展现出来,同时配备又大量精心准备的例子,代码质量非常高超。因此,这本书从问世之日起,就成为Win32系统编程方面的圣经,作者Jeff Richter也成了Win32编程方面的绝对权威。想要学习Win32核心编程,不读这本书是无法想象的。遗憾的是,这本书的中文版翻译配不上原书的高水平,可以说是大错不多,小错不少。如果有读者要认真研读此书,可以去寻找北京大学出版社出版的影印版。
    这本书是Richter的代表作,也奠定了Richter世界顶级技术作家的地位。我本人非常喜欢读Richter的书,因为他的文字是写给专业人士看的,决不假装弱智,同时有相当体贴细致,非常符合我的习惯和胃口。所以通常在某个领域有了Richter的书,我就不会去看别人的书了。
    对于某些读者来说,Marshall Brain的Win32: System Service 3/e(中文名《深入学习:Win32系统服务开发与实例》,电子工业出版社“深入学习”系列)和Johnson Hart的Win32 System Programming 2/e(中文名《 Win32系统编程—Windows 2000应用程序开发指南(第二版) 》,中国电力出版社)都是不错的选择。两本书的论述都不如Richter深入,但是例子精当,讲解恰到好处。Brain的书覆盖面很广,例子非常有启发性,而Hart的书最适合从UNIX转到Win32的朋友。我发现自己在有空闲的时候喜欢啃Richter的书,但是在实践中需要快速学习解决方案时,反而Brain和Hart的书对我更有帮助。所以这两本书虽然不象Richter那么必须,但是也是非常实用的补充。

    Petzold Book和Richter的这本书,构成一个连冠一致的系列,一般Win32学习者精读并且基本掌握这两本书的主要思想和技术,就可以称得上是Win32系统开发的专家了。如果说这两本书的弱点,主要存在两个方面。其一是两本书写作时将Win9X的开发作为一个基本出发点,因此对于Win2000平台的新特性介绍不足。特别是对于Windows 2000服务端高性能软件的开发,基本上没有涉及,很多Win32特有的机制也没有覆盖到。因此,如果想在Win32方面再上一层楼,可以考虑Jeffrey Richter的另一本书。

3. Jeffrey Richter, Programming Server-side Application for Microsoft Windows(影印版)北京大学出版社
    知道I/O Completion Port吗?知道如何在多CPU服务器上把机器的能力发挥到极至吗?知道如何利用Windows的logging service吗?知道如何利用WMI开发服务端程序吗?即使你是一个Win32开发高手,也许对上述问题也会感到困难。随着一般应用程序的开发逐渐转移到Java、.NET或者至少Delphi这样的RAD平台上,Win32能够完全发挥威力的最后一个角落,大概就是服务端高性能程序设计了。而如果你想在这个领域有所建树,Jeffrey Richter的这本书就不可不读。这本书几乎是这个领域里唯一的一本书,而Jeffrey Richter的实力又保证了这本书的水平达到了相当的高度。读这本书给人以震撼的快感,你会感叹,Jeffrey Richter对于Windows系统的理解竟能够达到如此深度!
    这本书跟上面提到的Petzold Book和《 Windows核心编程 》几乎又是零重叠,所涉及的内容都是高级技术,特别是自Windows 2000以来出现的服务器软件开发新技术。与前两本配合起来,形成了一条从基础到专家的完整链条。在当今业界,仍然使用纯Win32开发程序的开发者,又不少是在金字塔顶端的“高手”级人物。如果说Petzold Book在今天的主要意义在于教育,《 Windows核心编程 》的主要意义在于深化你对系统的理解,那么这本书中教授的知识是实实在在吃饭的家伙。因此,对于高手和有志最终成为高手的程序员来说,这本书是一本难得的经典。
 
========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================

【热布克hbk】超经典(转):TCP/IP网络编程之四书五经


========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================

   几年前,台湾著名技术作家侯捷先生曾经写过一篇影响很大的书评文章,叫做《MFC四大天王》。文章的意思是说在MFC的浩瀚书海中,只要认真研读和学习其中四本,就可以“五岳归来不看山”。侯先生虽以MFC为例,但是这个道理却同样适合于MFC之外的很多具体技术领域,这不能不说是一个有趣的统计现象。通常在某一个具体细分的技术领域,会自然而然地出现3-5本顶级著作,它们彼此互相配合,形成一个完整的体系。对于学习者来说,只需要认真研读这几本书,就足以升堂入室。我乐于将这种现称为“四书五经现象”。对于读者来说,如果能够找到该领域中的“四书五经”,则无论在时间上还是金钱上都是最经济的选择。好书几本,胜过烂书几捆,这个体会想必大家都有。在此,帮助大家遴选各个技术领域里的“四书五经”。

创建人:DearBook技术编辑 DearBook_Tech  查看/发表评论  本书评获得 0  D币 
 
[本文发表于《程序员》杂志2003年第12期,作者孟岩]基于TCP/IP的编程格外重要。从应用上来说,现在直接利用C层次Socket API进行TCP/IP编程的人确实越来越少了,各种现成的框架(如ACE、Java、.NET FCL)和控件(如IP*Works)大大简化了TCP/IP编程的难度。高层的框架和控件总结了TCP/IP的主要使用模式,并且进行了抽象和封装,这固然非常好,但是想要真正掌握TCP/IP网络编程的真谛,恐怕需要认真学习下面几本著作。
[ 查看本指南所提及的书籍 ]
[本文发表于《程序员》杂志2003年第12期,作者孟岩]
TCP/IP协议是当前广域网和局域网通用的网络协议,因此,基于TCP/IP的编程就格外重要。从应用上来说,现在直接利用C层次Socket API进行TCP/IP编程的人确实越来越少了,各种现成的框架(如ACE、Java、.NET FCL)和控件(如IP*Works)大大简化了TCP/IP编程的难度。但是,如果想要在这个领域达到融会贯通的地步,不打下坚实的基础是不可想象的。正如Richard Stevens在TCP/IP Illustrated中所说,在网络编程领域,开发者所遇到的实际问题中,大约有90%都与开发者对于TCP/IP的理解相关。高层的框架和控件总结了TCP/IP的主要使用模式,并且进行了抽象和封装,这固然非常好,但是想要真正掌握TCP/IP网络编程的真谛,恐怕需要认真学习下面几本著作。

1.Richard Stevens,TCP/IP Illustrated, Vol.1 / Vol.2 / Vol.3
《 TCP/IP详解(第一卷)协议 》《 TCP/IP详解 卷2:实现 》《 TCP/IP详解 卷3:TCP事务协议、HTTP、NNTP和UNIX域协议 》
《 TCP/IP详解卷1:协议(英文版) 》《 TCP/IP详解卷2:实现(英文版) 》《 TCP/IP详解卷3:TCP事务协议、HTTP、NNTP和UNIX域协议(英文版) 》
这是一本众望所归的书。自从1994年出版以来,TCP/IP Illustrated就一直是TCP/IP领域具有传奇色彩的圣经级著作。这一套著作共分为三卷,第一卷通过实际动手实验的方式深入探讨TCP/IP协议,第二卷逐行解释了4.4BSD系统TCP/IP协议栈的15,000行实现代码,第三卷探讨了T/TCP和HTTP等高级协议。整套书最大的特点就是贴近实战,完全符合程序员的胃口,不空谈,不说教,用实验和代码来说明问题。写作这样的书,对于作者要求非常之高,即使在今天看来,敢于这么写作的作者也是凤毛麟角。Richard Stevens以他的写作风格和作品,在TCP/IP编程领域竖立起一座丰碑,令其他作者高山仰止,心向往之。在下文将要提到的Effective TCP/IP Programming一书中,甚至把“读Stevens的书”专门列为一个条款。这套著作的地位,可见一斑。

学习这套书,与其说需要读,不如说需要做。Stevens最强调程序员的两项能力,一是读代码,二是动手实验。他在自己所有的书里都敦促读者将范例输入电脑,亲自编译、运行和调试。这当然需要花费大量的时间和精力,但是如果有读者能够扎扎实实地这么做,那么他所付出的每一分钟都将会有双倍的回报。

2.Richard Stevens, UNIX Network Programming, 2/e, Vol.1 / Vol.2
《 UNIX网络编程卷2:进程间通信(影印版·第2版) 》《 UNIX网络编程(第2版)第1卷:套接口API和X/Open传输接口API 》
又是Richard Stevens,又是经典名著。这本书的第一版问世于1990年,是Stevens的开山之作,一举奠定了Stevens在网络编程领域的重要地位。如果说TCP/IP Illustrated解答了“什么是TCP/IP”和“TCP/IP是怎么实现的”两个问题,那么这本书则是在回答“怎样运用TCP/IP开发网络应用程序”的问题。显而易见,这本书的内容更加贴近普通程序员,因此,大多数人是先学习UNP,然后再深入学习TCP/IP Illustrated。

这也是一本让人伤感的书,Richard Stevens从1997年开始撰写此书第二版,制定了一个宏大的计划,卷1阐述Socket API和TLI API,卷2阐述除Socket之外的其他IPC机制,卷3阐述网络编程应用。应该说,卷1和卷2都是为了给卷3打基础。然而天妒英才,就在世人翘首企盼第三卷的时候,1999年9月1日,Richard Stevens英年早逝。留下这套未完成的巨著,让人感慨不已。不过最近从Prentice Hall传来好消息,出版社已经找到合适的作者,重新修订这套经典巨著,其中第一卷即将问世,并且已经在Amazon上热卖。相信会有当世高人沿着Stevens的足迹给我们续写第三卷的,让我们拭目以待。

可选图书:Douglas E. Comer, Internetworking with TCP/IP, Vol.1 / Vol.2 / Vol.3
《 用TCP/IP进行网际互联第一卷:原理、协议与结构(第四版) 》《 用TCP/IP进行网际互联-第二卷:设计、实现与内核(第三版) 》《 用TCP/IP进行网际互联 第三卷:客户-服务器编程与应用(Linux/POSIX套接字版) 》
这套书也是三卷,前两卷内容与TCP/IP Illustrated相似,最后一卷则偏重应用程序的开发。总体上来看,这三卷书的内容与上述Stevens的两套著作相当。Comer教授的这套书定位是教材,因此写出来中规中矩,寓精彩于平和之中。读者如果喜欢阅读教材风格的书,这套应该是很好的选择。

3.Jon C. Snader, Effective TCP/IP Programming
(中文版《 高级TCP/IP编程 》,中国电力出版社)
自彻读Effective C++之后,我总结出一条经验。无论在哪个领域中,一旦掌握基础知识,则应该迅速去寻找该领域中一本名为“Effective XXX”的著作并阅读之,一定可取得事半功倍的效果。Effective C++如此,Effective STL如此,Effective Java如此,这本Effective TCP/IP同样如此,也是一剂功效强大的催化剂。

本书作者是经验丰富的TCP/IP程序员,他在这本书中总结了44个难得的TCP/IP开发经验,并且将每条经验背后的道理都详细地讲解。毫无疑问,这种“专家经验”型著作对于提高读者水平,能够起到最高效、最直接的作用。

初学TCP/IP的朋友可能觉得,自己应该先把基本知识熟练掌握,再看这本书,效果会更好。我认为不必如此,您可以在基本观念建立起来之后直接品读此书。这本书篇幅不大,起点不高,却对很多关键问题进行了全面而细致地介绍,在具体问题的阐述上颇有Richard Stevens之风,也是纯而又纯的程序员风格——拿代码说话。

系统学习和重点难点的突破相结合,历来是快速掌握一门技术的良方。由Scott Meyers开创的“Effective”之风,已有愈演愈烈之势,这是程序员们的巨大福音。我强烈建议大家,不要放过任何一本以“Effective”为名的技术书籍。

4. Douglas Schmidt, Steven Huston,C++ Network Programming, Vol.1 / Vol.2 (中文版将分别由华中科技大学出版社和电子工业出版社出版)
《 C++网络编程 卷1:运用ACE和模式消除复杂性 》《 C++网络编程,卷2 基于ACE和框架的系统化复用 》ACE介绍
今天的网络编程环境是建立在C的基础之上。如果你满足于C层次的TCP/IP编程,那么Stevens的书可以说达到了一个最高境界,你大可以登东山而小鲁。但是如果再上一个层次,考虑如何运用C++强大的抽象机制是网络编程变得更加富于艺术性,更加高效可靠,那么恐怕必须要高度重视这套书。

这套书共两卷,篇幅都不大,主要内容是介绍ACE。在C++领域,由于这套书被Bjarne Stroustrup编入C++ In Depth系列,因此具有崇高的地位。而在网络编程领域,也有人称赞此书为Stevens之后最重要的网络编程著作。作者Douglas Schmidt是C++、网络程序设计和模式领域中国际公认的权威专家,潜心研究C++网络编程已经十多年。他发起的ACE开源项目是目前当之无愧的最优秀和最成功的C++网络编程环境,不仅具有非常出色的可移植性,而且性能卓越。美国国防部的ARPA已经支持这个项目好几年了,其最终目的是在ACE的基础上建立可用于现代战争的分布式实时嵌入式系统。毫无疑问,ACE无论在理论上还是在实践中,都是最值得程序员关注的网络编程典范项目,而这一套两卷对ACE的介绍性书籍,也毫无疑问是最值得网络程序员品读分析的经典。学习这两本书,你可以将经典的基于C API的网络编程知识与现代面向对象、模式和框架等最新技术思想结合起来,从而使你对网络编程的认识上升到一个新的高度。

========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================

【热布克hbk】超经典(转):“算法与计算数学”之四书五经


========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================

   几年前,台湾著名技术作家侯捷先生曾经写过一篇影响很大的书评文章,叫做《MFC四大天王》。文章的意思是说在MFC的浩瀚书海中,只要认真研读和学习其中四本,就可以“五岳归来不看山”。侯先生虽以MFC为例,但是这个道理却同样适合于MFC之外的很多具体技术领域,这不能不说是一个有趣的统计现象。通常在某一个具体细分的技术领域,会自然而然地出现3-5本顶级著作,它们彼此互相配合,形成一个完整的体系。对于学习者来说,只需要认真研读这几本书,就足以升堂入室。我乐于将这种现称为“四书五经现象”。对于读者来说,如果能够找到该领域中的“四书五经”,则无论在时间上还是金钱上都是最经济的选择。好书几本,胜过烂书几捆,这个体会想必大家都有。在此,帮助大家遴选各个技术领域里的“四书五经”。


[原创] zengyi820 2004-01-09
——————————————————————————–
 
    倘若你去问一个木匠学徒:你需要什么样的工具进行工作,他可能会回答你:“我只要一把锤子和一个锯”。但是如果你去问一个老木工或者是大师级的建筑师,他会告诉你“我需要一些精确的工具”。由于计算机所解决的问题都是从生活中抽象出来的问题,其复杂性不言而喻,所以我们需要这样精确有效的工具去解决现实生活中的复杂问题。算法、数据结构都是程序设计中必不可少的精确工具。算法的重要性是每一个程序员都十分清楚的。

    程序设计当中解决得相当一部分问题都会涉及各种各样的科学计算,这需要程序员具有什么样的基础呢?实际问题转换为程序,要经过一个对问题抽象的过程,建立起完善的数学模型,只有这样,我们才能建立一个设计良好的程序。从中我们不难看出计算数学在程序设计领域的重要性。恩师孟岩先生曾经撰文过若干技术书籍之四书五经,似乎这也成了先生的标志之一,这次冒险也凑一个……

    作为这方面的介绍,如果不介绍下面这本唯恐大师们笑话,即是计算机程序设计的史诗TAOCP:
《计算机程序设计艺术》

英文名称:The Art of Computer Programming
作者:Donald.E.Knuth

    Donald.E.Knuth人生最辉煌的时刻在斯坦福大学计算机系渡过,美国计算机协会图灵奖的获得者,是本领域内当之无愧的泰斗。被简称为TAOCP的这本巨著内容博大精深,几乎涵盖了计算机程序设计算法与理论最重要的内容。现在发行的只有三卷,分别为基础运算法则,半数值算法,以及分拣和搜索。总共应当有7卷。以我个人对本系列书的把握,大家除了可以如其它书籍那样阅读本书,也可以将其作为计算机程序设计的字典。毕竟内容涵盖实在是太广泛。看本书时最关注的应当是作者严谨的思维方法。每个人都有自己的读书方法,一些大师们说应当顺序读本书,因为它被写得简直就像是诗,然而这还要看大家个人的体会。至于本书的价值我觉得Bill Gates先生的话足以说明问题:“如果你认为你是一名真正优秀的程序员读Knuth的《计算机程序设计艺术》,如果你能读懂整套书的话,请给我发一份你的简历”。作者数学方面的功底造就了本书严谨的风格,虽然本书不是用当今流行的程序设计语言描述的,但这丝毫不损伤它“程序设计史诗”的地位。道理很简单,它内涵的设计思想是永远不会过时的。除非英语实在有困难,否则建议读者选用英文版。

    如果将TAOCP比喻成“计算机程序设计理论的荷马史诗”,那么被简称作CLRS的《算法导论》不妨称它作 “计算机算法的圣经”。

《算法导论》

英文名称:Introduction to Algorithms

作者:Thomas H. Cormen ,Charles E. Leiserson ,Ronald L. Rivest ,Clifford Stein

    本书的主要作者来自麻省理工大学计算机,作者之一Ronald L.Rivest 由于其在公开秘钥密码算法RSA上的贡献获得了图灵奖,目前是算法的标准教材,美国许多名校的计算机系都使用它,国内有些院校也将本书作为算法课程的教材。另外许多专业人员也经常引用它。由于TAOCP只出版了3卷,CLRS比较起前者来则显得内容更为全面,基本包含了所有的经典算法。本书程序全部由伪代码实现,这更增添了本书的通用性,使得利用各种程序设计语言的程序员都可以作为参考。语言方面通俗,很适合作为算法教材和自学算法之用。国内的很多作品名为数据结构,从本书中断章取义,把数据结构与算法混为一谈,搞得作者自己都迷迷糊糊。这也是我不十分愿意向大家推荐国内作品的原因。你会发现现在基本上所有的数据结构与算法书籍都会将本书作为参考文献之一,更可以说明一个问题,本书是作为读者进行算法学习的最佳选择。作为本书的补充内容,我愿意向大家推荐下面的学习资料:你可以通过这个地址找到本书的所有练习答案:http://www.itu.dk/people/beetle/ 。为了更好的学习本书中的内容,最好的指导当然是来自作者本身讲述本书的课程,读者们可以通过http://18.89.1.101/sma/5503fall2001/index5503fall2001.html 获得课程的录像。

    有两套优秀的书我不想作为单独的推荐,但作为初学算法的高级语言程序员也不失为极好的参考:
  Algorithms in C++以及  Algorithms in Java系列。作者都是普林斯顿大学计算机系赫赫有名的教授Robert Sedgewick, 他是TAOCP作者Donald.E.Knuth大师们下的高徒。算法理论方面并不逊色于CLRS,两个版本分别为C++和Java程序员量身定做。作为专门语言的算法书籍参考,这两本也是我唯一愿意向大家推荐的。可以作为《算法导论》一书的补充。如果你对密码学算法感兴趣,那么《应用密码学》便是你的首选。

    计算机数学理论方面可推荐的书籍是相当多的,究竟哪些数学理论基础是我们应当涉足的,哪些基本上我们是不需要的,大家可以参考《CSDN开发高手》9月刊上的《计算机科学技术数学理论浅谈》,或者通过下面的地址浏览此文:http://www.cstc.net.cn/docs/docs.php?id=111
离散数学在计算机数学理论领域的位置显然是首屈一指的,首先向大家推荐的就是:

《离散数学及其应用》

英文名称:Discrete Mathematics and Its Applications,Fourth Edition

作者:Kenneth H.Rosen

    本书的价值已经被全世界几百所大学所证实,作为离散数学领域的经典教材,全世界几乎所有知名的院校都曾经使用本书作为教材。以我个人观点看来,这本书可以称之为离散数学百科。书中不但介绍了离散数学的理论和方法,还有丰富的历史资料和相关学习网站资源。更为令人激动的便是这本书少有的将离散数学理论与应用结合得如此的好。你可以看到离散数学理论在逻辑电路,程序设计,商业和互联网等诸多领域的应用实例。考虑到大多数读者的基础,这里推荐给大家的是本书的中文版(原书第四版),本书的英文版(第五版)当中更增添了相当多的数学和计算机科学家的传记,是计算机科学历史不可多得的参考资料。作为教材这本书配有相当数量的练习。每一章后面还有一组课题,把学生已经学到的计算和离散数学的内容结合在一起进行训练。这本书也是我个人在学习离散数学时读的唯一的英文教材,实为一本值得推荐的好书。

    传统数学研究的对象过于抽象,导致对具体的问题关心不够。为了直接面向应用的需要,伟大的计算机科学家以及数学家Donald.E.Knuth在麻省理工大学提出了“具体数学”。自从那天起,“具体数学”便成了计算机科学的基础。所以下面为大家推荐的就是一本经久不衰的著作:

《具体数学—计算机科学基础》

英文名称:Concrete Mathematics A Foundation for Computer Science(Second Edition)

    很令人兴奋的就是这本书的主要作者正是泰斗Donald.E.Knuth以及他的同事Ronald L.Graham。书稿是他们在1970年的时候在计算机系教授研究生本门课程的基础上整理出来的教材。内容上是Knuth的巨著TAOCP第一部的扩展,有些比TAOCP中谈及地又深入了许多。重点放在高级计算机程序设计话题以及算法分析上,涉及了计算机科学领域内几乎所有可能遇到的数学知识。具体数学是离散数学和连续数学的综合,书中这点做得极为出色,介绍的内容涉及到书中许多经典问题的解答比目前广泛流传的解法更易懂。对于提高大家的计算数学修养有很大帮助。之所以TAOCP有的时候读者们读不懂就是因为计算数学基础不是十分扎实,但以我个人经验,若能对本书中内容有一个比较好的理解,会给你阅读如TAOCP这样的旷世巨著带来很大的方便。

    概言之,算法语数学乃程序设计之本,计算科学之精华,尚需吾等予以足够的重视。有关算法与数学在计算机程序设计中的作用和地位,不妨参考我的一片拙作《计算科学数学理论浅谈》,其中有较详细的论述。

========================================================
=                                                      =
=                                                      =
=  本文及更多出自:http://www.lmh2004.cn/ 【热布克】   =
=                                                      =
========================================================