Факторы принятия и пересмотра решений

Как вы принимаете архитектурные решения? Согласитесь, что вопрос непростой даже для человека с опытом. Давайте подумаем и попробуем ответить на этот вопрос структурно.

В общем случае я придерживаюсь примерно такой последовательности:

  • Погружаюсь в контекст проблемы.
  • Выясняю функциональные требования.
  • Выясняю нефункциональные требования.
  • Определяю важные архитектурные свойства.
  • Выясняю ограничения и сроки реализации.
  • Выясняю, какие решения уже приняты или реализованы.
  • Выясняю, что не устраивает в существующем варианте.
  • Определяю положение элемента в системе и его связи.
  • Рассматриваю несколько возможных вариантов.
  • При необходимости провожу R&D для их сравнения.
  • По совокупности факторов выбираю наиболее оптимальный.
  • Описываю принятое решение и как оно решает проблему.
  • Описываю плюсы и минусы.
  • Описываю риски, их важность и вероятность.
  • Описываю способы снятия или смягчения рисков.
  • Перечисляю рассмотренные решения и причины их отклонения.
  • Указываю этапы реализации и их оценку.
  • Описываю возможные дальнейшие шаги развития.
  • Описываю способ осуществления архитектурного контроля.
  • Презентую идею команде/комитету/руководителю/заказчику.
  • Отрабатываю замечания и предложения.

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

Пройдя этот путь мы, наконец, приняли решение. Но принятое решение – это статика, точка в прошлом. Что насчет динамики, развития и пересмотра?

Как мне кажется, этот вопрос до сих пор остаётся открытым. Было бы здорово, если бы кто-то тебе напоминал: “Слушай, помнишь, ты принимал решение X? Сейчас пришло время его пересмотреть!”

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

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

  • Появление новых архитектурных стилей. Например, повторное использование кода в монолитах часто начинает работать как антипаттерн, т.к. увеличивает связность. MSA позволила решить эту проблему.
  • Изменения в экосистеме. В мире всё меняется очень быстро. Отвергнутые или недопустимые решения могли стать лучше; возможно, появилось что-то более эффективное. Многие алгоритмы долгие годы пылились на полках в ожидании своего звёздного часа.
  • Изменения внешних условий. Условия лицензирования, стоимость подписки или аренды, доступность зарубежных ресурсов, необходимость импортозамещения, политические решения. Своевременная реакция может существенно повлиять на результат.
  • Изменение предметной области. Изменение законодательной базы, новый способ налогообложения, пересмотр бизнес-процессов в связи с появлением пресловутой ИИ и т.п. Если подобные вещи могут влиять на архитектурные свойства, решение требует пересмотра.
  • Новые возможности хранения. Например, поддержка JSON в ClickHouse эволюционировала постепенно, и долгое время JSON обрабатывали как строку, а не колоночный тип. Это создавало проблемы для тех, кто хотел OLAP для документов с вариативным набором атрибутов.
  • Изменение характера нагрузки. Даже если две системы делают одно и тоже, но одна рассчитана на 5k DAU, а другая – на 100k DAU, они будут иметь принципиально разную архитектуру. Например, система прохождения курсов по программированию и система проведения онлайн-олимпиад. В обеих случаях нужно проверять решения, но характер нагрузки совершенно разный.
  • Рост объема функций. Здравый смысл подсказывает: начинайте с модульного монолита. Когда разные модули имеют разные архитектурные свойства, нужно серьезно задуматься! Например, что-то нуждается в масштабировании, а что-то нет. Так появляются инсталляции с огромным Heap-ом, а сеньоры с умным видом начинают перебирать различные версии GC.
  • Рост количества связей. Когда хореография превращает проект в “клубок”, не ждите, идите в оркестрацию.
  • Деградация связей. Начали с синхронного взаимодействия, уперлись в пропускную способность вызываемого сервиса, решили перейти на асинхронное.

А что дальше?

Дальше было бы неплохо попробовать автоматизировать процесс “напоминаний”. Добавить в CI автотест, который будет проверять условия пересмотра решений и оповещать об этом ответственных лиц.



Понравилась статья?

Посмею напомнить, что у меня есть Telegram-канал Архитектоника в ИТ, где я публикую материал на похожие темы примерно раз в неделю. Подписчики меня мотивируют, но ещё больше мотивируют живые дискуссии, ведь именно в них рождается истина. Поэтому подписывайтесь на канал и будем оставаться на связи! ;-)

Статьи из той же категории: