Интервью с Райаном Далем, создателем Node.js

Райан Даль: «Снижать сложность всегда полезно»

Вступление

Райан Даль (Ryan Dahl) — основатель и первый разработчик Node.js и Deno — среды исполнения JavaScript и TypeScript. Нам предоставилась возможность поговорить с Райаном о его проектах. Он рассказал об основных задачах по развитию Deno, поделился мнением о будущем JavaScript и TypeScript, поведал о сторонних проектах экосистемы Deno и о том, как бы он изменил свой подход к Node.js, если бы мог путешествовать во времени.

Интервью

Evrone: Твой новый проект Deno произвел сильное впечатление на разработчиков. Чем ты сейчас в основном занимаешься?

Райан: Я работаю над Deno большую часть времени. Deno — это довольно большая коллекция программ, объединенных в исполняемый файл, который мы поставляем. Мы улучшаем среду выполнения Deno, а также работаем над применением базовой инфраструктуры в коммерческих проектах.

 

Evrone: У тебя есть опыт работы со множеством языков программирования: C, Rust, Ruby, JavaScript, и TypeScript. С которым из них тебе больше всего нравится работать?

Райан: Сейчас мне интереснее всего писать на Rust. Его непросто изучать, и он не годится для многих задач, но для того, над чем я сейчас работаю, подходит идеально. Он как улучшенная версия С++. Уверен, что никогда не начну нового проекта на С++. Rust значительно упрощает написание низкоуровневого кода.

JavaScript никогда не был моим фаворитом, просто это самый распространенный язык и потому подходит для воплощения многих идей. TypeScript я отдельным языком не считаю. Его прелесть в том, что это типизированный JavaScript. TypeScript позволяет строить на JavaScript более крупные и надежные системы. Можно сказать, что это мой основной язык для небольших обыденных задач.

С помощью Deno мы пытаемся устранить сложность транспайлинга TypeScript-кода в JavaScript, чтобы им могло пользоваться больше людей.

 

Evrone: В ядро языков Python, PHP и Ruby успешно добавили gradual typing. Что, по-твоему, тормозит добавление типов в JavaScript?

Райан: Типы были добавлены в JavaScript с помощью TypeScript. И получилось это намного удачнее, чем с Python, PHP или Ruby. TypeScript — JavaScript с типами. Правильнее было бы спросить: что мешает комитету по стандартам JavaScript (TC39) принять TypeScript? Стандартизация, по самой своей природе, проводится медленно и осторожно. Сначала изучают возможность Types-As-Comments, которые могли бы позволить средам исполнения JavaScript выполнять синтаксис TypeScript, игнорируя типы. Думаю, в конце концов TypeScript (или что-то подобное) будет предложено как часть стандарта JavaScript, но на это потребуется время.

 

Evrone: Как преданный пользователь VIM, что ты думаешь о современных редакторах для программистов, например, Visual Studio Code? Достаточно ли они хороши для старой гвардии?

Райан: Все, с кем я работаю, пользуются VScode и вполне довольны. Наверное, большинству стоит его использовать.

Я продолжаю юзать VIM по двум причинам. Во-первых, я с ним очень хорошо знаком и быстро с ним управляюсь; мне нравится работать с ssh и tmux, и мне нравится ясность полноэкранного терминала. Во-вторых, IT-инфраструктура должна опираться на текст и управляться простыми инструментами. В мире Java совершили ошибку, слишком сильно связав язык и IDE. Теперь практически каждый вынужден использовать IDE для программирования на Java. Использование простых инструментов гарантирует, что программы, которые я разрабатываю, не будут излишне зависеть от IDE. Если вы слишком часто используете grep вместо jump-to-definition, применение косвенной адресации станет недопустимым. Думаю, в результате работы в VIM у меня получаются более качественные программы.

 

Evrone: Среда выполнения Deno продемонстрировала возможные способы решения давно наболевших проблем с управлением зависимостями, безопасностью и многим другим. Вы хотите, чтобы он был, как Haskell, полем экспериментов, или нацеливаетесь на какое-то практическое применение, где это был бы оптимальный выбор?

Райан: Не стоит путать новизну с экспериментом. Deno абсолютно практичная вещь, основанная на многолетнем опыте работы с JS на стороне сервера. Я и мои коллеги нацелены на создание практической среды выполнения динамического языка. В отношении безопасности и управления зависимостями мы выбрали довольно консервативный подход. Мы могли бы легко ввести еще одну централизованную систему, подобную NPM, но предпочли систему ссылок на основе веб-стандарта URL. В первом случае нам было бы легче обнаружить всевозможные дыры в безопасности файловой системы и сети, но мы решили осторожно управлять доступом, как в браузере.

Deno — новое программное обеспечение, и потому не во всех случаях подходит для использования. Но также Deno — это большая база Rust-кода с высоким быстродействием, надежными сборками без ошибок и регулярными запланированными релизами. Это не эксперимент.

 

Evrone: В 2020 году большинство конференций разработчиков программного обеспечения стали «онлайн» и «виртуальными». Пробовал ли ты новый формат, и что ты думаешь о нём?

Райан: Я участвовал в нескольких; но сейчас я их избегаю. Для меня лучшая часть конференций — это неформальное общение. Этого важного аспекта нет при онлайн-формате. Я предпочитаю в свободное время смотреть доклады на YouTube, на двойной скорости. Надеюсь, что в 2021 году смогу побывать на не-виртуальных конференциях.

 

Evrone: Идея децентрализации графа зависимостей из одного файла в отдельные файлы исходного кода была решена в Webpack и одобрена многими разработчиками. Но управление зависимостями — сложная задача, на переход платформы Node.js с Common.js на ESM ушли годы. Какие основные проблемы управления зависимостями вы хотите решить с помощью Deno?

Райан: Браузеры не благословили ни один CDN на распространение JavaScript, ведь децентрализованный характер Интернета — его главное преимущество. Я не понимаю, почему это не может работать и для серверного JavaScript. Я хочу, чтобы Deno не зависела ни от какой централизованной базы данных кода.

 

Evrone: Python и JavaScript соревнуются за титул лучшего универсального языка программирования. Как ты считаешь, который из них будущим разработчикам стоит изучать первым?

Райан: Скриптовые языки хорошо подходят для начинающих. Python и JavaScript — по сути, довольно похожие системы, с разным синтаксисом и немного различающейся семантикой. Языком JavaScript управляет международный комитет по стандартам. JS работает на любой платформе, примерно на порядок быстрее, чем Python (если сравнивать V8 и CPython) и имеет больше пользователей. С другой стороны, для некоторых областей, особенно для научных расчетов, доступно больше библиотек Python. В зависимости от того, что пытается сделать начинающий программист, ему может подойти Python. Однако я считаю, что, как правило, лучше начинать с JavaScript.

 

Evrone: Парадигма асинхронной конкурентности с одним основным потоком и небольшими вызываемыми обработчиками была одним из краеугольных камней Node.js. Теперь, благодаря новому синтаксису async/await и концепции сопрограмм (корутин) эта идея дополнительно усиливается. Как автор платформы, что ты думаешь о них и их альтернативах, таких как «горутины» в Go или конкурентность на основе потоков в Ruby?

Райан: Потоки ОС плохо масштабируются для приложений с высоким уровнем многозадачности. Не используйте Ruby, если у вас будет много конкурентных подключений.

Горутины удивительно просты в использовании и обеспечивают максимальную производительность. Node и Deno, как и Go, построены на неблокирующих системах ввода-вывода и уведомлений о событиях ОС (epoll, kqueue). По сути, JavaScript является однопоточной системой, поэтому один экземпляр Node или Deno обычно не может использовать все ядра ЦП в системе, не создавая новые экземпляры. Node/Deno оптимальны для JavaScript, но Go станет наилучшим выбором для систем с высокой степенью конкурентности, если нет иных требований, которые склоняют чашу весов к JS.

 

Evrone: В условиях жесткой конкуренции, каким ты видишь будущее JavaScript и TypeScript, особенно в отношении бэкенда, встраиваемых систем и машинного обучения?

Райан: Динамические, или скриптовые языки очень полезны. Часто основная проблема заключается не в производительности компьютеров, а в сроках разработки. Очень важна возможность быстрой разработки и развертывания. Из динамических языков JavaScript (чистый JavaScript или JavaScript с типами) является самым популярным и самым быстрым. Я думаю, что в будущем единственным динамическим языком, к которому мы придем, будет этот странный эволюционировавший язык, выросший из веб-браузеров. В Deno мы работаем над устранением препятствий для применения JS там, где он в настоящее время используется нечасто, скажем, в машинном обучении. Например, мы, собираемся добавить в Deno поддержку WebGPU, что позволит легко программировать на GPU «из коробки» и, в конечном итоге, позволит запускать в Deno такие системы, как TensorFlow.js.

Я уже говорил, что динамические языки имеют свои ограничения и подходят не для всех проблемных областей. Если вы программируете базу данных, имеет смысл писать на языке, который дает максимальный контроль над компьютером — например, Rust или C ++. Если вы пишете высококонкурентный API-сервер, то лучший выбор — Go.

 

Evrone: Современные операционные системы и ваша новая среда выполнения Deno предоставляют гранулярные права доступа, чтобы компенсировать риски безопасности стороннего программного обеспечения и зависимостей. Но могут ли конечные пользователи и разработчики, использующие зависимости, принимать правильные решения, «разрешая» и «отклоняя» запросы защиты приложений? Как ты думаешь, будем ли мы через несколько лет автоматом кликать «Разрешить всё», как большинство из нас делает сейчас с «подтверждениями безопасности» файлов cookie веб-сайта?

Райан: Всплывающие окна cookie — не совсем подходящая аналогия. Это довольно бесполезный юридический побочный продукт. Лучше встроенный диалог, который предлагает: «Разрешить этому веб-сайту доступ к вашей камере» или «Разрешить уведомления на рабочем столе», или «Разрешить этому веб-сайту видеть ваше местоположение». Это уже не бесполезные, а важные элементы безопасности.

Программисты запускают на своих компьютерах множество случайных процессов автоматизации. Ни у кого нет времени на аудит всего запускаемого кода, и запуск его в Docker-контейнере не решает вопрос. Когда вы запускаете lint, разве это изолированный процесс? Нет. Ответ таков: вы должны быть уверены, что сценарий lint не взломает вашу систему. Я думаю, что целесообразно позволить пользователям видеть и, возможно, отклонять ненужный доступ к системе.

 

Evrone: Новая идея full-stack побуждает разработчиков писать как фронтенд-, так и бэкенд-код, что стало на удивление просто с использованием одного и того же языка и общего технологического стека, как TypeScript, например. Как ты считаешь, это хорошая идея для разработчиков так распыляться в процессе повседневной работы?

Райан: Снижать сложность всегда полезно. Чем меньше языков, виртуальных машин, фреймворков и концепций, с которыми должен взаимодействовать программист, тем лучше.

 

Evrone: Каким образом вы планируете управлять обновлениями версий для самого языка TypeScript? В экосистеме Node.js обновления синтаксиса JavaScript с движком V8 часто приводят к тому, что некоторые пакеты не работают.

Райан: Пользователям не стоит полагаться на новейшие возможности языков, они могут быть нестабильными. Однако язык TypeScript близится к полной стабилизации.

 

Evrone: Каким ты видишь хорошее образование для разработчика ПО? Нужна ли ему «компьютерная наука» со всей математикой, алгоритмами и структурами данных, или нужно что-то другое?

Райан: Тому, кто хочет заняться программированием, стоит идти в университет и изучать информатику. Конечно, можно изучать смежные дисциплины, например, электротехнику, математику, физику. Есть много талантливых инженеров, у которых вообще нет специального образования. Но несколько лет изучения основ и выполнения множества очень сложных лабораторных работ даёт кое-какое преимущество.

 

Evrone: Есть ли уже реализованные сторонние проекты экосистемы Deno, которые тебе нравятся?

Райан: Да, конечно:

  • один из фреймворков React;
  • веб-фреймворк (наподобие Express);
  • веб-интерфейсы для десктопных приложений;
  • библиотека puppeteer (такая же, как для Node);
  • визуализация графов зависимостей между модулями;
  • минималистичный, но гибкий генератор статических сайтов.

 

Evrone: С появлением социальных платформ, подобных GitHub, как отдельные разработчики, так и крупные компании могут легко использовать открытый исходный код, а также вносить свой вклад. Наступил ли «золотой век» открытого исходного кода или есть незаметные с первого взгляда проблемы?

Райан: Конечно, открытый исходный код теперь стал стандартом, ситуация с лицензированием нашла всеобщее понимание и в целом урегулирована. По-прежнему есть нерешенные вопросы о модели стимулирования поддержки. Возможно, спонсоры Github помогают в этом направлении. Стало лучше, чем было раньше, но я рассчитываю, мы найдем способ, чтобы люди, которые поддерживают важные компоненты ПО, получали независимую оплату за свои усилия.

 

Evrone: Deno уже исполнилось несколько лет. Какие основные технические задачи вы сейчас решаете в рамках проекта?

Райан: Происходит много всего. Мы создаём привязки к веб-серверу Hyper, который будет предоставлять HTTP/2 и, вероятно, будет работать намного быстрее, чем нынешний веб-сервер. Мы создаем «Deno LSP», который предлагает протокол языкового сервера, чтобы VSCode (и другие IDE) могли напрямую общаться с Deno, получая подсветку синтаксиса, проверку типов, форматирование и т. д. Думаю, что через пару месяцев редактировать станет гораздо удобнее. Мы стараемся пройти как можно больше тестов Web Platform Tests, так что Deno становится все более веб-совместимым. Посмотрите план на 1 квартал 2021-го, чтобы узнать больше о развитии проекта.

 

Evrone: Наш фирменный вопрос о путешествиях во времени: если бы ты мог отправиться в то время, когда только начал разрабатывать Node.js, и дать себе один-единственных совет, что бы ты посоветовал?

Райан: На начальном этапе работы с Node я сомневался смогут ли начинающие программисты легко освоить асинхронный ввод-вывод в больших проектах. Я всех в этом убеждал, но сам-то был не особо уверен, что всё сработает, как надо. Если бы я мог вернуться в прошлое, я бы успокоил себя, что сработает. Затем я сказал бы себе, что Node станет весьма важным ПО, и что большие программные проекты требуют иных забот, чем небольшие, в смысле бюджета, коммуникаций, организации. Я бы посоветовал себе уделять больше времени этим мета-задачам.

 

Evrone: Что ты посоветуешь разработчикам, которые хотят поддержать Deno своими пакетами npm?

Райан: Использовать ES-модули и ознакомиться с нашим уровнем совместимости Node.

Заключение

Мы активно поддерживаем open-source проекты и берём интервью у самых разных людей из мира разработки, чтобы вы могли познакомиться с авторами инструментов, которые, быть может, используете в работе. Если хотите узнать больше — познакомьтесь с нашими собственными open-source инициативами и другими интервью.

Использование простых инструментов гарантирует, что мои программы не будут излишне зависеть от IDE. Думаю, в результате у меня получается более качественное ПО
Райан Даль
Создатель Node.js и Deno
Связаться с нами
Нужна команда?
Давайте обсудим ваш проект
Прикрепить файл
Максимальный размер файла: 8 МБ.
Допустимые типы файлов: jpg jpeg png txt rtf pdf doc docx ppt pptx.