Entender Software vs. Gerar Código

Bugs de estado e fluxo de uma aplicação real mostram onde fica evidente a diferença entre quem entende de programação e quem apenas gera código.

As IAs evoluíram muito.

Hoje elas escrevem boilerplate, sugerem arquiteturas, geram testes, explicam APIs e aceleram uma quantidade enorme de trabalho.

Mas existe um tipo de problema onde a diferença entre quem entende programação e quem apenas gera código fica muito evidente: bugs de estado e fluxo de uma aplicação real.


O caso real: busca por conteúdo no Flux

Nos últimos dias eu estava implementando uma nova feature no Flux, meu gerenciador de arquivos open source escrito em Rust.

A ideia era adicionar na search engine a capacidade de procurar strings dentro do conteúdo dos arquivos, e não apenas pelos nomes.

A implementação estava praticamente pronta. Só tinha um problema: depois da segunda busca, a aplicação simplesmente congelava.

Entregando o projeto completo para as IAs

Passei o projeto inteiro para as melhores IAs que encontrei: código completo, arquitetura, fluxo das mensagens, logs e contexto.

Claude
ChatGPT
DeepSeek
Qwen

Mesmo explicando exatamente onde eu suspeitava que estava o problema, todas insistiam na mesma direção.

O diagnóstico delas dizia que o problema estava aqui:

AppMsg::StartContentSearch(term)
Diagnóstico #1

"Talvez seja um problema de sincronização."

Diagnóstico #2

"Pode existir um bloqueio de execução entre tarefas."

Diagnóstico #3

"Talvez o loop de eventos esteja causando uma condição inesperada."

Diagnóstico #4

"Pode ser o gerenciamento das threads."

Tudo parecia plausível. Mas o problema não estava ali.

Eu explicava que o fluxo problemático era outro:

AppMsg::UpdateFilter(query)

Ele estava entrando novamente em um caminho que causava um loop infinito. Mesmo assim, as respostas continuavam voltando para a mesma hipótese.


A investigação manual e a solução

Depois de muita insistência, precisei fechar as IAs e voltar para o código. Segui a aplicação estado por estado.

A causa era simples: quando a busca era aberta, uma atualização do filtro acontecia novamente em uma condição específica, e o fluxo não tinha uma proteção para esse caso.

A correção exigiu apenas uma validação de estado:

Proteção do fluxo de estado (Rust) Validação simples
if query.is_empty() && self.search_just_opened {
    self.search_just_opened = false;
    return;
}

Uma validação de estado. Só isso.

Depois apareceu outro bug: ao cancelar uma pesquisa, a rotina limpava corretamente o grid de arquivos, mas esquecia de reconstruir o estado da interface. Os dados estavam corretos, mas a tela nunca recebia a atualização.

Faltava apenas isto:

Atualização de interface (Rust) Refresh da UI
sender.input(AppMsg::Refresh);

Duas correções pequenas. Dois problemas que pararam completamente o projeto.


O que isso ensina sobre "Vibe Coding"

E é exatamente aqui que entra o ponto sobre vibe coding.

Gerar código com IA é extremamente poderoso. Eu consigo desenvolver muito mais rápido usando essas ferramentas.

Mas existe uma diferença enorme entre criar código e entender software.

Gerar Código com IA

Cria soluções rapidamente baseadas em padrões, mas não compreende a intenção profunda nem a cadeia de eventos de uma aplicação viva.

Entender Software

Saber exatamente como estados, eventos, concorrência e fluxo de dados se comportam quando algo sai do caminho esperado.

Quando você não sabe como uma aplicação funciona internamente, um bug desse tipo pode simplesmente travar o projeto. A IA pode gerar uma solução, mas alguém ainda precisa entender quando aquela solução faz sentido.

Porque no final, o problema não era uma arquitetura complexa nem uma falha misteriosa. Era um estado entrando no fluxo errado e uma atualização de interface que nunca acontecia.

"IA é um multiplicador. Mas ela multiplica principalmente a capacidade de quem já sabe navegar pelo código."