Перейти к основному содержимому
DevScallix

Роудмапы · L2

Middle Java Developer

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

Чем отличается от предыдущего уровня

Junior выполняет задачу с ясными деталями. Middle уточняет расплывчатое требование, сравнивает варианты, заранее видит риски и умеет делать review чужого кода. Ему нужна не опека, а периодическая синхронизация.

Ожидаемые знания

  • Concurrency: потоки, ExecutorService, visibility, разница synchronized и volatile, ConcurrentHashMap
  • Как @Transactional в Spring работает через proxy, а также propagation и правила rollback
  • JPA: проблема N+1, стратегии загрузки, DTO-проекции, optimistic locking
  • SQL: выбор индексов, чтение EXPLAIN, основы уровней изоляции
  • Стратегия тестирования: баланс unit-, slice- и integration-тестов, Testcontainers
  • Дизайн REST API: версионирование, пагинация, единый формат ошибок (ProblemDetail)
  • Основы аутентификации: сессии и JWT, самые частые ошибки авторизации
  • CI/CD, Docker и базовая observability: структурные логи, метрики, health check

Практические навыки

  • Найти медленный запрос и исправить его индексом или изменением запроса
  • Писать integration-тесты на реальном PostgreSQL
  • Разбирать жалобу клиента по логам, метрикам и трассам
  • Готовить обратно совместимое изменение API и миграцию базы данных
  • Правильно определять границы транзакций и избегать длинных транзакций
  • Конструктивно делать review чужого Pull Request

Типичные ошибки

  • Вызывать @Transactional-метод из того же класса и ждать транзакцию
  • Читать lazy-коллекцию в цикле и порождать запросы N+1
  • Делать внешний HTTP-вызов внутри транзакции
  • Писать тесты, где замокано всё и ни одна реальная интеграция не проверена
  • Вызывать внешний сервис без таймаутов и политики повторов

Приоритеты обучения

  1. 1Глубоко понять транзакции и базу данныхPropagation, изоляция, блокировки и индексы. Большинство сбоев в продакшене начинается здесь.
  2. 2Улучшать производительность измерениямиРаботайте с SQL-логом, EXPLAIN и профайлером вместо догадок.
  3. 3Выстроить стратегию тестированияВыбирайте unit-, slice- и Testcontainers-тесты по цели; избегайте медленных и хрупких тестов.
  4. 4Освоить основы concurrency и асинхронной обработкиЗамечать race condition, писать потокобезопасный код и знать основы обмена сообщениями, например Kafka.
  5. 5Отвечать за поставку и поддержкуCI/CD, мониторинг и выводы после инцидентов. Будьте владельцем кода, который пишете.

Архитектурная зрелость

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

Примеры вопросов

  • Почему @Transactional не работает при self-invocation?
  • Как бы вы обнаружили и исправили проблему N+1?
  • В чём практическая разница между REPEATABLE READ и READ COMMITTED?
  • Когда вы выберете unit-тест, slice-тест или integration-тест?
  • Как в Kafka сохраняется порядок для одного ключа?
  • Почему порядок столбцов в составном индексе важен?
  • Покажите race condition и исправьте его.

Упражнения для самостоятельной работы

  • Создайте N+1 в endpoint, докажите его по SQL-логу и исправьте fetch join и DTO-проекцией.
  • Напишите сценарий lost update, где две транзакции меняют одну строку, и решите его через @Version.
  • Добавьте в сервис integration-тест на Testcontainers и запустите его в CI.
  • Добавьте к внешнему вызову таймаут, retry и преобразование ошибок и протестируйте каждое.
  • Сделайте review открытого Pull Request и разделите блокирующие замечания и nit.

Статьи для этого уровня

Подходящие программы

Насколько вы близки к этому уровню?

Оценка навыков формирует личный отчёт о пробелах на основе ваших ответов. Это рекомендация, а не сертификат.