Перейти к содержимому

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

Это не шпаргалка и не конспект. Это карта повторения: 18 тем, которые покрывают весь путь учебника — от Event Loop до инцидент-менеджмента. Под каждой темой — пять-семь вопросов, которые реально задают на собеседованиях middle/senior. Ответов здесь нет специально: если на вопрос можешь ответить вслух, с примером из практики и парой «подводных камней» — тема закрыта. Если не можешь — иди по ссылке на главу и повторяй именно её, а не весь раздел.

Глава: /00-git/merge-rebase/ · см. также /00-git/internals/

  • В чём принципиальная разница между merge и rebase и когда какой выбирать?
  • Что делает git rebase -i и какие команды редактирования истории ты используешь чаще всего?
  • Как разруливать конфликт при rebase, если он повторяется на каждом коммите ветки?
  • Как reflog спасает после «испорченного» rebase? Когда reflog уже не поможет?
  • Почему нельзя rebase’ить опубликованные ветки? Что ломается у других разработчиков?
  • Чем fast-forward отличается от --no-ff и как это влияет на историю проекта?

Главы: /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)?

Главы: /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 и какую проблему они решают?

Главы: /05-react/rendering/ · /05-react/advanced-hooks/

  • Что триггерит рендер компонента? Почему лишние рендеры — не всегда проблема?
  • Правила хуков: почему нельзя вызывать хуки в условиях и циклах?
  • useEffect vs useLayoutEffect: когда какой и что такое этап commit?
  • Как работает useMemo/useCallback и когда их применение — преждевременная оптимизация?
  • Чем управляемое состояние отличается от URL/серверного состояния? Где держать каждое?
  • Как избежать race condition при асинхронной загрузке данных в эффекте?

Главы: /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?

Главы: /08-nodejs/event-loop-node/ · /08-nodejs/node-production/

  • Фазы Event Loop в Node.js: таймеры, poll, check. Когда выполнится setImmediate vs setTimeout(0)?
  • Что должен делать сервис при SIGTERM и почему «просто выйти» — баг?
  • Зачем HTTP-keep-alive и таймауты на сервере и на исходящих запросах?
  • Как диагностировать утечку памяти в долгоживущем процессе? Инструменты и методика.
  • Зачем валидировать конфигурацию при старте (Zod/env-schema), а не по ходу работы?

Глава: /08-nodejs/monorepos-dx/

  • Когда монорепозиторий оправдан, а когда мультирепо — правильнее? Честные минусы обоих.
  • Чем отличаются pnpm workspaces, Turborepo и Nx? Что выбрать команде из пяти человек?
  • Как устроен кэш сборки в Turborepo и что делать, если кэш «отравлен»?
  • Как организовать shared-пакеты (UI-kit, types, config), чтобы не утонуть в версионировании?
  • Зачем в монорепо единый линт/формат/CI и как task pipeline ускоряет проверки?

Главы: /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 — как это укладывается в слои?

Глава: /09-nestjs-api/async-realtime/

  • WebSocket vs SSE vs long polling: когда достаточно «простого» SSE?
  • Как работает handshake WebSocket и чем соединение отличается от обычного HTTP?
  • Сервис на нескольких инстансах: как доставить событие всем подключённым клиентам?
  • Как организовать авторизацию и аутентификацию на WebSocket-соединении?
  • Что такое heartbeats/backpressure и что случится с «мёртвыми» соединениями без них?
  • Как масштабировать realtime-слой через Redis Pub/Sub или брокер сообщений?

Глава: /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 и какое сочетание даёт «ровно один раз»?

Главы: /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: как он возникает и как проектировать порядок доступа, чтобы его избежать?

Глава: /10-data/postgres-backups/

  • pg_dump vs WAL-архив vs физическая реплика: что и когда использовать?
  • Что такое RPO и RTO и как они определяют стратегию бэкапов?
  • Почему бэкап, который никогда не восстанавливали, считается отсутствующим? Процедура проверки.
  • Как PITR (point-in-time recovery) работает через WAL и сколько он «стоит» по ресурсам?
  • Где хранить бэкапы, чтобы пожар в дата-центре их не уничтожил вместе с продом?
  • Что делать с секретами и персональными данными в копиях базы (маскирование, шифрование)?

Главы: /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 — достаточная замена полноценной очереди, а когда нет?

Главы: /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-ключей?

Главы: /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?

Глава: /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-историю: как правильно «забыть» (не просто удалить коммит)?

Главы: /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: когда достаточно чек-листа, а когда нужен автоматический сценарий?
  1. Пройди список и честно отметь темы, по которым не смог ответить вслух за 60–90 секунд на вопрос.
  2. Для каждой слабой темы: открой главу, перечитай раздел «Типичные ошибки и грабли» — там обычно то, что спрашивают, когда «обычные» ответы уже услышали.
  3. Смоделируй мок-интервью: попроси коллегу или друга задавать вопросы из двух случайных разделов, отвечай без подготовки.
  4. Перед реальным собеседованием повтори не «всё подряд», а две-три темы, где ты слабее всего, — это даёт больше, чем поверхностный прогон всех 18.
  5. Возвращайся к этой странице раз в квартал: темы не меняются, меняется твоя глубина ответов.