Skip to content

Вопросы на собеседовании: Фулстек-разработчик

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

Смотреть пример резюме: Фулстек-разработчик

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

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

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

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

Вопросы

sqlnosqltypescript

Определите один обобщённый интерфейс и реализуйте его под каждый бэкенд за инверсией зависимостей.

  • Объявите базовый Repository<T, ID> с findById, save, delete и findMany.
  • Добавьте конкретные SqlRepository<T> и NoSqlRepository<T>, реализующие контракт.
  • Ограничьте ID типом string | number вторым дженериком, под бэкенд.
  • Внедряйте реализацию, чтобы код зависел от интерфейса, а не от хранилища.
  • Меняйте бэкенд в тестах или миграциях без правки бизнес-логики.

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

reactconcurrency

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

  • startTransition оборачивает несрочное обновление, чтобы React мог его прервать.
  • useDeferredValue оборачивает значение, рендеря со старым, пока не освободятся ресурсы.
  • Берите startTransition, когда сеттер состояния ваш.
  • Берите useDeferredValue, когда значение приходит из пропса или контекста.

Зачем это спрашивают: Отличает кандидатов, понимающих примитивы планирования React, от тех, кто лишь запомнил названия API.

event-loop

Сначала измерьте, затем уберите блокирующую работу с event loop.

  • Снимайте задержку через perf_hooks.monitorEventLoopDelay, clinic.js или 0x.
  • Ищите синхронный JSON больших payload, синхронные вызовы fs, плотные циклы.
  • Переносите CPU-тяжёлую работу в worker threads и батчите синхронные операции.
  • Используйте setImmediate для передачи управления между большими итерациями.
  • Добавьте трассировочные spans, чтобы связать задержку с типами запросов под нагрузкой.

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

design

Разделите систему на быстрые распределённые записи и чтения с CDN.

  • Генерируйте ID через Snowflake или диапазоны из счётчика, затем кодируйте в base62.
  • Храните маппинг slug в URL в DynamoDB или Redis Cluster с большим TTL.
  • Ставьте перед чтениями CloudFront или Cloudflare Workers, чтобы редиректы не доходили до оригина.
  • Используйте consistent hashing по шардам для распределения нагрузки записи.
  • Добавьте Bloom-фильтр для отклонения невалидных slug до обращения к базе.

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

indexespostgres

Подбирайте индекс под способ фильтрации запроса: подмножество строк или несколько столбцов.

  • Берите partial index, когда запрос всегда фильтрует высокоселективное подмножество, например status = 'pending'.
  • Берите composite index, когда запросы фильтруют или сортируют по нескольким столбцам сразу.
  • Совмещайте их в частичный составной индекс, когда выполнены оба условия.
  • Проверяйте pg_stat_user_indexes, ведь неиспользуемые индексы замедляют запись.

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

componentsnextjscaching

App Router по умолчанию рендерит на сервере и кэширует на уровнях запроса, маршрута и данных.

  • Компоненты по умолчанию серверные, отдают HTML без своего JS в бандле.
  • Границы Suspense стримят оболочку первой и сбрасывают секции по мере готовности данных.
  • Кэш охватывает дедуп fetch в запросе, кэш маршрутов и кэш данных.
  • Сбрасывайте кэш через revalidatePath, revalidateTag или fetch с cache: 'no-store'.

Зачем это спрашивают: Проверяет глубокое знание ментальной модели App Router в отличие от допущений устаревшего Pages Router.

gatewayapi

BFF формирует данные под одного клиента, шлюз решает сквозные задачи для всех.

  • BFF принадлежит фронтенд-команде и подгоняет контракт под одну поверхность UI.
  • API-шлюз централизует аутентификацию, лимиты, маршрутизацию и трансляцию протоколов.
  • BFF добавляет сервис на каждый тип клиента, но даёт фронтенду автономию.
  • Шлюз, единая точка, проще в эксплуатации, но копит смешанные задачи и тормозит правки контракта.

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

queriesn+1api

Батчите вызовы резолверов через DataLoader и ограничивайте стоимость запроса до выполнения.

  • Используйте DataLoader для батчинга вызовов уровня поля за тик и дедупа по ключу.
  • Создавайте экземпляры DataLoader per-request, чтобы не утекали данные между пользователями.
  • Добавьте анализ сложности, присваивающий стоимость полям и отклоняющий запросы выше порога.
  • Кэшируйте на сервере по нормализованному AST, чтобы избежать лишних обращений к базе.

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

redisrate-limitingdistributed

Используйте скользящее окно в Redis на атомарном Lua-скрипте.

  • Храните хэш на пользователя по временному окну и инкрементируйте в Lua-скрипте.
  • Lua выполняется атомарно на одном шарде, убирая гонки без внешних блокировок.
  • Делайте ключи по времени и EXPIRE, чтобы Redis сам чистил старые окна.
  • Добавьте локальный in-memory слой для поглощения всплесков до обращения к Redis.

Зачем это спрашивают: Проверяет понимание требований к атомарности в распределённых системах и практические навыки скриптинга Redis.

kubernetescontainers

Ставьте requests на базовую нагрузку, limits на безопасный максимум и калибруйте под нагрузкой.

  • requests отражают типичное потребление, чтобы планировщик точно размещал поды.
  • limits ограничивают потребление до вмешательства Kubernetes.
  • Слишком низкий лимит памяти запускает OOMKiller и каскад перезапусков.
  • Слишком низкий лимит CPU молча троттлит Node.js, повышая задержку event loop.
  • Профилируйте под реальной нагрузкой и ставьте память чуть выше пика для пиков GC.

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

dockercaching

Предпочитайте COPY для простого переноса и упорядочивайте слои, чтобы зависимости кэшировались отдельно от кода.

  • COPY только переносит файлы из контекста сборки в образ.
  • ADD ещё распаковывает tar-архивы и качает по URL, что делает его непредсказуемым.
  • Docker кэширует слой по инструкции и входам; одна инвалидация пересобирает все следующие.
  • Копируйте package.json и lock-файлы, запускайте npm install, затем код, чтобы правки кода не сбрасывали слой зависимостей.

Зачем это спрашивают: Проверяет практические знания Docker, которые напрямую влияют на время сборки CI в продакшен-пайплайнах.

restconcurrency

Lambda подходит для лёгких всплесков, Fargate для тяжёлых и долгих задач, поэтому совмещайте их.

  • Lambda ограничена 15 минутами, 10 GB эфемерного хранилища и 3 GB памяти.
  • Cold start добавляет 500 мс, 2 секунды, что недопустимо для синхронных запросов.
  • Fargate запускает постоянные контейнеры без таймаута и без cold start.
  • Держите API на Fargate для лёгкой синхронной работы, тяжёлые трансформации выносите в Lambda через SQS.

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

terraform

Выявите дрейф через plan, затем импортируйте или откатывайте и закройте будущие правки.

  • Запустите terraform plan для сравнения состояния с реальной инфраструктурой.
  • Сохраните ручное изменение, импортировав ресурс через terraform import.
  • Откатите ненужное изменение, применив объявленную конфигурацию.
  • Проводите планы через CI/CD и ловите внеполосные правки через AWS Config.
  • Блокируйте состояние через S3 и DynamoDB, чтобы исключить параллельные apply.

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

concurrency

Горутины дёшевы из-за крошечных растущих стеков и M:N-планирования, но утекают, если их не отменять.

  • Они стартуют с нескольких килобайт растущего стека против мегабайтов у потоков ОС.
  • Среда выполнения мультиплексирует тысячи горутин на немного потоков через M:N-планировщик.
  • Утечки возникают, когда горутина вечно блокируется на незакрытом канале или неотменённом контексте.
  • Связывайте каждый запуск с отменой, передавайте context.Context и запускайте goleak в тестах.

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

Расскажите конкретную историю, где вы предложили альтернативу вместо простого «нет».

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

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

sqlqueriesinjection

Параметризуйте всё и валидируйте ввод на границе.

  • Используйте параметризованные запросы или prepared statements вместо конкатенации ввода.
  • В билдере вроде Knex применяйте привязку параметров и не интерполируйте вручную.
  • Избегайте exec и eval; используйте child_process.execFile с явным массивом аргументов.
  • Валидируйте запросы через Zod или Joi, чтобы невалидный ввод отклонялся рано.

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

event-sourcing

Event sourcing хранит полную историю событий и получает состояние их воспроизведением.

  • Он хранит неизменяемые события вместо перезаписи состояния, восстанавливая его с снапшота или начала.
  • Вы получаете полный audit trail, воспроизводимую историю и поддержку event-driven.
  • Он подходит для аудит-комплаенса, нескольких read-проекций и временных запросов «состояние на дату X».
  • Он добавляет сложность снапшотов и эволюции схем, поэтому избыточен для простого CRUD.

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

system-designdistributedqueues

Разбейте тесты по слоям и проверяйте идемпотентность, ведь доставка «ровно один раз» не гарантирована.

  • Юнит-тестируйте отдельные обработчики с мокированным клиентом очереди.
  • Контракт-тестируйте продюсера и консьюмера против общего реестра схем.
  • e2e-тестируйте против эмулятора: LocalStack для SQS или Testcontainers для Kafka.
  • Добавьте тесты идемпотентности на повторную доставку и trace ID, чтобы сбои в CI были диагностируемы.

Зачем это спрашивают: Подтверждает, что кандидат понимает многоуровневую стратегию тестирования для асинхронных распределённых систем, а не только синхронного API.

schemagraphql

Federation даёт каждому сервису владеть частью одного графа, а шлюз компонует их во время запроса.

  • Каждый subgraph определяет свою часть, а шлюз разрешает межсервисные сущности через @key.
  • Schema stitching связывает шлюз со схемами сервисов и логикой резолверов.
  • Federation хранит правила композиции в каждом сервисе, поэтому они деплоятся независимо.
  • Главная сложность, автоматизация пересборки supergraph через реестр вроде Apollo Studio.

Зачем это спрашивают: Проверяет, понимает ли кандидат модель владения и деплоя, лежащую в основе federation, а не только API-поверхность.

postgres

Снижайте scale factor на уровне таблицы, чтобы vacuum шёл часто, а не после сильного раздутия.

  • Autovacuum срабатывает, когда мёртвые кортежи превышают threshold плюс scale_factor на число строк.
  • Дефолтный 0,2 ждёт, пока 20% таблицы станет мёртвым, вызывая раздутие и конкуренцию.
  • Переопределите на таблице autovacuum_vacuum_scale_factor = 0,01 и autovacuum_vacuum_cost_delay = 2ms.
  • Мониторьте n_dead_tup и last_autovacuum, чтобы vacuum успевал за записью.

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

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

  • 21

    Опишите, как алгоритм согласования React (Fiber) решает, какие компоненты перерисовывать.

    reactcomponentsalgorithms
  • 22

    Как Next.js реализует инкрементальную статическую регенерацию (ISR) и когда выбрать её вместо SSR?

    ssrnextjs
  • 23

    Что такое backpressure в стримах Node.js и как с ним правильно работать?

    soft-skillsbackpressure
  • 24

    Как выстроить процесс code review, улучшающий навыки junior-разработчиков, не замедляя поставку?

    code-reviewconcurrency
  • 25

    Как обрабатывать инвалидацию кэша в многосервисной архитектуре, где одни данные кэшируются в нескольких местах?

    soft-skillsarchitecturecaching
  • 26

    Объясните паттерн Saga для управления распределёнными транзакциями. Что такое компенсирующие транзакции?

    sagadistributedtransactions
  • 27

    Как использовать условные типы и infer для извлечения типа возврата асинхронной функции на уровне типов TypeScript?

    async
  • 28

    Как профилировать утечку памяти в долгоживущем Node.js-процессе в продакшене?

    memoryconcurrency
  • 29

    Чем AWS Aurora отличается от RDS PostgreSQL по репликации, failover и стоимости?

    postgresreplication
  • 30

    Спроектируйте систему уведомлений в реальном времени для 10 миллионов одновременных пользователей.

    system-designdesignconcurrency
  • 31

    Каковы преимущества gRPC перед REST для внутренней межсервисной коммуникации?

    restgrpc
  • 32

    Как система реактивности Vue 3 отличается от Vue 2 и каковы последствия для производительности?

    reactsystem-designperformance
  • 33

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

    soft-skillsconflict
  • 34

    Объясните CSRF, уязвимость современных SPA и меры по защите.

    csrfvulnerabilities
  • 35

    Как реализовать row-level security в PostgreSQL для мультитенантного SaaS-приложения?

    postgresmulti-tenancy
  • 36

    Когда выбрать monorepo вместо polyrepo и какие решения по инструментарию следуют из этого выбора?

    monorepo
  • 37

    Как реализовать rolling deployment без простоев в Kubernetes? Что может пойти не так?

    kubernetesdeployment
  • 38

    Как спроектировать систему микрофронтендов с использованием module federation? Каковы подводные камни с разделяемыми зависимостями?

    system-designmicro-frontendsfederation
  • 39

    Как работает модуль cluster в Node.js и чем он отличается от балансировщика нагрузки перед несколькими экземплярами?

    load-balancing
  • 40

    Каковы компромиссы между встраиванием документов и ссылками на них в MongoDB для схемы поста в социальной сети?

    mongodbschema
  • 41

    Как выявлять и устранять регрессии Core Web Vitals до достижения продакшена?

    web-vitals
  • 42

    Как писать интеграционные тесты для API-эндпоинта, зависящего от стороннего платёжного шлюза?

    integrationendpointsapi
  • 43

    Чем интерфейсы Go отличаются от интерфейсов TypeScript и как это влияет на проектирование общих абстракций?

    typescripttypesdesign
  • 44

    Опишите паттерн Strangler Fig и как вы применили бы его для миграции монолита на микросервисы.

    microservicesmonolithmigration
  • 45

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

    indexessearchdesign
  • 46

    Как смоделировать связь «один ко многим» в DynamoDB с использованием single-table design?

    dynamodbdesign
  • 47

    Расскажите, как вы пишете RFC для предложения значимого архитектурного изменения. Какие разделы наиболее важны?

    decision-makingarchitecture
  • 48

    Как обрабатывать аутентификацию в Next.js App Router с middleware и каковы ограничения edge runtime?

    middlewareauthnextjs
  • 49

    Как работает инвалидация кэша CloudFront и когда использовать ETags вместо TTL-экспирации?

    caching
  • 50

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

    api
  • 51

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

  • 52

    Что такое CQRS и когда разделение моделей чтения и записи даёт реальную пользу, а не лишнюю сложность?

    cqrsalgorithms
  • 53

    Как реализовать graceful shutdown для Node.js HTTP-сервера в Kubernetes при наличии активных соединений?

    lifecyclehttpkubernetes
  • 54

    Расскажите, как спроектировать систему лидерборда с обновлением в реальном времени с помощью отсортированных множеств Redis.

    system-designdesignredis
  • 55

    Как решить, когда общей библиотеке стать внутренним сервисом?

  • 56

    Каковы компромиссы между серверными и клиентскими компонентами в Next.js и как выбирать, что использовать для конкретной функции?

    componentsnextjs
  • 57

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

    httpconcurrency
  • 58

    Объясните разницу между Deployment, StatefulSet и DaemonSet в Kubernetes. Когда использовать каждый?

    kubernetesdeployment
  • 59

    Как управлять секретами в контейнеризованной среде? Сравните Vault, AWS Secrets Manager и Kubernetes Secrets.

    kubernetescontainerssecrets
  • 60

    Как использовать PostgreSQL EXPLAIN ANALYZE для диагностики медленного запроса и каковы наиболее частые первопричины?

    queriespostgres
  • 61

    Как реализовать курсорную пагинацию в GraphQL и почему она предпочтительнее смещения при больших объёмах?

    graphqlpagination
  • 62

    Как подходить к контрактному тестированию между микросервисами и какие инструменты поддерживают этот паттерн?

    contractmicroservices
  • 63

    Объясните паттерн circuit breaker и как реализовать его в Node.js-сервисе, вызывающем внешние API.

    resilienceapi
  • 64

    Как совместно использовать HTTP/2 и заголовки кэширования для минимизации клиентских round trip в веб-приложении?

    cachinghttp
  • 65

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

    terraformdeploymentconfig
  • 66

    Как реализовать систему плагинов в Vue 3-приложении, позволяющую сторонним командам добавлять функции без изменения ядра?

    system-design
  • 67

    Чем AWS SQS отличается от SNS и когда их объединять в паттерне fan-out?

    fan-out
  • 68

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

    tech-debtcommunication
  • 69

    Как работает инвертированный индекс Elasticsearch и каковы последствия для производительности при высококардинальных полях?

    indexessearchperformance
  • 70

    Что такое акторная модель и когда вы бы использовали её вместо традиционного подхода запрос-ответ в бэкенд-сервисе?

    actor-model
  • 71

    Как предотвратить лишние перерисовки при контексте React, хранящем большой объект?

  • 72

    Какова разница между process.nextTick, setImmediate и setTimeout(fn, 0) в event loop Node.js?

    event-loopconcurrency
  • 73

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

  • 74

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

    dynamodbqueriesdesign
  • 75

    Как вводить нового senior-инженера в сложную legacy-кодовую базу, сохраняя его продуктивность в первые две недели?

    onboarding
  • 76

    Как использовать ленивую загрузку, code splitting и prefetching вместе в большом React-приложении для оптимизации времени до интерактивности?

    optimizationlazy-loadingreact
  • 77

    Каковы ключевые различия между синхронным REST и асинхронной event-driven коммуникацией и как выбирать между ними?

    eventsrestasync
  • 78

    Как написать типобезопасный event emitter на TypeScript, где тип payload выводится из имени события?

    typescript
  • 79

    Как cold start AWS Lambda влияет на задержку для пользователей и каковы наиболее эффективные стратегии смягчения?

    latency
  • 80

    Что такое пирамида тестирования и как она меняется для full-stack команды, владеющей и фронтендом, и бэкендом?

    testing
  • 81

    Как спроектировать систему feature flags с поддержкой постепенного развёртывания, A/B-тестирования и мгновенного аварийного отключения?

    system-designdesignfeature-flags
  • 82

    Как реализовать полнотекстовый поиск в PostgreSQL и когда обратиться к Elasticsearch?

    postgressearch
  • 83

    Как Kubernetes Horizontal Pod Autoscaler решает, когда масштабировать, и как настроить кастомные метрики?

    kubernetesconfigmonitoring
  • 84

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

    hookswebsockets
  • 85

    Как инструментировать Node.js-сервис с OpenTelemetry для захвата распределённых трассировок через несколько сервисов?

    distributed
  • 86

    Опишите компромиссы между пессимистичным и оптимистичным управлением конкурентностью в высоконагруженной базе данных.

    databaselockingconcurrency
  • 87

    Как работает сборщик мусора Go и какие паттерны вызывают паузы GC, влияющие на задержку?

    latencygc
  • 88

    Расскажите о случае, когда вам пришлось сообщить стейкхолдерам плохие новости о техническом сбое и как вы справились.

    storycommunication
  • 89

    Как реализовать корректную ротацию токенов и инвалидацию refresh token в системе аутентификации на основе JWT?

    jwttokenssystem-design
  • 90

    Что такое гексагональная архитектура и как она помогает с тестируемостью и миграцией технологий?

    hexagonalmigrations
  • 91

    Как вы поступите с переходом кластера Elasticsearch в red-статус в продакшене и каков ваш процесс триажа?

    searchconcurrency
  • 92

    Как использовать Redis Pub/Sub в сравнении с Redis Streams и когда один превосходит другой?

    redis
  • 93

    Как спроектировать мультирегиональный active-active деплой на AWS для stateful-приложения?

    designdeployment
  • 94

    Как оценивать, строить ли, покупать или использовать open source при добавлении новой возможности в платформу?

    decision-making
  • 95

    Как обрабатывать breaking changes при обновлении Terraform-провайдеров без простоя в продакшене?

    soft-skillsterraform
  • 96

    Как диагностировать медленные запросы к базе данных в продакшен-системе с минимальным влиянием на работающий трафик?

    databasequeriessystem-design
  • 97

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

    feedbackarchitecture
  • 98

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

    system-designdesign
  • 99

    Как оптимизировать Next.js для страницы, которой нужны как персонализированные данные пользователя, так и сильно кэшированный публичный контент?

    cachingoptimizationnextjs
  • 100

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

    observabilitymonitoring