Программирование на языке Elixir
Полное руководство по функциональному и параллельному программированию на языке Elixir. Охватывает переход от объектно-ориентированного мышления к функциональному, сопоставление шаблонов, неизменяемость, модель актора для параллелизма и создание надежных распределённых систем с использованием OTP.
Обзор курса
📚 Краткое содержание
Полное руководство по функциональному и параллельному программированию на языке Elixir. Охватывает переход от объектно-ориентированного мышления к функциональному, сопоставление шаблонов, неизменяемость, модель актора для параллелизма и создание надежных распределённых систем с использованием OTP.
Освойте искусство создания устойчивых, параллельных систем через красоту функционального программирования.
Автор: Дэйв Томас
Благодарности: Жозе Валим, Кори Хейнс, Брюс Тейт, Джессика Керр, Энтони Эден, Чад Фоулер, Ким Шриер, Кэндис Каннингем, и Потомак Индексинг.
🎯 Цели обучения
- Сравнить модель трансформации данных в Elixir с традиционным программированием на основе состояний.
- Настроить интерактивную оболочку Elixir (IEx) и выполнять код Elixir через скрипты и компиляцию.
- Применять оператор сопоставления (
=), оператор фиксации (^) и символ замены (_) для деконструкции и проверки данных. - Объяснить теоретические и практические последствия неизменяемости для производительности и управления памятью.
- Определить и использовать встроенные типы данных Elixir, включая типы значений, системы и коллекций.
- Применять правила области видимости переменных и выражение
withдля управления сложными трансформациями данных. - Создавать и вызывать анонимные функции как стандартным, так и синтаксисом захвата (
&). - Реализовывать именованные функции в модулях с использованием сопоставления шаблонов и рекурсии для обработки сложной логики.
- Применять условия-ограничения (guard clauses) и параметры по умолчанию для управления потоком выполнения функций.
- Разбор и построение списков: Использовать сопоставление шаблонов "голова/хвост" для навигации и построения рекурсивных структур списков.
🔹 Урок 1: Введение в Elixir и сопоставление шаблонов
Обзор: Этот урок представляет язык Elixir как функциональный язык, основанный на трансформации данных, а не на изменении состояния. Студенты узнают, как работать в среде Elixir (IEx), компилировать и запускать скрипты, а также освоить сопоставление шаблонов — фундаментальный механизм, используемый Elixir для привязки переменных и управления потоком выполнения.
Цели обучения:
- Сравнить модель трансформации данных в Elixir с традиционным программированием на основе состояний.
- Настроить интерактивную оболочку Elixir (IEx) и выполнять код Elixir через скрипты и компиляцию.
- Применять оператор сопоставления (
=), оператор фиксации (^) и символ замены (_) для деконструкции и проверки данных.
🔹 Урок 2: Неизменяемость и основы Elixir
Обзор: Этот урок исследует фундаментальную философию Elixir — неизменяемость. Студенты узнают, как Elixir рассматривает данные как неизменяемые сущности, преимущества такого подхода для производительности, а также различные встроенные типы — от простых типов значений, таких как атомы и диапазоны, до сложных коллекций, таких как карты и двоичные данные. Урок завершается глубоким изучением области видимости переменных и мощного выражения with.
Цели обучения:
- Объяснить теоретические и практические последствия неизменяемости для производительности и управления памятью.
- Определить и использовать встроенные типы данных Elixir, включая типы значений, системы и коллекций.
- Применять правила области видимости переменных и выражение
withдля управления сложными трансформациями данных.
🔹 Урок 3: Функции, модули и оператор передачи труб
Обзор: Этот урок посвящён ядру программирования на Elixir — функциональной трансформации. Рассматривается переход от анонимных функций и замыканий к структурированным модулям и именованным функциям. Студенты научатся использовать сопоставление шаблонов, рекурсию и оператор передачи труб для создания краткого, читаемого и поддерживаемого кода при взаимодействии с базовой виртуальной машиной Erlang.
Цели обучения:
- Создавать и вызывать анонимные функции как стандартным, так и синтаксисом захвата (
&). - Реализовывать именованные функции в модулях с использованием сопоставления шаблонов и рекурсии для обработки сложной логики.
- Применять условия-ограничения (guard clauses) и параметры по умолчанию для управления потоком выполнения функций.
🔹 Урок 4: Рекурсивные списки и структуры данных
Обзор: Этот урок охватывает фундаментальные механизмы работы со списками в Elixir через рекурсию, особенно фокусируясь на шаблоне «Голова и хвост» для обработки и построения данных. Переход к сложным структурам — картам, структурам и спискам ключевых слов — предоставляет систему принятия решений для выбора правильной структуры и продвинутые техники манипулирования вложенными данными с помощью модуля Access и теории типов в Elixir.
Цели обучения:
- Разбор и построение списков: Использовать сопоставление шаблонов "голова/хвост" для навигации и построения рекурсивных структур списков.
- Реализовать высшие порядки шаблонов: Создать собственные функции
mapиreduceдля трансформации или агрегации данных списка. - Выбрать соответствующие структуры данных: Различать карты, структуры и списки ключевых слов на основе требований к производительности, порядку и целостности данных.
🔹 Урок 5: Перечисляемые элементы, потоки и обработка строк
Обзор: Этот урок исследует двойственный подход к обработке коллекций в Elixir: жадный модуль Enum и ленивый, композируемый модуль Stream. Также представлено углубленное изучение трансформации данных через понимания списков и внутренние механизмы строк Elixir, различая списки символов (в одинарных кавычках) и бинарные строки (в двойных кавычках). Студенты научатся обрабатывать сложные структуры данных, работать с бесконечными данными и выполнять низкоуровневую извлечение битов.
Цели обучения:
- Различать жадную и ленивую оценку при обработке коллекций.
- Использовать понимания списков с несколькими генераторами и фильтрами для трансформации данных и извлечения информации на уровне битов.
- Различать строки в одинарных кавычках (списки символов) и строки в двойных кавычках (бинарные строки) и применять соответствующий модуль (List vs. String) для манипуляции.
🔹 Урок 6: Управление потоком, проекты Mix и профессиональные инструменты
Обзор: Этот урок помогает разработчикам перейти от написания изолированных функций на Elixir к созданию, тестированию и мониторингу профессиональных приложений. Рассматриваются расширенные конструкции управления потоком (case, cond), жизненный цикл проекта Mix (от структуры каталогов до исполняемых файлов командной строки) и набор профессиональных инструментов для отладки, тестирования на основе свойств и мониторинга серверов.
Цели обучения:
- Реализовывать сложную логику ветвления с помощью
case,condи обработки исключений. - Структурировать проекты на Elixir с помощью
Mix, управлять внешними зависимостями, такими какHTTPoisonиPoison, и настраивать среды выполнения приложения. - Создавать надёжные тестовые комплекты с использованием
ExUnit,DocTestи тестирования на основе свойств с помощьюStreamData.
🔹 Урок 7: Параллелизм и распределённые узлы
Обзор: Этот урок рассматривает переход от одно-процессных приложений на Elixir к распределённым системам. Изучается механизм обработки сообщений, сохранение состояния процессов с помощью хвостовой рекурсии и надёжное управление жизненным циклом процессов через ссылки и мониторинг. Наконец, вводится модель распределения виртуальной машины Erlang, обучая подключению узлов, защите с помощью «печеньев» (cookies) и работе с вводом-выводом по сети.
Цели обучения:
- Реализовывать состоятельные, постоянные процессы с использованием хвостовой рекурсии и таймаутов сообщений.
- Создавать отказоустойчивые деревья процессов с помощью ссылок (
spawn_link) и мониторинга (spawn_monitor). - Настроить и подключить распределённые узлы с использованием соглашений об именах, безопасности с помощью «печеньев» и глобальной регистрации процессов.
🔹 Урок 8: Основы OTP: Серверы и контроллеры
Обзор: Этот урок знакомит с платформой Open Telecom Platform (OTP) в экосистеме Elixir, фокусируясь конкретно на поведении GenServer и паттернах Supervisor. Студенты узнают, как создавать надёжные серверные процессы с состоянием, различать синхронный и асинхронный обмен сообщениями, а также реализовывать отказоустойчивые деревья контроля, автоматически управляющие жизненным циклом процессов.
Цели обучения:
- Определить основные компоненты OTP и реализовать стандартный жизненный цикл обратных вызовов
GenServer. - Различать и реализовывать синхронные (call) и асинхронные (cast) модели обмена сообщениями.
- Настроить и развернуть контроллер для мониторинга рабочих процессов и обеспечения надёжности системы при сбоях.
🔹 Урок 9: Сложные архитектуры OTP и управление состоянием
Обзор: Этот урок переходит от отдельных GenServer к проектированию и развертыванию сложных, многокомпонентных приложений на основе OTP. Рассматривается архитектурное проектирование «Дупера» — программы поиска дубликатов файлов, механика спецификаций приложений OTP и продвинутые методы развертывания, включая горячие обновления с помощью Distillery. Кроме того, рассматриваются упрощённые альтернативы управления состоянием, такие как Tasks и Agents, предоставляя систему для выбора подходящего инструмента в зависимости от потребностей в параллелизме.
Цели обучения:
- Анализировать требования к приложению с помощью пятивопросной модели для выявления ключевых точек и характеристик времени выполнения.
- Создавать многосерверное приложение на основе OTP («Дупер»), используя специализированные серверы (Results, PathFinder, Gatherer) и динамические контроллеры.
- Выполнять выпуски кода и горячие обновления с помощью Distillery, включая миграцию состояния через обратный вызов
code_change.
🔹 Урок 10: Метапрограммирование, протоколы и безопасность типов
Обзор: Этот урок исследует расширяемость уровня высокого порядка в Elixir, фокусируясь на возможности манипулирования кодом как данными с помощью метапрограммирования и макросов. Студенты узнают, как достичь полиморфизма с помощью протоколов и поведений, структурировать крупномасштабные системы с помощью проектов-зонтиков (Umbrella), а также реализовывать надёжную обработку ошибок. В заключение рассматривается добавление слоя статического анализа с помощью системы типов Elixir и Dialyzer для обеспечения корректности кода.
Цели обучения:
- Освоить использование
quoteиunquoteдля внедрения и изменения блоков кода внутри макросов. - Реализовать пользовательские протоколы и поведения для создания полиморфных и повторно используемых структур кода.
- Создавать многомодульные проекты-зонтики и применять формальные спецификации типов к динамическому коду Elixir.