Les vrais programmeurs utilisent des débogueurs? [fermé]


15

Si des programmeurs expérimentés utilisent réellement des débogueurs, et si oui dans quelles circonstances. Bien que dans la réponse à cette question, j'ai dit «mois» il y a probablement des «années» - je n'utilise vraiment pas de débogueur. Donc, ma question spécifique est dans quelles circonstances utiliseriez-vous, en tant que programmeur expérimenté, un débogueur?


14
C'est comme demander si des programmeurs expérimentés utilisent le clavier ... Je ne comprends pas ce que l'expérience a à voir avec ça - pensez-vous qu'ils sont des dieux et créent un code parfait sans erreurs dès le début? Et même si c'est le cas, qu'est-ce que cela signifie pour vous - arrêterez-vous d'utiliser le débogueur quand vous en aurez besoin et direz-vous: "Je n'utilise pas le débogueur, donc je suis vraiment programmeur" ... :) BTW. Je doute qu'un professionnel réponde à une telle question ...

3
@Wooble: la question de base "les programmeurs expérimentés utilisent-ils des débogueurs" est une bonne question. Cela m'a en fait surpris de déclencher une mini-guerre sainte.
Kevin

19
Les vrais programmeurs, bien sûr, utilisent des papillons
Rein Henrichs

4
La plupart des débogueurs existants sont démodés, ont des interfaces merdiques et nécessitent que le programmeur connaisse et comprenne des concepts et des paradigmes difficiles à maîtriser et, de nos jours, il n'est pas juste de s'attendre à ce que la plupart des programmeurs utilisent ou connaissent. En conséquence, la plupart des programmeurs modernes et expérimentés se donnent beaucoup de mal pour acquérir les compétences nécessaires pour écrire le type de code qui doit rarement être débogué dans un débogueur, pour éviter la douleur de l'expérience. Donc "oui ils l'utilisent" et "le moins possible"
blueberryfields

7
Les programmeurs expérimentés qui «n'utilisent pas de débogueurs» pensent probablement en termes de gdb / SoftICE, et n'ont jamais utilisé de véritable débogueur intégré (et n'utilisent probablement pas d'IDE d'ailleurs). Ils sont tellement en retard que c'est douloureux.
BlueRaja - Danny Pflughoeft

Réponses:


44

Je dirais que ne pas utiliser de débogueur est un signe d'inexpérience. Parcourir le code ligne par ligne est le meilleur moyen de suivre le flux d'exécution.


30
étrange alors qu'après plus de 30 ans de programmation en assembleur, fortran ,, C, C ++ etc. etc. je ne ressens aucune envie d'en utiliser un.

59
Faire quelque chose pendant longtemps ne vous rend pas nécessairement bon.
ceejayoz

31
Ne pas pouvoir utiliser un débogueur est un signe d'inexpérience. Comprendre le flux d'un programme en lisant simplement du code ne l'est pas. Bien sûr, les programmeurs expérimentés auront besoin du débogueur de temps en temps, mais si vous pouvez lire le code, ce n'est pas nécessaire, et cela ne accélérera pas non plus le processus de débogage.
GolezTrol

10
@Karl Bielefeldt: Permettez-moi de citer quelques exemples célèbres de programmeurs qui n'utilisent pas de débogueurs pour le débogage. Linus Torvalds, auteur de Linux. Larry Wall, auteur de Perl. Un logiciel assez complexe pour vous?
btilly

9
@Neil: combien de temps passez-vous à travailler sur votre propre code, et combien de maintenance de code écrit par d'autres personnes? Et en particulier, combien de code de maintenance écrit par d'autres personnes qui n'auraient jamais dû être autorisé à proximité d'un langage de programmation?
Carson63000

28

J'utilise souvent le débogueur, car je travaille sur un gros système et donc je crains. http://steve-yegge.blogspot.com/2007/06/rich-programmer-food.html

Quelle que soit la longueur et la fréquence de lecture de votre code, il y aura toujours la possibilité qu'il contienne des bogues. http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html

L'erreur est humaine et on ne peut jamais prouver qu'un programme est correct, alors pourquoi ne pas utiliser des outils tels que le débogueur / test automatisé pour nous aider dans cette entreprise difficile?

Si le code est suffisamment court, des tests simples suffiront. De plus, s'il est court et que vous connaissez la nature du bogue, la lecture du code peut suffire. Cependant, une fois que la base de code est grande, implique plusieurs langues mélangées ensemble, plus 3 niveaux, alors vous devez simplement avoir une bonne couverture de test à plusieurs niveaux plus un très bon débogueur - sinon vous perdrez beaucoup de temps.

Alors, quand n'ai-je pas besoin d'un débogueur?

Je ne suis pas le codeur le plus intelligent, ni le plus expérimenté, mais quand même, je n'ai parfois pas besoin d'utiliser le débogueur. C'est quand:

  • Le code est à moi ou bien écrit ET
  • Il est écrit dans un langage lisible ET
  • Le projet global est petit.

Quand dois-je compter fortement sur un débogueur?

  • Réponse courte: souvent .
  • Lorsqu'une application se bloque. Surtout quand il est déployé. L'installation de VS2010 sur cet ordinateur peut faire une différence entre "Erreur inconnue" et FileNotFoundException.
  • Lorsqu'une bibliothèque tierce se bloque ou se comporte mal.
  • Lorsque le code est mal écrit. Surtout si le même dossier a été touché par 10 personnes différentes au cours des 10 dernières années, dont 7 ne font plus partie de l'entreprise.
  • Quand le projet est grand
  • Quand le code est plutôt monolithique.
  • Lorsqu'il y a plusieurs niveaux (GUI, SQL, BL) impliqués.

Notez que "débogueur" peut faire référence à plusieurs outils. J'utilise également le débogueur Visual Studio, le débogueur SQL (principalement pour les proc stockés) et le profileur SQL (pour déterminer quels SP sont appelés). Aurais-je besoin d'outils de ce calibre que j'écrivais un rapide script Python sysadmin-ish? Non. Si j'ai créé mon propre petit outil basé sur une interface graphique? Dépend. S'il s'agit de .Net WinForms - probablement pas. Si c'est WPF - oui.

Qu'est-ce qui définit un "vrai" programmeur de toute façon? Celui qui est rapide? bien informé? Est-ce bon en algorithmes? Écrit une bonne documentation? À quel moment exactement obtient-on son diplôme dans ce nouveau titre? Quand franchit-on la ligne magique?

Je dirais qu'un programmeur qui ne s'est pas sali les mains dans un effort de plus de 100 années-homme n'a pas eu la chance d'être humilié par la complexité et ses propres limites (ainsi que frustré par la qualité du code).

J'essaie personnellement d'utiliser le meilleur débogueur à ma disposition, et j'ai tendance à l'utiliser souvent. Si une tâche est assez simple et ne nécessite pas de débogueur - je ne l'utilise pas alors. Il ne faut pas trop de temps pour savoir si j'en ai besoin ou non.

...

Maintenant, en théorie, je pouvais lire la base de code pendant si longtemps, que je l'obtiendrais. Cependant, l'approche pratique fonctionne mieux, et je veux souvent réécrire ce code stupide que je vois. Malheureusement, il me faudrait plus de 10 ans pour nettoyer la base de code dans laquelle je me trouve. L'utilisation du débogueur est donc une première étape évidente. Ce n'est que lorsque je découvre que l'une des 5 millions de lignes de code agit, que j'analyse le fichier de haut en bas pour essayer de comprendre ce que fait cette classe.


+1, excellente réponse, je suis particulièrement d'accord avec l'aspect "lorsqu'il y a plusieurs niveaux impliqués", celui-ci est rarement mentionné par les avocats "il suffit de lire le code et de trouver l'erreur".
Carson63000

Content que vous ayez pu lire le tout.
Job

+1 pour une excellente réponse et pour examiner la définition d'un "vrai programmeur". L'utilisation de cette phrase a rendu l'OP sournois, intéressant et potentiellement inflammatoire (à cause de son implication dénigrante ou de ses insinuations).
Smandoli

1
"on ne peut jamais prouver qu'un programme est correct" Ce n'est pas vrai.
GManNickG

1
@GMan, veuillez développer votre déclaration. Comme je l'ai appris, de nombreuses tentatives précédentes pour prouver l'exactitude d'un court extrait de code pour une langue spécifique ont échoué, par exemple, plusieurs bogues ont été trouvés après la fin de la preuve (par un professeur spécialisé dans ces preuves). Certains programmes très triviaux pourraient s'avérer corrects, je suppose. Je suis curieux de découvrir votre angle ici.
Job

17

"Je n'aime pas les débogueurs. Jamais, probablement jamais." - Linus Torvalds

En revanche, il n'a pas de compte Stack Overflow, donc je ne sais pas si vous êtes intéressé par son avis :)


3
Peu d'entre nous sont Linus Torvalds, pour le reste d'entre nous de simples humains, nous avons besoin du débogueur.
Nodey The Node Guy

7
les noyaux ne s'appuient pas bien sur les débogueurs.

7
Oui, la programmation du noyau est un domaine différent de la programmation en espace utilisateur. Je ne suis généralement pas d'accord avec les opinions de Linus pour l'espace utilisateur, mais elles sont certainement respectables lorsqu'il s'agit de l'espace noyau.
alternative

16
«Je n'aime pas les débogueurs» ne signifie pas «je n'utilise pas de débogueurs». Ce que Linus a réellement dit était "Je n'aime pas les débogueurs. Je ne l'ai jamais fait, probablement jamais. J'utilise gdb tout le temps, mais j'ai tendance à l'utiliser non pas comme débogueur, mais comme désassembleur de stéroïdes que vous pouvez programmer." (Je sais que certains essaieront de tordre cela pour signifier que Linus n'utilise pas de débogueur, mais ce n'est pas exact.)
Kristopher Johnson

6
Il semble que Linus Torvalds et je ne suis jamais d'accord sur quoi que ce soit.
BlueRaja - Danny Pflughoeft

12

Donc, ma question spécifique est dans quelles circonstances utiliseriez-vous, en tant que programmeur expérimenté, un débogueur?

  • Lorsque vous ne parvenez pas à "déboguer" en lisant votre code.
  • Lorsque vous ne parvenez pas à prédire les valeurs de certaines variables à un moment donné.
  • Lorsque votre modèle mental de votre code ne correspond pas à la sortie donnée par votre code

Éditer:

J'ai eu la chance / le malheur de ne pas savoir comment utiliser un débogueur dans mon parcours de programmation. Ainsi, dans le passé, j'ai été obligé de déboguer sans débogueur. Cependant, après avoir appris à utiliser un débogueur -> je suis devenu 100 fois plus productif dans la recherche de bugs.


+1 pour "Lorsque votre modèle mental de votre code ne correspond pas à la sortie donnée par votre code"
utilisateur

8

Pour donner une perspective légèrement différente des réponses actuelles; En tant qu'ingénieur logiciel embarqué travaillant sur des systèmes qui ont souvent un composant en temps réel, j'utilise rarement un débogueur.

À l'occasion, un débogueur peut être un outil incroyable et chaque fois que je suis capable de créer et d'exécuter du code sur un bureau, j'utilise toujours un débogueur.

Sur puce, avec des contraintes en temps réel, il y a alors une lourde charge associée à l'utilisation d'un débogueur. Dès que vous interrompez l'exécution, vous risquez de perturber, voire fatalement, le timing du reste du système. Généralement sur puce, printf dans le code non critique et les remous d'E / S dans le code critique sont le meilleur outil et le plus simple. Ce n'est pas aussi bon qu'un débogueur, mais c'est beaucoup moins cher de travailler avec un vrai système.


1
vous voudrez peut-être enquêter sur les cartes de débogage basées sur le matériel
Steven A. Lowe

@Steven merci; malheureusement, alors que certains des systèmes sur lesquels je travaille ont un support matériel approprié, d'autres non. Bien que nous ayons généralement l'option d'un analyseur logique, cela a tendance à être encore plus cher en termes de temps.
Luke Graham

Je suis exactement le contraire. J'utilise un débogueur beaucoup plus souvent sur les systèmes embarqués. Je suis d'accord pour dire que cela perturbe le calendrier. Il faut beaucoup d'efforts pour filtrer et / ou minimiser les changements causés par la mise en place d'un débogueur dans la boucle.
Karl Bielefeldt

7

Je pense que les programmeurs expérimentés utilisent presque exclusivement des débogueurs, lorsqu'ils sont nécessaires. Quelle meilleure façon de retrouver un bogue que de suivre réellement l'exécution du code ...

Êtes-vous sous l'hypothèse que les Skeets du monde ne font pas d'erreurs ou ne savent tout simplement pas? Tous les programmes, sauf les plus triviaux, se comportent de manière inattendue dans certaines circonstances. Il va de soi que les problèmes devront être examinés. Ainsi, les choix sont d'utiliser des instructions d'impression, à une extrémité du spectre, ou de regarder examiner ce qui s'est passé, post mortem, de l'autre, ou de regarder au milieu pendant l'exécution du code et de comprendre ce qui se passe.

Une meilleure façon de penser est peut-être que les programmeurs expérimentés savent quand utiliser un débogueur. Dans le code avec peu de dépendances, regarder une trace de pile suffit probablement pour comprendre ce qui ne va pas. Mais il y a des scénarios compliqués où votre code fonctionne avec un autre code, et vous avez besoin d'un débogueur pour regarder les choses que vous n'avez pas écrites.


4
Eh bien, c'est exactement ce que j'essaie d'enquêter - je suis un programmeur extrêmement expérimenté et je n'en utilise jamais.

5
@neil, peut-être que vous n'en avez pas besoin. Rassurez-vous, le moment viendra où le débogueur sera le moyen le plus simple d'aller au fond d'un problème, que vous
finissiez

Je peux aussi lire des trucs que je n'ai pas écrits. Et si je ne peux pas, c'est généralement parce que c'est du mauvais code. Dans d'autres cas, j'utilise le débogueur.
GolezTrol

Si le langage que vous utilisez prend en charge les exceptions, et si vous les utilisez + un cadre de journalisation approprié (par exemple log4j ou quelque chose comme ça), vous vous retrouverez toujours avec une trace de pile pointant vers la ligne de votre erreur. 99% du temps, il s'agit d'une exception de pointeur nul où vous ne vous y attendiez pas. Qu'est-ce qu'un débogueur va vous dire d'autre? Maintenant, quand je programmais en c, il y avait des choses que vous ne pouviez tout simplement pas trouver sans un débogueur (par exemple, la corruption de pile). Mais ce genre de choses n'arrive plus dans les langues de haut niveau.
Kevin

1
@kevin, à droite, je pense qu'il y a une classe de problèmes entre ces deux où le débogueur est le moyen le plus naturel d'aller au fond d'un problème. Peut-être que je veux voir les propriétés dynamiques mises sur un objet dans un cadre de langage dynamique comme les grails. Peut-être que je veux voir exactement où quelque chose que je pense n'est pas nul est rendu nul (NPE vous indique où est l'exception, pas pourquoi la chose est nulle). Peut-être que je veux que mon débogueur s'arrête sur une exception pour que je puisse voir quelle combinaison de code a provoqué une exception, pas seulement qu'elle s'est produite dans le stacktrace.
hvgotcodes

4

Non, et je programme depuis plus de 10 ans. Je le faisais quand je programmais en c / c ++. Maintenant je programme en java. La vérité est que si vous vous connectez correctement, vous vous retrouverez avec une trace de pile qui est suffisante pour la plupart des développeurs qualifiés. De plus, si vous écrivez de (bons) tests unitaires et des tests fonctionnels, cela élimine toute une classe de bogues.


Si cela clarifie davantage, je connais beaucoup de programmeurs java qui utilisent un débogueur. Ils sont pour la plupart sortis de l'école.
Kevin

1
stacktraces n'affiche pas de données - vous devez ajouter ces informations vous-même - mais elles sont en or pur.

1
@ Thorbjørn: Ils peuvent afficher des données, en fait: voir le module cgitb de Python , par exemple. (Le CGI dans le nom est principalement vestigial, le but initial du module ayant été de présenter des traces de pile utilisables lorsqu'un CGI s'est écrasé.) Bien sûr, avec cela, vous obtenez parfois tellement de données qu'il devient difficile de naviguer vers la pile cadre d'intérêt. J'aime cgitb.enable(format='text')quand même.
SamB

Je n'utilise pas vraiment de débogueurs et j'utilise C ++ ..
Nikko

@SamB Kevin a parlé de Java, ce qui n'est pas possible

4

On s'en fout? Ce que je veux savoir, c'est si l'utilisation d'un débogueur m'empêchera d'être un meilleur programmeur à long terme? Peut-être que les débogueurs étaient de moindre qualité lorsque de nombreux développeurs expérimentés ont commencé, ils étaient donc un obstacle. Est-ce une béquille qui empêche une compréhension plus profonde?

Un programmeur, probablement meilleur que le reste d'entre nous, a trouvé le besoin d'un débogueur et en a construit un (aucune idée de qui a créé le premier). Je suis sûr qu'ils ont été plus productifs grâce à cela. Je doute que la motivation ait été de permettre à des mortels mineurs d'écrire du code.


3

Rarement.

Vos méthodes doivent être suffisamment petites / simples pour être compilées et exécutées par votre esprit, les tests unitaires doivent couvrir les fonctionnalités. Si vous trouvez un bug, écrivez un test. Exécutez-le, réparez-le.

J'ai tendance à utiliser le débogueur uniquement lorsque ive a obtenu un comportement inattendu de code non testable, comme le framework ASP.NET.


3
il y a de vrais noobs haineux dans ce fil ...

2
AUCUNE raison de voter contre - il a raison.
wadesworld

11
-1 parce que cette affirmation revient à dire que la façon de gagner de l'argent à Vegas est de gagner chaque main. Cela ne reflète pas la réalité de la situation, et l'affirmation selon laquelle tout le code sera simple n'existe que dans de petits problèmes isolés. De plus, la revendication "exécutez-le, corrigez-le" ignore complètement la façon dont vous procédez pour le corriger. J'allais le laisser glisser mais en insinuant ensuite que tous ceux qui ne sont pas d'accord méritent un vote en aval.
whatsisname

2
-1: "Vos méthodes doivent être suffisamment petites / simples pour être compilées et exécutées par votre esprit" est déconnectée de la réalité. C'est comme dire qu'une fonction de plus de 20 lignes est trop longue. Absurdité.
John Dibling

3

Dans Smalltalk, je développe presque entièrement dans le débogueur:

  1. Écrivez un test qui, je le sais, échouera.
  2. Exécutez le test. En cas d'échec, le débogueur s'affiche.
  3. Écrivez, dans le débogueur, le code nécessaire pour réussir le test.
  4. Reprenez l'exécution.
  5. Si je reçois un feu vert, passez à l'étape 1 avec un nouveau test d'échec. Sinon, dans le débogueur, découvrez ce que j'ai fait de mal et corrigez-le.

2

J'utilise un débogueur quand j'en ai besoin. Ce n'est pas quotidien, mais cela se produit occasionnellement. Il est parfois préférable de parcourir le code pour voir ce qui se passe exactement.

Je dois admettre que j'utilise de moins en moins de débogueurs. Je développe en Delphi depuis plus de 10 ans. J'écris également des procédures stockées en PL / SQL. Depuis quelques mois, je suis aussi développeur PHP.

J'utilise principalement le débogueur dans l'un ou l'autre de ces cas si je trouve un morceau de code obscur qui a été écrit il y a des années et que je dois le modifier. Il est parfois utile de découvrir le fonctionnement exact d'un programme s'il est difficile de lire le code. En PHP, ce n'est presque jamais nécessaire, mais en Delphi, qui est basé sur des événements, cela aide parfois lorsque vous avez un framework complexe.

Mais comme vous le dites, l'utilisation du débogueur est une exception. La plupart des problèmes sont résolus en lisant simplement le code et en corrigeant les erreurs que vous (ou quelqu'un d'autre) avez faites.

Mais cela vaut pour parcourir le code. J'utilise assez souvent la pile d'appels lorsqu'une exception se produit, et je mets parfois un point d'arrêt quelque part pour inspecter une variable. Mais presque toujours dans un morceau de code qui a quand même besoin d'une refactorisation approfondie.


2

Je code occasionnellement sans débogueur, mais uniquement lorsqu'il est forcé de le pointer, c'est-à-dire. gunge intégré hérité sur un 8051 ou Z80.

À mon humble avis, vous avez besoin d'un débogueur et de vous connecter à tout travail complexe. Une fois ne remplace pas l'autre. Un système de journalisation ne peut pas aider si l'application se trouve dans un pilote, par exemple, où la seule chose que le code peut faire est d'interagir avec le matériel et de définir un sémaphore.

Un débogueur ne peut pas résoudre une erreur système lorsque les applications fonctionnent correctement selon la façon dont vous les avez écrites, mais le système ne fonctionne toujours pas en raison d'une erreur de protocole de communication intermittente.

Donc, j'ai besoin du débogueur pour supprimer les bogues stupides et flagrants et les problèmes matériels. J'ai besoin d'une bonne journalisation pour détecter les bogues d'intégration système intermittents.

Je dois avoir les deux - j'ai besoin de toute l'aide que je peux obtenir!


2
z80 est assez grand pour les débogueurs. CP / M avait ZSID.

1

J'utilise uniquement un débogueur lorsque ces étapes échouent:

  1. Obtenez l'erreur reproductible. Pense. C'est souvent tout ce qui est nécessaire.
  2. Vérifiez toute trace de pile et journaux.
  3. Ajoutez plus de journalisation autour du code incriminé.

Ces étapes prennent en charge 95% de tous les cas. Cela signifie que j'utilise rarement un débogueur, et quand je le fais, il a tendance à me donner trop d'informations et je m'embourbe dans des détails non liés. Cela est particulièrement vrai si vous travaillez sur un système multithread en temps réel.

Des déclarations de journalisation judicieusement placées vont donc loin.


1

Serait-ce simplement que les programmeurs très expérimentés sont les mêmes que les très vieux programmeurs, et ils ont appris à programmer et ont formé leurs habitudes, à l'époque où les débogueurs n'étaient pas toujours disponibles, et parfois pas très bons?

Si vous êtes vraiment bon au débogage printf (et dans les années 80, nous n'avions pas beaucoup d'autre choix que de devenir vraiment bon), peut-être qu'un débogueur n'ajoute pas grand-chose.


0

C'est une question de choix personnel.

Honnêtement, je pense que les débogueurs sont utiles dans certaines situations où cela aide beaucoup de savoir ce qui se passe sur votre RAM à une étape donnée de l'exécution de votre programme.

L'utilité principale d'un débogueur est d'arrêter un programme sans que le programme soit conçu pour s'arrêter lui-même: cette fonctionnalité est très importante.

En dehors de ces 2 fonctionnalités, je ne pense pas qu'un débogueur soit vraiment nécessaire; tout programme complexe que vous faites devrait avoir une sorte de mode "verbeux", c'est-à-dire dire tout ce qu'il fait avec printf ou std :: cout, quels choix il a fait et beaucoup d'autres paramètres.

Imaginez simplement que vous créez un programme et que l'utilisateur a un problème à l'utiliser: comment savoir s'il l'utilise de la façon dont il a été conçu pour être utilisé, ou si la chose dont il se plaint pourrait être un bug?

Les débogueurs sont comme la direction électrique de votre voiture: il est plus confortable d'en avoir une, mais cela n'améliorera pas votre conduite.

La programmation est une question de conception et de logique, la façon dont les outils peuvent vous aider à suivre des trucs ne fait pas de vous un meilleur programmeur.

De plus, les débogueurs sont utiles pour les langages compilés, et encore moins pour les langages interprétés.


2
Je ne comprends pas ce que compilé vs interprété a à voir avec cela.
Michael Burr

bonne question: moi non plus.
jokoon
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.