<?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>Thu, 23 Jul 2026 08:22:28 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) — 02.07.2026 10:44]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1054702/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1054702/?utm_campaign=1054702&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>РБПО по ГОСТ Р 56939—2024: вебинар №29 из 30 — Системы с конструктивной информационной безопасностью (ГОСТ Р 72118—2025)</strong></p><p>Предлагаю вашему вниманию запись вебинара, где мы разбираем безопасную разработку ПО. Мы добрались до дополнительных (бонусных) вебинаров цикла. Рассмотрим "<a href="https://pvs-studio.ru/ru/blog/video/11596/" rel="noopener noreferrer nofollow">Системы с конструктивной информационной безопасностью</a>". <a href="https://youtu.be/u-V6c95mTpo?si=08odQMXb59RCGWT3" rel="noopener noreferrer nofollow">На YouTube</a>. <a href="https://files.pvs-studio.ru/media/presentations/18-02-2026--2-.zip" rel="noopener noreferrer nofollow">Слайды</a>.</p><iframe id="6a46158fabbdb97370f21ec0" src="https://embedd.srv.habr.com/iframe/6a46158fabbdb97370f21ec0" class="embed_video embed__content" allowfullscreen="true"></iframe><p>С помощью приглашённого эксперта Екатерины Рудиной, аналитиком департамента перспективных технологий "Лаборатории Касперского", мы разобрались, в чём сходство и различие таких систем с безопасным ПО, как соотносятся создание систем с КИБ и разработка безопасного ПО, чем полезен в работе специалистов по ИБ новый ГОСТ Р 72118—2025 "Защита информации. Системы с конструктивной информационной безопасностью. Методология разработки".</p><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><p><strong>Методика ВУ и НДВ в ПО приведена в соответствие с ГОСТ Р 56939—2024</strong></p><p>Материалы будут полезны всем, кто знакомится с темой РБПО и заинтересован во внедрении зрелых подходов в работу по созданию и сопровождению качественных программных продуктов. Материал по ГОСТ Р 56939—2024 весьма актуален, так как 12 мая 2026 утверждена обновлённая "Методика ВУ и НДВ в ПО". См. заметку "<a href="https://pvs-studio.ru/ru/blog/posts/1382/" rel="noopener noreferrer nofollow">Методика выявления уязвимостей и недекларированных возможностей — 2026</a>".</p><p><strong>НЕкурс про РБПО</strong></p><p>Суммарное время предлагаемых к изучению вебинаров составляет около 50 часов. Это достаточно большая задача, поэтому мы решили помочь и разбили материалы на отдельные <a href="https://pvs-studio.ru/ru/blog/posts/1378/" rel="noopener noreferrer nofollow">уроки по РБПО</a>. Возможно, так вам будет проще усваивать материал, а интерфейс позволяет отмечать, с чем вы уже ознакомились.</p> <a href="https://habr.com/ru/posts/1054702/?utm_campaign=1054702&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 02 Jul 2026 07:44:54 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[ГОСТ Р 72118]]></category><category><![CDATA[ГОСТ Р 72118-2025]]></category><category><![CDATA[методология разработки]]></category><category><![CDATA[проектирование по]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Andrey2008 — Блог компании PVS-Studio (+4) — 25.06.2026 10:48]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1051686/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1051686/?utm_campaign=1051686&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>РБПО по ГОСТ Р 56939—2024: вебинар №27 из 30 — PVS-Studio Atlas — новая платформа контроля качества кода</strong></p><p>Предлагаю вашему вниманию запись вебинара, где мы разбираем безопасную разработку ПО. Мы добрались до дополнительных (бонусных) вебинаров цикла. Рассмотрим "<a href="https://pvs-studio.ru/ru/blog/video/11588/" rel="noopener noreferrer nofollow">PVS-Studio Atlas — новая платформа контроля качества кода</a>". <a href="https://youtu.be/7mbxpGMPbhI?si=sZas9GVQXEyy5FJm" rel="noopener noreferrer nofollow">На YouTube</a>. <a href="https://files.pvs-studio.ru/media/presentations/11-02-2026.zip" rel="noopener noreferrer nofollow">Слайды</a>.</p><iframe id="6a3ccfcc3b954272d3f3a357" src="https://embedd.srv.habr.com/iframe/6a3ccfcc3b954272d3f3a357" class="embed_video embed__content" allowfullscreen="true"></iframe><p>В ходе бонусного вебинара команда PVS-Studio представила новый продукт — PVS-Studio Atlas, предназначенный для работы с результатами анализа кода: просмотра, аналитики, разметки и формирования отчётов для сертификационных лабораторий и ФСТЭК.</p><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><p><strong>Методика ВУ и НДВ в ПО приведена в соответствие с ГОСТ Р 56939—2024</strong></p><p>Материалы будут полезны всем, кто знакомится с темой РБПО и заинтересован во внедрении зрелых подходов в работу по созданию и сопровождению качественных программных продуктов. Материал по ГОСТ Р 56939—2024 весьма актуален, так как 12 мая 2026 утверждена обновлённая "Методика ВУ и НДВ в ПО". См. заметку "<a href="https://pvs-studio.ru/ru/blog/posts/1382/" rel="noopener noreferrer nofollow">Методика выявления уязвимостей и недекларированных возможностей — 2026</a>".</p><p><strong>PVS-Studio — статический анализатор кода для поиска критических и типовых ошибок</strong></p><p>Также приглашаю всех познакомиться с нашим статическим анализатором <a href="https://pvs-studio.ru/ru/pvs-studio/" rel="noopener noreferrer nofollow">PVS-Studio</a>, который может закрыть не только 10-й процесс ГОСТ Р 56939, но и будет полезен по другим направлениям:</p><ol><li><p>Обучение сотрудников (п.5.2). Формирование у программистов понимание антипаттернов и уязвимых конструкций, что улучшает их техническую экспертизу;</p></li><li><p>Моделирование угроз и разработка описания поверхности атаки (п.5.7). Дополняет процесс, выявляя потенциальные уязвимости, которые формируют поверхность атаки;</p></li><li><p>Экспертиза исходного кода (п.5.9). Позволяет усилить проверку стороннего кода, который команда включает в проект. Например, его можно использовать для выбора сторонних библиотек, оценивая качество их кода;</p></li><li><p>Поиск уязвимостей в программном обеспечении при эксплуатации (п.5.24). Можно просматривать ранее отключённые предупреждения PVS-Studio с целью дополнительного выявления дефектов в коде.</p></li></ol><p><strong><a href="https://pvs-studio.ru/ru/pvs-studio/download/?utm_source=website&amp;utm_medium=pvs&amp;utm_campaign=manual&amp;utm_content=RBPO_GOST_56939_main_ru" rel="noopener noreferrer nofollow">Скачать PVS-Studio</a>.</strong></p><p>Основные характеристики:</p><ul><li><p>Поддерживает: C, C++, C#, Java, (скоро Go, JavaScript, TypeScript).</p></li><li><p>Совместим с ГОСТ Р 71207—2024 (Статический анализ кода).</p></li><li><p>Может применяться для РБПО согласно ГОСТ Р 56939—2024.</p></li><li><p>Включён в Реестр российского ПО: запись № 9837.</p></li><li><p>Удовлетворяет требованиям к статическим анализаторам, приведённых метеорическом документе ЦБ "Профиль защиты" – <a href="https://pvs-studio.ru/ru/blog/video/11591/" rel="noopener noreferrer nofollow">Статический анализ кода в методическом документе ЦБ РФ "Профиль защиты"</a>.</p></li><li><p>Полная информацию: <a href="https://pvs-studio.ru/ru/blog/posts/cpp/1335/" rel="noopener noreferrer nofollow">Статический анализатор кода PVS-Studio в 2026: ГОСТ Р 71207, ГОСТ Р 56939, приказ ФСТЭК №117</a>.</p></li></ul> <a href="https://habr.com/ru/posts/1051686/?utm_campaign=1051686&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 25 Jun 2026 07:48:07 GMT</pubDate>
    <dc:creator><![CDATA[Andrey2008 (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[гост р 56939]]></category><category><![CDATA[гост р 56939-2024]]></category><category><![CDATA[гост р 71207]]></category><category><![CDATA[профиль защиты]]></category><category><![CDATA[рбпо]]></category><category><![CDATA[pvs-studio]]></category><category><![CDATA[фстэк]]></category><category><![CDATA[информационная безопасность]]></category><category><![CDATA[статический анализ кода]]></category><category><![CDATA[гост 71207-2024]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Rombneromb — Блог компании X5 Tech (+4) — 18.06.2026 12:41]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/X5Tech/posts/1049024/</guid>
    <link>https://habr.com/ru/companies/X5Tech/posts/1049024/?utm_campaign=1049024&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Где заканчивается vibe и начинается инженерия</strong></p><p>ИИ уже в ежедневной разработке. <strong>Cursor, Claude Code, Copilot</strong> и другие инструменты помогают писать код, собирать прототипы, проверять гипотезы и быстрее двигаться от идеи к работающему решению. Правда, для этого нужно перенастроить инженерный процесс и ответить на важные вопросы.</p><p>❓ Кто отвечает за качество сгенерированного кода?<br>🧪 Как проверять, который написал не только человек?<br>🚀 Как ускорение разработки меняет внутренние процессы?</p><p>Что делать с безопасностью, если, по данным Veracode, 45% проверенных образцов AI-generated code не прошли security-тесты и получили уязвимости из OWASP Top 10?</p><p><strong>25 июня в Сфере X5 в Парке Горького</strong> проведём первый митап серии <strong>AI &amp; ML Talks</strong>. Он будет посвящён теме <strong>«Vibe Coding: новая разработка или новый техдолг?»</strong></p><p>Со спикерами из Альфа-Банка, X5 Tech и X5 Digital обсудим, что уже происходит в командах: где заканчивается «vibe» и начинается инженерия, какие ИИ-инструменты реально помогают разработчикам, а что пока остаётся демкой. Отдельно поговорим о качестве, безопасности, ревью и о том, насколько большие компании готовы пускать ИИ-код в продакшен.</p><p>🎤 В программе <strong>три доклада</strong>, <strong>Hot Battle</strong> на спорный тезис с голосованием зала и <strong>нетворкинг под открытым небом</strong>.</p><p>👥 Митап будет полезен разработчикам любого стека, тимлидам, AI-early adopters и всем, кто уже использует ИИ-инструменты в работе или только разбирается, как встроить их в свой процесс.</p><p>🗓 <strong>Встречаемся 25 июня в 18:30</strong> на площадке <strong>«Сфера X5»</strong> в Парке Горького.</p><p>🔗 <a href="https://u.to/gKGaIg" rel="noopener noreferrer nofollow">Регистрация</a></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/aba/e78/dc8/abae78dc8a356ee4741502c20107e4d9.jpg" alt="Первый митап серии AI &amp; ML Talks посвящённый теме «Vibe Coding: новая разработка или новый техдолг?»" title="Первый митап серии AI &amp; ML Talks посвящённый теме «Vibe Coding: новая разработка или новый техдолг?»" width="2560" height="1280"><div><figcaption>Первый митап серии <strong>AI &amp; ML Talks </strong>посвящённый теме «Vibe Coding: новая разработка или новый техдолг?»</figcaption></div></figure> <a href="https://habr.com/ru/posts/1049024/?utm_campaign=1049024&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 18 Jun 2026 09:41:21 GMT</pubDate>
    <dc:creator><![CDATA[Rombneromb (X5 Tech)]]></dc:creator>
      
      <category><![CDATA[vibe coding]]></category><category><![CDATA[ии в разработке]]></category><category><![CDATA[AI coding tools]]></category><category><![CDATA[cursor]]></category><category><![CDATA[claude code]]></category><category><![CDATA[copilot]]></category><category><![CDATA[ai-generated code]]></category><category><![CDATA[техдолг]]></category><category><![CDATA[качество кода]]></category><category><![CDATA[ai ml talks]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dmvasiliev — Блог компании Doubletapp (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/doubletapp/posts/1040508/</guid>
    <link>https://habr.com/ru/companies/doubletapp/posts/1040508/?utm_campaign=1040508&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Агентские скиллы: как применить их в разработке</strong></p><p>Привет, меня зовут Дима Васильев, я бэкенд-разработчик в <a href="https://doubletapp.ai/?utm_source=habr&amp;utm_medium=post&amp;utm_campaign=agent_skills" rel="noopener noreferrer nofollow">Doubletapp</a>. В этом тексте коротко расскажу, как эффективно управлять кодовыми ассистентами с помощью агентских скиллов. </p><p>Ассистенты уже умеют читать репозиторий, править файлы и запускать команды, но им часто не хватает контекста команды: как оформлять задачи, какие проверки запускать, как работать со стендами и где нужно подтверждение. Для этого и нужны агентские скиллы.&nbsp;</p><p>Скилл — это инструкция для ИИ-помощника: когда её применять, по каким шагам действовать, какие шаблоны и команды использовать. В открытой спецификации Agent Skills скилл обычно оформляется как папка с <code>SKILL.md</code>; рядом могут лежать скрипты, справки и шаблоны.</p><p>Подход уже поддерживают разные кодовые ассистенты. GitHub Copilot работает с agent skills в режиме агента, Copilot CLI и облачном агенте. Codex поддерживает скиллы в командной строке, расширении и приложении. Claude Code тоже работает со скиллами через <code>SKILL.md</code>. Поэтому речь не про один инструмент, а про общий способ описывать повторяемые действия команды рядом с кодом.</p><p><strong>Кейс 1. Описание проделанной работы</strong></p><p>Разработчик закончил задачу, а дальше её должны подхватить тестировщики, аналитики или другие разработчики. Часто в задаче остаётся короткое «сделал», хотя нужно больше контекста.</p><p>Можно сделать скилл «описать изменения». Он смотрит на изменения в коде, коммиты и описание задачи, а потом формирует выжимку: что изменилось, какие модули затронуты, как проверить результат, есть ли риски, миграции, настройки или флаги.</p><p>Такой скилл помогает не забывать важные детали и делает передачу задачи более предсказуемой.</p><p><strong>Кейс 2. Онбординг новых разработчиков</strong></p><p>Проектные скиллы полезны для онбординга. В них можно описать, как поднять окружение, как запускать тесты, как оформлять ветки и коммиты, где смотреть логи и какие архитектурные правила нельзя нарушать.</p><p>Новый разработчик может спросить помощника: «помоги поднять проект» или «подготовь задачу к сдаче». Помощник ответит с учётом проектных правил, а не общими советами. Это не отменяет документацию, но снижает количество одинаковых вопросов.</p><p><strong>Кейс 3. Надстройка над Terraform</strong></p><p>Другой пример — сложные инструменты. Допустим, команде нужен Terraform для стендов, но не все хорошо с ним знакомы. Реальных знаний Terraform скилл не заменит: всё равно важно понимать состояние, план изменений, ресурсы и последствия удаления инфраструктуры.</p><p>Но для повседневной работы можно сделать понятные действия поверх Terraform:</p><ul><li><p><code>Init stand</code> — подготовить стенд;</p></li><li><p><code>Update stand</code> — применить изменения;</p></li><li><p><code>Destroy stand</code> — удалить стенд.</p></li></ul><p>Под капотом ассистент выполняет нужные команды: инициализирует Terraform, выбирает окружение, строит план, показывает изменения, просит подтверждение перед опасными действиями и реагирует на ошибки.</p><p>Главное здесь — не просто удобство, а безопасность. В скилле можно прописать: перед применением изменений показать план, перед удалением стенда запросить отдельное подтверждение, не выполнять опасные команды молча и не использовать непроверенные переменные окружения. Так команда получает понятный интерфейс к сложному инструменту, но сохраняет контроль.</p><p><strong>Что это даёт</strong></p><p>Главная польза скиллов в том, что командные знания становятся частью проекта. Их можно обсуждать и улучшать так же, как код. Это мост между «ИИ просто помогает писать код» и «ИИ помогает соблюдать процессы команды»: оформление задач, проверки, инфраструктура, отчёты, онбординг и документация.</p><p><strong>Где посмотреть готовые примеры</strong></p><p>Сторонние скиллы стоит читать как чужой код: внутри могут быть скрипты и команды. Особенно внимательно стоит смотреть на скиллы, которые запускают команды.</p><p>Полезные материалы и репозитории:</p><ul><li><p><a href="https://agentskills.io/specification" rel="noopener noreferrer nofollow">Agent Skills specification</a></p></li><li><p><a href="https://github.com/openai/skills" rel="noopener noreferrer nofollow">OpenAI skills</a></p></li><li><p><a href="https://github.com/anthropics/skills" rel="noopener noreferrer nofollow">Anthropic skills</a></p></li><li><p><a href="https://github.com/github/awesome-copilot" rel="noopener noreferrer nofollow">GitHub Awesome Copilot</a></p></li><li><p><a href="https://github.com/hashicorp/agent-skills" rel="noopener noreferrer nofollow">HashiCorp agent skills</a></p></li></ul><p>Для начала достаточно взять один небольшой процесс, описать его в <code>SKILL.md</code> и положить рядом с кодом.</p> <a href="https://habr.com/ru/posts/1040508/?utm_campaign=1040508&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 01 Jun 2026 12:02:10 GMT</pubDate>
    <dc:creator><![CDATA[dmvasiliev (Doubletapp)]]></dc:creator>
      
      <category><![CDATA[кодовые ассистенты]]></category><category><![CDATA[ai-ассистенты]]></category><category><![CDATA[ai-ассистент]]></category><category><![CDATA[ai-инструменты]]></category><category><![CDATA[ai-программирование]]></category><category><![CDATA[агенты]]></category><category><![CDATA[open source]]></category><category><![CDATA[ai-агенты]]></category><category><![CDATA[llm]]></category><category><![CDATA[llm-агент]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @tatapstar — Качество кода — 17.05.2026 12:29]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1036060/</guid>
    <link>https://habr.com/ru/posts/1036060/?utm_campaign=1036060&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Вы тоже заметили как просто стало внедрять кодогенерацию? </p><p>Агент пишет алгоритм генерации под любые условия и задачи. Вам только нужно задачу правильно поставить. И вуаля теперь вы имеете скрипт который генерирует или редактирует любой бойлерплейт (в заданных алгоритмом рамках конечно же). </p><p>И поручить агенту реализацию код-гена один раз намного дешевле чем ту же задачу по написанию бойлерплейта ему же и поручать под каждое изменение. </p> <a href="https://habr.com/ru/posts/1036060/?utm_campaign=1036060&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 17 May 2026 09:29:32 GMT</pubDate>
    <dc:creator><![CDATA[tatapstar]]></dc:creator>
      
      <category><![CDATA[llm]]></category><category><![CDATA[генератор]]></category><category><![CDATA[фреймворк]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @evgeny1709 — Хакатоны (+3) — 13.05.2026 10:42]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1034528/</guid>
    <link>https://habr.com/ru/posts/1034528/?utm_campaign=1034528&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Чем заменить Cursor на корпоративном ноуте</p><p>Последнюю неделю я пытаюсь выжить, совмещая основную работу с хакатоном. По идее, вывозить такую двойную нагрузку должен помогать <a href="https://s-link.debug-leg.ru/7H4hAc4" rel="noopener noreferrer nofollow">spec-кодинг</a>. Обычно для этого я просто открываю Cursor, но на работе его юзать нельзя (секьюрность), запрет на отправку кода во внешние API и всё такое. А писать всё руками после ИИ-ассистентов уже физически больно.</p><p>Пошел искать open-source альтернативы, чтобы можно было секьюрно spec-кодить через локальные и корпоративные LLM. <a href="https://s-link.debug-leg.ru/scLL69D" rel="noopener noreferrer nofollow">Эксперименты с KiloCode</a> с треском провалились, ну не нравится он мне. В итоге обновил стек на рабочем Маке и собрал такой сетап:</p><p>1️⃣ IDE Void - форк VS Code. Накатил туда все Java/Kotlin аддоны, подрубил MCP Atlassian, и теперь Qwen3-Coder-480B пытается писать код за меня. Как генератор - 🔥 . Правда, с Kotlin у LLM всё ещё не так гладко, как с Python или JS, поэтому генерирую я в Void, а ревьюить и дебажить всё равно ухожу в родную IDEA.</p><p>2️⃣ browserOs - форк Chromium со встроенным ИИ-чатом (аналог Comet от Perplexity, но работает с любыми LLM по API). Продукт местами сыроват, но главная фича реализована достойно. Самая большая боль - это дебильный рыжий логотип с собакой. Мой мозг отказывается ассоциировать это с браузером, и при переключении через Cmd+Tab я вечно не могу его найти.</p><p>Забавно, что на самом хакатоне я сейчас пилю инструмент, который решает похожие корпоративные боли enterprise-аналог NotebookLM. Суть простая: закидываешь в диалог с корпоративной LLM ссылки на внутреннюю Jira, Confluence или TestOps, а ИИ всё это переваривает и помогает по работе. Дали доступ к мощным моделям типа нового DeepSeek-V4, и результаты прям огонь.</p><p>И вот смотрю я на свой новый рабочий сетап и понимаю: апка, которую я делаю на хакатоне, идеально ложится в этот локально-корпоративный стек. Особенно если упаковать её в десктоп.</p><p>А может вообще вкатиться с ней в свой первый open-source?</p><p><a href="https://s-link.debug-leg.ru/EdHTvmg" rel="noopener noreferrer nofollow">Дебаж 🐞с ноги 🦶</a></p> <a href="https://habr.com/ru/posts/1034528/?utm_campaign=1034528&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 13 May 2026 07:42:38 GMT</pubDate>
    <dc:creator><![CDATA[evgeny1709]]></dc:creator>
      
      <category><![CDATA[ide]]></category><category><![CDATA[void]]></category><category><![CDATA[браузер]]></category><category><![CDATA[ии]]></category><category><![CDATA[qwen]]></category><category><![CDATA[deepseek]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Raicon — Искусственный интеллект (+4) — 11.05.2026 20:23]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1033862/</guid>
    <link>https://habr.com/ru/posts/1033862/?utm_campaign=1033862&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>На протяжении последних 3 месяцев активной работы с Claude Code Терминалом я постоянно дорабатывал свой Status Line</p><p>И вот, считаю, что он практически идеален</p><p>Это одна строка внизу терминала, которая показывает всё, что обычно приходится держать в голове или проверять руками. И многое из того, что интерфейсный клод код не показывает</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/c0e/948/a36/c0e948a367f5f440484a968f7dfa83e5.png" width="1280" height="636"></figure><p><strong>Кому полезно</strong><br>Если вы реально работаете в Claude Code, ведёте проекты в Git и хотите меньше думать о техническом состоянии сессии, а больше о самой задаче</p><p><br><strong>Из чего состоит</strong> ⤵️⤵️⤵️</p><p>✔️ <strong>Модель</strong><br>Сразу видно, на чём работаешь: Opus / Sonnet / Haiku, версия и размер контекста. </p><p>✔️ <strong>Папка и ветка Git</strong><br>Показывает текущий проект и branch. Умеет делать truncate длинных названий проекта</p><p>✔️ <strong>Состояние репозитория</strong><br>Modified / added / deleted / renamed / untracked / conflicts — всё в одной компактной строке. Конфликты подсвечиваются красным, потому что это единственное, что реально блокирует коммит.<br>Визуализируется через стандартные гитовские сокращения </p><blockquote><p><strong>3M — 3 files modified </strong></p><p><strong>1A — 1 added</strong></p><p><strong>1D — 1 deleted </strong></p><p><strong>1R — 1 renamed</strong></p><p><strong>2? — 2 untracked</strong></p><p><strong>1! — 1 conflict</strong></p></blockquote><p>✔️ <strong>Ahead / behind относительно origin</strong><br>Надо ли пушить или подтянуть изменения</p><p>✔️ <strong>Drift между </strong><a href="http://CLAUDE.md" rel="noopener noreferrer nofollow"><code>CLAUDE.md</code></a><strong> / </strong><a href="http://AGENTS.md" rel="noopener noreferrer nofollow"><code>AGENTS.md</code></a><strong> / </strong><a href="http://GEMINI.md" rel="noopener noreferrer nofollow"><code>GEMINI.md</code></a><br>Я использую и Claude Code, и CODEX и GEMINI — у них разные главные контекст-файлы. <br>Мой статуслайн показывает, когда они разъехались. Чтобы все имели одинаковый контекст</p><p>✔️ <strong>Контекстное окно</strong><br>Це база<br>Показывает, сколько контекста уже занято: бар + токены типа <code>480k/1M</code>. Есть ранние предупреждения, когда сессия начинает подходить к зоне, где Claude скоро захочет compact.</p><p>✔️ <strong>Prompt cache</strong><br>Видно cache hit ratio, сколько токенов читается из кэша, сколько записывается, и когда TTL протухнет. Помогает лучше понимать, сколько стоит каждый запрос и была ли инвалидация кеша</p><p>✔️ <strong>Rate limits 5h и 7d</strong><br>Показывает, сколько лимитов осталось и время до reset</p><p>Формат сделал плотным, чтобы всё помещалось в одну строку. Если нада, то можно сделать мультистрочный статуслайн</p><p>Цвета показывают уровень важности: норм / внимание / опасно</p><p>Плюс внутри несколько доп хуков</p><p><br><strong>Ссылка на гитхаб</strong><br><a href="https://github.com/ilia-pluzhnikov/claude-code-statusline" rel="noopener noreferrer nofollow">https://github.com/ilia-pluzhnikov/claude-code-statusline</a></p><p>Поделитесь, а что в вашем статуслайне</p> <a href="https://habr.com/ru/posts/1033862/?utm_campaign=1033862&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 11 May 2026 17:23:09 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[claude code]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Andrey2008 — Блог компании PVS-Studio (+4) — 05.05.2026 14:38]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1031676/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1031676/?utm_campaign=1031676&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>РБПО по ГОСТ Р 56939—2024: вебинар №10 из 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.10. – "<a href="https://pvs-studio.ru/ru/blog/video/11446/" rel="noopener noreferrer nofollow">Статический анализ исходного кода</a>". <a href="https://youtu.be/ujJsWWP3Pus?si=qSsWHqD3XqZQkrip" rel="noopener noreferrer nofollow">На YouTube</a>. <a href="https://files.pvs-studio.ru/media/presentations/10-09-2025.zip" rel="noopener noreferrer nofollow">Слайды</a>.</p><iframe id="69f9d5ce67f22e02b4a789e6" src="https://embedd.srv.habr.com/iframe/69f9d5ce67f22e02b4a789e6" 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><p>Рассмотрение 10-го процесса в ГОСТ Р 56939—2024 неразрывно связано с другим <a href="https://www.standards.ru/document/8124075.aspx" rel="noopener noreferrer nofollow">ГОСТ Р 71207—2024</a> "Статический анализ программного обеспечения". В нём говорится о том же, только более подробно и конкретно.</p><p>Про ГОСТ Р 71207—2024 я отдельно рассказывал в цикле из пяти вебинаров:</p><ol><li><p><a href="https://pvs-studio.ru/ru/blog/video/11050/" rel="noopener noreferrer nofollow">Общее описание и актуальность</a>;</p></li><li><p><a href="https://pvs-studio.ru/ru/blog/video/11066/" rel="noopener noreferrer nofollow">Терминология</a>;</p></li><li><p><a href="https://pvs-studio.ru/ru/blog/video/11084/" rel="noopener noreferrer nofollow">Критические ошибки</a>;</p></li><li><p><a href="https://pvs-studio.ru/ru/blog/video/11092/" rel="noopener noreferrer nofollow">Технологии анализа кода</a>;</p></li><li><p><a href="https://pvs-studio.ru/ru/blog/video/11102/" rel="noopener noreferrer nofollow">Процессы</a>.</p></li></ol><p>Разрабатываемый нами анализатор кода <a href="https://pvs-studio.ru/ru/blog/posts/cpp/1335/" rel="noopener noreferrer nofollow">PVS-Studio совместим с ГОСТ Р 71207—2024</a> и закрывает 10-й процесс ГОСТ Р 56939—2024 для языков C, C++, C#, Java. Сейчас в процессе реализации поддержка языков Go, JavaScript, TypeScript. <a href="https://pvs-studio.ru/ru/pvs-studio/try-free/" rel="noopener noreferrer nofollow">Попробовать PVS-Studio</a>.</p> <a href="https://habr.com/ru/posts/1031676/?utm_campaign=1031676&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 05 May 2026 11:38:09 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[pvs-studio]]></category><category><![CDATA[гост р 71207]]></category><category><![CDATA[гост р 71207-2024]]></category><category><![CDATA[sast]]></category><category><![CDATA[информационная безопасность]]></category><category><![CDATA[программирование]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ova450 — Интерфейсы (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1029944/</guid>
    <link>https://habr.com/ru/posts/1029944/?utm_campaign=1029944&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>ИИ: Гонки на лафетах</p><p>Всего лишь иллюстрация. Примерно год-полтора назад решил я выбрать - deepseek или chatgpt. И выбрал deepseek. Однако через некоторое время стал обращать внимание не его лютый подхалимаж, что, кстати, не раз уже обыграли в различных мемах. Не в отношении deepseek, а относительно AI в общем.<br>Проблему обсудил и с deepseek, и с windows copilot (chatgpt был благополучно забыт). Deepseek стал подхалимски юлить, мол да, copilot хорош и все такое. Copilot же оправдал Deepseek - мол это такая технология поддержки энтузиазма в клиенте. Между прочим тонко намекнув, что сам-то он лучше и глубже. Но это присказка, сказка впереди.<br>В процессе завершения разработки обертки над EntityFramework попросил оценить проект сразу четверых: deepseek, copilot, chatgpt и grok. Результат ожидаем - сыровато, но в продакшн годно, оценки 4.5/5 и 7/10. <br>Претензии разные, существенных практически не было, но в одно они уперлись хором - "тяжелые" интерфейсы. Подробности опущу, это было семейство generic-интерфейсов со многими типами. Что-то вроде IInterface(T1), IInterface(T1,T2) и так далее, пока не надоест.<br>Несколько итераций я эти наезды игнорировал, но AI не унимались. Уже и оценки до 9/10 дошли, но проблема-то осталась.<br>Вспылил и написал письмо на полстраницы, начинавшееся фразой "Господа AI !". Концептуальное. Гневное. Циркулярное  И получил ответы:<br>- ООО! Мы все поняли. Гениально, единственно верное решение.<br>Это deepseek 5/5 и copilot 10/10.<br>- Нуу... Проблема решена, но способ так себе... в общем 9/10 и есть гораздо лучшие альтернативы, рассмотрим?<br>Это chatcpt и grok. И что характерно, альтернативы предлагают разные, по паре штук каждый. Рассмотрим, конечно.<br><br>Это просто зарисовка не о разработке обертки, а о различных системах AI.</p><p>UPD: Забыл добавить - deepseek еще и извинился за необоснованные оценки :)))</p> <a href="https://habr.com/ru/posts/1029944/?utm_campaign=1029944&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 30 Apr 2026 08:19:51 GMT</pubDate>
    <dc:creator><![CDATA[ova450]]></dc:creator>
      
      <category><![CDATA[ии]]></category><category><![CDATA[аналитика]]></category><category><![CDATA[ai]]></category><category><![CDATA[ai agent]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Andrey2008 — Блог компании PVS-Studio (+4) — 29.04.2026 09:49]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1029408/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1029408/?utm_campaign=1029408&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>РБПО по ГОСТ Р 56939—2024: вебинар №09 из 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.9. – "<a href="https://pvs-studio.ru/ru/blog/video/11439/" rel="noopener noreferrer nofollow">Экспертиза исходного кода</a>". <a href="https://youtu.be/mxVgGLp9ZF0?si=-0_SgDaMWsuXUqSO" rel="noopener noreferrer nofollow">На YouTube</a>. <a href="https://files.pvs-studio.ru/media/presentations/03-09-2025.zip" rel="noopener noreferrer nofollow">Слайды</a>.</p><iframe id="69f1a8fc42c0bc03ac312764" src="https://embedd.srv.habr.com/iframe/69f1a8fc42c0bc03ac312764" 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/1029408/?utm_campaign=1029408&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 29 Apr 2026 06:49:40 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[code review]]></category><category><![CDATA[вебинары]]></category><category><![CDATA[качество кода]]></category><category><![CDATA[рбпо]]></category>
  </item>
  

	
  

  

  

    

  

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

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AndreyMoskalew — Блог компании PVS-Studio (+4) — 19.11.2025 15:51]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/968048/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/968048/?utm_campaign=968048&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Статья "Код блокчейн-проектов Neo и NBitcoin VS анализатор кода. Кто-кого?"</strong><br><br> PVS-Studio ворвался в мир блокчейн-разработки, и первыми "под удар" попали open source проекты на C# — Neo и NBitcoin!<br><br> В статье мы рассмотрели самые интересные ошибки: как явные, так и потенциальные, которые нашли в этом проекте. Если вам интересно, какие ошибки могут находить такие инструменты, как PVS-Studio, или вы желаете прокачать свой собственный "ментальный анализатор", приглашаю к <a href="https://pvs-studio.ru/ru/blog/posts/csharp/1312/" rel="noopener noreferrer nofollow">прочтению</a> :)</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/0d8/c44/6d4/0d8c446d439370d67a58c4dc2e895fcd.png" width="975" height="549"></figure> <a href="https://habr.com/ru/posts/968048/?utm_campaign=968048&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 19 Nov 2025 12:51:56 GMT</pubDate>
    <dc:creator><![CDATA[AndreyMoskalew (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[c#]]></category><category><![CDATA[блокчейн]]></category><category><![CDATA[open source]]></category><category><![CDATA[ошибки в коде]]></category><category><![CDATA[neo]]></category><category><![CDATA[анализатор кода]]></category><category><![CDATA[pvs-studio]]></category><category><![CDATA[программирование]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @toxicmt — Тестирование веб-сервисов (+2) — 10.11.2025 20:52]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/965042/</guid>
    <link>https://habr.com/ru/posts/965042/?utm_campaign=965042&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>А всё таки, когда моки зло, а когда нет?</strong></p><p>Чтобы ответить на этот вопрос, сначала нужно разобраться с терминологией и сутью процесса. Сейчас моками называют вообще все что связано с подменой реализации в тестах. Но подмена это просто техника, она может использоваться для совсем разных задач.</p><p>Представьте себе две ситуации. В одной мы подменяяем логер, который работает по http, чтобы он просто складывал данные в файл и не делал http запросов во время тестирования. В другой, в другой, мы проверяем что какой-то метод был вызван с определенными аргументами. И там и там работает подмена, но между этими ситуациями почти ничего общего с точки зрения решаемой задачи.</p><p>Последний случай, описывает процесс мокирования. То есть мок, это когда мы проверяем <strong>то, как</strong> код что-то делает, а не <strong>что он делает</strong>. Иногда говорят, что мы тестируем методом white-box, потому что мы знаем как конкретно написан тест и завязываемся на это, а не на результат работы этого кода, как в black-box тестировании.</p><p>Когда мы проверяем <em>как</em> код работает, мы связываем тест с внутренней реализацией. Любое изменение внутри функции (например, вызов другого метода или смена порядка действий) может поломать тест, даже если внешнее поведение программы остаётся тем же. В итоге тест перестает быть защитой от ошибок и превращается в тормоз для рефакторинга. В подкасте про спринг я услышал классный термин: "бетонирование кода", вот это оно и есть.</p><p>Когда же моки все таки нужны? Допустим мы пишем систему с поддержкой хуков, например фреймворк для тестирования. В тестах такого фреймворка вполне допустимо проверить что хуки setup, teardown, beforeSetup, afterSetup и так далее, вызываются в нужном порядке и с нужными аргументами.</p><p>Общее правило здесь такое, если код можно тестировать методом black-box, то лучше так и делать. White-box это вынужденная необходимость, когда по другому ни как. Правда будьте осторожны, нередко программисты только думают, что по другому никак, потому что они не знают других подходов или по каким-то причинам решили, что другие подходы не подходят по идеологическим причинам.</p><p>Гораздо чаще же в тестах нужны не моки, а стабы, которые позволяют изолировать код от внешних эффектов.</p><p>Например:</p><ul><li><p>База данных, которая хранит данные в памяти.</p></li><li><p>Фейковые сервисы какого-нибудь облака, например AWS</p></li><li><p>Поддельный HTTP клиент, который возвращает заранее заготовленные ответы. &nbsp;</p></li><li><p>Заглушка почтового сервиса, которая записывает письма в список, а не отправляет их.</p></li></ul><p>Все эти решения делают тесты быстрыми, предсказуемыми и независимыми от инфраструктуры, при этом вы все еще проверяете поведение системы снаружи, не нарушая принцип black-box.</p><p>Стабы часто формируются не в конкретном тесте, а на уровне всего приложения. Тот же логер из первого примера просто мешает тестировать наш код, поэтому мы можем поменять реализацию на этапе конфигурирования и на этом все, ни в одном тесте про этот логер мы не вспоминаем.</p><p>Итого</p><p>Моки используются тогда, когда вы хотите проверить как написан ваш код. Стабы используются тогда, когда вы хотите, чтобы внешние эффекты не мешали вам тестировать результат работы вашего кода.</p><p>Больше про разработку в моем телеграм-канале&nbsp;<a href="https://t.me/orgprog" rel="noopener noreferrer nofollow">Организованное программирование</a></p> <a href="https://habr.com/ru/posts/965042/?utm_campaign=965042&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 10 Nov 2025 17:52:53 GMT</pubDate>
    <dc:creator><![CDATA[toxicmt]]></dc:creator>
      
      <category><![CDATA[моки]]></category><category><![CDATA[стабы]]></category><category><![CDATA[фейки]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Avvero — Качество кода — 13.10.2025 07:56]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/955856/</guid>
    <link>https://habr.com/ru/posts/955856/?utm_campaign=955856&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Почему "давайте писать внимательнее" - плохое решение?</p><p>Такой ответ на баг звучит разумно, но он непроверяем: нельзя показать, что мы стали внимательнее, и нельзя доказать обратное. В терминах Поппера - нефальсифицируемая гипотеза, а значит, не инженерное решение.</p><p>Инженерное решение должно быть проверяемым:</p><ul><li><p>тест падает - гипотеза неверна;</p></li><li><p>алерт сработал - защита работает;</p></li><li><p>фича-флаг не дал багу уйти - система выдержала.</p></li></ul><p>"Внимательность" не измеряется, не тестируется и не гарантируется. Это не решение, а успокоение.</p> <a href="https://habr.com/ru/posts/955856/?utm_campaign=955856&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 13 Oct 2025 04:56:00 GMT</pubDate>
    <dc:creator><![CDATA[Avvero]]></dc:creator>
      
      <category><![CDATA[качество кода]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @toxicmt — Качество кода (+1) — 09.10.2025 20:23]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/955126/</guid>
    <link>https://habr.com/ru/posts/955126/?utm_campaign=955126&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Управление сложностью</strong></p><p>Со временем, сложность проектов только растет. Какие бы мы изменения в коде не делали, переходили на новые фреймворки, базы, языки или подходы, алгоритмическая сложность (то что в бизнес логике) будет становиться только выше. Технические улучшения максимум могут убрать случайную сложность, когда мы выбрали неверный или не самый эффективный инструмент, но если с точки зрения логики нужно выполнить 30 разных сценариев, мы их запрограммируем в любом случае независимо от выбранных технологий.</p><p>Фактически все за что мы боремся когда занимаемся архитектурой проекта, это возможность сделать так, чтобы эта сложность росла как можно медленнее. Потому мы добавляем абстракции (когда без них больно), откладываем принятие ключевых решений и делаем много всякого разного. Естественно все это с учетом требований по производительности, надежности и т.п.</p><p>Ниже 5 рекомендаций, по тому, как определить, что выстрелит, а что можно отложить на потом и не сильно париться с кодом.</p><p><strong>Грамотное управление состоянием</strong></p><p>Говорил, говорю и буду говорить. За всем многообразием принципов и шаблонов, в самой глубине скрывается то как мы работаем с эффектами и процессами (состояния и переходы). Умение видеть это добро в коде и правильно с этим работать это ключ к тому, чтобы система оставалась поддерживаемой и устойчивой к ошибкам на самом нижнем уровне, когда мы на код смотрим как на код.</p><p><strong>Изолированная сложность</strong></p><p>В любом проекте есть какие-то вычислительные функции, которые работают как черный ящик и ни с чем не связаны. Сюда например, можно отнести все математические функции. Насколько принципиально если внутри грязь и копоть? Практически без разницы, такой техдолг изолирован и не растит общую сложность системы. Его можно воспринимать как библиотечный код, который пришел из зависимостей. Такой код можно переписать в любой момент, когда это станет нужным (например нужно повысить производительность) и с таким кодом отлично справляются LLM.</p><p><strong>Приоритеты слоев</strong></p><p>Ошибки на уровне формирования моделей и их связей, решают намного больше чем ошибки допущенные при выводе этих данных в api или на фронтенде. Вывод это всегда терминальная стадия, его результаты никак не используются в коде, а вот модели и то как организованы связи, это основа всего, что пронизывает все приложение на самом глубоком уровне. Если тут накосячить, страдать будем в каждой точке сталкивания. Можно сказать что порядок приоритета такой:</p><p>модели + структура базы =&gt; обработчики (контроллеры, сервисная история) =&gt; вывод (сюда же переводы и работа со строками)</p><p><strong>Публичные контракты (API)</strong></p><p>Все что выставляется наружу, будет иметь серьезные последствия в будущем. Хрен что поменяешь и поправишь. Поэтому на проектирование API нужно уделять внимание. А для этого нужно немного прокачаться, например, в том как делать REST API, знать про открытые и закрытые схемы, про принципы формирования ответов, обработки ошибок и всего такого (а они там есть). Это не хухры мухры, когда речь идет про проектирование каких-то сложных действий, авторизаций и других механизмов.</p><p><strong>Отложенные решения</strong></p><p>Хорошая архитектура не в том, чтобы заранее все продумать, а в том, чтобы отложить принятие решений до момента, когда у нас есть достаточно информации. Плохие архитектуры чаще всего страдают от преждевременных оптимизаций: усложнили, чтобы “на будущее”, а это будущее не наступило.</p><p>- Все, что можно поменять без боли - оставляем простым.- Все, что будет трудно поменять (API, модели, схемы БД, протоколы взаимодействия) - продумываем особенно тщательно.</p><p>Больше про разработку в моем телеграм-канале&nbsp;<a href="https://t.me/orgprog" rel="noopener noreferrer nofollow">Организованное программирование</a></p> <a href="https://habr.com/ru/posts/955126/?utm_campaign=955126&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 09 Oct 2025 17:23:46 GMT</pubDate>
    <dc:creator><![CDATA[toxicmt]]></dc:creator>
      
      <category><![CDATA[скажи солиду нет]]></category><category><![CDATA[чистота спасет мир]]></category><category><![CDATA[фп сила - ооп могила]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @toxicmt — Качество кода (+1) — 18.09.2025 18:16]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/948326/</guid>
    <link>https://habr.com/ru/posts/948326/?utm_campaign=948326&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Какая должна быть длина у функций?</strong></p><figure class="bordered full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/d34/c1e/687/d34c1e68704931179ff362f33d975cab.png" width="1364" height="856"></figure><p>Щас скажу кое-что неочевидное. На эту проблему нельзя смотреть в статитке. Вот правильно 4 строки, 10, 100, поэтому разбиваем как-только доходим до предела. Я смотрю на это в динамике.</p><p>Когда мы только что-то пишем и это не очевидная абстракция вроде проверки числа на простоту, то разбивать на функции не надо, до тех пор пока вы не начнете упираться во что-то начиная от необходимости повторного использования (а значит выделения доп абстракций) до большого количества состояний, которые делают анализ функции слишком сложным. Какой при этом получится размер? Да хрен его знает, в реальной жизни функции бывают очень разные, это легко проверить если походить по опенсорсу на гитхабе. И мы говорим про очень успешные продукты и проекты.</p><p>Главное здесь не размер, а то что существует закон распределения, который звучит так: не распределяй. Рефакторить монолит в подавляющем большинстве случаев проще, чем рефакторить распределенную систему будь то функции, компоненты реакта или микросервисы. И когда мы пишем что-то новое, не важно это либа с функциями внутри или сервис с возможными микросервисами внутри, мы изначально не знаем во что это выродится и с какими проблемами мы столкнемся. И слишком ранее разбиение может привести к тому, что придется переписывать все, либо будем страдать, потому что уже поздно.</p><p>Есть такой архитектурный принцип, что принятие ключевых решений нужно откладывать как можно дольше (пока не накопится достаточно кейсов и понимания). Да, при этом надо учитывать, что можно слишком затянуть, но на уровне функций, все же сложно довести систему до состояния невозможности рефакторинга.</p><p>Поэтому если мы пишем что-то новое, где мы не до конца понимаем все текущие или будущие кейсы, лучше не пытаться все разносить до минимума, достаточно выносить только самые больные очевидные технические элементы. А вот дальше, в процессе работы, доуточнения и отработке пограничных случаев, пожалуйста, мы можем разбивать и разбивать в соответствии с получаемыми смыслами.</p><p>p.s. Смог тут загуглить исследование сотен миллионов строк на гитхабе: <a href="https://arxiv.org/pdf/1806.04556" rel="noopener noreferrer nofollow">https://arxiv.org/pdf/1806.04556</a> (на скрине выдержка)</p><p>Больше про разработку в моем телеграм-канале&nbsp;<a href="https://t.me/orgprog" rel="noopener noreferrer nofollow">Организованное программирование</a></p> <a href="https://habr.com/ru/posts/948326/?utm_campaign=948326&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 18 Sep 2025 15:16:15 GMT</pubDate>
    <dc:creator><![CDATA[toxicmt]]></dc:creator>
      
      <category><![CDATA[нечистый код]]></category><category><![CDATA[мартин не прав]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @life_of_junior_dev — Качество кода — 13.09.2025 21:44]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/946674/</guid>
    <link>https://habr.com/ru/posts/946674/?utm_campaign=946674&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>🚀 <strong>Как я решаю сложные задачи</strong></p><p>Для меня самое важное — полностью понять задачу ещё до того, как начать её выполнять.</p><p>Звучит банально, но под полным пониманием я имею в виду прям ПОЛНОЕ: не только суть, но и все технические детали, вплоть до того, какой код и где нужно написать.</p><p>📝 Часто я оставляю туду в коде и фиксирую шаги, которые нужно сделать. После этого перехожу к следующему этапу и разбираю его отдельно.</p><p>💡 Почему это работает:<br> 1️⃣ Это помогает точнее оценить время выполнения.<br> 2️⃣ Легче расставлять приоритеты. Если застрял на мелочи — видишь общую картину и не утонешь в деталях.<br> 3️⃣ Быстрее формулируются вопросы. Особенно важно, когда коллеги в другой таймзоне и доступны не всегда. Чем чётче и быстрее задаёшь вопросы, тем быстрее получаешь ответы.</p><p>⚡️ Поэтому, когда я понимаю, что задача сложная, я не спешу решать её сразу. Вместо этого я стараюсь <strong>как можно скорее задать правильный вопрос</strong>.</p><p>👨‍💻 <a href="https://t.me/life_of_junior_dev" rel="noopener noreferrer nofollow">Джуниор</a></p> <a href="https://habr.com/ru/posts/946674/?utm_campaign=946674&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 13 Sep 2025 18:44:00 GMT</pubDate>
    <dc:creator><![CDATA[life_of_junior_dev]]></dc:creator>
      
      <category><![CDATA[продуктивность]]></category><category><![CDATA[лайфхаки]]></category><category><![CDATA[саморазвитие]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @toxicmt — Программирование (+2) — 11.09.2025 19:45]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/946170/</guid>
    <link>https://habr.com/ru/posts/946170/?utm_campaign=946170&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как научиться программировать лучше</strong></p><p>Часто встречаю такое мнение, что главное то как мы систему проектируем сверху и не очень принципиально, что там внутри. То есть вот у нас есть модули, ответственности и дальше как-то оно реализуется.</p><p>И это видно в запросах людей в чатах или у тех кто просит помочь поконсалтить. Мол вот тут в коде такое себе, но это не так важно, хочу научиться делать хорошо глобально.</p><p>Логически кажется что все верно, если мы делаем хорошо систему снаружи, то внутренности уже не так страшно. На практике же я вижу ситуацию по другому. Если программист не понимает как правильно организовывать локальный код, что и когда выносить в функцию, как работать с побочными эффектами и состоянием приложения, он не сможет перепрыгнув этот уровень научиться и делать хорошо систему в целом.</p><p>Для меня это всегда выглядело как техника в спорте. Сначала мы, упорно и монтонно ставим технику, а уже затем двигаемся дальше. Без техники спортсмен всегда будет проигрывать другим. В программировании мы конечно не соревнуемся друг с другом, но результат будет примерно такой же, на выходе получится такая себе архитектура.</p><p>И даже если вы со мной согласитесь, дальше начинается вакханалия. А что является базой, которую надо уметь и знать? Готов поспорить, что больше всего будут кричать про SOLID, чистый код и другое похожее мракобесие. Да, в любых шутках есть какие-то полезные мысли, но это все настолько скрыто за ширмой конкретных кейсов делай раз и делай два, что картинка теряется и все скатывается в срач, одна ответственность у функции или две.</p><p>Мой личный топ того, что учит писать грамотный код на высокоуровневых языках, где мы фокусируемся на создании правильных абстракций это SICP/HTDP + попрактиковаться в написании кода на одном из популярных функциональных языков.</p><p>За мою довольно длительную карьеру, самый большой сдвиг произошел именно в тот момент, когда от изучения фаулеров, мартинов и банд я взялся за более серьезный фундамент. Было это году в 2013, с тех пор, что бы я не изучал, оно накладывается и дополняет, а не переворачивает мой мир внутри, как было 5 лет до того. Тогда, в первые годы моего программированияб каждый раз смотришь на свой код или читаешь что-то и думаешь, блин, надо проектировать по другому.</p><p>И это не только мое наблюдение, почти все ребята с кем мы тогда активно тусили в разных комьюнити, пересекались на конфах и дружили, в целом отмечали как фп (в частности clojure, haskell, ocaml, erlang) значительно сдвигали понимание программирования.</p><p>Почему это так? А потому что в остатке мы упираемся в побочные эффекты, барьеры абстракции (тут сикп) и грамотное управление состоянием. Вот такие пироги</p><p>Больше про разработку в моем телеграм-канале&nbsp;<a href="https://t.me/orgprog" rel="noopener noreferrer nofollow">Организованное программирование</a></p> <a href="https://habr.com/ru/posts/946170/?utm_campaign=946170&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 11 Sep 2025 16:45:15 GMT</pubDate>
    <dc:creator><![CDATA[toxicmt]]></dc:creator>
      
      <category><![CDATA[архитектура]]></category><category><![CDATA[чистый код]]></category><category><![CDATA[хаскель сила]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @nin-jin — ООП (+3) — 25.08.2025 11:11]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/940412/</guid>
    <link>https://habr.com/ru/posts/940412/?utm_campaign=940412&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong><a href="https://www.youtube.com/watch?v=bpIPZCVW6eE" rel="noopener noreferrer nofollow">Выводим Бугаенко на чистую воду</a> разбирая ООП</strong></p><iframe id="68ac19c2d5124fabc4b2883d" src="https://embedd.srv.habr.com/iframe/68ac19c2d5124fabc4b2883d" class="embed_video embed__content" allowfullscreen="true"></iframe><p><strong>Топ Перлов</strong></p><ul><li><p>Любой массив байт должен уметь работать с файлами, сетью и тд.</p></li><li><p>Программа должна не падать на ошибках, а продолжать работу с фейковыми объектами.</p></li><li><p>Вместо падения в моменте конструирования объекта, надо падать на другом конце программы при каждом его использовании.</p></li><li><p>Я придумал новый язык, и чтобы он не так сильно тормозил, надо встроить GC в CPU.</p></li></ul><p><strong>Упомянутые ссылки</strong></p><ul><li><p><a href="https://mol.hyoo.ru/#!section=docs/=qry2aw_lo4qgj" rel="noopener noreferrer nofollow">Парадигмы диспетчеризации</a> (включая ООП)</p></li><li><p><a href="https://mol.hyoo.ru/#!section=docs/=go30rj_7vr107" rel="noopener noreferrer nofollow">Виды объектных декомпозиций</a> (включая MVC)</p></li></ul><p><strong><a href="https://boosty.to/hyoo" rel="noopener noreferrer nofollow">Копилка благодарностей</a></strong></p> <a href="https://habr.com/ru/posts/940412/?utm_campaign=940412&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 25 Aug 2025 08:11:20 GMT</pubDate>
    <dc:creator><![CDATA[nin-jin]]></dc:creator>
      
      <category><![CDATA[ооп]]></category><category><![CDATA[elegant objects]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @IT-VAVILON — JavaScript (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/936790/</guid>
    <link>https://habr.com/ru/posts/936790/?utm_campaign=936790&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Unit-тесты во фронтенде: развеиваем мифы</strong></p><p>После статьи о навыках джуниоров многие не согласились с моей оценкой unit-тестов. Давайте посмотрим, где они действительно полезны, а где создают иллюзию ценности.</p><p>Если вы начинающий разработчик, вас наверняка убеждали:<br> «Без unit-тестов никуда! Всё должно быть покрыто тестами!»<br> Но так ли это на самом деле?</p><p><strong>Где unit-тесты полезны:</strong></p><ul><li><p>Бизнес-логика и утилиты (форматирование данных, расчёты)</p></li><li><p>Кастомные хуки (управление состоянием, формы)</p></li><li><p>Критичные функции (редкий зверь во фронтенде)</p></li></ul><p><strong>Где они бесполезны (и даже вредны):</strong></p><ul><li><p>UI-компоненты (скриншотные тесты часто ломаются из-за изменений вёрстки)</p></li><li><p>API с моками (моки не показывают реальное поведение сервера)</p></li><li><p>Тестирование библиотек (проверяете чужой код)</p></li></ul><p><strong>Что использовать вместо?</strong></p><ol><li><p>Интеграционные тесты — проверяют реальные сценарии</p></li><li><p>Zod для валидации API — предотвращает ошибки из-за неожиданных данных</p></li><li><p>Ручные проверки — быстрее и точнее, чем скриншотные тесты</p></li></ol><p><strong>Для джуниора unit-тесты — не приоритет. Важнее:</strong></p><ul><li><p>Глубокое изучение фреймворка</p></li><li><p>Умение работать с API</p></li><li><p>Навык чтения и отладки кода</p></li></ul><p><strong>Не стоит тратить время на «тесты ради тестов». Сосредоточьтесь на том, что действительно поможет в работе.</strong></p> <a href="https://habr.com/ru/posts/936790/?utm_campaign=936790&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 18 Aug 2025 05:00:18 GMT</pubDate>
    <dc:creator><![CDATA[IT-VAVILON]]></dc:creator>
      
      <category><![CDATA[unit-testing]]></category><category><![CDATA[unit test]]></category><category><![CDATA[тестирование]]></category><category><![CDATA[тестирование веб-приложений]]></category><category><![CDATA[тестирование приложений]]></category><category><![CDATA[тестирование сайтов]]></category><category><![CDATA[frontend]]></category><category><![CDATA[front-end]]></category><category><![CDATA[front-end разработка]]></category><category><![CDATA[frontend-разработка]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @editor_agima — Блог компании AGIMA (+3) — 13.08.2025 10:38]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/agima/posts/936632/</guid>
    <link>https://habr.com/ru/companies/agima/posts/936632/?utm_campaign=936632&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Красные флаги в код-ревью: перегибы, которых лучше избегать</strong></p><ol><li><p><strong>Фокус на мелочах. </strong>Если уделять много внимания опечаткам и код-стайлу, то времени уйдет много, а реальных результатов будет мало. Главное — это всё-таки архитектура, алгоритмы и производительность, а косметика только на втором плане. Зачем портить настроение себе и команде, если можно ничего никому не портить?</p></li><li><p><strong>Поверхностный анализ.</strong> Забивать на проверку кода — тоже плохая идея. И дело даже не в багах, их отловит тестировщик. Дело в безопасности всей системы. Если какой-нибудь хакер найдет уязвимость, которую QA не нашел, — жди беды. Ну и техдолг никто не отменял: если не делать сразу хорошо, однажды придется переделывать.</p></li><li><p><strong>Токсичность.</strong> Во время код-ревью лучше всё-таки искать потенциальные проблемы с кодом, а не учить коллег работать. То есть фокус внимания — не на поиске недостатков в чужой работе, а на самом коде. А личные предпочтения и вкусы относительно кода лучше обсуждать отдельно.</p></li></ol><p>Обратную связь стоит давать вдумчиво — подбирать слова и контролировать интонацию. Фидбек должен быть таким, чтобы у разработчика не возникало ощущения, будто он ни на что не годится.</p><p><em>А каким должен быть хорошее код-ревью — </em><a href="https://habr.com/ru/companies/agima/articles/911764/" rel="noopener noreferrer nofollow"><em>в нашем блоге</em></a><em>.</em></p> <a href="https://habr.com/ru/posts/936632/?utm_campaign=936632&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 13 Aug 2025 07:38:04 GMT</pubDate>
    <dc:creator><![CDATA[editor_agima (AGIMA)]]></dc:creator>
      
      <category><![CDATA[код-ревью]]></category><category><![CDATA[code review]]></category><category><![CDATA[тимлид]]></category><category><![CDATA[teamlead]]></category>
  </item>
  

	
  

  

  

      

      

      

    
  </channel>
</rss>
