Получение эликсира - первые шесть месяцев

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

Я с ним согласен. Однако сегодня я хочу поговорить о следующем: сколько времени вам нужно, чтобы стать продуктивным участником проекта, написанного на языке, который вам нужно выучить с нуля? Я утверждаю, что на этот раз, учитывая хорошо продуманный язык и поддерживающую корпоративную культуру, он может быть намного короче.

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

Для этого я сначала скажу пару слов о моем опыте работы до Эликсира.

Как только это будет решено, я расскажу кое-что о том, как я подошел к существующим проектам Elixir в своей работе, как я дополнил свою практику дополнительным теоретическим материалом и как сообщество помогло мне учиться.

Наконец, я расскажу о своем опыте работы с моим первым более крупным проектом, о том, как я начал размышлять о недостающих элементах и ​​о том, как компания с культурой обучения и преподавания может помочь вам расти как инженеру Elixir.

Откуда я приехал

Я начал свою карьеру в индустрии написания кода на C ++. Эта установка сопровождала меня большую часть пяти лет, поэтому не достаточно (для меня), чтобы по-настоящему осознать ее, но достаточно, чтобы смириться с ее сложностью.

Моя основная проблема заключалась в том, что всякий раз, когда я хотел достичь чего-то полезного с помощью программирования, C ++ никогда не был подходящим инструментом для работы, потому что он слишком низкий уровень, чтобы когда-либо прийти к чему-то осязаемому, тем более, когда вы хотите, чтобы пользовательский интерфейс был веб-страницу.

Использование C ++ также означает, что я всегда использовал только императивное программирование, и раньше я был ярым сторонником объектно-ориентированного программирования.

Я перешел к веб-разработке после пяти лет эксклюзивной ООП-диеты. Какой шок! Это также был мой первый опыт работы с языком, допускающим закрытие (вы можете сделать что-то подобное в C ++, за исключением функций, которые не являются первоклассными гражданами).

Через пару лет я начал пользоваться Эликсиром.

Упражняться

Моим первым заданием было исправить ошибку в сложной (разве это не стало излишним в наши дни?) Системе, написанной на Эликсире. Моя компания имеет сильную склонность к функциональному программированию, и это отражается во всех проектах, включая те, в которых основным языком является не Elixir. Я думаю, это важно, потому что легче освоить такой язык, как Elixir, если на вашем рабочем месте нет предубеждений против функционального программирования.

Но на других языках у вас есть выбор. В Ruby, например (каламбур), классы и объектно-ориентированный объект - они все еще существуют. Эликсир освобождает вас от этих абстракций и мягко подталкивает к мысли без них. В каком-то смысле это упрощение, которое освобождает.

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

Как только вы поймете идею конвейера действий, он станет очень удобочитаемым (в этом случае мы сглаживаем список - обратите внимание, что [2] является самим списком внутри списка - а затем удваиваем каждый элемент).

Рекурсия и отсутствие циклов могут занять немного больше времени, но тоже довольно быстро начинает казаться естественным. Я привык использовать for-петли, но со временем мне удалось потренироваться достаточно, чтобы reduce чувствовался естественно.

И это работает. Elixir побуждает вас создавать множество простых блоков, которые можно рассматривать изолированно, потому что функции Elixir являются чистыми и как таковые позволяют вам игнорировать состояние остальной системы. Сторонники более артикулированного языка, чем я, сказали это лучше, но размышление о вещах изолированно помогает вам более четко понимать концепции и выражать их в коде, а также приводит к большей уверенности в том, как они взаимодействуют. Более того, Elixir настолько выразителен, что относительно простые проекты достигают существенного материала (другой способ сказать, что язык выразительный).

Это достижение заслуживает похвалы. Одна из них, безусловно, экосистема. Менеджер пакетов Hex (который берет на себя роль NPM в мире JavaScript) отлично помогает в обнаружении библиотек, и число этих библиотек растет. Фреймворк Phoenix поддерживает веб-разработку и делает ее интуитивно понятной, так же, как Rails делает для Ruby. Виртуальная машина Erlang (известная как BEAM), на которой работает любая система Elixir, наконец, предлагает отличную поддержку параллелизма и отказоустойчивости, что делает ее надежным выбором для сложных систем.

Изучение

На тот момент я хотел улучшить свои знания языка с помощью некоторой теории. Вот еще одна веская причина принять Elixir: у него очень дружелюбное сообщество и высококачественная документация.

Самым полезным для меня оказался ресурс, который мне рекомендовали многие мои коллеги: курс Разработка с помощью Elixir / OTP от Pragmatic Studio. Ясность курса значительно помогает в соединении частей, чтобы предложить более широкое понимание того, что происходит в BEAM, и того, как это помогает разрабатывать надежные системы.

Но теория без практики не очень полезна (концепция, изложенная также в курсе, который я только что упомянул). Помимо выполнения увлекательных упражнений, представленных в самом курсе, я использовал сообщество наставников в Exercism, которое дает отзывы о решенных проблемах и помогает мне понять несколько механизмов языка (например, разницу между строками и списками). . Форум Эликсира также является отличным источником информации и довольно часто всплывает, когда вы гуглите что-нибудь, связанное с Эликсиром. Наконец, весьма полезное рабочее пространство Elixir Slack объединяет сообщество инженеров, где я не раз задавал вопросы новичкам и получал почти мгновенную поддержку.

Я также решил погрузиться в более организованные ресурсы. Я взял в руки Феникс в реальном времени, отличную книгу, но уже на более продвинутом уровне, чем я был в то время (или сейчас). Тем не менее, это был бесценный опыт, поскольку я делился своими успехами в чтении с группой других инженеров компании на еженедельных встречах.

Наконец, программа с интервальным повторением Anki помогла мне сохранить многие концепции, которые я увидел впервые ».

Больше практики: первый проект

На этом этапе моя команда начала новый проект с Эликсиром. Это был отличный опыт, который очень помог в закреплении концепций, которые я приобрел в процессе. Было еще много рук, но это открыло глаза на то, на что способен Феникс. Это также побудило меня разработать свой первый плагин (подробнее об этом в следующей статье).

Что меня впечатлило, так это то, как группа людей, относительно неопытных в этом языке, могла собрать твердое решение почти с нуля за относительно короткое время. (Мы, кажется, не единственные в этой должности, поскольку, например, команда Discord также начала использовать Эликсир и изучать его на работе).

Целью проекта было разработать платформу, позволяющую создавать правила, описывающие события в веб-приложении, которые могут запускать действия при определенных условиях. У нас был похожий проект, написанный на Ruby, и это, безусловно, было на один элемент неожиданности меньше, что позволило нам больше сосредоточиться на реализации и экспериментировании и немного меньше на дизайне. У нас также были другие проекты в Elixir внутри компании, что было полезно, потому что мы тратили меньше времени на выяснение частей конфигурации.

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

Я понимаю, что большая часть тяжелой работы уже сделана. Как упоминалось ранее, BEAM предоставляет невероятный ресурс для надежной сетевой связи. Но логика приложения была очень естественной для сопоставления с концепциями Elixir, и это ускорило разработку и значительно уменьшило количество ошибок. У меня нет цифр, подтверждающих это заявление, но у меня есть несколько проектов за плечами, и этот опыт до сих пор был одним из самых успешных в моей карьере.

Позвольте мне отступить. Хочу особо отметить чистую практику. Когда дело доходит до понимания самого языка и того, что он может предложить, я думаю, что большую часть ценности я получил от задачи Advent of Code 2020. В изолированном решении проблем есть что-то, что позволяет вам оценить аспекты языка, на которые вы обычно не обращаете внимания при работе над более крупными проектами, чему способствуют выразительные библиотеки и поддерживают такие фреймворки, как Phoenix. Думаю, именно здесь у меня запали многие мелкие детали, например, работы с картами и структурами.

Недостающие части

К тому времени, когда проект перешел в режим обслуживания, я начал лучше понимать, каких частей мне не хватает. Я читал, что я не единственный, кто работал с Elixir в течение нескольких месяцев, даже не понимая, для чего нужен GenServer.

Phoenix и Ecto по-прежнему для меня загадочные звери, как и тестирование с Mox (хотя я написал много тестов для проекта, запомнить синтаксис было бы сложно - просто недостаточно практики).

Не говоря уже о метапрограммировании и макросах - теме, которая в мои дни C ++ была источником опасений, но в Elixir она кажется чем-то более дружелюбной. Это также один из мощных аспектов функционального программирования. Хорошая новость: это хорошо знать, но нехорошо использовать, так как это затрудняет чтение ваших программ. (Это в основном было принято также в сообществе C ++.)

Поощряйте эксперименты!

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

Заключение: что нужно для изучения языка

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

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

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

Сноски

  1. Периодическое повторение, вероятно, имеет более узкое применение в инженерии, чем, скажем, при изучении (разговорных) языков. Но некоторые концепции стоит запомнить, чтобы вы могли извлекать их при необходимости, не исследуя их в браузере. Одним из примеров того, как я использовал его в Elixir, является изучение концепций из книги Real-Time Phoenix. Допустим, вы хотите знать и помнить, каковы обязанности клиента Channel. Я бы создал их список и использовал бы закрыть удаление, чтобы удалять один маркер из списка каждый раз, когда мне его показывали, и пытался запомнить отсутствующий.