Desenvolvimento Assistido por IA: Descubra qual ferramenta pode ser a sua maior aliada
É inegável que estamos vivendo uma nova revolução digital com o advento de ferramentas de IA generativa capazes de criar conteúdos originais, como textos, imagens, vídeos e até mesmo código. Quando se fala em desenvolvimento de software, o “hype” é tão grande que já se fala na democratização do desenvolvimento. Mas, dadas as limitações e o estágio atual de maturidade dessas ferramentas, será que elas já são capazes de acelerar o desenvolvimento e ajudar a produzir códigos de melhor qualidade?
Para responder a essa pergunta, avaliamos três ferramentas: Github Copilot[1], Tabnine[2] e ChatGPT[3]. As duas primeiras são específicas para codificação, possuem integração nativa com diferentes IDEs (ambientes de desenvolvimento integrado) e funcionam sugerindo trechos de código com base no contexto em que você está escrevendo, seja código ou comentários. Já o ChatGPT é uma ferramenta que gera texto em resposta a perguntas ou instruções em linguagem natural. Embora não seja específica para a geração de código, foi treinada com grandes bases de código-fonte, o que lhe confere a capacidade de “codificar”. Pode ser integrada a IDEs por meio de plugins de terceiros ou utilizada em sua versão mais popular, no prompt de comandos.
Diferentemente de outras avaliações dessas três ferramentas que as aplicam no desenvolvimento de pequenas aplicações desde o primeiro trecho de código, colocamos as três ferramentas à prova no dia a dia do desenvolvimento de um grande produto baseado na plataforma Java EE, que não utiliza as tecnologias mais modernas. Essa realidade, além de ser encontrada em muitas empresas, nos permite realizar a avaliação em um contexto mais complexo e desafiador.
Para a avaliação, consideramos as seguintes atividades:
- Criação de código de complexidade baixa – criação de trecho de código com lógica simples como, por exemplo, um algoritmo de ordenação que recebe um número inicial e final e retorna uma sequência de números ordenados para cima e para baixo.
- Criação de código de complexidade alta – criação de trecho de código que utiliza a especificação JBatch do JAVA EE 7 e requer a leitura de uma query JPA complexa a ser paginada e a escrita de um arquivo JSON usando APIs JAVA EE de JSON, com cada página sendo processada por uma thread diferente e os chunks sendo controlados por lotes de 500 itens.
- Refatoração de código – reescrita de trechos de código gerados pela IA ou por desenvolvedores para que seja otimizado.
- Explicação de trechos de código – explicação de toda a lógica de um trecho de código utilizando linguagem natural (português).
- Criação de testes unitários para código existente – criação de testes unitários para cenários de sucesso e falha a partir de um conjunto de classes e métodos específicos.Realizamos exatamente as mesmas atividades utilizando as três ferramentas, e as nossas impressões estão sumarizadas na tabela abaixo:
Tabela 1: Comparação das ferramentas em cada tarefa com classificação de 1 a 5 estrelas, sendo 5 a nota máxima.
O uso das ferramentas Github Copilot e Tabnine apresentaram resultados promissores e eficiência na geração de códigos de baixa complexidade. No entanto, ao lidar com códigos mais complexos, a experiência ainda é insatisfatória devido à geração de sugestões imprecisas ou inadequadas. Talvez uma das causas possa ser atribuída à falta de contexto fornecido às ferramentas. Em IDEs, não é natural criar comentários ou explicações extensas, o que pode afetar essas ferramentas na busca por padrões e referências comuns.
Além disso, a forma como essas ferramentas funcionam, gerando sugestão de código à medida que novos códigos são inseridos no IDE, pode limitar as possibilidades de uso, tornando, por exemplo, impossível selecionar um bloco de código e solicitar sua explicação, refatoração ou criação de testes unitários.
Outra situação que pode atrapalhar o fluxo de trabalho do desenvolvedor ocorre especialmente quando as sugestões são imprecisas ou descontextualizadas, gerando sugestões que são constantemente descartadas. Isso é mais comum em contextos iniciais com pouca informação.
O ChatGPT se mostrou muito vantajoso devido à sua flexibilidade e funcionamento em estilo de ChatBot, permitindo que os desenvolvedores solicitem ajuda para diversas atividades de codificação.
Os resultados obtidos com o ChatGPT foram satisfatórios para a maioria das atividades de codificação, embora não sejam perfeitos. No entanto, em relação à criação de testes unitários, não obtivemos um desempenho tão bom. Atribuímos esse baixo desempenho à complexidade e dependências externas do código, o que resultou em testes gerados de forma superficial, ou seja, na verdade são apenas um “esqueleto” de mocks que precisam ser preenchidos posteriormente. Além disso, os cenários gerados foram limitados, normalmente abrangendo apenas testes de sucesso e testes que envolvem o lançamento de exceções.
Um ponto importante a ser considerado para essas ferramentas de IA é o limite de tokens que afeta a capacidade de dados processados. No caso do ChatGPT, que utiliza o modelo GPT-3.5, esse limite é de 4K, o que corresponde aproximadamente a 3.000 palavras em inglês. Modelos mais novos, como o GPT-4, têm limites mais altos, como 8K ou até mesmo 32K tokens, mas não estão disponíveis gratuitamente. Portanto, ao lidar com atividades de codificação, revisão de código ou solução de problemas que envolvam grandes entradas ou respostas, é necessário adotar estratégias para segmentar as tarefas em partes menores e realizar o trabalho de forma incremental.
Em conclusão, as ferramentas Github Copilot, Tabnine e ChatGPT oferecem uma nova perspectiva para auxiliar o desenvolvimento de software e, mesmo no estágio de maturidade atual, já conseguem auxiliar os desenvolvedores, no estilo “pair programming”. No entanto, é importante lembrar que essas ferramentas ainda estão longe de serem perfeitas e é fundamental avaliar cuidadosamente os resultados gerados e ajustá-los de acordo com o contexto específico da aplicação. Ademais, a qualidade da resposta fornecida pelas ferramentas depende muito do contexto e do conhecimento prévio do desenvolvedor. Embora essas ferramentas possam acelerar o processo de desenvolvimento, a avaliação humana, baseada em princípios como o SOLID e boas práticas em geral, ainda é necessária para garantir a qualidade do código produzido.
No geral e, neste momento, o ChatGPT agrega mais valor do que as outras duas ferramentas por sua flexibilidade, mas as perspectivas de evolução dessas ferramentas são promissoras e devem ser acompanhadas de perto pela comunidade de desenvolvedores, principalmente a nova versão do Github Copilot, que prevê integração com o ChatGPT, tornando-a uma ferramenta de suporte à programação muito mais completa.
O mais importante é estarmos sempre atentos às novidades que surgem diariamente e termos a disposição de experimentar para avaliar o que se adapta melhor à realidade de cada desenvolvedor e sua organização.
Autores
Rafael Augusto Scaraficci é líder na área de tecnologias no CPQD e tem mais de 15 anos de experiência no desenvolvimento de sistemas de software, sendo os últimos 5 em sistemas Cloud Native.
Rafael Fernandes Batistella é diretor de Gestão da Tecnologia da Informação e Comunicação no CPQD e tem mais de 20 anos de experiência no desenvolvimento de sistemas de software, atuando como gestor há mais de 10 anos.
Luis Fernando Martins da Rocha é arquiteto de software, programador e entusiasta de práticas de engenharia no CPQD, com mais de 15 anos de experiência no desenvolvimento e sustentação de sistemas críticos de software.
1 https://github.com/features/copilot
2 https://www.tabnine.com/
3 https://openai.com/blog/chatgpt