Двойная петля обучения в архитектуре и фитнес-функция

Статья о том, что такое двойная петля обучения в архитектуре, зачем она нужна и как может помочь в её построении фитнес-функция.

Изменения неизбежны

За последние 20 лет произошло серьезное переосмысление подходов к разработке, в том числе с точки зрения архитектуры. Изменения неизбежны и ведет нас к необходимости строить процесс, направленный в первую очередь на снижение стоимости владения и внесения изменений принимая тот факт, что требования и дизайн постоянно меняются:

  • Появляются новые бизнес-требования
  • Обновляются используемые технологии
  • Вводятся в строй новые технологии
  • Изменяются нефункциональные требования

Не все архитектурные задачи мы можем закрыть в рамках требований, несущих бизнес-ценность. Иногда требуется убедиться в возможности реализации бизнес-инициативы, иногда — подготовить инфраструктуру, не редко — внести изменения для соблюдения изменившихся нефункциональных требований или изменившихся условий внешней среды (увеличение количества клиентов, технология перестала удовлетворять потребностям, вышло обновление базы данных).

Чтобы всем этим управлять, рассмотрим в контексте статьи, три понятия: Enablers, Landing Zone и Architectural Fitness Function (архитектурная фитнес-функция) и сведем их воедино.

Enablers

Я использую англоязычный термин Enabler из инструментария SAFe, так как пока не удается подобрать ёмкое существительное, отражающее суть понятия.

Enabler — это активности, которые необходимо выполнить для подготовки IT-экосистемы к реализации планируемых бизнес-требований. Например, ранее для приема платежей мы использовали услуги сторонней компании, теперь хотим сами и у нас вполне могут появиться Enabler’ы для работ по PCI-DSS.

Организация Enabler’ов и бизнес-функциональности

Например, крупная стратегическая задача: «Сохранение всего мобильного траффика, передаваемого от одного абонента другому» может быть грубо детализирована как:

  • Необходимо хранить данные в объеме не превышающем 20Gb на абонента в течении 6 месяцев
  • Необходимо хранить данные в объеме 20Gb * 40.000.000 абонентов в течении шести месяцев
  • Скорость сохранения данных не должна быть ниже скорости передачи данных между абонентами
  • Система хранения и передачи данных должна удовлетворять следующим требованиям регуляторов: PCI, ПДН

И тогда примером Enabler’а на уровне портфеля может быть «Подготовить инфраструктуру для надежной и защищенной передачи данных в объеме 20.000.000.000 GB за время до одного часа».

На уровне программы появляются Enabler’ы, связанный с предыдущим:

  • Установить защищенный канал между точками
  • Обеспечить сверку по контрольным суммам

Последний на уровне команды может быть разделен на:

  • Провести исследование наиболее подходящего способа снятия контрольных сумм
  • Интегрировать модуль снятия контрольных сумм в систему

Структура Enabler’ов

Итак, Enabler’ы — это разновидность технической задачи, тесно и явно связанная с некоторой бизнес-функциональностью, за счет чего бизнес-ценность такой задачи всегда определена.

Enabler’ы и функциональные требования не должны выводить продукт за рамки требуемых для успеха параметров. Эти параметры в понятной форме позволяет сформулировать инструмент под названием Landing Zone (посадочная полоса).

Landing Zone

Метафора посадочной полосы появилась не просто так. Представьте себе, что ваш продукт — самолет. И посадочная полоса и самолет должны обладать определенными свойствами, чтобы самолет смог сесть или взлететь.

Например, Boeing 787-8 Dreamliner обладает длиной разбега 3100 метров, что означает, что он не может приземлиться на полосе ниже класса А (>3200 метров). Если полоса класса Б (2600 метров), то, прежде чем аэропорт сможет принимать Дрималайнеры 787-8, он должен увеличить длину взлетно-посадочной полосы на 600 метров.

Boeing 787 Dreamliner

Таким образом, Landing Zone — это диапазон допустимых значений важных для системы атрибутов качества, например:

Атрибут качестваМинимумЦельИдеально
Восстановление после сбоя12 ч.15 м.Незамедлительно
Доступность99.999.9999.999

Колонки означают ровно то, как они называются:

  • Минимум: с этим можно жить
  • Цель: реалистичное целевое значение
  • Идеально: если не пострадают другие атрибуты и мы сможем достигнуть этого значения — идеально

Качественные Landing Zone определяют допустимые значения ключевых атрибутов качества, таких как количество транзакций, среднее время обработки транзакции под высокой нагрузкой,  uptime и сами по себе шире, чем приемочные критерии, специфичные для конкретного требования.

Рассмотрим другой пример Landing Zone, здесь параметры сгруппированы по атрибутам качества:

Атрибут качестваСценарийМинимумЦельИдеально
ПроизводительностьПропускная способность (транзакции в день)50.00070.00090.000
ПроизводительностьСреднее время выполнения транзакции2 сек.1 сек.< 1 сек.
Качество данныхЦелостность данных между системами X,Y и Z (по критичным атрибутам)95%97%97%
Качество данныхТочность обработки данных в рамках ETL97%99%>99%

Landing Zone создается совместно архитектором, владельцем продукта и заинтересованными сторонами. После того, как Landing Zone сформирована, она может использоваться для:

  • Выявления архитектурно-значимых требований, то есть таких, которые могут существенно повлиять на атрибуты качества
  • Объяснения архитектурных компромиссов и стоимости реализации
  • Мониторинга «здоровья» архитектуры

Landing Zone — это не статичный документ, значения калибруются на основе развития системы, дизайна, бизнеса, так что стоит запланировать периодический воркшоп по калибровке.

Во время таких воркшопов полезно для каждого параметра ответить на вопросы:

  • Что произойдет, если значение параметра упадет ниже минимума?
  • Когда мы сможем достигнуть целевых показателей?
  • Что мы должны сделать с точки зрения архитектуры для достижения целевых показателей?

Связь между Enabler’ами и  Landing Zone

Связь прямая.

Например, вы открываете несколько офисов в регионе со слабым каналом связи и хотите поддержать уровень сервиса на существующем уровне. Может появится Enabler, направленный либо на расширение канала (инфраструктурный), либо на изменение протокола передачи данных на более легкий (архитектурный), возможно достаточно будет сжать данные, а может  применить принцип Eventual Consistency, что вполне может привести к появлению множества Enabler’ов. Важно то, что системно, учитывая все показатели, вы не должны упасть ниже значения «Минимум» в Landing Zone ни по одному из них.

Итак, мы реализовали серьезную бизнес-инициативу, выполнили Enabler’ы, всё у нас нормально. Но вот незадача — реализация даже тех требований, которые вроде бы не должны ни на что техническое влиять, могут уронить уровень соответствия системы техническим, а вместе с тем и требованиям бизнеса. Например — система стала сложной и Time-to-market критически увеличился, то есть снизилась та скорость, с которой мы можем вносить изменения.

Архитектурная фитнес-функция

Архитектурная фитнес-функция дает объективную оценку целостности некоторых архитектурных характеристик. 

Термин пришел из области генетических алгоритмов и детально описан в книге Нила Форда, Ребеки Парсонс и Патрика Куа «Building Evolutionary Architectures: Support Constant Change» (на текущий момент на русский язык не переведена). Определить архитектурную фитнес-функцию можно как меру приспособленности решения к изменяющемуся контексту, в котором она используется. Она показывает, как архитектура должна выглядеть, выступает руководством и ограничением, в рамках которого архитектура эволюционно развивается. 

Фитнес-функции бывают целостными (holistic) и атомарными (atomic). Наличие целостных фитнес-функций — необходимое условие для эволюционного развития архитектуры.

Целостная фитнес-функция

На рисунке выше индивидуальные группы фитнес-функций, каждая из которых может состоять из множества атомарных. Атомарные фитнес-функции проверяются в изоляции, например, уровень связанность модулей или цикломатическая сложность класса. Целостные фитнес-функции проверяются вместе с другими функциями, например — производительность и надежность могут влиять друг на друга.

Определив фитнес-функции, мы задаем для себя или для команд ограничения, в рамках которых можно самостоятельно принимать архитектурные решения и экспериментировать, не опасаясь за снижение общего уровня качества.

Фитнес-функции могут быть классифицированы по трем основным категориям:

КлючевыеИзмерения, критичные при принятии архитектурных решений.  Над этой категорией работаем как можно раньше и достаточно серьезно.
Для банка это могут быть производительность, безопасность и данные, для MMORPG игры — производительность, масштабируемость, портируемость и безопасность, а для мобильного приложения — потребление батареи и производительность.
РелевантныеИзмерения, важные при реализации требований, но обычно не оказывающие влияния на архитектурные решения. Например — метрики качества кода важны, но на решения архитектурного уровня влияют слабо.
Не релевантныеИзмерения, не влияющие на выбор решений и технологий. Например — время цикла. Такие фитнес-функции не являются обязательными.

Фитнес-функции могут быть автоматизированы, инструментарий достаточно богат:

  • Инструменты статического анализа кода
  • Фреймворки Unit-тестирования
  • Инструменты для тестирования на проникновение
  • Инструменты для проведения нагрузочного тестирования
  • Инструменты мониторинга
  • Инструменты логгирования
  • Использование CI/CD-pipeline
  • Триггеры по определенным событиям

Важно не только то, что мы можем все это использовать, но и то, что мы смотрит на наиболее важные параметры системно, учитываем взаимное влияние параметров друг на друга и отклонения от нормы.

Пример Kata для построения архитектурной фитнес-функции на отслеживание изменений.

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

Требования
— Код, касающийся бухгалтерии располагается в строго ограниченном наборе пакетов
— Код в этих пакетах при изменении должен специальным образом помечаться

Контекст
— Команда использует Git

Автоматизация

Для автоматизации проверки дизайна можно использовать инструменты, вроде ArchUnit.

Он умеет проверять зависимости по классам и модулям, принадлежность классов с определенным именем конкретным пакетам, соответствие соглашениям об именовании при наследовании, обеспечивает проверки уровня доступа между слоями, проверяет на отсутствие циклических зависимостей.

Пишем тесты, интегрируем в CI и получаем максимально быструю обратную связь о нарушении принципов дизайна, которым должны следовать.

@Test
public void Services_should_only_be_accessed_by_Controllers() {
    JavaClasses classes = new ClassFileImporter().importPackages("com.mycompany.myapp");

    ArchRule myRule = classes()
        .that().resideInAPackage("..service..")
        .should().onlyBeAccessed().byAnyPackage("..controller..", "..service..");

    myRule.check(classes);
}

Двойная петля обучения в архитектуре

Теперь сведем всё воедино. Используем понятие двойной петли обучения. Если по итогам реализации продукта мы видим отклонения от ожидаемых значений фитнес-функции, то можем либо принять корректирующее архитектурное решение (одиночная петля обучения), либо обнаружить, что в корректировке нуждаются основополагающие принципы, атрибуты качества или ограничения, в рамках которых принимаются архитектурные решения и тогда необходимо сначала пересмотреть их, обновить архитектурную базу знаний и второй петлей выйти на выбор архитектурных решений, позволяющих направить развитие архитектуры в требуемом направлении.

Двойная петля обучения в архитектуре

Пройдемся по процессу и встроим в него все, что было озвучено ранее:

Описание процесса:

  • Первый архитектурный воркшоп. Обсуждаются сильные и слабые стороны архитектуры, фиксируются основные архитектурные решения и их обоснование.
  • На основе результатов первого воркшопа формируется Landing Zone и фитнес-функция
  • Во время разработки проводятся периодические встречи с обсуждением качества архитектуры
  • После реализации инкремента продукта с помощью фитнес-функций проводится технический анализ/измерение архитектуры. Обращаем внимание не только на явные отклонения, но и на подозрительные данные.  Фокусируемся на знаниях об архитектуре, полученных в результате эволюции системы.
  • Проводится воркшоп, цель которого — исследование изначальных  предположений о слабых и сильных сторонах архитектуры, отклонений и задаются следующие вопросы: «Какие из важных решений были верны?», «Какие из важных решений были ошибочными?»

Дальнейшие воркшопы строятся от трех основных целей:

  • Анализ влияния требований на архитектурные решения
  • Обоснование решений через принципы, атрибуты качества, ограничения (рационализация) с целью понять, требуется ли их изменение
  • Изменение принципов/атрибутов качества/ограничений/… и/или принятие архитектурных решений исходя из новых потребностей
  • Обновление архитектурной базы знаний (описание архитектурного решения, способы описания архитектуры)
  • Оценка затрат и выгод от предлагаемых архитектурных изменений и реализация наиболее выгодных

Это один из множества способов сформировать достаточно стройную и понятную система работы с архитектурой со встроенным процессом анализа и непрерывных улучшений и с поддержкой эволюционного развития как самого продукта, так и его архитектуры.

Если возникли какие-то вопросы — можете оставить комментарий или обратиться напрямую через facebook.

Дополнительные материалы:

Teaching Smart People How to Learn Chris Argyris, Harvard Business Review

Building Evolutionary Architectures

Об Enabler’ах

Share