Об'єктивні показники якості програмного забезпечення [закрито]


12

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

Мене цікавить більш глибока форма якості, пов’язана з мережею (або графіком) типів та їх взаємопов'язаністю, тобто про те, до яких типів відноситься кожен тип, чи є чітко ідентифіковані кластери взаємозв’язку, що належать належним чином багатоярусна архітектура, або, навпаки, є великий «куля» посилань на тип («монолітний» код). Також розмір кожного типу та / або методу (наприклад, вимірюється в кількості байтового коду Java або. Net IL) повинен дати деяку вказівку на те, де великі складні алгоритми були реалізовані як монолітні блоки коду, а не розкладатися на більш керовані / ремонтовані шматки.

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

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

Інший спосіб мислення про якість - з точки зору ентропії. Ентропія - це тенденція повернення систем із упорядкованих до невпорядкованих станів. Кожен, хто коли-небудь працював над реальним програмним проектом середнього та великого масштабу, оцінить ступінь, до якого якість кодової бази має тенденцію до погіршення з часом. Тиск у бізнесі, як правило, призводить до змін, що зосереджуються на новій функціональності (за винятком випадків, коли саме якість є принциповою точкою продажу, наприклад, у програмному забезпеченні авіоніки), а також погіршення якості через проблеми регресії та функціональність "взуття", де це не добре підходить від перспектива якості та обслуговування. Отже, чи можна виміряти ентропію програмного забезпечення? А якщо так, то як?


Я згоден із С. Лоттом. У житті часто існує різниця між тим, "як це повинно бути", і "як це має бути". Хлопчик, я хочу, щоб більше людей на цій планеті подолали підхід "добрих намірів" і важко подивилися на те, як це відбувається. Окрім неправильних стимулів, виникне небезпечне помилкове почуття безпеки. Поєднайте це з людьми, які намагаються грати в систему (що природно, тому що ЗАВЖДИ намагаються покращити свої умови (грошові чи інші)), і ви отримаєте шалену ситуацію. Не дивно, що краплі одного разу на тисячоліття трапляються раз на 2 десятиліття.
Робота

Відповіді:


20

Це небезпечна ідея. "Об'єктивні" проксі-сервери за якістю призводять безпосередньо до винагород менеджменту, а розробники дотримуватимуться цих показників за рахунок фактичної якості.

Це закон ненавмисних наслідків.

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

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

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

Навіть такі "очевидні" речі, як покриття тестового коду, можуть витрачати час. Досягнення 100% може зажадати створення тестів, які насправді складніші, ніж тривіальний код, який тестується. Отримання 100% покриття може спричинити неприйнятні витрати. [Альтернативою тривіальному, маленькому, рідко вживаному коду є тестова перевірка. Але це не відповідає 100% метричній грі.]

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


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

3
"Однак цього не повинно бути". Поясніть, яким чином можна сказати людям не оптимізувати свою винагороду. Знайдіть єдиний приклад поведінки людини, де культурні винагороди (засновані на всіляких шалених соціальних структурах) не є першочерговими, найважливішими і найважливішим, за що люди будуть домагатися. Все, що стосується "повинно" або "не повинно", повинно оцінюватися тим, що люди насправді роблять. Вони дійсно оптимізують свої нагороди. Якщо показники є частиною винагород, люди оптимізують показники. Будь ласка, не використовуйте "слід" для опису поведінки людей.
S.Lott

2
@Thomas Owens: "Ви просто не маєте нагород за оптимізацію на основі показників". Забавно. Як ти збережеш їх у таємниці? Як тільки я дізнаюся, що ваш код був прийнятий раніше, ніж мій, я захочу дізнатися, як керівництво вирішило, що ваш модуль зроблено, а мій не виконано. Як тільки я знайду показник, який "керує" цим рішенням, я буду повністю грати в показники, щоб зробити це вже раніше, ніж ви. Якщо немає жодної метрики, на яку я можу грати, то я побачу, що рішення було довільним, менеджмент подобається тобі краще за мене, і я кину, тому що не існує стандарту ефективності, який я можу сприймати.
S.Lott

2
@Thomas Owens: "Я ніколи не бачив, щоб показники призводили до нагород". Культурні стимули існують у всіх ситуаціях, коли два та більше людей працюють разом. "Особи визнаються за свою ефективність". Показник для цикломатичної складності стає ціллю. Якщо ви швидше, ніж я, досягаєте своєї цілі в цикломатичній складності, є культурні нагороди: ви "продуктивніші", ніж я. Мені потрібно зіграти свою метрику складності, щоб бути такою ж продуктивною, як ви.
S.Lott

2
@Thomas Owens: "Це питання особистої гордості". Це чудовий приклад культурної системи винагород. Метрики можуть перекосити це через непередбачувані наслідки того, що можна створити добре виглядає показник, який не відповідає хорошому коду. Ви навели чудовий приклад культурних нагород, які можна перекривити за показниками.
S.Lott

4

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

Бінго, і ніякого "якщо" про це. Це називається "Дисфункція вимірювання", і його спостерігали і писали багато разів, коли Джоел писав статтю про це у 2002 році, посилаючись на книгу професора з Гарварда.

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


3

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

Це звучить як вентилятор і вентилятор. Fan-in підраховує кількість модулів, які викликають даний модуль, а fan-out підраховує кількість модулів, викликаних даним модулем. Попереджувальним знаком для використання будуть модулі, які мають великий вентилятор та великий вентилятор, оскільки це може вказувати на поганий дизайн та ключову ціль для рефакторингу чи перепроектування.

Також розмір кожного типу та / або методу (наприклад, вимірюється в кількості байтового коду Java або. Net IL) повинен дати деяку вказівку на те, де великі складні алгоритми були реалізовані як монолітні блоки коду, а не розкладатися на більш керовані / ремонтовані шматки.

Простим вимірюванням були б рядки коду. Ви можете розбити його на загальні рядки коду по всьому проекту та рядки коду на модуль (можливо, використовуючи модулі різного розміру). Ви можете використовувати це як індикатор попередження, що вказує на те, що слід переглянути конкретні модулі. У книзі про вимірювання та показники якості програмного забезпечення обговорюється деяка робота, яка вказує на те, що залежність між коефіцієнтами дефектів та розміром модуля криволінійна, де середній дефект KSLOC має модулі розміром від 175 до 350 SLOC.

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

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

Я не впевнений, що це так.

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

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

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

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


Що стосується вентилятора / виходу - це те, що він дає два числа на модуль / клас (або що завгодно), і тому ігнорує деякі більш глибокі організаційні структури того, як модулі підключаються. Наприклад, у вас може бути невеликий кластер сильно пов'язаних модулів, пов'язаних з логічним рівнем, і ви очікуєте, що з'єднання між ярусами будуть мінімальними (порівняно), що представляє чітко визначений інтерфейс / контракт між ярусами. Я думаю, що ми раді, що деякі модулі сильно пов'язані (наприклад, широко використовувані допоміжні методи / класи), але залежно від "структури" зв'язку (це моя гіпотеза).
redcalx

@locster Ви, мабуть, хочете розширити його і зазначити, наприклад, до яких пакетів класів, до яких ви підключені. Не просто дивіться на необроблені числа, а розбивайте їх на речі, такі як X класи в моєму пакеті, Y класи поза моїм пакетом, або Z класи в цьому конкретному пакеті. Якщо ви бачите розрив між модулями у вашій моделі даних та модулями у вашому інтерфейсі, це може бути індикатором проблеми. Копати потрібно трохи глибше, ніж просто необроблені цифри.
Томас Оуенс

3

Існують показники або проксі для багатьох цікавих якостей:

  1. Рядки коду
  2. Вентилятор, вентилятор
  3. Помилка на 1000 рядків коду
  4. Цикломатична складність
  5. Покриття коду
  6. Охоплення точки прийняття рішення
  7. Коефіцієнт помилок, виправлених / введених в процесі обслуговування
  8. Аналіз точок функції

З усіма цими пунктами є деякі проблеми:

  1. Робота з оптимізації показника - універсальна тенденція; значно посилюється, якщо будь-яка з показників використовується як основа для оцінки або винагороди командам чи особам.
  2. Я не знаю жодної метрики, яка не є контекстною. Це означає, що порівняння між магазинами не можливе - лише в магазинах, у часі. Показники, що виникають в результаті таких порівнянь, все ще цінні - "чи ми виробляємо код правильніше зараз, ніж рік тому".

Загальний ефект цих питань полягає в тому, що такі показники, ймовірно, можуть бути цінними лише в межах ширшої культури - таких як TQM, забезпечення якості (не контроль), постійне вдосконалення, kaizan тощо. Потрібно визначити елементи обох культур , і як це потрібно змінити. Якщо у вас є визначення цих показників, такі метрики, як ці, стають важливими інструментами для покращення якості коду, робочої практики, продуктивності тощо. Без цього більш широкого контексту метрики створюватимуть роботу з оптимізації показників; стане інструментом приладу для підвищення продуктивності та зниження витрат; і стане перешкодою для розробки ігровим персоналом.


2

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


+1 для довідника про книгу Насима Талеба. Неправильне міркування / гносеологія знаходиться в ланцюжку причинності за низьку якість.
redcalx

@locster, ваш коментар змусив мене подумати про оператора трубопроводу F # :). Ви починаєте з «Довідник книги Нассіма Талеба», але закінчуєтесь «ланцюжком причинності низької якості» (замість «ланцюжка причинності низької якості»). Як і в англійській мові, ми іноді любимо мати два способи говорити речі, ми можемо віддавати перевагу і мові програмування.
Робота

1

Існує ця основна проблема з метрикою.

Практично всі запропоновані метрики показали, що в реальному світі на реальному коді сильно або дуже сильно співвідносяться з необробленими SLOC (вихідними рядками коду).

Це те, що вбило метрики Галстеда ще в 1970-х. (Випадково одного дня, приблизно в 1978 році, я взяв участь у розмові нового кандидата наук про метрику Галстеда, в якому він зазначив це.)

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

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


Щоб бути реконструйованим, нам потрібен код, який має бути в людських шматках, отже, показник SLOC з цієї точки зору виглядає досить непогано. Однак, для заданого розміру ви можете мати різну кількість унікальних шляхів (за циклічною складністю), і я можу стверджувати, що більше шляхів є проксі для менш зрозумілих. Отже, я можу стверджувати, що CC, ймовірно, має додаткове / деяке / додаткове значення для SLOC, якщо ви допускаєте певну гнучкість, винятки з правила тощо. Тобто не слід чітко виконувати CC.limits / цілі.
redcalx

1
@locster: Враховуючи два 100 модулів SLOC, один з CC 47 має, мабуть, більше проблем, ніж один із CC 3. ТЕХНІЧНО, для реального коду у великій кількості, можна виявити, що короткі модулі мають низький рівень CC і довгі модулі, як правило, мають високий рівень CC, до того, що знання SLOC дає вам дуже хорошу здогадку в CC, і навпаки. Це те, що мається на увазі під "дуже сильно співвіднесеним". ЯКЩО ТАКЕ, на реальному коді будь-яка вигода, яку ви отримуєте від помічаючи CC = 47, БІЛЬШЕ ЛЕГШЕ отримує від того, щоб помітити SLOC = 1500. (Числа витягнуті випадковим чином, принцип той самий.)
Джон Р. Стром

Так, я погоджуюся, що вони, як правило, сильно співвідносяться, хоча взаємини, як правило, нелінійні. наприклад, показник CC приблизно LOC підвищений до деякої потужності. Отже, з психологічної точки зору, показник КК може бути дуже великим дуже швидко, тоді як пов'язаний показник SLOC просто здається "лише трохи вищим". Так, я знаю, що я тут
чіпляюся

@locster: Я цим займаюся вже понад 30 років. У ці дні я звичайно бачу безпроблемні рутини потоку свідомості, які продовжуються і продовжуються протягом декількох сотень SLOC. За всі ці роки я бачив рівно одну (1) процедуру, яка НЕОБХІДНО була більш ніж однією сторінкою коду принтера (приблизно 60 рядків). Все інше могло бути досить вигідно зменшено, і читабельність та надійність значно зросли. (Це не враховує великих державних машин. Вони можуть бути проблемою в цій галузі, але вони РІДНІ.)
Джон Р. Стром

-2

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

Він використовує поєднання цикломатичної складності та тестового покриття. Як і будь-який інший показник, він є ігровим.

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