Прогнозирование дефектов в программном обеспечении (часть 2)

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

Как уже было сказано реализованные инструментальные средства в MSR среде — редкость. Честное слово, уже порядком поднадоели публикации, содержащие восторженные возгласы в духе «Мы предлагаем новую модель прогнозирования дефектов. Она такая замечательная! Она позволяет делать прогнозы с высокой точностью. Мы проверили её на исходном коде следующей версии Windows и получили многообещающие результаты». У меня всегда возникают одни и те же вопросы. И что дальше?! Где Ваша модель? Как я будучи разработчиком или исследователем могу ей воспользоваться, сравнить свои результаты с Вашими?

MSR Tools в этом плане, конечно, не впереди планеты всей, но всё же способен предложить хоть что-то работающее. Для практики нам понадобится последняя версий MSR Tools 0.3.2. Предполагается, что Вы уже выполнили мэппинг данных для Вашего проекта. Я же для примера возьму общедоступные данные для проекта gnome-terminal. Прогнозирование дефектов осуществляется для отдельных релизов, хотя в принципе ничто не мешает делать это для любой отдельной ревизии в системе контроля версий. Пока что MSR Tools не выполняет мэппинг релизов автоматически, поэтому для Вашего проекта это придётся сделать вручную. Это очень просто и делается так:

Приведённая выше команда добавляет в базу данных хранящую историю изменений Вашего проекта новый релиз. Это релиз «1.0», который был выполнен в 100 ревизии. Это для SubVersion. Для Git вместо номера придётся указать полный хеш ревизии.

Для получения прогноза необходимо запустить приложение MSR.Tools.Predictor и через меню «File/Open config…» открыть файл конфигурации для Вашего проекта. После этого Вы увидите примерно следующую картинку:

Окно прогнозированияВ появившемся окне можно видеть доступные модели прогнозирования и релизы Вашего проекта. Теперь внизу следует выбрать опцию «All selected releases» и отметить все релизы в списке выше. В меню нужно отметить пункт «View/Show files» и снять отметки с пунктов «View/Evaluate» и «View/Evaluate using ROC». Далее следует выбрать модель, которую Вы хотите использовать и выбрать команду меню «Command/Predict». Далее последует расчёт, который будет тем медленнее чем больше файлов в Вашем проекте. А после будет выдан список файлов, которые в соответствии с прогнозом содержат необнаруженные дефекты.

Теперь о моделях. На данный момент в MSR Tools реализовано три модели прогнозирования дефектов. Simple total LOC model — самая простая и быстрая. Она прогнозирует наличие в файлах дефектов основываясь только на данных об объёме кода в этих файлах. Используется логистическая регрессия, оценка параметров которой осуществляется на основе выборки данных о количестве строк кода в каждом отдельном файле и наличии в нём дефектов для каждого релиза. Вообще говоря не самая правильная реализация (хотя и неплохая). Но по хорошему нужно использовать регрессию, которая позволяла бы учитывать количество дефектов, а не просто факт их наличия.

Другая модель Custom model — более сложна и интересна. Также использует логистическую регрессию, но в качестве независимых переменных для оценки параметров регрессии кроме общего числа строк кода может использовать и другую информацию: количество строк добавленных или удалённых со времени прошлого релиза, количество модификаций файла со времени прошлого релиза, количество исправленных дефектов, метрики связанные с плотностью ошибок. Всего 8 различных метрик. Каждую из них в отдельности можно включить/выключить через файл конфигурации. Итого получаем 255 различных вариантов модели, одна из которых будет идентична Simple total LOC model. Поэтому эта модель и называется «custom». Какая комбинация метрик более предпочтительна и чаще других даёт более точные прогнозы — вопрос. Ответить на него можно выполнив эксперимент, но мне пока было не до этого.

Наконец последняя модель — Code stability model. Это моё ноу-хау :), чисто вероятностная модель. Она пока не совсем готова, хотя уже сейчас во многих случаях даёт более качественные прогнозы чем две другие модели.

Какие бы релизы Вы не выбрали прогноз всегда будет осуществляться для последнего из выбранных. Если вы хотите выполнить прогноз для имеющегося на данный момент кода, Вам придётся добавить гипотетический релиз, для последней ревизии в системе контроля версий. Simple total LOC model и Custom model используют все выбранные релизы кроме последнего для оценки своих параметров. Если выбран один единственный релиз, то прогнозирование будет осуществляться для тех же данных, на которых прошло обучение, что разумеется «нечестно». Для Code stability model можно выбирать только релиз, для которого осуществляется прогноз. Модель не использует предыдущие релизы для получения метрик, вместо этого используется вся информация об изменениях имеющаяся на момент релиза, для которого осуществляется прогноз.

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