博客
关于我
王垠:我为什么不再研究编程语言(PL)
阅读量:177 次
发布时间:2019-02-28

本文共 2698 字,大约阅读时间需要 8 分钟。

程序语言领域的思考:一个PL从业者的观点

我不做程序语言(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名词,然后用无比复杂的方案来解决。

有一些PL人喜欢推广他们认为高大上的语言,比如Haskell、OCaml、Scala等。这些语言在PL学术界很受尊重,所以他们以为这些语言能够奇迹般的解决实际的问题,然而事实却不是这样的。事实是,这些学术界出来的语言,其实缺乏处理现实问题的机制。为了能够在学术上证明程序的所谓“正确性”,而且由于类型系统本身的局限性,这些语言往往被设计得过于简单,具有过度的约束性,以至于表达能力欠缺。

最后,你发现用这些语言来写代码,总是这也不能做,那也不能做,因为你要是那么做了,编译器就无法发现“类型错误”。到最后你发现,这些语言的约束,其实是无需有的。如果放宽这些约束,其实可以更优雅,更简单的对问题进行建模。对正确性的过分关注,其实导致了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/

你可能感兴趣的文章
oracle Blob保存方式,oracle 存储过程操作blob
查看>>
Oracle BMW Racing sailing vessel帆船图
查看>>
ORACLE Bug 4431215 引发的血案—原因分析篇
查看>>
Oracle Business Intelligence Downloads
查看>>
Oracle cmd乱码
查看>>
Oracle Corp甲骨文公司推出Oracle NoSQL数据库2.0版
查看>>
【Docker知识】将环境变量传递到容器
查看>>
uniapp超全user-agent判断 包括微信开发工具 hbuilder mac windows 安卓ios端及本地识别
查看>>
Oracle DBA课程系列笔记(20)
查看>>
oracle dblink 创建使用 垮库转移数据
查看>>
oracle dblink结合同义词的用法 PLS-00352:无法访问另一数据库
查看>>
Oracle dbms_job.submit参数错误导致问题(ora-12011 无法执行1作业)
查看>>
oracle dg switchover,DG Switchover fails
查看>>
Oracle E-Business Suite软件 任意文件上传漏洞(CVE-2022-21587)
查看>>
Oracle EBS OPM 发放生产批
查看>>
Oracle EBS-SQL (BOM-15):检查多层BOM(含common BOM).sql
查看>>
Oracle EBS环境下查找数据源(OAF篇)
查看>>
oracle Extract 函数
查看>>
uni-app开发环境自动部署的一个误区(App running at...)
查看>>
Oracle GoldenGate Director安装和配置(无图)
查看>>