翻译一篇 Node.js 作者 Ryan Dahl 的访谈。

原文链接

第一次做翻译,大部分都是根据自己的理解去翻译,有些词语是现查,有些是真的不知道怎么翻译,所以看起来像是机翻。

翻译正文:

Ryan Dahl 是一个在 Google Brain 工作的软件工程师。他在 Chrome 的 V8 JavaScript 引擎的基础上创造了 JavaScript 运行时,Node.js。最近,他在深层学习研究项目工作。他的工作重点主要是图像到图像的转换,例如着色和超分辨率。他曾经给多个开源项目做过贡献,包括 HTTP Parser,libuv。

Pramod: 大家好好,欢迎来到 mapping the journey。当我们谈论 Node.js 的时候,其实是在谈论 Ryan Dahl。他向我们展示了我们在使用的 I/O 是完全地错误,以及告诉我们如何使用纯粹的异步编程模型去开发软件。今天的嘉宾就是 Ryan Dahl 本人,他是黑客,出色的程序员以及 Node 的作者。能请到你来到我的节目让我非常兴奋以及荣幸。欢迎 Ryan。

Ryan:Hello!来到这里感觉非常好。

Pramod:Ryan 我们知道你是 Node 的作者,跟我们谈论一下你做技术之前的生活吧?

Ryan:当然可以。我在圣地亚哥长大;在我六岁的时候我的母亲得到了一台 Apple 2C,所以我觉得我很早就接触到了计算机。顺便说一句我现在 36 岁。我成长的时候正是互联网兴起的时候。我就读于圣地亚哥的社区大学,后来去了圣地亚哥的加利福尼亚大学,我在那里学习数学。再后来,我去了罗切斯特大学的数学研究生院。

没错,我在那里学习代数拓扑,这可是一个非常抽象的学科,那几年以来我发现这些学科都非常美好,但是我后来觉得无聊,因为这看起来,对于真实的生活来说不太适用。研究生毕业之后,按照流程,那就应该到了博士项目。但是突然有一次我意识到我不希望我在我的余生成为一名数学家,我退学了。然后买了一张去南美的单程票,并在那里度过了一年,在那里我开启了饥饿的学生模式,我找到了一份做网站的工作,并且和这位 Eric 共事。在那家滑雪板公司使用 Ruby on Rails 制作网站,可能就是我编程生涯的开始,

Pramod:Nice!从博士项目中退学,再到旅行到南美,并在南美成为一名 Web 开发者,其中一定有很多故事。

Ryan:是的。在研究生院,我需要处理一些非常抽象的问题,做网站则是非常具体的过程。当时我也试着将其变成一个美丽的数学理论,就像我在读研究生那样。我觉得我喜欢 Ruby 的开发方式,在 Ruby 上,我可以更明确地实现我的想法。那非常有趣。我发现 Rails 在这方面让人印象深刻。它提供了新的结构,新的能力,可能真实意义上它并不新,但是我认为 Rails 使得模型视图控制器结构变得流行起来。如你知道的那样,那两样东西合并起来,确实让我非常着迷。

Pramod:是的,开发 web 应用是非常有趣的,而且 Ruby 是一个非常完美的工具。接下来,你继续在德国成为了一名自由 web 开发者。其中你有一个项目就是 Node。我猜你开发 Node 是否持续了大概 6 到 8 个月?

Ryan:是的。在南美之后,我和我的女朋友搬到了德国,因为她是德国人,她必须回德国读大学。我开始参加那里的 Ruby 大会,和大会上的人们讨论模型视图控制器的新范例。其中有一个人叫 Chris Neukirchen,如果我的发音正确的话。他开发一个项目叫做 Rack,这是一个简单的 web 服务器抽象。这个项目使得 web server 变成一个单一功能的接口,你可以发起一个请求,并且会得到一个响应。

结合我作为自由职业者时为 Engineyard 做的一些 Nginx 模块的工作,让我开始思考…稍等让我思考一下。在 Nginx 中,所有的一切都是异步的。所以如果在 Nginx 上开发模块,你必须非常细致地使用非阻塞。当然,我觉得综合 Chris Neukirchen 的 Rack 以及 Nginx 的 web 服务器非异步 I/O 架构,让我开始思考如何将这两个东西结合起来。

Pramod:现在你有了关于 Rack 和 Nginx 的一些想法。你是怎么说服自己,花接下来的六个月的时间,构建一个可以在服务器端运行 JavaScript 的框架,而这个框架可以大幅度地提高性能?

Ryan:我一直在思考的可以简化 web 服务器接口的两个方面,一个是 Rack,一个是异步部分,也就是 Nginx。Chrome 在 2008 年 12 月发行。伴随其一起发行的还有 V8 JavaScript 编译器。不应该说是编译器,应该说是一个运行时。所以,当 V8 出来时,我就开始研究它,它看上去非常迷人和清爽、快速,突然间我明白了:oh!JavaScript 单线程的,而且所有人都已经在非阻塞模式下工作。

我用我的手指在空中加引号,但是,就像在浏览器中,大家在做 AJAX 请求或者其他东西时已经在使用非阻塞请求。然后我在想,oh,WOW!我觉得 JavaScript 加上异步 IO 加上一些 HTTP 服务器的东西之后会变成很酷的东西。我对这个想法感到非常兴奋,于是我在接下来的四年时间里都在围绕这想法去工作。

Pramod:是的,JavaScript 加上异步 I/O 一起工作是非常好的,我相信开发者们一直都在等待做这个事情的框架。我仅仅是好奇,在你开发这个框架的时候,你是否有导师或者是否有搭档?还是说仅仅只有你自己?

Ryan:只有我自己。我有一些同样是做编程的朋友给我一些建议,这是当然的。刚开始的时候只有我自己在我的房间。但是后来,我搬到旧金山在 Joyent 工作之后,我遇到了很多专业的程序员。在那之后,很多人为 Node 贡献了很多想法。

Pramod:让我们再回到你开发 Node 时候的旅程。你在 2009 年创造 Node 的时候花了很长的时间。

Ryan:我觉得,至少对于我自己来说,这是一个在我生命中最好的时刻,我拥有一个我相信并且喜欢的想法,并且有时间坐下来好好研究它。

而且我认为 Node 是一个即使不是我来完成也会有其他人来完成的想法。我只是刚好没有找工作并且有一些自由的时间,可以不停顿地为此工作几个月,而那是一个初始版本的产品必须的要求。这非常帅,很有趣。

Pramod:太好了。那非常有趣。你做的很好。Node 是基于 “完全的异步” 编程模型的想法创造出来的。在 Node 之外,又是如何实现这个想法的?

Ryan:是的,我觉得那是一个很有趣的问题。目前为止那已经过去了几年时间,我曾经独自开发 Node 直到 2012 还是 2013。到现在 Node 也成为了一个大项目。所以,我觉得…当它问世的时候,我尝试到处去说服人们,我们正在做的 I/O 的方式是否是错的,以及我们是否可以用非阻塞的方式去做事情,这样子我们可以解决很多的编程上的困难。例如,我们或许可以完全忘掉线程,只使用进城抽象和串行通讯。但是在一个单进程中,我们可以通过完全的异步处理很多很多的请求。我深信这个这个理念,但是最近几年,我认为那可能不是编程的最好的概念,尤其是 Go 出现了之后。

我觉得 Go 问世了很长一段时间,但是我第一次听说 Go 大概是在 2012 年。他们有一个非常好的拥有正确的绿色线程(译者注:原句是 proper green threads)的运行时,以及容易使用的抽象层。他也是使用阻塞 I/O,加引号的阻塞 I/O,因为那是在绿色线程的接口中……在 Go 和操作系统之间,我认为那是完全的非阻塞 I/O。

但是他们提供给用户的接口是阻塞的,而我觉得那是一个更好的编程模型。你可以思考你正在做的东西如果是阻塞的话是否有更简单的解决方法。你知道,如果你有
很多事情要做,如果可以这样做会更好:做 A 事情,等待反馈,或许发生了错误。做 B 事情,等待反馈,发生错误。如果在 Node 中,那会更难,因为你必须跳转到另一个函数调用中。

Pramod:是的,我喜欢 Go 的编程模型。使用 goroutines 是如此的简单和有趣。事实上,我们在工作中正在使用它构建分布式的应用。

Ryan:是的,我认为这是一个典型的应用,就像是说,如果你正在开发一个服务器,我无法想象不使用 Go 是怎么样的。意思是,我认为 Node 的非阻塞的例子在 JavasCript 上非常好用,那样的话你没有线程的概念。而且我觉得你必须跳转到异步函数中去完成你要做的事情引起的回调地狱问题(译者注:原文 call-back soup problem),使用 async 关键字,这种最近正在减少,现在 JavaScript 也有异步特性。

所以,新版本的 JavaScript 做起异步来更加简单。所以说,我认为 Node 不是建造大型 web 服务器的最好的系统。我会用 Go 去实现它,这就是我离开 Node 的理由。我意识到:oh,确实,这已经不是最好的服务器端系统了。

Yeah,我觉得 Node 在客户端很优秀,很怪异,使用脚本构建网页,浏览器化,一些打包后的 JavaScript。你可以在服务器端拥有所有的这些客户端的 JavaScript。然后,你知道的,或许小型的服务器…或许到处都有的小型的开发用服务器,或许一些真实的服务器提供真实流量。Node 可以很管用,或者说它是很正确的选择。但是如果你在构建一个大型分布式 DNS 服务器,我不会选择 Node。

Pramod:对于全世界的所有开发人员来说,这都是一个很好的选择。选择一个正确的工具对于一个应用是如此的重要。你对 Node 完全没有偏见,你在柏林的 JsConf 2009 上向全世界介绍了 Node.js,对于它的成功以及它很快地被人接受你是否感觉惊喜?

Ryan:是的。我的惊喜状态基本持续了四年。因为它成长得很快,以及人们都很喜欢它,所以,就是这样。

Pramod:所以你加入了 Joyant 并且在那里全职开发 Node 然后你再跳槽到 SF 是吧?这个经历是怎么样的?开发者们都很热爱它并且你是它的核心。

Ryan:确实是,这是生命中一个很好的经历,而且我感觉完全的在 Node 开发的中心,参加各种会议之类的。有一次,我去到日本,那里的人们找我一起合影,我突然意识到…我也不知道怎么的;我觉得有点奇怪。在线上也是,那个时候,我无论任何时候对某些东西作出评论,我都会收获来自人们 Like,100 个反馈。

所以,我发现我必须非常小心地选择我的词语和表达自己,因为看上去好像很多人在听,这让我觉得很陌生。我不喜欢这些方面。我的意思是,我是一个程序员,我希望写代码以及有些时候分享我的观点而不需要对这些观点关心太多。所以,我觉得我不是那种…对,我非常不喜欢这些方面的事情。

Pramod:你在 29 还是 30 左右的时候开发了 Node?并且 Node 获得了如此大的影响。

Ryan:是的,我觉得,我那时候完全就是一个新手开发者。

Pramod:OK。Ryan,同时期的有这么多服务器端 JavaScript 项目。Node 不是唯一的一个。你把 Node 的成功归功于什么?

Ryan:好的。确实有很多人尝试开发服务器端运行 JavaScript 的东西。我甚至不能够一个个说出他们的名字,而且我已经忘记了他们是谁。不过无所谓了。

原因是他们都使用阻塞的 I/O,但那些与 JavaScript 的结构不一致,因为它是没有线程的。以及,如果你使用阻塞的 I/O,你理论上是不能满足请求的任务。比如,如果你正在做一个那样的东西,那是绝对行不通的。我希望 HTTP 服务器可以很好地工作。所以我做了 demo…我有一个 HTTP 服务器和一个原始 TCP 服务器。我做的这两个东西能良好工作所以开发者可以坐下来建造站点而不需要处理那么多的麻烦事。

而且,事实上建造一个 web 服务器不是一件容易的事,我觉得这些服务器的开发者有点偏向于让他们的社区去建造服务器,从而没人去做这些事情。因为没有什么可以与这些系统一起使用。我认为最重要的是当你作出一个软件框架,或者什么其他软件,并且你有一个 demo,大家坐下来马上就可以使用。那就是使用 Node 的最好的一个方面;人们可以在下载好服务器之后马上就使用。

Pramod:这个 demo 很不错,大家在下载、安装之后可以很简单地去使用将会有很大的好处。大家都知道 JavaScript,他们可以马上开始写 JavaScript 代码。当我开始在 node 上工作的时候,就像我了解中的 JavaScript 那么简单。

Ryan:是的。我认为我们在切换语言时是轻而易举的,即使你懂得其他比较难的语言。并且有很多人对于 JavaScript 很熟悉了。我们给予他们这些工具去使用,让他们感觉到兴趣。你突然之间就可以做更多你以前做不到的事情。

Pramod:是的。在 2012 年 node 已经拥有了一个很大的开发者群体。你为什么离开 Node,并且把 Node 留给了 Joyent 的 Isasc Schlueter?

Ryan:是的。我觉得这个原因由很多方面组成。主要原因是在那个时候,我在 Node 的工作上已经花费了四年时间。我想做一些我想做的事情。我从来没有希望 Node 成为一个有很多 API 的东西。我希望它成为一个小型的、紧凑的核心,大家可以在它之上创建模块。

另外还有一个主要原因是…增加核心功能的支持。扩展模块很早已经加入进去了,我们让所有的网络库都能够很好地运行,HTTP,UDP,TCP,我们可以接入到所有的文件系统中。

另外,或许也是一个大原因,那就是需要与五个人用大概一年的时间把 Node 运行在 Windows 变成可能。当时我们希望使用 Windows 的异步 I/O 抽象层,那是他们的 I/O 端口。但是那需要重写我们的核心库,结果就使用了 libuv 库。

在某种程度上,那些事情都做好了,我们在 Windows 发布了。那就好像是:好的,这就是我打算去创造的东西,我很高兴能够跟着它一起走过来。当然,还有数不清的 bug 等着我去修复,但是,有足够的人涉及其中。我没有必要去做这些事情,我可以去做别的事情。加上 Go 面世了,我不认为 Node 会成为服务器端一个很好的解决方案。而且,我不再希望当我在网上发表什么的时候就变成人们的注意力中心。

Pramod:好的,确实有些人不希望自己成为聚光灯。当你开始开发 Node 的时候,你有很多目标。今天的 Node.js 与当时相比有什么不一样?

Ryan:我觉得…Node 在这个时候被成千上万的人在使用,我认为这确实超出了我当初所期待的范围,这很酷。

Pramod:Ryan,在你结束了精彩的 Node 之旅之后,你有什么决定要去做的?

Ryan:退出了 Node 的开发之后,我离开了 Joyent,退出了 Node 项目。我搬到了纽约,

抽出一些时间到我的别的项目上,因为我有很多项目。你知道的,在那个时候 Instagram 出现了,那是新的东西,看起来非常简约,所有人都在说:哇,那真的很简约,我也可以做出来。我也是这样认为的。所以,我有一个社交网络项目;我有一个 C++ 构建系统项目,我还有一个构建 HTML 的项目,那看上去就像是 Browserify,它可以打包你的 Javascript 和 HTML,但是用一种更加聪明的方式。

是的我有很多的项目,没有一个已经发表出来,真的,都在我的脑袋中。虽然我认为它们之中有一些还处于刚开始的阶段,就像我即将要重新回归的社交网络项目。我在它们身上花了一些时间,我也开始阅读一些…我开始听到一些关于卷积网络以及如何解决分类图片问题的消息,这些消息让我对机器学习产生了兴趣。

Pramod:同时你也是谷歌大脑的保留计划项目的一员。在其中你有什么体验?

Ryan:是的。我刚刚在山景城度过了一年。截止目前 TensorFlow 也发布了有两年的时间。

在这之后,他们宣布成立谷歌大脑的保留计划项目,他们邀请 20 个人去到谷歌大脑,这是谷歌机器学习研究的实验室之一。我觉得他们的想法是来这里的人不一定必须学习过机器学习,但是有一定的数学和编程背景,并且对机器学习有兴趣,来这里之后可以一起工作,产生各种想法。因为机器学习变化得非常快,并且已经完成了大部分的工作。

目前社区认定了了神经网络作为机器学习的的做好用的算法,那将会把很多人带入进来,并且这个机器学习框架,叫做 TensorFlow,可以实现一些很有趣的想法。所以,我花了一年时间,基本是编写模块以及写关于那些模块的论文。我研究了很多图像到图像转换的问题。所以,你也知道,你有一些图像用于输入以及你希望输出一些你所期望的图像。我发现这个问题很有趣,比如…让我举一些例子。

说到着色问题。你可以用一张黑白照片作为输入,你可以尝试预测图片的一些颜色作为输出。这个想法很酷,因为几乎有无限的数据。你可以拿到一张照片,并把它去饱和,那就是你的输入图片了,是吧?

所以,机器学习的其中一个问题是你需要很多的数据,解决了这些,这个问题就不是问题了。并且最近生成模型还有很多工作需要做,那是生成图片的模型。另外还有生成对抗网络,和像素卷积神经网络,他们展示了学习流行自然图片的能力,那就像,真正地理解什么是真正的图片和看起来像是但不是真正的图片。

所以,我的想法是把这么多的训练数据放到生成模型中观察是否能解决图片转换问题。我做了一些与高分辨率相关的工作,那可以把低分辨率的图片提高分辨率。那也是图片转换的一个问题。这就是我正在做的两个关于着色的项目。

Pramod:非常好的例子,Ryan。是的我听说了 tensor-flow 是解决很多机器学习问题的很好的平台。图片分类,转换,我了解得不多,但是我相信那是非常让人着迷的。你现在仍然在从事机器学习相关的工作吗?

Ryan:是的,现在我还在谷歌,作为一个软件工程师,处理相关的工作。学习生成模型以及尝试帮助研究者建立下一代的系统,和下一代的生成模型。

Pramod:生成模型与你之前工作中的 javascript、node 或者是 web 开发有很大的区别。

Ryan:是的,我觉得也是。但是我都是首先从数学着手,我在数学的知识上有相当不错的基础。我觉得…我觉得人们希望把人引向某些领域,我不希望那样做那个。我不希望成为一个 Javascript 开发者,我也不想成为一个机器学习开发者。我觉得我只是着迷于探索可能性。创造一些没有被做出来的并且对人类有用的新东西让我很兴奋。

Pramod:非常好。非常高兴我知道了机器学习需要比较好的数学背景。在你最近在 Optimistic Nihilism 发表的文章说到,我们在某天可以拥有仿真大脑并且可以建造一个可以与人类一样理解和思考的机器。我们距离那样的情况还有多远?

Ryan:好的。我需要更小心的处理我的预言…那是我的观点。我们距离人工智能不远了。我的意思是,我们现在用的机器学习系统是非常非常简单的,甚至还不能工作。事实上,我发表了一篇文章提到我的谷歌保留计划,在那里我提到了开发这些模型的困难。我认为不在这个领域工作的人会认为你只需要拿到这些模型然后给它一些数据它就会工作。但是并不是这样的。这些东西是非常讲究和不易理解的,那需要很多个月的调整和实验才能获得甚至是很少的结果。

所以,我们距离它不远,但是其实是…有些技术确实得到了提升,那是说卷积网络看上去是可以工作,并且得到了传播。这些技术都是基于模型,这个是基于神经网络模型,那个是基于类脑模型,但是大脑有时候以某种方式激发了它的吸引力。我们的电脑上都有 GPU,我们展示了如何在这些方面进行训练,并在一定程度上跨 GPU 分配训练。现在正在建立更大更聪明的基础系统。从个人上说,我是一个无神论者,我相信我的大脑除了化学物质,神经元就没有别的东西了。并且我认为我们所有的意识都是通过了编码的,以某种方式,在这些神经元之间相互作用。所以我没有觉得我们为什么不能做,在未来某些日子里,经过足够的研究和在这个领域的工作,可以模拟这种行为。但是很难去预见那时候距离现在是有多久。

Pramod:非常好。你看到了所有东西 Ryan,你在未来 20 年看好什么技术?

Ryan:我对于机器学习以及它带来的东西感觉非常兴奋。我认为甚至在以前,没有真正的人工智能的时候,也有很多使用这种技术的应用。我是说,有些系统使得你可以戴上一副可以帮助你的眼镜,通过这个技术可以大大地带来很多好处。所以,你要知道有无数的工业可以利用到这个好处。比如回收中心可以利用计算机视觉,但是那没有。我的意思是有很多很多的系统可以从简单的机器学习系统中获得好处。并且我认为我们将会更加地以来不同的处理流程。所以我觉得这将对技术领域和全人类产生极大的影响。

Pramod:是的,机器学习让人非常兴奋。我在山景城看到很多活动的自动驾驶汽车。某一天我可以坐在它的后面以及给它完全的控制权。谢谢你,Ryan,谢谢你为我们提供了这么好的 Node 框架,以及来到这个节目。并且祝你在未来的项目中能拥有好运。能和你聊天真的太好了。

Ryan:好的。谢谢你的邀请。在这里讨论非常有趣。

Pramod:谢谢。听众们,今天就到这里,我与 Ryan 的对话中感觉非常享受,这个谦卑和帅气的人。他在他早期的技术生涯里获得了这么多的成就。并且这是一个很激发人的故事。再见,我将在 2 周的时间内与大家见面,进行另一个有趣的旅程。 Shukriya(印地语,意思为:谢谢)。