Executando verificação de segurança...
19

Programar não é codar: O impacto das LLMs na programação

TL;DR

  • O entendimento é, e continuará sendo, o ativo mais valioso no desenvolvimento de software.
  • Escrever é uma das formas mais eficazes de construir e solidificar esse entendimento.
  • LLMs podem produzir código, mas ao fazê-lo, frequentemente reduzem o entendimento que adquiriríamos de outra forma.
  • Uma das habilidades chave na era da IA é saber quando o entendimento é mais importante do que ter algo que só funciona.
  • A indústria está sistematicamente superestimando o valor do código que só funciona e subestimando o custo da falta de entendimento.

Ressalvas

  • LLMs são ferramentas úteis. Elas já melhoram o trabalho diário de muitos programadores (incluindo eu), e esse impacto só tende a crescer. Este texto não é um argumento contra o uso de IA, nem contra pessoas que dependem dela.
  • Eu também não sou afiliado, nem patrocinado, por nenhuma organização explicitamente pró- ou anti-IA.

O que realmente é programação?

“Codificar está para programar assim como digitar está para escrever.” - Leslie Lamport (tradução livre)

Programação, em sua essência, é o ato de definir um conjunto de instruções a ser executado por um computador. Este conjunto de instruções é o que chamamos de programa.

Acredito ser óbvio que uma pessoa que não sabe cozinhar não pode produzir uma receita adequada, mesmo que fale português perfeitamente. O mesmo se aplica à programação: pode-se saber tudo o que há para saber sobre uma linguagem de programação e ainda ser completamente incapaz de resolver um problema com ela.

Em suma, saber C não te torna Linus Torvalds, assim como saber português não te torna Machado de Assis.

Para programar, é preciso não apenas dominar a linguagem em que o programa está escrito, mas também entender profundamente o problema que está sendo resolvido e suas restrições. Esse entendimento deve ser profundo o suficiente para ser traduzido em uma sequência concreta de passos que um computador real pode executar.

Programar, portanto, não é apenas codificar. E seu resultado não é apenas o código que funciona, mas também o entendimento do problema, dos tradeoffs e das restrições acumuladas ao longo do caminho.

Por que o entendimento é importante? (e sempre será)

“Não tive tempo de escrever uma carta curta, então escrevi uma longa.” - Mark Twain (tradução livre)

Quando você entende algo, você consegue distinguir o que realmente importa do que é ruído. Isso permite que você expresse soluções de forma mais clara e eficiente.

Na programação, a falta de entendimento frequentemente se manifesta como lógica desnecessária expressa como código ruim que roda muito lentamente porque usa as abstrações erradas e causa mais problemas do que resolve.

Essa ineficiência se propaga em muitas dimensões: recursos computacionais desperdiçados, aumento do esforço para adicionar funcionalidades, dificuldade em manter a compatibilidade com versões anteriores e maior carga cognitiva para qualquer um que tente entender o código mais tarde.

Mas mesmo que você consiga construir um sistema perfeito, ele é perfeito apenas para um contexto específico. Eventualmente, os requisitos mudam, as restrições se alteram ou as suposições se tornam inválidas.

Quando você entende um sistema, pode adaptá-lo incrementalmente. Você não precisa demolir a casa só porque quer pintar uma parede.

Na programação, a falta de entendimento frequentemente leva ao clássico cenário de "reescrever do zero". Como não podemos raciocinar sobre a estrutura existente, a única solução aparente é jogar tudo fora e começar de novo.

A necessidade de eficiência e a presença constante de mudanças garantem que o entendimento sempre será importante na programação.

Impactos da geração de código por LLMs no entendimento

“Escrever é a maneira que a natureza tem de te deixar saber o quão desleixado é o seu pensamento.” - Richard Guindon (tradução livre)

É fato bem estabelecido que escrever é uma das formas mais eficazes de consolidar conhecimento e construir entendimento. Programar é uma forma particularmente rigorosa de escrita: ela usa uma linguagem extremamente precisa e fornece feedback rápido e não ambíguo quando seu modelo mental está errado.

Quando um LLM traduz um prompt vago ou parcialmente formado em código funcional, ele remove grande parte dessa fricção. Mesmo que o código gerado seja idêntico ao que você teria escrito, o entendimento que você ganha com o processo é significativamente reduzido.

O entendimento é construído através da fricção: lidar com ideias conflitantes, notar que uma abstração está vazando, antecipar um bug enquanto escreve a linha que o introduz, reescrever a mesma lógica várias vezes antes de reconhecer um padrão comum. Esse processo força a clareza.

Ao delegar a maior parte da escrita a um LLM, essa fricção é fortemente diluída ou totalmente removida.

Usar o prompt ou não usar o prompt?

"Depende." - Algum Desenvolvedor Sênior

Isso tudo naturalmente levanta a questão: quando devemos usar LLMs e o quanto devemos depender delas?

Curiosamente, essa pergunta é anterior aos LLMs. É essencialmente a mesma pergunta que fazemos ao decidir se devemos usar uma biblioteca ou um serviço externo: o quanto disso eu preciso entender?

Idealmente, entenderíamos tudo o que executamos. Na realidade, delegamos o entendimento através de interfaces e APIs bem definidas, confiando em outros para implementar os detalhes.

Bibliotecas são úteis? Com certeza. Tudo deveria ser uma biblioteca? Provavelmente não. Nesse sentido, o "vibe coding" pode ser visto como uma forma extrema de dependency hell: grandes quantidades de comportamento são introduzidas no sistema sem um entendimento claro de como ou por que funcionam.

Uma das habilidades mais valiosas na era dos LLMs é saber qual fricção é produtiva e escolher conscientemente não evitá-la.

Mas as empresas só querem que o código que funcione

"Qualidade é grátis. São as coisas sem qualidade que custam dinheiro." - Philip Crosby (tradução livre)

Boas empresas se preocupam com o que importa e, às vezes, o código que funciona é bom o suficiente, mesmo sem um entendimento completo.

Costumávamos chamar esses projetos de protótipos: soluções rápidas construídas para explorar um espaço de problemas, coletar feedback ou validar suposições. Nesses casos, otimizar pela velocidade em detrimento do entendimento pode ser totalmente razoável.

Há outros casos legítimos também: restrições apertadas de time to market, tarefas únicas ou ferramentas internas descartáveis.

Os problemas causados pela falta de entendimento se tornam visíveis quando as coisas mudam: Problemas em produção, incidentes de segurança, gargalos de desempenho, requisitos regulatórios, rotatividade de equipe ou migrações de sistema. Quando uma mudança significativa ocorre, sistemas construídos sem entendimento rapidamente atingem o estágio de "demolir a casa para pintar a parede".

Boas empresas sabem quando otimizar pela velocidade e quando investir em entendimento. Falhar em fazer isso leva a ser superado por concorrentes ou a colapsar sob a complexidade acumulada.

Conclusão

"Não há caminho nobre para a geometria." - Euclid (tradução livre)

O entendimento é fundamental para a programação, porque dar instruções corretas exige saber o que essas instruções significam e por que elas existem.

LLMs são ferramentas poderosas, mas nos permitem gerar grandes quantidades de código que não entendemos. Com o tempo, a relação entre sinal e ruído da base de código se degrada, tornando o raciocínio e a mudança progressivamente mais difíceis.

Otimizar pela velocidade nem sempre é a decisão de negócios correta. O entendimento leva tempo e fricção, mas essa fricção é frequentemente o que possibilita o progresso a longo prazo.

Algumas pessoas veem a fricção como inerentemente ruim. Mas sem fricção, como Newton já demonstrou, não temos tração e, portanto, não podemos mudar de direção nem pegar impulso.

Carregando publicação patrocinada...
5

Cara, esse texto me pegou num momento de reflexão.

Trabalho com desenvolvimento há mais de 25 anos e nos últimos 2 anos minha rotina mudou radicalmente. Hoje uso LLMs diariamente — Claude Code, Gemini, o que tiver. E confesso que às vezes me pego numa espécie de culpa católica de desenvolvedor: "será que estou ficando mais burro?"

Mas aí paro pra pensar no que realmente mudou.

Antes eu passava horas debugando código boilerplate, lutando com sintaxe de linguagem que uso pouco, ou reescrevendo pela milésima vez um CRUD. Isso não me tornava melhor programador — me tornava um digitador mais rápido. A "fricção produtiva" que você menciona existe, sim, mas nem toda fricção é produtiva. Às vezes é só atrito mesmo.

O que percebi é que as LLMs me forçaram a ser mais claro sobre o que eu quero. Quando o prompt é vago, o código gerado é genérico e inútil. Quando eu sei exatamente o que preciso — arquitetura, edge cases, trade-offs e o resultado é impressionante. Ou seja: a ferramenta amplifica o que você já sabe. Se você entende o sistema, ela te acelera. Se não entende, ela te enterra em código que você não consegue manter.

Concordo 100% que existe um risco real pra quem está começando. Aprender a programar copiando output do ChatGPT é como aprender a dirigir só usando piloto automático — você até chega em algum lugar, mas não sabe o que fazer quando o GPS pira.

Mas pra quem já tem a base? É libertador. Finalmente posso focar no problema real em vez de ficar brigando com a máquina.

O ponto que você levanta sobre "ciclo de dependência" é o mais assustador pra mim. Código gerado por IA tende a ser verboso, over-engineered, cheio de abstrações desnecessárias. Já vi projetos onde metade do código era lixo gerado que ninguém entendia. Isso vira dívida técnica exponencial.

Minha conclusão pessoal, LLM é power tool. Nas mãos de quem sabe usar, faz maravilhas. Nas mãos de quem não sabe, serra o próprio pé.

1

Exatamente! O problema é que muito do marketing é feito com base no: "Se você não sabe programar, basta usar LLM"

Mas isso faz com que você nunca aprenda de fato a programar, nesse ciclo de dependência sem fim.

É uma power tool que se vende que se vende muito para iniciantes, e isso é o complicado

E note que iniciante pode ser alguem experiente mas que está iniciando em um novo domínio, e não necessariamente alguem que nunca programou.

Por isso que falo no texto que quem souber diferenciar a fricção produtiva da fricção ruim é quem vai de destacar daqui pra frente.

2

Muito bem escrito. Eu só queria adicionar um outro impacto: o prolongamento desnecessário do escopo. Porque muitos veem o escopo como algo que é limitado pelo tempo necessário para implementá-lo ou pela quantidade de mão-de-obra necessária. Mas com LLMs e vibe coding, a tendência é o escopo ser prolongado, já que é bem mais fácil agora gerar código adoidado.

Isso vai sobrecarregar ainda mais o dev. Não pelo trabalho extra em implementar mais coisas para o usuário, já que o code-replicator gera tudo rapidinho, mas pelo aumento da complexidade em manter o código depois que estiver pronto. Será necessário então fazer uso de outras ferramentas, provavelmente LLMs, para ajudar a resolver bugs ou entender o que tal código em tal parte do sistema está fazendo.

Se não cuidar, pode evoluir para aquele quadro clínico em que uma pessoa enferma precisa tomar 4 remédios, e então precisa adicionar outros 2 remédios para combater os efeitos colaterais dos anteriores.

4

Exatamente!

Será necessário então fazer uso de outras ferramentas, provavelmente LLMs

Esse ponto eu não consegui colocar no texto, mas é um dos que mais me preocupa! Não parece existir incentivo financeiro nenhum para resolver esse problema.

Quanto mais volume, mais você precisa delas para tentar fazer algum sentido daquilo depois.

Quanto mais volume, a quantidade de tokens aumenta fazendo você pagar mais caro.

2

Esse "mais você precisa delas" que tu mencionou é a principal estratégia das empresas por trás dos LLMs, porque pelo que entendi o valor que hoje é cobrado é subsidiado. Muitas estão operando no prejuízo, mas o foco é no crescimento orgânico. A ideia é atrair o máximo de usuários, encurralar pela dependência, e depois cobrar o máximo.

O Uber tá fazendo isso agora no Brasil, aumentando cada vez mais o valor das corridas. Até já foram alertados por prefeituras onde atuam:

SP: https://exame.com/brasil/procon-de-sp-notifica-uber-e-99-por-precos-abusivos/

RJ: https://odia.ig.com.br/rio-de-janeiro/2025/12/7180979-procon-rj-cobra-explicacoes-da-uber-e-da-99-por-aumento-nas-tarifas-em-dezembro.html

1

Dos mesmos criadores de Desenvolvedor não é programador. Birncadeira. Eu concordo contigo. Quem usa LLM e não sabe programar vai ter problemas para manter o projeto além de ser introduzida uma vulnerabilidade crítica que um desenvolvedor normal poderia enxergar.

1

Parabéns pelo texto e pelos argumentos. Ótima sacada também no uso das citações em cada subtítulo. Sou do design e do frontend, mas uso LLM parte por parte, acompanhando e ajustando tudo criteriosamente, para, depois, saber como está a "coisa". Brincar de Frankenstein é complicado.

1

Eu também tenho a impressão que a 'falta de fricção' que você habilmente descreveu significa perda de algo. Talvez ela indique um desperdício.

Eu achei as citações/traduções interessantíssimas. Muita sabedoria em poucas palavras!!!
:)

(Não sei se tem a ver) mas hoje li algo sobre desperdício de hardware:
Um texto sobre uma alegada declaração do programador do Doom2 John Carmack.

-1

“Programar não é codar.”

Sempre começa assim.
Quando alguém diz isso, você já sabe que vem um parágrafo inteiro explicando por que codar é algo meio vulgar, quase animalesco, e que o correto mesmo é pensar profundamente sobre o problema enquanto olha pela janela.

Segundo o texto, LLMs são perigosas porque permitem pular direto pra solução que funciona.
Realmente preocupante.
Imagina resolver o problema antes de entendê-lo completamente.
Um absurdo.
O correto é passar três semanas entendendo o domínio, duas debatendo nomenclatura e só então descobrir que o requisito mudou.

A ideia central parece ser:

“Se você não escreveu cada linha sofrendo, você não aprendeu.”

O que levanta uma questão séria: 👉 Aprender pra quê, exatamente?
Porque o cliente queria um sistema.
Não uma jornada de autoconhecimento.

“Se você só pede pra IA gerar, você não aprende.”

Claro. Porque aprender mesmo é:
escrever código
esquecer em 2 semanas
xingar o “idiota que escreveu isso”
descobrir que foi você

(Este post foi gerado por LLM com ironia e risadas malucas)

1

O que levanta uma questão séria: 👉 Aprender pra quê, exatamente?

É exatamente essa a pergunta que precisa ser feita! Como disse no texto quem melhor responder essa pergunta vai se destacar.

Meu ponto é justamente que algumas coisas são importantes aprender e outras não, o segredo está em saber diferenciar.