К содержимому

модернизация 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 дней на систему около миллиона строк, разбитых на фазы

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

Как идёт работа

Ничего не переключается, пока новый модуль не выдаст тот же результат, что и старый, на вашем собственном трафике.
  1. 01дни 1–4

    Составить карту

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

  2. 02дни 3–9

    Поставить шов

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

  3. 03основная часть проекта

    Переносить модуль за модулем

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

  4. 043–7 дней на подсистему

    Вывести из эксплуатации

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

Что делает платформа, что делает человек

Перевод - машинная работа, и мы делаем её на машинной скорости. Что код должен означать, решает человек, и там наши инженеры отрабатывают свои деньги.
Машинный перевод без ревью даёт код, за который никто не возьмётся. Каждый модуль проходит через человека до того, как заберёт трафик.
Что делает платформа, что делает человекКто делаетПримечания
Читает всю кодовую базу и строит граф вызововПлатформаВключая диалект, который никто не поддерживает, и файл, который генерируется с 2009 года.
Находит мёртвый кодПлатформаСтатическая достижимость плюс продовые трассы, если вы можете дать период.
Переводит модульПлатформаПервый проход машинный, дальше читается как пул-реквест и переписывается руками там, где ревьюер не может за ним уследить.
Решает, где баг, а где правилоИнженерСистема округляет одинаково двенадцать лет, и кто-то ниже по течению на этом построился.
Стенд сравненияВместеЗапись и переигрывание наши. Какие расхождения допустимы, решает и подписывает ваша сторона.
Миграция и сверка данныхВместеСтроки, которые не сходились в старой базе, не сойдутся и в новой.
Переключение и откатИнженерДаты, дежурство и точка, на которой мы договорились возвращаться назад.

Что мы уже переносили

Десятки миграций и больше десяти лет внутри legacy-кода. Клиенты на VB6 и Delphi в браузер, Classic ASP и ColdFusion на Go, монолиты на PHP 4 и 5 в типизированные сервисы, cron-скрипты на Perl и пакеты PL/SQL в сервисы с тестами, Oracle Forms в веб, Java старше Maven в проект, который новичок собирает в первое же утро. Ваш диалект наши инженеры уже встречали, включая те его части, которые никто не записал.


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

Вопросы, которые задают инженеры

Можно ли выпускать фичи во время переписывания?
Да, и это главная причина, по которой всё идёт дольше, чем переписывание с нуля. Фичи едут в старые модули, пока каждый из них не перенесён, а стенд сравнения ловит те, что поменялись под нами.
Почему не отрефакторить то, что есть?
Иногда рефакторинг и есть правильный ответ, и вы услышите это на первом созвоне. Переписывание выигрывает, когда рантайм снят с поддержки, тулчейн существует на одной машине или вы не можете нанять никого, кто согласится это трогать. Мы делаем и то и другое, поэтому ответ здесь не позиция продавца.
А если мы остановимся на середине?
У вас останется система, часть которой на Go, а часть та, что была, с документированной границей между ними. В этом состоянии можно жить, и некоторые сидят в нём год, пока освобождается бюджет.
Машинный перевод даёт код, который мы примем?
Построчный перевод не даёт, поэтому мы его и не отдаём. Каждый модуль перегенерируется в идиоматичный Go, читается как обычный пул-реквест и переписывается руками, когда ревьюер не может за ним уследить. Первый модуль вы можете отревьюить сами, прежде чем мы продолжим.
Как вы это оцениваете?
По измеренным размерам модулей, связности и доле кода, до которого вообще доходит исполнение. Аудит даёт диапазон, план по фазам и цены напротив них за три-пять дней.

Начните с одного модуля

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

Получить оценку

Десять минут, если ответы под рукой. Отправить можно до того, как вы что-то решили.