Перепроектирование устаревших систем без остановки работы
Старая система обычно не бесполезна. В ней за годы накопилось то, чего нет ни в одном готовом продукте: правила расчета, исключения, накопленная история, сценарии, про которые все забыли, но без которых работа встанет. Проблема не в логике, а в том, что менять ее стало дорого и страшно.
Перепроектирование — это способ заменить систему, не выбросив то, ради чего она существует. И сделать это не одним прыжком, а так, чтобы компания продолжала работать все это время.
Почему «переписать с нуля» обычно проваливается
- Никто не знает всех требований. Они не в документации, а в коде, который писали десять лет. Переписывание с чистого листа гарантированно теряет часть из них, и обнаруживается это уже в бою.
- Два года без результата. Пока пишется новая система, старая живет и требует изменений. Команда раздваивается, сроки едут, интерес у руководства заканчивается раньше проекта.
- Запуск одним днем. Переключение всей компании на новую систему за выходные — сценарий с высоким риском и без пути назад.
- Новая система повторяет старые ошибки. Ее делают по образцу того, что было, потому что разбираться в процессах никто не стал. Получается тот же дом, только с новой проводкой.
- Данные не переехали. История в старом формате, справочники с дублями, десять лет документов. Эту работу почти всегда недооценивают.
Как мы это делаем
Основной принцип: новая система растет рядом со старой и постепенно забирает у нее куски. Старая продолжает работать, пока не останется пустой.
- Разбираемся, что система делает на самом деле. Не по документации, а по коду, данным и разговорам с пользователями. Отдельно выясняем, чем реально пользуются, а что мертво: обычно мертвого больше трети.
- Вытаскиваем ценное. Правила расчета, исключения, накопленные справочники и историю. Это то, что делает вашу систему вашей, и это переносится обязательно.
- Отрезаем первый кусок. Функциональный блок, который можно вынести наружу и связать со старой системой обменом. Обычно начинают с того, что меняется чаще всего.
- Работаем параллельно. Новый кусок в бою, старый пока доступен. Данные общие, расхождений нет — это проверяется сверкой, а не на слово.
- Повторяем. Следующий блок, потом следующий. С каждым шагом старой системы остается меньше, а страха меняться — тоже.
- Отключаем старую. Когда в ней не осталось ничего живого. К этому моменту это уже нерискованное административное действие, а не событие.
Что переносим, а что оставляем
Переносим обязательно
Правила расчетов и их исключения, накопленные справочники, историю операций в нужной глубине, интеграции, которые работают, и сценарии, которыми пользуются каждый день.
Сознательно не переносим
Функции, которыми не пользовались год и дольше; обходные пути, придуманные из-за ограничений старой системы; отчеты, которые никто не открывает; поля, заполненные у одного процента записей.
Второй список составляется вместе с вами и это самая полезная часть проекта. Обычно выясняется, что треть функциональности можно не повторять — и это сразу сокращает бюджет и срок.
Где здесь искусственный интеллект
Именно в этой задаче модели изменили экономику сильнее всего.
- Восстановление требований из кода. Разбор старой системы и описание того, что она делает, включая правила, которых нет ни в одном документе. Раньше это была работа на месяцы.
- Перенос логики между языками. Старый код на устаревшем языке превращается в черновик на современном. Именно черновик: результат проверяет и доводит разработчик, но начинать не с нуля — большая разница.
- Восстановление документации. Описание структуры данных и связей по самой базе, когда документации нет вообще.
- Разбор и чистка данных при переносе. Дубли справочников, разные написания, битые связи — поиск кандидатов на исправление.
- Генерация тестов на старое поведение. Чтобы убедиться, что новая часть считает так же, как старая. Это ключевая страховка всего проекта.
Последний пункт важнее остальных. При замене системы главный вопрос не «работает ли новое», а «считает ли новое так же, как старое». Мы прогоняем обе системы на одних данных и сравниваем результаты — это дешевле любых объяснений постфактум.
С какими системами приходят
- Самописная система на устаревшем стеке. Работает десять лет, автор уволился или один держит ее в голове. Технологии больше не поддерживаются, найти разработчика трудно и дорого.
- Сильно доработанная коробка. Продукт купили, потом дописали столько, что обновляться стало нельзя. Формально это чужой продукт, фактически — ваша система без поддержки производителя.
- Набор из Excel и мелких программ. Каждый кусок кто-то когда-то сделал под свою задачу. Формально системы нет, фактически бизнес работает именно на этом, и заменить это одним продуктом не выходит.
- Ушедшая зарубежная платформа. Лицензии не продлеваются, обновлений нет, поддержки нет. Здесь важно перенести не «все, что было», а то, чем реально пользовались, — обычно это заметно меньше.
- Система, купленная вместе с бизнесом. Досталась в наследство, никто не знает, как она устроена, а бизнес на ней работает. Начинать приходится с технического аудита.
Как не потерять логику, которой нет в документах
Это главный технический риск проекта, и решается он не аккуратностью, а методом.
Первое — сравнение результатов. Обе системы прогоняются на одних и тех же данных, и результаты сравниваются построчно. Расхождение — это либо ошибка в новой системе, либо неизвестное ранее правило в старой. И то и другое надо найти до запуска, а не после.
Второе — работа с теми, кто пользуется. Пользователи знают исключения, которых нет нигде: «вот для этого клиента считаем по-другому, так исторически». Такие вещи всплывают только в разговоре и только когда человек видит конкретный экран.
Третье — параллельная работа. Некоторое время обе системы принимают одни и те же операции, и расхождения видны сразу, а не через квартал. Это стоит дополнительных усилий и почти всегда себя окупает.
Сроки и стоимость
Календарно замена по частям выглядит дольше, чем обещание переписать за полгода. Но обещание переписать за полгода почти никогда не выполняется, а частичная замена дает работающий результат через два месяца и не требует остановки.
Разберем старую систему и предложим план замены по частям
Расскажите, что за система, сколько ей лет и что в ней больше всего мешает. В ответ — оценка состояния, список того, что можно не переносить, план по блокам и стоимость первого этапа.
Если систему выгоднее чинить, а не менять, скажем об этом прямо — такое бывает чаще, чем кажется.
Когда менять не надо
Честный раздел, потому что замена — дорогое решение.
Если система работает, ее меняют редко и она не мешает бизнесу расти, то жалобы разработчиков на «плохой код» — недостаточное основание. Некрасивый код, который никто не трогает, ничего не стоит.
Если проблема в одном-двух экранах или в скорости конкретного отчета, это чинится точечно и в сотню раз дешевле. Если система морально устарела внешне, но работает верно, иногда достаточно переделать интерфейс, оставив расчеты на месте.
Замена оправдана, когда изменения стали дороже разработки заново, когда технологии больше не поддерживаются и уязвимости нельзя закрыть, когда систему физически некому поддерживать или когда бизнесу нужно то, что старая архитектура не позволяет в принципе.
Что остается у вас
Код новой системы в вашем репозитории, описание перенесенных правил расчета — то, что раньше существовало только внутри старого кода, теперь записано. Данные с историей, перенесенные и сверенные. Инструкции по развертыванию и по работе.
И возможность останавливаться. План по блокам устроен так, что после каждого шага система целостна: если у вас изменились приоритеты или закончился бюджет, вы остаетесь с работающим результатом, а не с недостроенным зданием.
Дальше по теме
Частые вопросы
Почему нельзя просто переписать систему с нуля?
Можно, но это проваливается чаще всего. Требований никто не знает целиком — они в коде, который писали десять лет. Пока пишется новая система, старая живет и требует изменений. А переключение всей компании за выходные — сценарий без пути назад. Мы выращиваем новую систему рядом со старой и забираем функции по одному блоку.
Сколько времени занимает замена?
Разбор старой системы — что делает, чем пользуются, что можно не переносить — 2–4 недели. Первый блок в бою, работающий параллельно, — 1,5–3 месяца. Полная замена системы среднего размера — от восьми месяцев. Календарно это дольше обещания «перепишем за полгода», но такое обещание почти никогда не выполняется.
Как не потерять логику, которой нет в документации?
Тремя способами сразу. Прогоняем обе системы на одних данных и сравниваем результаты построчно: расхождение — это либо ошибка в новой, либо неизвестное правило в старой. Разговариваем с пользователями: исключения вроде «для этого клиента считаем иначе» всплывают только так. И какое-то время работаем параллельно.
Обязательно ли переносить все?
Нет, и это самая полезная часть проекта. Обычно треть функциональности можно не повторять: функции, которыми не пользовались год, обходные пути из-за ограничений старой системы, отчеты, которые никто не открывает, поля, заполненные у одного процента записей. Список составляется вместе с вами и сразу сокращает бюджет.
Что делать с историей и данными?
Переносим: справочники, историю операций в нужной глубине, незакрытые документы. Это отдельная работа со своей стоимостью, и ее почти всегда недооценивают — при переносе всплывают дубли, разные написания и битые связи, накопленные за годы.
Можно ли остановиться на середине?
Да, и план строится именно так. После каждого блока система целостна: если изменились приоритеты или закончился бюджет, вы остаетесь с работающим результатом, а не с недостроенным зданием. Это принципиальное отличие от переписывания целиком.
Когда менять систему не надо?
Когда она работает, ее редко меняют и она не мешает расти. Жалобы разработчиков на плохой код — недостаточное основание: некрасивый код, который никто не трогает, ничего не стоит. Если проблема в паре экранов или в скорости отчета, это чинится точечно и в сотню раз дешевле.
У нас ушла зарубежная платформа. Нужно сделать такую же?
Почти наверняка нет. Правильная задача — перенести то, чем реально пользовались, а это обычно заметно меньше, чем было в системе. Попытка воспроизвести чужой продукт целиком — самый дорогой и самый бессмысленный вариант замены.