大陆见闻;谈电脑课程与书籍
侯捷
《程序员》2000.12
●课程缘起
今年八月,我应台湾 A 公司和 W 公司之邀,赴上海分别为A 公司的转投资公司和 W 公司的上海分部授课。两个课程的内容差不多,都是连续四天的 C++/OOP/STL。
这个课程顾名思义,其旨甚明。C++ 部份,仅从 classes 开展,与 C 相容者皆不述及。OOP 部份,以继承和多型的运用为主,并大量引入专家建议的准则,强调 OO 程式开发过程中一定要完成的以及一定要避免的事情。STL 方面则是介绍六大组件的角色和运用 ─其中以容器和演算法着墨尤多,这是 STL 应用的最大宗。如果 STL的课程再深入,就可以提升至泛型(genericity)的学理探讨,并进而拿 STL 的源码出来个案研究一番。可惜囿於时间,泛型的学理仅少量带到。但愿两岸的程序员都能够尽快正视「泛型」这个重要课题。
课程内容虽是标准的软体技术,邀课单位却是标准的硬体公司:A 公司是全球知名的个人电脑制造商,W 公司是全球知名的 DRAM 厂商。诸君可能很奇怪为什麽这麽「硬底」的公司需要纯软的技术课程。原因无它:任何硬体都需软体来驱动与服务。公司做大了,少不得要多揽一些工作在身上,逐渐就软硬全包了。当然,同样一个课程,不同背景不同需求的人来上,会关注不同的主题,提出不同的问题。以 C++ 语言来说,这次课程由於 W 公司需要编译器方面的知识,学员就特别对 C++ 物件模型感兴趣,希望多知道语法表象之下的运作机制。这基本上已经跳脱一般人对 C++ 课程的认知,幸好我一向就认为某些底层机制是彻底接受 C++ 的关键,所以原本就很重视这个主题。
我在台湾开过不少课。近十年来从 DOS 的记忆体管理,到 Windows 的SDK 编程、Win32 作业系统、MFC 编程,再到 C++/OOP/STL,场数在半百以上。早期公开授课,接受报名(台湾有专办训练课程的公司),近年来花大量时间在写作上,只偶尔接受公司单位的邀请,进行公司内训。一个很有趣的现象是,几乎都是硬体公司邀请我,而我却是一个纯粹的软体技术人员。我想主要的原因是台湾的硬体公司赚大钱,在员工进修方面比较有更大的财力。如果你以为硬体公司的人不懂软体,所以得上些软体课程,那倒不是,任何做软体的人本身都必须有软体技术底子:以目前技术之发展,业外人士很难玩票或骤然跨行。近年来个人电脑上的软体技术日精月进,和 DOS 时代谁都能轧上一脚的情况已有天壤之别。
●两岸之水平?
如果开了两次课程,就要夸夸而谈两岸在 C++/OOP/STL 上的技术水平或人员素质,那无疑是以管窥豹,以蠡测海。课堂上有认真的同学,有不认真的同学,有程度领先的同学,有程度落後的同学。种种情况,台湾和大陆都一样的。上课状况还和邀课公司的本质有关,W 公司是硬体本质,工程师多是为自家晶片开发编译器、联结器、移植 Linux,关注低阶问题多些。A 公司的转投资公司是软体本质,工程师比较着重应用软体,关注高阶问题多些。
虽然浸淫於 C++/OOP/STL 的时间人人不同,功力也高高低低,但基本上所有学员对於 C++ 并不陌生,缺乏的只是系统化的整理。我的习惯是,任何课程一开始一定首先介绍该领域的名着,从初阶到高阶。毕竟任何课程都是短暂,唯有好书是永远的老师。以这次课程为例,在 C++/OOP 方面我就介绍了语法语意层次的、底层运作机制的、专家经验的、前人心血结晶汇整的各级经典。在 STL 方面我也介绍了基本(使用面)层次的、进阶层次的、高阶(严谨学理)层次的。
软体技术领域里头的名着,泰半是英文书,这就面临一个棘手的问题:英文书对大陆读者而言,获得管道和高昂的价格都成为一个障碍。不过,为学员打开眼界是至为重要的事。即使不容易取得书,也要知道这些书的存在,开启日後进修的方向。因此介绍原文好书仍然是我坚持的一环。
据我粗糙的了解,大陆的高校课程在资讯相关科系方面并没有把 C++ 列为必修。这可能也是众程序员对此缺乏系统性训练的主因之一。台湾近几年来几乎各大学已经把 C++ 列为大一必修。大二以上可能再补一门 OO 选修。虽然,我也知道,低年级同学面对这些课程,大多数学了个乌鸦鸦,只得其皮不得其骨,遑论其髓(注1)。不过一学期的课程上下来,总是比茫无头绪自我摸索得好。有了个方向,好歹有利未来自修。
注1:学校里头教不好实务性课程,多少也和师资有关。校园内许多老师与实务脱节,永远只能讲些隔靴搔痒的例题。碰上深入一点的问题就支吾难以应对。
上面特定地提了 C++,但我所关注的并不在语言,而是在 OO 技术的扎根教育。就使用的人口、资源的丰富,C++ 是 OO 领域里最重要的一个语言,所以我提它。Java 是後起之秀,台湾少数学校也已经把 Java 列入大学课程。
●泛谈电脑技术书籍
光从少量课程,观察不出「两岸水平差异」这种大问题。不过倒是可以从另一个角度 ─ 高级技术书籍(中英不论)的普及度 ─ 来试加推想。我总认为,一个国家的软体技术书籍的出版层次(不论着或译),可以做为衡量该国软体水平的依据之一。任何技术都不可能闭门造车而又居世界领导地位。在没有机会看到世界一流作品的封闭环境下,我想像不出会产生多高的技术水准。软体世界比的可不是低层次的写码(coding)技巧 ─ 写码精简有力出神入化的,多到不可胜数,根本不成为关键。软体水平高低比的是规格、架构、演算法、概念、重复使用性、软体工程。
大陆程序员接触英文书的机会少,造成很大的不利影响。全世界卯足劲儿往前冲的同时,他山之石可以攻错,资讯的流通是至为重要的。别人都进步成什麽样子了,我们闭门苦修只能事倍功半。不站在人家的肩膀上,起码也要站在人家的膝盖上。
英文书的通路,我想在大陆不是问题。高阶技术书籍的潜在读者,上网应该是方便的,而全球最大的网路书店亚马逊网站(www.amazon.com)轻易可以让你找到任何一本电脑原文书,还附带读者意见和专家评论,以及极为便利的网上订购手续。但大陆上信用卡的普及度成了问题。
原文书价以及飘洋过海的运费,是另一个问题。动辄 40~50 美元的书价,别说大陆,就是对台湾读者也造成压力。此外,英文阅读习惯可能是另一个问题。大陆书籍有严格的格式管控,各种术语也有全国统一的译名,并严格要求使用。这从某一方面来说可能是好的,另一方面(譬如阅读外文书时对术语的生疏)却可能产生很不利的影响。我举个例子,template specialization 要不要译?exception specializations 要不要译?composition 呢?delegation 呢?译成什麽比较好?比较信达雅?但就算译得再好,看原文书时脑筋转不过来怎麽办?
台湾电脑技术书籍对於术语的处理一直以来也不敢有太大的突破。尽管程序员之间交谈用的几乎都是原文术语,中文书却仍规规榘榘地把所有术语一个字一个字译为中文,不敢稍越雷池一步,形成很多阅读上的困扰。读者常需反推原文术语。我认为,科技读物,尤其是给专业人员看的专业读物而非科普读物,其任务不是为了要让科技全中文化。是的,科技生根很重要,但是全中文化和科技生根一点也沾不上边。专业读物是给专业人员看的,其价值在於迅速地传播知识,导入知识,减少阅读上的语言隔阂。专业领域里头的原文术语,是专业人员的共同语言,绝不至於形成阅读上的障碍。反倒是封闭地自成一格後,阻断了与外界的沟通。这个议题不是这里三言两语就可以说得全面,专业领域里头术语遍布,总不能全部都保留原文,闹个英文字多过中文字的场面。关於这个议题,有兴趣的读者请叁阅我的另一篇文章:「技术引导乎?文化传承乎?」见 www.jjhou.com/article99-14.htm。
●专业技术作家
话说回来,英文书缺缺,如果把希望寄托在中文书上,目前而言似乎又太过虚幻。大陆的现实环境如果供养不了专业技术作家,就不能寄望有频繁的高水准中文高阶技术书籍可看。这一点台湾是五十步笑百步,也好不到哪儿。
究竟大陆的现实环境能否供养得起专业技术作家呢?我们不妨看看下面这些数据。这些数据都不是秘密,你到任何出版社都可以问出这些数据,就像大学毕业生的起薪一样,是一种指标,不是秘密,所以我就毫无顾忌地将它公开了。
我收集的数据是这样的。在大陆,一般电脑书籍的版税是定价的 5%~7%,书籍定价约为 40~60 人民币,销售量一万本是不错的成绩。这麽算起来,一个作家每年写两本真正高水准的高级技术书籍(产量算不错了),定价 50 人民币,各卖一万本(多久卖完不得而知),各位合算合算收入多少。
别忘了,能够写出「真正高水准的高阶主题书籍」的人,其技术层次是大学刚毕业生的好几倍,年纪也可能多十数岁,他的收入不可以拿大学刚毕业生的水准来衡量。也别忘了,他的收入必须涵盖风险考量(包括退休金的准备、各种保险等等),才能够安心写作。
台湾的情况又如何呢?电脑书籍的版税可高达 20%(更高也有,极少),技术性书籍定价可达 500~650 新台币(800 以上也有,极少),销售量三千本算是不错的成绩(一万本当然也有,极少极少)。合算起来,如果将两岸的物价水平考虑进去,台湾作者的收入大约好一些。是以,台湾养得起专业技术作家吗?条件也不是多理想。生活是过得去,但是拥有这样身手的人,更多赚钱的机会等着他。挺得住外界诱因,又坚持在高处不胜寒处踽踽独行的人,都具有浓厚的理想色彩。
台湾的问题在於市场太小!大陆的问题在於版税太低!市场小是没办法的事,版税低就令人奇怪:利润是按比例分的,那麽钱都赚给谁去了?
当然,以上都只是估算。台湾的电脑书籍写作环境,至少有一个优势:愈来愈多的人知道并接受:要看高品质的好书、主题稀有的好书、技术难度高的好书,要付高价!这样的认知有助於让高阶书籍的作者少几个灭顶於柴米油盐之中。
现实的无奈其实是关键。任何理想的背後总也需要某种程度的现实支援。技术书籍的作者,面临一个难题。愈是高阶,写作愈困难,耗费精力愈多,读者群却愈窄,作者的收益也就愈少。
所以无论出版社或读者,都应该要有一个认知:要看高阶的书,要付较高的代价。你不能自己学了技术去钓大鱼,却舍不得多花点钱支持教你钓鱼给你鱼杆的人。卖书不是卖纸,是卖纸上的知识。喜欢以页数厚薄来评量书籍价格的出版社或读者,永远被我列为不值一谈的对象。
技术写作,是一门特殊的行业。海明威曾说:『一个优秀的作家,最好有一个不幸的童年。』也许不幸的童年或不幸的人生可以激发一个人深刻的思考吧,但技术写作不需要对人生有深刻的思考(有的话当然最好),或许反而需要一个不错的甚至优渥的现实环境,毕竟技术的研究,旷日费时;技术的资源,所费不赀;技术的演进,推陈出新;技术作品的寿命,短如昙华(除非是核心技术)。
●正视你手上的力量
我询问了几位学员,以及几位大陆朋友:『当你看了一本好书,你会注意书籍的作者或译者吗?』大部份的答案令有心从事专职写作的人气馁:『不曾特别注意过。』
如果这样,怎麽成就一个专业作家呢?读者看不到高水准的书,自己要负点责任!
这是一个恶性循环。大家都在意书籍的好坏,但是书籍好坏的关键竟然没有人在意。读者希望有好书看,第一就可以从自己做起:看了一本好书,拿起键盘来,随手写封电子邮件给出版社和作者赞美几句。你的简单动作,会对作者带来巨大的影响,也会影响你自己往後的阅读品质。我向你保证,出版社这边绝对很重视来自读者的赞美与批评,好作者可能因此获得比较高的版税,比较尊重的对待。作者这边,知道自己的作品带给别人帮助,绝对是再执笔的强心针。
当整个阅读环境,乃至於出版环境,在选书方面能够以创作人为中心,而不是追求肤面的选题、纲要、时效、背景,这代表一种进步。我在回覆台湾出版社的选书徵询时,绝不会只因为看了某本预告书有什麽很棒的题目就举荐该书。但如果是我所信赖的作者,我敢光看书名就推荐。
我还要举一个意义深远的例子。Inside Visual C++ 这本书,向来被业内公认为某一学习型态的经典。不论在台湾或大陆,这本书的各个版次都有中译本。非常有趣的是,不论在台湾或大陆,本书都有某个版次的翻译水准特别突出(台湾是侯捷所译的第三版/ 峰,大陆是潘爱民先生所译的第四版/清华),导致读者宁愿舍弃新版次回头询问旧译本。这在汰旧换新如浪滔沙的资讯领域中,实在是一件令人拍案叫绝的例子。当作(译)者得以经营个人品牌,读者也愿意接受品牌所代表的质量与价值,便是技术书籍写阅大环境的一种进步。
●小搏大
大出版社固然有大出版社的优势,小出版社也有小出版社的弹性。据我粗糙的了解,大陆的网上购书似乎尚称便利,这是小出版社一个绝佳的机会。没有实体通路,书依然卖得出去 ─ 只要你手上的货色够好。
要让出版社在程序员之间迅速成名,最快速的作法就是引进一定量的高阶外文技术书籍(一定要是真正的经典),选择不错的译笔,投下一年的时间,分头进行(不是大杂烩式的合译,是一二人专注一本书,十多本书同时并进)。一年後完工推出,我敢说一定在程序员之间一炮而红。有人说,程序员市场比起来不够大,出版社都着眼在初阶的、使用者手册的书籍,不太肯照顾程序员的需求。这是实情,台湾也一样。但容我说句话,劝劝这些少根筋的经营者:出版社并非愈大愈好,而是愈专愈好。你喜欢经营一个小而美、人人尊敬的出版社,还是喜欢经营一个大而无当,产品无关痛痒甚至被内行人嗤之以鼻的出版社?一个赚不到回头客只能用书海战术骗骗外行人的出版社?就商业利益而言,一个大小 100 的饼,分得 1 份,和一个大小 20 的饼,分得 5 份,谁的获利高?
众人盲目地争食大饼,结果每人争到一些屑屑,这就是台湾和大陆出版界的普遍情况。花点心思,可以独享一块小饼,为什麽没人肯干咧?
最近大陆出了 Design Patterns 中译本(听说陆续还要出许多名着中译本)。虽然我还没看过译本,不知品质如何,但光就本书的出版,及其背後代表的意义,包括远见、魄力等等,我认为台湾丢人了。台湾到现在还没有 Design Patterns 这本重要书籍的中译本。商人的算盘滴滴答答响,声音太大,完全遮掩了程序员的心声,也遮断了一条可以同时获得名声和利润的机会。
-- the end