Привет! Меня зовут Бромбин Андрей. За последние годы у меня накопилось достаточно материалов, практик и ошибок — иногда красивых, но всё же ошибок. Этого хватило, чтобы собрать маршрут до грейда Middle.

Это не «большая книга всего на свете для джуна» и не выдуманный субъективный маршрут. Мне удалось привлечь к созданию этой статьи ведущих разработчиков крупных российских компаний — от каждого я получил честный фидбэк: где перегнул, где недосказал, чего не хватает на практике. Приоритеты были сверены, лишнее вычищено и оставлено только то, что реально двигает. Признаться, честно: тут и для меня нашлось, что подтянуть.

Всё нормально, он просто не подружился со Spring Security
Всё нормально, он просто не подружился со Spring Security

Дисклеймер: Требования к технологиям, зонам ответственности и грейдам заметно различаются от компании к компании. Я целюсь в «медиану по выборке». Искренне жду ваше мнение и опыт в комментариях, и мы сделаем эту статью ещё лучше.

Почему Java не теряет в актуальности?

Java исполнилось 30 лет — возраст зрелости. За треть века язык стал символом надёжности, устойчивости и технологической независимости и около трети всех разработчиков мира пишут на Java. Спрос стабилен: зрелая экосистема, предсказуемые LTS, ускорение под облака и AI. Java «умирает» уже тридцать лет — и, похоже, ещё столько же будет.

И главное — Java не стоит на месте. Каждый релиз закрывает слабые места, забирает удачные идеи из других языков и добавляет гибкости. В итоге — привычный стек, который эволюционирует и не ломается.

Отличие Junior от Middle грейда

Младший специалист: работает по инструкции. Опирается на готовые решения. Нуждается в регулярном ревью. Уверенно пишет модули по заданным интерфейсам. Видит чек-лист, а не систему.

Специалист: понимает проблему и требования. Задаёт критерии готовности. Предлагает и взвешивает варианты. Отвечает за качество и эксплуатацию. Смотрит на систему целиком, а также предупреждает неоптимальные решения и деградации.

Итог: помимо опыта с технологиями важно уметь понять задачу, выбрать жизнеспособное решение и довести её до продакшена быстро и без шума.

Soft-skills: что действительно важно

Отличаем «делаю всё сам» от операционной автономности: самостоятельный разработчик организует работу, привлекает нужных людей и ресурсы, отвечает за результат, не требуя постоянного контроля.

Базовые принципы:

  • Контекст → Решение → Коммитмент: сначала проясняем + уточняем задачу и ограничения, затем предлагаем варианты, после — фиксируем, кто что делает и к какому сроку.

  • Сроки с амортизацией: планируем дедлайны с буфером +20% под риски и зависимости. Разделяем внутренний срок и внешний, обновляем при изменении контекста.

  • Проактивность: не принимаем заведомо слабые решения. Если видим риск деградации (производительность, масштабируемость, эксплуатация, стоимость), подсвечиваем его и предлагаем варианты лучше.

  • Прозрачность: достаточные статусы, понятные артефакты, видимость прогресса для команды.

Морда лица без шрама
Морда лица без шрама

Правила общения:

  1. Формулируем вопрос грамотно, с контекстом: цель, факты и ограничения, что уже опробовано, что нужно и какой дедлайн.

  2. К каждой проблеме и вопросу предлагаем решение, честно обозначая плюсы и минусы вариантов.

  3. Уважительная коммуникация: критикуем решение, а не людей. Фиксируем договорённости и сроки.

Hard-skills

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

Минимальное погружение в каждый процесс позволят фиксировать понимание области, её ограничений, расширяя кругозор. При работе с ТЗ определяем причины и следствия каждого принятого решения.

Материалы и ресурсы для движения по дорожной карте
Материалы и ресурсы для движения по дорожной карте

Ссылка на материалы и ресурсы, сопровождающие дорожную карту в конце статьи.

Java Core — фундамент

Предполагаю, что на грейде Junior ты уже уверенно стоишь на двух ногах: Java и Core, но вполне можно чего-то не знать из списка ниже.

Всего-то нужно выучить и сиять
Всего-то нужно выучить и сиять

Зачем лезть так далеко: избежать скрытых деградаций и «магии», понимать стоимость операций.

Начинаем с самых низов — устройство JVM и модель памяти. Утечки, GC и виды сборщиков мусора: как JVM управляет heap’ом и когда происходят паузы. После этого рассматриваем фундаментальную производительность: JIT (Just In Time компилятор) и аллокации, а для её мониторинга — JFR (встроенный профайлер виртуальной машины Java) и JMH (Java Microbenchmark Harness).

После этого дело остаётся за малым, повторяем:

  • Коллекции, generics, immutability; equals/hashCode/compareTo, record.

  • Стримы, лямбды, функциональные интерфейсы и когда не использовать stream.

  • Исключения: проверяемые и непроверяемые, «wrap or rethrow».

  • Паттерны GoF: использование по необходимости — не ради галочки.

  • JDBC/Hibernate:DataSource и пулы (HikariCP), PreparedStatement/ResultSet, ручные транзакции; понимать, что такое ORM и когда обойтись чистым SQL.

Многопоточность — минимум для управления параллельностью

Синхронность, асинхронность, реактивность — модель исполнения определяет расход ресурсов, скорость и границы масштабирования.

Thread_0 и его шоколадная фабрика
Thread_0 и его шоколадная фабрика

Вспоминаем, как делать не стоит или, другими словами, ловушки многопоточности: дедлок, состояние гонки, ложные пробуждения, contention и способы в них не попасться:

  • JMM (volatile, synchronized, happens-before) — потому что правила видимости и порядка между потоками задают надёжность и предсказуемость.

  • ExecutorService, CompletableFuture, пулы и backpressure — потому что именно они управляют параллелизмом, таймаутами и отменой.

  • В Java 21 официально поддержаны Virtual Threads — эффективно для блокирующих операций ввода и вывода.

  • Атомики, ReentrantLock/StampedLock, Concurrent* — опора для безопасной работы с общими данными.

Базы данных — чтобы SQL помогал, а не мешал

Часто проблема производительности сервисов — не в бизнес-логике, а в дорогих запросах и несовершенной модели данных.

Вот на нём и погорел Титаник
Вот на нём и погорел Титаник

Наша задача в этом блоке сосредоточиться на производительности баз данных — познакомиться с инструментами для мониторинга и улучшения производительности, не забыв при этом повторить базовые проблемы и их решения:

  • ACID и транзакции: уровни изоляции в Postgres и MVCC.

  • JOIN и N+1: индексация ключей, join fetch/DTO, batch‑fetch.

  • Планы запросов и селективность: EXPLAIN (ANALYZE, BUFFERS), seq vs index scan.

  • Индексы: B‑Tree, GIN, GiST и порядок полей, partial и where, covering и include.

  • Хранимые процедуры, триггеры, оконные функции и представления.

  • Пул соединений и многопоточный доступ.

  • NoSql databases: Redis и KeyDB, MongoDB и сценарии применимости.

Лично мне постоянно приходится работать с базой данных и писать на SQL процедуры, функции, DDL и прочее. Если чувствуется, что дёргается глаз при написании запросов — тренажёр.

Spring Framework

Снова избавляемся от «магии», но на этот раз фреймворка. Находим то самое понимание: что именно и когда делает Spring, чем управляем мы, а чем — контейнер. Обязательно закрепляем результат хорошими практиками и подходами.

Здесь мы обретаем такое величие, которое Володе и не снилось
Здесь мы обретаем такое величие, которое Володе и не снилось
  • Контейнер и бины: жизненный цикл, профили, а также инъекции зависимостей, scope и qualifier.

  • Web: MVC и WebFlux, валидации, @ControllerAdvice, фильтры.

  • Data: JPA (ленивая загрузка, транзакции, N+1), миграции (Flyway или Liquibase).

  • Security: базовая auth, method security, Jwt и Oauth 2.0 аутентификации.

  • Observability: логирование, метрики Micrometer, трассировка OpenTelemetry.

  • Lombok — польза vs вред (скрытые конструкторы/equals).

В конечном итоге достигаем полного понимания процессов и циклов работы Spring приложения, виртуозно владеем бинами, данными и безопасностью. И, наконец, сможем ответить на любой самый хитрый вопрос о транзакциях в Spring.

Web/REST/Security

Зачем: самое главное в api — предсказуемость и соответствие контракту. Заодно освежаем сетевую основу, чтобы понимать, как общаются сервисы и как не попасть впросак.

А ты уже перевыполнил план укладки json'ов?
А ты уже перевыполнил план укладки json'ов?
  • REST/RESTful и дизайн endpoint’ов: идемпотентность и безопасные ретраи.

  • OpenAPI/Swagger спецификации.

  • Сети: DNS, TCP/UDP, основы HTTP/1.1–2–3, пулы соединений.

  • WebSocket и gRPC — когда они уместны.

  • Безопасность: XSS, SQLi, CSRF, brute force; rate-limit, headers, секьюрные дефолты.

В контексте веба я успел выпустить статью: Как я создал идеальный REST API — микросервис инцидентов на Java и Spring, приглашаю к прочтению.

System Design

Почему не надо: чтобы не принимать правильные решения при выборе подходов к взаимодействию, чтобы не видеть общую картину, не иметь запаса хороших паттернов и максимально увеличить сроки проектирования систем.

  • Принципы: ООП, SOLID, DRY/KISS/YAGNI.

  • CAP/PACELC, eventual consistency, идемпотентность, дедупликация.

  • Микросервисы: плюсы/минусы; интеграционные паттерны.

  • Архитектуры: Hexagonal, DDD, Clean.

  • Масштабирование: горизонтальное и вертикальное, партиционирование и шардирование, read-replicas и канареечные релизы.

  • Отказоустойчивость: health-чеки, circuit-breaker.

Совсем недавно в статье — RAG и векторные БД: НЕ Сизифов LLM на Java и Spring Ai, я рассматривал архитектурный паттерн интеграции LLM, ненавязчиво приглашаю к прочтению.

Межсервисное взаимодействие

Давайте вспомним легенду о Вавилонской башне и немного дополним эту историю:

После Великого потопа люди, спасшиеся на ковчеге Ноя, стали размножаться и расселяться по Земле (бум dot-com'ов). Единый народ жил одним языком (монолитная архитектура) и взялся строить башню «до небес» (большая единая платформа), но их язык был перемешан (разбит на микросервисы).
Команды заговорили на разных наречиях (стеках) и перестали понимать друг друга (несовместимые протоколы, разрозненные стили взаимодействия) — стройку бросили (проект закрыли).

Почему же так и не была построена Вавилонская башня, и как это связано с межсервисным взаимодействием?
Почему же так и не была построена Вавилонская башня, и как это связано с межсервисным взаимодействием?

Каков урок? Не используйте микросервисы.
А если серьёзно, сначала проектируйте межсервисное взаимодействие: чёткие контракты и версии, единые протоколы, соглашения об ошибках и идемпотентности, а также наблюдаемость. Тогда будет и скорость, и отказоустойчивость, и поддерживаемость — при укомплектованном и достаточном стеке, который вполне реально поддерживать.

Начинаем с моделей общения: синхронная или асинхронная. Определяем плюсы и минусы, протоколы, инструментарий отказоустойчивости и надёжности, не превращая систему в набор из зоопарка технологий и в страшный сон команды поддержки.

  • Синхронность vs асинхронность: REST/gRpc — для запрос/ответ, брокеры — для событий и долгих задач.

  • Брокеры сообщений: Kafka и RabbitMQ пригодятся для асинхронных операций, интеграций, ретраев, буферизации. Темы, партиции, группы, ключи для порядка, семантики доставки, dead letter queue — всё это неразрывно связанные понятия почти в любой интеграции.

  • Кэш: паттерны cache-aside и write-through, TTL, инвалидация.

  • gRPC: бинарные контракты (Protobuf), стриминг, внутренняя сеть.

  • GraphQl: фасад для клиента, чтобы удовлетворить его запрос и не потратить ни одного лишнего байта.

Не так давно я выпускал статью: Как я реализовал взаимодействие микросервисов — Kafka и gRpc, приглашаю к прочтению.

DevOps для разработчика

Зачем: чтобы «ничего не знаю, локально всё работает», превратилось в вопрос: «ты как это завёл на контуре, который ещё не подняли?». Чем лучше разработчик понимает окружение, тем более предсказуем процесс развёртывания и функционирования системы.

  • CI/CD: базовый pipeline — раннеры, сборка, security scan, тесты, теги и артефакты, релизы.

  • Gradle и Maven: reproducible builds, профили, параметры, репозитории, кэширование.

  • Docker: multi-stage, slim-образы, healthcheck; docker-compose для локали.

  • Kubernetes/Helm: values, ресурсы и лимиты, secrets и configMap'ы, liveness-readiness-startup-пробы, rollout и rollback.

  • Мониторинг/логирование: ELK и EFK, Loki, Prometheus и Grafana, OpenTelemetry.

  • Базовый Linux: сеть, системные службы, права, bash-скрипты.

Минимум в тестировании

Мой «morning routine» состоит из: прогнать юнит-тесты, тест-кейсы, проверить наdevконтуре, проверить на rel, а потом ещё интегрировано, нагрузочно и далее. Другими словами, отдавать в тестирование необходимо работающий код.

Пирамида тестов читается снизу вверх: Unit, Integration, End2End testing
Пирамида тестов читается снизу вверх: Unit, Integration, End2End testing
  • Пирамиду тестов: цели, задачи, ресурсоёмкость каждого уровня.

  • Инструменты: Spring Testing Framework, JUnit 5, Mockito, Testcontainers.

  • Контрактные тесты: OpenAPI и JSON-schema проверки, фикстуры и билдеры, миграционные тесты.

  • Нагрузочное: JMeter — baseline, регресс, метрики. Сценарии — smoke/stress/soak.

Простые советы

Фиксируем движение: ведём короткие отчёты прогресса, а по итогам — проводим ретроспективу: что получилось, что улучшили, а что не сложилось.

Посмотрев на этот роадмап, может показаться, что осилить его трудно — и отчасти это так.
Но каждый день, закрывая даже самый небольшой пункт, ты делаешь не шаг, а прыжок вперёд. Чтобы облегчить путь, встрой его в свой рабочий процесс, говори «да» новому, расширяй зоны ответственности, будь смелым и храбрым — и сам не заметишь, как станешь профессионалом, коих на самом деле не так много.
Помни: дорогу осилит идущий!

Заключение

Материалы и ресурсы для движения по дорожной карте
Материалы и ресурсы для движения по дорожной карте

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

Надеюсь, статья оказалась полезной и вдохновляющей. Я подозреваю, что покрыть полный стек навыков и знаний в одной статье невозможно, поэтому приглашаю делиться своим мнением в комментариях к данной статье. Буду рад конструктивной критике: вместе мы сделаем наш путь ещё интереснее и полезнее.

© 2025 ООО «МТ ФИНАНС»

Комментарии (4)


  1. kmatveev
    08.10.2025 09:45

    Какое лютое ллм-ное дерьмо.

    Начинаем с самых низов — устройство JVM и модель памяти. Утечки, GC и виды сборщиков мусора: как JVM управляет heap’ом и когда происходят паузы. После этого рассматриваем фундаментальную производительность: JIT и аллокации, а для её мониторинга — JFR и JMH.

    точно не надо с этого начинать. Всё, что написано после этой цитаты - бессмысленное перечисление названий технологий.

    Мне удалось привлечь к созданию этой статьи ведущих разработчиков крупных российских компаний — от каждого я получил честный фидбэк

    рад был помочь.


    1. br0mberg Автор
      08.10.2025 09:45

      Сами материалы и ресурсы, которые я собрал в формате дорожной карты, разместил по ссылке.

      Статью можно интерпретировать как чек-лист с темами и обоснованием их изучения, понимание которых в наших реалиях неплохо бы сформировать. Знаю множество людей для которых подобный формат был бы полезен, я и сам сталкивался с проблемой нечёткости картины движения на этом пути.

      LLM при написании статьи не использовалось в качестве источника информации. И отмечу, что цели ужать в одну статью в рассказ о каждой технологии не было, это получилась бы летопись.

      Вместо этого, планируется выпускать небольшие статьи на каждую из тем, чтобы "магические" названия технологий, превратились в знакомые инструменты каждому.
      Большое спасибо за комментарий


  1. suntori
    08.10.2025 09:45

    Автор, а где сам роадмап-то? Ни в статье нет, ни даже в ТГ-канале. Хотя сами же указали, что

    Сам роадмап я выложил в Telegram-канале


    1. br0mberg Автор
      08.10.2025 09:45

      Теперь выложил, время публикации сдвинулось — не уследил) Приятного прочтения!