今天想到了这么一个问题:Node.js这样的创新并不是基础性的发明,实际上组合利用了现有技术:V8引擎,事件驱动,libuv等。 为什么这样的创新,没有在中国率先出现呢?

这些年国内互联网和移动互联网的发展非常好,肯定也遇到了Node.js要解决的问题,国内的技术大牛应该也有能力把它实现,为什么就是没有出现呢?

带着这个问题,我扒了扒Node.js的诞生历史及其作者Ryan Dahl的经历,看看能不能得到一些启示。

Rayan Dahl 1981年出生于美国的加利福尼亚,在6岁时,他的妈妈就给他买了一个Apple IIc的电脑。这可是在1987年,国内的同龄人估计很多还在玩泥巴吧?

Ryan Dahl 大学在加州大学圣地亚戈分校读数学,后来进入纽约罗彻斯特大学读博士,专业是代数拓扑。

(代数拓扑常常研究的结构)

数学的训练给了Ryan强悍的抽象思考的能力, 可是在博士第三年的时候,他觉得研究方向和现实生活关联不大,整天坐在屋子里在纸上写写画画, 实在没意思,比不上编程,做一个网站,然后就能给别人“显摆”一下。

于是在7月份他退学了,买了一张单程票去了南美洲的智利(为啥?),没想到南美的7月份是冬天,把他冻得够呛,租了房子之后,手头就没啥钱了,饥寒交迫之下,前博士生Ryan开始在智利教英语赚钱。

(红色轮廓即为智利)

这时候他遇到了一个叫Eric程序员,正在给一个滑雪板公司用PHP做网站,Ryan想起大学时写过程序,就问道:我能不能也来帮忙? 于是他的编程生涯就此开始了, 你看,人生还是要主动一些。

2006年,Ruby on Rails开始流行,Ryan开始用它开发网站,Ruby语法非常优雅,Rails开发Web网站又非常快速, 但是运行起来却很慢,并且不容易扩展, 于是Ryan便开始研究这个问题,开始接触底层的知识。

Ryan在南美洲呆了一年, 最大的收获可能是交了女朋友。 由于女朋友要回到大学上学,他就陪着女朋友来到了德国,开始了自由职业者的生涯,主要做Nginx的模块开发。

Ryan很喜欢Nginx这样基于事件的服务器设计,也许是学数学的吧,他认为这样的编程模型更加漂亮,更容易理解。相反,传统的方式(一个无限循环来接受socket,通过阻塞的方式来读写socket)反而让它觉得很奇怪。

他依然对Ruby感兴趣, 参加Ruby会议的时候,遇到了一个叫做 Chris Neukirchen的家伙, Chris开发了一个叫Rack的东西,对Web服务器的各种操作做了一个高度的抽象:一个叫做call的函数,接受一个叫做enviroment的参数,返回一个包含三个值(status, headers, body)的数组。

数学系出身的Ryan很喜欢这样漂亮的抽象,他脑子中冒出一个想法:能不能把Rack的思想和Nginx的非阻塞IO给结合起来,搞出个新东西?

Ryan 尝试用了几种编程语言来开发这样的系统,比如他很中意的语言Haskell, 但是他觉得搞不定GHC(Glasgow Haskell Compiler),Lua是他比较中意的语言,但是Lua有太多用阻塞方式写的类库,用起来不爽。

2008年,基于V8 JavaScript引擎的Chrome浏览器就发布了,基于好奇,Ryan开始研究V8,他发现V8的代码整洁、快速、非常吸引人。有一天,他突然意识到:OH, My God! JavaScript不就是单线程,非阻塞的嘛!并且JavaScript没有I/O阻塞的类库!

如果把JavaScript,异步IO,Http Server的东西给组合起来,这将是一个非常酷的东西!

Ryan非常激动,立刻着手开发,几个月后,Node.js诞生了!

总结一下,Ryan的经历中有几个鲜明的特点:

1. 6岁玩电脑

这可是在1987年,国内的同龄人估计玩泥巴的比较多。

2. 良好的教育背景

数学系的博士生(虽然没毕业),培养了他强悍的抽象思维能力。

3. 追随兴趣,博士想退就退

在国内敢这么干的估计不多,我们需要学位来找工作,评职称,落户口,人才引进.....

4. 自由生活

直接从美国跑到智利,这是什么骚操作?

为了女朋友,又从智利跑到德国, 在他的脑海中,也许这才是生活吧。

国内程序员大多会走另外一条路:找个稳定的、大厂的工作,被迫996, 背上房贷(还不一定能背得上!),车子,孩子......

5. 典型的黑客

一个非计算机专业的学生,掌握了C, Lua, Haskell, C++, JavaScript等编程语言,并且从Web应用层开发跳跃到了Nginx这种系统层软件开发,充分说明他在技术上是非常厉害的,学习能力超强。

6. 好奇心

研究新技术,Chrome V8出来就把玩一番,结果玩出了新天地!

我个人感觉Ryan是一个非常自由的人,一直在追随兴趣做事情, 完全没有为生活发愁,哦,其实不准确,在南美的时候,Ryan也曾经“饥寒交迫”过。

我很羡慕这种自由,但是学不来,估计绝大多数人也学不来吧!

上帝把JavaScript拓展到服务器端这样的重任交给了Ryan,有一定的必然性,因为从他的经历看,他一直在思考这个问题,并且做了各种失败的尝试,他一直在寻找一个合适的编程语言,然后机缘巧合碰到了Chrome V8。

Ryan的同事Brock Whitten对他有这样的评价:

Ryan 是一个充满魅力的程序员,他有一种在程序员中很罕见的能力,可以从不同的角度来看待事物。Ryan会“质疑”各种各样的东西,数据库是怎么实现的?Parser是怎么实现的,Web Server是怎么回事。他总是能提出不同的方法来看待一个问题。

一个有着良好的教育背景,可以自由生活,追随兴趣的程序员,再加上这种Think Different的能力,自然可以做出伟大的创新。Node.js在国内出现,可能就是缺乏这样的土壤吧!