Pourquoi le développement piloté par les tests est-il absent du test de Joel?

23

Je lisais ce blog de Joel Spolsky sur environ 12 étapes pour améliorer le code . L'absence de Test Driven Development m'a vraiment surpris. Je veux donc poser la question aux gourous. Le TDD ne vaut-il pas vraiment la peine?

Geek
la source
13
Cet article a été écrit le mercredi 9 août 2000 (il y a environ 12 ans). Non pas que TDD n'était pas là à ce moment-là, mais je ne pense pas qu'il ait apprécié le buzz qu'il fait de nos jours.
Mike
12
Le test Joel n'est qu'un ensemble de directives génériques. Tout ce qui "en vaut la chandelle" ne peut pas y trouver sa place.
yannis
2
« Je suis venu avec mon propre test très irresponsable et bâclé pour évaluer la qualité d'une équipe logicielle. La grande partie à ce sujet est que cela prend environ 3 minutes ... La bonne chose à propos du test Joel est qu'il est facile d'obtenir un oui ou un non rapide à chaque question. Vous n'avez pas besoin de comprendre des lignes de code par jour ou des bugs moyens par point d'inflexion ... ' - décider si votre projet bénéficiera de TDD prendrait plus de 3 minutes et, eh bien , pourrait nécessiter de calculer le nombre moyen de bogues par point d'inflexion - c'est pourquoi il ne figure pas dans la liste
gnat
Passez à Joel Stack plz. C'est un q intéressant.
Erik Reppen
Vous devriez envisager d'accepter la réponse qui relie et cite directement de Joel, car elle ne fait pas plus autorité que cela. Voir programmers.stackexchange.com/a/189493/6586
Bryan Oakley

Réponses:

30

Le développement piloté par les tests était pratiquement inconnu avant la publication du livre de Kent Beck en 2002, deux ans après que Joel ait écrit ce post. La question devient alors pourquoi Joel n'a-t-il pas mis à jour son test, ou si TDD avait été mieux connu en 2000, l'aurait-il inclus parmi ses critères?

Je crois qu'il ne l'aurait pas, pour la simple raison que l'important est que vous ayez un processus bien défini, pas les détails spécifiques de ce processus. C'est la même raison pour laquelle il recommande le contrôle de version sans spécifier un système de contrôle de version spécifique, ou recommande d'avoir une base de données de bogues sans recommander une marque spécifique. Les bonnes équipes s'améliorent et s'adaptent continuellement, et utilisent des outils et des processus qui correspondent bien à leur situation particulière à ce moment particulier. Pour certaines équipes, cela signifie définitivement TDD. Pour les autres équipes, pas tellement. Si vous adoptez le TDD, assurez-vous qu'il ne sort pas d'une mentalité de culte du fret .

Karl Bielefeldt
la source
1
Aussi ... oh tu as un peu touché le TDD est le point Kool Aid n'est-ce pas?
Erik Reppen du
27

Joel a effectivement abordé cette question spécifiquement à quelques endroits.

Il a expliqué que les choses que les tests ne sont pas capables d'attraper beaucoup de problèmes importants, en particulier subjectifs tels que "l'interface utilisateur de ce logiciel est-elle nul?" Selon lui, la dépendance excessive à l'égard des tests automatisés chez Microsoft est la raison pour laquelle nous nous sommes retrouvés avec Windows Vista.

Il a écrit comment, selon son expérience, les types de bogues que les utilisateurs trouvent réellement ont tendance à se diviser en deux catégories: 1) ceux qui apparaissent dans l'utilisation courante, que les programmeurs se seraient trouvés s'ils avaient exécuté leur propre code avant de l'utiliser , ou 2) des cas de bord si obscurs que personne n'aurait pensé à écrire des tests pour les couvrir en premier lieu. Il a déclaré que seul un très faible pourcentage des bogues que lui et son équipe corrigent dans FogBugz sont le genre de chose que les tests unitaires auraient détectés. (Je ne trouve pas cet article maintenant, mais si quelqu'un sait de quel article je parle, n'hésitez pas à modifier le lien ici.)

Et il a écrit comment cela peut être plus difficile que cela ne vaut, en particulier lorsque votre projet se transforme en un très grand projet avec de nombreux tests unitaires, puis vous changez quelque chose (intentionnellement) et vous vous retrouvez avec un très grand nombre de tests unitaires interrompus. Il utilise spécifiquement les problèmes que les tests unitaires peuvent causer comme raison pour laquelle il ne l'a pas ajouté comme un 13ème point au test Joel, même lorsque les gens suggèrent qu'il devrait le faire.

Mason Wheeler
la source
2
En fait, tu as raison. Le MO habituel de Joel est l'homme de paille. Comme TDD n'aurait pas attrapé de bugs pour moi, donc ça ne peut pas être bon. Ce qui manque un peu le fait que TDD ne concerne pas les tests, c'est la conception. Les tests laissés derrière sont un bonus. Ou pour affirmer qu'un petit changement cassera de nombreux tests unitaires, ce qui suggère qu'il ne fait que mal. Ou pour réécrire complètement un principe SOLIDE avant de l'attaquer. Ce genre de chose. Ce sont en fait ses partisans qui utilisent la logique circulaire, pas lui.
pdr
7
Je suis entièrement d'accord avec ces commentaires de Joel. Je pense qu'un problème encore plus important est la langue - avec de nombreux langages dynamiques, je ne peux pas imaginer faire quoi que ce soit sans tests unitaires - comment pouvez-vous savoir si une simple faute de frappe causera un problème que vous ne verrez pas jusqu'à ce qu'un critique moment? Dans les langages compilés statiquement et conçus pour réduire les erreurs, vous êtes éloigné de toutes les erreurs les plus simples et vous vous retrouvez principalement avec des erreurs logiques. Cela réduit la nécessité du type de couverture complète fournie par TDD.
Bill K
2
@MasonWheeler: Vous soutenez sérieusement que la sécurité du compilateur / type supprime le besoin de tests unitaires? Vous ignorez également volontairement les avantages de conception de TDD mais, plus important encore, vous devez avoir beaucoup de temps à refactoriser quoi que ce soit. Au contraire, on a vu que l'inverse était vrai: par exemple, les développeurs .NET qui suivent une méthodologie TDD se trouvent soudain frustrés par la quantité de code dont ils ont besoin pour écrire pour plaire à un compilateur qui est de plus en plus inutile en retour.
pdr
2
@pdr: Je soutiens sérieusement que "la nécessité de tests unitaires" est en premier lieu le manque de sécurité de type. Et, n'étant pas développeur .NET, je ne peux pas vraiment dire grand-chose sur leurs expériences, mais dans ma propre expérience, j'ai trouvé que la difficulté de refactoring est entièrement basée sur deux facteurs: si j'ai écrit ou non le code dans le premier endroit, et si l'auteur a bien écrit le code. (Remarque: les points 1 et 2 ne sont pas nécessairement fortement corrélés entre eux!)
Mason Wheeler
3
Les tests unitaires @Pdr ne prouvent pas votre code, ils sont principalement un vérificateur de syntaxe, mais peuvent être très utiles pendant le développement. Les tests d'intégration et de système ont cependant beaucoup plus de sens. De plus, la plupart des refactorings dans des langages typés statistiquement peuvent se révéler sûrs, en fait, c'est ce qu'est un refactoring - un ensemble d'opérations «sûres» connues qui transforment votre code sans introduire de changements. Dans un langage statique, l'EDI peut souvent apporter ces modifications pour vous et vous assurer qu'elles sont sûres, ce qui est souvent impossible dans les langages dynamiques qui nécessitent donc des tests unitaires pour aider à (pas prouver) la même sécurité
Bill K
25

Joel Spolsky lui-même a répondu à cette question en 2009 :

Joel: Il y a un débat sur le développement piloté par les tests ... si vous avez des tests unitaires pour tout, ce genre de choses ... beaucoup de gens m'écrivent, après avoir lu le test de Joel, pour dire: "Vous devriez avoir un 13 chose ici: tests unitaires, tests unitaires à 100% de tout votre code. "

Et cela me semble être un peu trop doctrinaire sur quelque chose dont vous n'avez peut-être pas besoin. Par exemple, l'idée de la programmation agile n'est pas de faire les choses avant d'en avoir besoin, mais de les mettre en page au besoin. J'ai l'impression que les tests automatisés de tout, souvent, ne vont tout simplement pas vous aider. En d'autres termes, vous allez écrire énormément de tests unitaires pour vous assurer que le code qui va vraiment fonctionner, et vous allez certainement savoir si cela ne fonctionne pas [si vous ne le faites pas écrire les tests] fonctionne, en fait, fonctionne toujours, ... Je ne sais pas, je vais recevoir un tel mail de flamme pour cela parce que je ne l'exprime pas si bien. Mais je pense que si une équipe avait vraiment une couverture de code à 100% de ses tests unitaires, il y aurait quelques problèmes. Une, ils auraient passé énormément de temps à écrire des tests unitaires, et ils ne seraient pas nécessairement en mesure de payer ce temps en qualité améliorée. Je veux dire, ils auraient une certaine qualité améliorée, et ils auraient la possibilité de changer les choses dans leur code avec la confiance qu'ils ne cassent rien, mais c'est tout.

Mais le vrai problème avec les tests unitaires comme je l'ai découvert, c'est que le type de changements que vous avez tendance à faire à mesure que le code évolue a tendance à casser un pourcentage constant de vos tests unitaires. Parfois, vous apporterez une modification à votre code qui, en quelque sorte, casse 10% de vos tests unitaires. Intentionnellement. Parce que vous avez changé la conception de quelque chose ... vous avez déplacé un menu, et maintenant tout ce qui comptait sur ce menu était là ... le menu est maintenant ailleurs. Et donc tous ces tests se cassent maintenant. Et vous devez pouvoir entrer et recréer ces tests pour refléter la nouvelle réalité du code.

Donc, le résultat final est que, à mesure que votre projet devient de plus en plus grand, si vous avez vraiment beaucoup de tests unitaires, le montant d'investissement que vous devrez faire pour maintenir ces tests unitaires, les maintenir à jour et les garder leur passage, commence à devenir disproportionné au montant des avantages que vous en retirez.

Ross Patterson
la source
2
Vraiment? Des votes négatifs sur la publication de la réponse de Joel à la question du PO?
Ross Patterson
1
Difficile à comprendre. Certaines personnes utilisent le vote pour signifier «j'approuve» plutôt que «c'est utile». Cela devrait évidemment être la réponse acceptée car elle est définitive.
Bryan Oakley
Je n'ai jamais travaillé sur un projet qui avait une couverture de test à 100%. Mais si vous avez une couverture de test de 0% ... ... c'est assez révélateur.
Kzqai
Merci! Je pense que cela devrait être marqué comme réponse acceptée.
Jalal
5

Personne d'autre que Joel ne pouvait répondre à cela avec certitude. Mais nous pouvons essayer quelques raisons / observations.

Tout d'abord, les tests ne sont pas absents du test de Joel

  • Les tests sont mentionnés deux fois en 12 étapes directement (10 et 12)
  • L'existence d'une build est l'un des premiers points. L'idée d'avoir build est d'obtenir la capacité de voir si elles cassent, donc nous parlons (également) de tests ici.

Deuxièmement, l'idée du test Joel (si je comprends bien) est d'avoir des questions rapides, oui-non. "Tu fais du TDD?" ne rentrera pas exactement (la réponse pourrait être: "certains d'entre nous", "pour cette partie du code" ou "nous faisons des tests unitaires").

Troisièmement, je pense que personne n'a dit que (même Joel) que ces points où "les seuls valent le temps" (en passant, "programmez-vous" n'y figurent pas), juste que ce sont de bonnes questions rapides à poser en venant en contact avec une équipe logicielle, que ce soit en tant que futur membre de l'équipe ou même en tant que client - c'est une liste que j'ai donnée à des personnes non techniques autour de moi qui cherchaient des indices sur la qualité de leur propre service informatique. Ce n'est pas tout, mais c'est vraiment mauvais de battre en trois minutes.

Martin
la source
3
"Tu fais du TDD?" correspond certainement à une question oui-non. Et par là, je veux dire que c'est une question à laquelle tout le monde répond par un «oui» catégorique, ce qui signifie en fait «non».
yannis
2
@YannisRizos: Un peu comme "Utilisez-vous les meilleurs outils que l'argent puisse acheter?" (Oui ... bien ... dans des limites raisonnables.) Et "Les programmeurs ont-ils des conditions de travail tranquilles?" (Ohhhh oui ... bienllll ... dépend de votre point de référence pour le calme, je suppose.)
pdr
@pdr Selon que vous considérez le son des sirènes entrant par les fenêtres ouvertes comme calme.
Robert Harvey
Aussi, "Oui, je fais une conception descendante ." ;)
Izkata