Conseils pour déboguer avec très peu d'informations? [fermé]

11

J'ai hérité d'un projet avec une base de code assez importante, et le développeur d'origine répond rarement, voire jamais, aux e-mails. Il y a une tonne de façons différentes de faire certaines choses, et je ne les connais pas toutes. Beaucoup de code dupliqué le long de ces chemins (plutôt que des fonctions incluses par, disons, 5 pages qui font relativement la même chose, c'est du code copié sur 5 pages), et quelques problèmes subtils dans la base de données (nous avons tous entendu parler de code spaghetti , mais avez-vous déjà entendu parler d'une base de données de spaghetti?)

Tout cela, je peux gérer la plupart du temps sans problème.

Le problème est lorsqu'un client trouve un bogue quelque part. Ils enverront généralement une capture d'écran du dernier problème et diront: "Pourriez-vous y jeter un œil?" tout en mettant en évidence ce qui ne va pas sur la page, et parfois ce qui était attendu. Très peu d'informations sont données et essayer de leur parler et d'en obtenir plus (comme ce qu'ils ont fait pour obtenir le résultat), c'est comme se faire des dents.

Fondamentalement, cela se résume à ceci:

  • Base de code volumineuse et complexe que je ne connais pas à 100%
  • De nombreuses façons dont les choses peuvent mal tourner
  • Très peu d'informations sur l'origine d'un bug

Quelqu'un at-il des conseils, des astuces, des suggestions, etc. sur la façon de déboguer ce genre de chose?

Tarka
la source
"Avez-vous déjà entendu parler d'une base de données de spaghetti?" Une fois, j'ai travaillé dans un emploi où la base de données du produit évoluait continuellement depuis plus de dix ans, sans aucun effort pour la refactoriser au fur et à mesure que les exigences grandissaient (et grandissaient, grandissaient et grandissaient). J'avais une collègue dont le travail se résumait à "Comprendre la base de données, créer des requêtes SQL pour en extraire tout ce qui est utile" - et elle était indispensable. Je ressens ta douleur.
BlairHippo
En complément, [lire les articles de "débogage psychique" sur le blog de Raymond Chen] ( goo.gl/2KIH )!
Wizard79
Quelle est la taille de la base de code? Dix KLOC ou 50 MLOC?
Basile Starynkevitch du

Réponses:

11

Quand je reçois quelque chose comme ça, je demande généralement plus d'informations. Je ne sais pas comment c'est là où vous travaillez, mais ici si je n'ai pas assez d'informations pour reproduire le problème localement, je peux renvoyer le ticket marqué Cannot Reproduce, avec une demande de plus d'informations, et ils savent que rien ne se corrige avant Je peux le casser de mon côté.

Si vos clients ont du mal à décrire les étapes, demandez-leur une vidéo de capture d'écran. Il existe quelques produits gratuits qui peuvent les créer, comme Jing. Cela rend beaucoup plus facile lorsque vous pouvez regarder exactement ce qu'ils faisaient.

EDIT: Jing était une bonne idée quand j'ai écrit cela il y a quelques années. Depuis lors, ils ont modifié leur programme d'installation pour charger votre système avec du crapware «bonus» que vous n'avez jamais demandé, donc je ne peux plus le recommander. Cependant, il y a beaucoup d'enregistreurs d'écran décents.

Mason Wheeler
la source
2
+1 Des conseils judicieux, et je l'étendrais à: peuvent-ils faire en sorte que le bug se produise de manière fiable, ou est-il intermittent? Si cela se passe de manière fiable, peuvent-ils vous guider à travers les étapes qu'ils ont suivies pour y arriver?
BlairHippo
1
Voir dans les fichiers journaux peut aider un peu.
pramodc84
11

Un bon début pourrait être ce livre .

texte alternatif

J'utilise la définition ci-dessous car il semble que le développeur ne soit plus là pour la prendre en charge.

Le code hérité est un code source qui se rapporte à un non plus pris en charge.

Gordon
la source
La partie triste est que ce n'est même pas du code hérité. Je suis presque sûr que la plupart de mes travaux ont commencé plus tôt cette année.
Tarka
3
@Slokun - la définition de "Legacy Code" dans le livre n'est pas entièrement la même que la définition traditionnelle de celui-ci. C'est un très bon livre.
Austin Salonen
4

J'ai eu un problème similaire il y a quelques années et le plus grand coup de pouce à la productivité et au nettoyage du code a été l'intégration du suivi des bogues dans le système.

Nous avons utilisé Fogbugz (je suppose qu'ils font encore Fogcreek!) Et nous avons pu créer un mécanisme de gestion des exceptions où l'utilisateur pouvait appuyer sur un bouton à chaque fois qu'une exception était levée et il serait immédiatement connecté à notre système - plus d'appels et plus de captures d'écran. Avec cette option, vous prenez les informations dont vous avez besoin au lieu d'essayer de les extraire de l'utilisateur. On dirait qu'une variante vous ferait du bien, surtout avec une option de capture d'écran.

L'autre chose que vous voudrez commencer à faire est de commencer à ajouter la journalisation. Vous souhaiterez peut-être aller jusqu'à la journalisation de chaque appel de méthode avec des valeurs d'argument. Comme il semble que vous travaillez avec du code hérité (code sans test), cette journalisation vous aidera à ajouter des tests unitaires appropriés afin que vous ne répétiez aucun problème.

Austin Salonen
la source
Pour une grande base de code préexistante, l'ajout d'une bonne journalisation va être un ENJEU de beaucoup de travail. +1 car il peut s'avérer être la seule option viable si les bugs sont intermittents.
BlairHippo
@BlairHippo: D'après mon expérience, c'est le cas, mais c'est le prix que vous payez avec une base de code qu'il décrit. C'est presque aussi misérable que de travailler dans une telle base de code pour commencer ...
Austin Salonen
L'enregistrement est difficile. L'ajout d'une journalisation des exceptions automatisée est trivial et vaut mille fois l'effort (minimal). Ou du moins, c'est dans Delphi. Je ne sais pas quelles solutions existent pour d'autres langues, mais cela ne devrait pas être trop difficile pour n'importe quelle langue avec une gestion des exceptions décente.
Mason Wheeler
1

Mon conseil le plus sérieux est de commencer à refactoriser où vous le pouvez. Je ne peux pas compter le nombre de fois où j'ai vu une recopie de fonctionnalités pour découvrir que ce n'était pas une copie complète à 100%. Il s'agissait d'une copie à 99,9% et d'une petite erreur mineure qui a entraîné un bug. Commencez à ajouter des tests unitaires à tout et si vous avez un service d'assurance qualité, essayez d'obtenir des scripts de test automatisés pour les parties du code que vous travaillez.

D'un autre côté, voyez combien de journalisation peut injecter dans le code. Autrement dit, s'il n'a pas beaucoup de journalisation, vous pouvez ajouter un indicateur au code pour commencer à récupérer une journalisation plus détaillée à vos propres fins de débogage. C'est quelque chose que vous pouvez demander à un utilisateur d'activer et de désactiver si vous pouvez ouvrir une boîte de dialogue. Cela m'a aidé plus de fois que je ne peux en compter. J'obtiens normalement "ça ne marche pas" sans une photo du problème. Je dis simplement «envoyez-moi le fichier journal».

blés
la source
0

Commencez par écrire des tests unitaires. Choisissez une classe ou une fonction et écrivez un ensemble de tests correspondant à la façon dont vous pensez que cela devrait fonctionner. Si les tests échouent, découvrez pourquoi. S'il s'agit d'un bug - corrigez-le. Si vos attentes s'avèrent fausses, déterminez ce que fait réellement la chose et modifiez les tests en conséquence.

Une fois que vous avez un ensemble décent de tests unitaires de travail, vous disposez d'un filet de sécurité pour effectuer une refactorisation afin de rendre le code plus propre.

Continuez à itérer jusqu'à ce que vous compreniez la base de code.

Inutile de dire que c'est quelque chose que vous devez faire à l'avance, pas en réponse à un rapport de bogue.

Dima
la source