Хабрахабр

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

Ryan Dahl Райан Даль (Ryan Dahl) в 2009 году представил Node.js, спустя несколько лет отошел от дел, а на прошлой неделе нашумел новым проектом: deno — A secure TypeScript runtime on V8 (GitHub, распаковка).

Самое время вспомнить интервью, которое Райан дал подкасту Mapping The Journey в августе 2017 года, о себе, карьере, о Node.js, и почему он перестал им заниматься, над чем работает сейчас (на тот момент).

В данном посте публикуется полный перевод.
Райан Даль — инженер в проекте Google Brain и создатель Node.js, среды выполнения JavaScript на основе движка V8 из Chrome. Фрагмет перевода этого интервью уже был на Хабре: Создатель Node.js: «Для серверов я не могу представить другой язык кроме Go». В основном он работает над трансформацией изображений — колоризацией и суперразрешением. Сейчас Райан занимается исследованиями глубокого обучения. Он участвовал в разработке нескольких Open Source проектов, в том числе HTTP Parser и libuv.

Добро пожаловать в Mapping the Journey. Прамод: Всем привет. Он показал, что мы неправильно обращаемся со вводом/выводом, и научил нас разработке по модели «pure async». Когда речь идёт о Node.js, у всех на слуху имя Райана Даля. Райан, я очень рад с тобой встретиться, это большая честь. Наш сегодняшний гость — Райан Даль, хакер, талантливый программист и создатель Node. Добро пожаловать!

Я тоже рад нашей встрече. Райан: Привет!

Расскажи, чем ты занимался до того, как увлёкся технологиями? П.: Райан, ты известен прежде всего как создатель Node.

Когда мне было 6 лет, мама купила мне Apple 2C, так что доступ к компьютеру у меня появился довольно рано. Р.: В детстве я жил в Сан Диего. Так что я вырос как раз во время становления интернета. Кстати, сейчас мне 36. Потом я поступил в магистратуру по математике в Университете Рочестера. Сначала я учился в местном колледже, а после него поступил в Калифорнийский университет в Сан-Диего, чтобы изучать математику. Но спустя какое-то время мне стало скучно, потому что я подумал, что у неё нет применений в реальной жизни. Да, Там я изучал алгебраическую топологию — достаточно абстрактную дисциплину, которая казалась мне очень красивой. D., но понял, что не хочу посвящать всю оставшуюся жизнь математике, и бросил программу. После магистратуры я решил получить Ph. А потом стал делать сайты с одним парнем, Эриком. Я купил билет в один конец до Южной Америки и провёл там год в режиме «голодного студента». Я делал сайт на Ruby on Rails для фирмы сноубордов. Так и началась моя карьера разработчика.

Наверное, это интересный опыт — бросить программу Ph. П.: Здорово! D., отправиться в Южную Америку и стать веб-разработчиком.

Просто после магистратуры привыкаешь работать с абстрактными задачами, а создание сайтов — очень конкретный процесс. Р.: Ещё бы. Наверное, мне очень нравилось, что Ruby позволяет яснее выражать мысли при разработке. Но я пытался превратить всё это в некую красивую математическую теорию, как те, что я изучал в магистратуре. Думаю, дело как раз в Rails. Это меня и заинтересовало и натолкнуло на некоторые мысли. Как раз это сочетание мне и понравилось. Схема Model-View-Controller уже тогда не была новой, но, мне кажется, она стала популярной именно благодаря Rails.

После этого ты был разработчиком-фрилансером в Германии. П.: Да, веб-разработка — интересное занятие, и Ruby — отличный инструмент. Ты продолжил работать над ним ещё 6-8 месяцев, верно? Одним из твоих проектов был Node.

После Южной Америки я переехал с девушкой в Германию — она немка, и ей нужно было вернуться в университет. Р.: Всё так. Там я встретил парня по имени Крис Нойкирхен. Я начал ходить на конференции по Ruby, где люди обсуждали эту новую парадигму Model-View-Controller. Rack превращал веб-сервер в интерфейс с единственной функцией, где можно было делать запросы и получать ответы. Он создал Rack — проект, который, по сути, был упрощённой абстракцией веб-сервера. Напомню, что в Nginx всё работает асинхронно, поэтому когда строишь для него модуль, нужно избегать блокировок. Тогда же я работал с модулем Nginx во фриланс-проекте для Engineyard. Думаю, именно поэтому у меня возникла идея объединить эти две вещи. Я познакомился с проектом Rack Криса Нойкирхена как раз тогда, когда работал с неблокирующим вводом/выводом на веб-сервере Nginx.

Как же ты решился провести за этим делом следующие 6 месяцев? П.: Получается, на основе Rack и Nginx у тебя появилась идея разработать фреймворк, который выполнял бы Javascript-код со стороны сервера и заметно увеличил бы производительность.

В декабре 2008 г. Р.: Эти два элемента — Rack и Nginx с его асинхронностью — вместе упрощали интерфейс веб-сервера. А вместе с ним — движок JavaScript V8. вышел Chrome. В общем, с выходом V8 я стал в нём разбираться. Точнее, не сам движок, а среда выполнения, где происходит JIT-компиляция. И вдруг меня осенило. V8 выглядел интересно, аккуратно, и работал быстро. Я имею в виду, что все уже делают AJAX-запросы в браузере, которые и так являются неблокирующими. JavaScript однопоточный, и все уже пишут на нём неблокирующие алгоритмы. И я так вдохновился идеей, что без перерыва работал над ней следующие 4 года. Я подумал: отлично, JavaScript плюс асинхронный ввод/вывод и немного функционала для HTTP-сервера — это то, что надо.

Думаю, разработчики как раз ждали такого фреймворка. П.: Да, JavaScript и асинхронный ввод/вывод сработали отлично. И спрошу из любопытства: когда ты разрабатывал Node, у тебя был какой-то наставник, или ты справлялся сам?

Несколько моих друзей — программисты, и они давали некоторые советы, но я начинал работать один у себя в комнате. Р.: В целом, я делал всё сам. Уже там многие давали советы и подсказывали идеи для Node. Потом я переехал в Сан-Франциско, и на работе в Joyent встретил много по-настоящему профессиональных программистов.

Расскажи, пожалуйста, о процессе разработки Node. П.: Ясно. Конечно, с 2009 года прошло уже немало времени...

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

В основе Node лежит модель программирования «pure async». П.: Класс, у тебя всё отлично получилось. Как считаешь, эта идея хорошо сработала?

Прошло уже несколько лет, и сам я не работал над Node где-то с 2012-2013 года. Р.: Интересный вопрос. Когда он только вышел, я читал немало лекций и пытался объяснить, что, возможно, мы делали всё неправильно, и неблокирующий ввод/вывод помог бы решить многие проблемы разработки. Конечно же, Node сильно вырос за это время. Но при этом в рамках одного процесса обрабатывалось бы множество запросов, и так мы бы добились асинхронности. Или мы могли бы вообще забыть о потоках и обойтись только абстракциями процессов и сериализацией. Особенно после выхода Go. В то время я искренне верил в эту идею, но за последние пару лет я понял, что это далеко не единственная возможность. Тогда у него уже был неплохой рантайм и качественные green threads, и со всем этим было легко использовать абстракции. По-моему Go появился ещё раньше, но я впервые услышал о нём в 2012 году. Это был как бы блокирующий ввод/вывод, но, насколько я понимаю, интерфейс между Go и операционной системой через green threads на самом деле неблокирующий.

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

Использовать Goroutines — одно удовольствие. П.: Мне тоже очень нравится модель программирования в Go. Сейчас моя команда как раз пишет распределённое приложение на Go.

Не могу и представить, как работать с чем-то ещё. Р.: Да, для некоторых видов приложений Go подходит лучше всего — например, когда строишь сервер. К тому же, в Javascript теперь есть ключевое слово async и можно работать с асинхронными функциями, так что больше не приходится метаться между анонимными функциями и разбираться в дебрях обратных вызовов. Хотя, думаю, всё же парадигма безблокировочности здорово сработала для Javascript, в котором нет потоков. Тем не менее, я считаю, что Node — не лучший вариант для масштабного веб-сервера. В новых версиях Javascript работать стало проще. Честно говоря, поэтому я и перестал работать над Node. Для этого я сам точно выбрал бы Go. Я просто понял, что это не идеальная система для разработки сервера.

Он позволяет хитро использовать скрипты при создании сайтов. Как ни странно, мне кажется, что Node действительно блестяще показал себя как раз на стороне клиента. Это позволяет обрабатывать на сервере JavaScript со стороны клиента. Например, Browserify как бы упаковывает клиентский Javascript. Node может оказаться очень полезным и удобным для некоторых вещей. Ещё один пример — небольшие серверы для разработки, или даже рабочие серверы, обрабатывающие живой трафик. Но если вы поднимаете огромный распределённый DNS-сервер, я бы не советовал выбирать Node.

Для любого дела важно выбрать правильный инструмент, так что у тебя вполне объективное отношение к Node. П.: Разработчикам по всему миру будет полезно об этом задуматься. Наверное, ты удивился, что он так быстро достиг успеха? Ты впервые представил Node.js на конференции JsConf 2009 Berlin.

В общем-то, я целые четыре года не переставал удивляться. Р.: Конечно. Node развивался невероятными темпами и очень понравился сообществу.

Расскажи о своём опыте там. П.: После этого ты присоединился к Joyant в Сан-Франциско и работал над Node на постоянной основе, верно? Разработчики были очень довольны, и ты был в центре событий.

Я и вправду был в самом центре событий, ездил на различные конференции. Р.: Да, это был один из самых ярких моментов моей жизни. Когда я комментировал что-то в сети, такое чувство, что мне отвечали сразу человек сто. Однажды я даже побывал в Японии, и люди просили со мной сфотографироваться… Мне даже стало как-то неудобно. Мне всё это не нравилось. Тогда я осознал, что мне надо осторожно выбирать слова и думать над тем, как меня воспринимают — похоже, ко мне действительно прислушивались, и это было непривычно. В этом плане мне было немного немного не по себе. Ведь я программист и просто хочу писать код, и иногда высказывать мнение без лишней осторожности.

И он уже стал настолько влиятельной технологией. П.: Тебе было 29 или 30 лет, когда ты создал Node?

Но тогда я всё-таки был скорее начинающим разработчиком. Р.: Да.

Node не был единственным решением, но он стал самым успешным — как думаешь, почему? П.: Райан, в то время было много разных проектов, которые работали с JavaScript на стороне сервера.

Сейчас уже даже не вспомню их имен. Р.: Это правда, несколько человек пытались приспособить JavaScript для серверной работы.

И если использовать блокирующий ввод/вывод, то не получится обрабатывать запросы. Дело в том, что во всех этих проектах использовался блокирующий ввод/вывод, и это не очень хорошо сочеталось с тем, как устроен JavaScript, ведь он не работает с потоками. К тому же, я добавил качественный модуль HTTP и показал, как настроить HTTP-сервер, а также простой TCP-сервер. То есть придётся обрабатывать их по одному, и из этого ничего не выйдет. Надо признаться, что поднять веб-сервер — дело не из лёгких, и многим проектам требовался функционал, который сообщество должно было достраивать самостоятельно. Я постарался, чтобы эти вещи работали исправно и люди могли строить сайты без особых проблем. По-моему, для любого нового фреймворка, или вообще продукта в целом, нужен базовый образец, которым сразу же можно воспользоваться. Но никто ничего не строил, потому что систему не с чем было использовать. Это стало преимуществом Node — люди могли просто скачать его и сразу настроить веб-сервер.

Ещё многие уже умели писать код на JavaScript, поэтому могли сразу приступить к делу. П.: Действительно, хорошие образцы очень важны, как и легкость установки и использования. Когда я только начал работать с Node, мне тоже очень помогло моё знание JavaScript.

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

В 2012 году над Node трудилось огромное число разработчиков. П.: Это точно. Почему ты решил уйти и передать проект Айзеку Шлутеру из Joyent?

Тогда я проработал над Node уже 4 года, и, в общем-то, сделал всё, что планировал. Р.: Думаю, на то было две причины. Моим замыслом было создать небольшое, компактное ядро, на которое люди могли бы надстраивать свои модули. Я никогда не рассчитывал, что Node превратится в огромный API. Модули расширения были добавлены с самого начала, потом мы привели в порядок сетевые библиотеки, HTTP, UDP, TCP, и обеспечили доступ ко всем файловым системам. Я хотел поддерживать несколько ключевых функций. Мы хотели использовать абстракции Windows — порты завершения — для асинхронного ввода/вывода. Затем команда человек из пяти справилась с важной задачей — настройкой всего этого для Windows. В какой-то момент всё было готово, и мы выпустили Node для Windows. Поэтому пришлось переписать корневую библиотеку, и из этого получилась библиотека libuv. Я достиг своей цели, и рад, что у меня получилось довести всё до ума. Тогда я подумал: отлично. Мне хотелось заняться другими вещами. Конечно, найдётся ещё тысяча багов, которые можно исправлять до конца жизни, но в команде достаточно людей, которые могут об этом позаботиться. Ну и я просто не хотел быть в центре внимания каждый раз, когда пишу что-то в блоге. К тому же, вышел Go, и для меня Node уже не был единственным решением для серверной разработки.

Да, не всем это по душе. П.: Ясно. Как считаешь, теперь Node их выполнил? Когда ты начинал работать над Node, у тебя наверняка были определённые планы.

Ведь теперь его используют сотни тысяч людей. Р.: Конечно, Node превзошёл все мои ожидания.

П.: Расскажи, чем ты решил заняться, когда завершил этот интересный этап разработки Node?

Их у меня было несколько. Р.: После того, как я ушёл из Joyent, я переехал в Нью-Йорк и взял небольшой отпуск, чтобы поработать над собственными проектами. Все говорили: «Ого, он такой простой, я бы сам такое построил». В то время вышел Instagram, тогда он был оригинальным и незамысловатым. У меня был проект социальной сети, ещё я строил систему сборки для C++ и другую систему сборки для HTML, которая была похожа на Browserify — она по-умному упаковывала Javascript и HTML. И, естественно, я тоже так думал. Некоторые из них до сих пор на стадии разработки, например, моя социальная сеть. Вообще у меня было немало проектов, но, мне кажется, ни один из них не удался по-настоящему. Вот этим я и занимался какое-то время. Когда-нибудь я снова за неё возьмусь. Потом я начал читать и узнавать о свёрточных нейронных сетях и о том, как решается проблема классификации изображений, и я очень увлёкся машинным обучением.

Как впечатления? П.: Ты также был резидентом в программе Google Brain.

Вернусь немного в прошлое: два года тому назад вышел TensorFlow. Р.: Да, недавно я провёл год в Маунтин-Вью.

Думаю, идея была в том, чтобы пригласить людей, не обязательно знакомых с машинным обучением, но соображающих в математике и программировании. Тогда же в лаборатории машинного обучения Google Brain объявили о новой программе для резидентов, по которой туда приглашают около 20 человек. В машинном обучении постоянно происходят перемены и делается много работы, но теперь сообщество наконец сосредоточилось на нейронных сетях. Тех, кому было интересно поработать с этими новыми идеями. Поэтому возникла такая идея — собрать людей, которым интересно поработать с новым фреймворком TensorFlow, чтобы, возможно, прийти к каким-то любопытным выводам. Считается, что это самый эффективный алгоритм для машинного обучения. В основном я разрабатывал модели и писал о них научные работы. Я провёл в лаборатории год. То есть, если есть какое-то исходное изображение, нужно предсказать, какое изображение получится на выходе. По большей части я работал с задачами трансформации изображений. Один из реальных примеров — колоризация. По-моему, это очень интересная задача. Самое интересное, что для этой задачи есть целая бесконечность данных для обучения. Можно взять чёрно-белое изображение и попытаться предсказать, какие цвета получатся в результате. Одна из основных проблем в машинном обучении — необходимость огромного количества данных, а для таких задач данных предостаточно. Ведь можно из любого цветного фото можно полностью убрать насыщенность и получить исходное чёрно-белое изображение. Например, есть генеративно-состязательные сети и пиксельные свёрточные сети, которые научились воспринимать настоящие изображения, то есть различать реальные изображения и искусственные копии, которые выглядят как реальные. Ещё в последнее время проводится много исследований генеративных моделей. Я исследовал суперразрешение — это процесс, который позволяет увеличить разрешение исходного изображения. Я хотел использовать результаты этих исследований генеративных моделей и бесконечную базу данных для тренировки, и применить всё это к задачам трансформации изображений. Также я работал над задачей трансформации между изображениями и выполнил два проекта по колоризации.

Я тоже читал, что TensorFlow — мощная платформа для задач машинного обучения. П.: Спасибо за отличное объяснение, Райан! Ты продолжаешь работать в области машинного обучения? Классификация изображений, трансформация — конечно, я в них особо разбираюсь, но уверен, что всё это очень увлекательно.

Я изучаю генеративные модели и помогаю исследователям строить системы и модели нового поколения. Р.: Да, я по-прежнему работаю в Google, но уже в качестве инженера, и занимаюсь похожими задачами.

Хотя генеративные модели почти не связаны с твоими прошлыми занятиями — Javascript, Node и веб-разработкой... П.: Здорово!

Но всё-таки я начинал с математики, и у меня неплохая математическая база. Р.: Это точно. Я не хочу превращаться в гуру ни по JavaScript, ни по машинному обучению. Ну и я не из тех, кто агитирует за какую-то определённую сферу. Больше всего меня вдохновляет изобретать и строить нечто новое, что пойдёт человечеству на пользу. Мне просто нравится исследовать интересные возможности.

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

Системы машинного обучения, с которыми мы работаем, или очень примитивны, или совсем не работоспособны. Р.: Да, Мне надо быть осторожнее с предсказаниями… Tак что просто поделюсь личным мнением: мы невообразимо далеко от того, чтобы смоделировать человеческий интеллект. Мне кажется, что те, кто далёк от этой сферы, часто думают, что можно взять модель, передать ей данные и всё получится само собой. Я как раз написал в блоге пост о моей резиденции в Google Brain, и там я перечислил проблемы, которые возникают при разработке таких моделей. Есть много подводных камней и недостаточно исследованных вопросов. Но это не так просто. Так что нам ещё очень далеко до имитации человеческого мозга, но уже сейчас появляются многообещающие технологии — например, свёрточные нейронные сети или метод обратного распространения ошибки. Чтобы получить даже самые скромные результаты, иногда требуются многие месяцы экспериментов и филигранной настройки. Также у нас есть GPU и методы их тренировки, и мы уже знаем, как проводить с ними хотя бы отчасти распределённое обучение. И, что обнадёживает, эти технологии основаны на модели нейронных сетей, которая не то чтобы подобна человеческому мозгу, но в какой-то степени вдохновлена знаниями о нём. Лично я — атеист, и не верю, что мой мозг — это что-то большее, чем химические вещества и нейроны. Поэтому, на мой взгляд, основы для более масштабных и умных систем закладываются уже сейчас. Поэтому, в принципе, нет никакий препятствий для того, чтобы имитировать эти процессы — просто необходимо больше исследований и наработок в этой области. Моё сознание и сознание любого человека каким-то образом закодировано во взаимодействиях этих нейронов. Пока слишком рано предсказывать, сколько времени это займёт.

Райан, ты многое повидал — скажи, как, по-твоему, будут развиваться технологии через 20 лет? П.: Понятно.

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

Так интересно наблюдать, как по Маунтин-Вью ездят автомобили без водителя. П.: Согласен, машинное обучение — захватывающая тема. Райан, благодарим тебя за отличный фреймворк Node и за то, что побывал у нас в гостях. Когда-нибудь в будущем будет здорово просто откинуться в кресле и доверить машине полный контроль. И удачи в будущих проектах!

Р.: Спасибо за приглашение, было интересно пообщаться!

На этом всё. П.: Спасибо! Он уже многого добился в начале своей карьеры разработчика и прошёл впечатляющий путь. Я был рад побеседовать с Райаном, скромным и отличным парнем. Встретимся через 2 недели, чтобы познакомиться со следующей историей!

Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»