🔮 Majestic ball of mud
20 разрабов коммитят в один монолит: непонятно, кто за что отвечает, конфликты в коде, долгий онбординг, низкая продуктивность. Знакомо?
А теперь представьте масштаб проблемы, если их не 20, а сотни, в одном репозитории 2,2 миллиона строк кода, а проекту больше десяти лет.
Это GitLab, и их решение - срочно нарезать всё на микросервисы. На самом деле нет, да это и невозможно на таком масштабе, поэтому делают модульный монолит и меняют правила работы команд.
Этой инициативе уже несколько лет, но долгое время работа шла довольно вяло. С развитием агентной разработки пришлось ускориться ✊
Давайте посмотрим, что происходит - далеко не каждая компания открывает свои ADR.
Все эти годы проект рос, местами было больно - впрочем, ничего необычного.
Почему? - не было нормальных границ между частями системы в монолите и чёткой структуры - даже якобы изолированный код использует одни и те же таблицы в бд (привет, intrusive/data coupling) - т.о. в отдельные сервисы не выделишь, слишком большая связанность - инфраструктурный каплинг, естественно - части монолита связаны намертво и деплоить нужно вместе - а значит нельзя закатить хотфикс без полного обновления - косяк одного домена может положить все остальные
Размытые границы доменов - это тяжело и для людей, и для агентов. Но если разработчики с опытом на проекте могут положиться на накопленные знания: им понятно, что лучше не трогать, где спросить коллегу, то агент этого не "чувствует". В итоге - случайно ломает логику в другом домене или дублирует то, что уже есть (хотя с кем из людей такого не бывало 😏)
Ускорение с приходом агентной разработки выглядит как "ну для разрабов было неудобно, но кого это волновало".... А вот для агентов пришлось постараться )) Конечно, у бизнеса появилась необходимость эффективно использовать ai.
Как делают: 1) вынесли либы ( lib/gitlab ) в гемы в определённом порядке - от слабо-связанных с доменной логикой к сильно-связанным [ADR-004] - первый этап - универсальные утилиты, не связанные с доменной логикой (критерий - связи с active_record) - второй - библиотеки, которые ссылаются на концепции gitlab, но не на модели - третий - зависящий от ar-моделей код - не выносится в гемы, а перемещается в свой bounded context 2) определили bounded contexts и ответственные команды (на самом деле "стюардов", но об этом отдельно) 3) изолируют доменный слой 4) выделяют транспортный слой по правилам гексагональной архитектуры: это адаптеры web ui, rest api, graphql, sidekiq
Для определения и форсирования границ используют danger-packwerk на ci в мягком варианте - комментарии для новых нарушений + package_todo.yml в репах для фиксации старых.
На фронтенде: строят микрофронтенды внутри монолита, так чтобы каждый модуль можно было деплоить самостоятельно.
Так в гитлабе делают каплинг более явным и управляемым, к этому, пожалуй, нужно стремиться нам всем ✊
А вам приходилось работать над разделением монолита на модули? Какие инструменты использовали для форсирования границ?
· 16.10
Для .NET здесь пригодятся архитектурные тесты на зависимости сборок, но общие таблицы они не поймают. Я бы отдельно фиксировал владельца данных и запрещал чужому модулю писать напрямую. Иначе агент аккуратно соблюдёт границы классов, а бизнес-инвариант обойдёт одним SQL-запросом.
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён