- •Часть 1. Планирование архитектуры
- •Заключение
- •Дополнительная литература
- •4.10. Дискуссионные вопросы
- •Глава 8. Моделирование условий полета. Конкретный пример архитектуры, ориентированной на интегрируемость
- •8.4. Заключение
- •Дополнительная литература
- •Дискуссионные вопросы
- •Глава 9. Документирование программной архитектуры
- •Заключение
- •Дополнительная литература
- •Дискуссионные вопросы
- •Глава 10. Реконструкция программной архитектуры
- •Заключение
- •Дополнительная литература
- •Дискуссионные вопросы
- •Глава 6. Управление воздушным движением. Пример разработки, ориентированной на высокую готовность
- •Глава 7. Проектирование архитектуры
- •Глава 11. Метод анализа компромиссных архитектурных
- •Заключение
- •Дополнительная литература
- •Дискуссионные вопросы
- •Глава 12. Метод анализа стоимости и эффективности — количественный подход к принятию
- •Заключение
- •Дополнительная литература
- •Дискуссионные вопросы
- •Глава 13. Всемирная паутина. Конкретный пример реализации способности к взаимодействию 374
- •Глава 14. Линейки программных продуктов.
- •Заключение
- •Дополнительная литература
- •Глава 15. CelsiusTech. Конкретный пример разработки
- •Заключение
- •Дополнительная литература
- •Дискуссионные вопросы
- •Заключение
- •Дополнительная литература
- •Дискуссионные вопросы
- •Заключение
- •Дополнительная литература
- •Дискуссионные вопросы
- •Заключение
- •Дополнительная литература
- •Заключение
- •Часть 1. Планирование архитектуры
- •Часть 2. Создание архитектуры
- •Часть 3. Анализ архитектуры
- •Часть 4. От одной системы к множеству
- •Часть 1
- •Глава 1
- •1.1. Откуда берутся варианты архитектуры?
- •1.2. Программный процесс и архитектурно-экономический цикл
- •1.3. Из чего складывается «качественная» архитектура?
- •1.4. Заключение
- •1.5. Дискуссионные вопросы
- •Глава 2
- •2.1. Чем является программная архитектура и чем она не является
- •2.2. Другие взгляды на архитектуру
- •2.3. Архитектурные образцы, эталонные модели и эталонные варианты архитектуры
- •2.4. Почему программная архитектура так важна?
- •2.5. Архитектурные структуры и представления
- •2.6. Заключение
- •2.7. Дополнительная литература
- •2.8. Дискуссионные вопросы
- •Глава 3
- •3.1. Связь с архитектурно-экономическим циклом
- •3.2. Требования и атрибуты качества
- •3.3. Архитектура авиационной электронной системы а-7е
- •3.4. Заключение
- •3.5. Дополнительная литература
- •3.6. Дискуссионные вопросы
- •Часть 2
- •Глава 4
- •4.1. Функциональность и архитектура
- •4.2. Архитектура и атрибуты качества
- •4.3. Атрибуты качества системы
- •4.4. Практическое применение сценариев атрибутов качества
- •4.5. Другие атрибуты качества системы
- •4.6. Коммерческие атрибуты качества
- •4.7. Атрибуты качества архитектуры
- •4.8. Заключение
- •4.9. Дополнительная литература
- •4.10. Дискуссионные вопросы
- •Глава 5
- •5.1. Определение тактики
- •5.2 Тактики реализации готовности
- •5.3. Тактики реализации модифицируемости
- •5.4. Тактики реализации производительности
- •5.5. Тактики реализации безопасности
- •5.6. Тактики реализации контролепригодности
- •5.7. Тактики реализации практичности
- •5.8. Взаимосвязь тактик и архитектурных образцов
- •5.9. Архитектурные образцы и стили
- •5.10. Заключение
- •5.11. Дополнительная литература
- •5.12. Дискуссионные вопросы
- •Глава 6
- •6.1. Связь с архитектурно-экономическим циклом
- •6.2. Требования и атрибуты качества
- •6.3. Архитектурное решение
- •6.4. Заключение
- •6.5. Дополнительная литература
- •6.6. Дискуссионные вопросы
- •Глава 7
- •7. 1. Архитектура в контексте жизненного цикла
- •7.2. Проектирование архитектуры
- •1. Выбор модуля для декомпозиции
- •2А. Выбор архитектурных мотивов
- •2Ь. Выбор архитектурного образца
- •2D. Задание интерфейсов дочерних модулей
- •7.3. Формирование рабочих групп
- •7.5. Заключение
- •7.6. Дополнительная литература
- •7.7. Дискуссионные вопросы
- •Глава 8
- •8.1 Связь с архитектурно- экономическим циклом
- •8.2. Требования и атрибуты качества
- •8.3. Архитектурное решение
- •8.2 Заключение
- •8.5 Дополнительная литература
- •8.6. Дискуссионные вопросы
- •Глава 9
- •9.1. Варианты применения архитектурной документации
- •9.2. Представления
- •9.3 Выбор значимых представлений
- •9.4. Документирование представления
- •9.5. Перекрестная документация
- •9.6. Унифицированный язык Моделирования
- •9.7. Заключение
- •9.8. Дополнительная литература
- •9.9. Дискуссионные вопросы
- •Глава 10
- •10.1. Введение
- •10.2. Извлечение информации
- •10.3. Создание базы данных
- •10.4. Объединение представлений
- •10.5. Реконструкция
- •10.6. Пример
- •10.7. Заключение
- •10.8. Дополнительная литература
- •10.9. Дискуссионные вопросы
- •Часть 3
- •Глава 11
- •Результаты проведения оценки по методу атам
- •Этапы atam
- •1 Источник: приводится по изданию [Clements 02а] (адаптированная версия).
- •11.4. Система Nightingale: конкретный пример проведения оценки по методу атам
- •11.5. Заключение
- •Дополнительная литература
- •Дискуссионные вопросы
- •Глава 12
- •Результаты оценки по методу свам
- •Заключение
- •Дополнительная литература
- •Дискуссионные вопросы
- •Глава 13
- •13.1. Отношение к архитектурноэкономическому циклу
- •13.4. Еще одна итерация архитектурноэкономического цикла: эволюция вариантов веб-архитектуры систем электронной коммерции
- •13.7. Заключение
- •13.8. Дополнительная литература
- •13.9. Дискуссионные вопросы
- •Часть 4
- •Глава 14
- •За счет чего работают линейки программных продуктов?
- •Варианты архитектуры линеек продуктов
- •Факторы, усложняющие применение линеек программных продуктов
- •Заключение
- •Дополнительная литература
- •Дискуссионный вопрос
- •Глава 15
- •Связь с архитектурноэкономическим циклом
- •Требования и атрибуты качества
- •Архитектурное решение
- •Заключение
- •Дополнительная литература
- •Дискуссионные вопросы
- •Глава 16
- •Связь с архитектурноэкономическим циклом
- •16.3. Архитектурное решение
- •16.4. Решения по размещению системы
- •Заключение
- •Дополнительная литература
- •Дискуссионные вопросы
- •Глава 17
- •17.2. Требования и атрибуты качества
- •17.3. Архитектурное решение
- •17.4. Механизм реализации атрибутов качества в архитектуре Luther
- •Заключение
- •Дополнительная литература
- •Дискуссионные вопросы
- •Глава 18
- •18.1. Воздействие компонентов на архитектуру
- •18.2. Архитектурное несоответствие
- •18.3. Компонентное проектирование как поиск
- •18.4. Пример приложения aseilm
- •18.5. Заключение
- •18.6. Дополнительная литература
- •Глава 19
- •19.1. Снова архитектурноэкономический цикл
- •19.2. Создание архитектуры
- •19.3. Архитектура в рамках жизненного цикла
- •Влияние коммерческих компонентов
- •Заключение
- •8 Все перечисленные специалисты работают в корпорации Inmedius (Питтсбург, сша).
2.4. Почему программная архитектура так важна?
В главе 1 мы в основном аргументировали значимость архитектуры для корпорации. В этой главе мы поговорим о том, почему архитектура так важна с технической точки зрения. В этом контексте следует привести три основных фактора.
Взаимодействие между заинтересованными лицами. Программная архитектура — это универсальная абстракция системы, на основе которой все или почти все заинтересованные в системе лица могут искать взаимопонимания, вести переговоры, находить компромиссы и просто общаться.
Начальные проектные решения. Программная архитектура содержит сведения о том, какие решения были приняты на ранних этапах разработки системы. Значимость подобного рода сводок отнюдь не ограничивается удельным весом этих этапов относительно оставшихся операций разработки, размещения и сопровождения. Именно в это время впервые появляется возможность анализа проектных решений, определяющих дальнейшую разработку системы.
Переносимая абстракция системы. Программная архитектура — это относительно небольшая, вполне доступная для человеческого восприятия модель структурирования системы и взаимодействия ее компонентов; помимо прочего, эта модель обладает свойством переносимости из системы в систему. Например, ее можно применить в отношении других систем, для которых характерны примерно те же требования к атрибутам качества и функциональным возможностям, и тем самым дать начало полноценному многократному применению.
Каждый из этих вопросов мы обсудим отдельно.
Архитектура как средство организации общения между заинтересованными лицами
Каждое заинтересованное в программной системе лицо — заказчик, пользователь, руководитель проекта, программист, испытатель и т. д. — требует внедрить в систему различные характеристики, основа для которых закладывается в архитектуре. К примеру, пользователю необходимо, чтобы система была надежной и доступной в любой момент; заказчика интересует, чтобы архитектура была реализована без расхождений с графиком и бюджетом; менеджер озабочен не только соблюдением временных и финансовых ограничений, но и возможностью при помощи архитектуры организации относительно независимой работы различных групп
разработчиков, их четкого и управляемого взаимодействия. Архитектор думает о том, какие стратегии позволят ему реализовать все эти задачи.
Архитектура — это общий язык, на котором можно сформулировать, обговорить и решить те или иные проблемы, причем сделать это на таком уровне, который, даже если речь идет о сложных системах, вполне доступен для комплексного изучения человеком (см. врезку «Что будет, если нажать эту кнопку?»). В отсутствие такого языка анализ крупных систем на ранних этапах сильно затрудняется; сложнее становится и принимать значимые решения, определяющие качество и полезность. Как мы увидим на материале части 3, архитектурный анализ одновременно отталкивается от этого уровня общения и вносит в него некоторые коррективы.
ЧТО БУДЕТ, ЕСЛИ НАЖАТЬ ЭТУ КНОПКУ?
Архитектура как средство организации общения между заинтересованными лицами
Заслушивался отчет о проекте. Его разработка, финансируемая из правительственного фонда, давно вышла за рамки графика и бюджета. Масштаб же его был столь серьезен, что упомянутые недочеты удостоились внимания конгрессменов, и теперь, пытаясь решить забытую было проблему, правительство организовало занудную отчетную сессию с обязательным посещением. Компанию-разработчика недавно перекупили, однако делу это не помогло. На второй день сессии была запланирована презентация программной архитектуры. Молодой архитектор — ученик главного архитектора системы — бодро объяснял, каким образом архитектура столь масштабной системы обеспечит соответствие высоким требованиям по работе в реальном времени, распределенности и высокой надежности. Основательная архитектура презентовалась не менее основательно. Анализ проводился тщательно и корректно. Тем не менее слушатели — около 30 представителей правительства с различными функциями в управлении и надзоре за этим нелегким проектом — утомились. Некоторые из них даже подумывали, что легче уйти в недвижимость, чем пытаться выдержать очередной отчет по принципу «ну давайте же наконец сделаем все как надо».
На схеме, составленной на полуформальной нотации из прямоугольников и линеек, были зафиксированы основные программные элементы представления системы периода прогона. Названия обозначались сокращениями, и если бы молодой архитектор не давал объяснений, в них вряд ли можно было бы разобраться. Линии указывали потоки данных, передачу сообщений и синхронизацию процессов. По словам архитектора, эти элементы внутренне избыточны. «В случае сбоя, — сказал он, наведя лазерную указку на одну из линий, — на этом пути сработает механизм перезапуска...»
«А что произойдет при нажатии кнопки выбора режима работы?» — внезапно прервал его один из слушателей. Им оказался представитель правительства — предполагаемого коллектива пользователей обсуждаемой системы.
«Простите?» — Архитектор не понял вопроса.
«Кнопка выбора режима работы, — повторил человек из правительства. — Что будет, если я ее нажму?»
«Ну-у, при этом запускается событие в драйвере устройства, вот здесь, — начал архитектор, манипулируя указкой. — Затем считываются данные в регистре, интерпретируется код события. Если речь идет о выборе режима, то... на доску объявлений будет подан сигнал, та, в свою очередь, сигнализирует объектам, которые на это событие подписались...»
«Нет, вы не поняли. Я имею в виду — что делает система? — Государственный муж вновь прервал докладчика. — Дисплей перезапускается? И что, если это произойдет в ходе реконфигурации системы?»
Несколько озадаченный архитектор убрал указку. Вообще-то вопрос не имел отношения к архитектуре, но, поскольку он все-таки архитектор, а положение это обязывает знать все требования, он ответил. «Если командная строка находится в режиме настройки, дисплеи перезапустятся, — изрек докладчик. — В противном случае на пульт управления выводится сообщение об ошибке, а сигнал игнорируется». — Лазерная указка вновь материализовалась. — «Так вот, что касается механизма перезапуска...»
«Вы знаете, я вот почему интересуюсь, — продолжил будущий пользователь. — Исходя из вашей схемы, складывается впечатление, что дисплейный пульт подает сигналы целевому модулю.»
«А что, собственно, должно произойти? — В разговор включился еще один слушатель, адресуя свой вопрос любознательному джентльмену. — Вы что, хотите, чтобы во время перестройки режима пользователь получал какие-то данные об этом режиме?»
В течение последующих 45 минут архитектор внимательно наблюдал за тем, как слушатели тратят отведенное ему время на обсуждение корректного поведения системы в самых разных, одним им известных состояниях.
Дискуссия не имела отношения к архитектуре, однако именно она (и ее графическое представление) послужила побудительным мотивом. Архитектуру имеет смысл рассматривать как основу для взаимодействия заинтересованных лиц помимо архитекторов и разработчиков. К примеру, с ее помощью руководители проектов формируют рабочие группы и распределяют между ними ресурсы. Ну а пользователи? Для них архитектура незаметна, так с какой стати они должны вникать в сущность системы именно с ее помощью?
Но именно так они и делают. В представленном случае человек, который начал задавать вопросы, просидел два дня, уставившись в схемы функций, операций, пользовательского интерфейса и тестирования. Он устал, ему хотелось домой, но именно во время изложения отчета об архитектуре он понял, что что-то ему непонятно. Прослушав множество отчетов о вариантах архитектуры, я убедился в том, что рассмотрение системы под новым углом выводит на поверхность многие неясности. В такой роли для пользователей часто выступает именно архитектура, причем вопросы, которые они начинают задавать, оказываются по своему характеру поведенческими. Во врезке «Их решение не годится» (см. главу 11) мы рассмотрим пример процесса оценки архитектуры, в ходе которого представители пользователей больше интересовались не тем, как система будет работать, а тем, что она сможет делать, и это совершенно естественно. До представленного момента все их контакты с производителем осуществлялись только через посредство продавцов. Архитектор — настоящий специалист по интересующей их системе, и им довелось с ним пообщаться; вполне объяснимо, что они, нисколько не колеблясь, воспользовались моментом.
Очевидно, что рассматриваемую проблему можно решить при помощи тщательно составленных, всесторонних спецификаций требований; впрочем, в силу самых разных причин не во всех случаях они создаются или оказываются доступными. В отсутствие подобных документов именно спецификация архитектуры способна вывести недопонимание на уровень вопросов и таким образом внести в проблему ясность. Этот эффект разумнее принять к сведению, чем опровергать. В главе 11 мы будем рассматривать уточнение требований и их классификацию согласно приоритетам как один из основных аргументов за проведение оценки архитектуры.
Иногда подобная практика помогает выявить необоснованные требования, к обсуждению полезности которых впоследствии можно возвратиться. Проведение такого рода обзора, в ходе которого акцент ставится на взаимодействие требований и архитектуры, позволило бы вышеупомянутому молодому архитектору отвлечься от основной темы и уделить в рамках отчетной сессии некоторое время на разбор соответствующей информации. Тогда и представитель гвардии пользователей не почувствовал бы себя неуютно, задав вопрос в самый неподходящий момент. Хотя, в конце концов, он всегда может уйти в недвижимость.
-РСС
В архитектуре излагаются начальные проектные решения
Программная архитектура отражает самые ранние проектные решения относительно системы. Их труднее всего принять, а по мере разработки — скорректировать; при этом последствия наиболее существенны.
Архитектура определяет ограничения реализации
Реализация отражает архитектуру только в том случае, если она соответствует изложенным в ней структурным проектным решениям. Таким образом, реализацию следует разделить на ряд установленных архитектурой элементов; взаимодействие между этими элементами должно производиться в установленном архитектурой порядке; обязательства каждого отдельного элемента в отношении других элементов также должны исполняться согласно требованиям архитектуры.
Решения о распределении ресурсов тоже накладывают на реализацию определенные ограничения. Проблема в том, что конструкторы, работающие над отдельными элементами, иногда не имеют об этих решениях ни малейшего представления. Рассматриваемые ограничения подразумевают разделение задач, благодаря которому менеджерские решения в плане трудовых и вычислительных ресурсов реализуются наилучшим образом. От конструкторов отдельных элементов требуется знание их спецификаций, однако во всем, что касается компромиссных архитектурных решений, они могут пребывать в полном неведении. Архитекторы, напротив, обычно не являются экспертами в области разнообразных аспектов построения алгоритмов и тонкостей языков программирования, однако именно они ответственны за принятие архитектурных компромиссов.
Архитектура определяет организационную структуру
Мало того что архитектура устанавливает структуру разрабатываемой системы — эта последняя интегрируется в структуру проекта разработки1 (а иногда, как видно на материале главы 1, даже в структуру компании-разработчика). Стандартный способ разделения труда по разработке крупной системы предполагает распределение отдельных частей системы между несколькими группами конструкторов. Это называется декомпозицией обязанностей по разработке системы. Поскольку в состав системной архитектуры входит высокоуровневая декомпозиция системы, именно она обычно служит основой для декомпозиции обязанностей; та, в свою очередь определяет структуру планирования, определения сроков и бюджета; каналы межгруппового взаимодействия; организацию управления конфигурациями и файловой системой; планы и процедуры интеграции и тестирования, и даже такие мелочи, как организация локальной сети проекта и количество групповых попоек. Процесс сопровождения также отражает программную структуру — для сопровождения отдельных структурных элементов создается ряд рабочих групп.
У декомпозиции обязанностей по разработке системы есть один побочный эффект — дело в том, что некоторые аспекты программной архитектуры замораживаются. Группа, ответственная за одну из подсистем, противится распространению своих обязанностей на другие группы. Если эти обязанности зафиксированы в договоре, их пересмотр оказывается довольно затратным предприятием. Отслеживание работы по совокупности распределенных задач также усложняется.
1 Забавная ситуация: в английском языке для обозначения проекта как организационной единицы (project) и проекта как продукта разработки (design) используют два разных слова, в русском -одно. Это доводит муки творчества переводчиков (воздадим им должное!) до невообразимых пределов. — Примеч. науч. ред.
Изменить утвержденную архитектуру по управленческим и коммерческим соображениям становится практически невозможно. Это — дополнительный аргумент (наряду со многими другими) в пользу комплексной оценки архитектуры, которую мы настоятельно рекомендуем проводить перед замораживанием программной архитектуры крупной системы.
Архитектура сдерживает или способствует реализации атрибутов качества системы
Способность/неспособность системы реализовывать предполагаемые (или затребованные) атрибуты качества в значительной степени обусловливается архитектурой. Отношения между вариантами архитектуры и качеством подробно рассматриваются в главе 5; пока что вам следует усвоить следующие постулаты.
Если система ориентирована на высокую производительность, необходимо следить за временным поведением ее элементов, а также за частотой и объемом межэлементного взаимодействия.
Если приоритетом является модифицируемость, то обязанности между элементами следует распределять таким образом, чтобы вносимые в систему изменения не сопровождались далеко идущими последствиями.
Если система должна стать серьезно защищенной, то особое внимание необходимо обратить на безопасность межэлементного взаимодействия и информацию, к которой те или иные элементы имеют право доступа. Кроме того, в архитектуру имеет смысл ввести ряд специализированных элементов (например, надежное ядро).
Если упор в процессе разработки системы планируется сделать на масштабируемости, необходимо обеспечить строгую локализацию использования ресурсов, чтобы тем самым упростить введение элементов с более прогрессивными возможностями.
Если, согласно требованиям проекта, систему следует поставлять поэтапно, в виде отдельных подмножеств, то особое внимание, опять же, необходимо обратить на межэлементное взаимодействие.
♦ Если для элементов данной системы планируется обеспечить возможность многократного применения в рамках других систем, то сцепление между элементами следует ограничить; иначе при извлечении из текущей среды отдельного элемента с ним придется переносить многочисленные дополнения.
Стратегии реализации этих и других атрибутов качества в высшей степени архитектурны. При этом важно понимать, что сама по себе архитектура не гарантирует ни функциональности, ни качества. Непродуманные нисходящие проектные и реализационные решения имеют обыкновение подрывать основы качественных архитектурных проектов. На качество системы влияют все решения, вне зависимости от того, на каком этапе ее жизненного цикла — высокоуровневого проектирования, кодирования или реализации — они принимаются. Следовательно, качество нельзя признать полностью находящимся в зоне ответственности архитектурного проектирования. В контексте обеспечения качества хорошая архитектура необходима, но не достаточна.
Прогнозирование системного качества путем изучения архитектуры
Можно ли, не дожидаясь окончания разработки и размещения системы, утверждать, что те или иные архитектурные решения приняты верно (иначе говоря, что система реализует требуемые атрибуты качества)? Будь ответ на этот вопрос отрицательным, задача выбора архитектуры потеряла бы всякий смысл - ее можно было бы выбирать совершенно произвольно. К счастью, прогнозы относительно качества системы можно делать, отталкиваясь исключительно от результатов оценки ее архитектуры. Методики оценки архитектур наподобие метода анализа компромиссных архитектурных решений (АТАМ, см. главу 11) обеспечивают возможность нисходящего ознакомления с атрибутами качества программных продуктов; возможность эта появляется (но одновременно ограничивается) благодаря вариантам программной архитектуры.
Архитектура облегчает анализ изменений и их организацию
Сообщество разработчиков программного обеспечения пытается бороться с тем, что около 80 % издержек на производство типичной программной системы приходится на период, следующий за первоначальным развертыванием. Из этого обстоятельства мы можем сделать вывод, что большинство систем находятся именно на этом этапе. Многим программистам и проектировщикам, а возможно, даже большинству из них, никогда не приходилось участвовать в разработке «с чистого листа» — как правило, в своей работе они ограничены существующим программным кодом. В продолжение своего жизненного цикла программы претерпевают изменения; происходят они часто, а реализуются во многих случаях с некоторыми трудностями.
Любая архитектура предполагает разделение всех возможных изменений на три категории: локальные, нелокальные и архитектурные. Для того чтобы внести локальное изменение, достаточно откорректировать отдельный элемент. Нелокальное изменение требует корректировки ряда элементов, однако базовые архитектурные принципы остаются неизменными. Архитектурное изменение затрагивает сущность взаимодействия между элементами — образец архитектуры — и в большинстве случаев предполагает корректировку всей системы. Локальные изменения, естественно, предпочтительнее остальных; самой эффективной в этой связи следует считать ту архитектуру, в которой наиболее вероятные изменения внести легче всего.
Для принятия решений о необходимости внесения изменений, установления наименее опасных путей, оценки последствий предлагаемых изменений, определения последствий и расстановки приоритетов относительно требуемых изменений — для всего этого требуется подробный анализ взаимоотношений, производительности и поведения программных элементов системы. Все эти задачи значатся в должностной инструкции архитектора. Средством приобретения знаний, достаточных для принятия решений о предполагаемых изменениях, мы считаем анализ архитектуры.
Архитектура облегчает эволюционное макетирование
Любую определенную архитектуру можно проанализировать и смоделировать в качестве макета. Процесс разработки от этого выигрывает в двух отношениях.
Система становится исполняемой на раннем этапе жизненного цикла продукта. Ее точность повышается по мере замены элементов макета полноценными версиями программного обеспечения. В качестве элементов макета могут выступать как неточные версии конечной функции, так и суррогаты, которые потребляют и производят данные на нужных скоростях.
Из того, что система довольно рано становится исполняемой, следует, что потенциальные проблемы, связанные с производительностью, выявляются на ранних этапах ее жизненного цикла.
Каждый из этих факторов снижает риск разработки. Если архитектура входит в состав семейства родственных систем, то издержки создания структуры макетирования можно разнести на разработку других систем из этого семейства.
Архитектура позволяет более точно рассчитывать стоимость и сроки
Рассчитав стоимость и составив график, руководитель может, во-первых, получить необходимые ресурсы, а во-вторых, узнать, удовлетворительно ли состояние проекта. Расчеты стоимости на основе блоков системы оказываются точнее тех, которые базируются на общих знаниях о системе. Как мы уже говорили, организационная структура проекта определяется его архитектурой. Расчеты по блокам лучше поручить не руководителю проекта, а участникам соответствующей группы разработчиков — они, во-первых, справятся с этой задачей точнее, а во-вторых, будут ощущать ответственность за соблюдение установленных сроков. Далее — первоначальное определение архитектуры предполагает, что требования к системе уже рассмотрены и (возможно даже) утверждены. Чем больше нам известно о масштабе системы, тем точнее проводятся расчеты.
Архитектура как переносимая модель многократного применения
Чем раньше начинается повторное использование, тем оно полезнее. Повторное использование кода, несомненно, полезно, однако многократное применение на уровне архитектуры для систем с аналогичными требованиями подразумевает поистине громадные возможности. Повторное применение в этом случае распространяется не только на код, но, в первую очередь, и на требования, которые привели к созданию архитектуры, а также на знания по конструированию повторно использованной архитектуры. Естественно, что при многократном применении начальных архитектурных решений в рамках ряда систем на них распространяются все вышеупомянутые последствия.
Линейки программных продуктов строятся на основе общей архитектуры
Линейкой, или семейством, программных продуктов называется ряд преимущественно программных систем, для которых характерен общий, управляемый набор характеристик, реализующих потребности конкретного сегмента рынка или конкретные задачи и разработанных в установленном порядке на основе общего набора основных активов. Главным из этих активов является архитектура, спроектированная в расчете на удовлетворение потребностей всего семейства. Архитектор линейки продуктов старается выбрать для нее такую архитектуру (или семейство близкородственных вариантов архитектуры), которая сможет обслуживать всех ее возможных участников; при этом те проектные решения, которые касаются линейки продуктов в целом, принимаются сначала, а те, которые затрагивают только отдельных ее членов, — впоследствии. Архитектура определяет постоянные и переменные элементы линейки продуктов. Линейки программных продуктов — мощное средство мультисистемной разработки — на порядки улучшают такие характеристики, как срок выхода на рынок, стоимость, продуктивность и качество. Значимость архитектуры определяется самой сущностью этой парадигмы. Аналогично прочим капиталовложениям, архитектура линейки продуктов становится одним из основных активов компании-разработчика. Анализ линеек программных продуктов приводится в главе 14, а соответствующие конкретные примеры — в главах 15 и 17.
Системы можно конструировать на основе крупных элементов, созданных сторонними разработчиками
Раньше программные парадигмы были ориентированы на программирование (programming) как на основной вид деятельности, а проделанная работа измерялась в строках кода; архитектурно-ориентированная разработка во многих случаях направлена на компоновку (composing) и сборку (assembling) элементов, которые, вероятнее всего, разрабатывались отдельно, а может быть, даже независимо друг от друга. Возможность такой композиции появляется по той причине, что архитектура определяет те элементы, которые можно ввести в систему. В то же время она ограничивает проведение замен (или добавлений), исходя при этом из того, как они взаимодействуют со своей средой, как получают и передают управление, какие данные потребляют и производят, как обращаются к данным и при помощи каких протоколов они осуществляют обмен информацией и совместное использование ресурсов.
Одним из наиболее важных аспектов архитектуры является организация структуры ее элементов, интерфейсов и рабочих понятий. Взаимозаменяемость (inter-changeability) считается самым важным принципом этой организации. Запущенное в 1793 году Эли Уитни (Eli Whitney) массовое производство мушкетов по принципу взаимозаменяемых частей положило начало эпохе промышленного производства. В отсутствие надежных физических измерений эта идея не внушала доверия. В контексте современного программного обеспечения, пока добиться надежного разграничения абстракций не удалось, принцип структурной взаимозаменяемости кажется не менее устрашающим, однако от этого он не теряет своей важности.
Готовые компоненты, подсистемы, совместимые интерфейсы передачи данных — все они основываются на принципе взаимозаменяемости. При этом нерешенными остаются многие проблемы, связанные с разработкой программного обеспечения методом композиции. Когда в качестве компонентов, претендующих на внесение и многократное применение, выступают индивидуальные подсистемы, сконструированные на основе противоречащих друг другу архитектурных допущений, интеграция их функций может столкнуться с непредвиденными сложностями. Вслед за Дэвидом Гарланом (David Garlan) и некоторыми его коллегами эту ситуацию стали называть архитектурным несоответствием (architectural mismatch).
Чем меньше, тем больше: ограничивать словарь проектных альтернатив выгодно
По мере накопления полезных архитектурных образцов и образцов проектирования становится совершенно очевидно, что, несмотря на более или менее безграничные возможности комбинирования компьютерных программ, добровольное сведение вариантов к относительно небольшому количеству альтернатив в контексте взаимодействия между программами и их сотрудничества может принести определенные выгоды. Таким образом, проектная сложность конструируемой системы сводится к минимуму. Среди преимуществ этого принципа следует упомянуть повышенные возможности многократного применения, более стандартизированные и простые решения, которые легче понять и распространить, углубление анализа, сокращение длительности отбора и совершенствование способности к взаимодействию.
Свойства программного проекта определяются выбранным архитектурным образцом. Те образцы, которые в наибольшей степени подходят для решения конкретной задачи, повышают качество реализации конечного проектного решения, а иногда и упрощают балансирование противоречащих проектных ограничений — этот эффект достигается путем углубления анализа плохо изученных проектных контекстов и/или формулирования противоречивости технических требований.
СИСТЕМНАЯ АРХИТЕКТУРА И ПРОГРАММНАЯ АРХИТЕКТУРА
На протяжении последних 5-10 лет мы часто выступали с сообщениями о программной архитектуре. Все это время среди слушателей находился кто-то, кто спрашивал: «Почему вы говорите о программной архитектуре? Ведь системная архитектура не менее важна!» или «В чем разница между программной и системной архитектурой?»
На самом деле, как выясняется, разница небольшая. То, что мы обычно говорим именно о программной архитектуре, объясняется желанием подчеркнуть важность принимаемых архитектором программных решений, которые распространяются на качество продукта в целом.
Случаи, когда в процессе создания программной архитектуры соображения по поводу системы не принимаются в расчет, крайне редки. К примеру, если вы хотите, чтобы архитектура была высокопроизводительной, у вас должно быть хотя бы некоторое представление о характеристиках той аппаратной платформы, на базе которой она будет работать (скорость процессора, емкость памяти, скорость обращения к диску); кроме того, вы должны знать характеристики всех устройств, с которыми системе предстоит взаимодействовать (традиционные устройства ввода-вывода, сенсоры, исполнительные механизмы), а в дополнение к этому желательно найти информацию о характеристиках сети (в первую очередь, о ее пропускной способности). Если архитектура должна быть сверхнадежной, вам, опять же, придется иметь дело с аппаратной частью — в этом случае с интенсивностью отказов, наличием резервирования средств обработки и сетевых устройств. И так далее и тому подобное. Архитекторы редко обходят стороной вопросы аппаратного обеспечения.
Итак, проектируя программную архитектуру, следует представлять себе всю систему — как аппаратную, так и программную части. Отказываясь от этого принципа, вы напрашиваетесь на неприятности. Ни один инженер не возьмется прогнозировать характеристики системы, если специфицирована лишь одна из ее частей.
И тем не менее мы продолжаем настаивать на употреблении термина «программная архитектура». Почему же все-таки не «системная»? Дело в том, что большинство альтернатив архитектора связано не с аппаратурой, а с программным обеспечением. Речь не идет о том, что решений относительно аппаратной части принимать не надо, — просто она может быть неподконтрольна архитектору (именно такая ситуация складывается при разработке системы, которая должна работать на случайных клиентских машинах с подключением к Интернету); с другой стороны, все решения, касающиеся аппаратуры, могут приниматься другими лицами (по экономическим и правовым мотивам или согласно стандартам); кроме того, аппаратура имеет обыкновение со временем заменяться.
Все вышеприведенные факторы позволяют нам на вполне законных основаниях сосредоточиться на программной части архитектуры — именно здесь принимается большинство основополагающих решений, существует множество альтернатив и возможностей добиться успеха (или привести к полному провалу!).
—RK
Архитектура предполагает возможность разработки на основе шаблонов
В составе архитектуры присутствуют проектные решения о взаимодействии элементов; отраженные в реализациях всех элементов, они тем не менее локализуются и фиксируются лишь единожды. Для местной фиксации механизмов межэлементного взаимодействия служат шаблоны. К примеру, в шаблоне можно закодировать объявления публичной области элемента, в которой будут аккумулироваться результаты, или протоколы, применяемые элементом для взаимодействия с исполняемым файлом системы. Пример ряда четких архитектурных решений, предполагающих возможность шаблонной разработки, приводится в главе 8.
Архитектура помогает в процессе обучения
Архитектура, содержащая описание взаимодействия элементов в рамках требуемого поведения, может послужить в качестве своеобразной инструкции, вводящей новых участников проекта в курс дела. Этим дополнительно подтверждается наше утверждение о том, что одной из основных функций программной архитектуры является организация и содействие общению между представителями разношерстных заинтересованных групп. Архитектура — это хорошая опорная точка.
