Интервью с создателем языка Elixir Жозе Валимом

Жозе Валим: «Elixir хорош для всего, что работает с сетью и сокетами»

Evrone занимается не только заказной разработкой. Мы участвуем в локальных и международных сообществах, каждый год проводим конференцию Ruby Russia и приглашаем на неё специалистов со всего мира. Благодаря общению с разработчиками и авторами технологий накапливаем экспертизу для решения задач наших клиентов. Самое интересное мы возвращаем сообществу в виде интервью, конференций и митапов. Одно из таких интервью мы недавно взяли у автора языка программирования Elixir. Жозе Валим рассказал про историю возникновения языка и планы на будущее, пользу для крупных компаний, влияние сообщества, выбор названия и многое другое.

Интервью

Evrone: Добро пожаловать на интервью! Начнём с формального представления и того, чем ты сейчас занимаешься.

Жозе: Всем привет! Меня зовут Жозе Валим, я — автор языка программирования Elixir. В начале этого года я основал новую компанию Dashbit, которая помогает бизнесу использовать Elixir.

 

Evrone: Давай поговорим о популярности технологий. Многие разработчики ориентируются на «killer apps» вроде фреймворка Ruby on Rails, сделавшего популярным язык программирования Ruby. Нужны ли такие «убийственно крутые приложения», чтобы сделать технологию известной? Насколько важен фреймворк «Phoenix» и статьи в духе «делаем клон твиттера за 15 минут» для продвижения Elixir?

Жозе: Они помогают, но не создают популярность сами по себе. Если у вас есть «убойное приложение», которое быстро привлечёт много внимания к технологии, это поможет в продвижении, но это не обязательное требование. И даже если приложение есть, его одного вряд ли хватит для поддержки всего сообщества. Для меня Python — это хороший пример того, каким должен быть язык программирования: его использование очень разнообразно.

Для сообщества важно перерасти рамки, заданные первыми «убойными приложениями», и открыть новые области применения технологии. Этот путь я с самого начала выбрал для Elixir: имея опыт веб-разработки, я старался не загонять его в угол, где он стал бы «языком для веб-разработки». Я стараюсь дать ему разные сферы применения.

Сегодня можно видеть его использование не только в вебе, но и, например, для создания распределенных систем (спасибо Erlang!). Ещё у нас есть Nerves для использования Elixir во встраиваемых устройствах. Есть проекты Broadway и GenStage для эффективной работы с данными. Я гораздо больше заинтересован в поиске разнообразия, чем в создании одной «убийственной штуки» для популяризации языка.

 

Evrone: Python действительно очень универсальный язык программирования. Его часто называют «лучшим вторым инструментом для любой задачи». А как можно одной фразой назвать Erlang?

Жозе: Я бы сказал, что Elixir хорош для всего, что работает с сетью и сокетами. Веб-сервера, стриминг видео и аудио, интернет вещей и так далее. Elixir проявит себя с лучшей стороны, если ваша программа в основном работает с сетью, принимает и передает данные. Можно даже ещё короче: «язык для коммуникаций».

 

Evrone: Хорошее позиционирование для разработчиков. А как насчёт больших компаний? Как «продать» Elixir бизнесу?

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

 

Evrone: Продвигать технологии тяжело. Так же, как давать им имена. Мы несколько раз видели вопрос о названии «Elixir» на профильных форумах. Откуда оно? Это отсылка к языку Potion за авторством _why?

Жозе: Я знаю _why, автора Potion, только по его вкладу в развитие Ruby. Это было давно и не повлияло на поиск хорошего имени.

Название «Elixir» я выбрал по нескольким причинам. Во-первых, оно короткое, но не слишком. На тот момент оно не использовалось для чего-то, связанного с программированием. Книги, парфюм — но ничего технического. Оно начинается с «E», как и Erlang, и имеет столько же букв. Ну и, наконец, при алфавитной сортировке оно будет близко к началу списка. Так что я подумал: «Какое хорошее название для языка программирования!»

 

Evrone: Мы поговорили про позиционирование языка. А как насчёт обучения? Насколько он сложен для начинающих разработчиков с несколькими годами опыта? С чего лучше начинать изучение?

Жозе: Хороший вопрос. У кого-то получается освоить язык и основные концепции быстро, у кого-то нет. Лично я думаю, что «ментальная модель» Elixir проще в освоении чем, например, ООП.

Говоря про обучение языкам программирования, я всегда вспоминаю моего друга Хьюго Барау́на. Мы познакомились в институте, и у нас были совершенно разные подходы к изучению нового. Я всегда был человеком, который бросается исследовать пещеры с фонариком, проводит быстрые эксперименты и нетерпеливо смотрит, что получится. Хьюго, напротив, очень организован. Отправляясь в пещеру, он составит строгий план действий, возьмёт прожектор и правильный набор инструментов.

Я знаю, что некоторые успешно обучали Elixir’у новичков без опыта программирования. Разработчики с опытом в JavaScript, Python, Ruby, .NET, Java получают море удовольствия от использования Elixir и эффективно решают на нём свои задачи. А у кого-то, наоборот, не получается. Я слышал истории о людях, освоивших язык только с третьего захода.

Хорошая новость в том, что мы уже достаточно давно делаем Elixir и есть много обучающих ресурсов. Вводные лекции на официальном сайте могут быть слишком сжатыми, поэтому новичкам я могу порекомендовать такие книги, как «Введение в Elixir» издательства O’Reilly и «Joy of Elixir» за авторством Ryan Bigg. А разработчикам с опытом в Ruby, Python или JavaScript я рекомендую книгу «Programming Elixir». Книга Саши Юрича «Elixir в действии» рассказывает о языке, как об инструменте для создания программных систем. У нас также есть скринкасты, онлайн-курсы и другие обучающие материалы. Если вы похожи на меня и хотите сразу ринуться в бой, то есть много онлайн-сервисов с упражнениями. В общем, можно попробовать несколько разных вариантов обучения и выбрать тот, который сработает для вас.

 

Evrone: Elixir был вдохновлен такими языками, как Ruby, Clojure и Haskell. Оглядываясь назад, что ещё послужило основой для его создания?

Жозе: Я бы назвал Ruby, Erlang и Clojure. Мы заимствовали не только фичи этих языков, но и часть их философии. Вся наша инфраструктура «досталась в наследство» от Erlang. В Clojure мы заимствовали способы решения типовых задач, например протоколы. Ну а Ruby послужил основной для синтаксиса, дизайна стандартной библиотеки и соглашений по именованию. Именно из этих трёх языков мы получили идеи для будущего нашего собственного языка и понимание, каким он должен быть. В целом, конечно, мы заимствовали удачные концепции отовсюду: Haskell, Python, F#.

 

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

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

У меня были две цели: расширяемость и продуктивность. И когда я говорю о продуктивности, то имею в виду очень хорошие инструменты для разработки (tooling). Другие языки, например Ruby, также ценят инструменты и то, насколько программистам комфортно работать с кодом. Хороший свежий пример — Go, авторы которого с самого начала сделали упор на инструменты разработки.

Расширяемость отразилась в двух вещах. Во-первых, протоколы, с помощью которых мы решали вопросы полиморфизма. Изучив опыт других языков, я понял, что подход Clojure лучше всего подходит для виртуальной машины Erlang, и позаимствовал его.

Во-вторых, метапрограммирование. Я попробовал несколько способов организовать его в Elixir. Сначала за основу были взяты подходы из Ruby, но там многие вещи реализуются через изменения во время выполнения программы, что плохо работает с виртуальной машиной Erlang. После компиляции кода под виртуальную машину вы хотите, чтобы код оставался неизменным.

Тогда я посмотрел на Lisp-подобные языки, вроде Clojure, где метапрограммирование было реализовано через модификацию кода программы, представленного в виде абстрактного синтаксического дерева (AST). Такой подход мне понравился, но я не хотел делать ещё один Lisp для виртуальной машины Erlang: это уже было сделано много раз до меня. Тогда я решил сделать высокоуровневую абстракцию над AST, которая даст разработчикам простое в использовании метапрограммирование. И долгое время думал, что это моё лучшее решение в дизайне языка!

А потом я узнал, что Джон Маккарти, автор Lisp, тоже об этом думал. Он сделал «SLisp» — то, что мы сейчас называем Lisp. А ещё он сделал «MLisp» с высокоуровневым синтаксисом. Так что моя «новая» идея оказалась 50-летней давности. Тем не менее, я думаю, что Elixir — это один из немногих языков, использующих эту идею на практике.

Подводя итог, я считаю своим лучшим решением в дизайне языка то, что я внимательно смотрел по сторонам и выбирал хорошо «играющие вместе» решения для использования в виртуальной машине Erlang.

 

Evrone: В мире Elixir разработки очень популярен Elixirforum.com. Насколько этот ресурс уникален именно для Elixir? Каков его вклад в популярность языка?

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

Языковые барьеры играют большую роль в распространении технологий. У нас, например, есть большое Telegram-сообщество разработчиков из Бразилии. Для нас очень важно позволять таким сообществам расти самим, чтобы они могли решать все те задачи, которые стоят перед сообществами языков программирования.

История Elixirforum именно такая. Aston создал этот форум, развивал его, рекламировал и сделал тем, чем форум является сейчас. Это одно из тех мест, куда я время от времени прихожу и смотрю, чем могу помочь. И я рад, что есть ещё много таких мест, доступных для Elixir разработчиков со всего мира.

 

Evrone: Замечательная история. Предлагаю сменить курс интервью и обсудить прикладные вопросы. Какую IDE порекомендуешь для разработчиков на Elixir?

Жозе: Я не инвестирую много времени в текстовый редактор. Я использовал TextMate 1.0 более десяти лет, когда разработчики уже прекратили его поддерживать. И сменил только после того, как моя версия перестала работать в обновившейся операционной системе. Я перешёл на Sublime Text, но особо не использую продвинутые фичи, за исключением горячих клавиш автоматического форматирования кода. Я знаю, что многие разработчики используют Visual Studio Code с поддержкой Elixir Language Server. Разработчики Language Server постоянно улучшают интеграцию, так что большинство программистов на Elixir предпочитают такую связку.

 

Evrone: Ещё один технический вопрос. Что думаешь про новую парадигму «асинхронного программирования»? Если сравнивать его с «message passing», что легче для разработчиков?

Жозе: Ключевым в async/await является то, что это именно парадигма. Разные языки программирования реализуют её по-разному. Кто-то реализует async/await, чтобы распараллелить работу с вводом-выводом. А кто-то решает совсем другие задачи.

Есть два типа одновременной работы с задачами (concurrency): по процессору (CPU-based) и по вводу-выводу (I/O-based). Erlang и Go доказывают, что не обязательно использовать async/await для одновременной работы с несколькими задачами ввода-вывода. С этой точки зрения мне не нравится async/await, когда его используют для I/O-based concurrency. Для разработчика это выглядит так, что авторы языка перекладывают сложные вопросы одновременной работы на его код. Тогда как язык вполне может отвечать на эти вопросы сам. Elixir поддерживает парадигму async/await, но в качестве удобного синтаксического сахара для одновременной работы с вычислительными задачами.

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

 

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

Жозе: Никогда не загадывал так далеко. Создание нового языка программирования — это огромные усилия. И такой же огромный шанс провала. Не говоря уже о таких вещах, как время и деньги. Так что я старался и стараюсь делать то, что делаю хорошо, и не иметь завышенных ожиданий.

Тем не менее, я всегда хотел чтобы мой язык не был нишевым, использовался для разных задач, а его сообщество было гостеприимным. Прошли годы, и мои долгосрочные планы не изменились. Мне всё так же интересно, какие новые области применения можно найти для Elixir.

К примеру, сейчас бурно развивается машинное обучение и я хочу, чтобы Elixir стал частью этого развития. В машинном обучении простой вопрос «это собака или кошка?» распадается на множество простейших вопросов о признаках. Уши этого животного похожи на кошачьи? Нос этого животного похож на собачий? Мы можем работать с такими признаками одновременно. Эта работа как будто создана специально для Elixir! Язык очень хорош в координировании множества задач, выполняющихся одновременно на разных компьютерах.

 

Evrone: Наш традиционный вопрос о путешествиях во времени! Если бы ты попал в прошлое и у тебя была возможность дать один технический совет молодому себе, какой бы совет это был?

Жозе: По правде говоря, я не знаю. Не то чтобы у меня не было советов, но путешествия во времени — это отдельная запутанная история. Что если я дам себе в прошлом совет, воспользуюсь им и всё сломается? Как можно быть уверенным, что «послезнание» действительно приведёт к лучшему результату, чем есть сейчас? Иногда, чтобы получить ответы, нам приходится много работать (вместо того, чтобы получить совет из будущего).

 

Evrone: Это многое говорит о языке и твоей работе над ним. А что насчёт конкурентов? Какие языки ты бы назвал главными конкурентами Elixir?

Жозе: Все другие динамические языки программирования. Но если говорить про области применения Elixir, то в каждой конкретной области у него будут разные конкуренты. Для веба это JavaScript и Ruby. Для работы с данными — все языки, которые выполняет виртуальная машина Java. Но, повторюсь, в общем речь идёт именно про динамические языки. При прочих равных они похожи в использовании.

 

Evrone: Быть автором языка программирования, поддерживать его экосистему и организовывать сообщество — это много работы. Как ты организуешь своё рабочее время, чтобы всё успевать и избегать «выгорания»?

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

Например, раньше я активно использовал Twitter, а теперь полностью исключил его из своей жизни. Я боялся, что не смогу получать все те новости о новых технологиях, которые раньше читал в твитах. Зря волновался, действительно важная информация никуда не теряется.

Я работаю удаленно уже больше десяти лет, так что в 2020 году для меня мало что изменилось. И раз уж мы заговорили про отвлекающие факторы, на телефоне я тоже всё отключил. Иначе на встречах с друзьями я постоянно смотрю на уведомления.

Evrone: Для нас это ещё одно авторитетное мнение о пользе этой практики. Спасибо за интервью и до встречи на конференциях!

Подводя итог

Интервью с Жозе получилось большим и пролило свет на многие неочевидные вещи в разработке языков программирования. Мы также хотим поблагодарить Ruby Conf Taiwan за обложку интервью.

Каждое техническое интервью, выступление на конференции или организованный нами митап добавляет экспертизы нашей команде. В Evrone мы часто используем Elixir там, где требуется распределённость и отказоустойчивость. Если вам нужно реализовать технически сложное решение — дайте знать, и мы расскажем, какие технологии из нашего портфолио могут принести вам пользу.

Elixir хорош для всего, что работает с сетью и сокетами. Веб-сервера, стриминг видео и аудио, интернет вещей и так далее. Elixir проявит себя с лучшей стороны, если ваша программа в основном работает с сетью, принимает и передает данные. Можно обозначить ещё короче: «Elixir — язык для коммуникаций».
Жозе Валим
Автор языка программирования Elixir
Связаться с нами
Нужна команда?
Давайте обсудим ваш проект
Прикрепить файл
Максимальный размер файла: 8 МБ.
Допустимые типы файлов: jpg jpeg png txt rtf pdf doc docx ppt pptx.