agent de IA
agent de IA

IA no Desenvolvimento: Meu copiloto ou piloto automático rumo ao caos?

Meu nome é Jefferson Rodrigues e sou desenvolvedor há mais de 15 anos no universo Java, desde a época em que usávamos applets para imprimir etiquetas em impressoras térmicas (sim, acabei de entregar a idade), até a construção de microsserviços com alta performance.

Já enfrentei muitos desafios: vasculhei a internet nas profundezas do Stack Overflow em busca de soluções para problemas cabeludos, traduzi tutoriais do russo para entender o funcionamento de certos frameworks e criei soluções do zero desde manipular bibliotecas de sistema operacional no Linux para desenvolver drivers compatíveis com a linguagem, até realizar engenharia reversa em DLLs para entender seu funcionamento e produzir documentação que possibilitou a implementação por toda a equipe.

Acho que todo dev tem sua liturgia ao realizar uma demanda, seja uma feature ou um bug. Ambas têm seus rituais, e geralmente existe uma linha lógica para cada uma. A minha funciona mais ou menos assim (de forma resumida):

  1. Entender como deveria funcionar.
  2. Simular o erro relatado.
  3. Analisar o código: Identificar o ponto de entrada. Ver o que está sendo processado. Entender como está sendo processado. Comparar com o resultado esperado. Encontrar o ponto exato do erro.
  4. Corrigir o código.
  5. Simular novamente o resultado.
  6. Aplicar os testes necessários.
  7. Realizar o commit.

Todo o processo é feito de forma quase síncrona. Para seguir para a próxima etapa, é essencial concluir totalmente a anterior. Isso evita dúvidas e, principalmente, rollbacks que atrasam ainda mais o fluxo. Essas etapas podem levar horas, dias ou até meses, dependendo do grau de complexidade da demanda.

Nos últimos meses, testei diversos agentes de IA: Codex, JetBrains Junie, GitHub Copilot e Amazon CodeWhisperer. Entre eles, adotei o JetBrains Junie ou “Abu”, como carinhosamente apelidamos entre os devs, por ser o que mais se integrou de forma natural a diferentes cenários: desde linguagens backend até scripts de infraestrutura para criar e alterar serviços.

Durante minha avaliação, estabeleci alguns pontos-chave para análise da IA:

  1. Entendimento de contexto: Capacidade de compreender o que está sendo desenvolvido, mesmo em blocos parciais de código.
  2. Análise de código: Consegue identificar padrões, erros comuns, más práticas e até sugerir correções automaticamente.
  3. Ponto de delírio: Quando a IA “viaja” e começa a sugerir coisas fora do contexto real. Todo agente tem seu momento de ilusão.

Entendimento de contexto

Durante o processo de entedimento de contexto, solicitei ao agente de IA que examinasse o fluxo de entrada da API /searchByUser, descrevendo:

  • O que o método faz, com detalhes linha por linha;
  • Pontos críticos relacionados a: Regras de negócio; Performance; Acoplamento; Redundâncias; E demais elementos que pudessem impactar a eficiência do fluxo.

Além disso, pedi a geração automática de documentação em formato Markdown, estruturando a explicação de forma clara e úil para devs em revisão de código ou manutenção.

Resultados Obtidos

Cenários onde a IA foi eficiente

Em projetos bem estruturados, os resultados foram excelentes.

Alguns pontos observados:

  • Uso de variáveis de ambiente bem nomeadas e coerentes com suas finalidades;
  • Métodos com até 40 linhas, mantendo coesão;
  • Até 10 chamadas externas no máximo, entre services, repositories e utils;
  • Responsabilidade única bem definida em cada classe;
  • Microsserviços de baixa a média complexidade.

Nesses contextos, a IA conseguiu:

  • Analisar o fluxo com precisão;
  • Reduzir drasticamente o tempo de entendimento do código;
  • Melhorar a qualidade das entregas ao sugerir refatorações claras e viáveis.

Limitações encontradas

Como nem tudo são flores, em projetos legados ou APIs com múltiplas responsabilidades em um único método, a IA apresentou dificuldades.

Entre os principais problemas:

  • Esgotamento rápido do token/contexto em apenas uma execução;
  • Entendimento parcial do processo, devido ao volume e acoplamento excessivo;
  • Ponto de delírio: a IA começou a gerar sugestões fora do escopo do código analisado;
  • Risco de loops cíclicos entre bibliotecas e chamadas recursivas;
  • Alto consumo de tokens, levando a limites da própria ferramenta.

Em Resumo:

O uso de IA para entendimento de fluxo funciona muito bem em:

  • Projetos pequenos e médios;
  • Blocos de código coesos;
  • Códigos com responsabilidades claras e separadas.

Contudo, em projetos grandes, legados ou mal estruturados, o ideal é aplicar a análise de forma progressiva e controlada, em pequenos blocos, com cuidado para não cair em armadilhas como loops cíclicos ou consumo exagerado de contexto.

Analise de Codigo

Durante o processo de análise de código utilizando agentes de IA, identifiquei alguns pontos importantes. A análise é feita exclusivamente sobre o código disponível no contexto, o que pode levar a uma interpretação parcial do método ou da classe. Um exemplo prático disso é quando temos um método que faz um loop para formatar um campo e, em seguida, salva no banco de dados.

Codigo simples:

 List<String> nomes = carregarNomes(); // Ex: ["joão", "maria", ..., "ana"]

        try {
            // Conexão com o banco
            Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/meubanco", "usuario", "senha");

            Statement stmt = conn.createStatement();

            // Loop simples: formata e insere
            for (String nome : nomes) {
                String nomeFormatado = nome.toUpperCase();
                String sql = "INSERT INTO pessoas (nome) VALUES ('" + nomeFormatado + "')";
                stmt.executeUpdate(sql); // Executa 1 por 1
            }

            stmt.close();
            conn.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

Codigo sugerido:

// Lista de nomes simulada
List<String> nomes = carregarNomes(); // Ex: ["joão", "maria", ..., "ana"]

// Define tamanho do chunk
int chunkSize = 100;

// Divide a lista em chunks
List<List<String>> chunks = new ArrayList<>();
for (int i = 0; i < nomes.size(); i += chunkSize) {
    chunks.add(nomes.subList(i, Math.min(i + chunkSize, nomes.size())));
}

// Processa os chunks em paralelo
chunks.parallelStream().forEach(chunk -> {
    try (Connection conn = abrirConexao()) {
        conn.setAutoCommit(false);
        PreparedStatement stmt = conn.prepareStatement("INSERT INTO pessoas (nome) VALUES (?)");

        for (String nome : chunk) {
            String nomeFormatado = nome.toUpperCase();
            stmt.setString(1, nomeFormatado);
            stmt.addBatch();
        }

        stmt.executeBatch();
        conn.commit();
        stmt.close();
    } catch (Exception e) {
        // Loga erro (em produção use logger)
        System.err.println("Erro ao processar chunk: " + e.getMessage());
    }
}); 

Considerações Importantes

Para alguns desenvolvedores, apenas olhando o código, o segundo exemplo parece claramente melhor, pois oferece:

  • Processamento paralelo
  • Maior escalabilidade
  • Menor uso de I/O por usar executeBatch()

Mas é preciso cautela.

Ao utilizar parallelStream() em contextos onde não há necessidade real de paralelismo, o sistema pode sofrer:

  • Consumo excessivo de memória e CPU
  • Escalonamento automático no Kubernetes, gerando novos pods desnecessariamente
  • Aumento de custo e latência, sem ganhos reais de performance

Além disso, em ambientes concorrentes, é necessário considerar:

  • Uso correto de Atomic* para controle de concorrência
  • Verificação da integridade e mutabilidade das listas
  • Possíveis problemas de sincronização e efeitos colaterais

O que a IA não vê (mas você precisa ver)

O agente de IA não é capaz de avaliar cenários reais com dados como:

  • Heap dumps (hprof) para análise de uso de memória
  • Java Memory Analyzer (MAT) para descobrir vazamentos ou gargalos de alocação
  • Thread dumps e profiling em tempo real para detectar travamentos, deadlocks ou picos de CPU

Essas ferramentas são essenciais para entender o comportamento real da aplicação no ambiente.

Em Resumo:

Unir ferramentas como o hprof com a capacidade analítica de um agente de IA pode proporcionar ganhos reais de performance e produtividade. No entanto:

  • A IA não é uma solução definitiva
  • É preciso adaptar as sugestões à realidade da arquitetura
  • E tomar cuidado para evitar consumo excessivo de recursos

A IA pode ser um copiloto poderoso, mas a direção ainda é responsabilidade do desenvolvedor.


Ponto de delírio

É até engraçado, se não fosse trágico…

Em projetos legados especialmente aqueles famosos monólitos cheios de herança, polimorfismo e múltiplas responsabilidades — o agente de IA pode começar a delirar seriamente durante determinadas solicitações de refatoração.

Já presenciei casos onde:

  • A IA bugou completamente tentando entender hierarquias complexas de herança
  • Sugeriu a exclusão de classes inteiras, incluindo métodos que não tinham nenhuma relação com a solicitação original
  • Ofereceu refatorações que quebrariam o sistema se fossem aplicadas cegamente

E quanto mais você mantém o mesmo escopo e adiciona várias solicitações na mesma chamada, maior o risco de delírio. Isso acontece porque a IA tenta entender o contexto como um todo, mas esse “todo” muitas vezes é uma estrutura altamente acoplada, ambígua ou inconsistente típica de sistemas antigos e com defit tecnico.

Em Resumo:

Limitar o escopo da solicitação, ser objetivo e fornecer informações específicas do código ajuda a guiar a IA para um entendimento mais lógico e preciso. Esse tipo de abordagem pode sim ser muito vantajosa, resultando em delírios controlados, muitas vezes até imperceptíveis.

Mas lembre-se: contexto demais sem clareza é o combustível do caos para a IA.

Conclusão:

Entre os agentes de IA testados, o JetBrains Junie foi o que mais se destacou em:

  • Entendimento de contexto
  • Controle de delírios em análises longas
  • Capacidade de interpretar e sugerir melhorias no código

As métricas abaixo foram levantadas por mim, com base em testes práticos e tempo cronometrado em cada etapa durante atividades reais de desenvolvimento:

  • Até 70% de aceleração no processo de análise de código
  • 30% de ganho no tempo de desenvolvimento
  • 40% de melhoria na eficiência de refatorações

No fim das contas, isso impacta diretamente em:

  • Menor desgaste mental para o desenvolvedor
  • Entregas mais rápidas
  • Melhor performance das soluções
  • Maior produtividade da equipe

Mas atenção: IA não substitui o desenvolvedor

O agente de IA não substitui um profissional experiente, mas pode sim facilitar a vida do desenvolvedor, reduzindo esforço cognitivo e aumentando a qualidade das entregas. Se bem utilizada, a IA se torna uma ferramenta estratégica, potencializando a performance do time e, por consequência, os resultados da empresa.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *