Spring АйО
Русскоязычное сообщество Spring-разработчиков. Habr: bit.ly/433IK46 YouTube: bit.ly/4h3Ci0x VK: bit.ly/4hF0OG8 Rutube: bit.ly/4b4UeX6 Яндекс Музыка: bit.ly/3EIizWy Чат для общения: @spring_aio_chat По вопросам сотрудничества: @befayer
Ko'proq ko'rsatish📈 Telegram kanali Spring АйО analitikasi
Spring АйО (@spring_aio) kanali faol ishtirokchi. Hozirda hamjamiyat 10 905 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 10 901-o'rinni va Rossiya mintaqasida 58 245-o'rinni egallagan.
📊 Auditoriya ko‘rsatkichlari va dinamika
невідомо sanasidan buyon loyiha tez o‘sib, 10 905 obunachiga ega bo‘ldi.
15 Sentabr, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -16 ga, so‘nggi 24 soatda esa 1 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.
- Tasdiqlash holati: Tasdiqlanmagan
- Jalb etish (ER): Auditoriya o‘rtacha 54.97% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 24.37% ini tashkil etuvchi reaksiyalarni to‘playdi.
- Post qamrovi: Har bir post o‘rtacha 5 993 marta ko‘riladi; birinchi sutkada odatda 2 657 ta ko‘rish yig‘iladi.
- Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 43 ta reaksiya keladi.
- Tematik yo‘nalishlar: Kontent айо, хабр, api, jep, amplicode kabi asosiy mavzularga jamlangan.
📝 Tavsif va kontent siyosati
Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
“Русскоязычное сообщество Spring-разработчиков.
Habr: bit.ly/433IK46
YouTube: bit.ly/4h3Ci0x
VK: bit.ly/4hF0OG8
Rutube: bit.ly/4b4UeX6
Яндекс Музыка: bit.ly/3EIizWy
Чат для общения: @spring_aio_chat
По вопросам сотрудничества: @befayer”
Yuqori yangilanish chastotasi (oxirgi ma’lumot 16 Sentabr, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.
-XX:+UseCompactObjectHeaders.
• G1 становится сборщиком мусора по умолчанию во всех окружениях. Раньше JVM могла выбирать Serial GC на машинах и в контейнерах с небольшим количеством ресурсов. Поэтому после обновления стоит перепроверить память, паузы и CPU именно на маленьких инстансах.
• JFR начинает автоматически скрывать чувствительные данные. Пароли, токены, API-ключи и секреты в аргументах JVM, переменных окружения и системных свойствах больше не должны случайно попадать в запись Flight Recorder.
⚠️ Но есть и изменения, способные сломать старые конфигурации
Флаги -noverify и -Xverify:none окончательно удалены. -XX:InitiatingHeapOccupancyPercent переименован в -XX:G1IHOP, а JSON-дампы потоков получили новую версию формата и теперь записывают идентификаторы числами, а не строками.
Java 27 не LTS, поэтому массовая миграция в продакшене вряд ли начнётся завтра. Но проверить сервисы и контейнеры уже стоит, так как часть оптимизаций включится автоматически, а старые JVM-флаги могут внезапно напомнить о себе.
Редкий релиз, где отсутствие новых фич может уменьшить потребление памяти.
🔗 Статья на Хабр: https://habr.com/ru/companies/spring_aio/articles/1082138/instanceof, верхняя половина картинки может удивить.
В Java здесь работают вместе:
☑️ Records – чтобы описать данные без простыни служебного кода.
☑️ Sealed interface – чтобы ограничить набор допустимых вариантов.
☑️ Pattern matching в switch – чтобы сразу разобрать вариант и достать его содержимое.
☑️ Условия when – чтобы прямо в ветке проверить значение.
В Rust похожая задача решается через enum и match. Синтаксис отличается, но ход мысли уже очень близкий - описали возможные состояния → явно обработали каждое.
Правда, как в том анекдоте, есть нюанс. Оказанный в Java Result.of(...) – не стандартный аналог растовского Result. Его реализация на скриншоте не раскрыта. Так что принимать всю картинку за возможности Java из коробки не стоит.
Но повод пересмотреть старые претензии к языку вполне есть. Шутки про многословную Java помнят все. А до records и pattern matching в собственном проекте добрались ещё не все.
👀 У вас современная Java уже в коде или пока только номер версии в сборке?• X25519 key generation/agreement: +49–54% throughput • Ed25519 key generation/sign/verify: +46–49% • X25519MLKEM768, то есть hybrid post-quantum key exchange: +27–51%Причём прикол в том, что разработчику для этого не нужно переписывать код. Ускорение получают обычные JCE API –
KeyAgreement, Signature, KeyPairGenerator – и JSSE при TLS 1.3.
А в JDK 28 они пошли дальше и добавили intrinsics для x86_64 и AArch64. JVM начинает использовать архитектурно-оптимизированные инструкции. Это даёт ещё примерно до +20% поверх программных оптимизаций в зависимости от алгоритма и архитектуры.
Java ускорила популярную криптографию почти в полтора раза. Просто обновлением JDK. Без нового API. Без изменения кода. Без новой зависимости.И это не сторонний бенчмарк, ведь цифры опубликовала сама команда Java на Inside java 3 сентября. 🔗 Официальный материал Inside Java
Зачем они нужны, почему работа над ними растянулась на годы и какой новый подход приблизил проект к реализации. Заглянем под капот JVM и разберёмся, в каких задачах пригодятся value-классы.☑️ Максим Козлов, CTO и сооснователь GitFlic, — про разработку с AI-агентами.
Агенты ускоряют работу, но как проверить, что в итоге получилось именно то, что требовалось? Поговорим о связи требований, изменений в коде и поведения системы, а также об обратной связи, которая помогает сохранять контроль над разработкой.📅 18 сентября — сбор с 18:00, доклады с 19:00 📍 Москва, лофт Casa Picassa, Бауманская, 11, стр. 8, зал «Кандинский» Встреча пройдёт офлайн, после неё организаторы обещают записи выступлений. Участие бесплатное, нужна предварительная регистрация. 👉 Программа и регистрация
round_up() – округлял адрес вверх. Из-за этого граница свободной памяти сдвигалась внутрь зарезервированной области.
На компьютере Линуса граница проходила посередине страницы размером 4 КБ: последние 2 КБ уже принадлежали механизму сжатия, но драйвер мог отдать всю страницу приложению.
По итогу видеокарта записывала служебные данные поверх размещённой там таблицы страниц. Графическая оболочка теряла доступ к нужной области памяти и падала.
Исправлением послужила замена round_up() на round_down().
Теперь адрес округляется вниз до начала страницы. Если хотя бы часть страницы занята служебными данными видеокарты, драйвер исключает из доступной памяти всю страницу. Теряется несколько килобайт VRAM, зато приложения больше не получают память, которую может перезаписать оборудование.
Само исправление уместилось всего в одну строку. Но для его поиска потребовались 24 диагностических патча и 18 перезагрузок ядра.
AI по сути занялся основной рутиной. Он добавлял различный диагностический код и анализировал результаты. Правда, несколько раз помощник объявлял проблему нерешаемой и предлагал остановиться на составлении отчёта 😅 . Как говорится, "лень прежде нас родилась".
Но Линус был упрямее и каждый раз заставлял его продолжать.
В конце Торвальдс признал, что AI оказал огромную помощь, и даже разрешил ему написать описание итогового коммита. Какую модель он использовал, Линус не сообщил.
Мораль сей басни такова, что AI не нашёл ошибку одной волшебной командой и не заменил инженера (выдыхаем). Он выполнял механическую работу, пока человек строил гипотезы, проверял результаты и не принимал ответ, якобы это невозможно.
⚡Михаил Поливаха обещал обсудить баг на подкасте более детально. Ждем!
🔗 Источник: коммит в ядре Linuxa > b и a < b, но забыть про a == b.
Мутационное тестирование предлагает дерзкий способ оценить качество тестов: намеренно ломает код. Меняет > на >=, true на false, возвращаемое значение на null. Если тесты не замечают подмены, значит, «мутант» выжил, а в тестовом наборе есть слепая зона.
Звучит как идеальный инструмент. Но на реальном проекте быстро появляются нюансы. Например, ложные срабатывания, долгие запуски и отчёты, которые всё равно приходится разбирать человеку.
В новой статье на простом Java-примере показываем:
– как работает мутационное тестирование с Pitest;
– почему 100% покрытия недостаточно;
– откуда берутся выжившие мутанты;
– почему не стоит прогонять MT по всему проекту;
– и в каких случаях этот подход действительно окупается.
А ещё как поручить настройку и запуск Pitest AI-агенту с помощью готового skill.
Мутационное тестирование само по себе не является серебряной пулей. Но иногда именно оно задаёт вашим тестам самый неприятный и самый полезный вопрос: «А вы точно хоть что-нибудь проверяете?»
🔗 Читать статью: https://habr.com/ru/companies/spring_aio/articles/1078564/За 6 лекций разберём: — Circuit Breaking, Bulkhead и Load Shedding; — таймауты, ретраи, backoff + jitter и идемпотентность; — метрики, трассировку и логи с OpenTelemetry; — Blue/Green, Canary и релизы без простоя; — Vault, ротацию и защиту секретов; — эволюцию API без поломки клиентов.В программе 12 часов живых занятий с Михаилом Поливаха, домашние задания с разбором, общение в закрытой группе и доступ к материалам на 90 дней. Если вы движетесь к уровню Senior/Staff, отвечаете за SLA и релизы или дежурите on-call, то у нас мэтч. 🔗 Посмотреть программу и записаться 🙃 Ну потому что works on my machine для серьёзных систем уже недостаточно
@Value
- @ConfigurationProperties
- Environment / PropertySource-ы и т.д.
Всё это способно создать небольшую кашу в голове. В новом переводе, мы вместе постараемся внести небольшую ясность в этот процесс.
🔗 Полный текст: https://habr.com/ru/companies/spring_aio/articles/1076862/AI-native SDLC. Привычный линейный процесс превращается в замкнутый цикл, внутри которого каждый этап создает версионируемый артефакт для следующего:
intent.md -> spec.md -> plan.md -> код и тесты -> PR с результатами проверок -> отчет об инциденте или новый intent.md
Все это хранится в Git. История коммитов одновременно становится журналом изменений: кто сформулировал задачу, что предложил агент, какие решения принял человек и что в итоге попало в продакшен.
Как выглядит сам процесс?
На этапе планирования автор идеи обсуждает проблему с Claude. Результат фиксируется в intent.md: что требуется изменить, зачем, какие системы затрагиваются и какие ограничения нужно учитывать. Владелец продукта проверяет документ и принимает решение о продолжении работы.
Дальше агент превращает намерение в spec.md с требованиями и проектным решением. Политики безопасности, архитектурные правила и требования к интерфейсу подключаются через Skills. Спорные места агент должен явно отметить, а человек - разрешить до начала реализации.
Разработка начинается с plan.md. В нем перечисляются изменяемые файлы, порядок работы, риски и проверки результата. После утверждения плана агент пишет код. Контекст проекта хранится в CLAUDE.md, повторяемые правила оформляются как Skills, а обязательные ограничения обеспечиваются через hooks.
Для тестирования предлагается два уровня. Первый - обычные сборка, линтеры и автоматические тесты, которые агент обязан запустить перед завершением задачи. Второй - evals для проверки самого агента. Если команда меняет модель, системные инструкции, Skills или hooks, набор реальных задач должен показать, что качество работы не ухудшилось.
Во время развертывания агент проверяет PR, исправляет замечания и готовит релиз. Человек оценивает соответствие исходному замыслу и уровень риска. Критические действия, включая выпуск в продакшен, защищаются программными ограничениями и явными согласованиями.
Эксплуатация замыкает цикл. Детерминированный мониторинг обнаруживает выход метрик за допустимые границы, после чего агент подключается к диагностике. Небольшая проблема может закончиться PR или откатом. Более крупная превращается в новый intent.md и снова проходит весь процесс.
Роль инженера в такой модели заметно меняется. Больше внимания уходит на формулирование намерения, проектирование ограничений, проверку артефактов и оценку риска. Стабильность процесса обеспечивают тесты, CI, изоляция, права доступа и автоматические шлюзы.
Плейбук сильно привязан к Claude Code и продуктам Anthropic, однако сама схема применима шире. Главная идея заключается в перестройке всего процесса разработки вокруг работы агентов, а не в добавлении генерации кода в одну из существующих стадий.
Плейбук в блоге Anthropic:
https://claude.com/blog/the-ai-native-sdlc-playbook
Какой подход при разработке с ИИ-агентами используете вы в рабочих проектах? Пишите в комментариях 😎null для ссылок, 0 для чисел, false для boolean) и только затем выполняется код инициализации.
По итогу на уровне JVM существует короткий промежуток времени, когда поле уже можно прочитать, хотя ему ещё не присвоили настоящее значение. Давайте рассмотрим вот такой пример:
class Parent {
Parent() {
// Вызов попадёт в переопределённый метод Child (dynamic dispatch),
// хотя конструктор Child ещё не закончил выполняться!
printValue();
}
void printValue() {}
}
class Child extends Parent {
private final int value;
Child() {
// Неявный super() уже был вызван, и только после него полю "value" присвоится 42.
this.value = 42;
}
@Override
void printValue() {
// Пока выполняется Parent(), здесь всё ещё значение по умолчанию - печатается 0, а не 42
System.out.println(value);
}
}
И вот OpenJDK хочет сделать шаг на пути исправления этой проблемы. В рамках JEP 539 завозят новый механизм "строгих полей" (strict fields). Их поведение будет немного отличаться в зависимости от того, static поле или нет, но цель одна - не допустить ситуации выше.
Например, если пометить value поле выше как strict (сейчас вы это никак не сделаете), то при загрузке класса будет VerifyError, т.к. строгие поля объектов необходимо присвоить до вызова super().
То есть Parent() уже не сможет вызвать printValue() и увидеть промежуточный 0: JVM отклонит некорректный байткод ещё при его проверке.
Зачем вообще нечто подобное делать? В основном ради Project Valhalla и концепции "Integrity By Default", о которой мы уже писали.
Java движется к value classes, а для них состояние объекта должно иметь гораздо более строгие гарантии. С точки зрения пользователя, Value классы нужны в основном для скаляризации (Вспоминаем девиз: "codes like a 'class', works like an 'int'"). А для того, чтобы JIT мог эффективно скаляризировать классы, он должен быть абсолютно уверен, что наблюдаемое им состояние объекта единственно верное, и остальные наблюдают его ровно таким же.
Проблема в том, что даже для final полей в Java это не так. С одной стороны из-за проблемы выше, а с другой из-за того, что final на самом деле не совсем final.
Соответственно, примерно через полгода мы уже, скорее всего, увидим эту фичу в preview. Подробнее можно почитать в самом JEP.
⚠️ Важно! Механизм строгих полей это opt-in механизм, который пока, по умолчанию, будет касаться только value классов. Существующий код механизм "строгих полей" пока не касается!.
🔗 JEP 539: https://openjdk.org/jeps/539