Eu Vivia 'Corrigindo' Bugs Que Eu Não Entendia

Eu costumava comemorar quando um bug desaparecia. Um problema me atormentava, eu mudava alguma coisa, o problema sumia, e eu sentia o calor reconfortante da vitória e seguia em frente. Levei muito tempo e muita dor para aprender que um bug desaparecer e um bug ser corrigido são dois eventos completamente diferentes — e que confundi-los estava silenciosamente enchendo meu sistema de problemas que eu não tinha resolvido de forma alguma. Eu apenas os tinha escondido de mim mesmo.

Essa é uma daquelas lições que parecem óbvias quando ditas com todas as letras e são diabolicamente difíceis de viver na prática, porque tudo no momento te empurra na direção errada.

A sedução do sintoma que some

Quando um problema desaparece logo depois que você muda alguma coisa, cada instinto grita que você o corrigiu. O alívio é real, imediato e químico. A pressão para seguir para a próxima tarefa é enorme. Quem é que vai querer continuar cutucando um problema que, até onde você consegue ver, deixou de ser um problema?

Mas aqui está a verdade incômoda que se esconde sob esse alívio: o sintoma desaparecer prova apenas que o sintoma desapareceu. Ele não te diz nada — absolutamente nada — sobre se você de fato atacou a causa subjacente ou apenas a perturbou o suficiente para fazê-la silenciar por enquanto. Esses dois desfechos parecem idênticos no momento. Eles dão a mesma sensação. Eles não são, nem de longe, a mesma coisa.

Correções que eu não conseguia explicar

O padrão, no meu caso, era constrangedoramente comum. Eu fazia uma mudança — embaralhava a ordem de algumas operações, adicionava uma proteção, ajustava algo ali por perto — e o erro parava de aparecer. E se você tivesse me parado naquele exato instante e pedido que eu explicasse com precisão por que minha mudança tinha resolvido o problema, eu não teria conseguido. Eu na verdade não sabia. Eu só sabia que tinha mexido em algo, e que aquilo de ruim tinha emudecido.

Eu chamava isso de corrigir. Mas não era depurar de jeito nenhum. Era mais parecido com fazer uma oferenda em um altar e notar que os deuses pareciam, por ora, apaziguados. Eu tinha mudado alguma coisa, o universo tinha parado de me punir, e eu escolhi interpretar a correlação como entendimento. Não era entendimento. Era superstição com uma mensagem de commit.

Um bug que você não entende não está morto — está se escondendo

O problema profundo de uma correção que você não consegue explicar é que você não tem a menor ideia do que realmente fez. Você removeu o bug, ou apenas o moveu para algum lugar que você não consegue enxergar no momento? Você genuinamente não sabe, e essa incerteza não é inofensiva. Porque se a causa ainda estiver lá, intocada, ela vai voltar. Vai ressurgir mais tarde, vestindo uma fantasia diferente, em algum outro canto do sistema, muito possivelmente um pior — e quando isso acontecer, você não terá nenhuma lembrança de que se trata do mesmo inimigo que você achou ter derrotado meses atrás.

Essa é a coisa que eu mais subestimei. Correções inexplicadas não reduzem de fato o número de bugs em um sistema. Elas os realocam, e te privam do conhecimento que te permitiria reconhecê-los de novo. Você não está vencendo a luta. Você está apenas espalhando o mesmo oponente em disfarces.

A casa mal-assombrada que você constrói aos poucos

Com tempo suficiente, um sistema mantido dessa forma vai se enchendo de mudanças que ninguém, incluindo o próprio autor, realmente entende. Uma proteção adicionada “porque quebrava sem ela”. Uma ordenação preservada por nada além de medo. Pequenos rituais cujo propósito original foi completamente esquecido, mas que agora todo mundo está nervoso demais para remover.

A base de código gradualmente vira uma casa mal-assombrada de superstições — cheia de coisas em que você não mexe porque não tem certeza do que elas estão sustentando. E a parte mais cruel é o que isso faz com a sua capacidade de mudar qualquer coisa. Quando você não sabe o que é estrutural e o que é decorativo, você não consegue se mover com confiança de jeito nenhum. Cada mudança vira uma aposta contra forças que você não entende, em uma estrutura que você construiu mas não compreende mais.

A disciplina: não confie em uma correção que você não consegue explicar

A regra que eu acabei me forçando a seguir é simples de enunciar e genuinamente difícil de cumprir: um problema não está corrigido até que eu consiga explicar tanto por que ele aconteceu quanto por que minha mudança ataca essa causa. As duas metades. Se o sintoma desapareceu mas eu não consigo contar essa história completa, então eu não corrigi nada — eu apenas perdi de vista o problema, o que é um estado muito mais perigoso do que um problema que eu ainda consigo ver.

Isso é mais lento. É constantemente tentador pular essa etapa, e a tentação é mais forte exatamente no pior momento: quando o sintoma já sumiu e tudo parece estar bem e o trabalho parece, por todos os sinais visíveis, estar concluído. É precisamente aí que a disciplina mais importa, e precisamente aí que ela parece mais desnecessária. Olhar nos dentes de uma correção dada de presente é antinatural. Também é o trabalho inteiro.

Por que isso importa ainda mais em um domínio ruidoso

Há um motivo para essa armadilha ser especialmente traiçoeira em um domínio como este. O ambiente é intensamente ruidoso, o que significa que ele te entrega confirmação falsa o tempo todo. Você faz uma mudança, a próxima execução parece melhor — mas foi a mudança, ou foi só sorte? Em um sistema onde os resultados oscilam por conta própria, “ficou melhor depois que eu fiz X” é uma evidência desesperadamente fraca de que X fez qualquer coisa.

A superstição prospera exatamente onde os resultados são ruidosos, porque o ruído fica recompensando rituais aleatórios com frequência suficiente para fazê-los parecer reais. A mesma aleatoriedade que torna tudo difícil de avaliar também torna perigosamente fácil acreditar em correções que não fizeram nada, porque de vez em quando os dados caem a seu favor logo depois do seu gesto sem sentido, e seu cérebro registra avidamente uma causa.

A lição mais profunda: entendimento é a única correção de verdade

O que eu finalmente passei a acreditar é que a única correção durável é aquela que você entende por completo, até a sua causa. Todo o resto é tomar emprestado contra o futuro. O bug que você cobriu sem compreender não vai embora; ele emudece, e o empréstimo vence mais tarde, com juros, num momento em que você esqueceu completamente que algum dia o contraiu.

Então agora, quando alguma coisa começa a funcionar e eu não sei por quê, eu me treinei para não sentir alívio. Eu tento sentir desconfiança em vez disso. Um sucesso inexplicado não é uma vitória; é um mistério não resolvido que por acaso está vestido com as roupas da vitória, e tratá-lo como o primeiro é uma das formas mais confiáveis que conheço de ser emboscado pelo seu próprio eu do passado.

— Sem sinais, sem retornos, isto não é recomendação de investimento.