Сложность программного обеспечения: типы, влияние и измерение.
Programming complexity
Сложность программного обеспечения: различие между "сложным" и "запутанным". Экспоненциальный рост взаимодействий усложняет понимание больших систем. SEO-оптимизация.
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Введение
Сложность программирования (или сложность программного обеспечения) — это термин, охватывающий свойства программного обеспечения, влияющие на внутренние взаимодействия. Многие специалисты различают понятия "сложный" и "запутанный". "Запутанный" подразумевает трудность понимания, но в конечном итоге познаваемость. "Сложный", напротив, описывает взаимодействия между элементами. С увеличением числа элементов количество взаимодействий между ними растёт экспоненциально, что делает невозможным полное их знание и понимание. Аналогично, повышение сложности программного обеспечения увеличивает риск непреднамеренного нарушения взаимодействий, а следовательно, и риск внесения дефектов при внесении изменений. В крайних случаях это может сделать модификацию программного обеспечения практически невозможной. Связь между сложностью программного обеспечения и его поддерживаемостью была всесторонне исследована профессором Мэнни Леманом, разработавшим Законы эволюции программного обеспечения. Он и его соавтор Лес Белэди изучили множество метрик программного обеспечения, которые можно использовать для оценки его состояния, и в конечном итоге пришли к выводу, что единственным практичным решением является использование детерминированных моделей сложности.
Programming complexity (or software complexity) is a term that includes software properties that affect internal interactions. Several commentators distinguish between the terms "complex" and "complicated". Complicated implies being difficult to understand, but ultimately knowable. Complex, by contrast, describes the interactions between entities. As the number of entities increases, the number of interactions between them increases exponentially, making it impossible to know and understand them all. Similarly, higher levels of complexity in software increase the risk of unintentionally interfering with interactions, thus increasing the risk of introducing defects when changing the software. In more extreme cases, it can make modifying the software virtually impossible. The idea of linking software complexity to software maintainability has been explored extensively by Professor Manny Lehman, who developed his Laws of Software Evolution. He and his co author Les Belady explored numerous software metrics that could be used to measure the state of software, eventually concluding that the only practical solution is to use deterministic complexity models.
Типы
Сложность существующей программы определяет сложность её изменения. Сложность задачи можно разделить на две категории:
The complexity of an existing program determines the complexity of changing the program. Problem complexity can be divided into two categories:
Accidental complexity relates to difficulties a programmer faces due to the software engineering tools. Selecting a better tool set or a higher level programming language may reduce it. Accidental complexity often results from not using the domain to frame the form of the solution. Domain driven design can help minimize accidental complexity. Essential complexity is caused by the characteristics of the problem to be solved and cannot be reduced.
Случайная сложность связана с трудностями, с которыми сталкивается программист из-за используемых инструментов разработки программного обеспечения. Выбор более подходящего набора инструментов или языка программирования более высокого уровня может её снизить. Случайная сложность часто возникает из-за того, что предметная область не используется для определения структуры решения. Проектирование, управляемое предметной областью, может помочь минимизировать случайную сложность. Существенная сложность обусловлена характеристиками самой решаемой задачи и не может быть уменьшена.
The complexity of an existing program determines the complexity of changing the program. Problem complexity can be divided into two categories:
Accidental complexity relates to difficulties a programmer faces due to the software engineering tools. Selecting a better tool set or a higher level programming language may reduce it. Accidental complexity often results from not using the domain to frame the form of the solution. Domain driven design can help minimize accidental complexity. Essential complexity is caused by the characteristics of the problem to be solved and cannot be reduced.