A Uber publicou um relato de como migraram 75.000+ classes de teste e 1,25 milhão de linhas de código de teste em seu monorepo Java de JUnit 4 para JUnit 5, e o detalhe principal para qualquer equipe construtora atualmente pesando refatoração assistida por IA é que a Uber escolheu explicitamente não usar IA generativa para a transformação. Seu raciocínio declarado, citado no relato: «Ferramental de transformação determinístico era crítico para consistência nesta escala», e abordagens baseadas em LLM «produziam resultados inconsistentes em padrões de teste customizados». Em vez disso, a equipe construiu sobre OpenRewrite, o framework open-source de transformação semântica de código que opera sobre árvores semânticas sem perda em vez de texto cru, com receitas customizadas mirando classes base e executores de teste específicos da Uber. Eles pareou isso com uma camada de compatibilidade de execução unificada (JUnit Platform rodando Vintage e Jupiter simultaneamente, para que repos parcialmente migrados continuassem funcionando), verificações de pré-condição para bloquear migrações parciais, e um sistema interno de orquestração chamado Shepherd que distribuiu transformações em milhares de alvos Bazel em paralelo e validou cada um via CI.
A realidade técnica por trás da escolha é mais interessante do que o enquadramento LLM-versus-não-LLM sugere. Na escala Uber, o modo de falha que mais importa é inconsistência silenciosa: uma transformação que funciona em 99,5% dos arquivos e silenciosamente destrói 0,5% cria 375 classes de teste quebradas, cada uma das quais precisa ser diagnosticada e consertada à mão. Receitas OpenRewrite são determinísticas; dado o mesmo AST de entrada e a mesma receita, você obtém a mesma saída a cada execução, e as transformações são expressáveis como visitantes componíveis sobre uma árvore semântica tipada. Transformação de código baseada em LLM, em contraste, é não-determinística no nível de token e especialmente sofre com padrões raros que ela não viu frequentemente nos dados de treinamento, que é exatamente onde os executores de teste customizados e hierarquias de classes base da Uber vivem. O artigo do InfoQ nota que execuções iniciais do Shepherd fizeram emergir falhas de build e teste que informaram atualizações na lógica de transformação; esse é o ciclo de iteração que você realmente pode rodar com ferramental determinístico porque as falhas são reprodutíveis. Com um LLM, você reroda o mesmo prompt e obtém um erro ligeiramente diferente, o que é muito mais difícil de diagnosticar em escala.
A implicação mais ampla para a narrativa de ferramentas de codificação por IA vale a pena ser preciso. A Uber não está dizendo que LLMs não podem fazer transformação de código; estão dizendo que para essa classe específica de problema (alto volume, mecânico-mas-rico-em-padrões, crítico para correção), ferramental determinístico venceu. Isso bate com o que os próprios laboratórios de fronteira fazem internamente: reescritas de codebase em larga escala no Google, Meta, e Microsoft têm sido por anos feitas com ferramentas de refatoração determinísticas (motores de reescrita, jscodeshift, transformações estilo gofmt, Comby, OpenRewrite), com LLMs usados seletivamente para a cauda longa de padrões que receitas determinísticas não podem expressar. O enquadramento na imprensa tech de «IA substitui refatoração de código» entende isso ao contrário: em escala o assistente de IA está na escrita de receitas e tratamento de casos extremos, não na passada de transformação em massa. A economia também favorece o determinismo para uma migração única: escrever uma receita é custo fixo que amortiza em 75.000 arquivos, enquanto rodar um LLM sobre 75.000 arquivos é custo variável que escala linearmente e produz saída que você ainda precisa verificar.
Para times construtores, a conclusão acionável é pensar nas suas tarefas de refatoração em três baldes. Primeiro, transformações mecânicas de padrões com regras finitas bem definidas: renomear API, atualizar imports, troca de anotação, migração de versão JUnit. Isso pertence a ferramentas AST determinísticas, ponto, e o relato da Uber é o caso de estudo recente mais claro de como isso se parece em escala. Segundo, refatorações semânticas com chamadas de julgamento: extrair uma abstração, renomear para clareza, reestruturar fluxo de controle. É aqui que ferramentas de codificação assistida por IA ganham o sustento, porque as edições são locais, revisáveis, e a flexibilidade do LLM ajuda onde receitas rígidas quebram. Terceiro, trabalho de correção de bugs ou de feature com refatoração embutida: esse é o ponto doce das ferramentas de codificação agênticas, onde o modelo pode ler o contexto circundante e adaptar. O erro a evitar é usar uma ferramenta de um balde para um trabalho de outro. A escolha da Uber de enviar 1,25M linhas de migração mecânica no OpenRewrite, com loop CI determinístico e orquestração paralela, é a resposta certa para o balde um, e vale ter em mente da próxima vez que alguém propor jogar Claude ou GPT em um refactor de um milhão de linhas.
