Architecture "as a Code" против "in the Table"

Пост - публично поразмышлять письмом про методы описания архитектуры ИТ системы. Надеюсь на комментарии. Что-то вроде ADR по выбору подхода и инструмента.

Что меня натолкнуло написать этот пост? Последние несколько лет в среде ИТ архитекторов очень “горячей” темой является Architecture as a Code (как и много чего as a Code), немало докладов на конференциях в том числе от крупных компаний. При этом практически не слышно ничего про практики работы с табличками. Хочется сравнить эти подходы, посмотреть, что ограничивает применимость. Возможно просто про такой вариант просто мало информации в инфополе, а может и есть действительно подводные камни.

Какие смыслы вкладываются в слова “as a Code”:

  • Документируем архитектуру в виде человеко-читаемого кода в текстовых файлах
  • Используем системы контроля версий (git), причем желательно храним прямо вместе с тем кодом, архитектура которого описывается.
  • Применяем все практики и инструменты работы с кодом - ветки, pull request, diff, merge, линтеры. Ветки используются для описания различных возможных путей развития системы, например вместе с отдельными ADR. Потом они могут приниматься или отвергаться, т.е. не быть приняты в текущий вариант архитектуры.
  • Желательно генерировать по этому коду картинки, чтобы показывать другим ролям и доносить до них решения/изменения.

Распространенные представители - plantUML (отдельные view), structurizr (модель с разными view), C4 нотация в качестве модели.
В общем случае можно рассматривать как некоторый DSL для описания модели системы и разных view, что по сути и реализовано в structurizr.

В качестве альтернативы рассматривается подход с ведением табличек в productivity tools. Назовем его по аналогии с aaC = as a Code – itT = in the Table. Тут выделение отдельной запоминающейся аббревиатуры имеет значение для дальнейшей популяризации.

Есть также третий класс - более “тяжелые” Enterprise моделлеры, SparxEA, iServer, Archi (как наиболее “легкая” альтернатива). Заведомо не рассматриваются, но приведены для сравнения.

EA Tools Arch aaC Arch itT
Модель Модель DSL - Domain Specific Language Структура табличек
Описание системы Данные в модели Код на DSL, файлы Данные в табличках
Ветки (версии) Ветки проектов Ветки в Git Тут не могу подобрать удобного варианта, гипотезы: 1. копия workspace c табличками 2. специальный артибут версии/ветки у каждой таблицы и строки, View на разные версии/ветки 3. генерировать из модели DSL и обратно, работать с DSL как с кодом через git
View Встроенная визуализация модели, разные view Генерация view по DSL инструментами “в комплекте” с DSL Генерация view по данным из таблиц. Например, через тот же plantUML. Кстати AI с этой задачей неплохо справляется
Viewpoints Viewpoints - как правило есть заложенные и возмодность определять свои Есть заложенные viewpoints и способ расширять через DSL Отдельные таблицы и их сочетания и являются viewpoints. Нет ничего готового, полный простор для деятельности.
Валидация Встроенные правила и их расширения Линтеры Возможно через AI Формулы и прочие механизмы на конкретном productivity tool, возможна реализация стороними инструментами через API. Возможно через AI
Удобство работы Обычно довольно тяжелые и сложные инструменты со сложным UI Возможна поддержка DSL в IDE. Удобно для инженеров, для остальных есть картинки. Довольно удобно заполнять, надо приноровиться читать. Генерация картинок также возможна.
Связь с управлением конфигурацией системы Сложные интеграции с инструментом Возможно, объем работ зависит от инструмента управления конфигурацией. Очень легко добавлять и привязывать к архитектурной модели остальное управление конфигурацией в едином инструменте.

В текущем проекте собираюсь использовать itT, собирать плюсы-минусы на практике.

Покритикуйте, что не учел, где может некорректное сравнение. И какие может быть есть мысли на тему - почему такого никто не использует или просто не рассказывает?

1 лайк

Потому что “as code” везде, а ШСМ с мышлением табличками только в начале пути?)

Навскидку с формальным языком для описания (с кодом) кажется удобнее работать именно из-за готовой инфраструктуры вокруг (git, CI) и практик, которые на этапы жизни кода навешаны (вы их сами описали). Хотя тоже слияние долгоживущих веток вроде как уже устаревшая практика.

С табличками кажется сложно сделать CI, версии какой-нибудь гугл докс хранит (и дифы тоже). Но это “совместное редактирование документа”, там принятие или не принятие разве что через комментарии можно делать.

1 лайк

В контексте ИТ, где я сейчас нахожусь (web-dev с технологиями AWS), Infrastructure as Code - это просто код, который собирает JSON как описание AWS сервисов, необходимых для приложения (база данных, лямбда-функция, пайплайн и репозиторий для сборки кода в лямбду). Но архитектурой самого приложения там даже не пахнет.

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

1 лайк

Если вопрос про “Arch iiT”:
Нужно отдельные усилия прилагать к тому, чтобы их поддерживать. И тут как с любой документацией - можно сделать это частью процесса(не принимать PR пока соответствующая часть доки не обновлена) но тогда нужно очень четко понимать кому это нужно, кто будет читать, какая ценность и какие стимулы у людей это поддерживать.

С AaaC-же - его все равно надо писать. Поэтому он все равно будет.
По идее, даже если AiiT удобнее чем AaaC - то для хорошего developer-experience нужно разработать тулы, иначе никто пользоваться этим не будет: спецификацию языка, интерпретатор который как в АааС синтезирует из табличного описания команды для инфраструктуры, diff-view.

1 лайк

Architecture “as a Code” против “in the Table”

Это ложное противопоставление, примерно как тёплое против мягкого. “in the Table” - это про форму представления модели в момент моделирования, альтернативные формы: диаграмма, аутлайн, граф, текст. “as a Code” - это про форму хранения моделей во внешней памяти подразумевающее что-то текстовое, альтернативные формы: zip-файл с пачкой xml-файлов внутри, бинарный проприетарный формат, реляционная база данных и т.д.

Теоретически может быть табличный моделер, который хранит модели в текстовом формате (Tables as a Code ;), но на практике таких инструментов сравнимых по функциональности с тем же Coda.io я пока не встречал.