Получить доступ

Индивидуальный план развития: Java

Выберите текущий и целевой грейд — останутся темы, которые нужно освоить, с проверяемыми критериями, практическими заданиями и оценкой трудоёмкости. План можно скопировать в документ компании, скачать таблицей или распечатать.

1 этап Основы языка

Примитивы, строки и методы Основа

Junior
  • Объясняет разницу примитивов и обёрток, автоупаковку и ловушку == с Integer
  • Объясняет неизменяемость строк, пул строк и когда нужен StringBuilder
  • Объясняет, что Java всегда передаёт аргументы по значению, включая ссылки
  • Описывает порядок инициализации полей, static-блоков и конструкторов

Практика. Решить 20 задач «что выведет код» на примитивы, строки, передачу параметров и инициализацию, объяснив каждую.

ООП, интерфейсы и неизменяемость Основа

Junior
  • Объясняет принципы ООП на примерах кода
  • Выбирает между интерфейсом и абстрактным классом

Практика. Спроектировать иерархию фигур или платёжных методов с интерфейсами и полиморфизмом.

Middle
  • Проектирует неизменяемый класс и объясняет его преимущества для многопоточности
  • Предпочитает композицию наследованию и объясняет почему

Практика. Переделать изменяемый класс денежной суммы в неизменяемый с операциями и тестами.

Равенство и исключения Основа

Junior
  • Переопределяет equals и hashCode согласованно и объясняет, что сломается в HashMap без этого
  • Объясняет иерархию исключений и разницу checked и unchecked
  • Закрывает ресурсы через try-with-resources

Практика. Написать класс-ключ без hashCode, показать поломку в HashMap и исправить.

Middle
  • Проектирует обработку ошибок в сервисе — свои исключения, перевод в коды ответа, без проглатывания

Практика. Описать и реализовать единую обработку ошибок REST-сервиса с иерархией своих исключений.

2 этап Коллекции

ArrayList и LinkedList Основа

Junior
  • Объясняет устройство ArrayList и рост массива
  • Называет сложность основных операций ArrayList и LinkedList

Практика. Реализовать свой динамический массив с ростом и сравнить скорость с ArrayList.

Middle
  • Объясняет, почему LinkedList на практике проигрывает даже на вставках

Практика. Замерить JMH вставку в середину ArrayList и LinkedList на разных размерах и объяснить результат.

HashMap, HashSet и LinkedHashMap Основа

Junior
  • Объясняет устройство HashMap — хеш, бакеты, коллизии, расширение

Практика. Объяснить на листке, что происходит при put в HashMap с коллизией и при расширении.

Middle
  • Объясняет treeify, коэффициент загрузки и цену resize
  • Реализует LRU-кэш на LinkedHashMap

Практика. Реализовать LRU-кэш на LinkedHashMap и с нуля на хеш-таблице и двусвязном списке.

TreeMap, очереди и итераторы Основа

Junior
  • Использует TreeMap для диапазонных запросов и PriorityQueue для приоритетов
  • Объясняет ConcurrentModificationException и как удалять элементы при обходе

Практика. Решить задачи «топ-K элементов» на PriorityQueue и «ближайшее событие к моменту» на TreeMap.

Middle
  • Выбирает реализацию коллекции под набор операций и объясняет выбор

Практика. Для 5 сценариев выбрать коллекцию и обосновать по сложности операций.

3 этап Дженерики

Дженерики Основа

Middle
  • Пишет обобщённые классы и методы с ограничениями
  • Объясняет стирание типов и его последствия
  • Применяет PECS — extends для чтения, super для записи

Практика. Написать обобщённый кэш и утилиту копирования коллекций с правильными wildcards.

4 этап Лямбды и Stream API

Лямбды и Stream API Основа

Junior
  • Пишет лямбды и ссылки на методы и использует стандартные функциональные интерфейсы
  • Обрабатывает коллекции стримами — filter, map, collect, groupingBy

Практика. Переписать 10 циклов обработки списка заказов на стримы с группировкой и агрегацией.

Middle
  • Объясняет ленивость стримов и порядок выполнения операций
  • Использует Optional по назначению и не злоупотребляет им
  • Знает, когда параллельный стрим вредит

Практика. Написать собственный Collector и замерить последовательный и параллельный стрим на разных объёмах.

5 этап Современная Java

Современная Java Основа

Junior
  • Использует records для DTO и switch-выражения

Практика. Перевести DTO учебного проекта на records.

Middle
  • Моделирует варианты данных sealed-интерфейсами и обрабатывает их pattern matching
  • Знает, какие возможности появились в LTS-версиях 17 и 21

Практика. Описать результат операции (успех, ошибка валидации, ошибка системы) sealed-иерархией и обработать switch с pattern matching.

6 этап Многопоточность

Потоки и синхронизация Основа

Junior
  • Создаёт потоки и объясняет их состояния и корректную остановку через прерывание
  • Защищает общее состояние synchronized

Практика. Сделать потокобезопасный счётчик и банковский перевод между счетами без гонок.

Middle
  • Использует ReentrantLock, ReadWriteLock и Condition по назначению
  • Находит взаимную блокировку по дампу потоков

Практика. Воспроизвести взаимную блокировку, найти её через jstack и исправить порядком захвата.

Java Memory Model и атомарность Основа

Middle
  • Объясняет видимость и happens-before и когда нужен volatile
  • Использует AtomicInteger, LongAdder и CAS вместо блокировок там, где уместно

Практика. Показать проблему видимости без volatile и исправить тремя способами.

Senior
  • Объясняет безопасную публикацию объектов и ошибку double-checked locking без volatile

Практика. Разобрать реализацию ленивого синглтона с double-checked locking и объяснить, что гарантирует volatile.

Пулы потоков и CompletableFuture Основа

Middle
  • Создаёт пулы с ограниченной очередью и политикой отказа, подбирает размер под задачи
  • Строит асинхронные цепочки на CompletableFuture с обработкой ошибок и таймаутами
  • Объясняет утечку ThreadLocal в пулах потоков

Практика. Параллельно опросить 5 внешних сервисов через CompletableFuture с общим таймаутом и частичными результатами.

Конкурентные коллекции и координация Основа

Middle
  • Объясняет устройство ConcurrentHashMap и атомарные операции compute и merge
  • Использует BlockingQueue для производителей и потребителей
  • Применяет Semaphore, CountDownLatch и CyclicBarrier

Практика. Реализовать конвейер производитель — потребитель на BlockingQueue с корректным завершением.

Виртуальные потоки Основа

Middle
  • Объясняет, чем виртуальные потоки отличаются от платформенных и для каких задач подходят

Практика. Переписать сервис с пулом потоков для HTTP-вызовов на виртуальные потоки и сравнить пропускную способность.

Senior
  • Знает ограничения — закрепление при synchronized до JDK 24, пулы ресурсов, ThreadLocal — и оценивает переход сервиса

Практика. Оценить перевод Spring Boot сервиса на виртуальные потоки — узкие места, пулы соединений, риски.

7 этап JVM и сборка мусора

Память JVM Основа

Middle
  • Объясняет области памяти JVM и что хранится в каждой
  • Настраивает размер кучи для контейнера через MaxRAMPercentage
  • Снимает и анализирует дамп кучи при утечке

Практика. Создать утечку памяти в учебном сервисе, снять heap dump и найти причину в Eclipse MAT или VisualVM.

Сборка мусора Основа

Middle
  • Объясняет поколения, достижимость и как работает G1
  • Читает GC-лог и находит длинные паузы

Практика. Включить GC-логи у сервиса под нагрузкой и описать частоту и длительность пауз.

Senior
  • Выбирает сборщик (G1, ZGC, Parallel) под требования задержки и пропускной способности
  • Диагностирует проблемы GC по метрикам продакшена

Практика. Сравнить G1 и ZGC на одном сервисе под нагрузкой по p99 задержки и потреблению памяти.

Загрузка классов и JIT Основа

Senior
  • Объясняет делегирование загрузчиков классов и утечки метаспейса
  • Объясняет JIT, прогрев и почему микробенчмарки пишут на JMH

Практика. Написать JMH-бенчмарк для двух реализаций и объяснить ловушки (мёртвый код, прогрев).

8 этап Ввод-вывод и данные

Ввод-вывод и данные Основа

Junior
  • Читает и пишет файлы с буферизацией и правильной кодировкой
  • Работает с датами через java.time и часовыми поясами

Практика. Обработать большой CSV построчно без загрузки в память и посчитать агрегаты.

Middle
  • Объясняет неблокирующий ввод-вывод NIO
  • Выбирает формат сериализации (JSON, protobuf) и объясняет риски Java-сериализации

Практика. Реализовать хранение событий с датами в UTC и вывод в часовом поясе пользователя с тестами на переход времени.

9 этап Дизайн и паттерны

Дизайн и паттерны Основа

Junior
  • Объясняет принципы SOLID на примерах
  • Узнаёт в коде основные паттерны — фабрика, строитель, стратегия, наблюдатель, декоратор

Практика. Найти 5 паттернов в исходниках JDK или Spring и объяснить, какую задачу они решают.

Middle
  • Применяет паттерн для решения конкретной проблемы, а не ради паттерна
  • Находит нарушения SOLID в коде и рефакторит их

Практика. Отрефакторить класс на 500 строк с несколькими ответственностями по SOLID с тестами до и после.

10 этап Сборка, тесты и логирование

Сборка, тесты и логирование Основа

Junior
  • Собирает проект в Maven или Gradle и управляет зависимостями
  • Пишет тесты на JUnit 5 с Mockito и AssertJ
  • Логирует через SLF4J с правильными уровнями

Практика. Создать проект на Gradle с модулем бизнес-логики, тестами JUnit 5 и Mockito и отчётом о покрытии.

Middle
  • Настраивает многомодульную сборку и разрешает конфликты версий зависимостей

Практика. Разобрать конфликт версий транзитивных зависимостей в многомодульном проекте и зафиксировать версии через BOM.

Spring · 1 этап Контейнер и бины

IoC, DI и бины Основа

Junior
  • Объясняет IoC и внедрение через конструктор и почему оно предпочтительнее
  • Объявляет бины стереотипами и методами @Bean
  • Описывает жизненный цикл бина и scopes singleton и prototype

Практика. Сделать приложение из трёх слоёв (контроллер, сервис, репозиторий) с внедрением через конструктор и тестом сервиса.

Middle
  • Решает конфликты при нескольких кандидатах — @Primary, @Qualifier
  • Объясняет, почему prototype внутри singleton не обновляется и как это исправить

Практика. Разобрать на примере проблему prototype-бина внутри singleton и исправить через ObjectProvider.

Конфигурация и контекст Основа

Junior
  • Настраивает приложение через application.yml, профили и переменные окружения

Практика. Вынести все настройки сервиса в application.yml с профилями dev и prod.

Middle
  • Связывает настройки в типизированные @ConfigurationProperties с валидацией
  • Использует события контекста и условные бины

Практика. Описать настройки внешней интеграции классом @ConfigurationProperties с валидацией и тестом.

AOP и прокси Основа

Middle
  • Объясняет, как Spring создаёт прокси и чем JDK-прокси отличается от CGLIB
  • Объясняет, почему самовызов обходит @Transactional и @Cacheable
  • Пишет аспект для сквозной логики (замер времени, аудит)

Практика. Воспроизвести самовызов метода с @Transactional, показать, что транзакции нет, и исправить.

Spring · 2 этап Spring Boot

Spring Boot Основа

Junior
  • Создаёт приложение на Spring Boot со стартерами и запускает его
  • Подключает Actuator и проверяет health и метрики

Практика. Создать сервис на Spring Boot с REST-эндпоинтом, Actuator и сборкой в исполняемый jar.

Middle
  • Объясняет, как работает автоконфигурация и как её переопределить
  • Пишет собственный стартер с условной автоконфигурацией

Практика. Вынести общую интеграцию в собственный стартер с автоконфигурацией и тестами условий.

Spring · 3 этап Веб-слой

Spring MVC и REST-контроллеры Основа

Junior
  • Пишет REST-контроллеры с правильными методами, кодами и DTO

Практика. Реализовать CRUD API заказов на Spring MVC с DTO и тестами через MockMvc.

Middle
  • Описывает путь запроса через фильтры, DispatcherServlet и перехватчики
  • Настраивает встроенный сервер и пул потоков под нагрузку

Практика. Добавить фильтр корреляции запросов с trace_id в MDC и перехватчик замера времени.

Валидация и обработка ошибок Основа

Junior
  • Валидирует входные данные аннотациями Bean Validation
  • Обрабатывает ошибки в @ControllerAdvice и возвращает понятный ответ

Практика. Добавить валидацию создания заказа и единую обработку ошибок с тестами.

Middle
  • Возвращает ошибки в формате Problem Details и пишет свои валидаторы

Практика. Перевести ответы об ошибках сервиса на ProblemDetail и написать валидатор согласованности полей.

Spring · 4 этап Данные и транзакции

Spring Data JPA Основа

Junior
  • Создаёт сущности и репозитории, пишет запросы методами и @Query

Практика. Сделать слой данных для заказов и позиций на Spring Data JPA с тестами на Testcontainers.

Middle
  • Устраняет N+1 через fetch join и entity graph и видит SQL в логах
  • Использует проекции и пагинацию для больших выборок
  • Объясняет persistence context и dirty checking

Практика. Найти N+1 и лишние запросы в учебном проекте через логи Hibernate и сократить число запросов на странице до константы.

Транзакции в Spring Основа

Junior
  • Использует @Transactional на сервисном слое для связанных изменений

Практика. Сделать оформление заказа с резервом товара в одной транзакции и тестом отката.

Middle
  • Объясняет propagation REQUIRED и REQUIRES_NEW и откат при checked-исключениях
  • Находит причины, по которым транзакция не работает — самовызов, private, не тот менеджер
  • Не держит транзакцию во время внешних вызовов

Практика. Записать журнал аудита в отдельной транзакции REQUIRES_NEW так, чтобы он сохранялся при откате основной.

Spring · 5 этап Spring Security

Spring Security Основа

Middle
  • Настраивает SecurityFilterChain для REST API с JWT
  • Подключает вход через OAuth 2.0 и OIDC и сервер ресурсов
  • Защищает методы через @PreAuthorize с проверкой владельца ресурса

Практика. Защитить API заказов JWT-токенами внешнего провайдера, разграничить роли и проверку владельца.

Senior
  • Объясняет устройство цепочки фильтров и пишет свой фильтр аутентификации
  • Проектирует безопасность для нескольких сервисов и клиентов

Практика. Реализовать аутентификацию по API-ключу для партнёров отдельной цепочкой фильтров рядом с JWT для пользователей.

Spring · 6 этап Тестирование Spring Boot

Тестирование Spring Boot Основа

Junior
  • Пишет тесты контроллеров через @WebMvcTest и MockMvc

Практика. Покрыть контроллер заказов тестами MockMvc на успешные ответы и ошибки валидации.

Middle
  • Пишет интеграционные тесты на Testcontainers с переиспользованием контейнеров
  • Подменяет бины через @MockitoBean и ускоряет тесты кэшированием контекста

Практика. Перевести интеграционные тесты с H2 на Testcontainers PostgreSQL и сократить время прогона за счёт общего контекста.

Spring · 7 этап Сообщения в Spring

Сообщения в Spring Основа

Middle
  • Пишет продюсер и потребитель Kafka на Spring Kafka с обработкой ошибок и DLT
  • Настраивает подтверждения и повторы в Spring AMQP
  • Объясняет, когда уместна абстракция Spring Cloud Stream

Практика. Реализовать обработку событий заказа на Spring Kafka с повторами, DLT и интеграционным тестом в Testcontainers.

Spring · 8 этап Микросервисы на Spring

Микросервисы на Spring Основа

Middle
  • Добавляет таймауты, повторы и circuit breaker через Resilience4j
  • Подключает трассировку Micrometer Tracing и метрики

Практика. Обернуть вызов внешнего сервиса в Resilience4j с circuit breaker и проверить поведение в тесте с медленной заглушкой.

Senior
  • Выбирает компоненты Spring Cloud против средств платформы (Kubernetes, service mesh) и обосновывает

Практика. Сравнить для своего проекта Spring Cloud Gateway и ingress-контроллер Kubernetes и описать выбор.

Spring · 9 этап Reactive и WebFlux

Reactive и WebFlux Полезно знать

Middle
  • Объясняет Mono и Flux, backpressure и почему блокирующий вызов ломает реактивный сервис
  • Выбирает между WebFlux и MVC с виртуальными потоками

Практика. Реализовать агрегирующий эндпоинт на WebFlux, опрашивающий три сервиса параллельно, и сравнить с MVC на виртуальных потоках.

Spring · 10 этап Spring Batch и Integration

Spring Batch и Integration Полезно знать

Middle
  • Строит пакетную обработку на Spring Batch с чанками, повторами и перезапуском

Практика. Реализовать импорт большого CSV в базу на Spring Batch с пропуском ошибочных строк и перезапуском с места падения.

← Карта «Java»

Закрытая бета

План есть — пора на собеседование

sotto слышит вопрос интервьюера и показывает короткий ответ и план. Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем