本文共 2698 字,大约阅读时间需要 8 分钟。
程序语言领域的思考:一个PL从业者的观点
我不做程序语言(PL)的工作已经半年了。在这半年里,我变得快乐了很多,对世界也有了新的观点。现在我想来讲一讲,我为什么不想再做PL的工作和研究。我只希望这些观点可以给正在做PL,或者考虑进入这个领域的人们,作为一份参考。
PL看似计算机科学最精髓的部分,事实确实也是这样的。没有任何一个其它领域,可以让你对程序的本质形成如此深入的领悟,然而这并不等于你就应该进入PL的博士班。这是为什么呢?
PL这个领域几十年来已经发展到了非常成熟的阶段。这里面的问题,要么在20年前已经被人解决掉了,要么就是类似“停机问题”一样,不可能解决的问题。然而,博士毕业却要求你发表“创新”的论文,那怎么办呢?于是你就只有扯淡,把别人已经解决的问题换个名字,或者制造一些看似新鲜却不管用的概念,在大会上煞有介事的宣讲。这种现象在学术圈里被称为“炒冷饭”。
最开头进入这个领域的时候,你可能不觉得是这样,因为似乎有那么多的东西可以学习,那么多的大牛可以瞻仰,那么多的新鲜名词,什么“lambda calculus”啊,“语义”啊,各种各样的“类型系统”啊,这样那样的“逻辑”…… 但是时间久了,看透了,你就发现一些这个圈子里的规律。
几乎每篇PL领域的论文,里面必有一页弯弯曲曲,让人看花眼的逻辑公式。程序语言的论文,不是用程序来描述,而是用一些老古董的逻辑符号,像这样:
绝大部分PL领域的专家们,似乎都酷爱逻辑符号,视逻辑学家高人一等。这种崇尚古人的倾向,使得PL专家们看不见这些符号背后,类似电路一样的直觉。他们看不见逻辑学的历史局限,所以他们也许能够发展和扩充一个理论,却无法创造一个新的。
说到古人,却并不是所有古人都这么晦涩。如果你考古一下就会发现,其实现代逻辑学的鼻祖Gottlob Frege最初的论文里,是没有这些稀奇古怪的符号的。他整篇论文都在画图,一些像电路一样的东西。比如下图,就是Frege的创始论文《Begriffsschrift》里最复杂的“公式”之一:
你可以把这里的每根线理解成一根电线。图1里的诡异的逻辑符号,都是一些好事的后人(比如Gentzen)加进去的,最后搞得乌七八糟,失去了Frege理论的简单性。所以PL专家们虽然崇尚古人,却没有发现大部分古人,其实并没能获得鼻祖Frege的真传。
进入一个领域做研究,你总该知道那些人是真正厉害的。可惜的是,PL这个领域里,你往往不知道谁是真正掌握了精髓的学者,甚至好几年之后你仍然蒙在鼓里。我的历史教训是,写教科书的人,往往不是最聪明,最理解本质的。真正深刻的PL研究者,你可能根本没听说过他们的名字。
一般程序员提到PL,就会跟“编译器”这个领域混淆在一起,就会想起大学时候上编译器课,看《龙书》时焦头烂额的情景。然后由于斯德哥尔摩综合症,他们就会崇拜龙书的作者们。直到遇到了真正厉害的PL专家,你才发现编译器这个领域,跟PL根本是两回事,它其实比PL要低一个档次,里面充满了死记硬背的知识甚至误导。龙书的作者,其实也不是最厉害的编译器作者,他们更不是合格的PL专家。
PL人在学校里跟着教授炒冷饭,毕业进入了公司之后,他们的行为方式还是非常类似。他们喜欢在公司里做的一件事情,叫做“过度工程”。本来很直接,很容易解决的一个问题,非要给你扯到各种炫酷的PL名词,然后用无比复杂的方案来解决。
有一些PL人喜欢推广他们认为高大上的语言,比如Haskell、OCaml、Scala等。这些语言在PL学术界很受尊重,所以他们以为这些语言能够奇迹般的解决实际的问题,然而事实却不是这样的。事实是,这些学术界出来的语言,其实缺乏处理现实问题的机制。为了能够在学术上证明程序的所谓“正确性”,而且由于类型系统本身的局限性,这些语言往往被设计得过于简单,具有过度的约束性,以至于表达能力欠缺。
最后,你发现用这些语言来写代码,总是这也不能做,那也不能做,因为你要是那么做了,编译器就无法发现“类型错误”。到最后你发现,这些语言的约束,其实是无需有的。如果放宽这些约束,其实可以更优雅,更简单的对问题进行建模。对正确性的过分关注,其实导致了PL人选择蹩脚的语言,写出绕着弯子,难以理解的代码。
喜欢钻牛角尖,把问题搞复杂,就是很多公司里的PL人的共同点。制造语言是PL人应该尽量避免的事情,这恰恰跟PL人的专长是矛盾的。所以有原则的PL人,生活怎么可能不苦:
很多研究PL的人喜欢看低其它程序员,认为自己能设计实现程序语言,就是天之骄子。我之所以从Dan Friedman那里学到了好东西,却没有成为他的PhD学生,一方面就是因为看不惯围绕在他身边那些自认为是“天才”的人。
总是有那么一群本科生,自认为掌握了Friedman所讲授的精髓,所以高人一等。其实呢,他们的水平比起我这样的,其实差的天远。于是我就经常无奈的看着他们,吵吵闹闹的宣讲他们解决的“新问题”,貌似什么了不起的发明一样,受到Friedman的肯定就受宠若惊的样子。而其实呢,那些都是我几年前就已经试过并且抛弃的方案……
其它的PL人,包括PhD学生,也有一样的毛病。不管在三流大学,还是在Harvard,Princeton,MIT这样的“牛校”出来的,只要是PL人,几乎必然有这种天才作风。另外你可能不知道的是,牛校往往并不产出优秀的PL人才。像Stanford,Berkeley,MIT这样的传统CS牛校,其实在PL方面是相当差的。
这种天才病的危害在于,它蒙蔽了这些人的眼睛。他们不再能设计出让“普通人”可以容易使用的产品。如果你不会用,他们就会嘲笑你笨,而其实呢,是因为他们的设计不好。他们喜欢用含混晦涩的方式(所谓“函数式”)的写法来构造代码,让其它人阅读和修改都极其困难,……
这些所谓天才,看不到简单直观的解决方案,为了显示自己的聪明而采用繁复的抽象,其实是一种愚蠢。真正的天才,必须能够让事情变得简单。
总的来说,PL领域的研究看起来非常光鲜,但实际上很多时候只是在同一个问题上不断地做文章。真正有价值的研究,往往并不是在“炒冷饭”中完成的,而是通过对现有技术的深入理解和实践得来的。所以,如果你正在考虑进入PL领域,或者想深入了解它,我建议你先从实践出发,动手实现一些程序语言的解释器或编译器,去感受语言的本质,而不是被各种理论和名词迷惑。只有这样,你才能在这个领域中找到真正的价值所在。
转载地址:http://ewfj.baihongyu.com/