Cover do episódio 99: Debug sistemático: como parei de adivinhar e comecei a investigar
#0992 de setembro, 20193 min leituraCódigo na PráticaS3 · 2018–2019

Debug sistemático: como parei de adivinhar e comecei a investigar

Durante meses eu debugava no estilo tentativa e erro. Trocava uma linha, rodava, olhava. Não funcionava, trocava outra. Aprendi que isso não é debug — é loteria.

DebugResolução de ProblemasCarreira

Passei duas horas trocando código aleatoriamente tentando resolver um bug.

Mudava uma linha, rodava. Não funcionava. Mudava outra. Não funcionava. Revertia a primeira. Tentava uma terceira. Era como resolver um labirinto com os olhos fechados dando passos em direções aleatórias.

O sênior do time chegou, olhou por cinco minutos, e perguntou: "o que você sabe sobre o bug?"

Respondi que não sabia nada além de que não estava funcionando.

"Então não comece a mudar código. Comece a entender o que está acontecendo."


Essa distinção — entender vs. corrigir — é o que separa debug sistemático de tentativa e erro.

O processo que aprendi a partir daí tem quatro movimentos: primeiro, reproduzir o bug de forma confiável. Se você não consegue reproduzir, não está debugando — está chutando. Bug intermitente que não sabe como reproduzir é um bug que não pode investigar.

Depois, identificar onde o comportamento diverge do esperado. Não onde você acha que está o problema — onde o código faz algo diferente do que você espera. Use print statements ou um debugger para observar o estado.

Depois, formular hipótese. "Acho que o problema está em X porque Y." Não é chute — é hipótese testável. Então testar com a menor mudança possível. Se estava errada, você aprendeu algo. Vai para a próxima.


A parte que me custou mais aprender: a hipótese pode estar errada e tudo bem.

Quando você formula hipótese errada, não é fracasso — é eliminação. Você sabe o que não é o problema, o que restringe o espaço onde o problema pode estar.

O debug que demora não é o que tem muitas hipóteses erradas. É o que não tem hipóteses nenhuma e fica mudando código no escuro.


Tem um caso clássico que me aconteceu: o bug só aparecia quando o payload tinha um campo específico com acento. Passei tempo olhando para a lógica de negócio quando o problema era encoding de string na fronteira de entrada.

Se eu tivesse isolado as variáveis mais cedo — testado com payloads diferentes para ver qual padrão reproduz o bug — teria chegado lá em 20 minutos em vez de 2 horas.

Bug que só aparece com dado específico = problema na fronteira de entrada ou no processamento desse dado. Quando você tem esse padrão, você tem a direção da investigação.

Essa semana: próximo bug que você encontrar, escreve em uma frase o que você sabe sobre ele antes de tocar no código.