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

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

  <channel>
    <title><![CDATA[Все посты подряд / Качество кода / Хабр]]></title>
    <link>https://habr.com/ru/hubs/complete_code/posts/</link>
    <description><![CDATA[Качество кода – как Макконнелл завещал]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Tue, 28 Apr 2026 20:21:49 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[Пост @Andrey2008 — Блог компании PVS-Studio (+4) — 27.04.2026 10:12]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1028358/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1028358/?utm_campaign=1028358&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>РБПО по ГОСТ Р 56939—2024: вебинар №08 из 30 – Формирование и поддержание в актуальном состоянии правил кодирования</strong></p><p>Компания <a href="https://pvs-studio.ru/" rel="noopener noreferrer nofollow">ООО "ПВС"</a> совместно с <a href="https://mascom-uc.ru/" rel="noopener noreferrer nofollow">учебным центром "Маском"</a> провела цикл вебинаров, посвящённых разработке безопасного программного обеспечения (РБПО). Совместно с приглашёнными экспертами различных компаний мы рассмотрели 25 процессов, приведённых в ГОСТ Р 56939—2024.</p><p>Предлагаем сегодня вашему вниманию вебинар цикла, посвящённый процессу, описанному в разделе 5.8. – "<a href="https://pvs-studio.ru/ru/blog/video/11433/" rel="noopener noreferrer nofollow">Формирование и поддержание в актуальном состоянии правил кодирования</a>". <a href="https://youtu.be/vHZi4K4hMB4?si=l_k3R1hKrrTpnetZ" rel="noopener noreferrer nofollow">На YouTube</a>. <a href="https://files.pvs-studio.ru/media/presentations/27-08-2025.zip" rel="noopener noreferrer nofollow">Слайды</a>.</p><iframe id="69ef07e63c0662029423c33a" src="https://embedd.srv.habr.com/iframe/69ef07e63c0662029423c33a" class="embed_video embed__content" allowfullscreen="true"></iframe><p>Цели восьмого процесса по ГОСТ Р 56939—2024:</p><blockquote><p>Обеспечение эффективной и единообразной организации оформления и использования исходного кода в соответствии с предъявляемыми к ПО требованиями.</p></blockquote><p>Общее количество вебинаров — 30: каждому из 25 процессов ГОСТа посвящено по одному вебинару и 5 записано дополнительно на смежные темы. Запись всех вебинаров и подборка дополнительной информации доступна по ссылке: <a href="https://%D0%93%D0%9E%D0%A1%D0%A256939.%D0%A0%D0%A4" rel="noopener noreferrer nofollow">ГОСТ56939.РФ</a>.</p> <a href="https://habr.com/ru/posts/1028358/?utm_campaign=1028358&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 27 Apr 2026 07:12:31 GMT</pubDate>
    <dc:creator><![CDATA[Andrey2008 (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[гост р 56939]]></category><category><![CDATA[гост р 56939-2024]]></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>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @toxicmt — Программирование (+1) — 28.03.2026 20:14]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1016340/</guid>
    <link>https://habr.com/ru/posts/1016340/?utm_campaign=1016340&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Делаем мир чуть чуть лучше</strong></p><p>Представьте что вы упоролись по решению какой-то баги в вашем приложении и просидели час с агентом пытаясь разобраться в произошедшем. А в конце оказывается что это баг в какой-то внешней либе. По хорошему, в таких кейсах, стоит пойти в ишьюсы к проекту и написать туда о баге, но до появления агентов это было крайне лениво. Надо собрать всю инфу, правильно оформить, учесть правила конкретного репозитория. Мало кто захочет с этим возиться, но щас ситуация крайне поменялась.</p><p>Буквально недавно я так дебажил одну рубишную либу и выяснилось что там внутри есть косячки. Не долго думая, прямо в той же сессии я попросил агента собрать ишью дал линк на репу и потом просто скопировал это туда на гитхаб (наверное можно было попросить его сделать ишью автоматом, попробую так в следующий раз). Получилось очень обстоятельно с примерами кода, описанием того где ошибка. При желании можно было бы сразу пулреквест кинуть, но я не был уверен в какую сторону решит пойти автор либы. <a href="https://github.com/skryukov/rails_vite/issues/5" rel="noopener noreferrer nofollow">Вот кстати тот</a> ишьюс. И фикс был сделан буквально в тот же день.</p><p>В общем не ленитесь, помогайте разработчикам опенсорс либ, которые вы используете. Это и вам плюс в карму (и в портфолио) и благодарность людям, на которых держаться наши проекты</p> <a href="https://habr.com/ru/posts/1016340/?utm_campaign=1016340&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 28 Mar 2026 17:14:14 GMT</pubDate>
    <dc:creator><![CDATA[toxicmt]]></dc:creator>
      
      <category><![CDATA[опенсорс]]></category><category><![CDATA[агенты]]></category><category><![CDATA[спасибо не булькает]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @k8r4a7n2fg23k — IT-инфраструктура (+3) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1010540/</guid>
    <link>https://habr.com/ru/posts/1010540/?utm_campaign=1010540&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>«Просто добавь кнопку» и недели работы</strong></p><p>Однажды заказчик пришёл с&nbsp;задачей, которая звучала как&nbsp;пара часов работы <em>«Просто добавь кнопку&nbsp;— нажал, выгрузил данные, всё»</em>. Я открыла код и поняла, что&nbsp;эта кнопка стоит не&nbsp;пару дней, а&nbsp;недель&nbsp;— и это если повезёт..</p><p><strong>Сложнее всего оказалось не&nbsp;сделать, а&nbsp;объяснить так, чтобы услышали.</strong></p><p>С&nbsp;технической стороны всё понятно: сервис писался под&nbsp;дедлайн, архитектура не&nbsp;предусматривала роста, и каждое новое изменение тянет за&nbsp;собой минимум три соседних. Но&nbsp;заказчик смотрит на&nbsp;задачу и видит один экран. Кнопки ещё нет, но&nbsp;она&nbsp;же просто кнопка. Что&nbsp;тут может&nbsp;быть сложного?</p><p>Архитектурное объяснение я попробовала и оно не&nbsp;зашло. Слои, связи, зависимости: всё правильно, всё мимо.</p><p><strong>Что&nbsp;работает вместо «красивого кода»</strong></p><p>Я перестала объяснять как&nbsp;устроено и начала объяснять что&nbsp;произойдёт. Не <em>«тут монолитная структура без&nbsp;инверсии зависимостей»</em>, а&nbsp;конкретно:&nbsp;— эта кнопка затрагивает три модуля, которые никто не&nbsp;трогал два года&nbsp;— если что‑то сломается, то мы не&nbsp;узнаем сразу, потому что&nbsp;тестов нет&nbsp;— следующая фича после этой будет стоить столько&nbsp;же в&nbsp;лучшем случае.</p><p>Заказчик услышал третий пункт. Именно его.</p><p>Нетехнический человек воспринимает разработку примерно так: <em>«нажал кнопку → произошла магия → получил результат»</em>. Это не&nbsp;незнание&nbsp;— просто другая роль. Заказчик и не&nbsp;должен думать об&nbsp;архитектуре, это моя работа. Значит, говорить на&nbsp;его языке&nbsp;— тоже моя.</p><p><strong>Как&nbsp;я считаю стоимость следующей фичи</strong></p><p>Со временем сложился свой фреймворк. Не&nbsp;из&nbsp;учебника, а&nbsp;из&nbsp;разговоров, где меня не&nbsp;понимали, пока я не&nbsp;поменяла подход.</p><p>Три вещи, которые я оцениваю перед тем, как&nbsp;называть сроки: 1. <strong>Базовая сложность</strong>: сколько займёт в&nbsp;идеальных условиях, на&nbsp;нормальной архитектуре. 2. <strong>Архитектурный коэффициент</strong>&nbsp;— во&nbsp;сколько раз реальность дороже идеала. Код без&nbsp;тестов, с&nbsp;жёсткими связями между модулями&nbsp;— это 2-4× к&nbsp;оценке. Не&nbsp;абстракция: вот здесь нельзя менять, не&nbsp;затронув вот это. Рисую буквально на&nbsp;бумаге. 3. <strong>Риск‑налог</strong>&nbsp;— что&nbsp;может пойти не&nbsp;так. Что&nbsp;сломается, насколько&nbsp;быстро заметят, сколько займёт починка. Не&nbsp;чтобы напугать, а&nbsp;чтобы показать, что <em>«быстро»</em> и <em>«надёжно»</em> здесь в&nbsp;противоречии.</p><p>Когда эти три числа стоят рядом&nbsp;— разговор меняется. Заказчик видит, что&nbsp;не <em>«разработчик тормозит»</em>, а <em>«вот цена, вот риск, вот выбор»</em>.</p><p>Именно тогда и появляется разговор про&nbsp;рефакторинг. Не&nbsp;потому что «код некрасивый», а&nbsp;потому что&nbsp;каждая следующая фича будет дороже предыдущей, если ничего не&nbsp;менять.</p><p><strong>Что&nbsp;осталось в&nbsp;голове</strong></p><p>Техдолг&nbsp;— это не&nbsp;технический вопрос. Это финансовый.</p><p>Пока объясняешь его как&nbsp;технический&nbsp;— тебя не&nbsp;услышат. Как&nbsp;только переводишь в&nbsp;деньги, сроки и риски&nbsp;— начинают слышать.</p><p>Самое сложное не&nbsp;методология. Самое сложное&nbsp;— поймать момент, когда ты всё ещё говоришь на&nbsp;своём языке, а&nbsp;не&nbsp;на&nbsp;их. У&nbsp;меня ушло время, чтобы это почувствовать.</p><p><em>А&nbsp;вы как&nbsp;объясняете техдолг тем, кому важен результат, а&nbsp;не&nbsp;архитектура? Есть формулировка, которая сработала лучше всего?</em></p> <a href="https://habr.com/ru/posts/1010540/?utm_campaign=1010540&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 16 Mar 2026 09:23:36 GMT</pubDate>
    <dc:creator><![CDATA[k8r4a7n2fg23k]]></dc:creator>
      
      <category><![CDATA[управление проектом]]></category><category><![CDATA[оценка сложности]]></category><category><![CDATA[soft skills]]></category><category><![CDATA[работа с заказчиком]]></category><category><![CDATA[карьера в it]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @GarantexAi — Искусственный интеллект (+3) — 14.03.2026 10:51]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1010120/</guid>
    <link>https://habr.com/ru/posts/1010120/?utm_campaign=1010120&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>&nbsp;Claude Code: 3 фичи, которые стоит знать</strong>   </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/2ee/1e1/ad1/2ee1e1ad1c592b33bb04b0b53f5bbf05.png" width="657" height="283"></figure><p><strong>Opus 4.6 и контекст в 1 млн токенов</strong></p><p>Теперь включён по умолчанию. Миллион токенов — это примерно 750 000 слов или несколько крупных кодовых баз целиком. На практике это означает, что агент дольше «помнит» контекст задачи без деградации качества на длинных сеансах.</p><p>Для большинства задач разница с предыдущими лимитами несущественна. Но если вы работаете с большими монорепозиториями или длинными аналитическими сессиями — почувствуете.</p><p><strong>Три фичи, которые стоит знать</strong></p><p><strong><code>/btw</code>&nbsp;— вопросы на ходу</strong></p><p>Агент работает час, вы не прерываете его — просто пишете&nbsp;<code>/btw что такое этот класс?</code>. Он отвечает из копии контекста, основной поток не трогает. Работает через кеш — почти бесплатно.<br><br><strong><em>Почему это важно</em></strong></p><p>Раньше, если в середине часового сеанса агента нужно было что-то уточнить, вы открывали новый сеанс, пересоздавали весь контекст — и платили за это токены. Теперь Claude Code создаёт одноразовый снимок текущего состояния, отвечает на ваш вопрос и удаляет снимок. Основной агент ничего не знает и продолжает работу.</p><p><strong><code>/loop</code>&nbsp;— цикл до условия</strong></p><p>Запускает команду повторно, пока не выполнится условие. Например: «запускай тесты и фикси ошибки, пока все не пройдут». Без вашего участия.</p><p><strong>Agent Teams — параллельные агенты</strong></p><p>Несколько агентов работают одновременно и общаются друг с другом. Один пишет код, другой ревьюит, третий пишет тесты. Реально полезно, когда задача не имеет чёткого финального состояния.</p><p>Практически: спросили «почему здесь используется этот паттерн», получили ответ, не потеряли прогресс.</p><p><strong> Когда это реально нужно?</strong></p><p>Агенты буквально пишут сообщения друг другу: делятся находками, оспаривают решения. Это не маркетинговая метафора — в логах видно переписку.</p><p>Хорошо работает на задачах, где нельзя заранее точно сформулировать условия выполнения. Например: «сделай этот модуль надёжным» — агент по архитектуре, агент по тестированию и агент по документации работают параллельно и синхронизируются.</p><p><strong>Куда это всё движется</strong></p><p>Claude Code последовательно поглощает функциональность внешних инструментов. Сначала взял на себя управление контекстом, потом — параллелизацию. Сейчас добавляет циклическое выполнение и внутренние коммуникации между агентами.</p><p>У меня ощущение, что через год-два это будет единственный инструмент, который нужен для большинства задач разработки. Или конкуренты успеют ответить — посмотрим. А вы что думаете?<br><br>Если материал был полезен, проголосуйте пожалуйста, чтобы дать мне возможность писать полноценные гайды и статьи :)</p> <a href="https://habr.com/ru/posts/1010120/?utm_campaign=1010120&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 14 Mar 2026 07:51:16 GMT</pubDate>
    <dc:creator><![CDATA[GarantexAi]]></dc:creator>
      
      <category><![CDATA[claude code]]></category><category><![CDATA[ai]]></category><category><![CDATA[искусственный интеллект]]></category><category><![CDATA[llm]]></category><category><![CDATA[antropic]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @GlinkinIvan — Информационная безопасность (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1008062/</guid>
    <link>https://habr.com/ru/posts/1008062/?utm_campaign=1008062&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/eda/17c/7ea/eda17c7ea4759588eeffc6c8e73b06e5.png" width="2788" height="1670"></figure><p>Разговоры вокруг отечественного связного 💬 <a href="https://max.ru/" rel="noopener noreferrer nofollow">Макс</a> не унимаются с момента его официального выхода. Блогеры по всему миру "изучают" безопасность  приложения, выискивая, куда он "ходит" и какую "секретную" информацию передает. В основном, все инфоповоды крутятся вокруг изучения манифеста приложения и его разрешений в системе, не углубляясь в изучение сетевых пакетов, исходники и декомпилляцию. А я как раз тот ленивый инфобезник, который еще ни разу не высказался относительно данного вопроса, поэтому исправляюсь.</p><p>В прошлую пятницу на весь 🇷🇺 российский интернет прогремела новость: все фото из ваших чатов в Макс может увидеть любой человек по ссылке.</p><blockquote><p>Когда в личный чат или в папку «Избранное» в мессенджере загружается изображение, для него генерируется статичная гиперссылка. Ее можно найти в коде страницы в веб-версии Max. Эта ссылка открывается с других браузеров и устройств без авторизации в мессенджере - обнаружили пользователи. Более того, фото по ссылке останется в открытом доступе, даже если его удалить из переписки в Max.</p></blockquote><p>На лицо классический IDOR. Но если мы проанализируем ссылки на фотографии, которые генерирует Макс, мы обнаружим, что изображения по ним действительно доступны без авторизации. Часть адреса у разных изображений совпадает, однако они содержат различающиеся подстроки длиной не менее 21 символа (минимум 16^21 комбинаций), а значит получить доступ к таким изображениям простым перебором адресов невозможно. Более того, EDR и WAF вас уже на 1000 запросе за несколько секунд обнаружат и отправят отдыхать минут на 5.<br>Ну а про хранение файлов "закон Яровой" никто не отменял.</p><p>А знаете, где еще применяется такая технология? В недавно (октябрь 2024 года) заблокированном мессенджере Discord. Все медиа файлы из приложения можно открыть в исходном качестве по прямой ссылке без регистрации и смс (именно поэтому его многие использовали как файлообменник, а платформа ограничивала размер передаваемого файла 8 мегабайтами). И, о новость, если потом данный файл удалить, он все равно остается доступным по прямой ссылке (см. прилагаемое видео).</p><p>Возвращаясь к Максу, не могу не обратить внимание, что его разработчиком является крупнейший IT-гигант <a href="http://Mail.ru" rel="noopener noreferrer nofollow">Mail.ru</a>. Я лично принимал участие в тестировании его на безопасность в период 2020-2021 годах и могу с уверенностью сказать, что там более чем секьюрно. Кроме того, опыт в обеспечении безопасности ВК, ОК и других массовых продуктов у них уже в генах.</p><p>Более того, у Макса есть <a href="https://bugbounty.bi.zone/companies/max/" rel="noopener noreferrer nofollow">Bug Bounty </a>программа от <a href="http://Bi.Zone" rel="noopener noreferrer nofollow">Bi.Zone</a> и за некоторые уязвимости там выплачивают до 10 миллионов рублей:</p><blockquote><p>Получение доступа к приватной переписке определенных пользователей - 10 000 000 ₽<br>Получение доступа к местоположению определенных пользователей в реальном времени - 4 000 000 ₽<br>Получение доступа к телефонной книге определенных пользователей - 2 000 000 ₽</p></blockquote><p>За год существования программы, было реально найдено 13 багов, за которые суммарно выплатили 873 тысячи. При указанной выборке я могу сделать вывод, что Макс достаточно безопасен, раз никто пока не смог сорвать джек-пот.</p><p>Поэтому, не верьте всему тому, что пишут в интернете: делите все минимум на 10. Ну и конечно, что попадает в интернет - остается в интернете, поэтому не забывайте про цифровую гигиену.</p><p>🧠 Обязательно поделись с теми, кому это может быть полезно 💬 <a href="https://t.me/glinkinivan" rel="noopener noreferrer nofollow">Телеграм</a> | 💬 <a href="https://max.ru/join/Htn3rk5JAiZe0wsBPadSoHj7Y-P1uTuQnViRCssj70s" rel="noopener noreferrer nofollow">Max</a> | 📝 <a href="https://habr.com/ru/users/GlinkinIvan/" rel="noopener noreferrer nofollow">Хабр</a> | 💙 <a href="https://vk.com/glinkinivan" rel="noopener noreferrer nofollow">ВКонтакте</a> | ⚡️<a href="https://t.me/glinkinivan?boost" rel="noopener noreferrer nofollow">Бустануть канал</a></p> <a href="https://habr.com/ru/posts/1008062/?utm_campaign=1008062&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 09 Mar 2026 13:00:18 GMT</pubDate>
    <dc:creator><![CDATA[GlinkinIvan]]></dc:creator>
      
      <category><![CDATA[макс]]></category><category><![CDATA[max]]></category><category><![CDATA[мессенджер]]></category><category><![CDATA[discord]]></category><category><![CDATA[уязвимость]]></category><category><![CDATA[idor]]></category><category><![CDATA[дырка]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @shanker — Информационная безопасность (+4) — 07.03.2026 20:53]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1007772/</guid>
    <link>https://habr.com/ru/posts/1007772/?utm_campaign=1007772&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>А зачем покупаете WAF, который можно обойти?</strong></p><p>С таким вопросом разработчиков периодически сталкиваюсь.  Добавлю контекста. Работаю AppSec инженером в финтехе. Когда нахожу уязвимости — сообщаю разработчикам. Среди прочего - доношу мысль: если в данном случае можно смягчить потеницальные последствия угрозы через <abbr class="habraabbr" title="Web Application Firewall" data-title="&lt;p&gt;Web Application Firewall&lt;/p&gt;" data-abbr="WAF">WAF</abbr> — это не значит, что уязвимость не нужно исправлять в приложении. Нередко разработчики спорят. Примерный диалог:</p><blockquote><p>— Ну, есть же WAF — на нём и делайте фикс, зачем нам-то в код лезть? WAF — он же для того и нужен, чтоб уязвимости устранять.<br>— WAF — не панацея: на нём мы сделаем правило. Но это не значит, что в самом приложении не нужно устранять.<br>— Почему?<br>— Например, потому, что практически любой WAF можно обойти.<br>— <strong>А зачем покупаете WAF, который можно обойти?</strong></p></blockquote><p>Отвечаю так: потому что WAF пишут такие же разработчики, как Вы, и они тоже иногда ошибаются (как и все люди). Некоторые особо настырные разработчики желают доказательств, что WAF можно обойти. В целом я солидарен, что <a href="https://t.me/avleonovrus/814" rel="noopener noreferrer nofollow">практика "а ты докажи" в управлении уязвимостями - не очень хороша</a>. Но, если есть под рукой на что можно быстро сослаться - можно это сделать. Я ссылаюсь на <a href="https://habr.com/ru/articles/984632/" rel="noopener noreferrer nofollow">эту статью</a>.<br>В моей практике были случаи, когда WAF из-за сбоя переставал применять правила на несколько дней. Т.е. трафик через него шёл, сервис за WAF продолжал быть доступным. Но, правила на WAF не работали — будто их и нет.</p><p>Эта история в очередной раз показывает: насколько бывают различны в оценке ситуации разработчики и "безопасники". Более интересный вариант — когда разработчики считают, что только они могут решать: что является уязвимостью, а что — нет (подробнее об этом я писал в статье "<a href="https://habr.com/ru/articles/927672/" rel="noopener noreferrer nofollow">Как я зарегистрировал CVE и разозлил вендора</a>").</p> <a href="https://habr.com/ru/posts/1007772/?utm_campaign=1007772&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 07 Mar 2026 17:53:41 GMT</pubDate>
    <dc:creator><![CDATA[shanker]]></dc:creator>
      
      <category><![CDATA[waf]]></category><category><![CDATA[web application firewall]]></category><category><![CDATA[рбпо]]></category><category><![CDATA[безопасная разработка]]></category><category><![CDATA[безопасная инфраструктура]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AleksandraUvarova — Блог компании PVS-Studio (+4) — 26.02.2026 10:31]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1003816/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1003816/?utm_campaign=1003816&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как далеко видит lookup в C++?</strong><br> </p><figure class=""><img src="https://habrastorage.org/getpro/habr//post_images/657/405/45f/65740545f75e05d3d56140167ae64f25.png"></figure><p> Хорошей практикой в C++ считается размещение функций рядом с типами, для которых они предназначены. Однако, чтобы такой подход работал корректно, важно понимать механизмы поиска имён и знать, где можно размещать функции, не нарушая правил языка. </p><p>Совсем недавно мы <a href="https://pvs-studio.ru/ru/blog/posts/cpp/1321/" rel="noopener noreferrer nofollow">проверяли проект OpenCV</a> и нашли там довольно интересную ошибку. Рассмотрели её подробнее и написали новую статью специально для тех, кто хочет разобраться с <a href="https://pvs-studio.ru/ru/blog/posts/cpp/1347/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore&amp;utm_content=article" rel="noopener noreferrer nofollow">механизмом поиска имён в C++</a>, в частности с поиском имён по аргументам.</p> <a href="https://habr.com/ru/posts/1003816/?utm_campaign=1003816&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 26 Feb 2026 07:31:41 GMT</pubDate>
    <dc:creator><![CDATA[AleksandraUvarova (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[pvs-studio]]></category><category><![CDATA[с++]]></category><category><![CDATA[программирование]]></category><category><![CDATA[с++23]]></category><category><![CDATA[opencv]]></category><category><![CDATA[opensourse]]></category><category><![CDATA[качество кода]]></category><category><![CDATA[static analysis]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[lookup]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @runity — Блог компании Рунити (+4) — 12.02.2026 11:52]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/runity/posts/995688/</guid>
    <link>https://habr.com/ru/companies/runity/posts/995688/?utm_campaign=995688&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Автоматизация без сборки с нуля: n8n теперь в Рег.облаке</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/200/70f/9e5/20070f9e5b7ce62eade2d62963113e06.png" width="2048" height="1152"></figure><p>В Рег.облаке появился готовый облачный образ n8n — open-source платформы для автоматизации процессов и интеграции сервисов.</p><p>n8n позволяет в визуальном интерфейсе связать API, CRM, базы данных, SaaS-сервисы и AI-инструменты без разработки с нуля. Образ разворачивается автоматически при создании сервера: Ubuntu 24.04 LTS, зависимости, SSL и домен уже настроены. После запуска можно сразу работать через web-интерфейс по HTTPS.</p><p>Сценарии использования — от обработки заявок и создания задач в CRM до CI/CD-триггеров, уведомлений о сбоях и AI-автоматизации с LLM и RAG. Можно подключить PostgreSQL и MySQL, в том числе через DBaaS.</p><p>Образ бесплатный — оплачиваются только ресурсы сервера по почасовой модели. Масштабирование доступно без переустановки.</p><p>Подробнее о доступных конфигурациях — на<a href="https://reg.cloud/cloud/servers?utm_source=habt&amp;utm_medium=post&amp;utm_campaign=n8n" rel="noopener noreferrer nofollow"> сайте Рег.облака</a>.</p> <a href="https://habr.com/ru/posts/995688/?utm_campaign=995688&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 12 Feb 2026 08:52:47 GMT</pubDate>
    <dc:creator><![CDATA[runity (Рунити)]]></dc:creator>
      
      <category><![CDATA[рег.облако]]></category><category><![CDATA[n8n]]></category><category><![CDATA[n8n ai]]></category><category><![CDATA[n8n установка]]></category><category><![CDATA[n8n docker]]></category><category><![CDATA[n8n ai agent]]></category><category><![CDATA[образы]]></category><category><![CDATA[сценарии]]></category><category><![CDATA[облачный сервис]]></category><category><![CDATA[low-code]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Raicon — Управление разработкой (+4) — 06.02.2026 22:06]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/993770/</guid>
    <link>https://habr.com/ru/posts/993770/?utm_campaign=993770&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Сколько я плачу за AI инструменты и как они у меня взаимосвязаны</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/32e/172/66a/32e17266a2ab3310cbc15bd38493bbd8.png" width="1240" height="1280"></figure><p>Claude — мой основной AI инструмент уже как 9 месяцев — Плачу за него 100$</p><p>Состоит из Claude Desktop, Claude Code UI и Claude Code CLI</p><p>Если хочу работать в приятном UI с текстом → Claude Desktop<br>Если работаю локально с кодом → Claude Code CLI<br>Если хочу поправить код с телефона → Claude Code UI</p><p><strong>Коротко что все это такое</strong><br> • Claude Desktop — как чат GPT, но с поддержкой MCP + Skills и еще всякими штуками<br> • Claude Code — UI для работы с вашим репозиторием<br> • Claude Code CLI — Command Line Interface Агент. По сути это микс Claude Desktop + Claude Code по функционалу, но без интерфейса и работает внутри вашего компьютера. Мое любимое развлечение последних двух месяцев</p><p>Claude Code CLI — пока что самый прокачанный на рынке CLI агентов</p><p>———</p><p><strong>OpenAI, который chatGPT — за него плачу 20$</strong></p><p> • ChatGPT UI — им почти перестал пользоваться, только ради генерации картинок иногда залетаю. Они после недавнего релиза стали их генерировать на уровне с Nano Banana<br> • Codex UI(Аналог Claude Code) — UI для работы с вашим репозиторием<br> • Codex CLI (Аналог Claude Code CLI) — чуть менее прокачанный как Command Line Interface, но зато их модель Codex 5.2 Extra-high уделывает OPUS 4.5 в плане UI дизайна и продумывания/рефакторинга сложных вещей</p><p>Но в Codex CLI вроде как отсутствует аналог ESC + ESC из Claude Code CLI для откатки написанного кода, без него тяжко жить 🍌</p><p>OpenAI недавно признали то, что их гонка с Claude за тем, чтобы сделать лучший кодинг агент, привела к тому, что 5.2 потеряли человечность в общении и стали сильно более директивными и сухими</p><p>Это помогает при работе с кодом, но общаться с ней сложнее</p><p>———</p><p><strong>Экосистема Google — плачу 8$ за Plus подписку</strong></p><p>Google у меня для трёх вещей: картинки через Nano Banana, NotebookLM и Antigravity для просмотра кода. Халява за 8$</p><p> • Nano Banana, иногда Veo 3 для генерации картинок / видео — лучшие генераторы картинок / видео на рынке<br> • NotebookLM — прикольный RAG UI, всем советую потестить<br> • Antigravity — Fork VS Code по типу Cursor, но с продвинутым Agent Workflow. Есть доступ к Gemini Pro + почему-то Claude моделям. Плюс Antigravity может генерировать картинки сразу вам в код через Nano Banana, такой вот бесшовный воркфлоу<br></p><p>Ни Gemini UI ни Gemini CLI я особо не пользуюсь. Мне они кажутся сильно сырыми по сравнению с Claude Code | GPT</p><p>———</p><p><strong>Как выглядит мой воркфлоу</strong></p><p>Claude Desktop для задач, где мне хочется иметь приятный UI и фичи именно Desktop интерфейса. Например написание постов, создание табличек, графиков и всего такого — те задачи, где CLI сильно проседает по UX</p><p>Claude Code UI почти не использую, только когда нужно изменить репозиторий с телефона, например на улице или в поездке</p><p>Claude Code CLI — мой day to day tool для работы с кодом. Пишу на Opus 4.5. Для сложных задач прошу создать промпт для Codex.</p><p>Antigravity юзаю для просмотра кода и папок, иногда запускаю Gemini 3 pro как третье мнение</p><p>Codex, как я уже и говорил, требует особого навыка общения. так как она может думать по 40 минут и перековырять вам весь код, но зато она у меня всегда находит те корнер кейсы, которые не находит ни Opus 4.5 ни Gemini 3 pro. По стилю общения вы будто общаетесь с Сеньёром, который вас презирает, зато резалт пушка</p><p>———</p><p><strong>Прикольные фишки, которые я постоянно применяю</strong></p><ol><li><p>Через Antigravity прошу генерировать изображения со вставкой сразу в код, получается бесшовный воркфлоу Prompt =&gt; Generation =&gt; Insertion</p></li><li><p>Используй Claude CLI Opus 4.5 для Day to Day задач</p></li><li><p>Используй Codex CLI xhigh для задач на рефакторинг или поиск corner cases, он сильно тщательнее это делает</p></li><li><p>Планируя новую фичу, проси Claude создать локальный MD с планом, а затем Codex xhigh + Gemini 3 pro пусть покритикует этот план и напишет ниже свои комменты</p></li><li><p>Не забывай про кнопку ESC + ESC в Claude Code CLI</p></li><li><p>Claude Code CLI в начале сессии загружает себе <a href="http://CLAUDE.MD" rel="noopener noreferrer nofollow">CLAUDE.MD</a>, Codex загружает в себя <a href="http://AGENTS.MD" rel="noopener noreferrer nofollow">AGENTS.MD</a>, а Gemini — <a href="http://GEMINI.MD" rel="noopener noreferrer nofollow">GEMINI.MD</a>. </p></li><li><p>Команда /context покажет контекст текущей сессии, старайся держать его как можно ниже<br> Good context engineering means</p></li></ol> <a href="https://habr.com/ru/posts/993770/?utm_campaign=993770&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 06 Feb 2026 19:06:22 GMT</pubDate>
    <dc:creator><![CDATA[Raicon]]></dc:creator>
      
      <category><![CDATA[ai]]></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[ии-модель]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Ibragim_bad — Качество кода — 06.02.2026 14:21]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/993608/</guid>
    <link>https://habr.com/ru/posts/993608/?utm_campaign=993608&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/7fd/1db/b58/7fd1dbb58d19ba23357f4db869885c13.webp" alt="ClaudeCode делает 135к коммитов ежедневно" title="ClaudeCode делает 135к коммитов ежедневно" width="1456" height="833"><div><figcaption>ClaudeCode делает 135к коммитов ежедневно</figcaption></div></figure><p>На глаза попалась интересная статистика, решил поделиться. </p><p>4% всех коммитов на GitHub теперь делает Claude Code, интересно посчитать сколько делается еще другими агентами тоже. При сохранении текущей траектории к концу 2026 года доля коммитов, написанных агентами, может вырасти до 20%.&nbsp;</p> <a href="https://habr.com/ru/posts/993608/?utm_campaign=993608&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 06 Feb 2026 11:21:50 GMT</pubDate>
    <dc:creator><![CDATA[Ibragim_bad]]></dc:creator>
      
      <category><![CDATA[агенты]]></category><category><![CDATA[claude code]]></category><category><![CDATA[кодовые агенты]]></category><category><![CDATA[llm]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @MTorn — Качество кода (+4) — 20.01.2026 19:12]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/987140/</guid>
    <link>https://habr.com/ru/posts/987140/?utm_campaign=987140&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>А так ли надежен AI от Google?</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/d74/8b6/b9b/d748b6b9bacac72484638051a40d8baf.png" width="661" height="136"></figure><p>Я публично веду исследование и собираю статистику причин провалов игровых проектов.&nbsp;  Часто, как первичную точку для анализа того или иного игрового проекта я использую Google. </p><p>Однако, сегодня google меня немного удивил. На мой запрос: "<strong>What were the key issues with civilization vii game at the release</strong>"? Вот что сегодня,<strong> 20.01.2026</strong> выдал Google:</p><blockquote><p><em>AI Overview</em></p><p><em>Sid Meier's Civilization VII is scheduled for release on&nbsp;</em><strong><em>February 11, 2025</em></strong><em>&nbsp;[1, 2]. As of today, </em><strong><em>January 20, 2026</em></strong><em>, the game has not been released, and therefore, it is impossible to identify key issues from its actual launch.&nbsp;</em></p></blockquote><p>Однако, скорректировав запрос с уточнением "What were the key issues with civilization vii game at the release<strong> in 2025</strong>", я уже получил более разумный ответ:</p><blockquote><p><em>AI Overview</em></p><p><em>Sid Meier's Civilization VII&nbsp;faced a rocky, "mixed" reception upon its </em><strong><em>February 2025</em></strong><em> release, with many players describing it as unfinished and in a "rough" state. The launch was marked by complaints regarding&nbsp;fundamental gameplay changes, a poor user interface (UI), and missing quality-of-life features&nbsp;that left many long-term fans disappointed.&nbsp;</em></p></blockquote><p>Обратил внимание, что часто от ИИ ожидают больше, чем он сейчас может дать. Тем более не стоит считать информацию формируемую генеративным AI полностью достоверной и не подлежащей проверке. Проводите кроссвалидацию с первоисточниками того, что вы получаете от генеративных нейросетей в форме утверждений.</p><p>Ранее я разбирал риски присущие ИИ в статье "<strong><a href="https://habr.com/ru/articles/780018/" rel="noopener noreferrer nofollow">Риски, присущие работе искусственного интеллекта</a></strong>".</p><p>Удачи в построении эффективных и устойчивых процессов.</p><p>С уважением,</p><p>Максим Торнов</p><p>P.S. Если вы заметили опечатку или неточность, буду искренне благодарен за сообщение об этом в личные сообщения.</p> <a href="https://habr.com/ru/posts/987140/?utm_campaign=987140&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 20 Jan 2026 16:12:12 GMT</pubDate>
    <dc:creator><![CDATA[MTorn]]></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[данные]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @nin-jin — $mol (+3) — 15.01.2026 23:41]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/985676/</guid>
    <link>https://habr.com/ru/posts/985676/?utm_campaign=985676&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><br><strong><a href="https://youtu.be/psugXzYCa1E" rel="noopener noreferrer nofollow">ESLint, Prettier и что не так с насаждением единого стиля</a></strong></p><iframe id="69694f84a9ac3d23668a7d14" src="https://embedd.srv.habr.com/iframe/69694f84a9ac3d23668a7d14" class="embed_video embed__content" allowfullscreen="true"></iframe><p>Упомянутые материалы:</p><ul><li><p><a href="https://mol.hyoo.ru/#!section=docs/=5t5qb6_8ofefk" rel="noopener noreferrer nofollow">Автоформатирование</a></p></li><li><p><a href="https://mol.hyoo.ru/#!section=docs/=cz8cl9_h5n5ys" rel="noopener noreferrer nofollow">Отступы</a></p></li><li><p><a href="https://mol.hyoo.ru/#!section=docs/=yhm6e9_l5h97i" rel="noopener noreferrer nofollow">Форматирование имён</a></p></li></ul><p><em>+</em><a href="https://boosty.to/hyoo" rel="noopener noreferrer nofollow"><em> Копилка благодарностей</em></a></p> <a href="https://habr.com/ru/posts/985676/?utm_campaign=985676&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 15 Jan 2026 20:41:08 GMT</pubDate>
    <dc:creator><![CDATA[nin-jin]]></dc:creator>
      
      <category><![CDATA[eslint]]></category><category><![CDATA[prettier]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Andrey2008 — Блог компании PVS-Studio (+3) — 15.01.2026 14:54]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/985518/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/985518/?utm_campaign=985518&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Мы иногда во внутреннем чате обмениваемся фрагментами кода с неочевидными ошибками, которые обнаруживаются с помощью PVS-Studio в каком-нибудь открытом проекте. Мол, кто быстро сообразит, что не так с кодом?</p><p>Вчера коллега поделился вот таким <a href="https://github.com/serenedb/serenedb/blob/249fcf21c327b8df19e1ab900b3a53dcd7229b3d/libs/app/options/parameters.h#L202" rel="noopener noreferrer nofollow">фрагментом</a> кода из проекта SereneDB:</p><pre><code class="cpp">template &lt;typename T&gt;
struct NumericParameter : public Parameter {
&nbsp; using ValueType = T;
&nbsp; ....
&nbsp; std::string name() const override {
&nbsp;&nbsp;&nbsp; if constexpr (std::is_same_v&lt;ValueType, int16_t&gt;) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "int16";
&nbsp;&nbsp;&nbsp; } else if constexpr (std::is_same_v&lt;ValueType, uint16_t&gt;) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "uint16";
&nbsp;&nbsp;&nbsp; } else if constexpr (std::is_same_v&lt;ValueType, int32_t&gt;) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "int32";
&nbsp;&nbsp;&nbsp; } else if constexpr (std::is_same_v&lt;ValueType, uint32_t&gt;) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "uint32";
&nbsp;&nbsp;&nbsp; } else if constexpr (std::is_same_v&lt;ValueType, int64_t&gt;) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "int64";
&nbsp;&nbsp;&nbsp; } else if constexpr (std::is_same_v&lt;ValueType, uint64_t&gt;) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "uint64";
&nbsp;&nbsp;&nbsp; } else if constexpr (std::is_same_v&lt;ValueType, size_t&gt;) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "size";
&nbsp;&nbsp;&nbsp; } else if constexpr (std::is_same_v&lt;ValueType, double&gt;) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "double";
&nbsp;&nbsp;&nbsp; } else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static_assert("unsupported ValueType");
&nbsp;&nbsp;&nbsp; }
&nbsp; }
&nbsp; ....
};</code></pre><p>Признаюсь честно, я два раза прочитал этот фрагмент, но так и не увидел ошибку. И засчитал себе поражение. Раз так, думаю, это достойно публикации в канал, чтобы и вы могли испытать свою внимательность :)</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/123/8a8/c29/1238a8c2905e2a9b9e34046cfd58d52c.png" alt="Попробуйте найти сами" title="Попробуйте найти сами" width="580" height="500"><div><figcaption>Попробуйте найти сами</figcaption></div></figure><p><strong>Ответ:</strong></p><p>Анализатор PVS-Studio выдаёт предупреждение <a href="https://pvs-studio.ru/ru/docs/warnings/v591/" rel="noopener noreferrer nofollow">V591</a> Non-void function should return a value. parameters.h 222</p><p>На первый взгляд предупреждение странное и смахивает на ложное срабатывание, ведь не может быть, что функция закончила работу, не вернув значение с помощью оператора <code>return</code>. Если выбирается ветка <code>else</code>, то там <code>static_assert</code>, и код просто не должен скомпилироваться. Во всех остальных случаях есть <code>return "что-то";</code>.</p><p>Но есть нюанс!</p><p>Ещё раз посмотрите на эту строчку:</p><pre><code class="cpp">static_assert("unsupported ValueType");</code></pre><p><a href="https://en.cppreference.com/w/cpp/language/static_assert.html" rel="noopener noreferrer nofollow"><code>static_assert</code></a> используется неправильно: пропущен <code>bool-constexpr</code>. Вернее, строковый литерал неявно конвертируется в значение <code>true</code>, и <code>static_assert</code> никогда не прервёт компиляцию. В итоге else-ветка функции ничего не возвращает, и её поведение будет не определено для всех специализаций <code>NumericParameter</code>, кроме указанных ранее в цепочке <code>if constexpr</code>.</p><p>Правильный вариант:</p><pre><code class="cpp">static_assert(false, "unsupported ValueType");</code></pre> <a href="https://habr.com/ru/posts/985518/?utm_campaign=985518&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 15 Jan 2026 11:54:55 GMT</pubDate>
    <dc:creator><![CDATA[Andrey2008 (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[ошибки программистов]]></category><category><![CDATA[ошибки в коде]]></category><category><![CDATA[баги]]></category><category><![CDATA[pvs-studio]]></category><category><![CDATA[SereneDB]]></category><category><![CDATA[open source]]></category><category><![CDATA[assert]]></category><category><![CDATA[c++]]></category><category><![CDATA[си++]]></category><category><![CDATA[опечатки]]></category>
  </item>
  

	
  

  

  

    

  

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

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @toxicmt — Программирование (+1) — 11.12.2025 17:09]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/975802/</guid>
    <link>https://habr.com/ru/posts/975802/?utm_campaign=975802&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Слои валидации</strong></p><p>Когда говорят "валидация", обычно подразумевают любое правило, которое должно защитить систему от неправильных данных. Но внутри этого большого слова скрываются разные типы и цели проверок, которые еще и выполняются на разных уровнях приложения. Разберем:</p><p><strong>Валидация на клиенте (если он есть)</strong></p><p>Сюда входит формат данных, обязательность полей и так далее. Чуть сложнее, когда надо проверять, например, уникальность имени пользователя или емейла, в этом случае придется ждать отправки или делать запросы на бекенд во время заполнения. Главное что надо знать про эту валидацию, то что она вспомогательная. Клиент всегда можно обойти и сделать запрос напрямую. Дублирование как ни крути, хотя и важно для UX.</p><p><strong>Структурная валидация</strong></p><p>Это валидация, которая, обычно, происходит на уровне самого фреймворка или в самом начале цикла обработки запроса. Для этого данные прогоняются через валидаторы json схемы, которая в идеале генерируется из openapi спеки. В самых деревянных случаях ручками (так делать не надо). Что важно понимать, это не доменная валидация (бизнес правила). Да тут можно проверить формат, наличие/отсутствие, но нельзя и не правильно пытаться проверять уникальность, выполнение каких-то условий, например количества денег на счету и тому подобное.</p><p>Кстати с точки зрения кодов ответа, на этом уровне несовпадение со схемой воспринимается не как ошибка валидации, а как неверный запрос с неверной структурой, а это код ответа 400.</p><p><strong>Доменная валидация</strong></p><p>Это уже уровень бизнес правил. Такая валидация включает в себя любые правила, которым должны соответствовать данные с точки зрения бизнес-логики приложения. Уникальность email, баланс на счету, ограничения переходов - все это относится к доменному слою, и проверяется глубже, после прохождения проверки структуры. Во фреймворках это слой, который часто реализуется внутри моделей (если они есть). В любом случае такие валидации должны быть вынесены в какой-то свой слой, который можно переиспользовать для разных точек входа, асинхронной обработки и т.п.</p><p>Доменные проверки, как и клиентские могут дублироваться, если завязаны на консистентность базы данных. Например во многих фреймворках (с orm) есть валидация на уникальность, которая делает sql-запрос, но в документации у этого валидатора всегда написано, что это не надежно (из-за конкурентности) и в таких ситуациях обязательно делать индексы в базе данных.</p><p>В случае провала такой валидации, в api принято возвращать код 422</p><p><strong>Валидация на уровне базы данных</strong></p><p>Все предыдущие уровни не могут дать 100% гарантий, особенно учитывая, что данные в базе обновляются далеко не только по запросам снаружи. Поэтому есть вещи, которые обязательно делать на уровне базы данных. Сюда относятся уникальные индексы, внешние ключи (если делаете их), nullable, ограничение по длине и т.д. Технически многие базы данных позволяют писать кастомные валидации, которые соблазнительно использовать как доменную валидацию. Не надо этого делать :)</p><p><strong>Проверка корректности данных</strong></p><p>Это тип валидации "ни туда ни сюда", потому что он может выполняться в разных слоях, в зависимости от используемого стека. К таким проверкам относится подтверждение пароля или, например, емейла. С точки зрения бизнес-логики, этой части вообще не существует, она есть только на уровне форм, потому что все давно привыкли так писать (хотя необходимость под вопросом). При этом ни в базе, ни в дальнейшей работе оно никак не используется и вообще это не данные, которые куда-то сохраняются.</p><p>Подобные проверки делают в первую очередь на клиенте (и на этом можно было бы остановиться). Внутри бека их располагают в слое форм (есть далеко не во всех фреймворках), либо некоторые фреймворки типа rails для простоты пихают такой валидатор в модели, хотя семантически это неверно.</p><p>Больше про разработку в моем телеграм-канале&nbsp;<a href="https://t.me/orgprog" rel="noopener noreferrer nofollow">Организованное программирование</a></p> <a href="https://habr.com/ru/posts/975802/?utm_campaign=975802&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 11 Dec 2025 14:09:29 GMT</pubDate>
    <dc:creator><![CDATA[toxicmt]]></dc:creator>
      
      <category><![CDATA[валидация данных]]></category><category><![CDATA[валидация форм]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Denis-KD — Веб-разработка (+3) — 08.12.2025 00:01]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/974292/</guid>
    <link>https://habr.com/ru/posts/974292/?utm_campaign=974292&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Участие в нескольких проектах снижает результаты работы — так ли это?</p><p>На одной из конференций прозвучал тезис: заказчику необходимо держать аутсорс-команду full-time. Потому что, работая на нескольких проектах одновременно, разработчики меньше погружаются в контекст каждой задачи, что в итоге сказывается на качестве кода и проекта в целом.</p><p>Была высказана и противоположная точка зрения, но хочется услышать мнение именно лидов и разработчиков, основанное на опыте.</p><p>Почему спрашиваю?</p><p>Люди, не связанные с разработкой, часто видят процессы иначе. Любой штатный сотрудник, например, в маркетинге или продукте, обычно ведёт несколько проектов и в день решает десятки разноплановых задач: от подготовки рекламной кампании и согласования креативов до контроля бюджета и аналитики. И сотрудники успешно справляются с этой нагрузкой, переключаясь между задачами.</p><p>Вопрос к сообществу:</p><p>Правда ли, что разработчик, участвующий в нескольких проектах part-time, будет менее эффективен, допустит больше багов и в целом ухудшит качество релизов? Или это миф, и всё зависит от процессов, коммуникации и личной организованности?</p> <a href="https://habr.com/ru/posts/974292/?utm_campaign=974292&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 07 Dec 2025 21:01:54 GMT</pubDate>
    <dc:creator><![CDATA[Denis-KD]]></dc:creator>
      
      <category><![CDATA[разработка]]></category><category><![CDATA[программирование]]></category><category><![CDATA[программисты]]></category><category><![CDATA[качество кода]]></category><category><![CDATA[аутсорс]]></category><category><![CDATA[full-time]]></category><category><![CDATA[Part-time]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @php7 — Программирование (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/974178/</guid>
    <link>https://habr.com/ru/posts/974178/?utm_campaign=974178&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Этот финт сэкономит вам время и нервы</p><figure class=""><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/e0b/d54/bc3/e0bd54bc3f66018aaa0ca839dbd90000.png"></figure><p>Хочу написать о финте, который позволит вам сохранить нервы и сэкономить время. Правда некоторые (многие, почти все) впадают в ступор от него. Поэтому тут использована&nbsp;КДПВ&nbsp;с&nbsp;<a href="https://habr.com/ru/articles/894748/" rel="noopener noreferrer nofollow">поста</a>. Я наверно чувак слева.</p><p>А именно добавление&nbsp;первым условием if единицы:</p><pre><code class="php">if (1
&nbsp; &nbsp; &amp;&amp; $cond1
&nbsp; &nbsp; &amp;&amp; $cond2
&nbsp; &nbsp; &amp;&amp; $cond3
)</code></pre><p>Использование финта дает нам возможность:<br>1. Быстро выключать фичу заменой 1 на 0:</p><pre><code class="php">if (0
&nbsp; &nbsp; &amp;&amp; $cond1
&nbsp; &nbsp; &amp;&amp; $cond2
&nbsp; &nbsp; &amp;&amp; $cond3
)</code></pre><p>2. Быстро выключать любое условие в PhpStorm через горячие клавиши:</p><pre><code class="php">if (1
//&nbsp; &nbsp; &amp;&amp; $cond1
&nbsp; &nbsp; &amp;&amp; $cond2
&nbsp; &nbsp; &amp;&amp; $cond3
)</code></pre><p>Без этого финта&nbsp;мы не можем быстро выключить первое условие.<br>Нам приходится делать&nbsp;примерно такую фигню, манипулируя&nbsp;с двумя строками и целясь в &amp;&amp;:</p><pre><code class="bash">if (
&nbsp; &nbsp;&nbsp;/*$cond1
&nbsp; &nbsp; &amp;&amp;*/ $cond2
&nbsp; &nbsp; &amp;&amp; $cond3
)</code></pre><p>Или такую:</p><pre><code class="bash">if (
&nbsp; &nbsp;&nbsp;$cond2
&nbsp; &nbsp; &amp;&amp; $cond3
)</code></pre><p>3. Быстро добавлять новое первое условие:</p><pre><code class="bash">if (1
&nbsp; &nbsp;&nbsp;&amp;&amp; $cond2
&nbsp; &nbsp; &amp;&amp; $cond3
)</code></pre><p>легко превращается в:</p><pre><code class="php">if (1
&nbsp; &nbsp;&nbsp;&amp;&amp; $cond1 // в изменениях одна строка
&nbsp; &nbsp;&nbsp;&amp;&amp; $cond2
&nbsp; &nbsp; &amp;&amp; $cond3
)</code></pre><p>4. Быстро дублировать любое условие.</p><p>5. Быстро менять порядок условий.</p><p>6. Также у нас будет чистый diff git-а при удалении/добавление первого условия.<br>Тут должен быть рисунок удаления с финтом и без, рисунок добавления с финтом и без.<br>Также при конфликте у нас будет более простое его решение, если нужно просто добавить оба условия.</p><p>Данный финт сродни правилу хорошего тона добавлять после последнего элемента массива запятую.<br>Это дает нам возможность при добавлении работать только с одной строкой. Добавлять горячими&nbsp;клавишами дублирования строк, в diff опять же будет только 1 строка, а также при конфликте&nbsp;слияний просто применяем обе строки и не нужно проставлять запятые, а то код упадет.</p> <a href="https://habr.com/ru/posts/974178/?utm_campaign=974178&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 07 Dec 2025 12:34:02 GMT</pubDate>
    <dc:creator><![CDATA[php7]]></dc:creator>
      
      <category><![CDATA[нервы]]></category><category><![CDATA[оптимизация]]></category><category><![CDATA[чистый код]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @blognaumen — Блог компании NAUMEN (+3) — 01.12.2025 16:33]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/naumen/posts/972096/</guid>
    <link>https://habr.com/ru/companies/naumen/posts/972096/?utm_campaign=972096&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Со временем у каждого разработчика появляется свой набор маленьких правил, которые работают лучше любых инструкций. Матвей из команды разработки сервисов на базе SMP поделился пятью привычками, которые помогают ему держать код аккуратным и читаемым.</p><p><strong>1. Давать осмысленные имена сразу же</strong></p><p>Хорошие названия переменных, функций и классов экономят время всей команде: код проще читать, легче понимать и поддерживать. А еще чем меньше вопросов «что делает эта функция?» или «что содержит переменная?», тем лучше.</p><p><strong>2. Декомпозировать код и избегать вложенности</strong></p><p>if внутри if или for внутри for путают: каждое разветвление создает еще одну ветку, которую приходится держать в голове. Лучше разбить логику на небольшие части — код становится прозрачнее и надежнее.</p><p><strong>как не надо:</strong></p><pre><code>функция заказать_пиццу(адрес):
  если адрес_валиден(адрес):
    если у_ресторана_ингредиенты():
      если клиент_может_платить():
        печать "Пицца заказана!"
      иначе:
        печать "Недостаточно денег"
    иначе:
      печать "Нет ингредиентов"
  иначе:
    печать "Адрес некорректный"</code></pre><p><strong>как надо:</strong></p><pre><code>функция заказать_пиццу(адрес):
  если не адрес_валиден(адрес):
    печать "Адрес некорректный"
    вернуть
  
  если не у_ресторана_ингредиенты():
    печать "Нет ингредиентов"
    вернуть
  
  если не клиент_может_платить():
    печать "Недостаточно денег"
    вернуть
  
  печать "Пицца заказана!"</code></pre><p><strong>3. Регулярно делать рефакторинг</strong></p><p>Подходы и стандарты меняются, команда учится новому и растет, а код устаревает. Регулярный рефакторинг помогает поддерживать код актуальным и облегчает жизнь новым разработчикам, которые, возможно, уже пробовали новые подходы в работе.</p><p><strong>4. Настроить линтер и форматер</strong></p><p>Линтер — статический анализатор кода, который следит за определенным стилем написания кода. Так как у каждого из нас свой подход, нам нужен «инструмент-судья», который беспристрастно оценит оформление кода. Форматер помогает автоматически исправить код и привести его к единому виду.&nbsp;</p><p><strong>5. Комментировать только неочевидную бизнес-логику</strong></p><p>Комментарии полезны, если они объясняют то, что нельзя понять из кода. Например, когда понимаем, что участок кода содержит особенность бизнес-логики, которая еще не ясна новому сотруднику. Но важно помнить, что избыток пояснений превращает понятный код в мешанину из кода и комментариев. Принцип простой: объясняем редкие, действительно сложные места и не трогаем остальное.</p> <a href="https://habr.com/ru/posts/972096/?utm_campaign=972096&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 01 Dec 2025 13:33:21 GMT</pubDate>
    <dc:creator><![CDATA[blognaumen (NAUMEN)]]></dc:creator>
      
      <category><![CDATA[читаемый код]]></category><category><![CDATA[рефакторинг]]></category><category><![CDATA[линтер]]></category><category><![CDATA[форматер]]></category><category><![CDATA[советы разработчику]]></category><category><![CDATA[привычки программирования]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @toxicmt — Программирование (+2) — 21.11.2025 19:41]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/968998/</guid>
    <link>https://habr.com/ru/posts/968998/?utm_campaign=968998&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Почему нужно использовать DTO</strong></p><p>Data Transfer Object, термин, который для разработчиков на статических языках является чем-то самим разумеющимся, но вот остальные его могут не знать (даже если пользуются). Хотя в эпоху интеграций, фронтенд-бекенд, сервис-сервис, очереди, это крайне важная конструкция.</p><p>DTO это очень промежуточный объект между моделью в вашем коде и данными, которые вы отдаете наружу или принимаете от внешней системы.</p><ul><li><p>Модель =&gt; DTO =&gt; json/protobuf/sql...</p></li><li><p>json/protobuf/sql... =&gt; DTO =&gt; Модель</p></li></ul><p>Нафига? Почему не сразу преобразовывать из, допустим, json в нашу модель или наоборот? Тем более во всех экосистемах есть механизмы, которые позволяют упаковывать любые объекты, задавая правила преобразования через метаданные, аннотации или еще как-то. Пример из Java:</p><pre><code class="java">@Entity
public class User {
    @Id
    private Long id;
    @JsonIgnore              // приходится скрывать
    private String passwordHash;
    @JsonProperty("created_at")
    private LocalDateTime createdAt;

    // getters/setters ...
}

var json = new ObjectMapper().writeValueAsString(dto);</code></pre><p>Существует масса причин, почему это плохая идея. Для начала, это банальное нарушение MVC архитектуры. Модель начинает знать как о представлении, о том какие поля надо выдавать наружу, какие нет, как их переименовывать и так далее. Если это кажется натянутым, то вот вам реальные последствия.</p><p>Одна и та же сущность для внешнего мира редко представляется одним способом. В зависимости от задачи, это может быть один набор полей или другой. Как это разрулить? Дальше, здесь плохо контролируется процесс, легко может быть такое, что новое поле автоматически попало наружу, хотя вы этого не планировали, но забыли его исключить. А если нужны вычисляемые поля или другое представление (всегда в датах)? В такой ситуации модель будет наполняться доп свойствами и методами, которые готовят доп данные для преобразования, что ведет к сильному загрязнению кода. Что из этого относится к бизнес-части, а что к представлению? Проблема.</p><p>DTO позволяют отделить представление от модели в коде, создавая по сути промежуточный слой. Имея его, вы можете независимо развивать свою модель и API для взаимодействия с ним. И да, это один из аспектов MVC, конкретно Model-View.</p><p>Готовые DTO гораздо легче чем модели конвертировать в типы на TS если у вас есть такая потребность. Например мы наши DTO (используем Alba), превращаем в типы TS с помощью готового инструмента (Typelizer). С моделями так легко не получится.</p><p>За это конечно придется заплатить. В проекте появится папка, с большим количеством файлов. Но это с лихвой компенсирует все описанные выше проблемы. DTO очень простые и для их создания далеко не всегда надо с нуля писать классы. В той же java они генерируются с помощью mapstruct, в других языках свои механизмы.</p><p>Но это только базовая история. Если мы еще подключаем инструменты генерации из sql (как в go) или openapi как везде, то те самые DTO создаются вообще автоматически на основе описаний.</p><pre><code class="sql">INSERT INTO links (original_url, short_name)
VALUES (sqlc.arg(original_url), sqlc.arg(short_name))
RETURNING *;</code></pre><p>DTO:</p><pre><code class="go">type CreateLinkParams struct {
	OriginalUrl string `json:"original_url"`
	ShortName   string `json:"short_name"`
}</code></pre><p>Причем для update будет создана своя структура:</p><pre><code class="go">type UpdateLinkParams struct {
	OriginalUrl string `json:"original_url"`
	ShortName   string `json:"short_name"`
	ID          int64  `json:"id"`
}</code></pre><p>Здесь отличается только id, но в реальных кейсах, отличий в создании или обновлении одной сущности обычно значительно больше, поэтому количество DTO тут становится еще больше.</p><p>DTO, кстати, должны быть имутабельны, иначе туда потечет логика</p><p>Больше про разработку в моем телеграм-канале&nbsp;<a href="https://t.me/orgprog" rel="noopener noreferrer nofollow">Организованное программирование</a></p> <a href="https://habr.com/ru/posts/968998/?utm_campaign=968998&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 21 Nov 2025 16:41:28 GMT</pubDate>
    <dc:creator><![CDATA[toxicmt]]></dc:creator>
      
      <category><![CDATA[dto]]></category><category><![CDATA[mvc]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @feeelin — Блог компании PVS-Studio (+4) — 20.11.2025 16:16]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/968500/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/968500/?utm_campaign=968500&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как анализировать C и C++ код без привязки к сборочной системе на Windows</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/2a3/1b3/c4a/2a31b3c4aa29b658a0ef399b8fb35217.png" width="1600" height="902"></figure><p>Код, написанный на C и C++, может использоваться для самых разных целей. И под каждые из этих целей есть свои инструменты сборки. Например, при разработке программного обеспечения для встраиваемых систем используются специальные компиляторы и сборочные системы.</p><p>Иногда бывает так, что появляется целый "зоопарк" самописных скриптов сборки, а его последний "смотритель" уволился ещё в прошлом году (играет Гражданская Оборона — "Зоопарк").</p><p>Хотелось бы всё равно как-то анализировать такой код без необходимости разбираться в хрупкой и непонятной системе сборки. Что же делать?</p><p>На самом деле, решение есть! Смысл взаимодействия анализатора со сборочной системой состоит в том, чтобы получить необходимую для анализа информацию. Но получить её можно и другим способом: из запущенного процесса компиляции.</p><p>В <a href="https://pvs-studio.ru/ru/blog/posts/cpp/1313/" rel="noopener noreferrer nofollow">новой статье</a> посмотрим, как воспользоваться этим механизмом для ОС Windows в анализаторе PVS-Studio, и &nbsp;как сделать его использование в процессе разработки удобным.</p> <a href="https://habr.com/ru/posts/968500/?utm_campaign=968500&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 20 Nov 2025 13:16:47 GMT</pubDate>
    <dc:creator><![CDATA[feeelin (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[статический анализ]]></category><category><![CDATA[C++]]></category><category><![CDATA[компиляторы]]></category><category><![CDATA[pvs-studio]]></category><category><![CDATA[мониторинг компиляции]]></category><category><![CDATA[сборочная система]]></category><category><![CDATA[C]]></category><category><![CDATA[static analysis]]></category>
  </item>
  

	
  

  

  

      

      

      

    
  </channel>
</rss>
