作者 | 雷卷
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
- Opine: Web framework (like express)
https://github.com/asos-craigmorten/opine
- deno webview: web-based GUIs for desktop applications
- 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
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的兼容适配 。
备注
另外你可以参考一下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)
关注「Alibaba F2E」
把握阿里巴巴前端新动态