В программной инженерии и проектировании архитектуры программного обеспечения архитектурные решения — это проектные решения, которые учитывают архитектурно значимые требования ; они воспринимаются как сложные для принятия [1] и/или дорогостоящие для изменения. [2]
Архитектурные решения влияют и воздействуют на нефункциональные характеристики системы. Каждое архитектурное решение описывает конкретную, архитектурно значимую проблему дизайна (также известную как проблема дизайна, требуемое решение), для которой существует несколько потенциальных решений (также известных как варианты, альтернативы). Архитектурное решение фиксирует результат сознательного, часто совместного процесса выбора варианта и предоставляет обоснование дизайна для результата принятия решения, например, ссылаясь на один или несколько качественных атрибутов, рассматриваемых архитектурным решением, и отвечая на вопросы «почему» о дизайне и выборе варианта. Архитектурные решения касаются программной системы в целом или одного или нескольких основных компонентов такой системы. Типы архитектурных решений — это выбор архитектурных тактик и шаблонов, технологий интеграции и промежуточного программного обеспечения, а также связанных стратегий и активов реализации (как коммерческих продуктов, так и проектов с открытым исходным кодом). [3]
Проектирование архитектуры программного обеспечения — это сложная проблема , [4] поэтому архитектурные решения трудно принять правильно. Часто не существует единого оптимального решения для любого заданного набора проблем проектирования архитектуры. Принятие архитектурных решений — это основная обязанность архитекторов программного обеспечения; [5] дополнительную мотивацию важности архитектурных решений как первоклассной концепции в архитектуре программного обеспечения можно найти в Интернете. [6]
Обоснование упоминалось в раннем определении архитектуры программного обеспечения Перри/Вульфа [7], но не исследовалось до 2004 года, когда в Гронингене, Нидерланды, был проведен семинар по архитектурным решениям и управлению архитектурными знаниями . Ранние публикации можно проследить до этого семинара. [8] [9] С 2006 года сообщества по управлению архитектурными знаниями и исследованию архитектурных решений набирали обороты, и ряд статей был опубликован на крупных конференциях по архитектуре программного обеспечения, таких как Европейская конференция по архитектуре программного обеспечения (ECSA), Качество архитектуры программного обеспечения (QoSA) и (Рабочая) Международная конференция по архитектуре программного обеспечения (ICSA). В книге Springer обобщено состояние дел по состоянию на 2009 год [10] , а систематическое картографическое исследование 2013 года [11] собирает и анализирует все больше и больше последних результатов исследований.
На практике важность принятия правильных решений всегда признавалась, например, в процессах разработки программного обеспечения, таких как OpenUP; существует множество шаблонов и практик для документирования решений. Семь из этих шаблонов сравниваются в. [12] Самый последний стандарт для описаний архитектуры, ISO/IEC/IEEE 42010:2011 , имеет выделенную сущность обоснования и дает подробные рекомендации, какие архитектурные решения следует фиксировать и какие свойства архитектурного решения следует записывать в журнал решений. [13]
Прежде чем принять решение, необходимо сформулировать необходимость принятия решения: насколько срочным и важным является AD? Нужно ли его принимать сейчас или можно подождать, пока не станет больше известно о требованиях и разрабатываемой системе? Как личный, так и коллективный опыт, а также признанные методы и практики проектирования могут помочь в определении решения; было предложено, чтобы команда разработчиков Agile-программного обеспечения вела бэклог решений, дополняющий бэклог продукта проекта. [14]
Определенные решения могут быть приняты только при соблюдении определенных критериев, которые формируют определение готовности к принятию решения о разрешении споров: (1) Заинтересованные стороны определены, (2) Настало время, (3) Перечислены альтернативы (т.е. варианты), (4) Определены требования и другие критерии, (5) Выбран шаблон решения о разрешении споров. [15]
Существует ряд методов принятия решений, как общих, так и специфических для программного обеспечения и архитектуры программного обеспечения, например, диалоговое картирование . [16] Групповое принятие решений является активной темой исследований.
Существует множество шаблонов и инструментов для фиксации решений как в гибких сообществах (например, записи архитектурных решений М. Найгарда [17] ), так и в методах разработки программного обеспечения и проектирования архитектуры (например, см. макеты таблиц, предложенные IBM UMF [18] и Тайри и Акерманом из CapitalOne. [19] Г. Фэрбенкс включил обоснование решения в свой одностраничный Architecture Haikus; [20] его нотация позже была преобразована в Y-утверждения. См. [21] для мотивации, примеров и сравнений.
Архитектурные решения используются в разработке программного обеспечения ; следовательно, они должны быть сообщены и приняты заинтересованными сторонами системы, которые финансируют, разрабатывают и эксплуатируют ее. Архитектурно очевидные стили кодирования [22] и обзоры кода , которые фокусируются на архитектурных проблемах и решениях, являются двумя связанными практиками.
Архитектурные решения также необходимо учитывать при модернизации программной системы в процессе эволюции программного обеспечения .
Многие архитектурные решения повторяются в разных проектах; следовательно, опыт прошлых решений, как хороших, так и плохих, может стать ценным ресурсом многократного использования при использовании четкой стратегии управления знаниями. [23]
Важно знать, когда можно считать, что одно архитектурное решение выполнено. Было предложено пять элементов определения выполнено: доказательства, критерии, соглашение, документация, реализация/обзор. [24]
В крупномасштабных проектах количество принимаемых архитектурных решений может превышать 100, в том числе:
Дополнительные примеры см. в каталогах концепций дизайна в Attribute-Driven Design 3.0 [26] и моделях руководства по принятию решений, специфичных для предметной области [27] .
Это пример принятого решения, отформатированного в соответствии с шаблоном Y-утверждения, предложенным в: [28]
«В контексте сервиса интернет-магазина, столкнувшись с необходимостью поддержания согласованности и актуальности данных сеанса пользователя во всех экземплярах магазина, мы решили использовать шаблон состояния сеанса базы данных (а не состояние сеанса клиента или состояние сеанса сервера) [29] для достижения эластичности облака, приняв тот факт, что базу данных сеансов необходимо проектировать, внедрять и реплицировать».
Многие шаблоны были предложены практикующими архитекторами и исследователями архитектуры программного обеспечения. Репозитории GitHub, такие как «Архитектурные решения (ADR)» [30] и «Архитектурные решения Markdown» [31], собирают многие из них, а также ссылки на инструменты и подсказки по написанию.
И практики, и исследователи признают, что принятие решений по архитектуре программного обеспечения — это групповой процесс, в котором участвуют несколько заинтересованных сторон, обсуждающих, оценивающих и выбирающих архитектурные решения. Исследования [32] [33] практиков показали, что, хотя группы имеют идеальный размер, структурированный подход к принятию решений в значительной степени отсутствует. В частности:
Эти задачи открывают широкие возможности для экспериментов и исследований для сообщества разработчиков архитектуры программного обеспечения.