reescrita de sistemas
Modernização de legado: VB6, Delphi, PHP e ColdFusion em Go
Existe um servidor no seu prédio que ninguém tem coragem de reiniciar, e todo mundo sabe qual é. PHP 5.6, VB6, Delphi, ColdFusion, Classic ASP, Perl, Oracle Forms, um monólito Java que já sobreviveu a três CTOs: reescrevemos tudo isso em Go, Rust e TypeScript com o sistema antigo servindo produção o tempo inteiro, e uma bancada de paridade prova que o novo dá as mesmas respostas sobre o seu próprio tráfego gravado. Um milhão de linhas em trinta dias, e o seu time não para de entregar.
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
Que sistema é, qual o tamanho e o que está forçando a data — com isso já sai um plano em fases com preço em cada uma, e a primeira é pequena o bastante para aprovar sem comitê. Aprovou, começamos na mesma semana.
Dez minutos se você tiver as respostas à mão. Dá para mandar antes de ter decidido qualquer coisa.