Luyao

SICP 的启发 1:空

1

之前我听过一个 80 年代的计算机课程,叫 SICP(计算机程序的构造和解释),很牛逼。

其中印象最深的一节课是关于数据抽象 (abstraction) 的,一个我觉得挺复杂的问题,他仅仅是做了几层抽象的表示,问题就被解决了。我当时大为诧异,因为并没看到真正的“解决过程”。

今天我把 那节课 重听了一遍,听到了一个之前没注意的东西。

他说 Lisp 中有一个基本的数据结构,叫做 CONS,它是由两个数据组成的一种结构,后续所有的抽象都是在这个基础上搭建的。

结果,到了这节课最后,他讲了个惊人的东西。

他说,我骗了你们,其实 Lisp 中并没有 CONS 这种结构,是我构造出来的。但当你们知道它是怎么被构造出来的,你们可能会被吓尿,因为它是从 “空” 中构造出来的

然后他展示了 CONS 的内部代码,只有三行,卧槽,你以为它内部是一个实体,其实并不是,它只是个过程!而且是一个看似没有意义的过程。

(define (cons a b)
  (lambda (pick) 
    (cond ((= pick 1) a)
          ((= pick 2) b))))

类似于,“这个人叫路遥”,你以为 “这个人” 是个实体,结果你查看它的源代码,发现它的源代码上写着:“叫路遥”。

他说他知道大家肯定会懵逼,所以就谎称有一种基础结构存在,让大家容易接受。但其实并不存在——

“很多人以为过程是一个行为,其实过程本身就是实体”

2

这节课还教了一个非常有趣的思维方法,叫做 “wishful thinking”,它是抽象(abstraction)的精髓之一。

它的意思是,当你想要设计一个东西时,可以先假设它已经存在了,比如想象成一朵云。然后你用这朵想象出来的云,来设计其他事物和它的交互方式。

一旦你定义了它和其他事物的交互,这个东西本身的设计也就差不多完成了,因为这些交互已经定义了它的本质。

换句话说,“一个事物的定义,取决于你和它交互的方式,而不是它的内部构造。”

3

聊起这个,我的朋友 Maomao 告诉我,胡塞尔就是这个观点,你无法知道世界上其他人是不是 NPC。即对你来说,唯一的实体是你和其他客体的关系。你只能知道关系,不能知道客体。

他这个观点之前一直被主流哲学界嘲笑,觉得你瞎搞,直到近代才被人理解。

4

当哲学家说这话的时候,别人可能觉得他故弄玄虚;但当你看到程序员写出这样的代码,然后正常 work,一切运行完好的时候,就很震惊。

比如,有一个粒子,它和世界唯一的互动方式是,有人去测量它,它长 1 纳米。

那么当你翻开它的源代码,它源代码很可能只有一行:

“当有人测量我的时候,我就告诉他老子的长度是 1 纳米。”

作为一个程序员,你看到这样的代码,会觉得,草,这么不负责任的代码,怎么可能构建出其他复杂的事物。

但实际上,它真的可以。

“建立数据抽象并不需要数据,过程可以完成所有事情。”

佛教说“五蕴皆空”,今天这个事情很大地加深了我对 “空” 的理解,原来真的可以在空上建立东西。