Технический долг (также известный как проектный долг или долг кода, но может быть также связан с другими техническими начинаниями) - это концепция в разработка программного обеспечения, которая отражает подразумеваемые затраты на дополнительную переделку, вызванную выбором простого (ограниченного) решения сейчас вместо использования лучший подход, который потребует больше времени.
Как и в случае с денежным долгом, если технический долг не погашен, он может накапливать «проценты», что затрудняет внедрение изменений. Невыполненный технический долг увеличивает энтропию программного обеспечения. Технический долг - не обязательно плохо, и иногда (например, в качестве доказательства концепции) требуется для продвижения проектов. С другой стороны, некоторые эксперты утверждают, что метафора «технического долга» имеет тенденцию минимизировать воздействие, что приводит к недостаточной приоритизации необходимой работы по его исправлению.
Когда изменение начинается в кодовой базе, возникает часто возникает необходимость внести другие согласованные изменения в другие части кодовой базы или документации. Незавершенные изменения считаются долгом, и, пока они не будут внесены, будут начисляться проценты сверх процентов, что затрудняет создание проекта. Хотя этот термин используется в первую очередь в разработке программного обеспечения, его также можно применить к другим профессиям.
Общие причины технического долга включают:
В ходе обсуждения В блоге «Квадрант технического долга» Мартин Фаулер различает четыре типа долга на основе двух дихотомических категорий: первая категория - безрассудная или осторожная, вторая - преднамеренная или непреднамеренная.
Безрассудство | Осмотрительность | |
---|---|---|
. Умышленное. | «У нас нет времени на проектирование» | «Мы должны отправить товар сейчас и разобраться с последствиями ( позже) " |
. Случайно. | " Что такое наслоение? " | «Теперь мы знаем, как мы должны были это сделать» |
Кенни Рубин использует следующие категории статусов:
«Выплата процентов» вызвана как необходимым локальным обслуживанием, так и отсутствием обслуживания другими пользователями проекта. Продолжающаяся разработка проекта upstream может увеличить стоимость «выплаты долга» в будущем. Выплата долга выполняется простым завершением незавершенной работы.
Наращивание технического долга - основная причина того, что проекты срывают сроки. Трудно точно оценить, сколько работы нужно для погашения долга. Для каждого инициированного изменения в проект передается неопределенный объем незавершенной работы. Крайний срок пропускается, когда проект понимает, что незавершенной работы (долга) больше, чем времени для ее завершения. Чтобы иметь предсказуемые графики выпуска, команда разработчиков должна ограничить объем незавершенной работы, чтобы сохранить объем незавершенная работа (или задолженность) всегда небольшая.
Если по проекту выполнено достаточно работы, чтобы не было препятствий для подачи заявки, то будет выпущен проект, который по-прежнему несет значительную техническую задолженность. Если это программное обеспечение попадет в производство, тогда риски внедрения любых будущих рефакторингов, которые могут решить проблему технического долга, резко возрастут. Изменение производственного кода сопряжено с риском простоев, реальных финансовых потерь и, возможно, юридических последствий, если контракты включают соглашения об уровне обслуживания (SLA). По этой причине мы можем рассматривать перенос технического долга в производство почти так, как если бы это было увеличением процентной ставки, и единственное время, когда это уменьшалось, - это когда развертывание было отклонено и прекращено.
«Поскольку развивающаяся программа постоянно меняется, ее сложность, отражающая ухудшающуюся структуру, увеличивается, если не будет сделана работа по ее поддержанию или уменьшению».
— Меир Мэнни Леман, 1980Хотя Мэнни Закон Lehman уже указывал, что развивающиеся программы постоянно увеличивают свою сложность и ухудшают структуру, если не ведется работа по их поддержанию Уорд Каннингем сначала провел сравнение между технической сложностью и задолженностью в отчете об опыте 1992 года:
«Отгрузка кода в первый раз - это как залезть в долги. Небольшой долг ускоряет разработку, если он своевременно выплачивается путем переписывания... Опасность возникает, когда долг не погашен. Каждая минута, потраченная на не совсем правильный код, засчитывается как проценты по этому долгу. Целые инженерные организации могут быть остановлены из-за долгового бремени неконсолидированной реализации объектно-ориентированного или иначе ".
— Уорд Каннингем, 1992В своем тексте 2004 года Refactorin g в «Шаблоны» представляет сопоставимый аргумент относительно затрат, связанных с архитектурной небрежностью, которую он описывает как «проектный долг».
Действия, которые можно отложить, включают документацию, написание тестов, внимание к комментариям TODO и устранение предупреждений компилятора и статического анализа кода. Другие примеры технического долга включают в себя знания, которыми не делятся в организации, и код, который слишком запутан, чтобы его можно было легко изменить.
В статье о разработке PHP в 2014 году говорилось:
Цена никогда не платить этот технический долг очевиден; в конечном итоге стоимость предоставления функциональности станет настолько низкой, что хорошо спроектированный конкурентный программный продукт может легко обогнать плохо спроектированное программное обеспечение с точки зрения функций. По моему опыту, плохо спроектированное программное обеспечение также может привести к более напряженной работе инженеров, что, в свою очередь, приведет к увеличению текучести персонала (что, в свою очередь, влияет на затраты и производительность при предоставлении функций). Кроме того, из-за сложности данной кодовой базы возможность точно оценить работу также исчезнет. В тех случаях, когда агентства по разработке взимают плату за отдельные функции, норма прибыли за доставку кода в конечном итоге ухудшится.
— пишет в статье «Освоение шаблонов проектирования PHP»Грэди Буч сравнивает, насколько развивающиеся города похожи на развивающиеся. программно-интенсивные системы и как отсутствие рефакторинга может привести к техническому долгу.
«Концепция технического долга играет центральную роль в понимании сил, влияющих на системы, поскольку она часто объясняет, где, как и почему система подвергается нагрузке. В городах ремонт инфраструктуры часто откладывается, и скорее вносятся постепенные изменения. чем жирным шрифтом. То же самое и в системах с интенсивным программным обеспечением. Пользователи страдают от последствий капризной сложности, отложенных улучшений и недостаточных дополнительных изменений; разработчики, которые развивают такие системы, страдают от того, что никогда не смогут написать качественный код, потому что они всегда пытаются наверстать упущенное ».
— Грэди Буч, 2014В ПО с открытым исходным кодом откладывание отправки локальных изменений в вышестоящий проект является формой технического долга.