image

Access unlimited bootcamps and 650+ courses forever

75
%OFF
Article image
Ederson Jasper
Ederson Jasper20/12/2025 21:10
Share

Pair Programming com IA: Como Multipliquei Minha Produtividade em Desenvolvimento .NET

    Introdução

    Se você é desenvolvedor, provavelmente já ouviu falar sobre ferramentas de IA para programação. Mas será que elas realmente funcionam na prática? Será que conseguem lidar com código legado, bugs complexos e refatorações em larga escala?

    Nas últimas semanas, decidi testar isso na prática em um projeto real: uma arquitetura de microserviços em .NET 10 com código legado, alta complexidade de negócio e testes falhando. O resultado? Uma transformação completa na forma como desenvolvo software.

    Neste artigo, vou compartilhar minha experiência prática, os desafios enfrentados, as soluções encontradas e as lições aprendidas ao trabalhar em pair programming com IA.

    O Contexto do Projeto

    A Solução

    • Stack: .NET 10, C#, xUnit, Moq, FluentAssertions
    • Arquitetura: Microserviços complexos
    • Desafio: Refatoração de código legado relacionado a integração SEFAZ
    • Situação inicial: 13 testes unitários falhando após mudança de assinatura de método

    O Problema Real

    Ao refatorar um método crítico que consulta o Portal Nacional da SEFAZ, adicionei um novo parâmetro booleano (`isProduction`) para diferenciar ambientes. Imediatamente, 13 testes quebraram com a mensagem temida:

    Expected invocation on the mock once, but was 0 times
    Performed invocations: No invocations performed.
    

    O pior tipo de falha: quando o código simplesmente não é executado e você não sabe por quê.

    A Jornada de Debugging

    Primeira Tentativa: O Óbvio

    Como todo desenvolvedor experiente, comecei pelo óbvio:

    1. ✅ Atualizei as assinaturas dos mocks: `It.IsAny<bool>()`

    2. ✅ Garanti que os builders de teste tinham dados válidos

    3. ❌ Resultado: Ainda 9 testes falhando

    Segunda Onda: Investigação Profunda

    A IA identificou possíveis causas:

    • Código de validação DNS estava retornando erro antes de chamar a API
    • Property `Environment` poderia ser null no JSON devido a `NullValueHandling.Ignore`
    • Necessidade de safe navigation operators

    Implementamos:

    // Antes (quebrando)
    var isProduction = configSetting.Value.Environment.IsSefazProduction();
    
    // Depois (ainda quebrando)
    var environment = configSetting.Value?.Environment?.ToString() ?? "2";
    var isProduction = environment.IsSefazProduction();
    

    Removemos 23 linhas de código DNS desnecessário, adicionamos null-safety... e ainda assim: 9 testes falhando.

    O Turning Point: Debug Manual

    Aqui é onde a colaboração humano-IA brilhou. A IA não conseguiu detectar o problema sozinha. Decidi:

    1. Colocar breakpoints

    2. Executar os testes em modo debug

    3. Analisar o stack trace real

    E encontrei o culpado:

    Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 
    'string' does not contain a definition for 'IsSefazProduction'
    

    A Solução Final: Type Inference

    O problema era sutil e sofisticado:

    // ❌ Problema: var resulta em dynamic type
    var environment = configSetting.Value?.Environment?.ToString() ?? "2";
    
    // ✅ Solução: Explicit typing permite extension methods
    string environment = configSetting.Value?.Environment?.ToString() ?? "2";
    

    Por que isso acontece?

    • `configSetting.Value` retorna `dynamic` (propriedade dinâmica de JSON)
    • Mesmo com `?.ToString()`, o null-coalescing com operando dynamic mantém o tipo como dynamic
    • Extension methods não funcionam com dynamic types (requerem resolução em compile-time)
    • A solução: forçar o tipo explicitamente como `string`

    O Papel da IA vs. O Desenvolvedor

    O Que a IA Fez Excepcionalmente Bem

    1. Análise Rápida de Contexto

    • Leitura de múltiplos arquivos simultaneamente
    • Identificação de padrões em testes
    • Sugestões de correções em batch

    2. Execução de Tarefas Repetitivas

    • Atualização de 10 mocks com nova assinatura
    • Adição de builders de configuração
    • Refatoração consistente em múltiplos pontos

    3. Proposta de Hipóteses

    • DNS blocking
    • Null reference issues
    • Certificate validation problems

    4. Conhecimento Técnico Instantâneo

    • Extension methods em C#
    • Dynamic types e type inference
    • Best practices de null-safety

    O Que Só o Desenvolvedor Conseguiu Fazer

    1. Debugging Real

    • Executar o código em modo debug
    • Analisar o comportamento em runtime
    • Identificar o RuntimeBinderException específico

    2. Contexto de Negócio

    • Entender que o código DNS era desnecessário
    • Saber que o ambiente padrão deveria ser homologação
    • Validar que a solução fazia sentido no fluxo da aplicação

    3. Decisões Arquiteturais

    • Usar constantes em vez de magic numbers
    • Manter consistência com padrões da solução
    • Avaliar impacto das mudanças

    4. Validação Final

    • Confirmar que TODOS os testes passaram
    • Garantir que a solução não quebrou outras partes
    • Code review da solução proposta

    A Metodologia de Trabalho

    Como Trabalhei em Pair Programming com IA

    1. Análise Inicial (IA)

    "Analise os testes falhando e identifique possíveis causas"
    → IA retorna hipóteses ranqueadas por probabilidade
    

    2. Implementação Iterativa (IA + Humano)

    "Implemente a correção X mantendo Y"
    → IA implementa
    → Humano valida e testa
    → Loop até funcionar
    

    3. Debug Profundo (Humano)

    Quando hipóteses esgotam → Debug manual
    → Encontrar root cause real
    

    4. Refinamento (IA + Humano)

    "Use a constante SefazEnvironmentConstants.Homologation"
    → IA refatora
    → Humano valida semântica
    

    Tempo de Execução

    | Tarefa | Sem IA (estimado) | Com IA | Ganho |

    |--------|-------------------|--------|-------|

    | Atualizar 10 mocks | 30 min | 2 min | 15x |

    | Adicionar builders | 45 min | 5 min | 9x |

    | Identificar hipóteses | 2h | 10 min | 12x |

    | Debug root cause | 2h | 2h | 1x |

    | Refatoração final | 30 min | 3 min | 10x |

    | **TOTAL** | **~5h** | **~2h20min** | **2.1x** |

    Lições Aprendidas

    1. IA é Pair Partner, Não Substituição

    A IA acelerou significativamente tarefas mecânicas, mas o debugging crítico exigiu intuição e experiência humana.

    2. Comunique o Contexto

    Quanto mais contexto você dá para a IA (estrutura de pastas, convenções, histórico), melhores são as sugestões.

    3. Valide Sempre

    Nunca aceite código sem entender. A IA pode sugerir soluções que "funcionam" mas não são ideais.

    4. Use para Aprendizado

    Cada interação é uma oportunidade de aprender patterns, APIs e best practices.

    5. Combine Forças

    IA para velocidade + Humano para qualidade = Melhor resultado possível

    Impacto no Projeto

    Métricas Concretas

    -12/12 testes passando (de 3/13 inicialmente)

    -2.1x mais rápido que desenvolvimento tradicional

    - 🎯 Zero regressões introduzidas

    - 📈 Cobertura mantida em 100% nas áreas refatoradas

    Código Mais Limpo

    // Antes: 310 linhas com DNS, magic numbers, sem null-safety
    // Depois: 287 linhas com constantes, null-safe, sem código desnecessário
    

    Próximos Passos

    Com a velocidade atual, estamos expandindo a cobertura de testes. Atualmente temos 179 testes unitários, mas planejamos aumentar significativamente nas próximas sprints. A diferença é que agora conseguimos escrever testes de qualidade em uma fração do tempo.

    Dicas Práticas para Começar

    1. Configure Seu Ambiente

    • Use GitHub Copilot ou similar
    • Configure contexto do workspace
    • Mantenha documentação acessível

    2. Aprenda os Comandos

    • "Analise este código e identifique problemas"
    • "Implemente X mantendo Y"
    • "Refatore para usar padrão Z"
    • "Explique por que isso não está funcionando"

    3. Desenvolva um Workflow

    1. IA identifica problema

    2. IA propõe solução

    3. Humano valida e testa

    4. Humano debuga se necessário

    5. IA implementa refinamentos

    4. Mantenha Controle

    • Use git com commits frequentes
    • Teste em cada iteração
    • Revise o código gerado
    • Não aceite "código mágico"

    Conclusão

    Trabalhar em pair programming com IA não é sobre substituir desenvolvedores. É sobre potencializar desenvolvedores.

    A IA é excepcionalmente boa em:

    • Tarefas repetitivas
    • Análise de padrões
    • Geração de código boilerplate
    • Sugestões baseadas em contexto

    O desenvolvedor continua essencial para:

    • Debugging complexo
    • Decisões arquiteturais
    • Contexto de negócio
    • Validação de qualidade

    Quando combinados, o resultado é transformador: desenvolvimento mais rápido, código mais limpo e aprendizado contínuo.

    Se você ainda não experimentou essa forma de trabalhar, minha recomendação é: comece hoje. Pegue uma tarefa pequena, configure sua ferramenta de IA, e descubra como ela pode potencializar seu trabalho.

    O futuro do desenvolvimento não é humano OU IA. É humano E IA, trabalhando juntos.

    Sobre o Autor

    Ederson Jasper - Desenvolvedor .NET, apaixonado por inovação e produtividade no desenvolvimento de software. Atualmente trabalhando com arquiteturas de microserviços em .NET e explorando o potencial da IA no dia a dia do desenvolvedor.

    Conecte-se comigo:

    - LinkedIn: https://www.linkedin.com/in/edersonjasper

    - GitHub: https://github.com/edersonjasper

    #IA #Desenvolvimento #DotNet #Produtividade #SoftwareEngineering #GitHubCopilot #CSharp #UnitTesting #DevLife #TechBrasil

    Share
    Recommended for you
    Bradesco - GenAI & Dados
    GitHub Copilot - Código na Prática
    CI&T - Backend com Java & AWS
    Comments (0)