Эйч
Эйч
  • Эйч Плюс
  • Все менторы
Гайды/C#-разработчик/Собес в Ozon · Руководитель группы разработки C#

Собес в Ozon · Руководитель группы разработки C#

Материал Эйч · Опубликовано 27 октября 2026

Обзор

Техлид в домене «Управление контрагентами»: микросервисы, highload, команда и архитектура договорной автоматизации

C# и .NET (память, многопоточность, DI)
PostgreSQL и оптимизация SQL
Распределённые системы (Kafka, Redis, консистентность)
Архитектура (CQRS, Event Sourcing, DDD, SOLID)
Code review и инженерная культура
Управление командой и работа с бизнесом

Фишка: Акцент на собственные highload-решения, Everything as Code, стек с Kafka, ClickHouse, Event Sourcing и CQRS — часто спрашивают про консистентность и деградацию инфраструктуры, а не только про синтаксис C#.

ЭтапДлительностьЧто проверяют
Скрининг / HR30–45 минМотивация, опыт лидерства, формат работы, ожидания по роли и домену
Техническое интервью60–90 минC#, async/await, коллекции, ООП; PostgreSQL; разбор кода и SQL-задачи
Системное / архитектурное60–90 минHighload, брокеры, кэш, идемпотентность, outbox, инциденты в K8s
Лидерство / финал45–60 минУправление командой, декомпозиция, code review, коммуникация с бизнесом, культура Ozon Tech

Стек и темы

Обязательный минимум

  • .NET Core / C#, memory management, performance
  • PostgreSQL: индексы, планы запросов, MVCC, VACUUM
  • Микросервисы, горизонтальное масштабирование, отказоустойчивость
  • Apache Kafka (или аналоги): паттерны доставки и согласованность с БД
  • Redis как кэш; диагностика деградации
  • SOLID, DDD, CQRS, Event Sourcing на уровне применения
  • Управление командой, code review, оценка и декомпозиция задач
  • Интеграционные тесты

Плюсом будет

  • MS SQL, ClickHouse
  • Kubernetes и поведение сервисов при падении пода
  • GitLab CI, Jira/Confluence как часть процесса
  • Прямая работа с бизнес-стейкхолдерами

C#: ООП и полиморфизм

Зачем нужны перегрузка, переопределение и перекрытие методов; в чём различие механизмов вызова?

Overload — compile-time по сигнатуре; override — virtual/override, runtime по типу объекта; new — скрытие, вызов по типу ссылки.

Что делают операторы is и as, чем они отличаются и где применяются?

is — проверка типа/pattern matching; as — безопасное приведение с null при неудаче; is не бросает исключение.

Опиши коллекции: array, list, hashset, dictionary — целевое назначение и отличия.

Array/List — индексный доступ; HashSet — уникальность O(1) contains; Dictionary — пары ключ-значение, порядок не гарантирован у HashSet/Dictionary.

Ловушка: Путать перекрытие (new) с переопределением (override) — на собесе часто просят нарисовать, какой метод вызовется.

C#: память и производительность

Как работать с массивом из 100 000 элементов с точки зрения управления памятью?

Избегать лишних копий; Span/Memory; пулы массивов; struct vs class; LOH для больших объектов; рассмотреть ArrayPool<T>.

Совет: Для лида важно связать ответ с профилированием (dotMemory, PerfView) и реальными узкими местами в сервисах.

Многопоточность и async

Что такое lock, как сделать инкремент атомарным, почему lock нельзя сочетать с await, чем SemaphoreSlim отличается от Semaphore и что будет при использовании value type как объекта синхронизации?

Interlocked для счётчика; lock + await — риск deadlock; SemaphoreSlim легче и для async; struct как lock — boxing/отдельные объекты, синхронизация не работает.

Приведите практический кейс использования SemaphoreSlim.

Ограничение параллелизма к внешнему API/БД; throttling; async-friendly wait/release.

Ловушка: Task.Result и .Wait() в async-коде — классическая тема на разборе BookTour.

DI в .NET

Какие времена жизни сервисов существуют в стандартном DI-контейнере .NET и в чём их различие?

Singleton — один на приложение; Scoped — на scope (запрос); Transient — новый при каждом resolve. Опасность captive dependency.

Фишка: В микросервисах scoped обычно совпадает с HTTP-request; в фоновых воркерах scope создают вручную.

PostgreSQL

Какие индексы PostgreSQL вы знаете; чем B-tree отличается от hash, что такое кластерный и некластерный индекс и есть ли кластерный индекс в PostgreSQL?

B-tree — универсальный; hash — только =; в PG нет классического clustered как в SQL Server; CLUSTER перестраивает физический порядок таблицы.

Что такое VACUUM в PostgreSQL и какую проблему решает MVCC?

MVCC оставляет dead tuples; VACUUM очищает; autovacuum; bloat; visibility map.

Расскажи про опыт оптимизации сложных SQL-запросов и работы с планом выполнения. Был ли кейс ускорения в 2–3 раза?

EXPLAIN (ANALYZE, BUFFERS); индексы под WHERE/JOIN; переписывание подзапросов; статистика; избегать select *.

Совет: Готовь один конкретный кейс с цифрами до/после и какие индексы добавили.

Распределённые системы и интеграции

Есть задача: атомарно записать событие в брокер (Kafka/RabbitMQ) и в базу данных. Как обеспечить транзакционность?

Transactional Outbox + relay; inbox; saga; 2PC обычно не вариант; идемпотентные consumers.

Как решить проблему деградации кэша (Redis отвечает за 1 секунду, БД за 10 мс)?

Метрики latency; circuit breaker; fallback на БД с лимитом; шардирование Redis; hot keys; сеть и persistence.

Если под в Kubernetes упал после успешного бронирования отеля, но до сохранения ID брони — как восстановить консистентность?

Идемпотентные ключи; saga/compensation; outbox; reconciliation job; не полагаться только на in-memory state.

Фишка: Домен контрагентов — длинные бизнес-процессы и согласования; консистентность и компенсации близки к реальным инцидентам.

Задачи

Code review: BookTour

Дан метод бронирования тура с параллельным вызовом авиа и отеля через Task.WhenAll, catch с отменой, finally с RunSynchronously и инкрементом счётчика. Найди проблемы: enum из строк, .Result, компенсации при ошибках, инициализация полей в finally, потокобезопасность счётчика.

TryParse для enum; await вместо Result; AggregateException в WhenAll; корректные ID для cancel; не сохранять в finally после ошибки; Interlocked.Increment; вынести GetUser; рассмотреть TransactionScope/outbox для согласованности.

Сложность: O(1) на вызов; риск в блокировках и гонках

SQL: первый альбом артиста

Таблицы Artists и Albums. Вернуть имя артиста, название и дату самого раннего альбома для каждого артиста.

Вариант с подзапросом MIN(release_date) по artist_id или CTE: group by artist_id, min(release_date), join обратно к Albums по дате и id. Внимание к именам колонок artistId vs artist_id в схеме.

Сложность: O(n log n) при сортировке; с индексом (artist_id, release_date) — эффективный lookup

System Design

  • Спроектируй сервис согласования договоров с селлерами: статусы, подписи, аудит, интеграция с внешними системами
  • Как масштабировать чтение справочника контрагентов при пиках (черная пятница)
  • Поток событий изменения договора: Event Sourcing vs классическая CRUD-модель
  • Обеспечить exactly-once эффект при публикации события в Kafka после коммита в PostgreSQL

Каркас ответа

  1. Уточнить SLA, объёмы, read/write ratio, требования к консистентности
  2. Выделить bounded context (DDD) и границы сервисов
  3. Схема данных, индексы, кэш, очереди
  4. Отказоустойчивость: retry, idempotency, dead letter, мониторинг
  5. План миграции и риски (dual write, outbox)

Поведенческое

  • Как ты относишься к перспективе общения с бизнесом напрямую?
  • Опиши, как управляешь кросс-функциональной командой и проводишь code review
  • Как реагировал на production-инцидент в highload-сервисе
  • Как декомпозируешь крупную фичу в Jira и оцениваешь сроки
  • Конфликт приоритетов между бизнесом и техдолгом — как решал
  • Каким ты видишь себя через пять лет? (в контексте роста как техлида в продуктовой компании)

План подготовки

3 дня

  • Повторить lock/async, SemaphoreSlim, DI lifetimes
  • Пройти разбор BookTour вслух
  • Написать SQL первого альбома двумя способами
  • Один кейс оптимизации SQL с EXPLAIN

7 дней

  • Outbox, saga, идемпотентность — схемы на доске
  • PostgreSQL: индексы, VACUUM, MVCC — конспект
  • Подготовить 2 STAR-истории: инцидент и лидерство/ревью
  • Прочитать описание домена контрагентов в вакансии и набросать архитектуру

14 дней

  • Системный дизайн: договорный workflow + Kafka
  • ClickHouse/аналитика — зачем в стеке Ozon (highload отчёты)
  • Мок-интервью с таймером 90 мин на техблок
  • Список вопросов к команде про on-call и Event Sourcing в проде
БлокГотов, если...
C# concurrencyможешь объяснить, почему lock+await опасен, и предложить SemaphoreSlim для throttling
PostgreSQLможешь объяснить VACUUM и выбрать индекс под запрос с JOIN
Распределённостьможешь нарисовать Outbox Pattern от HTTP до Kafka
Лидерствоесть два STAR-кейса: команда + инцидент/бизнес

В день собеседования

  • Повторить шпаргалки по topic_blocks
  • Проверить стабильный интернет и тихое место для системного этапа
  • Иметь под рукой IDE или блокнот для SQL и псевдокода

Профессия

C#-разработчик

Темы

C# и .NET (память, многопоточность, DI)
PostgreSQL и оптимизация SQL
Распределённые системы (Kafka, Redis, консистентность)
Архитектура (CQRS, Event Sourcing, DDD, SOLID)
Code review и инженерная культура
Управление командой и работа с бизнесом

Компания

OzonOzon

Сопроводим до оффера

Умножим шансы на каждом этапе поиска и поможем получить выгодный оффер

Узнать больше

🍪 Мы используем cookie и Яндекс Метрику, чтобы сайт работал и становился лучше. Подробнее в политике.

Сервис развития карьеры

Контактыteam@h.careers@hcareers
TelegramVKYouTubeLinkedIn
Сервисы
AI поиск работы newПоиск вакансий newПоиск компаний newКонструктор резюме newВопросы с собеседований newЗадачи с собеседований newГайды к собеседованиям newПроверятор резюме newГенератор сопроводительных new
Поиски себя
Войти в ITКарьерная стратегияПовысить доходПрофориентация
Работа в России
Сопровождение до оффера Найти работу в РоссииРевью портфолиоРевью резюмеТестовое собеседование
Работа за рубежом
Найти работу за границейПомощь в оформлении LinkedInРевью резюме на английскомТестовое собеседование на английском
Навыки
Личный брендОценка навыковРазвитие навыков и компетенций
Поддержка
ВыгораниеОтношения с коллективомОтношения с руководителемСиндром самозванцаСложное увольнение
Для бизнеса
Аудит процессов компанииВыступление на внутреннем мероприятии компанииКонсалтинг бизнеса
Профессии
HRАдминистрированиеАналитикаДизайнИнформационная безопасностьИскусственный интеллектИсследованияКонсалтингКонтентМаркетингМенеджментНаука и образованиеОфисПоддержкаПредпринимательство
Компания
С чем помогаемОтзывы Вопросы и ответыСертификатыВебинарыСтать ментором

Услуги оказывает ООО «Эйч Карьера»
ИНН 9710095807 ОГРН 1227700077340
Адрес: 127006, г. Москва, Старопименовский пер., д. 18, стр. 2, помещ./ком./этаж I/19/2
Платформа принадлежит ООО «Эйч Карьера»

Copyright © 2020-2025 Сервис развития карьеры Эйч. Все права защищены.

Политика конфиденциальностиПользовательское соглашениеОферта