great developers, i am the coder, Testes

Como corrigir um bug – A maneira correta

Bruno Carneiro

Bruno Carneiro

O principal passo para corrigir um bug é a identificação do problema. Porém, o que acontece é que muitos desenvolvedores não fazem o diagnóstico do erro de forma assertiva.

Mecânicos não tem nenhuma semelhança com o nosso trabalho, certo? Vou contar uma breve história que aconteceu comigo para exemplificar o comportamento de grande parte dos programadores quando vão corrigir um bug.

Um bug e uma péssima experiência com mecânicos

Meu primeiro carro foi um Gol. Era um carro excelente até acender uma pequena luzinha vermelha no painel. Esse alerta aparecia com uma certa frequência mas em momentos que eu não sabia quando. Às vezes, aparecia quando eu ligava o carro, às vezes não. Então, me recorri ao manual do carro que dizia que se aquela luz aparecesse uma assistência técnica deveria ser procurada imediatamente.

Bem, lá fui eu procurar um mecânico. Muito bem indicado por um amigo, fui ao especialista em injeção eletrônica. Ele plugou o aparelho e deu seu diagnóstico mais ou menos dessa forma: “O problema está no sensor de temperatura do radiador. É difícil de trocar e por isso vou te cobrar R$500 de mão de obra”.

Achei caro, mas paguei com a consciência limpa porque imaginava que a assombração da luzinha acabaria.

E, como você deve estar imaginando, o problema não foi solucionado. Voltei nele e dessa vez deu outro diagnóstico: “O sensor de temperatura realmente estava com problema mas agora vi que sua mangueira também precisa ser trocada”. Antes de pagar perguntei: “Vou pagar, mas você me dá garantia desse serviço? Se a luz acender novamente posso voltar aqui que você conserta sem custo?”. Aí, ele disse: “Senhor, não damos garantia nesse tipo de serviço…”.

E lá se foram mais R$400! E, claro que a luz voltou a acender.

Por fim, fui a outro especialista que também me cobrou caro e não corrigiu o bug.

Quando já tinha desistido, um belo, muito belo dia, fui trocar o óleo do carro e o mecânico disse: “Ei…quando levantei seu carro para fazer o serviço vi que está vazando óleo da sua embreagem. Como é um problema grave troquei a peça estragada.”.

Nunca mais a luz voltou a acender…

O grande problema do “achômetro”

Você já percebeu qual foi o erro dos dois primeiros mecânicos que fui. Eles suspeitavam uma causa para o problema mas não comprovaram a existência dela.

Isso não é um comportamento só de mecânicos. É também de médicos, engenheiros, e…. NÓS DESENVOLVEDORES!

A grande maioria dos programadores ao corrigir um bug monta uma hipótese e altera o código baseado nessa teoria. E, quando acaba o trabalho dá o problema como corrigido. Assim como fizeram os mecânicos que me tiraram uma baita grana. E aí, em grande parte das vezes, o bug volta a acontecer…

Bons desenvolvedores não acham, eles têm certeza

Isso mesmo! Sabe como? Debugging!

Você procura o problema e constata ele acontecendo via uma ferramenta de debug. 

Para você não achar que isso é somente uma opinião minha, veja o que diz o clássico livro “The art of debugging“:

O fundamental princípio da confirmação - The art of debugging

Viu só? Nas próximas vezes que for corrigir um bug faça o seguinte:

Um simples processo para corrigir um bug

  1. Encontre exatamente o cenário que acontece o erro. Você tem que ser capaz de reproduzí-lo quantas vezes precisar.
  2. Abra o debugger e coloque breakpoints nas linhas que são executadas quando você roda esse cenário.
  3. Caminhe com o debugger entendendo o código até que você perceba o que está errado.
  4. Elabore uma solução e implemente a correção.
  5. Execute o mesmo cenário N vezes garantindo que o erro não acontece mais.

Etapa Bônus: Faça um teste unitário que executa o cenário do erro e teste o resultado correto. Adicione ele na integração contínua.

Esse é um processo simples que se aplica a maioria dos bugs. Mas, todos nós já experimentamos bugs mais complexos que exigem técnicas mais avançadas para a correção. Porém, de qualquer forma é essencial a confirmação do problema antes de sua correção.

 

Deixe um comentario