[Перевод] Интервью с Райаном Далем, создателем Node.js
Райан Даль (Ryan Dahl) в 2009 году представил Node.js, спустя несколько лет отошел от дел, а на прошлой неделе нашумел новым проектом: deno — A secure TypeScript runtime on V8 (GitHub, распаковка).
Самое время вспомнить интервью, которое Райан дал подкасту Mapping The Journey в августе 2017 года, о себе, карьере, о Node.js, и почему он перестал им заниматься, над чем работает сейчас (на тот момент).
Фрагмет перевода этого интервью уже был на Хабре: Создатель Node.js: «Для серверов я не могу представить другой язык кроме Go». В данном посте публикуется полный перевод.
Райан Даль — инженер в проекте Google Brain и создатель Node.js, среды выполнения JavaScript на основе движка V8 из Chrome. Сейчас Райан занимается исследованиями глубокого обучения. В основном он работает над трансформацией изображений — колоризацией и суперразрешением. Он участвовал в разработке нескольких Open Source проектов, в том числе HTTP Parser и libuv.
Прамод: Всем привет. Добро пожаловать в Mapping the Journey. Когда речь идёт о Node.js, у всех на слуху имя Райана Даля. Он показал, что мы неправильно обращаемся со вводом/выводом, и научил нас разработке по модели «pure async». Наш сегодняшний гость — Райан Даль, хакер, талантливый программист и создатель Node. Райан, я очень рад с тобой встретиться, это большая честь. Добро пожаловать!
Райан: Привет! Я тоже рад нашей встрече.
П.: Райан, ты известен прежде всего как создатель Node. Расскажи, чем ты занимался до того, как увлёкся технологиями?
Р.: В детстве я жил в Сан Диего. Когда мне было 6 лет, мама купила мне Apple 2C, так что доступ к компьютеру у меня появился довольно рано. Кстати, сейчас мне 36. Так что я вырос как раз во время становления интернета. Сначала я учился в местном колледже, а после него поступил в Калифорнийский университет в Сан-Диего, чтобы изучать математику. Потом я поступил в магистратуру по математике в Университете Рочестера. Да, Там я изучал алгебраическую топологию — достаточно абстрактную дисциплину, которая казалась мне очень красивой. Но спустя какое-то время мне стало скучно, потому что я подумал, что у неё нет применений в реальной жизни. После магистратуры я решил получить Ph.D., но понял, что не хочу посвящать всю оставшуюся жизнь математике, и бросил программу. Я купил билет в один конец до Южной Америки и провёл там год в режиме «голодного студента». А потом стал делать сайты с одним парнем, Эриком. Так и началась моя карьера разработчика. Я делал сайт на Ruby on Rails для фирмы сноубордов.
П.: Здорово! Наверное, это интересный опыт — бросить программу Ph.D., отправиться в Южную Америку и стать веб-разработчиком.
Р.: Ещё бы. Просто после магистратуры привыкаешь работать с абстрактными задачами, а создание сайтов — очень конкретный процесс. Но я пытался превратить всё это в некую красивую математическую теорию, как те, что я изучал в магистратуре. Наверное, мне очень нравилось, что Ruby позволяет яснее выражать мысли при разработке. Это меня и заинтересовало и натолкнуло на некоторые мысли. Думаю, дело как раз в Rails. Схема Model-View-Controller уже тогда не была новой, но, мне кажется, она стала популярной именно благодаря Rails. Как раз это сочетание мне и понравилось.
П.: Да, веб-разработка — интересное занятие, и Ruby — отличный инструмент. После этого ты был разработчиком-фрилансером в Германии. Одним из твоих проектов был Node. Ты продолжил работать над ним ещё 6–8 месяцев, верно?
Р.: Всё так. После Южной Америки я переехал с девушкой в Германию — она немка, и ей нужно было вернуться в университет. Я начал ходить на конференции по Ruby, где люди обсуждали эту новую парадигму Model-View-Controller. Там я встретил парня по имени Крис Нойкирхен. Он создал Rack — проект, который, по сути, был упрощённой абстракцией веб-сервера. Rack превращал веб-сервер в интерфейс с единственной функцией, где можно было делать запросы и получать ответы. Тогда же я работал с модулем Nginx во фриланс-проекте для Engineyard. Напомню, что в Nginx всё работает асинхронно, поэтому когда строишь для него модуль, нужно избегать блокировок. Я познакомился с проектом Rack Криса Нойкирхена как раз тогда, когда работал с неблокирующим вводом/выводом на веб-сервере Nginx. Думаю, именно поэтому у меня возникла идея объединить эти две вещи.
П.: Получается, на основе Rack и Nginx у тебя появилась идея разработать фреймворк, который выполнял бы Javascript-код со стороны сервера и заметно увеличил бы производительность. Как же ты решился провести за этим делом следующие 6 месяцев?
Р.: Эти два элемента — Rack и Nginx с его асинхронностью — вместе упрощали интерфейс веб-сервера. В декабре 2008 г. вышел Chrome. А вместе с ним — движок JavaScript V8. Точнее, не сам движок, а среда выполнения, где происходит JIT-компиляция. В общем, с выходом V8 я стал в нём разбираться. V8 выглядел интересно, аккуратно, и работал быстро. И вдруг меня осенило. JavaScript однопоточный, и все уже пишут на нём неблокирующие алгоритмы. Я имею в виду, что все уже делают AJAX-запросы в браузере, которые и так являются неблокирующими. Я подумал: отлично, JavaScript плюс асинхронный ввод/вывод и немного функционала для HTTP-сервера — это то, что надо. И я так вдохновился идеей, что без перерыва работал над ней следующие 4 года.
П.: Да, JavaScript и асинхронный ввод/вывод сработали отлично. Думаю, разработчики как раз ждали такого фреймворка. И спрошу из любопытства: когда ты разрабатывал Node, у тебя был какой-то наставник, или ты справлялся сам?
Р.: В целом, я делал всё сам. Несколько моих друзей — программисты, и они давали некоторые советы, но я начинал работать один у себя в комнате. Потом я переехал в Сан-Франциско, и на работе в Joyent встретил много по-настоящему профессиональных программистов. Уже там многие давали советы и подсказывали идеи для Node.
П.: Ясно. Расскажи, пожалуйста, о процессе разработки Node. Конечно, с 2009 года прошло уже немало времени…
Р.: Для меня лучшие моменты в жизни — это когда я погружаюсь во что-то с головой, когда верю в какую-то идею. И когда у меня есть время, чтобы старательно над ней работать. Node был такой идеей, которую нужно было воплотить, и если бы не я, за это взялся бы кто-то ещё. Просто так вышло, что у меня было мало работы и достаточно свободного времени. Я мог посвятить Node несколько месяцев — как раз за такое время можно выпустить начальную версию. И это было здорово и весело.
П.: Класс, у тебя всё отлично получилось. В основе Node лежит модель программирования «pure async». Как считаешь, эта идея хорошо сработала?
Р.: Интересный вопрос. Прошло уже несколько лет, и сам я не работал над Node где-то с 2012–2013 года. Конечно же, Node сильно вырос за это время. Когда он только вышел, я читал немало лекций и пытался объяснить, что, возможно, мы делали всё неправильно, и неблокирующий ввод/вывод помог бы решить многие проблемы разработки. Или мы могли бы вообще забыть о потоках и обойтись только абстракциями процессов и сериализацией. Но при этом в рамках одного процесса обрабатывалось бы множество запросов, и так мы бы добились асинхронности. В то время я искренне верил в эту идею, но за последние пару лет я понял, что это далеко не единственная возможность. Особенно после выхода Go. По-моему Go появился ещё раньше, но я впервые услышал о нём в 2012 году. Тогда у него уже был неплохой рантайм и качественные green threads, и со всем этим было легко использовать абстракции. Это был как бы блокирующий ввод/вывод, но, насколько я понимаю, интерфейс между Go и операционной системой через green threads на самом деле неблокирующий.
Однако пользователю всё это было доступно в виде блокирующего интерфейса, и, по-моему, у такой модели есть преимущества. Как правило, в блокирующих алгоритмах легче разобраться, что происходит. Когда есть какая-то последовательность действий, за ней можно проследить: выполнить А, дождаться ответа, или, может, поймать ошибку. Потом выполнить B и также получить ответ или ошибку. В Node всё сложнее, потому что приходится перепрыгивать в другой вызов функции.
П.: Мне тоже очень нравится модель программирования в Go. Использовать Goroutines — одно удовольствие. Сейчас моя команда как раз пишет распределённое приложение на Go.
Р.: Да, для некоторых видов приложений Go подходит лучше всего — например, когда строишь сервер. Не могу и представить, как работать с чем-то ещё. Хотя, думаю, всё же парадигма безблокировочности здорово сработала для Javascript, в котором нет потоков. К тому же, в Javascript теперь есть ключевое слово async и можно работать с асинхронными функциями, так что больше не приходится метаться между анонимными функциями и разбираться в дебрях обратных вызовов. В новых версиях Javascript работать стало проще. Тем не менее, я считаю, что Node — не лучший вариант для масштабного веб-сервера. Для этого я сам точно выбрал бы Go. Честно говоря, поэтому я и перестал работать над Node. Я просто понял, что это не идеальная система для разработки сервера.
Как ни странно, мне кажется, что Node действительно блестяще показал себя как раз на стороне клиента. Он позволяет хитро использовать скрипты при создании сайтов. Например, Browserify как бы упаковывает клиентский Javascript. Это позволяет обрабатывать на сервере JavaScript со стороны клиента. Ещё один пример — небольшие серверы для разработки, или даже рабочие серверы, обрабатывающие живой трафик. Node может оказаться очень полезным и удобным для некоторых вещей. Но если вы поднимаете огромный распределённый DNS-сервер, я бы не советовал выбирать Node.
П.: Разработчикам по всему миру будет полезно об этом задуматься. Для любого дела важно выбрать правильный инструмент, так что у тебя вполне объективное отношение к Node. Ты впервые представил Node.js на конференции JsConf 2009 Berlin. Наверное, ты удивился, что он так быстро достиг успеха?
Р.: Конечно. В общем-то, я целые четыре года не переставал удивляться. Node развивался невероятными темпами и очень понравился сообществу.
П.: После этого ты присоединился к Joyant в Сан-Франциско и работал над Node на постоянной основе, верно? Расскажи о своём опыте там. Разработчики были очень довольны, и ты был в центре событий.
Р.: Да, это был один из самых ярких моментов моей жизни. Я и вправду был в самом центре событий, ездил на различные конференции. Однажды я даже побывал в Японии, и люди просили со мной сфотографироваться… Мне даже стало как-то неудобно. Когда я комментировал что-то в сети, такое чувство, что мне отвечали сразу человек сто. Тогда я осознал, что мне надо осторожно выбирать слова и думать над тем, как меня воспринимают — похоже, ко мне действительно прислушивались, и это было непривычно. Мне всё это не нравилось. Ведь я программист и просто хочу писать код, и иногда высказывать мнение без лишней осторожности. В этом плане мне было немного немного не по себе.
П.: Тебе было 29 или 30 лет, когда ты создал Node? И он уже стал настолько влиятельной технологией.
Р.: Да. Но тогда я всё-таки был скорее начинающим разработчиком.
П.: Райан, в то время было много разных проектов, которые работали с JavaScript на стороне сервера. Node не был единственным решением, но он стал самым успешным — как думаешь, почему?
Р.: Это правда, несколько человек пытались приспособить JavaScript для серверной работы. Сейчас уже даже не вспомню их имен.
Дело в том, что во всех этих проектах использовался блокирующий ввод/вывод, и это не очень хорошо сочеталось с тем, как устроен JavaScript, ведь он не работает с потоками. И если использовать блокирующий ввод/вывод, то не получится обрабатывать запросы. То есть придётся обрабатывать их по одному, и из этого ничего не выйдет. К тому же, я добавил качественный модуль HTTP и показал, как настроить HTTP-сервер, а также простой TCP-сервер. Я постарался, чтобы эти вещи работали исправно и люди могли строить сайты без особых проблем. Надо признаться, что поднять веб-сервер — дело не из лёгких, и многим проектам требовался функционал, который сообщество должно было достраивать самостоятельно. Но никто ничего не строил, потому что систему не с чем было использовать. По-моему, для любого нового фреймворка, или вообще продукта в целом, нужен базовый образец, которым сразу же можно воспользоваться. Это стало преимуществом Node — люди могли просто скачать его и сразу настроить веб-сервер.
П.: Действительно, хорошие образцы очень важны, как и легкость установки и использования. Ещё многие уже умели писать код на JavaScript, поэтому могли сразу приступить к делу. Когда я только начал работать с Node, мне тоже очень помогло моё знание JavaScript.
Р.: Мне кажется, мы привыкли думать, что переключаться между языками достаточно легко. Но даже если уже владеешь каким-то языком, то для нового языка не так-то просто выстроить контекст. Многие разработчики уже знают Javascript, поэтому им интересно использовать уже знакомый язык в новом контексте, с новыми инструментами. Получается, что тот же язык открывает более широкие возможности.
П.: Это точно. В 2012 году над Node трудилось огромное число разработчиков. Почему ты решил уйти и передать проект Айзеку Шлутеру из Joyent?
Р.: Думаю, на то было две причины. Тогда я проработал над Node уже 4 года, и, в общем-то, сделал всё, что планировал. Я никогда не рассчитывал, что Node превратится в огромный API. Моим замыслом было создать небольшое, компактное ядро, на которое люди могли бы надстраивать свои модули. Я хотел поддерживать несколько ключевых функций. Модули расширения были добавлены с самого начала, потом мы привели в порядок сетевые библиотеки, HTTP, UDP, TCP, и обеспечили доступ ко всем файловым системам. Затем команда человек из пяти справилась с важной задачей — настройкой всего этого для Windows. Мы хотели использовать абстракции Windows — порты завершения — для асинхронного ввода/вывода. Поэтому пришлось переписать корневую библиотеку, и из этого получилась библиотека libuv. В какой-то момент всё было готово, и мы выпустили Node для Windows. Тогда я подумал: отлично. Я достиг своей цели, и рад, что у меня получилось довести всё до ума. Конечно, найдётся ещё тысяча багов, которые можно исправлять до конца жизни, но в команде достаточно людей, которые могут об этом позаботиться. Мне хотелось заняться другими вещами. К тому же, вышел 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 недели, чтобы познакомиться со следующей историей!