Як я можу оцінити суму технічної заборгованості, яка існує в проекті?


67

Хтось знає, чи є якийсь інструмент, щоб поставити число на технічну заборгованість кодової бази, як своєрідну метрику коду? Якщо ні, чи хтось знає алгоритм чи набір евристики для нього?

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

Мене найбільше цікавить аналіз та оцінка бази коду C #, але, будь ласка, не соромтесь звучати і для інших мов, особливо, якщо ці поняття є мовними.


12
Технічна заборгованість випливає з рішень, а не з коду. Він накопичується через неправильний вибір управління. Не ясно, що "метод, клас, простір імен, збірка" містять технічну заборгованість самі по собі. Вони несуть відповідальність, коли є кращий вибір.
S.Lott

7
Я заперечую (в контексті метафори боргу), що менеджери можуть бути власниками боргу, але артефакти коду представляють оцінку боргу і можуть бути кількісно визначені. Тобто я погоджуюся з тим, що менеджери можуть прийняти таке рішення, як «забути тестування одиниць, тому що ми не маємо часу», і таким чином несемо технічну заборгованість. Але я, звичайно, думаю, що ви можете поставити число до окремих елементів коду як евристичний. Подумайте про це так - якщо керівництво приймає низку жахливих рішень на майбутнє, але коду не було написано, чи є заборгованість на той момент?
Ерік Дітріх

3
"чи є заборгованість на той момент?" Борг потрібно накопичувати, ви праві. Але це не код; це потрібно скасувати обсяг виконаної роботи. Технічні характеристики, конструкції, код, DBA-роботи, все це потрібно переробити. Вимірювання заборгованості від програмних артефактів (наприклад, вихідних рядків коду) аналогічно передбаченню вартості розробки.
S.Lott

7
Виміряти технічну заборгованість важко, плюс це бентежить менеджерів. Однак я можу сказати вам про хороший спосіб боротьби з технічним боргом: дешеві, приємні та працюючі прототипи, особливо якщо база коду обертається навколо GUI. Як Джоел запропонував тут: joelonsoftware.com/articles/fog0000000332.html щодня приділяйте трохи часу, прибираючи речі. Зміни повинні бути позитивними поліпшеннями, а не "OMG, наш технічний борг = пентаблоби, і він росте експоненціально зі швидкістю ... небо падає". Просто витрачайте щодня трохи часу на кайзен, щоб не порушувати речі, які працюють. Заводити друзів.
Робота

6
@ZoranPavlovic Ваша химерна та непрохана помилкова дилема відсутня третій варіант: я хотів знати, чи існують інструменти, які намагаються кількісно оцінити технічну заборгованість.
Ерік Дітріх

Відповіді:


38

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

Існує ряд показників, які можуть дати вам деяку вказівку щодо якості коду:

  • Покриття коду. Існують різні інструменти, які показують, який відсоток ваших функцій, висловлювань та рядків охоплюється одиничними тестами. Ви також можете зіставити системні та приймальні тести до вимог, щоб визначити відсоток вимог, які охоплюються тестом на рівні системи. Відповідне покриття залежить від характеру програми.
  • З'єднання та згуртованість . Код, який демонструє низьке з'єднання та високу згуртованість, як правило, легше читати, розуміти та тестувати. Існують інструменти аналізу коду, які можуть повідомити про кількість з'єднань та згуртованості в даній системі.
  • Цикломатична складність - це кількість унікальних шляхів через додаток. Зазвичай він рахується на рівні методу / функції. Цикломатична складність пов'язана з зрозумілістю та заповітністю модуля. Мало того, що більш високі значення цикломатичної складності вказують на те, що хтось матиме більше проблем з кодом, але цикломатична складність також вказує на кількість тестових випадків, необхідних для досягнення покриття.
  • Різні заходи складності Галстеда дозволяють зрозуміти читабельність коду. Вони підраховують операторів і операндів для визначення обсягу, складності та зусиль. Часто це може вказувати на те, як комусь буде складно забрати код і зрозуміти його, часто в таких випадках, як огляд коду або новий розробник до бази коду.
  • Кількість дублюючого коду. Дублюваний код може вказувати на потенціал для рефакторингу на методи. Дублікат коду означає, що існує більше рядків для введення помилки, і більша ймовірність наявності одних і тих же дефектів у кількох місцях. Якщо однакова бізнес-логіка існує в декількох місцях, стає важче оновити систему для обліку змін.

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

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


1
Наразі я використовую метрику коду NDepend ( ndepend.com ), CodeRush та VS, щоб слідкувати за згаданими вами показниками (за винятком заходів Халстеда, про які я розглядаю далі). Я думав, що міг би скористатися певним об'єднанням цих показників, щоб спробувати поставити якесь число на заданий елемент коду, який би приблизно вказував, на перший погляд, наскільки це затратно на постійну розробку.
Ерік Дітріх

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

2
Ще один простий показник, який я додам до списку, - це номер TODO / HACK / WTF? коментарі в кодову ...
MaR

@Mar Це передбачає, що ви правильно їх використовуєте та не граєте їх у вашу користь. Хочете трохи додаткового часу для очищення бази коду, просто додайте ці коментарі там, де вони не підходять. Небайдужи до кодової бази, просто видаліть їх там, де вони повинні бути. Коментарі можуть брехати, код не можна.
Томас Оуенс

1
@Thomas Owens: погоджено, але майже будь-яка метрика сама може бути обдурена. Якщо правильно та чесно використовувати, "метрика TODO" забезпечує дешевий огляд того, який код насправді відсутній або повинен бути змінений (= невидима заборгованість за показниками, що базуються на коді).
Март

23

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

Він також підтримує досить широкий діапазон мов.

SonarQube (раніше Sonar ) - платформа з відкритим кодом для постійної перевірки якості коду ...

  • Підтримка 25+ мов: Java, C / C ++, C #, PHP, Flex, Groovy, JavaScript, Python, PL / SQL, COBOL тощо.
  • SonarQube також використовується в Android Deveopment.
  • Пропонує звіти про дублюваний код, стандарти кодування, тести блоку, покриття коду, складний код, потенційні помилки, коментарі та дизайн та архітектура.
  • Машина часу та диференціальний погляд.
  • Повністю автоматизований аналіз: інтегрується з Maven, Ant, Gradle та інструментами безперервної інтеграції (Atlassian Bamboo, Jenkins, Hudson тощо).
  • Інтегрується із середовищем розробки Eclipse
  • Інтегрується із зовнішніми інструментами: JIRA, Mantis, LDAP, Fortify тощо.
  • Розширюється за допомогою плагінів.
  • Реалізує методологію SQALE для обчислення технічної заборгованості ...

1
Класно, дякую! У мене є і використовую NDepend для моєї роботи на C #, але я також трохи працюю над Java, і мене також цікавлять показники. Принаймні, це дає мені функціональність для Java, і це може виявитися гарним доповненням до NDepend.
Ерік Дітріх

Чудово, ми використовуємо Sonar там, де я працюю, і він робить дуже приємні речі, які дають вам зрозуміти стан вашої бази даних.
Роберт Грейнер

2
@ErikDietrich, FYI Sonar також має плагін C # .
Péter Török

@ErikDietrich FYI тепер є плагін NDepend для Sonar ndepend.com/docs/sonarqube-integration-ndepend
Patrick Smacchia - NDepend dev

Чи є альтернативи з відкритим кодом?
пекло

5

Я ненавиджу використовувати аналогію з фінансів, але це здається дійсно доречним. Коли ви цінуєте щось (активи будь-якого виду), воно може мати як внутрішнє, так і зовнішнє значення. У цьому випадку існуючий код має внутрішнє значення, яке було б величиною, що відповідає відносній якості згаданого коду, і воно також матиме зовнішнє значення (значення від того, що можна було б зробити для коду), і ці величини були б додаткові. Власне значення можна розділити на кредити та дебети (добре проти погано), використовуючи будь-яку методологію, яку ви використовуєте для оцінки коду (+5 для коментарів / читабельності, -10 для покриття коду тощо)

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

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


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

5

Між розробниками досить надійним показником технічної заборгованості є WTF / хвилина .

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

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

Слово обережності: хоча цей підхід є досить потужним, краще подвійно перевірити старі добрі WTF / хвилину, перш ніж вдаватися до нього. Річ у тому, що вона досить громіздка: щоб отримати дані, потрібно ретельно відстежувати час і точно записувати їх у відповідних категоріях.

  • набагато простіше зазначити загальну витрату на реалізацію функції A за 3 тижні, ніж
     
    я витратив 14 годин на проект впровадження функції A, потім 29 годин на тестування диму, потім 11 годин на впровадження виправлених я для регресій, а потім 18 годин на тестування якості - вже реалізація функції. Після цього хлопці з QA витратили 17 годин на тестування початкового релізу кандидата. Після цього я витратив 13 годин на аналіз помилок, поданих QA для початкового випуску кандидата, та 3 години на реалізацію виправлень. Після цього я витратив 11 годин на тестування диму змін, які я вніс до початкового звільнення кандидата. Після того...

У будь-якому випадку, дані про тестування та виправлення помилок, за моїм досвідом, було досить легко.

Для останнього випуску ми витратили близько 90% часу на тестування та виправлення регресійних помилок. Для наступного випуску запропонуйте докласти певних зусиль для зниження цього значення до 60-70%.


Ще одне слово обережності. Дані на кшталт 90% вище можна інтерпретувати не лише як вказівку на технічну заборгованість, але також (несподіванка зненацька) як вказівку на те, що хтось не дуже досвідчений у програмуванні / конкретній технології. "Ви просто зробите занадто багато помилок у своєму коді".

Якщо існує ризик неправильного тлумачення даних, це допомагає мати додаткові, довідкові дані про щось менш схильне до WTF порівняння.

  • Скажімо, якщо є два подібних компонента / програми, що підтримуються одним і тим же розробником, перший випуск із "витратою" приблизно 50%, а другий на 80-90, це робить досить вагомий випадок на користь того, що другий є об'єктом технічної заборгованості.

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

Завдяки тестерам ви зможете створити резервне копіювання розуміння проблем дизайну. Коли тільки розробники скаржаться на якість коду , це часто звучить як суб'єктивні WTF з-за закритих дверей .
 
Але коли це повторюється тим, що хлопець QA каже щось на зразок component A100 помилок регресії для 10 нових функцій, на відміну від component B10 регресійних помилок на 20 нових функцій , спілкування раптом перетворюється на зовсім іншу гру.


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

4

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

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

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


Отже, в контексті сюжетних моментів, чи справедливо сказати, що ви могли б додати кілька балів до кожної історії, якби високий ступінь технічної заборгованості був представлений у постраждалих районах коду? Тобто, якщо історія X передбачає додавання до кодового елемента Y, що просто жахливо, ви дотримуєтесь декількох пунктів до історії саме через характер Y? І ця кількість балів така ж, як і пов'язана з кількістю очок для виконання виправлення, яке ви згадали, оцінюючи?
Ерік Дітріх

1
@Erik Dietrich - Ну, TD, безумовно, додає складності рішення. Складність може полягати в тому, що закріплення деталей ТД може бути дорожчим, ніж оптове рішення. Таким чином, може бути, що у вас є 3 історії, які оцінювали б по 5 у кожному випадку, якщо TD було ліквідовано, але це 8 з кожним із заборгованості на місці - так що це додає до 9 балів TD. Завдання виправити TD в цілому (незалежно від розповідей) може насправді бути 8. Таким чином, ви можете стверджувати, що оптове рішення коштує дешевше (8), ніж деталь (9). Це було б частиною переговорів
Меттью Флінн

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

2

Там є досить сильна платформа під назвою CASTшукати технічну заборгованість у великих програмах. Ми використовували його в проекті, де ми перейняли велике вдосконалення спадкової системи. Це не говорить вам, що було в головах людей, які написали код, але він вивчає код і знаходить недоліки коду та архітектури, а потім кількісно визначає технічну заборгованість. Реальне використання при розгляді цього питання - це не сума $, а перелік проблем, які вже є в коді. Це говорить вам про частину вашої технічної заборгованості (тому я не погоджуюся з деякими відповідями вище). Існує деяка технічна заборгованість, заснована виключно на дизайні, і це дуже суб'єктивно - як порнографія - ви це знаєте, коли бачите її і знаєте контекст. Я б заперечив, чи справді це "технічна" заборгованість. Є деяка технічна заборгованість, яка суто втілюється в життя, і я вважаю, що "


Я поділився цим питанням у Twitter, і хтось відповів, розмовляючи про CAST. Мені не дуже зрозуміло, що все це робить після перевірки їх веб-сайту. Чи є на будь-який випадок халява чи демо-версія, яку можна взяти на тест-драйв?
Ерік Дітріх

2

Ось вебінар з MIT, що описує технічну заборгованість у великих програмних системах: http://sdm.mit.edu/news/news_articles/webinar_050613/sturtevant-webinar-technical-debt.html

Автори написали код, щоб проаналізувати проект та витягнути метрику «архітектурної складності». Показано, що ці показники мають міцний зв'язок із щільністю дефектів, продуктивністю розробника та плинністю персоналу.

Робота, описана у Вебінарі, ґрунтується на дослідженні модульності, проведеному Аланом Маккормаком та Карліссом Болдуїном у Гарвардській школі бізнесу. Я б також подивився на їхні документи. Їх «вартість розмноження» може бути саме тим, що ви шукаєте.


1

Я б сказав, що стандартні показники коду можуть використовуватися як високий рівень відносної технічної заборгованості. VS Ultimate включає аналізатор коду, який дасть вам "Індекс ремонтопридатності" на основі цикломатичної складності, зчеплення, LoC та глибини спадкування. Ви можете зануритися в будь-які місця проблем і переглянути деталі (до рівня функцій). Я щойно запустив його у свій проект, і найнижчі результати отримали 69 у нашому пакеті даних (налаштування та ініціалізація EF) та нашому тестовому наборі. Все інше було 90 і вище. Є й інші інструменти, які дадуть вам більше показників, як ті, які обговорювалися в ДПП дядька Боба


Так, скажіть, у вас було щось не в тестовому наборі чи пакеті даних, який набирав балів нижче 90. Чи є у вас числовий поріг, де ви говорите: «добре, це недостатньо добре, і ми збираємось рефактор»? Або ви використовуєте цю інформацію для того, щоб передати справу керівництву або якомусь із зацікавлених сторін, що необхідний рефакторинг? Тобто, чи переймаються менеджери / зацікавлені сторони щодо індексу ремонтопридатності Microsoft, чи ви подаєте цю інформацію іншим чином? Або ви просто не представляєте її і спокійно вирішуєте проблему самостійно?
Ерік Дітріх

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

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

Зауважте, я не казав зануритися і добровільно очистити код. Я сказав, щоб очистити код, над яким ви вже працюєте. Я також працював з високо регульованим кодом (присвоюйте робочий елемент, повинен надати список змін, які вносяться до робочого елемента для затвердження, виконайте затверджені зміни ). 9/10 разів пояснення рефакторингу у запиті на зміну призведе до схвалення.
Майкл Браун

0

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


2
З точки зору реальної політики я б заперечував, що люди, які найбільше бажають зазнати довгострокових негараздів для короткострокових результатів, ймовірно, є також людьми, що найменше можуть документувати свої рішення. Отже, я погоджуюсь з вашою ідеєю теоретично, але я вважаю, що серійні "прохачі на користь" були б найменшою ймовірністю відстежувати баланс переваг.
Ерік Дітріх

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

0

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

Які ваші думки? Рада відповісти на будь-які запитання і голодна почути ваші відгуки :).

Власність для запобігання дефектам та небажаній заборгованості за техніку

Власність є провідним показником здоров’я інженерії.

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

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

Це дещо аналогічно трагедії общини .

Згуртованість для покращення архітектури

Згуртованість - це індикатор чітко визначених компонентів.

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

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

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

Збийте, щоб визначити проблемні зони

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

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

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

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


-1

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

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