在黑夜中前行
2011-10-31
就在两天前的晚上,我彻夜不眠地将《永生之酒》这部动画看完了。
这部作品叙事的方式很独特:一般的作品,通常叙事都是以一条时间线、单角色的角度进行的,而《永生》则将一个故事拆散,用三四条时间线分别错开,每条时间线上还有多个角色分别叙述自己的故事。
这样大胆的叙事方式,很明显产生的结果是,如果你不将整部作品看完的话,你根本不明白发生了什么事情——你看完前两三集,发现自己连故事背景都没搞清楚,因为它根本就没交代!挣扎着地将整部作品看了一半之后,你才开始对故事有些眉目,但还是不能总揽全局;忍无可忍看到最后一集,看着原本错开的几条时间线逐渐相交成一点,而分散的各路人马也最终汇集在一起,整个故事才圆满收尾。
这时你才明白导演在编剧方面的良苦用心,你发现之前让你痛苦不堪的叙事手法,到最后反而让整个故事变得更有味道。
当然,遗憾的是,并不是每个人都有机会看到这个故事的结局,也许刚开始,有一半人被特别的叙事手法吓跑了;而故事进行到一半的时候,也许另外一半人又因为忍受不了慢热的剧情而离开了,而剩下的那些人,才最终看到了整个完整的故事。
这种感觉有点像是在黑夜中前行一样——你的前方、路的尽头,有一丝微弱的光线,你知道方向就是这样,路就这一条,但你不知道还要走多久,还要走多远,你唯一能做的,就是耐着性子,一步一个脚印向前迈进。
---
某种程度上,阅读这本《Practical Common Lisp》(后称PCL)的过程也是如此。
正如作者在第三章所言的那样,这本《PCL》并不是以一般的语言书籍作为模板的,那些循规蹈矩的语言教程总是先教你定义变量,了解语法结构,告诉你如何定义函数、对象、包,从开始到结尾,难度逐渐加大。
而这本《PCL》则更符合实用原则,提倡在实践中学习——只介绍最少的理论,最少的API,然后,剩下的就是边编程边学习了:在这本书的正式开始部分,第三章,它在介绍了少量必要语法知识的前提下就用一个数据库的例子介绍了Lisp的列表操作以及文件的读写,在最后还直接了当地引入了Lisp的大杀器——宏,一点不废话,然后,在第三章之后,才开始花了几章的边幅,介绍第三章所用到的技术,在这之后,章节的编排基本就和一般的教程没有什么两样了。(其实,如果你读过pragmatic programmer的书,你可能早就适应这本书的风格了。)
当然,作者偏向实践性的写作方式和章节编排,并不是为了文学创作需要或者故意刁难读者,而是,一方面,函数式编程作为一个长期被误解为“学院派”的方向,急需一些“实用型”的书籍来为普罗大众解毒;另一方面,如果一开始就长篇大论介绍函数式编程的细节和理论(lambda、eval。。。),然后才开始讲common lisp,恐怕最后反而会吓怕更多人。
译者在序言中说这本书可以让新手入门common lisp,我对此并不(太)反对,但由于这本书趋向实践性的编排方式,一些理论介绍得比较简单,而如果缺少对一些关键理论的理解,就会给Lisp的学习带来困难,所以我个人感觉从这本书入门并无不可,只是难度偏高,你得有一定的耐心,将书读透才行。
当然,这个过程可能是不太容易的,我猜在第三章之后,一半人放弃了,然后在第七到第九章之间,在宏的折磨下,又一半人放弃了,然后剩下的人,才有机会最终一窥Lisp之美。
就像看动画一样,通常只有“熬”到最后的人,才有机会遇见美好的结局。
---
最后,看到有一些人评论者抱怨这本书翻译质量不好,对此我比较难以理解:靠着一些《SICP》的经验,这本书我看得很快,只分两次就读完了,24章之后挑了两三章来看,因为没接触过宏,在宏的章节遇到了点麻烦,但没有停留太久。
我个人认为这本书的整体阅读体验还是很流畅的,整本书从内容和翻译上来说都算得上佳作——我觉得读者们应该庆幸,这本书是由一个真正的Lisp程序员来翻译,而不是一个JAVA程序员或者外语系的三年级生。
如果你在阅读这本书的过程中觉得举步维艰、晦涩难懂,比起怀疑翻译质量,也许更合理的做法是补充一下自己的基础知识,如果你也这么认为的话(嗯,另外一部分人也许不愿意承认这个),那么《SICP》的课程视频和书本,以及paul graham的文章,比如《root of lisp》都应该是你的好帮手。
嗯,大概就那么多了,各位加油,我们在终点再会。
---
传说中的脚注:
程序员修炼之道,check list 26,"select" isn't broken
root of lisp(中文):
http://daiyuwen.freeshell.org/gb/rol/roots_of_lisp.html
sicp视频(youtube的有英文字幕):
http://www.youtube.com/results?search_query=sicp&aq=f
http://www.youku.com/playlist_show/id_3967477.html