Ir para o conteúdo

reescrita de sistemas

Modernização de legado: VB6, Delphi, PHP e ColdFusion em Go

PHP 5.6, VB6, Delphi, ColdFusion, Classic ASP, Perl, Oracle Forms, um monólito Java em um servidor que ninguém ousa reiniciar. Reescrevemos módulo a módulo em Go, Rust e TypeScript com o sistema antigo servindo produção o tempo todo, e uma bancada de paridade compara o antigo e o novo sobre o seu próprio tráfego gravado. Trinta dias para um sistema de cerca de um milhão de linhas, em fases nas quais você pode parar.

Pedir orçamentoQuatro telas sobre a stack, a dor e o prazo. Um engenheiro responde, normalmente no mesmo dia.

30 dias para um sistema de cerca de um milhão de linhas, dividido em fases


O despejo em texto puro está riscado porque parte de todo sistema legacy é apagada em vez de portada, e normalmente esse é o trabalho mais barato do projeto.

Hoje

Quatro runtimes, dois deles sem suporte, e um arquivo despejado que ninguém quer olhar.

  • app.phpPHP 5.6
  • legacy.dllVB6
  • reports.cfmColdFusion
  • crystal reportsunsupported
  • ftp-dropplaintext

Depois da virada

Go no núcleo e no caminho de relatórios, TypeScript no front, transferência assinada.

  • coreGo
  • reportingGo · read replica
  • webTypeScript
  • transferSFTP · signed

30 dias para um sistema de cerca de um milhão de linhas, dividido em fases

O despejo em texto puro está riscado porque parte de todo sistema legacy é apagada em vez de portada, e normalmente esse é o trabalho mais barato do projeto.

Como o trabalho anda

Nada é virado antes de o módulo novo produzir a mesma saída que o antigo sobre o seu próprio tráfego.
  1. 01dias 1–4

    Mapear

    Grafo de chamadas, jobs agendados, interfaces externas e uma lista medida do que está morto. As estimativas erram porque alguém contou linhas em vez de descobrir quais linhas ainda executam.

  2. 02dias 3–9

    Colocar a costura

    Uma fronteira por onde o tráfego passa, para que as implementações antiga e nova rodem lado a lado e sejam comparadas. Nada muda para o usuário nesta etapa.

  3. 03o grosso do projeto

    Portar módulo a módulo

    Cada módulo sobe atrás da costura, é reexecutado contra tráfego de produção gravado e assume tráfego real quando as saídas batem. Bugs incluídos, porque quais deles corrigir é outra conversa, com a área de negócio.

  4. 043–7 dias por subsistema

    Desativar

    Código antigo apagado, licenças canceladas, servidores desligados. Uma migração que deixa o sistema antigo rodando dobrou o que você mantém em vez de terminar.

O que a plataforma faz e o que uma pessoa faz

Tradução é trabalho de máquina, e a gente faz na velocidade da máquina. O que o código deveria significar é onde os nossos engenheiros ganham o salário.
Tradução de máquina sem revisão produz código que ninguém vai assumir. Todo módulo passa por uma pessoa antes de receber tráfego.
O que a plataforma faz e o que uma pessoa fazQuem fazNotas
Ler a base inteira e montar o grafo de chamadasPlataformaIncluindo o dialeto que ninguém suporta e o arquivo que é gerado desde 2009.
Achar código mortoPlataformaAlcançabilidade estática, mais traces de produção quando você consegue nos dar um período deles.
Traduzir um móduloPlataformaA primeira passada é saída de máquina, revisada como pull request e reescrita na mão onde o revisor não consegue acompanhar.
Decidir que comportamento é bug e qual é regraEngenheiroO sistema arredonda do mesmo jeito há doze anos e alguém rio abaixo construiu em cima disso.
A bancada de paridadeOs doisCaptura e reexecução são nossas. Quais diferenças são aceitáveis é decisão que o seu lado assina.
Migração e conciliação de dadosOs doisAs linhas que nunca fecharam no banco antigo também não fecham no novo.
Virada e rollbackEngenheiroDatas, plantão e o ponto em que combinamos voltar atrás.

O que já movemos

Dezenas de migrações e mais de dez anos dentro de código legado. Clientes VB6 e Delphi para o navegador, Classic ASP e ColdFusion para Go, monólitos PHP 4 e 5 para serviços tipados, scripts Perl no cron e pacotes PL/SQL para serviços com teste em cima, Oracle Forms para a web, Java anterior ao Maven virando algo que um recém-contratado compila na primeira manhã. Os nossos engenheiros já encontraram o seu dialeto antes, inclusive as partes dele que ninguém escreveu.


A primeira fase é pequena o bastante para servir de teste sobre nós: um módulo através da costura, reexecutado contra o seu próprio tráfego, com o relatório de diferenças na sua frente. Você vê como trabalhamos pelo preço de uma fase, não de um ano.

Perguntas que engenheiros fazem

Dá para continuar entregando features durante a reescrita?
Dá, e é a principal razão de isso levar mais tempo que uma reescrita do zero. O trabalho de feature vai para os módulos antigos até cada um ser portado, e a bancada de paridade pega os que mudaram embaixo de nós.
Por que não refatorar o que temos?
Às vezes essa é a resposta certa, e você ouve isso na primeira conversa. A reescrita ganha quando o runtime perdeu suporte, quando a toolchain só existe em uma máquina ou quando você não consegue contratar ninguém que aceite mexer naquilo. Fazemos os dois tipos de trabalho, então a resposta não é posição de venda.
E se pararmos no meio?
Você fica com um sistema parte em Go, parte no que você tinha, com uma fronteira documentada entre os dois. É um estado real para se viver, e alguns clientes ficam ali um ano enquanto o orçamento libera.
Tradução de máquina produz código que aceitaríamos?
Tradução linha a linha não produz, e por isso não entregamos isso. Cada módulo é regerado em Go idiomático, revisado como qualquer pull request e reescrito na mão quando o revisor não consegue acompanhar. Você pode revisar o primeiro módulo antes de continuarmos.
Como vocês estimam isso?
A partir de tamanhos de módulo medidos, acoplamento e quanto do código é alcançável. O diagnóstico devolve uma faixa, um plano em fases e preço em cima dele em três a cinco dias.

Comece por um módulo

Uma descrição grosseira já basta: que sistema é, que tamanho tem e o que está forçando a data. Você recebe um plano em fases de volta, e a primeira fase é pequena o bastante para aprovar sem comitê.

Pedir orçamento

Dez minutos se você tiver as respostas à mão. Dá para mandar antes de ter decidido qualquer coisa.