编程语言教程书该怎么写: 向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》主编
编程语言教程书该怎么写: 向K&R学习!的更多相关文章
- Unity3.x游戏开发经典教程 书例 100%完毕~
大家都公布自己的作品,作为一个新人,我也发点什么.刚刚做完了Unity3.x游戏开发经典教程书例不久,假如有同学想学这本书入门U3D,我的作品也能让新人參考一下...脚本都是C#写的.以下附上链接~ ...
- K&R《C语言》书中的一个Bug
最近在重温K&R的C语言圣经,第二章中的练习题2-2引起了我的注意. 原题是: Write a loop equivalent to the for loop above without us ...
- 用CAShapeLayer写股市K线图动画效果
用CAShapeLayer写股市K线图动画效果 说明 入市有风险,炒股需谨慎.(因项目需求,本人提供了写这种效果的源码) 效果 源码 // // ViewController.m // Path // ...
- 1,[VS入门教程] 使用Visual Studio写c语言 入门与技巧精品文~~~~下载安装篇
Microsoft Visual Studio是微软(俗称巨硬)公司出品的强大IDE(Integrated Development Environment 集成开发环境),功能强大齐全,界面舒服之类的 ...
- 【Zigbee技术入门教程-01】Zigbee无线组网技术入门的学习路线
[Zigbee技术入门教程-01]Zigbee无线组网技术入门的学习路线 广东职业技术学院 欧浩源 一.引言 在物联网技术应用的知识体系中,Zigbee无线组网技术是非常重要的一环,也是大家感 ...
- ANSI C 与 K&R C
C语言由Dennis M.Ritchie在1973年设计和实现.从那以后使用者逐渐增加.到1978年Ritchie和Bell实验室的另一位程序专家Kernighan合写了著名的<TheC Pro ...
- 我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗
文章背景,回答提问:我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗? 我的建议是这样:1. 不要辞职.首先说,你对整个开发没有一个简单的了解,或一个系统的入门学习.换句 ...
- 题外话:我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗
以下文章虽然是编程,但是对于IT行业都通用 文章背景,回答提问:我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗? 我的建议是这样:1. 不要辞职.首先说,你对整个开发没 ...
- K&R C风格函数
前些天在看getopt源码, 一种前所未见的函数定义方法 int getopt(nargc, nargv, ostr) int nargc; char * const nargv[]; const c ...
随机推荐
- php 常用英语小汇
bstract抽象的 -挨伯丝拽克特 access存取.访问 -挨克色丝 account账户 -厄靠恩特 action动作 -爱克身 activate激活 -爱克特维特 active活动的 -爱克得 ...
- 更换 CentOS 7 的下载源为阿里云
http://blog.csdn.net/realghost/article/details/45949759
- 第十一次PSP
- No.1010_第七次团队会议
渺茫的前景 今天大家都很失望,一来昨天的问题还是继续存在着,仍然没有完成.二来,我们看了一下其余几个组的界面,对自己有些难过. 我们组确实存在人手少的问题,这几天我还因为挑战杯的事情缺席了两天,感觉内 ...
- 2018-2019-20172329 《Java软件结构与数据结构》第八周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第八周学习总结 现在对于我而言,最珍贵的是时间,感觉自己在时间飞逝的时候真的挽留不住什么,只能怒发冲冠的让自己疯狂的学习 ...
- 2018-2019-20172321 《Java软件结构与数据结构》第八周学习总结
2018-2019-20172321 <Java软件结构与数据结构>第八周学习总结 教材学习内容总结 第12章 优先队列与堆 一.概述 堆 堆的前提就是他首先是一个完全二叉树,其次就是满足 ...
- ListView高效分页
使用控件自带的分页功能时,会先将所查询的数据全部加载出来,若数据量较大,则造成浏览器端等待时间过长. 然而在庞大的数据量,用户所需要的不过是那么几条,甚至只要其中的一条数据,所以,为了减少开销,每次只 ...
- 我的寒假C(C++)学习计划
前言 要补缺加强C语言的想法由来已久,上学期因为种种原因,某些知识点学习得不是很理想,而且,许多地方也有加强的必要,所以这次布置的随笔可谓是来得恰到好处. 学习材料 C Primer Plus 师爷的 ...
- react 组件构建设计
项目设计中,可以从顶层React元素开始,然后实现它的子组件,自顶向下来构建组件的层级组件的写法:1.引入依赖模块2.定义React组件3.作为模块导出React组件4.子组件更新父组件的机制5.父组 ...
- pxe前期接入H3C交换机网络准备
环境:一个装机vlan3010,一个业务vlan,将接入交换机的下联,上联设置好vlan 如果服务器一直出于dhcp状态,有可能是交换机到服务器的光纤线路有问题,建议在交换机查看端口是否是down的. ...