Recentemente, descobri que o Github Copilot, uma IA que ajuda a escrever o código sugerindo trechos inteiros (geralmente baseados apenas em comentários em linguagem natural), agora está disponível como um serviço comercial. Não precisando mais esperar pelo acesso beta, fiz o check-in para um teste gratuito de dois meses.
Devo dizer - minhas expectativas eram altas. Já joguei um pouco com a API OpenAI antes. Eu acredito que ele usa o mesmo modelo do Copilot, então eu sabia que poderia ser uma experiência alucinante. Instalei-o como uma extensão do Visual Studio Code e comecei a me perguntar como devo desafiar meu novo colega virtual.
Lendo alguns dos comentários e artigos da comunidade, descobri que uma das vantagens do Copilot é que essa IA conhece mais linguagens de programação, estruturas e APIs do que qualquer desenvolvedor de flash e osso que vive hoje. Afinal, ele aprende usando todos os repositórios GitHub públicos que já existiram. Pode ser mais do que apenas uma ferramenta de produtividade. Também pode ser uma forma interativa de descobrir coisas novas.
Enquanto esperava utilizá-lo dessa maneira, decidi criar um jogo. Um clone de Space Invaders parecia ser uma escolha apropriada, mas para tornar isso mais interessante, fiz algumas suposições:
Configurei a gravação de tela, liguei meu microfone para fazer um pequeno comentário, iniciei o Visual Studio e acabei de escrever minha primeira solicitação:
"""main function for a pygame"""
Copilot começou a me dar linhas de código, uma após a outra. Acabei de entrar na lista de sugestões aceitando uma tonelada de importações. Entusiasmado no início, rapidamente me vi preso em um loop infinito de adicionar as mesmas duas linhas de código repetidamente. Nada de bom.
Com um começo ruim, rapidamente percebi que estou tentando fazer muito, muito rapidamente. Pedir ao Copilot para adicionar uma importação do PyGame primeiro e depois criar uma função mostrando uma janela funcionou.
Nesse ponto, também percebi que, ao tornar meu pedido mais preciso, posso melhorar os resultados. Enquanto escrevo
"""create a function showing a game window"""
Eu o fiz funcionar, exceto pelo fato de que ele apareceu apenas por um segundo e depois saiu imediatamente. Então imaginei que precisava ser muito direto em relação às minhas expectativas. Mudando para
"""create a function showing a game window and then left it open"""
O Copilot estendeu o código adicionando um loop de jogo básico que impedia que a janela fosse fechada.
Parecia que meu amigo e eu começamos a nos comunicar. Agradável!
O próximo passo foi criar uma classe de nave espacial. Criei uma classe em um arquivo separado, novamente comecei a escrever outro pedido e encontrei outra coisa legal. Acontece que o Copilot sugere não apenas o código, mas também o conteúdo dos comentários que estou escrevendo. Comecei a pedir para usar as teclas de seta para mover minha nave espacial e isso sugeriu uma frase inteira.
Devo dizer que estava um pouco cético se o Copilot realmente entenderia o que está acontecendo em termos de projeto. Analisar o código em um arquivo atualmente editado é uma coisa. Descobrir como esses arquivos estão interconectados é outra questão difícil.
O copiloto diz: "Eu cuidei de você". Ele está ciente de classes em outros arquivos, e não foi um problema usar nave espacial em nossa classe de jogo. Copilot também descobriu que definimos um tamanho de janela de jogo específico e o usamos enquanto posicionamos a nave espacial na parte inferior central da tela.
Você deve pensar - "esta ferramenta é incrível". Certo?
É meio que sim, mas nosso relacionamento não era apenas luar e rosas. Alguns dos problemas eram triviais, como lógica desnecessária em funções que pedi ao Copilot para escrever para mim. Algumas sugestões vinham atrasadas, e perdi um pouco de tempo esperando por elas.
Às vezes eu ficava frustrado por causa dos meus próprios erros. Deixei um comentário de que a função deveria retornar zero na parte superior do arquivo e, em seguida, escrevendo outro comentário abaixo, estava descobrindo por que o Copilot está tentando retornar zero no final da minha função. Mas não era nada em comparação com o problema que passei quase uma hora resolvendo.
Eu estava procurando posicionar o navio no lugar certo e definir seu tamanho para 50x50 pixels. Eu estava tentando formular meu comentário de várias maneiras. Obtendo sempre o mesmo resultado. Code, que não estava funcionando porque o Copilot decidiu usar métodos que não existiam no PyGame.
Teimoso como uma mula, tentava invocar set_size e set_center em meu objeto sprite carregado, sempre obtendo:
AttributeError: 'pygame.Surface' object has no attribute 'set_size'
Inúmeras vezes tentei reformular meu pedido sempre obtendo o código que não estava funcionando de jeito nenhum. Muuuuito frustrante.
Em algum momento, até pensei que deveria parar de gravar e esquecer. Rotule o Copilot como não adequado para esta finalidade e encerre o experimento. No entanto, senti que deveria haver uma maneira de superar isso.
Eu pensei que trabalhando com o Copilot eu poderia esquecer os documentos, mas descobri que foi minha culpa por não entender o básico do PyGame. Não entendi o conceito de Rect ajudando a mover objetos na cena. Não entendi como usar classes utilitárias para dimensionar meu sprite.
Encontrar essa informação na documentação quebrou o feitiço. Pude sugerir uma estratégia diferente do Copilot separando o sprite representado como um objeto Surface do Rect e passando-os separadamente para a tela.
O resto deste curso foi tranquilo. Quanto mais código eu produzia, mais inteligente o Copilot ficava. Foi mágico quando leu minha mente e fez balas e alienígenas se moverem nas direções certas. Foi muito fácil adicionar um contador de pontuação que o Copilot descobriu automaticamente que deveria somar colisões de balas com invasores.
Afinal, foi um sucesso. O jogo estava funcionando e fiz em menos de 2 horas aprendendo tudo do zero. Copilot escreveu pelo menos 99% do código e mal precisei consultar a documentação, embora sem ela provavelmente ainda estaria preso com o código incorreto fornecido por meu novo amigo.
Você pode assistir a todos os meus esforços neste vídeo de 2 horas no YouTube:
👉
Sem preparação, sem edição, sem truques. Improvisação pura.
Apenas um aviso rápido - é emocional. Fico frustrado na metade do tempo apenas para rir e ficar totalmente animado dando cada pequeno passo na direção certa.
Você também pode encontrar o código-fonte gerado no meu Github. Como mencionei no vídeo não é bonito, mas funciona:
👉 https://github.com/lukasz-wronski/copilot-invaders
Espero que você tenha aproveitado. Obrigado por ler!