P
prepair.app
Пройти інтерв'ю →
EnglishУкраїнськаРусскийDeutsch

Senior Java BackendПитання на співбесіді Java розробника

Senior · 5+ років досвіду

Співбесіда Java-розробника охоплює семантику мови, колекції, багатопотоковість, Spring та вміння міркувати про JVM. Нижче — питання, які ставлять найчастіше, кожне з еталонною відповіддю. Senior: архітектуру, трейд-офи, менторство та прийняття рішень.

Спробувати — без реєстрації
Готуємо питання…

Теми для підготовки

Core Java та ООП
Collections Framework
Багатопотоковість
Spring Boot і Spring Data
JVM, GC та памʼять
SQL і Hibernate

6 питань рівня Senior з відповідями

1

Як діагностувати витік памʼяті в довгоживучому JVM-сервісі?

Відповідь

Спершу переконатися, що це витік: дивитися heap після повної збірки протягом годин, бо пилка, яка повертається до базової лінії, витоком не є. Потім зняти heap dump і відкрити в MAT — він покаже дерево домінаторів, тобто обʼєкти з найбільшою утримуваною памʼяттю і того, хто на них посилається. Звичайні відповіді: необмежений кеш, ThreadLocal, не очищений на пуловому потоці, або слухачі, які реєструються і ніколи не відписуються.

2

Коли обрати Saga замість розподіленої транзакції?

Відповідь

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

3

Що змінює Project Loom у написанні конкурентного коду?

Відповідь

Віртуальні потоки роблять блокування дешевим: потік, що чекає на ввід-вивід, більше не займає потік ОС, тому модель «потік на запит» масштабується без реактивної обвʼязки. Практичний наслідок — ланцюжки CompletableFuture і реактивні стеки, взяті виключно заради неблокуючого коду, втрачають сенс. Не змінюється те, що synchronized може «пришпилити» віртуальний потік, а пули, розраховані під потоки ОС, стають хибною абстракцією.

4

Як обрати між тюнінгом GC і виправленням алокацій?

Відповідь

Спершу виміряти швидкість алокації. Якщо застосунок виділяє гігабайти на секунду, жодні налаштування збирача не врятують, і лагодити треба код — сміття в гарячому циклі, боксинг, захисні копії. Тюнінг GC доречний, коли алокації розумні, але паузи не вкладаються в цільову затримку, і тоді вибір зазвичай між G1 з ціллю за паузою та ZGC, якщо купа настільки велика, що G1 уже не справляється.

5

Команда хоче розрізати моноліт на мікросервіси. Що спитаєте до згоди?

Відповідь

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

6

Як тримати велику Java-кодову базу придатною до оновлення між LTS?

Відповідь

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

🦎

Прочитати відповіді недостатньо

На співбесіді ти говориш вголос під тиском. Кем поставить ті самі питання, оцінить кожну відповідь і покаже, що саме підтягнути.

Пройти інтерв'ю Senior Java Backend →
Безкоштовно · 3 інтерв'ю на місяць

Інші рівні — Java Backend

Junior Java BackendMiddle Java BackendУсі питання Java Backend

Інші спеціалізації

🔍Senior QA Manual🤖Senior QA Automation🐍Senior Python Backend🐘Senior PHP Backend🦫Senior Go Backend🟢Senior Node.js Backend💎Senior Ruby on Rails🟣Senior .NET Backend Developer🔷Senior C++🟨Senior JavaScript