Faça tudo falhar e Faça com que falhe rápido


Esta é a terceira parte de Depuração ( Debug ) - Como posso depurar (depurar) meu programa?. Se você perdeu a parte anterior aqui está a lista. Como posso depurar (depurar) meu programa?

Faça tudo falhar


Só podemos depurar algo quando ele falha, então o segundo passo é sempre encontrar um caso de teste que faça com que falhe todas as vezes. 

A parte “todas as vezes” é importante porque poucas coisas são mais frustrantes do que depurar um problema intermitente: se tivermos que chamar uma função uma dúzia de vezes para obter uma única falha, as chances são boas de passarmos pela falha quando ela realmente ocorre.


Como parte disso, é sempre importante verificar se nosso código está “plugado”, ou seja, se estamos realmente exercitando o problema que pensamos estar. Todo programador passou horas perseguindo um bug, apenas para perceber que eles estavam realmente chamando seu código no conjunto de dados errado ou com os parâmetros de configuração errados, ou estão usando a versão totalmente errada do software. 


Erros como esses são particularmente prováveis de acontecer quando estamos cansados, frustrados e com um prazo, que é uma das razões pelas quais as sessões de codificação tarde da noite (ou durante a noite) quase nunca valem a pena.


Faça com que falhe rápido

Se levar 20 minutos para o bug aparecer, só podemos fazer três experimentos por hora. Isso significa que obteremos menos dados em mais tempo e é mais provável que nos distraímos com outras coisas enquanto esperamos que nosso programa falhe, o que significa que o tempo que estamos gastando no problema é menos focado. Portanto, é fundamental fazê-lo falhar rapidamente.


Além de fazer o programa falhar rapidamente no tempo, queremos fazê-lo falhar rapidamente no espaço, ou seja, queremos localizar a falha na menor região possível do código:


1. Quanto menor a diferença entre causa e efeito, mais fácil é encontrar a conexão. Muitos programadores, portanto, usam uma estratégia de dividir e conquistar para encontrar bugs, ou seja, se a saída de uma função estiver errada, eles verificam se as coisas estão bem no meio, então se concentram na primeira ou na segunda metade e assim por diante.


2. N coisas podem interagir em N! maneiras diferentes, então cada linha de código que não é executada como parte de um teste significa mais de uma coisa com a qual não precisamos nos preocupar.