Які корисні показники для вихідного коду? [зачинено]


33

Які корисні показники для отримання вихідного коду?

Як такі показники, як, наприклад, рядки (виконувані?), Коду чи цикломатичної складності можуть допомогти у забезпеченні якості чи як вони взагалі корисні для процесу розробки програмного забезпечення?


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 рядками коду. З такою невеликою чітко визначеною проблемою вирішення кінцевого результату не здається таким дивним.
Кріс Найт

Я б сказав, що в реальному світі всі ці дослідження перетворюються на грязь.
Warren P

Це правда. Чим більше рядків коду, тим ширше якість.
Пабло Аріель

8

Показники вихідного коду для забезпечення якості мають на меті дві цілі:

  • написання коду з меншими помилками всередині
  • написання коду для зручного обслуговування

Обидва призводять до написання коду максимально просто. Це означає:

  • короткі одиниці коду (функції, методи)
  • кілька елементів у кожній одиниці (аргументи, локальні змінні, заяви, шляхи)
  • та багато інших більш менш складних критеріїв (див. метрику програмного забезпечення у Вікіпедії).

7

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

Я не знаю жодної іншої прямої та практичної метрики, добре співвіднесеної з помилками.

Одне, що я хотів би зробити, - почати запускати номери для різних проектів, на яких я працюю, - Test Coverage :: kLOC, а потім обговорити "сприйняту якість", щоб побачити, чи є кореляція.


1
Отже, чим більше коду, тим більше помилок у ньому?

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

Наскільки я пам’ятаю, типова кількість галузей становить приблизно 2-3 помилки на 1000 рядків коду для середніх проектів, наближаючись до приблизно 0,5 помилок на 1000 рядків коду для програмного забезпечення управління атомними станціями або проектів NASA, де вони вкладають величезну кількість зусиль , контроль, тестування, огляд тощо, оскільки збої можуть мати дуже серйозні наслідки. Хтось, хто має посилання на номери, що це підтримують?
hlovdal

2
@hlovdal: 2-3 помилки на KSLOC - це вже дуже низький показник. Найнижчі показники, які я знаю з аерокосмічної та безпекової областей, складають порядку 0,1 помилок на KSLOC. Здається, типові цифри становлять від 20 до 50 помилок на KSLOC. Для довідки, документ Google для Енді Германа під назвою "Аналіз статистичного коду програмного забезпечення - уроки".
Schedler

1
Я заперечую ці цифри - це повністю залежить від мови, компілятора та виконавчого середовища. Друкарські помилки в JavaScript-коді можуть зайняти роки , але помилка друку на компільованій мові знайдеться в першій компіляції.
JBRWilkinson

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% покриття шляху.
Joeri Sebrechts

+1 Більше вихідного коду не обов’язково краще.
Ларрі Коулман

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

@ luis.espinal Програмне забезпечення настільки велике, що занадто обчислювально дорого для тестування, неймовірно погано написане програмне забезпечення. Це майже не має уявлення про те, як зробити робоче програмне забезпечення.
Пабло Аріель

@PabloAriel - "Програмне забезпечення настільки велике, що занадто обчислювально дорого перевірити" << Це не те, що я сказав. Прочитайте коментар (можливо, два-три рази), щоб переконатися, що ви насправді читаєте те, що ви думаєте, що читаєте.
luis.espinal

4

Анекдот, який показує, чому підрахунки KLOC марні (і навіть шкідливі) для оцінки ефективності.

Роки тому я працював над великим проектом (70+ людей у ​​нашій компанії, ще 30+ у нашого замовника), який використовував підрахунки KLOC як єдиний показник ефективності роботи команд та людей.

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

Кінцевий результат за чверть: -40 000 рядків коду. Під час огляду продуктивності після кварталу ми отримали офіційну догану від компанії за те, що ми не виконали наших вимог щодо продуктивності в 20 000 рядків коду, що виробляються на квартал (адже інструменти показали, що ми створили -40 000 рядків коду), які Це призвело б до того, що б нас усіх не зафіксували як недооцінку та обійшли акції, навчання, підвищення зарплати тощо. Якби не втручався керівник проекту та команда з питань якості, а догану скасували та замінили на це похвалою.

Через кілька місяців (такі речі потребують часу) нам сказали, що компанія переглядає їхні норми продуктивності праці та найняла команду експертів для створення нової системи на основі аналізу функціональних точок.


Чому ви просто не показали різниці ?!
reinierpost

Я думаю, що це було зроблено. Але якщо система настільки жорстка, вона навіть не дзвонить у дзвінки тривоги, коли з'являється така неправдива точка даних, вона не принесе багато користі.
jwenting

2
Ваша відповідь не показує, що KLOC марні, вона показує, як їх не використовувати.
Ніл N

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

1
Використання SLOC як метрики продуктивності є просто німим і, ймовірно, ніколи не дасть хороших результатів. Використання SLOC як метрики якості, що вказує на ремонтопридатність та кількість дефектів, є більш розумним, оскільки всі застереження вже обговорювалися з цього питання.
redcalx

2

Я здивований, поки ніхто не згадував Заява / Рішення Покриття одиничних тестів (відсоток коду, що використовується одиничними тестами).

Покриття коду корисно тим, що ви знаєте, який відсоток програми не виходить з ладу; решта його корисності залежить від якості одиниць тестів.


Покриття коду також є помилковою метрикою (хоча може мати певне використання). Він пропонує запрошення написати тести на дурниці просто для отримання більшого висвітлення. І звичайно, є речі, які ніколи не висвітлюються, і люди почнуть уникати написання цих матеріалів. Наприклад, я бачив засоби покриття коду, які позначили JavaDoc як код, і, звичайно, він не буде охоплений. інший інструмент позначив усі порожні рядки такими, що не покриваються тестами. Ви погоджуєтесь, що усунути коментарі та пробіли у вашому коді - це гірше, ніж пропускати тести на одиницю для деяких сетерів?
jwenting

Абсолютно, погані одиничні тести шкодять більше, ніж допомагають багатьма способами. Наприклад, ви можете отримати 100% покриття коду для набору тестів, які не мали єдиного твердження.
StuperUser

1

Чим менше, тим краще, тим краще. Йдеться про інструменти SCM, а не за кодом, але це дуже вимірюваний показник. Чим менша фіксація, тим легше бачити кожну зміну як атомну одиницю; тим простіше відновити конкретні зміни та чітко визначити, коли все порушилось.

Поки жодна комісія не порушує збірку ...


1

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

Помітно цикломатична складність, яку я вважаю корисною з точки зору візуалізації того, наскільки модульована дана база коду. Ви, як правило, бажаєте низької складності, оскільки це означає, що кількість джерел на модуль є низькою і є багато модулів.


1

Я часто працюю над гігантським пакетом C ++, і коли шукаю проблемний код, котрий варто рефаніфікувати цикломатичну складність або жахливі FanIn / FanOut, як правило, досить гарні червоні прапори. Виправлення неполадок зазвичай призведе до покращення всієї бази коду.

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


1

На моїй роботі є багато ситуацій, коли я використовую кодові показники:

Під час написання коду

Найбільше і, мабуть, найважливіше використання в моїй щоденній роботі - це Checkstyle - інструмент для розробників Java, який постійно перевіряє показники (серед іншого) мого коду на набір визначених нами правил і позначає місця, де мій код не використовується відповідати цим правилам. Коли я розробляю код, він говорить мені в режимі реального часу, якщо мої методи стають довгими, складними або поєднаними, що дозволяє мені відступити назад і подумати про рефакторинг його на щось краще.

Розробники абсолютно вільні порушувати всі правила, оскільки вони ніколи не застосовуватимуться до всіх ситуацій. "Правила" існують, щоб стимулювати думку і говорити "Ей, це найкращий спосіб зробити це?"

Під час оглядів QA / Code

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

Я також перевіряю, які показники, погоджені командою, були "порушені", якщо такі є, щоб побачити, чи я згоден з розробником, що це було нормально, чи я можу запропонувати способи його вдосконалення. Наявність цих метрик розвитку, домовлених у нашій команді для написання нового коду, зробило великі шляхи вдосконалення нашого коду. Ми пишемо набагато менше монолітних методів і набагато краще за принципом єдиної відповідальності .

Тенденційні вдосконалення застарілого коду У нас є багато застарілого коду, який ми хотіли б удосконалити. Показники в будь-який момент часу є досить марними, але для нас важливо те, що з часом охоплення кодом зростає і такі речі, як складність і зв'язок, знижуються. Тому наші показники підключаються до нашого сервера безперервної інтеграції, що дозволяє нам з часом переглянути, щоб переконатися, що ми на правильному шляху.

Ознайомлення з новою базою коду Про єдиний раз, коли я коли-небудь використовую рядки метрики вихідного коду, це коли я дивлюся на базу коду, з якою я не знайомий. Це дозволяє мені швидко оцінити грубі розміри проекту порівняно з іншими, з якими я працював. Використовуючи інші показники, я можу отримати ще більш грубе уявлення про якість проекту.

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


0

З: Які корисні показники можна отримати для вихідного коду?

Для бізнесу:

A: Кількість людино-годин

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

A: Не має значення. Зробимо все сьогодні

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

A: Кількість SLOC (вихідні рядки коду)

Для матері кодера:

A: Їжте більше цих м'яких французьких булочок і пийте чай

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


-1

Пам’ятайте: весь код можна зменшити хоча б на 1 інструкцію. Усього коду принаймні 1 помилка. Тому весь код можна звести до однієї інструкції, яка не працює. Сподіваюся, що це допомагає!


і з меншими побічними ефектами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.