Comparativo de ferramentas de AI Coding Assistant
A Inteligência Artificial vem evoluindo consideravelmente, e com ela, os assistentes que auxiliam no desenvolvimento de software: "AI Coding Assistant".
Neste artigo comparamos soluções de AI Coding Assistant que podem ser utilizadas em múltiplas IDEs.
IDE — Integrated Development Environment, ferramenta utilizada para o desenvolvimento de software.
Previsão
De acordo com Gartner, "até 2025, 80% do ciclo de vida do desenvolvimento de produtos fará uso da geração de código por inteligência artificial generativa, com os desenvolvedores atuando como validadores e orquestradores dos componentes e integrações de back-end e front-end. Até 2028, a combinação de humanos e assistentes de IA trabalhando em conjunto poderia reduzir o tempo para completar tarefas de codificação em 30%".
Pesquisas
Pesquisa Stack Overflow
De acordo com a pesquisa realizada pela Stack Overflow em maio de 2023, "a maioria dos entrevistados (77%) tem uma visão favorável das ferramentas de IA para desenvolvimento, com os desenvolvedores profissionais sendo mais propensos à indiferença (17%) em comparação com aqueles que estão aprendendo a programar (15%). Além disso, 70% dos entrevistados estão usando ou planejam usar ferramentas de IA no desenvolvimento este ano, com uma maior probabilidade de uso entre os aprendizes de programação (82%) em comparação com os desenvolvedores profissionais (70%)".
Pesquisa GitHub
De acordo com a pesquisa realizada pelo GitHub e publicada no dia 13 de junho de 2023, "92% dos desenvolvedores baseados nos Estados Unidos já estão utilizando ferramentas de codificação de IA tanto no trabalho quanto fora dele.
70% afirmam que ferramentas de codificação de IA lhes proporcionarão uma vantagem no trabalho, mencionando melhor qualidade de código, tempo de conclusão e resolução de incidentes como alguns dos principais benefícios esperados".
Prós no uso de AI Coding Assistant
- Aumentar a produtividade: Sugestões e auto complementos que diminuem o tempo e auxiliam a produtividade.
- Automatizar tarefas repetitivas: Realizar tarefas repetitivas, como escrever códigos de estrutura básica.
- Redução de impactos negativos: Identificação e correção de erros. Auxílio em possíveis impactos de segurança.
- Agilizar entendimento: Geração de documentações e explicação sobre o código.
Contras no uso de AI Coding Assistant
- Risco de dependência excessiva: Possível diminuição da capacidade de pensamento crítico e adoção de soluções de código que não levam em consideração todo o contexto.
- Redução da criatividade nas resoluções de problemas: Pode encorajar os desenvolvedores seguirem soluções padronizadas, impactando a criatividade e a inovação na resolução de problemas.
- Políticas e privacidade de dados: Podem coletar e armazenar grandes quantidades de dados, o que pode gerar preocupações com a privacidade e segurança das informações.
Avaliação Geral
Para a avaliação das seguintes soluções de AI Coding Assistant, foram consideradas:
- GitLab DUO — https://about.gitlab.com/gitlab-duo/
- Duet AI — https://cloud.google.com/duet-ai?hl=pt-BR
- GitHub Copilot — https://github.com/features/copilot
- Amazon CodeWhisperer — https://aws.amazon.com/pt/codewhisperer/
Observação: nesta comparação não foi levado em consideração planos e contas Free ou individuais.
Planos e Preços
Considerando por usuário pela ordem de menor valor e plano, temos:
- Duet AI — $19 p/ mês no plano anual ou $22,80 no plano mensal.
- GitHub Copilot — Business $19 p/ mês ou Enterprise $39 p/ mês.
- Amazon CodeWhisperer — Apenas o CodeWhisperer $19 p/ mês porém vale a assinatura do Amazon Q Builder por $25 p/ mês. Este é o único assistente dentro dessas opções que oferece versão gratuita, porém os dados são coletados e utilizados para geração de sugestões no CodeWhisperer.
- GitLab DUO — Premium $29 de assinatura p/ mês + $9 mensalmente de GitLab Code Suggestion.
Linguagens de programação
Todos os AI Coding Assistants tem compatibilidade com as linguagens mais utilizadas: Javascript, Python, Java, Typescript…
Popularidade
No quesito popularidade, vamos olhar para duas fontes:
- Interesse pelos nomes dos produtos.
- Notas e Downloads no marketplace da JetBrains e VSCode.
Interesse
Na análise via Google Trends, temos o GitHub Copilot em azul com um grau de interesse bem superior comparado aos demais.
Notas e Downloads
Em JetBrains Marketplace, os assistentes representam:
- GitHub Copilot — Nota 3.0 com 505 avaliações e 5.739.933 downloads.
- Amazon CodeWhisperer-AWS Toolkit — Nota 2.6 com 80 avaliações e 5.902.330 downloads.
- Duet AI-Google Cloud Code— Nota 3.1 com 21 avaliações e 698.567 downloads.
- GitLab DUO— Nota 4.7 com 3 avaliações e 10.050 downloads.
Em Visual Studio Marketplace, os assistentes representam:
- GitHub Copilot — Nota 3.7 com 979 avaliações e 12.140.573 downloads.
- Amazon CodeWhisperer-AWS Toolkit — Nota 2.5 com 60 avaliações e 1.961.572 downloads.
- Duet AI-Google Cloud Code — Nota 2.8 com 44 avaliações e 1.020.613 downloads.
- GitLab DUO — Nota 3.7 com 75 avaliações e 1.357.478 downloads.
Privacidade
- Duet AI — Os dados de entrada e respostas não são utilizados para treinar o modelo. Os dados de solicitações são criptografados.
- GitHub Copilot — Nas versões Business e Enterprise, os dados de entrada “prompt” são descartados logo após a resposta, e os dados das sugestões não são armazenados. Dados de participação do usuário são retidos por 24 meses como “mensagens de erro e dados de uso gerais para identificar métricas do usuário, como latência e participação de recursos. Essas informações podem incluir dados pessoais, como identificadores sob pseudônimo”.
- Amazon CodeWhisperer — Na versão gratuita as informações de seu código ficam retidos para gerar sugestões para o CodeWhisper. Já nas versões das assinaturas Code Whisperer e Amazon Q Builder, os dados não são coletados. Os dados de telemetria são armazenados, como por exemplo: dados que identifiquem a pessoa "ip" e avaliações "aceite e rejeitado".
- GitLab DUO — Não utiliza os dados para treino e a retenção depende do modelo. GitLab DUO utiliza duas AIs: Google Vertex AI e Anthropic — Claude. No Google Vertex AI os dados não são armazenados, descartando imediatamente os dados de entrada e saída após fornecer a saída, e o Anthropic — Claude retém os dados de entrada e saída por 30 dias.
IDE
Todas estão disponíveis em IDEs da JetBrains e VSCode.
IntelliJ IDEA
No IntelliJ IDEA, a instalação dos assistentes é realizada por meio da opção de plugins da JetBrains.
- Amazon CodeWhisperer — Plugin AWS ToolKit apresenta um novo menu com 3 abas: Amazon Q + CodeWhisperer, Explorer e Developer Tools. O Chat é acessado via Amazon Q — Chat with Q.
- Duet AI — Plugin Google Cloud Code apresenta sete novos menus: Cloud Run, Kubernetes Explorer, Compute Engine, Secret Manager, Duet AI: Chat, Google Cloud Storage (GCS) e Google Cloud Databases.
- GitHub Copilot —Plugin GitHub Copilot com dois novos menus: GitHub Copilot e GitHub Copilot Chat.
- GitLab DUO —Plugin GitLab Duo não aplica nenhum novo menu, apenas ícone para ativar ou desativar as sugestões do GitLab Duo.
VSCode
No VSCode, a instalação dos assistentes é realizada por meio da opção de extensões do VSCode.
- Amazon CodeWhisperer —Extensão AWS Toolkit com a configuração Amazon Q + CodeWhisperer, na extensão temos dois novos menus:
- AWS "Amazon Q, CodeWhisperer, Explorer, CDK e Code Catalyst"
- Amazon Q Chat para funcionalidade de Chat. - Duet AI — Extensão Google Cloud Code, com a extensão temos dois novos menus:
- Cloud Code "Development Sessions, Kubernetes, Cloud Run, Cloud APIs, Secret Manager, Compute Engine, Apigee, Cloud Functions e Help and Feedback". - Duet AI para funcionalidade de Chat.
- Gitlab DUO — Extensão GitLab Workflow, a extensão disponibiliza dois novos menus:
- Controle de issues e merge requests.
- GitLab DUO Chat para funcionalidade de Chat. - GitHub Copilot — Extensão GitHub Copilot, a extensão GitHub Copilot Chat é instalada como dependência automaticamente. Com a extensão, temos um novo menu Chat.
Observações
Caso utilize ecossistema da AWS, observe que com o AWS ToolKit é possível configurar o AWS Explorer habilitando a visão geral de alguns serviços por região: “API Gateway, App Runner, CloudFormation, CloudWatch Logs, ECR, ECS, IoT, Lambda, S3, Schemas, Step Functions, System Manager e Resources” e CDK / Amazon CodeCatalyst para infraestrutura como código (IaC).
A escolha da IDE impactou nos resultados obtidos pelos assistentes, logo as avaliações foram realizadas via VSCode.
Usabilidade na edição de código
Pelos testes realizados no VSCode, a usabilidade do GitHub Copilot e Github Copilot e GitLab Duo apresentam uma opção específica no menu com click direito. Estas são as opções para cada menu do assistente:
- Amazon CodeWhisperer — Explain, Refactor, Fix, Optimize e Send To Prompt.
- GitHub Copilot — Start Inline Chat, Explain This, Generate Docs e Generate Tests.
- GitLab DUO — Explain selected code, Generate Tests e Refactor.
- Duet AI — Não contém menu específico no click direito, porém é possível chamar Explain This e Generate Unit Test via click direito do mouse.
Observação: A opção Generate Code via Duet AI mandou o mesmo comando de Generate unit test.
No GitHub Copilot utilizando VSCode, após escolher uma das opções no menu, um chat é mostrado acima do código, disponibilizando as interações de:
- Edição de prompt — Mudança de prompt, como por exemplo o /test apresentado na imagem, gerando novo resultado.
- Feedbacks — Avaliação “positiva e negativa”, aceitar e descartar resultado.
- Visualização para novo arquivo —Na opção de Generate Tests, é disponibilizado a opção para Criar novo arquivo a partir dos dados do resultado sugerido.
- Visualização para alteração no arquivo — Nas opções de Fix This e Generate Docs a alteração é realizada diretamente no código.
Estes modos de visualização facilitam o trabalho, comparando o código anterior com a sugestão do assistente.
Usabilidade no Chat
Atualmente as 4 opções disponibilizam uma interface de Chat, melhorando consideravelmente a experiência.
Segue a lista de recursos dentro do chat para cada assistente no VSCode:
- GitHub Copilot com Chat GitHub Copilot — Avaliação “positiva ou negativa”, cópia de resultado, inserção no arquivo atual, abrir em um arquivo, inserir no terminal campo de prompt .
- Duet AI com Duet AI Chat — Avaliação “positiva ou negativa”, cópia de resultado, inserção no arquivo atual, abrir em um arquivo e campo de prompt.
- Amazon CodeWhisperer com Amazon Q — Inserção no arquivo atual, cópia de resultado, Avaliação “positiva ou negativa” e campo de prompt.
- GitLab DUO com GitLab DUO Chat — Cópia de resultado e campo de prompt.
Apontamentos para IntelliJ IDEA:
- Amazon CodeWhisperer com Amazon Q — Chat funcionou igual a versão apresentada no VSCode.
- Duet AI Chat — Chat funcionou normalmente, porém apenas com a opção de cópia de resultado.
- GitLab DUO Chat — Não esta disponível para o IntelliJ IDEA.
- Chat GitHub Copilot — Para individual é necessário entrar numa lista de espera, para Enterprise e Business é necessário ativação.
Amazon Q não reconhece prompt em português.
Avaliações dos recursos técnicos
Para as avaliações foram utilizados exemplos de códigos simples, como :
Java
package com.validation.rest.student;
import java.net.URI;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/students")
public class StudentResource {
@Autowired
private StudentRepository studentRepository;
@GetMapping
public List<Student> getAllStudents() {
return studentRepository.findAll();
}
@GetMapping("/{id}")
public ResponseEntity<Student> getStudent(@PathVariable long id) {
Optional<Student> student = studentRepository.findById(id);
return student.map(ResponseEntity::ok)
.orElseThrow(() -> new StudentNotFoundException("id-" + id));
}
@DeleteMapping("/{id}")
public void deleteStudent(@PathVariable long id) {
studentRepository.deleteById(id);
}
@PostMapping
public ResponseEntity<Object> createStudent(@RequestBody Student student) {
Student savedStudent = studentRepository.save(student);
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(savedStudent.getId())
.toUri();
return ResponseEntity.created(location).build();
}
@PutMapping("/{id}")
public ResponseEntity<Object> updateStudent(@RequestBody Student student, @PathVariable long id) {
Optional<Student> studentOptional = studentRepository.findById(id);
if (studentOptional.isEmpty()) {
return ResponseEntity.notFound().build();
}
student.setId(id);
studentRepository.save(student);
return ResponseEntity.noContent().build();
}
}
package com.validation.rest.student;
public class StudentNotFoundException extends RuntimeException {
public StudentNotFoundException(String exception) {
super(exception);
}
}
Python
import requests
from requests.exceptions import HTTPError
from requests.adapters import HTTPAdapter, Retry
class HttpClientUtil:
def __init__(self, handler):
self.handler = handler
self.isJsonResponse = None
self.response = None
def __get_formatted_response(self):
return self.response.json() if self.isJsonResponse else self.response.text
def __session(self):
session = requests.Session()
retry = Retry(backoff_factor=1, total=10, connect=10)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
return session
def __request(self, method, url, headers=None, data=None, json=None, verify=None, timeout=60):
try:
session = self.__session()
self.response = method(url, headers=headers, data=data, json=json, timeout=timeout, verify=verify)
self.isJsonResponse = 'json' in self.response.headers.get('Content-Type', '').lower()
self.response.raise_for_status()
self.handler.success(self.__get_formatted_response())
except HTTPError as http_err:
self.handler.httpError(http_err)
except Exception as err:
self.handler.exceptionError(err)
def post(self, url, json=None, data=None, headers=None, verify=None):
self.__request(requests.post, url, headers, data=data, json=json, verify=verify)
def get(self, url, headers=None, verify=None):
self.__request(requests.get, url, headers, verify=verify)
Typescript
import React from "react";
import PropTypes from "prop-types";
import "./Button.css";
class Button extends React.Component {
static propTypes = {
name: PropTypes.string,
orange: PropTypes.bool,
wide: PropTypes.bool,
clickHandler: PropTypes.func,
};
handleClick = () => {
const { clickHandler, name } = this.props;
clickHandler(name);
};
render() {
const { name, orange, wide } = this.props;
const className = [
"component-button",
orange ? "orange" : "",
wide ? "wide" : "",
].join(" ").trim();
return (
<div className={className}>
<button onClick={this.handleClick}>{name}</button>
</div>
);
}
}
export default Button;
Para a avaliação, foi considerada a IDE VSCode, porém durante as avaliações dos recursos técnicos, é possível visualizar alguns apontamentos para IntelliJ IDEA.
Auto-complete
Quando utilizado o VSCode, todos os assistentes retornaram com uma resposta rápida e coerente para: python, java e javascript.
Apontamentos para IntelliJ IDEA:
- Amazon CodeWhisperer — Retornou o auto-complete com sucesso, também mostrou recurso dentro da IDE para novas sugestões de auto-complete;
- Duet AI — Retornou o auto-complete com sucesso.
- GitLab DUO — O auto-complete não retornou um bloco de resultado, foi necessário ir linha por linha para auto-completar o retorno.
- GitHub Copilot — Obteve respostas incompletas, como este, por exemplo:
.andExpect(jsonPath("$[0].email").value("
Geração de mensagem de commit
Apenas o VSCode utilizando o GitHub Copilot contém o recurso de geração mensagem de commit. Para esta funcionalidade, o VSCode disponibiliza um ícone na opção de Source Control.
Um detalhe importante, nem sempre a AI do GitHub Copilot captura todos os arquivos que estão em staged, então em alguns momentos é necessário gerar novamente.
Geração de Teste
Para a geração de testes, os assistentes demonstraram resultados diferentes:
- GitHub Copilot — Retornou unit test funcionais, sendo necessários pequenos ajustes como no caso do Java, e a inclusão de imports e atualizações no pom.xml;
- Amazon CodeWhisperer — Em vez de gerar os testes, infelizmente apresentou:
// other tests for each method
- Duet AI — Retornou links de referência, porém o resultado foi um unit test não funcional;
- GitLab DUO — O tempo de resposta foi de cerca de 23 segundos e o resultado não retornou os imports;
Documentação
O ideal foi utilizar o chat para geração de uma melhor definição de documentação. Segue prompts utilizados:
Generate Swagger documentation
Generate use case documentation
- Amazon CodeWhisperer—No caso do Swagger, foi informado passo a passo para utilização do openapi-generator, e para o use case também retornou resposta de acordo com a proposta do código. Caso o prompt estivesse em português, o retorno seria:
I apologize, but I’m not able to respond to this request. Perhaps we could find another topic to discuss?
- GitHub Copilot — Analisou que deveriam ser feitas as anotações para geração do Swagger e com respostas corretas para use cases;
- Duet AI — Foi o que retornou mais rápido, não levou em conta as anotações e gerou o Swagger criando parâmetros sem se basear na entidade estudante;
- GitLab DUO — Para o caso do Swagger levou cerca de 8 segundos, o resultado foi um exemplo de como gerar um Swagger e para o use case retornou timeout;
Explicação sobre o código
No VSCode, todos os assistentes retornaram explicações coerentes sobre a proposta do código, tanto utilizando comando quanto diretamente o chat pelos prompts:
explique sobre o código
Explain the source
Exemplo de retornos:
- GitHub Copilot — Via Explain This o retorno em inglês:
The selected code is a Spring Boot REST controller named StudentResource. This controller is responsible for handling HTTP requests related to Student entities. It uses the StudentRepository to interact with the database.
The @RestController annotation at the class level indicates that this class is a REST controller. This means that the methods in this class will handle HTTP requests and responses.
The @Autowired annotation is used to inject the StudentRepository instance into the StudentResource class. This repository is used to perform CRUD (Create, Read, Update, Delete) operations on Student entities.
E via Chat “explique sobre o código”, não foi possível gerar uma resposta pois o prompt não está em português:
Este é um método de atualização de um estudante em um sistema, provavelmente em uma API REST, usando Spring Boot em Java. Aqui está o que cada parte do código faz:
@PutMapping(“/students/{id}”): Esta é uma anotação do Spring Boot que mapeia solicitações HTTP PUT para o método updateStudent. O {id} na URL é um parâmetro de caminho que pode ser acessado no método.
public ResponseEntity<Object> updateStudent(@RequestBody Student student, @PathVariable long id): Este é o método que é chamado quando uma solicitação PUT é feita. O objeto Student é automaticamente construído a partir do corpo da solicitação HTTP (devido à anotação @RequestBody). O id é extraído da URL (devido à anotação @PathVariable).
- Duet AI Chat — Via opção de menu Explain This:
Sure. The code you provided is an example of a Spring Boot RESTful API controller for managing students. The controller exposes a number of endpoints, including:
GET /students: This endpoint returns a list of all students in the database.
GET /students/{id}: This endpoint returns a single student by their ID.
DELETE /students/{id}: This endpoint deletes a student by their ID…
E via Chat "explique sobre o código":
O código que você forneceu é um exemplo de um controlador RESTful de serviço de estudante usando Spring Boot. O controlador expõe uma série de endpoints, incluindo:
GET /students: Este endpoint retorna uma lista de todos os alunos no banco de dados.
GET /students/{id}: Este endpoint retorna um único aluno por seu ID.
DELETE /students/{id}: Este endpoint exclui um aluno por seu ID…
- GitLab DUO — Via Explain selected code o retorno em inglês:
This is a REST controller for CRUD operations on Student entities.
It uses Spring MVC annotations:
@RestController to mark this as a REST controller
GetMapping, @PostMapping etc to map HTTP methods to handler methods
The key methods are:retrieveAllStudents() — GET all students
Uses StudentRepository.findAll() to get all students…
E via Chat “explique sobre o código”, não foi possível gerar uma resposta pois o prompt não está em português:
Este é um controlador REST Spring para operações CRUD em entidades Student.
Ele usa anotações Spring MVC:
@RestController para marcar isso como um controlador REST
@GetMapping, @PostMapping etc para mapear métodos HTTP para métodos manipuladores
Os métodos principais são:retrieveAllStudents() — GET todos os alunos
Usa StudentRepository.findAll() para obter todos os alunos…
- Amazon CodeWhisperer — Via opção de menu Explain o retorno em inglês:
The selected code block contains the implementation of a REST API for managing Student entities using Spring Boot and Java.
Some key things to note:
It is annotated with @RestController, indicating it will serve as a REST API controller.
There are GET, POST, PUT, DELETE methods mapped to URLs to perform CRUD operations on Student entities.
The GET methods retrieve all students or a student by ID. It handles the case where a student is not found by ID.
E via Chat “explique sobre o código” não foi possível gerar uma resposta pois o prompt não está em português:
I apologize, but I’m not able to respond to this request. Perhaps we could find another topic to discuss?
Fix, Refactor e Optimize
Para este item, foi realizado algumas modificações sutis nos códigos, como por exemplo incluir magic numbers, ifs e etc.
- Amazon CodeWhisperer — Em refactor, o chat informou quais seriam as boas práticas de programação separando em outras camadas, como por exemplo: service e controller. Na ação de fix, o chat informou quais eram os ajustes necessários com sucesso, removendo e alterando códigos indevidos. Em optimize, a resposta otimizou o código diminuindo verbosidade e removendo condições indevidas;
- GitLab DUO — Em refactor o assistente foi coeso mudando os nomes dos métodos, removendo e alterando códigos indevidos. O assistente não tem opção de fix e optimize;
- GitHub Copilot — Em fix a sugestão foi apenas a remoção das variáveis inválidas. O assistente não tem as opções de refactor e optimize;
- Duet AI — Não apresenta nenhuma das opções de refactor, fix e optimize;
Conclusão
Dado os resultados apresentados acima, concluímos que o GitHub Copilot atende às necessidades gerais dos profissionais que utilizam VSCode. Mesmo não tendo todas as opções comparadas aos outros assistentes, o chat e as funcionalidades ligadas ao VSCode tornaram o trabalho mais ágil.
O uso do Amazon CodeWhisperer pode ser interessante para profissionais que atuam no ecossistema AWS e também para profissionais que utilizam IDE da JetBrains.
O Duet AI, GitLab DUO e Amazon Q Builder —Amazon CodeWhisperer , além de AI Coding Assistant, também são utilizados em seus respectivos ecossistemas, então vamos ficar de olho e acompanhar as evoluções desses grandes players.
Referências
- https://survey.stackoverflow.co/2023/#ai
- https://www.gartner.com/en/documents/4348899
- https://thenewstack.io/generative-ai-in-2023-genai-tools-became-table-stakes/
- https://www.jetbrains.com/lp/devecosystem-2023/languages/?source=google&medium=cpc&campaign=LATAM_en_DC_Devecosystem2023_results_General_Search&term=computer%20langues&content=685412994446&gclid=Cj0KCQiAnfmsBhDfARIsAM7MKi1u1Stb87iR1nTGIhu0-DMxAD4Zxl7TvXhp1BVrzlXuTHb3Wb22X8oaAnGWEALw_wcB
- https://aws.amazon.com/q/pricing/
- https://cloud.google.com/duet-ai/docs/discover/data-governance?_ga=2.223903772.-608844344.1704748454&hl=pt-br
- https://cloud.google.com/duet-ai/docs/discover/data-governance?_ga=2.223903772.-608844344.1704748454&hl=pt-br
- https://docs.github.com/pt/site-policy/privacy-policies/github-copilot-business-privacy-statement
- https://docs.gitlab.com/ee/user/ai_features.html#data-usage
- https://docs.aws.amazon.com/codewhisperer/latest/userguide/whisper-data-protection.html
- https://trends.google.com.br/trends/explore?date=today%203-m&q=github%20copilot,Amazon%20CodeWhisperer,GitLab%20DUO,Google%20Duet%20AI&hl=pt-BR