Middle/Middle+/Senior
Intro
- Розкажи коротко про себе і свій професійний досвід (з чим працював, зараз працюєш), яку роль виконував на цих проєктах 
- Які найскладніші задачі ти виконував або просто що тобі найбільше запам’яталось як розробнику 
- Чи пишеш/писав для себе пет-проєкти? Найцікавіший? 
- Чи доводилось тобі керувати командою / менторити молодших розробників? 
- Чи виникали конфліктні ситуації з іншими розробниками, як ти їх вирішував? 
- Уточнюючі питання по досвіду, стеку → відповідно попередніх відповідей відбирати найбільш доцільні питання із нижчеперелічених 
Java Core (основне)
- як працює хешмапа 
- що таке колізія 
- чи може елемент в хешмапі змінити свій бакет за якихось обставин? 
- чи завжди в бакеті лінкедліст чи може бути якась інша структура даних 
- яким чином може виникнути меморі лік в хешмапі? 
- *на подумати – яким чином хешмапа перебудовує елементи з лінкедліста в дерево, якщо ключі не є Comparable 
- hashmap vs treemap (використання, особливості кожної) 
- що таке імутабельний об’єкт 
- Дженерики 
- що таке класлоудер, для чого потрібен і чому їх 3 (чи зможеш назвати) 
- JVM – ділянки памяті (stack, heap(+metaspace)) (string pool, integer pool) 
- як працює GC? Чув за Stop-the-World pause? 
 (чи може нагрузитися CPU якщо в нас проблеми тільки з пам’яттю? Чому?)
- чому важливо перевизначати equals разом із hashcode? 
- розкажи за hashcode все що ти знаєш 
- колекції, ексепшини, стріми, файлові потоки, серіалізація 
- Java NIO. Channel, Buffer, etc 
- AOP. Що краще використовувати рефлексію, чи АОП? 
- Lombok & AspectJ 
- Методології розробки, поясни + і - ООП/ФП 
- Jar types Fat/Uber/Lightweight різниця і приклади використання 
Networking
- Що таке сокет в контексті мереж? 
- Чи можемо ми працювати в джава з сокетами? 
- Які основні протоколи існують в мережевому стеці? (http, ssl, tcp/ip) 
- Чи ти чув щось за модель OSI? 
- TCP handshake 
- Connection timeout 
- WebSocket 
Tests / CI/CD
- Які методології, практики написання та інтеграції тестів ти знаєш? 
- Наведи бест практіс використання тест контейнерів 
- Які методології, практики CI/CD ти знаєш для забезпечення надійної системи? 
- Для чого потрбіно агрегувати метрики по часу? 
Security
- Що таке аутентифікація vs авторизація 
- Що таке сервлет фільтри 
- SecurityFilterChain, DelegatingFilteProxy 
- Як підсунути свій фільтр 
- Типи шифрування (симетричне асиметричне) 
- JWT, токени загалом, OIDC, OAuth2 
- SSL сертифікати 
- HTTP/HTTPS 
- Поясни процес аутентифікації у Spring Security. Як відбувається взаємодія з SecurityContextHolder? Чому він тредлокал? Що було б, якщо б він був не threadsafe? 
- Authentication/Principal objects 
J2EE
- Що таке томкат, його архітектура, флоу обробки запиту 
- Сервлет (чи є threadsafe), структура HTTP запиту 
- поняття ідемпотентності та як реалізувати ідемпотентність http запиту 
- Як би ти реалізував свій менеджмент сесій? (кукі, etc) 
Spring
- Для чого потрібен спрінг бут і в чому його особливості? 
- Для чого потрібен @Conditional? 
- Можливо ти щось чув за @ConfigurationProperties? 
- Як працює Spring MVC. Що таке MVC? (DispatcherServler -> /get -> invoke Controller getMapping using reflection passing needed arguments) 
- Різниця Controller vs RestController 
- Що таке RESTful API 
- Як працює анотація @Transactional? 
- Transaction propagation and isolation 
- Як працює/що робить анотація @EnableSmth? 
- Як працює анотація @Scheduled, який тредпул юзає? Чи можемо ми це конфігурувати? 
- Spring плагіни для Maven, як модифікувати конфігурації збірки Spring project 
- Що таке dependencyManagement plugin, призначення 
- Як обробляти помилки на рівні Spring? (ExceptionHandler’s) 
Multithreading
- Різниця потоку і процесу 
- Що таке потік 
- Для чого потрібні потоки 
- Чому не можна створювати потоки через new Thread() – які аналоги? Кращі підходи? 
- Які основні проблеми виникають при роботі з багатопотоковістю? 
- Як можна вирішати дані проблеми? (синхронізація – sync, locks) 
- Чи знаєш, що таке монітор? 
- Що таке volatile? Для чого він потрібен? Чув щось за JMM? (*happens-before, operation reordering) 
- Різниця між synchronized і locks 
- Асинхронний код. CompletableFuture. Як обробляти помилки? 
- Що таке дедлок 
- *усна задачка: є в тебе 2 потоки, які одночасно інкрементують змінну. Чи допомже в такому випадку volatile? (зрозуміти, чи кандидат розуміє для чого взагалі volatile і чи він розуміє як працює взаємодія з пам’яттю – інкрементація не є атомарною операцією) 
- Чи є в джава якісь класи для роботи з при примітавами в контексті багатопотковості? 
- Які знаєш багатопотокові колекції? Як працюють? 
- ThreadLocal 
Docker & k8s & клауди
- Чи використовував докер і кубернетес? Для чого це потрібно? 
- Для чого нам клауди? Які сервіси юзав і для чого? (EC2, S3, SQS, SNS) 
- Де б ти зберігав конфіденційну інформацію? (api ключі, токени, паролі, для внутрішньої роботи застосунку) 
- Перечисли API k8s і для чого вони потрібні? 
- Що таке ingress? 
- Як і для чого використовувати kube secrets? 
- Які типи масштабування забезпечує k8s? 
- Як призупинити под? 
- под vs контейнер 
SQL & JDBC & Hibernate
- Як ми можемо працювати з БД використовуючи Java? Чи є в нас якийсь відповідний API? 
- Як створити запит і отримати результат в JDBC? 
- Які основні класи є на рівні JDBC? 
- Які основні проблеми і для чого нам потрібен Hibernate? 
- Як сконфігурувати Hibernate і які там основні класи? 
- Що таке Session/SessionFactory/Transaction? 
- Чи використовує Hibernate кешування? 
- Життєвий цикл сутності в Hibernate? 
- Чому виникає LazyInitializationException 
- Чув щось за HQL? 
- Як нам витягнути лише декілька полів з нашої сутності? (projections). Які нюанси такого підходу? 
- В нас дуже багато даних в таблиці, нам потрібно їх якось обробити. Якщо ми просто викличемо findAll(), в нас впаде застосунок. Як би ти це вирішив? Що б використовував? (Streaming Query — Stream<Entity> fetchBlaBla(..)) 
- QueryDSL, Criteria, etc? 
- Що таке транзакція? 
- Міграція 
- Тупить SQL. З чого почнеш дебаг і оптимізацію? :) 
- Рівні ізоляції транзакцій? 
- Чому просто не використовувати serializable? 
- Знаєш щось за ACID? 
- *локи в БД – optimistic, pessimistic 
- Що таке партиціювання в БД? Для чого потрібно? 
- Що таке шардинг БД? 
- Опиши що буде відбуватися при видаленні великої к-ті рядків в БД 
Microservices
- Які інструменти в джава існують для написання мікрсоервісних додатків? 
- Як би ти зробив інтеграцію із зовнішнім сервісом? 
- Різниця між синхронною і асинхронною комунікаціями. Коли краще яку використовувати? Мінуси і плюси кожної. 
- Які патерни знаєш, що використовував? (retry, circuit breaker, fallback pattern, etc) 
- Що таке сервіс діскавері? 
- Що таке меседж брокер? Працював з кафкою? 
- Що таке брокер в кафці? 
- Дефолтний ACK в Kafka 
- Як би ти організував зчитування з різних консьюмер груп? 
- Чи працював ти зі схема реджистрі, як це виглядало? 
- Як і де в кафці зберігаються данні? Коли вони видаляються? (retention policy) 
- Що таке zookeeper і для чого він потрібен? 
- Acknowledgements, MDS в Kafka, як вирішити типові проблеми (послідовність і дублікати) 
- DLQ паттерн 
- Що таке CQRS? 
- яким чином тестуються 3d party інтегрейшн сервіси? ми знаємо +- їхню поведінку, як їх замокати? 
- Протоколи комунікації (gPRC, HTTP, AMQP, WebSocket, etc) 
- Як відслітковувати флоу реквестів між різними сервісами? (Distributed tracing) (Sleuth, Zipkin) 
- CAP теорема. Розподілені система. Що це, чому це важливо, як саме вони забезпечують надійність системи. За рахунок чого? Можливо знаєш якісь алгоритми? 
- Розподілені транзакції (2PC, Saga) 
*Additional
- Чи приймав ти якісь архітектурні рішення, можливо використовував патерни, або займався якоюсь оптимізацією або моніторингом перформансу? 
- Що для тебе є ідеальною архітектурою? 
- З чого ти почав би міграцію монолітної архітектури на мікросервісну? 
- З чого починається розробка проєкту? 
- Що таке функціональні та нефункціональні вимоги? 
- Яким чином системи витримують high-load навантаження? Як би ти розробив таку систему? 
- Як можна моніторити Java-додатки в продакшні? 
- Які методи можуть бути використані для ефективного логування без впливу на продуктивність? (асинхронне логування (буферизація і флашинг пізніше на диск), плюси мінуси) 
- ELK stack 
- Кешування (коли треба юзати, проблеми з кешами). 
 Різниця між (і чи взагалі чув за →): Read-Through, Write-Through, Write-Behind, and Refresh-Ahead Caching
- усна задачака*: Десь вискочив OutOfMemoryException і як взнати що є причиною(об’єкти яких класів і в якому місці спричинили меморі лік)? Чи достатньо буде треддампу (в нас є декілька потоків, аутофмеморі міг викинутися в іншому потоці, який просто десь створив нову стрічку, але реальна проблема в іншому потоці)?(хіпдамп + треддамп) 
- Використовував профайлери? Для чого? Які? Що там можна подивитися? 
- Java Agent, що і для чого 
- Які юзаєш плагіни в IntelIj 
- Різниця між різними GC 
Тестове
- написати мікросервісний додаток [до години часу] 




