Автоматизированная классификация изменений программного кода для повышения эффективности задач его обзора и анализа Князев Е.Г. Старший разработчик ЗАО «Транзас Технологии»; Аспирант СПбГУ ИТМО Обзор программного кода (Code Review) Повышает качество кода Помогает найти ошибки на ранних стадиях Помогает узнать код Помогает курировать работу новичков 2 Система контроля версий и обзор изменений кода Система контроля версий кода Запрос изменения Система контроля версий хранит всю историю разработки Позволяет просматривать только изменившийся код Обзор Разработчик 3 Трудоемкость просмотра изменений В крупных проектах необходим просмотр большого количества изменений Проект Размер, LOC Период наблюдения ~1 месяц Число изменений Tortoise SVN ~ 200 тысяч NaviManager ~ 250 тысяч 22.09.2007-22.10.2007 215 72 KDE ~ 4.7 миллиона 17.09.2007 14.10.2007 11841 (!) 4 Метод решения проблемы Автоматизация классификации изменений Система контроля версий кода Автоматизированный классификатор изменений Класс изменения Класс изменения интересен? Разработчик 5 Классы изменений Новая функциональность Рефакторинг Удаление кода Косметическое изменение Исправление ошибки 6 Известные методы классификации изменений Метод классификации комментариев к изменениям ◦ “bug”, “fixed” – исправление ошибки ◦ “implement”, “feature” – новая функциональность Метод поиска рефактоингов по метрикам изменений ◦ Выделение предка класса (DIT>0 и NOM<0, …) ◦ Перенос в другой класс (DIT=0 и NOM<0, …) ◦ Разделение метода (NOM < T, ...) Метод поиска разности в семантических графах ◦ Строится граф кода до изменения, после изменения ◦ Генерируется скрипт перехода ◦ Происходит поиск шаблонов рефакторингов 7 Обучение метода 8 Классификация изменений 9 Метрики изменений Рассчитываются как разность метрик ревизий ◦ ∆M = Mr – Mr-1 CC – цикломатическая сложность (количество независимых путей в графе исполнения) CS – количество классов/структур eLOC – эффективное число строк кода (без учета комментариев и пустых строк) 10 Алгоритм нечеткой кластеризации метрик изменений 11 Расчет метрик и кластеризация множества изменений Navi-Manager Ревизия CC IC eLOC Ближ. кластер Комментарий к изменению 16820 -2 +1 -5 1 Процесс объединения кораблей в рамках одной транзакции. 16833 0 0 -1 2 Удалена лишняя команда (коммит). 3 Вывод широты, долготы в полном формате при поллинге. 4 Обновление MessageSource. UpdateTime после обработки каждого сообщения. 2 Откат изменений из r17029. Не нужно обновлять поле после обработки каждого сообщения. 3 Первая версия механизма загрузки треков с MonServer. 17026 17029 17038 17107 +4 0 0 +4 +4 0 0 +12 +18 +1 -1 +89 12 Таблица принадлежности изменений нечетким кластерам Ревизия / Кластер 16820 1 2 3 4 0,78 0,14 0,00 0,08 16833 17026 17029 17038 0,02 0,79 0,00 0,20 0,21 0,32 0,11 0,36 0,03 0,30 0,00 0,67 0,02 0,79 0,00 0,20 17107 0,1 0,11 0,68 0,11 13 Пример обучения метода Проект: Navi-Manager Размер обучающего множества: 29 изменений Количество кластеров: 4 Кластер 1 2 3 4 Экспертный класс Рефакторинг Удаление кода Новая функциональность Исправление ошибки 14 Пример классификации Ревизия Ближ. класс Ближ. кластер Комментарий к изменению 16820 Рефакт. 1 Процесс объединения кораблей в рамках одной транзакции. 16833 Удал.фун. 2 Удалена лишняя команда (коммит). 3 Вывод широты, долготы в полном формате при поллинге. 4 Обновление MessageSource. UpdateTime после обработки каждого сообщения. 2 Откат изменений из r17029. Не нужно обновлять поле после обработки каждого сообщения. 3 Первая версия механизма загрузки треков с MonServer. 17026 Нов.фун. Исправ. 17029 ошибки 17038 Удал.фун. 17107 Нов.фун. 15 Нечеткость классификации Изменение r16833 «Удалена лишняя команда (коммит)» классифицировано как: ◦ на 2% рефакторинг ◦ на 79% удаление кода ◦ на 0% новая функциональность ◦ на 20% исправление ошибки 16 Результаты Применение метода в Navi-Manager показало его эффективность ◦ От 50% экономии времени на обзоре кода Выявлены проблемы разработки ◦ Слишком большое число исправлений ошибок по сравнению с реализацией новой функциональности 17 Инструмент автоматизированной классификации изменений Работает с Subversion Слабо зависит от языка программирования Рассчитывает метрики CC, CS, eLOC Выделяет следующие классы изменений ◦ ◦ ◦ ◦ ◦ новая функциональность удаление функциональности рефакторинг косметическое изменение исправление ошибки* 18 Будущие исследования Улучшение метода ◦ Кластеризация по Гюстафсону-Кесселю ◦ Объектные и другие метрики Расширение внедрения ◦ Использование в процессе разработки на постоянной основе ◦ Оценивание применимости для различных типов проектов 19 Спасибо за внимание! Вопросы? 20