旧闻一则:2014年2月,Facebook宣布以190亿美元价格收购跨平台移动通讯应用WhatsApp。

这款总用户数突破10亿、月活跃用户数4.5亿的应用,其背后只有不到50名开发人员。怎么做到的?秘密在于Erlang,他们把Erlang发挥到了极致。更励志的是,其主要开发者只用2年左右时间就从Erlang新手成为了高手!

所以,是大众还是小众并不重要,能否成为“下一个Java”也不重要,一代又一代编程语言繁荣更替只是时尚,掌握编程本质、成为具备真正编程能力的精英程序员才是王道。

至于该如何才能掌握编程本质,大家走的路径或许不尽相同,但我很推崇编辑过的一篇文章中的观点,5年时间过去了,仍记忆犹新,谈的是给未来程序员的建议,我觉得也很贴合我们出版《Erlang程序设计》的动机。现将其中的精华部分摘录于此。

“大学计算机系的课程里,传统上有两个知识点,许多人从来都没有真正搞懂过的,那就是指针和递归。“

”你进大学后,一开始总要上一门数据结构课, 然后会有链表、散列表以及其他诸如此类的课程。这些课会大量使用指针。它们经常起到一种优胜劣汰的作用。因为这些课程非常难,那些学不会的人,就表明他们的能力不足以达到计算机科学学士学位的要求,只能选择放弃这个专业。这是一件好事,因为如果你连指针很觉得很难,那么等学到后面,要你证明不动点定理的时候,你该怎么办呢?”

“对于许多计算机系的青年学生来说,另一门有难度的课程是有关函数式编程的课程,其中就包括递归程序设计……我的计算机科学导论课程真是读得苦不堪言。我注意到很多学生,也许是大部分的学生,都无法完成这门课。课程的内容实在太难了。我给教授写了一封长长的声泪俱下的Email,控诉这门课不是给人学的。宾夕法尼亚大学里一定有人听到了我的呼声(或者听到了其他抱怨者的呼声),因为如今这门课讲授的计算机语言是Java。“

”这就是争议所在。许多年来,像当年的我一样懒惰的计算机系本科生不停地抱怨,再加上计算机业界也在抱怨毕业生不够用,这一切终于造成了重大恶果。过去十年中,大量本来堪称完美的好学校,都百分之百转向了Java语言的怀抱。……Java语言中没有什么太难的地方,不会真的淘汰什么人,你搞不懂指针或者递归也没关系。……学习Java语言的孩子是幸运的,因为当他们用到以指针为基础的散列表时,他们永远也不会遇到古怪的段错误 ,他们永远不会因为无法将数据塞进有限的内存空间而急得发疯。他们也永远不用苦苦思索,为什么在一个纯函数的程序中,一个变量的值一会保持不变,一会又变个不停!多么自相矛盾啊!“

”说到这里,我坦率地承认,当今的软件代码中90%都不需要使用指针。事实上,如果在正式产品中使用指针,这将是十分危险的。好的,这一点没有异议。与此同时,函数式编程在实际开发中用到的也不多。这一点我也同意。”

“但是,对于某些最激动人心的编程任务来说,指针仍然是非常重要的。比如说,如果不用指针,你根本没办法开发Linux的内核。如果你不是真正地理解了指针,你连一行Linux的代码也看不懂,说实话,任何操作系统的代码你都看不懂。”

“如果你不懂函数式编程,你就无法创造出MapReduce ,正是这种算法使得Google的可扩展性达到如此巨大的规模。单词Map(映射)和Reduce(化简)分别来自Lisp语言和函数式编程。……发明MapReduce的公司是Google,而不是微软,这个简单的事实说出了原因,为什么微软至今还在追赶,还在试图提供最基本的搜索服务,而Google已经转向了下一个阶段,开发Skynet ,我的意思是,开发世界上最大的并行式超级计算机 。我觉得,微软并没有完全明白,在这一波竞争中它落后多远。”

“除了上面那些直接就能想到的重要性,指针和递归的真正价值,在于那种你在学习它们的过程中,所得到的思维深度,以及你因为害怕在这些课程中被淘汰,所产生的心理抗压能力,它们都是在建造大型系统的过程中必不可少的。指针和递归要求一定水平的推理能力、抽象思考能力,以及最重要的,在若干个不同的抽象层次上,同时审视同一个问题的能力。因此,是否真正理解指针和递归,与是否是一个优秀程序员直接相关。

“……Java语言学校的教学也还是失败的,因为学校没有成功训练好学生的头脑,没有使他们变得足够熟练、敏捷、灵活,能够做出高质量的软件设计(我不是指面向对象式的设计,那种编程只不过是要求你花上无数个小时,重写你的代码,使它们能够满足面向对象编程的等级制继承式结构,或者说要求你思考到底对象之间是has-a从属关系,还是is-a继承关系,这种伪问题将你搞得烦躁不安)。你需要的是那种能够在多个抽象层次上,同时思考问题的训练。这种思考能力正是设计出优秀软件架构所必需的。”

引文摘自《软件随想录》第8章。这确实是一本好书,多年后翻看仍引人思考。另外预告,该作者的第一本博客文集我们也在紧张翻译中,敬请期待。