Каждая правка занимает неделю
Простое изменение требует трогать десять мест, а проверить результат можно только вручную. Команда боится релизов и копит правки в большие выпуски.
Рефакторинг legacy-системы — это не «переписать красиво», а серия малых изменений, после каждой из которых система работает так же, как работала. Поэтому мы начинаем не с кода, а со страховки: тестов и сверок на текущее поведение, чтобы любая правка показывала, что именно она задела. Затем идём от мест, которые чаще всего меняются и ломаются. Если система проще починить, чем переделывать, или проще оставить, скажем об этом сразу.
Обследование — от 200 000 ₽, 2–3 неделиСначала тесты на текущее поведение, потом правкиИсходный код в вашем репозитории с первого коммита
Простое изменение требует трогать десять мест, а проверить результат можно только вручную. Команда боится релизов и копит правки в большие выпуски.
Логика живёт в голове автора или в коде без описания. Уход разработчика остановит развитие, и это понимают все.
Версия языка или библиотеки больше не получает исправлений безопасности, а новые сотрудники не хотят с ней работать. Обновить её одним шагом нельзя: всё сломается.
Руководство или разработчики предлагают написать заново. Часто это самый дорогой вариант, потому что забываются правила, которых нет ни в одном документе.
Слова путают, а решения у них разные. Перед работой договариваемся, о каком из четырёх вариантов идёт речь.
Рефакторинг без проверки — это угадывание. У унаследованного кода тестов обычно нет, и первая работа — создать то, что позволит увидеть поломку.
Тесты на унаследованный код пишут не по требованиям (требований нет), а по фактическому поведению: что система делает сейчас, правильно или нет. Правильность выясняется отдельно. Сначала нужно зафиксировать поведение, иначе после правки нельзя сказать, что изменилось.
Чтобы проверять часть кода отдельно, нужны места, где можно подменить зависимость: например, вызов 1С или почты. Такое место называют швом. В запутанном коде швов нет, и первый рефакторинг состоит в том, чтобы их создать: вынести обращение к внешнему в одну функцию с понятным входом и выходом. Это самая безопасная правка, и она открывает дорогу остальным.
Если проверить поведение нечем (нет данных, нет тестового стенда, расчёт зависит от рукописных исправлений в базе), мы не начинаем правки кода. Сначала создаём среду для проверки. Иногда это составляет половину работы, и обследование показывает это заранее.
Переделывать всё одинаково нельзя ни по бюджету, ни по риску. Места выбираем по четырём признакам, а не по тому, что выглядит хуже всего.
Схему базы нельзя переименовать за ночь, если с ней работает старый и новый код одновременно. Безопасный порядок из трёх шагов. Сначала добавляем новое поле или таблицу рядом со старыми, код пишет в оба места. Затем переносим старые данные и переключаем чтение на новое. Когда на старое никто не смотрит, оно удаляется отдельным выпуском. Каждый шаг можно откатить, а систему не нужно останавливать. Если вместе с этим меняется сама система управления базой, например при переходе на PostgreSQL, смотрите миграцию на PostgreSQL.
Прыжок через несколько версий языка или библиотеки ломает всё сразу, и причину потом не найти. Обновляем по одной ступени: поднимаем версию, прогоняем тесты, чиним то, что сломалось, выпускаем. Устаревшие зависимости, у которых нет замены, изолируем за тонким слоем, чтобы заменить их позже без правки остальной системы. Если вместе с обновлением нужен переход на отечественную операционную систему, см. портирование под Astra Linux.
В старой системе много кода, который никто не вызывает. Мы не удаляем его на глаз: сначала в журнал пишется, какие функции действительно вызываются за месяц-два, затем неиспользуемое помечается и убирается отдельным выпуском. Так система уменьшается, а риск удалить нужное остаётся малым.
Одна правка — один выпуск, который можно откатить. Большие выпуски раз в квартал не заменяются другим большим выпуском раз в квартал.
Изменённая логика включается флагом: для одного отдела, для части операций, для всех. Откат занимает минуты и не требует нового выпуска.
Договариваемся, когда нельзя трогать: закрытие периода, сезонные пики, инвентаризация. В эти дни выпусков нет.
Перед началом записано, как вернуть прежнее состояние, кто решает и за какое время. Откат проверяется заранее, а не в день проблемы.
Цены — по тарифам. Точная цена называется у обследования, дальше вилка, которая сужается по его результатам. Остановиться можно после любой ступени.
Запуск, чтение рискованных мест, карта горячих точек, оценка страховки, выбор между рефакторингом, модернизацией и заменой, вилка бюджета. Вычитается из первого этапа, если продолжаете с нами.
То же вместе с обменами, соседними системами и базой данных; карта связей и порядок изменений.
Тесты на текущее поведение, правка одного модуля или одного слоя, сверка результата, выпуск с откатом.
Рефакторинг связанных модулей, обновление платформы ступенями, изменение схемы базы, параллельный прогон на боевых данных.
Этапы по разделам системы, опытная эксплуатация каждого, регламент выпусков и отката, передача документации.
Мониторинг, разбор инцидентов, плановые доработки с пакета на 60 000 ₽. Сверх пакета — 5 000 ₽ в час.
Запускаем систему по вашим инструкциям, фиксируем, что пришлось выяснять устно. Строим карту горячих точек и оцениваем, чем можно проверить поведение. Если нужно заключение по состоянию кода, это отдельный <a href="../audit-koda-i-arhitektury/">аудит кода и архитектуры</a>.
Снимки на реальных входах, тесты на критичные сценарии, сверка данных, стенд. Договариваемся об окнах, когда выпуски запрещены.
Выбранное место проходит весь путь: тесты, правка, сверка, выпуск и откат. По результату уточняем вилку остальных этапов.
Каждый раздел с отдельной приёмкой и своим планом отката. Работаем в вашем репозитории и показываем результат на тестовом стенде.
Обновление версий ступенями и изменение схемы по принципу «расширить и сжать», когда это входит в объём.
Описание системы, тесты и регламент выпусков остаются у вас. Сопровождение берём по договору с часами.
Есть тестовые данные и стенд, и страховка собирается быстро. Нет их, и первые недели уходят на создание среды проверки.
Работа растёт не по числу строк, а по числу связей: модуль, от которого зависят десять мест, стоит больше десяти независимых.
Дубли, ручные правки в базе и недокументированные соглашения приходится разбирать до изменения схемы.
Если автор на связи и отвечает на вопросы, правила выясняются быстро. Если его нет, правила восстанавливаются по коду и данным.
Если нужно сначала узнать, можно ли развивать систему и что с ней не так, начинают с аудита кода и архитектуры: он даёт заключение, а не правки. Если система тормозит и вопрос в границах сервисов, очередях и стратегии замены (душитель, вынос границ, переписывание), смотрите микросервисы и высоконагруженные системы. Рефакторинг в нашем понимании занимается внутренним порядком: тесты, связи, схема, платформа.
Если нужно сменить базу данных или операционную систему, это миграция на PostgreSQL или портирование под Astra Linux. Если система стабильна и нужен только присмотр, подойдёт сопровождение ПО. Разбор типовой задачи, когда система осталась без подрядчика, — в разделе «Разборы».
Порядок работы, правила выпусков и откат, коммуникация с бизнесом и признаки, что пора остановиться.
Как посчитать, сколько стоит держать старую систему и когда рефакторинг выгоднее заплаток.
Как понять, что после наведения порядка нужен вынос части, а не новая архитектура целиком.
Сорок минут созвона: что за система, что в ней болит, чем можно проверить её поведение и кто её знает. Скажем, хватит ли рефакторинга и с какой ступени начинать.
Изменение устройства кода без изменения поведения, малыми шагами, каждый из которых проверен. Обычно включает тесты на текущее поведение, разделение связанных модулей, обновление платформы и аккуратное изменение схемы базы. Переписывание с нуля рефакторингом не называем.
Рефакторинг наводит порядок внутри, модернизация переводит систему на поддерживаемую основу: новая версия языка, библиотеки, иногда другая база. Часто они идут вместе, но решаются отдельно и проверяются отдельно.
Обследование — 200 000 ₽ за 2–3 недели (350 000 ₽ для системы с окружением), лёгкий пилот одного модуля — 150 000–400 000 ₽, тяжёлый пилот — 400 000–1 200 000 ₽, вывод в эксплуатацию — от 1 500 000 ₽ этапами. Обследование вычитается из первого этапа, если продолжаете с нами.
Нужно, но сначала тесты создаются. Мы фиксируем текущее поведение на реальных входах, пишем тесты на критичные сценарии и сверяем данные. Если проверить поведение нечем, начинаем со среды для проверки, а не с правки кода.
Решение зависит от возможности проверить поведение, связанности и бюджета. Переписывание с нуля годится для небольших систем с описанным поведением, где остановка допустима. Для большинства работающих систем разумнее идти частями, и обследование показывает, какую.
Нет, если соблюдать правила: малые выпуски, переключатели функций, откат на каждом шаге, запрет выпусков в критичные периоды. Изменения схемы базы делаются по принципу «расширить и сжать», без остановки. Окна определяем вместе с вами.
Вам. Исходный код лежит в вашем репозитории с первого коммита, тесты и описание системы передаются вместе с ним. Результат работ передаётся по акту, порядок передачи прав записывается в договоре; открытые компоненты остаются под своими лицензиями.
Да, если есть исходники или их можно восстановить, и систему можно запустить. Начинаем с обследования: оно показывает состояние и риск. Если исходников нет совсем, скажем об этом до договора. Сопровождение после работ — 20 000, 60 000 или 120 000 ₽ в месяц.
Мы в Ростове-на-Дону, работаем с заказчиками по всей России: удалённо и в вашем контуре. Доступ к системам и обследование согласуем на старте с вашей службой безопасности.