Copilot em Rust: a estratégia de migração importa mais que as linhas geradas
O GitHub substituiu o runtime gradualmente, usando N-API e testes existentes. O aprendizado está na equivalência e nas fronteiras de execução.
O GitHub migrou mais de 800 mil linhas do runtime do Copilot de TypeScript e Node.js para Rust, com assistência de IA, em aproximadamente 14,5 semanas e 128 pull requests.[9] A mudança aconteceu enquanto o produto continuava recebendo lançamentos, com substituição gradual de componentes e integração temporária por N-API.[9] O interesse técnico não está só na escala da geração de código: está em manter um sistema funcionando durante a troca.
O que muda para quem desenvolve
A arquitetura anterior exigia Node.js e V8 e atravessava uma fronteira entre processos, acrescentando, segundo o GitHub, aproximadamente 100 MB de memória de trabalho por cliente.[9] O núcleo Rust pode ser incorporado por uma ABI C, mantendo também execução em processo separado.[9]
No cenário medido de inicialização, criação de sessão e um turno de interação, o tempo caiu de 5,25 segundos para 292 milissegundos com o runtime incorporado.[9] Minha leitura: seria errado atribuir tudo à linguagem sem considerar a alteração de arquitetura. Recomendo medir onde o custo ocorre antes de escolher a ferramenta para removê-lo.
A ponte N-API permitiu que testes de ponta a ponta existentes exercitassem os componentes novos enquanto partes antigas permaneciam em produção.[9] Compilação, testes e revisão humana encontraram regressões de comportamento, estado, tempo de vida de objetos e semântica de bibliotecas.[9] Portanto, compilar é uma etapa de validação, não uma demonstração de equivalência.
Como aplicar
Escolha um componente com interface pequena e um custo mensurável. Registre o comportamento atual antes de substituí-lo: entradas, saídas, erros, efeitos laterais e regras de cancelamento relevantes. Não comece pela quantidade de linhas que um agente consegue traduzir.
Crie um conjunto de casos que ambas as implementações possam executar. Compare resultados e estados finais, incluindo falha parcial, repetição de chamadas e interrupção. Para saídas variáveis, defina previamente o que pode diferir sem violar o contrato.
Depois, proponha uma ponte temporária e um caminho de retorno. Faça mudanças suficientemente pequenas para que uma divergência possa ser atribuída a um conjunto limitado de decisões. O critério de avanço deve combinar equivalência e a métrica que motivou a migração, como memória ou inicialização.
Só retire a implementação anterior quando os chamadores relevantes estiverem cobertos. Trate também a remoção da ponte como uma mudança testável, não como limpeza sem risco.
Cuidados e limites
Durante a migração saíram 135 versões, incluindo 35 estáveis e 100 de pré-lançamento.[9] Esse número descreve a operação do GitHub; não é um prazo nem uma capacidade transferível para outra equipe.
O ganho de tempo corresponde ao cenário específico medido, não a toda interação possível do Copilot.[9] A análise prática é preservar o escopo do resultado. Uma migração menor, com contrato verificável e rollback, pode ser mais valiosa do que uma reescrita completa justificada por um benchmark distante da sua aplicação.
A ponte temporária também tem custo de manutenção. Aceite esse custo apenas com critérios claros para removê-la. Incremental não significa manter duas implementações para sempre.
Fonte
[9] Fonte: InfoQ