Введение

Сложность программирования (или сложность программного обеспечения) — это термин, охватывающий свойства программного обеспечения, влияющие на внутренние взаимодействия. Многие специалисты различают понятия "сложный" и "запутанный". "Запутанный" подразумевает трудность понимания, но в конечном итоге познаваемость. "Сложный", напротив, описывает взаимодействия между элементами. С увеличением числа элементов количество взаимодействий между ними растёт экспоненциально, что делает невозможным полное их знание и понимание. Аналогично, повышение сложности программного обеспечения увеличивает риск непреднамеренного нарушения взаимодействий, а следовательно, и риск внесения дефектов при внесении изменений. В крайних случаях это может сделать модификацию программного обеспечения практически невозможной. Связь между сложностью программного обеспечения и его поддерживаемостью была всесторонне исследована профессором Мэнни Леманом, разработавшим Законы эволюции программного обеспечения. Он и его соавтор Лес Белэди изучили множество метрик программного обеспечения, которые можно использовать для оценки его состояния, и в конечном итоге пришли к выводу, что единственным практичным решением является использование детерминированных моделей сложности.

Типы

Сложность существующей программы определяет сложность её изменения. Сложность задачи можно разделить на две категории:

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