МЕТОДЫ ОБНАРУЖЕНИЯ ЗАКОНОМЕРНОСТЕЙ ЭВОЛЮЦИИ ПРОГРАММНОГО КОДА Е.Г. Князев Санкт-Петербургский государственный университет информационных технологий, механики и оптики Тел.: (911) 251-76-36, e-mail: [email protected] Методы анализа эволюции программ Современные программные системы часто имеют сложную логику и значительный объем исходного кода, измеряемый десятками, сотнями тысяч строк и более [1, 2]. Для поддержания должного уровня качества, а также сохранения возможности дальнейшего развития программных систем, в частности, используются методы анализа свойств исходного кода. Анализируется, например, алгоритмическая сложность (complexity), связность (coupling) и другие метрики. На основе метрик делаются выводы об уровне качества исходного кода [1, 2]: вычисляются вероятности возникновения ошибок в отдельных модулях, степени связности модулей и другие параметры. Одной из проблем анализа метрик исходного кода является сложность интерпретации вычисленных величин. Средние значения метрик могут сильно отличаться для проектов различного рода. Например, значение метрики цикломатическая сложность, нормальное для библиотеки вычислительных алгоритмов может быть неоправданно высоким для клиентского приложения базы данных. Обнаружение неявных закономерностей в программных репозиториях (mining software repositories, MSR) [3] – новое направление в анализе программного кода, уделяющее внимание эволюции исходного кода. Метод заключается в предоставлении средств обработки неупорядоченной информации, содержащейся в программном репозитории (хранилище исходного кода), выделении значимых показателей из исторических данных о модификациях программы. Добыча данных из программных репозиториев совмещает в себе методы традиционной добычи данных с методами анализа исходного кода программ и позволяет, среди прочего, добиться улучшения процесса разработки программы на основе анализа истории ее изменений в прошлом. На практике входные данные для методов анализа эволюции программ доступны в подавляющем большинстве проектов благодаря использованию систем контроля версий исходного кода. Эти системы решают задачи разделения процесса разработки между людьми и хранения истории разработки. Имеется множество как коммерческих, так и открытых систем. Например, Visual Source Safe (Microsoft), Subversion, CVS и другие. Базы данных таких систем называются репозиториями исходного кода. Обзор методов обнаружения неявных закономерностей в программных репозиториях Среди существующих методов анализа программных репозиториев выделяются несколько групп: • Методы анализа служебной информации ревизий репозиториев: поиск семантических зависимостей [4, 5], анализ «запросов на изменение» [6]. • Эвристические методы: предсказание изменений [7], автоматическая классификация изменений посредством анализом комментариев [8, 9]. • Методы анализа синтаксиса изменений: эвристическое сравнение синтаксических деревьев версий [6], анализ разницы версий при помощи встраиваемых в исходный код тегов [10]. • Методы, основанные на добыче данных (data mining): обнаружение совместно появляющихся изменений [11]. Автоматическая классификация типов изменений методом кластеризации метрик В ходе разработки, тестирования и поддержки программного обеспечения исходный код часто модифицируется согласно нескольким типам. Например, таким как реализация новой функциональности, рефакторинг, исправление ошибки [12]. В работе [14] для решения задачи автоматической классификации множества изменений применяется метод многомерной статистической кластеризации k-средних Мак-Куина [13]. Пусть известно число кластеров n, выбраны метрики <M`> для оценивания изменения с ревизией r при кластеризации <M`r>=<Mr+1>-<Mr>. Метод Мак-Куина применяется для группирования близко расположенных наборов метрик изменений в кластеры <Mr> по расстоянию между ними. Итак, вышеописанное позволяет автоматически разбить множество изменений на кластеры. В каждый кластер группируются наиболее схожие друг с другом изменения. Преимущества предложенного метода следующие: • Объективность: для анализа используется исходный код, а не, например, комментарий, сопровождающий изменение. Оценка по исходному коду адекватна в отличие от классификации комментариев к изменениям, ведь комментарии могут не в полной мере соответствовать характеру изменений [8]. • Настраиваемость: для оценки изменений выбирается множество метрик программного кода. В зависимости от того, по каким аспектам изменений предполагается группировка, выбираются те или иные метрики [12, 13, 14]. • Адаптивность: при кластеризации набора изменений и выбранных метриках задается лишь результирующее количество групп, следовательно, для каждого отдельно взятого исходного кода выделются специфичные множества изменений, которые затем интерпретируются как те или иные группы изменений [14]. Улучшение процесса разработки в результате использования автоматической классификации изменений Классификация может применяться для поиска дестабилизирующих программную систему изменений, оценки эффективности реализации проекта и других задач. Среди вариантов использования автоматической классификации изменений: • Упрощение процедуры просмотра кода. Например, анализ функциональности, появившейся в коде за определенный период времени значительно упрощается при отсеивании только соответствующих типов изменений. • Возможность запрета изменений на определенных этапах разработки. На этапе тестирования продукта, к примеру, может быть автоматизирована проверка запрета реализации новой функциональности. • Контроль процесса разработки программного обеспечения при помощи анализа соотношений вносимых изменений. Появляется возможность оценивать скорость и качество разработки по количественному соотношению типов изменений. Так, преобладание изменений по исправлению ошибок на стадии реализации новой функциональности будет свидетельствовать о необходимости проведения стадии стабилизации перед фазой развития программного продукта. Литература 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Орлов С.А. Технологии разработки программного обеспечения: Учебник для вузов. 3-е изд. СПб: Питер. 2004. 528 с. Липаев В.В. Выбор и оценивание характеристик качества программных средств: Методы и стандарты. М.: Синтег. 2001. 224 с. Zimmermann T. Knowledge Collaboration by Mining Software Repositories // Proceedings of the 2nd International Workshop on Supporting Knowledge Collaboration in Software Development (KCSD 2006). Tokyo, Japan, 2006, P. 64–65. Gall H., Hajek K., Jazayeri M. Detection of Logical Coupling Based on Product Release History // Proceedings of 14th IEEE International Conference on Software Maintenance (ICSM'98). Bethesda, Maryland. March 16–19, 1998. P. 190–198. Gall H., Jazayeri M., Krajewski J. CVS Release History Data for Detecting Logical Couplings // Proceedings of Sixth International Workshop on Principles of Software Evolution (IWPSE'03). Helsinki, Finland. September 01–02, 2003. P. 13–23. German, D.M. An Empirical Study of Fine-Grained Software Modifications // Proceedings of 20th IEEE International Conference on Software Maintenance (ICSM'04). Chicago, Illinois. September 11–14, 2004. P. 316–325. Hassan A.E., Holt R.C. Predicting Change Propagation in Software Systems // Proceedings of 20th IEEE International Conference on Software Maintenance (ICSM'04). Chicago, Illinois, September 11– 14, 2004. P. 284–293. Hassan A. E., Holt. R. C. Source Control Change Messages: How Are They Used And What Do They Mean? 2004. Draft Available Online: http://www.ece.uvic.ca/~ahmed/home/pubs/CVSSurvey.pdf Mockus A., Votta L. G. Identifying reasons for software change using historic databases // Proceedings of the International Conference on Software Maintenance (ICSM). San Jose, California, 2000. P. 120– 130. Maletic J.I., Collard M.L. Supporting Source Code Difference Analysis // Proceedings of IEEE International Conference on Software Maintenance (ICSM'04). Chicago, Illinois. September 11–17, 2004. P. 210–219. Zimmermann T., Wei.gerber P., Diehl S., Zeller A. Mining Version Histories to Guide Software Changes // Proceedings of 26th International Conference on Software Engineering (ICSE'04). Edinburgh, Scotland, United Kingdom, May 23–28, 2004. P. 563–572. Фаулер М. Рефакторинг: улучшение существующего кода. СПб: Символ-Плюс, 2003. 432 c. Мандель И.Д. Кластерный анализ. М.: Финансы и статистика, 1988. 176 с. Князев Е.Г. Шопырин Д.Г. Анализ изменений программного кода методом кластеризации метрик // Сборник трудов IV Конференции молодых ученых СПбГУ ИТМО. СПб, 2007.