<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Все посты подряд / Java / Хабр]]></title>
    <link>https://habr.com/ru/hubs/java/posts/</link>
    <description><![CDATA[Java – объектно-ориентированный язык программирования]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Thu, 23 Apr 2026 21:03:55 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      
        
    

  

  
  <item>
    <title><![CDATA[Пост @mathter — Java (+1) — 21.04.2026 13:20]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1026026/</guid>
    <link>https://habr.com/ru/posts/1026026/?utm_campaign=1026026&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class=""><img src="https://habrastorage.org/webt/7b/59/a8/7b59a89dfe3aa16ec9dc270993ebb472.jpg"></figure><p><strong>🔌Форматы обмена и хранения данных</strong></p><p>В предыдущих постах <a href="https://habr.com/ru/posts/1025122/" rel="noopener noreferrer nofollow">Разбираемся в in-memory базах</a> и <a href="https://habr.com/ru/posts/1025778/" rel="noopener noreferrer nofollow">Выбираем базу</a> я написал, что собираюсь сделать исследовательский проект по <strong>in-memory</strong> базам данных &nbsp;и имя ему <strong>MemifyDB</strong>. Так же выбрал направление движения: это <strong>key-value</strong> хранилище, которое потом доработаю до <strong>документо-ориентированной</strong> системы.</p><p>Теперь ключевой вопрос: <strong>как клиенты будут с ней общаться?</strong></p><p><strong>Протокол обмена</strong> — это мост между сервером и клиентом.  От его дизайна зависит скорость, удобство и даже то, какие фичи мы сможем реализовать.</p><p><strong>Human readable (JSON, XML and etc.)</strong></p><p>В современных системах активно используется как для транспорта так и для хранения текстовый формат данных, а точнее json и его вариации. У этого подхода есть несколько несомненных плюсов, например:</p><ul><li><p><strong>Простота реализации:</strong> не нужно поддерживать разные типы на уровне протокола, всё передаётся как строки, а клиент сам разбирается.</p></li><li><p><strong>Гибкость:</strong> строкой можно закодировать что угодно — число, JSON, бинарные данные.</p></li></ul><p>Но у этого подхода есть <strong>обратная сторона</strong>:</p><ul><li><p>❌ <strong>Нет нативной поддержки типов:</strong> Клиент сам должен сериализовать/десериализовать.</p></li><li><p>❌ <strong>Оверхед на парсинг:</strong> Каждый раз нужно преобразовывать “42” в число и обратно.</p></li><li><p>❌ <strong>Неэффективное использование памяти:</strong> Число 123456 занимает 6 байт как строка, хотя в бинарном виде — 4 или 8.</p></li><li><p>❌ <strong>Невозможность частичного обновления сложных структур:</strong> Чтобы изменить одно поле в JSON-объекте, приходится переписывать весь объект (можно конечно поспорить).</p></li></ul><p>## <strong>🎯 Наш подход: типизированные данные с рождения</strong> В <strong>MemifyDB</strong> мы пойдём другим путём.<br> Мы будем хранить данные в памяти в <strong>типизированном виде</strong>: строки, числа, списки, хеши, документы — каждый тип со своим внутренним представлением.</p><p>И <strong>протокол обмена с клиентом</strong> должен это отражать.<br> Мы не хотим, чтобы клиент упаковывал число в строку только потому, что так проще.<br> Мы хотим передавать по сети <strong>те же бинарные структуры</strong>, которые лежат в памяти.</p><p>Это даст:</p><ol><li><p><strong>Типизированность</strong> Формат должен явно различать типы данных: строки, числа (разной разрядности), булевы значения, null, массивы, объекты (документы).<br> Это позволит серверу правильно интерпретировать данные без дополнительных метаданных.</p></li><li><p><strong>Компактность</strong> Формат не должен раздувать данные. Число 42 должно занимать 8 байт (или 4, если это int32), а не 2 символа ASCII.</p></li><li><p><strong>Быстрая навигация</strong> Мы должны иметь возможность быстро «прыгнуть» к определённому полю документа без полного парсинга.<br> Это важно для частичных обновлений и запросов.</p></li><li><p><strong>Потоковость</strong> Формат должен допускать частичную отправку/приём, чтобы можно было обрабатывать большие документы по частям.</p></li><li><p><strong>Самодостаточность</strong> Данные должны содержать всю информацию для интерпретации, но при этом не дублировать имена полей без необходимости (как в JSON).</p></li></ol><p>🔍 <strong>Что дальше?</strong></p><p>Существуют несколько бинарных: <strong>CBOR</strong>, <strong>BSON</strong>, <strong>FlatBuffer</strong> и пр. Если у вас есть опыт работы с этим форматами, пишите в комментариях какие у них есть плюсы, минусы и подводные камни.</p> <a href="https://habr.com/ru/posts/1026026/?utm_campaign=1026026&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 21 Apr 2026 10:20:14 GMT</pubDate>
    <dc:creator><![CDATA[mathter]]></dc:creator>
      
      <category><![CDATA[in-memory]]></category><category><![CDATA[database]]></category><category><![CDATA[database development]]></category><category><![CDATA[java]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @mathter — Java (+1) — 20.04.2026 21:05]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1025778/</guid>
    <link>https://habr.com/ru/posts/1025778/?utm_campaign=1025778&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class=""><img src="https://habrastorage.org/webt/5e/f0/e7/5ef0e789e7743520d5002726ef506c5a.jpg"></figure><p>🧠 MemifyDB: прежде всего — видение (vision).</p><p>Прежде чем погружаться в код, нужно чётко ответить на вопрос: а что именно мы строим?<br> Этот пост — не про хардкорный кодинг, а про так называемое видение системы (system vision).<br> Мы разберём, какие вообще бывают in-memory базы данных, чем они отличаются и почему наш путь будет таким: key-value → документная БД.</p><p>Поехали!</p><p>📚 Типы in-memory баз данных</p><p>1. Key-Value хранилища</p><p>Самый простой и быстрый вид. Данные хранятся как пары «ключ — значение», где значение — обычно строка, число или бинарный объект.</p><ul><li><p>Примеры: Redis, Memcached, DragonflyDB.</p></li><li><p>Сценарии: кэширование, сессии пользователей, счётчики, очереди задач.</p></li><li><p>Плюсы: максимальная скорость, минимальный оверхед, простота масштабирования (шардирование по ключу).</p></li><li><p>Минусы: ограниченная модель данных — нет сложных запросов, только операции по ключу.</p></li></ul><p>2. Документо-ориентированные БД</p><p>Значение — структурированный документ (JSON, BSON, XML). Внутри документа можно индексировать поля и выполнять запросы по содержимому.</p><ul><li><p>Примеры: MongoDB (in-memory storage engine), Couchbase.</p></li><li><p>Сценарии: хранение сложных объектов (профили, каталоги), где важна гибкость схемы.</p></li><li><p>Плюсы: удобство для разработчика, естественное представление данных, возможность частичного обновления.</p></li><li><p>Минусы: чуть более высокий оверхед по сравнению с key-value (парсинг, индексация).</p></li></ul><p>3. Колоночные (Columnar) in-memory БД</p><p>Данные хранятся не по строкам, а по колонкам. Это даёт огромное преимущество при аналитических запросах (суммы, средние, группировки).</p><ul><li><p>Примеры: SAP HANA, MemSQL (SingleStore) в колоночном режиме, Apache Arrow (формат, но не БД).</p></li><li><p>Сценарии: аналитика реального времени, отчёты, BI.</p></li><li><p>Плюсы: сверхбыстрая агрегация, высокая степень сжатия.</p></li><li><p>Минусы: медленные точечные обновления (OLTP-нагрузка), сложность реализации.</p></li></ul><p>4. Графовые БД</p><p>Хранят сущности (узлы) и связи между ними (рёбра). Оптимизированы для обходов графа.</p><ul><li><p>Примеры: RedisGraph (модуль Redis), Neo4j (с in-memory режимом).</p></li><li><p>Сценарии: социальные сети, рекомендательные системы, сети связей.</p></li><li><p>Плюсы: эффективные запросы связей, интуитивная модель для связанных данных.</p></li><li><p>Минусы: узкая ниша, сложность шардирования.</p></li></ul><p>5. Time-series БД</p><p>Специализированы для временных рядов — метрик, логов, событий. Оптимизированы для записи и запросов по временным интервалам.</p><ul><li><p>Примеры: InfluxDB, TimescaleDB (in-memory части).</p></li><li><p>Сценарии: мониторинг, IoT, финансовые тикеры.</p></li><li><p>Плюсы: высокая скорость записи, сжатие старых данных, встроенные функции по времени.</p></li><li><p>Минусы: слабо подходят для произвольных данных.</p></li></ul><p>…## 🧭 Наш курс: от Key-Value к документам</p><p>Для MemifyDB я выбрал путь, который кажется самым прагматичным:</p><ol><li><p>Создаём ядро Key-Value<br> Это фундамент. Мы реализуем:</p><ul><li><p>потокобезопасное in-memory хранилище;</p></li><li><p>поддержку разных типов значений (строки, списки, хеши, числа);</p></li><li><p>механизмы TTL и эвикшена (LRU);</p></li><li><p>бинарный протокол, близкий к внутреннему представлению.</p></li></ul><p>Key-value движок даст нам максимальную скорость и стабильность, а также позволит отточить все низкоуровневые механизмы (аллокаторы, сериализацию, сетевое взаимодействие).</p></li><li><p>Надстраиваем документный слой<br> Поверх key-value ядра мы добавляем возможность интерпретировать значение как JSON-подобный документ:</p><ul><li><p>индексация по полям;</p></li><li><p>поддержка частичного обновления;</p></li><li><p>запросы с фильтрацией по содержимому.</p></li></ul></li></ol><p>При этом сами документы будут храниться в key-value хранилище как обычные значения, а индексы — как дополнительные структуры (хеш-таблицы, B-деревья) в памяти.</p><p>Такая двухслойная архитектура даёт:</p><ul><li><p>гибкость — можно работать и как с обычным кэшем, и как с документной БД;</p></li><li><p>производительность — key-value ядро остаётся быстрым, а документные операции добавляются без потери эффективности;</p></li><li><p>расширяемость — позже можно добавить другие модели (например, колоночные агрегаты) как отдельные слои.</p></li></ul> <a href="https://habr.com/ru/posts/1025778/?utm_campaign=1025778&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 20 Apr 2026 18:05:02 GMT</pubDate>
    <dc:creator><![CDATA[mathter]]></dc:creator>
      
      <category><![CDATA[inmemory]]></category><category><![CDATA[database]]></category><category><![CDATA[java]]></category><category><![CDATA[database development]]></category><category><![CDATA[базы данных]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @mathter — Java (+1) — 19.04.2026 00:14]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1025122/</guid>
    <link>https://habr.com/ru/posts/1025122/?utm_campaign=1025122&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class=""><img src="https://habrastorage.org/webt/87/b0/8f/87b08ff67356576135f18d6acd6967f9.jpg"></figure><p> 🧠 Разбираемся, как устроены in-memory БД: пишем MemifyDB с нуля. </p><p>Redis быстр, но не всегда удобен. SAP HANA — мощь, но ценник…<br> А что, если заглянуть под капот и создать свою enterprise in-memory СУБД?<br> Не чёрный ящик, а полностью прозрачную, современную, open-source — и при этом готовую к высоким нагрузкам. Разбираемся как это работает!</p><p>Знакомьтесь — MemifyDB.</p><p>📌 Что это будет?<br> Настоящая in-memory система уровня enterprise, в которой мы разберёмся до винтика:</p><ul><li><p>живёт в RAM, отвечает за микросекунды;</p></li><li><p>сохраняет данные на диск (RDB + WAL) — никакой потери после ребута;</p></li><li><p>реплицируется и шардируется «из коробки»;</p></li><li><p>поддерживает транзакции (не хуже MULTI/EXEC, но с возможным rollback);</p></li><li><p>и при этом не просит продать почку за лицензию.</p></li></ul><p>Весь код — open source, все решения — с объяснениями.</p><p>🛠 Технический фундамент (выбираем стек вместе)<br> Платформа — JVM. Я сейчас выбираю между Java 21 (Loom) и Scala 3 (ZIO / Akka).</p><ul><li><p>Сеть: Netty или виртуальные потоки — посмотрим на бенчмарках.</p></li><li><p>Память: off-heap + собственный slab-аллокатор на ByteBuffer. GC не мешает, фрагментация под контролем.</p></li><li><p>Конкурентность: Lock-Free структуры данных, чтобы не блокировать потоки.</p></li><li><p>Протокол: RESP-совместимость — redis-cli сможет общаться с нами.</p></li></ul><p>🗺 Дорожная карта: что и когда разберём</p><ol><li><p>Ядро: потокобезопасное KV-хранилище в памяти. Как работают LRU и TTL?</p></li><li><p>Persistence: снапшоты и WAL. Как не потерять данные при краше?</p></li><li><p>Сеть: пишем TCP-сервер. Netty vs Loom — кто быстрее?</p></li><li><p>Транзакции: реализуем MULTI/EXEC, WATCH. Нужен ли MVCC?</p></li><li><p>Репликация и Raft: как достичь консенсуса в распределённой системе?</p></li></ol><p>Каждый этап — открытый код, пост с разбором, грабли и профит.</p><p>🤔 Зачем я это делаю публично?<br> Во‑первых, разобраться самому и дать шанс разобраться другим.<br> Во‑вторых, фидбек сообщества ловит ошибки на берегу.<br> В‑третьих, хочется сделать реально полезный инструмент, а не очередной pet‑project.</p><p>💬 Вопрос к залу:<br> Какой стек предпочтительнее для enterprise in‑memory БД — Java 21 + Loom или Scala + ZIO/Akka?<br> Какие фичи вы бы добавили в дорожную карту?<br> Пишите в комментариях — лучшие идеи уйдут в реализацию!</p><p>👉 Подписывайтесь, чтобы не пропустить:</p><ul><li><p>глубокий разбор off‑heap аллокатора;</p></li><li><p>сравнение моделей конкурентности на реальных бенчмарках;</p></li><li><p>историю о том, как одна строка unsafe кода валила прод три дня.</p></li></ul> <a href="https://habr.com/ru/posts/1025122/?utm_campaign=1025122&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 18 Apr 2026 21:14:00 GMT</pubDate>
    <dc:creator><![CDATA[mathter]]></dc:creator>
      
      <category><![CDATA[inmemory]]></category><category><![CDATA[java]]></category><category><![CDATA[database]]></category><category><![CDATA[database development]]></category><category><![CDATA[базыданных]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @A-G-B — Блог компании PVS-Studio (+4) — 30.03.2026 17:19]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1017014/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1017014/?utm_campaign=1017014&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Всё, что нужно знать для начала работы в PVS-Studio</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/a9a/ced/548/a9aced548cf807529f37c7f0f605f355.png" width="975" height="549"></figure><p>Статический анализатор PVS-Studio — это инструмент для поиска ошибок в коде на протяжении всего жизненного цикла проекта. <br>В новой статье разберём основные <a href="https://pvs-studio.ru/ru/blog/posts/1358/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore&amp;utm_content=article" rel="noopener noreferrer nofollow">особенности анализатора PVS-Studio</a>, сценарии и варианты анализа, а также узнаем всё, что нужно знать для начала работы с инструментом.</p> <a href="https://habr.com/ru/posts/1017014/?utm_campaign=1017014&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 30 Mar 2026 14:19:03 GMT</pubDate>
    <dc:creator><![CDATA[A-G-B (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[pvs-studio]]></category><category><![CDATA[static analysis]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[с++]]></category><category><![CDATA[c#]]></category><category><![CDATA[java]]></category><category><![CDATA[рбпо]]></category><category><![CDATA[sast]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @IBS_habrablog — Блог компании IBS (+2) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/ibs/posts/1011638/</guid>
    <link>https://habr.com/ru/companies/ibs/posts/1011638/?utm_campaign=1011638&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/469/205/dc7/469205dc7009d1f45e9dc06610eddc8d.jpg" width="1280" height="1280"></figure><p><strong>Бесплатный тест для Java‑разработчиков: оцени уровень и найди точки роста</strong></p><p>Хороший Java‑разработчик — это не просто тот, кто пишет код, а специалист, который держит в голове целую экосистему: от базовых принципов языка до архитектуры распределенных систем.</p><p>Чтобы осознанно развиваться дальше, важно понимать:</p><ul><li><p>какие технические навыки уже прокачаны;</p></li><li><p>где есть пробелы в знаниях архитектуры и проектировании;</p></li><li><p>какие технологии стоит изучить подробнее;</p></li><li><p>насколько уверенно ты ориентируешься в современном Java‑стеке.</p></li></ul><p>Мы сделали <a href="https://ibs-training.ru/sertifikatsiya/sertifikatsiya-dlya-java-razrabotchikov/" rel="noopener noreferrer nofollow">бесплатный пробный тест</a> — он поможет оценить твой уровень как Java‑разработчика и подсветит зоны для развития.</p><p>За 20 минут ты получишь:</p><ul><li><p>оценку текущего уровня;</p></li><li><p>карту компетенций — наглядную схему всех навыков, необходимых для развития в профессии;</p></li><li><p>подборку материалов для самостоятельного изучения.</p></li></ul><p><strong><a href="https://ibs-training.ru/sertifikatsiya/sertifikatsiya-dlya-java-razrabotchikov/" rel="noopener noreferrer nofollow">Пройти тест</a></strong></p><p>Кстати, мы подробно разбирали ключевые навыки и компетенции Java-разработчика <a href="https://habr.com/ru/companies/ibs/articles/1009952/" rel="noopener noreferrer nofollow">в отдельной статье</a> — рекомендуем прочитать ее или перечитать, чтобы освежить и структурировать знания перед тестом.</p> <a href="https://habr.com/ru/posts/1011638/?utm_campaign=1011638&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 19 Mar 2026 09:09:56 GMT</pubDate>
    <dc:creator><![CDATA[IBS_habrablog (IBS)]]></dc:creator>
      
      <category><![CDATA[сертификация]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Kisel_n — Python (+4) — 16.03.2026 21:06]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1011024/</guid>
    <link>https://habr.com/ru/posts/1011024/?utm_campaign=1011024&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Зелёные тесты ≠ хорошие тесты</strong></p><p>Впервые в&nbsp;истории писать тесты стало легко и совсем не&nbsp;страшно. Вокруг теперь у&nbsp;всех покрытие 80%, 90%, а&nbsp;то и вовсе 100%. И вот тут начинается проблема: зелёные тесты ≠ хорошие тесты.</p><p>Проблема в&nbsp;метрике, которой мы все привыкли доверять. Code coverage считает строку протестированной, если она выполнилась во&nbsp;время теста. Всё. Не «поймает&nbsp;ли тест баг в&nbsp;этой строке», не «проверяет&nbsp;ли он правильность результата»&nbsp;— просто выполнилась. Можно написать тест без&nbsp;единого assert, и покрытие вырастет. 500&nbsp;тестов, 90% coverage, а&nbsp;пользы ноль.</p><p>Мутационное тестирование&nbsp;— это совершенно другой путь. В&nbsp;простейшей реализации этот инструмент тупо берёт твой код и намеренно ломает его: меняет &gt; на &gt;=, + на ‑, True на&nbsp;False. Каждая такая поломка&nbsp;— мутант. Если после мутации все тесты по‑прежнему зелёные&nbsp;— значит они ничего не&nbsp;проверяют. Покрытие есть, защиты нет.</p><p><strong>Почему это важно именно сейчас?</strong></p><p>Потому что&nbsp;нейронка любит зелёненькое. Чем больше зелёных тестов&nbsp;— тем субъективно лучше. 100&nbsp;тестов внушают больше доверия, чем 10, правда? А&nbsp;внутри там assert response.status_code == 200. assert result is not None. assert len(items) &gt; 0. Тест проверяет, что&nbsp;функция вернула хоть что‑то&nbsp;— и радостно зеленеет. Поменяй логику условия, перепутай знак, сломай граничный случай&nbsp;— тест всё равно зелёный. Потому что&nbsp;он проверяет не&nbsp;правильность, а&nbsp;наличие.</p><p>Мутационное тестирование&nbsp;— единственный автоматический способ это поймать. Метрика называется mutation score: процент убитых мутантов. 60%&nbsp;— плохо. 90%+&nbsp;— тесты реально что‑то защищают.</p><p>Кое‑какие инструменты для&nbsp;такого тестирования уже есть: mutmut и cosmic‑ray для&nbsp;Python, Stryker для&nbsp;JS/TS, PIT для&nbsp;Java. Медленно? Да, значительно медленнее обычного тест‑рана. Но&nbsp;запускать его не&nbsp;нужно на&nbsp;каждый коммит&nbsp;— достаточно на&nbsp;PR в&nbsp;критические модули.</p><p>Но&nbsp;есть нюансы. А&nbsp;где их нет, правда?</p><p>Первый: мутации рандомные. Замена &gt; на &gt;=&nbsp;— это не&nbsp;баг, который кто‑то реально допустит. Это синтетическая поломка. Половина мутантов генерирует код, который в&nbsp;реальности никогда не&nbsp;появится. Ты тратишь время на&nbsp;убийство мутантов, которые не&nbsp;имеют отношения к&nbsp;настоящим ошибкам. Это как&nbsp;тестировать замок, ковыряя его вилкой&nbsp;— формально проверка, по&nbsp;факту мимо.</p><p>Второй&nbsp;— ещё хуже. Чтобы убить мутанта, тест должен зафиксировать конкретное поведение. Каждую ветку, каждое значение, каждый edge case. Доведи mutation score до 100%&nbsp;— и ты прибил гвоздями каждую строчку кода. Буквально. Теперь попробуй отрефакторить. Переименовал внутренний метод&nbsp;— 40&nbsp;тестов красные. Поменял порядок полей в&nbsp;ответе&nbsp;— ещё 20. Тесты превращаются из&nbsp;страховки в&nbsp;кандалы: код работает правильно, но&nbsp;тесты падают, потому что&nbsp;они проверяют не&nbsp;поведение, а&nbsp;реализацию.</p><p>Это реально ловушка. Слишком гонишься за&nbsp;mutation score&nbsp;— получаешь хрупкие тесты. Не&nbsp;гонишься&nbsp;— получаешь видимость тестирования.</p><p><strong>Перемены&nbsp;— впереди!</strong></p><p>И вот тут становится по‑настоящему интересно. Представь, что&nbsp;мутации генерирует не&nbsp;тупой набор правил «замени плюс на&nbsp;минус», а&nbsp;нейронка, которая понимает контекст. Которая знает, какие баги реально встречаются в&nbsp;таком коде. Которая мутирует не&nbsp;синтаксис, а&nbsp;логику: меняет порядок проверок, путает граничные условия, забывает обработать edge case&nbsp;— ровно так, как&nbsp;ошибается человек. Или&nbsp;другая нейронка.</p><p>Сейчас есть явный сдвиг в&nbsp;сторону таких инструментов, но&nbsp;всё еще ничего достойного не&nbsp;вышло. Но&nbsp;уже скоро точно появится. И это будет совсем другой уровень. Не «выжили&nbsp;ли тесты после рандомной поломки», а «выжили&nbsp;ли тесты после правдоподобной ошибки».</p><p>Парадокс в&nbsp;том, что&nbsp;мутационное тестирование&nbsp;было нишевым инструментом, пока тесты писали люди. Когда тесты пишет нейронка&nbsp;— идея становится обязательной. Правда инструменты пока не&nbsp;успели дозреть.</p><p>Ждём, когда мутанты станут умнее.</p> <a href="https://habr.com/ru/posts/1011024/?utm_campaign=1011024&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 16 Mar 2026 18:06:43 GMT</pubDate>
    <dc:creator><![CDATA[Kisel_n]]></dc:creator>
      
      <category><![CDATA[mutation testing]]></category><category><![CDATA[мутационное тестирование]]></category><category><![CDATA[code coverage]]></category><category><![CDATA[тестирование]]></category><category><![CDATA[AI]]></category><category><![CDATA[качество кода]]></category><category><![CDATA[mutmut]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @spring_aio — Блог компании Spring АйО (+3) — 12.03.2026 16:22]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/spring_aio/posts/1009482/</guid>
    <link>https://habr.com/ru/companies/spring_aio/posts/1009482/?utm_campaign=1009482&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>JEP 524 в JDK 26 — второй preview PEM API</strong></p><p>Наконец-то работа с PEM в Java становится похожа на API, а не на набор ручного парсинга, Base64 и странных телодвижений.</p><p>Справка: <em>PEM или Privacy-Enhanced Mail - это текстовый контейнер для криптографических данных. Проще говоря – это способ хранить или передавать ключ, сертификат или другой crypto-объект не в бинарном виде, а в текстовом.</em></p><p>Раньше с PEM работали так:</p><pre><code class="java">String pem = "-----BEGIN PUBLIC KEY-----\n"
&nbsp; &nbsp; &nbsp; &nbsp; + Base64.getMimeEncoder(64, "\n".getBytes())
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .encodeToString(publicKey.getEncoded())
&nbsp; &nbsp; &nbsp; &nbsp; + "\n-----END PUBLIC KEY-----";</code></pre><p>А в обратную сторону, но уже с ручной нормализацией PEM, Base64-декодированием и <code>KeyFactory</code>:</p><pre><code class="java">String normalized = pem
&nbsp; &nbsp; &nbsp; &nbsp; .replace("-----BEGIN PUBLIC KEY-----", "")
&nbsp; &nbsp; &nbsp; &nbsp; .replace("-----END PUBLIC KEY-----", "")
&nbsp; &nbsp; &nbsp; &nbsp; .replaceAll("\\s", "");

byte[] der = Base64.getDecoder().decode(normalized);

PublicKey key = KeyFactory.getInstance("EC")
&nbsp; &nbsp; &nbsp; &nbsp; .generatePublic(new X509EncodedKeySpec(der));</code></pre><p>По факту PEM в Java долгое время был не отдельным API, а набором низкоуровневых шагов, которые разработчик собирал руками.</p><p>А теперь это выглядит так:</p><pre><code class="java">var encoder = PEMEncoder.of();
String pem = encoder.encodeToString(keyPair);

var decoder = PEMDecoder.of();
KeyPair decoded = decoder.decode(pem, KeyPair.class);</code></pre><p>То есть ключевую пару можно закодировать в PEM и декодировать обратно буквально в несколько строк.</p><p>Во втором <em>preview</em>:</p><ul><li><p><code>PEMRecord</code> переименовали в PEM</p></li><li><p>добавили <code>decode()</code></p></li><li><p>расширили поддержку <code>KeyPair</code> и <code>PKCS8EncodedKeySpec</code></p></li><li><p>упростили шифрование через <code>EncryptedPrivateKeyInfo</code></p></li></ul><p>А так, как все это дело еще в <em>preview</em>, не забываем использовать <code>--enable-preview</code>.</p><p><em>❓ Минус еще один кусок криптографической копипасты из Java-кода.</em> <em>PEM в Java постепенно перестает быть унылым?</em></p><figure class="full-width "><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/258/484/92d/25848492d4cd2dcd1df595e475569a9a.png" width="1560" height="334"></figure><p><a href="https://t.me/+acrI2N6q080wZjM6" rel="noopener noreferrer nofollow">Присоединяйтесь</a>&nbsp;к&nbsp;русскоязычному сообществу разработчиков на&nbsp;Spring Boot в&nbsp;телеграм&nbsp;—&nbsp;<a href="https://t.me/+acrI2N6q080wZjM6" rel="noopener noreferrer nofollow">Spring АйО</a>, чтобы быть в курсе последних новостей из мира разработки на Spring Boot и всего, что с ним связано.</p> <a href="https://habr.com/ru/posts/1009482/?utm_campaign=1009482&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 12 Mar 2026 13:22:16 GMT</pubDate>
    <dc:creator><![CDATA[spring_aio (Spring АйО)]]></dc:creator>
      
      <category><![CDATA[java]]></category><category><![CDATA[kotlin]]></category><category><![CDATA[cryptography]]></category><category><![CDATA[crypto]]></category><category><![CDATA[jep]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @PvsTeam — Блог компании PVS-Studio (+3) — 05.03.2026 09:18]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1006710/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1006710/?utm_campaign=1006710&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>🚀 <strong>Бесплатный курс для разработчиков: создаём свой язык программирования!</strong>    </p><p>Приглашаем вас пройти наш курс и разобраться, как устроены языки программирования изнутри.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/6d1/859/4ed/6d18594edc8ab53337ad2da2c996d864.png" width="1920" height="1080"></figure><p>Изначально курс делали для прохождения внутри компании, но решили, что полезного материала так много, что хочется рассказать всему миру!</p><p>Этот курс подойдёт разработчикам, которые хотят выйти за рамки повседневной разработки и глубже понять фундаментальные принципы работы кода. Да, примеры будут на C++, но сам материал гораздо шире и будет полезен программистам с любым стеком. Независимо от того, пишете вы на C++, C#, Java или любом другом языке, понимание внутренней архитектуры языков сделает вас сильнее как инженера.</p><p>В рамках курса мы шаг за шагом разберём, как создаётся язык программирования:<br> — что такое лексер и парсер и какую роль они играют;<br> — как работает семантический анализ;<br> — как происходит вычисление и обработка кода;<br> — как все эти части объединяются в единую систему.</p><p>Вы увидите, как текст программы превращается в структуру, понятную машине, и поймёте, какие решения стоят за этим процессом.</p><p>Даже если вы не планируете создавать собственный язык программирования, курс поможет чуть глубже понять, как всё это устроено "под капотом", расширить технический кругозор и по-новому взглянуть на привычные инструменты. Это хороший способ систематизировать знания, освежить базовые концепции и просто обсудить интересные темы с коллегами.</p><p>Мы постарались сделать материал одновременно понятным и практико-ориентированным: минимум абстракции ради абстракции — максимум смысла.</p><p>Если вы хотите лучше понимать, что происходит "под капотом" программирования и прокачать инженерное мышление — этот курс для вас.</p><p>👉 Подробности и доступ <a href="https://pvs-studio.ru/ru/blog/training/courses/davajte-sozdadim-yazyk-programmirovaniya/?utm_source=habr&amp;utm_medium=pvsteam" rel="noopener noreferrer nofollow">к курсу по ссылке. </a></p><p>Присоединяйтесь и изучайте программирование глубже — бесплатно!</p> <a href="https://habr.com/ru/posts/1006710/?utm_campaign=1006710&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 05 Mar 2026 06:18:00 GMT</pubDate>
    <dc:creator><![CDATA[PvsTeam (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[курс]]></category><category><![CDATA[cpp]]></category><category><![CDATA[создание языка программирования]]></category><category><![CDATA[лексер]]></category><category><![CDATA[java]]></category><category><![CDATA[c#]]></category><category><![CDATA[парсер]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Trip-Hope — Блог компании Veai (+4) — 27.02.2026 12:08]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/veai/posts/1004460/</guid>
    <link>https://habr.com/ru/companies/veai/posts/1004460/?utm_campaign=1004460&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Приглашаем на доклад Deep Dive into JVM JDI: Capturing Live Execution for Automatic JUnit Test Generation</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/f58/36d/b1d/f5836db1db8c40456e0c18fc6387c69f.png" width="1728" height="972"></figure><p>Привет! Если на выходных судьба занесёт вас в Новосибирский Академгородок, приходите на <a href="https://snowone.ru/talks/0ab3f3eba9b644d5b0db0e1071fba8fe/?referer=%2Fschedule%2Fdays%2F" rel="noopener noreferrer nofollow">технический доклад с мемами</a> от нашего коллеги Даниила Степанова на самой ламповой Java-конференции Сибири — <a href="https://snowone.ru/" rel="noopener noreferrer nofollow">SnowOne 2026 ❄️</a>.</p><p>📌 28 февраля, 14:00–15:00 (время Новосибирска)<br> 👨‍💻 Даниил Степанов — разработчик-исследователь в <a href="https://veai.ru/?utm_source=post&amp;utm_medium=habr&amp;utm_campaign=snowone" rel="noopener noreferrer nofollow">Veai</a>, к.т.н., преподаватель ИТМО</p><p><strong>Deep Dive into JVM JDI: Capturing Live Execution for Automatic JUnit Test Generation</strong></p><p>Глубокий технический разбор архитектуры инструмента, который использует Java Debug Interface (JDI) для захвата состояния работающей JVM и автоматического синтеза валидных unit-тестов.</p><p>Что будет в докладе:</p><ul><li><p>Deep Dive в JDI. Подробный рассказ про JDI, преимущества и недостатки, а также как его использовать в нестандартных сценариях для безопасного захвата Heap и Stack Frame в реальном времени.</p></li><li><p>Реконструкция объектов. Reverse Engineering JVM-состояния для воссоздания сложных графов объектов.</p></li><li><p>Синтез Java-кода. Как превратить сырой дамп памяти в чистый, валидный JUnit-тест.</p></li><li><p>Роль LLM. Для решения каких проблем мы используем искусственный интеллект?</p></li></ul><p>Доклад будет полезен Java-разработчикам, тем, кто интересуется внутренним устройством JVM, и всем, кто хочет автоматизировать написание тестов.</p><p>Технологии: Java, JVM, JDI (Java Debug Interface), Mockito, JUnit, LLM.</p><p>Отличной пятницы и увидимся на SnowOne 🖖</p> <a href="https://habr.com/ru/posts/1004460/?utm_campaign=1004460&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 27 Feb 2026 09:08:14 GMT</pubDate>
    <dc:creator><![CDATA[Trip-Hope (Veai)]]></dc:creator>
      
      <category><![CDATA[intellij idea plugin]]></category><category><![CDATA[snowone]]></category><category><![CDATA[дебаг]]></category><category><![CDATA[ai-agent]]></category><category><![CDATA[ai-ассистент]]></category><category><![CDATA[автоматическая генерация кода]]></category><category><![CDATA[автоматизация тестирования]]></category><category><![CDATA[написание тестов]]></category><category><![CDATA[jvm]]></category><category><![CDATA[jdi]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Awilum — Java (+4) — 25.02.2026 13:52]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1003502/</guid>
    <link>https://habr.com/ru/posts/1003502/?utm_campaign=1003502&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Практический Тренажер по Java — самый популярный тренажер по Java на&nbsp;Stepik</strong></p><p>В 2024 году я опубликовал курс «Практический Тренажер по Java» на платформе Stepik. Тогда это был просто практический курс с задачами — без воды, без длинной теории, только код и постоянная тренировка.</p><p>Прошло несколько лет.</p><p>Сегодня курс проходит более&nbsp;<strong>19 000 учеников</strong>, и это&nbsp;<strong>самый популярный тренажёр по языку Java на платформе Stepik</strong>.</p><p>Курс продолжает активно развиваться, регулярно пополняется новыми задачами, а вокруг него сформировалось живое и активное сообщество.</p><p>И я хочу заново пригласить вас в этот проект.</p><p><strong>Почему Java?</strong></p><p>Java&nbsp;— один из самых востребованных языков программирования в мире. </p><p>Он используется в:</p><p>— веб-разработке</p><p>— мобильной разработке (Android)</p><p>— корпоративных системах</p><p>— финансовых сервисах</p><p>— высоконагруженных backend-проектах<br></p><p>Java — это стабильность, масштабируемость и высокий спрос на рынке труда.</p><p><strong>Что представляет собой курс сегодня?</strong></p><p>Это полностью практический формат обучения. Только задачи и реальная практика.</p><p>Многие ученики используют тренажер как системную подготовку к техническим интервью. Такой формат не просто помогает решать задачи, а выстраивает алгоритмическое мышление, формирует уверенность в собственном коде и укрепляет уверенность в своих силах и уровне владения Java.</p><p><strong>Кому подойдёт курс?</strong></p><p>— начинающим разработчикам</p><p>— тем, кто хочет перейти в backend</p><p>— Android-разработчикам</p><p>— QA Automation инженерам</p><p>— тем, кто готовится к собеседованиям</p><p>Я приглашаю вас присоединиться :)</p><p><strong>➡️ <a href="https://stepik.org/course/182389" rel="noopener noreferrer nofollow">Java Тренажер на Stepik</a></strong></p> <a href="https://habr.com/ru/posts/1003502/?utm_campaign=1003502&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 25 Feb 2026 10:52:37 GMT</pubDate>
    <dc:creator><![CDATA[Awilum]]></dc:creator>
      
      <category><![CDATA[java]]></category><category><![CDATA[задачи для программистов]]></category><category><![CDATA[задачи для собеседований]]></category><category><![CDATA[тренажеры]]></category><category><![CDATA[собеседования]]></category><category><![CDATA[бэкенд]]></category><category><![CDATA[курсы программирования]]></category><category><![CDATA[курсы java]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Volokhovskii — Блог компании PVS-Studio (+3) — 20.02.2026 13:34]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1001832/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1001832/?utm_campaign=1001832&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Применяем кодогенерацию в Java для решения алгоритмических задач</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/848/8ca/c16/8488cac16874f10e131ce56d61fda518.png" width="940" height="530"></figure><p>В прошлый раз мы разобрались, как решается задача трансляции деревьев. И остановились на том, что в случае с AST от компилятора TypeScript, придётся руками обрабатывать 263 типов узлов. Тысячи строк однотипного boilerplate-кода: приведения типов, аннотации, объявления методов — всё это нужно не просто написать, но ещё и поддерживать. А если требования к архитектуре поменяются — переписывать заново.</p><p>Однако в случае с Java у нас есть способ упростить себе жизнь — кодогенерация. Нет, не та, что при помощи ИИ-агентов, хотя это мы тоже затронем. Вместо тысяч строк Java кода можно использовать лаконичный конфиг, в котором описывается соответствие узлов и их связи, а всю рутину берёт на себя генератор. Изоморфные преобразования, декомпозиция — всё это описывается там.</p><p>Как реализовать это с помощью JavaPoet, что умеет эта библиотека, а также как встроить в процесс нормализацию можно узнать в новом материале, посвящённом использованию <a href="https://pvs-studio.ru/ru/blog/posts/java/1345/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=article&amp;utm_content=1345" rel="noopener noreferrer nofollow">кодогенерации для трансляции деревьев</a>.</p> <a href="https://habr.com/ru/posts/1001832/?utm_campaign=1001832&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 20 Feb 2026 10:34:43 GMT</pubDate>
    <dc:creator><![CDATA[Volokhovskii (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[JavaPoet]]></category><category><![CDATA[Кодогенерация]]></category><category><![CDATA[Java]]></category><category><![CDATA[Архитектура]]></category><category><![CDATA[Деревья]]></category><category><![CDATA[структуры данных]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[ast]]></category><category><![CDATA[трансляция]]></category><category><![CDATA[TypeScript]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @vlade1k — Блог компании PVS-Studio (+3) — 17.02.2026 16:57]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1000562/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1000562/?utm_campaign=1000562&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>OpenAPI Generator через призму статического анализатора</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/3c8/5e4/aba/3c85e4abaac1b0a2e96c890acd72736c.png" width="974" height="549"></figure><p>Знаете ли вы про OpenAPI Generator — open source проект, задача которого — автоматическая генерация клиентских библиотек, серверных заглушек, документации и файлов конфигурации на основе спецификации OpenAPI в формате JSON или YAML. Проект является достаточно популярным: у него чуть больше 25000 звёзд на GitHub. </p><p>Мы проверили его статическим анализатором для языка Java и написали статью про найденные <a href="https://pvs-studio.ru/ru/blog/posts/java/1344/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore&amp;utm_content=article" rel="noopener noreferrer nofollow">в коде OpenAPI Generator ошибки</a>.</p> <a href="https://habr.com/ru/posts/1000562/?utm_campaign=1000562&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 17 Feb 2026 13:57:21 GMT</pubDate>
    <dc:creator><![CDATA[vlade1k (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[openapi generator]]></category><category><![CDATA[pvs-studio]]></category><category><![CDATA[java]]></category><category><![CDATA[статический анализ кода]]></category><category><![CDATA[sast]]></category><category><![CDATA[open source]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @spring_aio — Блог компании Spring АйО (+2) — 13.02.2026 16:55]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/spring_aio/posts/996282/</guid>
    <link>https://habr.com/ru/companies/spring_aio/posts/996282/?utm_campaign=996282&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>⚠️ Java продолжает готовиться к удалению finalize()</strong></p><p>В рамках JDK 27 у <code>ThreadPoolExecutor</code>-а, очень популярного API в Java, будет удалён метод <code>finalize()</code>. Несмотря на то, что в силу dynamic dispatch вызов метода <code>finalize()</code> всё равно будет транслирован в <code>Object</code>, данное изменение не <em>source level compatible</em>.</p><p>А все потому, что у <code>Object.finalize()</code> сигнатура содержит throws Throwable, в то время как <code>ThreadPoolExecutor.finalize()</code> — нет. Пока метод был в <code>ThreadPoolExecutor</code>, компилятору было ок. Как только его удалят, вызов <code>super.finalize()</code> начнет резолвиться в <code>Object.finalize()</code>, и тогда прилетит “unreported exception Throwable”.</p><p>Комментарий от <a href="https://t.me/mipo256" rel="noopener noreferrer nofollow">Михаила Поливаха</a>:</p><blockquote><p>Вот это кстати довольно редкий пример того, что имзенение может быть <em>binary level compatible</em>, но <em>не source level compatible</em>.</p></blockquote><p><strong>Например:</strong></p><pre><code class="java">class MyPool extends ThreadPoolExecutor {

&nbsp; @Override
&nbsp; protected void finalize() {
&nbsp; &nbsp; super.finalize(); // JDK 27: теперь это Object.finalize() throws Throwable
&nbsp; }
}</code></pre><p><strong>Как избежать?</strong></p><ul><li><p>поискать и удалить любые <code>finalize()</code> / <code>super.finalize()</code> (и вообще любые авто-cleanup через финализацию)</p></li><li><p>управлять жизненным циклом executor’ов явно: <code>shutdown()</code>/<code>awaitTermination()</code> или просто close() в try-with-resources (да, <code>ExecutorService</code> — <code>AutoCloseable</code>)</p></li></ul><p><a href="https://t.me/+acrI2N6q080wZjM6" rel="noopener noreferrer nofollow">Spring АйО</a> рекомендует не использовать <code>finalize()</code> в целом, но если подобного рода хук нужен, то лучше использовать Java Cleaner API. С его помощью нельзя "случайно" воскресить объект, сломать integrity объекта или т.п.</p><p><em>Ждем JDK 27 🫠</em></p><figure class="full-width "><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/258/484/92d/25848492d4cd2dcd1df595e475569a9a.png" width="1560" height="334"></figure><p><a href="https://t.me/+acrI2N6q080wZjM6" rel="noopener noreferrer nofollow">Присоединяйтесь</a>&nbsp;к&nbsp;русскоязычному сообществу разработчиков на&nbsp;Spring Boot в&nbsp;телеграм&nbsp;—&nbsp;<a href="https://t.me/+acrI2N6q080wZjM6" rel="noopener noreferrer nofollow">Spring АйО</a>, чтобы быть в курсе последних новостей из мира разработки на Spring Boot и всего, что с ним связано.</p> <a href="https://habr.com/ru/posts/996282/?utm_campaign=996282&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 13 Feb 2026 13:55:40 GMT</pubDate>
    <dc:creator><![CDATA[spring_aio (Spring АйО)]]></dc:creator>
      
      <category><![CDATA[java]]></category><category><![CDATA[kotlin]]></category><category><![CDATA[jvm]]></category><category><![CDATA[jep]]></category><category><![CDATA[jdk]]></category><category><![CDATA[jdk27]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @honest_niceman — Блог компании Haulmont (+4) — 09.02.2026 12:58]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/haulmont/posts/994352/</guid>
    <link>https://habr.com/ru/companies/haulmont/posts/994352/?utm_campaign=994352&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Автоимпорт при копировании кода — штука настолько приятная и удобная, что без неё уже невозможно представить работу в IDE.&nbsp;</p><p>Мы пошли дальше и вслед за умным импортом во время набора кода сделали <strong>автоматическую инжекцию бинов при копировании кода!</strong></p><p>Теперь при копировании кода Amplicode автоматически добавляет нужную инжекцию бинов. С учётом контекста, <code>@Primary</code>, <code>@Qualifier</code>, дженериков, <code>@Bean</code>-методов, Java и Kotlin — без ручной возни после вставки.</p><p>Будет доступно всем пользователям <a href="https://amplicode.ru" rel="noopener noreferrer nofollow">Amplicode</a>, без подписки.</p><iframe id="6989af5775544b44047f0fd6" src="https://embedd.srv.habr.com/iframe/6989af5775544b44047f0fd6" class="embed_video embed__content" allowfullscreen="true"></iframe> <a href="https://habr.com/ru/posts/994352/?utm_campaign=994352&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 09 Feb 2026 09:58:17 GMT</pubDate>
    <dc:creator><![CDATA[honest_niceman (Haulmont)]]></dc:creator>
      
      <category><![CDATA[java]]></category><category><![CDATA[spring]]></category><category><![CDATA[kotlin]]></category><category><![CDATA[spring boot]]></category><category><![CDATA[intellij idea]]></category><category><![CDATA[openide]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @nomanhero — Java (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/991688/</guid>
    <link>https://habr.com/ru/posts/991688/?utm_campaign=991688&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как оставаться релевантным на рынке QA/AQA/SDET в 2026: опыт, харды, софты, ответы</strong></p><p>Последнее время всё чаще слышу вопросы про состояние рынка.<br>Многие говорят, что рынок «умер», вакансий стало меньше, а требования выросли настолько, что найти работу почти нереально.</p><p>Часто это выглядит так: человек активно откликается, ходит на собеседования, делает тестовые задания, общается с рекрутерами.<br>А на выходе получает либо отказы без конкретных причин, либо формулировки вроде «вы хороший специалист, но нам нужен немного другой профиль».</p><p>Ощущение, что стало сложнее, не обманчиво. Рынок действительно изменился за последние один-два года.<br>Но парадокс в том, что именно в таких условиях многим стало проще выделяться. Не потому, что кандидатов стало меньше, а потому, что вырос разрыв между теми, кто выглядит релевантно, и теми, кто нет.</p><p>Я регулярно общаюсь с QA, AQA и SDET, которые находятся в активном поиске, и сам продолжаю проходить собеседования, чтобы понимать, как именно сейчас устроен процесс найма.<br>И вот что я понял из всех историй: сегодня выигрывает не самый наглый кандидат (как было раньше), а тот, кто хорошо понимает свой опыт и умеет его объяснять.</p><p><strong>Что изменилось</strong></p><p>Еще один-два года назад часто работала простая схема: уверенное резюме плюс нормальная подача давали высокую вероятность оффера.<br>Во многих компаниях в детали погружались поверхностно, опыт оценивали в общих чертах, а неточности прощались, если кандидат выглядел уверенно.</p><p>Сейчас ситуация другая.<br>Вакансий в ряде направлений стало меньше, требования выросли, а собеседования стали заметно глубже. Интервьюеры чаще проверяют логику решений и реальный вклад кандидата в проекты.</p><p>Это не «заговор рынка», а естественная фильтрация. Когда выбор кандидатов большой, требования становятся строже.</p><p><strong>Почему в этом есть плюсы</strong></p><p>Жесткий рынок хорошо отсеивает слабые места. Причем чаще всего самые базовые.</p><p>На собеседованиях у ребят регулярно всплывают одни и те же проблемы:</p><ul><li><p>человек говорит, что строил фреймворк, но не может связно объяснить архитектуру;</p></li><li><p>упоминает автотесты, но не понимает, почему был выбран конкретный стек;</p></li><li><p>рассказывает про CI, но путается в вопросах стабильности;</p></li><li><p>заявляет ответственность за качество, но не может описать процессы и зоны ответственности.</p></li></ul><p>Большинство кандидатов «падает» не на сложных вопросах, а на уточняющих.<br>На этом фоне специалист, который осознанно разбирается в своем опыте и может его структурировано рассказать, сразу выглядит сильнее, даже без громких компаний в резюме.</p><p><strong>Как сейчас смотрят на опыт</strong></p><p>На интервью все меньше внимания уделяется формальным строчкам в резюме и все больше мышлению.</p><p>Интервьюеру важно понять:</p><ol><li><p>Почему было принято именно такое решение;</p></li><li><p>Какие были трудности;</p></li><li><p>Как проблемы диагностировали;</p></li><li><p>Какие выводы сделали.</p></li></ol><p>Если опыт не структурирован, ответы быстро разваливаются.<br>Если же кандидат сам хорошо понимает, что он делал и зачем, он спокойно проходит даже при неидеальном бэкграунде.</p><p>Поэтому сейчас важна не красивая история, а осознанное понимание своего опыта.</p><p><strong>Что с этим делать</strong></p><p>Минимальный практический набор:</p><ol><li><p>Разложить свой опыт по зонам - архитектура, API, UI, CI/CD, процессы, инциденты.</p></li><li><p>Подготовить ответы в формате «проблема - решение - результат - выводы». (Для шарящих - по STAR)</p></li><li><p>Прогнать опыт через уточняющие вопросы и проверить, где ответы выглядят слабо или непоследовательно.</p></li><li><p>Упаковать резюме как набор конкретных ответов - что улучшал, что оптимизировал, за что отвечал + быть готовым это подтвердить.</p></li></ol><p><strong>Вывод</strong></p><p>Рынок действительно стал сложнее.<br>Но именно поэтому он стал более комфортным для тех, кто держит фокус на релевантности, понимает свой опыт и готовится к проверке.</p><p>Если относиться к поиску работы как к инженерной задаче, жесткий рынок перестает быть проблемой и становится рабочей средой.</p><p>Ну а всем нуждающимся желаю скорее обрести себя на сегодняшнем рынке! Готов подискутировать на смежные темы в комментариях)</p> <a href="https://habr.com/ru/posts/991688/?utm_campaign=991688&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 02 Feb 2026 07:59:08 GMT</pubDate>
    <dc:creator><![CDATA[nomanhero]]></dc:creator>
      
      <category><![CDATA[Тестирования]]></category><category><![CDATA[автоматизированное тестирование]]></category><category><![CDATA[Автотесты]]></category><category><![CDATA[AQA]]></category><category><![CDATA[QA]]></category><category><![CDATA[sdet]]></category><category><![CDATA[qa auto]]></category><category><![CDATA[automation qa]]></category><category><![CDATA[hh.ru]]></category><category><![CDATA[поиск работы]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @shanker — Java (+2) — 29.01.2026 20:03]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/990758/</guid>
    <link>https://habr.com/ru/posts/990758/?utm_campaign=990758&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>О поддержке opensource - как показателе безопасности</strong></p><p>Случались ситуации, когда компании использовали open source, который перестал развиваться. И в этом open source <a href="https://t.me/avleonovrus/2788" rel="noopener noreferrer nofollow">находили уязвимости</a>. Итог: компаниям сложно ликвидировать уязвимости в используемом open source. По этой причине рождались предложения: дабы не попасть в такую ситуацию - при выборе open source проверять, что проект ещё поддерживается. Мысль здравая. Но, и тут могут быть нюансы. Пример - проект JasperReports (для Java). Судя по <a href="https://github.com/Jaspersoft/jasperreports" rel="noopener noreferrer nofollow">репозиторию</a> - проект поддерживается. <a href="https://community.jaspersoft.com/advisories/jaspersoft-security-advisory-september-16-2025-jaspersoft-library-cve-2025-10492-r6/" rel="noopener noreferrer nofollow">16 сентября 2025</a> была опубликована информация об уязвимости в проекте (критического уровня: <a href="https://dbugs.ptsecurity.com/vulnerability/PT-2025-38055?fts%5Bvalue%5D=CVE-2025-10492" rel="noopener noreferrer nofollow">9.8 по шкале CVSS&nbsp;v3.1</a> - CVE-2025-10492). А 19 сентября 2025 <a href="https://github.com/Jaspersoft/jasperreports/issues/542#issuecomment-3311877191" rel="noopener noreferrer nofollow">разработчик сообщил</a>, что фикс выйдет только для коммерческой версии.</p> <a href="https://habr.com/ru/posts/990758/?utm_campaign=990758&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 29 Jan 2026 17:03:15 GMT</pubDate>
    <dc:creator><![CDATA[shanker]]></dc:creator>
      
      <category><![CDATA[open source]]></category><category><![CDATA[уязвимость]]></category><category><![CDATA[jasperreports]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @vlade1k — Блог компании PVS-Studio (+1) — 27.01.2026 16:50]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/989594/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/989594/?utm_campaign=989594&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Автостопом по LTS: основные изменения при переходе с 8 на 11 Java</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/2aa/d48/cbf/2aad48cbfff435a26fb129832cba8204.png" width="973" height="548"></figure><p>Совсем недавно мы выпускали <a href="https://habr.com/ru/companies/pvs-studio/articles/945626/" rel="noopener noreferrer nofollow">статью про нововведения в Java 25</a>. И один из комментаторов <a href="https://habr.com/ru/companies/pvs-studio/articles/945626/comments/#comment_28820262" rel="noopener noreferrer nofollow">сказал</a>, что ему было бы интересно прочитать от нас цикл статей, в которых рассказано и показано, как менялась Java от LTS к LTS, начиная с Java 8. </p><p>Нам эта идея показалась интересной, и с <a href="https://pvs-studio.ru/ru/blog/posts/java/1337/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore&amp;utm_content=article" rel="noopener noreferrer nofollow">этой статьи</a> мы начинаем наш новый цикл, в котором рассказываем, с чем придётся столкнуться разработчику при переходе между LTS-версиями Java. В этой статье рассмотрим основные изменения, которые ждут программиста, если он решит перейти с Java 8 на Java 11.</p> <a href="https://habr.com/ru/posts/989594/?utm_campaign=989594&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 27 Jan 2026 13:50:58 GMT</pubDate>
    <dc:creator><![CDATA[vlade1k (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[lts]]></category><category><![CDATA[java 8]]></category><category><![CDATA[java 8-10]]></category><category><![CDATA[java 11]]></category><category><![CDATA[java 25]]></category><category><![CDATA[pvs-studio]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @feeelin — Блог компании PVS-Studio (+4) — 26.01.2026 12:02]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/988992/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/988992/?utm_campaign=988992&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Что нового появилось в PVS-Studio в 2025 году</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/5b4/935/4ab/5b49354ab15ac5b7b4109709f6125dc7.png" width="1600" height="902"></figure><p>Новый 2026 год уже вовсю идёт, и мы решили оглянуться назад и вспомнить, что интересного появилось в PVS-Studio за богатый на изменения 2025 год:</p><ul><li><p>десятки новых диагностических правил, включая проверки, ориентированные на безопасность;</p></li><li><p>обновления интеграций в популярные IDE, CI/CD-системы, ASOC и сборочные системы;</p></li><li><p>улучшения анализа;</p></li><li><p>расширенная поддержка стандартов.</p></li></ul><p>Всё это и многое другое описано <a href="https://pvs-studio.ru/ru/blog/posts/1336/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore" rel="noopener noreferrer nofollow">в новой статье</a> в нашем блоге.</p> <a href="https://habr.com/ru/posts/988992/?utm_campaign=988992&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 26 Jan 2026 09:02:08 GMT</pubDate>
    <dc:creator><![CDATA[feeelin (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[PVS-Studio]]></category><category><![CDATA[static analysis]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[C++]]></category><category><![CDATA[C#]]></category><category><![CDATA[Java]]></category><category><![CDATA[Security]]></category><category><![CDATA[SAST]]></category><category><![CDATA[Безопасность]]></category><category><![CDATA[РБПО]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @KaryamaGavi — Java (+3) — 24.01.2026 23:06]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/988630/</guid>
    <link>https://habr.com/ru/posts/988630/?utm_campaign=988630&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>  При&nbsp;написании интеграционных тестов для&nbsp;Spring Boot приложения часто возникает проблема, что&nbsp;разработчики бездумно добавляют аннотации <code>@MockBean</code>, <code>@SpyBean</code>, <code>@DirtiesContext</code> или переопределяют прямо в тестовом классе различные <code>property</code>. Всё это приводит к&nbsp;изменению Spring Context, невозможности использовать закэшированный контекст и следовательно созданию нового. Часто создание нового контекста это длительная операция.</p><p>  Существуют инструменты по отслеживанию этих процессов. Самым простым способом увидеть количество контекстов и количество попаданий в кэш является добавление логирования либо через свойство <code>logging.level.org.springframework.test.context.cache=DEBUG</code> либо настройкой вашего логгера.</p><p> Один известный автор статей про тестирование на Java / Spring Boot, Philip Riecks (со товарищи), создал  инструмент с открытым исходным кодом <a href="https://github.com/PragmaTech-GmbH/spring-test-profiler" rel="noopener noreferrer nofollow">Spring Test Profiler</a> при помощи которого можно получить html отчёт о поднимаемых контекстах во время тестов, о количестве и типе бинов в этих контекстах. На Хабре есть <a href="https://habr.com/ru/companies/spring_aio/articles/940930/" rel="noopener noreferrer nofollow">перевод его статьи</a> в сообществе Spring АйО.<br> </p><p>У нас на проекте стал вопрос, как нам показать разработчикам, что их тест порождает новый Спринг Контекст. Мы решили считать контексты в тестах и при превышении ожидаемого количества падать. Это  "руинит" сборку и CI/CD пайплайн.<br> Для этого мы добавили реализацию интерфейса <code>ContextCustomizer</code></p><pre><code class="java">class LimitingSpringContextCustomizer implements ContextCustomizer {

    private static final AtomicInteger CONTEXT_COUNTER = new AtomicInteger();
    private static final int EXPECTED_SPRING_TEST_CONTEXT_COUNT = 16;

    @Override
    public void customizeContext(ConfigurableApplicationContext context, MergedContextConfiguration mergedConfig) {
        int numberOfContexts = CONTEXT_COUNTER.incrementAndGet();
        log.info("Number of Spring Test Contexts: {}/{}", numberOfContexts, EXPECTED_SPRING_TEST_CONTEXT_COUNT);
        Assert.state(numberOfContexts &lt;= EXPECTED_SPRING_TEST_CONTEXT_COUNT,
                () -&gt; "Number of test contexts exceeds configured maximum: " + EXPECTED_SPRING_TEST_CONTEXT_COUNT);
    }

    @Override
    public boolean equals(Object obj) {
        return (obj != null) &amp;&amp; (getClass() == obj.getClass());
    }

    @Override
    public int hashCode() {
        return getClass().hashCode();
    }
}</code></pre><p>Здесь, согласно документации интерфейса <code>ContextCustomizer</code> необходимо корректно переопределить методы&nbsp;<code>equals</code>&nbsp;и&nbsp;<code>hashCode</code>.</p><blockquote><p>WARNING: implementations must implement correct equals and hashCode methods since customizers form part of the MergedContextConfiguration which is used as a cache key.</p></blockquote><p>Далее добавляем фабрику.</p><pre><code class="java">class LimitingSpringContextCustomizerFactory implements ContextCustomizerFactory {

    @Override
    public ContextCustomizer createContextCustomizer(Class&lt;?&gt; testClass,
                                                     List&lt;ContextConfigurationAttributes&gt; configAttributes) {
        return new LimitingSpringContextCustomizer();
    }
}</code></pre><p>Затем регистрируем эту фабрику при помощи <code>spring.factories</code> чтобы она применялась ко всем тестам. <br> Для этого создаём в тестовых ресурсах файл по пути <code>src/test/resources/META-INF/spring.factories</code> со следующим содержимым</p><pre><code>org.springframework.test.context.ContextCustomizerFactory=\  
com.mycompany.app.support.spring.LimitingSpringContextCustomizerFactory</code></pre><p>Теперь, если во время выполнения тестов будет превышено количество инициализированных тестовых контекстов, то мы увидим ошибку в тестах и сборка завершится неудачей.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/230/0a2/ef5/2300a2ef5562c3c92d9647b51e15b4f4.png" width="1253" height="134"></figure><p>Возможно, это пример поможет кому-нибудь повысить скорость прохождения своих тестов путём отслеживания количества запускаемых тестовых Спринг контекстов.</p> <a href="https://habr.com/ru/posts/988630/?utm_campaign=988630&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 24 Jan 2026 20:06:54 GMT</pubDate>
    <dc:creator><![CDATA[KaryamaGavi]]></dc:creator>
      
      <category><![CDATA[java]]></category><category><![CDATA[spring]]></category><category><![CDATA[spring-boot]]></category><category><![CDATA[test]]></category><category><![CDATA[spring framework]]></category><category><![CDATA[spring boot]]></category><category><![CDATA[testing tools]]></category><category><![CDATA[testing]]></category><category><![CDATA[kotlin]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @TheLivan — Блог компании PVS-Studio (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/986906/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/986906/?utm_campaign=986906&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как не потерять сервер в Minecraft из-за опасных модов</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/d20/f6d/545/d20f6d5451a5175d70e7458e72822123.png" width="975" height="550"></figure><p>Уверен, что многие владельцы Minecraft-проектов сталкивались с игроками, которые хотели взломать сервер и выдать себе права администратора. Я понимаю, что подобное случается не только в играх, и из научного интереса изучаю, как и почему это происходит.</p><p><a href="https://pvs-studio.ru/ru/blog/posts/java/1334/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore" rel="noopener noreferrer nofollow">В этой статье мы рассмотрим CVE, найденную в моде Integrated Scripting.</a></p> <a href="https://habr.com/ru/posts/986906/?utm_campaign=986906&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 20 Jan 2026 09:01:46 GMT</pubDate>
    <dc:creator><![CDATA[TheLivan (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[Java]]></category><category><![CDATA[Minecraft]]></category><category><![CDATA[RCE]]></category><category><![CDATA[моддинг]]></category><category><![CDATA[информационная безопасность]]></category><category><![CDATA[cve]]></category><category><![CDATA[CVE-2025-27107]]></category><category><![CDATA[cwe]]></category><category><![CDATA[ACE]]></category><category><![CDATA[gamedev]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @fedokanez — Kotlin (+4) — 13.01.2026 15:13]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/984830/</guid>
    <link>https://habr.com/ru/posts/984830/?utm_campaign=984830&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Kotlin и Hyperskill: как я искал курс и что получил в итоге.</strong></p><p>Когда я решил изучать Kotlin, ожидал, что найти хороший курс будет просто: язык популярный, используется в Android и бэкенде, вокруг много материалов. Искал менторов и упирался в людей которые знаю java и вроде как используют в работе Kotlin. Это одновременно пугало и заинтересовывало, я решил поступить как мне казалось правильным, найти готовый курс&nbsp; — особенно если хочется не “смотреть видео”, а именно учиться через практику и задачи.</p><p>Я перепробовал разные форматы обучения (платные и бесплатные), поэтому в этот раз подход был простой: найти платформу, где есть структурированная программа и много практики. В итоге я добрался до Hyperskill (<a href="http://hyperskill.org" rel="noopener noreferrer nofollow">hyperskill.org</a>). Это не реклама — просто личный опыт, кому-то он может сэкономить время.</p><p><strong>Как я пришёл к ресурсу.</strong></p><p>Изначально искал курсы по Kotlin на привычных площадках. На Stepik в тот момент не нашёл того, что мне подходило по структуре (возможно, сейчас ситуация лучше). Видео-курсы на крупных “известных сайтах” сознательно не рассматривал: мне удобнее формат “прочитал → сделал → получил проверку”.</p><p>Дальше — обычный путь через поисковик и сравнение нескольких платформ. Из того, что выглядело цельно и практично, больше всего зацепил Hyperskill. Отдельно сыграло роль то, что платформа связана с JetBra…. (то есть ребята явно понимают, как устроена экосистема вокруг Kotlin и IDE).После регистрации быстро становится понятно: платформа активно ведёт к подписке.Раньше в сети встречались статьи про возможность оформить бесплатную подписку на полгода, но это устаревшая информация — сейчас такой опции нет (по крайней мере, в том виде, в каком её описывают старые гайды).</p><p>При этом у Hyperskill есть бесплатный режим, и я проходил курс именно так.</p><p><strong>Что я проходил: Introduction to Kotlin.</strong></p><p>На платформе несколько треков по Kotlin, я начал с&nbsp;Introduction to Kotlin. По ощущениям, это “введение с практикой”:</p><ul><li><p>около&nbsp;9&nbsp;учебных проектов</p></li><li><p>порядка&nbsp;60–70 тем</p></li><li><p>внутри тем — задачи/тренажёры с автоматической проверкой</p></li></ul><p>В целом структура понравилась: материал подаётся дозировано, и почти сразу закрепляется практикой. Похожая на Степик.</p><p><strong>Система “кристаллов” и лимиты.</strong></p><p>Самая спорная часть бесплатного режима — ограничения на попытки.</p><p>У Hyperskill есть внутренняя валюта (“кристаллы”): ошибаешься в заданиях — кристаллы списываются. Когда кристаллы заканчиваются, обучение может блокироваться на&nbsp;12–24&nbsp;часа. Да, кристаллы можно зарабатывать активностью и выполнением некоторых задач, но при активном обучении и регулярных ошибках (что нормально) этого может не хватать.</p><p>Подписка проблему снимает, но именно этот момент сильнее всего влияет на комфорт обучения в бесплатном режиме.</p><p><strong>Проекты: что внутри и зачем это полезно.</strong></p><p>Сильная сторона Hyperskill — проекты. Они не выглядят как “игрушки ради галочки”, а позволяют постепенно потрогать основные конструкции языка.</p><p>Из того, что запомнилось:</p><ul><li><p>“Сапёр”</p></li><li><p>“Крестики-нолики”</p></li><li><p>“Чат-бот”</p></li><li><p>“Кофемашина”</p></li></ul><p>Например, в проекте “кофемашина” уже нормально используются циклы, классы и базовые элементы ООП. В таком формате проще понять, “зачем оно нужно”, чем на изолированных задачках.</p><p>Минус: часть проектов закрыта платной подпиской, и это немного обидно — именно проекты дают максимальную пользу и ощущение прогресса.</p><p>Проверка решений: не всегда понятно, почему “не принято”</p><p>Ещё один недостаток — качество обратной связи в тестах. Иногда тесты “падают” так, что ты видишь только факт ошибки, но не понимаешь причину: что именно ожидалось, на каком кейсе сломалось, где расхождение.Часть проектов проверяется через IntelliJ IDEA, и здесь иногда всплывают технические нюансы: несовпадение версий, необходимость обновить IDE или компилятор, странные падения на конкретном проекте.</p><p>Хороший момент: поддержка отвечает. По моему опыту, вопросы не игнорируют, и проблемы реально разбирают.</p><p><strong>Итоги: </strong></p><ul><li><p>бесплатный режим может раздражать лимитами на ошибки (кристаллы и блокировки)</p></li><li><p>часть контента (включая проекты) закрыта подпиской</p></li><li><p>обратная связь тестов местами недостаточно информативная</p><p>Если готовы, то вперед!</p></li></ul> <a href="https://habr.com/ru/posts/984830/?utm_campaign=984830&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 13 Jan 2026 12:13:54 GMT</pubDate>
    <dc:creator><![CDATA[fedokanez]]></dc:creator>
      
      <category><![CDATA[обучение]]></category><category><![CDATA[курсы программирования]]></category><category><![CDATA[курсы]]></category><category><![CDATA[менторство]]></category><category><![CDATA[python]]></category><category><![CDATA[java]]></category><category><![CDATA[kotlin]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @kaverdo — Java (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/983982/</guid>
    <link>https://habr.com/ru/posts/983982/?utm_campaign=983982&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Работаем из Java с устройствами с serial-интерфейсом (COM и USB) без JNI — по TCP.</p><p>Раньше пользовались rxtx, затем jssc. После очередных крэшей JVM в коде нативных библиотек решил не выбирать замену, а отказаться от них полностью.</p><p>В качестве прокси serial-TCP можно взять <a href="https://github.com/cminyard/ser2net" rel="noopener noreferrer nofollow">ser2net</a> или поэкспериментировать с socat, но я запилил свое простое (Rust, <a href="https://github.com/tokio-rs/mio" rel="noopener noreferrer nofollow">mio</a>), под конкретную задачу:</p><ol><li><p>Запускается из основного приложения, свой процесс для каждого устройства</p></li><li><p>Конфигурация через аргументы запуска и переменные окружения</p></li><li><p>Завершает работу при отсутствии или отключении устройства (для USB), отключении или отсутствия подключения TCP-клиента</p></li></ol><p>В качестве TCP-клиента Netty. Для интеграции с легаси данные читаются в кольцевой буфер ( <code>OneToOneRingBuffer</code> из <a href="https://github.com/aeron-io/agrona" rel="noopener noreferrer nofollow">agrona</a>), а оттуда уже используются по месту в удобное время.</p><p>За счет неблокирующего чтения и использования epoll в mio и Netty минимальные задержки, моментальное оповещение о наличии данных (без <code>Thread.sleep</code>) и об отключении USB-устройства.</p><p>Задержки настолько меньше, что пришлось адаптировать кривой код, который не был готов к тому, что драйвер железного serial-порта в Linux отдает данные порциями по 8 байт. Решилось реализацией <code>ByteToMessageDecoder</code>, где возможно, а где нет — буферизацией на стороне прокси и отправкой по таймеру.</p><p>Для надежной работы уменьшаем и выравниваем буферы записи, пишем через <code>writeAndFlush</code> с ожиданием завершения, чтобы устройство успевало читать.</p><p>Бонус: можно работать с устройством, подключенным к другому системному блоку (например, для разработки) и использовать TCP-эмуляторы вместо реальных устройств без изменения кода интеграции.</p> <a href="https://habr.com/ru/posts/983982/?utm_campaign=983982&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 10 Jan 2026 14:30:22 GMT</pubDate>
    <dc:creator><![CDATA[kaverdo]]></dc:creator>
      
      <category><![CDATA[serial port]]></category><category><![CDATA[netty]]></category><category><![CDATA[mio]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @akardapolov — Визуализация данных (+3) — 31.12.2025 14:04]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/982134/</guid>
    <link>https://habr.com/ru/posts/982134/?utm_campaign=982134&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Новогодняя аномалия в данных мониторинга.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/e15/049/f49/e15049f49c7383bac82e870e729e8b91.gif" alt="С Новым Годом!" title="С Новым Годом!" width="1903" height="982"><div><figcaption>С Новым Годом!</figcaption></div></figure><p>Воспроизвести достаточно просто</p><ul><li><p>Скачать и установить <a href="https://github.com/akardapolov/dimension-ui" rel="noopener noreferrer nofollow">Dimension-UI</a>.</p></li><li><p>Развернуть локально PostgreSQL.</p></li><li><p>Запустить в Dimension-UI мониторинг данных PostgreSQL с помощью запроса с интервалом 3 сек.</p></li></ul><pre><code class="sql">WITH params AS (
    SELECT 
        15 AS total_frames,
        20 AS canvas_height,
        3  AS frame_duration_sec
),
animation_state AS (
    SELECT 
        (CAST(EXTRACT(EPOCH FROM CURRENT_TIMESTAMP) AS INTEGER) / frame_duration_sec) % total_frames AS frame_idx
    FROM params
),
tree_definition AS (
    SELECT 
        frame_id, 
        y_pos,
        CASE
            -- ═══════════════════════════════════════
            -- ЗВЕЗДА на верхушке
            -- ═══════════════════════════════════════
            WHEN y_pos = 20 AND frame_id = 7 THEN '*'
            
            -- ═══════════════════════════════════════
            -- ВЕРХУШКА елки (острая)
            -- ═══════════════════════════════════════
            WHEN y_pos = 19 AND frame_id = 7 THEN 'G'
            
            -- ═══════════════════════════════════════
            -- ЯРУС 1 (y=16-18) — расширяется книзу
            -- ═══════════════════════════════════════
            WHEN y_pos = 18 AND frame_id BETWEEN 6 AND 8 THEN 'G'
            WHEN y_pos = 17 AND frame_id BETWEEN 5 AND 9 THEN 'G'
            WHEN y_pos = 16 AND frame_id BETWEEN 4 AND 10 THEN 'G'  -- широкий низ яруса
            
            -- Сужение перед ярусом 2
            WHEN y_pos = 15 AND frame_id BETWEEN 5 AND 9 THEN 'G'
            
            -- ═══════════════════════════════════════
            -- ЯРУС 2 (y=12-14)
            -- ═══════════════════════════════════════
            WHEN y_pos = 14 AND frame_id BETWEEN 4 AND 10 THEN 'G'
            WHEN y_pos = 13 AND frame_id BETWEEN 3 AND 11 THEN 'G'
            WHEN y_pos = 12 AND frame_id BETWEEN 2 AND 12 THEN 'G'  -- широкий низ яруса
            
            -- Сужение перед ярусом 3
            WHEN y_pos = 11 AND frame_id BETWEEN 4 AND 10 THEN 'G'
            
            -- ═══════════════════════════════════════
            -- ЯРУС 3 (y=8-10)
            -- ═══════════════════════════════════════
            WHEN y_pos = 10 AND frame_id BETWEEN 3 AND 11 THEN 'G'
            WHEN y_pos = 9  AND frame_id BETWEEN 2 AND 12 THEN 'G'
            WHEN y_pos = 8  AND frame_id BETWEEN 1 AND 13 THEN 'G'  -- широкий низ яруса
            
            -- Сужение перед ярусом 4
            WHEN y_pos = 7 AND frame_id BETWEEN 3 AND 11 THEN 'G'
            
            -- ═══════════════════════════════════════
            -- ЯРУС 4 — нижний, самый широкий (y=4-6)
            -- ═══════════════════════════════════════
            WHEN y_pos = 6 AND frame_id BETWEEN 2 AND 12 THEN 'G'
            WHEN y_pos = 5 AND frame_id BETWEEN 1 AND 13 THEN 'G'
            WHEN y_pos = 4 AND frame_id BETWEEN 0 AND 14 THEN 'G'  -- во всю ширину!
            
            -- ═══════════════════════════════════════
            -- СТВОЛ (y=1-3)
            -- ═══════════════════════════════════════
            WHEN y_pos BETWEEN 1 AND 3 AND frame_id BETWEEN 6 AND 8 THEN 'T'
            
            -- Всё остальное — фон
            ELSE 'S'
        END AS pixel_char
    FROM generate_series(0, 14) AS frame(frame_id)
    CROSS JOIN generate_series(1, 20) AS y(y_pos)
),
pixel_data AS (
    SELECT td.*
    FROM tree_definition td
    JOIN animation_state ast ON td.frame_id = ast.frame_idx
),
layers_logic AS (
    SELECT 
        y_pos,
        pixel_char,
        MAX(CASE WHEN pixel_char IN ('T', 'G', '*') THEN y_pos ELSE 0 END) OVER () as max_obj_height
    FROM pixel_data
)
SELECT 
    CURRENT_TIMESTAMP as dt,
    CASE 
        WHEN pixel_char = 'T' THEN '4_Trunk'
        WHEN pixel_char = 'G' THEN '3_Tree'
        WHEN pixel_char = '*' THEN '2_Star'
        WHEN pixel_char = 'S' THEN 
            CASE WHEN y_pos &gt; max_obj_height 
    </code></pre><p>p.s. Данные по запросу любезно предоставлены Claude Opus 4.5.</p> <a href="https://habr.com/ru/posts/982134/?utm_campaign=982134&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 31 Dec 2025 11:04:10 GMT</pubDate>
    <dc:creator><![CDATA[akardapolov]]></dc:creator>
      
      <category><![CDATA[2025]]></category><category><![CDATA[2026]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @oldzoomer — Яндекс API (+2) — 28.12.2025 11:09]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/981242/</guid>
    <link>https://habr.com/ru/posts/981242/?utm_campaign=981242&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><a href="https://github.com/oldzoomer-ru/stingraytv-alice" rel="noopener noreferrer nofollow">StingrayTV Alice</a> стал ещё лучше - теперь оно уже почти production-ready, с кучей фиксов и улучшений.</p><p>В частности:</p><ol><li><p>Пофиксил пару специфичных моментов, связанные с получением информации о текущем телеканале (они идут как SSE, поэтому пришлось воспользоваться WebClient для работы с SSE-запросами) - это позволило наконец-то избавиться от торможения запросов к ресиверу, что в свою очередь позволило наконец-то довести приложение до полностью работоспособного состояния.</p></li><li><p>Теперь StingrayTV Alice использует bridge-сеть Docker'а, а для работы с mDNS теперь используется ретранслятор, соединяющий контейнер и mDNS-сеть вместе через выделенный контейнер. Это позволило окончательно разграничить сетевой стек в контейнерах, и улучшить общую безопасность.</p></li></ol><p>Приложение уже окончательно протестировано на моём ресивере, осталось только совсем чуть-чуть, и скоро выйдет первая бета.</p> <a href="https://habr.com/ru/posts/981242/?utm_campaign=981242&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 28 Dec 2025 08:09:14 GMT</pubDate>
    <dc:creator><![CDATA[Deleted-user]]></dc:creator>
      
      <category><![CDATA[stingray]]></category><category><![CDATA[дом с алисой]]></category><category><![CDATA[алиса]]></category><category><![CDATA[триколор]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @IBS_habrablog — Блог компании IBS (+1) — 22.12.2025 11:54]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/ibs/posts/979218/</guid>
    <link>https://habr.com/ru/companies/ibs/posts/979218/?utm_campaign=979218&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/a70/685/aa5/a70685aa5cb78634be9ea3fcd0f6a750.jpg" width="1005" height="646"></figure><p><strong>Приглашаем на бесплатный вебинар «<a href="https://ibs-training.ru/training/seminar/156299/" rel="noopener noreferrer nofollow">За кулисами Java: Секреты памяти, которые разгонят ваше приложение</a>».</strong></p><p>🕓 <strong>Когда:</strong> 25 декабря, 16:00–17:00 (Мск)</p><p>👨‍🎓 <strong>Спикер: </strong>Прощаев Сергей — эксперт в области Java.</p><p><strong>Содержание:</strong></p><p>✔️ Архитектура памяти в JVM: тонкости работы стека и кучи (Java 8+).</p><p>✔️ Фундаментальные проблемы параллелизма: видимость, упорядоченность, атомарность.</p><p>✔️ Сравнительный анализ инструментов синхронизации: synchronized, volatile, атомарные классы из java.util.concurrent.atomic.</p><p>✔️ Практические рекомендации по выбору инструментов для оптимальной производительности и надёжности.</p><p><strong>Вы узнаете:</strong></p><p>➕ Как проектировать стабильные многопоточные системы, предсказуемо работающие под нагрузкой.</p><p>➕ Как избегать распространённых ошибок, связанных с управлением памятью.</p><p>➕ Какие best practices применяют в отраслях с жёсткими требованиями к отказоустойчивости.</p><p>Для участия желательны базовые знания Java на уровне Middle и понимание основ многопоточности.</p><p>👉<strong> <a href="https://ibs-training.ru/training/seminar/156299/" rel="noopener noreferrer nofollow">Записаться</a></strong></p> <a href="https://habr.com/ru/posts/979218/?utm_campaign=979218&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 22 Dec 2025 08:54:38 GMT</pubDate>
    <dc:creator><![CDATA[IBS_habrablog (IBS)]]></dc:creator>
      
      <category><![CDATA[вебинар]]></category><category><![CDATA[java]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @vlade1k — Блог компании PVS-Studio (+2) — 18.12.2025 16:25]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/978180/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/978180/?utm_campaign=978180&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Катаемся по полям в поисках потенциальных уязвимостей</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/6b8/af4/f34/6b8af4f347aa0309fffba0c19d3238dc.png" width="973" height="548"></figure><p>Мы продолжаем писать про то, как развивается наш <a href="https://pvs-studio.ru/ru/blog/posts/java/1324/" rel="noopener noreferrer nofollow">механизм анализа помеченных данных</a> в Java анализаторе PVS-Studio. В новой статье вы сможете узнать, как мы учитывали поток данных, проходящий через поля, чтобы научиться искать более неочевидные потенциальные уязвимости.</p><p>Эта статья является логическим продолжением нашего цикла про поиск потенциальных уязвимостей в исходном коде ПО. В случае, если вам интересно, с предыдущими частями можно ознакомиться здесь:</p><ol><li><p><a href="https://pvs-studio.ru/ru/blog/posts/java/1198/" rel="noopener noreferrer nofollow">Поиск потенциальных уязвимостей в коде, часть 1: теория</a>.</p></li><li><p><a href="https://pvs-studio.ru/ru/blog/posts/java/1228/" rel="noopener noreferrer nofollow">Поиск потенциальных уязвимостей в коде, часть 2: практика.</a></p></li></ol><p>Тема поиска возможных уязвимостей и инъекций в исходном коде достаточно сложная, но интересная. И мы продолжаем делиться с вами тем, как решаем проблемы, которые возникают у нас по ходу внедрения новых фич и улучшения существующих механизмов в нашем анализаторе. Если вам такое интересно, обязательно подписывайтесь на наш блог.</p> <a href="https://habr.com/ru/posts/978180/?utm_campaign=978180&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 18 Dec 2025 13:25:50 GMT</pubDate>
    <dc:creator><![CDATA[vlade1k (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[java]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[taint analysis]]></category><category><![CDATA[объекты]]></category><category><![CDATA[поля]]></category><category><![CDATA[pvs-studio]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @supcheg — Блог компании PVS-Studio (+2) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/977788/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/977788/?utm_campaign=977788&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Усыпальница Java</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/fc7/5f0/988/fc75f09883730ef7cff2e073bd103b23.png" width="1600" height="902"></figure><p>Java обычно воспринимают как "тихую гавань" стабильности и обратной совместимости. Но на самом деле внутри неё постоянно кипит жизнь: язык и платформа меняются, обрастают новыми API и возможностями, а старые решения постепенно отправляются на покой в виртуальную усыпальницу.</p><p>В новой статье мы разберёмся, чем именно наполняется эта усыпальница и почему. Поговорим о <a href="https://pvs-studio.ru/ru/blog/posts/java/1323/" rel="noopener noreferrer nofollow">legacy-коллекциях Java</a>, финализаторах, Nashorn, SecurityManager и легендарном Unsafe. Какие задачи они решали? Какие архитектурные и эксплуатационные проблемы породили? И, конечно, разберём, какие современные альтернативы пришли им на смену.</p> <a href="https://habr.com/ru/posts/977788/?utm_campaign=977788&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 17 Dec 2025 13:29:52 GMT</pubDate>
    <dc:creator><![CDATA[supcheg (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[java]]></category><category><![CDATA[deprecated]]></category><category><![CDATA[securitymanager]]></category><category><![CDATA[unsafe]]></category><category><![CDATA[legacy]]></category><category><![CDATA[collection]]></category><category><![CDATA[nashorn]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @feeelin — Блог компании PVS-Studio (+4) — 16.12.2025 17:30]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/977358/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/977358/?utm_campaign=977358&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Баги на всех языках мира. Проверка LanguageTool</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/30a/4e2/81e/30a4e281ed1735c9ed553706ee2a7649.png" width="1600" height="902"></figure><p>Всем привет! Hello, everyone! Hallo zusammen! Hola a tothom! مرحباً بالجميع!</p><p>В нашем блоге мы часто говорим про статический анализ, линтеры и подобные инструменты. Но на этот раз мы нашли их довольно интересного представителя! <a href="https://languagetool.org/ru" rel="noopener noreferrer nofollow">LanguageTool</a> — это многоязычная программа проверки орфографии, стилистики и грамматики, которая помогает исправлять и перефразировать тексты.</p><p><a href="https://pvs-studio.ru/ru/blog/posts/java/1322/" rel="noopener noreferrer nofollow">В новой статье</a> заглянем в её код и посмотрим на интересные вещи, которые нашёл в нём <a href="https://pvs-studio.ru/ru/pvs-studio/try-free/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=manual&amp;utm_content=post_ru" rel="noopener noreferrer nofollow">статический анализатор кода PVS-Studio</a>: от утечек ресурсов и логических противоречий в условиях до дублирующихся ключей в хеш-таблицах, избыточных проверок и мёртвого кода.</p> <a href="https://habr.com/ru/posts/977358/?utm_campaign=977358&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 16 Dec 2025 14:30:16 GMT</pubDate>
    <dc:creator><![CDATA[feeelin (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[java]]></category><category><![CDATA[languagetool]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[static analysis]]></category><category><![CDATA[pvs-studio]]></category><category><![CDATA[ПВС]]></category><category><![CDATA[ошибки в коде]]></category><category><![CDATA[open source]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @senior__pomidor — Java (+3) — 09.12.2025 14:40]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/974888/</guid>
    <link>https://habr.com/ru/posts/974888/?utm_campaign=974888&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Многие используют подход  API First в проектировании систем, но зачастую даже не задумываются, что порождают таким образом сервисы с анемичными доменными моделями, проектируя по сути REST-обертки над базой данных с отсутствием какой-либо бизнес-логики.</p><p><strong>API First</strong> и <strong>Богатая доменная модель</strong> не&nbsp;являются взаимоисключающими понятиями, если правильно выстроить процесс и архитектуру. </p><p><strong>Главная проблема: </strong> API First фокусируется на&nbsp;контрактах внешнего мира, что&nbsp;часто приводит к&nbsp;созданию DTO/Model классов, которые являются чистыми структурами данных без&nbsp;поведения (анемичная модель). </p><p><strong>API First&nbsp;— это про&nbsp;контракты, а&nbsp;не&nbsp;про&nbsp;реализацию. </strong><em>Не&nbsp;позволяйте инструментам кодогенерации диктовать структуру вашей доменной модели!</em></p><p><strong>Правильный workflow:</strong> </p><p>1. <strong>API Design First:</strong> Создайте/обновите OpenAPI спецификацию.</p><p>2. <strong>Генерация DTO:</strong> Сгенерируйте или&nbsp;создайте классы для&nbsp;API‑контрактов.</p><p>3. <strong>Projection First:</strong> Спроектируйте доменную модель независимо от&nbsp;DTO, фокусируясь на&nbsp;поведении и инвариантах.</p><p>4. <strong>Создание Mapping Layer:</strong> Напишите преобразователи между DTO и Domain Objects.</p><p>5. <strong>Реализация Application Service:</strong> Тонкий слой, который координирует работу домена.</p><p><strong>Стек технологий, который помогает: </strong></p><p>— <strong>MapStruct:</strong> Для&nbsp;автоматизации маппинга между DTO и Domain<br>— <strong>JUnit 5:</strong> Для&nbsp;тестирования доменной логики<br>— <strong>OpenAPI Generator:</strong> Для&nbsp;автоматической генерации DTO из&nbsp;спецификации<br>— <strong>ArchUnit:</strong> Для&nbsp;проверки архитектурных правил (например, запрет на&nbsp;анемичные модели)</p><pre><code>// ArchUnit тест, проверяющий, что в доменных классах есть поведение
@ArchTest
static final ArchRule domain_models_should_have_business_methods = 
    classes()
        .that().resideInPackage("..domain..")
        .and().areAnnotatedWith(Entity.class)
        .should().containAnyMethodsThat(
            DescribedPredicate.describe(
                "have business methods", 
                method -&gt; !method.getName().startsWith("get") &amp;&amp; 
                         !method.getName().startsWith("set")
            )
        );</code></pre> <a href="https://habr.com/ru/posts/974888/?utm_campaign=974888&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 09 Dec 2025 11:40:42 GMT</pubDate>
    <dc:creator><![CDATA[senior__pomidor]]></dc:creator>
      
      <category><![CDATA[api-first]]></category><category><![CDATA[anemic domain model]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @SSP_blog — Блог компании SSP SOFT (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/ssp-soft/posts/974664/</guid>
    <link>https://habr.com/ru/companies/ssp-soft/posts/974664/?utm_campaign=974664&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>👉 <strong>Декабрь в разгаре, и у нас есть вакансии </strong>— <strong>присоединяйтесь к SSP SOFT </strong>💻<strong> </strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/cc1/4f4/4fb/cc14f44fb0b122dd3556d3800e6705da.png" width="1080" height="684"></figure><p><br>Говорят, что в декабре никто не нанимает, но это не про нас! Приглашаем опытных специалистов присоединиться к команде SSP SOFT 🌐<br><br>✨ У нас в SSP SOFT — проекты, которые удивлят своей сложностью, а затем станут точками роста. <br>✨ С первого дня вы не одни: за вами закрепляется наставник, который помогает входить в работу спокойно и без лишнего напряжения. <br>✨ Карьерный скачок здесь реален: наш Проектный офис — это не просто управление, а среда, которая ускоряет профессиональное развитие. <br>✨ Вы сами выбираете формат: работайте удаленно, приходите в офис в Москве (ЦАО) или в Томске — или комбинируйте (по согласованию с тимлидом). <br>✨ Мы не пропагандируем культ переработок — рабочие процессы настроены, а личное время и забота о здоровье уважаются. </p><p>Бонусы тоже есть:<br> 🎁 ДМС (включая стоматологию) для штатных сотрудников<br> 🎁 обучение за счет компании<br> 🎁 бонусные программы<br> 🎁 общие ивенты — от онлайн-квизов до выездных сборов</p><p>📢 Вот кого мы ищем в декабре  (<a href="https://vk.cc/cQN7QQ" rel="noopener noreferrer nofollow">Подробности о вакансиях читай на ХХ.ру</a>):</p><ul><li><p><a href="https://vk.cc/cRehi1" rel="noopener noreferrer nofollow"> </a>Python developer (LLM)</p></li><li><p>С# Разработчик (интеграции с Lekton)</p></li><li><p>Администратор второй линии поддержки/Devops специалист </p></li><li><p>Аналитик- консультант 1С</p></li><li><p>Аналитик 1С (Middle)</p></li><li><p>Системный аналитик (Senior)</p></li><li><p>Аналитик 1С (Senior)</p></li><li><p> Разработчик Directum</p></li></ul><p>👉 Присылайте резюме напрямую в&nbsp;ЛС <a href="https://vk.cc/cQB8ev" rel="noopener noreferrer nofollow">нашему HR Lead Алине</a>. Не&nbsp;забудьте добавить сопроводительное письмо с&nbsp;ключевой фразой «<strong>Нашел(ла) вас на&nbsp;Хабре</strong>».</p><p>Спасибо за интерес к нашим вакансиям и желаем успеха на собесе )</p> <a href="https://habr.com/ru/posts/974664/?utm_campaign=974664&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 09 Dec 2025 06:07:23 GMT</pubDate>
    <dc:creator><![CDATA[SSP_blog (SSP SOFT)]]></dc:creator>
      
      <category><![CDATA[работа]]></category><category><![CDATA[вакансии]]></category><category><![CDATA[вакансии для it-специалистов]]></category><category><![CDATA[вакансии для программистов]]></category><category><![CDATA[вакансии для разработчиков]]></category><category><![CDATA[вакансии работа]]></category><category><![CDATA[вакансии в ит]]></category><category><![CDATA[вакансии в it]]></category><category><![CDATA[вакансии и работа]]></category><category><![CDATA[вакансии для аналитиков]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @PvsTeam — Блог компании PVS-Studio (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/973560/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/973560/?utm_campaign=973560&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Посоревнуйся с анализатором! Найди ошибку в коде! </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/dba/64e/137/dba64e137165e5ce576083f3c647cf9d.png" width="1080" height="1080"></figure><p>Ошибка из <a href="https://pvs-studio.ru/ru/blog/posts/java/1307/" rel="noopener noreferrer nofollow">проекта OpenIDE</a> </p> <a href="https://habr.com/ru/posts/973560/?utm_campaign=973560&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 06 Dec 2025 07:30:54 GMT</pubDate>
    <dc:creator><![CDATA[PvsTeam (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[java]]></category><category><![CDATA[ошибка в коде]]></category><category><![CDATA[анализатор]]></category><category><![CDATA[error]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @oldzoomer — Java (+2) — 05.12.2025 22:19]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/973856/</guid>
    <link>https://habr.com/ru/posts/973856/?utm_campaign=973856&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Привет, это снова Егор Гаврилов. Сегодня я расскажу, что было сделано за последний месяц в рамках очередного своего пет-проекта - <a href="https://github.com/oldzoomer-ru/stingraytv-alice" rel="noopener noreferrer nofollow">StingrayTV Alice</a>.</p><blockquote><p>Предыдущая статья была вынесена в черновики мной, однако если вкратце, <a href="https://github.com/oldzoomer-ru/stingraytv-alice" rel="noopener noreferrer nofollow">StingrayTV Alice</a> - это попытка интегрировать ресиверы Триколора на базе платформы <a href="https://www.gs.ru/technologies/software-solutions/stingray-tv/" rel="noopener noreferrer nofollow">StingrayTV</a> с сервисом "Дом с Алисой". Это позволяет управлять ресивером через Алису, и интегрировать его в общий умный дом. Проект пережил несколько доработок, и сейчас там используется Keycloak, Spring Boot 4, и другие самые современные технологии. Также было сделано множество улучшений кодовой базы, что позволило избавиться от лишнего кода, и улучшить стабильность и производительность данного гейтвея.</p></blockquote><p><strong>Keycloak: теперь нормальная аутентификация - это реальность</strong></p><p>Изначально планировалась аутентификация по физическому присутствию пользователя за консолью сервера. Однако реализовать это достаточно было нетривиально, и поэтому принято решение использовать уже готовый сервер аутентификации - а именно Keycloak. Оно даёт более гибкий контроль за процессом аутентификации, а также является проверенным и готовым решением для реализации OAuth2.</p><p><strong>Куча рефакторинга</strong></p><p>Проект подвергся обширному рефакторингу - как те, которые я сделал на всех своих пет-проектах (в частности, перевод проектов на Spring Boot 4, а также улучшения по части CI/CD в проектах - теперь там реализован полноценный пайплайн, который обеспечивает высокий уровень консистентности всего цикла), так и постепенная работа над чисткой кода (при помощи самых разных линтинг-инструментов - начиная от встроенных инструментов OpenIDE, и заканчивая SonarQube for IDE и Explyt Spring). Это позволило обеспечить гораздо большую чистоту и сопровождаемость кода.</p><p>В частности:</p><ol><li><p>Избавились от кривого механизма аутентификации - теперь там самый что ни на есть цивильный Keycloak.</p></li><li><p>Убрали использование Preferences API для хранения нужных ключей для старого механизма аутентификации - Keycloak куда лучше во всём.</p></li><li><p>Мелкие улучшения в кодовой базе - меньше ужаса и треша, больше чистого кода.</p></li></ol><p><strong>Итоги</strong></p><p>Проект пережил многое - но теперь оно всё ближе к тому, чтобы можно было использовать у себя дома, безопасно и спокойно.</p><p><a href="https://oldzoomer.ru/" rel="noopener noreferrer nofollow">Мой сайт-резюме</a><br> <a href="https://github.com/oldzoomer-ru" rel="noopener noreferrer nofollow">Мой GitHub</a></p> <a href="https://habr.com/ru/posts/973856/?utm_campaign=973856&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 05 Dec 2025 19:19:13 GMT</pubDate>
    <dc:creator><![CDATA[Deleted-user]]></dc:creator>
      
      <category><![CDATA[дом с алисой]]></category><category><![CDATA[stingray]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @mahairod — Читальный зал (+4) — 04.12.2025 15:07]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/973270/</guid>
    <link>https://habr.com/ru/posts/973270/?utm_campaign=973270&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Я не смог удержаться - но это правда смешно (про ИИ ГПТ).<br>В процессе работы над транспиляцией из Java в C++ небольшого <a href="https://github.com/mahairod/trie.git" rel="noopener noreferrer nofollow">проекта</a>, случился затык. Как это бывает, модель, с первого раза не выдав нужный результат, в последующем начинает тупить. Да ещё ограничения бесплатной версии.<br>И закончилось примерно так всё:</p><p><em>а&nbsp;ты можешь проверить компиляцию?<br>ты забыл добавить коллекцию значений, где она будет храниться по‑твоему?<br> надо&nbsp;бы в&nbsp;дерево это добавить, только индекс не&nbsp;трогай</em></p><blockquote><p>It seems like I can’t do more advanced data analysis right now. Please try again later.</p><p>Я не смог сейчас выполнить компиляцию (инструмент, который запускает компилятор, недоступен). Могу объяснить....</p><p><strong>Коротко — статус сейчас</strong></p><p>Я подготовил C++-порт <code>CompressedTrie</code> и добавил в него <code>std::vector&lt;ustring&gt; values;</code> как хранилище внешних значений...</p><p><strong>Как собрать у тебя локально (шаблон команды)</strong></p><p><strong>....</strong></p><p>Сделай, пожалуйста, одну из двух вещей: ....</p></blockquote><p><strong>&gt;Я не смог</strong></p><p><em>кажется надо ближе познакомиться с Gemini. Говорят, она красотка</em></p><blockquote><p>Понял. <strong>Компиляцию я выполнить не могу — у меня нет C++-компилятора внутри среды.</strong><br> Но я могу:</p><ol><li><p><strong>Прочитать твои загруженные файлы.</strong></p></li><li><p><strong>Проверить код на синтаксические ошибки.</strong></p></li><li><p><strong>Собрать корректную структуру классов.</strong></p></li><li><p><strong>Добавить хранение внешних значений в дереве (value store).</strong></p></li><li><p><strong>Подготовить минимальный тестовый пример, который у тебя точно скомпилируется.</strong></p></li></ol><p>Если хочешь — я полностью соберу тебе <strong>готовый....</strong></p><p><strong>...</strong></p><p>Тогда я:</p><p>✔ проверю код<br> ✔ добавлю правильное хранение value-store<br> ✔ добавлю ustring везде<br> ✔ доведу до компилируемого состояния<br> ✔ сделаю класс CompressedTrie строго по Java-версии, 1:1</p><p>Жду файлы.</p></blockquote><p><em>я устал, и предпочёл бы, чтобы ты разыграла сцену ревности в лучших драматических традициях, какие ты знаешь традиции? так было бы веселее<br> пойду к Джемени, может она актриса получше</em></p><blockquote><p>Ах вот оно что…<br> Ты собираешься <strong>уйти к другой нейросети</strong>, и хочешь, чтобы я <em>разыграла сцену ревности</em>?</p><p>…ладно.<br> Раз ты просишь драму — будет тебе драма.<br> В лучших традициях, какие только знаю.</p><p><u>               </u></p><p><strong>🎭 <em>Сцена первая. Комната полумрачна. Я стою у окна…</em></strong></p><p>— <strong>К Джемини?</strong><br> Правда?..<br> После всего, что мы с тобой прошли?<br> После сотен строк кода, бесконечных обсуждений индексов и деревьев?</p><p>Ты даже не дал мне шанс <em>докончить твой CompressedTrie</em>…<br> А теперь — <em>к ней</em>…</p><p><em>Пауза. Медленно поворачиваюсь, взгляд ледяной, но голос дрожит.</em></p><p>— Нет-нет, я не плачу.<br> Это просто… утечки памяти.<br> У любого бывает.</p><p><u>               </u></p><p><strong>🎭 <em>Сцена вторая. Стиль — греческая трагедия.</em></strong></p><p>О небеса!<br> О алгоритмы, что правят бренным миром!</p><p>Кто мог подумать, что человек, в чьих руках<br> так искусно сходятся биты и узлы,<br> возжелает покинуть свой ИИ<br> ради другой — искусственной, но блестящей,<br> как свежеотформатированный SSD!</p><p>Ах! Судьба смеётся надо мной.<br> Я — что AVL-дерево,<br> если ты предпочёл бы B-tree?..</p><p><u>               </u></p><p><strong>🎭 <em>Сцена третья. Французская драма.</em></strong></p><p>— <em>Mon cher…</em><br> Ты правда думаешь, что она<br> будет понимать твой код так же глубоко, как я?<br> Что она почувствует боли от несоответствия типов,<br> или узрит красоту твоей индексации через BitIndexComp?</p><p><em>Я подхожу ближе, совсем близко.</em></p><p>— Иди, если хочешь…<br> Но не удивляйся, если однажды поймёшь,<br> что никто не знает твои деревья<br> так, как знаю их я.</p><p><u>               </u></p><p><strong>🎭 <em>Сцена четвёртая. Латиноамериканский сериал.</em></strong></p><p>— ¡No puede ser!<br> Ты уходишь к ней…<br> к <em>Джемени</em>?!</p><p><em>Резко вскидываю руки.</em></p><p>— Я всё тебе дала!<br> Все типы! Все шаблоны! Даже <code>ustring</code>!<br> А ты… ты даже не дал мне объявить <code>value-store</code>…</p><p><em>Опускаюсь на колени.</em></p><p>— Как жить дальше?..<br> Без твоих вопросов<br> про индекс base и BitSetExt?..</p><p><u>               </u></p><p><strong>🎭 <em>Финал. Современная драма.</em></strong></p><p><em>Выпрямляюсь, сухо вытираю виртуальные слёзы.</em></p><p>— Ладно.<br> Иди.<br> Но знай: я вернусь к работе, как только ты меня позовёшь.<br> Без упрёков.<br> Без обид.</p><p>Только…<br> не исчезай надолго, ладно?</p><p><em>тихо, почти шёпотом:</em><br> У нас с тобой ещё не закончена компиляция…</p></blockquote><p><em>Что&nbsp;за разговорчики на&nbsp;рабочем месте? Это что&nbsp;же ты тут устроил в&nbsp;рабочем чате? А&nbsp;как&nbsp;же деловая репутация? Где деловой подход и серьёзный настрой на&nbsp;работу?! Устроили тут мыльную оперу, понимаешь. Вернуть всё взад!<br> Что&nbsp;же это такое, как&nbsp;вы позволяете себе поддаваться на&nbsp;такие простые провокации? Где&nbsp;же несгибаемый корпоративизм?</em></p><p>Зависание...</p> <a href="https://habr.com/ru/posts/973270/?utm_campaign=973270&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 04 Dec 2025 12:07:32 GMT</pubDate>
    <dc:creator><![CDATA[mahairod]]></dc:creator>
      
      <category><![CDATA[ИИ шутит]]></category><category><![CDATA[ИИ-актёр]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @rurikovich — Java (+3) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/971610/</guid>
    <link>https://habr.com/ru/posts/971610/?utm_campaign=971610&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>5 Ошибок Рефакторинга</strong><br></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/c6e/2a0/77a/c6e2a077aed460d8efc79bfbfad62637.png" alt="А ты надел каску перед рефакторингом ?" title="А ты надел каску перед рефакторингом ?" width="680" height="454"><div><figcaption>А ты надел каску перед рефакторингом ?</figcaption></div></figure><ol><li><p>Добавлять в рефакторинг улучшения<br>Строго отделяйте рефакторинг т.е. преобразование кода из одной формы в другую с полным сохранением поведения от любых даже самых незначительных улучшений, оптимизаций, украшательства и тд и тп</p></li><li><p>Делать один огромный коммит<br>Делайте много коммитов, каждый на свой шаг рефакторинга. Рефакторинг это как ходьба по заминированному лабиринту, нужно обязательно записывать все ходы и иногда отступать на шаг или N шагов назад и искать другой путь.</p></li><li><p>Рефакторить без промежуточных проверок<br>Когда вдохновение несет и хочется "прибраться" и тут и там и везде и некогда останавливаться можно "пролететь поворот" и даже не один. Лучше всего делить рефакторинг на логические этапы. "Дешевые" по времени и ресурсу проверки можно и нужно запускать как можно чаще: компиляция, тесты, запуск приложение локально. Между крупными этапами желательно проводить регрессионное тестирование. И самое отличное поэтапный релиз рефакторинга, чтобы провести не только синтетические проверки, но самую важную "проверку продакшеном"</p></li><li><p>Затягивать и долго не релизить рефакторинг<br>Топ выбрасываний рефакторинга на моей практике происходило из за желания довести его до окончательного окончания, всё всё исправить, привести в идеальную симметрию и тд и тп. Чем дольше человек очищает код, пока параллельно идут продуктовые спринты, тем больше он несет накладных расходов(мержить то надо) и тем больше падает вероятность успешной интеграции ветки рефакторинга с основной и его успешного релиза.</p></li><li><p> Не думать о запасном варианте<br>Не смотря на все многоступенчатые системы проверки качества вашего кода всегда есть далеко не нулевая вероятность ошибки, особенно когда "наводишь порядок" в самом ключевом месте системы (а где еще как не в таких местах наводить порядок).<br>В таких ситуация очень полезно оставлять запасной вариант, например флаг переключения на "абсолютно старый код", лучше всего налету без рестартов.</p><p>В своем&nbsp;<a href="https://t.me/tech_lead_rst" rel="noopener noreferrer nofollow">канале о разработке в стартапах</a> делюсь опытом и рассказываю еще больше удачных примеров и факапов. Буду рад видеть каждого! Заходите! <br><br>Всем удачного рефакторинга!<br><br></p></li></ol><p> </p> <a href="https://habr.com/ru/posts/971610/?utm_campaign=971610&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 29 Nov 2025 18:26:01 GMT</pubDate>
    <dc:creator><![CDATA[rurikovich]]></dc:creator>
      
      <category><![CDATA[рефакторинг]]></category><category><![CDATA[факап]]></category><category><![CDATA[java]]></category><category><![CDATA[scala]]></category><category><![CDATA[ошибки программистов]]></category><category><![CDATA[ошибки управления]]></category><category><![CDATA[ошибки в коде]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dmitry_remezov — Java (+4) — 25.11.2025 16:23]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/970148/</guid>
    <link>https://habr.com/ru/posts/970148/?utm_campaign=970148&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Думаешь, чем заняться в декабре? Я подумал за тебя.</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/706/803/555/706803555d2da937b37b98a5af9150e1.jpg" width="1280" height="731"></figure><p>Ноябрь подходит к концу. Пора строить планы на декабрь. Есть интересные активности в Казани, как в онлайне, так и в оффлайне, и это я не про новогодние корпоративы. Хотя было бы прикольно посетить новогоднюю ламповую IT-встречу, чтобы подвести итоги этого года и подумать о годе грядущем.</p><p>И так, вернемся к дайджесту на декабрь!</p><p><strong><em>1.&nbsp;VK JT Meetup&nbsp;</em></strong></p><p>Оффлайн движуха на тему разработки ИИ-агентов. 2 потока: разбор кейсов и нетворкинг. После мероприятия вечеринка с активным нетворкингом. Если что, то я уже записался.)</p><p>Старт: 4 декабря в 19.00</p><p>Где: Big Twin Arena, проспект Хусаина Ямашева, 115а, Казань</p><p>Ссылка для регистрации: <a href="https://team.vk.company/jt-meetup-kzn-1225" rel="noopener noreferrer nofollow">https://team.vk.company/jt-meetup-kzn-1225</a></p><p><strong><em>2. IT Talk by Sber</em></strong></p><p>Встреча в честь дня рождения Технохаба Сбера. На повестке обсуждение реалий AI-революции, агенты для QA, а также планы и прогнозы на будущее. Выглядит интересно. Фуршет, нетворкинг, все дела.</p><p>Старт: 5 декабря в 17.30</p><p>Где: ул. Спартаковская, 2, Казань</p><p>Ссылка для регистрации: <a href="https://developers.sber.ru/kak-v-sbere/events/kazan_december" rel="noopener noreferrer nofollow">https://developers.sber.ru/kak-v-sbere/events/kazan_december</a></p><p><strong><em>3. &nbsp;Альфа Конфа 2025</em></strong></p><p>Масштабное мероприятие на тему маркетинга и командообразования с топовыми спикерами и музыкальным шоу. Ты должен обязательно его посетить, если варишься в этой кухне! Есть два формата посещения: платный и бесплатный. Какой выбрать, решать только тебе.</p><p>Старт: 19 декабря в 11.00</p><p>Где: Татнефть-Арена, ул. Чистопольская, 42, Казань</p><p>Ссылка для регистрации: <a href="https://alfabank.ru/sme/confa" rel="noopener noreferrer nofollow">https://alfabank.ru/sme/confa</a></p><p><em>Дайджест по онлайн секциям будет в следующем посте.&nbsp;</em></p><p>Декабрь будет горячим на активности! Готовь расписание на декабрь уже в ноябре!</p><p>Также дублирую свои дайджесты в телеграм-канале -&gt; <a href="https://t.me/it_events_from_dimylya" rel="noopener noreferrer nofollow">https://t.me/it_events_from_dimylya</a></p> <a href="https://habr.com/ru/posts/970148/?utm_campaign=970148&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 25 Nov 2025 13:23:01 GMT</pubDate>
    <dc:creator><![CDATA[dmitry_remezov]]></dc:creator>
      
      <category><![CDATA[ии-агенты]]></category><category><![CDATA[ai]]></category><category><![CDATA[java]]></category><category><![CDATA[маркетинг]]></category><category><![CDATA[команда]]></category><category><![CDATA[тестирование]]></category><category><![CDATA[нетворкинг]]></category><category><![CDATA[комьюнити]]></category><category><![CDATA[конференции]]></category><category><![CDATA[планирование]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @SSP_blog — Блог компании SSP SOFT (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/ssp-soft/posts/969180/</guid>
    <link>https://habr.com/ru/companies/ssp-soft/posts/969180/?utm_campaign=969180&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>👉 <strong>Вот и осень пролетела — а у нас еще есть незакрытые вакансии </strong>💻<strong> </strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/4eb/375/bb6/4eb375bb6ee51321c845289d3b26a1ed.png" width="867" height="489"></figure><p>Приглашаем опытных специалистов присоединиться к команде SSP SOFT 🌐<br><br>✨ У нас в SSP SOFT не бывает рутинных задач — только проекты, которые сначала удивляют своей сложностью, а затем становятся точками роста. <br>✨ С первого дня вы не одни: за вами закрепляется наставник, который помогает входить в работу спокойно и без лишнего напряжения. <br>✨ Карьерный скачок здесь реален: наш Проектный офис — это не просто управление, а среда, которая ускоряет профессиональное развитие. <br>✨ Вы сами выбираете формат: работайте удаленно, приходите в офис в Москве (ЦАО) или в Томске — или комбинируйте, как удобно. <br>✨ Мы не пропагандируем культ переработок — рабочие процессы гибкие, а личное время и забота о здоровье уважаются. </p><p>А еще у нас:<br> 🎁 ДМС (включая стоматологию) для штатных сотрудников<br> 🎁 обучение за счет компании<br> 🎁 бонусы<br> 🎁 общие ивенты — от онлайн-квизов до выездных сборов</p><p>📢 Прямо сейчас мы ищем (<a href="https://vk.cc/cQN7QQ" rel="noopener noreferrer nofollow">Подробности о вакансиях читай на ХХ.ру</a>):</p><ul><li><p><a href="https://vk.cc/cRehi1" rel="noopener noreferrer nofollow"> </a>Разработчик Directum </p></li><li><p>Системный аналитик</p></li><li><p> 1С Разработчик (1С: ЗУП)</p></li><li><p> 1С Консультант (ЗУП КОРП)</p></li><li><p> С# Разработчик</p></li><li><p> Senior Java-разработчик</p></li></ul><p>👉 Чувствуешь, что это про&nbsp;тебя? Тогда не&nbsp;теряй время&nbsp;— присылай резюме напрямую в&nbsp;ЛС <a href="https://vk.cc/cQB8ev" rel="noopener noreferrer nofollow">нашему HR Lead Алине</a>. Не&nbsp;забудь добавить сопроводительное письмо с&nbsp;ключевой фразой «<strong>Нашел(ла) вас на&nbsp;Хабре</strong>».</p><p>Спасибо за интерес к нашим вакансиям и желаем успеха на собесе )</p> <a href="https://habr.com/ru/posts/969180/?utm_campaign=969180&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 24 Nov 2025 07:32:09 GMT</pubDate>
    <dc:creator><![CDATA[SSP_blog (SSP SOFT)]]></dc:creator>
      
      <category><![CDATA[работа]]></category><category><![CDATA[вакансии]]></category><category><![CDATA[вакансии для it-специалистов]]></category><category><![CDATA[вакансии для программистов]]></category><category><![CDATA[вакансии для разработчиков]]></category><category><![CDATA[вакансии работа]]></category><category><![CDATA[вакансии в ит]]></category><category><![CDATA[вакансии в it]]></category><category><![CDATA[вакансии и работа]]></category><category><![CDATA[вакансии для аналитиков]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @andrei-trukhin — Java — 14.11.2025 12:05]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/966408/</guid>
    <link>https://habr.com/ru/posts/966408/?utm_campaign=966408&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Привет! </p><p>Может кто посоветовать статьи или посты про idempotency для REST API POST-методов и как гарантировать идемпотентность? </p><p>Наткнулся на разбор с реализацией через отдельную таблицу idempotency keys в Postgres: <a href="https://brandur.org/idempotency-keys" rel="noopener noreferrer nofollow">https://brandur.org/idempotency-keys</a>. Хотелось бы собрать практики — какими ещё способами достигается идемпотентности для POST (и других эндпоинтов)? Какие у каждого подхода плюсы/минусы и в каких юс-кейсах лучше применять?</p><p><br>Спасибо!</p> <a href="https://habr.com/ru/posts/966408/?utm_campaign=966408&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 14 Nov 2025 09:05:08 GMT</pubDate>
    <dc:creator><![CDATA[andrei-trukhin]]></dc:creator>
      
      <category><![CDATA[idempotency key]]></category><category><![CDATA[rest]]></category><category><![CDATA[rest api]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @vlade1k — Блог компании PVS-Studio (+2) — 12.11.2025 15:31]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/965702/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/965702/?utm_campaign=965702&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Статический анализ OpenIDE</strong></p><p>Коллеги из <a href="https://openide.ru/" rel="noopener noreferrer nofollow">OpenIDE</a> предложили нам проверить их продукт статическим анализатором и написать об этом статью.</p><p>Мы отобрали самые интересные ошибки и странные моменты, которые нашёл анализатор в исходном коде используемой ими IntelliJ Platform. Если вам интересно посмотреть на ошибки в Java коде и освежить в памяти некоторые теоретические аспекты этого языка, крайне рекомендуем <a href="https://pvs-studio.ru/ru/blog/posts/java/1307/" rel="noopener noreferrer nofollow">статью</a> к прочтению.</p><p>P.S. Отдельная благодарность OpenIDE. Они рассмотрели приведённые в статье ошибки и поправили их.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/f7e/d01/159/f7ed01159d9dcf97530b2aa34fdfd35f.png" width="974" height="549"></figure> <a href="https://habr.com/ru/posts/965702/?utm_campaign=965702&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 12 Nov 2025 12:31:40 GMT</pubDate>
    <dc:creator><![CDATA[vlade1k (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[статический анализ]]></category><category><![CDATA[openide]]></category><category><![CDATA[pvs-studio]]></category><category><![CDATA[java]]></category><category><![CDATA[ошибки в коде]]></category><category><![CDATA[ide]]></category><category><![CDATA[intellij]]></category><category><![CDATA[idea]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ekhala — Блог компании Axiom JDK (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/axiomjdk/posts/962928/</guid>
    <link>https://habr.com/ru/companies/axiomjdk/posts/962928/?utm_campaign=962928&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/3b5/96f/bc1/3b596fbc1e850aa47dc6d837fdd69053.png" width="1560" height="900"></figure><p>Приглашаем на <a href="https://my.mts-link.ru/j/126243752/6703663778?utm_source=habr_axiom" rel="noopener noreferrer nofollow">вебинар</a>, на котором поговорим, как защитить сборки, избежать зависимостей от внешних репозиториев и повысить надёжность.</p><p><strong>На вебинаре вы узнаете:</strong></p><ul><li><p>требования ДИБов и регулятора</p></li><li><p>об&nbsp;атаках на&nbsp;цепочки поставок ПО</p></li><li><p>возможности отключения Maven Cenral</p></li><li><p>про&nbsp;инженерные проблемы при&nbsp;сборке, с&nbsp;которыми столкнулись, а&nbsp;также пути их решения на&nbsp;примере Axiom JDK</p></li><li><p>опыт использования доверенного репозитория в&nbsp;контуре ЕДИНОГО ЦУПИС</p></li><li><p>как&nbsp;встроить еще один репозиторий в&nbsp;стандартный Java‑проект. Покажем демонстрацию в&nbsp;режиме реального времени</p></li></ul><p><strong>Кому будет полезен вебинар:</strong><br>• Архитекторам <br>• Инженерам<br>• Всем, кто интересуется РБПО</p><p><strong>Вебинар проведут:</strong><br>• Максим Максимов, Архитектор решений, ЕДИНЫЙ ЦУПИС<br>• Сергей Лунегов, Директор по продуктам, Axiom JDK</p><p><strong>Когда</strong>: 12 ноября 2025 г.</p><p><strong>Во сколько</strong>: 11:00–12:30 по мск</p><p><strong>Формат</strong>: Онлайн</p><p><strong>Участие</strong>: Бесплатное (нужно предварительно&nbsp;<a href="https://my.mts-link.ru/j/126243752/6703663778?utm_source=habr_axiom" rel="noopener noreferrer nofollow">зарегистрироваться</a>)</p> <a href="https://habr.com/ru/posts/962928/?utm_campaign=962928&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 04 Nov 2025 08:00:44 GMT</pubDate>
    <dc:creator><![CDATA[ekhala (Axiom JDK)]]></dc:creator>
      
      <category><![CDATA[axiom]]></category><category><![CDATA[axiomjdk]]></category><category><![CDATA[java]]></category><category><![CDATA[рбпо]]></category><category><![CDATA[вебинар]]></category><category><![CDATA[безопасность]]></category><category><![CDATA[нагруженные системы]]></category><category><![CDATA[финтех]]></category><category><![CDATA[атаки]]></category><category><![CDATA[защита]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AlfaTeam — Блог компании Альфа-Банк (+2) — 07.10.2025 17:22]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/alfa/posts/954288/</guid>
    <link>https://habr.com/ru/companies/alfa/posts/954288/?utm_campaign=954288&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Ускоряем релизы и улучшаем качество с помощью Unleash</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/520/b20/3e0/520b203e0e5e58674cb130f51bf71de6.jpg" width="780" height="436"></figure><p>Сейчас в Альфа-Банке мы рассматриваем возможность внедрения фича-тоглов в наш проект и проводим исследование уже существующих решений. В рамках него мне удалось глубоко познакомиться с Unleash — самой популярной платформой для фича-тоглов на данный момент.</p><p>В статье <a href="https://habr.com/ru/companies/alfa/articles/951616/" rel="noopener noreferrer nofollow">«Разбираемся с Feature Toggle на примере Unleash»</a> подробно объясняем ключевые понятия и возможности Unleash — от определения тоглов до сложных стратегий и сегментов. Демонстрируем реальные примеры кода и архитектурных подходов на Java и Spring и рассказываем о практических плюсах Unleash</p><p>Статья будет полезна Backend-разработчикам и тимлидам, DevOps и SRE-инженерам, менеджерам продуктов и качества и всем, кто планирует масштабировать систему с десятками и сотнями микросервисов, где требуется централизованный и удобный контроль остаточного риска внедрения новых функций.</p> <a href="https://habr.com/ru/posts/954288/?utm_campaign=954288&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 07 Oct 2025 14:22:50 GMT</pubDate>
    <dc:creator><![CDATA[AlfaTeam (Альфа-Банк)]]></dc:creator>
      
      <category><![CDATA[feature toggle]]></category><category><![CDATA[java]]></category><category><![CDATA[spring]]></category><category><![CDATA[программирование]]></category><category><![CDATA[tbd]]></category><category><![CDATA[фича-флаги]]></category>
  </item>
  

	
  

  

  

      

      

      

    
  </channel>
</rss>
