这个题目很大,而我只想谈谈自己对于《SICP》的一点思考。
《SICP》的全名是《Structure and Interpretation of Computer Programs》,中文译名《计算机程序的构造与解释》。这是MIT的一本经典教材,一本编程世界几乎人尽皆知的魔法书。我看了很久,还没有看完。。。但是每次看都感觉有收获,掩卷而思都会有点心潮澎湃,今天尤甚,在火车站等车的时候看得入神差点没赶上车,囧。
我今天就不介绍这本书的内容了,这些等我读完了再来做个全面的介绍,这次我只想把今天看书的收获记录下来。
《SICP》里有很多示例代码,我一开始老看着别扭,今天我对这个别扭的原因进行了深入的思考。在给出代码前,它会先对这个程序要解决的问题以及解决的方法进行适当的描述,然后就是代码,这个时候你会感觉这段代码几乎就是对上面解决问题的方法的一种Scheme(本书采用的语言,Lisp的一种方言,具有很好的函数式特性)风格的描述,但是里面用的这些子函数到底是在哪里定义的啊,怎么就突然拿来用了呢?正当百思不得其解的时候,继续往下看,它就会对这些子函数的实现进行描述,然后给出代码。
我之所以觉得别扭,是因为我平常写程序的时候都是想着怎么才能一步步实现这个功能,然后开始编码,如果之后在写别的代码的时候发现跟之前写的代码有一些可以共用的部分,就把共用的部分提取出来进行封装,向外提供调用接口。这种方式我想应该是大部分人的思维方式。但是在《SICP》中并非如此,由于Scheme支持函数式编程,抽象粒度更细(以函数为单位,而不是对象或者类),所以作者是站在一个很高的抽象层面上看待问题,理清问题的脉络,很快地给出一个原型,这个原型已经解决了问题,但是它还不能运行,因为其中还有许多没有定义的函数。接着再使用同样的方法,把这些子程序看做一个个单独的问题,像之前一样分别理清思路,定义好这些子原型,这些子原型中可能还会用到一些没有定义的函数,再重复上述过程,一直到所有代码都能被Scheme解释器理解执行。这种思维可以看做是一种递归式的思维,自上而下去看待问题,所以说函数式编程中递归真是无处不在啊。运用这种思维写出来的代码具有很好的模块性,分层清晰,可读性高又易于扩展,很多子模块将来都可能用到,就感觉,明明是为了写应用,一不小心写了一堆库。
《SICP》的精髓在于合理的抽象和管理复杂度,我觉得这也是编程和软件工程的精髓。