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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python8 801
  • Облачные технологии6 644
  • QA вакансии2 164
  • Android1 318
  • Инженер данных868
  • Продакт-менеджер314

Разработка

  • iOS1 230
  • Backend вакансии1 212
  • AI вакансии548
  • Fullstack вакансии499
  • Frontend вакансии423
  • Mobile вакансии28

По стеку

  • Go5 235
  • Java3 133
  • Kotlin1 120
  • Node.js1 004
  • Rust852
  • .NET659
  • PHP319
  • C++268
  • C#207

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

  • Kubernetes3 909
  • Linux-инфраструктура2 843
  • DevOps вакансии2 677
  • Terraform / IaC2 175
  • Мониторинг и Observability1 072
  • CI/CD915
  • SRE305
  • Кибербезопасность33

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

  • Аналитик данных532
  • Data Scientist435
  • Бизнес-аналитик400
  • Системный аналитик68

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

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

По регионам

  • Вакансии в США25 825
  • Вакансии в Европе10 301
  • Работа в России3 618
  • Вакансии в Канаде2 268

По формату

  • Удалённые вакансии42 661
  • Релокация в США25 825
  • Гибридная работа5 655
  • Офисная работа4 428

По уровню

  • Senior вакансии22 630
  • Middle вакансии11 534
  • Junior вакансии3 862

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

Все компании
  • Rakuten189 вакансий
  • Wise187 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis47 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

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

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

Что такое оператор pipe (|>) и как он улучшает читаемость кода?

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

Оператор |> передаёт результат левого выражения первым аргументом в правую функцию, позволяя писать цепочки преобразований линейно сверху вниз вместо глубокой вложенности вызовов. Для сложных блоков внутри цепочки используются then/1 и tap/1.

Базовый синтаксис

# Без pipe — читается изнутри наружу
result = Enum.join(Enum.map(String.split("hello world", " "), &String.upcase/1), ", ")

# С pipe — читается сверху вниз
result =
  "hello world"
  |> String.split(" ")         # ["hello", "world"]
  |> Enum.map(&String.upcase/1) # ["HELLO", "WORLD"]
  |> Enum.join(", ")           # "HELLO, WORLD"

Оператор pipe |> в Elixir

Оператор |> (pipe) передаёт результат выражения слева в качестве первого аргумента функции справа. Это позволяет выстраивать цепочки преобразований данных линейно — сверху вниз, без глубокой вложенности вызовов.

Как работает pipe

Pipe — это синтаксический сахар, трансформируемый компилятором:

x |> f()         # => f(x)
x |> f(a, b)     # => f(x, a, b)
x |> f(a) |> g() # => g(f(x, a))

Практический пример: обработка HTTP-параметров

defmodule JobFilter do
  def apply(params) do
    params
    |> Map.get("skills", "")
    |> String.split(",")
    |> Enum.map(&String.trim/1)
    |> Enum.reject(&(&1 == ""))
    |> Enum.map(&String.downcase/1)
    |> Enum.uniq()
  end
end

JobFilter.apply(%{"skills" => " Elixir , Python , elixir "})
# => ["elixir", "python"]

Pipe с анонимными функциями

Анонимную функцию нельзя передать в pipe напрямую без скобок — нужно обернуть в именованную или использовать (&...)/1:

# Ошибка
# [1,2,3] |> fn x -> x * 2 end.()

# Правильно: именованная функция через &
[1, 2, 3]
|> Enum.map(&(&1 * 2))
|> Enum.sum()
# => 12

# Правильно: через then/1 для произвольных трансформаций
"alice@example.com"
|> String.split("@")
|> then(fn [user, domain] -> %{user: user, domain: domain} end)

then/1 и tap/1

  • then(value, fun) — передаёт значение в функцию и возвращает результат (для сложных блоков в цепочке).
  • tap(value, fun) — вызывает функцию ради побочного эффекта (логирование, отладка), но возвращает оригинальное значение без изменений.
"raw_data"
|> process()
|> tap(&Logger.debug("after process: #{inspect(&1)}"))
|> save()

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

  • Pipe передаёт только первый аргумент — если API функции принимает основные данные вторым аргументом, pipe не подойдёт без обёртки; например, String.contains?(needle, haystack) — типичная «перевёрнутая» сигнатура в сторонних библиотеках.
  • Анонимные функции требуют явного вызова — value |> my_fun.() с точкой перед скобками, иначе ошибка компиляции.
  • Длинные цепочки скрывают тип промежуточных значений — если функция в середине цепочки вернёт {:error, reason} вместо ожидаемого значения, следующий шаг упадёт с непонятной ошибкой; используйте with для монадических цепочек с ошибками.
  • Отладка цепочки — вставьте |> tap(&IO.inspect(&1, label: "step 3")) вместо разрыва цепочки; удалите перед коммитом.
  • then vs обычная функция — избыточное использование then для простых случаев ухудшает читаемость; предпочтительно выносить сложную логику в именованные функции.

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

  • В чём разница между spawn, Task и GenServer для выполнения конкурентного кода?
  • Что такое pattern matching в Elixir и как он используется в ветвях функций (function clauses)?
  • В чём разница между модулем и структурой (struct) в Elixir?
  • Что такое иммутабельность в Elixir и почему она важна для параллелизма?

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

  • Сводить pipe operator к названию метода без lifecycle и failure path.
  • Игнорировать модель runtime: Elixir компилируется в BEAM bytecode и наследует процессы, message passing, supervision и hot-code friendly модель Erlang VM.
  • Не отделять validation, authorization, transaction boundary и business logic.

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

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

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

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

Источники

  • https://hexdocs.pm/elixir/Kernel.html
  • https://hexdocs.pm/elixir/
←Предыдущий вопросКак работают процессы Elixir и как они взаимодействуют?Следующий вопрос→Что такое OTP и что такое OTP behaviors в Elixir?

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

ElixirBackend-Engineeringelixir-ecosystem