大型服务构建:Node并非最佳选择——Ryan Dahl访谈录

发表时间: 2017-09-06 11:02

Ryan Dahl 是 Google Brain 的软件工程师,Node.js 的创始人。目前他正专注于深度学习研究项目,目前的关注重点主要是图像转换。他为几个广为使用的开源项目做出了巨大贡献,其中包括 HTTP Parser, libuv。

Pramod:你好,这里是 Ryan Dahl,他让我们领会使用同步 IO 是不正确的姿势,并教会我们如何使用纯异步编程模型来构建软件,Ryan 也是 Node 的创始人。 很高兴 Ryan 接受我们的采访。

Ryan:你好! 很高兴来这里。

Pramod: 您作为 Node 的创造者而知名,可以告诉我们你之前的技术经历吗?

Ryan:当然可以。我在圣地亚哥长大,今年 36 岁,当我六岁的时候,妈妈拿到了一台苹果 2C,所以我很早就接触电脑了。随着互联网的出现,我的时代就来了。我去了圣地亚哥的社区学院,然后去了 UCSD,在那里我学习数学。然后我去了罗切斯特大学的数学研究生院。在那里,我研究代数拓扑,这是一个非常抽象的主题。毕业后,我开始攻读博士学位,随后我意识到自己并不想成为数学科学家,于是我就退学去了南美,找到一份做网站的工作。这就是我编程生涯的开始,在一个滑雪板公司做 Ruby on Rails 程序开发。

Pramod:退出数学博士攻读去南美做 Web 开发?这个经历听起来非常有意思!

Ryan:是的。我的意思是你习惯于处理非常抽象的问题,而做网站是一个非常具体的过程。但是我真的试图把它变成一个美丽的数学理论,就像我在研究生学习过程中一样。我真的很喜欢 Ruby,你可以在 Ruby 中更清楚地表达你的想法。我认为 Rails 真的很有趣。它给了一个新的结构,虽然可能不是原创的,我认为 Rails 普及了 MVC 结构。 Ruby 能够清楚的表达我的想法和 MVC 这两件事结合在一起,对我来说真的很有趣。

Pramod:构建 Web 应用程序是非常有意思的事情。而 Ruby 是一个完美的工具。接下来,您继续在德国担任自由职业的 Web 开发人员。您工作的其中一个项目是 Node,我想那时候接下来六到八个月内都在忙这个?

Ryan:对。离开南美以后,我和女朋友一起搬到了德国,因为她是德国人,不得不回到大学继续学业。我开始去参加那里的 Ruby 会议,人们经常会讨论 Rails。其中有个人叫 Chris Neukirchen。他开发了一个名为 Rack 的项目,这是 Web 服务器的简化抽象。它是把一个 Web 服务器变成单一函数接口,你发起一个请求,然后得到一个响应。结合我在 Nginx Module 上做的一些工作,这让我想起过去。在 Nginx 中一切都是异步的。因此当你为其构建模块时,必须非常小心地避免阻塞。我认为 Chris Neukirchen 的脚手架加上 Nginx 的非阻塞 IO,使我开始思考如何将这两个问题结合起来。

Pramod:现在你有结合 Rack 和 Nginx 的想法了。 你是怎么说服自己,花半年时间做出可以在服务器端运行的 JavaScript,这可能会很大程度提高性能?

Ryan:那么这两个简单的 Web 服务器接口就是 Rack,而这个异步部分是 Nginx,我一直在思考这一问题。 Chrome 于 2008 年 12 月发布。随之而来的是 V8 JavaScript 解释器。这是一个很好的运行时。所以,当 V8 出来的时候,我尝试了一下,它看起来真的很有意思。 JavaScript 实际上是单线程的,每个操作都是非阻塞的。人们使用 AJAX 请求和内容时,就已经在执行非阻塞请求了。我想:我认为 JavaScript 加异步 IO 加上一些 HTTP 服务器实际上是一件很酷的事情。而且我对这个想法感到非常兴奋,在接下来的四年里,我一直坚持不懈。

Pramod:是的 JavaScript 加异步 I / O 工作得非常好。我相信开发商正在期待看到一个这样做的框架。在这段时间里,你曾经咨询过别人吗?

Ryan:基本上只是我。有些有编程经验的人给了建议。后来,我最后搬到了旧金山,在 Joyent 工作,并遇到了很多很棒的专业人士。很多人的思想汇聚而成日后的的 Node。

Pramod:自从你在 2009 年左右创建了 Node 之后,我知道 Ryan 这个名字就已经很久了。

Ryan:我觉得至少对我自己来说,在我的生活中,没有比这更伟大的时刻了,真的有时间坐下来好好地工作。我认为 Node 是一个等着发生的想法,如果我没有做,别人会有。但碰巧的是,我失业了有一些空闲时间,可以连续工作几个月。

Pramod:太好了这太妙了。你做得很好, Node 是建立在“纯异步”编程模型的基础上。这个想法如何产生的?

Ryan:是的,我认为这是一个非常有趣的问题。现在已经好几年了,而且自 2012 年或 2013 年以来,我还没为 Node 工作过。当然, Node 已经是一个很大的项目了。所以当它刚出现的时候,我试图说服人们以非阻塞的方式完成一切工作,我们将解决很多编程难题。也许我们可以完全忘记线程,只使用进程和序列化通信。但是在单个进程中,我们可以通过完全异步处理许多请求。当时我非常坚持这个想法,但是在过去的几年里,我认为这可能不是最终目的。特别是当 Go 出来的时候。当我第一次开始听到 Go 的时候,那是 2012 年左右, Go 有一个非常漂亮的运行时,它有 goroutine, goroutine 是真的很容易使用抽象。程序员以为在使用阻塞 IO,而实际上是在执行非阻塞 IO。

而 Go 向用户提供的接口是阻塞的,我认为这是一个更好的编程模型。如果阻塞调用接口,你可以在很多情况下思考你在做什么。如果你有一连串的行动,可以说:做 A,等待回应,也许返回错误。做事 B,等待回应,或者出错。在 Node 中,这更困难,因为你必须跳转到另一个函数调用。

Pramod:是的,我喜欢 Go 的编程模式。使用 goroutines 是非常容易和有趣的。事实上,我们正在工作中使用 Go 构建分布式应用程序。

Ryan:是的,我认为这是某种类型的应用程序,如果你正在构建服务器端程序,我无法想象使用 Go 以外的任何系统。我认为 Node 的非阻塞范式非常适用于没有线程的 JavaScript。而且我认为,回调有很多问题,您必须跳入许多匿名函数才能完成工作。对使用 async 关键字,异步功能的现阶段 JavaScript 来说,这个问题已经缓解很多了。因此一些较新版本的 JavaScript 使得完成工作更容易。我认为 Node 不是构建庞大服务器网络的最佳系统,我一定会用 Go 去做,这基本上是我离开 Node 的原因。实际上, Node 不是最好的服务器端系统。

我认为让 Node 真正发光的是客户端。例如,在建立网站时做一些脚本,捆绑客户端的 JavaScript。你可以在客户端和服务器端使用同样的语言。对一些比较小的服务器功能来说, Node 可能是正确的选择。但是如果你正在构建一个大规模分布式的 DNS 服务器,我不会选择 Node。

Pramod:这应该是全世界所有开发人员的好消息。选择正确的应用工具非常重要。 我们对 Node 没有任何偏见。您在 JsConf 2009 Berlin 中介绍了 Node.js。你惊讶于它突然收到的成功和牵引力吗?

Ryan:是的。我四年来基本上处于惊喜状态。因为它增长非常快,人们非常喜欢它。

Pramod:你加入 Joyant 之后,为 Node 工作,你搬到了 SF 吗?经验怎么样?开发者很喜欢 Node,你是 Node 的中心。

Ryan:这是一生只有一次的经历,我感觉到我是这一切的中心。有一次,我去了日本,人们要求和我拍照,我觉得有点奇怪。在网上,每当我评论一些东西,我会得到很多人回应。所以,我发现我不得不非常仔细地选择我的言论,以及我如何表达自己,因为似乎人们真的在听。而我也不喜欢这样。我是一个程序员,我仅仅想写代码而已,有时分享我的意见,大家不必太在意。

Pramod:我记得你是在 29 或者 30 年纪时候就创造 Node,而 Node 造成如此巨大的影响。

Ryan:是的。我在那时候还是一个新手。

Pramod:好的 Ryan,当时有很多服务器端的 JavaScript 项目。 Node 不是唯一的。你对 Node 的成功归因于什么?

Ryan:对。当时有几个人都在尝试让 JS 运行在服务器端。我完全忘记了他们是什么。问题在于他们都使用阻塞 I / O,然而 JS 根本没有线程。因此,如果您正在使用阻塞 I / O,您根本无法提供请求。如果一次只能提供一件事情,那么 Node 永远不会成功的。我希望使得 HTTP 服务器运行的更加良好。而且我把这些事情做得很好,让人们可以很快的建立网站。老实说,构建 Web 服务器并不是简单的事情。我认为重要的是,当你发布一个软件框架,或者任何种类的软件,需要让人们可以坐下来立即使用。这是 Node 所做的事情之一,就是人们可以立即下载并使用 Web 服务器。

Pramod:如果人们可以轻松下载,安装和使用它,会有很大的不同。此外,人们都知道 JavaScript,他们可以随时开始编码。

Ryan:是的。我们认为在语言之间切换是很容易的事情。我的意思是,即使你会用另一种语言,切换语言也是非常困难的。还有很多人非常熟悉 JavaScript。并且给他们这些工具,以便能够在其他情况下使用它激发人们。你突然能够做到比以前能够做的更多的事情。

Pramod:是的在 2012 年的 Node 已经有一个巨大的开发者基础。你为什么离开,把 Node 的控制权转转交给 Joyent 的 Isaac Schlueter?

Ryan:我认为有两个原因让我做出如此决定。我已经为 Node 工作了四年。已经达到了我想要的地步。我从来不想让 Node 成为一个非常大的 API。我想让它成为一种小而紧凑的核心,人们可以在其上构建模块。还有几个关键的特性,在早期添加了扩展模块,我们已经得到了所有的网络库, HTTP, UDP, TCP,我们可以访问所有的文件系统。然后把它移植到 Windows,而且我们想使用 Windows 抽象来进行异步 IO,即是用 Windows 的 IOCP 接口。这需要重写核心库,其结果是编写了 libuv 库。在那个时候,所有这一切都已经完成了,我们已经在 Windows 上发布了。虽然接下来有很多 BUG 需要修复,但已经有不少人参与其中。而我想去做别的事情,加上 Go 已经出来的事实,我看到 Node 并非服务器端的终极解决方案。当我发表博客时,也不想成为关注的焦点。

Pramod:确实有些人不喜欢成为众人注目的焦点。当您开始在 Node 上工作时,您绝对有一些目标。今天的 Node 是否达到你的期望呢?

Ryan: Node 被这几十万的用户广泛使用,我觉得这绝对超出了我的预期。

Pramod:Ryan 在你与 Node 的精彩旅程之后,你决定从事什么工作?

Ryan:在 Node 之后,我搬到了纽约,花了一些时间来完成自己的项目。当时 Instagram 已经出来,我也忍不住想做同样的事情。我有一个社交网络项目,还有有一个 C++ 的构建系统项目,甚至有另一个 HTML 的构建系统项目。我有一堆项目,其中没有一个是在我心目中淘汰的。我会在某个时候回到这个项目。我这样做了一段时间。然后我我开始听到卷积网络,图像分类,这让我对机器学习真的很感兴趣。

Pramod:你也是 Google Brain 的 Residency 计划的一部分,里面的经历怎么样?

Ryan:是的。我刚刚在山景城度过了一年。回过头来, TensorFlow 已经在两年前发布了。与此同时,他们宣布了 Google Brain Residency 计划,邀请了 20 人来到 Google Brain。我认为这个有想法的并不一定是真正懂机器学习的人,而是在数学和程序设计方面有一些背景,并且对机器学习感兴趣,喜欢这些新想法。因为机器学习正在快速变化,而且还有大量的工作已经完成,现在缩小的神经网络成为机器学习中最有用的算法,加上 TensorFlow,将产生一些有趣的想法。

我花了一年的时间,编写了基本模型,并写了关于这些模型的论文。我主要从事图像转换问题。如果你有一些输入图像,你想得到一些输出图像。例如,您可以将黑白照片作为输入,尝试将照片的颜色预测为输出。这个问题最酷的地方是有无限的训练数据。你可以拍任何彩色照片,然后把它的饱和度调低,就是你的输入图像。机器学习的一个问题就是需要大量的数据,而使用这些方式,这个问题就不是问题了。最近也有很多关于生成模型的工作,也就是输出图像的模型。它们已经表现出了学习自然图像多样性的能力,能够真正理解什么是真实图像,什么不是真实图像,什么看起来像真实图像。我的想法是把这个最近的工作应用在生成模型中,并采取这个无限的训练数据,看看是否可以做一些图像转换问题。因此,我做了一些关于超分辨率的工作(转换低分辨率图像到高分辨率)。这也是一个图像到图像的转换问题。

Pramod:我已经看到, TensorFlow 是许多机器学习问题的一个很好的平台。图像分类和转换,我相信这很有趣。你是否继续专注于 ML?

Ryan:对。我还是在谷歌,作为一名软件工程师,处理同样的问题。研究生成模型,并试图帮助研究人员构建下一代系统和下一代模型。

Pramod:生成模型与之前的 JavaScript, Node 或 Web 开发工作有很大的不同?

Ryan:我想是这样的。我想我有相当不错的数学知识基础。我不想成为一个只做 JavaScript 的人,我也不想只成为一个机器学习研究者。对我来说探索什么是可能的非常有趣。令人兴奋的是建立一些以前从未做过的新事物,它可能在某种程度上造福人类。

Pramod:很高兴知道机器学习需要一个很好的数学背景,在最近的博客关于 Optimistic Nihilism 的话题,你说我们有可能有一天会模仿大脑,并建立一个像人类一样理解和思考的机器,我们距离这个目标还有多远?

Ryan:我必须对一些预言有点小心。我们无法接近人类智慧。我们正在使用的机器学习系统非常简单,它基本还不工作。事实上,我有一篇博客文章,其中列举了开发这些模型的所有困难。我认为那些不在这个领域工作的人有这样的想法:你可以接受这个模型并通过它得到一些数据。但事实并非如此。这些东西都是非常挑剔的,不是很好理解的,它需要很长时间的精心调整和实验才能得到结果。

我认为最近确实出现了一些有希望的技术,也就是说卷积网络似乎起作用了。事实上,这些东西是建立在一个模型的基础上的,这种神经网络模型不是真正的大脑,但是它是由大脑激发出来的,这是非常诱人的。我们有 GPU,我们展示了如何在这些 GPU 上进行训练,并在一定程度上分配加载在 GPU 上的训练。因此,我认为建立更大、更智能的系统的基础正在发生。就我个人而言,我是一个无神论者,我相信除了化学物质和大脑中的神经元外,我脑子里再也没有别的东西了。我们的意识是编码,但是我们还不知如何在神经元之间的相互作用。我不知道哪一天,我们有足够的研究和工作在这个领域可以效仿那种行为。这太远了,无法预测会有多长时间。

Pramod:你想在未来 20 年看到什么新科技?

Ryan:我对机器学习和它带来的可能性感到非常兴奋。我认为这种技术有很多应用。基本上,任何一个可以帮助你的系统,都将从这项技术中获益匪浅。有不可数的工业流程可以从这种事情中受益。有很多很多系统可以从简单的机器学习系统中受益。而且我认为我们将越来越多地看到这些系统应用于不同的领域。所以我认为这会大大影响科技界。

Pramod:是机器学习是非常令人兴奋的。当我在山景城看到自动驾驶车时,我感到非常兴奋。谢谢 Ryan,为我们带来了漂亮的 Node,感谢您的参与访谈。也祝你未来的项目成功。

Ryan:是的,它非常酷,感谢邀请我出席访谈。

Pramod:谢谢。我真的很喜欢和 Ryan 聊天,一个非常谦逊及厉害的人物,在非常年轻时候就在技术上取得了很大的成就,这样一个鼓舞人心的故事。

英文原文:
https://www.mappingthejourney.com/single-post/2017/08/31/episode-8-interview-with-ryan-dahl-creator-of-nodejs/

本文作者 Pramod HS,由 Jesse 翻译,转载译文请注明出处,技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。