Обновить
64K+

Качество кода *

Как Макконнелл завещал

59,58
Рейтинг
Сначала показывать
Порог рейтинга

Хороший код: как понять, что его будет удобно менять

Понятные имена, небольшие методы и аккуратное форматирование делают код проще для чтения. Но даже аккуратный файл может оказаться дорогим в работе, если небольшое изменение требует восстановить много контекста и затронуть несколько частей системы.

Вместе с Ринатом, iOS-разработчиком в Naumen, разбираемся, почему хороший код проверяется следующей задачей, как проявляется сложность изменений и на что стоит смотреть при оценке кода.

Код проверяется следующей задачей

Пока работа над задачей еще свежая, почти любой код кажется понятным. Автор помнит, почему вызовы стоят именно в таком порядке, какой случай обсуждали на ревью и что здесь собирались переделать позже. Коллеги тоже держат часть контекста в голове.

Так что даже не самое удачное решение какое‑то время не доставляет особых проблем.

Через полгода ситуация меняется: исходная задача давно закрыта, участники обсуждения заняты другими частями проекта, а другому разработчику нужно внести небольшое изменение.

Именно в этот момент становится понятно, насколько код вообще рассчитан на изменения.

Простая задача может оказаться дорогой

Одна из задач у нас на планировании звучала безобидно:

После ошибки авторизации запрос повторять не нужно, после временной сетевой ошибки — нужно, причем с увеличивающейся задержкой.

Само условие укладывается в несколько строк. Но сначала приходится выяснить, где на самом деле живет это правило: в сетевом клиенте, в сервисе авторизации, в middleware.

А еще нужно понять, не запускает ли часть повторов таймер внутри другого объекта и не зависит ли соседний сценарий от текущего порядка вызовов. В итоге сам код меняется быстро, но день уходит на восстановление картины вокруг него.

Смотреть нужно на изменение, а не на файл

У кода есть свойства, которые легко заметить сразу: понятные имена, небольшие методы, аккуратное форматирование и простая структура. Все это полезно, но само по себе еще не говорит, насколько удобно систему менять.

Можно открыть класс и довольно быстро разобраться в каждом его методе. А потом выяснить, что для добавления одного состояния нужно исправить еще четыре модуля, обновить несколько почти одинаковых преобразований данных и соблюсти порядок вызовов, который нигде явно не зафиксирован.

Файл может выглядеть вполне нормально, а изменение при этом оказывается дорогим.

Мне в этом контексте близко описание сложности изменений у Джона Оустерхаута. Он выделяет три характерных проявления.

  • Маленькая правка расползается по системе

Добавили поле в модель и приходится менять сетевой слой, хранилище, аналитику, несколько экранов и тестовые данные.

Иногда это естественная цена изменения контракта, а иногда — признак того, что одно знание размазано по проекту.

  • Для локальной работы нужно слишком много контекста

Чтобы поправить один обработчик, нужно знать устройство навигации, жизненный цикл экрана, особенности кэша и два исторических обхода старых ошибок.

  • Есть зависимости, о которых разработчик даже не знает

Они обнаруживаются уже после изменения. Например, перестановка двух вызовов отключает сетевую проверку: первый метод использует закэшированное состояние и завершает сценарий раньше времени.

Эти признаки полезнее многих разговоров о «чистом коде»: о длине метода можно спорить, а вот с последствиями изменения — сложнее.

Обычно я смотрю на три вещи

  1. Сколько мест потребуется затронуть?

  2. Сколько информации нужно восстановить перед работой?

  3. Как быстро мы узнаем, что ошиблись?

Чем меньше ответ зависит от памяти конкретного человека, тем спокойнее живется проекту.

Теги:
+4
Комментарии0

Мы кое-что спрятали 👀

В честь выхода PVS-Studio 8.0 — а это поддержка новых языков и серьёзные улучшения анализатора — мы решили устроить небольшую охоту.

Нами спрятано несколько пасхалок. Всем, кто активно использует анализатор, будет несложно отыскать хотя бы одну из них. Если же вы еще не пробовали проверять свой проект, самое время. Забирайте пробную лицензию и участвуйте в охоте.

Первые 10 человек, которые найдут спрятанные нами пасхалки и напишут нам, получат две бумажные книги по C++ в подарок. Не забудьте указать в сообщении, где вы отыскали нашу пасхалку.

Как искать? Просто! Скачивайте PVS-Studio, анализируйте свой код — и, возможно, найдёте кое-что интересное по дороге.

👉 Подробные условия и как забрать приз — здесь

Теги:
+3
Комментарии0

Дело было вечером, делать было не чего, решил я запустить quake 3 arena на старом jar s40 телефоне (nokia 6303 classic).

Но тут сразу появился упор в слабое железо, а квейк 3 арена имеет уже полноценное 3д с эффектами и прочими плюшками, пришлось оригинальные текстуры ужать до 32x32 но геометрия оригинальная (чуть больше 5000 треугольников на этой карте), всего одна карта q3dm17 и 1 оружие, при этом работают даже тригеры для джампа (прыжков от панелей) и телепорты, да это не совсем оригинальный квейк 3 арена, более того, это скорее нейрослоп, ну или просто очередная поделка под старый телефон ради ностальгии-хобби, хоть и со средним fps около 8.

+ бонус ещё несколько проектов которые смог запустить на этом телефоне

  • quake 3 arena (сорсы на github) там же в релизе и jar файл

  • сапёр 3д на сфере (без стыков, не uv и не икосфера)

  • настоящий рендер лучами (path tracing) но с оптимизированными упрощениями (в рендере 240*320 + msaa x4 = 40 секунд на cpu)

  • клон minecraft в изометрии (с телефона скринов не осталось)

но всё это хорошо работало на этом телефоне без проблем, ну разве что в квейке низкий fps.

Теги:
+4
Комментарии0

Как писать код с агентами правильно?

Если вы пользуетесь ИИ-агентами для написания кода, ты наверняка замечали: они генерируют код быстро, но не всегда следуя единному стилю или лучшим практикам.

Недавно я познакомился с безумно хорошим инструментом для улучшения качества вашего питоновского кода - wemake-python-styleguide

Изначально проект позиционировался как простой плагин для flake8, но с куда большим количеством правил, он стал настолько большой что его нужно воспринимать как полноценный линтер. Кстати, он полностью совместим со ВСЕМИ правилами от ruff. И что важно, его развивает core-разработчик CPython — Никита Соболев.

Я считаю, что каждую ошибку, который он подсвечивает, это не чья-то прихоть, а реальный опыт поддержки самого языка. При этом линтер не перегибает палку: нарушения объясняются. Например, если ваш агент написал if x > 42 линтер выдаст ошибку WPS432 («magic number used»). Достаточно вызвать wps explain WPS432 (или отправить MCP-запрос), и вы получите развёрнутое пояснение, почему магические числа это плохо, и как их заменить на константу, кстати именно в новой версии появилась эта функциональность, теперь объяснения приходят прямо в контекст агента, плюс появились скиллы. Вообщем сделано так, чтобы улучшать код и не раздражать разработчика :)

Теги:
+6
Комментарии0

Элегантность кода благодаря C++23

Продолжим разбирать приёмы рефакторинга и посмотрим, как std::ranges::views::enumerate помогает сделать код более элегантным.

В статье "C++: Пиши, сокращай, оптимизируй" я рассматривал рефакторинг и оптимизацию кода за счёт объединения циклов. В итоге я остановился на следующем варианте кода:

static TensorImpl make_contiguous_tensor(const std::vector<int64_t>& sizes)
{
  auto q = sizes.size();
  std::vector<int64_t> strides(q);
  int64_t acc = 1;
  int64_t ne = 1;
  for (auto sz : std::ranges::views::reverse(sizes))
  {
    strides[--q] = acc;
    acc *= (sz == 0 ? 1 : sz);
    ne *= sz;
  }
  //....
}

Его недостаток в том, что всё равно необходимо использовать переменную q для работы с контейнером strides. Как можно написать ещё лаконичнее, я не сообразил, но такой способ есть!

После публикации мне подсказали про enumerate. Эта штука появилась в C++23, и я как-то её пропустил. Сложно уследить за всеми нововведениями C++.

С помощью enumerate можно сразу перебирать и элементы, и их индексы:

constexpr static auto v = {'A', 'B', 'C', 'D'};
for (auto const [index, letter] : std::views::enumerate(v))
    std::cout << '(' << index << ':' << letter << ") ";

Будет напечатано: (0:A) (1:B) (2:C) (3:D).

Но нам нужен обратный порядок, и такой вариант не подходит:

for (auto const [i, sz] :
  std::views::enumerate(
    std::ranges::views::reverse(sizes)))

Этот цикл будет перебирать элементы с конца, а индексы — по возрастанию от 0. Можно сделать, чтобы значения i также шли в обратном порядке? Можно. Это делается с помощью std::views::enumerate(sizes) | std::views::reverse.

В итоге можно сократить код ещё на одну строчку:

static TensorImpl make_contiguous_tensor(const std::vector<int64_t>& sizes)
{
  std::vector<int64_t> strides(sizes.size());
  int64_t acc = 1;
  int64_t ne = 1;
  for (auto const [i, sz] : std::views::enumerate(sizes) | std::views::reverse)
  {
    strides[i] = acc;
    acc *= (sz == 0 ? 1 : sz);
    ne *= sz;
  }
  //....
}

Нельзя назвать это большим достижением, но зато на практике применили одну из новых возможностей C++23.

Что со скоростью кода? Замер показал, что в рамках погрешности его скорость не изменилось. Т.е. этот вариант работает так же, как вариант №2 — "Мой вариант одним циклом" (см. замер скорости работы в статье). Это не удивительно, так как по сути код идентичен предыдущему.

Спасибо за внимание и подписывайтесь на наш дайджест, чтобы не пропустить интересное. Например, у нас грядёт выпуск PVS-Studio 8.0 с поддержкой новых языков.

Теги:
Всего голосов 2: ↑2 и ↓0+4
Комментарии0

Почему я перестал удалять пользователей сразу

Раньше логика удаления у меня была максимально простой:

DELETE FROM users
WHERE subscription_end < NOW();

Пока проект небольшой, кажется, что этого достаточно. Но потом начинаешь учитывать, что происходит вокруг. 
Обработчик платежей может еще не закончить работу. Webhook мог прилететь повторно. Воркер может обработать событие с небольшой задержкой. В результате возникает гонка между обновлением подписки и задачей удаления.

В какой-то момент пользователь действительно удовлетворяет условию удаления. Через несколько секунд — уже нет. Если удалить его сразу, восстановление обойдется гораздо дороже, чем сама ошибка. После нескольких таких сценариев я перестал выполнять удаление сразу.

Теперь сначала пользователь получает статус pending_deletion, а отдельная задача спустя заданный интервал еще раз проверяет его состояние. Если за это время подписка продлилась, платеж обработался или статус изменился, удаление просто отменяется. По сути это обычная перепроверка перед необратимой операцией. С тех пор я стараюсь применять этот принцип не только к удалению пользователей. Если действие нельзя легко отменить, одной проверки условия перед выполнением уже недостаточно.

Поделитесь, кто как делает? используете отложенное удаление, soft delete или сразу выполняете операцию, если условие выполнено?

Теги:
Всего голосов 4: ↑2 и ↓2+2
Комментарии3

Программирование с явно выделенным состоянием

Одна из моих любимых тем, про которую не устаю говорить. В модели данных часто бывает ситуация, когда состояние выражено не прямым образом, а косвенно. Буквально вчера я реализовывал кастомные тарифы под конкретных пользователей. Отличие такого тарифа от обычного сводится к тому, заполнено ли поле user_id в тарифе или нет. Если не заполнено, то значит это общий тариф, если заполнено, значит под конкретного пользователя и другие его не могут видеть.

Это вполне рабочая схема и она встречается повсеместно, особенно в связке с датами типа deleted_at, но она обладает одним очень важным недостатком. Понимание того, что эта запись находится в особом состояние вычисляется через косвенный признак или, что хуже, через набор признаков. Об этом надо думать и каждый раз вспоминать и выуживать эту информацию.

Сейчас, в эру агентного программирования, это стало еще важнее. Агент может догадаться до правила, но ему нужно на это время и отдельный анализ. Можно конечно написать об этом в правилах, но зачем, когда можно просто поправить модель данных? Все что требуется, это введение текстового поля со статусом, которое явным образом скажет о происходящем с этой записью.

В общем не полагайтесь на то как заполнены поля, вводите нужные статусы, которые явно будут говорить о том что происходит. Заодно это дает более удобную аналитику и выборки

Теги:
Всего голосов 3: ↑3 и ↓0+5
Комментарии2

РБПО по ГОСТ Р 56939—2024: вебинар №29 из 30 — Системы с конструктивной информационной безопасностью (ГОСТ Р 72118—2025)

Предлагаю вашему вниманию запись вебинара, где мы разбираем безопасную разработку ПО. Мы добрались до дополнительных (бонусных) вебинаров цикла. Рассмотрим "Системы с конструктивной информационной безопасностью". На YouTube. Слайды.

С помощью приглашённого эксперта Екатерины Рудиной, аналитиком департамента перспективных технологий "Лаборатории Касперского", мы разобрались, в чём сходство и различие таких систем с безопасным ПО, как соотносятся создание систем с КИБ и разработка безопасного ПО, чем полезен в работе специалистов по ИБ новый ГОСТ Р 72118—2025 "Защита информации. Системы с конструктивной информационной безопасностью. Методология разработки".

Общее количество вебинаров — 30. Каждому из 25 процессов ГОСТа посвящён отдельный вебинар и ещё 5 записано дополнительно на смежные темы. Запись всех вебинаров и подборка дополнительной информации доступна по ссылке: ГОСТ56939.РФ.

Методика ВУ и НДВ в ПО приведена в соответствие с ГОСТ Р 56939—2024

Материалы будут полезны всем, кто знакомится с темой РБПО и заинтересован во внедрении зрелых подходов в работу по созданию и сопровождению качественных программных продуктов. Материал по ГОСТ Р 56939—2024 весьма актуален, так как 12 мая 2026 утверждена обновлённая "Методика ВУ и НДВ в ПО". См. заметку "Методика выявления уязвимостей и недекларированных возможностей — 2026".

НЕкурс про РБПО

Суммарное время предлагаемых к изучению вебинаров составляет около 50 часов. Это достаточно большая задача, поэтому мы решили помочь и разбили материалы на отдельные уроки по РБПО. Возможно, так вам будет проще усваивать материал, а интерфейс позволяет отмечать, с чем вы уже ознакомились.

Теги:
Всего голосов 2: ↑2 и ↓0+4
Комментарии0

РБПО по ГОСТ Р 56939—2024: вебинар №27 из 30 — PVS-Studio Atlas — новая платформа контроля качества кода

Предлагаю вашему вниманию запись вебинара, где мы разбираем безопасную разработку ПО. Мы добрались до дополнительных (бонусных) вебинаров цикла. Рассмотрим "PVS-Studio Atlas — новая платформа контроля качества кода". На YouTube. Слайды.

В ходе бонусного вебинара команда PVS-Studio представила новый продукт — PVS-Studio Atlas, предназначенный для работы с результатами анализа кода: просмотра, аналитики, разметки и формирования отчётов для сертификационных лабораторий и ФСТЭК.

Общее количество вебинаров — 30. Каждому из 25 процессов ГОСТа посвящён отдельный вебинар и ещё 5 записано дополнительно на смежные темы. Запись всех вебинаров и подборка дополнительной информации доступна по ссылке: ГОСТ56939.РФ.

Методика ВУ и НДВ в ПО приведена в соответствие с ГОСТ Р 56939—2024

Материалы будут полезны всем, кто знакомится с темой РБПО и заинтересован во внедрении зрелых подходов в работу по созданию и сопровождению качественных программных продуктов. Материал по ГОСТ Р 56939—2024 весьма актуален, так как 12 мая 2026 утверждена обновлённая "Методика ВУ и НДВ в ПО". См. заметку "Методика выявления уязвимостей и недекларированных возможностей — 2026".

PVS-Studio — статический анализатор кода для поиска критических и типовых ошибок

Также приглашаю всех познакомиться с нашим статическим анализатором PVS-Studio, который может закрыть не только 10-й процесс ГОСТ Р 56939, но и будет полезен по другим направлениям:

  1. Обучение сотрудников (п.5.2). Формирование у программистов понимание антипаттернов и уязвимых конструкций, что улучшает их техническую экспертизу;

  2. Моделирование угроз и разработка описания поверхности атаки (п.5.7). Дополняет процесс, выявляя потенциальные уязвимости, которые формируют поверхность атаки;

  3. Экспертиза исходного кода (п.5.9). Позволяет усилить проверку стороннего кода, который команда включает в проект. Например, его можно использовать для выбора сторонних библиотек, оценивая качество их кода;

  4. Поиск уязвимостей в программном обеспечении при эксплуатации (п.5.24). Можно просматривать ранее отключённые предупреждения PVS-Studio с целью дополнительного выявления дефектов в коде.

Скачать PVS-Studio.

Основные характеристики:

Теги:
Всего голосов 8: ↑8 и ↓0+11
Комментарии0

Где заканчивается vibe и начинается инженерия

ИИ уже в ежедневной разработке. Cursor, Claude Code, Copilot и другие инструменты помогают писать код, собирать прототипы, проверять гипотезы и быстрее двигаться от идеи к работающему решению. Правда, для этого нужно перенастроить инженерный процесс и ответить на важные вопросы.

❓ Кто отвечает за качество сгенерированного кода?
🧪 Как проверять, который написал не только человек?
🚀 Как ускорение разработки меняет внутренние процессы?

Что делать с безопасностью, если, по данным Veracode, 45% проверенных образцов AI-generated code не прошли security-тесты и получили уязвимости из OWASP Top 10?

25 июня в Сфере X5 в Парке Горького проведём первый митап серии AI & ML Talks. Он будет посвящён теме «Vibe Coding: новая разработка или новый техдолг?»

Со спикерами из Альфа-Банка, X5 Tech и X5 Digital обсудим, что уже происходит в командах: где заканчивается «vibe» и начинается инженерия, какие ИИ-инструменты реально помогают разработчикам, а что пока остаётся демкой. Отдельно поговорим о качестве, безопасности, ревью и о том, насколько большие компании готовы пускать ИИ-код в продакшен.

🎤 В программе три доклада, Hot Battle на спорный тезис с голосованием зала и нетворкинг под открытым небом.

👥 Митап будет полезен разработчикам любого стека, тимлидам, AI-early adopters и всем, кто уже использует ИИ-инструменты в работе или только разбирается, как встроить их в свой процесс.

🗓 Встречаемся 25 июня в 18:30 на площадке «Сфера X5» в Парке Горького.

🔗 Регистрация

Первый митап серии AI & ML Talks посвящённый теме «Vibe Coding: новая разработка или новый техдолг?»
Первый митап серии AI & ML Talks посвящённый теме «Vibe Coding: новая разработка или новый техдолг?»
Теги:
Всего голосов 8: ↑5 и ↓3+4
Комментарии0

Агентские скиллы: как применить их в разработке

Привет, меня зовут Дима Васильев, я бэкенд-разработчик в Doubletapp. В этом тексте коротко расскажу, как эффективно управлять кодовыми ассистентами с помощью агентских скиллов.

Ассистенты уже умеют читать репозиторий, править файлы и запускать команды, но им часто не хватает контекста команды: как оформлять задачи, какие проверки запускать, как работать со стендами и где нужно подтверждение. Для этого и нужны агентские скиллы. 

Скилл — это инструкция для ИИ-помощника: когда её применять, по каким шагам действовать, какие шаблоны и команды использовать. В открытой спецификации Agent Skills скилл обычно оформляется как папка с SKILL.md; рядом могут лежать скрипты, справки и шаблоны.

Подход уже поддерживают разные кодовые ассистенты. GitHub Copilot работает с agent skills в режиме агента, Copilot CLI и облачном агенте. Codex поддерживает скиллы в командной строке, расширении и приложении. Claude Code тоже работает со скиллами через SKILL.md. Поэтому речь не про один инструмент, а про общий способ описывать повторяемые действия команды рядом с кодом.

Кейс 1. Описание проделанной работы

Разработчик закончил задачу, а дальше её должны подхватить тестировщики, аналитики или другие разработчики. Часто в задаче остаётся короткое «сделал», хотя нужно больше контекста.

Можно сделать скилл «описать изменения». Он смотрит на изменения в коде, коммиты и описание задачи, а потом формирует выжимку: что изменилось, какие модули затронуты, как проверить результат, есть ли риски, миграции, настройки или флаги.

Такой скилл помогает не забывать важные детали и делает передачу задачи более предсказуемой.

Кейс 2. Онбординг новых разработчиков

Проектные скиллы полезны для онбординга. В них можно описать, как поднять окружение, как запускать тесты, как оформлять ветки и коммиты, где смотреть логи и какие архитектурные правила нельзя нарушать.

Новый разработчик может спросить помощника: «помоги поднять проект» или «подготовь задачу к сдаче». Помощник ответит с учётом проектных правил, а не общими советами. Это не отменяет документацию, но снижает количество одинаковых вопросов.

Кейс 3. Надстройка над Terraform

Другой пример — сложные инструменты. Допустим, команде нужен Terraform для стендов, но не все хорошо с ним знакомы. Реальных знаний Terraform скилл не заменит: всё равно важно понимать состояние, план изменений, ресурсы и последствия удаления инфраструктуры.

Но для повседневной работы можно сделать понятные действия поверх Terraform:

  • Init stand — подготовить стенд;

  • Update stand — применить изменения;

  • Destroy stand — удалить стенд.

Под капотом ассистент выполняет нужные команды: инициализирует Terraform, выбирает окружение, строит план, показывает изменения, просит подтверждение перед опасными действиями и реагирует на ошибки.

Главное здесь — не просто удобство, а безопасность. В скилле можно прописать: перед применением изменений показать план, перед удалением стенда запросить отдельное подтверждение, не выполнять опасные команды молча и не использовать непроверенные переменные окружения. Так команда получает понятный интерфейс к сложному инструменту, но сохраняет контроль.

Что это даёт

Главная польза скиллов в том, что командные знания становятся частью проекта. Их можно обсуждать и улучшать так же, как код. Это мост между «ИИ просто помогает писать код» и «ИИ помогает соблюдать процессы команды»: оформление задач, проверки, инфраструктура, отчёты, онбординг и документация.

Где посмотреть готовые примеры

Сторонние скиллы стоит читать как чужой код: внутри могут быть скрипты и команды. Особенно внимательно стоит смотреть на скиллы, которые запускают команды.

Полезные материалы и репозитории:

Для начала достаточно взять один небольшой процесс, описать его в SKILL.md и положить рядом с кодом.

Теги:
Рейтинг0
Комментарии0

Вы тоже заметили как просто стало внедрять кодогенерацию?

Агент пишет алгоритм генерации под любые условия и задачи. Вам только нужно задачу правильно поставить. И вуаля теперь вы имеете скрипт который генерирует или редактирует любой бойлерплейт (в заданных алгоритмом рамках конечно же).

И поручить агенту реализацию код-гена один раз намного дешевле чем ту же задачу по написанию бойлерплейта ему же и поручать под каждое изменение.

Теги:
Рейтинг0
Комментарии5

Чем заменить Cursor на корпоративном ноуте

Последнюю неделю я пытаюсь выжить, совмещая основную работу с хакатоном. По идее, вывозить такую двойную нагрузку должен помогать spec-кодинг. Обычно для этого я просто открываю Cursor, но на работе его юзать нельзя (секьюрность), запрет на отправку кода во внешние API и всё такое. А писать всё руками после ИИ-ассистентов уже физически больно.

Пошел искать open-source альтернативы, чтобы можно было секьюрно spec-кодить через локальные и корпоративные LLM. Эксперименты с KiloCode с треском провалились, ну не нравится он мне. В итоге обновил стек на рабочем Маке и собрал такой сетап:

1️⃣ IDE Void - форк VS Code. Накатил туда все Java/Kotlin аддоны, подрубил MCP Atlassian, и теперь Qwen3-Coder-480B пытается писать код за меня. Как генератор - 🔥 . Правда, с Kotlin у LLM всё ещё не так гладко, как с Python или JS, поэтому генерирую я в Void, а ревьюить и дебажить всё равно ухожу в родную IDEA.

2️⃣ browserOs - форк Chromium со встроенным ИИ-чатом (аналог Comet от Perplexity, но работает с любыми LLM по API). Продукт местами сыроват, но главная фича реализована достойно. Самая большая боль - это дебильный рыжий логотип с собакой. Мой мозг отказывается ассоциировать это с браузером, и при переключении через Cmd+Tab я вечно не могу его найти.

Забавно, что на самом хакатоне я сейчас пилю инструмент, который решает похожие корпоративные боли enterprise-аналог NotebookLM. Суть простая: закидываешь в диалог с корпоративной LLM ссылки на внутреннюю Jira, Confluence или TestOps, а ИИ всё это переваривает и помогает по работе. Дали доступ к мощным моделям типа нового DeepSeek-V4, и результаты прям огонь.

И вот смотрю я на свой новый рабочий сетап и понимаю: апка, которую я делаю на хакатоне, идеально ложится в этот локально-корпоративный стек. Особенно если упаковать её в десктоп.

А может вообще вкатиться с ней в свой первый open-source?

Дебаж 🐞с ноги 🦶

Теги:
Всего голосов 4: ↑1 и ↓3-2
Комментарии0

Ближайшие события

На протяжении последних 3 месяцев активной работы с Claude Code Терминалом я постоянно дорабатывал свой Status Line

И вот, считаю, что он практически идеален

Это одна строка внизу терминала, которая показывает всё, что обычно приходится держать в голове или проверять руками. И многое из того, что интерфейсный клод код не показывает

Кому полезно
Если вы реально работаете в Claude Code, ведёте проекты в Git и хотите меньше думать о техническом состоянии сессии, а больше о самой задаче


Из чего состоит ⤵️⤵️⤵️

✔️ Модель
Сразу видно, на чём работаешь: Opus / Sonnet / Haiku, версия и размер контекста.

✔️ Папка и ветка Git
Показывает текущий проект и branch. Умеет делать truncate длинных названий проекта

✔️ Состояние репозитория
Modified / added / deleted / renamed / untracked / conflicts — всё в одной компактной строке. Конфликты подсвечиваются красным, потому что это единственное, что реально блокирует коммит.
Визуализируется через стандартные гитовские сокращения

3M — 3 files modified

1A — 1 added

1D — 1 deleted

1R — 1 renamed

2? — 2 untracked

1! — 1 conflict

✔️ Ahead / behind относительно origin
Надо ли пушить или подтянуть изменения

✔️ Drift между CLAUDE.md / AGENTS.md / GEMINI.md
Я использую и Claude Code, и CODEX и GEMINI — у них разные главные контекст-файлы.
Мой статуслайн показывает, когда они разъехались. Чтобы все имели одинаковый контекст

✔️ Контекстное окно
Це база
Показывает, сколько контекста уже занято: бар + токены типа 480k/1M. Есть ранние предупреждения, когда сессия начинает подходить к зоне, где Claude скоро захочет compact.

✔️ Prompt cache
Видно cache hit ratio, сколько токенов читается из кэша, сколько записывается, и когда TTL протухнет. Помогает лучше понимать, сколько стоит каждый запрос и была ли инвалидация кеша

✔️ Rate limits 5h и 7d
Показывает, сколько лимитов осталось и время до reset

Формат сделал плотным, чтобы всё помещалось в одну строку. Если нада, то можно сделать мультистрочный статуслайн

Цвета показывают уровень важности: норм / внимание / опасно

Плюс внутри несколько доп хуков


Ссылка на гитхаб
https://github.com/ilia-pluzhnikov/claude-code-statusline

Поделитесь, а что в вашем статуслайне

Теги:
Всего голосов 5: ↑4 и ↓1+4
Комментарии0

РБПО по ГОСТ Р 56939—2024: вебинар №10 из 30 – Статический анализ исходного кода

Компания ООО "ПВС" совместно с учебным центром "Маском" провела цикл вебинаров, посвящённых разработке безопасного программного обеспечения (РБПО). Совместно с приглашёнными экспертами различных компаний мы рассмотрели 25 процессов, приведённых в ГОСТ Р 56939—2024.

Предлагаем сегодня вашему вниманию вебинар цикла, посвящённый процессу, описанному в разделе 5.10. – "Статический анализ исходного кода". На YouTube. Слайды.

Цели десятого процесса по ГОСТ Р 56939—2024:

Предотвращение внесения потенциально опасных конструкций и ошибок в ПО, а также использования опасных конструкций и уязвимостей из заимствованного кода.

Общее количество вебинаров — 30: каждому из 25 процессов ГОСТа посвящено по одному вебинару и 5 записано дополнительно на смежные темы. Запись всех вебинаров и подборка дополнительной информации доступна по ссылке: ГОСТ56939.РФ.

Рассмотрение 10-го процесса в ГОСТ Р 56939—2024 неразрывно связано с другим ГОСТ Р 71207—2024 "Статический анализ программного обеспечения". В нём говорится о том же, только более подробно и конкретно.

Про ГОСТ Р 71207—2024 я отдельно рассказывал в цикле из пяти вебинаров:

  1. Общее описание и актуальность;

  2. Терминология;

  3. Критические ошибки;

  4. Технологии анализа кода;

  5. Процессы.

Разрабатываемый нами анализатор кода PVS-Studio совместим с ГОСТ Р 71207—2024 и закрывает 10-й процесс ГОСТ Р 56939—2024 для языков C, C++, C#, Java. Сейчас в процессе реализации поддержка языков Go, JavaScript, TypeScript. Попробовать PVS-Studio.

Теги:
Рейтинг0
Комментарии0

ИИ: Гонки на лафетах

Всего лишь иллюстрация. Примерно год-полтора назад решил я выбрать - deepseek или chatgpt. И выбрал deepseek. Однако через некоторое время стал обращать внимание не его лютый подхалимаж, что, кстати, не раз уже обыграли в различных мемах. Не в отношении deepseek, а относительно AI в общем.
Проблему обсудил и с deepseek, и с windows copilot (chatgpt был благополучно забыт). Deepseek стал подхалимски юлить, мол да, copilot хорош и все такое. Copilot же оправдал Deepseek - мол это такая технология поддержки энтузиазма в клиенте. Между прочим тонко намекнув, что сам-то он лучше и глубже. Но это присказка, сказка впереди.
В процессе завершения разработки обертки над EntityFramework попросил оценить проект сразу четверых: deepseek, copilot, chatgpt и grok. Результат ожидаем - сыровато, но в продакшн годно, оценки 4.5/5 и 7/10.
Претензии разные, существенных практически не было, но в одно они уперлись хором - "тяжелые" интерфейсы. Подробности опущу, это было семейство generic-интерфейсов со многими типами. Что-то вроде IInterface(T1), IInterface(T1,T2) и так далее, пока не надоест.
Несколько итераций я эти наезды игнорировал, но AI не унимались. Уже и оценки до 9/10 дошли, но проблема-то осталась.
Вспылил и написал письмо на полстраницы, начинавшееся фразой "Господа AI !". Концептуальное. Гневное. Циркулярное И получил ответы:
- ООО! Мы все поняли. Гениально, единственно верное решение.
Это deepseek 5/5 и copilot 10/10.
- Нуу... Проблема решена, но способ так себе... в общем 9/10 и есть гораздо лучшие альтернативы, рассмотрим?
Это chatcpt и grok. И что характерно, альтернативы предлагают разные, по паре штук каждый. Рассмотрим, конечно.

Это просто зарисовка не о разработке обертки, а о различных системах AI.

UPD: Забыл добавить - deepseek еще и извинился за необоснованные оценки :)))

Теги:
Всего голосов 4: ↑1 и ↓3-2
Комментарии1

РБПО по ГОСТ Р 56939—2024: вебинар №09 из 30 – Экспертиза исходного кода

Компания ООО "ПВС" совместно с учебным центром "Маском" провела цикл вебинаров, посвящённых разработке безопасного программного обеспечения (РБПО). Совместно с приглашёнными экспертами различных компаний мы рассмотрели 25 процессов, приведённых в ГОСТ Р 56939—2024.

Предлагаем сегодня вашему вниманию вебинар цикла, посвящённый процессу, описанному в разделе 5.9. – "Экспертиза исходного кода". На YouTube. Слайды.

Цели девятого процесса по ГОСТ Р 56939—2024:

Обеспечение соответствия исходного кода ПО предъявляемым к нему требованиям.

Общее количество вебинаров — 30: каждому из 25 процессов ГОСТа посвящено по одному вебинару и 5 записано дополнительно на смежные темы. Запись всех вебинаров и подборка дополнительной информации доступна по ссылке: ГОСТ56939.РФ.

Теги:
Всего голосов 3: ↑2 и ↓1+1
Комментарии0

РБПО по ГОСТ Р 56939—2024: вебинар №08 из 30 – Формирование и поддержание в актуальном состоянии правил кодирования

Компания ООО "ПВС" совместно с учебным центром "Маском" провела цикл вебинаров, посвящённых разработке безопасного программного обеспечения (РБПО). Совместно с приглашёнными экспертами различных компаний мы рассмотрели 25 процессов, приведённых в ГОСТ Р 56939—2024.

Предлагаем сегодня вашему вниманию вебинар цикла, посвящённый процессу, описанному в разделе 5.8. – "Формирование и поддержание в актуальном состоянии правил кодирования". На YouTube. Слайды.

Цели восьмого процесса по ГОСТ Р 56939—2024:

Обеспечение эффективной и единообразной организации оформления и использования исходного кода в соответствии с предъявляемыми к ПО требованиями.

Общее количество вебинаров — 30: каждому из 25 процессов ГОСТа посвящено по одному вебинару и 5 записано дополнительно на смежные темы. Запись всех вебинаров и подборка дополнительной информации доступна по ссылке: ГОСТ56939.РФ.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Делаем мир чуть чуть лучше

Представьте что вы упоролись по решению какой-то баги в вашем приложении и просидели час с агентом пытаясь разобраться в произошедшем. А в конце оказывается что это баг в какой-то внешней либе. По хорошему, в таких кейсах, стоит пойти в ишьюсы к проекту и написать туда о баге, но до появления агентов это было крайне лениво. Надо собрать всю инфу, правильно оформить, учесть правила конкретного репозитория. Мало кто захочет с этим возиться, но щас ситуация крайне поменялась.

Буквально недавно я так дебажил одну рубишную либу и выяснилось что там внутри есть косячки. Не долго думая, прямо в той же сессии я попросил агента собрать ишью дал линк на репу и потом просто скопировал это туда на гитхаб (наверное можно было попросить его сделать ишью автоматом, попробую так в следующий раз). Получилось очень обстоятельно с примерами кода, описанием того где ошибка. При желании можно было бы сразу пулреквест кинуть, но я не был уверен в какую сторону решит пойти автор либы. Вот кстати тот ишьюс. И фикс был сделан буквально в тот же день.

В общем не ленитесь, помогайте разработчикам опенсорс либ, которые вы используете. Это и вам плюс в карму (и в портфолио) и благодарность людям, на которых держаться наши проекты

Теги:
Всего голосов 7: ↑5 и ↓2+5
Комментарии4

«Просто добавь кнопку» и недели работы

Однажды заказчик пришёл с задачей, которая звучала как пара часов работы «Просто добавь кнопку — нажал, выгрузил данные, всё». Я открыла код и поняла, что эта кнопка стоит не пару дней, а недель — и это если повезёт..

Сложнее всего оказалось не сделать, а объяснить так, чтобы услышали.

С технической стороны всё понятно: сервис писался под дедлайн, архитектура не предусматривала роста, и каждое новое изменение тянет за собой минимум три соседних. Но заказчик смотрит на задачу и видит один экран. Кнопки ещё нет, но она же просто кнопка. Что тут может быть сложного?

Архитектурное объяснение я попробовала и оно не зашло. Слои, связи, зависимости: всё правильно, всё мимо.

Что работает вместо «красивого кода»

Я перестала объяснять как устроено и начала объяснять что произойдёт. Не «тут монолитная структура без инверсии зависимостей», а конкретно: — эта кнопка затрагивает три модуля, которые никто не трогал два года — если что‑то сломается, то мы не узнаем сразу, потому что тестов нет — следующая фича после этой будет стоить столько же в лучшем случае.

Заказчик услышал третий пункт. Именно его.

Нетехнический человек воспринимает разработку примерно так: «нажал кнопку → произошла магия → получил результат». Это не незнание — просто другая роль. Заказчик и не должен думать об архитектуре, это моя работа. Значит, говорить на его языке — тоже моя.

Как я считаю стоимость следующей фичи

Со временем сложился свой фреймворк. Не из учебника, а из разговоров, где меня не понимали, пока я не поменяла подход.

Три вещи, которые я оцениваю перед тем, как называть сроки: 1. Базовая сложность: сколько займёт в идеальных условиях, на нормальной архитектуре. 2. Архитектурный коэффициент — во сколько раз реальность дороже идеала. Код без тестов, с жёсткими связями между модулями — это 2-4× к оценке. Не абстракция: вот здесь нельзя менять, не затронув вот это. Рисую буквально на бумаге. 3. Риск‑налог — что может пойти не так. Что сломается, насколько быстро заметят, сколько займёт починка. Не чтобы напугать, а чтобы показать, что «быстро» и «надёжно» здесь в противоречии.

Когда эти три числа стоят рядом — разговор меняется. Заказчик видит, что не «разработчик тормозит», а «вот цена, вот риск, вот выбор».

Именно тогда и появляется разговор про рефакторинг. Не потому что «код некрасивый», а потому что каждая следующая фича будет дороже предыдущей, если ничего не менять.

Что осталось в голове

Техдолг — это не технический вопрос. Это финансовый.

Пока объясняешь его как технический — тебя не услышат. Как только переводишь в деньги, сроки и риски — начинают слышать.

Самое сложное не методология. Самое сложное — поймать момент, когда ты всё ещё говоришь на своём языке, а не на их. У меня ушло время, чтобы это почувствовать.

А вы как объясняете техдолг тем, кому важен результат, а не архитектура? Есть формулировка, которая сработала лучше всего?

Теги:
Всего голосов 7: ↑5 и ↓2+3
Комментарии3