Ryan Dahl 访谈: Node.js/Deno 的创始人

简介: 一起来了解Ryan Dahl的新项目Deno,以及他对当前JavaScript生态和技术趋势的看法。
作者 | 雷卷

image.png

Ryan Dahl

原文:《Interview with Ryan Dahl, Creator of Node.js》

链接:https://evrone.com/ryan-dahl-interview

译者:雷卷,授权翻译分享

文章翻译自Evrone对Ryan Dahl的采访:《Interview with Ryan Dahl, Creator of Node.js》,翻译这篇文章,是想让更多的中国开发者了解Ryan Dahl的新项目Deno,以及他对当前JavaScript生态和技术趋势的看法。

以下为该访谈的中文翻译版。

介绍

Ryan Dahl是Node.js以及Deno(JavaScript和TypeScript运行环境)的创始人。

我们很高兴有机会与Ryan谈谈他的项目:Deno及其主要挑战。聆听他对JavaScript和TypeScript的未来的想法,了解有关第三方Deno生态系统项目的更多信息,以及如果他能时光倒流,他对Node.js的态度又是什么?

访谈

Evrone: 您的Deno新项目对开发人员产生了很大影响,您现在大部分时间都在做什么?

Ryan: 我现在大部分时间都在Deno工作上。你看到的Deno虽然只是一个可执行程序,实际上是一个相当庞大的软件集合。我们正在不断改善Deno,同时我们也在努力将Deno作为基础架构应用到商业项目中。

Evrone:您有使用多种编程语言的实践经验:C++,Rust,Ruby,JavaScript,TypeScript,您最喜欢哪一个语言?

Ryan: 这段时间,我非常享受Rust编程。Rust学习曲线陡峭,未必适合非常多的场景,但是对于我现在正在进行的工作来说,它非常完美。Rust是更棒的C++。我坚信我将永远不会开启另外一个C++的新项目,Rust能够以更简单的方式来处理计算机底层,非常完美。

JavaScript从来都不是我最喜欢的语言,它只是最常见的语言之一,作为一门编程语言,你可以使用它表达你的想法。我不认为TypeScript是一种独立的语言。它的美丽之处在于它是有类型(typing)标记的JavaScript。

TypeScript允许人们基于JavaScript构建更庞大,更健壮的系统,它也是我处理每天日常任务的首选语言。借助于Deno,我们将会消除TypeScript代码转换为JavaScript固有的许多复杂性,希望这将帮助更多的开发人员使用TypeScript。

Evrone: 类型(typing)已经逐渐被添加到Python,PHP和Ruby等语言核心规范中,以您的观点,什么阻止了JavaScript添加类型(typing)的支持?

Ryan:将类型添加到JavaScript(通过TypeScript)的成功远远超过了Python,PHP或Ruby等语言。TypeScript就是具有类型的JavaScript。

是什么在阻止JavaScript标准化组织(TC39)采用TypeScript?这个问题很有趣。考虑到设计和规划,标准化推进,这些都会相对谨慎和缓慢。他们正在研究Types-As-Comments的提议,该提议将允许JavaScript运行时通过忽略类型来执行TypeScript语法。我认为最终TypeScript(或类似的方案)将作为JavaScript标准的一部分被提出,但这需要时间。

Evrone:作为一个受人尊敬的VIM用户,您如何看待像VS Code这类现代化的编辑器?他们对保守派程序员足够好吗?

Ryan:与我共事的每个人都在使用VS Code,他们非常喜欢它,我想大多数人都应该使用VS Code。我继续使用VIM的原因有两个:

1)我对它非常熟悉并且很快,我喜欢能够在ssh和tmux上工作,并且享受全屏终端的宁静。

译者评论:程序员经常抱怨编码时被微信、邮件、各种通知所打扰,给你一个全屏化的VIM,整个世界就安静啦 :)

2)对于基础软件来说,基于文本编辑并可以通过简单工具进行触达是非常重要。

在Java世界中,他们犯了一个错误,就是将IDE和该语言的捆绑在一起,从而造就目前的情况:即开发者必须使用IDE来进行Java编程。通过使用简单的工具,可以确保我开发的软件不会不必要地依赖IDE。当然使用grep查找字符串,而不使用直接跳转到变量声明位置,这种无意义的多次跳转也是无法接受的。就我所做的事情,我认为不过度依赖IDE会是更好的软件设计。

译者评论:你我都是普通程序员,没有20年+的VIM使用经验,也没有掌握那么多开发语言,对开发语言的领悟也没有到大师的地步,此外你也不可能像Ryan凭着坚强的兴趣能坚持写代码到60岁,我们还是老老实实借助IDE写好代码,做好单元测试和Code Review,不要给后来维护代码的同事添乱就非常好了。

Evrone:依赖管理、安全性等都是长期存在的问题,Deno展现了可能的解决方法。您是否希望Deno成为像Haskell这样的实验田?或者您想将Deno当作最佳实践之选吗?

Ryan:不能将新颖性错误理解为实验性。Deno绝对是实用的,它建立在服务器端JS已有多年经验的基础上。我和我的同事们致力于构建实用的动态语言运行环境,围绕依赖项管理和安全性所做的设计是深思熟虑的。我们可以很容易地引入另一个类似于NPM的集中式系统,但是最终选择了基于Web标准URL的链接系统。我们可以非常容易地开放文件系统和网络,但是这会带来各种安全漏洞,相反,我们选择像浏览器一样设计,仔细地管理这些访问权限。

Deno是一个创新的系统,目前未必能适用到非常多的场景,此外Deno也是一个大型Rust代码库,开发速度快,运行性能高,项目有可靠的CI和定期的计划发布,统统这些都表明Deno不是实验田。

Evrone:在2020年,大多数软件开发者大会都变成了“在线”和“虚拟”会议。您是否尝试过这种新格式,对此您有何看法?

Ryan:我参加了一些,但现在我暂时避开这种形式。对我而言,会议中最好的部分是“Hallway Track(各种议题、展台、workshop和线下交流等)”,这是在线会议缺少的关键方面。我自己更喜欢以2倍的速度观看youtube上的演讲,希望能在2021年晚些时候参加一些非虚拟会议。

译者评论:多数视频网站都可以以倍速的方式播放视频,对于大多数视频演讲来说,这种方式可以节约你宝贵的时间,同时也不会遗漏演讲的内容。

Evrone:解耦是将大文件分解为多个文件的依赖图谱,这一想法得到了Webpack的拥护,并收到许多开发者的好评。但是依赖管理非常具有挑战性,Node.js从CommonJS迁移到ESM花费了多年的时间。您想使用Deno解决哪些主要的依赖管理挑战?

Ryan: 浏览器没有为分发JavaScript的任何CDN做特殊照顾,网络的分散性是其最大的优势。我不明白为什么这不能被同样适用于服务器端JavaScript。因此,我希望Deno不依赖任何集中式的依赖仓库。

Evrone: Python和JavaScript在竞争成为最好的通用编程语言,对于软件开发新人,应该学习哪一种语言?您对此有何看法?

Ryan: 脚本语言对初学者来说都很不错。本质上,Python和JavaScript是非常相似的系统,语法/语义有些不同。

JavaScript由国际标准委员会管理,可以运行在各种系统中,并且JavaScript速度要比Python快很多(将V8与CPython进行比较时),并且拥有更庞大的开发者群体。对于某些领域,会有更多的Python库支持,尤其是在科学计算中,Python可能是合适的,主要是看新程序员想要做什么。但是,总的来说,我认为JavaScript是一种更好的入门语言。

Evrone:一个主线程和众多小的handler可调用对象,该异步并发模型是Node.js的基石之一。现在,通过新的“async/await”语法和“coroutines”概念进一步提升了异步并发模型。作为平台软件开发者,您如何看待它们以及其可用的替代方案,例如Go语言的“goroutines”或基于Ruby线程的并发?

Ryan:OS线程无法很好地扩展到高并发应用程序。如果您有许多并发的连接,请不要使用Ruby。

Goroutines非常易于使用,并可以达到最佳性能。与Go一样,Node和Deno都是基于非阻塞I/O和OS事件通知系统(epoll,kqueue)构建的。JavaScript本质上是一个单线程模型,因此Node或Deno的单个实例,在不创建多实例的情况下,通常是无法充分利用操作系统的所有CPU内核。Node/Deno是JavaScript的最佳选择,但是在没有可能偏向JavaScript的其他情况下,Go是高并发系统的更好选择。

Evrone:在如此激烈的竞争中,您如何看待JavaScript和TypeScript的未来,尤其是与后端,嵌入式和ML领域有关的未来?

Ryan:动态或脚本语言非常有用。程序员要解决的问题通常不是CPU的限制,更多的是工程时限,能够快速开发和部署更为重要。

在动态语言中,JavaScript(纯JavaScript或带类型的JavaScript)是最流行的,也是迄今为止运行最快的。相信在将来,我们所追求的唯一动态语言,很可能是从Web浏览器中衍生出来的。

借助Deno,我们正在努力消除JS目前很少涉及领域的应用障碍,如机器学习。例如,我们可能会在Deno中添加WebGPU支持,GPU编程更简单,最终将使TensorFlow.js之类的系统能够在Deno上运行。

如前所述,动态语言有其局限性,并不能适用所有问题领域。如果您正在进行数据库系统开发,那么最好使用一种使您对计算机具有最大控制权的语言(例如Rust或C++)进行编写。如果您要编写高并发性API服务器,那么很难想象有比Go更好的选择。

Evrone: 现代操作系统和Deno都引入了精细的权限控制,以抵消第三方软件和依赖项的安全风险。但是,最终用户和开发人员能在应用程序的“允许”和“拒绝”安全性请求时做出正确的决定吗?

您如何看待几年后像我们大多数人一样,自动单击“允许一切”的风险,就像我们大多数人现在对网站cookie“安全确认”所做的那样?

Ryan: 网站Cookie弹出窗口不是最好的类比,它们是相当无用的法律副产品。更好的是内置的安全设置选项方式,上面写着“允许该网站访问您的相机”或“允许桌面通知”或“允许该网站查看您的位置”。

这些并不是没有用的,相反是相当重要的安全功能。程序员在计算机上运行非常多的自动化程序或脚本。没有人有时间审核他们将要运行的所有代码,当然也没有到需要在Docker容器中运行所有代码的情况:当您运行lint代码检查工具时,难道lint的执行也要被隔离的吗?答案是否定的,你必须相信lint不会破坏您的系统。我认为允许用户查看并能拒绝不必要的系统访问是非常合适的。

Evrone: 新的全栈(Fullstack)思想促使开发人员同时编写前端代码和后端代码,使用相同的语言和共享技术堆栈(如TypeScript),这种方式非常简单。您认为对于许多开发人员来说,将如此多的不同技术栈纳入他们的日常开发是一个好主意吗?

Ryan:降低复杂性总是有益的。更少的开发语言,更少的虚拟主机(VM),更少的框架(Framework)等,对程序员更好,简单就是美。

Evrone:您打算如何处理TypeScript语言本身的版本更新?在Node.js生态系统中,V8引擎进行的JavaScript语法更新,可能会导致某些程序包无法正常工作。

Ryan:TypeScript语言几乎具有完整的功能,相对已经非常稳定。依赖于TypeScript语言的前沿特性的用户可能会遇到不稳定的情况,出于稳定和兼容考虑不要使用太前沿的特性。

Evrone: 您如何看待软件开发人员的良好教育?我们是否需要包括所有数学、算法和数据结构的”科学“(如“计算机科学”),还是需要其他东西?

Ryan: 想要从事编程职业的人,应该去大学中学习计算机科学。当然,也可以获得相关领域的学位(例如电气工程,物理学,数学);也有许多非常有能力的工程师根本没有学位。但是,花几年的时间学习基础知识并进行大量的实验,这还是非常值得的。

Evrone: 在Deno第三方生态系统项目中,是否有你喜欢的项目?

Ryan:必须有

  • Aleph.js - A React Framework

https://alephjs.org/

  • Opine: Web framework (like express)

https://github.com/asos-craigmorten/opine

  • deno webview: web-based GUIs for desktop applications

https://deno.land/x/webview

  • puppeteer (same as in Node)

https://github.com/lucacasonato/deno-puppeteer

  • visualize module graphs

https://deno-visualizer.danopia.net/

  • ssgo - A minimal but flexible static site generator

https://ssgo.netlify.app/

Evrone: 随着诸如GitHub之类的社交平台的推出,个人开发者和大公司现在都可以轻松地使用开源并做出贡献。现在是开源的黄金时代?还是否存在一眼看不到的问题?

Ryan: 开源现在已经是主流,人们对开源许可(licensing)的理解也已经被解决。

关于开源维护的激励模型仍然存在着未解决的问题,也许Github资助(Sponsor)正在朝着这个方向努力。开源比以前要好多啦,但是我希望我们能找到一种方法,让维护软件重要功能的开发人员,可以获得自己付出相对应的报酬。

Evrone:Deno目前的主要技术挑战是什么?

Ryan:非常多的事情要做完成:我们正在构建Hyper Web服务器的绑定,它将提供HTTP2,并且比当前Web服务器快很多。我们正在构建“Deno LSP”,提供Deno相关的语言服务协议,以便VSCode(和其他IDE)可以直接与Deno通讯,从而实现语法高亮显示、类型检查、代码格式化等,期望在下一个版本中可以大大改善Deno编码体验。

另外我们正在努力通过尽可能多的Web平台的兼容测试,因此随着时间的推移,Deno变得与Web更加兼容。

查看 Q1路线图( https://github.com/denoland/deno/issues/8824) 以了解更多的详细信息。

Evrone:如果时光可以倒流,你可以给刚开始开发Node.js的年轻你一些建议,那会是什么建议?

Ryan:在Node的早期,我不太确定异步I/O能否由新手程序员轻松地用于大型项目中。

我四处演讲,提出这一主张,但我不确定如何解决。如果我能回到过去,我将向自己保证异步I/O将起非常大的作用。然后,我要告诉自己,Node.js将成为项目开发的关键部分。另外大型软件项目与小型项目有不同的关注点,如预算、沟通和组织,我会告诉自己要花些时间在这些问题上。

Evrone: 对那些正在开发npm软件包,同时也想支持Deno的开发人员有何建议?

Ryan:使用ESM,同时留意一下Deno对Node的兼容适配 https://deno.land/std/node

备注

另外你可以参考一下Ryan在JSConf EU 2018的演讲 《Ryan Dahl: Node.js 的设计错误》(https://juejin.cn/post/6844903620643651598 ) 我这里列举几点:

  • 没有坚持使用 Promise(Not sticking with promises)
  • 没有足够的安全性(Open Access)
  • NPM or package.json是没有必要的
  • node_modules:地球上的黑洞,这个大家都懂的
  • 错误地坚持使用GYP(Build system)

image.png
关注「Alibaba F2E」
把握阿里巴巴前端新动态

相关文章
|
JavaScript 前端开发 Linux
Node.js 创始人:Javascript 容器是简化服务器抽象的“先驱”践行者
Node.js 创始人:Javascript 容器是简化服务器抽象的“先驱”践行者
142 0
|
JavaScript 前端开发 Linux
Node.js 创始人:Javascript 容器是简化服务器抽象的“先驱”践行者
Node.js 创始人:Javascript 容器是简化服务器抽象的“先驱”践行者
179 0
Node.js 创始人:Javascript 容器是简化服务器抽象的“先驱”践行者
|
2月前
|
Web App开发 缓存 JavaScript
【安装指南】nodejs下载、安装与配置详细教程
这篇博文详细介绍了 Node.js 的下载、安装与配置过程,为初学者提供了清晰的指南。读者通过该教程可以轻松完成 Node.js 的安装,了解相关配置和基本操作。文章首先介绍了 Node.js 的背景和应用场景,随后详细说明了下载安装包、安装步骤以及配置环境变量的方法。作者用简洁明了的语言,配以步骤图示,使得读者能够轻松跟随教程完成操作。总的来说,这篇文章为初学者提供了一个友好的入门指南,使他们能够顺利开始使用 Node.js 进行开发。
197 1
【安装指南】nodejs下载、安装与配置详细教程
|
2月前
|
消息中间件 Web App开发 JavaScript
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
77 0
|
3月前
|
JavaScript 前端开发 API
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)(下)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
35 0
|
3月前
|
消息中间件 Web App开发 JavaScript
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)(上)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
42 0
|
19天前
|
JavaScript Windows
NodeJS 安装及环境配置
NodeJS 安装及环境配置
|
28天前
|
Linux 开发工具 git
node使用nrm 管理托管node的安装源
node使用nrm 管理托管node的安装源
43 1
|
1月前
|
Web App开发 JavaScript 前端开发
Windows 10上安装Node.js的初学者指南
Node.js是是一个强大的JavaScript运行时环境,建立在Chrome的V8 JavaScript引擎上,让你能够在服务器端运行JavaScript。 通过本教程,你将学会如何设置Node.js和npm(节点包管理器等现代Web开发的必备工具。无论你是希望构建Web应用程序、创建服务器端脚本,还是涉足全栈开发,安装Node.js都是你的第一步。那么,让我们开始吧!
|
2月前
|
JavaScript
记录安装nodejs遇到的问题及解决
最近在搭建网站,需要用到nodejs,在配置的时候遇到3个问题,经过搜索和自己思考,把遇到的问题和解决方案记录下来,以供参考