Оценка метрик кода
Было много дискуссий о метриках кода (например: чем увлекаются метрики кода?). Я (как разработчик программного обеспечения) действительно интересуюсь этими метриками, потому что я думаю, что они могут помочь написать лучший код. По крайней мере, они полезны, когда дело доходит до поиска областей кода, которые требуют некоторого рефакторинга.
Однако я хотел бы знать следующее. Существуют ли некоторые оценки этих метрик исходного кода, которые доказывают, что они действительно коррелируют с частотой ошибок или ремонтопригодностью метода. Например: действительно ли методы с очень высокой цикломатической сложностью вносят больше ошибок, чем методы с низкой сложностью? Или методам с высоким уровнем сложности (Холстеду) действительно нужно гораздо больше средств для их поддержания, чем методам с низким уровнем?
Может быть, кто-то знает о каких-то надежных исследованиях в этой области.
Большое спасибо!
6 ответов
Вот некоторые:
Объектно-ориентированные метрики, которые предсказывают ремонтопригодность
Количественная оценка улучшения ремонтопригодности путем рефакторинга
Исследование влияния метрик связи на отказоустойчивость в объектно-ориентированных системах
Смешивающее влияние размера класса на достоверность объектно-ориентированных метрик
Хороший вопрос, нет прямого ответа.
Существуют исследовательские работы, в которых показана связь, например, между цикломатической сложностью и ошибками. Проблема в том, что большинство исследовательских работ не находятся в свободном доступе.
Я нашел следующее: http://www.pitt.edu/~ckemerer/CK%20research%20papers/CyclomaticComplexityDensity_GillKemerer91.pdf. Хотя это показывает связь между цикломатической сложностью и производительностью. Тем не менее, в нем есть несколько ссылок на другие статьи, и стоит попробовать их в Google.
Взгляните на эту статью из исследования Microsoft. В общем, я сомневаюсь в мудрости разработки, исходящей от Microsoft, но у них есть ресурсы, чтобы иметь возможность проводить долгосрочные исследования крупных продуктов. В указанной статье рассказывается о корреляции, которую они обнаружили между различными показателями и частотой дефектов проекта.
Наконец, я нашел несколько статей о корреляции между метриками программного обеспечения и частотой ошибок, но ни одна из них не была тем, что я искал. Большинство работ устарели (конец 80-х или начало 90-х).
Я думаю, что было бы неплохо начать анализ текущего программного обеспечения. По моему мнению, должно быть возможно исследовать некоторые популярные системы с открытым исходным кодом. Исходный код доступен, и (что я считаю гораздо более важным) во многих проектах используются системы отслеживания ошибок и какая-то система контроля версий. Возможно, можно было бы найти надежную связь между журналом систем контроля версий и системой отслеживания проблем. Это привело бы к очень интересной возможности анализа связи между некоторыми показателями программного обеспечения и частотой появления ошибок.
Может быть, есть еще проект, который делает именно то, что я описал выше. Кто-нибудь знает что-то подобное?
Мы провели эмпирическое исследование возможностей предсказания ошибок в известных объектно-ориентированных метриках Чидамбера и Кемерера. Оказалось, что эти метрики вместе могут прогнозировать ошибки с точностью выше 80%, когда мы применяем правильные модели машинного обучения. Если вы заинтересованы, вы можете подготовить полное исследование в следующей статье:
"Эмпирическая проверка объектно-ориентированных метрик на программном обеспечении с открытым исходным кодом для прогнозирования неисправностей. В IEEE транзакциях по программной инженерии, том 31, № 10, октябрь 2005 г., стр. 897-910".
Я тоже когда-то был очарован обещаниями метрик кода для измерения вероятного качества и определения того, сколько времени потребуется для написания определенного фрагмента кода, учитывая сложность его дизайна. К сожалению, подавляющее большинство заявлений о метриках были рекламой и никогда не приносили никаких результатов.
Самая большая проблема заключается в том, что результаты, которые мы хотим знать (качество, время, стоимость и т. д.), зависят от слишком многих факторов, которые невозможно контролировать. Вот лишь неполный список:
- Инструмент(ы) Операционная система
- Тип кода (встроенный, серверный, графический интерфейс, веб)
- Уровень опыта разработчика
- Уровень навыков разработчика
- Фон разработчика
- Среда управления
- Акцент на качество
- Стандарты кодирования
- Программные процессы
- Тестовая среда/практики
- Стабильность требований
- Проблемная область (бухгалтерия/телеком/военные/и т.д.)
- Размер/возраст компании
- Архитектура системы
- Язык(и)
См. здесь блог, в котором обсуждаются многие из этих вопросов и приводятся веские причины того, почему то, что мы пробовали до сих пор, не сработало на практике. (Блог не мой.)
Эта ссылка хороша тем, что она разбирает одну из наиболее заметных метрик, индекс ремонтопригодности, который можно найти в Visual Studio:
https://avandeursen.com/2014/08/29/think-twice-before-using-the-maintainability-index/
См. эту статью для хорошего обзора довольно большого количества метрик, показывающего, что они плохо коррелируют с понятностью программы (которая сама по себе должна коррелировать с ремонтопригодностью): «Автоматическая оценка понятности кода: как далеко мы?», Скалабрино и др. др.