Найти в Дзене

Жертвенная архитектура (Sacrificial Architecture)

По Мартину нашему Фаулеру, жертвенная архитектура - архитектура, которую удаляют, если модель окажется успешной.
Кандинский, такой кандинский... Запрос "Жертвенная архитектура информационной системы".
Кандинский, такой кандинский... Запрос "Жертвенная архитектура информационной системы".
bliki: Sacrificial Architecture

Так же, вопрос жертвенной архитектуры широко освещен в неплохой книге "Мифический человеко-месяц" Фреда Брукса.

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

Что такое понятие жертвенной архитектуры?

При разработке какой-либо новой информационной системы, нужно быть готовым в любой момент "выбросить одну"

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

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

Тут есть два, наиболее часто встречающихся варианта:

  • Мы быстро, насколько это возможно, клепаем MVP, ориентируясь только на требования MVP и у нас норм так получается. И наша система через год после MVP обретает кучу костылей и реализованного функционала по обходному пути. Что в свою очередь увеличивает техдолг до уровня сравнимого с повторным перепроектированием и разработкой нашего решения. У Брукса это называется прекрасным определением "Синдром второй системы".
  • Мы очень долго проектируем, чуть ли не по Clear Room реализуем и у нас получается изящно-спроектированная система, которая побеждает не только известные известные, но известные неизвестные. Но реальная жизнь и тут может поставить нам подножку, относительно реальных кейсов использования нашей системы и требований к её уровню сервиса. Мы тратим время, растягивая ТТМ на то, чтобы привести нашу классную архитектуру к такому же классному целевому состоянию.

Третий вариант, который и является реализацией паттерна "жертвенная архитектура", это:

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

Какие примеры IRL можно привести:

  • Discord, запустился на MongoDB и обернулся вокруг Cassandra по мере роста популярности
  • Twitter разрабатывался на рубби на рельсах и по мере уже роста отказов слез с рубби.

Ну и таких примеров много.

Итак, что делать с жертвенной архитектурой?

Получается, что mvp-шнуцю архитектуру нам все равно придется выкинуть и что же?

Когда ты понимаешь цель того, что ты делаешь, становится проще это самое делать. Если ты понимаешь, что тебе придется отказаться от решения первого этапа до начала разработки и почему это произойдет, тебе будет легко поступить именно таким образом.

И по этому:

  • Без сильной мотивации не стоит выходить за рамки требований MVP.
  • При этом, стоит держать уме отраслевые и референтные модели, которые могут расширить требования.
  • Проектируйте с оглядкой на замену, но без оверинженеринга.
  • Облачные решения и паттерны разработки микросервисной архитектуры гарантированно снижают затраты на дальнейший рефакторинг, не увеличивая значительно затраты на разработку MVP и её сроки (в случае с enterprice решениями).
  • Используйте интеграционные паттерны DDD и разделяйте контексты на ранних этапах. При этом установите правила (не границы, а правила их проведения) между доменами и контекстами.