- 55 вопросов для собеседования на прикладного бекенд программиста
- 60 вопросов для собеседования на системного Node.js программиста
- Ответы на все эти вопросы
- Заметки по методике проведения собеседований
- Как проводить собеседования
- Заметки для кандидатов
Прикладной программист пишет продуктовый код, занимается моделированием предметной области и автоматизацией процессов в ней. Прикладному программисту нужно знать node.js как инструмент, его возможности, концепции, преимущества и недостатки, но не нужно глубоко погружаться в код платформы, не нужно строить прослойку между node.js и прикладным кодом, не нужно изобретать фреймворки (внутри продукта), изобретать обобщенные инструменты и библиотеки, не имеющие отношение к предметной области. Если это происходит, то он выполняет две роли - системную и прикладную, они должны быть максимально отделены: отдельные репозитории, отдельное рабочее время и должность, отдельные цели и задачи. Чтобы писать системные вещи смотри вопросы в следующем разделе.
- Что можно сделать с помощью
for await
с объектомrequest: IncomingMessage
? - Чем в ноде нативно хешировать пароли и в каких случаях для этого нужны зависимости?
- Какое API реализует
nodejs/undici
? - Чем современным заменить node:domain API?
- Когда мы можем использовать синхронные версии операций с файлами из
node:fs
вместо асинхронных и на что обращать внимание, принимая такое решение? - Приведите лучшие практики для обработки ошибок в асинхронном коде.
- Как в проектах на ноде могут появиться уязвимости? Объясните на выбор XSS, Path traversal, SQL injection, CSRF? Как от них защищаться?
- Как возможно состояние гонки (race condition) в асинхронном программировании? И как от этого защищаться?
- В чем плюсы и минусы разделения кода на .js и отдельно тайпинги .d.ts?
- Приведите несколько типичных для Node.js паттернов проектирования (по GoF и не только) с примерами.
- В чем заключается проблема толстых контролеров? (с примерами на ноде)
- Приведите примеры протекания абстракций (типичных для ноды).
- Как можно создать
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 символами, например:
знаю / не знаю
илихорошо знаю, справлюсь, слышал, не знаю
. Потом на собеседовании вам останется выяснить, адекватно ли себя оценивает кандидат, проверив всего на нескольких вопросах. А в результате вы получите полную картину.
- Экономьте свое время и время интервьюера, не нужно травить байки и лить воду, говорить намеками. Запишите свой ответ на любой вопрос голосом и прослушайте. Если вы понимаете, что ваша речь невнятна, потренируйтесь, можете взять друга и поговорить с ним. Старайтесь высказываться не заученными выражениями, а поддерживать диалог двух профессионалов.