从第一章开始,我就喜欢上了这本书。简单清晰的DrRacket语法没花什么时间就上手了。作者从最简单的加减乘除开始一步一步深入,讲述函数的用处、如何定义函数、再到常变量的用处和“魔法数字”的害处。这本书不但讲述程序本身,还告诉你怎样将真实的世界抽象成一组有限状态机(FSM),然后再把问题抽象成两部分:数据和函数——程序的基本组成部分。由此,一个基本的程序才能够成形。
根据构建程序的知识的不同,HtDP将代码看作两类:一类是根据所解决问题的专业知识构建的代码,一类是根据数据结构构建出的代码。对于自我引用式(Self-Referential)的可变长度数据(Arbitrary Large Data),处理该数据的函数也通常会自我递归调用。
HtDP根据所处理数据的复杂程度,还把函数递归分为两类方式:Structral和Generative。递归往往将参数不断分解为小的数据,然后将小数据分情况继续处理。S型递归的特点是,分解后的数据和输入参数的同一类型。而G型递归则将问题不断分解成小的问题处理,其形式上往往是若干函数之间递归调用。乍一看前者貌似是后者的特殊形式,然而作者对此给出了有力的警告:
本书不但告诉你如何用代码描述自己的逻辑,还告诉你怎样提高程序的可读性。例如,通过详细的注释描述函数的输入和输出的数据类型,用自然语言一句话讲明函数的目的、用途;描述数据结构内各数据域的类型和该数据所表示的实际意义。再比如,在什么情况下分离部分代码,设计成辅助函数,等等。
倘若认为这本书只是讲述一些条条框框,那你就太小看这本书了。编程的本事高低不在读多少规矩,而在于动手去写。本书即遵循这一原则,精心设计了大量习题,有助于加深对书中示例的理解。更有甚者,一部分章节没有示例,内容的推进完全依靠读者完成习题。读者完成习题的时候,心中自然会有所感悟。
本书所使用的DrRacket语言在仅仅是门教学语言,所属的函数式语言LISP也非业界主流。正如其名——“How to Design Programs”,本书着重介绍的是编程的思想,是方法。例如,尽管Accumulator在 C语言里或许一套for循环就可以轻松搞定,但其背后所蕴含的正是算法里的基本原则之一:不做重复计算。这些对于初学者而言是非常有益的指导。
国内的教材往往惜字如金,读起来仿佛字字箴言,却又晦涩难懂。HtDP则行文流畅,详尽讲述甚至有些过头。本书对编程初学者非常友好:除去英语这一硬关口之外,本书所需的其他知识甚少,掌握简单的代数几何知识都可以看下去。如果我在高中的时候能够看到这本书(当然得是中译版的),也许情况完全不同。
我非常喜欢这本书,即便如今已经读完,仍有抑制不住的冲动想要自行翻译,哪怕需要三年五载,也权作提高英文水平。怎奈受限于该书的发布协议,只好期待另有一部同等优秀的汉语书籍来为新人指路。