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.
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
Como o trabalho anda
- 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.
- 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.
- 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.
- 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
| O que a plataforma faz e o que uma pessoa faz | Quem faz | Notas |
|---|---|---|
| Ler a base inteira e montar o grafo de chamadas | Plataforma | Incluindo o dialeto que ninguém suporta e o arquivo que é gerado desde 2009. |
| Achar código morto | Plataforma | Alcançabilidade estática, mais traces de produção quando você consegue nos dar um período deles. |
| Traduzir um módulo | Plataforma | A 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 é regra | Engenheiro | O sistema arredonda do mesmo jeito há doze anos e alguém rio abaixo construiu em cima disso. |
| A bancada de paridade | Os dois | Captura 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 dados | Os dois | As linhas que nunca fecharam no banco antigo também não fecham no novo. |
| Virada e rollback | Engenheiro | Datas, 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ê.
Dez minutos se você tiver as respostas à mão. Dá para mandar antes de ter decidido qualquer coisa.