Todo projeto de software tem um pouco de risco Defeitos frequentemente não são descobertos até que certas falhas específicas os tragam à tona. Mesmo com desenvolvedores habilidosos, software inevitavelmente acumula comportamentos indefinidos ou defeituosos.
Exponha ao mundo real pra saber se funciona mesmo “Se ainda não foi usado, não funciona” -- John Osterhout Existem coisas que você só aprende em produção
Não existe receita para todos os casos, mas... Temos alguma ideia dos principais ingredientes: 1. Atitude positiva 2. Conhecimento 3. Ferramentas 4. Método
Ao se deparar com um bug, não entre em pânico! Lembre-se que TEM QUE haver uma explicação lógica para o que está acontecendo. Pense que está prestes a aprender algo
Seis estágios de debugging 1. “Não tem como isso acontecer!” 2. “Isso não acontece na minha máquina.” 3. “Isso não devia acontecer!” 4. “Por que isso tá acontecendo?” 5. “Ahh, entendi...” 6. “Como diabos isso funcionava antes!?!?” Original em: http://plasmasturm.org/log/6debug/
1. “Não tem como isso acontecer!” 2. “Isso não acontece na minha máquina.” 3. “Isso não devia acontecer!” Negar um problema que está obviamente acontecendo é prolongar a frustração (mesmo que apenas mentalmente). Já comece com: “hmm... estranho! o que será que poderia causar isso...?” Pule os primeiros estágios!
Do que você sente falta saber com mais frequência hoje? ● Problema humano que o software resolve (business) ● Linguagem(ns) ● Stack ○ Framework, libs ○ Ambiente / sistema operacional ○ Infraestrutura ● Ferramentas
Ferramentas são importantes “Debugar” é basicamente aprender Para aprender, é importante ver o que está acontecendo Seeing Spaces, vídeo do Bret Victor: http://worrydream.com/SeeingSpaces
Ferramentas legais de conhecer ● Algum debugger Python qualquer (pudb, ipdb, etc) ○ Ver estado dos objetos na memória ● Strace (strace zine by Julia Evans) ○ Ver operações a nível de SO ● Wireshark / tcpdump / ngrep ○ Ver os dados que estão passando no fio ● Sentry ○ Ver estado dos objetos post-mortem
Caso: hook falhando, jobs em outro app não disparavam ● Eu tinha uma hipótese, precisava confirmar, corrigir e rodar os jobs que deviam ter sido disparados ● Fiz um script gerando tabela HTML com timeline dos eventos ● Pude confirmar o problema e encontrar os jobs que precisava rodar. ● WIN!
Balance intuição e análise quando troubleshooting “Use intuição para fazer perguntas, não para respondê-las” -- John Osterhout Intuição ~= hipótese Precisa de análise adicional para expor todos os fatores envolvidos e verificar se a intuição estava ou não correta
Use o método científico 1. Fazer observações ○ reproduzir/confirmar o bug (MCV) 2. Formular hipóteses verificáveis ○ isolar e expor o bug, eliminar ruído 3. Experimento para invalidar a hipótese ○ não confie na intuição 4. Conforme resultado, voltar ao passo 1
Confirme que você resolveu o problema “Se você não sabe qual era o problema, você não o resolveu!” -- John Osterhout Ao enfrentar um problema difícil de reproduzir, não assuma que o problema está resolvido só porque ele não aparece mais.
Corrija erros no tratamento antes da causa original Ou seja: “corrija de trás pra frente” ● Código que trata erros é frequentemente menos exercitado ● Cadeia de erros iniciada por uma causa inicial ○ Exemplo: dado estranho/faltando no DB causando comportamento inesperado na aplicação ● O erro original é um caso de teste para o tratamento de erros! ● É mais fácil corrigir quando você pode testar imediatamente
Bug trackers acumulam informações valiosas com o tempo. ● Github Issues: configure um template com perguntas relevantes ○ Tipo “qual a versão?”, “qual o SO?”, etc ● Reporte bugs nos projetos open source que você usa! Use um bug tracker
Recapitulando... 1. Mantenha uma atitude positiva 2. Busque saber mais coisas 3. Utilize as ferramentas disponíveis 4. Use o método científico (ou o mais próximo possível)
Recapitulando... 1. Mantenha uma atitude positiva 2. Busque saber mais coisas 3. Utilize as ferramentas disponíveis 4. Use o método científico (ou o mais próximo possível) Now, go forth and debug!