Clean Room: рефакторинг, который решал не архитектурный вопрос

 · 2 min read

Далеко не весь код из основного движка обязан оставаться там вечно. Этот переезд начался с вопроса из юридической плоскости. Нужно было чётко определить границу между нашими собственными идеями и знаниями от работы с внешним форматом. Одно из семейств рендереров Flude в точности воспроизводило формат стороннего инструмента. Этот кусок кода оказался прямо на линии огня.

Два риска рефакторинга на месте

Спутанные потоки данных

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

Первая проблема касается авторства. Код для воспроизведения чужого формата живёт в общей истории вместе с движком. Доказать независимость его разработки становится крайне трудно. Доказательная база требует жёсткого разделения. Нужна отдельная история коммитов и собственный репозиторий с чёткой точкой отсчёта.

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

Физическое разделение решает обе проблемы одним ударом. Простое переименование папки здесь бессильно.

Как это было устроено на практике

Clean Room плагин

Мы вынесли рендереры в отдельный git-репозиторий. Он подключается к основному проекту как приватный сабмодуль со своей изолированной историей. Движок взаимодействует с ним через привычный интерфейс рендерера. Класс просто физически переехал в другое место. Для остальной системы всё осталось совершенно прозрачным.

Настроить новый репозиторий оказалось довольно замороченно. Тестовая обвязка всё равно требует базовые модели движка. Нам пришлось чекаутить основной репозиторий внутри CI нового плагина. Привычные вещи вроде общих путей перестали работать. Мы потратили время на правильную настройку зависимостей и гейтов покрытия тестами. Линтер markdown сначала отключили из-за отсутствия конфига, а потом вернули для соблюдения общих стандартов. CI позеленел далеко не с первой попытки.

Методология проверки качества переехала вместе с кодом. Инфраструктура сверки с эталонными документами отправилась в новый репозиторий. Без неё мы бы быстро пропустили момент расхождения рендера с оригиналом.

Итог

Разделение движка и модуля

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