Kaique Mitsuo Silva Yamamoto
IaDesenvolvimento com ia

Migração de Código Legado com IA — Guia Prático

Como usar IA para migrar, modernizar e refatorar código legado. Estratégias incrementais, testes de segurança e como evitar regressões.

Migrar código legado é a tarefa onde IA gera mais valor — e mais risco. O código legado geralmente não tem testes, tem dependências antigas, e ninguém lembra como funciona. A IA pode acelerar a migração 10x, mas sem estratégia, pode criar 10x mais bugs.


Os 4 tipos de migração

TipoExemploRiscoValor da IA
LinguagemJavaScript → TypeScriptAltoMuito alto
FrameworkExpress → FastifyMédioAlto
VersãoNode 16 → Node 22BaixoMédio
ArquiteturaMonolito → MicroservicesMuito altoAlto

Estratégia: o "Strangler Fig"

Nunca reescreva tudo de uma vez. Use o padrão Strangler Fig — substitua peça por peça, mantendo o sistema funcionando.

Antes:          Durante:              Depois:
┌─────────┐    ┌─────────┬────────┐   ┌───────────┐
│  Legacy  │ →  │ Legacy  │  New   │ → │   New     │
│  (100%)  │    │  (70%)  │ (30%)  │   │  (100%)   │
└─────────┘    └─────────┴────────┘   └───────────┘

Passo a passo

  1. Mapear dependências — a IA lê o código legado e gera mapa de dependências
  2. Criar testes de aceitação — testes que validam comportamento atual (antes de mudar)
  3. Migrar um módulo — a IA migra + gera testes unitários
  4. Validar — rodar testes de aceitação + testes unitários
  5. Deploy — deploy do módulo migrado
  6. Repetir — próximo módulo

Prompt para mapear dependências

Analyze the codebase in src/legacy/ and generate:

1. A dependency graph (which files import which)
2. A list of external dependencies (npm packages, APIs, databases)
3. A risk assessment for each module (high/medium/low)
4. Suggested migration order (start with lowest risk, highest isolation)

Output: docs/migration-plan.md

Prompt para gerar testes de aceitação

Read src/legacy/api/users.js and generate acceptance tests that
capture the CURRENT behavior (not the ideal behavior).

Requirements:
- Test all public functions
- Test edge cases: empty input, null, invalid types
- Use descriptive names: "currently returns 200 even with invalid email"
- These tests will be the baseline — if they pass after migration, behavior is preserved

Output: src/__tests__/legacy/users-acceptance.test.ts

Prompt para migrar módulo

Migrate src/legacy/api/users.js to TypeScript.

Context:
- Target: src/api/users.ts
- Stack: TypeScript, Express, Prisma
- Acceptance tests: src/__tests__/legacy/users-acceptance.test.ts

Process:
1. Read the legacy file and acceptance tests
2. Create the new TypeScript file
3. Write unit tests for the new implementation
4. Run BOTH acceptance tests and unit tests
5. If any test fails, fix until all pass
6. Do NOT change behavior — only type safety and code quality

Constraints:
- Same function signatures (or document changes)
- Same error codes and response formats
- Same database queries (convert to Prisma syntax)

Erros comuns em migração

ErroConsequênciaCorreção
Reescrever tudo de uma vezSistema para de funcionarStrangler Fig — módulo por módulo
Sem testes de aceitaçãoComportamento muda sem perceberGerar testes ANTES de migrar
Migrar sem mapear dependênciasQuebra imports em cascataMapear primeiro, migrar depois
Mudar comportamento durante migraçãoBugs + regressãoMigrar = mesmo comportamento, novo código
Não versionar migraçõesRollback impossívelGit branch por módulo

On this page