书呆子的复仇:创新和数学一样永不过时
为什么DeepSeek会让硅谷许多人感到意外?DeepSeek创始人梁文锋在接受采访时回答:“在美国,每天都有各种创新出现,从这个角度看,我们的突破并不算特别。但他们惊讶的是,一家中国公司不仅仅是跟随者,而是以创新者的身份加入了他们的竞争。这与大多数中国企业习惯的模式完全不同。”
本文是美国互联网界的“创业教父”保罗·格雷厄姆撰写的关于编程语言的创新故事,其探索和发展的复杂性似乎并不可复制,但创新的根基——数学,具有永恒的价值。
撰文 | 保罗·格雷厄姆
翻译 | 阮一峰
01
为什么要麻烦地去创新?
软件业有一场永不停息的战斗,书生气的开发者与官僚主义的经理之间总是发生冲突。大家应该都看过漫画《呆伯特》(Dilbert),熟悉里面那个发型高耸的经理。我想,技术行业的大部分人对这个角色过目难忘,因为在他们的公司里就有这个角色的原型。
那些经理奇迹般地同时具备了两种很常见但很难结合在一起的特点:(a)对技术一无所知;(b)对技术有强烈的个人观点。
假设你需要写一个软件。你的经理根本不懂这个软件的运作机制,也不知道各种编程语言有什么区别,但是他竟然明确要求你一定要使用某一种语言进行开发。没错,他就是要求你一定要用Java语言。
为什么他会提出这种要求?让我们看看他究竟是怎么想的。他的想法无非就是,Java是业界的标准。我知道肯定如此,因为媒体对此有铺天盖地的报道。既然它是标准,那么使用它就不会错。另外,这也意味着人才市场上肯定有无数Java程序员,即使现在为我打工的这批人都辞职了(真奇怪,这种事情总是不断发生),我也能够轻易地找到替代者。
嗯,这听起来也不无道理。但是,它的前提是一个没有说出口的假设,而这个假设实际上是错的。你的经理相信所有编程语言的功能都差不多,可以互相替代。如果这种想法是对的,那么他要求你用Java编程就很合理了。反正编程语言之间没有区别,那么就用大家都在用的那种语言吧。
但是,编程语言是不一样的。就算不探讨各种语言之间的具体区别,我也能向你证明这一点。
回到1992年,如果你问经理使用什么语言开发软件,他会像今天一样毫不迟疑地回答说C++。如果所有编程语言都一样,为什么答案变了?进一步说,为什么Java语言的设计者要如此麻烦地去创造一种新语言呢?
一般来说,如果你动手创造一种新语言,那是因为你觉得它在某些方面会优于现有的语言。Java语言之父詹姆斯·高斯林在第一份《Java 白皮书》中说得很清楚,之所以要设计Java,就是想解决C++ 的一些弱点。所以结论就是,各种编程语言的编程能力是不相同的。
如果你接受你的经理的假设,然后一路追溯到Java语言的源头,就会得到与他的假设完全不同的结果。
到底谁对?高斯林还是你的经理?
02
哪种语言是最酷的?
结果当然是意料之中的,高斯林是正确的。在某些情况下,一些语言就是比另一些语言更出色。可是这样一说又导致了另外的问题。C++不适合解决某些难题,所以Java才被设计出来。那么,什么情况下应该使用Java,什么情况下应该使用C++呢?会不会某些情况下其他语言比它们更合适呢?
一旦你开始思考这个问题,就会发现它非常棘手。如果你的经理被迫去想这个问题,当他看到它的复杂性时,脑袋恐怕都会爆炸。
如果所有语言真的都一样,那么他只需选择一种看上去获得大部分人拥戴的语言就可以了,因为这实际上是一种流行风尚,而不是技术问题,所以即使像你的经理那样对技术无知的人也有可能轻松得到正确答案。
但是,如果语言各有不同,你的经理就会突然发现,有两个互相关联的方程,他必须找到一个能够同时满足两个方程的最佳解,而最要命的却是他对此根本一无所知。第一个方程是找到(相对于要解决的问题)能够适用20年左右的最佳语言,第二个方程是(为这种语言)找到合适的程序员和函数库的机会有多大。如果假定所有语言都不同,就会遇到这种苦苦求解的情况,所以难怪你的经理不愿意接受这个假设了。
认为所有语言都一样的看法的缺点是自欺欺人,但是优点是可以使许多事情变得很简单。我想这就是这个看法被广泛接受的主要原因。这是一个令人舒服的想法。
大家都觉得Java一定有过人之处,因为它是一种很酷的新兴编程语言。但是真的如此吗?如果你站在远处观察编程语言的世界,似乎Java就是最新的东西。(如果你站得足够远,那么你看到的所有东西就是Sun公司出钱制作的大型霓虹广告牌。)但是,如果你靠近观察这个世界,就会发现不同的人对“酷”的理解是不一样的。在黑客圈子里,Perl被公认比Java酷得多。黑客社区网站Slashdot就是用Perl开发的。我估计你不可能看到黑客愿意使用Java的JSP技术开发网站。可是,还有一种更新的语言叫作Python,它的使用者往往看不起Perl。另一些人则认为Ruby语言是取代Python的最佳选择。
当你按照Java、Perl、Python和Ruby这样的顺序观察这些语言,你会发现一个有趣的结果。如果你是一个Lisp黑客,你就看得出来,排在越后面的语言越像Lisp。Python语言模仿Lisp,甚至把许多Lisp黑客认为属于设计错误的功能也一起模仿了。至于Ruby语言,如果回到1975年,你声称它是一种有着自己句法的Lisp方言,没有人会提出反对意见。编程语言现在的发展不过刚刚赶上1958年时Lisp 语言的水平。
03
数学是不会过时的
1958 年,约翰·麦卡锡第一个提出了Lisp语言。我认为,当前最流行的编程语言不过只是实现了他在1958年的想法而已。
这怎么可能呢?计算机技术的发展不是日新月异吗?1958年的计算机的运算能力还不如今天的电子表,而体积却大得像冰箱(见图13-1)。那时的技术怎么可能超过今天的水平呢?
让我告诉你原因。这是因为设计者本来没打算把Lisp设计成编程语言,至少不是我们现在意义上的编程语言。我们今天所说的编程语言指的是用来告诉计算机怎么做的一种工具。麦卡锡最后确实有意开发这种意义上的编程语言,但是实际上他做出来的Lisp却是完全不同的一种东西,语言的基础是他的一种理论演算,他想用更简洁的方式定义图灵机。正如他后来所说:
Lisp 比图灵机表达起来更简洁。证明这一点的一种方法就是写一个Lisp通用函数,证明它比图灵机的一般性描述更短、更易懂。这个Lisp函数就是eval……它用来计算Lisp表达式的值……编写eval函数需要发明一种表示法,能够把Lisp函数表示成Lisp数据。设计这种书写法完全是为了满足论文写作的需要。(我)根本没有想过用它来编写Lisp程序并在计算机上运行。
1958 年年底,麦卡锡(见图13-2)的一个学生史蒂夫·拉塞尔看到了eval函数的定义,意识到如果把它翻译成机器语言,就可以把Lisp 解释器做出来。这在当时是非常令人吃惊的事。麦卡锡后来回忆:
拉塞尔对我说:“我想把eval编成程序……”我告诉他,别把理论和实践混淆,eval只是用来读的,不是用来做计算的。
但是他执意要做,并且还真的做出来了。就是说,他把我论文中的eval 编译成了IBM 704计算机的机器码,修正了bug,然后对外宣布做出了Lisp语言的一种解释器,这倒没有说错,确实如此。所以,从那个时候开始,Lisp语言就基本上是它现在的样子了……
这样一下子,就在几个星期之内,麦卡锡发现他的理论演算变成了一种实际的编程语言,而且出乎意料地强大。由此也就得出了20世纪50年代的编程语言到现在还没有过时的原因。
简单说,因为这种语言本质上不是一种技术,而是数学。数学是不会过时的。你不应该把Lisp语言与50年代的硬件联系在一起,而是应该把它与快速排序算法进行类比。这种算法是1960年提出的,至今仍然是最快的通用排序方法。
Fortran 语言也是20世纪50年代出现的,并且一直使用至今。它代表了语言设计的一种完全不同的方向。Lisp语言是无意中从纯理论发展为编程语言的,而Fortran从一开始就是作为编程语言设计出来的。但是,今天我们把Lisp看成高级语言,而把Fortran看成一种相当低层次的语言。
1956 年Fortran 刚诞生的时候,叫作Fortran I,与今天的Fortran语言差别极大。Fortran I实际上是汇编语言加上数学,在某些方面还不如今天的汇编语言强大。比如,它没有子例程,只有分支跳转结构。今天的Fortran语言可以说更接近Lisp而不是Fortran I。
Lisp 和 Fortran 代表了编程语言发展的两大方向。前者的基础是数学,后者的基础是硬件架构。从那时起,这两大方向一直在互相靠拢。Lisp语言刚设计出来的时候就很强大,接下来的20年它提高了运行速度。而那些所谓的主流语言把更快的运行速度作为设计的出发点,然后再用40多年的时间一步步变得更强大。直到今天,最高级的主流语言也只是刚刚接近Lisp的水平。虽然已经很接近了,但还是没有Lisp那样强大。
硅谷创业教父保罗·格雷厄姆畅销近20年的思想经典,一书了解何为黑客精神、如何创造财富与开拓未来。
有效的思考方式,才是你最强大的武器,透过黑客与画家的视角,与聪明的头脑对话,了解为何聪明人和我们想得不一样。透过15篇通俗易懂的文章,了解黑客精神如何塑造我们的世界,用黑客的先进思想与方法武装头脑,离财富更近,离自洽更近,离未来更近。
《黑客与画家(10万册纪念版)》
本文转载自微信公众号“图灵新知”。原文摘自《黑客与画家(10万册纪念版)》“书呆子的复仇” 。
特 别 提 示
1. 进入『返朴』微信公众号底部菜单“精品专栏“,可查阅不同主题系列科普文章。
2. 『返朴』提供按月检索文章功能。关注公众号,回复四位数组成的年份+月份,如“1903”,可获取2019年3月的文章索引,以此类推。