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

десятки миграций

Java, Python, COBOL и VB6 переписываем на Go, Rust и TypeScript за 30 дней

Не только мейнфрейм. Java-монолит, размазанный по восьми серверам, Python, упёршийся в GIL, сервис на Node, который съедает память быстрее, чем отвечает на запросы, — всё это становится Go и Rust, и счёт за инфраструктуру падает вместе с ними. А ещё COBOL на z/OS, RPG на AS/400, VB6 и Delphi на рабочих местах, ColdFusion и PHP в вебе, Perl, PL/SQL, Fortran и ABAP. Платформа читает весь код и переписывает его, инженеры забирают места, где ошибка стоит дорого, а старая система всё это время продолжает работать.

Четыре экрана, минут десять. Инженер читает и возвращается с объёмом, датой и ценой — без демо и без цепочки писем.

30
дней — потолок на любой проект
20
legacy-стеков переносим
10+
лет внутри чужих систем
1M+
строк в одной переписке

Всё, что мы снимаем с аппарата

Десятки миграций по всем стекам ниже — от Java-монолита, который жжёт восемь серверов, до COBOL, который с 2011 года никто не компилировал. Каждая доходит до продакшена за тридцать дней. Найдите свой и посмотрите, из чего состоит переезд.

Один настоящий граф зависимостей

Это Go-сервис, который работает в проде. Имена пакетов заменены на M01–M45, структура осталась ровно такой, какая есть. Потяните ползунок, и граф проедет путь от того, как код лежит сегодня, до того, как он распадается по доменным границам. Класс каждого узла следует из самого графа: модуль, который целиком помещается в один домен, переносится механически, а за модуль, который держат четыре домена, садится инженер и режет границу руками.

Как лежит сегодня

Механический перенос60%

Границу режет инженер29%

Кандидат на удаление11%

45 модулей, 167 зависимостей и 45,990 строк в 7 доменах. Настоящий граф сервиса из прода, имена пакетов сняты, других правок нет. Три класса посчитаны по структуре самого графа.
Тот же граф таблицей
Отсортировано по размеру. Модуль идёт механически, если лежит внутри одного домена. Он уходит инженеру, если от него зависят три домена и больше или он попал в цикл. И становится кандидатом на удаление, если его никто не импортирует и он не точка входа.
МодульСтрокИмпортируют егоИмпортируетДоменКласс
M01326loc010S01Механический перенос
M02142loc03S02Механический перенос
M0355loc03S02Механический перенос
M0489loc03S02Механический перенос
M055,194loc315S03Границу режет инженер
M06239loc51S03Границу режет инженер
M07884loc200S03Границу режет инженер
M08485loc46S03Механический перенос
M099,835loc47S03Границу режет инженер
M10514loc20S03Механический перенос
M11677loc15S03Механический перенос
M12236loc411S03Границу режет инженер
M13187loc33S04Границу режет инженер
M14454loc11S05Механический перенос
M1558loc31S05Механический перенос
M16356loc42S05Механический перенос
M17247loc42S05Механический перенос
M1859loc31S04Границу режет инженер
M19139loc00S04Кандидат на удаление
M20330loc132S04Границу режет инженер
M21414loc11S06Механический перенос
M221,670loc33S06Механический перенос
M231,218loc180S06Границу режет инженер
M242,574loc153S06Границу режет инженер
M25163loc41S04Границу режет инженер
M26251loc25S04Механический перенос
M27161loc12S04Механический перенос
M2899loc20S04Механический перенос
M2945loc00S04Кандидат на удаление
M3025loc00S04Кандидат на удаление
M311,417loc240S04Границу режет инженер
M3282loc10S04Механический перенос
M3330loc41S04Границу режет инженер
M34141loc31S03Механический перенос
M3579loc11S03Механический перенос
M363,036loc310S03Механический перенос
M37173loc11S03Механический перенос
M382,501loc19S03Механический перенос
M391,452loc34S03Механический перенос
M4050loc11S03Механический перенос
M412,148loc09S01Кандидат на удаление
M42167loc01S01Кандидат на удаление
M434,873loc215S07Механический перенос
M442,241loc110S07Механический перенос
M45474loc213S07Механический перенос

как это устроено

Миллион строк — это обычный размер работы

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

    Система никогда не написана на одном языке. COBOL зовёт JCL, JCL запускает утилиту на C, скрипт на Perl правит файл до того, как его заберёт PL/SQL. Платформа разбирает всё это параллельно и держит один граф на всём — поэтому на стыках языков ничего не выпадает.

  • Меньше машин под ту же нагрузку

    Сервис на Java или Python, переписанный на Go, обычно занимает долю прежней памяти и долю прежних инстансов, а ядро на Rust превращает батчевое окно в перерыв на кофе. Ради этого и трогают код, который не сломан: то же поведение при меньшем счёте и запас, который больше не надо покупать.

  • Миллион строк и больше

    Это размер, под который мы планируем, а не потолок. Выше — делим оценку и считаем цену первой части отдельно. Объём здесь вопрос графика, а не выполнимости.

  • Поведение то же, архитектура другая

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

  • Воздушный зазор, на вашем железе или на нашем

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

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

Что мы берём

Восемь страниц, потому что эту работу покупают под восемью разными названиями. Работа под ними одна и та же.

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

Четыре этапа, одинаковые на миллионе строк COBOL и на PHP-монолите. Первые два и есть аудит, и карта в любом случае остаётся у вас.
  1. 01

    Доступ на чтение

    Копия репозитория только на чтение, скрипты сборки и те runbook'и, что уцелели. Если у вас так принято, сначала подписываем ваш NDA.

  2. 02

    Карта

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

  3. 03

    Переписывание кусками

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

  4. 04

    Передача

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

Начните с карты

Карта - самое дешёвое, что мы продаём, и единственная надёжная основа для цены на всё остальное. Расскажите, что у вас работает, а мы вернёмся с тем, что внутри, во что обойдётся переписывание и сколько оно стоит.

Форма уходит к нам, а не в цепочку писем. Чтобы получить ответ, высиживать демо не придётся.