缺乏想象力的程序员
我认识一个演员,且叫她Esmerelda吧,她曾说,“我无法想象除了当演员我还能做什么。”对于此有人反击说,“你肯定不能成为一个优秀的演员,不是吗?”
当某人向我谈论Go语言时,我想起了这个争论。他说,“我不能想象如何用一种没有范型的编程语言进行编程。”我的反驳——当时并没有说出来——是,“那你一定不能成为一个优秀的程序员,不是吗?”
这篇文章并不是讨论范型问题的(范型是个好东西,也许某一天Go语言里也会有,也许不会),而是关于想象力的,或者,至少是关于被程序员们误认为是想象力的:抱怨。一个朋友发现,现代一种流行的娱乐方式就是去上网抱怨。对于抱怨者,这很有趣,对于抱怨的接收者,是使其沮丧消沉。作为一个抱怨接收者,我一定会把抱怨反送回去。
不是很久以前,所谓程序员是指一个能编程的人,但如今看起来,编程变成了程序员的最后一件事情。如今,程序员的定义是:一个会抱怨的人,除非问题已经被解决,并且解决方案用一行代码就可以表示。(从一个语言设计者的角度,这能推导出一个成功的语言的必然结论:任何程序都能够缩减成一行代码,否则,这种语言很烂。语言算法课程不需要存在了。)
一个不同的、更公正的定义应该是:程序员是永远用同一种方法解决任何问题、并在这种方法不好用时抱怨这些用到的工具和技术。
对于程序员大众来说,这种现代的消遣方式要求:当一个人需要编程,或至少需要去思考编程时,他不去编程,而是去写一篇博客/一条微博/一句牢骚。我曾看到有人写了数千行一句话式的咒骂,抱怨某个问题需要让他多敲几下键盘,可却没有意识到反讽的是,如果他把这发牢骚的功夫用在编程上,他甚至可以把这个问题解决数百次,而不用敲这么多键盘来抱怨。但是,当然,这需要编程。
两年前,Go语言面世。今年,Dart语言对外发布。两个都来自谷歌,但出自不同的团队,为着不同的目的;它们少有相似之处。然而,在Dart语言推出后的前几天,我被一系列对这种语言的批评震惊:如果你把“Dart”全文替换成“Go”,你会发现很多早期对Go语言的抱怨很适合当成现在对Dart语言的漫骂。没有必要非要先试试Go或Dart才去公开对它们品头论足;事实上,不去试是很重要的(因为这需要去编程)。批评的声音很大,很喧嚣,但毫不相关,因为他们说的跟语言没有任何关系。他们只是对一种新的事物做出的一种标准反应。毫无意义。这是现代程序员对任何意外事物进行抱怨的表现。抱怨是可以无限重复利用的。(“我不能想象一种语言竟然没有XXX功能”)。毕竟,他们说的话不需要有很高的质量:不需要编译器编译检查它们。
当Go语言发布了一段时间后,这张批评声的基调发生了一些变化。有些人真正的用过了它,但还是有很多抱怨者。包括上面引用的一条。现在的问题其实是缺乏想象力:Go是一种用来写Go程序的语言,不是用来写Java程序或Haskell程序或任何其它程序的。你需要换一种不同的思维方式来写出好的Go程序。但这需要时间和努力,需要你去研究它。而通常我们听到的故事是把一种其它语言的程序翻译成Go语言程序,然后看是什么结果。可是,翻译会丢失方言成语。例如,试图在Go语言里写出Java构造器,这不会有好结果,然而,使用Go语言里一些特定的编写方式却能收到意想不到的效果。在经过了10年的Java编程和10分钟的Go编程后,任何对语言能力的比较都不会比出深层次的内容,然而,比较的结果却出来了,因为这是现代程序员的工作。
当然,也有好样的。两年来,Go语言拥有了大批的粉丝愿意去花时间研究究竟该如何使用它,很多愿意去对它进行投资的人最终得到了很好的回报。需要你花时间,需要你有想象力,需要你去编程,这才能知道如何更好的使用一种语言,这需要你很多的时间。这不断壮大的Go语言社区创造出了大量的优秀的软件,这给了我希望,让我看到世界上还有真正的程序员存在。
然而,网上关于Go语言的一知半解的责骂还是很多,所以,在2012年,我的一个自我防御的新年计划就是:
我决定要更多的去揭露这些抱怨者的真实嘴脸,而不是关心他们抱怨的东西。威信不是靠发牢骚获得的,而是靠经验和洞察力,这需要你去实践和想象力,包括做一些编程工作。