Митап Java Guild: T-Shape и реактивное программирование

Митап JVM Guild — Community of Practice, основанный мной в Dats.Team. Выступали два разработчика из моих команд.

Бэкап видео (OneDrive) · Бэкап видео (Wayback Machine)


Доклад 1. Иван Самойлов — «Практика T-Shape»

Soft-skill доклад о концепции T-Shape специалистов и том, зачем развивать смежные компетенции.

Концепция появилась в 1991 году в дизайнерской компании IDEO для найма. I-Shape — узкий специалист с глубокой экспертизой в одной области; generalist — широкий кругозор без глубины; T-Shape — комбинация: глубокая экспертиза + широкий кругозор по смежным областям.

Команды из чистых I-Shape-специалистов лучше подходят под waterfall и требуют сильного менеджмента сверху. T-Shape — гибче, лучше для agile.

Плюсы T-Shape

  • Скорость поставки, меньше простоев
  • Высокий bus-factor (команда устойчива к выпадению человека)
  • Возможности роста сотрудников

Минусы

  • Подходит не всем
  • Такие специалисты дороже
  • Узкая специализация всё ещё оправдана для сложных проектов

Развитие концепции

P-Shape — две глубокие экспертизы (например fullstack или SDET), M-Shape / Comb-Shape («человек-расчёска») — несколько глубоких экспертиз.

Как развиваться

  • Работать в гибкой команде, где можно подключаться к смежным задачам
  • Составлять командой карту компетенций (Star Map), чтобы видеть потребности и желания роста
  • Искать ментора или комьюнити

Доклад 2. Дмитрий Рудопысов — «От стримов к флюксам»

Технический kick-off по реактивному программированию в Java для тех, кто знаком со Stream API, но не с Project Reactor.

Stream API → Flux

Stream API (Java 8) даёт декларативный стиль: filter, sorted, map, collect — код читается почти как английский. Но стримы работают с готовой коллекцией. Когда данные приходят асинхронно — из БД, по WebSocket, от пользователя — нужен Flux (Project Reactor).

API Flux намеренно похоже на стримы (map, filter, flatMap, reduce), поэтому переход относительно простой. Но Flux — это не замена стримов, а другая концепция для другого класса задач.

Лайв-кодинг

На демо-проекте Currency Calculator: создание Flux через sink, tryEmitNext, подписка через subscribe. Без терминальной операции — как и в стримах — ничего не запустится.

Backpressure

Ключевое отличие от стримов. На демо приложение «застряло» на 256 запросах (дефолтный буфер). Можно тюнить размер буфера или применять стратегии управления, когда производитель быстрее потребителя.

Параллелизм

У parallelStream() один общий thread pool на всё приложение — опасно. У Flux можно гибко указывать scheduler.

Реальный пример

Обработка WebSocket-сообщений через Flux с doFirst (аутентификация), timeout, flatMap для бизнес-логики и обратным потоком через sink. Сейчас реактивные драйверы есть для БД, очередей, браузеров — экосистема дозрела.