Вопросы и рекомендации для собеседований по JavaScript и TypeScript. Переводы: EN, UA, RU.
- Как мы можем написать код избегая блокирования цикла событий?
- Как мы можем вывести рантайм из состояния блокировки цикла событий из того же процесса?
- Что такое «callback hell» и как мы можем его избежать?
- Что такое асинхронные генераторы и итераторы, как они работают и каковы варианты их использования?
- Как мы обрабатываем ошибки в асинхронном коде?
- Когда try/catch ловит асинхронные ошибки, а когда нет?
- Какая асинхронная абстракция поддерживает флаг
captureRejectionsи зачем он нужен? - Как мы можем избежать потери шагов стек трейса, улучшить дебаг и понимание потока управления с помощью async/await?
- Как мы можем отменить асинхронные операции?
- Какая разница между асинхронными контрактами: callbacks, events, async/await, promises и т.п.?
- Как связаны асинхронные контракты (callbacks, events, async/await, promises) и можно ли вывести употребления устаревшие?
- Какая разница между
Promise.all()иPromise.allSettled()? - Какая разница между
f2иf3в таком выражении:promiseInstance.then(f1, f2).catch(f3)? - Когда и почему мы можем иметь несколько вызовов catch:
promiseInstance.catch(f1).catch(f2).catch(f3)? - Почему у нас есть метод
Promisefinallyи какие могут быть варианты его использования? - Как мы можем написать асинхронный код с помощью синхронных генераторов? Какие преимущества и недостатки этого подхода?
- Приведите примеры использования
yieldв асинхронном программировании. Как это переписать на современном JavaScript? - Опишите отличия между Web Workers, Shared Workers и Worker Threads.
- Расскажите, что такое микротаски и макротаски и как они связаны с циклом событий?
- Что такое Worker Threads в Node.js и как мы можем их использовать?
- Как мы можем измерить производительность I/O операций и использование ими ресурсов?
- Что такое
process.hrtimeиprocess.hrtime.bigint()? В чем отличие? - Расскажите нам о таком API Node.js:
const { performance } = require('node:perf_hooks'); - Как мы можем эффективно обрабатывать асинхронные запросы API на клиентской стороне, которые возвращают большие объемы данных?
- Как мы можем эффективно обрабатывать запросы API на стороне сервера, асинхронно возвращающие большие объемы данных?
- Как мы можем обеспечить изоляцию состояния между разными асинхронными запросами в одном процессе Node.js?
- Что такое CLS (continuation local storage) и есть ли у нас современная замена этой технике в Node.js?
- Какие фазы цикла событий связаны с незавершенными обратными вызовами?
- Расскажите о контракте
Thenableи его отношении кPromise. - Как мы можем увязать данные (состояние, коллекции, структуры данных) с цепочкой асинхронных вызовов?
- Как мы можем отслеживать цепочку асинхронных вызовов от внешних запросов (идущих от вызова API через HTTP, UDP, IPC, WebSocket)?
- Как мы можем обеспечить безопасную обработку конкурирующих запросов к ресурсу?
- Зачем нам нужны блокировки, например Web Locks API?
- Как мы можем использовать примитивы параллельного программирования (semaphore, mutex, critical section и т.п.) в асинхронном программировании?
- Расскажите о парадигме «Реактивное программирование».
- Какая разница между подходами стримов и сигналов в реактивном программировании?
- Как мы можем избегать deadlocks или выходить из такого состояния в асинхронном коде?
- Как мы можем обеспечить высокую доступность в асинхронных программах?
- Как мы можем обрабатывать асинхронные операции, которые зависят друг от друга (параллельное и последовательное исполнение)?
- Что такое «race condition» и как мы можем этого избегать?
- Предложите случаи использования для
Promise.race,Promise.allиPromise.allSettled. - Что такое throttling и debouncing в контексте асинхронного программирования?
- Как мы можем зашейпить (ограничить) асинхронные вызовы (например, чтобы лучше обрабатывать поток запросов к API)?
- Какие абстракции, реализующие шаблон
Observable, мы имеем JavaScript для серверного и клиентского кода? - Опишите подход
Signalsдля реактивного программирования. - Почему Streams полезны для улучшения семантики кода как абстракции высокого уровня?
- Что такое back pressure?
- Какая разница между созданием
Streamс помощьюextendsи передачей функцииread,writeилиtransformк конструктору? - Почему у нас есть три набора таймеров: в глобальном контексте (например,
setTimeout),node:timersиnode:timers.promises? - Какие promisified API вы знаете, и как мы можем вручную промисифицировать другие API?
- Расскажите о тестировании асинхронного кода.
- Почему TypeScript не может описать асинхронные контракты во всем аспектам?
- Как мы можем предотвратить утечки памяти (memory leaks) в асинхронном коде?
- Какие лучшие практики управления параллелизмом в JavaScript?
- Как мы можем использовать async/await вместе с
EventEmitter? - Какая разница между
EventEmitterиEventTarget? - Какова роль ключевого слова
awaitв асинхронных функциях? - Что произойдет, если мы используем
awaitне сPromiseзначениями (или выражениями)? - Как мы можем добавить тайм-ауты в асинхронных операциях (например для await)?
- Для чего используется метод
process.nextTick? - Как мы можем создать собственные асинхронные итераторы и какие варианты их использования?
- Каковы преимущества и недостатки использования асинхронных библиотек сторонних разработчиков, таких как полифилы для
Promiseилиasync.js? - Как мы можем работать с асинхронным кодом в устаревших системах?
- Какая разница между асинхронными, параллельными и I/O операциями?
- Как мы можем эффективно распараллелировать I/O операции?
- Как мы можем обеспечить потокобезопасность в асинхронном программировании?
- Как
Atomicsсвязано с асинхронным и параллельным программированием? Зачем они используются? - Как мы можем оптимизировать асинхронный код для производительности (performance)?
- Как мы можем обрабатывать повторы (retries) вызовов, вычислений, доступа к ресурсам в асинхронном программировании?
- Каковы типичные подводные камни асинхронного программирования?
- Как мы можем использовать async/await функции вместе с
Array.prototype.map? - Как мы можем эффективно дебожить асинхронный код?
- Как можно обеспечить согласованность данных в асинхронных операциях?
- Каковы преимущества использования
async/awaitнад обратными вызовами (callbacks)? - Какие операции нельзя перевести с обратных вызовов (callbacks) на синтаксис
async/awaitно можно наPromises? - Предложите кейсы использования для
AbortSignal.timeout(). Какие известные API это поддерживают? - Где и для каких целей мы можем использовать
AbortSignal.any(iterable)? - Какие различия между методами
Promise:resolveиreject? - Как мы можем обрабатывать ошибки в
Promise.all? - Как мы можем делать chain (последовательно композировать) асинхронные операции? Пожалуйста, предложите случаи тех контрактов, которые знаете.
- Какова роль event loop в асинхронном программировании?
- Как мы можем обрабатывать длительные асинхронные операции? (Процессы могут прекратить работу, результаты могут устареть и т.д.)
- Как мы можем обеспечить идемпотентность в асинхронных операциях и когда нам это нужно?
- Можем ли мы написать приложение реального времени на JavaScript и асинхронном программировании?
- Как мы можем обеспечить порядок асинхронных операций? Пожалуйста, подскажите, когда мы можем иметь проблемы.
- Как мы можем работать с асинхронным кодом в системах высокой доступности?
- Что такое observables и как мы можем их использовать в JavaScript?
- Каковы основные проблемы обработки состояния в асинхронном коде в stateful системах?
- Когда мы можем использовать внутренние асинхронные очереди и когда нам нужны внешние системы очередей?
- Как мы можем использовать асинхронные функции с кэшированием, memoization и повторными вычислениями для обновления состояния?
- Как мы можем использовать асинхронные функции с подключениями к базе данных? Приведите примеры.
- Как мы можем отделить асинхронный код от бизнес-логики и почему нам это нужно делать?
- Каково влияние асинхронного кода на операции, связанные с процессором, а не на I/O операции?
- Какие вещи в асинхронном программировании следует делать из соображений безопасности?
- Как мы можем реализовать очередь с приоритетами для асинхронных задач?
- Как можно использовать асинхронные функции с операциями файловой системы?
- Как мы можем обеспечить атомарность в асинхронных операциях и зачем?
- Какие есть компромиссы при віборе между использованием
Promiseиasync/await? - Какая разница между классическим асинхронным программированием и подходом RxJS?
- Что такое асинхронные коллекции и как они могут улучшить работу разработчика?