десятки миграций
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, Python, Node12–20 days
Java / Spring Boot
Go
- Переносит машина
- services, JPA entities, REST controllers
- Решает инженер
- what the framework was doing for you
- Java, Python, Node10–18 days
Python / Django
Go
- Переносит машина
- views, models, Celery tasks
- Решает инженер
- the parts that were fast because of C extensions
- Java, Python, Node8–15 days
Node.js services
Go
- Переносит машина
- routes, middleware, ORM models
- Решает инженер
- where dynamic typing hid a contract
- Java, Python, Node12–21 days
Ruby on Rails
Go
- Переносит машина
- controllers, ActiveRecord, background jobs
- Решает инженер
- metaprogramming nobody can grep for
- Java, Python, Node12–20 days
C# / .NET Framework
Go
- Переносит машина
- services, EF models, WCF endpoints
- Решает инженер
- Windows-only assumptions
- Java, Python, Node7–14 days
Python number crunching
Rust
- Переносит машина
- hot loops, array code, serialization
- Решает инженер
- which precision the result actually needs
- Мейнфрейм21–30 days
COBOL on z/OS
Go
- Переносит машина
- programs, copybooks, packed decimal
- Решает инженер
- CICS screens, job ordering
- Мейнфрейм7–14 days
JCL batch
Go + scheduler
- Переносит машина
- job steps, dataset flow
- Решает инженер
- the dependency graph between streams
- Данные7–12 days
VSAM + DB2
Postgres
- Переносит машина
- record layouts, indexes
- Решает инженер
- what the copybook meant by a filler field
- AS/40018–28 days
RPG on AS/400
Go
- Переносит машина
- RPGLE, DDS, service programs
- Решает инженер
- green screens, OPM leftovers
- Десктоп10–18 days
VB6 desktop
TypeScript
- Переносит машина
- forms, business rules, COM calls
- Решает инженер
- what the ActiveX control did
- Десктоп14–24 days
Delphi 7
Go + TypeScript
- Переносит машина
- units, VCL forms, DB access
- Решает инженер
- third-party components with no source
- Веб8–16 days
ColdFusion
TypeScript
- Переносит машина
- CFML templates, queries, scheduled tasks
- Решает инженер
- tags no one documented
- Веб12–21 days
PHP 5.x monolith
Go
- Переносит машина
- controllers, models, cron jobs
- Решает инженер
- where the framework ends and the business starts
- Веб5–10 days
Perl scripts
Go
- Переносит машина
- scripts, regex-heavy parsing
- Решает инженер
- undocumented file formats
- Данные9–18 days
PL/SQL packages
Go + Postgres
- Переносит машина
- procedures, cursors, triggers
- Решает инженер
- business rules hidden in triggers
- Десктоп7–12 days
Access + Excel
Go + web client
- Переносит машина
- queries, forms, macros
- Решает инженер
- the spreadsheet that is really the spec
- Веб12–22 days
One deployable
Services
- Переносит машина
- module boundaries, call graph
- Решает инженер
- where to cut the shared schema
- Данные10–20 days
Fortran
Rust
- Переносит машина
- numeric kernels, array layout
- Решает инженер
- floating-point behaviour that must not change
- Данные9–18 days
ABAP reports
Go
- Переносит машина
- report logic, selection screens
- Решает инженер
- what the SAP tables actually contain
Один настоящий граф зависимостей
Как лежит сегодня
Механический перенос60%
Границу режет инженер29%
Кандидат на удаление11%
Тот же граф таблицей
| Модуль | Строк | Импортируют его | Импортирует | Домен | Класс | |
|---|---|---|---|---|---|---|
| M01 | 326 | loc | 0 | 10 | S01 | Механический перенос |
| M02 | 142 | loc | 0 | 3 | S02 | Механический перенос |
| M03 | 55 | loc | 0 | 3 | S02 | Механический перенос |
| M04 | 89 | loc | 0 | 3 | S02 | Механический перенос |
| M05 | 5,194 | loc | 3 | 15 | S03 | Границу режет инженер |
| M06 | 239 | loc | 5 | 1 | S03 | Границу режет инженер |
| M07 | 884 | loc | 20 | 0 | S03 | Границу режет инженер |
| M08 | 485 | loc | 4 | 6 | S03 | Механический перенос |
| M09 | 9,835 | loc | 4 | 7 | S03 | Границу режет инженер |
| M10 | 514 | loc | 2 | 0 | S03 | Механический перенос |
| M11 | 677 | loc | 1 | 5 | S03 | Механический перенос |
| M12 | 236 | loc | 4 | 11 | S03 | Границу режет инженер |
| M13 | 187 | loc | 3 | 3 | S04 | Границу режет инженер |
| M14 | 454 | loc | 1 | 1 | S05 | Механический перенос |
| M15 | 58 | loc | 3 | 1 | S05 | Механический перенос |
| M16 | 356 | loc | 4 | 2 | S05 | Механический перенос |
| M17 | 247 | loc | 4 | 2 | S05 | Механический перенос |
| M18 | 59 | loc | 3 | 1 | S04 | Границу режет инженер |
| M19 | 139 | loc | 0 | 0 | S04 | Кандидат на удаление |
| M20 | 330 | loc | 13 | 2 | S04 | Границу режет инженер |
| M21 | 414 | loc | 1 | 1 | S06 | Механический перенос |
| M22 | 1,670 | loc | 3 | 3 | S06 | Механический перенос |
| M23 | 1,218 | loc | 18 | 0 | S06 | Границу режет инженер |
| M24 | 2,574 | loc | 15 | 3 | S06 | Границу режет инженер |
| M25 | 163 | loc | 4 | 1 | S04 | Границу режет инженер |
| M26 | 251 | loc | 2 | 5 | S04 | Механический перенос |
| M27 | 161 | loc | 1 | 2 | S04 | Механический перенос |
| M28 | 99 | loc | 2 | 0 | S04 | Механический перенос |
| M29 | 45 | loc | 0 | 0 | S04 | Кандидат на удаление |
| M30 | 25 | loc | 0 | 0 | S04 | Кандидат на удаление |
| M31 | 1,417 | loc | 24 | 0 | S04 | Границу режет инженер |
| M32 | 82 | loc | 1 | 0 | S04 | Механический перенос |
| M33 | 30 | loc | 4 | 1 | S04 | Границу режет инженер |
| M34 | 141 | loc | 3 | 1 | S03 | Механический перенос |
| M35 | 79 | loc | 1 | 1 | S03 | Механический перенос |
| M36 | 3,036 | loc | 3 | 10 | S03 | Механический перенос |
| M37 | 173 | loc | 1 | 1 | S03 | Механический перенос |
| M38 | 2,501 | loc | 1 | 9 | S03 | Механический перенос |
| M39 | 1,452 | loc | 3 | 4 | S03 | Механический перенос |
| M40 | 50 | loc | 1 | 1 | S03 | Механический перенос |
| M41 | 2,148 | loc | 0 | 9 | S01 | Кандидат на удаление |
| M42 | 167 | loc | 0 | 1 | S01 | Кандидат на удаление |
| M43 | 4,873 | loc | 2 | 15 | S07 | Механический перенос |
| M44 | 2,241 | loc | 1 | 10 | S07 | Механический перенос |
| M45 | 474 | loc | 2 | 13 | S07 | Механический перенос |
как это устроено
Миллион строк — это обычный размер работы
Все языки дерева одновременно
Система никогда не написана на одном языке. COBOL зовёт JCL, JCL запускает утилиту на C, скрипт на Perl правит файл до того, как его заберёт PL/SQL. Платформа разбирает всё это параллельно и держит один граф на всём — поэтому на стыках языков ничего не выпадает.
Меньше машин под ту же нагрузку
Сервис на Java или Python, переписанный на Go, обычно занимает долю прежней памяти и долю прежних инстансов, а ядро на Rust превращает батчевое окно в перерыв на кофе. Ради этого и трогают код, который не сломан: то же поведение при меньшем счёте и запас, который больше не надо покупать.
Миллион строк и больше
Это размер, под который мы планируем, а не потолок. Выше — делим оценку и считаем цену первой части отдельно. Объём здесь вопрос графика, а не выполнимости.
Поведение то же, архитектура другая
Стенд сверки прогоняет ваш записанный боевой трафик через старую и новую систему и сравнивает до копейки. Меняется форма: сервисы с владельцами, читаемая схема, тесты, написанные вместе с кодом, и выкладка, которой не нужно окно обслуживания.
Воздушный зазор, на вашем железе или на нашем
Там, где требует регулятор, модели даём мы, и они работают внутри вашего периметра вообще без исходящих соединений. Если машин под них нет, мы сдаём вам свои, и они стоят у вас. Ничему из вашего кода не нужно покидать здание.
Ваше облако, ваш дата-центр, VPN заказчика или комната вообще без сети — под каждый из вариантов есть рабочая схема, а подробности идут в договор.
Что мы берём
- AI-разработкаАгент, типизированный слой инструментов вокруг него и набор проверок, который держит его честным в CI.
- Разработка на заказНастоящая система там, где сейчас работают таблица Excel, база Access и три терпеливых человека.
- МодернизацияPHP 5, VB6, Delphi и ColdFusion переезжают на Go и TypeScript, пока старая система продолжает работать.
- Мейнфрейм и AS/400COBOL, JCL, CICS и VSAM уходят с z/OS, батч и зелёные экраны собираются заново как сервисы.
- AI-агентыАгенты ведут бизнес-процесс, а всё необратимое подтверждает человек, у которого есть имя.
- Аудит системыКарта кода, ранжированный реестр рисков и план миграции по фазам с ценой напротив каждой.
- AI-консалтингДва или три сценария, которые стоит строить, измеренная точка отсчёта и решение build or buy по каждому.
- Разделение монолитаОдин деплой на общей схеме разрезается на сервисы, которые релизятся по своему расписанию.
Как идёт работа
- 01
Доступ на чтение
Копия репозитория только на чтение, скрипты сборки и те runbook'и, что уцелели. Если у вас так принято, сначала подписываем ваш NDA.
- 02
Карта
Платформа разбирает всё это и докладывает, что там на самом деле: модули и зависимости между ними, код, который никто уже не вызывает, задания по расписанию, о которых никто не написал ни строчки, и то место, где сборка идёт только на одной машине. Карта приходит до того, как начнётся переписывание.
- 03
Переписывание кусками
По одному ограниченному модулю за раз, с тестами, написанными по поведению оригинала. Старое и новое крутятся на одних и тех же входах, пока выходы не совпадут, и только потом переезжает трафик. Ничего не переключается одной датой.
- 04
Передача
Ваши инженеры получают репозиторий, тесты, написанные по дороге, и карту, которую мы держали в актуальном состоянии. Дальше мы отвечаем на вопросы, и у нас не остаётся ни одного ключа, который вы не можете отозвать.
Начните с карты
Карта - самое дешёвое, что мы продаём, и единственная надёжная основа для цены на всё остальное. Расскажите, что у вас работает, а мы вернёмся с тем, что внутри, во что обойдётся переписывание и сколько оно стоит.
Форма уходит к нам, а не в цепочку писем. Чтобы получить ответ, высиживать демо не придётся.