Rain Lag

Аналоговый сториборд рефакторинга: превращаем изменения в легаси‑коде в комикс до того, как трогаем Git

Как относиться к рефакторингу легаси‑систем как к раскадровке комикса, чтобы снизить риски сложных изменений, выровнять ожидания команды и превратить план в тест‑драйвовый путь миграции — ещё до того, как вы напишете первую строку кода.

Введение: когда рефакторинг легаси ощущается как хирургия

Рефакторинг легаси‑кода часто напоминает операцию на летящем поезде. Система крутится в проде, пользователи от неё зависят, и ваша история в Git рискует превратиться в сборник хорроров, если что‑то пойдёт не так.

Многие провальные рефакторинги начинаются ещё до того, как написана первая строка кода. Дело не в навыках — дело в отсутствии общего, конкретного плана. Цели расплывчаты, шаги неясны, и команда сразу прыгает в код и ветки Git, надеясь рулить по ходу дела.

Есть лучше подход: сначала раскадровать рефакторинг как комикс, а уже потом трогать Git.

В этом посте разберём, как:

  • Превратить сложные изменения в легаси в маленькие визуальные сцены (панели)
  • Использовать аналоговые инструменты (карточки, стикеры, доски) для планирования рефакторинга
  • Привязать к каждой панели тесты, превращая план в тест‑драйвовый путь миграции
  • Использовать сториборд как артефакт для совместной работы и документации — в том числе рядом с AI‑инструментами

Почему сториборд рефакторинга работает

Сторибординг — стандартная практика в кино и анимации. Режиссёры набрасывают ключевые кадры в виде панелей, чтобы продумать темп, риски и сюжет до того, как кто‑то вообще начнёт снимать.

Сториборд рефакторинга — то же самое, только применительно к коду:

  • Каждая панель — это один маленький, безопасный шаг
  • Панели выстроены в последовательность, показывающую, как система эволюционирует
  • Панели можно переставлять, удалять и вставлять новые за минуты — без мучительного rebase

Этот подход помогает, потому что рефакторинг по своей сути — про изменение во времени. Git показывает, что изменилось; сториборд показывает, как вы собираетесь это менять и зачем.

Сториборд помогает избежать трёх типичных провалов:

  1. Размытые цели – «Надо это почистить» превращается в «Сохраняем поведение X, улучшаем Y, открываем Z для будущих изменений».
  2. Слишком крупные изменения – один монструозный PR распадается на множество маленьких, обратимых шагов.
  3. Расфокус команды – немые ожидания превращаются в явные панели, которые можно обсуждать и улучшать.

До того, как что‑то попадёт в Git, вы уже снизили риск.


Шаг 1. Сделайте из рефакторинга историю, а не задачу

Вместо «Рефакторить платёжный пайплайн» опишите его как историю с персонажами и ставками:

  • Персонажи: пользователи, внешние системы, downstream‑сервисы, фоновые джобы
  • Сеттинг: текущая архитектура и её болевые точки
  • Конфликт: что сейчас ломается, тормозит или делает невозможными нужные изменения
  • Развязка: что должно быть истинно после рефакторинга

Теперь переведите это в три чёткие цели:

  1. Поведение, которое обязано сохраниться
    • Пример: «Правила авторизации платежей не должны измениться».
  2. Поведение, которое должно улучшиться
    • Пример: «Логика ретраев централизована, а не скопирована в трёх сервисах».
  3. Влияние на пользователей и другие системы
    • Пример: «Ответы API остаются обратно совместимыми, логи становятся более структурированными».

Запишите это на большой карточке вверху доски: Refactor Intent (намерение рефакторинга). Каждая панель, которую вы добавляете, должна служить этому намерению.


Шаг 2. Выберите простые, визуальные инструменты

Не начинайте с тяжёлых диаграммных комбайнов, если они вас тормозят. Вам нужны быстрые, одноразовые артефакты:

  • Карточки (index cards) на столе
  • Стикеры на стене или доске
  • Простые drag‑and‑drop‑инструменты (Miro, Excalidraw, FigJam)

Ключевые свойства инструмента:

  • Низкое трение: создание, дублирование и удаление панелей занимает секунды
  • Возможность быстро переставлять: порядок шагов меняется без борьбы с интерфейсом
  • Совместность: люди могут стоять рядом, показывать, подписывать, спорить

Каждая карточка или стикер представляет один шаг рефакторинга. Вы пишете что‑то вроде:

Панель 3: Ввести интерфейс PaymentGateway; оставить старую реализацию за ним.

Текст держите коротким, как подпись к кадру в комиксе; цель — ясность, а не многотомные спеки.


Шаг 3. Разбейте рефакторинг на панели‑кадры комикса

Теперь вы превращаете большой страшный рефакторинг в последовательность маленьких, упорядоченных панелей:

  1. Опишите текущее состояние
    Несколько панелей, которые показывают, как сейчас проходят запросы: какие модули кого вызывают, где костыли и горячие точки.

  2. Обозначьте конечное состояние
    Пара панелей, показывающих, как должна выглядеть архитектура, когда вы закончите.

  3. Заполните путь между ними инкрементальными изменениями:

    Каждая панель должна:

    • Быть самодостаточной – её можно реализовать и задеплоить безопасно
    • Иметь понятную цель – «Выделить фича‑флаг» лучше, чем «Немного прибраться»
    • Иметь безопасную точку отката – этот коммит можно откатить, не уронив приложение

Пример последовательности:

  1. Панель 1: Добавить фича‑флаг new_payment_flow (по умолчанию выключен).
  2. Панель 2: Вынести валидацию в PaymentValidator, пока использовать только в старом флоу.
  3. Панель 3: Ввести интерфейс PaymentGateway; адаптировать текущий шлюз к нему.
  4. Панель 4: Реализовать новый шлюз за тем же интерфейсом; спрятать за фича‑флагом.
  5. Панель 5: Постепенно пустить небольшой процент трафика через новый шлюз.
  6. Панель 6: Удалить легаси‑шлюз после окна стабильности.
  7. Панель 7: Удалить фича‑флаг после полной миграции.

Обратите внимание: каждая панель напоминает маленький коммит. Это не случайно — хороший рефакторинг инкрементален. Сториборд делает эту структуру явной до того, как вы начнёте писать код.


Шаг 4. Привяжите к каждой панели тесты

Сториборд — это не просто красивая последовательность; он должен превратиться в тест‑драйвовый маршрут миграции.

Для каждой панели ответьте на два вопроса:

  1. Какие тесты должны появиться или обновиться, чтобы панель считалась “готовой”?
  2. Какое поведение обязательно должно сохраниться после этого шага? (регрессионные “ограждения”)

Это можно написать прямо на карточке или оформить чек‑листом под ней.

Пример панели с тестами:

Панель 3: Ввести интерфейс PaymentGateway

  • Тесты, которые нужно добавить/обновить:
    • Новые unit‑тесты контракта PaymentGateway
    • Убедиться, что все существующие платёжные флоу проходят интеграционные тесты
  • Гарантии поведения:
    • Никаких изменений в доле успешных/неуспешных платежей
    • Логи и метрики остаются идентичными

Это даёт три сильных эффекта:

  • Держит вас честными в отношении объёма работ по каждой панели
  • Снижает прокрастинацию в стиле «тесты потом допишем»
  • Делает сториборд живым TDD‑гайдом для фазы реализации

Когда вы дойдёте до кода, вопрос «Что дальше?» пропадает — вы просто идёте по панелям, реализуя и обновляя тесты шаг за шагом.


Шаг 5. Работайте вместе вокруг аналоговой доски, а не вокруг кода

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

Аналоговый сториборд выносит эти обсуждения раньше и дешевле:

  • Инженеры могут спорить о последовательности («Интерфейс лучше ввести до добавления нового шлюза»)
  • Можно предлагать альтернативные пути («А можем здесь применить strangler‑паттерн?»)
  • Продакт и QA могут помечать влияние на пользователя и крайние случаи

Пока вы работаете с карточками и стикерами, вы избегаете преждевременных холиваров об имплементации. Вместо «Это PaymentOrchestrator или PaymentManager?» вы обсуждаете, что именно нужно изменить и в каком порядке.

Практические форматы:

  • Стэндап у стены: 5–10 минут, чтобы пробежать глазами текущий сториборд и панель на сегодня.
  • Планирование рефакторинга: начать с карточки с intent, затем пройтись по каждой панели, как будто рассказываете историю.
  • Аннотации: разными цветами помечать риски, зависимости, открытые вопросы.

К тому моменту, когда вы откроете редактор, команда уже согласовала, как выглядит “хороший” результат.


Шаг 6. От сториборда к истории Git — и обратно

Когда вы переходите к коду, относитесь к сториборду как к контракту с будущей версией себя:

  • Стремитесь к одному (или нескольким небольшим) коммитам на панель
  • Упоминайте ID панели в сообщениях коммитов: feat: Panel 3 – Introduce PaymentGateway interface
  • Держите сториборд на виду, пока работаете

После того как рефакторинг уедет в прод, у вас появляется мощная обратная связь:

  1. Сравните сториборд и историю Git

    • Какие панели совпали с реальностью?
    • Где вы отклонились — и почему?
  2. Задокументируйте уроки прямо на сториборде:

    • «Панель 4 пришлось разбить на два коммита из‑за неожиданной сцепки модулей».
    • «Панель 6 оказалась лишней; легаси‑шлюз убрали раньше».
  3. Используйте сториборд как документацию и материал для онбординга

    • Новые люди в команде видят не только что изменилось, но и зачем и в каком порядке.

Если вы используете AI‑инструменты для генерации идей по рефакторингу, сториборд становится якорем:

  • Сравнивайте предложенную AI последовательность шагов с вашей
  • Вливайте удачные идеи в сториборд до того, как трогать код
  • Избегайте слепого принятия AI‑изменений, которые противоречат вашему refactor intent

Сториборд становится живым артефактом проектного замысла, который переживает любой отдельный PR.


Собираем всё вместе

Аналоговый сториборд рефакторинга обманчиво прост:

  • Проясните намерения: что должно сохраниться, что улучшиться, кто затронут
  • Используйте низкофрикционные инструменты: карточки, стикеры или простые диаграммы, которые можно переставить за секунды
  • Разбейте работу на панели: каждая панель — маленький, обратимый шаг с понятной целью
  • Привяжите тесты: для каждой панели опишите тесты и гарантии, которые обязаны выполняться
  • Работайте вместе заранее: спорьте о сториборде, а не о diff, чтобы выровнять команду
  • Замкните цикл: сравнивайте сториборд с фактической историей Git и улучшайте подход

Выигрыш ощутим: меньше неожиданных провалов, чище история в Git, прозрачные намерения и команда, которая понимает, почему рефакторинг выглядит именно так.

В следующий раз, когда вы будете смотреть на пугающий клубок легаси‑кода, удержите себя от желания сразу открыть IDE. Возьмите пачку карточек, набросайте рефакторинг как комикс — и пусть сториборд ведёт код, а не наоборот.

Аналоговый сториборд рефакторинга: превращаем изменения в легаси‑коде в комикс до того, как трогаем Git | Rain Lag