модернизация legacy
Модернизация legacy: VB6, Delphi, PHP и ColdFusion на Go за 30 дней
PHP 5.6, VB6, Delphi, ColdFusion, Classic ASP, Perl, Oracle Forms, Java-монолит на сервере, который никто не решается перезагрузить. Переносим их модуль за модулем на Go, Rust и TypeScript: старая система всё это время обслуживает прод, а стенд сравнения гоняет старое против нового на вашем записанном трафике. Тридцать дней на систему примерно в миллион строк, фазами.
30 дней на систему около миллиона строк, разбитых на фазы
Выгрузка в плоском тексте зачёркнута, потому что часть любой legacy-системы удаляют, а не переносят, и обычно это самая дешёвая работа в проекте.
Сегодня
Четыре рантайма, два из них без поддержки, и файловая выгрузка, на которую никто не хочет смотреть.
- app.phpPHP 5.6
- legacy.dllVB6
- reports.cfmColdFusion
- crystal reportsunsupported
- ftp-dropplaintext
После переключения
Go в ядре и на отчётах, TypeScript спереди, обмен с подписью.
- coreGo
- reportingGo · read replica
- webTypeScript
- transferSFTP · signed
30 дней на систему около миллиона строк, разбитых на фазы
Как идёт работа
- 01дни 1–4
Составить карту
Граф вызовов, задания по расписанию, внешние интерфейсы и измеренный список того, что мертво. Оценки промахиваются, потому что кто-то считает строки вместо того, чтобы выяснить, какие из них ещё исполняются.
- 02дни 3–9
Поставить шов
Граница, через которую проходит трафик, чтобы старая и новая реализации работали рядом и сравнивались. Для пользователя на этом шаге ничего не меняется.
- 03основная часть проекта
Переносить модуль за модулем
Каждый модуль выкатывается за швом, переигрывается на записанном продовом трафике и забирает настоящий трафик, когда выходы совпали. Вместе с багами, потому что какие из них чинить, решается отдельным разговором с бизнесом.
- 043–7 дней на подсистему
Вывести из эксплуатации
Старый код удалён, лицензии отменены, серверы выключены. Миграция, после которой старая система осталась работать, удвоила вам поддержку вместо того, чтобы закончиться.
Что делает платформа, что делает человек
| Что делает платформа, что делает человек | Кто делает | Примечания |
|---|---|---|
| Читает всю кодовую базу и строит граф вызовов | Платформа | Включая диалект, который никто не поддерживает, и файл, который генерируется с 2009 года. |
| Находит мёртвый код | Платформа | Статическая достижимость плюс продовые трассы, если вы можете дать период. |
| Переводит модуль | Платформа | Первый проход машинный, дальше читается как пул-реквест и переписывается руками там, где ревьюер не может за ним уследить. |
| Решает, где баг, а где правило | Инженер | Система округляет одинаково двенадцать лет, и кто-то ниже по течению на этом построился. |
| Стенд сравнения | Вместе | Запись и переигрывание наши. Какие расхождения допустимы, решает и подписывает ваша сторона. |
| Миграция и сверка данных | Вместе | Строки, которые не сходились в старой базе, не сойдутся и в новой. |
| Переключение и откат | Инженер | Даты, дежурство и точка, на которой мы договорились возвращаться назад. |
Что мы уже переносили
Десятки миграций и больше десяти лет внутри legacy-кода. Клиенты на VB6 и Delphi в браузер, Classic ASP и ColdFusion на Go, монолиты на PHP 4 и 5 в типизированные сервисы, cron-скрипты на Perl и пакеты PL/SQL в сервисы с тестами, Oracle Forms в веб, Java старше Maven в проект, который новичок собирает в первое же утро. Ваш диалект наши инженеры уже встречали, включая те его части, которые никто не записал.
Первая фаза намеренно достаточно мала, чтобы стать проверкой нас: один модуль через шов, переигранный на вашем трафике, и отчёт о расхождениях у вас на столе. Вы видите, как мы работаем, ценой одной фазы, а не года.
Вопросы, которые задают инженеры
- Можно ли выпускать фичи во время переписывания?
- Да, и это главная причина, по которой всё идёт дольше, чем переписывание с нуля. Фичи едут в старые модули, пока каждый из них не перенесён, а стенд сравнения ловит те, что поменялись под нами.
- Почему не отрефакторить то, что есть?
- Иногда рефакторинг и есть правильный ответ, и вы услышите это на первом созвоне. Переписывание выигрывает, когда рантайм снят с поддержки, тулчейн существует на одной машине или вы не можете нанять никого, кто согласится это трогать. Мы делаем и то и другое, поэтому ответ здесь не позиция продавца.
- А если мы остановимся на середине?
- У вас останется система, часть которой на Go, а часть та, что была, с документированной границей между ними. В этом состоянии можно жить, и некоторые сидят в нём год, пока освобождается бюджет.
- Машинный перевод даёт код, который мы примем?
- Построчный перевод не даёт, поэтому мы его и не отдаём. Каждый модуль перегенерируется в идиоматичный Go, читается как обычный пул-реквест и переписывается руками, когда ревьюер не может за ним уследить. Первый модуль вы можете отревьюить сами, прежде чем мы продолжим.
- Как вы это оцениваете?
- По измеренным размерам модулей, связности и доле кода, до которого вообще доходит исполнение. Аудит даёт диапазон, план по фазам и цены напротив них за три-пять дней.
Начните с одного модуля
Для начала хватит грубого описания: что за система, какого размера и что давит на дату. Обратно приходит план по фазам, и первая достаточно мала, чтобы утвердить её без комитета.
Десять минут, если ответы под рукой. Отправить можно до того, как вы что-то решили.