Метрики исходного кода для измерения стабильности кода?

17

Рассматривая то, как программное обеспечение разрабатывается во время цикла выпуска (реализация, тестирование, исправление ошибок, выпуск), я подумал, что нужно увидеть какой-то шаблон в строках кода, которые изменяются в кодовой базе; например, к концу проекта, если код становится более стабильным, следует видеть, что за единицу времени изменяется меньше строк кода.

Например, можно увидеть, что в течение первых шести месяцев проекта в среднем было 200 строк кода в день, в то время как в течение последнего месяца это было 50 строк кода в день, а также в течение последней недели (непосредственно перед DVD-диском с продуктом). были отправлены), никакие строки кода не были изменены вообще (замораживание кода). Это всего лишь пример, и в зависимости от процесса разработки, принятого конкретной командой, могут появиться разные шаблоны.

В любом случае, существуют ли какие-либо метрики кода (какая-либо литература по ним?), Которые используют количество модифицированных строк кода за единицу времени для измерения стабильности кодовой базы? Полезно ли им чувствовать, что проект где-то идет или он еще далек от готовности к выпуску? Есть ли инструменты, которые могут извлечь эту информацию из системы контроля версий и производить статистику?

Джорджио
источник
4
«Во-вторых, поскольку механизм абстрактный, его производство подчинено его дизайну. В этом отношении программа похожа на стихотворение: вы не можете написать стихотворение, не написав его. Тем не менее, люди говорят о программировании, как о производственном процессе и измерении». продуктивность программиста "в терминах" количества строк созданного кода ". При этом они записывают это число с неправильной стороны главной книги: мы всегда должны ссылаться на" количество потраченных строк кода "." - Плоды недоразумений , Эдсгер В. Дейкстра.
Яннис
3
@ Яннис Ризос: Я ни в коем случае не предлагаю измерять производительность или сложность кода с помощью LOC, потому что я знаю, что это не очень хорошая мера. С другой стороны, если за два дня до отгрузки было изменено 300 строк кода, у меня, как у менеджера, была бы большая лампа «RED ALERT» (если это не было запланировано и не является результатом очень тщательной оценки рисков). ). В целом, я бы предположил, что код, который использовался (и тестировался) без длительного изменения, «более стабилен», чем код, в котором 100 строк меняются каждый день.
Джорджио
2
@ Джорджио Argh, я был прерван (середина рабочего дня здесь), когда я публиковал другой комментарий (достиг предела числа символов в первом). Это не означало, что вы говорите о производительности, просто пришла цитата из Дейкстры, и я подумал, что это будет интересно. В любом случае, показатели оттока кода очень близки к тому, что вы ищете, и на них написано множество литературы. Что касается инструментов, то Atlassian's FishEye впечатляет.
Яннис
@ Яннис Ризос: Это действительно очень интересное чтение. Что касается FishEye, мы используем его на нашем рабочем месте (для обзоров), поэтому я сразу же загляну в руководство и посмотрим, какую статистику мы можем получить.
Джорджио

Ответы:

17

Одна из мер, которую описал Майкл Фезер, - « Активный набор классов ».

Он измеряет количество добавленных классов против тех, кто «закрыт». Описывает закрытие класса как:

Класс закрывается на дату, когда с этой даты до настоящего времени с ним не происходит никаких изменений.

Он использует эти меры для создания таких диаграмм: Активная таблица классов

Чем меньше число разрыва между двумя строками, тем лучше.

Вы можете применить аналогичную меру к вашей кодовой базе. Вполне вероятно, что количество классов соотносится с количеством строк кода. Может даже оказаться возможным расширить это, чтобы включить строки кода для каждого показателя класса, что может изменить форму графа, если у вас есть несколько больших монолитных классов.

Дэйв Хиллиер
источник
4

Пока существует относительно непротиворечивое сопоставление функций с классами или, в этом отношении, файловой системой, вы можете подключить что-то вроде gource к вашей системе контроля версий и очень быстро понять, на чем сосредоточена большая часть разработки (и, таким образом, какие части кода являются наиболее нестабильными).

Это предполагает, что у вас есть относительно аккуратная база кода. Если основа кода представляет собой грязный шарик, вы по существу увидите, что каждая маленькая часть обрабатывается из-за взаимозависимостей. Тем не менее, может быть, это само по себе (кластеризация при работе над функцией) является хорошим показателем качества кодовой базы.

Это также предполагает, что ваш бизнес и команда разработчиков в целом имеют некоторый способ разделения функций в разработке (будь то ветки в управлении версиями, по одной функции за раз, что угодно). Если, например, вы работаете с 3 основными функциями в одной ветви, то этот метод дает бессмысленные результаты, потому что у вас есть большая проблема, чем стабильность кода в ваших руках.

К сожалению, у меня нет литературы, чтобы доказать свою точку зрения. Он основан исключительно на моем опыте использования ресурсов на хороших (и не очень хороших) основах кода.

Если вы используете git или svn и ваша версия gource> = 0.39, это так же просто, как запустить gource в папке проекта.

деревенщина
источник
Gource также, кажется, отличный инструмент! (+1)
Джорджио
1
Я наткнулся на этот ответ, затем провел следующие шесть часов, играя с Гурсом. Я не уверен, заслуживает ли это +1 или -1, но, черт возьми, это один крутой инструмент.
RonU
@RonU: вы можете использовать gource для визуализации состояния хранилища в заданном диапазоне времени. Суть в том, что он визуализирует активность вашего кода с течением времени. Насколько легко интерпретировать информацию, зависит от многих факторов, как я объяснил в своем ответе выше. Да, это удивительный инструмент, если вы хотите «большую картину», поэтому я думаю, что это заслуживает +1;)
Карл
Да, когда я сказал «шесть часов», я не имел в виду, что я запускал одного сима Gource для того времени ... просто потому, что я играл с большим количеством опций, передал его в ffmpeg, возможно добавил эпический саундтрек и т. Д. была вполне кроличья нора. :)
RonU
Дай угадаю. Саундтрек был зациклен на Harlem Shuffle;)
Карл
0

Использование частоты измененных строк в качестве индикатора стабильности кода, по крайней мере, сомнительно.

Во-первых, распределение по времени измененных линий сильно зависит от модели управления программным обеспечением проекта. Существуют большие различия в разных моделях управления.

Во-вторых, случайность в этом предположении не ясна - это меньшее количество измененных строк, вызванное стабильностью программного обеспечения, или просто потому, что истекает срок, и разработчики решили не вносить некоторые изменения сейчас, а сделать это после выпуск?

В-третьих, большинство линий модифицируются при появлении новых функций. Но новая функция не делает код нестабильным. Это зависит от мастерства разработчика и от качества дизайна. С другой стороны, даже серьезные ошибки могут быть исправлены с очень небольшим количеством измененных строк - в этом случае стабильность программного обеспечения значительно увеличивается, но количество измененных строк не слишком велико.

johnfound
источник
«Это зависит от умения разработчика и от качества дизайна.»: Но вам нужно хотя бы некоторое время, чтобы протестировать изменения, чтобы у вас было достаточно уверенности, что вы не вносили никаких ошибок. Даже самые опытные разработчики могут совершать опечатки, например, если они находятся под давлением, слишком много работают сверхурочно или слишком мало спят. Также, если вы применяете принцип открытия / закрытия, через некоторое время количество изменений (исправлений ошибок) должно уменьшиться. Во всяком случае, я четко заявил в своем вопросе, что результат такого измерения может меняться в зависимости от процесса разработки.
Джорджио
Кстати, код может быть нестабильным не потому, что разработчики плохие, а потому, что требования не ясны, и проект все еще находится на стадии создания прототипа.
Джорджио
@ Джорджио: Конечно, вы правы. Но это именно то, что я написал: количество измененных строк сильно зависит от слишком многих факторов. Некоторые из них связаны со стабильностью кода, некоторые нет. Это все равно, что пытаться вычислить, сколько людей занимаются сексом, измеряя электрическую мощность, исходя из предположения - меньше энергии - меньше света - больше секса. Хотя доказано, что рождаемость повышается после больших отключений. ;)
johnfound
-1

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

Действительно, синтаксис важен и должен быть правильным, но все, кроме этого, поскольку он относится к желаемой функции инструкций, глядя на «метрики» инструкций, сродни построению вашего будущего, читая образец чайных листьев внизу ты чашка чая.

Надежность измеряется путем испытаний. Юнит-тесты, тесты на дым, автоматические регрессионные тесты; тесты, тесты, тесты!

Мой ответ на ваш вопрос заключается в том, что вы используете неправильный подход в поиске ответа на вопрос о надежности. Это красная сельдь, что строки кода означают нечто большее, чем строки, занимающие код. Вы можете знать только, выполняет ли код то, что вы хотите, чтобы он делал, если вы проверяете, что он делает то, что от вас требуется.

Пожалуйста, проверьте правильность использования тестов и избегайте мистики кода.

С наилучшими пожеланиями.

Sassafras_wot
источник
3
Я прямо заявил, что не предлагал LoC в качестве меры сложности кода. Я предлагал изменения в коде как меру стабильности кода: имеет ли кусок кода стабильные функциональные требования и стабильную, протестированную реализацию, отвечающую этим требованиям?
Джорджио
Я не хочу спорить с вами, но с уважением уведу вас от глупости бессмысленности метрики кода. Я перечитал ваш вопрос, и все ваши примеры указывают на желание сделать вывод о связи между изменяющимися строками кода и получаемой в результате этого надежностью. Я понял, что чем больше слов вы набираете, тем больше вероятность, что вы опечатаете. Но я категорически против того, что вы просите, чтобы я решительно высказался за то, чтобы вы таким образом отказались от своих поисков. Хорошая практика тестирования = хорошая вероятность надежности.
Sassafras_wot
«Хорошая практика тестирования = хорошая вероятность надежности». Я полностью согласен. Вот почему я предполагаю, что часть кода, которая была недавно изменена, нуждается в повторном тестировании, прежде чем мы сможем быть уверенными в ее правильности.
Джорджио
Есть несколько определений стабильности, и одно из них - то, за что вы спорите. Это другая семантическая интерпретация той, которую я сделал. Я понял, что это означает «не подвержен экстремальным изменениям», а не «устойчив к изменениям»
Дейв Хиллиер,