Интеграция алгоритма распознавания образа "плохого" кода с SonarQube

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

Придавать каждому правилу уровень критичности и ориентироваться на различные пороговые значения при оценке качества кода не совсем очевидно. Действительно, к примеру, руководствуясь какими соображениями можно понять какой может быть максимальная длина методов или сколько аргументов допустимо использовать в методах или является ли критичным использование имени поля log вместо LOG? Или откуда следует, что верхний порог цикломатической сложности метода должен быть именно 15?

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

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

  • Общее число строк кода
  • Число строк содержащих код
  • Число строк с комментариями
  • Число строк с кодом и комментариями
  • Число пустых строк
  • Метрики Хальстеда
  • Характеристики цепочек вызовов
  • Длина кода в символах
  • Размер кода в лексических токенах
  • Плотность строк
  • Наличие длинной строки
  • Число строк
  • Сумма всех строк в символах
  • Число классов
  • Число методов
  • Цикломатическая сложность
  • Метрика когнитивной сложности
  • Нарушения правил SonarQube. Каждое правило - это вход нейросети, на вход подается число нарушний правила.

Выход нейросети - это индекс качества кода, число от 0 до 1. Ближе к 0 - это "плохой" код, нуждающийся в рефакторинге. Ближе к 1 - это "хороший" код, не нуждающийся в рефакторинге. Т.е. с помощью нейросети можно оценить нуждается ли фрагмент кода в рефакторинге.

Qualiter 4.5.0 - состоит из двух частей.

  • SonarQube плагин с открытим исходным кодом, распространяющийся по лицензии "GNU Lesser General Public License v3.0", смотрите исходные коды тут: https://github.com/MaximkinSystems/qualiter, скачать собранную и готовую к использованию версию можно тут: sonar-qualiter-plugin-4.5.0.jar. В плагине происходит расчет метрик, т.е. преобразование программного кода во входной вектор нейросети. Так же происходит оценка необходимости рефакторинга кода с помощью дампа нейросети, который загружается из серверной проприетарной части.
  • Серверная проприетарная часть, в которой происходит обучение нейросети и формирование дампа нейросети. Так же реализован web интерфейс для разметки обучующей выборки с помощью "голосования"

Вручную было отобрано около 2000 примеров "хороших" и "плохих" кодов. На половине примеров проводится обучение, на половине валидация. Точность распознавания в валидационном множестве составляет порядка 85%

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

В настройках плагина Qualiter в параметре sonar.qualiter.url можно задать адрес серверной части анализатора, по умолчанию используется наша серверная часть http://cloud.qualiter.ru

Дамп нейросети "по умолчанию" зашит в плагин, но если в настройках плагина поставить галочку sonar.qualiter.load.net.dump в true то с серверной части анализатора будет загружаться более актуальный дамп нейросети. Более актуальный дамп можно скачать по адресу http://cloud.qualiter.ru/api/net-dump

Если Вы не хотите что бы сервер с SonarQube с работающем на нем плагином Qualiter имел доступ в интернет но при этом хотите что бы использовался более актуальный дамп нейросети то Вы можете скачать актуальный дамп по адресу http://cloud.qualiter.ru/api/net-dump, разместить его в своей внутренней сети и указать внутренний адрес в настройках плагина.

Если Вы в своем проекте нашли "плохой" код, не спешите его рефакторить, пометьте его комментарием в начале файла

/* QualiterIndex=0 */

В настройках есть возможность выключить/включить загрузку Ваших исходных кодов в сереверную часть Qualiter (по умолчанию cloud.qualiter.ru) во время анализа проекта. После загрузки Ваши исходные коды будут доступны на сайте http://cloud.qualiter.ru/vote в разделе "Обучение ИИ".

Соответственно, при следующем обучении нейросети система учтёт Ваш пример в качестве примера с нулевым индексом качества, т.е. в качестве кода который нуждается в рефакторинге, что отразится на дампе нейросети http://cloud.qualiter.ru/api/net-dump

По умолчанию Qualiter нигде не сохраняет Ваши исходные коды

В качесте "негативных" обучающих примеров можно использовать фрагменты кода, в которых произошла реальная ошибка. Такие примеры можно получать анализируя логи с production. Возможность распознать образ "ошибочного кода" увеличивает ценность подхода с использованием искусственного интеллекта.

Дата обновления страницы: 07 февраля 2019 22:30

Новости

  • Релиз Qualiter 4.5.0. Произведена интеграция с платформой SonarQube
    30 января 2019
  • Релиз Qualiter 3.1.0. Добавили Rest API.
    04 сентября 2018
  • Релиз Qualiter 3.0.3. Утилита для оценки необходимости рефакторинга компиляционной единицы Java кода. Доступно онлайн Demo.
    16 июля 2018
Все новости