Автоматизированная классификация изменений программного кода Князев Е.Г. Старший разработчик ЗАО «Транзас Технологии»; Аспирант СПбГУ ИТМО для повышения эффективности задач его обзора и анализа
Обзор программного кода (Code Review) 2 Повышает качество кода Помогает найти ошибки на ранних стадиях Помогает узнать код Помогает курировать работу новичков
Система контроля версий и обзор изменений кода Система контроля версий хранит всю историю разработки Позволяет просматривать только изменившийся код 3 Система контроля версий кода Разработчик Обзор Запрос изменения
Трудоемкость просмотра изменений В крупных проектах необходим просмотр большого количества изменений Проект Tortoise SVN Navi- Manager KDE Размер, LOC ~ 200 тысяч~ 250 тысяч ~ 4.7 миллиона Период наблюдения ~1 месяц Число изменений (!) 4
Метод решения проблемы Автоматизация классификации изменений 5 Система контроля версий кода Изменение Класс изменения интересен? Автоматизированный классификатор изменений Класс изменения Да Разработчик Просмотр
Классы изменений Новая функциональность Рефакторинг Удаление кода Косметическое изменение Исправление ошибки 6
Известные методы классификации изменений Метод классификации комментариев к изменениям bug, fixed – исправление ошибки implement, feature – новая функциональность Метод поиска рефактоингов по метрикам изменений Выделение предка класса ( DIT>0 и NOM
Обучение метода 8
Классификация изменений 9
Метрики изменений Рассчитываются как разность метрик ревизий M = M r – M r-1 CC – цикломатическая сложность ( количество независимых путей в графе исполнения ) CS – количество классов / структур eLOC – эффективное число строк кода ( без учета комментариев и пустых строк ) 10
Алгоритм нечеткой кластеризации метрик изменений 11
Расчет метрик и кластеризация множества изменений Navi-Manager Реви - зия CCICeLOC Ближ. кластерКомментарий к изменению Процесс объединения кораблей в рамках одной транзакции Удалена лишняя команда ( коммит ) Вывод широты, долготы в полном формате при поллинге Обновление MessageSource. UpdateTime после обработки каждого сообщения Откат изменений из r Не нужно обновлять поле после обработки каждого сообщения Первая версия механизма загрузки треков с MonServer. 12
Таблица принадлежности изменений нечетким кластерам 13 Ревизия / Кластер ,780,140,000, ,020,790,000, ,210,320,110, ,030,300,000, ,020,790,000, ,10,110,680,11
Пример обучения метода КластерЭкспертный класс 1 Рефакторинг 2 Удаление кода 3 Новая функциональность 4 Исправление ошибки 14 Проект : Navi-Manager Размер обучающего множества : 29 изменений Количество кластеров: 4
Пример классификации Ревизия Ближ. класс Ближ. кластерКомментарий к изменению Рефакт. 1 Процесс объединения кораблей в рамках одной транзакции Удал. фун. 2 Удалена лишняя команда ( коммит ) Нов. фун. 3 Вывод широты, долготы в полном формате при поллинге Исправ. ошибки 4 Обновление MessageSource. UpdateTime после обработки каждого сообщения Удал. фун. 2 Откат изменений из r Не нужно обновлять поле после обработки каждого сообщения Нов. фун. 3 Первая версия механизма загрузки треков с MonServer. 15
Нечеткость классификации Изменение r16833 « Удалена лишняя команда ( коммит )» классифицировано как : на 2% рефакторинг на 79% удаление кода на 0% новая функциональность на 20% исправление ошибки 16
Результаты Применение метода в Navi-Manager показало его эффективность От 50% экономии времени на обзоре кода Выявлены проблемы разработки Слишком большое число исправлений ошибок по сравнению с реализацией новой функциональности 17
Инструмент автоматизированной классификации изменений Работает с Subversion Слабо зависит от языка программирования Рассчитывает метрики CC, CS, eLOC Выделяет следующие классы изменений новая функциональность удаление функциональности рефакторинг косметическое изменение исправление ошибки * 18
Будущие исследования Улучшение метода Кластеризация по Гюстафсону - Кесселю Объектные и другие метрики Расширение внедрения Использование в процессе разработки на постоянной основе Оценивание применимости для различных типов проектов 19
Спасибо за внимание ! Вопросы ? 20