Конференция JPoint в этот раз особенная. Во-первых, помимо онлайн-части, впервые за два года будет возможность увидеться в офлайне. А во-вторых, офлайн-день пройдёт в Санкт-Петербурге (вместо привычной для JPoint Москвы). Но если до Петербурга добраться не можете, то и этот последний день можно увидеть хотя бы в виде онлайн-трансляции.
А вот с точки зрения программы таких разительных изменений нет. Нас по-прежнему интересуют доклады про инструменты, JVM, Spring, архитектуру, JVM-языки вроде Kotlin — в общем, про всё, что интересует опытных джавистов. Представляем Хабру описания докладов (и из онлайновой части, и из офлайновой).
Оглавление
Инструменты
Ноутбуки Kotlin для обучения и прототипирования
Александр Нозик
МФТИ
Для дата-сайентистов или преподавателей Python «ноутбук» — это не привычное всем раскладное компьютерное устройство, а другой стандартный рабочий инструмент. Но могут ли эти ноутбуки помочь закоренелым Java-бэкендерам?
Затащить ноутбуки в JVM-мир (в основном в Scala) пытались неоднократно, но дальше дата-сайентистов дело обычно не доходило.
Александр покажет скриптовое расширение компилятора Kotlin, которое не только позволяет писать на Kotlin в ноутбуке, как в случае с Python, но и решает ряд проблем в этой области. Например, воспроизводимость окружения или сборки и (частично) загрузки визуализационных плагинов. Также за счет бесшовной интеграции с Java-библиотеками есть возможность загружать привычные инструменты и даже скомпилированные классы в REPL-окружение ноутбука и работать с ними.
Еще один плюс — это обучение: ноутбук позволяет приступить к работе с тем или иным кодом без длительной настройки окружения и правильного раскладывания зависимостей. Ну и, конечно, при помощи ноутбука легко делиться друг с другом готовыми примерами и инструкциями.
Владислав Янченко
Mschinet.net
Без юнит-тестов жить непросто, но и писать их разработчики ужас как не любят. Вот и задумаешься, действительно ли нужно писать юнит-тесты в 2022 году?
Владислав расскажет, как создавать юнит-тесты быстрее, а покрывать ими больше. Как всегда, решение — искусственный интеллект.
Вы увидите, как современный ИИ может служить спутником в повседневной борьбе за качество кода: как его можно использовать, а где он может быть опасен. Спикер покажет, как ИИ справляется с написанием тестов для наиболее распространенных фреймворков и приложений.
Если вы не признаете TDD и пишете сначала код, а потом к нему тесты, то этот доклад для вас.
Григорий Кошелев
Контур
Уязвимость Log4Shell в инструменте Log4j наделала много шума. В своем докладе Григорий разберет известные уязвимости в Log4j 2 и похакает Java-сервис. Между делом он потравит байки о том, как спасались от напасти, почему уязвимость опасна не только для Java-приложений и как так вышло, что SQL-injection снова в моде.
Доклад вам пригодится, если хотите разобраться, откуда взялась эта уязвимость, как с ней бороться и как не допустить такой же уязвимости в своей библиотеке.
Андрей Когунь
Croc Code
Maven дает декларативность при объявлении конфигурации сборки, он стабильный и безотказный, поэтому широко применяется в промышленной разработке. Но при этом в его использовании есть много скрытых и неочевидных моментов.
Разработка на Java изменилась: на смену многомодульным сборкам и упаковке результатов в war или ear пришли микросервисы на спрингбуте. Но сам Maven за 10 лет практически не изменился — добавились новые плагины, а проблемы с конфигурацией сборок никуда не ушли.
Сегодня с запуском и настройкой сборки все больше помогают IDE и DevOps-инженеры, а разработчики все дальше от контроля и понимания того, что на самом деле происходит. Например, если консоль в ответ на заветные слова mvn clean install
не выдает результат BUILD SUCCESS, зачастую уже не ясно, с какой стороны подойти. А ведь с прошлой успешной сборки даже код не менялся!
Андрей проведет разбор неочевидных возможностей Maven в части: определения зависимостей, конфигурирования плагинов и работы с жизненным циклом сборки. Обсудим типовые проблемы, нюансы работы в закрытом корпоративном окружении и разработку собственных плагинов и архетипов. Все эти фазы, цели, скоупы, bom, parent, параметры, транзитивные зависимости, профили, репозитории, архетипы и прочее.
Воркшоп: Java Flight Recorder, Mission Control, Visual VM: экспресс-курс по опенсорс-профайлерам
Алексей Рагозин
Deutsche Bank
Рост нагрузки, медленная работа, утечки памяти — все эти ситуации требуют применения специальных инструментов профилирования. В Java-экосистеме хватает профайлеров, которые одновременно и хорошие, и бесплатные. Но ими еще надо уметь пользоваться. Вот и поучимся: в этом воркшопе Алексей на практике покажет, как работать с популярными опенсорс-инструментами Mission Control и VisualVM.
Сложный Rate-Limiting — это просто с Bucket4j
Максим Бартков
RooX Solutions
Бэкендеры часто сталкиваются с задачами ограничения пропускной способности. Rate limiting нужен, например, если вы предоставляете кому-то свой API или сами ходите во внешний API. Без него всё выливается или в неконтролируемую нагрузку, или в недоступность.
К сожалению, не всегда можно разобраться на уровне инфраструктуры. Задача становится еще сложнее, когда система распределенная. Только представьте, что кластеры из десятков и сотен JVM должны корректно соблюдать общий для кластера лимит на частоту входящих запросов при входящем потоке в десятки тысяч запросов в секунду.
Один из вариантов реализации, который может помочь в решении всех этих задач — это библиотека Bucket4j. Максим поговорит о том, что умеет Bucket4j и объяснит, какие алгоритмы он использует внутри.
Если у вас есть интеграции с внешними системами или хотите разобраться в механизмах работы rate limiter — советуем вам не пропустить этот доклад.
Андрей Сундуков
Natera
Современные инструменты для создания многопоточного несинхронизированного кода кажутся простыми. Однако в самом подходе все еще много подводных камней.
Андрей объяснит, как бороться с неравномерной утилизацией ресурсов — как с недоутилизацией, так и с переутилизацией. Он детально разберет, как можно спрогнозировать, сколько ресурсов понадобится многопоточному приложению и сколько железа ему надо выделить. И, разумеется, покажет, как построить многопоточный конвейер.
VM/Рантайм
Thread Wars: проект Loom наносит ответный удар
Иван Углянский
Huawei
На фоне приближающегося к релизу проекта Loom в Java-мире только и разговоров, что о корутинах да о легковесной многопоточности!
Но ведь Java на этом поле далеко не первая, скорее наоборот: это один из последних современных языков, куда добавляют корутины. Так что же, мы просто получаем в точности то, что уже есть у соседей?
Отличаются ли чем-нибудь корутины в Java от корутин в Kotlin? А от горутин в Go? Или от async/await в C#? Будут ли наши корутины лучше или хуже? И почему их так долго делают, когда в других языках все уже давно есть?
Иван подробно разберет историю вопроса и внесет ясность в понимание роли корутин в Java-мире. Он расскажет, как решение о реализации всего одной фичи может повлиять на облик всего языка, сравнит реализации корутин в разных языках и, конечно, вывернет наружу кишочки проекта Loom.
Непрерывное профилирование в облаке с помощью eBPF
Андрей Паньгин
Одноклассники
Артем Дроздов
Одноклассники
Леонид Талалаев
Одноклассники
Сегодня вряд ли кого удивит профилирование работающего в продакшене Java-приложения. Но вот как найти проблему с одним из тысячи хостов, если запускать профайлер уже поздно? Было бы классно увидеть профиль любого приложения на любом отрезке времени в прошлом.
Так вот. Такая «машина времени» уже есть в «Одноклассниках», в масштабах всей их облачной инфраструктуры.
Спикеры расскажут о сложностях реализации непрерывного профилирования — нельзя же просто так взять и запустить везде async-profiler. Они уделят внимание и технологии eBPF, и её роли в получившемся решении.
Разумеется, мы отдельно остановимся на инфраструктуре для сбора, хранения и отображения профилей, а также посмотрим на конечный результат глазами пользователя.
ОС «Фантом» и Java: сборка мусора
Дмитрий Завалишин
DZ SYSTEMS
Операционная система с персистентной памятью — задача амбициозная, и неудивительно, что возникает множество интересных технических вопросов. Например, о сборке мусора.
Различия между виртуальными машинами ОС «Фантом» и Java накладывают требования на механизм преобразования байт-кода Java в байт-код «Фантом». Основной список задач по этой теме: генерация и проверка конструкторов, статический вызов методов, проверка типов runtime и реализация классов, к которым обращается кодогенератор Java.
Сборка мусора в персистентной среде выглядит существенно иначе, нежели в традиционной. Как минимум по той причине, что персистентная память по размеру соответствует дисковой и находится в области терабайтных размеров. Это означает, что требуется реализация двух параллельно работающих сборщиков: быстрого, но неполного и тяжелого, но полного.
Обо всём этом расскажет сам создатель ОС «Фантом» — Дмитрий Завалишин.
OpenJDK Project CRaC (Coordinated Restore at Checkpoint): задачи и проблемы
Антон Козлов
Azul
В этом докладе освещается текущее состояние проекта OpenJDK CRaC, о котором Антон — основной разработчик проекта — рассказывал на Joker 2020.
Он расскажет о проблемах и задачах, которые затрагивают реализацию в JDK, Hotspot и взаимодействие с Linux. Свежим взглядом посмотрим на интересные примеры использования технологии, которые не просто выглядят круто, но и могут пригодится в реальной жизни, а также заглянем под капот некоторых операций стандартных классов JDK и JVM через призму проблемы быстрого рестарта.
Владимир Парфиненко
Huawei
Закончим этот раздел темой из области фундаментального программирования. Речь пойдет не о прикладных фреймворках, и не о библиотеках — поговорим о преобразовании хвостовой рекурсии в цикл.
Да, в функциональных языках — это популярная оптимизация , но в Java-мире это преобразование окутано загадками.
В своем докладе Владимир поднимет тему: можно ли в Java заменить хвостовой рекурсивный вызов на цикл, зачем вообще это делать и какие виртуальные машины этим занимаются (и легально ли?). Он также покажет сторонние инструменты, которые помогают оптимизировать программы в функциональном стиле. И, конечно, уделит внимание дружественным JVM-языкам, имеющим более выраженные функциональные наклонности (Scala, Kotlin и т. д.).
Доклад рассчитан на широкую аудиторию. Он поможет начинающим инженерам углубиться в то, как на практике исполняется их код. А более опытные разработчики смогут расширить свой кругозор и вникнуть в детали реализаций.
DevOps
Не клади все яйца в один билдпак
Дмитрий Чуйко
BellSoft
Контейнеры — это полезный инструмент, но это не значит, что можно не думать о повышении их эффективности.
Есть же средства автоматической сборки контейнеров, такие как Paketo Buildpack для Spring Boot приложений. Однако при такой сборке мы получаем либо «черный ящик» с нерелевантной начинкой, либо случайные образы с устаревшей Java или неэффективными скриптами. Автоматически собранные контейнеры становятся проблемой при увеличении нагрузки и количества инстансов.
По сути, заоблачных счетов за облачные ресурсы можно избежать, если использовать оптимальные контейнеры. Для этого нужно вовлечь разработчиков в процесс оптимизации деплоймента.
Оптимизация подразумевает под собой следующее:
уменьшение время создания контейнера, а следовательно, и срока вывода продукта на рынок;
упрощение процесса создания контейнеров и разработки в целом, включая тестирование и вывод в производство;
соблюдение баланса между созданием и обкаткой контейнеров и оптимизацией использования ресурсов.
Помня о предыдущем докладе «Не клади все яйца в один контейнер», можно догадаться, что если мы положим случайные яйца в наш контейнер, Kubernetes не улучшит ситуацию, а просто масштабирует неоптимальные сущности. Используя K8s, важно понимать:
как могут проявиться проблемы, связанные с неэффективными контейнерами, при масштабировании;
как с с этими проблемами бороться;
что делают конфигурируемые скрипты и как повысить их эффективность;
сколько мы потеряем в производительности, если не будем предпринимать никаких действий.
Что можно сделать в сложившейся ситуации? Можно оптимизировать контейнеры с помощью встроенных инструментов, а можно собирать контейнеры самостоятельно и уже потом интегрировать в рабочий процесс K8s.
В своем докладе Дмитрий покажет, на что следует обратить внимание при последнем подходе. Кроме того, речь пойдет про технологию Native Image, так как все обозначенные выше проблемы и задачи применимы и к ней.
Готовим свой Kubernetes operator на примере Spring Cloud Gateway
Игорь Киричук
Райффайзенбанк
Когда все те, кто активно использовал Spring Cloud, взялись за k8s, часть «запчастей» вроде service registry перешла в ведение operations. Но давайте мы как джависты еще раз заглянем в инфраструктуру и поймем: есть ли там интересное для нас, можем ли мы там что-то сделать, чтобы органичнее вписывать свои приложения в инфраструктуру.
В докладе обнаружим, что писать свой k8s operator & controller можно легко и просто и на JVM-стеке. Игорь покажет, как сделать k8s operator на примере создания Spring Cloud Gateway operator, который управляет своей конфигурацией через Custom Resource Definition (CRD).
Доклад для разработчиков любого уровня, которым интересно заглянуть в инфраструктуру, а может, даже немного адаптировать ее под себя.
Стек: Kotlin, Spring Boot, Helm, k8s (kind).
Spring и базы данных
Индексы в PostgreSQL. Как понять, что создавать
Андрей Сальников
Data Egret
Любой разработчик знает, что индексы — это мощный инструмент, который может улучшить работу запросов в базе данных и, как следствие, сократить отклик приложения или сервиса на внешние запросы.
Но опыт Андрея, как ДБА, показывает, что у разработчиков нет понимания, какой, когда и из каких соображений можно создавать индекс. Спикер приведет простые и понятные примеры, которые вы сможете легко повторить на своих реальных базах данных.
Spring Data JPA. Антипаттерны тестирования
Семен Киреков
МТС Диджитал
За свою карьеру Семен столкнулся с рядом (а некоторые даже попробовал) антипаттернов тестирования при использовании Spring Data JPA. Они не только не помогают, но и усложняют поддержку кода и вызывают раздражение.
В рамках доклада Семен расскажет вам о таких антипаттернах, как избыточный coupling на декларацию сущностей, лишние зависимости, best practices для создания тестовых данных и транзакционные сценарии. А также покажет паттерны, на которые следует их заменить, чтобы упростить жизнь при написании тестов.
Антипаттерн orisnull: коварство иллюзорной простоты
Илья Сазонов
Всегда.Да
Федор Сазонов
Сбер
Есть мнение, что фреймворки вроде Hibernate и Spring Data создают абстракцию над базой данных, которая сразу из коробки работает идеально. Но идеально не работают даже сами базы данных — даже когда между ними и приложением нет ничего кроме SQL.
Например, в случае необходимости получить данные из базы по динамическому фильтру часто пишут запросы вида: where user.name = :name or :name is null.
Из-за комбинации удобства и неочевидности сколько проблем с производительностью это удобство создает, запросы такого вида спонтанно «самозарождаются» в любом проекте и продолжают там появляться, даже когда эти запросы пару раз положили на прод.
О таких запросах и о том, как кодогенерация помогает свести ущерб от них к минимуму, и пойдет речь в докладе.
Используем @Transactional like a Pro
Никита Летов
Росбанк
Поговорим о том, как не ошибиться при использовании аннотации @Transactional в коде, как не бояться блокировок на БД и сохранить консистентность ваших данных при их динамическом обновлении.
Доклад посвящен использованию транзакций и блокировок при обработке данных БД в условиях асинхронных вызовов высоконагруженного приложения. Будет немного лайвкодинга: спикер покажет возможные ошибки и нюансы использования тех или иных технологий (стек: Java, Spring Data JPA, Kafka).
Иногда разработчики не задумываются, в какой момент транзакция нужна , а в какой нет, когда нужно открыть новую, а когда продолжить текущую. Какие блокировки на БД будут происходить во время выполнения транзакции и как не перегрузить БД очередью из row lock, где использовать таймауты запросов. И как обойтись без блокировки на БД.
Целевая аудитория: рядовые бэкенд-разработчики, так как большинство сервисов в той или иной мере работает с динамически обновляемыми данными.
Почему мы решили переходить на R2DBC и чем это закончилось
Антон Котов
Сбер
Если Spring WebFlux, то Spring Data R2DBC. Часто выбор совсем нового способа реактивного взаимодействия с реляционными базами данных строится именно по такой логике. Что мы покупаем и чем платим? Какие трудности ждать, если годами писали на JDBC, а теперь грядет переезд в новую реактивную реальность? Когда это оправдано? Обо всем этом Антон расскажет в своем докладе.
Архитектура
BPM(N,S, engine) - нужны или нет?
Денис Котов
Тинькофф
Перечисленные термины частенько витают вокруг мира Enterprise-разработки. Кому-то посчастливилось с ними столкнуться и сэкономить сотни часов времени, а кто-то получил только боль и гигантский техдолг.
В докладе спикер расставит все точки над i в тематике автоматизации бизнес-процессов с использованием BPM(N,S,engine) на примере Тинькофф, расскажет о хороших и плохих практиках и покажет, как можно ускорить автоматизацию бизнес-процессов прямо сейчас.
Воркшоп: создание онлайн-маркетплейса на платформе Micronaut, Kotlin, Java 11+
Иван Кочергин
МТС
Игорь Тресоумов
МТС
Спикеры покажут на практике, как построить эффективное с точки зрения многопоточности приложение, которое будет получать у партнеров предложения и показывать их клиенту. Рассмотрим, как применять корутины в полевых условиях, а не просто в теории.
Взаимодействие с партнерами происходит по протоколам REST и SOAP.
Используемые технологии:
Micronaut
Kotlin Coroutines
Java 11+
WebSocket/JSON-Streaming
Целевая аудитория: Java/Kotlin-разработчики уровня Middle и выше.
Vostok Hercules: 3 года доставляем телеметрию — полёт нормальный
Григорий Кошелев
Контур
Поговорим про преимущества и недостатки event-driven архитектуры на примере высоконагруженной системы обработки и доставки данных телеметрии Vostok Hercules с Apache Kafka в её основе.
Apache Arrow. В погоне за скоростью
Игорь Селиверстов
Querify Labs
На JPoint и раньше много говорили о производительности, но о концепции Zero-copy речь особо не заходила. Исправим этот пробел.
Apache Arrow — это векторный формат данных, а также набор инструментов для хранения, обработки и передачи данных в векторном формате. Arrow реализует концепции Zero-Copy и No Marshalling (исключает копирование при обработке данных: по сети данные передаются как есть, без сериализации). Два этих фактора значительно увеличивают производительность приложений, чем обеспечили популярность формата в системах обработки данных.
Спикер рассмотрит следующие вопросы:
Как Arrow помогает в работе с данными.
Что стоит за Zero-Copy и No Marshalling.
На что идут разработчики ради бескомпромиссной производительности.
Kotlin
Kotlinx.serialization: готовим свою собственную библиотеку для сериализации
Андрей Кулешов
Huawei
Автор расскажет о kotlinx.serialization: как работать с этой библиотекой непосредственному пользователю и создателям сериализаторов, которые будут основываться на этом фреймворке.
Основываясь на своем опыте разработки мультиплатформенной библиотеки KToml для сериализации формата TOML, Андрей расскажет о подводных камнях написания собственной опенсорс-библиотеки для сериализации и десериализации на Kotlin. Речь пойдет об особенностях использования библиотек из kotlinx.serialization в коде, о том, как устроена эта библиотека и как лучше организовать архитектуру своего сериализатора.
Доклад будет интересен Kotlin-программистам разных уровней, как пользователям сериализаторов, так и тем, кого можно заинтересовать созданием своего собственного сериализатора.
Два года жизни одной библиотеки глубокого обучения на Kotlin: от прототипа к четвертому релизу
Алексей Зиновьев
AproximaLabs
Вас ждет черно-белая история о том, как Алексей намазал Kotlin поверх вычислительного ядра TensorFlow и что из этого вышло. А ведь еще несколько лет назад он был молод, не имел седых волос в бороде и хотел не так много: всего лишь тренировать и дообучать нейросети на JVM-языке со скоростью TensorFlow или PyTorch. Ну и конечно, чтобы весь MLOps был из коробки, не писать же свой!
Не успел он моргнуть, как стремительно пролетели два года работы над библиотекой Deep Learning для Kotlin в составе команды JetBrains (Kotlin for Data Science) и был пройден тернистый путь от MVP размером в 1 класс и 3 метода до многомодульного проекта с сотнями классов, тестов, десятками туториалов, статей и несколькими тысячами пользователей. KotlinDL стал проектом, в который контрибьютит 30 человек со всего земного шара: из Польши, Китая, Ирана, Индии, Германии, Канады и России. Проектом, на основе которого пользователи создают мультиплатформенные библиотеки и игровые движки с элементами AI, да и просто балуются с детекцией объектов со своих видеокамер.
Этот доклад не про Deep Learning, как таковой, а про непростой путь взращивания JVM-библиотеки для Data Science экосистемы с нуля и о преодолении трудностей на стыках с мирами: нативным и змеиным, где не ступала нога типов и промышленных Ява Бобов. Мы будем говорить и том, как ставить задачи тем, кому ты не платишь, и о том, как парсить веса моделей. О том, как правильно использовать ресурсы компании, в которой ты работаешь, для развития OSS-проекта и о разнице между JNI и JavaCPP, а также о поиске истины в недрах Github Issues титанов, на чьих плечах это все и стоит.
Если считать это «смузи-докладом для начинающих», то это смузи с пенкой из стали.
Разбор доклада
Разбор доклада Ted Neward «Iconoclasm»
Владимир Ситников
Алексей Стукалов
HAULMONT
Напоследок — необычный формат: разбор классического доклада. Исходное выступление Тед Ньюард сделал на Joker ещё в 2015-м, но и в 2022-м оно позволяет обо многом задуматься — и теперь Владимир и
Иконоборцы меняют наш мир. От Брэнча Рики, изменившего бейсбол, до Стива Джобса c его подходом к дизайну. Сколько таких людей среди разработчиков? Какие качества определяют истинного иконоборца? Что мы можем перенять от них, чтобы изменить к лучшему себя и ближайшее окружение? На эти вопросы Ted Neward ответил в докладе "Iconoclasm" на Joker 2015.
На JPoint 2022 этот доклад во всех подробностях разберут Владимир Ситников и Алексей Стукалов.
Напоминаем: доклады — это интересно, но это ещё не всё. В этот раз на JPoint будут не только они (в основном на онлайн-части 13-15 июня), но и много живого общения на офлайн-дне (24 июня в Петербурге).
Расписание, подробности, билеты — всё на сайте.
Будем рады видеть и в онлайне, и в Петербурге!