Comparativo de ferramentas de AI Coding Assistant

Felipe Nishikaku Nishikaku
Livelo

--

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:

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.

A imagem é um gráfico de linhas que representa “Interesse ao longo do tempo” de 12 de outubro de 2023 a 12 de janeiro de 2024. O gráfico inclui pontos de dados para “github copilot” com 72 pontos, “Amazon CodeWhisperer” com 1 ponto, “GitLab DUO” com 1 ponto e “Google Duet Al” com 5 pontos.

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

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.

Captura de tela de uma interface gráfica para uma aplicação. O conteúdo inclui um comando “/tests” e opções para “Aceitar”, “Descartar”, “Gerar novamente“, “Sinal positivo“ e “Sinal negativo“.

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.
Captura de tela do VSCode, opção de criar novo arquivo de acordo com o código atual
  • Visualização para alteração no arquivo — Nas opções de Fix This e Generate Docs a alteração é realizada diretamente no código.
Captura de tela do VSCode, Identificando mudanças sugeridas pela opção fix

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;
Captura de tela do IntelliJ IDEA, auto-complete com retorno sugerido de todos os estudantes. Menu com 1 sugestão com opção de “Insert Code“, “Previous“ e “Next“. Somente a opção “Insert Code“ habilitada.
  • 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.

Captura de tela do VSCode, seta apontando para o ícone da funcionalidade de geração de mensagem de commit de arquivos em staged

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

--

--