Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 210новых вакансий за сутки·93 612вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 266
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 126
  • Облачные технологии14 083
  • QA вакансии3 456
  • Backend вакансии2 116
  • Инженер данных1 809
  • Продакт-менеджер1 261

Разработка

  • Android1 862
  • iOS1 700
  • Fullstack вакансии990
  • AI вакансии951
  • Frontend вакансии749
  • Mobile вакансии44

По стеку

  • Go8 688
  • Java6 537
  • Node.js2 026
  • .NET1 722
  • Kotlin1 611
  • Rust1 458
  • C#710
  • PHP682
  • C++571

DevOps и инфраструктура

  • Kubernetes7 772
  • DevOps вакансии6 054
  • Linux-инфраструктура5 493
  • Terraform / IaC4 275
  • CI/CD3 239
  • Мониторинг и Observability1 790
  • SRE568
  • Кибербезопасность458

Аналитика и данные

  • Data Scientist1 143
  • Бизнес-аналитик923
  • Аналитик данных857
  • Системный аналитик152

Другие направления

  • Проджект-менеджер620
  • UI/UX дизайн147
  • Ручное тестирование14

По регионам

  • Вакансии в США44 437
  • Вакансии в Европе23 855
  • Вакансии в Канаде4 483
  • Работа в России3 904

По формату

  • Удалённые вакансии75 212
  • Релокация в США44 436
  • Гибридная работа12 388
  • Офисная работа7 083

По уровню

  • Senior вакансии42 625
  • Middle вакансии20 854
  • Junior вакансии6 721

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Phoenix (Elixir)Все вопросы
Phoenix (Elixir)MiddleТеория

Что такое LiveView streams (представленные в Phoenix 0.18+) и почему они эффективнее списков?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

LiveView streams хранят коллекцию в DOM браузера, а не в assigns сервера. При изменении сервер отправляет только операцию (insert/delete) над одним элементом, а не весь список — это экономит память и снижает объём передаваемых данных.

Проблема обычных assigns-списков

# Плохой подход для больших списков
def mount(_params, _session, socket) do
  {:ok, assign(socket, messages: Messages.list_all())}  # 10000 записей в RAM
end

def handle_event("new_message", %{"body" => body}, socket) do
  {:ok, msg} = Messages.create(body)
  # Весь список пересобирается и diff-ится целиком
  {:noreply, update(socket, :messages, &[msg | &1])}
end

При каждом обновлении LiveView вычисляет diff между старым и новым списком. Для 1000 элементов это дорого: и по CPU, и по памяти.

LiveView Streams: эффективный рендеринг коллекций

Streams появились в Phoenix LiveView 0.18 (вышел в составе Phoenix 1.7) и решают конкретную проблему: как рендерить и обновлять большие коллекции без хранения всего списка в памяти LiveView-процесса и без полного ре-рендеринга при каждом изменении.

Streams: как работает

Stream хранит элементы коллекции в DOM браузера, а не в assigns LiveView-процесса. Сервер отправляет только операции: «вставь элемент», «удали элемент», «обнови элемент» — без полной коллекции в памяти.

defmodule MyAppWeb.MessageLive do
  use MyAppWeb, :live_view

  alias MyApp.Chat

  @impl true
  def mount(_params, _session, socket) do
    messages = Chat.list_recent_messages(limit: 50)

    socket =
      socket
      |> stream(:messages, messages)
      # Опционально: ограничить DOM до N элементов
      |> stream(:messages, messages, limit: 100)

    if connected?(socket) do
      Phoenix.PubSub.subscribe(MyApp.PubSub, "chat")
    end

    {:ok, socket}
  end

  @impl true
  def handle_info({:new_message, message}, socket) do
    # Вставить в начало DOM; сервер не хранит список
    {:noreply, stream_insert(socket, :messages, message, at: 0)}
  end

  @impl true
  def handle_event("delete", %{"id" => id}, socket) do
    message = Chat.get_message!(id)
    {:ok, _} = Chat.delete_message(message)
    {:noreply, stream_delete(socket, :messages, message)}
  end
end

Шаблон со stream

def render(assigns) do
  ~H"""
  <ul id="messages" phx-update="stream">
    <li
      :for={{dom_id, message} <- @streams.messages}
      id={dom_id}
    >
      {message.body}
      <button phx-click="delete" phx-value-id={message.id}>
        Delete
      </button>
    </li>
  </ul>
  """
end

Ключевые детали: атрибут phx-update="stream" на контейнере и обязательный id={dom_id} на каждом элементе — LiveView использует эти ID для точечных обновлений DOM.

API streams

  • stream(socket, name, items) — инициализация стрима.
  • stream_insert(socket, name, item, at: 0) — вставить в начало (at: -1 — в конец).
  • stream_delete(socket, name, item) — удалить по ID.
  • stream_delete_by_dom_id(socket, name, dom_id) — удалить по DOM ID напрямую.
  • stream(socket, name, [], reset: true) — сбросить стрим и вставить новые элементы.

Почему это эффективнее списков

  • Память процесса: список из 10 000 элементов не хранится в assigns — только в DOM браузера.
  • Diff: при вставке одного элемента сервер отправляет только этот элемент, а не весь список.
  • DOM: браузер обновляет только один <li>, а не перерисовывает весь список.

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

  • Структуры в стриме должны реализовывать Phoenix.Param или иметь поле id — иначе LiveView не сможет сгенерировать dom_id.
  • phx-update="stream" обязателен на контейнере — без него LiveView не знает, что это стрим.
  • Нельзя читать элементы стрима из assigns на сервере — они живут только в DOM клиента.
  • При использовании limit: старые элементы удаляются из DOM автоматически, но этот лимит не связан с пагинацией в БД — нужно контролировать separately.
  • stream_insert с уже существующим ID обновляет элемент (upsert-семантика) — это удобно, но может быть неожиданным.
  • reset: true пересылает все элементы заново — не используйте для частичного обновления.
  • Стримы несовместимы с phx-update="append" — это другой механизм.
  • При вложенных стримах (стрим внутри LiveComponent) нужно явно указывать идентификатор компонента.

Частые вопросы на собеседовании

  • Как планировать zero-downtime deploy Phoenix-приложения с Ecto migrations и rolling releases?
  • Что такое Plugs в Phoenix и как работает plug-конвейер?
  • Чем Phoenix отличается от Rails или Django по архитектуре?
  • В чём разница между Phoenix templates (.heex) и традиционными EEx-шаблонами?

Типичные ошибки

  • Сводить liveview streams к названию метода без lifecycle и failure path.
  • Игнорировать модель runtime: Phoenix 1.8 работает поверх Plug, Endpoint, Router, Controllers/LiveViews, PubSub и OTP supervision.
  • Не отделять validation, authorization, transaction boundary и business logic.
  • Менять похожие API местами без учёта семантики ошибок и ownership.

Что проверяет интервьюер

  • Объясняет liveview streams через конкретную точку lifecycle в Phoenix (Elixir).
  • Приводит корректный минимальный пример без вымышленных методов или callbacks.
  • Называет edge cases: пустые значения, ошибки, транзакции, безопасность или concurrency.

Как вы знаете этот вопрос?

Проверить себя по теме Phoenix (Elixir) →

Источники

  • https://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.html
  • https://hexdocs.pm/phoenix/
←Предыдущий вопросПредставьте, endpoint на Phoenix (Elixir) иногда отвечает за секунды вместо миллисекунд. Как вы будете искать причину?Следующий вопрос→Что такое Phoenix LiveView и какую проблему он решает?

Связанные темы

Phoenix (Elixir)Backend-Engineeringphoenix-ecosystem