ElixirMiddleExperience

Какие версии, возможности или изменения экосистемы Elixir важно учитывать на собеседованиях в 2026 году?

В 2026 году важны: Phoenix 1.7+ с HEEx и LiveView 1.0 streams, Oban 2.x как стандарт фоновых задач, mix release вместо distillery, Broadway для потоков данных и разница compile-time vs runtime конфигурации.

Elixir в 2026: что важно знать на собеседовании

Экосистема Elixir активно развивалась в 2024–2025 годах. Ряд изменений напрямую влияет на архитектурные решения и является стандартом, который ожидают на senior/middle уровне.

Elixir 1.17–1.18: ключевые изменения

В версии 1.17 появились типы для структур через @type t и улучшенный вывод типов в Dialyzer. В 1.18 добавлен официальный языковой сервер (elixir-ls заменён на встроенный Mix.Tasks.ElixirLS), а также улучшена обработка предупреждений компилятора.

# Elixir 1.17+: улучшенные типы для struct
defmodule User do
  @enforce_keys [:id, :email]
  defstruct [:id, :email, :name]

  @type t :: %__MODULE__{
    id: integer(),
    email: String.t(),
    name: String.t() | nil
  }
end

Phoenix 1.7+ и LiveView 1.0

Phoenix 1.7 переработал генераторы: теперь используется ~H-сигил для HEEx-шаблонов, core_components.ex как замена Bootstrap-подобных зависимостей. LiveView 1.0 (2024) стабилизировал API: Phoenix.Component, LiveView.JS, stream/3 для больших списков.

# LiveView 1.0: streams для эффективного рендеринга больших списков
def mount(_params, _session, socket) do
  {:ok, stream(socket, :messages, Messages.list_recent())}
end

def handle_info({:new_message, msg}, socket) do
  {:noreply, stream_insert(socket, :messages, msg, at: 0)}
end

Oban 2.x как стандарт для фоновых задач

Oban (фоновые задачи на Postgres) стал де-факто стандартом. Важно знать: очереди, приоритеты, Oban.Worker behaviour, уникальность джобов (unique: [period: 30]), Oban.Testing для тестов.

defmodule MyApp.Workers.EmailWorker do
  use Oban.Worker, queue: :emails, max_attempts: 3

  @impl Oban.Worker
  def perform(%Oban.Job{args: %{"user_id" => user_id}}) do
    user = Repo.get!(User, user_id)
    Mailer.send_welcome(user)
    :ok
  end
end

# Постановка в очередь
%{user_id: user.id}
|> MyApp.Workers.EmailWorker.new()
|> Oban.insert()

Nx и Livebook в ML-пайплайнах

Nx (numerical computing), Axon (neural networks), Explorer (dataframes) — это стек для ML на Elixir. В 2025 году он достиг production-ready состояния. Livebook 0.13+ поддерживает Smart Cells для Nx. Если позиция связана с data engineering — это нужно знать.

Broadway и GenStage для потоков данных

Broadway — стандарт для обработки сообщений из Kafka, RabbitMQ, SQS. GenStage — back-pressure примитив под ним. На собеседованиях в компаниях с высокой нагрузкой это обязательная тема.

defmodule MyPipeline do
  use Broadway

  def start_link(_opts) do
    Broadway.start_link(__MODULE__,
      name: __MODULE__,
      producer: [
        module: {BroadwayRabbitmq.Producer, queue: "events"},
        concurrency: 1
      ],
      processors: [default: [concurrency: 10]]
    )
  end

  @impl true
  def handle_message(_processor, message, _context) do
    IO.inspect(message.data)
    message
  end
end

Mix Release и Docker деплой

Знание mix release обязательно: как собрать релиз без Mix, как передать конфигурацию через config/runtime.exs и переменные окружения, как собрать минимальный Docker-образ.

# config/runtime.exs — runtime конфигурация для релизов
import Config

config :my_app, MyApp.Repo,
  url: System.fetch_env!("DATABASE_URL"),
  pool_size: String.to_integer(System.get_env("POOL_SIZE", "10"))

Подводные камни

  • Путаница между config/config.exs (compile-time) и config/runtime.exs (runtime) — критично для Docker/release деплоев.
  • Использование устаревшего distillery вместо встроенного mix release (доступен с Elixir 1.9).
  • Незнание Phoenix.LiveView.stream/3 — без него рендеринг тысяч элементов списка в LiveView неэффективен.
  • Отсутствие знаний об Oban.Testing: тесты фоновых задач через assert_enqueued/2 и perform_job/2.
  • Игнорирование :telemetry и Telemetry.Metrics — в 2026 году это базовый стандарт наблюдаемости.
  • Незнание HEEx и ~H-сигила в Phoenix 1.7+ — старые EEx-шаблоны считаются устаревшими.
  • Непонимание разницы между assign/3 и stream/3 в LiveView — неправильный выбор ведёт к деградации производительности.

What hurts your answer

  • Рассказывать устаревший подход как актуальную практику
  • Не отличать личный legacy-опыт от состояния экосистемы в 2026 году
  • Игнорировать migration notes и deprecated API

What they're listening for

  • Понимает актуальное состояние Elixir
  • Отличает современные практики от legacy-подходов
  • Учитывает миграции, deprecated API и совместимость

Related topics