03 дек. 2024 г.·7 мин чтения

Картируйте скрытые зависимости перед рефакторингом, чтобы избежать сюрпризов

Узнайте, как до рефактора найти скрытые зависимости: проследите cron‑задания, экспорты, скрипты поддержки и побочные фиды до внесения изменений в код.

Картируйте скрытые зависимости перед рефакторингом, чтобы избежать сюрпризов

Почему рефакторы ломают вещи вне приложения

Большинство провалов рефакторов происходят в неярких местах. Основные экраны по‑прежнему загружаются, тесты зелёные, команда идёт дальше. А затем начинает давать сбои тихая работа вокруг приложения.

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

В день релиза всё может выглядеть нормально. Заказы идут, пользователи заходят. Но через пару дней бухгалтерия открывает пустой отчёт, потому что ночной экспорт ждал старых имён полей. Поддержка не может повторно отправить счёт, потому что внутренний скрипт обращается к эндпойнту, которого больше нет. Небольшое изменение быстро превращается в проблему бизнеса.

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

Эти отказы кажутся неожиданными, но чаще всего они не такие. Они происходят от работы, которая живёт вне основного потока приложения. Кто‑то в финансах скачивает файл каждое утро. Кто‑то в поддержке запускает скрипт при возврате денег. Cron‑задача отправляет данные в другую систему в 2:00. Ничего из этого не показывают на демо продукта, но ежедневные операции от этого зависят.

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

Безопасный рефактор начинается с более широкой картины. Код важен, но бизнес зависит от всего, что к нему прикреплено.

Что считается скрытой зависимостью

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

Команды обычно сначала думают о экранах и API. Тихие вещи часто наносят больше вреда. Очередной воркер, который повторяет обработку упавших заказов, cron‑задача, закрывающая устаревшие счета в 2:00, или небольшой скрипт, который чистит плохие данные, — всё это может поддерживать работу бизнеса.

Экспорты тоже входят в список. Ночной CSV для бухгалтерии, еженедельный файл для поставщика или отчёт по заказам, который клиент ждёт по понедельникам, кажутся мелочью. Они перестают быть мелочью, когда от них зависит зарплата, обновление запасов или выставление счетов.

То же касается shell‑скриптов, админ‑инструментов и разовых помощников. Иногда один человек в поддержке запускает команду каждую пятницу. Иногда операции используют приватную админ‑страницу для исправления этикеток доставки. Эти вещи редко отражаются в тикетах или диаграммах, но они всё равно формируют процесс работы.

Следите за побочными фидами. Webhook‑уведомления другим инструментам, файлы, сбрасываемые в общие папки, и даже общие таблицы могут стать частью реальной системы. Если таблица обновляется вручную и затем импортируется куда‑то ещё, это зависимость. Это может быть грязно, но это реальность.

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

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

Начните с бизнес‑моментов, а не с кода

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

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

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

Следующий день показывает более медленные шаги. Бухгалтерия может экспортировать счета в учётную систему. Операции пересматривают исключения по отгрузкам. Поддержка работает с очередью, которая появляется только после ночной синхронизации.

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

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

Держите короткую запись для каждого события:

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

Это также снимает ложную уверенность. Команда может считать, что возврат завершён, когда API платёжной системы вернул успех, но бизнес всё равно страдает, если экспорт в бухгалтерию не сработал на следующий день.

Если вы картируете бизнес‑моменты до изучения кодовых путей, карта зависимостей быстро становится ясной. Вы перестаёте спрашивать «какие вызовы делает этот модуль?» и начинаете спрашивать «что ломается для клиентов, бухгалтерии, поддержки или операций, если это событие изменится?» — и этот вопрос раньше находит проблемы.

Проследите задания, скрипты и фиды

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

Начните с вытягивания всех запланированных заданий из мест, которые команды обычно забывают проверять. Посмотрите таблицы cron на серверах, пайплайны CI, настройки Cloud Scheduler, конфигурации контейнеров и любые панели, которые позволяют запускать задачу по таймеру. Если что‑то срабатывает в 2:00 — это тоже важно.

Затем ищите в кодовой базе скрипты, которые люди запускают по привычке. Просмотрите папки scripts, bin, таск‑раннеры, package‑файлы, админ‑команды, SQL‑джобы и старые shell‑файлы. У многих команд есть скрипт, который формирует CSV для бухгалтерии, исправляет застрявшие заказы или посылает повторно упавшие письма. Пока не сломается — его не считают частью продукта.

Логи помогают, когда документации мало. Просканируйте на работу, которая выполняется каждый день, каждую неделю и в конце месяца. Очереди, повторы webhook‑ов, синхронизации с API партнёров и переносы файлов часто оставляют заметный рисунок в логах, даже если команда забыла про них записать.

Не останавливайтесь на внутренних заданиях. Проверьте все пути, где данные входят в систему или выходят из неё: message‑queues, webhooks, сторонние API, парсеры писем и дампы файлов. Простой SFTP‑загруз или ежедневный импорт таблицы могут быть единственной вещью, которая держит отчётность или выполнение заказов в рабочем состоянии.

Для каждого элемента запишите те же факты простым языком: кто за это отвечает, что запускает задачу, какие входные данные нужны, какой выход получается и что случится при сбое или задержке.

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

Поговорите с людьми, которые решают крайние случаи

Резерв для рефактора
Используйте опыт CTO, когда команде нужна более широкая системная перспектива.

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

Начните с поддержки. Спросите, какие отчёты они прогоняют заново, какие запросы требуют ручной правки и что они делают, когда не приходит письмо, счёт или синхронизация. Если кто‑то отвечает «я просто запускаю это снова», уточните, где хранится скрипт, какие входы он ждёт и как они понимают, что всё сработало.

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

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

Для каждой задачи запишите, кто её выполняет, когда, какой файл, скрипт или отчёт трогают и по какому сигналу они понимают, что что‑то не так.

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

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

Запишите карту простым языком

Используйте одну общую таблицу или доску для всей карты. Подойдёт Google‑таблица или доска в проектном инструменте. Важно, чтобы все читали одну и ту же версию, а не обменивались приватными заметками и полузабытыми сообщениями в чате.

Пишите для человека, который не создавал систему. По возможности избегайте внутреннего жаргона. «Ночной экспорт счетов в бухгалтерию» лучше, чем «job_fin_exp_v2».

Обычно простая карта требует одних и тех же полей:

  • понятное имя
  • владелец или контакт команды
  • расписание
  • что ломается, если остановится
  • доказательство, например пример файла, скриншот или имя команды

Поле времени убережёт от неверных предположений. «Запускается каждый час» — это одно. «Только в последний рабочий день месяца в 23:00» — совсем другое, и эта деталь может спасти вас от болезненного переключения.

Пишите влияние в бизнес‑понятиях, а не только технических. Не ограничивайтесь «API падает» или «ошибки скрипта». Опишите, что почувствуют люди: поддержка не сможет оформлять возвраты, на складе не распечатаются ярлыки, бухгалтерия не получает экспорт или отдел продаж теряет свежие лиды до следующего утра.

Вложения помогают больше, чем длинные заметки. Прикрепите пример CSV, скриншот админ‑экрана, который кто‑то проверяет каждый день, точное имя cron‑задачи или shell‑команду, которую запускает сотрудник поддержки, чтобы исправить застрявший заказ. Небольшие артефакты превращают смутные воспоминания в проверяемый материал.

Одна строка в таблице может предотвратить падение на второй день. «Месячный налоговый экспорт», владелец — finance ops, запускается в 23:00 в последний день месяца, ломает отчётность по налогам при ошибке, прикреплён пример файла за прошлый месяц. Это гораздо надёжнее, чем неясный комментарий в коде.

Такой простой реестр работает, потому что даёт одинаковую картину продукту, поддержке и инженерии. Когда начнётся рефактор, люди перестанут гадать и начнут проверять.

Пример для простой системы заказов

Защитить финансы и поддержку
Проверьте экспорты и ручные процедуры, на которые персонал опирается каждую неделю.

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

На бумаге изменения кажутся безопасными. Заказы по‑прежнему создаются, оплачиваются и отправляются в приложении. На этом команды и «обманываются».

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

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

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

Затем рефактор переименовывает поля. order_total становится total_amount. ship_name становится delivery_name. Приложение всё ещё проходит базовые тесты, но одновременно ломаются два внешних потока. Экспорт для склада больше не совпадает по колонкам, а скрипт возврата отправляет пустые значения в партнёрский портал.

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

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

Вот в чём смысл. Не останавливайтесь на экранах приложения и таблицах базы. Проследите заказ до склада, партнёрского портала и почтового ящика поддержки.

Ошибки, которые вызывают сбои на второй день

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

Одна распространённая ошибка — считать репозиторий приложения всей системой. Как правило, это не так. Бизнес может зависеть от cron‑заданий, десктопных скриптов, импортов таблиц, SFTP‑сбросов, старых shell‑файлов на сервере и одноразовых инструментов, к которым никто не прикасался месяцами.

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

Память причиняет больше вреда, чем команды ожидают. Если кто‑то «тот самый, кто знает, как всё работает», у вас нет карты — у вас единая точка отказа. Люди забывают шаги, пропускают редкие исключения или уходят из компании.

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

Изменения имён данных также творят тихие разрушения. Переименование колонки может быть безопасным для приложения, но downstream‑CSV, BI‑импорты, макросы в бухгалтерских отчётах или фиды партнёров всё ещё ждут старое имя.

Короткий обзор перед переключением ловит многое:

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

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

Быстрые проверки перед cutover

Аудит скрытых рисков рефактора
Получите проверку от опытного CTO: задания по расписанию, экспорты, скрипты и ручные шаги до внесения изменений в код.

Тест переключения должен покрывать полный бизнес‑цикл, а не только пару экранов и API‑вызовов. Если заказы приходят утром, экспорты уходят в полдень, бухгалтерия проверяет итоги днём, а cron‑задача закрывает день ночью — протестируйте всю эту цепочку в таком порядке.

Положите старый и новый выходы рядом. Сравните CSV‑файлы, сводки по почте, webhook‑payload‑ы и любые файлы, которые другая команда привычно импортирует. Небольшие различия ломают реальные процессы: переименованная колонка, пропавший ведущий ноль, пустое поле статуса.

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

Короткая проверка перед cutover обычно ловит больше, чем длинный тестовый скрипт:

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

Планы отката не работают, если они живут в голове у кого‑то. Запишите, кто принимает решение, что переключается обратно первым, как восстанавливаются старые задания и как подтвердить, что downstream‑команды снова могут работать.

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

Что делать дальше

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

Возьмите один поток и проследите его до конца. Проверьте приложение, cron‑задания, экспорты, скрипты поддержки, webhook‑цели, общие папки и любые ручные шаги, которые кто‑то запускает с ноутбука. Это самый быстрый способ найти скрытые зависимости, не превращая работу в месяц догадок.

Затем превратите каждое неизвестное в маленькую запись:

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

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

Если ваша команда планирует более масштабные изменения, это та работа, которую выполняет Oleg Sotnikov через oleg.is как fractional CTO: нахождение скриптов, заданий и побочных систем, которые живут вне приложения, но держат компанию в рабочем состоянии.

Рефакторы идут лучше, когда команда видит всю систему. Не ту аккуратную версию в репозитории — а реальную.

Часто задаваемые вопросы

Почему рефактор ломает вещи после релиза, хотя тесты прошли?

Потому что тесты обычно покрывают само приложение, а не работу вокруг него. Финансовые экспорты, скрипты поддержки, фиды партнёров и запланированные задания могут сломаться через день, даже если основные экраны работают.

Что считается скрытой зависимостью?

Всё, что читает данные из вашей системы или записывает их обратно. Это cron‑задачи, CSV‑экспорты, webhook‑приёмники, команды поддержки, общие таблицы, импорты партнёров и повторяющиеся ручные шаги персонала.

С чего начать картирование зависимостей?

Начните с одного бизнес‑события, которое важно людям: регистрация, возврат, счёт или отгрузка. Проследите его в течение часа, дня и недели — так вы быстро найдёте побочную работу.

С кем стоит поговорить в первую очередь?

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

Как найти недокументированные задания и скрипты?

Вытяните запланированные задания из всех мест, где они могут скрываться, затем ищите в репозитории scripts, bin, таск‑раннеры, package‑файлы, админ‑команды, SQL‑задачи и старые shell‑файлы. После этого просканируйте логи на паттерны ежедневных, еженедельных или месячных задач.

Важны ли электронные таблицы и ручные обходные пути?

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

Что записывать для каждой зависимости?

Коротко и понятно: имя, владелец, расписание, входы, выходы и что ломается при остановке. По возможности прикрепите доказательство: пример файла, скриншот или точную команду.

Как протестировать рефактор перед cutover?

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

Какие ошибки чаще всего приводят к отказам на второй день?

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

Как понять, что ещё не готовы переключаться?

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