Disons que vous avez un bogue trouvé dans le test fonctionnel d'une partie assez complexe du logiciel. Cela pourrait découler de données mauvaises / inattendues dans la base de données, du code de niveau central ou quelque chose à l'avant. P>
Bien. Nous avons tous été là. P>
Vous avez des tests unitaires pour écrire et exécuter, les instructions de débogage / enregistrement pour insérer, des instructions SQL à écrire et à exécuter, des choses que vous souhaitez vérifier avec Firebug, etc. P>
Disons que la première étape est proposée avec une liste de causes potentielles que vous souhaitez enquêter. p>
Maintenant, vous devez décider de l'ordre de faire les choses. P>
Avez-vous: p>
J'ai un sentiment que la première stratégie est la plus souvent utilisée. Peut-être que parce que je ne travaille pas avec de nombreux développeurs juniors, et plus de développeurs seniors ont tendance à avoir une intuition décente. Ou peut-être que nous pensons simplement que nous avons une intuition décente mais devraient vraiment utiliser une approche plus systématique. P>
Toutes les pensées? P>
14 Réponses :
Je dirais que cela n'a pas d'importance, tant qu'il est documenté et méthodique. C'est un petit truisme étrange dans la programmation qui, parfois faire des choses dans un ordre aléatoire, est plus efficace que de dépenser beaucoup de temps à essayer de comprendre la "meilleure" voie. p>
Ne jamais sous-estimer le sentiment d'intestin; C'est l'expérience en vous donnant une tête. Je commence presque toujours avec ce que vous considérerez probablement d'être mon sentiment "intestinal". Je regarde l'erreur et vérifie les étapes que je pense susceptibles de causer ce problème. P>
Mon premier pas dans une situation comme celle-ci est généralement de vérifier les choses dans l'ordre qui réduira le plus rapidement le nombre de choses à vérifier. Vous pouvez presque y penser comme faisant une recherche binaire du bogue: "Eh bien, les paramètres de poste ont l'air bien, je peux donc exclure tout avant la soumission de formulaire", etc. p>
Cela dit, si j'ai un fort sentiment que le problème pourrait être dans un endroit particulier, je vérifierai cela en premier. P>
J'ai tendance à aller avec le sentiment d'intestin, et une approche de division et de conquête; isoler des morceaux de code de taille décroissante où je pense que "le bogue" est. p>
Cela ne fonctionne pas si vous ne savez pas, ni ne comprenez pas le codeBase - si tel est le cas, trouvez quelqu'un qui le fait et allez avec leur sentiment d'intestin. P>
D'abord, j'essaie de comprendre le bogue, puis je fais tout ce que vous suggérez, en fonction de la sensation de gut. C'est vraiment un compromis de la manière dont vous êtes certain d'une cause spécifique et à quel point il est facile de tester. P>
En outre, lorsque j'échete une cause, j'essaie d'ajouter directement les vérifications vraiment rapides car je l'inspectione de toute façon (ajouter des énoncés de sortie temporaires de débogage, ajouter des affirmations et telles) p>
Dans mon expérience, il est probablement préférable d'aller avec une sensation de gut (1) pendant 30 minutes environ. P>
Si rien ne sort de cela, parlez à quelqu'un d'autre à ce sujet. P>
C'est assez étonnant de quoi parler à quelqu'un d'autre (même s'il n'est pas technique), peut aider. P>
C'est une bizarrerie cognitive. Nous sommes des créatures linguistiques, donc l'activité de traduction de vos intuitions intérieures en sons vous oblige à regarder le problème sous un autre angle.
+1. J'ai oublié de mentionner de parler à quelqu'un à ce sujet. Je trouve souvent que l'acte d'explication peut provoquer une ampoule d'éclairage de sortir dans votre tête et de résoudre le problème sur place.
Je trouve le Débogage de canard en caoutchouc la stratégie fonctionne bien aussi. P>
J'ai toujours entendu l'histoire (éventuellement apocryphe) du professeur d'informatique qui avait un ours en peluche à l'avant de son bureau. Au cours de ses heures de bureau, tout étudiant qui souhaitait lui demander une question a dû demander à l'ours d'abord; Si l'étudiant ne pouvait toujours pas comprendre le problème après avoir demandé à l'ours, l'étudiant pourrait alors demander au profresseur. Ma femme apprendra la programmation - et je pense que je vais essayer d'employer mes chats dans ce rôle (surtout celui qui est sourd.)
+1. Pour la même raison, j'ai donné +1 à Bravex. De plus, je n'étais pas au courant de ce terme.
"Le débogage de l'ours en caoutchouc" semble un peu étrange
Ma commande: p>
rinçage, mousser, répéter jusqu'à ce que la cause initiale du problème soit trouvée. Fastidieux et mécanique, mais vous obtiendrez là-bas. P>
sauf ... occasionnellement les tests d'une itération de l'étape 3 n'échouent pas; Le plus souvent, car une mémoire de corruption de système non liée est ce qui conduit à l'état non valide, ou parce que le problème est le threading / chronométrage / ininciplinisé les données dépendant et introduisant suffisamment les tiges et / ou la disposition des données pour modifier ou masquer les symptômes. À ce stade, pour cette affiche au moins, le processus devient plus intuitif, alternant entre remplacer les tests de santé mentale avec des formes moins intrusives et désactiver de manière sélective les modules pour exclure des sources de corruption. P>
Voici quelques astuces utiles: p>
Écoutez comment les experts débèvent du logiciel sur la radio d'ingénierie logicielle: P>
Dave Thomas parle de logiciel Archéologie qui a de très bons conseils sur le débogage. P>
Andreas Zeller apparaît dans un Episode < / a> dévoué au débogage. p>
En général, je commence par le sous-ensemble d'hypothèses que je considère les coupables les plus susceptibles, puis trier ce sous-ensemble d'hypothèses à quel point chacun est facile de réfuter et de commencer avec les plus faciles. P>
Quelle que soit la commande, la chose importante est ce que vous faites avec votre hypothèse. Commencez à essayer de réfuter chaque hypothèse plutôt que de le vérifier et de couvrir plus de terrain fort> (voir Psychologie de l'analyse de renseignement de Richards J. Heuer, JR ., PDF gratuit). P>
Je suis avec @moonshadow, mais j'ajouterai cela à une certaine mesure, cela dépend de ce que l'échec est. C'est-à-dire que certaines sortes d'échec ont des causes assez bien connues et je commencerais avec la cause connue p>
Par exemple, sur les erreurs "Access Violation" des systèmes Windows sont presque toujours dues à la tentative d'utilisation ou d'examen (accès) de mémoire non allouée. Pour trouver la source d'une telle erreur, c'est une bonne idée de regarder tous les endroits où la mémoire est (ou n'est pas) allouée. P>
Si on sait que le "problème" est dû à des données incorrectes, le correctif peut nécessiter des modifications à la validation ou à l'acquisition des données, même une fois que l'erreur est tracée à l'analyse. P>
Un point de plus, tout en réfléchissant à travers le virus, il vaut souvent bien l'effort d'essayer de créer un petit programme pour la créer. p>
Je fais normalement ceci: p>
1) ajoutez un nouveau cas de test fonctionnel au système de test de régression automatisé. B> Je démarre normalement un projet de logiciel avec un système de test de régression propre avec p>
Cet objectif pour toutes ces œuvres est de vous assurer qu'une fois que tout bogue est trouvé, il ne doit plus jamais apparaître dans le code de contrôle ou le système de production à nouveau. Il est également plus facile de reproduire les problèmes aléatoires et à long terme. P>
Ne vérifiez pas de code à moins que cela ne vous assiste à un test de régression automatisé de nuit B>. p>
J'écris généralement 1: 1 le rapport entre le code produit par rapport au code de test. 20K lignes d'expert TCL pour les lignes de 20 km de code C ++. (Il y a 5 ans.) Par exemple: P>
Je ne veux pas que l'équipe de QA fasse un test automatisé avec mon système de test, car tout mon code de contrôle doit réussir les tests. J'exécute habituellement 2 semaines d'essai de régression à long terme avant de donner au code à l'équipe QA. P>
Les cas de test manuel de l'équipe QA s'assurent également que mon programme dispose de suffisamment d'informations de diagnostic intégrées pour capturer tous les bugs futurs. L'objectif est d'avoir suffisamment d'informations de diagnostic pour résoudre 95% des bogues dans <2 heures. J'ai pu faire cela dans mon dernier projet. (Équipement de réseau vidéo chez RBG Networks.) P>
2) Ajouter une routine de diagnostic (base Web de nos jours) b> Pour obtenir toutes les informations internes. (État actuel, journaux, etc.). > 50% de mon code (C / C ++, spécialement) sont le code de diagnostic. P>
3) Ajouter plus de détails Journal pour la zone de problèmes que je ne comprends pas. P>
4) Analysez les informations. P>
5) essayez de corriger le bogue. P>
6) s'exécute sur la nuit / sur les tests de régression du week-end. B> Lorsque j'étais en R & D, je demande généralement au bail 5-10 systèmes de test pour exécuter des tests de régression continue 24x7. Cela aide normalement à ID et à résoudre le problème de la mémoire, des ressources et des performances à long terme avant que le code ne frappe SQA. p>
Une fois qu'un système intégré échoue, démarrez à l'invite Linux de temps en temps. J'ai ajouté un cas d'essai qu'il vaut le cycle d'alimentation du système avec une prise programmable à nouveau et assurez-vous qu'il puisse "voir" l'invite de commande et commencer à exécuter le test pendant la nuit. Nous avons pu rapidement identifier le problème du code FPGA et vous assurer que le système est toujours en hausse après 5000 cycles de puissance. Un cas de test a été ajouté et tout ce qu'un nouveau code Verilog Code CheckIn / FPGA est construit. Ce cas de test a été couru. Ce n'était plus jamais un problème. P>
Je suggère de lire le débogage en pensant. p>
Andreas Zeller a également fait du travail dans des études de débogage systématiques. p>
6. Google pour le bogue ou la poste sur Stackoverflow
Une pensée - cela devrait être un wiki communautaire.
@ 01, je ne comprends toujours pas parfaitement le raisonnement ou les avantages d'une question de la communauté wiki malgré leur lecture à leur sujet sur Meta. Il semble que je ne suis pas la seule personne un peu confondue par cette fonctionnalité. Mais je suppose que je vais l'essayer (au moins une fois) de voir ce qui se passe.
6. Commencez avec le code qui a été changé le plus récemment.