Вопросы на собеседовании: Фулстек-разработчик
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Senior.
Смотреть пример резюме: Фулстек-разработчик →Вопросы
Определите один обобщённый интерфейс и реализуйте его под каждый бэкенд за инверсией зависимостей.
- Объявите базовый Repository<T, ID> с findById, save, delete и findMany.
- Добавьте конкретные SqlRepository<T> и NoSqlRepository<T>, реализующие контракт.
- Ограничьте ID типом string | number вторым дженериком, под бэкенд.
- Внедряйте реализацию, чтобы код зависел от интерфейса, а не от хранилища.
- Меняйте бэкенд в тестах или миграциях без правки бизнес-логики.
Зачем это спрашивают: Проверяет, понимает ли кандидат, как разделить интерфейс и реализацию и применить дженерики для реальных абстракций, а не только учебных примеров.
Конкурентный рендеринг позволяет React прерывать и возобновлять работу, чтобы срочный ввод оставался отзывчивым.
- startTransition оборачивает несрочное обновление, чтобы React мог его прервать.
- useDeferredValue оборачивает значение, рендеря со старым, пока не освободятся ресурсы.
- Берите startTransition, когда сеттер состояния ваш.
- Берите useDeferredValue, когда значение приходит из пропса или контекста.
Зачем это спрашивают: Отличает кандидатов, понимающих примитивы планирования React, от тех, кто лишь запомнил названия API.
Сначала измерьте, затем уберите блокирующую работу с event loop.
- Снимайте задержку через perf_hooks.monitorEventLoopDelay, clinic.js или 0x.
- Ищите синхронный JSON больших payload, синхронные вызовы fs, плотные циклы.
- Переносите CPU-тяжёлую работу в worker threads и батчите синхронные операции.
- Используйте setImmediate для передачи управления между большими итерациями.
- Добавьте трассировочные spans, чтобы связать задержку с типами запросов под нагрузкой.
Зачем это спрашивают: Старший инженер должен уметь инструментировать и диагностировать регрессии производительности в продакшене, а не только перечислять теоретические причины.
Разделите систему на быстрые распределённые записи и чтения с CDN.
- Генерируйте ID через Snowflake или диапазоны из счётчика, затем кодируйте в base62.
- Храните маппинг slug в URL в DynamoDB или Redis Cluster с большим TTL.
- Ставьте перед чтениями CloudFront или Cloudflare Workers, чтобы редиректы не доходили до оригина.
- Используйте consistent hashing по шардам для распределения нагрузки записи.
- Добавьте Bloom-фильтр для отклонения невалидных slug до обращения к базе.
Зачем это спрашивают: Проверяет способность рассуждать об асимметрии чтения/записи, слоях кэширования и распределённой генерации ID при высоких нагрузках.
Подбирайте индекс под способ фильтрации запроса: подмножество строк или несколько столбцов.
- Берите partial index, когда запрос всегда фильтрует высокоселективное подмножество, например status = 'pending'.
- Берите composite index, когда запросы фильтруют или сортируют по нескольким столбцам сразу.
- Совмещайте их в частичный составной индекс, когда выполнены оба условия.
- Проверяйте pg_stat_user_indexes, ведь неиспользуемые индексы замедляют запись.
Зачем это спрашивают: Выявляет, способен ли кандидат рассуждать о компромиссах индексов, а не применять универсальный подход.
App Router по умолчанию рендерит на сервере и кэширует на уровнях запроса, маршрута и данных.
- Компоненты по умолчанию серверные, отдают HTML без своего JS в бандле.
- Границы Suspense стримят оболочку первой и сбрасывают секции по мере готовности данных.
- Кэш охватывает дедуп fetch в запросе, кэш маршрутов и кэш данных.
- Сбрасывайте кэш через revalidatePath, revalidateTag или fetch с cache: 'no-store'.
Зачем это спрашивают: Проверяет глубокое знание ментальной модели App Router в отличие от допущений устаревшего Pages Router.
BFF формирует данные под одного клиента, шлюз решает сквозные задачи для всех.
- BFF принадлежит фронтенд-команде и подгоняет контракт под одну поверхность UI.
- API-шлюз централизует аутентификацию, лимиты, маршрутизацию и трансляцию протоколов.
- BFF добавляет сервис на каждый тип клиента, но даёт фронтенду автономию.
- Шлюз, единая точка, проще в эксплуатации, но копит смешанные задачи и тормозит правки контракта.
Зачем это спрашивают: Оценивает, понимает ли кандидат организационные компромиссы, а не только технические.
Батчите вызовы резолверов через DataLoader и ограничивайте стоимость запроса до выполнения.
- Используйте DataLoader для батчинга вызовов уровня поля за тик и дедупа по ключу.
- Создавайте экземпляры DataLoader per-request, чтобы не утекали данные между пользователями.
- Добавьте анализ сложности, присваивающий стоимость полям и отклоняющий запросы выше порога.
- Кэшируйте на сервере по нормализованному AST, чтобы избежать лишних обращений к базе.
Зачем это спрашивают: Подтверждает знание кандидатом как батч-решения, так и дополнительных ограничений, необходимых для безопасности GraphQL при масштабировании.
Используйте скользящее окно в Redis на атомарном Lua-скрипте.
- Храните хэш на пользователя по временному окну и инкрементируйте в Lua-скрипте.
- Lua выполняется атомарно на одном шарде, убирая гонки без внешних блокировок.
- Делайте ключи по времени и EXPIRE, чтобы Redis сам чистил старые окна.
- Добавьте локальный in-memory слой для поглощения всплесков до обращения к Redis.
Зачем это спрашивают: Проверяет понимание требований к атомарности в распределённых системах и практические навыки скриптинга Redis.
Ставьте requests на базовую нагрузку, limits на безопасный максимум и калибруйте под нагрузкой.
- requests отражают типичное потребление, чтобы планировщик точно размещал поды.
- limits ограничивают потребление до вмешательства Kubernetes.
- Слишком низкий лимит памяти запускает OOMKiller и каскад перезапусков.
- Слишком низкий лимит CPU молча троттлит Node.js, повышая задержку event loop.
- Профилируйте под реальной нагрузкой и ставьте память чуть выше пика для пиков GC.
Зачем это спрашивают: Подтверждает, что кандидат понимает: неверно настроенные лимиты вызывают тонкие сбои в продакшене, а не только очевидные краши.
Предпочитайте COPY для простого переноса и упорядочивайте слои, чтобы зависимости кэшировались отдельно от кода.
- COPY только переносит файлы из контекста сборки в образ.
- ADD ещё распаковывает tar-архивы и качает по URL, что делает его непредсказуемым.
- Docker кэширует слой по инструкции и входам; одна инвалидация пересобирает все следующие.
- Копируйте package.json и lock-файлы, запускайте npm install, затем код, чтобы правки кода не сбрасывали слой зависимостей.
Зачем это спрашивают: Проверяет практические знания Docker, которые напрямую влияют на время сборки CI в продакшен-пайплайнах.
Lambda подходит для лёгких всплесков, Fargate для тяжёлых и долгих задач, поэтому совмещайте их.
- Lambda ограничена 15 минутами, 10 GB эфемерного хранилища и 3 GB памяти.
- Cold start добавляет 500 мс, 2 секунды, что недопустимо для синхронных запросов.
- Fargate запускает постоянные контейнеры без таймаута и без cold start.
- Держите API на Fargate для лёгкой синхронной работы, тяжёлые трансформации выносите в Lambda через SQS.
Зачем это спрашивают: Проверяет способность применять ограничения платформы к реальным сценариям, а не абстрактно перечислять возможности.
Выявите дрейф через plan, затем импортируйте или откатывайте и закройте будущие правки.
- Запустите terraform plan для сравнения состояния с реальной инфраструктурой.
- Сохраните ручное изменение, импортировав ресурс через terraform import.
- Откатите ненужное изменение, применив объявленную конфигурацию.
- Проводите планы через CI/CD и ловите внеполосные правки через AWS Config.
- Блокируйте состояние через S3 и DynamoDB, чтобы исключить параллельные apply.
Зачем это спрашивают: Выявляет, относится ли кандидат к инфраструктуре как к коду с дисциплиной, или воспринимает Terraform как необязательную обёртку вокруг консоли.
Горутины дёшевы из-за крошечных растущих стеков и M:N-планирования, но утекают, если их не отменять.
- Они стартуют с нескольких килобайт растущего стека против мегабайтов у потоков ОС.
- Среда выполнения мультиплексирует тысячи горутин на немного потоков через M:N-планировщик.
- Утечки возникают, когда горутина вечно блокируется на незакрытом канале или неотменённом контексте.
- Связывайте каждый запуск с отменой, передавайте context.Context и запускайте goleak в тестах.
Зачем это спрашивают: Проверяет понимание модели конкурентности Go и операционной дисциплины, необходимой для предотвращения роста памяти в долгоживущих сервисах.
Расскажите конкретную историю, где вы предложили альтернативу вместо простого «нет».
- Возьмите случай со скрытой сложностью: нехватка инфраструктуры или риск миграции.
- Покажите, что подготовили конкретную альтернативу с анализом затрат и выгод.
- Опишите, как представили её PM и дизайну и согласовали поэтапный подход.
- Завершите результатом и уроком о том, как объяснять ограничения нетехническим стейкхолдерам.
Зачем это спрашивают: Проверяет, способен ли кандидат защищать качество инженерии, не становясь препятствием, что является ключевой обязанностью senior-специалиста.
Параметризуйте всё и валидируйте ввод на границе.
- Используйте параметризованные запросы или prepared statements вместо конкатенации ввода.
- В билдере вроде Knex применяйте привязку параметров и не интерполируйте вручную.
- Избегайте exec и eval; используйте child_process.execFile с явным массивом аргументов.
- Валидируйте запросы через Zod или Joi, чтобы невалидный ввод отклонялся рано.
Зачем это спрашивают: Проверяет, что кандидат знает как механизм этих уязвимостей, так и правильные меры по их устранению на уровне библиотек.
Event sourcing хранит полную историю событий и получает состояние их воспроизведением.
- Он хранит неизменяемые события вместо перезаписи состояния, восстанавливая его с снапшота или начала.
- Вы получаете полный audit trail, воспроизводимую историю и поддержку event-driven.
- Он подходит для аудит-комплаенса, нескольких read-проекций и временных запросов «состояние на дату X».
- Он добавляет сложность снапшотов и эволюции схем, поэтому избыточен для простого CRUD.
Зачем это спрашивают: Проверяет, способен ли кандидат взвесить реальную операционную стоимость event sourcing против сценариев, которые его действительно оправдывают.
Разбейте тесты по слоям и проверяйте идемпотентность, ведь доставка «ровно один раз» не гарантирована.
- Юнит-тестируйте отдельные обработчики с мокированным клиентом очереди.
- Контракт-тестируйте продюсера и консьюмера против общего реестра схем.
- e2e-тестируйте против эмулятора: LocalStack для SQS или Testcontainers для Kafka.
- Добавьте тесты идемпотентности на повторную доставку и trace ID, чтобы сбои в CI были диагностируемы.
Зачем это спрашивают: Подтверждает, что кандидат понимает многоуровневую стратегию тестирования для асинхронных распределённых систем, а не только синхронного API.
Federation даёт каждому сервису владеть частью одного графа, а шлюз компонует их во время запроса.
- Каждый subgraph определяет свою часть, а шлюз разрешает межсервисные сущности через @key.
- Schema stitching связывает шлюз со схемами сервисов и логикой резолверов.
- Federation хранит правила композиции в каждом сервисе, поэтому они деплоятся независимо.
- Главная сложность, автоматизация пересборки supergraph через реестр вроде Apollo Studio.
Зачем это спрашивают: Проверяет, понимает ли кандидат модель владения и деплоя, лежащую в основе federation, а не только API-поверхность.
Снижайте 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