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


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

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

  1. Загальне
  2. Основи JS
  3. Node.js
  4. Front-end
  5. Бази даних
  6. Передача даних в мережі
  7. Security
  8. Тестування
  9. Системи контролю версій
  10. Задачки
  11. Корисні посилання

Було б круто, якби хтось ше допоміг доповнити список. Пишіть в коментарях, на пошту, чи ше кудись.

Цей запис постійно оновлюється після нових співбесід.

Загальне

  • Шо таке рекурсія?                  
    • Як уникнути переповнення стеку при використанні рекурсії? (або: що таке хвостова рекурсія?)
  • Шо таке ідемпотентність?
  • Шо таке функтор?
  • Шо таке 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?
  • Як різні фреймворки виявляють, шо на сторінці змінилось і шо треба це перемалювати? (див. https://teropa.info/blog/2015/03/02/change-and-its-detection-in-javascript-frameworks.html)
  • Шо таке 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 }