30 питань на технічній співбесіді Java Middle 2026: задачі + відповіді
Сергій, 3 роки комерційного Java-досвіду, працює в продуктовій компанії в Києві. За останній місяць пройшов 5 технічних співбесід на Middle Java позиції. Результат: 2 відмови після live coding, 2 відмови після System Design, один офер з пониженням грейду до Junior+. На питання про колекції, generics і garbage collection відповідав без проблем. Сипався там, де треба було показати інженерне мислення, а не вивчений матеріал.
Технічна співбесіда Java Middle у 2026 році перевіряє не обсяг знань — його перевіряє автотест. Перевіряє те, що автотест не вловлює: як ти розкладаєш незнайому задачу на кроки, як аргументуєш trade-offs, як працюєш з AI-асистентом, не втрачаючи розуміння коду. Нижче — 30 реальних питань з українських компаній (EPAM, SoftServe, GlobalLogic, Sigma Software, Intellias) за останні 4 місяці, з відповідями рівня Middle і типовими помилками.
Зміст
Що перевіряють на Java Middle співбесіді у 2026
Стек той самий. Контекст — зовсім інший.За даними зимового зарплатного звіту DOU 2026, медіанна зарплата Middle Java-розробника в Україні становить $2500. Конкуренція за такі позиції зросла: на одну вакансію в середньому претендують 80+ кандидатів, тому компанії піднімають планку технічної перевірки.
За нашими спостереженнями у Hoorya, технічна Java Middle співбесіда у 2026 році має такі особливості:
- Більшість вакансій Java Middle включає окремий етап live coding з обмеженням 40-60 хвилин
- System Design сесія стала майже стандартом — рік тому її проводили вдвічі рідше
- Алгоритмічні задачі залишились у переважній більшості воронок, але формат змінився: замість LeetCode Hard просять написати функцію з реального продакшен-сценарію (валідація IBAN, парсинг логів, дедуплікація подій з Kafka)
Чотири блоки, які перевіряють у 2026:
Spring Boot на Java Middle співбесіді: 8 типових питань
Spring 6 + Boot 3 — мінімальний поріг. Знання Spring 5 уже мінус.Spring — найбільший блок технічної частини. Нижче 8 питань, які зустрічались у переважній більшості Java Middle співбесід в українських компаніях за останні півроку.
У чому різниця між IoC і DI?
IoC (Inversion of Control) — принцип, при якому контроль над створенням і життєвим циклом об'єктів передається фреймворку. DI (Dependency Injection) — один зі способів реалізувати IoC: залежності об'єкта передаються йому ззовні, а не створюються всередині. Spring реалізує IoC через DI-контейнер. Constructor injection вважається кращим за field injection бо робить залежності явними і дозволяє immutable стан.
Опиши Bean lifecycle у Spring.
Instantiation → Populate properties → BeanNameAware.setBeanName() → BeanFactoryAware.setBeanFactory() → ApplicationContextAware.setApplicationContext() → BeanPostProcessor.postProcessBeforeInitialization() → @PostConstruct → InitializingBean.afterPropertiesSet() → custom init-method → BeanPostProcessor.postProcessAfterInitialization() → готовий до використання → @PreDestroy → DisposableBean.destroy() → custom destroy-method.
На Middle очікують спрощену форму: створення → ін'єкція залежностей → ініціалізація → готовність → знищення.
Як працює @Transactional і які бувають propagation levels?
@Transactional створює проксі навколо методу і керує транзакцією через PlatformTransactionManager. Шість основних propagation:
- REQUIRED (default) — використовує існуючу транзакцію або створює нову
- REQUIRES_NEW — завжди створює нову, призупиняючи поточну
- NESTED — savepoint всередині існуючої
- SUPPORTS — приєднується якщо є, працює без транзакції якщо немає
- NOT_SUPPORTED — призупиняє існуючу
- MANDATORY — кидає виняток якщо транзакції немає
Як працює autoconfiguration у Spring Boot?
Spring Boot сканує classpath, читає META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports (у Boot 3+), і умовно реєструє конфігурації через @ConditionalOnClass, @ConditionalOnMissingBean, @ConditionalOnProperty. Якщо HikariCP у classpath і немає кастомного DataSource — Boot створить його сам.
Що нового у Spring 6 / Spring Boot 3?
Базова Java 17, нативна підтримка Jakarta EE 9+ (javax.* → jakarta.*), GraalVM native image без додаткових плагінів, Virtual Threads через spring.threads.virtual.enabled=true, observation API замість старих Sleuth/Micrometer trace.
Як зробити кастомний Spring Boot starter?
Створити модуль з AutoConfiguration класом, додати його у META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports, опціонально — ConfigurationProperties для параметрів. Інший проєкт додає starter як залежність, конфігурація підтягується автоматично.
Як ти використовуєш Spring Profiles на проєкті?
Очікувана відповідь — конкретний кейс: application-dev.yml, application-prod.yml, активація через SPRING_PROFILES_ACTIVE=prod, або @Profile("prod") на бінах. Помилка — теоретично описувати без прикладу свого проєкту.
Що показує Spring Boot Actuator і які endpoint вмикав на проді?
/health — для k8s liveness/readiness probe, /metrics — для Prometheus, /info — версія застосунку, /loggers — зміна рівня логування в рантаймі. На проді не вмикають /env, /heapdump, /threaddump без authentication — це безпекова дірка.
Що знати про Spring Security для Middle?
Мінімум: фільтр-ланцюг (SecurityFilterChain у Spring Security 6), різниця між Session-based і Stateless (JWT) автентифікацією, як працює UserDetailsService, як налаштувати CORS і CSRF, OAuth2 resource server для перевірки JWT від Keycloak/Auth0. Глибше зазвичай не питають — це територія Senior.
Hibernate і робота з базами даних на Java Middle
N+1 problem — базова перевірка, на якій відсіюють найшвидше.Якщо кандидат не знає що таке N+1 problem — інтерв'юер часто просто завершує блок раніше. У 2026 році це базова перевірка, не складна.
Що таке N+1 problem і як її вирішити?
Першим — увімкнути spring.jpa.show-sql=true. Якщо завантажити список з 100 Order сутностей, у кожній з яких є @ManyToOne User, Hibernate зробить 1 запит на Orders + 100 запитів на Users (N+1 = 101 запит). Рішення:
JOIN FETCHу JPQL:SELECT o FROM Order o JOIN FETCH o.user@EntityGraphна репозиторії — кращий варіант якщо запит використовується в кількох місцях- Batch fetching:
@BatchSize(size = 50)на entity - Перехід на DTO projection через interface-based projections у Spring Data
У чому різниця між FetchType.LAZY і FetchType.EAGER?
LAZY — Hibernate генерує проксі і завантажує дані тільки при першому зверненні. EAGER — завантаження одразу разом з основною сутністю. Default для @OneToMany/@ManyToMany — LAZY, для @ManyToOne/@OneToOne — EAGER.
Правило Middle: ставити LAZY скрізь, а eager робити явно через JOIN FETCH на конкретному запиті.
Що таке second-level cache і коли він шкодить?
Second-level cache (Ehcache, Hazelcast, Infinispan) живе на рівні SessionFactory і шерится між сесіями. Корисний для read-mostly довідників (країни, валюти). Шкодить коли:
- Дані часто змінюються — постійні інвалідації
- Кілька інстансів додатку без розподіленого кешу — рассинхронізація
- Запити з умовами, що не індексуються в кеші — все одно йдуть у БД
Як налагодити повільний запит у Hibernate?
- Увімкнути
spring.jpa.show-sql=trueіhibernate.format_sql=true - Скопіювати SQL і запустити
EXPLAIN ANALYZEу PostgreSQL/MySQL - Подивитись чи використовуються індекси (Seq Scan vs Index Scan)
- Перевірити p99 через Hibernate Statistics або APM (Datadog, New Relic)
Які isolation levels існують і яку проблему вирішує SERIALIZABLE?
READ UNCOMMITTED → READ COMMITTED → REPEATABLE READ → SERIALIZABLE. По наростаючій захищають від: dirty read, non-repeatable read, phantom read. SERIALIZABLE гарантує що транзакції виконуються "ніби послідовно" — найбезпечніше, але найповільніше.
У PostgreSQL default — READ COMMITTED, в Oracle і Spring @Transactional без параметрів — теж READ COMMITTED.
Як ти створюєш індекс на колонці і коли цього робити не варто?
Через @Index на entity або міграцією Flyway/Liquibase. Не варто індексувати:
- Колонки з низькою кардинальністю (boolean, status з 3 значеннями)
- Колонки, які часто оновлюються (індекс перебудовується)
- Маленькі таблиці (<1000 рядків) — Seq Scan швидший
System Design на Java Middle співбесіді
25 хвилин на 4 кроки: вимоги, оцінка RPS, API, масштабування.System Design на Middle — це не "побудуй Netflix". Це 4 кроки, які треба пройти за 25-30 хвилин:
| Крок | Що зробити |
|---|---|
| 1. Уточнення | Скільки користувачів? Read/Write ratio? Latency requirements? Geographic distribution? |
| 2. Оцінка | 1M DAU × 10 запитів = ~115 RPS середньо, ~500 RPS у пік |
| 3. API + дані | 3-5 endpoint, основні сутності, тип сховища (SQL vs NoSQL і чому) |
| 4. Масштабування | Де bottleneck: cache, read replicas, sharding, queue |
Спроектуй URL shortener (як bit.ly).
Кодування: base62 від auto-increment ID (8 символів покривають 200T URL) або хеш-функція з обробкою колізій. API: POST /shorten, GET /{code}. БД: PostgreSQL для метаданих + Redis для гарячого кешу redirect (TTL = 24h). Аналітика: асинхронна через Kafka в окремий ClickHouse — щоб не блокувати redirect.
Спроектуй rate limiter.
Algorithm: Token Bucket або Sliding Window. Сховище: Redis з INCR + TTL. Ключ: rate_limit:{user_id}:{endpoint}. Якщо count > limit — повертаємо 429.
На Middle очікують, що ти знаєш про відмінність Token Bucket (burst tolerance) і Fixed Window (boundary problem).
Як побудувати чат на 10k одночасних користувачів?
WebSocket з'єднання через Spring WebFlux або Netty напряму. Стан з'єднань — sticky session або Redis pub/sub для горизонтального масштабування. Зберігання повідомлень — Cassandra (write-heavy, time-series доступ). Гарантія доставки — message queue + retry з ack від клієнта.
Як зробити sharding для таблиці orders на 500M рядків?
Shard key: user_id (запити завжди по користувачу — добре). Алгоритм: consistent hashing для додавання шардів без масової міграції. Cross-shard запити: через aggregator-сервіс або BI-replica. Hot partitions: додати випадковий суфікс до ключа.
Алгоритми на Java Middle співбесіді: 5 реальних задач
Не LeetCode Hard. Завдання, які можуть зустрітися в коді.Задачі нижче — з ротації EPAM, SoftServe і GlobalLogic за останні півроку. Усі — рівня LeetCode Easy/Medium, з очікуваним рішенням за 15-20 хвилин. Зверни увагу на коментарі в коді — саме так має виглядати твоє рішення на live coding.
Anagram check
Дано два рядки. Перевір чи є вони анаграмами один одного.
public boolean isAnagram(String a, String b) {
// Швидка перевірка: різна довжина = не анаграми
if (a.length() != b.length()) return false;
// Лічильник для 26 літер латиниці
int[] counts = new int[26];
// Інкрементуємо для a, декрементуємо для b
for (int i = 0; i < a.length(); i++) {
counts[a.charAt(i) - 'a']++;
counts[b.charAt(i) - 'a']--;
}
// Якщо хоч одна літера лишилась з ненулем — не анаграми
for (int c : counts) if (c != 0) return false;
return true;
}
Складність: O(n) час, O(1) пам'ять (26 літер — константа). Типова помилка: сортувати обидва рядки — O(n log n) і втрата балів за оптимальність.
Longest substring without repeating characters
Знайди довжину найдовшого підрядка без повторень символів. Класична задача на sliding window.
public int lengthOfLongestSubstring(String s) {
// Зберігаємо останню позицію кожного символу
Map<Character, Integer> lastIndex = new HashMap<>();
int max = 0;
int start = 0; // Ліва межа поточного вікна
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// Якщо символ був усередині поточного вікна — рухаємо start вправо
if (lastIndex.containsKey(c) && lastIndex.get(c) >= start) {
start = lastIndex.get(c) + 1;
}
lastIndex.put(c, i);
max = Math.max(max, i - start + 1);
}
return max;
}
Складність: O(n) час, O(min(n, alphabet)) пам'ять. Sliding window — патерн, який треба знати на Middle напам'ять.
Merge intervals
Дано список інтервалів [[1,3], [2,6], [8,10]]. Об'єднай ті, що перетинаються.
public int[][] merge(int[][] intervals) {
// Сортуємо за початком — це дозволяє йти лінійно
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
List<int[]> result = new ArrayList<>();
int[] current = intervals[0];
for (int i = 1; i < intervals.length; i++) {
// Якщо новий інтервал починається до кінця поточного — об'єднуємо
if (intervals[i][0] <= current[1]) {
current[1] = Math.max(current[1], intervals[i][1]);
} else {
// Інакше — закриваємо поточний, починаємо новий
result.add(current);
current = intervals[i];
}
}
// Не забути додати останній — типова помилка
result.add(current);
return result.toArray(new int[0][]);
}
Складність: O(n log n) через сортування. Типова помилка: забути додати останній інтервал після циклу — і втратити частину результату.
LRU Cache
Реалізуй кеш з фіксованою місткістю, де при перевищенні викидається найдавніше використаний елемент.
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private final int capacity;
public LRUCache(int capacity) {
// accessOrder=true — порядок за останнім доступом, не вставкою
super(capacity, 0.75f, true);
this.capacity = capacity;
}
// Викликається після кожної вставки — викидаємо найстаріший
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > capacity;
}
}
Складність: O(1) на get/put. Підвох: інтерв'юер часто просить написати без LinkedHashMap — через HashMap + двозв'язний список. Це варіант для Senior.
Two-sum з відсортованим масивом
Дано відсортований масив чисел і target. Знайди два індекси, сума яких = target.
public int[] twoSum(int[] nums, int target) {
// Two pointers працює тільки на відсортованому
int left = 0;
int right = nums.length - 1;
while (left < right) {
int sum = nums[left] + nums[right];
if (sum == target) return new int[]{left, right};
// Сума замала — рухаємо лівий вказівник вправо
if (sum < target) left++;
// Сума завелика — рухаємо правий вліво
else right--;
}
return new int[]{-1, -1};
}
Складність: O(n) час, O(1) пам'ять. Якщо масив не відсортований — HashMap-варіант теж O(n) часу, але O(n) пам'яті.
Чи питають leetcode-задачі на Middle Java у 2026?
Так, але не LeetCode Hard. Стандартний пул — Easy і Medium з тегами Array, String, HashMap, Sliding Window, Two Pointers. Готуватись — 30-40 задач з цих категорій. Hard-задачі (DP на матриці, складні графи) — це Senior+ і FAANG, не український Middle. Детальні приклади завдань з UA-компаній є в публікаціях DOU.
Live coding під тиском — техніка проходження
Виграє той, хто думає вголос і пише ітеративно.Live coding провалюють не на синтаксисі — провалюють на мовчанні. Інтерв'юер 30 хвилин дивиться як кандидат пише код без коментарів, і не розуміє хід думок. Висновок: "слабке інженерне мислення".
Кандидат: 4 роки на Java, попередня роль — Middle у банку. Задача на live coding: знайти всі дублікати у масиві з 1000 елементів.
За 2 хвилини написав рішення через два вкладені цикли — O(n²). Інтерв'юер мовчав. Через 5 хвилин кандидат сам помітив проблему і додав HashMap для підрахунку — O(n). Інтерв'юер задав одне питання: "А чому не одразу через Set?"
Кандидат відповів: "ну Set же не зберігає кількість". Інтерв'юер: "А вам потрібна кількість, чи факт що елемент уже зустрічався?" Кандидат не зміг швидко переключитися. Фідбек після відмови: "слабке знання базових структур даних".
Реальна проблема — не структури. Кандидат знав і HashMap, і HashSet. Проблема була в тому, що він жодного разу не озвучив вибір вголос. Якби сказав на старті: "Я бачу два варіанти — HashMap для частоти, HashSet для факту повтору. Тут потрібен факт, тому HashSet" — інтерв'юер не задав би жодного follow-up.
Чотири правила, які витягують live coding навіть якщо рішення не ідеальне:
Як готуватись до live coding за тиждень?
7 днів по 1.5 години:
- День 1-2: Arrays + Strings (10 задач Easy)
- День 3: HashMap + Set (5 задач Medium)
- День 4: Two Pointers + Sliding Window (5 задач)
- День 5: Stack + Queue (3 задачі)
- День 6: Mock-співбесіда з другом по Zoom — обов'язково говорити вголос
- День 7: Перегляд минулих рішень + відпочинок
Без mock-співбесіди підготовка неповна. Писати код наодинці і писати код під спостереженням — два різних навики.
Чи можна користуватись Copilot під час live coding?
У переважній більшості компаній — заборонено явно (озвучують на початку). У частині — дозволено, але інтерв'юер уважно дивиться чи розумієш ти що Copilot згенерував. У окремих випадках — дозволено вільно, перевіряють саме вміння працювати з AI. Універсальне правило: запитай на початку. Користуватись без дозволу — autoreject.
AI як третій учасник співбесіди — нові правила
Тепер перевіряють як ти працюєш з AI — а не чи без нього виживеш.За нашими спостереженнями у Hoorya, більшість Java-розробників щодня використовують AI-асистент (Copilot, Cursor, Claude Code). Це стало частиною професії — і частиною співбесіди.
Що змінилось у питаннях:
| Раніше | Зараз |
|---|---|
| Напиши функцію X без використання Stream API | Опиши свій workflow з Copilot за останній тиждень. Які промпти давали найкращий результат? Де AI помилявся і як ти це ловив? |
| Поясни як працює GC | Ти спитав Claude як налаштувати G1GC і він дав параметри. Як перевіриш чи вони правильні до того, як деплоїти? |
Очікувана відповідь на друге питання: подивитись JVM docs, перевірити версію Java, прогнати на staging з навантаженням, поміряти p99 latency через Datadog, порівняти з baseline. Це і є інженерне мислення на Middle у 2026.
Скільки часу готуватись до Middle співбесіди?
Якщо ти вже 2+ роки на комерційній Java з реальним Spring-проєктом — 3-4 тижні цільової підготовки. Розклад:
- Тиждень 1: Spring/Hibernate глибокий повтор + 5 mock-співбесід по теорії
- Тиждень 2: System Design (книга "System Design Interview" Alex Xu, 10 кейсів)
- Тиждень 3: Алгоритми (30 задач LeetCode Easy/Medium з UA-тегів)
- Тиждень 4: Mock live coding x5, перегляд слабких місць
Якщо досвід менше 2 років — додай 2-3 тижні на fundamentals (JVM, multithreading, collections internals).
Інтерактивна схема: тиждень підготовки
Натискай на день — побачиш деталі.7 пунктів готовності до співбесіди
Постав галочку — закрий пункт.Спільнота Java-розробників у Telegram
Розбір реальних кейсів зі співбесід, відгуки про компанії, mock-партнери для тренувань.
Часті питання про Java Middle співбесіду
Те, що питають кандидати, але соромляться питати в інтерв'юера.Висновок
Технічна співбесіда Java Middle у 2026 — це 90 хвилин, де інтерв'юер дивиться три речі: чи можеш розкласти незнайому задачу на кроки, чи аргументуєш рішення вголос, чи працюєш з AI як з інструментом, не втрачаючи розуміння. Знання Spring і Hibernate — поріг входу, а не перевага. Перевага — в тому, як ти ці знання застосовуєш під тиском.
Готуйся до 30 ключових питань, які повторюються у переважній більшості воронок. Прокачай live coding на 5 mock-сесіях. Підготуй 3 конкретні кейси з власного досвіду на кожен великий блок. І перевір своє резюме до того, як рекрутер його закриє за 6 секунд.
Підпишись на наш Telegram-канал та отримуй свіжі статті та вакансії
Свіжі статті щотижня