Вопросы на собеседовании: Бэкенд-разработчик
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Senior.
Смотреть пример резюме: Бэкенд-разработчик →Вопросы
CAP утверждает, что распределённая система одновременно гарантирует не более двух из трёх свойств: согласованность, доступность и устойчивость к разделению сети.
- Разделение сети неизбежно, поэтому реальный выбор, это согласованность против доступности во время него.
- Биллинговый реестр: PostgreSQL с синхронной репликацией для CP, с кратковременным режимом только для чтения при failover.
- Хранилище предпочтений: Cassandra для AP, так как устаревшие данные допустимы, а недоступность нет.
Зачем это спрашивают: Интервьюер хочет убедиться, что кандидат понимает невозможность отказа от partition tolerance и умеет соотносить абстрактную теорему с конкретным продуктовым решением с реальными компромиссами.
Я начинаю с худшего случая: что будет, если пользователь или бизнес прочитает устаревшие данные.
- Корзина и счётчики ленты переносят устаревание, а остатки на счёте и резервы товаров нет.
- Строгая согласованность стоит латентности и доступности, поэтому по умолчанию я беру eventual consistency.
- Компенсирующие механизмы добавляю только там, где этого требует бизнес-корректность.
- Я документирую решение, чтобы команда не откатилась к строгой согласованности под давлением.
Зачем это спрашивают: От senior-инженеров ожидают рассмотрения согласованности как бизнес-требования, а не технического предпочтения, с умением объяснить ценовую сторону строгих гарантий.
CQRS разделяет модель записи и модель чтения, позволяя оптимизировать каждую независимо.
- Сторона записи обеспечивает бизнес-инварианты на нормализованной доменной модели.
- Сторона чтения материализует денормализованные проекции под конкретные запросы.
- Окупается, когда нагрузки на чтение и запись расходятся, чтения требуют дорогих агрегаций или нужны несколько представлений данных.
- Для простого CRUD-сервиса это чистый оверхед.
Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат аргументировать и за паттерн, и против него, применяя его осознанно, а не по умолчанию.
Event Sourcing сохраняет каждое изменение состояния как неизменяемое событие в append-only логе вместо перезаписи строк.
- Даёт полный аудит-лог и возможность воспроизводить события для восстановления состояния или новых проекций.
- Естественно сочетается с CQRS.
- Сложности: эволюция схемы исторических событий, стратегии снепшотов при росте потоков, мышление событиями вместо текущего состояния.
- Чтение текущего состояния требует проекции, а не простого поиска по строке.
Зачем это спрашивают: Интервьюер проверяет, понимает ли кандидат обе стороны честно и может ли объяснить, почему большинству систем не стоит применять Event Sourcing по умолчанию.
Я заставляю клиента передавать уникальный ключ идемпотентности, обычно UUID, в заголовке запроса.
- Сервер сохраняет ключ вместе с результатом через атомарный upsert.
- Повторный запрос с тем же ключом возвращает исходный ответ без повторного выполнения платежа.
- Ключи истекают через безопасное окно, обычно 24 часа, чтобы ограничить рост хранилища.
- Запись идемпотентности и выполнение платежа идут в одной транзакции базы, поэтому никогда не расходятся.
Зачем это спрашивают: Идемпотентность, критическое требование корректности для финансовых операций. Интервьюер ищет ответ, охватывающий долговечность, атомарность и жизненный цикл ключа, а не просто концепцию.
Я использую Redis с алгоритмом sliding window log или token bucket в виде sorted set или счётчика с TTL.
- Каждый инстанс атомарно выполняет Lua-скрипт, чтобы проверка и уменьшение не разбивались на сетевые вызовы.
- Для очень высокой нагрузки держу локальный in-process счётчик, синхронизируемый с Redis каждые 100 мс.
- Это допускает небольшое превышение лимита, но убирает Redis из горячего пути.
- Я отдаю заголовки rate limit, чтобы клиенты грамотно применяли backoff.
Зачем это спрашивают: Интервьюер оценивает, понимает ли кандидат требования к атомарности и стоимость латентности удалённой координации, а также умеет ли он настраивать этот компромисс.
Я следую паттерну expand-and-contract.
- Добавляю новую колонку как nullable или с дефолтом, затем деплою код, пишущий и в старую, и в новую колонку.
- Заполняю исторические строки небольшими батчами, потом удаляю старую колонку в отдельной миграции, когда все чтения перешли на новую.
- Использую CREATE INDEX CONCURRENTLY в PostgreSQL, чтобы избежать блокировок таблицы.
- Миграции рассматриваю как код: в системе контроля версий, запуск в CI, никогда не вручную в production.
Зачем это спрашивают: Интервьюер хочет убедиться, что кандидат выкатывал изменения схемы на живых базах с реальным трафиком, а не просто описывает учебный подход.
Двухфазный коммит связывает доступность и выстраивает всех в очередь за блокировками во время фазы подготовки.
- Он удерживает блокировки у всех участников, поэтому один медленный сервис становится системным узким местом.
- Ему нужен координатор, который может стать единой точкой отказа.
- Вместо него я использую паттерн Saga: каждый сервис выполняет локальную транзакцию и публикует событие.
- При отказе шага компенсирующие транзакции откатывают предыдущие шаги, исключая связанность и конкуренцию за блокировки.
Зачем это спрашивают: Интервьюер проверяет, может ли кандидат объяснить фундаментальные проблемы доступности и связанности 2PC и имеет ли практический опыт с Saga-альтернативами.
Saga разбивает многошаговую транзакцию на локальные транзакции с компенсирующими действиями.
- Хореография: каждый сервис реагирует на события предыдущего шага, децентрализованно и легко расширяется без изменения существующего кода.
- Оркестрация: центральный координатор вызывает каждый шаг последовательно, проще трассируется, но завязана на оркестратор.
- Хореографию выбираю для простых потоков, где команда ценит автономность сервисов.
- Оркестрацию выбираю для сложного ветвления, повторов или единого источника истины о состоянии транзакции.
Зачем это спрашивают: Интервьюер ищет объяснение компромиссов по отладке и связанности, а не просто название паттернов.
Service mesh вроде Istio или Linkerd внедряет sidecar-прокси в каждый pod для обработки cross-cutting concerns без изменения кода приложения.
- Он даёт mTLS, балансировку, повторы, таймауты, circuit breaking и наблюдаемость единообразно.
- Издержки: каждый прокси добавляет CPU и память на pod.
- Издержки: control plane добавляет операционную сложность, а отладка через два слоя прокси значительно тяжелее.
- Внедряю его только когда у команды есть зрелость для эксплуатации и общая библиотека не покрывает эти задачи.
Зачем это спрашивают: Интервьюер проверяет, рассматривает ли кандидат инфраструктурные решения как компромиссы с реальными издержками, а не как функции для коллекции.
Я начинаю с key-value хранилища, отображающего короткие коды на длинные URL.
- Redis для горячих чтений с долговечным хранилищем вроде DynamoDB.
- Генерирую коды через base62-счётчик из выделенного ID-сервиса или пул предгенерированных кодов, чтобы избежать единой точки отказа.
- CDN обрабатывает редиректы на edge для популярных ссылок, снижая чтения до единичных миллисекунд.
- Ограничиваю путь записи и отправляю аналитику кликов в Kafka асинхронно, не блокируя редирект.
Зачем это спрашивают: Интервьюер наблюдает, начинает ли кандидат с соотношения чтений и записей, определяет, где кеширование даёт наибольший выигрыш, и отделяет аналитику от критического по латентности пути редиректа.
Backpressure сигнализирует продюсерам о перегрузке консюмеров, чтобы очереди не росли безгранично.
- В Kafka я настраиваю max.poll.records и размер батча и слежу за consumer lag как основным сигналом здоровья.
- Когда lag превышает порог, я оповещаю и могу динамически добавить инстансы консюмеров.
- Для внутренних реактивных пайплайнов использую ограниченные очереди.
- Либо отбрасываю сообщения в dead-letter, либо блокирую продюсера, в зависимости от допустимости потери данных.
Зачем это спрашивают: Интервьюер хочет убедиться, что кандидат понимает backpressure как механизм управления потоком и знает как Kafka, так и in-process измерения проблемы.
Вертикальное партиционирование делит таблицу по столбцам, а горизонтальное (шардирование) распределяет строки по узлам.
- Вертикальное переносит редкие или большие колонки в отдельное хранилище, снижая I/O в частых запросах.
- Шардирование распределяет нагрузку и на чтение, и на запись по ключу шарда.
- Вертикальное использую, чтобы хранить blob в объектном хранилище, а метаданные в Postgres.
- Шардирую, когда один узел не тянет запись или объём, выбирая ключ, который равномерно распределяет записи без кросс-шардовых запросов.
Зачем это спрашивают: Интервьюер проверяет, понимает ли кандидат операционную стоимость шардирования и не прибегает к нему преждевременно, прежде чем исчерпаны более простые опции вертикального разделения.
Подход зависит от допустимого устаревания данных.
- Преимущественно статические справочные данные: TTL-инвалидация с достаточно коротким окном.
- Данные, которые должны быть свежими сразу после записи: write-through, обновление кеша и базы вместе.
- Сложная кросс-сущностная инвалидация: публикую событие, и каждый инстанс сбрасывает затронутый ключ.
- Избегаю cache-aside с ручной инвалидацией в масштабе, поскольку это порождает гонки между чтениями и записями.
Зачем это спрашивают: Интервьюер оценивает, понимает ли кандидат, что инвалидация кеша, это проблема согласованности, и умеет ли выбирать правильную стратегию в зависимости от допустимого устаревания.
PostgreSQL даёт ACID, богатые запросы и простые инструменты, но модель single-primary становится узким местом в масштабе.
- Лаг репликации растёт при высоком устойчивом потоке записей.
- Cassandra распределяет записи по всем узлам без единого primary, давая линейную масштабируемость и active-active репликацию.
- Компромиссы Cassandra: нет joins, ограниченные вторичные индексы, таблицы проектируются под доступ заранее.
- Cassandra выбираю, когда записи превышают возможности одного Postgres primary, а паттерны запросов известны и просты.
Зачем это спрашивают: Интервьюер хочет убедиться, что кандидат не рассматривает NoSQL как универсальное решение, а умеет формулировать компромиссы по гибкости запросов и операционной сложности.
MVCC, multi-version concurrency control, создаёт новую версию строки на каждое обновление вместо блокировки строк при чтении.
- ID транзакций определяют, какую версию видит транзакция, поэтому чтения не блокируют запись и наоборот.
- Цена в том, что старые версии строк накапливаются, пока VACUUM их не освободит.
- Если autovacuum не успевает, раздувание таблиц и wraparound transaction ID становятся серьёзными рисками.
- Я мониторю раздувание и мёртвые кортежи и агрессивно настраиваю autovacuum на высокообновляемых таблицах.
Зачем это спрашивают: Интервьюер проверяет, понимает ли кандидат операционные последствия MVCC, а не только выгоды для конкурентности, поскольку проблемы с vacuum уже приводили к реальным инцидентам в production.
Я нахожу медленные запросы через pg_stat_statements и EXPLAIN ANALYZE, прежде чем что-то добавлять.
- Проверяю, не является ли узким местом последовательное сканирование большой таблицы.
- Создаю частичные индексы на отфильтрованных подмножествах и составные индексы в порядке предиката.
- Добавляю covering-индексы с INCLUDE, чтобы избежать heap fetch, и всегда использую CREATE INDEX CONCURRENTLY.
- Ревизирую существующие индексы на дубли и неиспользуемые через pg_stat_user_indexes, ведь каждый замедляет любую запись.
Зачем это спрашивают: Интервьюер проверяет, понимает ли кандидат стоимость write amplification от индексов и использует ли аналитику запросов, а не создаёт индексы спекулятивно.
PostgreSQL порождает процесс на каждое соединение, поэтому тысячи прямых соединений очень дороги по CPU и памяти.
- Pooler вроде PgBouncer держит небольшой пул реальных соединений и мультиплексирует через них запросы приложения.
- В режиме transaction он переиспользует соединение сразу после коммита, обслуживая тысячи соединений приложения десятками реальных.
- Я запускаю PgBouncer как sidecar или отдельный сервис и настраиваю max_client_conn под ожидаемый параллелизм.
- Мониторю время ожидания пула как сигнал его недостаточного размера.
Зачем это спрашивают: Интервьюер хочет знать, понимает ли кандидат модель процессов PostgreSQL и эксплуатировал ли pooler в production, а не просто знает о его существовании.
Read replicas перестают помогать, когда primary насыщается или реплики отдают слишком устаревшие данные.
- Они не спасают, когда запись primary насыщает I/O диска или CPU.
- Они не спасают, когда лаг репликации делает чтения с реплик неприемлемо устаревшими или датасет перерастает один узел.
- Следующие шаги: вертикальное масштабирование, разделение горячих таблиц на выделенные инстансы, кеширующий слой или шардирование по ключу распределения.
- Я исчерпываю вертикальное масштабирование и кеширование до шардирования, которое сильно усложняет запросы и приложение.
Зачем это спрашивают: Интервьюер проверяет, имеет ли кандидат реалистичный путь эскалации и не прыгает ли к шардированию как первому решению.
Я нахожу запрос в 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