Ваш ИИ-код выдает МУСОР? (Вот как это исправить)

BBetter Stack
Computing/SoftwareManagementInternet Technology

Transcript

00:00:00Сегодня я хочу поговорить о CRAP. И нет, это не тот самый CRAP.
00:00:05Я говорю об аббревиатуре, которая расшифровывается как Change Risk Anti-Patterns Index.
00:00:12Она предназначена для поиска рискованных функций в вашем коде — тех, что обладают высокой сложностью, но плохо протестированы.
00:00:18Это не новая концепция, но она привлекла мое внимание в последнее время благодаря пакету, выпущенному
00:00:24Александром Прохоренко под названием Cargo CRAP, который выявляет эти ключевые функции в коде на Rust.
00:00:31Сама идея метрики CRAP принадлежит Альберто Савойе и Бобу Эвансу, которые придумали эту
00:00:37метрику еще в 2007 году, экспериментируя с инструментами автоматизированного тестирования.
00:00:44Но Александр недавно подогрел интерес к этой забытой метрике, написав проницательную статью о ней,
00:00:49и о том, почему сейчас, когда почти весь код пишется ИИ-агентами, как никогда важно
00:00:55сканировать кодовую базу на предмет подобных скрытых проблем. Это отличная концепция, и мы подробно разберем её
00:01:01в сегодняшнем видео. Давайте приступим. Чтобы понять, почему это важно, давайте взглянем на эту функцию на моем экране.
00:01:11Она выполняет многоступенчатое преобразование данных с глубоко вложенными операторами match,
00:01:16несколькими циклами и множеством путей обработки ошибок. Так что её цикломатическая сложность довольно высока — около 15.
00:01:24Если вы не знакомы с термином «цикломатическая сложность», то это, по сути, причудливый способ измерения того,
00:01:30сколько различных путей может пройти фрагмент данных через ваш код. Каждый раз, когда вы пишете if,
00:01:36match, цикл while или блок catch, вы создаете развилку, и чем больше таких развилок,
00:01:43тем выше показатель сложности. И тем сложнее человеческому мозгу просчитать все возможные варианты развития событий
00:01:51внутри функции. Именно поэтому мы стараемся разбивать функции на более мелкие задачи.
00:01:57И для этой функции на экране сложность 15 означает, что существует 15 совершенно разных путей,
00:02:04по которым этот код может выполняться от начала до конца. Если эта функция полностью покрыта модульными тестами,
00:02:09то её оценка CRAP остается равной 15. Она сложная, но безопасная, потому что мы подтвердили её поведение.
00:02:16И именно этого мы ожидаем при запуске инструмента CargoCrap. Здесь мы видим, что оценка равна 13,
00:02:23а не 15. Вероятно, библиотека не учла обработчики ошибок.
00:02:27В любом случае, 15 и 13 — это довольно близкие значения. Так что инструмент работает как надо.
00:02:33Но давайте посмотрим, что будет, если кто-то удалит эти тесты или если ИИ-агент сгенерирует функцию
00:02:39с нуля и вообще не напишет тесты. В этом примере я просто закомментирую свои тесты.
00:02:45И если мы снова запустим CargoCrap, то оценка внезапно подскочит выше 100.
00:02:51Этот инструмент использует простую формулу для расчета риска, балансирующую цикломатическую сложность —
00:02:57количество линейных путей выполнения кода — и покрытие тестами.
00:03:03Если мы взглянем на эту функцию, где C — цикломатическая сложность, а COV — покрытие тестами
00:03:10в виде дроби от нуля до единицы. Эта формула сильно штрафует сложный код без тестов.
00:03:17Так что если покрытие составляет сто процентов, вся первая часть уравнения обнуляется,
00:03:23и ваша оценка CRAP просто равна цикломатической сложности.
00:03:26Но если покрытие падает, кубический показатель степени в левой части заставляет оценку риска взлетать.
00:03:33Функция со сложностью 10 и нулевым покрытием дает оценку CRAP 110.
00:03:39И это хорошо, потому что если вы хотите кодовую базу, где, скажем,
00:03:43ни одна функция не превышает цикломатическую сложность пять, то это ваш базовый показатель для контроля.
00:03:49И если какая-то функция станет сложнее пяти, вы будете знать, что это область, требующая внимания.
00:03:55Обычно допускается более высокая сложность. По умолчанию в CargoCrap установлено значение 30.
00:04:00Но я лишь говорю, что вы можете настроить эту метрику самостоятельно так, как пожелаете.
00:04:05По сути, это хороший «средний» показатель, на который стоит обращать внимание.
00:04:09И это становится критически важным в эпоху ИИ-сгенерированного кода.
00:04:13Потому что ИИ-агенты невероятно хороши в создании высокосложных, синтаксически верных блоков кода,
00:04:20которые обрабатывают даже те крайние случаи, о которых вы не подумали, но они крайне плохо пишут
00:04:25осмысленные и надежные интеграционные тесты, если их не заставлять это делать явно.
00:04:30Так что такие инструменты, как CargoCrap, предназначены для использования в качестве дополнительной проверки после прохождения всех модульных тестов,
00:04:37чтобы оценить общее качество кода.
00:04:39В сущности, он работает как тепловая карта вашего технического долга, указывая прямо на тот код,
00:04:44который с наибольшей вероятностью сломается при рефакторинге.
00:04:47Это также особенно полезно, если вы хотите поддерживать хорошо структурированную кодовую базу,
00:04:52в случае, если вам нужно нанять нового инженера в команду.
00:04:56И по рассказам мы знаем, насколько безумно захламленными могут стать кодовые базы из-за всего этого
00:05:02ИИ-сгенерированного кода в наши дни, если мы не будем проявлять бдительность.
00:05:06А иногда у ИИ-агентов есть тенденция дублировать одну и ту же функцию в нескольких файлах.
00:05:13Поэтому я считаю важным знать о подобных инструментах и, что более важно, о подобных методологиях,
00:05:19и не забывать о них в современном процессе разработки для поддержания высокого качества кода.
00:05:24Авторы этой методологии также выпустили метрику CRAP для Java.
00:05:30Честно говоря, до прочтения статьи Александра я даже не знал об этой метрике.
00:05:34Поэтому я благодарен, что его инструмент заставил меня заметить эту давно забытую инженерную практику.
00:05:40И я уверен, что другие языки программирования тоже выиграли бы от такого инструмента.
00:05:44Так что если вы ищете интересный проект для свободного времени,
00:05:48прочитайте оригинальную статью Альберто Савойи и сделайте такой инструмент для другого языка,
00:05:53ведь это может стать очень полезной утилитой для многих разработчиков.
00:05:57Итак, друзья, вот и всё.
00:05:58Это CRAP в двух словах.
00:06:01Прозвучало забавно.
00:06:02В любом случае, какие еще забытые инженерные практики или метрики вы знаете,
00:06:08на которые нам следует обратить внимание в эпоху агентного кодинга?
00:06:13Дайте знать в комментариях ниже.
00:06:15И ребята, если вам нравятся такие технические разборы,
00:06:18пожалуйста, дайте мне знать, нажав кнопку лайка под видео.
00:06:21И также не забудьте подписаться на наш канал.
00:06:24С вами был Андрус из BetterStack, увидимся в следующих видео.
00:06:28Увидимся в следующих видео.

Key Takeaway

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

Highlights

  • Индекс CRAP (Change Risk Anti-Patterns) количественно оценивает риск функций, сочетая цикломатическую сложность кода с его покрытием тестами.

  • Цикломатическая сложность измеряет количество независимых путей выполнения через фрагменты кода, такие как операторы if, match и циклы.

  • Инструмент CargoCRAP для языка Rust выявляет функции с высокой сложностью и недостаточным тестированием.

  • Формула расчета CRAP значительно увеличивает показатель риска, если код со сложностью выше 10 не имеет покрытия тестами, доводя оценку до 110 и выше.

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

Timeline

Определение и расчет метрики CRAP

  • Аббревиатура CRAP расшифровывается как Change Risk Anti-Patterns Index.
  • Метрика вычисляет риск на основе цикломатической сложности и покрытия тестами.
  • Цикломатическая сложность отражает количество потенциальных путей выполнения функции.

Индекс CRAP создан для идентификации сложных функций, которые недостаточно протестированы. Цикломатическая сложность возрастает с появлением каждой логической развилки, такой как match, if или циклы. Функция со сложностью 15, полностью покрытая тестами, сохраняет оценку CRAP на уровне 15, оставаясь безопасной.

Применение метрики в автоматизированной среде

  • Отсутствие тестов для функции со сложностью 10 приводит к оценке CRAP в 110 баллов.
  • Формула расчета использует кубическую зависимость для штрафования сложного кода без тестов.
  • Инструмент CargoCRAP позволяет контролировать технический долг в проектах на Rust.

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

Актуальность метрики в эпоху ИИ-кодинга

  • ИИ-агенты эффективно создают сложные функции, но редко пишут качественные интеграционные тесты.
  • Метрика CRAP служит тепловой картой технического долга для выявления участков, склонных к поломкам при рефакторинге.
  • Разработка подобных инструментов для других языков программирования повышает качество автоматизированной разработки.

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

Community Posts

No posts yet. Be the first to write about this video!

Write about this video