<?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>Fri, 17 Jul 2026 17:20:20 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[Пост @dirvika — Блог компании Veai (+4) — 07.07.2026 18:08]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/veai/posts/1056666/</guid>
    <link>https://habr.com/ru/companies/veai/posts/1056666/?utm_campaign=1056666&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Почему ИИ-агент для кода промахивается мимо нужного метода</strong></p><p>Несколько последних постов об ИИ-агентах,&nbsp;которые я читала на этой неделе,&nbsp;сошлись в одну мысль:&nbsp;агенты часто ведут себя по-разному на одной и той же задаче,&nbsp;и разгадка почему&nbsp;-&nbsp;находится не там,&nbsp;где ожидаешь.&nbsp;Вот конкретный пример,&nbsp;на котором это видно сразу.</p><p>Агент,&nbsp;который ищет код текстом,&nbsp;физически не отличает <code>OrderService.validate</code> от&nbsp;<code>UserDto.validate</code>:&nbsp;для него это просто совпадение символов «validate». Агент,&nbsp;который спрашивает у IDE&nbsp;«кто на самом деле вызывает этот метод»,&nbsp;получает точный ответ,&nbsp;потому что IDE знает типы,&nbsp;разрешённые ссылки и видимость каждого символа.&nbsp;Разница между этими двумя подходами не абстрактная,&nbsp;она измеряется в конкретных цифрах.</p><p><strong>Точка отсчёта: почему grep и RAG промахиваются</strong></p><p>Кодовый агент ищет по проекту двумя способами:&nbsp;grep/ripgrep по содержимому файлов и векторный поиск по эмбеддингам кусков кода.&nbsp;На маленьком проекте оба варианта работают сносно.&nbsp;На enterprise-репозитории на миллионы строк с десятками модулей поведение ломается одинаково:&nbsp;запрос&nbsp;«найди использования метода&nbsp;<code>validate</code>»&nbsp;возвращает тысячу с лишним совпадений,&nbsp;из которых подавляющее большинство&nbsp;-&nbsp;другие методы с тем же именем в других классах.&nbsp;Векторный поиск находит куски кода,&nbsp;которые&nbsp;«похожи по смыслу»,&nbsp;но это может быть валидация в совершенно другом домене.</p><p><strong>Что показали цифры на 27 задачах</strong></p><p>Мы сравнили <strong>три версии агента</strong> на <strong>27 задачах вида</strong>&nbsp;«найди все места,&nbsp;где используется метод X»&nbsp;из реальных тикетов трёх внутренних репозиториев на Java и Kotlin:&nbsp;агент на ripgrep,&nbsp;агент на ripgrep с векторным RAG и агент на PSI-индексе IntelliJ&nbsp;(<code>find_usages</code>,&nbsp;<code>find_declaration</code>,&nbsp;<code>class_hierarchy</code>&nbsp;вместо текстового поиска).</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/70d/d43/514/70dd4351465ec1abac0efd433b5d47d5.png" alt="Вариант поискаPrecisionRecallF1Контекст, токенов$/ответripgrep0,410,820,5578 4001,12ripgrep + векторный RAG0,580,790,6792 1001,38PSI-индекс0,960,930,9416 7000,21" title="Вариант поискаPrecisionRecallF1Контекст, токенов$/ответripgrep0,410,820,5578 4001,12ripgrep + векторный RAG0,580,790,6792 1001,38PSI-индекс0,960,930,9416 7000,21" width="3200" height="1400"><div><figcaption>Вариант поискаPrecisionRecallF1Контекст, токенов$/ответripgrep0,410,820,5578 4001,12ripgrep + векторный RAG0,580,790,6792 1001,38PSI-индекс0,960,930,9416 7000,21</figcaption></div></figure><p>Precision показывает,&nbsp;сколько из найденного агентом оказалось реальными использованиями метода,&nbsp;а не случайным совпадением имён.&nbsp;Recall показывает,&nbsp;сколько из всех реальных использований в коде агент вообще нашёл,&nbsp;ничего не пропустив.</p><p>У ripgrep recall высокий&nbsp;(0,82):&nbsp;текстовый поиск почти никогда не пропускает совпадения по имени.&nbsp;Но precision низкий&nbsp;(0,41):&nbsp;больше половины найденного&nbsp;-&nbsp;чужие методы с тем же именем,&nbsp;и их приходится разбирать вручную.&nbsp;У PSI-индекса высоки обе величины&nbsp;(0,96 и 0,93):&nbsp;агент находит почти все нужные места и почти не приносит лишнего.&nbsp;F1 сводит обе величины в одно число,&nbsp;и у ripgrep он проседает именно из-за мусора в выдаче,&nbsp;хотя нужные места он и находит.</p><p>Отсюда пятикратная экономия контекста и в пять с лишним раз более дешёвый ответ при кратно более высокой точности:&nbsp;агент на PSI-индексе не читает тысячи лишних строк,&nbsp;которые вернул бы текстовый поиск.</p><p><strong>Точный поиск не отменяет проверку</strong></p><p>Даже когда агент точно нашёл все места,&nbsp;где используется метод,&nbsp;и внёс правку во все,&nbsp;это не гарантирует,&nbsp;что правка корректна:&nbsp;<strong>точный поиск решает только задачу&nbsp;«найти нужные места»</strong>,&nbsp;а не&nbsp;«проверить,&nbsp;что код после правки работает».&nbsp;Поэтому прежде чем объявить об успехе,&nbsp;агент должен прогнать компилятор и тесты:&nbsp;тест зелёный,&nbsp;ошибок компиляции нет,&nbsp;покрытие не просело.&nbsp;Пока в выводе компилятора или тестового прогона есть хоть одна ошибка,&nbsp;агент обязан либо исправить её,&nbsp;либо сообщить о проблеме,&nbsp;а не писать об успехе.</p><p>Но точный поиск снимает с агента часть ручной работы:&nbsp;не нужно самому перепроверять по всему проекту,&nbsp;все ли использования метода он нашёл&nbsp;-&nbsp;эту проверку берёт на себя IDE,&nbsp;как это устроено в Veai,&nbsp;а оставшуюся часть верификации&nbsp;-&nbsp;компилятор и тесты.</p> <a href="https://habr.com/ru/posts/1056666/?utm_campaign=1056666&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 07 Jul 2026 15:08:33 GMT</pubDate>
    <dc:creator><![CDATA[dirvika (Veai)]]></dc:creator>
      
      <category><![CDATA[программирование]]></category><category><![CDATA[ии-агенты]]></category><category><![CDATA[ии и машинное обучение]]></category><category><![CDATA[ии]]></category><category><![CDATA[java]]></category><category><![CDATA[ai-агенты]]></category><category><![CDATA[ai]]></category><category><![CDATA[kotlin]]></category><category><![CDATA[аналитика]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @alex_marshal — Java (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1055448/</guid>
    <link>https://habr.com/ru/posts/1055448/?utm_campaign=1055448&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как записать "круглое" видео в мессенджере "BITCORD".</strong></p><p>Пишу крутой облачный мессенджер (мини-соцсеть) под пилотным названием <strong>BITCORD</strong>. Недавно для него реализовал новую функцию отправки видеосообщений в форме "круглого" видео. Теперь любой пользователь может отправить своему собеседнику модное селфи без каких-либо специальных настроек. Это круто и весело, дополняет общение личной эмоцией.</p><p>Чтобы отправить такое видео, достаточно открыть чат и выбрать в верхнем выпадающем меню пункт "Селфи видео". Далее откроется небольшое диалоговое окошко, где необходимо нажать и удерживать кнопку "Hold" - после этого начнется процесс записи видео с фронтальной камеры смартфона.</p><p>Длительность записи ограничена по времени, чтобы не перегружать смартфон ресурсоемким процессом. После истечения лимита или как только пользователь отпустит кнопку, видео отправится на бэкенд для дальнейшей обработки.</p><p>Особенности видеосообщений:</p><ul><li><p><strong>Лимит времени:</strong> Максимальная длительность одного ролика составляет <strong>10 секунд</strong>.</p></li><li><p><strong>Формат:</strong> Видео автоматически обрезается в форме круга и записывается на фронтальную камеру.</p></li><li><p><strong>Воспроизведение:</strong> В чате такие ролики проигрываются один раз при нажатии "<strong>Play</strong>".</p></li></ul><p><strong>Способ 1</strong></p><p>Бэкенд приводит видео к "квадратному" формату с соотношением сторон 1:1 и возвращает ссылку на него обратно в чат собеседникам.  </p><p>Ниже пример выполнения преобразования видео в "квадратный" формат с помощью "ffmpeg":</p><pre><code class="bash">ffmpeg 
  -i input.mp4 
  -vf "crop=480:480:0:(ih-480)/2" 
  -c:v libx264 -crf 23 
  -c:a copy output.mp4</code></pre><p>Чтобы отобразить "квадратное" видео в виде круга на Java, я создаю шаблон (<strong>ViewOutlineProvider</strong>). Он принудительно задает графическому элементу (View) форму идеального круга фиксированного размера:  </p><pre><code class="java">private static final ViewOutlineProvider CIRCLE_PROVIDER = new ViewOutlineProvider() {
  @Override
  public void getOutline(View view, Outline outline) {
    int sizeInPx = (int) TypedValue.applyDimension(
      TypedValue.COMPLEX_UNIT_DIP, 270, view.getResources().getDisplayMetrics()
    );
    outline.setOval(0, 0, sizeInPx, sizeInPx);
  }
};</code></pre><p>Затем в холдере применяю описанный выше шаблон к TextureView и ImageView:</p><pre><code class="java">static class CircleVideoViewHolder extends BaseViewHolder {
  TextureView texture;
  ImageView   preview;

  VidCrViewHolder(View v) {
    super(v);
          
    texture = v.findViewById(R.id.video_texture);
    preview = v.findViewById(R.id.video_preview);

    texture.setOutlineProvider(CIRCLE_PROVIDER);
    preview.setOutlineProvider(CIRCLE_PROVIDER);

    texture.setClipToOutline(true);
    preview.setClipToOutline(true);
  }
}</code></pre><p>В результате выполнения этого кода видео примет "круглый" вид.</p><p><strong>Способ 2</strong></p><p>Как показала практика, кодирование видео в "квадратный" формат на бэкенде <strong>невыгодно</strong>, так как <strong>оно</strong> занимает время и нагружает сервер. Без хорошей видеокарты, которая на бэкенде часто отсутствует, работать с видео накладно. Поэтому я пошел другим путём.</p><p>Так как камера смартфона снимает видео не в "квадратном" формате, я воспользовался матрицей преобразования, центрировал кадр и обрезал лишние стороны.</p><pre><code class="java">//фиксированный размер видео с камеры смартфона: 480x640
float scaleY = h / (w * 480 / 640); 
Matrix matrix = new Matrix();
matrix.setScale(1.0f, scaleY, w / 2f, h / 2f);
CircleVideoViewHolder vch = (CircleVideoViewHolder) holder;
vch.texture.setTransform(matrix);</code></pre><p>При таком подходе вся работа выполняется на стороне графического процессора (GPU) самого смартфона с максимальной скоростью. Это полностью избавляет от необходимости обрабатывать видео на бэкенде.  </p><p>В результате получилась вот такая красота:</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/2d8/57f/fc0/2d857ffc015ba217cc96f56ed6425c80.jpg" alt="селфи видео в круглом формате" title="селфи видео в круглом формате" width="768" height="1366"><div><figcaption>селфи видео в круглом формате</figcaption></div></figure><p><strong>Итог:</strong></p><p>Перенос графических вычислений на сторону клиента (в данном случае на GPU смартфона) позволил решить сразу две важные задачи. Во-первых, это полностью разгружает бэкенд-сервер от тяжелых операций перекодирования видео. Во-вторых, обеспечивает пользователя мгновенным откликом интерфейса и быстроту отправки сообщения, так как обработка кадра происходит "на лету" прямо во время записи.  </p><p>Спасибо за вашу поддержку. Это придает стимул писать дальше.</p> <a href="https://habr.com/ru/posts/1055448/?utm_campaign=1055448&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 04 Jul 2026 01:19:57 GMT</pubDate>
    <dc:creator><![CDATA[alex_marshal]]></dc:creator>
      
      <category><![CDATA[мессенджеры]]></category><category><![CDATA[разработка приложений под android]]></category><category><![CDATA[бэкенд]]></category><category><![CDATA[ffmpeg]]></category><category><![CDATA[андроид]]></category><category><![CDATA[графика]]></category><category><![CDATA[оптимизация приложений]]></category><category><![CDATA[использование матриц]]></category><category><![CDATA[обрезка видео]]></category><category><![CDATA[круглое видео]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @alex_marshal — .NET (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1054176/</guid>
    <link>https://habr.com/ru/posts/1054176/?utm_campaign=1054176&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Прямая Web3-монетизация без посредников (Peer-to-Peer) для артистов на радио.</strong>  </p><p>Буквально вчера закончил написание сервисного бота для коммерческих нужд в мессенджере "<strong>Concord</strong>". Основной целью проекта является автоматизация процессов публикации авторского материала на интернет-радио. Бот был создан как помощник для авторов аудиоконтента: музыкантов, продюсеров, подкастеров и т. п.</p><p>Задача была непростой. Нужно было объединить возможности мессенджера с его токеномикой и реализовать передачу медиаконтента (картинок, аудиофайлов, текстовых данных) на удаленный сервер в формате JSON. Для этого я написал серверную страницу на PHP, в которой реализовал весь необходимый API.</p><p>При передаче медиаданных пользователь запускает нужного бота и отправляет ему в личные сообщения весь необходимый материал. Отправка изображения артиста и аудиофайла выполняется напрямую, без каких-либо команд. Бот сам идентифицирует тип данных, полученных от пользователя, и записывает их в локальные файлы. Вот как я реализовал проверку принадлежности данных к типу файлов:</p><pre><code class="php">function isJpeg(string $data): bool
{
    return substr($data,0,2) === "\xFF\xD8";
}

function isMp3(string $data): bool
{
    if (substr($data,0,3)==="ID3") {
        return true;
    }

    return isset($data[1])
        &amp;&amp;
        ord($data[0])===0xFF
        &amp;&amp;
        (ord($data[1]) &amp; 0xE0)===0xE0;
}</code></pre><p>После получения данных нужно сразу определить что именно пришло - команда или файл:</p><pre><code class="php">if (preg_match('/^\/(help|bio|title|tracks|done)\b/i', $data))
{
    processCommand($db, $uuid, $data);
    exit;
}

if (isBase64($data))
{
    saveBinary($db, $uuid, $data);
    exit;
}

reply("Unknown command, please use /help.", false);</code></pre><p>Описание профиля артиста и названия его треков передаются в текстовом виде используя специальный набор команд:</p><ul><li><p>/help - Show this help</p></li><li><p>/bio text - Update artist biography</p></li><li><p>/tracks - Show info of all tracks</p></li><li><p>/title text - Update current track title</p></li><li><p>/pay amount - Pay for service</p></li><li><p>/done - Finalize current track</p></li><li><p>Send JPG image to update artist image</p></li><li><p>Send MP3 audio to update current track </p></li></ul><p>Используя бота, артист может отправлять свои материалы в ротацию на радио для продвижения своего творчества. Протокол взаимодействия с ботом довольно простой:</p><ol><li><p>артист отправляет фото профиля</p></li><li><p>артист отправляет описание профиля</p></li><li><p>артист загружает трек</p></li><li><p>артист отправляет описание трека</p></li><li><p>артист выполняет оплату сервиса</p></li><li><p>артист финализирует трек</p><p>Пока трек не финализирован, артист может изменять любые данные. Финализация трека возможна только после выполнения всех вышеуказанных действий. После этого любые отправленные артистом данные активируют запись уже нового трека, и процесс повторяется. При этом данные профиля артиста можно изменять без ограничений.</p></li></ol><p><strong>МОНЕТИЗАЦИЯ</strong></p><p>Отправка материала артистом требует платы за сервис. Когда артист подтверждает оплату, бот списывает с его кошелька требуемую сумму и зачисляет её на кошелек владельца радиосервиса. Это значительно упрощает обмен активами между плательщиком и получателем.</p><p>Таким образом, технология Web3 с использованием блокчейна позволяет оперативно выполнять оплату за предоставленный сервис без лишних трат и банковских процедур. При этом все транзакции становятся видны в блокчейне уже через несколько минут.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/151/dbc/c53/151dbcc53722dae652e74d94c2aadfd6.jpg" alt="схема работы блокчейна" title="схема работы блокчейна" width="588" height="522"><div><figcaption>схема работы блокчейна</figcaption></div></figure><p> Следующим этапом разработки я планирую реализовать возможность начисления роялти каждому автору музыкального материала. Для этого потребуется создать публичную таблицу рейтинга на сайте радио, где слушатели смогут голосовать за понравившиеся треки, продвигая артиста на верх списка. Исходя из количества прослушиваний конкретного трека, можно будет рассчитать сумму роялти и автоматически выплачивать её на личный кошелек автора в мессенджере.  </p><p>Таким образом, объединение двух разных сущностей, а именно интернет-радио с приложением для обмена сообщениями, является неким ноу-хау для оказания помощи в развитии молодых дарований. Лично для меня как для разработчика это отличный вызов и прекрасная возможность "пошевелить мозгами".</p><p> Если у вас появятся предложения, буду рад подискуссировать.  </p> <a href="https://habr.com/ru/posts/1054176/?utm_campaign=1054176&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 01 Jul 2026 03:12:14 GMT</pubDate>
    <dc:creator><![CDATA[alex_marshal]]></dc:creator>
      
      <category><![CDATA[радио]]></category><category><![CDATA[боты]]></category><category><![CDATA[разработка]]></category><category><![CDATA[бэкенд]]></category><category><![CDATA[фронт]]></category><category><![CDATA[приложения]]></category><category><![CDATA[интернет]]></category><category><![CDATA[артисты]]></category><category><![CDATA[музыканты]]></category><category><![CDATA[web3]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @IBS_habrablog — Блог компании IBS (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/ibs/posts/1052426/</guid>
    <link>https://habr.com/ru/companies/ibs/posts/1052426/?utm_campaign=1052426&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/c5b/f04/632/c5bf04632a8db73a583600c10e81247d.jpg" width="1115" height="720"></figure><p><strong>30 июня в 18:00 начнется&nbsp; вебинар&nbsp;«<a href="https://ibs-training.ru/training/seminar/160079/" rel="noopener noreferrer nofollow">Почему Java-разработчику следует брать на вооружение Quarkus</a>». В прямом эфире рассмотрим ключевые преимущества</strong> <strong>Quarkus перед Spring Boot: родную сборку, малое потребление памяти и удобство разработки.</strong></p><p>Создадим один и тот же REST-сервис на Spring Boot и на Quarkus, сравним время старта и затраты ресурсов.</p><p>Разберём настоящий случай из промышленной разработки. Вебинар будет полезен специалистам, которые хотят ускорить свои приложения и снизить счета за облако.</p><p><strong>Содержание</strong>:</p><p>✅&nbsp;Проблема долгого запуска и высокого потребления памяти в Spring Boot.</p><p>✅&nbsp;Что такое Quarkus? Окружающая среда расширений, родная сборка.</p><p>✅&nbsp;Живой код: создание REST-сервиса на Spring Boot и на Quarkus.</p><p>✅&nbsp;Измерение времени запуска и потребления памяти.</p><p>✅&nbsp;Как родная сборка ускоряет размещение в Kubernetes и снижает затраты.</p><p>✅&nbsp;Настоящий случай из практики автора.</p><p>✅&nbsp;Как продолжить изучение Quarkus.</p><p>🧑‍🎓&nbsp;<strong>Спикер</strong>:&nbsp;Чвилёв Константин, эксперт в области разработки ПО</p><p>📆&nbsp;<strong>Когда</strong>: 30 июня, 18:00–19:00 (Мск)</p><p>👉&nbsp;<strong><a href="https://ibs-training.ru/training/seminar/160079/" rel="noopener noreferrer nofollow">Регистрация</a></strong></p> <a href="https://habr.com/ru/posts/1052426/?utm_campaign=1052426&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 26 Jun 2026 16:21:53 GMT</pubDate>
    <dc:creator><![CDATA[IBS_habrablog (IBS)]]></dc:creator>
      
      <category><![CDATA[вебинар]]></category><category><![CDATA[java]]></category><category><![CDATA[quarkus]]></category><category><![CDATA[spring boot]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Облачные сервисы (+4) — 23.06.2026 20:48]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1051144/</guid>
    <link>https://habr.com/ru/posts/1051144/?utm_campaign=1051144&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлено бесплатное десктопное приложение <a href="https://github.com/truelockmc/streambert" rel="noopener noreferrer nofollow">Streambert</a> с открытым исходным кодом для ПК на Windows, macOS и Linux. Решение распространяется по лицензии GNU GPL v3.0. Главное преимущество Streambert — здесь совсем нет рекламы и трекеров. Разработчики подчёркивают, что приложение всегда будет бесплатным и не станет собирать личные данные пользователей.</p><p>Для поиска и отображения информации о фильмах и сериалах Streambert использует базу TMDB и для работы понадобится бесплатный API-ключ TMDB. Программа поддерживает русский интерфейс и субтитры, а также даёт возможность скачивать любые медиафайлы для офлайн-просмотра.</p><p>Разработчики утверждают, что приложение обеспечивает более быструю потоковую передачу видео по сравнению с большинством браузерных кинотеатров и поддерживает многопоточную загрузку файлов. При этом Streambert не хранит и не распространяет защищённый авторским правом контент, программа лишь агрегирует ссылки с внешних источников и выступает в роли поисковика.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/e50/874/603/e50874603499d8828ee91776d01e3368.png" width="701" height="967"></figure> <a href="https://habr.com/ru/posts/1051144/?utm_campaign=1051144&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 23 Jun 2026 17:48:03 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Streambert]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dyadyaSerezha — Java (+2) — 16.06.2026 21:26]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1048356/</guid>
    <link>https://habr.com/ru/posts/1048356/?utm_campaign=1048356&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Вот такую работу предлагает Райфайзен для Java-разработчиков с опытом от 3 лет. И как это теперь развидеть? 😎 </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/919/5c0/229/9195c022939d1c873bcdfd5a9e0ffc56.jpg" width="1080" height="626"></figure> <a href="https://habr.com/ru/posts/1048356/?utm_campaign=1048356&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 16 Jun 2026 18:26:59 GMT</pubDate>
    <dc:creator><![CDATA[dyadyaSerezha]]></dc:creator>
      
      <category><![CDATA[работа в it]]></category><category><![CDATA[работа]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AI-CMO — Java (+2) — 16.06.2026 15:24]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1048194/</guid>
    <link>https://habr.com/ru/posts/1048194/?utm_campaign=1048194&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Риски ИИ- генерируемого кода - качество, производительность, “УСПЕВАЮ ЛИ Я ЗА ТЕМПОМ”&nbsp;</strong></p><p>ИИ генерирует код быстрее, чем мы успеваем ловить его реальные проблемы.<br>В JPA/Hibernate это особенно больно: код компилируется, тесты зелёные — а внутри N+1 и лишние запросы. Veai проверяет такие гипотезы на фактах проекта прямо в IDE: семантические usages, реальные прогоны тестов, coverage, debugger, доступ к исходникам Hibernate.</p><p>Не “этот код, возможно, тормозит”, а проверка через запуск. Скорость растёт — контроль над качеством остаётся. Большой разбор продукта <a href="https://habr.com/ru/companies/veai/articles/1043752/" rel="noopener noreferrer nofollow">сделан в статье </a></p> <a href="https://habr.com/ru/posts/1048194/?utm_campaign=1048194&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 16 Jun 2026 12:24:28 GMT</pubDate>
    <dc:creator><![CDATA[AI-CMO]]></dc:creator>
      
      <category><![CDATA[программирование]]></category><category><![CDATA[программирование для начинающих]]></category><category><![CDATA[ide]]></category><category><![CDATA[idea]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dirvika — Блог компании Veai (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/veai/posts/1047818/</guid>
    <link>https://habr.com/ru/companies/veai/posts/1047818/?utm_campaign=1047818&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>От падающего теста до правки: как General ведёт задачу в любимой IDE</strong></p><p>Когда разработчик открывает AI-чат в IDE,&nbsp;он не думает категориями режимов.&nbsp;Он не формулирует задачу как&nbsp;«сначала Plan,&nbsp;потом Code,&nbsp;затем Test и Review»&nbsp;—&nbsp;он пишет проще:</p><blockquote><p>Почини тест</p></blockquote><p>И только по ходу становится понятно,&nbsp;что это за задача:&nbsp;иногда хватит поправить одну строку,&nbsp;иногда&nbsp;—&nbsp;пройти по нескольким модулям,&nbsp;разобраться в зависимости,&nbsp;изменить production-код и обновить тесты.&nbsp;Заранее это знать нельзя&nbsp;—&nbsp;и не нужно.</p><p>Под этот сценарий в <strong>Veai</strong> сделан режим&nbsp;<strong>General</strong>:&nbsp;вы описываете цель обычными словами,&nbsp;а агент сам выбирает маршрут&nbsp;—&nbsp;проход по коду,&nbsp;планирование,&nbsp;тесты,&nbsp;ревью,&nbsp;отладка или подключение субагентов.&nbsp;Специализированные режимы&nbsp;(Ask,&nbsp;Code,&nbsp;Test,&nbsp;Plan,&nbsp;Review,&nbsp;Debug)&nbsp;остаются для случаев,&nbsp;когда вы хотите управлять процессом явно.</p><p><strong>Почему ручной выбор режима мешает</strong></p><p>Реальная задача редко укладывается в один режим.&nbsp;«Исправить падающий тест»&nbsp;—&nbsp;это сразу несколько подзадач:&nbsp;понять причину,&nbsp;решить,&nbsp;где ошибка&nbsp;(в тесте,&nbsp;production-коде,&nbsp;моках,&nbsp;данных или окружении),&nbsp;внести правку и запустить проверку.&nbsp;Если режим нужно выбрать заранее,&nbsp;новый разработчик начинает не с решения проблемы,&nbsp;а с изучения классификации агентов.&nbsp;General убирает этот выбор из начала задачи.</p><p><strong>Что происходит по шагам</strong></p><p>На запрос&nbsp;«в сервисе оплаты падает тест,&nbsp;найди причину и почини»&nbsp;General в простом случае ведёт задачу сам:</p><ol><li><p>находит и запускает тест через IDE run configuration — в том же окружении, что и разработчик (SDK, профиль, переменные, модули), а не в собранном из терминала, которое может отличаться;</p></li><li><p>читает стектрейс, открывает связанный production-код, при необходимости смотрит usages, warnings и inspections;</p></li><li><p>вносит минимальную правку и перезапускает проверку: тест прошёл или упал — это факт из IDE, а не предположение модели.</p></li></ol><p>Если стектрейса не хватает,&nbsp;агент опирается на отладчик&nbsp;(breakpoints,&nbsp;значения переменных,&nbsp;call tree),&nbsp;а если стектрейс уводит в библиотеку&nbsp;—&nbsp;открывает её код или декомпилированный класс через IDE,&nbsp;а не угадывает API по памяти модели.</p><p><strong>Когда подключаются субагенты</strong></p><p>Маршрут выбирает не отдельный классификатор,&nbsp;а сама модель:&nbsp;по тексту задачи и первым фактам из проекта она решает,&nbsp;достаточно ли пройтись по коду или стоит разложить работу на субагентов&nbsp;(один исследует причину,&nbsp;второй&nbsp;—&nbsp;зависимости,&nbsp;третий&nbsp;—&nbsp;тесты).&nbsp;Поправить одну строку General сделает сам,&nbsp;большую задачу&nbsp;—&nbsp;распараллелит.&nbsp;Многоагентность здесь не самоцель,&nbsp;а инструмент для задач,&nbsp;где она реально ускоряет результат.</p><p>Полностью исключить ошибки модели нельзя.&nbsp;Но General опирается не только на LLM,&nbsp;grep и RAG,&nbsp;а на JetBrains IDE как на источник проверяемых фактов:&nbsp;run configurations,&nbsp;SDK и classpath,&nbsp;структуру кода,&nbsp;usages и inspections,&nbsp;coverage,&nbsp;код зависимостей и ошибки компиляции так,&nbsp;как их видит IDE.&nbsp;Отсюда меньше галлюцинаций API и ситуаций&nbsp;«у агента прошло,&nbsp;а в IDE или CI падает».</p><p><strong>Разницу можно измерить.&nbsp;</strong></p><p>Мы прогнали 8 enterprise-задач на Java/Spring через четыре агента на одной модели&nbsp;—&nbsp;Cursor,&nbsp;Claude Code,&nbsp;JetBrains Junie и Veai:</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/3c5/821/335/3c5821335a5a1610b1459bd8e9d9a7fa.png" width="1672" height="941"></figure><p><strong>Контроль остаётся у разработчика</strong></p><p>Даже когда агент ведёт задачу автономно,&nbsp;последнее слово за человеком:&nbsp;разработчик смотрит diff в окне Agent Changes и решает,&nbsp;что принять.&nbsp;Перед этим General может сам прогнать несколько субагентов-ревьюеров по своим изменениям и устранить критические проблемы ещё до того,&nbsp;как покажет результат человеку,&nbsp;—&nbsp;авторевью встроено в маршрут,&nbsp;а не остаётся отдельным ручным шагом.&nbsp;Идея не в том,&nbsp;чтобы убрать review,&nbsp;а в том,&nbsp;чтобы убрать лишнюю ручную маршрутизацию до него.</p><p><a href="https://veai.ru/blog/releases/release5120generalagent" rel="noopener noreferrer nofollow">Установить Veai 5.12</a></p><p>Обратная связь&nbsp;—&nbsp;<a href="mailto:support@veai.ru" rel="noopener noreferrer nofollow">support@veai.ru</a> и&nbsp;<a href="https://t.me/veai_devs" rel="noopener noreferrer nofollow">чат с командой</a>.</p> <a href="https://habr.com/ru/posts/1047818/?utm_campaign=1047818&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 16 Jun 2026 11:53:25 GMT</pubDate>
    <dc:creator><![CDATA[dirvika (Veai)]]></dc:creator>
      
      <category><![CDATA[программирование]]></category><category><![CDATA[java]]></category><category><![CDATA[ide]]></category><category><![CDATA[ai-агенты]]></category><category><![CDATA[ai]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ITFB_Group — Искусственный интеллект (+3) — 16.06.2026 12:39]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1048070/</guid>
    <link>https://habr.com/ru/posts/1048070/?utm_campaign=1048070&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/1c2/10d/434/1c210d434bdd1e6d170ab6fa6edf3e51.png" width="780" height="449"></figure><p>Приглашаем вас на совместный вебинар ITFB Group и компании Veai, посвящённый практике контролируемого применения ИИ в разработке.</p><p><strong>Когда</strong>: 24 июня, 11:00<br><strong>Где</strong>: онлайн</p><blockquote><p>Ключевой вопрос: <em>как использовать скорость вайб-кодинга, но при этом не допустить падения качества, потери управляемости и рисков безопасности</em>?</p></blockquote><p><strong>О продукте</strong></p><p>Veai — первый российский ИИ-агент, сочетающий высокую скорость генерации кода с жёстким контролем на основе формальных методов. На вебинаре мы на реальных примерах покажем, чем Veai отличается от Cursor, Copilot и других доступных на рынке решений.</p><p><strong>Программа вебинара</strong></p><p>— <strong>Практическая демонстрация</strong>: работа агента на реальном коде — от постановки задачи до готового результата.</p><p>— <strong>Сравнительный анализ</strong>: объективная оценка сильных и слабых сторон популярных ИИ-ассистентов.</p><p>— <strong>Метрики и экономика</strong>: данные по экономии часов, ROI, доле принятого сгенерированного кода и росту тестового покрытия (до 80% с использованием символьного исполнения и data-flow анализа).</p><p>— <strong>Работа с некомпилируемым кодом</strong>: агент автоматически выявляет и исправляет ошибки компиляции и предупреждения IDE, используя нативные инструменты без дополнительных вызовов.</p><p>— <strong>Безопасность и архитектура</strong>: варианты развертывания (on‑premise, self‑hosting, VPC, SaaS), механизмы контроля доступа и встроенный SAST-движок, проверяющий каждую генерацию.</p><p><strong>Спикеры</strong></p><p>— <strong>Константин Волков</strong>, менеджер по техническим решениям Veai.<br>— <strong>Наталья Романова</strong>, директор по развитию ITFB Group.</p><p>Формат — открытая дискуссия. Вы сможете задать любые вопросы, включая самые сложные и нестандартные.</p><p><strong>Кому будет полезно</strong>: ИТ-директорам, руководителям разработки, архитекторам и всем, кто внедряет или планирует внедрять ИИ-инструменты в корпоративную среду.</p><p>👉 <strong><a href="https://itfbgroup.ru/vayb-koding-na-korporativnom-kontrole-distsiplina-vmesto-khaosa?utm_source=habr&amp;utm_medium=post" rel="noopener noreferrer nofollow">Зарегистрироваться</a></strong></p> <a href="https://habr.com/ru/posts/1048070/?utm_campaign=1048070&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 16 Jun 2026 09:39:00 GMT</pubDate>
    <dc:creator><![CDATA[ITFB_Group]]></dc:creator>
      
      <category><![CDATA[itfb]]></category><category><![CDATA[ии-ассистент]]></category><category><![CDATA[ии разработка]]></category><category><![CDATA[вайб-кодинг]]></category><category><![CDATA[генерация кода]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @PvsTeam — Блог компании PVS-Studio (+1) — 10.06.2026 09:17]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1045766/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1045766/?utm_campaign=1045766&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Продолжаем делиться докладами с прошедших конференций! На этот раз у нас тут доклад с <strong>Joker 2025</strong> 🔥</p><p>Тема: <strong>"Как компилятор видит код. Поиск уязвимостей на графах"</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/3df/1d7/c0d/3df1d7c0d80f9b317ee26cf83b66b0d9.png" width="1920" height="1080"></figure><p>Посмотрели, как код превращается из исходного представления в графовое, чтобы ответить на вопрос: «Как компилятор видит код?». Прошлись по технологиям фронтенда — от AST и графов на его основе до карты вызовов — и посмотрели на их визуализацию.</p><p>В качестве кейса взяли поиск уязвимостей небезопасной обработки внешних данных с помощью taint-анализа. Заодно узнали, почему обход графов — это не только про задачи на литкоде.</p><p>Доклад будет полезен как тем, кто хочет создать свой инструмент для работы с кодом, так и тем, кто хочет узнать, из чего состоит фронтенд компилятора, как он видит код и как использует это представление.</p><p>Посмотреть можно тут: <br>- <a href="https://pvs-studio.ru/ru/blog/video/11743/" rel="noopener noreferrer nofollow">наш сайт</a><br>- <a href="https://vkvideo.ru/video-11805870_456239753?list=ln-wv0syvzOI0EuRAOZja" rel="noopener noreferrer nofollow">VK Video</a><br>- <a href="https://rutube.ru/video/cc8452f5a253d8a88562e6185e1ce7ec/" rel="noopener noreferrer nofollow">Rutube</a><br>- <a href="https://youtu.be/rgScPXtf0OU" rel="noopener noreferrer nofollow">YouTube</a></p> <a href="https://habr.com/ru/posts/1045766/?utm_campaign=1045766&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 10 Jun 2026 06:17:57 GMT</pubDate>
    <dc:creator><![CDATA[PvsTeam (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[конференция]]></category><category><![CDATA[доклад]]></category><category><![CDATA[joker]]></category><category><![CDATA[компилятор]]></category><category><![CDATA[фронтенд]]></category><category><![CDATA[поиск уязвимостей]]></category><category><![CDATA[разработка]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @MaxRokatansky — Блог компании OTUS (+2) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/otus/posts/1043568/</guid>
    <link>https://habr.com/ru/companies/otus/posts/1043568/?utm_campaign=1043568&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Что&nbsp;посмотреть на&nbsp;неделе: брокеры сообщений, Kubernetes и ИИ‑агенты</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/8da/d16/bca/8dad16bcadfb92d663f93d89f2d94e5b.png" width="1280" height="697"></figure><p>Привет, Хабр. На этой&nbsp;неделе в&nbsp;OTUS&nbsp;пройдет серия бесплатных уроков для&nbsp;тех, кто работает с&nbsp;архитектурой, инфраструктурой, разработкой, аналитикой и ИИ‑инструментами.</p><p>Будет много практики: выбор брокера сообщений, деплой Java‑приложения в&nbsp;Kubernetes, мониторинг распределённых систем, создание AI‑ассистентов и интеграция ИИ‑агентов в&nbsp;рабочую разработку.</p><p><em>Все уроки бесплатно проводят преподаватели в рамках курсов. Можно прийти на&nbsp;один вебинар по&nbsp;своей задаче или&nbsp;собрать мини‑маршрут на&nbsp;неделю.</em></p><p><strong>Архитектура и backend</strong></p><ul><li><p><strong>8&nbsp;июня, 19:00.</strong> «RabbitMQ vs Kafka. Как&nbsp;выбрать подходящий брокер сообщений?». <a href="https://otus.pw/mahi/" rel="noopener noreferrer nofollow">Записаться</a><br><sub>разберём, чем отличаются RabbitMQ и Kafka, в&nbsp;каких задачах они работают лучше и как&nbsp;выбрать брокер под&nbsp;архитектуру проекта.</sub></p></li><li><p><strong>15&nbsp;июня, 20:00.</strong> «Системы обмена сообщениями: RabbitMQ и Kafka». <a href="https://otus.pw/IaT8/" rel="noopener noreferrer nofollow">Записаться</a><br><sub>поговорим об&nbsp;устройстве систем обмена сообщениями и сценариях, где брокеры помогают строить устойчивые распределённые решения.</sub></p></li></ul><p><strong>Инфраструктура и эксплуатация</strong></p><ul><li><p><strong>8&nbsp;июня, 20:00.</strong> «Java в&nbsp;Kubernetes за 40&nbsp;минут: как&nbsp;задеплоить приложение в&nbsp;Minikube». <a href="https://otus.pw/4i8t/" rel="noopener noreferrer nofollow">Записаться</a><br><sub>покажем, как&nbsp;подготовить Java‑приложение к&nbsp;запуску в&nbsp;Kubernetes и развернуть его локально через Minikube.</sub></p></li><li><p><strong>10&nbsp;июня, 20:00.</strong> «Мониторинг распределённых систем». <a href="https://otus.pw/DfWj/" rel="noopener noreferrer nofollow">Записаться</a><br><sub>разберём, как&nbsp;отслеживать состояние сложных систем,&nbsp;быстрее находить проблемы и не&nbsp;теряться в&nbsp;метриках, логах и алертах.</sub></p></li></ul><p><strong>ИИ в&nbsp;рабочих процессах</strong></p><ul><li><p><strong>11&nbsp;июня, 20:00.</strong> «Создаём ИИ‑ассистента для&nbsp;системного аналитика за 1&nbsp;час». <a href="https://otus.pw/7TRc/" rel="noopener noreferrer nofollow">Записаться</a><br><sub>покажем, как&nbsp;ИИ может помогать аналитику в&nbsp;рабочих задачах: от&nbsp;обработки требований до&nbsp;подготовки артефактов.</sub></p></li><li><p><strong>15&nbsp;июня, 20:00.</strong> «Интеграция ИИ‑агентов в&nbsp;рабочую разработку: обвязка агента навыками и MCP». <a href="https://otus.pw/AdUU/" rel="noopener noreferrer nofollow">Записаться</a><br><sub>разберём, как&nbsp;расширять возможности ИИ‑агента с&nbsp;помощью навыков и MCP, чтобы он&nbsp;был полезен в&nbsp;реальном рабочем процессе.</sub></p></li><li><p><strong>15&nbsp;июня, 20:00.</strong> «Создаём AI‑ассистента и интегрируем его в&nbsp;Telegram». <a href="https://otus.pw/IIaG/" rel="noopener noreferrer nofollow">Записаться</a><br><sub>покажем, как&nbsp;собрать AI‑ассистента и подключить его к&nbsp;Telegram для&nbsp;пользовательских сценариев.</sub></p></li></ul><p><strong>Команды и процессы</strong></p><ul><li><p><strong>11&nbsp;июня, 20:00.</strong> «Внутри Scrum: как&nbsp;работают мастер, владелец и команда». <a href="https://otus.pw/YgOO/" rel="noopener noreferrer nofollow">Записаться</a><br><sub>разберём, как&nbsp;на&nbsp;практике распределяются роли в&nbsp;Scrum и почему процесс часто ломается не&nbsp;из‑за фреймворка, а&nbsp;из‑за его применения.</sub></p></li></ul><blockquote><p>Больше уроков собрали в <a href="https://otus.pw/Hj4Uz/" rel="noopener noreferrer nofollow">дайджесте</a>&nbsp;— можно выбрать темы под&nbsp;свою роль, стек и задачи на&nbsp;ближайший месяц. </p></blockquote> <a href="https://habr.com/ru/posts/1043568/?utm_campaign=1043568&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 08 Jun 2026 07:15:16 GMT</pubDate>
    <dc:creator><![CDATA[MaxRokatansky (OTUS)]]></dc:creator>
      
      <category><![CDATA[RabbitMQ]]></category><category><![CDATA[Kafka]]></category><category><![CDATA[брокеры сообщений]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[Minikube]]></category><category><![CDATA[Java]]></category><category><![CDATA[мониторинг]]></category><category><![CDATA[распределённые системы]]></category><category><![CDATA[AI-ассистент]]></category><category><![CDATA[ИИ-агенты]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Игры и игровые консоли (+4) — 22.05.2026 09:28]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1037980/</guid>
    <link>https://habr.com/ru/posts/1037980/?utm_campaign=1037980&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый проект <a href="https://github.com/EVV1E/waylandcraft" rel="noopener noreferrer nofollow">waylandcraft</a> - это полнофункциональный композитор Wayland полностью <a href="https://modrinth.com/mod/waylandcraft" rel="noopener noreferrer nofollow">интегрирован</a> в мод Fabric для Minecraft Java 26.1.2.</p><p>«Запускайте приложения и открывайте окна прямо в&nbsp;вашем мире Minecraft. Перетаскивайте данные из&nbsp;одного окна в&nbsp;другое. Закрепите видеоплеер на&nbsp;вашем HUD. Выбор за&nbsp;вами. Важно: этот мод работает только под&nbsp;Linux! MacOS и Windows не&nbsp;поддерживаются»,&nbsp;— пояснил автор проекта.</p><iframe id="6a101f710673a35a78882dbc" src="https://embedd.srv.habr.com/iframe/6a101f710673a35a78882dbc" class="embed_video embed__content" allowfullscreen="true"></iframe> <a href="https://habr.com/ru/posts/1037980/?utm_campaign=1037980&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 22 May 2026 06:28:44 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Wayland]]></category><category><![CDATA[minecraft]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @mathter — Java (+1) — 12.05.2026 17:17]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1034326/</guid>
    <link>https://habr.com/ru/posts/1034326/?utm_campaign=1034326&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class=""><img src="https://habrastorage.org/webt/85/37/34/8537345b2aea635ce55cb0529e0aa7a0.jpg"></figure><p>В предыдущих сериях был реализован простейший движок на основе&nbsp;HashMap, в которой сохраняются данные key -&gt; value, и в принципе была открыта дорога для написания сервера и клиента для тестов. Но я решил добавить в Space работу с распределенными  (XA) транзакциями.</p><p>Наличие такого механизма обязательно приведет к деградации производительности. Закономерно возникает вопрос: для чего это было сделано? Memifydb - это распределенная БД и она должна обеспечивать конкурентный доступ к данным обеспечивая их целостность. Что проку если она будет работать быстро, но её содержимое будет - хаос? Ведь деже при создании простого приложения для обработки данных в нескольких потоках используется synchronized в java (и пр. механизмы синхронизации).</p><p>Второй момент состоит в том что я всегда работал с транзакциями на стороне клиента, т.е. работал с менеджером транзакции (TransactionManager). Теперь же я писал сервис и пришлось иметь место с менеджером ресурсов (XAResource), что тоже интересно (не забываем что проект модельный и исследовательский).</p><p>Итак, транзакционность добавил, пока что на уровне RAM без сохранения данных в долговременную помять для отката/восстановления. Следующий шаг это написание самого сервера, который будет управлять Space’ами и обработкой клиентских запросов.</p><p>👉 Telegram: <a href="https://t.me/memifydb" rel="noopener noreferrer nofollow">https://t.me/memifydb</a> 👉 GitHub: <a href="https://github.com/yourname/memifydb" rel="noopener noreferrer nofollow">https://github.com/yourname/memifydb</a></p> <a href="https://habr.com/ru/posts/1034326/?utm_campaign=1034326&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 12 May 2026 14:17:25 GMT</pubDate>
    <dc:creator><![CDATA[mathter]]></dc:creator>
      
      <category><![CDATA[inmemory]]></category><category><![CDATA[database]]></category><category><![CDATA[database development]]></category><category><![CDATA[базы данных]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @vlade1k — Блог компании PVS-Studio (+1) — 08.05.2026 15:41]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1033094/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1033094/?utm_campaign=1033094&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Нововведения Java 26</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/0a3/494/abd/0a3494abd967c3d024f895996353ec3b.png" width="974" height="549"></figure><p>В марте 2026 года вышла Java 26. </p><p>Поскольку мы в PVS-Studio используем Java для разработки наших Java, JavaScript и TypeScript анализаторов, такая новость нами не могла быть пропущена. Мы выпустили статью, где рассмотрели основные изменения, которые эта версия с собой принесла. Так что давайте вместе посмотрим на <a href="https://pvs-studio.ru/ru/blog/posts/java/1370/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore&amp;utm_content=article" rel="noopener noreferrer nofollow">основные нововведения, появившиеся в Java 26</a>.</p> <a href="https://habr.com/ru/posts/1033094/?utm_campaign=1033094&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 08 May 2026 12:41:56 GMT</pubDate>
    <dc:creator><![CDATA[vlade1k (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[java26]]></category><category><![CDATA[новая версия]]></category><category><![CDATA[java]]></category><category><![CDATA[jep]]></category><category><![CDATA[jeps]]></category><category><![CDATA[нововведения]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @PvsTeam — Блог компании PVS-Studio (+2) — 07.05.2026 11:18]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1032420/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1032420/?utm_campaign=1032420&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Друзья, рады поделиться записью первого вебинара из цикла <strong>“Современный Gradle для Java-разработчика”</strong> 🔥</p><p>В первом вебинаре Егор Пиший, Java-разработчик в PVS-Studio, рассказал, зачем в современных проектах нужны модули и как они помогают масштабировать кодовую базу без хаоса. Вместе посмотрели, как устроен жизненный цикл Gradle и какие механизмы стоят за его скоростью и гибкостью.</p><iframe id="69fc4929aeeb010208e75f21" src="https://embedd.srv.habr.com/iframe/69fc4929aeeb010208e75f21" class="embed_video embed__content" allowfullscreen="true"></iframe><p>Посмотреть ещё можно тут: </p><ul><li><p><a href="https://pvs-studio.ru/ru/blog/video/11699/" rel="noopener noreferrer nofollow">наш сайт</a></p></li><li><p><a href="https://rutube.ru/video/4f6aebfdd96aa73a0293053bfde76171/" rel="noopener noreferrer nofollow">Rutube</a></p></li><li><p><a href="https://youtu.be/ZLk9DaIyI2U" rel="noopener noreferrer nofollow">YouTube</a></p></li></ul><p>А зарегистрироваться на следующие вебинары цикла <a href="https://pvs-studio.ru/ru/webinar/cycle/gradle/?utm_source=habr&amp;utm_medium=pvsteam&amp;utm_campaign=webinar&amp;utm_content=gradle" rel="noopener noreferrer nofollow">можно по этой ссылке</a>! </p> <a href="https://habr.com/ru/posts/1032420/?utm_campaign=1032420&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 07 May 2026 08:18:50 GMT</pubDate>
    <dc:creator><![CDATA[PvsTeam (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[java]]></category><category><![CDATA[gradle]]></category><category><![CDATA[вебинар]]></category><category><![CDATA[вебинары для разработчиков]]></category><category><![CDATA[лайвкодинг]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @VAGNAT — Проектирование и рефакторинг (+4) — 28.04.2026 10:43]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1028926/</guid>
    <link>https://habr.com/ru/posts/1028926/?utm_campaign=1028926&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Паттерны проектирования еще актуальны?</strong></p><p>Вокруг все чаще говорят, что ИИ скоро будет писать код за нас. Логичный вопрос — нужны ли тогда паттерны? Зачем разбираться в паттернах GoF, если нейросеть и так сгенерирует рабочий код по описанию?</p><p>У меня ощущение обратное.</p><p>Я плотно вошел в разработку в 2019 году. Переходил из 1С в .NET. Книги по паттернам GoF у меня были, но долго лежали как «книга на полке». Казалось, они оторваны от повседневных задач. Теорию вроде понимал, но не видел, где это реально применяется.</p><p>Все поменялось, когда я стал использовать ИИ как инструмент для обучения. Просил давать задачи, искать проблемы в решениях, объяснять, почему в одном месте уместен Strategy, а в другом лучше Mediator. Через практику и обсуждение паттерны перестали быть абстракцией.</p><p>Чем проще генерировать код, тем важнее понимать его форму и границы. Иначе не ускоришь разработку, а ускоришь накопление технического долга.</p><p>Из этого и вырос мой pet-project <a href="http://gofinsights.com" rel="noopener noreferrer nofollow">gofinsights.com</a>. Я делаю его тренажером по паттернам проектирования. Не просто «прочитал и забыл», а через практику, сравнение решений и постепенное распознавание типовых архитектурных ходов.</p><p>Сейчас там есть интерактивный квиз, где можно проверить базу и не перепутать Factory Method с Abstract Factory. Дальше хочу развивать проект в сторону более глубокого ИИ-разбора. Чтобы можно было не только узнавать паттерн, но и разбирать кодовые запахи, причины проблем и возможную эволюцию решений.</p><p>Как вы это видите? Паттерны проектирования все еще рабочая база для разработчика? Или с появлением ИИ они станут менее важны?</p> <a href="https://habr.com/ru/posts/1028926/?utm_campaign=1028926&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 28 Apr 2026 07:43:49 GMT</pubDate>
    <dc:creator><![CDATA[VAGNAT]]></dc:creator>
      
      <category><![CDATA[паттерны проектирования]]></category><category><![CDATA[паттерны программирования]]></category><category><![CDATA[шаблоны]]></category><category><![CDATA[тренажёр]]></category><category><![CDATA[java]]></category><category><![CDATA[python]]></category><category><![CDATA[csharp]]></category><category><![CDATA[php]]></category><category><![CDATA[go]]></category><category><![CDATA[шаблоны проектирования]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @andrey_chuyan — DevOps (+4) — 25.04.2026 13:18]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1027802/</guid>
    <link>https://habr.com/ru/posts/1027802/?utm_campaign=1027802&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<iframe id="69ec942542c0bc03ac2e960a" src="https://embedd.srv.habr.com/iframe/69ec942542c0bc03ac2e960a" class="embed_video embed__content" allowfullscreen="true"></iframe><p><strong>🌲 Открываем регистрацию на Дебаг Кемп</strong></p><p>Мы придумали формат, который давно хотели сами: выбираешься из города, два дня в сосновом лесу на Карельском перешейке — маршрут, костёр, мастер-классы по выживанию, нетворкинг без слайдов и питчей. Просто люди, с которыми интересно, и никакого Slack-а.</p><p><strong>📅 6–7 июня 2026 (выходные)</strong> <strong>👥 Всего 25 мест</strong> — маленький формат, это принципиально.</p><p>Цена растёт по мере приближения к дате. Оплатить можно частями через сплит → <a href="https://debug-skills.timepad.ru/event/3936231/#register" rel="noopener noreferrer nofollow">регистрация</a></p><p>Если вы <a href="https://vk.com/polnyistek?w=donut_payment-232485571&amp;levelId=2501" rel="noopener noreferrer nofollow">💎 практик сообщества</a> — скидка 15% применяется при регистрации автоматически. Ещё не практик, но думаете? Сейчас самый разумный момент.</p><p>👀 <a href="https://debugskills.ru/debug-camp/" rel="noopener noreferrer nofollow">Узнать больше</a> · 📝 <a href="https://debug-skills.timepad.ru/event/3936231/" rel="noopener noreferrer nofollow">Регистрация</a></p><p>Вопросы — в чат, мы там живём.</p> <a href="https://habr.com/ru/posts/1027802/?utm_campaign=1027802&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 25 Apr 2026 10:18:16 GMT</pubDate>
    <dc:creator><![CDATA[andrey_chuyan]]></dc:creator>
      
      <category><![CDATA[нетворкинг]]></category><category><![CDATA[оффлайн-мероприятие]]></category><category><![CDATA[кемп]]></category><category><![CDATA[тимбилдинг]]></category><category><![CDATA[выживание]]></category><category><![CDATA[карелия]]></category><category><![CDATA[разработчики]]></category><category><![CDATA[it-сообщество]]></category><category><![CDATA[конференция]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @mathter — Java (+1) — 24.04.2026 13:04]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1027474/</guid>
    <link>https://habr.com/ru/posts/1027474/?utm_campaign=1027474&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class=""><img src="https://habrastorage.org/webt/92/82/dd/9282dd5ae45a48669fadad41aba71224.png"></figure><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> и <a href="https://habr.com/ru/posts/1026026/" rel="noopener noreferrer nofollow">думаем о данных</a>.</p><p><strong>Взлетаем</strong>, создал репозиторий под проект <a href="https://github.com/mathter/memifydb.git" rel="noopener noreferrer nofollow">https://github.com/mathter/memifydb.git</a></p><p><strong>План</strong></p><p><strong>План общий такой:</strong></p><ul><li><p>Изначально строю некоторый каркас, который буду достраивать и наполнять содержанием. Это будет удобно для прототипирования.</p></li><li><p>Для работы с данными создам некоторый дополнительный уровнь абстракции, что бы не привязываться к <strong>конкретному формату данных/библиотеке</strong> и менять его налету для сравнения.</p></li></ul><p><strong>Сделано</strong></p><ul><li><p>Данные клиента будут храниться в <a href="https://github.com/mathter/memifydb/blob/main/space-api/src/main/java/io/github/mathter/memifydb/space/Space.java" rel="noopener noreferrer nofollow">space’ах</a> - это будет аналог таблиц в БД. Для начала будет только <a href="https://github.com/mathter/memifydb/blob/main/space-api/src/main/java/io/github/mathter/memifydb/space/KeyValueSpace.java" rel="noopener noreferrer nofollow">key-value space</a> что бы можно было подумать уже сейчас о WAL клиенской библиотеке для java и сетевом уровне в целом и конечно же о транзакциях.</p></li><li><p>Тестовая <a href="https://github.com/mathter/memifydb/blob/main/log-simple-impl/src/main/java/io/github/mathter/memifydb/log/simple/FileLog.java" rel="noopener noreferrer nofollow">реализация WAL</a>, которая в проекте будет называться <a href="https://github.com/mathter/memifydb/blob/main/log-api/src/main/java/io/github/mathter/memifydb/log/Log.java" rel="noopener noreferrer nofollow">Log</a>.</p></li></ul><p><strong>Run.</strong></p> <a href="https://habr.com/ru/posts/1027474/?utm_campaign=1027474&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 24 Apr 2026 10:04:56 GMT</pubDate>
    <dc:creator><![CDATA[mathter]]></dc:creator>
      
      <category><![CDATA[inmemory]]></category><category><![CDATA[database]]></category><category><![CDATA[database development]]></category><category><![CDATA[базы данных]]></category>
  </item>
  

	
  

  

  

    

  

  
  <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>
  

	
  

  

  

      

      

      

    
  </channel>
</rss>
