Когда мы основали imby в апреле 2016 года, мы были двумя соучредителями: Ник собирался заботиться о деловой стороне вещей, а я собирался заботиться о технологической стороне вещей. Первый вопрос, на который мне пришлось ответить, был: какой технический стек мы должны использовать? Мне нужно было два ответа на этот вопрос:
- Какой стек использовать для быстрого и грязного прототипа?
- Какой стек использовать в дальнейшем для полноценной производственной системы?
Я решил начать с первого ответа и работать над вторым, как только у меня появится лучшее представление о том, что мы создаем. Вот что я хотел для прототипа:
- Только внешний код, без серверной части;
- Язык, на котором мне было комфортно разрабатывать, и который позволил мне писать код быстро с минимальными затратами на отладку;
- Если бы выбор технологии был неправильным, я бы с радостью выбросил этот прототип и построил заново с использованием другой технологии при доставке производственного кода.
Поскольку мой опыт разработки программного обеспечения в основном сосредоточен на серверных технологиях (Java EE, Python Django и т. Д.), Которые создают HTML-страницы, веб-технологии были естественным ответом, и я начал рассматривать AngularJS, Ember или React, но За несколько месяцев до этого споры в моей предыдущей компании не вызывали у меня особого энтузиазма по поводу каждого из них. В то же время я пошел к моему любимому продавцу технических знаний, Pragmatic Bookshelf, чтобы посмотреть, могут ли они расширить мой кругозор в интерфейсных технологиях, и в итоге получил копию Еще семь языков за семь недель. Там я встретил Эльма и обнаружил, что мне очень нравится работать с ним, хотя компилятор изрядно ругался (подробнее об этом позже).
Несмотря на то, что версии Elm еще не 1.0, он стабилен, и его приятно использовать, вот почему:
- Управление пакетами делает то, что написано на упаковке, и работает без сбоев;
- Руководство по началу работы действительно хорошее, как и остальная документация;
- У Эвана Чаплики, создавшего Elm, есть действительно хороший и простой пример приложения, чтобы увидеть, как все это работает вместе;
- Есть очень хороший пакет модульного тестирования.
А еще есть компилятор. 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 использует каррирование, узнайте, как это работает, поскольку это значительно упростит понимание сообщений об ошибках компилятора.