我要啦免费统计

欲求理解,先求创造

前几天在面试腾讯的时候,面试官问了我这样一道题:如何用C语言来实现一个闭包。虽然我之前的面试回答不堪入目(基础不扎实啊),但听到这道题后还是小小的兴奋了一下。由于我平时就偏爱fp一些,再加上神级课程programming language把闭包讲的很透彻,还动手实现了一个解析闭包的解释器,所以这道题我还是很有自信的。

闭包是fp中的基本概念,其含义就是函数体+其定义时的环境(lexical scope)。因为c语言并不支持lexical scope,所以我们必须将函数定义时的环境保存到某个变量中,需要时再将函数指针和这个变量一起传递即可。

这其实并不是我原生的想法,在programming language 课程中,老师Dan为了让大家理解什么是闭包分别在静态语言的ml中和动态的scheme中分别演示了lexical scope的作用域。但真正使我印象深刻,也是真正使我确定什么是闭包的,是Dan在最后又写了一段java代码和一段c代码,告诉我们这就是闭包。

如此一来,闭包就不是什么神圣(《黑客与画家》综合症)或者神秘的事物了。它只是个理念,要把函数和定义环境捆绑起来从而消除副作用带来的影响。任何语言只要想法设法能够传递一个函数和一些变量,我们就可以构造闭包出来(程序语言界的设计模式?)。所以,当我在创造出闭包的时候(而不是使用),我才知道闭包就是这么个东西。

Dan这样的教学方法可供大多数课程借鉴,这也是在创造中理解的很好的例子。其他的例子就更多了,比如我们为了理解算法就去写标准库,为了理解操作系统就自己实现一个操作系统,理解编译原理就手动实现一个编译器,理解网络就自己写一个服务器软件。。。这些已经成了这些课程的标准作业。

对于复杂的结构或系统,我们可以追求在建造中理解。但对于更简单的原理或理论,我们的追求其实还可以更进一步,在理解之前就可以创造出来。前一段时间在微博上看到vc大大在吐槽以is-a为理由的继承,vc由于写过很多程序,所以在未接触什么教材或设计模式的书籍时,已经凭经验感觉到继承的原则应是子类可完全替换父类,而不是逻辑中的is-a关系。这样,在vc还没有听说过什么叫做李氏替换原则时,他实际上已经创造了一个出来。同样,一位古希腊以为原子论者也曾靠纯逻辑思辩得出了和牛顿惯性定律相同的结论。他们都不能说是对这个定律理解多深,李氏替换原则有什么背景,牛顿定律有什么力学依据他们不一定清楚,但是他们去主动发现了这种定律,却是一种很有益的尝试,而且以自己的视角发现的东西,说不定会更加贴近于事物的本质(至少推理步骤减少了不少)。

我以前中二时,曾经也有过类似的体验。我当时试着去否定因果的先后顺序(真是大胆的尝试),然后去推演这个前提之上的世界。这样的想法在我的脑子里泡了许久(pongba所谓暗时间),之后突然有一天,我感觉到了事物之间的界线消失了,整个世界作为混沌的整体而存在。人与人之间的关系无比平等,当我夜晚抬头仰视,我似乎在星空中看到了我自己,也感到星空就在我心中。在星空与我合一时,我感到的不是空虚和寂寥,而是前所未有的充实,就好像心中居住着神明,或者说自己就成了神明。这种神秘主义的体验持续了很久。后来偶然接触了一些书,才知道我所做的假设,包括我之后的体验,都和佛教有着密切的联系。只不过他们把星空叫做佛法,把这种体验当作顿悟,把那神明称作佛。由此看来,佛教其实更像是数学,由一个公理衍生出整个宇宙,这简直可以称得上是优雅了。

所以说,在皈依某个宗教之前,说不定我们先可以创造一个属于自己的?

Post Footer automatically generated by wp-posturl plugin for wordpress.

Leave a Reply

Your email address will not be published. Required fields are marked *