编程语言教程书该怎么写: 向K&R学习!
原文地址:Lax Language Tutorials
Andrew Binstock
每年在评审Jolt Awards图书的时候,我都会被一些语言教程类图书弄得心力交瘁。从这些年的评审经验来看,这些语言类教程的写得都不错,但除此之外,少有亮点。换句话来说,这些书都很严谨、很精密,如果读者有足够的定力,通过它们掌握一门语言的编程技术还是不成问题的。可是,即便对那些卖得最好的书,除此之外我都想不出来还能多说几句什么样的赞美的话了。
这些书普遍存在的一个缺点就是把简单的任务复杂化。最大的或者说最常见的一个问题,是作者们混淆了教程与一本面面俱到地介绍一门语言的专著的区别。由于种种原因,出版行业似乎特别热衷于后一种体裁,结果就导致了一些令人瞠目的大部头。我曾经看到过一本“介绍”Java语言的书,厚达1480页。如果说入门读物都得这么厚,显然是不合理的。不消说,这本书深入地讨论了一下AWT和Swing,然后笔锋一转,又给读者罗列出各种各样的第三方库,关于虚拟机的研究当然少不了,而最终则收尾于并行程序设计。谢天谢地,到这里终于全书完。鉴于这本书已经出到了眼前的第4版,有理由认为它体现了作者对它最终的心理预期。那就是,这实际上是教程兼参考书。而且,既然书的重量都达到了4.5磅(约2.04千克),我想多半也只能把它当作参考书来用了。Mark Lutz的《Learning Python》是Python语言图书中与此类似的一本。其他语言类图书中,像把Ruby介绍给西方读者的“鹤嘴锄书”(《Programming Ruby: The Pragmatic Programmers’ Guide》),作为此类图书也是当之无愧。书的前一半是教程,后一半明说就是参考。这种方法就好多了。不用管其中的Ruby教程占了多少篇幅(418页),仅就其质量而言,就充分说明它大受欢迎是有理由的。
第二个常见的问题,就是作者忘了读者在打算学一门新语言的时候,最想做的是什么;当然,无非就是要写几个小程序,借以熟悉语法。然而,很多教程通篇都是只有一两行的微型代码示例,只够演示某个功能,但没有一个独立有用的程序。如果语言还有一个内置的shell(或解释器),比如像Ruby、Groovy、Scala,那这个倾向就越发地明显了。
比如说,Odersky、Spoon和Venners合著的Scala教程(《Programming in Scala》)就能清楚地反映出这个问题。在这本书的前200页里面,超过20行代码的示例只有一个;大部分都不会超过10行。[而在K&R(Brian W. Kernighan和Dennis M. Ritchie)那本书(稍后会说到)里,第一个20行代码的示例出现在第26页。]结果呢,按照我自己的经验,就是看了半天书,也敲了不少代码,由此了解了不少功能,但却始终没有写出一个有点什么用的程序来。实话实说,这种现象简直太普遍了。现在,我眼前就摆着两本书,一本Clojure,一本Groovy,也都是这个套路。
最后一个问题在编辑不给力的书中经常会发现:一心只想展示一门语言的聪明技巧或者能做到的一些小hack。个人认为,读者是想来学语言的,不是来欣赏语言特技的。这个问题最常见于那些函数式语言,或者像Groovy一样有意设计得比竞争性语言(对Groovy来说就是Java)更好的语言的教程。
以上三个问题之所以让人感到难以理解,关键在于长期以来一直都有一本绝好的榜样:Kernighan和Ritchie的《C Programming Language》(K&R)。拿这本书跟其他教程比一比,差异立现。先从最明显的地方开始,K&R的教程部分只有177页,随后是40页的附录,附录是极其简明的参考。在这种篇幅适中的情况下,任何读者都能轻松看完,并且做完全部示例。其次,大多数程序都在20行代码以上,既有相应的用途,也不让人感到陌生,而且相对完整。即便是到了这本书的第125页左右,示例程序中都包含main()函数。这里说的可不是代码片段,而是虽短但却真实的程序。最后,书中对所有程序的解释分析十分透彻,而且前后相继,由浅入深。没有对功能漫无边际的简单罗列,所有示例都有一种内在的线索,让读者在任何时候都知道自己掌握了哪些基础知识,还需要探索哪些基础知识。
那在K&R中看不到什么呢?最明显的是,书中没有解释标准库中每个函数功能的部分。Java图书也应该把这个部分删掉。(对Java知识体系介绍得最为全面的两本书,就是Horstmann和Comell合著的《Core Java》卷I和卷II。但在两卷合起来1800页的篇幅中,没有包含教程,也没有像书中所说的那样讲述。)
K&R也没有填鸭式的说教。看这本书必须边看边思考。所有信息都摆在那儿,但你必须动手去做每一个例子,才能理解这门语言。作者希望看这本书的读者很用心很专注,因此会在你迅速学会这门语言的过程中,随时为你提供帮助,但不会强迫你一页接一页地阅读那些对理解语言没用的东西。
恐怕有人会说,C只不过是一门小型语言,所以介绍它自然用不着大部头。要是你也这么认为,请睁开眼来看看别的C语言教程,看有哪一本书像K&R这么薄,而且写得又那么好。要不然,再看看JavaScript,JavaScript也是一门小型语言,但还没有哪本书是篇幅又短,又容易理解的。
我想说明一下,前面提到的那几本书都是着意挑选出来的,因为这几本书在我看来都是相应语言领域的最佳教程。Odersky等写的Scala、Thomas写的Ruby,还有Lutz那本Python,这些都是学习相应语言的最佳起点。我只是希望这些书要是能更像K&R那样就好了。
——Andrew Binstock
《Dr. Dobb’s》主编