Um cético em IA usa IA por uma semana
Se você é um cético em IA, eu entendo. Eu também era um e ainda sou em alguns aspectos. Não vejo nenhum benefício em colocar um chatbot na maioria dos aplicativos e sites que uso. Não me importo com o resumo de um e-mail que recebi ou de uma reunião da qual participei.
Nesse sentido, há um trem de hype impulsionado pelo preço das ações que estou pronto para superar. No entanto, isso não é tudo.
Me ajudou a fazer churrasco
Nas últimas duas semanas, fiz questão de realmente mergulhar e dar uma sacudida justa na IA, e isso abriu meus olhos. A IA não pertence a todos os lugares, mas tem o seu lugar, tanto para atividades diárias quanto para auxiliar no desenvolvimento de software.
A primeira coisa mais simples que fiz foi usar o Gemini do Google para ajudar na tomada de decisão de compra. Eu estava procurando um termômetro de carne sem fio que pudesse usar para fumar e grelhar. Existem muitas opções no mercado, mas a maioria delas só funciona em conjunto com um aplicativo para smartphone. Gosto desses aplicativos, mas queria um que também tivesse sua própria base autônoma para que eu pudesse verificar rapidamente a temperatura na cozinha.
Então contei a Gêmeos em poucas frases o que estava procurando e quantas sondas queria. Ele ficou mastigando por um tempo, depois voltou com uma lista de modelos que atendiam aos meus critérios, juntamente com um resumo das avaliações. Isso incluía dois que eu já conhecia em pesquisas anteriores (The Typhur Sync e Thermomaven P2), além de um terceiro do qual não tinha ouvido falar (The Inkbird INT-12-BW).
Gemini mostrou todo o seu “processo de pensamento”, incluindo links que digitalizou, razões pelas quais eliminou outros modelos da lista e uma sinopse bastante razoável do que diferenciou esses três. Todos os três modelos atenderam exatamente aos meus critérios.
Foi muito, muito mais rápido do que ler dezenas de comentários e assistir a vários vídeos no YouTube. A sinopse não era perfeita – para um modelo, listava a espessura da sonda em mm, enquanto os outros dois eram “finos” e “muito finos” – mas foi um começo suficiente para eu me aprofundar e fazer mais pesquisas, se eu quisesse. É claro que eu mesmo verifiquei alguns comentários depois para ter certeza de que tudo estava de acordo com a resposta de Gêmeos, e foi o que aconteceu. (No final optei pelo Thermomaven; preço médio dos três.)
Isso seria bobagem para pesquisas mais simples na web? Claro. Mas para algo assim, onde sei que clicaria em dezenas de links, acho que realmente ajudou a restringir minha pesquisa.
É impressionante no desenvolvimento de software
É claro que o verdadeiro tema quente não é a pesquisa na web, mas o que isso significa para o mundo do desenvolvimento de software. O que encontrei aqui me surpreendeu.
Instalei o Warp e usei-o como parte de todo o meu trabalho de desenvolvimento por uma ou duas semanas. Isso me permitiu escolher entre vários agentes, embora eu tenha deixado o padrão, Claude 4 Sonnet.
Eu usei o Copilot no passado. Os críticos costumam se referir aos LLMs como “preenchimento automático glorificado”, e foi exatamente isso que o Copilot sentiu para mim. Foi útil para cuspir rapidamente grandes blocos de código repetitivo e poderia escrever pequenas funções utilitárias comuns para mim.
Cláudio é diferente. Ele pode indexar toda a minha base de código, entender como o aplicativo está estruturado como um todo e determinar onde e como fazer alterações. Ele me mostra uma comparação de cada alteração que deseja fazer antes de realizá-la, que posso aceitar, rejeitar ou refinar ainda mais com solicitações adicionais.
No início, dei-lhe tarefas simples:
Nas páginas Organizações, altere o texto em todos os botões “Adicionar usuários” para “Atribuir usuários”.
Isso foi feito sem nenhum problema e sem que eu jamais informasse quais são as páginas da organização ou quais componentes do React são renderizados nelas. O que imediatamente me chamou a atenção é que encontrou os arquivos pertinentes distante mais rápido do que eu teria. Nossa base de código tem quase 3.000 arquivos de TypeScript e, às vezes, apenas rastrear os componentes certos para uma alteração pode dar um pouco de trabalho se estiver em um canto do aplicativo com o qual não estou familiarizado.
Eu tinha outra mudança simples para fazer:
Na página Usuários da organização, altere o ícone do botão ‘Gerenciar funções’ de uma engrenagem para um lápis e atualize a dica de ferramenta para dizer ‘Gerenciar funções da organização’.
Descobriu que precisava importar PencilAltIcon
(correspondendo a um padrão que usamos em outras partes do aplicativo, principalmente não usando o PencilIcon) e substituiu o CogIcon no componente. Não excluiu a importação antiga de CogIconmas uma solicitação de acompanhamento poderia ter resolvido (IIRC, eu mesmo fiz isso). Depois, mais um desafio: testes. Estamos no processo de migração de testes do Cypress, então agora temos uma mistura de testes Cypress, Playwright e Vitest em nosso repositório. Este componente ainda foi testado com testes de componente Cypress, então pedi ao Claude para criar um arquivo vitest, esperando que ele escrevesse um scaffold vazio onde eu pudesse colocar os testes. Em vez disso, escreveu meia dúzia de testes para o componente:
- renderizar a lista de usuários com dados
- mostrar o estado vazio quando nenhum usuário for atribuído
- exibir uma mensagem de erro quando o carregamento falhar
- mostrar o botão atribuir usuários quando o usuário tiver permissões
- desabilitar o botão atribuir usuários quando o usuário não tiver permissões
- mostre o estado vazio com um erro de permissão quando o usuário não tiver permissões
Todos foram bons testes, embora eu tenha dito para reformular os nomes dos testes para começar com “deveria”. Em seguida, pedi para comparar esses testes com os testes Cypress existentes e determinar quais testes Cypress não eram mais necessários. Ele os avaliou corretamente e, após eu solicitar, excluiu os testes obsoletos do Cypress (deixando outro teste mais complexo que eu ainda não estava pronto para converter).
Algumas dessas tarefas exigiam um pouco de refinamento e/ou solicitações de acompanhamento (“Mova os dados simulados para arquivos com nomes terminando .fixture.json“). Não é uma questão de pedir magia e depois verificar mentalmente, mas ainda assim é impressionante. Nesse ponto, eu estava determinado a levar essa coisa o mais longe que pudesse e ver o que acontecia.
Dando-lhe uma tarefa mais desafiadora
O botão “Atribuir usuários” abre um assistente de várias etapas. A segunda etapa desse assistente é subdividida em duas subetapas, mas estamos no processo de consolidação de alguns endpoints e eles podem ser mesclados.
Então, em uma nova sessão e em um novo branch git, aqui está o prompt que dei a Claude:
O assistente para atribuição de usuários a uma organização possui duas telas para atribuição de funções: uma para Execução de Automação (awx) e outra para Decisões de Automação (eda). Preciso consolidar essas duas telas em uma única tela que use URLs gatewayAPI em vez de endpoints awxAPI e edaAPI. As definições de função podem ser recuperadas de
/role_definitions/. No final do assistente, essas atribuições precisam ser POSTadas para/organizations/:id/users/associate/
Ele criou a nova etapa consolidada do assistente e substituiu as duas subetapas pela nova. Ele descobriu como o componente do assistente funcionava, como essa instância específica do componente do assistente reunia suas etapas em uma matriz de configuração contendo vários outros componentes e determinou como trabalhar com isso sem qualquer orientação mais específica. Isso envolve dezenas de componentes do React e quase o mesmo número de ganchos trabalhando em conjunto. Fiquei genuinamente chocado.
Percebi que ele estava repetindo algum trabalho que já temos em outras partes da base de código, então solicitei:
existe um componente SelectRolesStep genérico. Podemos usar isso nesta implementação?
Foi o que aconteceu.
Após cada uma dessas instruções, ele mostrava seu pensamento, geralmente uma tela ou algo assim de texto. Ele listou cada um dos arquivos lidos em cada estágio para ver como eles funcionam juntos (às vezes uma lista significativa). Em seguida, são apresentadas as alterações propostas no código.
Se algo não estivesse certo, eu tinha a opção de pedir o refinamento imediatamente ou de aceitar a alteração e fazer um pedido de acompanhamento posteriormente. No final do processo, apresentou um resumo de página inteira das alterações que fizemos, incluindo uma lista de cinco pontos dos “Benefícios da consolidação”. Isso é mais do que eu preciso, na verdade, mas dá a sensação de que entende para que servem as mudanças em um nível mais alto do que o meu prompt forneceu.
A certa altura, percebi que uma mudança proposta incluía um conjunto repetido de cinco ou seis linhas de código, sintaticamente incorretas. Pensei em simplesmente aceitar a alteração e excluir eu mesmo a duplicação, mas não foi necessário. Após aplicar a alteração, Claude sugeriu imediatamente uma segunda edição, corrigindo o problema.
Esse trabalho específico exigiu talvez sete ou oito solicitações, incluindo atualizações de testes. Algumas das atualizações de teste precisaram de um pouco mais de refinamento manual depois, mas isso cuidou da maior parte do trabalho.
Todo o processo parecia uma programação em par com um desenvolvedor júnior, mas alguém que pensa e faz alterações no código com uma rapidez incrível. Tive que apontar alguns lugares onde nossa base de código já fornecia utilitários para não duplicar o trabalho. Em outros casos, encontrou coisas que exigiriam alguma investigação da minha parte. Se algo não estava certo quando testei a UI, eu contei — às vezes ele encontrava o problema e o corrigia; outras vezes, ele lutou. O lugar que pareceu ter mais dificuldade foi lidar com erros de TypeScript (identificáveis) e, para eles, acabei corrigindo os problemas sozinho.
Eu mesmo consegui preparar e confirmar todas as alterações para poder ver tudo o que estava fazendo na base de código – embora você também possa fazer com que Claude faça isso se estiver confiante o suficiente em suas habilidades.
Eu vi este post recentemente no Mastodon:
Estou testemunhando profissionais gastando horas projetando prompts para o Copilot fazer coisas básicas, como encontrar uma linha em um arquivo que contenha uma string, ou descobrir quem se comprometeu com mais frequência em um subcaminho em um repositório, ou gerar código padrão para classes… Nenhuma dessas coisas requer #AI.
grep,git log..e os trechos do editor já existem há muito tempo. Eles são rápidos. Eles são EXATOS. Eles são GRATUITOS. Eles não fervem os oceanos. Eles não deslocam a força de trabalho. Eles são mais eficientes e produtivos.Aprenda as ferramentas do seu comércio. Se tudo o que você faz é usar IA, isso significa que a IA pode e irá substituí-lo.
– @reyjrar@hachyderm.io
Eu entendo o que ele quer dizer aqui, e é um ponto absolutamente justo. Não quero fechar os olhos aos recursos utilizados na produção ou utilização da IA, ao seu impacto na sociedade e a todas as questões éticas que a rodeiam. Mas penso que, ao mesmo tempo, ele ignora um facto fundamental: a IA é agora uma das ferramentas do comércio.
Assim como qualquer ferramenta, o truque será aprender quando usá-la e quando não usá-la. Certamente será necessária alguma experiência para ter uma ideia do que pode ou não fazer e quando é ou não mais eficiente do que outras abordagens.
Pelo menos um estudo inicial indica que a IA não proporciona o aumento de produtividade que muitos pensam que proporciona. É importante ficar de olho nisso. Ao mesmo tempo, não creio que a produtividade seja o único ganho; em alguns casos, ele encontrou bugs no meu código que eu havia perdido.
Com este prompt Warp na minha frente, certamente há uma tentação de desligar meu pensamento e fazê-lo fazer todo o trabalho. Para casos de uso simples, posso ver onde esse tipo de “codificação de vibração” pode funcionar, mas nesta junção, não vejo essa sendo minha abordagem. Eu valorizo muito o código limpo e de fácil manutenção para aceitar cegamente todas as mudanças que a IA produz.
Assim como trabalhar com um desenvolvedor júnior, preciso manter minha mente ocupada para acompanhar o que ele está fazendo. Se algo parecer engraçado, pedirei que faça de forma diferente. À medida que me familiarizo mais com ele, recorrerei mais quando fizer sentido e menos porque é uma novidade divertida.
Meu instinto diz que isso é realmente eficiente para encontrar o que precisa ser mudado e estruturado em uma abordagem aproximada, mas geralmente menos eficiente nos estágios de polimento do desenvolvimento.
Ao todo, acho que descobri que é necessária uma abordagem mais equilibrada quando se trata de IA. Não é uma solução mágica, mas também não é uma completa perda de tempo. Na codificação, a resposta sempre foi “depende” e isso ainda é verdade hoje.
