Автор: Денис Аветисян
Новое исследование показывает, что современные нейросетевые модели способны эффективно находить проблемные участки в коде, известные как «code smells».

Оценка эффективности больших языковых моделей для обнаружения «code smells» и их комбинирование с традиционными инструментами статического анализа.
Несмотря на широкое распространение статических анализаторов кода, выявление «неприятных запахов» в коде, влияющих на его качество и поддерживаемость, остается сложной задачей. В данной работе, ‘Beyond Strict Rules: Assessing the Effectiveness of Large Language Models for Code Smell Detection’, исследуется потенциал больших языковых моделей (LLM) для обнаружения подобных дефектов, в отличие от жестких правил традиционных инструментов. Полученные результаты показывают, что LLM эффективно выявляют структурно простые «запахи», а комбинирование их с существующими анализаторами позволяет достичь лучших результатов в большинстве случаев. Каким образом можно оптимизировать подобную гибридную стратегию для минимизации ложных срабатываний и максимизации точности обнаружения «запахов» в различных типах проектов?
Ясность в Коде: Проблема Масштабируемого Качества
Современные программные проекты предъявляют высокие требования к качеству кода, поскольку от него напрямую зависит надежность и возможность поддержки системы в будущем. Однако, по мере роста сложности и масштаба проектов, ручная проверка кода становится всё менее эффективной и практически нереализуемой. Традиционные методы контроля качества, основанные на визуальном осмотре, не способны охватить весь объём кода и требуют значительных временных затрат. Это приводит к накоплению ошибок, увеличению технического долга и, в конечном итоге, к снижению скорости разработки и повышению рисков возникновения критических сбоев. В связи с этим, автоматизация процессов контроля качества становится необходимостью для обеспечения стабильной и долгосрочной поддержки сложных программных систем.
Неприятные “запахи” в коде, известные как code smells, часто остаются незамеченными в процессе разработки, что приводит к накоплению технического долга и усложняет поддержку программного обеспечения в долгосрочной перспективе. Эти сигналы, указывающие на потенциальные проблемы в структуре или реализации кода, могут быть незначительными по отдельности, однако их игнорирование постепенно приводит к снижению читаемости, увеличению сложности и повышению вероятности ошибок. Накопление технического долга, вызванного пропущенными code smells, требует все больше времени и ресурсов на исправление, а также может существенно замедлить разработку новых функций и адаптацию к изменяющимся требованиям. В конечном итоге, это негативно сказывается на качестве продукта и общей эффективности работы команды.
Традиционные инструменты статического анализа кода, несмотря на свою полезность, часто оказываются неэффективными при работе с современными, сложными кодовыми базами. Они склонны генерировать большое количество ложных срабатываний — сигналов о проблемах, которые на самом деле не являются таковыми. Это происходит из-за неспособности этих инструментов учитывать контекст, особенности архитектуры и сложность взаимосвязей в крупных проектах. В результате разработчики вынуждены тратить значительное время на проверку и отбрасывание ошибочных предупреждений, что снижает производительность и затрудняет выявление реальных проблем в коде. Подобная ситуация подчеркивает необходимость в более интеллектуальных и точных методах анализа, способных эффективно работать с растущей сложностью современного программного обеспечения.
Автоматизированное и точное выявление «неприятных запахов» в коде становится ключевым фактором эффективной разработки программного обеспечения. В условиях постоянно растущей сложности проектов и ограниченности ресурсов, ручной анализ кода становится непрактичным и чреват пропуском критических дефектов. Выявление таких «запахов» — индикаторов потенциальных проблем в архитектуре и реализации — позволяет своевременно обнаружить и устранить технический долг, значительно снижая затраты на сопровождение и повышая надежность программного продукта. Внедрение автоматизированных инструментов анализа, способных с высокой точностью идентифицировать проблемные участки кода, позволяет разработчикам сосредоточиться на создании новых функций и улучшении качества продукта, а не на отладке и рефакторинге устаревшего кода.
Новый Взгляд: LLM для Обнаружения Code Smells
Большие языковые модели (LLM) демонстрируют способность к пониманию семантики кода, превосходя традиционный статический анализ по точности и нюансам. В отличие от статических анализаторов, которые основываются на сопоставлении с заранее заданными шаблонами, LLM способны анализировать код как естественный язык, учитывая контекст и взаимосвязи между элементами. Это позволяет им выявлять более сложные и тонкие проблемы в коде, которые могут быть пропущены традиционными методами, и существенно снижает количество ложных срабатываний. Способность LLM к пониманию семантики позволяет оценивать не только синтаксическую корректность кода, но и его логическую структуру и потенциальные недостатки с точки зрения читаемости, поддерживаемости и производительности.
Для обнаружения проблем качества кода в Java могут быть использованы большие языковые модели (LLM), такие как GPT-5 mini, Llama-3.3, DeepSeek-R1 и Qwen2.5-Coder. Эти модели способны анализировать исходный код напрямую, выявляя так называемые «code smells» — индикаторы потенциальных проблем в архитектуре или реализации. В отличие от традиционных инструментов статического анализа, LLM не ограничиваются поиском заранее заданных шаблонов, а способны учитывать контекст кода, что позволяет более точно идентифицировать проблемные участки и снизить количество ложных срабатываний. В процессе анализа LLM рассматривают код как последовательность токенов, аналогичную естественному языку, и оценивают его качество на основе семантического понимания.
Традиционные методы обнаружения «кода с запахом» (code smells) часто основываются на сопоставлении с заданными шаблонами, что приводит к большому количеству ложных срабатываний. В отличие от них, использование больших языковых моделей (LLM) позволяет перейти к более глубокому, контекстуальному анализу исходного кода на Java. LLM способны учитывать семантику и взаимосвязи между элементами кода, что позволяет снизить количество ложных срабатываний и повысить точность обнаружения реальных проблем качества, поскольку они оценивают код не по формальным признакам, а по его смысловому содержанию и потенциальному влиянию на поддерживаемость и надежность.
Основная концепция подхода заключается в интерпретации исходного кода как естественного языка. Это позволяет большим языковым моделям (LLM) не просто сопоставлять код с заданными шаблонами, а анализировать его семантику и контекст. LLM, обученные на огромных объемах текстовых и кодовых данных, способны «читать» и «понимать» код подобно тому, как они обрабатывают человеческий язык, что позволяет выявлять потенциальные проблемы качества, такие как избыточная сложность, дублирование кода или нарушение принципов проектирования, с большей точностью и меньшим количеством ложных срабатываний по сравнению с традиционными инструментами статического анализа.
Подтверждение Эффективности: Метрики и Сравнения
Для оценки эффективности обнаружения «кода с запахом» на основе больших языковых моделей (LLM) использовался комплекс метрик, включающий точность (precision), полноту (recall) и F1-меру. Точность определяет долю правильно идентифицированных «запахов» среди всех обнаруженных, полнота — долю правильно идентифицированных «запахов» от их общего количества в наборе данных, а F1-мера является гармоническим средним между точностью и полнотой, обеспечивая сбалансированную оценку производительности. F1 = 2 <i> (Precision </i> Recall) / (Precision + Recall) Использование F1-меры позволяет более объективно сравнивать различные подходы к обнаружению «кода с запахом», особенно в случаях, когда необходимо учитывать как ложноположительные, так и ложноотрицательные результаты.
Для обеспечения надежной оценки точности обнаружения кода-запаха, был создан эталонный набор данных посредством ручной экспертной оценки (‘Human Evaluation’). В процессе эксперты вручную проанализировали значительный объем кода и определили наличие или отсутствие каждого целевого кода-запаха (Long Method, Large Class, Feature Envy, Intensive Coupling, Refused Bequest). Этот набор данных, сформированный на основе консенсуса экспертов, служит «золотым стандартом», позволяющим объективно сравнивать результаты работы LLM и традиционных инструментов статического анализа, а также вычислять метрики точности, такие как точность (precision) и полнота (recall).
Результаты экспериментов показали, что комбинация больших языковых моделей (LLM) и традиционных инструментов статического анализа позволяет достигать высокой полноты (recall) и точности (F1-Score) при обнаружении кодовых проблем (code smells). Максимальное значение F1-Score, достигнутое в ходе тестирования, составило 0.93 для структурно явных проблем, что свидетельствует о высокой эффективности комбинированного подхода в выявлении данных типов дефектов. Данный показатель демонстрирует способность системы минимизировать как ложноположительные, так и ложноотрицательные срабатывания при анализе кода.
Детальный анализ был проведен для выявления конкретных проблем в коде, таких как «Длинный метод», «Большой класс», «Зависть к признакам», «Интенсивная связь» и «Отказ от наследия». Комбинирование LLM-моделей с традиционными инструментами статического анализа последовательно повышало показатель полноты (recall) для каждой из перечисленных проблем в коде, демонстрируя улучшение эффективности обнаружения. Повышение полноты указывает на способность комбинированной стратегии находить больше фактических случаев проблем в коде, минимизируя количество ложных отрицательных результатов.
Синергия Обнаружения: Комбинирование LLM и Статического Анализа
Разработана комбинированная стратегия предсказаний, объединяющая результаты, полученные с помощью больших языковых моделей (LLM) и инструментов статического анализа, для повышения эффективности обнаружения “кода с запахом” (code smells). Данная стратегия предполагает интеграцию семантического понимания кода, обеспечиваемого LLM, с возможностями статического анализатора, позволяющего выявлять конкретные паттерны и потенциальные уязвимости. Интеграция результатов позволяет не только идентифицировать проблемные участки кода, но и снизить количество ложноположительных срабатываний, повышая общую точность обнаружения. В процессе интеграции результаты работы LLM и статического анализатора объединяются и анализируются совместно, что позволяет получить более полное и надежное представление о качестве кода.
Данный подход использует семантическое понимание кода, обеспечиваемое большими языковыми моделями (LLM), в сочетании со способностью инструментов статического анализа выявлять конкретные паттерны и уязвимости. LLM анализируют код с точки зрения его смысла и структуры, что позволяет обнаруживать сложные code smells, которые трудно определить с помощью традиционных методов. Инструменты статического анализа, напротив, эффективно находят известные антипаттерны и потенциальные уязвимости, основываясь на заранее определенных правилах и сигнатурах. Комбинирование этих двух подходов позволяет получить более полное и точное представление о качестве кода, выявляя как явные, так и скрытые проблемы.
Комбинированная стратегия, объединяющая результаты анализа LLM и статического анализа кода, демонстрирует превосходство над использованием каждого метода по отдельности. Экспериментальные данные показывают снижение количества ложноположительных срабатываний и повышение общей точности обнаружения проблем в коде. Это достигается за счет синергии между семантическим пониманием кода, обеспечиваемым LLM, и способностью статического анализа выявлять конкретные паттерны и потенциальные уязвимости, что позволяет более эффективно отфильтровывать нерелевантные предупреждения и повышать надежность результатов анализа.
При оценке эффективности комбинированной стратегии обнаружения кода с запахом установлено, что, несмотря на высокие показатели полноты (recall) и F1-меры для структурно явных проблем, точность (precision) снижалась при обнаружении более субъективных недостатков кода. Это указывает на то, что для выявления таких проблем, требующих экспертной оценки и понимания контекста, необходимы специализированные инструменты и подходы, дополняющие возможности LLM и статического анализа.
Исследование демонстрирует, что большие языковые модели способны эффективно выявлять «запах кода», особенно в тех случаях, когда паттерны структурны и очевидны. Подобно тому, как архитектор стремится к удалению избыточности, чтобы система функционировала безупречно, модели демонстрируют способность к «компрессии без потерь» информации о качестве кода. Как однажды заметил Роберт Тарьян: «Простота — высшая степень совершенства». Этот принцип напрямую соотносится с результатами исследования, показывающими, что наиболее эффективным подходом является комбинация LLM с традиционными инструментами статического анализа — отказ от излишней сложности ради ясной и надежной системы.
Куда же дальше?
Представленная работа, безусловно, демонстрирует способность больших языковых моделей распознавать «дурные запахи» в коде. Однако, истинное совершенство не в количестве обнаруженных проблем, а в понимании их первопричин. Модели преуспевают там, где структура очевидна, но что происходит, когда «запах» исходит от архитектурных решений, продиктованных не небрежностью, а сложными компромиссами? Этот вопрос остаётся открытым.
Наиболее перспективным направлением представляется не просто объединение LLM с традиционными инструментами статического анализа, но и создание систем, способных объяснять обнаруженные проблемы. Простое указание на проблемный участок кода — это лишь половина дела. Необходимо, чтобы система могла предложить разумные варианты рефакторинга, учитывая контекст и возможные последствия. Иначе, мы получим лишь более сложный инструмент для поиска известных проблем.
В конечном счете, успех в этой области зависит не от увеличения размера моделей или сложности алгоритмов, а от способности увидеть за формальными признаками реальные проблемы проектирования и обслуживания программного обеспечения. Код должен быть не просто работоспособным, но и понятным, а интуиция — лучшим компилятором для оценки его качества.
Оригинал статьи: https://arxiv.org/pdf/2601.09873.pdf
Связаться с автором: https://www.linkedin.com/in/avetisyan/
Смотрите также:
- Восполняя пробелы в знаниях: Как языковые модели учатся делать выводы
- Квантовый Монте-Карло: Моделирование рождения электрон-позитронных пар
- Разгадывая тайны квантового мира: переработка кубитов и шум как тайная приправа?
- Скрытая сложность: Необратимые преобразования в квантовых схемах
- Автономный поисковик научных статей: новый подход
- Квантовый скачок из Андхра-Прадеш: что это значит?
- Виртуальная примерка без границ: EVTAR учится у образов
- Геометрия на пределе: как алгоритмы оптимизации превосходят языковые модели
- Оптимизация партийных запросов: Метод имитации отжига против градиентных подходов
2026-01-18 12:42