Я являюсь в России одиноким поклонником языка программирования Elixir. Почему я делаю такой пессимистичный вывод.
В России язык Elixir не пользуется популярностью:
русскоязычные сайты, посвященные Elixir, постепенно умирают или уже умерли;
вакансий программистов Elixir я не встречал, (видел только на Украине);
статьи по Elixir в русскоязычном сегменте Internet в основном переводные;
переведенных на русских язык книг по Elixir всего две:
1. для начинающих “Введение в Elixir” С. Сенлорен и Д. Эйзенберг
2. достойная книга “Elixir в действии» Саши Русич.
Обе книги были переведены издательством ДМК.
Язык Elixir является молодым языком, но считается быстроразвивающимся. На Западе, судя по форумам, у него появилось много сторонников. Но оказалось, что и там вакансий для программистов Elixir очень мало: видел объявление о вакансии, на которую претендовало несколько сотен кандидатов.
Всё это заставляло меня часто задумываться о перспективах Elixir. И возможно, я понял в чем дело. Далее я выражаю своё субъективное мнение о назначении этого языка.
Уже после написания этой заметки я обнаружил на англоязычном форуме https://www.reddit.com/r/elixir/ обсуждение аналогичной темы: «Beyond the joy of coding, what makes you bet on Elixir for the future?» («Что заставляет вас делать ставку на Elixir в будущем помимо удовольствия от программирования?»), отдельные высказывания и характеристику в целом я приведу в конце.
Elixir –функциональный язык программирования, предназначенный для создания масштабируемых, распределенных и отказоустойчивых систем, работающих на основе виртуальной машины Erlang BEAM. Elixir иногда называют конкурентно-ориентированным.Больше не считаю нужным, рассказывать здесь о всех особенностях и плюсах Elixir — всё равно блюдо надо попробовать, чтобы почувствовать его вкус.
Но одну подмеченную особенность Elixir хочется всё же назвать. Помимо вычисления на стеке у Elixir имеется дополнительный "движок" на базе посылки сообщений для управления процессами реального времени. Таким образом произошло разделение механизмов исполнения математических вычислений и посылки сообщения между процессами. Механизм сообщений унаследован от языка Erlang.
Приведу цитата из книги David Thomas «Programming Elixir», которая, надеюсь, даст читателю некоторый зрительный образ распределенных акторов Elixir:
«Erlang и, как следствие, Elixir-программы часто структурированы как наборы взаимодействующих субприложений. Часто код, который в другом языке был бы библиотекой, в Elixir является субприложением. Это поможет представить их как компоненты или сервисы.»
Здесь компоненты, сервисы - теоретически синонимы акторов.
Ну, с Erlang всё понятно: он уверенно занял специфичную нишу ПО для коммутационного оборудования. Для Elixir это ниша уже занята. Но есть область, которой акторы Elixir соответствуют оптимально. Это программирование в парадигме обработки данных в потоке, или cобытийно-ориентированной архитектуры.
Эта парадигма программирования тоже относительно молодая. Она является антиподом привычной и доминирующей парадигме централизованной обработки данных, считайте вокруг центральной БД.
Если вы не верите мне, то сошлюсь на фундаметальный учебник по программированию Х. Абельсона и Д.Д. Сассмана "Структура и интерпретация компьютерных программ", в котором есть описание и подробный рассмотрение разделения программирования на два стиля: программирование объектов в общей памятью и потоковое программирование.
Таким образом, мы имеем два полюса в программировании:
приложения с централизованной обработкой данных,
приложения потоковой обработки данных.
Технологию последних приложений , например, демонстрирует Apache Software Foundation с помощью компонентов Kafka.
Вернемся к языку Elixir. Несмотря на универсальность языка Elixir, позиционировать применение Elixir в приложениях с централизованной обработкой данных я бы не рекомендовал: эта область уже занята и хорошо обжита традиционными языками, такими как Java, Python, C, C++ и т.д.
Примечательно, что в языке Elixir уже на нижнем уровне операторов встроен механизм потока данных, а именно, оператор конвейера. Вроде бы мелочь, но она характеризует философию разработчиков языка.
На верхнем уровне я мог бы сослаться на наличие готовых шаблонов серверов OTP GenStage, Flow, Brodway, но я лучше приведу в пример свой личный опыт реализации многопортового коммуникационного контроллера обработки данных в потоке на Elixir.
В моём потоковом коммутационном контроллере данные в цикле снимались с датчиков шины Modbus. (В дальнейшем планировалось дополнить интерфейс нижнего уровня шиной CAN или i2c по требованию заказчика.) Тут же данные без задержки транспортировались на верхний уровень через канал WebSocket по подписке.
Один канал был связан с обычным браузером, в окне которого можно было наблюдать за изменениями данных и управлять приводами. Другой канал планировалось присоединить к репозиторию для анализа и последующей передачи в рабочую SCADA.
Были и другие способы реализации сервисов очередей, таких как RabbitMQ, но я был воодушевлен тем, насколько в рамках только приложения OTP с поддержкой со стороны приложения Phoenix, не прибегая к сложным пакетам, дешево и достаточно просто можно реализовать обработку данных в потоке. Если эта тема контроллера сбора и потока данных интересна читателям, то могу подготовить отдельную статью на Хабре.
На основании вышесказанного я надеюсь, что Elixir займет достойное место в нише программирования приложений cобытийно-ориентированной архитектуры, в том числе приложений IoT. Для этого у него имеются все возможности и необходимые инструменты.
Теперь обещанный выборочный «разбор полёта» на англоязычном сайте в гугловском переводе.
“Говоря о технической стороне вопроса: основы Elixir соответствуют современной архитектуре ЦП. Erlang/BEAM изначально запускает процессы, которые можно распределить по ядрам ЦП, чтобы использовать весь потенциал оборудования.
Для меня такое соответствие добавляет радости от написания Elixir. Мне не нужно думать/беспокоиться об использовании ресурсов. В качестве конкретного производственного примера я недавно перенес API с Ruby на Elixir и сократил стоимость нашей инфраструктуры на 95%.”
“Если бы мне пришлось выбрать что-то одно, что заставляет меня делать ставку на Elixir, я бы сказал, что это его основная команда. Я использую Elixir с версий 0.*, и, по моему мнению, эти ребята были довольно последовательны в движении в правильном направлении. Что-то в том, что я все еще вижу огонь в глазах Хосе после всех этих лет, заставляет меня думать, что это безопасная ставка.”
“Больше вещей в режиме реального времени, параллельные и распределенные и продолжают быть такими. Большинство других сред выполнения начали показывать возраст, как только появились двухъядерные процессоры.”
“BEAM имеет, вероятно, долговечность благодаря эффекту Линди . Он был разработан для телефонной коммутации, но решил общий класс проблем, которые до сих пор терзают программные сервисы.”
“Мы используем Elixir в производстве уже 6 лет и не отстаем от ведущих версий Elixir и Phoenix. Я никогда не работал с платформой, у которой было бы так мало проблем во время обновлений. Это откровенно феноменально и позволяет мне не беспокоиться о консолидации нашего стека вокруг Elixir. Я уверен, что решения Хосе и Криса МакКорда поведут платформу в позитивном направлении и не оставят нас с основными версиями языка/платформы, которые мгновенно сделают наши огромные инвестиции устаревшими.”
“Приложения мягкого реального времени пользуются все большим спросом, и Elixir отлично справляется с этой задачей.
Пакеты в экосистеме хорошо спроектированы и хорошо информированы. Ecto — особенно яркий пример.
Сам язык не очень полиморфен, а сопоставление с образцом позволяет применять агрессивное программирование, что позволяет выявлять проблемы в коде на более ранних стадиях.
Код Elixir просто запускается и продолжает работать, чего я не могу сказать о других языках, смежных с вебом.
В целом этот язык может дать компаниям, использующим его, конкурентное преимущество.”
После комментария о мягком реальном времени, что совпадает с нашим выводом, наверное, достаточно положительных отзывов. Но есть один отрицательный комментарий:
“Моя компания сделала ставку на будущее Elixir 4 года назад. Сейчас мы глубоко в фазе «что мы сделали». Наши затраты намного выше, чем у аналогичной компании, в которой мы работали, и где все было сделано на Python и TypeScript, от разработчиков до инфраструктуры.”
TyrusX не называет область приложения, где Elixir оказался не эффективен. Похоже, что для него затруднительно назвать область приложения. Но после длительного обсуждения было высказано предположение, что проблема кроется в большом количестве числовой работы в памяти в самом Elixir. Если это так, тогда понятно.
Выводы
Язык программирования Elixir медленно расширяет своё присутствие на рынке разработки ПО. Это связано с тем, что Elixir имеет некоторый порог освоения при наличии у разработчиков неясности в вопросе выгоды от его применения. Но процесс можно осмысленно ускорить, если в рамках сообщества разработчиков хотя бы отдельных ниш отрасли централизовано формировать рекомендации и влиять на общую техническую политику.
Комментарии (20)
stalkerxxl
21.11.2024 14:20Я видел на россии вакансии по Elixir... Может быть Вы плохо искали?
VAK_53 Автор
21.11.2024 14:20Наверное, я слишком ленивый...
Я бы попробовал при условии, что вакансия в рамках технологии обработки данных в потоке.
USGrant
21.11.2024 14:20Маркетинг есть даже в ИТ. И он, к сожалению, работает. Сегодня у технологии, за которой не стоит крупная компания, шансы на взлет небольшие. А в бизнесе вообще беда. Если фронт, почти безальтернативно react (Facebook, vercel), если бэк, то какой нибудь go (google), python (вроде многие компании поддерживают), c# (MS). Особенно удивляет стремление всюду все сделать на микросервисах, ведь у всех, абсолютно у всех, только hiload.
Отсюда и проблемы у эликсира. Если прийти в компанию и сказать, что ты сделаешь то же самое, только без микросервисов (или меньшей декомпозицией) тремя разработчиками на эликсире вместо десяти go-разработчиков, с тобой не будут разговаривать, подумают, что сумасшедший. Hiload же
VAK_53 Автор
21.11.2024 14:20Согласен, но у меня особый случай. Я обнаружил, что технологические процессы хорошо программируются в модели акторов. Поэтому подсел на Elixir. А в эта область вообще не пахана, имхо.
whoisking
21.11.2024 14:20Спасибо за анализ, интересно наблюдать за данным языком.
На мой взгляд, у эликсира несколько проблем и первой я бы назвал производительность в CPU-bound задачах. Да, эликсир даёт оч хорошую сеть без особых затрат, но с другой стороны, а где её сейчас нет? С популяризацией асинхронного программирования в последние годы сложно уже найти язык, который бы не завёз в том или ином виде асинхронку или какое-то другое неплохое решение для сети, которое покрывает бОльшую часть потребностей. И поэтому, когда я читаю, что в CPU-bound задачах эликсир показывает себя на уровне интерпретируемых языков, то у меня возникает вопрос - а зачем мне его тогда брать? Мне нужен более серьезный повод.
Вторая - тот самый нестандартный BEAM - подход к решению многих задач. В наш век, когда большинство языков используются либо для написания бизнес-логики, либо в качестве клея между готовыми и обкатанными решениями эликсир говорит - ребят, вот тут не нужна вам готовая очередь, вот тут вам не нужен редис, у меня всё есть. И возникают вопросы. А точно есть? А насколько они хороши? А что будет с проектом, если мы пойдём этим путём? И, конечно, ввиду отсутствия каких-то неоспоримых доказательств в пользу elixir/BEAM-way большинство сделает более прагматичный выбор.
Третий - функциональщина. Это и плюс и минус, но, однозначно, на сегодняшнем рынке это является проблемой, т.к. для перехода на функциональный язык надо приложить некоторое количество усилий.
Сообщество Elixir показывает интересные идеи, тот же liveview или phoenix стоят того, чтобы на него обратили внимание и это бустит его по-немногу, но всё же у него пока нет какого-то мощного дифференциатора на рынке языков.
SunchessD
21.11.2024 14:20Спасибо за статью. Я как человек писавший на эликсире несколько лет назад, могу сказать свое мнение.
Язык и среда сами по себе отличные, но с точки зрения бизнеса не практичные.
И на это есть несколько причин:
С появлением кубера приложение становится похоже на кубер в кубере. В случае с кубером за него отвечают девопсы, в случае эликсира разработчики —размывается ответственность.
Эликсир был вдохнавлен ruby, а phenix - rails. Многие начали на него переходить по причине "умирания" ruby и rails, но удобство разработки схожих с рельсой так и не получилось достичь. Те же полиморфные связи отсутствовали в фениксе на тот момент, когда я на нем писал.
Эликсир очень плох в однопотоке, большие массивы данных обрабатывать не удобно, поэтому что приходится в многопоток, код из-за этого становится плохочитаемым. (например парсинг csv файла)
Наконец стоимость найма. Эликсир разработчики стояли так же, как и рельсовики, но сама разработка из-за этого не становится дешевле(см. пункт 2). Легче было уйти в эрланг и получать в 2 раза больше.
Kahelman
21.11.2024 14:20Автор слегка голосам по европам…
Erlang сей час не в телекоме используется а в основном в трейдинге. По крайней мере в области торговли электричеством в Европе.
RabbitMQ написа не erlang и активно используется много где.
Ещё на erlang много пишут в игровой индустрии - онлайн казино и им подобные.
Просто автор не в том месте и не в то время находится.
Плюс компании особенно не распространяются про использование erlang :)
Elixir примерно там же но больше там где нужен фронт енд.
Книг на русском нет так как они не нужны. Если клиенты на западе -читайте на английском. :)
napolskih
21.11.2024 14:20Язык, платформа и экосистема прекрасна;
Вы не одиноки;
Вакансии в РФ есть и не одна;
Есть хорошие видеокурсы курсы на русском, например от Юрия Жлобы и Ильи Краковского;
Сейчас я прохожу замечательный курс от Thinknetica с крутым спикером Алексеем Матюшкиным;
В этом году я познакомился Эликсир, изучил и нашел работу на нем.
VAK_53 Автор
21.11.2024 14:20Наверное, не всё так просто у меня. Я пришёл к Elixir из области управления технологическими процессами. Есть идеи, которые хочу реализовать.
Kahelman
21.11.2024 14:20Честно говоря не понимаю в чем преимущество elixir перед erlang? Единственное что приходит в голову - народ который с ruby пересаживается находит синтаксис более знакомым. В остальном по мне оригинал лучше :)
VAK_53 Автор
21.11.2024 14:20Мне Erlang тоже представляется концептуально чище. Стандартный ответ обычно такой: синтаксический сахар.
Мне ещё импонирует в Elixir механизм макросов, при помощи которого можно разработать свой DSL.gBear
21.11.2024 14:20Стандартный ответ обычно такой: синтаксический сахар.
На efene, емнип, Жозе сразу указывали. Но, "мы не ищем легких путей" :-)
Мне ещё импонирует в Elixir механизм макросов, при помощи которого можно разработать свой DSL.
Можно подумать, что parse_transform в erlang, кто-то запретил :-) Куда уж мощнее.
gBear
Самое важное, имхо. Жозе в 11'ом не мог внятно ответить на вопрос "зайчем?". Даже когда его прямо спрашивали про "efene" и прочие "erlog"'и. Но тогда хоть можно было списать на "молодой/горячий".
Прошло больше десяти лет - как я понимаю - мало что поменялось с тех времен :-)
Т.е. "чем лучше", какой-нибудь - условный - haskerl/hamler - понять я способен... да даже "чем лучше" разные ML-диалекты, живущие на beam.
Но "чем лучше" elixir - лично я, например - понять не способен :-( Лично для меня это как была "поделка уровня efene", так и осталась.