Мова програмування Java — досить широка технологія, яка використовується в багатьох сферах розробки, включаючи веб, серверні та мобільні застосунки, ігри тощо. На Java часто пишуть складні проєкти, які передбачають роботу з великими кодовими базами, масштабування, оптимізацію й управління ресурсами, що потребує спеціалізованого досвіду. Водночас ця технологія має надзвичайно велику і складну екосистему бібліотек, фреймворків та інструментів. Залежно від специфіки компанії, співбесіди на посаду Java Developer можуть проходити за різними сценаріями.
Павло Димитрієв, Tech Lead Solidgate, партнерської компанії Genesis, поділився підходом до інтерв’ювання Java Developer різних грейдів. Він пояснив, чому компанія відмовилася від стандартного списку питань на користь персоналізованого підходу; як перевіряють розуміння теорії у джунів, наскільки глибоко мідли знайомі з технологією, та чому у підготовку до інтервʼю з сеньйором варто інвестувати додатковий час.
Чому в Solidgate відмовилися від стандартного алгоритму співбесіди
Раніше в українській фінтех компанії Solidgate ми інтерв’ювали кандидатів за стандартним списком питань. Як більшість проєктів, у такий спосіб ми прагнули оптимізувати підготовку та проведення технічних інтервʼю. Проте цей підхід мав очевидні недоліки: часом ми проводили по пʼять співбесід на день, та іноді не розуміли, кому з кандидатів запропонувати офер. Бувало, що чотири з п’яти кандидатів давали правильні відповіді, але статистично неможливо, щоби кожен з них підходив компанії. В цьому полягає ключова проблема: людина може відповісти на всі питання, але не буде продуктивною на проєкті та не пройде випробувальний період. Цілком імовірно, що найбільш ефективним міг би бути той пʼятий, хто відповідав гірше, адже шаблонні запитання заганяють в рамки й не допомагають зрозуміти людину, її зацікавленість, мотивацію та досвід.
Відсіювати людей на випробувальному етапі — неефективно, тому ми змінили фокус на персоналізований підхід. Його цінність полягає в тому, що ми дивимося на кожного кандидата з точки зору того, чи підійде він нам в тій конфігурації, з його інтересами, навичками, досвідом. До таких співбесід складніше готуватися, адже вони проходять за різними сценаріями. Проте такий досвід значно цікавіший для обох сторін. Навіть якщо кандидат не отримав офер, він чітко розуміє причину. Це не викликає в нього обурення, як у випадку зі стандартним списком: «я відповідав правильно, а мене не взяли». Навпаки, ми отримуємо позитивний фідбек, що це був цікавий і корисний досвід, не зважаючи на результат.
Індивідуальні співбесіди — поширений підхід у продуктових компаніях, яких цікавить довгостроковий найм. Отже, ми сформували такі принципи інтервʼю для Java Developer:
Junior Java Developer — теоретичні питання з акцентом на розуміння, пошук областей програмування, які викликають найбільший інтерес та захоплення у кандидата.
Middle Java Developer — питання про технології, з якими працював кандидат, оцінка того, наскільки глибоко він занурювався в них.
Senior Java Developer — питання про досвід та досягнення, занурення в кейси, щоби оцінити участь кандидата в тих чи інших проєктах.
Нижче я розповім про співбесіди з кожним грейдом окремо, наведу приклади та кейси.
Питання для Junior Java Developer
Джуніор — це спеціаліст, який вже має теоретичні знання, вміє закривати певні задачі та приносити цінність проєкту. У таких спеціалістів є досвід, але його мало, тому найперше, що має зрозуміти інтервʼюєр, — як швидко джуніор може стати мідлом. Для цього є дві передумови: певна теоретична база, зокрема обовʼязкове розуміння, як це працює і для чого потрібно, та зацікавленість спеціаліста.
Я вибірково проходжуся такими темами: Computer Science, алгоритми та структури даних, Java Core, мережі, бази даних, патерни та принципи програмування, знання інструментів (Git, Docker, AWS, Spring тощо). По кожній із них я ставлю декілька питань та намагаюся упевнитися, на скільки кандидат розуміє теорію та як її застосовувати на практиці. Щоби підготуватися до співбесіди, важливо не просто «зазубрити» відповідь. Я завжди намагаюся отримати пояснення, які проблеми вирішує та чи інша технологія чи підхід (дуже добре, якщо відповідь включатиме конкретні приклади). Це розуміння є обовʼязковим і стосується кожного теоретичного питання.
Наприклад, про SOLID питають на всіх співбесідах. Я прошу пояснити своїми словами, у чому ці принципи полягають, і найголовніше — для чого їх потрібно знати? 20 років тому розробники писали код без усіх цих принципів, і він працював, тож навіщо ускладнювати собі життя? Навіть не маючи в цьому досвіду, джуніор має розуміти, для чого це потрібно, інакше не буде інвестувати свій час у те, щоби тренуватися писати за цими принципами.
Розповідаючи про патерни рефакторингу та проєктування, кандидат має пояснити, які завдання вони вирішують та яким проблемам запобігають. Говорячи про методи та алгоритми сортування, цінніше не те, скільки кандидат їх перелічить, а чи розуміє він, чому їх так багато? Чому розробники не оберуть один найкращий? Будь-який з цих методів та алгоритмів працює, але який обрати залежно від задачі? Коли ми говоримо про принцип інверсії залежностей (dependency inversion), якщо кандидат відкриє чужий код, як зрозуміти, чи застосовувався в ньому цей принцип? За якими критеріями він це визначить?
Про рівень зацікавленості кандидата завжди говорить те, чи вивчав він додатково книжки з програмування. Наприклад, ми спілкуємося про хеш-мапи. Розробник вже зміг пояснити, як це працює і для чого потрібно. Далі я наводжу кейс нетривіальної проблеми: уявімо, що в хеш-таблиці сталося багато колізій і її ефективність деградувала. Чи можна цю проблему мінімізувати певними діями? Часто кандидати пропонують досить цікаві життєздатні рішення. Але найбільший бал від мене отримає той, хто помітить, що навіть в стандартній реалізації продуктивність не падає нижче логарифмічної та пояснить, чому це саме так. Це свідчить про те, що кандидат не полінувався полазити по стандартній колекції, розібратися, почитати щось на кшталт Герберта Шилдта чи Брюса Еккеля. Це означає, що в нього є інтерес до технології.
Нижче наведу теми та приклади запитань. Але, як і для інших грейдів, немає двох однакових інтервʼю з Junior Java Developer, кожна співбесіда проходить індивідуально. Якщо прямо зараз ви готуєтеся до технічного інтервʼю, рекомендую продивитися питання та оцінити, чи розумієте ви, для чого це знати.
Java Core
1. Назвіть основні принципи ООП. Як вони проявляються в Java?
2. Поясніть своїми словами, як працює кожен з принципів і для чого потрібен?
3. Як зрозуміти, що той чи інший принцип реалізований в коді?
4. Розкажіть про основні поняття ООП — клас, обʼєкт, інтерфейс? Чим вони відрізняються?
5. Що таке конструктор у Java?
6. Які класи не наслідуються від Object?
7. Що таке Local Variable та Instance Variable? У чому відмінність?
8. Заміщення методу (method overriding) — що це та як працює?
9. Що таке default method в Interface?
10. В чому різниця між String, String Builder та String Buffer?
11. Що таке ключове слово final та як його використовувати?
12. Що таке mutable / immutable?
13. Що таке wrapper classes у Java?
14. Java Development Kit (JDK) — що це?
15. Що таке Java Runtime Environment (JRE) і як використовується?
16. Що таке HashSet та HashMap у Java? Чим відрізняються?
17. Які модифікатори доступу в Java вам відомі? Як вони впливають на доступність класів і методів?
18. Які основні принципи автоматичного управління пам'яттю використовуються в Java?
19. Які є основні засоби обробки винятків у Java, і як вони використовуються?
20. Що таке потоки (threads) в Java? Як працює багатопотоковість в Java?
21. Як працює синхронізація потоків? Які методи для цього використовують?
22. Чи можна обмінюватися даними між потоками?
23. Як використовувати серіалізацію і десеріалізацію в Java для роботи з об'єктами та зберігання даних?
Computer Science
24. Що таке алгоритм? Які властивості хорошого алгоритму?
25. Які основні структури даних знаєте? Дайте приклади використання кожної з них.
26. Які алгоритми сортування ви знаєте? Чим вони відрізняються один від одного?
27. Як визначити, який алгоритм сортування буде найбільш ефективним в різних ситуаціях?
28. Що таке рекурсія? В яких випадках вона корисна при написанні програм?
29. Як працює алгоритм пошуку в ширину (BFS) і пошуку в глибину (DFS)? Дайте приклади їх використання.
30. Як ви розумієте поняття «Big O notation»? Як це впливає на ефективність алгоритмів?
31. Які основні принципи мемоізації в алгоритмах і для чого вона використовується?
Патерни та принципи
32. Які основні категорії патернів проєктування вам відомі, і які принципи вони втілюють?
33. Що таке DRY (Don't Repeat Yourself) принцип і чому він важливий у розробці програмного забезпечення?
34. Яким чином принцип YAGNI (You Aren't Gonna Need It) сприяє покращенню ефективності розробки?
35. Що означає SOLID, і які основні принципи цього набору принципів ви використовували?
36. Як ви розумієте принцип KISS (Keep It Simple, Stupid)? Як він допомагає створювати більш зрозумілий і підтримуваний код?
37. Яким чином принцип Separation of Concerns допомагає забезпечити модульність і обслуговуваність коду?
38. Які основні патерни структурного типу вам відомі (наприклад, Adapter, Decorator) і як вони використовуються?
39. Як ви розумієте патерн MVC (Model-View-Controller)? як він допомагає розділити логіку програми в архітектурі вебзастосунків?
40. Які патерни оптимізації коду вам відомі?
41. Які ви знаєте патерни рефакторингу? Яким чином вони можуть покращити кодову базу та зменшити технічний борг?
Бази даних
42. Що таке реляційна база даних? Які основні реляційні бази даних вам відомі?
43. Що таке нереляційна база даних? Які сценарії використання для них існують?
44. Як працює індексування в базах даних? Як це впливає на швидкодію запитів?
45. Що таке транзакція в базах даних?
46. Як вибирати дані з бази в Java за допомогою JDBC?
47. Що таке ORM (Object-Relational Mapping)? Які його переваги при роботі з базами даних в Java?
48. Які є стратегії оптимізації запитів до баз даних? В чому полягає lazy loading?
Мережі
49. Що таке IP-адреса? які основні типи IP-адрес вам відомі?
50. Як працює протокол TCP/IP?
51. Що таке HTTP і HTTPS, і в чому різниця між ними?
52. Які типи атак на мережеву безпеку вам відомі, і як можна захиститися від них?
53. Що таке NAT (Network Address Translation)?
54. Як працює HTTP-сесія? як зберігається стан між запитами на вебсервер?
55. Які існують інструменти та техніки для моніторингу й аналізу мережевої активності?
56. Розкажіть про концепцію клієнт-серверної архітектури. Які основні ролі відводяться клієнту та серверу в такій архітектурі?
57. Які протоколи комунікації існують для взаємодії між клієнтом і сервером?
Інструменти
58. Які переваги використання контейнерів Docker порівняно з віртуалізацією?
59. Як створити контейнер? Чим він відрізняється від образу Docker?
60. Як зібрати образ?
61. Які є команди Docker для роботи з контейнерами (створення, запуск, зупинка, видалення)?
62. Які основні налаштування Docker-контейнера і Dockerfile?
63. Як ви розумієте мережеву конфігурацію Docker? Які інструменти використовуються для зв'язку контейнерів?
64. Як ви зберігаєте дані й робите резервні копії в Docker-контейнерах?
65. Як ви розумієте оркестрацію Docker? Які існують інструменти для керування великої кількості контейнерів?
66. Що таке система керування версіями?
67. Що таке гілка в Git? Які основні операції з ними ви використовуєте?
68. Як ви вирішуєте конфлікти під час злиття гілок в Git і які інструменти Git ви використовуєте для цього?
69. Як ви використовуєте команду git rebase? У чому різниця між нею і командою git merge?
70. Як створити та застосувати теги в Git і для чого вони використовуються?
71. Що таке .gitignore файл і як його налаштувати для виключення файлів та каталогів з репозиторію?
72. Як організувати безпеку Git-репозиторію? Як би ви відреагували на можливі загрози?
73. У чому переваги фреймворку Spring для розробки Java-застосунків?
74. Як ви розумієте інверсію управління (IoC), і в чому її важливість в Spring?
75. Що таке Dependency Injection, як це реалізується в Spring?
76. Як створити й налаштувати Spring Bean? Для чого це потрібно в застосунку?
77. Як ви використовуєте аспекти (Aspects) і анотації в Spring?
78. Які основні типи конфігурації Spring-застосунків?
79. Як працює механізм транзакцій в Spring і як його налаштовувати?
80. Що таке Spring Boot і які переваги він надає для розробки мікросервісів?
81. Як ви розумієте Spring Security і якими засобами він надає захист?
82. Поясніть, як працює хмарна інфраструктура AWS.
83. Чи знайомі ви з інструментами моніторингу, журналізації, аудиту?
Питання для Middle Java Developer
Коли ми проводимо співбесіду кандидата рівня Middle, в першу чергу нас цікавить глибоке розуміння технологій та цікаві підходи. Якщо він має чимало досвіду, акцент ставимо саме на ньому, а теоретичні запитання відходять на другий план. Навіщо такого кандидата запитувати про відмінності алгоритмів сортування, якщо у нього є досвід та досягнення, розмова про які дасть значно більше розуміння?
Теми для розмови — такі ж як і в Junior, але у кожному питанні ми намагаємося зануритися глибше — технології, проблеми та обмеження, моделювання ситуації, коли виникає проблема, потенційні шляхи вирішення. Для чого це потрібно? Часто кандидати додають у резюме навичку володіння технологією, ознайомившись з нею лише на базовому рівні. Натомість нам цікаво, яких результатів вдалося досягти з нею, як її застосувати, які цікаві рішення знайти. Фактично технологія — цеглина, з якої можна побудувати сарай або вишуканий будинок. На цьому етапі я дізнаюся, що може побудувати кандидат.
Приклад заглиблення в тему про реляційні бази:
Як катили та застосовували міграції? Які інструменти обирали?
Чи використовували інструмент Liquibase?
З якими проблемами чи обмеженнями стикнулися?
Чого не вистачає в цьому інструменті, на вашу думку? Що б ви додали?
Якщо кандидат відповідає, що проблем не було, це свідчить про те, що інструмент використовувався лише на базовому рівні, тому він ці обмеження просто не зустрів. А базовий — це не рівень мідла.
Приклад розмови про Postgres:
Чи стикалися ви з такою проблемою: є таблиця, індекс; ми виконуємо запит, який має використовувати індекс, але він цього не робить. Чому не працює — невідомо. Як би ви розв'язували цю проблему?
Якщо кандидат справді працював з Postgres, і робив щось більше, ніж базова вичитка за ID, дуже ймовірно, що він вже стикався з подібною проблемою. Якщо ні — то цікаво дізнатися, з чого б кандидат почав розвʼязувати її. Уявімо, що три кандидати дають різні відповіді:
№1: «Подивлюся план запитів та планувальник, документацію за ними» — людина рухається в правильному напрямку.
№2: «Якщо індекс не застосовується, значить, технологія не дуже, подивлюся в бік MongoDB» — переводити проєкт на нову технологію, коли ти можеш просто пофіксити проблему за 10 хвилин, — погана ідея.
№3: «В плані запитів я подивлюся та проаналізую певні значення в записах» — це вже вказує, що людина мала певний досвід і розуміє проблему.
Додаткова важлива тема для мідла — моніторинг застосунку. Наприклад, уявімо, що ми задеплоїли проєкт, у якому крутиться 500 сервісів.
Як перевірити, що цей проєкт працює?
Як відстежувати, що сьогодні він працює так само добре, як учора?
Які є інструменти, практики, підходи, щоби моніторити цей «зоопарк»? Як можна їм керувати?
Якщо з цих 500 сервісів, нам потрібно змінити 30 (викатити нові версії). Як це зробити одночасно, щоби не втратити трафік і у клієнтів все працювало в той час, як ми щось змінюємо?
Також додаються питання з безпеки. Ми працюємо з платіжними даними за стандартом PCI DSS, що передбачає максимальний рівень безпеки. Якщо кандидат має в цьому досвід — це великий плюс.
Питання для Senior Java Developer
Сеньйор-спеціаліст — це людина, яка безпосередньо бере участь у стратегічних сесіях, плануванні, у виборі технологій. У нього є велика експертиза у різних питаннях та широкий досвід. Імовірно, він уже зіткнувся зі всіма підводними каменями та наступив на всі можливі граблі. Він бере відповідальність за свої рішення та проєкт або якусь його частину, не просто пише якісний код, а дивиться на цей процес з точки зору бізнесу. Плануючи цілі, він не розділяє їх на технічні та бізнесові — усі його рішення привʼязані до бізнес-завдань. При цьому він може не керувати командою, а бути самостійною бойовою одиницею, максимально зануреною в домен.
Якщо на технічній співбесіді питати в сеньйора про шаблони рефакторингу чи принципи SOLID, можна здобути репутацію дивної компанії: ми спілкуємося з фахівцем, який вже 15 років в індустрії, а ми ставимо питання, наче на іспиті в школі. Тому до такої співбесіди слід готуватися заздалегідь, вивчаючи досвід та навички кандидата. Зазвичай я вивчаю CV, роблю background-check, дивлюся посилання на репозиторій GitHub, LinkedIn тощо.
Наприклад, на GitHub-репозиторії ви побачили тестовий проєкт для компанії, якої немає у CV. Значить людина проходила співбесіду, можна про це спитати — чим закінчилося, чому не пішли? Іноді можна отримати дуже цікаві відповіді, які дають зрозуміти, як людина приймає рішення, які має пріоритети у пошуку роботи.
Також я завжди питаю про значущі результати, досягнення, що вдалося реалізувати, чим ви пишаєтесь, що приємно згадати. З його відповіді можна ставити додаткові питання і заглиблюватися вглиб експертизи, проблем, викликів, з якими стикався кандидат.
У відповідях людини ми також шукаємо рівень участі у проєктах. Тому що можна мати 15 років досвіду, але залишатися мідлом — сильним скіловим спеціалістом. Усі питання про досвід стосуються не стільки хард-скілів, а скоріше, чи «метчиться» людина з нашою командою. Наприклад, цього року я запамʼятав мінімум трьох кандидатів, які були дуже крутими технічними спеціалістами, яким ми вирішили не робити офер, бо вони не підходили за іншими параметрами. Такі люди попрацювали б у нас рік і пішли. Краще довше шукати людину, яка прийде на багато років, — довгостроково це більш перспективно. Так само і для кандидата: триваліший пошук «своєї» компанії кращий за співпрацю з проєктом, де він не зможе реалізувати свій потенціал.