Ryan Dahl 现在是 Google Brain 的一个软件工程师。他是 Node.js 之父,Node.js 是一个基于 Chrome V8 JavaScript 引擎的 JS 运行环境。现在他从事深度学习研究项目,工作重点是彩色化和超分辨率等图像转换工作。他曾经贡献过几个开源项目,包括 HTTP Parse、libuv。
2017 年 8 月 31 日 Ryan Dahl 做客于英文播客 mappingthejourney,分享了他的个人经历,开发 Node.js 的过程,对 Node.js 的理解,他在 Google (Brain) 的工作现状,对学习 ML 的看法等。
Pramod: 大家好,欢迎来到 mapping the journey。当我们听到 Node.js 时就会想到 Ryan Dahl。他向我们展示了我们的I/O工作完全错误,并教会了我们如何使用纯异步编程模型来构建软件。我们今天的嘉宾就是 Ryan Dahl ,一个黑客、出色的程序员、也是 Node 之父。我们非常荣幸能够邀请到他,欢迎 Ryan。
Ryan: Hello!很高兴到这儿来。
Pramod: Ryan 我们知道您是Node之父,能跟我们聊聊做技术之前的经历吗?
Ryan: 当然,我在圣地亚哥 (San Diego) 长大,在我 6 岁的时候,我妈妈买了一台 Apple 2C ,所以我想我属于比较早接触电脑的人。顺便说一句,我今年 36 岁。因此,我是伴随着互联网长大的。我去了圣地亚哥的社区大学,然后在加州大学圣地亚哥分校攻读数学,毕业后在罗切斯特大学研究生院攻读数学博士。
在那里我学习了代数拓扑学,那是一门非常抽象的课程,我当时非常讨厌这门课程,因为我感觉它与现实生活离得太远了,但是很多年后我发现这门课程非常棒。博士期间,我突然发现自己不想当个数学家,于是放弃了这个计划。然后我买了一张去南美的单程票并在那里呆了一年,在那里我开启了饥饿学习模式,并且找到一份和一个名叫 Eric 的家伙共同开发一些网站的工作。这就是我编程生涯的开始,使用 Ruby on Rails 为滑雪板公司开发网站。
Pramod:很好!放弃博士学位、到南美旅行并成为一名 Web 开发者。
Ryan:是的,在罗切斯特大学,我习惯于处理非常抽象的问题,然而在网站工作是一个非常具体的过程。但是我尝试着将这个过程变成一套很棒的数学理论,就像我在研究生院接触到的那样。我认为这让我想到了…我认为,我喜欢 Ruby 是因为它极大的改变了网站开发,我认为,在使用 Ruby 时,你可以很好的表达自己的想法。那在当时非常有趣。而且我认为Rails 给人留下了深刻的印象。它提出了新的结构(也可能这不是新的),但是我认为 Rails 推广了模型视图控制器(MVC)结构。我对把这两件事情结合在一起非常感兴趣。
Pramod: 是的,建立网站非常有意思。Ruby 是非常棒的工具。接下来,你到德国成了一名 Web 开发的自由职业者,其中的一个项目就是 Node ,而且我认为你在接下来的六到八个月一直在做这项工作。
Ryan:是的,离开南美之后我跟我的女朋友搬到了德国,因为她是德国人,而且她必须重返校园。在那里我开始参加 Ruby 会议,人们在那里讨论模型视图控制器(MVC)的新案例。如果我发音正确,其中一个家伙叫 Chris Neukirchen,他开发了一个 Rack 的项目对 Web 服务器进行简单抽象。一个 Web 服务器变成了一个函数接口,你可以从那里获得一个请求,然后返回一个响应。
结合我为 Engineyard 的 Nginx 模块做的一些工作,让我想到如何…让我后退一步。在 Nginx 中,一切都是异步的。因此,当你为它新建一个模块时必须非常小心来保证它是非阻塞的。是的,我想 Chris Neukirchen 的 rack 和 Nginx 使用非阻塞 IO 架构 web 服务器的方法,让我开始思考如何能将这两件事情结合在一起。
Pramod: 现在,你有了结合 Rack 和 Nginx 的想法。你是如何说服自己用未来 6 个月的时间开发可以在服务器端运行 Javascript 的框架,这能大大提高性能吗?
Ryan: 一边是 Rack 的简单 web服务器界面,一边是 Nginx 的异步部分,我一直在想这两个部分。然后2008年Chrome 发布,并且同时发布了 V8 JavaScript 解释器。它应该不算是解释器,它是一个很棒的运行环境。 V8 发布后,我开始对它进行分析,它看起来迷人而且干净,而且很快,突然之间我想到:JavaScript 是单线程的,已经实现了非阻塞。
这有点儿讽刺,但在 web 浏览器中人们使用 AJAX 请求和事件时已经实现了非阻塞请求。哦,哇!我认为 JavaScript 结合异步 IO,再结合一些 HTTP服务器事件,将会变成一件非常酷的事情。我对这个想法感到非常兴奋,在接下来的四年里一直在做这项工作。
Pramod: 是的,JavaScript 与异步I/O 配合的很好。我相信开发人员都在等待看到一个实现这项功能的框架,我好奇的是,在那段时间里,你有导师或者能够相互讨论的人吗?还是只有你一个人。
Ryan:只有我自己,我有一些提供建议的程序员朋友,我的意思是,第一步绝对是我在自己的房间里完成的。但后来,我搬到了旧金山,在 Joyent 工作,在那里我遇到很多非常棒的编程专家。是的,在那之后许多人给我指导并且为 Node 贡献点子。
Pramod:很好,与我们分享一下开发 Node 的心路历程吧,我知道 Node 从 2009 年开始的,开发经历了很长时间。
Ryan:我觉得至少对于我自己而言,在我的生活中,没有比喜欢并且有坚信的想法更好的事情了。并且我有时间坐下来开发 Node 。我认为 Node 是一个等待发生但是还没做到的想法,别人或许能够做到。但是突然间我相对失业并且有空闲时间,可以不停的工作几个月,而这正是开发初步产品所需要的。这很棒而且很有趣。
Pramod:非常好,这太奇妙了。你确实做的非常棒。Node 建立在“纯异步”编程模型的基础上,你是怎么为 Node 想到这个点子的?
Ryan:是的,我认为那是一个非常有趣的问题。现在已经过去好几年了。从 2012 年或 2013 年开始我没有再进行 Node 开发了。从这点来看,Node 是一个大项目。因此,是的,当初实现 Node 之后,我到处游说人们使用 Node。或许我们处理 I/O 的方式有错,或许我们以非阻塞的方式做所有事情将会解决编程过程中遇到的很多问题,比如我们可以完全忘记线程,只使用过程抽象和序列化通信。但是在一个过程中,完全异步方式可以处理很多很多的请求。那时我坚信这个观点,但是几年之后,我认为这可能不是编程的最终和全部想法。特别是当 Go 出现的时候。
我认为 Go 很早之前就出现了,但我大约在 2012 年第一次听说 Go 。他们有一个非常好的运行环境,具有合适的绿色线程和易于使用的抽象。我认为阻塞 I/O(引号中的阻塞I/O),由于Go和操作系统的接口都是绿色线程,我认为那完全是非阻塞 I/O 。
但是,他们给用户的接口是阻塞的,我认为这是一个更好的编程模型。如果阻塞,我们可以更加轻松的考虑大多数情况需要做的工作。你知道,如果有非常多的后续动作,这样做是很好的:做 A,等待一个响应或者一个错误;做 B,等待一个响应,出错。在 Node 中,这更加困难,因为必须跳转到另一个函数调用中。
Pramod: 是的,我喜欢 Go 的编程模型。使用 goroutines 如此简单有趣,事实上,我们用它来创建分布式应用。
Ryan: 是的,我认为..对于特定类型的应用,比如说,我们要建一个服务器,我很难想象除了使用 Go 还能使用什么。意思是说,我认为 Node 的非阻塞编程对于没有线程的 JavaScript 非常好用。我认为很多需要跳转到多个异步函数来实现的回调问题,现在已经通过 JavaScript 异步特性-异步关键字缓解了。
因此,在更新版本的 JavaScript 中,这更容易实现。这就是说,我认为 Node 不是构建大型服务器网站的最佳系统。我会用 Go 构建大型服务器网站,说实话,那是我离开 Node 的原因。我意识到:这不是有史以来最好的服务端系统。
是的,我认为 Node 在客户端大放异彩,可以实现网站开发周边的一些脚本,比如打包客户端 JS 脚本的 Browserify。你可以实现所有客户端 JS 的服务端处理。然后可以做小型服务器……或许很小的开发服务器,或许是处理实时事务的一些真实服务器。Node 或许有用,或者说它可以是正确选择。但是如果要建立一个大规模的中心 DNS 服务器,我不会选择 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 服务器不是最简单的事情,我想这些系统中很多是留给社区做的,所以没有人做。因为没有什么可以使用的系统。我认为发布一个软件框架(或者任何软件)时,有一个 demo 可以让用户坐下来立即使用非常重要。这就是 Node 所做的事情之一。人们可以下载并直接使用 web 服务器。
Pramod: 是的,好的 demo、容易下载、安装和使用,这些会产生很大区别。而且,大家了解 JavaScript ,他们可以在任何时刻开始写代码。我开始使用 node 时感觉非常简单,因为我了解 JavaScript。
Ryan:是的,我感觉我们理所当然地认为在语言之间切换非常容易。 我的意思是,即使你知道另外一种语言,但要做到这一点也会非常困难。 而且很多人对 Javascript 非常熟悉。 为他们提供能够在其他情况下使用的工具,可以激励人们。 你突然之间发现可以比以前做得更多。
Pramod:是的,在 2012 年 node 已经有了庞大的开发基础。那么为什么你要把它交给 Joyent 的 Isaac Schueter?
Ryan:有许多原因。我最主要的原因在于,那时我已经开发 Node 四年了。我已经实现了自己的愿望,我从来不希望 Node 成为一个庞大的 API 。我希望它是个小巧紧凑的内核,人们可以用它构建模块。
还有一些重要的事情,我希望能够支持关键特性。因此很早就添加了扩展模块,我们实现了所有的网络库,HTTP、UDP、TCP,我们可以访问所有的文件系统。
然后,一大块内容(差不多时五个人一年的工作)需要放到 Windows 中并且运行良好。而且我们希望使用 Windows 抽象( IO完成端口)来实现异步IO 。所以,这需要重写核心库,最后做出的是 libuv 库。
是的,但是在某些时候,所有这些都做完了,我们已经发布 Windows 版本了,而且你知道,它也运行良好。我的意思是,这是我本来打算实现的,我很高兴能够有机会实现。当然,之后会有无数的错误需要修正,但是……你看,有足够多的人参与进来。我没有必要去做这件事情,而且我希望其做些其他事情。再加上 Go 的发布,我认为 Node 不能够成为服务器的终极解决方案。而且,我发表博客文章时不希望成为关注的中心。
Pramod:很好,是的,有些人不喜欢出名。当你开始开发 Node 的时候,你肯定有一些目标,现在的 Node.js 实现这些目标了吗?
Ryan:我的意思..成千上万的人使用 Node (如果不是数百万人),我认为这肯定超出了我对它的期望,是的,这很酷。
Pramod: Rayan当你完成 Node 的奇妙之旅后,你决定做些什么呢?
Ryan:Node 之后,我搬到…我离开 Joyent 并且停止参与 Node 项目后,我搬到了纽约。花了一些时间在一些项目上。我有许多项目,你知道那时 Instagram 已经发布了,但是它很新而且看起来很简单,每个人都在说:哇,它是如此简单,我也可以开发这样的项目。我也这样想。因此,我有了一个社交网络项目;我有一个 C++ 编译系统项目,还有另一个 HTML 编译系统项目,与 Browserify 类似,它以一种更聪明方式打包 JavaScript 和 HTML。
是的,我做了一大堆项目,但是没有一个项目让我心动。我认为可以推迟其中一些项目,比如我的社交网络项目,我可以在某些时候回头处理。是的,我开发了一段时间。然后我开始阅读关于……我开始了解卷积网络和如何解决图像分类,这让我对机器学习很感兴趣,
Pramod:你还是 Google Brain 见习项目的成员,给我们讲讲体验吧?
Ryan: 是的,我只在山景城呆了一年。 因此,晚了一步,TensorFlow 两年前发布了。
与此同时,他们宣布了这个 Google Brain 见习项目,他们邀请 20 个人参与 Google Brain ,Google Brain 是 Google 的一个机器学习研究实验室。 人们……我认为这个实验室的观点是并不一定要学过机器学习,如果你有一定的数学和编程背景,并且对机器学习感兴趣,那么请来这里并实现这些新想法。 因为机器学习变化很快,而且这里已经做了大量的工作。
但是现在社区已经把机器学习的范围缩小到最有用的神经网络算法了,它可能只需要一些人实现神经网络,而这个新的 ML 框架就是TensorFlow,这将激发一些有趣的想法。 我在那里花了一年的时间,基本上是编写模型和模型文件。 我主要从事图像转换问题的研究。 所以,你知道,如果你有一些输入图像,你想预测一些输出图像。 我觉得这个问题很有趣,让我举一些例子。
着色的问题。你可以使用黑白照片作为输入,尝试预测输出照片的颜色。这个问题最酷的地方在于有无限的训练数据。你可以拍摄任何彩色照片并去饱和,然后它就成了输入照片,对吧?
机器学习的一个问题是需要大量数据,然而对于这类任务,数据将不再是一个问题。而且,最近出现了大量生成模型的工作(输出图像的模型),特别是出现了对抗性网络和像素 CNN,这些模型已经展示了学习自然图像多样性的能力,就像真正理解真实图像是什么、什么不是真实图像、什么看起来像真实形象。
我的想法是在生成模型中使用这些最新模型,并采取无限的训练数据,看看能否解决一些图像转换问题。 所以,我做了一些超分辨率的工作,也就是提高低分辨率图片的分辨率。 这也是一个图像转换的问题。 现在我已经完成了两个着色的项目。
Pramod:很好的解释,Ryan。是的,我认为 TensorFlow 是处理许多机器学习问题的好平台。我不太了解图像分类、转换,但我相信这一定很有趣。你还在继续做 ML 的工作吗?
Ryan:是的,我现在还在 Google(作为一个软件工程师)从事这种类型的工作,研究生成模型,并尝试帮助研发人员建立下一代的生成系统,下一代的生成模型。
Pramod:生成模型与你之前从事的 node 或 web开发工作使用的 JavaScript 差别是如此之大。
Ryan:是的,我想也是。但是我是数学专业,所以我想我有相当不错的数学基础。是的,我认为人们喜欢把别人固定到特定领域,我不想这样做。我不想成为一个 JavaScript 专家,我不想成为一个机器学习专家,我认为探索可能性非常有趣。令人兴奋的是,做以前没做过,并且能够以某种方式令人受益的事情。
Pramod:很好,是的,机器学习需要好的数学基础。在你最近一篇关于乐观虚无主义的博客中,你说我们有朝一日能够模仿大脑、开发一个像人类一样理解和思考的机器,我们离实现这个目标还有多远?
Ryan:是的,我要对这种说法更谨慎一些…我的意思是,这是我的个人观点。我们开发的东西远不及人类的智慧。我的意思是,我们使用的机器学习系统非常简单,根本不会工作。实际上,我有一篇关于我的见习的文章,我在那篇文章中列举了开发这些模型的所有困难。我认为不从事这类工作的人们可能会有这样的想法,你可以采用这类模型然后输入一些数据,它就能工作了。但事实并非如此,这些模型非常挑剔,而且还没有被很好的理解,要花费很多个月的时间进行精心调整和试验,才能得到相似的结果。
所以,我们离它很远,但是我认为基础……最近有一些有希望的技术得到了改进,卷积网络似乎起作用了,而且 propagation 似乎也正在起作用。事实上,这些东西都建立在模型基础上的,这个神经网络模型不像大脑一样工作,但是以大脑的某种方式激发,这是非常诱人的。我们也有 GPU,我们展示了如何在这些方面训练它和如何通过 GPU 进行分布式训练。所以,我认为出现了建立更大、更智能的系统的基础。而且,我个人认为,我是一个无神论者,我相信我们的大脑中除了化学物质和神经元之外再没有别的东西了。而且我认为我的意识,我们所有的意识都以某种方式都被编码到这些神经元之间的相互作用中。所以,我不明白我们为什么不能通过足够的研究和工作来模仿这种行为。当然,现在还远远没达到能够预测需要多久能够实现的程度。
Pramod:很棒,你已经看到了这一切,Ryan 你认为未来 20 年技术将在哪些领域发展?
Ryan:我对机器学习和它带来的可能性感到非常兴奋。我认为即使在我们实现真正的人工智能之前,这种技术也非常有用。我的意思是,你使用的任何系统都将从这项技术中受益匪浅,比如佩戴智能眼镜将会帮助你。有无数的工业过程可以利用这项技术。比如使用计算机视觉的进行分拣回收的回收中心。我的意思是,将有很多很多系统可以从简单的机器学习系统中受益。而且我们会不断看到这些系统适用于不同的流程。所以,我认为这将对科技行业产生重大的影响,对人类都将产生很大的影响。
Pramod:是的,机器学习令人兴奋。我在山景城看到自动驾驶汽车时非常兴奋。有一天我会坐到后面并把控制完全交给汽车。Ryan,谢谢你带给我们如此出色的 Node 框架,谢谢你参加这次节目。祝你好运,和你聊天的感觉非常棒。
Ryan:是的,很棒,感谢你邀请我。很高兴能够和大家分享这些。
Pramod:谢谢你。这就是所有内容了,听众们。我真的非常喜欢与 Ryan 聊天,他谦虚而且受人尊敬。他早些年在科技领域取得了如此大的成就,这是一个非常鼓舞人心的故事。再见,我们两周以后会踏上另外一个有趣的旅程,Shukriya。