Achando Bugs com Git Bisect

O git possui um comando muito interessante para achar bugs no seu código: git bisect

Basicamente o que o git bisect faz é uma busca binária no seu repositório git para encontrar qual commit introduziu um bug no seu código.

A maneira como ele funciona é bem simples: você passa o hash de um commit onde seu código estava funcionando e o hash do commit onde você percebeu que seu código parou de funcionar, finalmente você diz para o git qual comando ele deve executar em cada commit para validar se aquele commit está ou não “bugado”.

Para mostrar o quão simples é de se usar esse comando, eu criei um repositório no github para que você possa acompanhar comigo o uso do git bisect.

Primeiramente clone para sua máquina o seguinte repositório: https://github.com/jonduarte/git-bisect-example com o comando


$ git clone https://github.com/jonduarte/git-bisect-example

depois entre na pasta do projeto

cd git-bisect-example

e execute o comando ruby ex.rb

Você verá que o comando falhará. Agora vamos usar o git bisect para achar onde esse bug foi introduzido. Use o commando git log --oneline para listas os commits disponíveis.

Primeiramente precisamos encontrar uma versão “funcional” do projeto. Vamos pegar o commit 712db34 que é o commit inicial do projeto e onde eu tenho certeza que meu teste estava passando – A propósito, lendo o nome dos commits você já tem um spoiler de qual commit quebrou nosso teste 🙂

Depois preciso pegar o hash do commit onde eu percebi que havia um bug no código, no meu caso apenas percebi isso no meu último commit que possui o hash: 114f21f

Pronto agora temos informações suficientes para pedir ao git para encontrar onde o bug foi introduzido.

primeiramente iniciando o git bisect

$ git bisect start

agora precisamos passar os dois hashes para o git, um indicando o estado positivo do nosso código e o outro indicando o estado negativo:

$ git bisect good 712db34

$ git bisect bad 114f21f

finalmente precisamos indicar pro git qual comando ele deve executar entre os commits para definir se um commit possui o bug ou não. No nossa caso é o comando ruby ex.rb

$ git bisect run ruby ex.rb

Finalmente o git nos mostra que o commit que introduziu o bug nosso código foi o seguinte:

f4c1af35e2361c4504d533df81aac7fa76c718b1 is the first bad commit

No nosso exemplo não conseguimos ver efetivamente em ação a busca binária que o git realiza para encontrar um mau commit, porém certamente se seu repositório git for um pouco maior você poderá ver como esse comando é efetivo.

Finalmente, para sair do modo bisect, execute o comando:

$ git bisect reset

Pronto! agora você pode verificar o commit que introduziu o bug e criar seu fix.

 

Achando Bugs com Git Bisect

Por que aprender Ruby é uma boa opção

Ruby é uma linguagem amigável. Seu lema de acordo com o seu criador é o seguinte:

O que traduzindo para o português seria algo como: Ruby foi criado para tornar os programadores felizes.

É possível identificar em quase toda parte da linguagem esse lema: na sua fácil escrita; na obviedade dos métodos; nos padrões da linguagens, etc.

Porém Ruby deixa a desejar em outros aspectos. Ruby pode não ser tão rápida quanto outras linguagens, seu poder para processamento paralelo é pobre, pode ser lenta para criação de jogos, etc.

Mas tudo isso não impede Ruby de ser uma linguagem que deve ser levada em consideração tanto para aprender, quanto para ser usada em grandes sistemas. Existe grandes players no mercado que usam Ruby até hoje, vide: Basecamp e Shopify.

É importante lembrar que apesar do Ruby oferecer uma pequena barreira de entrada isso não significa que é fácil de ser tornar um mestre na linguagem. Ruby tem muitas nuanças que levam uma porção de tempo e dedicação para serem aprendidas.

Porém, o fator mais importante de todos que me levou a aprender Ruby e a continuar aprendendo todo dia sobre essa linguagem é como ela soa familiar, como tudo parece tão simples e natural.

Ruby da liberdade ao programador para exercer sua criatividade, a linguagem quase não cria regras ou barreiras do que você pode ou não pode fazer, existe uma confiança entre o desenvolver e a linguagem, uma sinergia — que a menos que você queira — não pode ser quebrada.

Um outro grande fator pra se levar em conta é a comunidade. A comunidade Ruby impulsionou grandes mudanças de um modo general em como desenvolvemos software — especialmente para a web.

Quando olhamos para traz podemos ver uma linha na história que foi desenhada antes e depois do Ruby — Aqui é importante ressaltar o quanto o framework Ruby on Rails foi importante nesse processo.

Enfim, ainda existe muita coisa pra ser feita, aprendida e desenvolvida em Ruby, a melhor época para ser ter aprendido Ruby foi há alguns anos atrás, a outra melhor época para se aprender Ruby é agora.

Por que aprender Ruby é uma boa opção