吾所到之处,君亦可至

>>>  名人論史——近當代作家的史學觀點  >>> 簡體     傳統

1997.05

我再次整理了一些来函,与大家分享。这些信件经过「依媚儿」的往返,展现出一问一答的形式。我想在此对读者们说,有不少问题您其实可以写到 BBS programming 版上,会有许多热心的前辈提供经验。如果写给我,难保什麽时候收到回信。

这一次我谈到一些十分基本的观念。也许电脑高手们会说我浪费篇幅。可是,我和林振辉主编很早以前就发现到,这些基本的观念问题存在於许多许多面对繁重资讯茫然无措的资讯新人身上。我希望这几页篇幅能对他们有点帮助。

送件者: Hsin-Ji Wang
主旨: Thank you very much!!
日期: 1997年3月17日 PM 08:30

侯俊杰先生您好:
我是台湾大学工学院的学生。最近我读了RUN!PC上您回答李松辉先生的文章。在文章中,您提到要把基础打好,程式语言要从 C/C++ 学起。

我是指科班学生。不一定其他科系也都得研究基础科学。

我想请问您,倒底 C,C++,TURBO C 有什麽分别没有?我之所以问这样的问题,是因为我想学 C 已经很久了,只是分不清楚这三者之间的分别。希望您可以告诉我他们的分别。又,如果我想学 C,应该先学哪一种呢?可不可以请您推荐几本书给我。谢谢。P.S.我学过的程式语言有 BASIC 和 FORTRAN。

C 和 C++ 都是一种程式语言。C 是结构化语言,它的动作是一行行执行,但可以把一群动作包装在一起,称为函式。函式有一个入口,和一个(正常情况下)出口,程式主架构就是由一个个的函式构成。这是结构化的基本精神。

C++ 则架构在 C 之上,也就是和 C 的所有指令、关键字都相容,再加上物件导向的能力。它的一切物件导向性质,都是从 "class" 这个关键字开展。程式架构是由一个个 classes 构成。也许有人会说是由一个个 objects 构成,其实大家的意思是一样的,class 是属性,object 才是沿用该属性的真正实体。

关於物件导向,说来就话长了。物件导向的精髓(像多型、虚拟函式)并不容易,但学会了之後,使用别人写好的 class library 却很方便,你可以轻易站在别人的肩膀上。MFC 或 OWL 或目前的当红炸子鸡 C++Builder 便都要求使用者先有 C++ 能力。

所谓 Turbo C,只是「使用 Turbo 工具来学习 C」如此而已。Turbo 工具是 Borland 公司的产品。一般而言前面冠上公司名称的,就表示和「产品」有关,而不是一种通用性的、一般性的学门或技术,例如Borland C++、Microsoft Foundation Classes(MFC)、Symantec C++、Borland C++Builder。

若论电脑语言,只能说 C 和 C++,没有所谓 Turbo C 或 Turbo C++,或Visual C++。「学习 Turbo C」就是「以 Turbo C 这套工具学习 C」的意思。

Turbo 工具(Borland 公司)常喜欢自己创造更新更前卫的机能,逸出标准的语言范围,所以面对这些特殊部份要特别注意,以免同一个 C 程式在不同的编译器产品上不能够顺利编译。如果你不在乎这一点,倒是可以放心大胆地使用更新更前卫的机能。

C 语言的学习过程,对我是遥远的回忆。晚近这方面的书籍看得不多,所以我没有什麽关於书籍的建议可以给你。

非常谢谢您的回答,使我对於 C/C++ 有了些了解。
您提到 Turbo 工具是 Borland 公司所
研发的,他们喜欢创造更新更前卫的机能,而这些机能需要特别注意。
如果是这样,那麽我学习 C 时,应该用什麽工具学习比较好呢?

我所谓要注意,意思是你自己得留心是否用了些「非语言标准的功能」,以後移植(换工具)时才知道哪里可能有问题。更新更前卫的东西可能是个正因素,也可能是个负因素,端看你的考量和需求。好比说 Borland 的 Object Pascal 远远超出标准 Pascal 的范围,你在学校学习 Niklaus Wirth 博士发明的传统 Pascal 语言,面对 Object Pascal 一定傻眼。但是 Object Pascal 功能强大。

用哪一种工具比较好,难说。若为了单纯的 C/C++,任何产品都能胜任,因此学生可以从售价上考量。若为计久长,C/C++ 之後还要学习 Windows 程式设计,那麽又有两种考量,一是以纯粹的 raw API 写 Windows 程式,那也是任凭哪一种工具都能够胜任,而且原始码彼此相容。对於学生我还是认为价格是最实际的考量因素。但如果要以 application framework(一种威力强大的 C++ class library)来发展 Windows 程式,你就面临抉择了,因为不同的 application framework(如 MFC 和 OWL)完全不相容。最近几版的 Borland C++ 宣称可以吃 MFC 程式码,我想这是没有什麽意义的事情,第一,它通常不能够吃最新版的 MFC 应用程式码,第二,你把 MFC 程式拿到 Borland C++ 环境下继续开发,意义何在?一时吃进去了,又能保证日後(你总是还要继续发展的)相敬如宾吗?还是会相敬如冰?相敬如兵?

对於工具的选择,工业界的考量点复杂得多,包括所谓主流性(市场占有率)、价格、稳定度、速度、後续支援性。我不是说学生不在乎稳定度和速度,而是毕竟学生能写出多大的程式呢?如果有同学不服气我这一点,我问各位:你写过十万行的大案子吗?(写过的同学不必回信给我,基本上你已经是专业程式员了)

另外还有一个问题,最近好像很流行 Visual C++,不知道这东西与 C/C++ 有何关系,可否请您告知?

近年来凡 Microsoft 的开发工具,都冠以 Visual 之名,如 Visual C++、Visual Basic、Visual FaxPro。Visual C++ 的意义就像 Borland C++ 一样,只不过是某家公司出的一套 C++ 软体开发整合环境套件。

学习 Visual C++ 或 Borland C++,其实要学的是三样东西:

1. C++ 语言。
2. 整合环境(Integrated Development Environment,IDE)的使用。
3. 一套 class library(在 Borland 为 OWL,在 Micorsoft 为 MFC)。这套东西让你很容易写 Windows 程式(但我可没说它们的学习很简单唷)。

送件者: Evan
主旨: 小生怕怕
日期: 1997年4月4日 AM 03:42

侯先生您好:
我是您的忠实读友(自从看 RUN PC 之後),自觉自己对电脑有相当的兴趣,但是总是抓不着正确的学习方向,总觉得资讯一日千里,坊间又有许多令人目不暇给的书籍。想学的很多却没有目标,所以总有些失落感。自从在 RUN PC 拜读您的文章後,深深被您对资讯专业及笔锋所吸引,迫不及待的想将您所有的大作全都买回家,但发现你所着有很多。所以希望您能提供我您到底出了多少本书及它们的书名。对於想了解 Windows 作业系统及发展 Windows 程式的我,盼望能获得您的指导,我该以何种方式或顺序来学习您的大作呢?至於程式发展的语言该学习哪一种呢?虽然,略懂一些语言但总是不专,盼您也能提供我意见。谢谢!

在杂志上列出全部着作,有广告之嫌。此项请免。我想回答您的第二个问题。

要使用哪个语言来学习 Windows 程式设计,这不是一翻两瞪眼的事儿,请叁阅RunPC 1997 二月份的「到此踌躇不能去」一文。如果想走 C/C++ 这条路线来学习程式设计,并且最终要进入 Windows 领域,那麽我认为首先你要在 Console(DOS-like)模式把 C/C++ 的基本功练好,千万别这时候就接触 Windows 程式设计。西谚有云「太多的厨子坏了一锅汤」,我要说「太多的配料也会搞坏一锅汤」。由简入繁还是一般人比较能够接受的方式。

C/C++ 基本功练好之後,学习一点点 Windows SDK 程式设计(也就是使用 raw API 写程式)。不一定要完全动手写,可以多看书并且尝试动手改一两个程式,经历一下编译联结的过程。这时候也还不要用整合环境,宜使用命令列模式下的编译器和联结器。编译联结的过程可写成makefile,不会写 makefile 的人可以写 batch 档。虽然不精致,有什麽关系呢,只是过渡期而已。

再来就真正进入会影响你日後工程师生涯的动作了。你可以挑选 Visual C++ 或Borland C++ 或 C++Builder 或 Optima++ 或 IBM Visualage C++ 或Symantec C++...,学习比 raw API 更高阶的程式设计方法。说穿了其实是选择一个 application framework(MFC 或 OWL 或 VCL 或 Open Class Library 或...),那才是程式设计主战场。整合环境虽然也需要一些时间去学习熟练,但困难度不高啦。

学习这种 application framework,你必须把程式主轴搞得很清楚,才有办法游刃有馀地添骨添肉、解决问题。等到主轴的东西都清楚了,其他应用则泰半只是看范例、查手册的功夫而已,因为现成好用的 classes 会愈来愈多。想写个简单的 Internet server 程式?简单,MFC 的5个 classes 保送你上垒。想写个资料库应用程式?简单,MFC 的 DAO 和 ODBC classes 让你轻轻松松快快乐乐。

遗漏了一个大重点:Windows 作业系统。要把应用程式写得好,作业系统的基础一定要有,否则遇到问题就可能像...像苍蝇面对玻璃窗一样,近距离贴着玻璃乱飞乱舞,看起来很忙碌,却不知道退一步看,原来旁边有一个窗口可以飞出去。

作业系统的知识一定要在程式设计过程中不断地进修,与程式设计相配合。RunPC 1997.03 的 <无责任书评/侯捷> 中介绍了三本很棒的 Windows 作业系统书籍

送件者: Mcfee Woo
主旨: 请给一位非本科的忠告!
日期: 1996年3月13日 AM 01:39

侯老师,您好:
拜读您几本有关於 C++ 的书之後,又碰巧在这期 RUN!PC 看
到您所写的一篇文章,文章中提到 "足够用就好"。碰巧
本人是那种不务正业的学生(本科是电机,兴趣却是电脑),
且学的是 C 语言,正努力向 C++ 及 JAVA 挺进,但读完文章後,深
觉恐慌,毕竟非本科的学生总是少了那麽一点点专业知识,是
否应该立即放弃艰深难懂 C++ 而改学习 Visual Basic,使得学
习起来也许会快乐一点(C 的指标至今仍是我的恶梦)。不知侯老师
有何意见提供,毕竟老是举棋不定还不如痛下心决定,蹉跎青春
也不是办法。一位主观意识不是很强的少年留。

关於学什麽东西才好,我仍是那句话:够用就好。但是作为学生的你,又怎麽知道是不是够用了呢?这就困难些了,好好和师长同学们聊一聊吧,杂志上意长纸短难概叙。但是,切记,为自己的後路留一些馀裕,把自己压紧一点,是眼光更远规划更长的人的作法。

「快乐地学习」的确是一件非常重要的事。如何才能够快快乐乐地学习呢?你需要反省你的不快乐在哪里。我有一些朋友,他们专挑高难度的东西做:翻译要翻奥秘级的书,写作要写核心层架构,做专案则不只价格是个考量,有没有挑战性更是要点。他们希望自己在那种情况下成长进步。感受自己一天天成长进步,是那种人莫大的快乐。我自己,每天,睡觉前如果觉得「传不习乎」,一定懊恼 24 小时白过了(不过觉还是睡得香甜就是)。有种人马上就讥讽像我们这种人:『干嘛,人活过得那麽痛苦』。哼哼,子非鱼,焉知鱼之乐?但也不必反唇相讥:『整天醉生梦死只知享乐,活着的意义在哪里』,因为「子非彼,焉知彼之不知鱼之不乐」?基本上人从生物学划分为红黑黄白棕五色人种,没有人企图把这五种人的生理结构、遗传基因做平头平等的比较(海地人是 AIDS 的高危险群,黑人的身体密度不适合游泳竞赛...),如果我们承认这五种人不一样(我们都这麽承认,不是吗),我们也不必去说服不同人生观与价值观的人,因为那是思想上的红黑黄白棕。

说远了。我意思是,你应该甚清楚你的性向。那麽,不快乐是因为确实不喜欢那些很伤脑筋的东西,还是因为基础不够常常碰壁?如是前者,当然要痛下决定避免蹉跎青春。如是後者,你需要好好徵询师长的经验,为你指出好的学习顺序,於是「观古今於须臾,抚四海於一瞬,选义按部,考辞就班」,也就不觉痛苦了。

如果你以为我认为 C/C++ 才有高难度,学习它人生才有意义,那误会就大罗。任何领域都有入门、进阶、精专等等不同层次。C/C++ 之路的确特别坎苛些,又因正是你的遭遇,所以提出做为例子。

送件者: b83125@ccstudent.ee.ntu.edu.tw
主旨: Dear jjhou!
日期: 1997年3月14日 PM 06:52

杰哥:
近来网路上讨论热烈 MFC 将被放弃。
我才刚学 MFC 就遭此打击。我觉得从你的「深入浅出 MFC」的角度出发,最大收获在於了解 class library 的实作以及Window 程式设计的方法及其历史演进。至於BCB,可以让人非常有成就感,满足现代人的速食需求。但我怀疑它是否将像各种 Wizard 或 Expert 一样,产生出一堆号称会 Windows 程式设计,却也不过是点点滑鼠拉拉物件罢了。
不知您对这种 RAD 产品的看法如何。

BBS 上的许多消息,只能够看看就罢。BBS 於我,就像报纸影剧版一样,最大的功能是提供一些话题娱乐,与某种叁考。对於纯消息面而无技术面支撑的东西,消息纯粹只是一种话题。

Visual C++ 5.0 将於五月七日推出。其程式设计主轴,也就是 MFC,仍维持在 4.2 版(我偶而从文件中看到 4.21 这个号码)。你知道我以及我的不少朋友看到这个情况的心情吗?喔,我们都松了一口气!

你说我们这些「老一辈」的工程师是抗拒进步、不求长进吗?我说呀,实务经验还嫩得很的学生的想法,和工业界老鸟的想法,中间有一道大峡谷。

如果你已经有产品上市卖了一两个版本,有成千上万的人在用你的软体,你绝对不会希望你所仰赖的程式主轴有什麽大变化。稳定中求发展的最理想情况,以 class library 来说,就是不断有新的、功能更强、涵盖范围更大、并且与既有架构相容的 C++ 类别不断加进来。主架构的东西不能够三天两头大变动,那会被人骂死,而且慢慢流失客户。

所以即使 MFC 成长到 5.0、6.0、7.0,我判断它的主轴仍然不会有变,只是累加新类别而已,就像 MFC 从 2.5 进展到 4.0 再到 4.2,只是增加了一些Internet 类别一样。加的类别愈多愈重要,版本号码就跳得愈远一些。

回溯相容是实战市场上最最重要的一件事。即将拥有战场的尖兵们,这是你们的教战守则第一条。

主架构会变动的情况只有一种,那就是原本客户不多(所以包袱不大)。这时候就有必要尝试一下大破大立,看能不能够扭转乾坤。OWL 的市场占有率不高(这和它是不是好东西没有关系),所以Borland 乾脆灵活摆尾,推出新架构的 C++Builder。老客户呢?骂就骂吧,没办法,公司获利比较重要,公司不获利,横竖是个倒,大家也别玩了。再说,推出 C++Builder 可并没有要把 OWL 回收,老客户还是可以继续以手上的 OWL 开发产品。只是在「没有新版,就是退步」的观念下,老客户大概都会加入咒骂的行列。骂就骂吧,没办法。

谁能够接受新(而且优秀)的产品?没有包袱的人是也,学生是也,新专案是也。当学生进入工业界,遇到新专案,又遇到几个志同道合的同事,新开发工具的机会就来了。新产品唯有打入工业界,才有生命可言。教育市场再大,必会受工业界影响。谁要学将来碰不到同好的技术?多寂寞!饿死人!

若要我比较 C++Builder 和 Visual C++,我觉得前者所使用的Properties-Method-Event(PME)元件结构比较理想,容易做出视觉化开发环境,得进 RAD(Rapid Application Development)之殿堂。这话听起来好像 Visual C++ 所使用的元件是什麽史前怪物似的。也不是,Visual C++ 所支援的 OCX 元件(OLE controls,现在叫 ActiveX controls),也是 Properties-Method-Event(PME)结构。只不过 Visual C++ 的整合环境没有能够把 PME 结构落实到程式设计过程与整合环境工具的互动上,而 Visual Basic、Delphi、C++Builder 有。

C++Builder 的确很快给人成就感。但当你要为你所使用的 VCL 元件之间建立一些些关联时,「拖拉点放」四字诀就不管用了,你就要开始写码了。关键在这里。虽是短短三行,基础不够的话,挫折感可能会和先前的成就感一样深唷。开发工具的优劣不是看谁需要写的程式码少来决定,否则大家都去看无字天书 -- 字最少,最好学。

工业界朋友老神在在,用什麽开发工具,他自有判断能力,不会因为BBS 上的消息而惶惶颤栗。学生则要加倍努力 -- 在此百花齐放的年代。没办法,谁叫你们生长在资讯爆炸的时代。我虽然也「不幸」生长在此时代,但是在我的人生刚从黑白变成彩色的时刻,电脑科技也才刚要开始它的璀灿,我有机会与它一起成长,我有足够的时间深植我的基础,以接受它的惊人爆炸。

生得晚,生得早,都不如生得巧呀(呵呵,就让我这种老人开心一下吧)。

这一个月来涉及 C++ 和 Windows 程式设计颇多,发现许多人
对此两个领域的概念大多不清不楚,又胡乱写书乱讲话。使入门者丧失
了认知 C++(ANSI C++)的艺术与威力,又造成对 Windows
程式设计一知半解。

2500 年前就发生过这种事情,於今尤烈。论语述而篇,子曰:「盖有不知而作之者,我无是也。多听择其善者而从之,多见而识之,知之次也」。意思是说「有些人往往对事理一无所知,竟胡乱创作,我就不这样。多听别人说,多选择好的去依从,多看多记以备叁考,这样其实就可以算是次知了」。(孔子以生而知之为上智,学而知之为次智)

我们的电脑书籍在创作方面有点问题,但情况不算荒谬,顶多是大家慨叹技术书籍和使用者入门书籍数量差距过大;早期有些抄袭现象,在市场机能之下自自然然地浪淘尽千古人物。翻译方面则严重多多,因於许多高阶技术的确需要大大倚赖翻译书,而我们长久对於翻译存着不正确的态度(现在还有那种没写过 Java 却可以包两章 Java 回来代工的情况),以及不肖出版人的捞钱心态(一本书拆十个人译,没人愿意挂名於是抓瞎来挂。到处找廉价学生代工,又没有人统筹全书技术与文字水平。负责任的译者想要校稿却遭拒,原因是会延误商机...哎,血压有点升高)。

现在还流行一种讲叙电脑王国内部秘辛的书籍,基本上内容偏向管理文化、企业文化。中译本都不是由电脑书籍出版公司制作,而是由读者群更大众化的图书公司负责。其中爆笑内容亦颇具杀伤力,像视觉培基(Visual Basic)、班级图书馆(Class Library)等等。我不知道为什麽出版者对翻译的态度如此。既然牵涉到专业领域,稿子起码要给专业人士看过,难道他们连这一点常识都没有吗?

三天前,我和一群朋友午餐。朋友丢出一个尖锐的题目:你认为近年来的电脑书籍品质有没有进步?呃,谈进步要看全局。好书的比率如果下降,就是没有进步。

有没有进步呢,亲爱的朋友?

我也只能拾孔子的牙慧说:『多听择其善者而从之,多见而识之』。「侯子」的意思是:「多听听别人对书籍的评语,口碑好的才买;多增加知识,以便自己也有良好的判断能力」。读者、作者、译者、出版社,都应该常常逛 BBS 上的电脑书讯版(各 BBS 有转信功能,我本身是从清华大学的 140.114.87.5 进去)。最好有人设计一些票选活动,把书讯版炒热,让它成为一个重要的舆论工具。如此,我想任何从事写作和出版的人都会有所警惕与鼓舞。

不过,网路票选好像可以做假。算了!

依我的看法,要成为一个优秀的 Windows 程式设计者
是急不得的!他应该先对 C++ 有彻彻底底的认知,
虽然刚开始只可能先写写 console mode 程式,但对日後的帮助非常大。
此後,再观看各种工具,从中选择一个最适合自己的整合开发环境,
便能够一举踏入 Window 程式设计领域。中间的努力虽不足为外人道,
但终有一天一定会明白努力没有白费。毕竟 No pains, no gains!

总结到基础面来,是的,不管怎样,基础打好最重要。C++ 先学好,再来学 MFC 程式设计或 C++Builder 程式设计。作业系统的观念要有,而且常常补注新血。我以为,先在 console 模式(DOS-like 程式)中厚植 C++ 的功力,然後才进入 Windows 程式设计领域,乃天经地义的事。难道有人不是这麽想吗?没有人告诉各位正确的路线吗?老师和学长都在做什麽呢?还是我们不知道问?由 C 到 C++ 到 Windows 程式设计,要开一个完整丰富不急就章的学程,以学校上课的松散度而言,我想至少需要三学期 9 学分。有一所大学,资讯系大一新生一进来就开始学 C++,而且是 Windows 程式设计(采用 MFC)。天,我为那些同学祈祷(也为老师祈祷)。

最後,嗨,新新人类,我有点不能够适应你叫我杰哥。叫杰叔比较符合我们的年龄差距。昨天一位年轻貌美的女的朋友说我愈来愈年轻了,我没有薰薰然。你也不要认为这样会让我高兴。听到别人说自己年轻而会感觉高兴的人,表示他真的老了。 :-)

送件者: chilong@csie.ncu.edu.tw
主旨: 请问[元智的开课时间地点]...
日期: 1997年4月16日 AM 03:41

学生三年级起,便觉自己在电脑
各方面的领悟力真的很差,尤其程式更是要花人家的 2~3倍的
时间来钻研,若是跟强到变态的人比更是差了10倍以上...
常有强烈挫折感。有时会鼓励自己说:"电脑只有後进与先进,
我只是比较慢学而已..."。虽然偶尔写出了个小程式便雀悦不已,
但是与写不出来的次数比较实在是小巫见大巫...。好玩的是,
每当我想放弃写程式,偏又有一两个写出来的程式让我再度向前,
如此停停走走...有些矛盾...实在很想知道似侯先生的电脑强人
的程度,甚至任何有关电脑的学习历程到底是如何??
曾经问过系上老师,得到了个妙答:就是"突然顿悟,突然就会了"...
哇~~太高深...就如同老和尚在让小沙弭玩动动脑猜猜看游戏一般。
不知侯先生对於这个问题的看法如何呢?? 学生真的很想知道。

「程式设计」当然也有天份的成份在(和任何其他领域一样),不过,任何资质平庸的人都可以经由努力而达到相当的水准。问题是「努力」的程度。我念研究所的时候,半夜出没在系馆中的绝大半都是老师。现在我自己当了老师,我也觉得我比绝大半学生都用功。

我不是电脑强人,也没有什麽天份,我只拥有和绝大部份人一样的「中人之资」而已。吾所到之处,君亦可至 

 


侯捷 2010-09-10 08:29:16

[新一篇] Programming 不必是自我虐待

[舊一篇] 選義按部,考辭就班
回頂部
寫評論


評論集


暫無評論。

稱謂:

内容:

驗證:


返回列表