多年来,编程语言的优劣成了程序员间永恒的争论。
二逼程序员:
PHP是世界上最好的语言!
C++是世界上最牛逼的语言!!
......
然而稍微有些头脑的人当然会说:
没有最好的编程语言,只有最合适的编程语言。
这句话可谓不偏不倚,恰到好处。甚至让我一度认为没有糟糕的编程语言,所有觉得不好用的编程语言一定是我没有掌握正确的用法。因为作为一个在编程语言理论方面近乎白痴的程序员,我毫无指责那些语言发明人的权利。即使我深深体会到JavaScript程序的混乱、C++各种复杂头疼的特性,它们用起来很困难,但我却无法讲清楚它们到底差在哪,只好承认水平不够,尽量不用罢了。
像我这样的普通程序员,嘴上说着“没有最好的编程语言”,心里大概也会有所偏爱,而我的偏爱就是Java。
Java是一种典型的静态类型语言,每个变量都要规规矩矩定义好再使用。没有任何复杂特性,使得Java恐怕是最容易上手的编程语言。有时候太过简单反而成了一个槽点,随便一个培训班出来的人都能写出像样的Java代码,让人觉得Java程序员身份低微。如果自称C++程序员就立马高贵了许多,毕竟C++不是想学就能学会的。然而我从来不把编程语言的学习难度作为评判它好坏的标准,真正好的东西应该是简单、优雅的,而不是充满莫名其妙人为制定的规则。在我用C++的时候,总有一种C++设计者拆东墙补西墙的感觉,以至于丧失了许多美感。而使用Java简单的语法规则,就可以创造出各种各样复杂的功能,虽然代码会更长,但它的整齐、一致保证了代码的可读性和可扩展性,这是我钟意它的理由。
读到这里,C++程序员可能已经坐不住了,不过别急,本文马上迎来反转,那就是我要讲的编程语言的偏见。
今天,我受到保罗·格雷厄姆(Paul Graham)的影响,开始认识到我对Java的喜爱以及对C++的排斥正是对编程语言的偏见。保罗·格雷厄姆的文集《黑客与画家》给了我极大震撼,读完这本书,我不得不重新思考对编程语言的理解,并写下这篇反思的文章。
保罗在书中明确地指出了他认为最好的编程语言——Lisp。我最早了解到这门语言是从王垠的博客,王垠作为编程语言领域的大师级人物,也极力推崇Lisp,两人的意见如此相近,可见Lisp的确在所有编程语言中鹤立鸡群。然而作为普通人的我们,第一个问题就是:为什么Lisp没有得到广泛使用?最好的编程语言难道不应该流行吗?遗憾的是,王垠没有给出让人容易接受的解释,而保罗在书中的解释则让我豁然开朗。
简单说来,Lisp没有得到广泛使用的原因就是因为编程语言不仅仅是技术,也是一种习惯性思维,非常难于改变。编程语言从抽象程度上可以由低到高排列,机器语言、汇编最低,C语言在中间,Java、Python最高,然而在通常我们理解的这个范围之外,Lisp其实处于这个层级的顶点,它具有最高的抽象程度,也就有了最强大的编程能力。可为什么我们却无法意识到这一点呢?这被称作Blub困境。下面我来解释这个有趣的问题。
假设有一种Blub语言,它的抽象程度正好落在编程能力的中点。它既不是最强大的语言,但也要比汇编或机器语言更高级。我们假设Blub程序员既不使用机器语言也不使用汇编,他认为那是编译器的工作。只要这位程序员向下方望去,他就肯定知道自己正在看的是一些比较低层次的语言。因为那些语言明显不如Blub语言强大,缺少他习惯使用的某些功能。但是,当他向上方望去,他不会意识到自己正在看更高层次的语言,而是仅仅觉得自己正在看某些奇怪的语言。他可能认为那些语言也许与Blub一样强大,但是加入了不少怪东西。他觉得Blub语言已经够用了,不用再考虑那些语言了。这时,他的思维就已经被Blub同化了。
但是,当我们转换视角,把自己想象成使用Blub上方某一种语言的程序员并往下看的时候,我们就会发现,自己也同样轻视Blub语言。你怎么能用Blub语言工作呢?它甚至连XX功能都没有!
通过归纳法我们可以知道,唯一洞悉所有语言优劣的人必然是懂得最强大的那种语言的人。由于Blub困境的存在,你无法信任其他人的意见:他们都满足于自己碰巧用熟了的那种语言,他们的编程思想都被那种语言主宰了。
当我读到这里的时候已经惊出一身冷汗,这不就像一只井底之蛙么,偏执于眼前熟悉的语言,不了解其它语言的能力,却还指指点点,批判其它语言的不足。我对动态语言的偏见、对函数式编程的偏见,可能都源于此。
保罗的一番话对我造成的冲击,迫使我重新审视这个世界。特别是他在《一百年后的编程语言》一文中预言,“Java会像Cobol语言一样没有前景,进化之路已经走到了尽头”,仿佛当头一棒,给予我致命一击。然而程序员生来就是要面对无穷无尽的变化,是时候破旧立新,摒弃所有偏见,纯粹以技术的角度看待编程世界,反而是一个提升自我的契机。
最后,推荐《黑客与画家》这本书,绝对是不可多得的好书,读完收获良多。
网友评论