top of page
Фото автораКатерина Шевченко

Співбесіда з Full Stack Developer. 60+ питань для Junior та Middle спеціалістів від техліда Keiki



Як проходить співбесіда з фулстек-девелоперами, та які питання їм ставлять? Цього разу досвідом проведення інтервʼю ділиться Keiki, компанія з екосистеми Genesis, яка працює на перетині EdTech та GameDev. Команда створює освітньо-розважальні продукти для дітей віком від 2 до 8 років і прагне, щоби екранний час був корисним і сприяв інтелектуальному розвитку.


У серпні 2024 року Keiki відзначає 5 років. За цей час компанія виросла з 7 до 40 людей, а застосунок завантажили понад 8,5 млн разів. Продукт доступний 14 мовами у всьому світі (крім Росії та Білорусі), а українцям надається безкоштовний доступ. Keiki займає лідерські позиції в App Store на глобальних ринках у своїй ніші. 

 

Максим Березанський, Tech Lead Keiki, розповів, як проходять співбесіди з фулстек-девелоперами, яких кандидатів шукає компанія, чому розмови про досвід важливіші за будь-які інші питання. Також Максим поділився підбіркою поширених питань, які можуть зустрітися фулстек-девелоперам на співбесідах. У кінці статті бонус — підбірка актуальних вакансій у команду Keiki.


> Як проходять співбесіди з Full Stack Developer

> Співбесіда з Junior та Middle Full Stack Developer

> Що має знати і вміти Full Stack Developer

> Питання для Full Stack Developer

> Як зрозуміти, що кандидат вам підходить






Як проходять співбесіди з Full Stack Developer 


В Keiki процес найму починається з визначення потреби в новому співробітнику та формуванні вимог до кандидата: визначається необхідний рівень та технологічний стек, а також конкретні навички та компетенції. Після успішного проходження скринінгового інтерв'ю кандидати отримують технічне завдання. 


Типове технічне завдання зазвичай невелике: кандидатам пропонується створити декілька сутностей зі взаємозв'язками, підняти невелику базу даних і написати для неї простий фронтенд. Завдання включає виконання CRUD-операцій (створення, читання, оновлення, видалення), тобто стандартний набір дій для адмінки. Коли кандидат розуміється на цьому, на виконання потрібно близько 4-5 годин. Часом ми задаємо початковий стек технологій, а іноді залишаємо на вибір кандидата. На кожне завдання ми даємо індивідуальний фідбек: кандидатам пояснюють, чому завдання було відхилено, і надають рекомендації, що можна покращити. Тих, чиї завдання було прийнято, ми запрошуємо на технічну співбесіду, на якій детальніше обговорюємо підходи та рішення, прийняті кандидатом. Фінальний етап — баррейзинг, після успішного проходження якого кандидат отримує офер.


Фулстек-девелопер поєднує знання фронтенду і бекенду, проте варто розуміти, що вони будуть менш глибокими порівняно з вузькоспеціалізованими розробниками, а також можуть бути зміщені в один з напрямів. Наприклад, часто фулстеки починають свою кар'єру як бекенд- або фронтенд-розробники, а згодом додають знання з іншої області. Ми часто прямо запитуємо, в якому напрямі більша експертиза, і залежно від відповіді формуємо запитання. 


Якщо команда цілеспрямовано шукає фулстека з глибокими знаннями, наприклад, у бекенді, це варто чітко зазначити у тексті вакансії та врахувати у переліку запитань. Наразі у технічної команди Keiki більше завдань пов’язано саме з фронтендом. 



Співбесіда з Junior та Middle Full Stack Developer


Питання до джуніор-спеціалістів зазвичай спрямовані на базові концепти та технології. Зокрема, можемо запитати про верстку, бекенд, реляційні та нереляційні бази даних, основи Vue.js. Від кандидатів цього ґрейду не варто очікувати глибоких технічних знань, тому в першу чергу інтервʼюер звертає увагу на мотивацію, вміння логічно мислити та швидко вчитися. 


Для компанії важливо усвідомлювати, що найм такого спеціаліста — це інвестиція. Якщо мідл-спеціаліст зазвичай працює самостійно, джуніор потребує постійної уваги та ресурсу. Їх може просто не бути, якщо вся команда завантажена роботою. Щоби такий найм не знизив загальну продуктивність, потрібно продумати менторство та організувати належний менеджмент. 


Раніше ми мали списки стандартних технічних запитань для різних ґрейдів, проте з часом відійшли від них. Вони часто не дають обʼєктивно оцінити знання кандидата, тому ми почали більше зосереджуватись на досвіді. Зазвичай ми починаємо із запитань про найбільші виклики, з якими стикалася людина, її найбільші досягнення та найцікавіші проєкти. Відповіді на ці питання дозволяють глибше зануритися в окремі теми, зрозуміти рівень кандидата та його підхід до вирішення реальних проблем.


Так, раніше ми більше запитували технічні деталі, наприклад, як працює Event Loop. Але траплялися ситуації, коли кандидат давав неправильну відповідь і не погоджувався з аргументами. На мою думку, будь-яке питання зі списку має бути обґрунтованим та стосуватися практичних завдань, з якими працює команда. 


Наприклад, важливо дізнатися, чи має кандидат досвід роботи з налаштуванням DNS, чи знає, як це працює, чи може самостійно виконати такі завдання. Це стосується й інших технологій, які ми активно використовуємо в компанії. Наприклад, якщо у нас в роботі використовується Vue.js, ми можемо запитати про відмінності між Vue 2 та Vue 3, або про принципи роботи з мутабельністю та імутабельністю даних. Замість загальних питань про архітектурні патерни, як, наприклад, SOLID, ми більше цікавимося практичними аспектами роботи. Можу запитати, чи налаштовував кандидат ESLint або Prettier, чи використовує лінтери у своїй роботі. 


Часто ми ставимо питання, на які немає правильної відповіді, і єдиний вихід — ставити зустрічні. Наприклад, питаючи, чи знайомий кандидат із TypeScript, які бачить плюси і мінуси цієї технології, та коли він вважає доцільним її використання, ми очікуємо, що він врахує такі фактори, як розмір проєкту, стадія розробки та склад команди.


«Що гірше: відсутня документація чи неактуальна документація?» — залежно від стану розвитку проєкту та розміру команди відповіді можуть бути різними, тому ми очікуємо на зустрічні питання та аргументацію. 


«Коли використовувати реляційну базу, а коли нереляційну?» — тут важливо розуміти не просто відмінність між ними, а принцип, за яким обирається тип на початку роботи з проєктом.



Що має знати і вміти Full Stack Developer


1. Фронтенд


Перш за все джуніор спеціаліст має володіти базовими навичками верстки, включно з адаптивним дизайном. Він має знати, як керувати станом, використовувати computed, працювати зі стором та обробляти події. Важливо розуміти концепцію Mobile First та вміти працювати з різними типами екранів. Також корисно знати різницю між форматами зображень, такими як JPG, PNG, WebP, розуміти, коли варто використовувати той чи інший формат, а також як їх компресувати. Добре мати загальне розуміння про page speed.

Своєю чергою мідли повинні глибше розуміти фактори, які впливають на швидкість завантаження сторінок, знати, як оптимізувати їх до кращих показників. Крім того, очікується відмінне знання фреймворку Vue.js, вміння застосовувати архітектурні патерни.



2. Бекенд


Джуніору важливо розуміти основи REST API і її проєктування на стороні бекенду, мати мінімальний досвід роботи з NodeJS. Мідлу ж важливо розуміти, який протокол буде краще в конкретному випадку (REST API, WebSockets тощо), як оптимізовувати навантаження, як працювати з чергами, нотифікаціями тощо.


Також мідл має бути знайомим з найкращими практиками взаємодії фронтенду з бекендом, орієнтуватися в різних інструментах.



3. Бази даних


Джуніори повинні мати базове розуміння різниці між реляційними та нереляційними базами даних, а також знати, коли доцільно використовувати кожну з них. Мідл-розробникам важливо вже мати глибші знання, включно з навичками мінімального проєктування баз даних і їхньої оптимізації.



4. Serverless і Server


Джун має розуміти концепт serverless і традиційного серверного підходу. Мідлу ж важливо розуміти переваги та недоліки кожного підходу та вміти застосовувати їх залежно від конкретних умов проєкту.



Технічний стек команди Keiki: Vue.Js, Nuxt.js, Node.Js, Serverless на AWS, JavaScript, TypeScript, MySQL (реляційна) і MongoDB (нереляційна), DynamoDB.



Питання для Full Stack Developer


Нижче перелік запитань, які часто зустрічаються на співбесідах з Full Stack Developer. По кожній темі вони розташовані у порядку зростання складності.



JavaScript


1. Що таке замикання в JavaScript? Які переваги і недоліки використання замикань?

2. Що таке Promise в JavaScript? Яка основна мета та переваги?

3. Як працює механізм this в JavaScript? Які є варіанти його використання? 

4. Що таке стрілочна функція? Чим вона відрізняється від звичайної функції в JavaScript?

5. Як стрілочні функції обробляють ключове слово this? У яких випадках це може бути корисним?

6. Назвіть основні статичні методи масивів. У чому їхні особливості? 

7. Чим відрізняються між собою оператори Rest і Spread? Як їх використовувати? 


const originalArray = [1, 2, 3, 4, 5];
const newArray = [...originalArray];

const numbers = [4, 9, 2, 8, 5];
const maxNumber = Math.max(...numbers);


8. Чи можна використовувати Rest і Spread оператори разом? Якщо так, наведіть приклад.

9. Як виконати асинхронні операції всередині методів map та reduce? Наведіть приклади.

10. Які особливості асинхронних операцій в map та reduce?


await Promise.all(someArray.map(async (item) => {
	await doAsyncOperationWithItem(item)
}))

const data = await someArray.reduce(async (accPromise, item, index) => {
	const acc = await accPromise
	await doAsyncOperationWithItem(item)
}, Promise.resolve({}))

12. Що таке Stack, Heap, Queue? Які ще структури даних ви знаєте?

13. Як працює Stack і в яких випадках його використовують? Наведіть приклади задач, де застосовується структура LIFO.

14. Як працює черга і де її використовують? Наведіть приклади задач, де підходить структура FIFO.

15. Що таке Heap і для чого використовують? Як відрізняється реалізація Heap для задач на пріоритетні черги?

16. У чому складність пошуку елементу у звʼязному списку? Як вона порівнюється з масивом?

17. Як працює хеш-таблиця і які її основні переваги та недоліки?

18. Опишіть декількома фразами принцип роботу Event Loop в JS.

19. Що буде виконане першим: microtask чи macrotask. Чи є тут підступ? 


Джерело: Lydia Hallie Blog

20. Є масив, потрібно по кожному елементу виконати асинхронну дію. Як це правильно зробити?


await Promise.all(someArray.map(async (item) => {
await doAsyncOperationWithItem(item)
}))


Фронтенд


21. Якими способами можна забезпечити адаптивність вебсторінки для різних розмірів екранів? Наведіть приклади.

22. Що таке підхід Mobile First в розробці вебзастосунків? Як реалізувати цей підхід на практиці?

23. Як ви підходите до реалізації Progressive Enhancement у вебдизайні? Наведіть приклад.

24. Як працює CSS Grid і в яких випадках його краще використовувати порівняно з іншими методами верстки?

25. Як можна використовувати Flexbox для вирівнювання елементів на сторінці? 

26. Наведіть приклад використання семантичних тегів.

27. Які техніки та інструменти ви використовуєте для забезпечення доступності вебсторінки?

28. Поділіться досвідом використання препроцесорів Sass (SCSS) та постпроцесорів  PostCSS. Які завдання вони допомагають вирішувати? 

29. Які практики обробки помилок ви застосовували?

30. Поділіться досвідом використання браузерних API (setTimeout, setInterval, fetch, або querySelector) у своїх проєктах?

31. Які основні відмінності між React та Vue? Як ці фреймворки працюють з мутабельністю та іммутабельністю?

32. Чи був досвід роботи з фреймворками Nuxt, Gatsby, Next? Поділіться перевагами і недоліками кожного з них. 

33. В чому різниця між LocalStorage, SessionStorage, і Cookies (HttpOnly, серверні)? В яких випадках ви використовуєте кожен із них?

34. Що таке PageSpeed оптимізація? Які підходи існують для оптимізації FCP, LCP та CLS?

35. Які переваги, недоліки та особливості має CSR, SSR і SSG? У яких випадках ви обирете кожен із цих підходів?

36. Що таке ізоморфний застосунок? Як можна реалізувати клієнтську та серверну частини в одному проєкті?

37. Які способи оптимізації запитів на сервер, ви знаєте? Розкажіть детальніше про кешування та lazy loading.

38. Що таке code splitting? Як він впливає на продуктивність вебзастосунків?

39. Як ви обираєте бандлери, такі як Webpack або Vite? Які фактори впливають на ваш вибір?



Бекенд


40. Які види баз даних ви знаєте? В чому полягають особливості, переваги та недоліки реляційних і нереляційних баз даних?

41. Які HTTP методи зазвичай використовуються для CRUD операцій у REST API, і що вони означають?

42. Для чого використовуються ORM пакети, такі як Sequelize, TypeORM або Prisma, і які переваги та недоліки вони мають?

43. Як налаштувати нотифікації з third-party сервісами, використовуючи вебхуки? На що ви звертаєте увагу при роботі з вебхуками?

44. Які особливості та варіанти використання екзотичних баз даних, таких як Clickhouse, Prometheus, або Cassandra?

45. Як працює обробка даних через черги, такі як Kafka, AWS SQS або RabbitMQ, і в яких випадках їх варто використовувати?

46. Які переваги має кешування через Redis? 

47. Які відмінності між серверною і serverless архітектурою? Які переваги та недоліки кожної з них?

48. Як працює WebSockets? У яких сценаріях їх варто використовувати замість інших технологій?

49. Скільки потоків використовує NodeJS, і як можна реалізувати кластеризацію на всі ядра?

50. У чому полягають основні відмінності між горизонтальним і вертикальним масштабуванням, і коли доцільно використовувати кожне з них?

51. Як налаштовувати моніторинг з використанням Grafana або Prometheus? Які підходи ви використовуєте для налаштування алертів? 



How to


52. Що краще: відсутність документації, чи документація, яка неактуальна?

53. Чи працював з CI? Що робив, з якими складностями стикнувся, що було найскладнішим?

54. Як би ви реалізували систему авторизації на бекенді?

55. Стоїть задача: створити DWH. Як ви будете реалізовувати цю систему?

56. Стоїть задача: реалізувати ріалтайм-чат з консультантами. Який підхід ви використаєте?

57. Потрібно створити високонавантажений бекенд, які підходи ви використаєте?

58. Як працюють різні типи DNS-записів (TXT, A, MX, NS), і для чого кожен із них використовується?

59. Як налаштувати SPF, DKIM, і DMARC для забезпечення безпеки електронної пошти, і яка різниця між цими механізмами?

60. У вас є підписка і ви вираховуєте її статус по полю expired_at, яке є DateString. Для проду у вас нормальні довгі підписки по тижню/місяцю, на деві (для економії часу) — пара хвилин. Ви розумієте, що на проді від юзерів не поступає тікетів, але на деві ви постійно отримуєте Expired пізніше, ніж потрібно. В чому може бути проблема?

62. Що ви будете робити, якщо в процесі розробки фічі знайшли місце в логіці, яке потенційно може призвести до збою системи, але щоб його пофіксити, потрібно витратити багато часу, що призведе до того, що естімейти по фічі будуть не виконані?

63. Від продакт-менеджера стоїть задача запустити MVP-продукт якомога швидше, але ви розумієте, що та кількість фіч, яку хоче менеджер, не вкладається в плани. Які ваші дії в такому випадку?

64. Ви бачите в коді дуже неочевидне місце, яке вам здається, що працює не так добре, як могло б. Які ваші дії в такому випадку?



Як зрозуміти, що кандидат вам підходить 



✅ Залученість і ентузіазм


Коли кандидат із захопленням розповідає про свої проєкти, детально описує труднощі, з якими стикався, і рішення, які застосовував, видно, що він справді переживав цей досвід.

Ентузіазм і залученість часто свідчать про щирий інтерес до роботи, що людина готова брати на себе відповідальність та інвестувати час і зусилля у свій професійний розвиток.


✅ Провалідований досвід


Коли людина має крутий досвід, і ви можете провалідувати, що вона його не вигадує, це може перекрити усі прогалини в теорії чи знаннях термінів. На нашу думку, будь-який термін або концепт можна погуглити і вивчити в будь-який момент, а досвід — значно цінніший, адже здобувається людиною тривалий час. 


✅ Здатність до саморефлексії


Один з найбільшим зелених прапорців — коли кандидат може відверто говорити про свої факапи, і які уроки він з цього виніс. Він не ухиляється від складних питань і визнає свої помилки. Це важлива риса, яка показує, що кандидат здатний до постійного розвитку і може адаптуватися до нових викликів.


✅ Вміння аргументувати


Коли кандидат пропонує рішення, він здатний аргументувати, чому воно є оптимальним, наводити технічні або бізнесові причини. Він не спирається на шаблонні відповіді на кшталт «бо ми так робили». 


❌ Невміння приймати або давати зворотний зв'язок


Кандидат неохоче приймає критику або виправдовується замість того, щоб розглянути фідбек як можливість для покращення. Ця навичка — важлива складова ефективної командної роботи. 


❌ Токсичність


Хоча її важко виявити на технічній співбесіді, деякі ознаки можуть вказувати на зверхнє ставлення до інших. Це може проявитися у відповідях на запитання про найбільше досягнення та поразку. Якщо, коли мова йде про досягнення, кандидат каже «я», а коли йдеться про факапи — «ми», це привід задуматися.


❌ Закритість до змін


Кандидат не готовий змінювати свої підходи, вперто дотримується одних і тих самих рішень, навіть якщо вони застарілі або неефективні. Наприклад, людина працює на одній технології багато років і не визнає інші підходи. У швидкозмінному технологічному середовищі важливо мати людей, які здатні адаптуватися до нових умов і готові досліджувати підходи. 



Порада від техліда Keiki


Будьте відвертими про свій досвід і результати тестових завдань, адже їх досить легко валідувати. Неправда завжди вийде на поверхню, і це витрачає час як кандидата, так і інтерв'юера. На мою думку, готуватися краще не до технічних питань, а карʼєрних: чому вас цікавить ця позиція саме в цій компанії, чого ви шукаєте як спеціаліст, чому вважаєте, що між вами і компанією може бути «метч». Рекомендую порефлексувати на ці теми, а також щодо свого попереднього досвіду. 

<