Сводные вопросы на собеседование
Это не шпаргалка и не конспект. Это карта повторения: 18 тем, которые покрывают весь путь учебника — от Event Loop до инцидент-менеджмента. Под каждой темой — пять-семь вопросов, которые реально задают на собеседованиях middle/senior. Ответов здесь нет специально: если на вопрос можешь ответить вслух, с примером из практики и парой «подводных камней» — тема закрыта. Если не можешь — иди по ссылке на главу и повторяй именно её, а не весь раздел.
Фундамент: Git, JavaScript, TypeScript
Заголовок раздела «Фундамент: Git, JavaScript, TypeScript»Git: слияния, rebase и ветвление
Заголовок раздела «Git: слияния, rebase и ветвление»Глава: /00-git/merge-rebase/ · см. также /00-git/internals/
- В чём принципиальная разница между
mergeиrebaseи когда какой выбирать? - Что делает
git rebase -iи какие команды редактирования истории ты используешь чаще всего? - Как разруливать конфликт при rebase, если он повторяется на каждом коммите ветки?
- Как
reflogспасает после «испорченного» rebase? Когда reflog уже не поможет? - Почему нельзя rebase’ить опубликованные ветки? Что ломается у других разработчиков?
- Чем
fast-forwardотличается от--no-ffи как это влияет на историю проекта?
Event Loop и асинхронность JavaScript
Заголовок раздела «Event Loop и асинхронность JavaScript»Главы: /01-js-core/event-loop-browser/ · /01-js-core/promise-in-depth/
- Порядок очередей: microtasks vs macrotasks. В каком порядке выполнятся
setTimeout(fn, 0),Promise.resolve().then(fn)иqueueMicrotask(fn)? - Что такое unhandled rejection и почему он возникает, если промис обрабатывается «позже»?
- В чём разница
Promise.all,allSettled,race,any? Где каждый нужен в проде? - Почему await в цикле последовательный и как распараллелить запросы, не раздувая код?
- Что такое AbortController и как прерывать устаревшие запросы?
- Чем Event Loop в браузере отличается от Node.js (phases в libuv)?
TypeScript: дженерики и продвинутые типы
Заголовок раздела «TypeScript: дженерики и продвинутые типы»Главы: /02-typescript/generics/ · /02-typescript/advanced-types/
- Зачем нужны дженерики, если можно писать
any? Что теряется сany? - Чем
unknownотличается отanyи почемуunknown— правильный тип для внешних данных? - Что делают
Partial,Pick,Omit,Record? Приведи рабочий пример из API-клиента. - Что такое type narrowing и как
typeof,in, discriminated unions помогают компилятору? - Чем
interfaceотличается отtypeна практике — когда что выбрать? - Что такое
satisfiesи branded types и какую проблему они решают?
Фронтенд: React и Next.js
Заголовок раздела «Фронтенд: React и Next.js»React: рендеринг, хуки, состояние
Заголовок раздела «React: рендеринг, хуки, состояние»Главы: /05-react/rendering/ · /05-react/advanced-hooks/
- Что триггерит рендер компонента? Почему лишние рендеры — не всегда проблема?
- Правила хуков: почему нельзя вызывать хуки в условиях и циклах?
useEffectvsuseLayoutEffect: когда какой и что такое этап commit?- Как работает
useMemo/useCallbackи когда их применение — преждевременная оптимизация? - Чем управляемое состояние отличается от URL/серверного состояния? Где держать каждое?
- Как избежать race condition при асинхронной загрузке данных в эффекте?
Next.js: App Router и стратегии рендеринга
Заголовок раздела «Next.js: App Router и стратегии рендеринга»Главы: /06-nextjs/app-router/ · /06-nextjs/rendering-strategies/ · /06-nextjs/server-components/
- Чем Server Components отличаются от Client Components? Где граница и кто решает?
- Когда выполняется рендеринг: static, dynamic, ISR, streaming? Что выбираешь для каталога товаров?
- Что такое Server Actions и чем они отличаются от обычного API route?
- Как устроен кэш в App Router (fetch cache, router cache) и как его инвалидировать?
- Почему
window/localStorageнедоступны в Server Components и как правильно обойти? - Что такое
loading.tsx,error.tsx,not-found.tsxи как они связаны со streaming?
Бэкенд и данные: Node.js, API, БД
Заголовок раздела «Бэкенд и данные: Node.js, API, БД»Node.js в продакшене
Заголовок раздела «Node.js в продакшене»Главы: /08-nodejs/event-loop-node/ · /08-nodejs/node-production/
- Фазы Event Loop в Node.js: таймеры, poll, check. Когда выполнится
setImmediatevssetTimeout(0)? - Что должен делать сервис при SIGTERM и почему «просто выйти» — баг?
- Зачем HTTP-keep-alive и таймауты на сервере и на исходящих запросах?
- Как диагностировать утечку памяти в долгоживущем процессе? Инструменты и методика.
- Зачем валидировать конфигурацию при старте (Zod/env-schema), а не по ходу работы?
Монорепозитории и developer experience
Заголовок раздела «Монорепозитории и developer experience»Глава: /08-nodejs/monorepos-dx/
- Когда монорепозиторий оправдан, а когда мультирепо — правильнее? Честные минусы обоих.
- Чем отличаются pnpm workspaces, Turborepo и Nx? Что выбрать команде из пяти человек?
- Как устроен кэш сборки в Turborepo и что делать, если кэш «отравлен»?
- Как организовать shared-пакеты (UI-kit, types, config), чтобы не утонуть в версионировании?
- Зачем в монорепо единый линт/формат/CI и как task pipeline ускоряет проверки?
Проектирование REST API
Заголовок раздела «Проектирование REST API»Главы: /09-nestjs-api/rest-design/ · /09-nestjs-api/nestjs-foundation/
- Принципы ресурсного моделирования: как спроектировать URL и методы для вложенных сущностей?
- Версионирование API: путь, заголовок, поддомен — что выбрать и почему?
- Как правильно возвращать ошибки: коды, формат тела, проблема с 500 при бизнес-ошибках?
- Идемпотентность: зачем
Idempotency-Keyв POST и как его реализовать? - Pagination, фильтрация, сортировка: offset vs cursor и когда cursor обязателен?
- Что даёт NestJS из коробки: DI, guards, interceptors, pipes — как это укладывается в слои?
Realtime API: WebSocket, SSE, масштабирование
Заголовок раздела «Realtime API: WebSocket, SSE, масштабирование»Глава: /09-nestjs-api/async-realtime/
- WebSocket vs SSE vs long polling: когда достаточно «простого» SSE?
- Как работает handshake WebSocket и чем соединение отличается от обычного HTTP?
- Сервис на нескольких инстансах: как доставить событие всем подключённым клиентам?
- Как организовать авторизацию и аутентификацию на WebSocket-соединении?
- Что такое heartbeats/backpressure и что случится с «мёртвыми» соединениями без них?
- Как масштабировать realtime-слой через Redis Pub/Sub или брокер сообщений?
Очереди сообщений и outbox-паттерн
Заголовок раздела «Очереди сообщений и outbox-паттерн»Глава: /09-nestjs-api/messaging-outbox/
- Зачем очередь между сервисами вместо прямого HTTP-вызова? At-least-once vs exactly-once?
- Что такое outbox-паттерн и какую проблему решает (потеря события при двойной записи)?
- Почему consumer обязан быть идемпотентным и как это обеспечить (idempotency key, дедупликация)?
- Dead letter queue: когда сообщение туда попадает и что с ним делать дальше?
- Порядок сообщений: гарантирует ли очередь FIFO и как получить порядок, если нужен?
- Чем at-least-once доставка отличается от at-most-once и какое сочетание даёт «ровно один раз»?
PostgreSQL: индексы и транзакции
Заголовок раздела «PostgreSQL: индексы и транзакции»Главы: /10-data/postgres-indexes/ · /10-data/postgres-transactions/
- B-tree vs GIN vs GiST: какой индекс под какие запросы и почему?
- Как прочитать
EXPLAIN ANALYZEи что такое Seq Scan, который «не страшно»? - Covering index: зачем
INCLUDEи когда индекс не нужен? - Уровни изоляции: что ломается на Read Committed и как REPEATABLE READ лечит lost update?
- Что такое MVCC и почему длинная транзакция раздувает таблицу?
- Deadlock: как он возникает и как проектировать порядок доступа, чтобы его избежать?
Бэкапы и аварийное восстановление (DR)
Заголовок раздела «Бэкапы и аварийное восстановление (DR)»Глава: /10-data/postgres-backups/
pg_dumpvs WAL-архив vs физическая реплика: что и когда использовать?- Что такое RPO и RTO и как они определяют стратегию бэкапов?
- Почему бэкап, который никогда не восстанавливали, считается отсутствующим? Процедура проверки.
- Как PITR (point-in-time recovery) работает через WAL и сколько он «стоит» по ресурсам?
- Где хранить бэкапы, чтобы пожар в дата-центре их не уничтожил вместе с продом?
- Что делать с секретами и персональными данными в копиях базы (маскирование, шифрование)?
Redis: структуры и паттерны
Заголовок раздела «Redis: структуры и паттерны»Главы: /10-data/redis-patterns/ · /10-data/redis-structures/
- Строки, хэши, сеты, sorted sets, streams: типичная задача под каждую структуру?
- Cache-aside vs write-through vs write-behind: что выбираешь для кэша пользовательских сессий?
- Cache stampede (dogpile): как защититься от параллельной перестройки кэша?
- Что такое hot key и как его распознать и вылечить?
- Есть ли смысл в persistence для кэша? RDB vs AOF?
- Когда Redis-streams — достаточная замена полноценной очереди, а когда нет?
Инфраструктура и эксплуатация
Заголовок раздела «Инфраструктура и эксплуатация»Web-безопасность и аутентификация
Заголовок раздела «Web-безопасность и аутентификация»Главы: /11-security-testing/web-security/ · /11-security-testing/auth-jwt-oauth/
- Top-OWASP для твоего стека: XSS, CSRF, SQL-инъекции, SSRF — пример защиты каждого?
- JWT: чем access отличается от refresh, где хранить, как отзывать?
- Что такое CSRF-токен и почему SameSite=Strict решает не всё?
- OAuth2 flow: authorization code + PKCE — кто, кому и что передаёт на каждом шаге?
- Как устроена защита паролей: argon2/bcrypt, соль, почему MD5 — катастрофа?
- Rate limiting и brute-force: базовые приёмы защиты логина и API-ключей?
Docker в глубину
Заголовок раздела «Docker в глубину»Главы: /12-linux-docker/docker-deep/ · /12-linux-docker/docker-compose-prod/
- Слои образа и кэш сборки: почему порядок инструкций в Dockerfile критичен?
- Многоступенчатая сборка: зачем builder-stage и что попадает в финальный образ?
- Чем bind mount отличается от volume и что использовать в проде?
- Ресурсы контейнера: memory limits, OOM-killer, что происходит при исчерпании лимита?
- Healthcheck, restart policy, graceful shutdown: что обязательно для контейнера в проде?
- Compose в проде: когда достаточно, а когда пора в Kubernetes?
Supply-chain security
Заголовок раздела «Supply-chain security»Глава: /12-linux-docker/supply-chain-security/
- Почему
npm install— это выполнение чужого кода и как этим управлять? - Lock-файлы: зачем
package-lock.json/pnpm-lock.yamlв репозитории и что ломается без него? - SBOM: что это, зачем нужен и как генерируется для образа/проекта?
- Сканирование уязвимостей:
npm audit, Trivy, Grype — где в пайплайне и по какому порогу блочить? - Подпись образов и provenance: зачем cosign/sigstore и что даёт «доверенная» сборка?
- Reproducible builds и пиннинг base-образов: как убедиться, что образ — тот, что собирал ты?
Управление секретами
Заголовок раздела «Управление секретами»Глава: /14-iac-deploy-obs/secrets-management/
- Почему секреты нельзя хранить в Git и как работает
.env+.env.exampleна практике? - Vault / SOPS / sealed-secrets: какой инструмент когда оправдан и что выбрать для маленькой команды?
- Как секреты попадают в CI/CD и в рантайм приложения, чтобы не светиться в логах?
- Ротация секретов: как часто, как автоматизировать и что делать при компрометации?
- Как устроен доступ к секретам по ролям (RBAC) и принцип минимальных привилегий?
- Что делать, если секрет утёк в Git-историю: как правильно «забыть» (не просто удалить коммит)?
Инцидент-менеджмент и observability
Заголовок раздела «Инцидент-менеджмент и observability»Главы: /14-iac-deploy-obs/incident-management/ · /14-iac-deploy-obs/tracing-alerting/
- Metrics, logs, traces: чем каждый инструмент отвечает на свой вопрос и почему нужны все три?
- SLI, SLO, SLA: как выбрать SLI для API и зачем error budget?
- Что такое MTTR и как его сокращать алертингом «по симптомам», а не «по причине»?
- Структура инцидента: кто incident commander, что такое communication channel и status page?
- Postmortem без обвинений (blameless): какие разделы обязательны и какие выводы должны привести к действиям?
- Runbook vs playbook: когда достаточно чек-листа, а когда нужен автоматический сценарий?
Как собрать себе экзамен
Заголовок раздела «Как собрать себе экзамен»- Пройди список и честно отметь темы, по которым не смог ответить вслух за 60–90 секунд на вопрос.
- Для каждой слабой темы: открой главу, перечитай раздел «Типичные ошибки и грабли» — там обычно то, что спрашивают, когда «обычные» ответы уже услышали.
- Смоделируй мок-интервью: попроси коллегу или друга задавать вопросы из двух случайных разделов, отвечай без подготовки.
- Перед реальным собеседованием повтори не «всё подряд», а две-три темы, где ты слабее всего, — это даёт больше, чем поверхностный прогон всех 18.
- Возвращайся к этой странице раз в квартал: темы не меняются, меняется твоя глубина ответов.