Почему мы выбираем Elixir

Я программирую уже более 20 лет. Начал с Basic, потом переключился на C++ и два года потратил на Assembly (MASM). Затем я открыл для себя Ruby — язык, который полностью изменил мое представление о программировании. Я полюбил Ruby. Полюбил его за то, что представители элиты программистов стараются не воспринимать всерьёз. За синтаксис.

Знаете, синтаксис для меня не пустой звук. Можете считать меня легкомысленным старомодным глупцом, но я думаю, что это очень важно. В добавок, изучая Ruby, я нашёл себе единомышленников.

Когда появились языки Go и Rust, я был разочарован. По части производительности и многого другого они явно выигрывали, но вот синтаксис по сравнению с Ruby подкачал. Для чего они вообще создавались? Ruby и Python доказали одну очевидную вещь: людей привлекает простой и читабельный синтаксис. Новые языки должны развиваться, базируясь на лучших из имеющихся принципов. Go, похоже, ориентирован на поклонников C/C++, в то время как Rust интересен JavaScript-разработчикам. Я думаю, что это, скорее, дело вкуса.

Elixir же совсем другой. Я бы поставил в один ряд Elixir, Go и Rust и сказал бы, что именно эти три языка зададут направление развития backend-разработки в следующем десятилетии. Я обнаружил, что Elixir, помимо схожего с Ruby синтаксиса, имеет ряд других преимуществ.

Его синтаксис достаточно поверхностен, но в этом и есть его привлекательность. С этого всё и началось. Когда я впервые увидел код на языке Elixir, я подумал: «Так, ладно. Я вполне могу в нём разобраться».

Думаю, большинство Ruby-разработчиков рано или поздно придут к Elixir. Похоже, многих из них привлекает Go, но, предполагаю, как только они увидят, какие возможности даёт Elixir, его преимущество будет для них налицо.

Однако для языка программирования иметь свою «изюминку» — слишком мало. Что-то более существенное должно побуждать людей пользоваться им. Для меня таким фактором стало функциональное программирование.

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

1. Масштабируемость

Черта, присущая языку Erlang. Приложения, написанные на языке Elixir, стремятся по максимуму использовать все ядра процессора, что, по сравнению с Ruby, очень большой прыжок вперёд. Нет необходимости писать для этого какой-либо код: виртуальная машина Erlang VM (BEAM) автоматически сделает это за вас, а это означает, что железо будет использоваться эффективно. Несколько лет назад из-за высокой стоимости многоядерных процессоров такой подход оказался бы бессмысленным. Теперь цена на них заметно снизилась, что добавляет преимуществ языку Elixir.

2. Память

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

3. Иммутабельность

В те времена, когда память была дорогостоящей, понятие «иммутабельность» приносило одни лишь страдания. Зачем создавать приложения, нещадно расходующие память из-за наличия в них переменных, которые нельзя изменить? В настоящее время память стала очень дешёвой, и эта проблема потеряла свою актуальность. Учитывая все вышесказанное, можно определить задачу иммутабельности в том ключе, в котором это понятие изначально задумывалось: поддержка состояния. Работая с параллельными процессами, нужно иметь в виду то, что состояние процесса становится крайне важным моментом. Если, скажем, переменная X должна иметь конкретное значение, а код пишется на языке, в котором та же X может изменяться, то проблем не избежать.

4. Отказоустойчивость

Я был под большим впечатлением, когда подробно изучал это свойство. Вы, наверное, слышали, что Erlang создавался для использования в телекоммуникационных системах? Как часто вам доводилось получать от вашего мобильного оператора сообщения вроде: «В связи с обновлением системы возможны кратковременные перерывы связи»? Такое время безотказной работы достижимо и с Elixir. Еще одна немаловажная особенность — это горячая замена кода. Развёртывание без простоя теперь действительно возможно.

5. Сообщество

Это, скорее, мой личный пункт. Меня привлекают технологии, не привязанные к каким-то конкретным компаниям. Языки Go и Rust в большинстве своём принадлежат только Google и Mozilla. Они всегда будут находиться под контролем своих создателей или корпораций-владельцев, в то время как Elixir не относится к какой-либо компании, поэтому является более доступным по части своего развития. Это позволяет отдельным организациям участвовать в совершенствовании языка путём создания сценариев использования (да, Erlang тоже попадает под это описание, но он в этом случае, пожалуй, стоит на месте).

Сообщество Elixir-разработчиков чем-то похоже на то, каким когда-то было сообщество Ruby-разработчиков. То же самое я говорил и про сообщество разработчиков Ember.js. Возможно, для меня Ruby — своеобразный наркотик и я просто пытаюсь снова словить от него кайф.

Заключение

С моей командой мы активно изучаем Elixir на протяжении нескольких месяцев. Чем глубже я погружаюсь в него, тем больше он мне нравится. Ставки на Elixir довольно высоки, так что, если вы Ruby-разработчик, желающий сдвинуться с места, я настоятельно рекомендую вам ознакомиться с ним. Начать лучше всего с книги Дэйва Томаса (Вунш – которую мы, кстати говоря, разыгрываем здесь).

© 2020 / Россия Любые мысли и вопросы пишите на elixir@wunsh.ru.