Dicas para depuração com muito pouca informação? [fechadas]

11

Eu herdei um projeto com uma base de código bastante grande e o desenvolvedor original raramente, se é que alguma vez responde a e-mails. Existem várias maneiras diferentes de fazer algumas coisas, e eu não conheço todas elas. Muitos códigos duplicados ao longo desses caminhos (em vez de funções incluídas por, digamos, 5 páginas que fazem relativamente a mesma coisa, seu código é copiado em 5 páginas) e alguns problemas sutis no banco de dados (todos já ouvimos falar em código espaguete , mas você já ouviu falar de um banco de dados de espaguete?)

Tudo isso eu posso lidar com a maior parte do tempo sem problemas.

O problema é quando um cliente encontra um bug em algum lugar. Eles geralmente enviam uma captura de tela da edição final e dizem: "Você pode dar uma olhada nisso?" destacando o item específico da página que está errado e, às vezes, o que era esperado. Muito pouco mais informação é fornecida, e tentar conversar com eles e obter mais (como o que eles fizeram para obter o resultado) é como arrancar dentes.

Basicamente, tudo se resume a isso:

  • Base de código grande e complexa com a qual não estou 100% familiarizado
  • Muitas maneiras pelas quais as coisas podem dar errado
  • Pouca informação sobre como um bug surgiu

Alguém tem dicas, truques, sugestões etc. sobre como depurar esse tipo de coisa?

Tarka
fonte
"Você já ouviu falar de um banco de dados de espaguete?" Certa vez, trabalhei em um trabalho em que o banco de dados do produto evoluía continuamente há mais de dez anos, com pouco ou nenhum esforço para refatorá-lo à medida que os requisitos cresciam (e cresciam, cresciam e cresciam). Eu tive uma colega de trabalho cujo trabalho inteiro se resumia a "Entender o banco de dados, criar consultas SQL para extrair qualquer coisa útil dele" - e ela era indispensável. Eu sinto sua dor.
BlizzHippo
Como complemento, [leia as postagens de "depuração psíquica" no blog de Raymond Chen] ( goo.gl/2KIH )!
Wizard79
Qual é o tamanho da base de código? Dez KLOC ou 50 MLOC?
Basile Starynkevitch

Respostas:

11

Quando recebo algo assim, geralmente exijo mais informações. Não sei como é o local onde você trabalha, mas aqui, se eu não tiver informações suficientes para reproduzir o problema localmente, posso enviar o tíquete de volta marcado como Não é possível reproduzir, com um pedido de mais informações, e eles sabem que nada será corrigido até Eu sou capaz de quebrá-lo do meu lado.

Se seus clientes estiverem com problemas para descrever as etapas, peça um vídeo de captura de tela. Existem alguns produtos gratuitos que podem ser criados, como o Jing. Isso torna muito mais fácil quando você pode assistir exatamente o que eles estavam fazendo.

Edição: Jing foi uma boa idéia quando eu escrevi isso há alguns anos atrás. Desde então, eles modificaram o instalador para carregar seu sistema com crapware "bônus" que você nunca pediu, por isso não posso mais recomendá-lo. No entanto, existem muitos gravadores de tela decentes.

Mason Wheeler
fonte
2
+1 Aconselhamento sensato, e eu o expandiria para: Eles conseguem que o bug aconteça de forma confiável ou é intermitente? Se estiver acontecendo de forma confiável, eles podem orientá-lo nas etapas que foram tomadas para chegar lá?
BlairHippo 21/10
1
Ver arquivos de log pode ajudar um pouco.
pramodc84
11

Um bom começo pode ser este livro .

texto alternativo

Estou usando a definição abaixo, pois parece que o desenvolvedor não está mais disponível para suportá-lo.

Código legado é o código-fonte que se refere a um suporte não mais suportado.

Gordon
fonte
A parte triste é que esse nem é um código legado. Tenho certeza de que a maior parte do que estou trabalhando foi iniciada no início deste ano.
Tarka
3
@ Slokun - a definição de "Código Legado" no livro não é totalmente a mesma que a definição tradicional dele. É um livro muito bom.
Austin Salonen
4

Eu tive um problema semelhante há alguns anos e o maior aumento na produtividade e na limpeza de código foi a integração do rastreamento de erros no sistema.

Usamos o Fogbugz (suponho que eles ainda façam o Fogcreek!) E fomos capazes de criar um mecanismo de tratamento de exceções no qual o usuário pudesse pressionar um botão a qualquer momento que surgisse uma exceção e seria imediatamente conectado ao sistema - sem mais chamadas e não há mais capturas de tela. Com essa opção, você obtém as informações necessárias em vez de tentar extraí-las do usuário. Parece uma variante para você, especialmente com uma opção de captura de tela.

A outra coisa que você deseja iniciar é começar a adicionar o log. Você pode ir até o registro de cada chamada de método com valores de argumento. Como parece que você está trabalhando com código legado (código sem testes), esse registro o ajudará a adicionar testes de unidade apropriados para que você não repita nenhum problema.

Austin Salonen
fonte
Para uma grande base de códigos preexistente, adicionar um bom registro será muito trabalhoso. +1 porque pode ser a única opção viável se os erros forem intermitentes.
precisa saber é o seguinte
@BlairHippo: Pela minha experiência, é, mas esse é o preço que você paga com uma base de código que ele está descrevendo. É quase tão miserável como trabalhar em tal base de código para começar com ...
Austin Salonen
O registro é difícil. Adicionar log de exceção automatizado é trivial e vale o esforço (mínimo) mil vezes. Ou pelo menos, está em Delphi. Não tenho certeza de quais soluções existem para outros idiomas, mas não deve ser muito difícil para qualquer idioma com manipulação de exceção decente.
Mason Wheeler
1

Meu conselho mais sincero é começar a refatorar onde puder. Não consigo contar o número de vezes em que vi uma recopia de funcionalidade apenas para descobrir que não era 100% uma cópia completa. Foi uma cópia de 99,9% e um pequeno erro menor que resultou em um bug. Comece a adicionar testes de unidade a tudo e, se você tiver um departamento de controle de qualidade, tente obter alguns scripts de teste automatizados para essas partes do código em que você está trabalhando.

Por outro lado, veja quanto log pode injetar no código. Ou seja, se não houver muito em termos de registro, você pode adicionar um sinalizador ao código para começar a selecionar registros mais detalhados para seus próprios fins de depuração. Isso é algo que você pode ativar e desativar um usuário, se você conseguir abrir uma caixa de diálogo. Isso me ajudou mais vezes do que posso contar. Normalmente recebo "não funciona" sem uma imagem do problema. Eu apenas digo "envie-me o arquivo de log".

wheaties
fonte
0

Comece escrevendo testes de unidade. Escolha uma classe ou uma função e escreva um conjunto de testes correspondente a como você acha que deve funcionar. Se os testes falharem, descubra o porquê. Se for um bug - corrija-o. Se suas expectativas estiverem erradas, descubra o que a coisa realmente faz e modifique os testes de acordo.

Depois de ter um conjunto decente de testes de unidade de trabalho, você tem uma rede de segurança para fazer alguma refatoração para tornar o código mais limpo.

Continue iterando até entender a base de código.

Escusado será dizer que isso é algo que você deve fazer antes do tempo, não em resposta a um relatório de bug.

Dima
fonte