Backend Node.js — техническое интервью

60 минут, middle → senior. Node.js 20+, event loop, Express/Fastify, async, тесты.

Questions
14
Live coding
2

Разогрев: опыт и контекст

  1. Недавний проект

    BehavioralEasy

    Расскажите о недавнем проекте, где вы были ключевым разработчиком. Что делали вы лично?

    Scoring rubric (0–10)
    3–5: Описывает проект общими словами, свою роль называет расплывчато («участвовал в команде»).
    6–8: Конкретная задача, стек, результат; понятна личная зона ответственности.
    9–10: Контекст бизнеса, trade-offs, метрики успеха; честно говорит, что делали другие.
    Красный флаг: не может назвать ни одного решения, которое принимал сам.
    Interviewer notes
    Follow-up: что бы сделали иначе? 3–4 минуты.
  2. Мотивация смены

    BehavioralEasy

    Почему сейчас рассматриваете новые возможности? Что ищете в следующей роли?

    Scoring rubric (0–10)
    3–5: «Хочу роста / денег» без конкретики.
    6–8: Понятные критерии (стек, продукт, процессы); не toxic про текущего работодателя.
    9–10: Осознанный fit: что даст компания кандидату и наоборот.
    Красный флаг: только негатив про прошлые команды, обвиняет всех кроме себя.
    Interviewer notes
    Не давить — достаточно 2–3 минут.
  3. Опыт с Node.js

    BehavioralEasy

    Сколько лет пишете на Node.js? Какие фреймворки и версии использовали в продакшене?

    Scoring rubric (0–10)
    3–5: «Несколько лет Node», без фреймворков и версий.
    6–8: Express/Fastify/Nest; LTS vs current; типичный тип проекта (API, BFF).
    9–10: Миграции CommonJS → ESM; осознанный выбор runtime (Node vs Bun/Deno) с trade-offs.
    Красный флаг: путает Node с «просто JavaScript на фронте» на middle+.
    Interviewer notes
    2–3 минуты.

Runtime и async

  1. Event loop

    TheoryMedium

    Объясните, как Node.js обрабатывает I/O и CPU-bound код. Что такое libuv?

    Scoring rubric (0–10)
    3–5: «Node однопоточный, async быстрый» без деталей.
    6–8: Call stack + thread pool; microtasks vs macrotasks; блокировка loop тяжёлым CPU.
    9–10: setImmediate vs process.nextTick; worker_threads; UV_THREADPOOL_SIZE на бытовом уровне.
    Красный флаг: «async делает код параллельным на всех ядрах».
    Interviewer notes
    Follow-up: что будет с sync fs.readFileSync в handler? 4 мин.
  2. Promises и async/await

    TheoryMedium

    В чём разница между Promise.all, allSettled и race? Когда await в цикле — проблема?

    Scoring rubric (0–10)
    3–5: «all ждёт все промисы» без нюансов fail-fast.
    6–8: all vs allSettled; sequential await в for — N× latency; Promise.all для параллели.
    9–10: Error propagation; unhandled rejection; p-limit / semaphore patterns.
    Красный флаг: try/catch вокруг map без await all.
    Interviewer notes
    4 минуты.
  3. Middleware в Express

    TheoryMedium

    Как работает цепочка middleware? Что делает next() и next(err)?

    Scoring rubric (0–10)
    3–5: «Функции по порядку» без ошибок.
    6–8: req/res/next; error middleware 4 args; порядок регистрации важен.
    9–10: Async middleware pitfalls; composition vs monolith router; security headers early.
    Красный флаг: забывает return после res.send и вызывает next дважды.
    Interviewer notes
    4 минуты.
  4. Утечки памяти

    TheoryHard

    Какие типичные утечки памяти встречаются в Node.js сервисах и как их искать?

    Scoring rubric (0–10)
    3–5: «GC всё почистит».
    6–8: Closures на большие объекты; глобальные Map/cache без TTL; event listeners.
    9–10: heap snapshot / clinic.js; weak refs; graceful shutdown и drain connections.
    Красный флаг: unbounded in-memory cache «для скорости» без eviction.
    Interviewer notes
    5 минут.
  5. Зависимости и lockfile

    TheoryEasy

    Зачем package-lock.json? Чем npm ci отличается от npm install?

    Scoring rubric (0–10)
    3–5: «Lock фиксирует версии» без CI контекста.
    6–8: Deterministic installs; ci читает lock без обновления; semver ranges.
    9–10: Supply chain (audit, pinned transitive); monorepo workspaces.
    Красный флаг: «lock не коммитим».
    Interviewer notes
    3 минуты.

Практика: живой код

  1. In-memory rate limiter

    Coding taskMediumCode

    Реализуйте функцию isAllowed(key, limit, windowMs), которая возвращает true, если запросов от key не больше limit за последние windowMs миллисекунд.

    Scoring rubric (0–10)
    3–5: Счётчик без окна или без очистки старых меток.
    6–8: Map key → timestamps[]; фильтрация по window; O(k) на ключ приемлемо на интервью.
    9–10: Sliding window counter; обсуждает Redis для multi-instance; memory bounds.
    Красный флаг: глобальный счётчик на все ключи.
    Interviewer notes
    15 минут.
  2. Parse query string

    Coding taskMediumCode

    Напишите функцию parseQuery(qs), которая разбирает строку вида a=1&b=2&a=3 в объект { a: ['1','3'], b: ['2'] } (повторяющиеся ключи — массив).

    Scoring rubric (0–10)
    3–5: split по & и = без decodeURIComponent и дубликатов.
    6–8: decodeURIComponent; массив для повторов; пустые значения.
    9–10: Edge cases (+ as space legacy); не использует URLSearchParams слепо без обсуждения API.
    Красный флаг: теряет второе значение a.
    Interviewer notes
    10 минут.

API и надёжность

  1. REST и идемпотентность

    TheoryMedium

    Как спроектируете POST /payments и PUT /payments/{id}? Что такое идемпотентность и где она критична?

    Scoring rubric (0–10)
    3–5: «POST создаёт, PUT обновляет» без idempotency keys.
    6–8: Idempotency-Key header; retry-safe; статус-коды 201/409.
    9–10: Outbox pattern; exactly-once illusion; webhook dedup.
    Красный флаг: POST без защиты от double-charge при retry.
    Interviewer notes
    4 минуты.
  2. Логи и метрики

    TheoryMedium

    Что логируете в production API? Чем structured logging лучше console.log?

    Scoring rubric (0–10)
    3–5: «Логируем ошибки».
    6–8: requestId/correlationId; JSON logs; уровни; не логировать PII/secrets.
    9–10: RED/USE metrics; OpenTelemetry traces; sampling.
    Красный флаг: логирует пароли и токены «для отладки».
    Interviewer notes
    4 минуты.

Инженерная культура и вопросы

  1. Конфликт в команде

    BehavioralMedium

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

    Scoring rubric (0–10)
    3–5: «Конфликтов не было» или история без своих действий.
    6–8: Описывает ситуацию, свою позицию, итог; без обвинений.
    9–10: Фокус на данных/компромиссе; что изменил в процессе после.
    Красный флаг: «я был прав, они нет» без рефлексии.
    Interviewer notes
    Follow-up: чему научились? 4 минуты.
  2. Вопросы к нам

    BehavioralEasy

    Какие вопросы у вас к нам про команду, продукт или процессы?

    Scoring rubric (0–10)
    3–5: «Нет вопросов» или только про отпуск/ЗП.
    6–8: 2–3 содержательных вопроса про продукт, команду, релизы.
    9–10: Вопросы показывают, что изучил компанию; уточняет ожидания от роли.
    Красный флаг: нулевой интерес к продукту на middle+.
    Interviewer notes
    Оставить 3–5 минут в конце интервью.

Run an interview with this template

Sign up free: copy the template to your org, schedule an interview, and run it in a room with live coding.

Get started in FlashTalk