访谈Node.js之创建者 Ryan Dahl
21CTO社区导读:
各位朋友新年好!今天是除夕,明天就是春节了,社区祝您新春吉祥、阖家欢乐,狗年大吉,人旺财旺天天旺!
今天这篇文章来自mappingthejourney与Node的创建者Ryan的访谈录。
Ryan Dahl 作为一名软件工程师,目前在Google Brain(Google大脑)工作。主要负责在Chrome的V8引擎上构建应用,他是JavaScript服务器运行环境Node.js的创始人。
Ryan目前正在对深度学习项目进行深入研究,主要方向为色采与超高分辨率视频到图片的转换。
Ryan目前还为多个开源项目做出颇多贡献,包括HTTP Parser,libuv等。
Pramod:各位好,欢迎光临本次播客。当我们听到Node.js时,就会想到Ryan Dahl。他指出我们正在使用的I/O工作是错误的,告诉我们如何使用纯异步编程模型开发软件。今天的嘉宾是RyanDahl,是一名黑客、程序员大牛,是Node.js的创建者。很高兴也很荣幸请到Ryan来参加我们的节目。
Ryan:您好!很高兴来到这儿。
Pramod:Ryan,我们知道你是Node的创建者,能和我们说说在从事技术之前的生活吗?
Ryan:当然。我在圣地亚哥长大,我六岁时,妈妈送给我一台Apple机,我想那应该是一台很早期的电脑了。顺便说一句,我今年36岁。
所以,互联网刚出来时,我已经成年了,所以我是伴着互联网长大的。我先在圣地亚哥的社区大学,之后又去了加州大学圣地亚哥分校,学习数学专业。之后,我又了罗彻斯特大学的数学研究生学院。
我在学校学习线性拓扑学,这是一门非常抽象的课程,我感到很无聊,似乎它并不短适用于现实生活。这几年我才意识到这门课程非常棒。在读博期间,我突然发现自己不想当个数学家,于是放弃此计划。接着我买了一张去南美的单程票,在那里呆了一年。从那时开始,我开启了饥饿学习模式,并且找到一份开发网站的工作,与一个叫Eric的人协同工作。
这是我编程生涯的启萌,为一个滑雪板公司用Ruby onRails开发网站。
Pramod:很好!放弃博士学位,前往南美成为一名Web开发工程师。
Ryan:对。在研究生院时,你会惯常处理非常抽象的问题,做网站开发则是一个非常具体的过程。我试着把这个过程变成一个美好的数学理论,就像我在研究生接触的那样。我想我更喜欢Ruby开发,就像在Buby中清晰表达自己的想法,那时非常有趣。我认为Rails在这方面令人印象深刻,它给了我们新的结构 ,也有可能不是新的,但我认为Rails普及了MVC的结构。我对把两件事结合在一起非常感兴趣。
Promod:是的。构建网站非常有意思,Ruby是个非常棒的工具。接下来,你又到德国做一个SoHo职业者。其中一项就是创建了Node.js。我想问你在接下来的六到八个月时间一直在做这项工作吗?
Ryan:对。所以到南美后,我和女朋友一起搬到了德国,她是德国人,不得不重返大学。于是我去那儿的Ruby会议,那里的人们正在讨论MVC的新案例。如果我发音正确的,那里有位名叫Chris Neukirchen的人。他开发了一个名叫Rack的项目,它是一个简化抽象的Web服务器,转换成为一个单一界面,当有请求到来,然后返回响应信息。
结合我做的Engineyard的Nginx模块,这让我想起了如何……让我退一步。在Nginx中,一切都是异步的。因此,当你为Nginx开发模块时必须要非常小心,要保证它是非阻塞的。于是,我想把ChrisNeukirchen的rack与Nginx使用非阻塞IO架构方法的Web服务器结合在一起。
Promod:现在你有了Rack和Nginx结合的想法。你是怎样说服自己用未来6个月的时间开发可以在服务器端运行JavaScript的框架,这会对性能提升很多吗?
Ryan:对,那个简单的服务器界面是Rack,另一个是我想要的Nginx异步部分。08年12月Chrome发布了,随之而来是V8 JavaScript解释器。哦不对是口误,它不是解释器,它是一个很棒的运行环境。所以,V8出来的时候我就开始研究,它看起来迷人而干净,而且速度非常快。我突然想到,JavaScript是单线程的,已经实现了非阻塞。
就像浏览器中的网页一样,当人们发出Ajax请求内容时,他们就已经做出了非阻塞请求。我想:哇!我想JavaScript加异步IO加上一些HTTP服务器是一件很酷的事。我为这个想法感到非常兴奋,于是我在后面的四年中不停地为之努力。
Pramod:是的,JavaScript加异步I/O工作得很好。我相信开发者都在期待这样的框架。我很好奇,在那段时间里,在当时你有导师或者能够相互讨论的人吗?还是只有你一个人?
Ryan:只有我自己。我有一些编程的朋友提供了建议,当然……我的意思是,第一部分开发只是在我自己的房里。后来,我搬到了旧金山,在Joyent工作,在那遇到了很多非常优秀的技术专家。从那时开始,很多人提供指导并给出了对Node.js有非常大贡献的想法。
Pramod:真好。您再带我们讲一下开发Node的心路历程吧。我知道从2009年知道Node开始,开发经历了很久。
Ryan:对于我自己来讲,在我的生活里,没有比喜欢并坚定信念更好的事情了。并且我有时间坐下来努力。我认为Node是一个等待发生但还没有做到的想法,别人或许也能做到。突然间我对相对失业但有了自己的空闲时间,然后不停的工作几个月,而正是开发DEMO产品所需要的。这个非常棒,也非常有趣。
Pramod:太好了。这太奇妙了,你确实做得非常棒。Node建立在“纯异步”编程模型的基础上,你是怎么为Node想到这个点子的?
Ryan:是的,我认为这是一个非常有趣的问题。现在已经过去好几年了,从2012年或2013年开始,我就没有再进行Node开发了。现在来看,Node已经成了一个大项目。当初实现Node之后,我还到处游说人们使用Node.js。或者我们处理I/O方式有错,或许我们以非阻塞的方式实现所有事情后将会解决编程中遇到的很多问题,比如我们可以完全忘记线程,只使用过程抽象和序列化通信。但是在一个过程中,我们可以通过完全异步来处理很多请求。我当时坚信这个想法。但在过去的几年里,我认为这可能并不是编程的最终和全部想法,特别是当Go出现的时候。
我认为Go很早就出现了,但是我第一次听说Go是在2012年。它有一个非常漂亮的运行环境,它有一个非常好的运行环境,具有合适的绿色线程和易于使用的抽象。我认为Go和操作系统的接口都是绿色线程,我认为那完全是非阻塞式I/O。
但是它们呈现给用户的接口是阻塞的,我认为这是一个更好的编程模型。如果阻塞的话,你可以更轻松的考虑大多数情况需要做的工作。你知道,如果有非常多的后续动作,这样做是很好的;做A,等一个响应或者一个错误;做B,等待一个响应,出错。在Node中这更难,因为必须跳转到另一个函数调用中。
Promod:是的,我非常喜欢Go的编程模型。使用goroutines非常简单有趣。实际上我也正用它来构建分布式应用程序。
Ryan:是的,我认为这是......针对特定类别的应用,这就像是,我们要搭建一个服务器,我无法想象除了Go以外还能用其它什么。也就是说,我认为Node的非阻塞编程在JavaScript没有线程的情况下很好用。 我认为很多类似回调的问题,必须跳转许多匿名函数才能完成正在做的事情。现在在JavaScript中用async关键字,异步功能得够到根本改善。
所以,在更新版本的JavaScript中,这更加容易实现。也就是说,我认为Node并不是构建大型服务器Web的最佳系统。我会用Go来构建大型网站服务器。说实话,这就是我离开Node的原因。我意识到:哦,实际上这不是有史以来最好的服务器端系统。
是的,我认为Node在客户端发生了巨大变化,可以实现构建网站时开发一些脚本,例如打包客户端JS脚本Browserify。你可以实现所有客户端JS的服务器端处,你知道,一些小型Web服务器......可能是开发服务器,也可能是实时事务的服务器。 Node或许可用,可能它也是个正确的选择。但是如果你正要构建一个大规模分布式的中心服务器集群,我不会选择Node。
Pramod :这对全世界所有开发者来说应该是一个很好的选项,为应用选择合适的工很重要。你完全没有偏向Node。 您2009年JsConf 中介绍了Node.js。你对突然获得的成功和拥簇是什么感受?
Ryan:是的。基本上四年来我一直处于惊喜之中。 因为它发展得非常快,人们非常喜欢它。
Pramod:接下来你加入了Joyant,并且全职从事Node工作,后来你转而选择了SF? 经验如何? 开发人员很喜欢它,而你是这一切的中心。
Ryan:这是我一生,感觉自己处于所有的中心,在会议和其他事情的中心的体验。有一次我去了日本,有人要求和我一起拍照,然后我意识到......我不知道; 我对此感到有点不太喜欢。在线上,每当我评论某件事情时,都会得到100多个人的回复。
所以,我发现我必须非常谨慎选择用语,以及如何表达自己的想法,因为人们似乎都在倾听,这种感觉很奇怪。我不太喜欢这种感觉。我说的意思是,我是一名程序员,我喜欢写代码,有时我会分享我的观点,但有时候是在没有仔细考虑时发表的个人观点。 所以,我觉得我不是一个什么大牛......是的。 我不太喜欢这种感受。
Pramod :当你失出Node时,你的年龄是29?30岁?但是Node已经产生了如此巨大影响。
Ryan: 是的。 我的意思是,我绝对是个新手开发者。
Pramod:好的,Ryan。原来会有很多服务器端JavaScript项目出现。 Node并不是唯一的。 你认为Node的成功原因是什么?
Ryan:对。 所以有一些人试图让JavaScript 运行在服务器端。 我现在列不出,我忘了它们的名字。
问题的原因,人们都在使用阻塞式I/O,并且因为没有线程,这无法与JavaScript结构相关联。 所以,如果你在使用阻塞式I/O,实际上是无法处理请求的。一次只能处理一件,而这一切都不会生效。 加上我偏爱的原因,想让HTTP服务器运行地好。
所以,我有一个DEMO可以...我有一个HTTP服务器(一个原始的TCP服务器)。我让这些工作运转良好,这样人们就可以坐着就能建立一个网站,而不用花太多的力气。
说实话,构建Web服务器并不是简单的事,我认为很多系统应该留给社区来做,没有人做到这一点,因为没有什么可以用的系统。我认为,当你发布一个软件框架或者任何软件时,你有一个可以让人坐下来立即使用是很重要的。这是Node要做的事情之一; 人们可以直接下载并使用Web服务器。
Pramod :是的。 好的demo,人们可以容易下载,安装和使用。 此外,人们都知道JavaScript,可以立即开始编码。当我开始研究Node时,因为我很熟悉JavaScript,所以它更易用。
Pramod:是的。 我认为我们理所当然认为在语言之间切换是多么容易。我的意思是,即使你知道另一种语言,但要做到这一点非常困难。 因为很多人都非常熟悉JavaScript。 为他们提供能够使用的工具,能够在其他环境中激发人们的兴趣,你会发现可以做的比以前更多。
Pramod : 是的。 在2012年,Node就已经了有庞大的开发者基础。 你为什么离开,把它交给Joyent的Isaac Schlueter?
Ryan:是的,我认为这是几件事儿的结合。我认为最重要的是,在那时,我在Node开发了四年,已经达到我的愿望。 我从来不希望Node成为一个庞大的API,我希望它成为这种小巧紧凑的内核,人们可以在它上面构建模块。
还有一些主要的事情,我想能够支持的关键功能。 所以,扩展发现模块很早就被添加了; 我们实现了所有的网络库,HTTP,UDP,TCP,我们可以访问所有的文件系统。
然后,一个大块内容,差不多是五人一年的工作时间,需要将它放到Windows上并正确运行。我们希望将Windows抽象用于异步I/O。 因此,这需要重写核心库,最后做出来结果是libuv库。
是的,但是在某个时候,所有这些都完成了,我们也在Windows上发布了版本。而且你知道,它们运行也很良好。 我的意思是,这是我本来打算实现的,我很高兴我有机会实现它。 当然,你知道,在我的余生中会有无数的错误来修复,但是......你看,有足够多的人们参与到这个过程。 我没有必要这么做,而且我希望做其他事情。 所以再加上Go发布的事实,而且我认为Node并不是服务器的最终解决方案。 而且,当我发表博客时,也不想成为关注的焦点。
Pramod : 很好。 是的,有些人并不喜欢成为众人焦点。当你开始开发Node时,你肯定有一些目标。 Node.js今天已经实现了这些目标吗?
Ryan : 我的意思是......Node被成千上万的人使用,如果不是数百万人使用的话,我认为它肯定超出了我对它的期望。 是的,这很酷。
Pramod : 在你完成Node的美妙之旅之后,你决定做此什么呢?
Ryan:在Node之后,我搬了......在离开Joyent并停止参与Node项目后,我搬到了纽约,花了一些时间去开展我的另外项目。我有很多项目。 你知道那时Instagram已经上线了,但是它很新的而且看起来很简单、每个人都在说:哇,这很简单,我可以开发这样的项目。我忍不住也想着同样的事情。 所以,我有一个社交网络项目; 我有一个用于C++构建系统项目,还有一个用于HTML的编译系统项目,就像Browserify,它可以打包你的JavaScript和HTML,但是以一种智能的方式执行。
是的,我有一堆项目,其中没有一个项目让我心动。 我认为可以推迟其中的一些项目,比如社交网络项目,在某些时候回头再处理。是的,我这样做了一段时间。 然后我开始阅读关于......我开始阅读关于卷积网络和图像分类的内容,这些让我对机器学习感到很大兴趣。
Pramod :你也是Google Brain's Residency项目的一部分。 那是怎么回事?
瑞恩:是的,我在山景城呆了一年。 便是迟了一步,TensorFlow两年前发布了。
随之而来,他们宣布了这个Google Brain见习项目,他们邀请20人来Google谷歌Brain,Google Brain是机器学习研究实验室之一。 人们......我认为实验室的观点并不一定是那些研究机器学习的人,有一定的数学和编程背景的人,并且对机器学习感兴趣,喜欢,想利用AI实现这些新想法。 因为机器学习变化很快,而且在Google Brain已经完成了大量的核心工作。
现在社区已经将神经网络缩小到为最有用的机器学习算法了,它可能只需要一群人实现神经网络,而这个新的ML框架就是TensorFlow,这会引发一些更有趣的想法。我在此花了一年的时间,基本上编写模型和这些模型的文件。我主要做图像的转换问题。所以,你知道,如果你有一些图像输入,你想预测一些输出的图像。 我觉得这个问题很有趣,让我举一些例子。
比如着色问题。 您可以将拍摄的黑白照片作为输入,您可以尝试预测和渲染图片的颜色作为输出。这个问题最酷的是有无限的训练数据。您也可以拍摄任何彩色照片并去饱和色彩,然后它就成了您的输入图片,对吗?
因此,机器学习的问题之一就是需要大量的数据。但对于这种类型的任务,这个就不是问题了。 最近也出现了大量生成模型的工作,即输出图像的模型。特别是有了生成对抗性网络和像素CNN,它们已经展示了能够学习自然图像多样性的能力,就好像真的理解什么是真实图像,什么不是实际图像,看起来真实图片像什么。
所以我的想法是在生成模型中采取这些最新模型,并采取这个无限的训练数据,看看我们是否可以做一些图像转换问题。所以,我在超分辨率方面做了一些工作,这种方法用于将低分辨率提高到高分辨率图片。 这也是一个图像转换问题。 现在我已经完成了两个着色项目。
Pramod:特别完美的解释,Ryan。是的,我认为TensorFlow已经成为许多机器学习问题的好平台。我不是很了解图像分类,转换,但我相信这一定很吸引大家的兴趣。 你是否还会继续机器学习的工作?
Ryan:对。 所以现在,我仍然在Google,作为一名软件工程师,从事同样的工作。 研究生成模型并试图帮助研发人员构建下一代系统与模型。
Pramod:生成好的模型与你以前的JavaScript,Node或Web开发工作差别很大。
Ryan: 很好的问题,我想是的。 我是从数学开始的,所以机器学习要有一个相当不错的数学知识基础。我认为人们喜欢将别人固定到某些区域,但我并不想那样做。我不想成为一个JavaScript专家,我也不想成为机器学习的专家。 你知道,我认为人们探索的可能性才更有趣。令人兴奋的是,做一些新的、未曾做过的事情,会以某种方式使人类受益。
Pramod : 很好。是的,很高兴知道机器学习需要良好的数学基础。在你最近的一篇关于乐观虚无主义的博客中,你说我们有朝一日能够模拟大脑,并建立一个能像人类一样理解和思考的机器。我们离实现这个目标有多远?
Ryan:是的。我必须小心谨慎说这些话......我的意思是,这是我的个人观点。 我们开发的东西远远不及人类智慧。我的意思是,我们使用的机器学习系统非常非常简单,根本不会工作。事实上,我有一篇关于见习的文章,其中列举了开发这些模型时遇到的所有困难。我认为那些不从事这类工作的人可能有这样的想法,你可以采取这类模型,并给它推送一些数据,它就能工作了。但事实远非如此,这些模型都非常挑剔,并且还没有得到很好的理解,要需要多个月的精心调校和实验才能获得最合适的推荐结果。
所以,我们远没有接近人工智能,但是我认为基础......最近有一些有希望的技术得到了改进,卷积网络似乎起了些作用,并且propagation也起了效用。事实上,这些东西都建立在模型之上的,这种神经网络模型并不能像大脑那样,但大脑以某种方式启发它,这是非常吸引人的。我们也有GPU,我们展示了如何在这些方面进行训练,并在一定程度上跨GPU分配训练。所以,我认为......建立更大,更智能的系统的基础正在出现。 对个人而言,我是一个无神论者,我相信除了化学物质和神经元,我的大脑中除了脑子别无二物。我认为意识里,我们所有的意识都在某种方式上被编码在这些神经元之间的相互作用中。
因此,我不知道我们哪一天有足够的研究和实践来模仿这种行为,现在预测会有多长时间还很遥远。
Pramod:太好了。你已经看到了这一切,你认为在未来20年内技术将在哪些领域发展?
Ryan:我对机器学习及其带来的可能性感到非常激动。我认为,在我们得到真正的人工智能之前,这种技术会有很多应用。例如可佩戴智能眼镜系统会帮助个人,很多行业将从这项技术中受益。比如通过人工智能的视觉技术建立分拣回收、排序的回收中心。 我的意思是,有许多许多系统都可以从简单的机器学习系统中受益。
我认为我们将越来越多地看到这些系统,适用于不同的流程和行业。因此,我认为这会对科技行业产生重大影响,对人类的影响也会很大。
Pramo:没错。机器学习令人兴奋。 我在山景城看到自动驾驶汽车时,非常兴奋。有一天,我想坐下来,把控制权完全给汽车。
感谢Ryan,为我们提供了如此精彩的Node框架,非常感谢Ryan参加我们的访谈。 祝你的未来项目会更好,祝你好运。与你谈话的感觉特别棒。
Ryan:是的,非常棒。 感谢你邀请我,谈论这些话题非常有趣,很高兴能和大家一起分享。
Pramod:谢谢! 今天的内容就到这里。我真的很喜欢和Ryan这样一个谦逊而优秀的人聊天。 他多年前就在科技领域取得了如此大的成就,期待 Ryan 更好的明天。这是一个非常难忘的励志故事!
21CTO社区综合编译