Alguns desenvolvedores experientes dizem que o ChatGPT e outras ferramentas atuais de IA podem ajudar todos a aprender programação. Mas será que esse método é confiável para quem está começando a usar código, e não tem tanta base para avaliar se as soluções sugeridas são adequadas?

Robô humanoide sentado e segurando tela
Inteligência artificial (imagem: Andrea De Santis / Unsplash)

É bastante claro que o ChatGPT e similares já estão ajudando muitos a trabalhar com mais eficiência. No entanto, a maioria das pessoas que eu conheço com esse tipo de experiência já são programadores altamente qualificados, bastante capazes de avaliar se as sugestões são adequadas.

Para essas pessoas, o ChatGPT é como um colega que está sempre pronto para colaborar, que tem recomendações bem úteis na maioria das vezes, mas que de vez em quando dá sugestões muito ruins. Se você consegue filtrar as ideias boas das ruins, provavelmente poderá trabalhar bem com esse tipo de assistente automatizado.

Mas, aqui, eu quero me concentrar no desempenho da iteração atual do ChatGPT e de seus similares para pessoas que são mais novas na programação.

Este conteúdo foi publicado originalmente na newsletter Mostly Python do programador e escritor Eric Matthes. O texto foi traduzido, adaptado e republicado pelo Tecnoblog com autorização do autor.

Um breve contexto, e um ranking de vencedores

Suponha que você tem uma lista de nomes, e você quer criar um programa para exibir cada um desses nomes. Em Python, podemos usar o loop for: esta função repete a mesma operação para os itens de uma lista – por exemplo, mostrá-los um por um na tela.

Os loops for em Python não têm uma variável de índice – ou seja, que indiquem se o termo de uma lista está em 1º lugar, 2º lugar, 3º lugar e assim por diante. Mas e quando você deseja trabalhar com o índice de cada item dentro de um loop?

Imagine uma lista de pessoas que terminaram uma corrida. Queremos exibir um número ao lado de cada vencedor, representando a posição em que chegaram. Aqui está um loop for para exibir os vencedores, sem nenhum número:

# vencedores.py

vencedores = ["elisa", "renan", "camila"]

print("Os vencedores são:")
for vencedor in vencedores:
    print(vencedor.title())

Esta é a saída:

Os vencedores são:
Elisa
Renan
Camila

Mas nós gostaríamos que fosse assim:

Os vencedores são:
1. Elisa
2. Renan
3. Camila

Vou perguntar para o ChatGPT como obter o índice das variáveis em um loop for, e pedir para a IA avaliar suas próprias sugestões. Esta é uma pergunta com uma resposta correta bastante óbvia, e que também pode ter algumas alternativas possíveis.

Você poderia usar uma variável com counter para gerar essa saída, mas seria melhor usar apenas o índice de cada item. Imagine por um momento que ainda não sabemos como fazer isso; nós só fomos apresentados a loops simples em Python, como mostrado acima.

A resposta inicial do ChatGPT

As respostas da inteligência artificial da OpenAI são altamente dependentes da maneira como você pergunta. Elas também não são muito consistentes: você pode fornecer exatamente a mesma série de prompts em sessões diferentes e obter sugestões bastante distintas.

Eu utilizei frases em linguagem natural nesta sessão, como alguém que usa um mecanismo de busca como o Google há muito tempo.

Na primeira interação com o ChatGPT para esta sessão, eu escrevi: “loop for no Python obter índice de cada item”. Esta foi a resposta:

Você pode usar a função enumerate() para obter o índice de cada item em um loop for no Python.

minha_lista = [1, 2, 3, 4, 5]
for index, item in enumerate(minha_lista):
   print(index, item)

A função enumerate() retorna um iterador que gera pares do índice e do item correspondente. O loop for atribui esses valores para as variáveis ‘index’ e ‘item’ respectivamente, para você conseguir trabalhar com elas dentro do loop.

chatgpt pergunta

Essa sugestão funciona e é a solução mais adequada para esse prompt. Aqui está o nosso programa, usando esta proposta:

# vencedores_ranking.py

vencedores = ["elisa", "renan", "camila"]

print("Os vencedores são:")
for index, vencedor in enumerate(vencedores):
    ranking = index + 1
    print(f"{ranking}. {vencedor. title()}")

E aqui está a saída, com a posição de cada competidor:

Os vencedores são:
1. Elisa
2. Renan
3. Camila

Mas e se não soubéssemos que esta é a solução mais adequada e quiséssemos dar seguimento a esta questão? Faremos isso mais abaixo, mas primeiro vamos falar sobre código idiomático.

O que é código idiomático?

O código idiomático usa os recursos de uma linguagem de programação de um jeito adequado ao problema em questão. Ele tende a ser conciso, fácil de verificar e fácil de expandir – mas nem sempre parece correto para alguém familiarizado com outra linguagem.

Imagine uma pessoa com muita experiência no uso de Java. Ela criou vários projetos funcionais em Java, mantendo-os e otimizando ao longo do tempo. Ela decide aprender Python e, como já sabe programar em outra linguagem, ela absorve a sintaxe do Python rapidamente.

Muitas vezes, alguém nessa situação escreverá um código Python que ainda parece Java. A pessoa está traduzindo, sem perceber, as soluções do Java que vêm à mente para a sintaxe do Python, em vez de considerar a melhor forma de resolver o problema usando tudo o que o Python oferece.

Isso significa que o código em questão está sintaticamente correto, mas não é idiomático.

Para ser claro, esse fenômeno também acontece ao contrário. Programadores experientes em Python podem aprender Java rapidamente e tentar escrever soluções pythônicas em Java. Programadores experientes de Java revisarão esse código e o acharão deselegante e impossível de manter.

Ao avaliar um código, geralmente analisamos estes fatores críticos:

  • O código funciona? (Ele gera os resultados corretos?)
  • O código é eficiente o suficiente para a carga de trabalho atual? (Ele roda rápido o bastante?)
  • O código é sustentável? (Outros programadores familiarizados com esta linguagem entenderiam o que você escreveu?)

Esse último ponto é muito importante, pois o código idiomático é muito mais fácil de manter do que o código não idiomático. Toda linguagem de programação é projetada de forma que seus recursos devam ser usados de uma certa maneira para resolver tipos específicos de problemas.

Qualquer que seja a linguagem de programação, é necessário aprender os modos de pensar dela e escrever um código idiomático a partir daí.

No entanto, o ChatGPT pode ser como um programador competente que acabou de aprender uma nova linguagem. Seu código é quase sempre sintaticamente correto, mas pode não ser muito idiomático.

ChatGPT lista outras abordagens

Estando ciente da questão do código idiomático, mas me colocando na mentalidade de uma pessoa que é iniciante em Python, quero perguntar ao ChatGPT se há outras maneiras de abordar aquela questão dos vencedores.

Eu digitei apenas o seguinte: “existem outras abordagens?”. A resposta:

Sim, há outras maneiras de obter o índice de cada item em um loop for do Python. Aqui estão alguns exemplos:

1. Usando a função range():

minha_lista = [1, 2, 3, 4, 5]
for i in range(len(minha_lista)):
   print(i, minha_lista[i])

2. Usando a função zip():

minha_lista = [1, 2, 3, 4, 5]
for i, item in zip(range(len(minha_lista)), minha_lista):
   print(i, item)

3. Usando compreensão de lista:

minha_lista = [1, 2, 3, 4, 5]
for i, item in [(i, item) for i, item in enumerate(minha_lista)]:
   print(i, minha_lista[i])

Todos os exemplos acima vão produzir a mesma saída. Você pode escolher uma abordagem que considere a mais legível e fácil de entender.

python chatgpt

Isso não é muito bom.

A primeira sugestão, usar range(), não é nem um pouco apropriada em Python. Essa é a ação de loop usada em linguagens semelhantes ao C. Esta é uma forma em que você mesmo precisa gerenciar toda a indexação do loop. O Python foi escrito especificamente para não exigir que todo programador escreva esse tipo de código.

A segunda sugestão, envolvendo zip(), não é muito melhor.

Esta é uma função muito útil para se conhecer, mas não é apropriada para usar nessa situação – seria como escrever sua própria implementação de enumerate(), um trabalho desnecessário.

A terceira sugestão, embora sintaticamente válida, é um lixo total. Está usando enumerate() em uma compreensão de lista, da qual fazemos um loop para extrair os resultados da enumeração. Veja como esse tipo de loop ficaria em nosso exemplo inicial:

for i, vencedor in [(i, vencedor) for i, vencedor in enumerate(vencedores)]:
    print(f"{i+1}. {vencedor.title()}")

Olha a quantidade de vezes que precisamos escrever “i, vencedor” na mesma linha! Não consigo imaginar nenhuma linguagem na qual essa seja uma maneira remotamente apropriada de resolver esse problema.

Algumas pessoas tentam escrever códigos excessivamente complexos, pensando que isso tornará mais difícil para a empresa demiti-los. Talvez esta sugestão da IA seja atraente para esse tipo de gente?

O real problema com as respostas do ChatGPT

Essas sugestões de código não são o verdadeiro problema na resposta do ChatGPT. O maior entrave é a forma em que ele avalia suas próprias sugestões:

Todos os exemplos acima vão produzir a mesma saída. Você pode escolher uma abordagem que considere a mais legível e fácil de entender.

Superficialmente, isso talvez pareça fazer sentido. A primeira afirmação está correta: sim, todas essas abordagens geram o mesmo tipo de saída.

A segunda declaração é problemática, porque encobre o fato de que todas essas abordagens deixarão claro que você não entende muito bem de Python.

Isso é parte do motivo pelo qual estamos vendo muitos elogios ao ChatGPT vindos de programadores experientes. Se você passa o olho e reconhece rapidamente a melhor opção, e não se deixa enganar por nenhuma das outras sugestões, então é possível trabalhar mais rapidamente com o ChatGPT como um assistente.

Mas se você é novo em programação, avaliar todas essas outras opções não é trivial e nem um pouco óbvio.

Os programadores mais novos podem pensar que a solução enumerate() é a “mais legível e fácil de entender”, mas também podem ser confundidos pelo uso de uma função em um loop for. Talvez eles tenham passado algum tempo trabalhando com uma linguagem semelhante à C e as soluções baseadas em índice pareçam mais “legíveis” para eles.

Nesse caso, o ChatGPT é um assistente pouco confiável – não porque seja excessivamente confiante, mas por apresentar soluções boas e ruins como equivalentes.

Uma comparação potencialmente enganosa

Eu continuei no ChatGPT para perguntar qual seria a melhor abordagem. Assim, perguntei: “Qual das abordagens que você mostrou é a melhor?”.

A resposta usa a palavra “pythônica”, que vem do inglês “Pythonic” e se refere a um código idiomático em Python. Veja a seguir:

O melhor jeito depende de seu caso específico e preferência pessoal. Aqui está uma breve comparação das abordagens que lhe mostrei:

  1. Usar a função enumerate() é a maneira mais concisa e legível para obter o índice e o item correspondente em um loop for. Também é a forma mais pythônica de fazê-lo, porque é uma função especificamente criada para esse propósito.
  2. Usar a função range() e indexar a lista é uma abordagem simples, mas pode ser menos legível do que usar a função enumerate(), porque exige uma linha adicional para conseguir o item da lista.
  3. Usar a função zip() é parecido com usar a função range(), mas é levemente mais concisa e pode ser mais legível, porque emparelha o índice e o item correspondente em uma única linha.
  4. Usar a lista de compreensão é uma técnica mais avançada, e é menos legível do que as outras três abordagens. Ela não é recomendada para loops únicos.

No geral, eu recomendaria usar enumerate() como a primeira escolha, isso porque é o meio pythônico mais legível para conseguir o índice e o item correspondente em um loop. E se você tem um requerimento específico que não seja atendido pelo enumerate(), você pode escolher outro jeito que se encaixe em suas necessidades.

Lista em Python ChatGPT

Essa comparação, para mim, é potencialmente bem enganosa. Ele afirma corretamente que enumerate() é a forma “mais concisa e legível” e até usa a palavra “pythônica”. Também chama a abordagem range() de “menos legível”, o que é uma avaliação apropriada.

No entanto, a IA sugere que a forma zip() é “um pouco mais concisa e pode ser mais legível” do que a solução anterior, não muito apropriada, que usa range(). Fazer esse comentário favorável sobre a solução zip() é um exagero.

O quarto ponto, que descreve a compreensão de lista como “uma técnica mais avançada”, é totalmente enganoso.

As pessoas mais novas em uma linguagem devem estar atentas às técnicas avançadas, para que possam conhecê-las e começar a usá-las assim que conseguirem. Mas a abordagem proposta pelo ChatGPT literalmente nunca seria apropriada.

Tome cuidado com o ChatGPT em programação

O ChatGPT se encaixa bem em alguns fluxos de trabalho, mas os iniciantes em programação – ou em uma nova linguagem – precisam ter cuidado ao interpretar a saída e as respostas desses assistentes.

Como eu disse antes, o ChatGPT e seus similares não vão desaparecer. Veremos mais dessas ferramentas e veremos uma variedade de opiniões dadas sobre elas. Acho que precisamos ter cuidado para ajudar as pessoas a saberem quando usar essas tecnologias, e quando evitarem se distrair ou serem enganadas por elas.

Os professores também devem estar cientes de que simplesmente dar aos alunos acesso a ferramentas de IA não permite que eles aprendam tudo o que desejam de forma totalmente independente.

Sou totalmente a favor de ferramentas e recursos que apoiem o aprendizado independente. No entanto, é necessário ter uma base prévia de conhecimento relevante para entender a saída gerada pelo ChatGPT e similares.

Uma última observação, para irmos além do uso do ChatGPT especificamente para aprendizado. Há ferramentas e empresas sendo criadas com forte dependência ao ChatGPT. Parte delas será bastante útil a longo prazo; mas algumas devem fracassar por não serem críticas o suficiente ao trabalhar com as respostas de uma IA.

Se você estiver trabalhando com o ChatGPT em algo que vá além de exploração, avalie criticamente as sugestões que ele está fazendo.

Cuidado ao tentar usar o ChatGPT para aprender Python