Skip to content

Вопросы на собеседовании: Бэкенд-разработчик

100 реальных вопросов с образцовыми ответами и пояснениями для уровня Senior.

Смотреть пример резюме: Бэкенд-разработчик

Тренировка флешкарточками

Интервальное повторение · Hunter Pass

Слушайте собеседование

Включите как подкаст: вопрос и образцовый ответ подряд.

Вопросы

databasecap

CAP утверждает, что распределённая система одновременно гарантирует не более двух из трёх свойств: согласованность, доступность и устойчивость к разделению сети.

  • Разделение сети неизбежно, поэтому реальный выбор, это согласованность против доступности во время него.
  • Биллинговый реестр: PostgreSQL с синхронной репликацией для CP, с кратковременным режимом только для чтения при failover.
  • Хранилище предпочтений: Cassandra для AP, так как устаревшие данные допустимы, а недоступность нет.

Зачем это спрашивают: Интервьюер хочет убедиться, что кандидат понимает невозможность отказа от partition tolerance и умеет соотносить абстрактную теорему с конкретным продуктовым решением с реальными компромиссами.

system-designdistributedconsistency

Я начинаю с худшего случая: что будет, если пользователь или бизнес прочитает устаревшие данные.

  • Корзина и счётчики ленты переносят устаревание, а остатки на счёте и резервы товаров нет.
  • Строгая согласованность стоит латентности и доступности, поэтому по умолчанию я беру eventual consistency.
  • Компенсирующие механизмы добавляю только там, где этого требует бизнес-корректность.
  • Я документирую решение, чтобы команда не откатилась к строгой согласованности под давлением.

Зачем это спрашивают: От senior-инженеров ожидают рассмотрения согласованности как бизнес-требования, а не технического предпочтения, с умением объяснить ценовую сторону строгих гарантий.

cqrsalgorithms

CQRS разделяет модель записи и модель чтения, позволяя оптимизировать каждую независимо.

  • Сторона записи обеспечивает бизнес-инварианты на нормализованной доменной модели.
  • Сторона чтения материализует денормализованные проекции под конкретные запросы.
  • Окупается, когда нагрузки на чтение и запись расходятся, чтения требуют дорогих агрегаций или нужны несколько представлений данных.
  • Для простого CRUD-сервиса это чистый оверхед.

Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат аргументировать и за паттерн, и против него, применяя его осознанно, а не по умолчанию.

event-sourcing

Event Sourcing сохраняет каждое изменение состояния как неизменяемое событие в append-only логе вместо перезаписи строк.

  • Даёт полный аудит-лог и возможность воспроизводить события для восстановления состояния или новых проекций.
  • Естественно сочетается с CQRS.
  • Сложности: эволюция схемы исторических событий, стратегии снепшотов при росте потоков, мышление событиями вместо текущего состояния.
  • Чтение текущего состояния требует проекции, а не простого поиска по строке.

Зачем это спрашивают: Интервьюер проверяет, понимает ли кандидат обе стороны честно и может ли объяснить, почему большинству систем не стоит применять Event Sourcing по умолчанию.

endpointsidempotencydesign

Я заставляю клиента передавать уникальный ключ идемпотентности, обычно UUID, в заголовке запроса.

  • Сервер сохраняет ключ вместе с результатом через атомарный upsert.
  • Повторный запрос с тем же ключом возвращает исходный ответ без повторного выполнения платежа.
  • Ключи истекают через безопасное окно, обычно 24 часа, чтобы ограничить рост хранилища.
  • Запись идемпотентности и выполнение платежа идут в одной транзакции базы, поэтому никогда не расходятся.

Зачем это спрашивают: Идемпотентность, критическое требование корректности для финансовых операций. Интервьюер ищет ответ, охватывающий долговечность, атомарность и жизненный цикл ключа, а не просто концепцию.

distributeddesignrate-limiting

Я использую Redis с алгоритмом sliding window log или token bucket в виде sorted set или счётчика с TTL.

  • Каждый инстанс атомарно выполняет Lua-скрипт, чтобы проверка и уменьшение не разбивались на сетевые вызовы.
  • Для очень высокой нагрузки держу локальный in-process счётчик, синхронизируемый с Redis каждые 100 мс.
  • Это допускает небольшое превышение лимита, но убирает Redis из горячего пути.
  • Я отдаю заголовки rate limit, чтобы клиенты грамотно применяли backoff.

Зачем это спрашивают: Интервьюер оценивает, понимает ли кандидат требования к атомарности и стоимость латентности удалённой координации, а также умеет ли он настраивать этот компромисс.

databaseschemamigrations

Я следую паттерну expand-and-contract.

  • Добавляю новую колонку как nullable или с дефолтом, затем деплою код, пишущий и в старую, и в новую колонку.
  • Заполняю исторические строки небольшими батчами, потом удаляю старую колонку в отдельной миграции, когда все чтения перешли на новую.
  • Использую CREATE INDEX CONCURRENTLY в PostgreSQL, чтобы избежать блокировок таблицы.
  • Миграции рассматриваю как код: в системе контроля версий, запуск в CI, никогда не вручную в production.

Зачем это спрашивают: Интервьюер хочет убедиться, что кандидат выкатывал изменения схемы на живых базах с реальным трафиком, а не просто описывает учебный подход.

microservices

Двухфазный коммит связывает доступность и выстраивает всех в очередь за блокировками во время фазы подготовки.

  • Он удерживает блокировки у всех участников, поэтому один медленный сервис становится системным узким местом.
  • Ему нужен координатор, который может стать единой точкой отказа.
  • Вместо него я использую паттерн Saga: каждый сервис выполняет локальную транзакцию и публикует событие.
  • При отказе шага компенсирующие транзакции откатывают предыдущие шаги, исключая связанность и конкуренцию за блокировки.

Зачем это спрашивают: Интервьюер проверяет, может ли кандидат объяснить фундаментальные проблемы доступности и связанности 2PC и имеет ли практический опыт с Saga-альтернативами.

saga

Saga разбивает многошаговую транзакцию на локальные транзакции с компенсирующими действиями.

  • Хореография: каждый сервис реагирует на события предыдущего шага, децентрализованно и легко расширяется без изменения существующего кода.
  • Оркестрация: центральный координатор вызывает каждый шаг последовательно, проще трассируется, но завязана на оркестратор.
  • Хореографию выбираю для простых потоков, где команда ценит автономность сервисов.
  • Оркестрацию выбираю для сложного ветвления, повторов или единого источника истины о состоянии транзакции.

Зачем это спрашивают: Интервьюер ищет объяснение компромиссов по отладке и связанности, а не просто название паттернов.

designservice-mesh

Service mesh вроде Istio или Linkerd внедряет sidecar-прокси в каждый pod для обработки cross-cutting concerns без изменения кода приложения.

  • Он даёт mTLS, балансировку, повторы, таймауты, circuit breaking и наблюдаемость единообразно.
  • Издержки: каждый прокси добавляет CPU и память на pod.
  • Издержки: control plane добавляет операционную сложность, а отладка через два слоя прокси значительно тяжелее.
  • Внедряю его только когда у команды есть зрелость для эксплуатации и общая библиотека не покрывает эти задачи.

Зачем это спрашивают: Интервьюер проверяет, рассматривает ли кандидат инфраструктурные решения как компромиссы с реальными издержками, а не как функции для коллекции.

design

Я начинаю с key-value хранилища, отображающего короткие коды на длинные URL.

  • Redis для горячих чтений с долговечным хранилищем вроде DynamoDB.
  • Генерирую коды через base62-счётчик из выделенного ID-сервиса или пул предгенерированных кодов, чтобы избежать единой точки отказа.
  • CDN обрабатывает редиректы на edge для популярных ссылок, снижая чтения до единичных миллисекунд.
  • Ограничиваю путь записи и отправляю аналитику кликов в Kafka асинхронно, не блокируя редирект.

Зачем это спрашивают: Интервьюер наблюдает, начинает ли кандидат с соотношения чтений и записей, определяет, где кеширование даёт наибольший выигрыш, и отделяет аналитику от критического по латентности пути редиректа.

soft-skillssystem-designbackpressure

Backpressure сигнализирует продюсерам о перегрузке консюмеров, чтобы очереди не росли безгранично.

  • В Kafka я настраиваю max.poll.records и размер батча и слежу за consumer lag как основным сигналом здоровья.
  • Когда lag превышает порог, я оповещаю и могу динамически добавить инстансы консюмеров.
  • Для внутренних реактивных пайплайнов использую ограниченные очереди.
  • Либо отбрасываю сообщения в dead-letter, либо блокирую продюсера, в зависимости от допустимости потери данных.

Зачем это спрашивают: Интервьюер хочет убедиться, что кандидат понимает backpressure как механизм управления потоком и знает как Kafka, так и in-process измерения проблемы.

shardingpartitioningscaling

Вертикальное партиционирование делит таблицу по столбцам, а горизонтальное (шардирование) распределяет строки по узлам.

  • Вертикальное переносит редкие или большие колонки в отдельное хранилище, снижая I/O в частых запросах.
  • Шардирование распределяет нагрузку и на чтение, и на запись по ключу шарда.
  • Вертикальное использую, чтобы хранить blob в объектном хранилище, а метаданные в Postgres.
  • Шардирую, когда один узел не тянет запись или объём, выбирая ключ, который равномерно распределяет записи без кросс-шардовых запросов.

Зачем это спрашивают: Интервьюер проверяет, понимает ли кандидат операционную стоимость шардирования и не прибегает к нему преждевременно, прежде чем исчерпаны более простые опции вертикального разделения.

system-designdistributeddesign

Подход зависит от допустимого устаревания данных.

  • Преимущественно статические справочные данные: TTL-инвалидация с достаточно коротким окном.
  • Данные, которые должны быть свежими сразу после записи: write-through, обновление кеша и базы вместе.
  • Сложная кросс-сущностная инвалидация: публикую событие, и каждый инстанс сбрасывает затронутый ключ.
  • Избегаю cache-aside с ручной инвалидацией в масштабе, поскольку это порождает гонки между чтениями и записями.

Зачем это спрашивают: Интервьюер оценивает, понимает ли кандидат, что инвалидация кеша, это проблема согласованности, и умеет ли выбирать правильную стратегию в зависимости от допустимого устаревания.

postgres

PostgreSQL даёт ACID, богатые запросы и простые инструменты, но модель single-primary становится узким местом в масштабе.

  • Лаг репликации растёт при высоком устойчивом потоке записей.
  • Cassandra распределяет записи по всем узлам без единого primary, давая линейную масштабируемость и active-active репликацию.
  • Компромиссы Cassandra: нет joins, ограниченные вторичные индексы, таблицы проектируются под доступ заранее.
  • Cassandra выбираю, когда записи превышают возможности одного Postgres primary, а паттерны запросов известны и просты.

Зачем это спрашивают: Интервьюер хочет убедиться, что кандидат не рассматривает NoSQL как универсальное решение, а умеет формулировать компромиссы по гибкости запросов и операционной сложности.

transactionspostgres

MVCC, multi-version concurrency control, создаёт новую версию строки на каждое обновление вместо блокировки строк при чтении.

  • ID транзакций определяют, какую версию видит транзакция, поэтому чтения не блокируют запись и наоборот.
  • Цена в том, что старые версии строк накапливаются, пока VACUUM их не освободит.
  • Если autovacuum не успевает, раздувание таблиц и wraparound transaction ID становятся серьёзными рисками.
  • Я мониторю раздувание и мёртвые кортежи и агрессивно настраиваю autovacuum на высокообновляемых таблицах.

Зачем это спрашивают: Интервьюер проверяет, понимает ли кандидат операционные последствия MVCC, а не только выгоды для конкурентности, поскольку проблемы с vacuum уже приводили к реальным инцидентам в production.

indexespostgresperformance

Я нахожу медленные запросы через pg_stat_statements и EXPLAIN ANALYZE, прежде чем что-то добавлять.

  • Проверяю, не является ли узким местом последовательное сканирование большой таблицы.
  • Создаю частичные индексы на отфильтрованных подмножествах и составные индексы в порядке предиката.
  • Добавляю covering-индексы с INCLUDE, чтобы избежать heap fetch, и всегда использую CREATE INDEX CONCURRENTLY.
  • Ревизирую существующие индексы на дубли и неиспользуемые через pg_stat_user_indexes, ведь каждый замедляет любую запись.

Зачем это спрашивают: Интервьюер проверяет, понимает ли кандидат стоимость write amplification от индексов и использует ли аналитику запросов, а не создаёт индексы спекулятивно.

pooling

PostgreSQL порождает процесс на каждое соединение, поэтому тысячи прямых соединений очень дороги по CPU и памяти.

  • Pooler вроде PgBouncer держит небольшой пул реальных соединений и мультиплексирует через них запросы приложения.
  • В режиме transaction он переиспользует соединение сразу после коммита, обслуживая тысячи соединений приложения десятками реальных.
  • Я запускаю PgBouncer как sidecar или отдельный сервис и настраиваю max_client_conn под ожидаемый параллелизм.
  • Мониторю время ожидания пула как сигнал его недостаточного размера.

Зачем это спрашивают: Интервьюер хочет знать, понимает ли кандидат модель процессов PostgreSQL и эксплуатировал ли pooler в production, а не просто знает о его существовании.

replicationscaling

Read replicas перестают помогать, когда primary насыщается или реплики отдают слишком устаревшие данные.

  • Они не спасают, когда запись primary насыщает I/O диска или CPU.
  • Они не спасают, когда лаг репликации делает чтения с реплик неприемлемо устаревшими или датасет перерастает один узел.
  • Следующие шаги: вертикальное масштабирование, разделение горячих таблиц на выделенные инстансы, кеширующий слой или шардирование по ключу распределения.
  • Я исчерпываю вертикальное масштабирование и кеширование до шардирования, которое сильно усложняет запросы и приложение.

Зачем это спрашивают: Интервьюер проверяет, имеет ли кандидат реалистичный путь эскалации и не прыгает ли к шардированию как первому решению.

queriespostgres

Я нахожу запрос в pg_stat_statements, отсортированном по total_time или mean_exec_time.

  • Запускаю EXPLAIN (ANALYZE, BUFFERS) на read replica или с коротким statement_timeout, чтобы избежать длинных блокировок.
  • Ищу последовательные сканы, nested loop с высокими оценками строк или высокие buffer hits, говорящие о давлении на память.
  • Типичные исправления: целевой индекс, переписывание коррелированного подзапроса в join или ANALYZE для обновления устаревшей статистики.
  • Любое создание индекса или перезапись сначала обкатываю в non-production окружении.

Зачем это спрашивают: Интервьюер оценивает, следует ли кандидат методичному процессу диагностики и избегает ли изменений, которые могут ухудшить production-производительность в ходе расследования.

Закрытые вопросы

  • 21

    Как вы определяете, где находится узкое место в цепочке вызовов микросервисов?

    microservicesperformance
  • 22

    Какими инструментами профилирования вы пользовались для Go или Java сервисов и опишите реальный сеанс профилирования.

    profiling
  • 23

    Как вы измеряете и снижаете хвостовую латентность (P99 и P999) в production API?

    latencyapi
  • 24

    Что такое thundering herd в кеширующем слое и как вы его предотвращаете?

    caching
  • 25

    Как вы подходите к планированию ёмкости для сервиса, которому нужно выдержать 10-кратный рост трафика?

    capacity
  • 26

    Объясните паттерн circuit breaker и как вы настраиваете его пороги для конкретной интеграции с сервисом.

    resilience
  • 27

    Как вы снижаете давление garbage collection в JVM-сервисе при высокой устойчивой нагрузке?

    throughputgc
  • 28

    Как вы проектируете систему пакетной обработки, обрабатывающую 500 миллионов записей за прогон без таймаутов и перегрузки базы данных?

    system-designdesignbatch
  • 29

    В чём разница между async I/O и многопоточностью для производительности бэкенда и когда вы предпочитаете каждый подход?

    asyncconcurrencyperformance
  • 30

    Как вы обрабатываете долгоживущие фоновые задания, чтобы они не ухудшали латентность API-эндпоинтов?

    endpointslatencysoft-skills
  • 31

    Как вы предотвращаете гонки состояний в Go сервисе, использующем goroutines для обработки конкурентных запросов?

    concurrency
  • 32

    Опишите реализацию распределённой блокировки с помощью Redis. Каковы режимы отказа?

    redisdistributed
  • 33

    Что такое дедлок в реляционной базе данных, как его обнаружить и как предотвратить в коде приложения?

    databaselocking
  • 34

    Как вы эффективно тестируете конкурентный код для обнаружения гонок состояний до production?

    concurrency
  • 35

    Что такое модель consumer group в Kafka и как вы настраиваете количество партиций для пропускной способности?

    partitioningkafkathroughput
  • 36

    Как вы проектируете схему сообщений в Kafka для поддержки обратно совместимой эволюции между версиями продюсеров и консюмеров?

    kafkadesignschema
  • 37

    Объясните exactly-once семантику в Kafka и когда она действительно нужна в сравнении с at-least-once доставкой.

    kafka
  • 38

    Как вы обрабатываете «ядовитые» сообщения в Kafka consumer пайплайне?

    soft-skillskafka
  • 39

    Что такое паттерн outbox и как он надёжно связывает запись в базу данных с публикацией сообщений?

    database
  • 40

    Как вы проектируете REST API, который может эволюционировать со временем без поломки существующих клиентов?

    restdesign
  • 41

    Когда вы выбираете gRPC вместо REST и каковы компромиссы?

    restgrpc
  • 42

    Как вы реализуете аутентификацию и авторизацию в микросервисной архитектуре?

    authmicroservicesarchitecture
  • 43

    Что делает API gateway и какие задачи принадлежат ему, а какие, отдельным сервисам?

    gatewayapi
  • 44

    Что такое проблема N+1 в GraphQL и как вы решаете её с помощью паттерна DataLoader?

    n+1graphql
  • 45

    Как вы реализуете cursor-based пагинацию для большого датасета и почему она лучше offset-based пагинации в масштабе?

    pagination
  • 46

    Как вы надёжно реализуете доставку вебхуков с логикой повторов и обработкой сбоев?

    resiliencewebhooks
  • 47

    Как вы настраиваете распределённую трассировку сквозь всю микросервисную систему?

    microservicessystem-designdistributed
  • 48

    Какие метрики вы инструментируете в бэкенд-сервисе и какова ваша философия оповещений?

    monitoring
  • 49

    Опишите реальный production инцидент, который вы расследовали, и как вы нашли корневую причину.

    incidents
  • 50

    Как вы определяете и используете SLO и бюджеты ошибок для бэкенд-сервиса?

    reliability
  • 51

    Как вы реализуете структурированное логирование в бэкенд-сервисе и какие поля обязательны в каждой записи?

    logging
  • 52

    Как вы подходите к blue-green деплойменту и canary релизам для stateful сервиса с базой данных?

    databasedeployment
  • 53

    Что такое chaos engineering и как бы вы внедрили его на команде, которая этим не занималась?

    resilience
  • 54

    Как вы обеспечиваете failover базы данных в high-availability PostgreSQL конфигурации?

    databasepostgressoft-skills
  • 55

    Опишите ваш подход к проектированию дежурной ротации и снижению alert fatigue.

    design
  • 56

    Как вы структурируете Kubernetes деплоймент для stateless бэкенд-сервиса и какие ошибки наиболее критичны?

    kubernetesdeployment
  • 57

    В чём разница между liveness и readiness probes в Kubernetes и как вы их настраиваете?

    kuberneteshealth-checks
  • 58

    Как вы управляете секретами в production окружении и опишите полную ротацию секрета.

    secrets
  • 59

    Как вы пишете значимый интеграционный тест для сервиса, зависящего от базы данных и очереди сообщений?

    databasequeuesintegration
  • 60

    Что такое contract testing и как вы используете его для предотвращения breaking changes между сервисами?

    contract
  • 61

    Как вы управляете Terraform state для команды инженеров без конфликтов?

    terraform
  • 62

    Каков ваш подход к feature flags в бэкенд-системе и как вы управляете их жизненным циклом?

    system-designfeature-flags
  • 63

    Как вы предотвращаете SQL инъекции и какие другие уязвимости OWASP Top 10 наиболее критичны для бэкенд-разработчиков?

    owaspinjectionvulnerabilities
  • 64

    Объясните риски безопасности JWT-аутентификации и как вы их снижаете.

    authjwt
  • 65

    Что такое RBAC vs ABAC и когда вы используете один вместо другого для multi-tenant SaaS?

    rbacmulti-tenancy
  • 66

    Как вы реализуете mTLS между микросервисами и когда это необходимо?

    mtlsmicroservices
  • 67

    Как вы проводите техническое ревью дизайна с junior инженером? Опишите процесс.

    designconcurrency
  • 68

    Как вы декомпозируете монолит в микросервисы? Как вы решаете, что выделить первым?

    microservicesmonolith
  • 69

    Как вы оцениваете, создавать или покупать компонент? Опишите реальное решение.

    decision-makingcomponents
  • 70

    Как вы доносите существенный технический риск до нетехнического стейкхолдера?

    communication
  • 71

    Как вы организуете процесс Architecture Decision Records в команде?

    concurrency
  • 72

    Расскажите о случае, когда вы не соглашались с техническим решением lead или архитектора. Чем всё закончилось?

    storyconflict
  • 73

    Как вы онбордите нового инженера на сложный сервис, который он никогда не видел?

    onboarding
  • 74

    Опишите значительную ошибку, которую вы совершили в production. Что произошло и что вы изменили после?

    ownership
  • 75

    Как вы работаете с техническим долгом в команде, всегда выпускающей новые фичи?

    soft-skillstech-debt
  • 76

    Как вы подходите к моделированию данных для ограниченных контекстов Domain-Driven Design?

    design
  • 77

    В чём разница между синхронной и асинхронной коммуникацией между сервисами и когда вы выбираете каждую?

    async
  • 78

    Как вы реализуете распределённый rate limiting для multi-region деплоймента?

    distributedrate-limitingdeployment
  • 79

    Как бы вы мигрировали критическую таблицу с 500 миллионами строк на новую схему с нулевым простоем?

    schema
  • 80

    Как вы безопасно обрабатываете PII в бэкенд-системе и что вы аудируете?

    system-design
  • 81

    Опишите систему, которую вы проектировали с нуля и которая сейчас работает в production. Что бы вы сделали иначе сегодня?

    system-designdesign
  • 82

    Как вы оцениваете и принимаете новый язык программирования или фреймворк для production сервиса?

    decision-making
  • 83

    Как вы декомпозируете большой технический проект для команды из пяти инженеров?

    planning
  • 84

    Как вы поступаете в ситуации, когда product management оспаривает вашу оценку сроков?

    soft-skillsestimation
  • 85

    Как должна выглядеть хорошая документация для бэкенд-сервиса и кто за неё отвечает?

    documentation
  • 86

    Как вы проводите нагрузочное тестирование бэкенд-сервиса и интерпретируете результаты?

    load-testing
  • 87

    Как вы проектируете и версионируете внутренний SDK или разделяемую библиотеку, потребляемую несколькими командами?

    design
  • 88

    Как вы подходите к наблюдаемости нового сервиса с первого дня?

    observability
  • 89

    Какова ваша стратегия обновления зависимостей в большой кодовой базе бэкенда?

    dependencies
  • 90

    Как вы менторите middle инженера, стремящегося к senior уровню?

    mentoring
  • 91

    Как вы следите за трендами в бэкенд-технологиях, не теряя продуктивности?

    learning
  • 92

    Опишите вашу личную философию владения сервисом и как вы реализуете её на практике.

    ownership
  • 93

    Как вы проектируете API для публичной платформы разработчиков, которую будут интегрировать сотни команд?

    designapi
  • 94

    Как вы подходите к стратегии тестирования для сервиса с синхронными API эндпоинтами и асинхронными event consumers?

    endpointsasynctesting
  • 95

    Что такое оптимистичный контроль параллелизма и когда вы используете его вместо блокировки строк базы данных?

    databaselockingconcurrency
  • 96

    Как вы проектируете multi-tenant бэкенд-систему и каковы ключевые компромиссы изоляции?

    system-designdesignmulti-tenancy
  • 97

    Как вы управляете операционной сложностью при эксплуатации множества микросервисов в production?

    microservicesalgorithms
  • 98

    Как вы реализуете надёжную очередь заданий для отложенного выполнения задач?

    jobs
  • 99

    Опишите, как бы вы построили real-time лидерборд, обновляющийся для 1 миллиона активных пользователей.

  • 100

    Что для вас означает engineering excellence и как вы строите культуру этого в команде?

    culture