Збірка питань зі співбесід на вакансію Middle JavaScript розробника

  • 5 марта, 11:23
  • 4801
  • 1

Автор матеріалу: Bohdan Prokopovych, Full-Stack JavaScript Developer

За останній рік я пройшов 12+ співбесід на вакансію Middle JavaScript розробника в різноманітних компаніях, від гігантських гігантів до крихітних стартапів. Вирішив зібрати список питань, які мені задавали на цих співбесідах. Ше трохи питань підкинув мій друг Макс Козак.

Має бути корисно тим, хто хоче підтягнути свій рівень до мідла, освіжити якісь речі в пам'яті, або тим, кому треба співбесідувати мідлів.

Збірка питань зі співбесід на вакансію Middle JavaScript розробника

Загальне

  • Шо таке рекурсія?                  
  • Як уникнути переповнення стеку при використанні рекурсії? (або: що таке хвостова рекурсія?)
  • Шо таке ідемпотентність?
  • Шо таке функтор?
  • Шо таке currying?
  • Шо таке асинхронність і шо — багатопотоковість?
  • Шо таке ітератор?
  • Які ти знаєш парадигми програмування? Які парадигми присутні в JS?
  • Яка різниця між об'єктно-орієнтованим і функціональним програмуванням? Які переваги/недоліки ООП і функціонального програмування?
  • Які елементи функціонального програмування є у JS? (варто згадати map, reduce, functions as first-class objects, higher order functions...)
  • Які переваги і недоліки монолітної архітектури та мікросервісної архітектури?
  • Які ти знаєш структури даних?             
    • Шо таке бінарне дерево?
    • Шо таке АВЛ-дерево?
    • Шо таке хеш-таблиця? Які є способи вирішення колізій в хеш-таблицях?
  • Які ти знаєш алгоритми сортування?
  • Шо таке обчислювальна складність алгоритму? Як вона вимірюється?
  • Яка складність пошуку елементу в масиві?
  • Яка складність пошуку елементу в хеш-таблиці?
  • Як ти розумієш MVC, в чому його переваги?
  • Шо таке content delivery network? Як вони працюють?
  • Шо таке горизонтальне і вертикальне масштабування?
  • Шо таке continuous integration/continuous deployment?
  • Яка різниця між авторизацією і автентифікацією?
  • Які способи організації сесій ти знаєш?          
  • Як працює JSON Web Token?
  • Які патерни проектування ти використовував?      
  • Які можеш пояснити?
  • На які групи поділяються патерни?
  • Яка різниця між патернами Publish/Subscribe i Observer?
  • Поясни Dependency Injection.
  • Шо ти знаєш про SOLID?
  • Поясни кожну букву.

Основи JS

  • Які сильні та слабкі сторони JavaScript? (з сильних сторін можна згадати простоту, прототипне наслідування, підтримку функціонального програмування, можливість писати фронт- і бек-енд на одній мові, і тд і тп; зі слабких — високі коефіцієнти WTF i WAT для розробників, які приходять з С-подібних мов).
  • Які типи є у JavaScript?             
    • Які примітивні типи є у JavaScript?
  • В чому різниця між примітивами та не примітивами?
  • Яка різниця між == і ===?
  • Шо таке замикання?             
    • Для чого використовують замикання?
    • Шо таке контекст функції?
  • Шо таке hoisting?
  • Шо таке функція?                  
    • Яка різниця між функцією і звичайним об'єктом?
  • Які відмінності між var, let i const?                  
    • Чим відрізняється hoisting у var, let i const?
    • Що таке мертва зона (dead zone)?
    • Чи можна змінювати об'єкт, якщо він оголошений через const? (Наступне питання: як зробити так, щоб об'єкт таки не можна було змінювати?)
  • Яка різниця між scope і областю видимості? (Тут ти маєш розгубитись; різниці, ясно шо ніякої).
  • Шо таке this?          
    • Поясни, як працює this.
    • Яка різниця між this і контекстом функції?
  • Чим відрізняються callback, Promise i async/await?                  
    • Які проблеми є в колбеків, але відсутні у промісів?
    • Які проблеми є у промісів, але відсутні в колбеків?
  • Чим модель наслідування у JavaScript відрізняється від моделей у більшості інших мов програмування?                  
    • Які переваги і недоліки прототипного наслідування та класового наслідування?
    • Коли краще використати класове наслідування, а коли прототипне?
    • Поясни, як працює прототипне наслідування.
    • Шо таке class у JavaScript? Яка різниця між class та функціями-конструкторами?
    • Шо таке factory function?
    • Шо означає «favor object composition over inheritance»?
    • Шо таке concatenative inheritance?
    • Шо ти чув про gorilla-banana problem?
  • Чи є різниця між звичайний об'єктом (plain object) та Map?             
    • Яка різниця між Map та WeakMap? Між Set та WeakSet?
  • Якими способами можна створити об'єкт в JavaScript?
  • Шо таке і як працюють Object.create() та Object.assign()?
  • Розкажи про bind(), call() i apply().
  • Шо таке strict mode?
  • Яка різниця між звичайними функціями та arrow functions?
  • Шо робить for ... of?

Node.js

  • Як працює асинхронність в Node.js?                  
    • Як Node.js працює з потоками?
  • Для яких випадків Node.js сервер підходить добре, а для яких погано?
  • Шо таке event loop?                  
    • Як працює event loop? З яких фаз складається кожна ітерація? Що відбувається в кожній фазі?
    • Шо таке таски і мікротаски?
  • Як за допомогою Node.js працювати з великими об'ємами даних? (Наступне питання: шо таке Stream?)             
    • Які є види стрімів? Яка різниця між Duplex, Transform i PassThrough стрімами?
  • Як запустити Node процес так, шоб він жив «вічно»? (або: щоб він перезапускався, коли падає помилка).
  • Як працює модульна система в Node.js?             
    • Які типи модулів ти знаєш?
    • В чому різниця між require/module.exports в Node.js та import/export в ES6?
    • Шо ти можеш розказати про кешування модулів?
  • Шо таке process.nextTick()?
  • Для чого використовується модуль child_process?
  • Які є способи масштабувати Node.js сервер?

Front-end

  • Шо таке single-page application?       
    • Які переваги SPA над варіантом, коли кожну сторінку рендерить сервер?
  • Як працює server-side rendering?       
    • Які переваги SSR? Нашо його використовувати?
    • Як взаємодіють SSR та SPA?
  • Шо таке компонента?
  • Шо таке flash of unstyled content і як його уникнути?
  • Як можна пришвидшити завантаження сторінки?
  • З якими CSS процесорами ти працював?       
    • Яка різниця між пост-процесорами і пре-процесорами? В чому їх недоліки і переваги над звичайним CSS?
  • Шо таке CORS?
  • Як різні фреймворки виявляють, шо на сторінці змінилось і шо треба це перемалювати?
  • Шо таке two-way i one-way data binding?
  • Які ти знаєш CSS технології для побудови layout-ів?   
    • Шо ти можеш розказати про CSS Grid?

Бази даних

  • В чому різниця між реляційними і нереляційними базами даних?       
    • Які переваги/недоліки кожної?
    • В яких випадках краще використовувати реляційні БД, і в яких — нереляційні?
  • Які є види JOIN'ів? Поясни відмінності між ними.
  • Як працюють індекси?       
    • Чому не варто додавати індекси на всі поля таблиці?
  • Як масштабувати бази даних?
  • Шо таке нормальні форми БД?
  • Які є способи оптимізації складного повільного запиту, який робить багато JOIN'ів?

Передача даних в мережі

  • З яких частин складається HTTP запит?
  • На які групи поділяються HTTP статус-коди?
  • Чим відрізняється HTTP/2 від попередньої версії? Які переваги HTTP/2?
  • Шо таке REST?                  
    • Які ключові властивості REST? (йдеться про statelessness і тд.)
    • Які HTTP методи використовуються в REST і для чого?
    • Що таке «ресурс» в термінах REST?
  • Як працюють вебсокети?                  
    • Яким чином можна влаштувати авторизацію для захищеного обміну повідомленнями через вебсокети?
  • Шо таке long-polling?
  • Шо таке і як працює HTTPS?                  
    • Для чого використовувати HTTPS? Від яких атак він захищає?
    • Хто і на яких підставах може видати тобі SSL сертифікат?
    • Які бувають типи сертифікатів?
  • Які заголовки використовуються для роботи з кешуванням?
  • Якомога детальніше опиши, шо відбувається з того моменту, як ти ввів адресу сайту в адресний рядок і натиснув Enter, до того моменту, як сторінка завершила завантажуватись.
  • Як працює gzip стиснення при передачі даних через HTTP?
  • Шо таке SOAP?

Security

  • Які види атак ти знаєш?
  • Як краще зберігати паролі користувачів в БД?        
    • Як краще зберігати дані платіжних карток користувачів в БД?
  • Шо таке брутфорс?           
    • Як уникнути брутфорсу?
    • Шо таке сіль (salt) і перець (pepper) в термінах хешування паролів? Для чого використовується кожне з них?
  • Шо таке XSS і як від цього захиститись?
  • Шо таке CSRF?
  • Шо таке SQLін'єкції і як від них захиститись?
  • Шо таке timing attack?

Тестування

  • Шо таке TDD?
  • Шо таке BDD?
  • Які є види тестів? Для чого використовується кожен з них?

Системи контролю версій

  • Якими системами для контролю версій ти користувався? (але по SVN мене ніколи нічого не питали, та і не дивно в принципі).
  • Для чого використовують git bisect?
  • Яка різниця між git rebase i git merge?

Задачки

  • Напиши функцію runOnce(), яка дозволить робити таке:

function doSomeShit(param) {
  console.log(`${param} is shit.`);
}

const doSomeShitOnce = runOnce(doSomeShit);
doSomeShitOnce(5); // 5 is shit
doSomeShitOnce('blah'); // Error: This function can be run only once

  • Напиши функцію isPalindrome() для перевірки, чи є задане слово паліндромом. Чим більше способів розв'язку ти наведеш, тим краще.

isPalindrome('abacaba'); // true
isPalindrome('qwerty'); // false

  • Напиши таку ж функцію в один рядок.
  • Назви переваги і недоліки кожного варіанту вирішення цієї задачі.
  • Напиши функцію showAdditions(), яка для числа будь-якої довжини повертає рядок з розбиттям цього числа на суму його розрядів. 

showAdditions(456); // "400+50+6"
showAdditions(8274); // "8000+200+70+4"
showAdditions(15040); // "10000+5000+40"

  • Напиши таку ж функцію в один рядок.
  • Напиши функцію flatten() для сплющування вкладених масивів. 

flatten([3, 5, [7], [1, [[22]], [[6], 3]]]); // Array [ 3, 5, 7, 1, 22, 6, 3 ]

  • Напиши таку ж функцію в один рядок.
  • В якому порядку виведуться логи?

console.log('script start');

setTimeout(function() {
  console.log('setTimeout');
}, 0);

Promise.resolve().then(function() {
  console.log('promise1');
}).then(function() {
  console.log('promise2');
});

console.log('script end');

  • Напиши функцію splitToBanknotes(), яка приймає певну суму грошей і повертає об'єкт, де ключами є номінали банкнот, а значеннями — скільки куп'юр такого номіналу треба, аби разом вийшла задана сума. Кількість банкнот має бути мінімальною.

splitToBanknotes(542); // Object { 1: 0, 2: 1, 5: 0, 10: 0, 20: 2, 50: 0, 100: 0, 500: 1 }
splitToBanknotes(84); // Object { 1: 0, 2: 2, 5: 0, 10: 1, 20: 1, 50: 1, 100: 0, 500: 0 }

Джерело


1 комментарий
Сортировка:
Добавить комментарий
Vladimir Pitchkurov
Vladimir Pitchkurov 2020, 9 марта, 17:26
0

Спасибо! Статья хорошая. Довольно жесткое и стрессовое собеседование было бы, если бы пришлось отвечать на все эти вопросы)) а если бы ответил, то может это уже и не мидл?))