Vous les connaissez, ces erreurs qui n'ont aucun sens. Où il semble qu'un gremlin vient de sauter profondément dans vos jetons et de gâcher quelque chose. Faites-vous une promenade, écrivez des choses, appelez un oncle?
Vous les connaissez, ces erreurs qui n'ont aucun sens. Où il semble qu'un gremlin vient de sauter profondément dans vos jetons et de gâcher quelque chose. Faites-vous une promenade, écrivez des choses, appelez un oncle?
Réponses:
Pour ces problèmes vraiment horribles, ma stratégie est généralement la suivante.
Expérimentez et google. Continuez à essayer de résoudre le problème. La plupart du temps, cela résout le problème en une heure ou moins.
Cela n'a donc pas fonctionné. Prendre une pause. Prenez un café, parlez de quelque chose sans rapport avec un collègue. Poussez le problème de votre esprit. Lorsque vous regardez le problème 5 ou 10 minutes plus tard, vous le regardez d'un point de vue légèrement différent. La plupart du temps, cela fonctionne.
Dans ce cas, ce n'est pas le cas. Alors, passez encore 10 à 30 minutes à le regarder. Appelez ensuite un collègue. Mais avant de le faire, prenez quelques notes; vous voulez démontrer le problème, le reproduire, puis lister les choses que vous avez essayées, et surtout prouver que vous les avez essayées. Faites donc un essai à sec en premier. Définissez des signets dans le code, fermez tous les documents ouverts superflus, etc. De cette façon, vous pouvez soit résoudre le problème vous-même, soit lorsque vous démontrez le problème, vous ne perdrez pas leur temps.
Demandez à votre collègue de vous faire prouver toutes vos hypothèses. ce setter est-il réellement invoqué? Cette méthode rend-elle vraiment ce que vous prétendez être? Vous pensez que cet objet n'est pas nul - montrez-leur qu'il n'est pas nul.
La plupart du temps, soit en démontrant le problème, vous vous rendrez compte que vous n'avez pas essayé toutes les possibilités, soit votre collègue verra votre erreur.
Si cela ne fonctionne pas, il est temps de devenir sérieux. Documentez exactement ce que vous essayez de faire, ce que vous avez essayé et pourquoi cela n'a pas fonctionné. Envoyez-le par e-mail à tous vos collègues. Publiez-le sur SO. À ce stade, le document devrait être une parfaite question SO.
Pendant que vous attendez les réponses, google google google. Essayez chaque permutation de la question que vous avez. Ouvrez un tas d'onglets. Vous n'obtiendrez probablement pas de réponse à ce stade, mais vous cherchez des idées, des possibilités, différentes façons d'aborder le problème.
Faites autre chose, si vous avez passé 5 heures sur un problème, il est temps de le laisser pour un autre jour. Vous obtiendrez peut-être une réponse utile. Peut-être que lorsque vous attaquerez le problème le lendemain, ce sera évident.
Si rien de tout cela ne fonctionne, il est temps de chercher une solution différente. Vous pouvez peut-être utiliser une méthode différente, une technologie différente. Vous devriez peut-être envisager d'abandonner la fonctionnalité pour l'instant. Facturez-vous le client à l'heure? Travaillez-vous pour une entreprise sur une application interne? Vous devez faire remonter cela au propriétaire et lui dire "regardez, j'ai passé x heures là-dessus et je n'ai fait aucun progrès, le rapport qualité-prix en vaut-il la peine?". Vous ne voulez pas aller voir votre patron et lui dire que vous avez passé 16 heures sur un problème uniquement pour qu'ils se retournent et disent, ce n'est pas si important, sautez-le pour cette version. vous devez le découvrir plus tôt.
Et si ça ne marche pas? Eh bien, vos seules options sont de continuer à marteler le problème ou de rechercher l'expertise de l'industrie. Demandez à des experts en technologie sur Twitter. Envoyez un courriel à votre fournisseur de technologie.
Quitter. Non, pas ton boulot! Levez-vous et rentrez chez vous. Vous avez terminé pour la journée ou le week-end. 19 fois sur 20 lorsque vous reviendrez au problème, la solution se présentera dans l'heure.
Avant dix heures, j'obtiendrais de l'aide.
Un mot,, timebox
définissez un temps limité pour travailler sur quelque chose, et si ce n'est pas résolu, passez à autre chose et revenez-y le lendemain avec une nouvelle perspective.
Cela et une autre paire d'yeux, vaut toujours plus que n'importe quel temps que vous pouvez perdre à regarder quelque chose.
Je ne passerais jamais plus de 45 minutes à une heure à essayer de résoudre quelque chose en une seule séance, cela viole la loi des rendements décroissants.
Expliquez le problème à quelqu'un d'autre.
En expliquant le problème à quelqu'un d'autre, vous devez le clarifier: cela vous permet souvent de voir la solution.
(L'un des magazines informatiques professionnels du Royaume-Uni a déjà proposé de vendre des découpes en carton grandeur nature d'un programmeur principal spécialement à cette fin.)
Je trouve que dormir sur un problème (parfois pendant quelques jours) peut également aider.
J'ai un plan en trois étapes:
Chaque étape est une escalade si l'étape précédente a échoué. Il y a presque toujours quelque chose d'autre productif sur lequel je peux travailler à l'étape 2.
Je fais généralement l'un des trois:
Chacun des trois réussit à se distraire de la situation actuelle. Je trouve que les distractions laissent mon cerveau subconscient mâcher quelque chose pendant un moment. Après environ une heure, bam, il y a la solution :-).
Construisez un faisceau de test pour cibler ce défaut exact et isolez-le
Continuez simplement à éliminer le bon code .. tout en reproduisant le défaut. Jusqu'à ce que vous cibliez le morceau de code exact contenant l'erreur. Tracez ensuite le code.
Lecture recommandée: Le programmeur pragmatique en particulier Chapitre 10: Balles de traçage
Toutes ces suggestions sont excellentes. Cependant, j'utilise assez souvent une technique que je n'ai pas vue mentionnée. Faites des listes pour organiser vos réflexions sur le problème. Si j'ai un problème particulièrement délicat, j'écris généralement plusieurs listes telles que: faits, hypothèses, questions, symptômes, etc. Je trouve que souvent dans le processus d'organisation des choses de cette manière, je découvre des hypothèses que je ne savais pas que j'avais ( qui se révèlent souvent faux), des questions que je ne comprenais pas doivent être posées, d'autres permutations que je peux vérifier, etc.
Modifier:
La réponse courte:
Q: Comment abordez-vous les erreurs vraiment bizarres qui vous laissent perplexe pendant plus de 10 heures?
R: Assurez-vous qu'ils ne se produisent jamais: comprenez votre conception, connaissez votre code, apprenez à utiliser votre débogueur.
Explication:
"Là où il semble qu'un gremlin vient de sauter au plus profond de vos jetons et de gâcher quelque chose"
Cela ne devrait jamais arriver. Si c'est votre code, vous devriez avoir une très bonne idée de la cause de l'erreur avant de tenter de la corriger.
De plus, lorsque vous écrivez votre code, vous devez déjà savoir où et pourquoi il est susceptible d'échouer.
Cela dit - demander à un pair, publier sur SO, revenir sur vos pas et revenir en arrière et faire une pause - toutes les suggestions mentionnées ci-dessus vous aideront.
L'autre chose, c'est que vous devez connaître vos outils - votre boîte à outils de débogage. Journalisation des messages à des points suspects dans votre code, examen attentif de votre pile d'appels, utilisation de points d'arrêt conditionnels et de surveillance, etc. Les compétences de débogage ne sont pas des extras - elles font partie de la programmation.
J'ai eu un problème similaire, une corruption de mémoire apparente dans Objective-C, avec laquelle j'ai lutté pendant de nombreuses heures. Mais ensuite, mes collègues et moi-même nous sommes juste promenés pour le déjeuner, et j'ai expliqué le problème (et un élément particulier lié à la désérialisation d'un objet dans sa méthode init), et je me suis expliqué le problème dans son ensemble.
(détails techniques: fondamentalement, j'ai initialisé et renvoyé un objet sur autre chose que soi, donc il y avait deux allocations, mais un seul objet est revenu. La mémoire a changé et est devenue folle, se bloque, et le débogueur ne savait pas vraiment quoi faire avec soit).
Prendre un bain.
Des fans de Rodney McKay ?
Sérieusement, cependant, s'il y a un point commun entre toutes ces réponses, c'est de faire une pause et de faire autre chose .
J'aime à penser que cela relègue le problème à votre subconscient. Même si nous n'en sommes pas conscients, nos esprits (semblent) continuer à travailler sur le problème, même lorsque nous faisons autre chose, comme prendre un bain .
Une combinaison de tous ces éléments:
Éloignez- vous-en pendant un moment afin qu'il puisse s'asseoir sur votre brûleur arrière. Dormez, reposez-vous, mangez, promenez-vous, peu importe.
Examinez davantage le problème, que fait-il d'autre mal, quels autres symptômes pouvez-vous trouver?
Recherchez le problème, voyez ce que vous pouvez trouver. N'oubliez pas d'essayer différents mots clés
Essayez quelque chose de différent . Un travail autour. Une technique de débogage différente. Un validateur. Un ordinateur différent.
Parlez à quelqu'un . Même s'ils ne sont pas en mesure d'aider, ou même pas un programmeur, parler peut parfois déclencher l'idée de l'ampoule
Redémarrer! Le cas échéant, essayez de redémarrer votre ordinateur, le serveur, etc. Si rien d'autre, vous pouvez utiliser le temps pour réfléchir.
Demandez à StackOverflow! Nous sommes ici pour aider
Je n'ai vraiment pas aimé la réponse la plus votée, car même si cela fonctionne parfois, il suffit parfois de la comprendre le même jour, alors ce que je recommanderais, dans cet ordre, c'est:
Confirmez que cela ne vous arrive pas seulement. Cela peut vous faire gagner beaucoup de temps. Vous avez peut-être désinstallé un composant requis ou apporté une modification à votre environnement, et une exception est en train d'être avalée quelque part dans votre code. Si cela ne vous concerne que, j'utiliserais un outil de comparaison d'environnement. J'ai récemment lu sur un logiciel appelé Envy, qui vous permet de faire exactement cela, bien qu'il ne s'agisse pas d'un logiciel gratuit, il coûte 10 USD.
Ça arrive à tout le monde? Très bien, faites maintenant un historique de visualisation sur le code et vérifiez les changements récents qui pourraient avoir causé l'erreur, directement ou indirectement.
Il n'y a pas de changements récents? S'il s'agit d'une erreur très spécifique (une exception), 'stackoverflow it'. Maintenant, cela ne sonne pas mieux que «google it», mais je me sens bien de dire que je recherche d'abord stackoverflow pour la recherche en programmation que google. S'il s'agit d'un problème vraiment connu, il est très probable que vous trouverez une solution ici. Sinon, postez une question sur le site stackexchange associé. Vous pourriez obtenir une réponse très rapide, ou même si vous ne le faites pas, votre question sera là pendant que vous effectuez plus de recherches. Voilà un avantage.
Si vous n'avez pas trouvé de réponse en ligne ou que ce n'est pas une erreur générale, parcourez le code étape par étape, en vérifiant si les résultats obtenus de chaque étape ont un sens pour le résultat que vous attendez. Allez du début à la fin de chaque méthode, et de bas en haut sur une solution à plusieurs niveaux. (c.-à-d. si vous dépannez les performances, commencez par le code qui récupère les enregistrements. n'a pas de sens de commencer dans l'interface utilisateur si vous pouvez déterminer rapidement si la première étape est le problème).
Si après avoir parcouru le code plusieurs fois, vous n'avez toujours pas trouvé ce qui ne va pas, appelez quelqu'un pour en parler. Comme quelqu'un l'a déjà mentionné, en parler à haute voix peut allumer l'ampoule. De plus, la programmation par paires est vraiment utile.
À ce stade, si c'est possible, éloignez-vous pendant un certain temps ou pour la journée. Hier, j'ai lu un tweet très vrai qui disait "Je suis allé me coucher en pensant" comment ça va "et je me suis réveillé en pensant" mais bien sûr "". Tellement vrai.
Si vous n'avez toujours pas de réponse, j'ose dire que vous pouvez essayer de refactoriser en tâches / méthodes / fonctions plus petites. Henry Ford a dit quelque chose comme «Il n'y a pas une tâche si complexe qui ne peut être accomplie en la divisant en tâches plus petites». À ce stade, si la solution est trop complexe et que vous n'avez pas compris par vous-même ou avec l'aide de quelqu'un d'autre, refactorisez le code en tâches plus petites. Même si vous ne finissez pas par le commettre, cela peut vous aider à trouver la raison.
Ajoutez une instrumentation à votre code.
Tweetez à ce sujet ??
Vous devez prendre du recul. Ma devise est «si le problème est trop difficile, vous résolvez le mauvais problème». Quelles sont vos hypothèses? ne fais confiance à rien.
Le corollaire à cela est «plus le problème est étrange, plus la solution est étrange». La force de l'ordinateur réside dans sa logique, vous ne pouvez donc pas gagner sur la logique. Vous avez un cerveau et devez le penser.
Dans les temps modernes, il y a tellement d'autres choses qui interagissent sur un système - pare-feu, AV, antispyware, mises à jour automatiques qui ont lieu tous les soirs - vous devez faire face à des cibles mobiles.