24 pontos por GN⁺ 2025-04-05 | 1 comentários | Compartilhar no WhatsApp
  • Nos últimos meses, experimentei usar ferramentas de programação baseadas em IA tanto em projetos pessoais quanto no trabalho
  • Os resultados foram muito positivos, e vivi na prática tanto a redução do tempo de desenvolvimento quanto a melhora da qualidade das entregas
  • Por outro lado, alguns desenvolvedores também compartilham feedback negativo de que as ferramentas de IA não funcionam bem
  • Com essa experiência, passei a ter convicção de que o desenvolvimento de software com IA tem potencial para dar um salto para o próximo nível em produtividade
  • Mas isso exige não uma adoção acrítica, e sim a perspectiva correta e uma abordagem equilibrada
  • Neste texto, compartilho boas práticas que vivenciei e descobri diretamente para
    ajudar, ainda que um pouco, a acelerar a adoção inteligente de ferramentas de IA na comunidade de desenvolvimento como um todo

Situação atual do uso de ferramentas de programação com IA

  • Pelo que observei no Twitter, as ferramentas de programação com IA estão fazendo muito sucesso entre desenvolvedores não especializados
    • Eles estão usando IA para encarar novos projetos e aprender a desenvolver de forma prazerosa
  • Essa tendência é positiva e contribui para reduzir a barreira de entrada da tecnologia para novos públicos
  • No entanto, isso é apenas um dos aspectos do potencial das ferramentas de IA e,
    • mesmo em contextos profissionais, como no caso de desenvolvedores sênior, a IA pode oferecer grande valor

Os pontos fortes do desenvolvedor sênior

  • Embora ainda estejamos em um estágio inicial de evolução, a conclusão até aqui é a seguinte:
    • Desenvolvedores sênior estão na melhor posição para usar ferramentas de IA com máxima eficácia
    • Não se trata apenas de receber ajuda, mas de otimizar o uso dessas ferramentas
  • O ponto central é o seguinte:

    A experiência de desenvolvimento e o know-how de condução de projetos, que podem até parecer um pouco antiquados na era da IA,
    são justamente a base para tirar o melhor proveito dessas ferramentas

  • Se fôssemos comparar um agente de programação baseado em LLM,
    • ele se parece mais com um sênior com enorme conhecimento de programação, mas que no contexto atual é um júnior com pouca compreensão do design
  • Por isso, para delegar trabalho real a esses agentes,
    • preparação estratégica e orientação são indispensáveis
    • e a pessoa ideal para exercer esse papel é justamente o desenvolvedor sênior
  • Em resumo, até mesmo ferramentas de IA de ponta só podem ser usadas com máxima eficácia quando apoiadas em práticas tradicionais de desenvolvimento e experiência acumulada

Três elementos centrais para uma sessão de programação com IA bem-sucedida

  • Para obter bons resultados colaborando com IA, os seguintes três elementos são importantes:
    • Documentação de requisitos bem estruturada (Well-structured Requirements)
    • Guard rails de qualidade baseados em ferramentas (Tool-based Guard Rails)
    • Técnica de keyframing baseada em arquivos (File-based Keyframing)
  • Antes da explicação detalhada, vale apresentar alguns casos práticos de projetos usando IA
    • Projeto green-field: um projeto criado do zero
    • Projeto brown-field: um projeto em que novos recursos são adicionados sobre uma base de código existente
  • Em ambos os casos, o foco está em exemplos em que a IA assumiu quase toda a implementação
    • Não como simples apoio de autocompletar ou assistente conversacional,
      mas com foco em executar trabalho real no modo agente
  • A ferramenta usada foi o Cursor,
    • com base no modelo Claude Sonnet 3.7, da Anthropic
    • oferecendo recursos para modificar diretamente todos os arquivos do projeto e executar comandos relacionados

Exemplo 1: Platform Problem Monitoring (projeto green-field)

  • Usando Cursor e Claude, foi implementada uma nova aplicação chamada Platform Problem Monitoring
  • Esse app se conecta a cada hora ao servidor Elasticsearch do ELK para coletar mensagens de erro e envia um relatório por e-mail formatado resumindo o estado atual dos problemas da plataforma web
  • Toda a implementação foi feita pela IA, e nenhuma linha de código foi escrita manualmente
  • O autor não tem grande familiaridade com a linguagem Python, mas
    • graças a uma ampla compreensão de arquitetura, operações e boas práticas, o trabalho pôde avançar sem atritos
    • esse projeto também foi uma oportunidade de testar o quanto a IA pode ajudar em uma stack tecnológica pouco familiar

Observação: problemas de qualidade de código
Na discussão no HackerNews, foram apontados problemas de qualidade de código, como configuração de logging, parsing de configuração customizada e race conditions
O objetivo desse projeto era mais a criação rápida de um protótipo do que código de produção,
com foco em entregar funcionalidade, e não em manutenção de longo prazo ou convenções idiomáticas da linguagem

Exemplo 2: Process Management UI Integration (projeto brown-field)

  • Um caso de integração de UI a uma funcionalidade de backend legada baseada em PHP/Symfony
  • O backend operava por comandos CLI baseados em cron, e não havia UI
  • A ideia era integrar essa funcionalidade a uma aplicação Symfony moderna
    • aproveitando uma estrutura amigável para UI, com base de código atual, suíte de testes e guia de estilo
  • Principais tarefas:
    • Comunicação com o sistema legado via HTTP API
    • Implementação de transferência de dados entre sistemas
    • Construção das telas de acordo com o design system da UI
    • Implementação de um cliente de API dentro de um bundle Symfony compartilhado
  • Com exceção dos arquivos-keyframe, toda a implementação foi realizada automaticamente pela IA

Principais insights obtidos nos dois projetos

  1. Projeto green-field: mesmo em uma stack pouco familiar, foi possível implementar um app funcional com ajuda da IA
  2. Projeto brown-field: apesar de UI ser uma tarefa menos familiar, a IA permitiu concluir a funcionalidade rapidamente
  • Esses dois casos mostraram, na prática, que ferramentas de IA podem gerar mudanças reais tanto na produtividade individual quanto no workflow da equipe como um todo
  • No entanto, para que a IA economize muito tempo, é necessário um investimento inicial em setup e uma abordagem estratégica
    • assim como ao orientar bem um desenvolvedor júnior talentoso para obter os melhores resultados

A importância de escrever requisitos com precisão

  • O coração de uma sessão de programação com IA bem-sucedida é um documento de requisitos sistemático e abrangente
  • No projeto real Platform Problem Monitoring, foi criado o documento REQUIREMENTS.md antes do início da sessão
  • Esse documento tem 371 linhas ao todo e segue a seguinte estrutura hierárquica
    • Nível mais alto: resumo em uma linha dos requisitos centrais
    • Nível superior: casos de uso e motivação de desenvolvimento
    • Nível intermediário: processos e forma de funcionamento
    • Nível intermediário: arquitetura, stack tecnológica e restrições
    • Nível inferior: detalhamento de etapas concretas de trabalho com base em entrada/saída/efeitos colaterais
  • Um documento estruturado dessa forma também oferece à IA um framework claro, conduzindo a resultados mais precisos
  • Escrever esse documento exige tempo e esforço, mas é um investimento indispensável para uma implementação bem-sucedida
  • Um dos aforismos do desenvolvimento de software diz:

    “Seis semanas de implementação economizam duas horas de planejamento”

    • É uma frase irônica, mas carrega a verdade de que a ineficiência na implementação nasce da falta de planejamento
  • Por isso, um projeto deve sempre começar no quadro branco, não no teclado, e esse princípio vale igualmente ao colaborar com IA
  • Na prática, as sessões no Cursor começam com etapas como estas:
    1. Fazer a IA resumir os requisitos com suas próprias palavras
    2. Fazer a IA gerar um plano de execução
    3. Incentivar a IA a perguntar sobre pontos ambíguos
  • Só depois dessa etapa de validação a IA é colocada no modo “Agent” para começar a implementação

Definindo guard rails de qualidade com base em ferramentas

  • Se o documento de requisitos define o destino, os guard rails de qualidade ajudam a manter o caminho mais curto até esse destino
  • Assim como um sistema de feedback em tempo real é importante durante o desenvolvimento, ferramentas de análise estática também ajudam muito a IA
  • Por exemplo, é muito mais eficiente detectar preventivamente um null check ausente durante o desenvolvimento do que descobri-lo depois do lançamento por meio de contato de cliente
  • Por isso, antes de iniciar uma sessão de programação com IA, são sempre configuradas as seguintes ferramentas de garantia de qualidade
    • Tomando como base este exemplo de Makefile:
      • black, isort: formatação de código
      • ruff: lint
      • mypy: checagem de tipos
      • bandit: análise de segurança
      • a suíte completa de testes
  • Agentes de IA baseados em Claude conseguem reconhecer e usar essas ferramentas
    • Ex.: se a checagem de tipos falhar, a IA ajusta o código por conta própria até passar
  • Para validação funcional, também são fornecidas requisições de teste de API com comandos curl
    • É impressionante ver a IA chamar diretamente os endpoints, verificar as respostas e melhorar o código
  • Assim, guard rails baseados em ferramentas são um componente essencial para ajudar a IA a produzir resultados confiáveis

Técnica de keyframing baseada em arquivos

  • A IA é forte em implementação criativa, mas pode carecer de direção quando se trata da estrutura do código ou da organização dos arquivos
    • Para compensar isso, a estratégia usada é o file-based keyframing
  • Essa técnica se inspira no método de keyframes usado na produção de animação:
    • um animador experiente cria primeiro as cenas importantes (keyframes), e o restante é preenchido por assistentes
    • isso permite elevar a eficiência sem perder qualidade
  • Em projetos reais de programação com IA, arquivos stub vazios são criados antecipadamente antes da implementação
    • por exemplo: endpoints de API, cliente de API, classes de controller, templates Twig etc.
  • Esses arquivos-keyframe fornecem à IA informações de contexto importantes, como:
    • forma de organização dos arquivos do projeto
    • estrutura de namespaces
    • convenções de nomenclatura
    • padrões consistentes de código
  • Em vez de explicar toda a estrutura por prompt, é possível aumentar a precisão de raciocínio da IA oferecendo pistas na própria base de código
  • Essa abordagem também reforça o princípio, ainda importante na era da IA, de “dar nomes”
    • como a IA opera com base em linguagem, textos carregados de intenção e significado levam a resultados melhores

Aplicação integrada em um caso real: implementação da UI do dashboard de contratos de assinatura

  • A seguir, é apresentado um exemplo prático que integra em um único projeto os três princípios centrais descritos acima:
    • documentação de requisitos bem estruturada
    • guard rails de qualidade baseados em ferramentas
    • técnica de keyframing baseada em arquivos
  • Visão geral do projeto

    • Objetivo: implementar um dashboard web de UI somente leitura para visualizar em formato de tabela informações sobre contratos de assinatura dentro da plataforma
    • Ambiente-alvo: ambiente multicodebase (monorepo)
      • backend-app: aplicação Symfony 5, onde os dados estão armazenados
      • janus-christophorus: aplicação Symfony 7, que fornece a UI
      • janus-shared-bundle: inclui a implementação do cliente de API
      • janus-webui-bundle: inclui style guide, configuração do Tailwind e templates Twig
  • Estrutura de requisitos

    • Ler os dados do backend via API e exibi-los na UI de frontend
    • Além do endpoint real da API, oferecer também suporte a modo demo (dados falsos para testes)
    • A UI deve ser implementada de forma consistente com o style guide
    • Cada camada é implementada com os seguintes componentes:
      • endpoint de API
      • cliente de API
      • classe de serviço da camada de apresentação
      • controller e template Twig
  • Trabalho preparatório para a sessão de IA

    • Criar antecipadamente arquivos vazios em todas as codebases usando a abordagem de file-based keyframing
    • Fornecer à IA o style guide existente, serviço de navegação e funcionalidades semelhantes como material de referência
    • Permitir a execução de ferramentas de qualidade (como PHPStan) em cada codebase
      • Ex.: uso do script .dxcli/dxcli.sh quality
  • Como os princípios integrados são usados

    • Organização dos requisitos: explicar no prompt os requisitos detalhados e a estrutura do sistema
    • Fornecimento de guard rails: incluir orientação para o uso de ferramentas de inspeção de código
    • Fornecimento de keyframes: criar antecipadamente os arquivos a serem implementados para que a IA escreva código no lugar e no contexto corretos
  • Principais objetivos

    • Oferecer rapidamente uma UI que permita entender de forma ampla as informações dos contratos
    • Fornecer uma estrutura clara e pistas para que a IA possa fazer perguntas e elaborar um plano durante a implementação real
  • Esse exemplo mostra muito bem o quanto a colaboração entre ferramentas de IA e experiência humana pode gerar uma sinergia poderosa

Conclusão: ferramentas de IA + experiência humana = a melhor combinação

  • Ao fornecer requisitos bem estruturados, guard rails baseados em ferramentas e keyframes baseados em arquivos,
    é possível aproveitar o poder da IA e, ao mesmo tempo, manter a qualidade do código e a consistência da arquitetura
  • Essas práticas tradicionais de desenvolvimento continuam válidas mesmo na era da IA e,
    na verdade, produzem efeitos ainda maiores por meio da experiência e da capacidade de insight do desenvolvedor sênior
  • No fim das contas, a IA é apenas uma ferramenta, e
    vivemos uma era em que a experiência e a habilidade humanas para usá-la corretamente são mais importantes do que nunca

1 comentários

 
GN⁺ 2025-04-05
Comentários do Hacker News
  • Um desenvolvedor Python experiente analisou um arquivo específico e apontou que ele estava cheio de erros típicos de um engenheiro de software júnior

    • Desde configurar o logger raiz no nível do módulo até escrever manualmente um parser de arquivo de configuração em vez de usar o parser da biblioteca padrão
    • O problema da load_json, que verifica se o arquivo existe e depois prossegue como se ele certamente existisse
    • Menciona, de modo geral, que a qualidade do código é baixa
  • Um programador por hobby com 25 anos de experiência sente que LLMs e vibecoding prejudicam a criatividade

    • Gosta de aprender e usar novas ferramentas e quer criar soluções com potencial de mercado
    • Ao usar LLMs, consegue implementar rapidamente o que imaginou, mas sente menos satisfação por não construir tudo diretamente
    • Lamenta que, no último ano, não conseguiu criar grandes projetos e que a diversão diminuiu
  • Um desenvolvedor com menos de 40 anos acha que a IA é útil como ferramenta para aliviar trabalho manual

    • Sofre de tendinite severa e teve melhora após usar autocompletar de código
    • Preocupa-se com a possibilidade de o "vibe coding" se tornar dominante e teme que só desenvolvedores experientes consigam entender o contexto
  • Um usuário considera ineficiente gerar código com IA

    • Gasta muito tempo escrevendo prompts e rastreando erros no código
    • Diz que escrever o código diretamente lhe traz paz de espírito
  • Um usuário acha que a IA é útil em projetos novos (greenfield), mas ineficiente em projetos existentes (brownfield)

    • Aponta que a IA tem dificuldade para se integrar ao código já existente
  • Um desenvolvedor começa os projetos fazendo um plano em arquivo Markdown

    • Usa Rust para garantir a correção do código por meio de verificações em tempo de compilação
    • Fica satisfeito por conseguir encontrar mais erros no código Rust gerado por IA
  • Um usuário acredita que a experiência em engenharia de software é importante na era da IA

    • Preocupa-se que depender de LLMs possa atrofiar a experiência adquirida
  • Um usuário tenta aplicar o conceito de "surpresa" da teoria da informação aos LLMs

    • Se o código gerado por LLM for inesperado, pode ser difícil identificar erros
    • Tenta reinterpretar isso como "exploração" e transformar em oportunidade para aprender novos temas
  • Um usuário tenta orientar o código gerado por IA por meio de desenvolvimento orientado a testes (TDD)

    • O TDD funciona como um contrato, permitindo escolher entre IA ou programação manual
  • Um usuário se preocupa que o estado atual da IA não esteja alinhado com a direção futura do software

    • Menciona que o sucesso do Java se deveu ao código-fonte fornecido junto com o JDK
    • Aponta que a IA não melhora a clareza nem a capacidade de descoberta do código
  • Um usuário sente que a IA está evoluindo rápido demais e isso pode ser avassalador

    • Desenvolvedores experientes podem usar IA para planejar novas aplicações
    • Acredita que construir uma marca pessoal é importante e que é preciso criar o próprio app