Вопросы на собеседовании: Бэкенд-разработчик
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Junior.
Смотреть пример резюме: Бэкенд-разработчик →Вопросы
REST, это архитектурный стиль для сетевых API поверх HTTP.
- Без состояния: каждый запрос несёт всю нужную серверу информацию.
- Единый интерфейс: согласованное именование ресурсов и стандартные HTTP-методы.
- Разделение клиента и сервера, кэшируемость и многоуровневость, опционально код по требованию.
- На практике: ресурсы как URL вида /users/42, GET для чтения, POST для создания, без серверного состояния сессии.
Зачем это спрашивают: Интервьюер проверяет, понимаете ли вы REST как архитектурный стиль с конкретными правилами, а не просто любой HTTP API.
PUT полностью заменяет ресурс, PATCH обновляет только его часть.
- PUT: отправляете полное представление, сервер перезаписывает всё существующее.
- PATCH: отправляете только поля, которые нужно изменить.
- Пример: обновление email через PUT требует весь объект пользователя, через PATCH, только поле email.
- PATCH защищает от случайного затирания полей, которые клиент не собирался менять.
Зачем это спрашивают: Это проверяет точное понимание семантики HTTP, что важно при проектировании API, на который полагаются клиенты.
Выбирайте коды статуса по смыслу, а не возвращайте 200 на всё.
- 201 Created при успешном создании, обычно с новым ресурсом в теле.
- 404 Not Found для отсутствующего ресурса.
- 400 Bad Request при ошибке валидации, с телом, описывающим что не так.
- 500 Internal Server Error при необработанном сбое на сервере.
- Правильные коды позволяют клиентам обрабатывать ошибки программно, не разбирая текст.
Зачем это спрашивают: Интервьюеры хотят убедиться, что вы выбираете коды статуса семантически, а не возвращаете 200 на всё подряд или угадываете.
Сервер выдаёт подписанный токен после входа и проверяет его на каждом запросе.
- Токен состоит из трёх частей: заголовок, base64-нагрузка с данными вроде ID пользователя и срока действия, и подпись.
- Клиент передаёт его в заголовке Authorization при последующих запросах.
- Сервер проверяет подпись секретным ключом и доверяет нагрузке без обращения к базе данных.
- Поскольку JWT самодостаточны, они подходят для stateless API.
Зачем это спрашивают: Сильный ответ показывает понимание трёхчастной структуры, механизма подписи и преимущества отсутствия состояния, а не просто факта использования JWT для аутентификации.
Аутентификация подтверждает, кто вы, авторизация определяет, что вам разрешено.
- Аутентификация: проверка пароля или валидация токена.
- Авторизация: выдача прав после подтверждения личности.
- Пример: проверка JWT, это аутентификация, проверка роли администратора перед удалением, авторизация.
- Частая ошибка, смешивать их, тогда эндпоинты узнают пользователя, но не проверяют права.
Зачем это спрашивают: Это фундаментальная концепция безопасности, с помощью которой интервьюеры отбирают кандидатов, понимающих многоуровневость защиты.
Внешний ключ ссылается на первичный ключ другой таблицы и обеспечивает ссылочную целостность.
- Пример: таблица orders имеет user_id, указывающий на таблицу users.
- Он предотвращает осиротевшие записи, например заказ для несуществующего пользователя.
- СУБД отклоняет вставки или обновления, нарушающие ограничение.
- Это надёжнее, чем проверять правило только в коде приложения.
Зачем это спрашивают: Интервьюер проверяет, понимаете ли вы реляционное моделирование данных за рамками написания SELECT-запросов.
Индекс, это структура данных, находящая совпадающие строки без полного сканирования таблицы.
- Обычно это B-дерево по одному или нескольким столбцам.
- Добавляйте индекс на столбцы, часто используемые в WHERE, JOIN или ORDER BY.
- Каждый индекс замедляет INSERT, UPDATE и DELETE, потому что его тоже нужно обновлять.
- Поэтому создавайте индексы избирательно, где производительность чтения важнее всего.
Зачем это спрашивают: Хороший ответ называет и выгоду при чтении, и затраты при записи, это показывает умение думать о компромиссах, а не только об ускорении.
N+1 возникает, когда вы загружаете N записей и делаете по одному лишнему запросу на каждую для связанных данных.
- Пример: загрузка 100 постов с запросом автора для каждого даёт 101 запрос.
- Решение, загрузить связанные данные одним джойном или одним пакетным запросом.
- Большинство ORM предлагают жадную загрузку, например include в Sequelize или select_related в Django.
- Это сводит работу к одному-двум запросам.
Зачем это спрашивают: Это очень распространённая проблема производительности в реальных проектах, и интервьюеры используют её, чтобы проверить, думаете ли вы о том, какой SQL генерирует ваш код.
SQL использует таблицы с фиксированной схемой, NoSQL, гибкие схемы и разные модели данных.
- SQL: таблицы с фиксированной схемой и структурированные запросы для джойнов, агрегаций и транзакций.
- NoSQL: документные хранилища вроде MongoDB, «ключ-значение» вроде Redis, колоночные вроде Cassandra.
- SQL подходит для реляционных данных с жёсткими требованиями к согласованности.
- NoSQL часто жертвует частью гарантий ACID ради горизонтальной масштабируемости или гибкости схемы.
- На уровне junior начинайте с реляционной базы, если нет явной причины поступить иначе.
Зачем это спрашивают: Сильный ответ идёт дальше перечисления примеров и объясняет, когда выбирать ту или иную модель.
Middleware, это функция в цепочке запроса-ответа, выполняемая до или после обработчика маршрута.
- Она может читать или менять запрос, вызывать следующий middleware или прервать цепочку, отправив ответ.
- Частые сценарии: парсинг JSON-тела, проверка токенов, логирование запросов, обработка CORS.
- В Express она принимает (req, res, next) и должна вызвать next() для продолжения цепочки.
Зачем это спрашивают: Понимание middleware фундаментально для создания реальных приложений на любом фреймворке, поэтому интервьюеры проверяют и концепцию, и конкретный пример.
Процесс, это независимая программа со своей памятью, поток разделяет память внутри процесса.
- У процесса своё адресное пространство памяти, управляемое ОС.
- Поток, это более мелкая единица выполнения, разделяющая память с другими потоками того же процесса.
- Потоки легко обмениваются данными через общие переменные, но могут повредить общее состояние без синхронизации.
- Node.js работает на одном потоке, но может порождать рабочие потоки или дочерние процессы для CPU-интенсивных задач.
Зачем это спрашивают: Это проверяет понимание основ ОС, которые напрямую влияют на то, как бэкенд обрабатывает конкурентность.
Асинхронное программирование позволяет запустить операцию, продолжить работу и обработать результат позже без блокировки.
- Синхронная блокирующая модель останавливала бы сервер в ожидании каждого запроса к базе данных.
- Асинхронный I/O позволяет одному потоку обслуживать много запросов, уступая управление во время ожидания сети или диска.
- В Node.js это модель по умолчанию; в Python используется asyncio.
Зачем это спрашивают: Интервьюер проверяет, понимаете ли вы на уровне систем, почему важна асинхронность, а не просто знаете синтаксис.
HTTPS, это HTTP поверх TLS: трафик шифруется, а личность сервера проверяется.
- При подключении клиент и сервер выполняют TLS-рукопожатие.
- Сервер предъявляет сертификат, клиент проверяет его через доверенный центр сертификации.
- Они согласовывают симметричный ключ, и все последующие данные шифруются им.
- Это блокирует прослушивание и самозванцев; бэкенд-разработчики настраивают сертификаты через Let's Encrypt или облачный балансировщик.
Зачем это спрашивают: Хороший ответ охватывает и шифрование, и проверку сертификата; слабые ответы упоминают только шифрование данных.
CORS, это механизм безопасности браузера, управляющий кросс-доменными запросами из JavaScript.
- Он ограничивает JS на одном источнике (домен и порт) от вызова другого источника.
- Браузер отправляет заголовок Origin, а сервер отвечает Access-Control-Allow-Origin с разрешёнными источниками.
- Без него вредоносный сайт мог бы делать аутентифицированные запросы через cookies посетителя.
- Настраивается на бэкенде; небраузерные клиенты вроде Postman его игнорируют.
Зачем это спрашивают: Понимание того, что CORS применяется браузером, а не сервером, показывает более глубокое осознание безопасности, чем просто добавление заголовка.
Кэширование сохраняет результат дорогой операции, чтобы последующие запросы пропускали работу.
- Cache-aside: приложение сначала проверяет кэш, при промахе читает базу данных и записывает результат обратно в кэш.
- Write-through: каждая запись идёт сразу и в кэш, и в базу данных, сохраняя синхронизацию.
- Cache-aside, самый частый паттерн, он хорошо сочетается с Redis для результатов запросов или готовых ответов.
Зачем это спрашивают: Название стратегии и объяснение её механики отличает кандидатов, реально реализовавших кэширование, от тех, кто лишь знает о его существовании.
Redis, это хранилище «ключ-значение» в памяти с богатыми типами данных, используемое в основном ради скорости.
- Поддерживает строки, хэши, списки, множества и сортированные множества.
- Кэширование: хранение результатов запросов с TTL во избежание дорогого пересчёта.
- Хранение сессий: данные сессии без обращения к основной базе на каждом запросе.
- Ограничение частоты: инкремент счётчика на пользователя за временное окно.
- Хранение в памяти делает чтение и запись микросекундными в отличие от реляционной базы.
Зачем это спрашивают: Сильные ответы называют конкретные сценарии использования, а не просто говорят, что Redis быстрый.
Миграция, это версионированное изменение схемы базы данных в виде кода, хранящееся в репозитории.
- Примеры: добавление столбца или создание таблицы, записанные как код.
- Инструменты вроде Flyway, Liquibase или Alembic применяют их по порядку и отслеживают выполненные.
- Это делает изменения схемы воспроизводимыми, доступными для ревью и привязанными к коммиту.
- Без миграций ручные изменения трудно воспроизвести в staging, тестовом и production-окружениях.
Зачем это спрашивают: Интервьюер проверяет, относитесь ли вы к изменениям схемы как к полноценным инженерным артефактам, а не к разовым SQL-командам.
Транзакция объединяет SQL-операции в один блок, который либо весь фиксируется, либо весь откатывается.
- Используйте её, когда несколько таблиц должны меняться атомарно, например списание с одного счёта и зачисление на другой.
- Начните с BEGIN, выполните запросы, затем COMMIT при успехе или ROLLBACK при сбое.
- Большинство ORM оборачивают логику в try-catch и откатывают изменения при любом исключении.
Зачем это спрашивают: Сильный ответ включает объяснение, почему атомарность важна, и того, как rollback предотвращает частичные обновления, повреждающие данные.
Операция идемпотентна, если её многократный вызов даёт тот же результат, что и однократный.
- GET, PUT и DELETE идемпотентны по природе; POST по умолчанию нет.
- Это важно, потому что сетевые сбои заставляют клиентов повторять запросы, что грозит двойным списанием или дублями.
- Сделать POST идемпотентным помогает сгенерированный клиентом ключ идемпотентности.
- Перед выполнением операции проверяйте, был ли этот ключ уже обработан.
Зачем это спрашивают: Это показывает интервьюеру, что вы думаете о ситуациях отказа в распределённых системах, а не только о штатном сценарии.
Тип джойна определяет, какие несовпадающие строки вы сохраняете.
- INNER JOIN возвращает только строки с совпадениями в обеих таблицах.
- LEFT JOIN возвращает все левые строки плюс совпадения справа; при отсутствии совпадения столбцы будут null.
- RIGHT JOIN, зеркало: все правые строки независимо от совпадения слева.
- LEFT JOIN используется чаще всего, например все пользователи, включая тех, у кого пока нет заказов.
Зачем это спрашивают: Интервьюеры используют этот вопрос, чтобы убедиться, что вы можете писать запросы с несколькими таблицами без угадывания.
Закрытые вопросы
- 21
Как безопасно управлять секретами и переменными окружения в бэкенд-проекте?
secretsconfig - 22
Что такое Docker и почему он полезен для бэкенд-разработки?
docker - 23
Что такое Dockerfile и что он содержит?
docker - 24
В чём разница между Docker-образом и контейнером?
dockercontainers - 25
Что такое рабочий процесс с feature-ветками в Git и как он работает?
git - 26
Что такое pull request и какова его цель помимо слияния кода?
code-review - 27
Как написать юнит-тест? Что должен проверять один тест?
unit - 28
В чём разница между юнит-тестами, интеграционными тестами и сквозными тестами?
unitintegratione2e - 29
Что такое внедрение зависимостей (dependency injection) и почему оно полезно?
injectiondependencies - 30
Что такое ORM и каковы его компромиссы?
orm - 31
Как защитить API-эндпоинт, доступный только авторизованным пользователям?
endpoints - 32
Что такое SQL-инъекция и как её предотвратить?
sqlinjection - 33
Что такое XSS и касается ли это бэкенд-кода?
xss - 34
Что такое rate limiter и зачем добавлять его к API?
rate-limiting - 35
Как последовательно обрабатывать ошибки в REST API?
restsoft-skills - 36
Что такое пагинация и почему она необходима для эндпоинтов со списками?
endpointspagination - 37
В чём разница между синхронным и асинхронным кодом в Node.js?
async - 38
Что такое цикл событий (event loop) в Node.js?
event-loop - 39
В чём разница между callback, Promise и async/await?
asyncpromisescallbacks - 40
Как правильно обрабатывать отклонённые Promises и ошибки при async/await?
asyncpromises - 41
Как спроектировать базовый процесс регистрации и входа пользователей?
design - 42
Почему для хранения паролей используется bcrypt, а не MD5 или SHA-256?
passwords - 43
Что такое refresh-токен и чем он отличается от access-токена?
tokens - 44
Что такое версионирование API и как его реализовать?
versioning - 45
В чём разница между горизонтальным и вертикальным масштабированием?
scaling - 46
Что такое очередь сообщений (message queue) и когда её стоит использовать?
queues - 47
Что такое пул соединений (connection pooling) в базах данных?
databasepooling - 48
В чём разница между жадной загрузкой (eager loading) и ленивой загрузкой (lazy loading) в ORM?
ormlazy-loading - 49
Что такое составной индекс (composite index) в SQL и когда он полезен?
sqlindexes - 50
Как отлаживать медленный запрос к базе данных?
databasequeries - 51
В чём разница между WHERE и HAVING в SQL?
sql - 52
Когда использовать подзапрос, а когда JOIN?
joins - 53
Что такое HTTP-заголовки? Назовите три важных для бэкенд-API.
http - 54
Что такое webhook и чем он отличается от polling?
webhooks - 55
Как именовать эндпоинты REST API?
restendpoints - 56
В чём разница между монолитной и микросервисной архитектурой?
microservicesmonolith - 57
Что такое CI/CD пайплайн и что он автоматизирует?
ci-cd - 58
Что такое GitHub Actions и как вы использовали его в проекте?
ci-cd - 59
Что такое линтинг и почему он важен в бэкенд-проекте?
linting - 60
На что вы обращаете внимание при ревью pull request коллеги?
code-review - 61
Как подходить к отладке бага, который невозможно воспроизвести локально?
- 62
Что следует логировать в бэкенд-сервисе и на каких уровнях логирования?
logging - 63
Что такое эндпоинт проверки состояния (health check) и почему он полезен?
health-checksendpoints - 64
Что такое балансировка нагрузки и как она связана с запуском нескольких экземпляров бэкенда?
load-balancing - 65
Что может вызывать ошибку 502 Bad Gateway и как её отладить?
gateway - 66
В чём разница между файлом .env и файлами конфигурации приложения?
config - 67
Что такое паттерн singleton и где он встречается в бэкенд-коде?
design - 68
Что такое мемоизация и чем она отличается от общего кэширования?
cachingmemoization - 69
Что такое хэш-таблица и почему поиск в ней в среднем O(1)?
data-structures - 70
Что такое рекурсия и когда предпочтительнее итеративный подход?
recursioniteration - 71
Что такое временная сложность и как вы рассуждаете о ней при написании обработчиков API?
algorithms - 72
Что вызывает ошибку переполнения стека (stack overflow) в бэкенд-процессе?
memoryconcurrency - 73
Что такое сборка мусора (garbage collection) и почему она важна для производительности бэкенда?
gc - 74
Что такое сериализация и десериализация в контексте бэкенд-API?
serializationapi - 75
В чём разница между TCP и UDP и какой из них использует HTTP?
http - 76
Что такое DNS-запрос и как он вписывается в жизненный цикл HTTP-запроса?
http - 77
Что такое CDN и применим ли он к бэкенд-API?
api - 78
Что такое Postman и как вы используете его в разработке API?
api - 79
Как документировать API для других разработчиков?
api - 80
Что такое спецификация OpenAPI (Swagger)?
openapi - 81
Что такое gRPC и как он сравнивается с REST для внутренних сервисов?
restgrpc - 82
В чём разница между аутентификацией на основе сессий и JWT-аутентификацией?
authjwtsessions - 83
Как добавить столбец NOT NULL в большую production-таблицу без простоя?
schema - 84
Что такое мягкое удаление (soft delete) и когда его использовать?
soft-delete - 85
Как обрабатывать загрузку файлов в бэкенд-API?
soft-skillsapi - 86
Что такое фоновое задание (background job) и как запланировать его?
jobs - 87
Как реализовать постраничную навигацию на основе смещения в SQL-запросе?
sqlqueriespagination - 88
Что такое взаимоблокировка (deadlock) в базе данных и как её избежать?
databaselocking - 89
В чём разница между сканированием индекса и полным сканированием таблицы?
indexes - 90
Что такое схема в реляционной базе данных?
databaseschema - 91
Расскажите о проекте, в котором вам пришлось освоить что-то новое для его завершения.
story - 92
Как вы расставляете приоритеты задач при нескольких дедлайнах?
prioritization - 93
Опишите случай, когда вы внесли баг в кодовую базу. Как вы с ним справились?
- 94
Как вы подходите к чтению и пониманию незнакомой кодовой базы?
learning - 95
Как вы сообщаете о техническом блокере команде или менеджеру?
communication - 96
Что вы делаете, когда ревью кода предполагает серьёзные изменения вашей работы?
code-review - 97
Как вы следите за тенденциями и лучшими практиками в бэкенд-разработке?
learning - 98
Опишите, как вы онбордитесь на новый бэкенд-проект в первую неделю.
onboarding - 99
Что такое технический долг и как вы справляетесь с ним будучи junior-разработчиком?
soft-skillstech-debt - 100
Где вы хотите расти как бэкенд-разработчик в ближайший год?
growth