和 Node.js 創(chuàng)始人 Ryan Dahl 的對話
原文地址:Interview with Ryan Dahl, Creator of Node.js 原文作者:Ryan Dahl 譯文出自:掘金翻譯計劃 本文永久鏈接:https://github.com/xitu/gold-miner/blob/master/article/2021/Interview-with-Ryan-Dahl-Creator-of-Node-js.md 譯者:霜羽 Hoarfroster 校對者:Chorer、zenblo、lsvih
和 Node.js 創(chuàng)始人 Ryan Dahl 的對話
導(dǎo)言
Ryan Dahl 是 Node.js 的創(chuàng)始人以及 Deno JavaScript 和 TypeScript 運行時的早期開發(fā)者。我們很高興有機(jī)會與 Ryan 探討他開發(fā)的一些別的項目以及 Deno 面臨的主要挑戰(zhàn),了解他對 JavaScript 和 TypeScript 的未來的想法,尋找更多第三方的 Deno 生態(tài)系統(tǒng)項目的更多信息,并討論如果他能時光倒流,他會如何改變 Node.js 的開發(fā)!
采訪
Evrone: 您的新項目 Deno 對開發(fā)者們產(chǎn)生了很大影響。請問您現(xiàn)在大部分時間都在做些什么?
Ryan: 我大部分時間都在研究 Deno!實際上 Deno 是一個相當(dāng)大的軟件集合,我們把它放到可執(zhí)行文件中。我們現(xiàn)在正在提升 Deno 運行時,同時也在努力將基礎(chǔ)架構(gòu)應(yīng)用到商業(yè)項目中。
Evrone: 您具有使用多種編程語言的實踐經(jīng)驗,例如 C、Rust、Ruby、JavaScript 和 TypeScript。您最喜歡使用哪一種語言進(jìn)行開發(fā)?
Ryan: 這些天我發(fā)現(xiàn)編寫 Rust 代碼最是有趣。它的學(xué)習(xí)曲線很是陡峭,并且不適合許多情景,但對于我現(xiàn)在正在研究的東西來說,它真的是完美的,比 C++ 好多了 —— 我堅信我將永遠(yuǎn)不會再開始一個新的 C++ 項目。Rust 具有如此簡單的表達(dá)低級機(jī)械語言的能力,真的太棒了!
JavaScript 從來不是我最喜歡的語言,它只是最常見的語言,也因此,它能被我們用來表達(dá)許多想法。我不認(rèn)為 TypeScript 是一種獨立的語言,畢竟它的優(yōu)點只在于它拓展了 JavaScript。TypeScript 允許人們使用 JavaScript 構(gòu)建更大,更強(qiáng)壯健康的系統(tǒng),而我想,這會是我日常工作的首選語言。
在 Deno 中,我們正試圖降低將 TypeScript 代碼轉(zhuǎn)換為 JavaScript 所固有的復(fù)雜性,希望這將使更多開發(fā)者能夠使用 TypeScript。
Evrone: 漸近類型(Gradual typing)已成功添加到 Python 核心庫、PHP 和 Ruby 語言中。您認(rèn)為將類型添加到 JavaScript 的主要作用是什么?
Ryan: 將類型(像 TypeScript 那樣)添加到 JavaScript 的成功遠(yuǎn)遠(yuǎn)超過了在 Python、PHP 或 Ruby 中所完成的那樣。TypeScript 是具有類型的 JavaScript 語言。更好的問題是:是什么在阻止 JavaScript 標(biāo)準(zhǔn)化組織(TC39)采用 TypeScript?通過設(shè)計,標(biāo)準(zhǔn)化會緩慢而謹(jǐn)慎地進(jìn)行。他們首先正在研究提出 Types-As-Comments 的提議,該提議將允許 JavaScript 運行時通過忽略類型來執(zhí)行 TypeScript 語法。我認(rèn)為最終 TypeScript(或類似的東西)將作為 JavaScript 標(biāo)準(zhǔn)的一部分被提出,但這需要時間。
Evrone: 作為受人尊敬的 VIM 用戶,您如何看待像 VS Code 這樣的現(xiàn)代化代碼編輯器?他們對老一代開發(fā)者友善嗎?
Ryan: 與我一起工作的每個人都使用 VS Code。他們喜歡它,而且我想多數(shù)人都應(yīng)該去使用它。
我繼續(xù)使用 VIM 的原因有兩個。
我對它非常熟悉,并且可以用它快速編碼。我喜歡在 ssh 和 tmux 上的工作體驗,并且享受全屏終端的寧靜。 對于軟件基礎(chǔ)結(jié)構(gòu)來說,基于文本并可以通過簡單工具進(jìn)行訪問非常重要。在 Java 世界中,開發(fā)者們犯了將 IDE 過多地與該語言的世界聯(lián)系在一起的錯誤,從而造成一種情況,即實際上人們被迫使用 IDE 去編寫 Java 代碼。而通過使用簡單的工具,我可以確保我開發(fā)的軟件不會不必要地依賴 IDE。如果你去嘗試使用 grep 而不是跳轉(zhuǎn)到定義(jump-to-definition),那么你會發(fā)現(xiàn),跳轉(zhuǎn)到定義這種太多的間接尋址實在是令人無法忍受。對于我所做的事情,我認(rèn)為這會帶來更好的軟件。
Evrone: Deno 運行時展示了修復(fù)依賴項管理、安全性等長期存在的問題的可能方法。您是否希望它像是進(jìn)行實驗的 Haskell 那樣的場所,還是您想將它作為最佳實踐選擇,用在一些什么用途上?
Ryan: 千萬不要將新穎性誤認(rèn)為是實驗性的,Deno 絕對是實用的,它建立在服務(wù)器端 JavaScript 已有多年經(jīng)驗的基礎(chǔ)上。我和我的同事們致力于構(gòu)建實用的動態(tài)語言運行時。我們圍繞依賴項管理和安全性所做的設(shè)計選擇非常保守。我們可以很容易地引入另一個類似于 NPM 的集中式系統(tǒng),但是選擇了基于 Web 標(biāo)準(zhǔn) URL 的鏈接系統(tǒng)。我們當(dāng)然可以更容易地打開文件系統(tǒng)和網(wǎng)絡(luò)中的各種安全漏洞,但相反,我們選擇像瀏覽器一樣仔細(xì)管理訪問。
Deno 是新軟件 —— 這使得它天生就不適合很多用例。但是 Deno 還是一個大型 Rust 代碼庫,擁有著強(qiáng)大的速度,穩(wěn)定可靠且成功率高的 CI 管理以及定期的計劃發(fā)布。你說這是實驗性的,這可不是實驗!
Evrone: 在 2020 年,大多數(shù)軟件開發(fā)人員大會都變成了“在線”和“虛擬”會議。您是否嘗試參加過這種新形式的會議?您對此又有何看法?
Ryan: 我參加過,但我現(xiàn)在正避免參加線上會議。對我而言,會議最好的部分是“走廊”(指去交際),這恰恰是在線會議所缺失的一個關(guān)鍵方面。我更喜歡在空閑時間以 2 倍的速度觀看 YouTube 上的演講。希望我能在 2021 年晚些時候參加一些非虛擬的會議。
Evrone: 將依賴關(guān)系圖從一個文件分散到單個源代碼文件的想法受到了 Webpack 的擁護(hù),也受到許多開發(fā)人員的贊揚。但是依賴性管理具有挑戰(zhàn)性,Node.js 從 Common.js 遷移到 ESM 花費了多年的時間。請問您要使用 Deno 解決的主要依賴管理問題是什么?
Ryan: 瀏覽器沒有借助任何一個 CDN 來分發(fā) JavaScript。網(wǎng)絡(luò)的分散性是其最大的優(yōu)勢,我不明白為什么這也不能用于服務(wù)器端的 JavaScript。因此,我希望 Deno 不依賴于任何中心化的代碼數(shù)據(jù)庫。
Evrone: Python 和 JavaScript 正在競爭,PK 究竟誰才是最佳的供新人開發(fā)者學(xué)習(xí)的通用編程語言。您對此有何看法?
Ryan: 腳本語言非常適合初學(xué)者。本質(zhì)上,Python 和 JavaScript 的語言系統(tǒng)非常相似,只不過語法各異,在語義上也稍微不同。JavaScript 是由國際標(biāo)準(zhǔn)委員會管理的,可以在所有地方運行,并且速度要快一個數(shù)量級(將 V8 與 cpython 進(jìn)行比較時),而且還擁有著更大的用戶群。而對于某些領(lǐng)域來說,可用的 Python 庫則更多,尤其是在科學(xué)計算中。新手程序員想開發(fā)的東西因人而異,Python 可能是合適的。但總的來說,我認(rèn)為 JavaScript 是一種更好的入門語言。
Evrone: 具有一個主線程和小的 handler 可調(diào)用對象的異步并發(fā)范例是 Node.js 的基石之一?,F(xiàn)在,這種想法通過新的 Async / Await 語法和協(xié)程的概念得到了進(jìn)一步提升。作為平臺作者,您如何看待它們及其可用的替代方案,例如 Go Goroutines 或基于 Ruby 線程的并發(fā)?
Ryan: OS 線程無法很好地擴(kuò)展到高并發(fā)應(yīng)用程序。如果您有許多并發(fā)連接,請不要使用 Ruby。
Goroutines 非常易于使用,并能夠達(dá)到最佳性能。與 Go 一樣,Node 和 Deno 都是基于非阻塞 IO 和 OS 事件通知系統(tǒng)(epoll,kqueue)構(gòu)建的。JavaScript 本質(zhì)上是一個單線程系統(tǒng),因此 Node 或 Deno 的單個實例通常無法在不開始創(chuàng)建新實例的情況下利用系統(tǒng)上的所有 CPU 內(nèi)核。Node / Deno 是 JavaScript 的最佳選擇,但在沒有其他可能偏向 JavaScript 的其他要求的情況下,Go 最終是高并發(fā)系統(tǒng)的更好選擇。
Evrone: 在如此激烈的競爭中,您如何看待 JavaScript 和 TypeScript 的未來,尤其是與后端、嵌入式和機(jī)器學(xué)習(xí)(ML)領(lǐng)域有關(guān)的未來?
Ryan: 動態(tài)(或“腳本”)語言**非常有用。程序員要解決的問題通常不受 CPU 限制。問題更多是受工程時間限制。能夠快速開發(fā)和部署更為重要。在動態(tài)語言中,JavaScript(純 JavaScript 或帶類型的 JavaScript)是最受歡迎的,也是迄今為止最快的。未來,我相信我們所追求的唯一動態(tài)語言將是這種奇怪的、從網(wǎng)絡(luò)瀏覽器中衍生出來的進(jìn)化語言。借助 Deno,我們正在努力消除障礙,在某些很少使用 JS 的地方應(yīng)用 JS,像是機(jī)器學(xué)習(xí)領(lǐng)域。例如,我們可能會在 Deno 中添加 WebGPU 支持,從而允許簡單的開箱即用的 GPU 編程,最終將使 TensorFlow.js 之類的系統(tǒng)能夠在 Deno 上運行。
如前所述,動態(tài)語言有其局限性,并不適合所有問題領(lǐng)域。如果您正在對數(shù)據(jù)庫進(jìn)行編程,則最好使用一種使您對計算機(jī)具有最大控制權(quán)的語言(例如 Rust 或 C++)進(jìn)行編寫。如果您正在編寫高并發(fā)性 API 服務(wù)器,很難想象有比 Go 更好的選擇。
Evrone: 現(xiàn)代操作系統(tǒng)和新的 Deno 運行時引入了精細(xì)的權(quán)限,以抵消第三方軟件和依賴項的安全風(fēng)險。但是,使用依賴關(guān)系的最終用戶和開發(fā)人員是否有可能在“允許”和“拒絕”應(yīng)用程序安全性請求時做出正確的決定?您如何看待幾年后像我們大多數(shù)人一樣自動單擊“允許一切”的風(fēng)險,就像我們大多數(shù)人現(xiàn)在對網(wǎng)站 Cookie “安全確認(rèn)”所做的那樣?
Ryan: 網(wǎng)站 Cookie 彈出窗口不是個最好的類比 —— 它們是相當(dāng)無用的法律副產(chǎn)品。更好的是內(nèi)置一個對話框,上面寫著“允許該網(wǎng)站訪問您的相機(jī)”或“允許桌面通知”或“允許該網(wǎng)站查看您的位置”。這些并不是沒有用的,這些是相當(dāng)重要的安全功能。
程序員在計算機(jī)上運行許多不同的自動化程序,沒有人有時間審核他們將要運行的所有代碼,也不足以在 Docker 容器中運行所有代碼:當(dāng)您運行 lint 時,是被隔離的嗎?不,答案是您必須相信 lint 腳本不會破壞您的系統(tǒng)。我認(rèn)為允許用戶查看并拒絕不必要的系統(tǒng)訪問非常合適。
Evrone: 全新的“全?!备拍畲偈归_發(fā)人員同時編寫前端代碼和后端代碼,而使用相同的語言和諸如 TypeScript 之類的共享技術(shù)棧在現(xiàn)在變得非常容易。您認(rèn)為對于許多開發(fā)人員來說,將如此多的不同事物納入他們的日常工作范圍是一個好主意嗎?
Ryan: 降低復(fù)雜性總是有益的。程序員必須與之交互的語言、VM、框架和概念越少越好。
Evrone: 您打算如何處理 TypeScript 語言本身的版本更新?在 Node.js 生態(tài)系統(tǒng)內(nèi),使用 V8 引擎進(jìn)行 JavaScript 語法更新通常會導(dǎo)致某些程序包無法正常工作。
Ryan: TypeScript 語言幾乎具有完整的功能。依賴于最先進(jìn)的語言功能的用戶可能會遇到不穩(wěn)定的情況,請不要這樣做。
Evrone: 您如何看待軟件開發(fā)人員的良好教育?我們是否需要具有所有數(shù)學(xué),算法和數(shù)據(jù)結(jié)構(gòu)的“科學(xué)”(如“計算機(jī)科學(xué)”),還是需要其他東西?
Ryan: 想要從事編程職業(yè)的人應(yīng)該去大學(xué)學(xué)習(xí)計算機(jī)科學(xué)。當(dāng)然,可以獲得相關(guān)領(lǐng)域的學(xué)位(例如電氣工程,物理學(xué),數(shù)學(xué));有許多非常有能力的工程師根本沒有學(xué)位。但是,通過花幾年的時間學(xué)習(xí)基礎(chǔ)知識并進(jìn)行許多非常困難的實驗,確實可以得到一些好處。
Evrone: 您是否有非常喜歡的已經(jīng)實施了的第三方 Deno 生態(tài)系統(tǒng)項目?
Ryan: 是的,當(dāng)然有:
一個 React 框架 網(wǎng)絡(luò)框架(如 Express) 用于桌面應(yīng)用程序的基于 Web 的 GUI Puppeteer(與 Node 中的操縱符相同) 可視化模塊圖 最小但靈活的靜態(tài)站點生成器
Evrone: 隨著 GitHub 之類的社交平臺的推出,個體開發(fā)者和大公司現(xiàn)在都可以輕松地使用開源并做出貢獻(xiàn)。您認(rèn)為現(xiàn)在是“開源的黃金時代”,還是認(rèn)為仍存在著一些潛在的問題?
Ryan: 現(xiàn)在肯定是開源的,許可情況已廣為人知并得到了解決。關(guān)于維護(hù)的激勵模型仍然存在未解決的問題,也許 GitHub 贊助商正在朝著這個方向提供幫助。它比以前要好,但是我希望我們能找到一種方法,使維護(hù)軟件重要部分的人員可以為他們的工作得到獨立的報酬。
Evrone: Deno 已經(jīng)面世有一段時間了,目前該項目的主要技術(shù)挑戰(zhàn)是什么?
Ryan: 正在進(jìn)行中的很多事情:我們正在構(gòu)建與 Hyper Web 服務(wù)器的綁定,它將提供 HTTP 2,并且可能比當(dāng)前的 Web 服務(wù)器要快得多。我們正在構(gòu)建 deno lsp,它提供了語言服務(wù)器協(xié)議,以便 VS Code(和其他 IDE)可以直接與 Deno 進(jìn)行交互,以突出顯示語法,進(jìn)行類型檢查,格式化等 —— 期望下一次的編輯體驗會大大改善幾個月。我們正在努力通過盡可能多的 Web 平臺測試 —— 因此,隨著時間的推移,Deno 會變得與 Web 更加兼容。請查看 Q1 路線圖,以了解更多詳細(xì)信息。
Evrone: 我們的經(jīng)典時空旅行問題:如果時光可以倒流,讓你給剛開始開發(fā) Node.js 的年輕的自己一個建議,那將是什么建議?
Ryan: 在 Node 的早期,我不太確定異步 IO 是否可以由新手程序員輕松地用于大型項目中。我四處演講,提出了這一主張,但我不確定如何解決。如果我能回到過去,我會向自己保證它將起作用。我也會告訴自己,Node 將成為軟件的關(guān)鍵部分,大型軟件項目與小型項目相比需要不同的關(guān)注點:預(yù)算、溝通、組織。我會告訴自己要花更多的時間在這些元問題上。
Evrone: 對于想要通過 npm 軟件包支持 Deno 的開發(fā)人員有何建議?
Ryan: 使用 ES 模塊,并查看我們的 Node 兼容性層。
結(jié)論
我們很高興能與 Ryan 對話,進(jìn)一步地了解他的生活、想法和計劃。在 Evrone,我們經(jīng)常使用 Node.js 為客戶構(gòu)建自定義解決方案。感謝你的閱讀!
如果發(fā)現(xiàn)譯文存在錯誤或其他需要改進(jìn)的地方,歡迎到 掘金翻譯計劃 對譯文進(jìn)行修改并 PR,也可獲得相應(yīng)獎勵積分。文章開頭的 本文永久鏈接 即為本文在 GitHub 上的 MarkDown 鏈接。
