Interview questions and recommendations for app and system backend developers.
- 55 Interview Questions for Applied Node.js Backend Engineer
- 60 Interview Questions for System Node.js Backend Engineer
- Answers to these questions
- Notes on Interview Techniques
- How to Conduct Interviews
- Notes for Candidates
- Links
An application programmer developes product, domain model, domain logic and processes. An application programmer needs to know node.js as a tool, its capabilities, concepts, advantages and disadvantages, but does not need to dive deeply into the platform code, does not need to build a layer between node.js and application code, does not need to invent frameworks (within the product), invent generic tools and libraries that are not domain specific. If this happens, he performs both roles - system and applied, they should be separated as much as possible: separate repositories, separate working hours and position, separate goals and tasks. If you need questions for system developer see the next section.
- What can you do with
for await
on arequest: IncomingMessage
instance? - How does node.js natively hash passwords and in what cases we need external dependencies for this?
- What API does
nodejs/undici
implement? - What is a modern replacement for the
node:domain
API? - When can we use synchronous versions of file operations from
node:fs
instead of asynchronous ones and what should we look for when making such a decision? - Propose best practices for handling errors in asynchronous code.
- How can vulnerabilities appear in node projects? Explain on of the following for your choice: XSS, Path traversal, SQL injection, CSRF? How to prevent them?
- How is a race condition possible in asynchronous programming? And how to protect your code from it?
- What are the pros and cons of splitting code into .js and separate .d.ts typings?
- Give several typical design patterns for Node.js (based on GoF and not only) with examples.
- В чем заключается проблема толстых контролеров? (с примерами на ноде)
- Приведите примеры протекания абстракций (типичных для ноды).
- Как можно создать
Singleton
с помощью системы модульности в ноде? - Как проще всего реализовать паттерн Strategy на JavaScript (и где его использовать в ноде)?
- Приведите пример паттерна
Adapter
из встроенных библиотек ноды (есть несколько). - Какой паттерн проектирования реализует
EventEmitter
? - Как связаны контракты
EventEmitter
иReadable
? - Какие вы можете привести антипаттерны (или примеры плохого стиля) программирования для node.js?
- Зачем нам следующие поля
Error: error.cause, error.code, error.message, error.stack
? - Как скопировать папку с вложенными файлами и папками с помощью
node:fs
? - Можем ли мы делать real-time приложения на Node.js?
- Какие есть подходы к логированию? Их отличия, плюсы и минусы.
- Где хранить секреты? (ключи api, точены и пароли от баз данных)
- Почему нужно делать
return await
внутри асинхронных функций и методов а не возвращать промис? - Как не заблокировать обслуживание других пользователей, обрабатывая запрос от одного из них?
- Что делать если обработка запроса привела к необходимости завершить процесс (ведь он обслуживает много запросов параллельно)?
- Какие стили и парадигмы программирования вы используете в node.js приложениях? Почему?
- В чем слабые стороны node.js? Что на ноде писать плохо или невозможно?
- В чем разница между stateful and stateless подходами для node.js приложений? Как выбрать?
- Как ограничить пропускную способность эндпоинта (кол-во запросов в единицу времени)?
- В чем опасность примесей (mixins) для прикладного кода? (с типичными примерами на Node.js)
- Как реализовать архитектурную границу в приложениях на node.js?
- Что такое DI (внедрение зависимостей) и как его реализовать на ноде? (желательно несколько вариантов)
- Почему middleware является антипаттерном? И как писать без него?
- Как снизить зацепление кода в приложениях на node.js?
- Почему нужно добавлять префикс node: при загрузке встроенных модулей?
- Зачем нужен
AbortController
? Приведите примеры API, где он используется. - JSON сериализация и десериализация может работать долго и заблокировать поток, что с этим делать?
- Как могут утечь все соединения из пула конекшенов к базе данных и как это предотвратить?
- Как вы организовываете слой доступа к данным?
- В чем преимущество
async/await
и промисов перед callback в ноде? Где невозможно обойтись без callback? - Что делать, если в двух частях одного приложения вам нужны разные версии npm зависимостей?
- Какие Web API появились в ноде в последнее время и зачем их туда тянут?
- Что можно использовать вместо устаревших pm2 и forever в современном мире?
- Как сделать бизнес-логику независимой от фреймворка и от протокола, через который приходят запросы?
- Почему нам больше не нужны axios, request, node-fetch?
- Для чего нам могут быть необходимы очереди внутри приложения и внешние MQ системы?
- Чем может быть опасно, если зависимость патчит глобальные объекты, классы и прототипы?
- Что такое Node.js LTS и что он нам дает?
- Для чего нам Websocket, почему в 2023 брать socket.io плохой вариант и что брать для Websocket?
- Что дает флаг
--watch
? - В каком состоянии сейчас нативный test runner в node.js?
- Есть ли возможность в node.js поставлять приложение в виде одного исполняемого файла, как и зачем?
- Какие есть способы трекинга асинхронных контекстов и нужны ли они вообще?
- Когда и как нужно обновлять версии node.js в проектах?
Системный (платформенный) программист пишет код, не связанный с предметной областью: фреймворки, сетевые протоколы, транслятор, компиляторы, интерпретаторы, библиотеки, занимается вещами, которые могут быть переиспользованы в сотнях и тысячах разных проектов. Это называется производство средств производства. Систем программисту нужно знать node.js гораздо глубже, не только, его возможности, концепции, преимущества и недостатки, но и недокументированные возможности и даже баги, особенности платформы, которые очень редко используются, потому, что он строит прослойку между node.js и прикладным кодом, а прослойка эта позволяет делать прикладной код более абстрактным и приближенным к предметной области.
- Чего не хватает в ESM, но есть (поддерживается) в CJS?
- Для чего используется new
Error.captureStackTrace
? - Почему node.js не однопоточный? Докажите, что даже не был однопоточным.
- Как связаны
node:async_hooks
иAsyncLocalStorage
? - Какие в ноде встроенные средства сериализации аналогичны JSON только для бинарной сериализации?
- Как следить за изменениями файлов и директорий на диске и какие с этим могут возникать проблемы?
- Чем заменить deprecated
fs.exists
и почему его выпиливают из ноды? - Что такое back pressure для стримов и какая проблема была бы без него?
- Как защитить
SharedArrayBuffer
от записи из разныхworker_threads
? - Докажите, что любой модуль в ноде при загрузке оборачивается в функцию и создает замыкание?
- Где в ноде используется паттерн Revealing constructor (открытый конструктор, есть много таких мест)?
- Как сделать переопределение write для экземпляра
Writable
без создания класса наследника? - В чем причина медленных вызовов из JavaScript кода к аддонам на C, C++ или подключенных через N-API?
- Что такое
MessagePort
иBroadcastChannel
? - Чем отличаются
fs.stat, fs.fstat, fs.lstat
? - Почему важно выполнять правило
eslint: consistent-return
учитывая оптимизацию v8? - Зачем в ноде есть WASI и какие возможности он нам дает?
- Что можно сделать при помощи node:vm (любые примеры)?
- Какие вы знаете deprecated API и какова стратегия их вывода из употребления?
- Какие вы знаете проблемы, баги и узкие места в node.js?
- Объясните, как можно написать (или напишите) адаптеры асинхронности
promisify
иcallbackify
? - Почему у event loop есть фазы? Почему мало одной очереди?
- Чем отличаются микротаски и макротаски?
- В чем особенности обработки uncaught exceptions в Node.js?
- Чем отличаются
nextTick
,setImmediate
иsetTimeout
? - Зачем есть
ref()
иunref()
у таймеров, сокетов, серверов и других подобных классов? - Почему
server.connections
сделали deprecated и что как теперь получить подключения? - Перечислите основные случаи, приводящие к утечке памяти и как с этим бороться?
- Чем отличается
node:cluster
иnode:child_process
? И когдаcluster
может становиться узким местом? - В каких случаях нужно отключать автоматическую сборку мусора и брать ее вызов в свои руки?
- Какие есть способы отладки приложений и в каких случаях вы их используете?
- Как сбросить кеш require для определенной библиотеки? Как быть в случае ESM?
- Откуда берутся идентификаторы
__dirname
и__filename
,require
иimport
,fetch
иArray
? - Почему следует отказаться от использования библиотеки
node:url
? - Какие можно предложить стратегии масштабирования для приложений на ноде? Сравните их.
- Чем отличаются cpu-intensive, ram-intensive и io-intensive задачи? Приведите примеры.
- Почему не нужно использовать
process.on('multipleResolves', handler)
? - Расскажите, на что влияет опция
noDelay
у серверов, методsetNoDelay
у request и socket? - Как работает
keep-alive
в http протоколе и как мы можем управлять им из ноды? - Для чего используется модуль
node:perf_hooks
? И может ли он работать с воркерами? - Что вы думаете про экспериментально API итерируемых методов (filter, map, reduce...) у стримов?
- Какие вы знаете способы интернационализации приложений?
- Используете ли вы встроенный test runner и библиотеку
node:assert
? - Какие вы использовали ключи при запуске ноды?
- Как сдампить хип процесса и что с ним дальше делать?
- Как построить flame graph?
- Расскажите про ALPN и SNI и их поддержку в ноде.
- Как реализовать автоматическую перезагрузку процесса нативными средствами при изменении кода?
- Для чего нам модуль, который называется модуль, а именно
node:module
? - Как работать с самоподписанными SSL сертификатами? И в чем ограничение их использования?
- Для чего в node.js есть Web Crypto API и в чем разница с
node:crypto
? - Для чего в node.js есть Web Streams API и в чем разница с
node:stream
? - Для чего нужны классы
Blob
иFile
изnode:buffer
? - В чем разница моделей прав доступа
module-based
иprocess-based
? - Что и почему было deprecated в
node:async_hooks
? - Для чего нужен класс
AsyncResource
и как им пользоваться? - Как найти вызовы всех deprecated API в node.js приложении?
- Как работать с зависимостями в single executable?
- Знаете ли вы о проблемах с нативным test runner в node.js?
- Какие новые возможности JavaScript появились в node.js при обновлении до версий 18 и 20?
Если вас интересуют ответы, то тут у меня самый большой бесплатный курс по ноде, который обновляется каждый год: https://github.com/HowProgrammingWorks/Index/blob/master/Courses/NodeJS.md а тут новый практически курс с ревью кода, созвонами по 2 раза в неделю, ответами на вопросы, лайвкодингом и большим архивом решений даля практических задач: https://github.com/HowProgrammingWorks/Index/blob/master/Courses/NodeJS-2022-2023.md И там и там есть все ответы.
- Я сторонник того, чтобы давать людям на собесах возможность листать доки, гуглить и даже спрашивать у нейронок. Что должен проверять собес? Эффективность, способность решать задачи, а не задротство, зубрежку и феноменальную память. Если вы начнете это делать, то внезапно для себя выявите, что даже при этом многие люди не справляются, полный интернет шедевров говнокода, оверинженеринга и архитектурного маразма. Еще мне важно, чтобы человек показал свое субъективное мнение, даже эмоциональную позицию по отношению к конкретным решениям и технологиям, именно это он будет проявлять в работе. А что сейчас на собесах происходит: эффект ивентлупа — люди вызубрили и могут наизусть рассказать фазы и красиво объяснить, а применить для принятия решений в коде не смогут, т.е. оно ничего не дает им в каждодневной работе.
- Эти вопросы можно задавать любому уровню (джун, мидл, синьор), потому, что эти уровни релевантны только внутри конкретной компании или даже уже - продуктовой команды, а так, каждый из уровней ответит на них с разной степенью глубины.
- Прикладной и системный программисты - это две разные специальности, как водитель и автомеханик. Оба они знают что такое двигатель, сцепление, тормоза, рессоры, но работа заключается в разном, хоть автомеханик тоже может водить машину, а некоторые водители умеют их чинить.
- Время собеседования ограничено, мы не можем позволить себе вести время по 2-3 часа на человека. Писать код на собеседованиях - это обычно долго и неэффективно (но иногда можно, если это всем комфортно и если код концептуальный, иллюстративный и не длинный).
- Давайте список вопросов заранее, например за неделю или вообще публикуйте список специально для вакансии заранее, вот прям много вопросов, 100-200 и попросите промаркировать соискателя 2-4 символами, например:
знаю / не знаю
илихорошо знаю, справлюсь, слышал, не знаю
. Потом на собеседовании вам останется выяснить, адекватно ли себя оценивает кандидат, проверив всего на нескольких вопросах. А в результате вы получите полную картину.
- Экономьте свое время и время интервьюера, не нужно травить байки и лить воду, говорить намеками. Запишите свой ответ на любой вопрос голосом и прослушайте. Если вы понимаете, что ваша речь невнятна, потренируйтесь, можете взять друга и поговорить с ним. Старайтесь высказываться не заученными выражениями, а поддерживать диалог двух профессионалов.