Около месяца назад на официальном форуме языка один из инженеров IBM рассказал об опыте разработки веб-приложения на Elm. Я решил перевести пост, так как выжимка возможно поможет вам в "продаже" Elm команде и выборе технологий в будущем.

IBM зарелизил Decision Composer – бесплатную и ограниченную версию нашего продукта автоматизации принятия решений (Operational Decision Management).

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

https://decision-composer.ibm.com/

Продукт позволяет бизнесу моделировать и реализовывать сложные решения при помощи графических инструментов и человеко-читаемых артефактов вместо программного кода. Решения компилируются в исполняемые артефакты и разворачиваются во время выполнения для использования в других приложениях и сервисах. Все это основано на DMN стандарте, приправленном нашей собственной BRMS экспертизой.

Decision Composer – это SPA (single page application), которое, если вкратце, отображает диаграмму и позволяет редактировать различные артефакты ее узлов, такие как текстовые правила с подсветкой синтаксиса, автодополнением кода и т.д., и таблицы решений.

IBM Decision Composer

Приложение построено поверх существующей технологии и компонентов продукта Operational Decision Management. Сервер полагается на наши Java API во многих вещах: парсинг, валидация, компиляция и пр. Фронтенд - Elm со встроенным редактором, написанном на Dojo. Например, на скриншоте выше диаграмма – это Dojo компонент со своим деревом DOM и SVG, все остальное – Elm. Мы используем parent-child подход как для "страниц" приложения, так и для некоторых компонент в рамках SPA.

Что мы узнали

  • Функциональное программирование! Elm – хороший выбор для начинающих в ФП, особенно для людей с ООП бэкграундом, как мы. Одна проблема: тулинг еще сырой – плагины к IDE, time traveler отладчик; им все еще не сравниться с тем, что есть в TypeScript, JavaScript.
  • Архитектура, которую пропагандирует Elm, проста для понимания, люди быстро к ней привыкают. Вы не задумываетесь где располагаются или должны располагаться те или иные ее компоненты. Все на своем определенном месте. Есть один способ сделать что-то, не 50. Но:
    • требуется большое количество шаблонного (boilerplate) кода;
    • масштабирование или разбивка на компоненты могут быть сложными, например: когда реализовывать parent-child, как переиспользовать "компоненты" в нескольких приложениях?
    • проектирование аккуратных модулей не всегда легко и требует опыта. У нас несколько уродливых Моделей, которые требуют рефакторинга!
  • Elm действительно пуленепробиваемый, это не поддельная реклама. Как и обещали, у нас не было ошибок времени выполнения (runtime). Рефакторить с компилятором, который говорит вам обо всем, легко. И действительно, когда код компилируется он работает! Помимо довольно медленного компилятора в Elm 0.18 (исправлено в 0.19), это действительно потрясающе.
  • Elm может довольно легко взаимодействовать с «графическим» JS. У нас встроены довольно большие компоненты, например, диаграмма и редактор таблиц решений в виртуальный DOM Elm, и мы взаимодействуем с ними через порты. Это работает, но:
    • Порты == много шаблонного кода и слабая типизация: мы передаем значения, так как нам нужно кодировать / декодировать себя ... кодогенерация в помощь?
    • Осторожнее с виртуальным DOM при работе с нативным JavaScript. Не трогайте узлы виртуального DOM, которые содержат ваш нативный DOM – убедитесь что вы правильно уничтожили ресурсы и т.д. Все это требует работы и внимания, а ошибки могут быть довольно сложными для отслеживания. Пользовательские элементы (custom elements), вероятно, сильно бы здесь помогли.
    • Иногда вы хотите делать синхронные вызовы, но не можете. Мы написали для этого нативные модули. Я знаю, бууууу!
  • Сборка elm make очень проста. Сравните это с вашей обычной конфигурацией Webpack. И модуль UMD тоже может быть легко использован: мы включаем его в сборку уровня Dojo AMD.
  • Elm не требует обновления вашего кода из-за очередной версии каждый месяц. Мы мигрировали с 0.17 на 0.18 довольно легко. Миграция на 0.19 чуть сложнее, особенно из-за того, что у нас есть несколько нативных модулей, но все равно это – ничего по сравнению с количеством обновлений, которые нам приходилось делать для React + Redux + TypeScript.

Когда мы начинали с Elm (0.17), то это была лотерея. Многие наши коллеги не понимали этого. Каждый говорил о React в то время. Даже синтаксис Elm был темой для религиозных дебатов: "Что? Нет JSX? Квадратных скобок?", к тому же имея большого игрока типа Facebook на одной стороне и странного студента на другой (со всем моим уважением, сэр Czaplicki, Вы делаете фантастическую работу).

В конце-концов, как обычно, потребовалось немного разработки для убеждения людей – большая часть скептицизма об Elm отпала как только мы начали доставлять функциональность.

Сегодня мы, разработчики приложения, считаем, что это был хороший выбор. "Фреймворк" прост и надежен. Elm не мешал нам на протяжении пути, а наоборот сильно помог своей общей архитектурой и дизайном едиными для всех. В основном мы следовали Архитектуре Elm (The Elm Architecture), и это сработало. Конечно, приложение не идеально, и существует много вещей, которые мы можем сделать лучше, но это не из-за Elm, а из-за нас самих и просчетов в разработке.

Потребовалось немного времени, чтобы привыкнуть к Elm, особенно для людей с ООП опытом, таких как я и большая часть моей команды. Но это в конечном итоге окупилось. Как только вы поняли основные принципы, вы осознаете, что разработка для браузера действительно может быть продуктивной, безопасной и даже забавной.

Я надеюсь, что этот пост поможет людям,  которым сложно убедить менеджмент использовать Elm только потому, что он не является популярным языком. Да, вы можете использовать его для больших приложений, и он масштабируется! И, да, даже большие компании как IBM используют его!


🙌🏻 Автор языка Evan Czaplicki первым прокомментировал пост на форуме и поблагодарил автора топика. В дополнение он попросил поделиться более конкретными трудностями лично с ним для того, чтобы сделать Elm лучше.

Прочие вопросы и ответы автора:

Q: Насколько большой является Elm часть приложения?

A: cloc выдает примерно 45 000 строк и 170 .elm файлов, включая тесты

Q: Как вы делаете синхронные вызовы в Elm 0.19?

A: Насколько я знаю, это невозможно. Это было ошибкой с нашей стороны использовать нативные штуки. Для Elm 0.19, я думаю, мы мигрируем эти нативные модули либо в Elm код, либо в порты.


📖 Читайте также статью Выбор языка для проекта из серии "Изучая Elm".