Когда мы основали imby в апреле 2016 года, мы были двумя соучредителями: Ник собирался заботиться о деловой стороне вещей, а я собирался заботиться о технологической стороне вещей. Первый вопрос, на который мне пришлось ответить, был: какой технический стек мы должны использовать? Мне нужно было два ответа на этот вопрос:

  • Какой стек использовать для быстрого и грязного прототипа?
  • Какой стек использовать в дальнейшем для полноценной производственной системы?

Я решил начать с первого ответа и работать над вторым, как только у меня появится лучшее представление о том, что мы создаем. Вот что я хотел для прототипа:

  1. Только внешний код, без серверной части;
  2. Язык, на котором мне было комфортно разрабатывать, и который позволил мне писать код быстро с минимальными затратами на отладку;
  3. Если бы выбор технологии был неправильным, я бы с радостью выбросил этот прототип и построил заново с использованием другой технологии при доставке производственного кода.

Поскольку мой опыт разработки программного обеспечения в основном сосредоточен на серверных технологиях (Java EE, Python Django и т. Д.), Которые создают HTML-страницы, веб-технологии были естественным ответом, и я начал рассматривать AngularJS, Ember или React, но За несколько месяцев до этого споры в моей предыдущей компании не вызывали у меня особого энтузиазма по поводу каждого из них. В то же время я пошел к моему любимому продавцу технических знаний, Pragmatic Bookshelf, чтобы посмотреть, могут ли они расширить мой кругозор в интерфейсных технологиях, и в итоге получил копию Еще семь языков за семь недель. Там я встретил Эльма и обнаружил, что мне очень нравится работать с ним, хотя компилятор изрядно ругался (подробнее об этом позже).

Несмотря на то, что версии Elm еще не 1.0, он стабилен, и его приятно использовать, вот почему:

А еще есть компилятор. Elm - это скомпилированный язык (скомпилированный в JavaScript). Компилятор заставит вас ругаться, а также спасет ваш сало. Если вы привыкли «утирать типизацию», как в JavaScript или Python, может быть неприятно использовать строго типизированный язык, когда компилятор будет вызывать вас при каждом несоответствии типов, но вознаграждение того стоит:

  • Когда ваш код скомпилирован, он не выйдет из строя во время выполнения;
  • Это снижает риск рефакторинга кода: даже если вы сделаете страшную операцию на открытом сердце своему коду, после того, как он снова скомпилируется и все тесты пройдут, он, вероятно, просто сработает;
  • Он вынуждает вас всегда явно обрабатывать ошибки и отсутствие данных (что было бы null в JavaScript): сначала это звучит как перетаскивание, но основной API поставляется с двумя удобными библиотеками, Result и Maybe, которые делают его очень простым и приводят к очень читаемый код.

Я написал этот прототип на Elm, и он мне настолько понравился, что я решил продолжать использовать его для нашего конечного продукта, и именно здесь он действительно проявил себя. После того, как у нас появился прототип и мы получили хорошие отзывы об идее, мы наняли UX-дизайнера, провели надлежащее пользовательское тестирование вайрфреймов и полностью проверили весь UI и визуальный дизайн. Полученные в результате каркасы сильно отличались от того, с чего мы начали, поэтому было бы соблазнительно выбросить прототип и начать заново с нуля. Но Elm очень упрощает рефакторинг кода, поэтому я сделал именно это: реорганизовал первоначальный прототип, чтобы преобразовать его в конечный продукт. В процессе я провел обширную перезапись некоторых компонентов, и компилятор сыграл важную роль в обеспечении бесперебойной работы. Сейчас мы очень близки к запуску бета-версии, и я ругаюсь с компилятором намного меньше, так как за это время я многому научился и чувствую, что действительно могу создавать код хорошего качества, который (в основном) работает с первого раза. Что касается серверных сервисов, мы решили использовать Эликсир, и это решение заслуживает отдельной публикации в блоге.

Помимо этого, что бы я хотел видеть в Вязах? Что касается самого языка, то мне бы очень хотелось иметь протоколы, как в Эликсире, но пока я могу жить без них. Основные улучшения, которые я хотел бы увидеть, связаны с инструментами:

  • Более продвинутые конвейеры сборки, чтобы он мог вызывать внешнюю задачу до или после компиляции, такую ​​как парсер SASS, и возможность указывать цели сборки в elm-package.json файле: на данный момент я использую простой Makefile для всего этого, и было бы неплохо, если бы все это может быть интегрировано в elm-make;
  • Лучшая интеграция elm-test, чтобы мне не приходилось повторять детали во втором elm-package.json файле;
  • Поддержка частных репозиториев и публичных репозиториев, кроме Github. В настоящий момент, если вы используете что-либо, кроме общедоступного репозитория Github, вы не можете использовать какие-либо функции elm-package, особенно возможность повышения версии.

Резюме

Стоит ли вам использовать Elm для написания прототипа нового причудливого приложения, о котором вы думали? Фриман Латиф так не думает, и я согласен с ним, если вы опытный кодировщик JavaScript: к строгому типизирующему подходу Элма потребуется время, чтобы к нему привыкнуть. С другой стороны, если вы привыкли к строго типизированным языкам, таким как Java, это не такая уж большая проблема. И, конечно же, если у вас есть опыт работы с Elm, то ответ, очевидно, положительный!

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

Стоит ли изучать вяз, даже если вы не собираетесь использовать его для чего-нибудь серьезного? Да, это сделает вас лучшим программистом, независимо от того, какой язык вы выберете. Я обнаружил, что реализую варианты Maybe и Result на других языках, поскольку мне очень нравится выразительность этих конструкций, и они делают мой код более устойчивым. Если вы хотите выучить вяз, вот краткое руководство о том, на что следует обратить внимание, чтобы облегчить вашу жизнь:

  • Узнайте, как работают модули Maybe и Result: это не только поможет понять типы объединения Elm, но и сделает ваш код более понятным, и вы обнаружите, что пишете аналогичные функции для своих собственных библиотек;
  • Узнайте, как работает модуль Task, поскольку очень важно делать все, что происходит асинхронно, например, HTTP-вызовы REST API или даже просто получать текущее время (это заняло у меня время, чтобы поработать!);
  • Узнайте, как работают модули Json.Decode и Json.Encode, поскольку они будут вашим основным способом взаимодействия с миром за пределами Elm, будь то флаги, переданные вашей программе или полученные из HTTP-вызова;
  • Как и многие другие функциональные языки, Elm использует каррирование, узнайте, как это работает, поскольку это значительно упростит понимание сообщений об ошибках компилятора.

Ресурсы