Какие метрики полезны для исходного кода? [закрыто]


33

Какие метрики полезны для сбора исходного кода?

Как метрики, такие как, например, (исполняемые?) Строки кода или Cyclomatic Complexity, могут помочь в обеспечении качества или как они в целом полезны для процесса разработки программного обеспечения?


37
Единственным допустимым показателем является WTF / сек. :)
конец


Ответы:


30

«Измерение производительности программного обеспечения по строкам кода похоже на измерение прогресса на самолете по его весу», - Билл Гейтс.


3
Пожалуйста, не обновляйте не отвечающие.
Эрик Уилсон

3
Несмотря на забавный анекдот, этот ответ мало что дает для ответа на этот вопрос.
Крис Найт,

7
@Chris Этот ответ получил много положительных откликов (или «обновлений», как хочет назвать FarmBoy), потому что многие разработчики считают, что метрики программного обеспечения бесполезны. Если вы не согласны или считаете, что у вас есть лучший ответ на вопрос, то опубликуйте свой ответ. Комментировать, как вы сделали здесь, не продуктивно; Вы ничего не внесли.
chrisaycock

7
Мои комментарии и комментарии направлены на то, чтобы не дать ответы, в которых недостаточно глубины, и которые напрямую не затрагивают вопрос ОП. Это могло бы быть гораздо лучшим ответом, если бы вы более подробно узнали, почему вы считаете, что показатели программного обеспечения бесполезны с точки зрения разработки программного обеспечения и обеспечения качества и сосредоточены не только на LOC.
Крис Найт

Программные метрики на самом деле очень полезны, если вы используете их правильно. То есть, чем больше LoC -> чем больше ошибок -> тем хуже качество. Я никогда не видел, чтобы это провалилось как мера качества. И самолет, безусловно, лучше, если он делает то же самое путешествие с той же скоростью, но требует гораздо меньшего веса. Очевидно, что Билл Гейтс мало что знал о самолетах, когда говорил это, и при этом не знал достаточно о программном обеспечении.
Пабло Ариэль

12

Посмотрите на сообщения Джеффа на эту тему:

Посещение горничной Метрики

Программная инженерия: мертв?

Есть старая, но хорошая статья от Джоэла, тесно связанная с метриками программного обеспечения, и я настоятельно рекомендую ее прочитать: Метод управления Econ 101

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


+1 за то, что цитировал Джеффа в одной строчке. Чистая, закаленная в боях мудрость прямо там.
luis.espinal

11

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

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

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

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

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

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


8

Не будет ли это дерьмо "метрики исходного кода" когда-либо умирать?

Необработанные строки исходного кода (SLOC) - это самая старая, самая простая и самая базовая метрика.

Холстед первоначально предложил целую кучу метрик. Многие люди получали массу удовольствия от написания программ измерения до тех пор, пока какой-то спорспорт не провел очевидное исследование и не продемонстрировал, что каждая метрика Хэлстеда напрямую связана с SLOC.

В этот момент метрики Холстеда были заброшены, потому что SLOC всегда легче измерить.


1
Есть ссылки на исследование?
Джон Хопкинс

Google - ваш друг, но вот вам, с чего начать. ecs.csun.edu/~rlingard/comp589/HoffmanArticle.pdf
Джон Р. Штром,

6
Интересное исследование, хотя их исследование рассматривало программы, как правило, от 50 до 100 строк кода. С такой небольшой четко определенной проблемой, которую нужно решить, конечный результат не кажется таким уж удивительным.
Крис Найт,

Я бы сказал, что в реальном мире все эти исследования превращаются в грязь.
Уоррен П

Это правда. Чем больше строк кода, тем лучше качество.
Пабло Ариэль

8

Метрики исходного кода для обеспечения качества направлены на две цели:

  • написание кода с меньшим количеством ошибок внутри
  • написание кода для простоты обслуживания

Оба приводят к написанию кода настолько просто, насколько это возможно Это означает:

  • короткие единицы кода (функции, методы)
  • несколько элементов в каждом блоке (аргументы, локальные переменные, операторы, пути)
  • и многие другие критерии, более или менее сложные (см. Метрика программного обеспечения в Википедии).

7

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

Я не знаю ни одной другой простой и практичной метрики, хорошо связанной с ошибками.

Одна вещь, которую я хотел бы сделать, - это запустить номера для разных проектов, над которыми я работаю - Test Coverage :: kLOC, а затем обсудить «воспринимаемое качество», чтобы увидеть, есть ли корреляция.


1
Таким образом, чем больше кода, тем больше ошибок в нем?

3
@Thor: да, да, да. шокер, а?
Пол Натан

Насколько я помню, типичные отраслевые цифры составляют около 2-3 ошибок на 1000 строк кода для средних проектов, приближаясь к 0,5 ошибкам на 1000 строк кода для программного обеспечения управления АЭС или проектов НАСА, где они прикладывают огромные усилия. контроль, тестирование, обзор и т. д., потому что сбои могут иметь очень серьезные последствия. У кого-нибудь есть ссылки на цифры, подтверждающие это?
Хловдал

2
@hlovdal: 2-3 ошибки на KSLOC - это очень низкий показатель. Самые низкие показатели, которые я знаю по аэрокосмической сфере и области безопасности, составляют порядка 0,1 ошибки на KSLOC. Типичные цифры составляют от 20 до 50 ошибок на KSLOC. Для справки, Google для статьи Энди Германа под названием «Статический анализ программного кода - извлеченные уроки».
Schedler

1
Я бы оспорил эти цифры - это полностью зависит от языка, компилятора и исполняемой среды. Опечатки в коде JavaScript могут занять годы , но опечатка в скомпилированном языке будет найдена при первой компиляции.
Дж.Б. Уилкинсон

7

Метрики полезны, только если вы знаете, что делать с полученными ответами. По сути, метрика программного обеспечения похожа на термометр. Тот факт, что вы измеряете что-то при температуре 98,6 ° F, ничего не значит, пока вы не узнаете, какова нормальная температура. Вышеуказанная температура хороша для температуры тела, но очень плоха для мороженого

Общие метрики, которые могут быть полезны:

  • Обнаруженные ошибки / неделя
  • Устраненные ошибки / неделя
  • # Требования определены / выпуск
  • # Требования выполнены / релиз

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

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

Нижняя граница

Каждое измерение, которое вы проводите, должно иметь следующее определение, или оно бесполезно:

  • Понимание того, что "нормально". Это может быть скорректировано в течение всего срока проекта.
  • Порог за пределами «нормального», где вам нужно предпринять какое-то действие.
  • План работы с кодом при превышении порога.

Метрики, которые вы принимаете, могут сильно различаться от проекта к проекту. У вас может быть несколько показателей, которые вы используете в разных проектах, но определение «нормальный» будет другим. Например, если один проект обнаружил в среднем 5 ошибок в неделю, а новый проект обнаружил 10 ошибок в неделю, это не обязательно означает, что что-то не так. Может быть, на этот раз команда тестирования будет более дотошной. Также определение «нормальный» может меняться в течение срока действия проекта.

Метрика - это просто термометр, что вы делаете с ней, зависит только от вас.


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

@Rob Z, с любой метрикой люди будут делать достаточно, чтобы оптимизировать эту метрику. При ошибках на строку кода разработчик может предложить неиспользуемую переменную, которую они увеличивают, просто чтобы увеличить количество безошибочных LOC (поскольку счетчики SLOC могут обнаруживать несколько точек с запятой). Конечно, это также искусственно увеличивает объем кода, через который можно пробираться.
Берин Лорич

6

Исходный код является обязательством, а не активом. Имея это в виду, измерение строк кода аналогично отслеживанию долларов, потраченных на строительство дома. Это необходимо сделать, если вы хотите остаться в рамках бюджета, но вы не обязательно думаете, что тратить 1000 долларов в день лучше, чем тратить 50 долларов в день; Вы хотели бы знать, сколько дома построено за эти деньги. То же самое и со строками кода в программном проекте.

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


4

Поскольку исходный код является просто комбинацией последовательности, выбора и повторения. Если бы я описал наиболее оптимальную часть программного обеспечения, которую мы когда-либо могли разумно ожидать, она была бы следующей. Программное обеспечение с почти 100% тестированием покрытия кода с использованием наименьшего количества строк кода, необходимого для выполнения работы, и в то же время достаточно гибкое, чтобы противостоять изменениям.


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

+1 Больше исходного кода не обязательно лучше.
Ларри Коулман

Только очень простые приложения поддаются 100% тестированию покрытия (делая покрытие избыточным). Вычислительно дорого (если не невозможно) достичь 100% покрытия тестами для сложного программного обеспечения. Мы знаем этот факт на прочных основаниях вот уже 6 десятилетий. Во-вторых, тестирование говорит только о том, что вы не нашли ошибку - это не гарантирует, что не будет ошибок, касающихся не качества, размера или сложности конструкции (что тоже известно довольно давно). Не зная этих фактов при работе По программному обеспечению это похоже на физика, не знающего законов термодинамики.
luis.espinal

@ luis.espinal Программное обеспечение, настолько большое, что слишком дорого в вычислительном отношении для тестирования, является невероятно плохо написанным программным обеспечением. Это близко к тому, чтобы не иметь понятия о том, как сделать работающее программное обеспечение.
Пабло Ариэль

@PabloAriel - «Программное обеспечение настолько велико, что вычислительно слишком дорого для тестирования» << Это не то, что я сказал. Прочитайте комментарий (возможно, два или три раза), чтобы убедиться, что вы действительно читаете то, что, по вашему мнению, вы читаете.
luis.espinal

4

Анекдот, показывающий, почему счет KLOC бесполезен (и даже вреден) для оценки производительности.

Несколько лет назад я работал над крупным проектом (70+ человек в нашей компании, еще 30+ у нашего клиента), который использовал показатели KLOC в качестве единственного показателя эффективности работы команд и отдельных лиц.

За наши усилия в 2000 году (рассказывает, как давно это было :)) мы провели большую очистку раздела кода, за который отвечала моя команда. В итоге мы выпустили около 30 000 строк кода, неплохие 3 месяца работы для 5 человек. В итоге мы также удалили еще 70 000 строк кода - очень хорошая работа за 3 месяца работы, особенно в сочетании с новым кодом.

Конечный результат за квартал: -40.000 строк кода. В ходе обзора производительности, следующего за кварталом, мы получили официальный выговор от компании за то, что мы не выполнили наши требования к производительности в 20 000 строк кода, производимых за квартал (в конце концов, инструменты показали, что мы произвели -40 000 строк кода), что привело бы к тому, что все мы были бы перечислены как неэффективные и обойденные для продвижения по службе, обучения, повышения заработной платы и т. д. и т. д., если бы менеджер проекта и команда QA не вмешались и не отменили выговор и не заменили его похвалой.

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


Почему ты просто не показал различия ?!
reinierpost

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

2
Ваш ответ не показывает, что KLOC бесполезны, он показывает, как их не использовать.
Нил Н

2
это показывает, что полагаться на них как на показатель производительности недальновидно, полагаясь на них как на единственную меру идиотскую. В других проектах, использующих KLOC в качестве показателя производительности и даже качества, мы легко вздували цифры, создавая стандарты кодирования, которые вызывали множество строк (практика связывания C ++, лишние пустые строки с кратким комментарием везде, разбивая условия в операторе if на 3 строки и т. Д.).
jwenting

1
Использование SLOC в качестве показателя производительности просто глупо и, вероятно, никогда не даст хороших результатов. Использование SLOC в качестве показателя качества, указывающего на ремонтопригодность и количество дефектов, более разумно, поскольку все предостережения уже обсуждались по этому вопросу.
Redcalx

2

Я удивлен, что никто еще не упомянул об утверждении / принятии решения о модульных тестах (процент кода, использованного модульными тестами).

Покрытие кода полезно в том смысле, что вы знаете, какой процент приложений не терпит неудачу катастрофически; В остальном его полезность зависит от качества юнит-тестов.


Покрытие кода также является ложной метрикой (хотя может иметь некоторое применение). Он предлагает писать бессмысленные тесты, чтобы получить более широкий охват. И, конечно, есть вещи, которые никогда не будут освещены, и люди начнут избегать писать такие вещи. Например, я видел инструменты покрытия кода, которые помечали JavaDoc как код, и, конечно, он не был покрыт. другой инструмент помечал все пустые строки как не покрытые тестами. Вы бы согласились, что избавление от комментариев и пробелов в вашем коде хуже, чем упущение модульных тестов для некоторых сеттеров, я надеюсь?
С

Безусловно, плохие юнит-тесты вредят больше, чем помогают во многих отношениях. Например, вы можете получить 100% покрытие кода для набора тестов, в которых не было ни одного утверждения.
StuperUser

1

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

Пока без коммита нарушается сборка ...


1

Это не очень полезные абсолютные метрики с точки зрения прогресса, но они могут использоваться, чтобы дать общее представление о состоянии кода.

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


1

Я часто работаю над гигантским C ++-пакетом, и при поиске проблемного кода, заслуживающего рефакторинга Cyclomatic Complexity или ужасного FanIn / FanOut , обычно достаточно хороших красных флагов. Исправление проблем обычно приводит к улучшению всей кодовой базы.

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


1

На моей работе много ситуаций, когда я использую метрики кода:

При написании кода

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

Разработчики могут свободно нарушать все правила, поскольку они никогда не будут применяться ко всем ситуациям. «Правила» существуют для того, чтобы стимулировать мысль и сказать: «Эй, это лучший способ сделать это?»

Во время проверки качества кода

Первое, что я обычно делаю, когда выполняю проверку кода, это проверяю покрытие кода проверяемым кодом в сочетании с инструментом покрытия кода, который выделяет, какие строки кода были покрыты. Это дает мне общее представление о том, насколько тщательным является тестовый код. Мне действительно все равно, если покрытие составляет 20% или 100%, если важный код хорошо протестирован. Таким образом, покрываемый процент несколько бессмыслен, но 0% наверняка выделяется, как больной палец, как то, на что я хочу внимательно посмотреть

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

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

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

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


0

В: Какие метрики полезны для сбора исходного кода?

Для бизнеса:

A: Количество человеко-часов

Для руководителя кодера:

A: не имеет значения. Давайте сделаем все сегодня

Для самооценки кодера:

A: Количество SLOC (исходных строк кода)

Для мамы кодера:

A: Ешьте больше этих мягких французских булочек и пейте чай

продолжение в комментариях ниже ...


-1

Помните: весь код может быть уменьшен как минимум на 1 инструкцию. Весь код содержит как минимум 1 ошибку. Следовательно, весь код может быть сведен к одной инструкции, которая не работает. Надеюсь, это поможет!


и с меньшими побочными эффектами.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.