Was ist das beste Argument, um Entwickler davon zu überzeugen, TDD zu lernen?

7

Lass mich zuerst aus dem Schrank kommen. Ich bin ein TDD-Gläubiger. Ich versuche, Test Driven Development so viel wie möglich zu üben.

Einige Entwickler bei meiner Arbeit weigern sich, es überhaupt auszuprobieren. Ich selbst habe TDD mit dem Versuch begonnen, einem meiner Kollegen zu beweisen, dass Test Driven Development eine schlechte Idee ist. Die Argumente sind:

  • Warum? Ich war bisher ein ziemlich erfolgreicher Entwickler.
  • Es wird mich verlangsamen.

Was ist das beste pro TDD-Argument, das Sie gehört oder benutzt haben?

Siehe auch: Was ist der beste Grund für Komponententests?

    
Vadim 27.05.2009, 00:42
quelle

11 Antworten

15

TDD ist ein "Bezahlen Sie mich jetzt oder zahlen Sie mich später" -Konkurrenz. Wenn Sie nur die Zeit vom Beginn des Codierens bis zum Einchecken Ihres Codes zählen, dauert TDD oft länger, insbesondere wenn Sie TDD zuerst lernen. Die Auszahlung kommt später während der Testphase und auch in zukünftigen Kodierungsrunden.

Für die Testphase habe ich das mit TDD gefunden:

  1. Ich hatte wesentlich weniger Fehler. Mein letzter TDD-Code Ich hatte Bugs nur aufgrund von Missverständnissen (oder Änderungen) in den Bereichen, in denen ich den Code nicht testen konnte (PHP-Code in diesem Fall).
  2. Die Fehler, die ich hatte, waren im Allgemeinen einfacher zu testen, weil ich das System bereits getestet hatte.
  3. Das Beheben der Fehler war schneller, und mit den Tests konnte ich eine größere Überzeugung haben, dass ich keine neuen Bugs eingeführt habe.

Der Code selbst hatte die folgenden Eigenschaften:

  1. Als ich anfing, wie ein Client des Codes zu denken, war der Code tendenziell einfacher zu verwenden. (Dies ist einer der Vorteile, zuerst Tests zu schreiben).

  2. Der Code ist einfacher zu testen.

  3. Das Schreiben von Komponententests ist einfacher (und in vielen Fällen mehr Spaß) kurz davor als danach, so dass mehr Tests geschrieben werden.

  4. Der Code ist leichter zu refaktorieren und aufzuräumen. Dies galt insbesondere für Python, wo automatische Refactoring-Tools eine größere Schwierigkeit haben.

Aus diesem Grund war es, als es an der Zeit war, den Code erneut zu lesen, einfacher zu verstehen und leichter zu ändern, und wir hatten zumindest einige Regressionstests bereits durchgeführt.

Was dies bedeutet, ist, dass die Amortisation für TDD-Zeit später Monate sein kann. Außerdem ist das Starten von TDD mit Legacy-Code besonders schwierig. Dann braucht es Zeit, um zu lernen, wie man gute Tests schreibt (ein schlechtes Testset kann entweder ungenügend sein oder schlimmer, spröde zu sein, was es schwieriger macht, Refaktorierungen zu machen) und wie man ein komplexes System unter Test bekommt.

>

Ich muss zugeben, dass ich nicht wirklich in der Lage war, zu viele andere Leute dazu zu bringen, zu TDD zu wechseln. Ich denke, dass ich größtenteils gewechselt habe, weil ich eine einfachere Art des Testens wollte und auch die Möglichkeit hatte, mit einer kleinen Code-Basis und einem persönlichen Projekt zu lernen.

    
Kathy Van Stone 02.06.2009, 14:37
quelle
31

Vielleicht wissen sie es besser.

Komponententests von Entwicklern ist eine äußerst nützliche Methode, und ich kann seine Vorteile nicht überbewerten, nicht nur während der anfänglichen Entwicklung, sondern auch während des Refactorings, wenn Komponententests nicht nur gewöhnliche Codefehler, sondern auch den Bruch früh erkennen können von Annahmen, die von Entwicklern gemacht wurden, die nie in der formellen Dokumentation erfasst wurden und daher wahrscheinlich verloren sind, wenn das Refactoring stattfindet.

TDD ist also kein Zaubereistaub:

  1. Der Ansatz "schreibe einfach genug Code, um den Test zu bestehen" liefert falsche positive Ergebnisse. Es gibt oft bekannte Irrtümer und Probleme, die mit dem Ansatz "gerade genug" nicht gelöst werden können. Schnelle Beispiele, die in den Sinn kommen, sind verteilte Systemfehler oder NUMA-Leistungsprobleme. Diese Anforderungen einfach in diese Testfälle für TDD auszudrücken, würde sich zu einem Vollzeitjob in sich selbst verwandeln.
  2. Die Explosion von moqs geht außer Kontrolle für jedes seriöse Größenprojekt. Mocks sind Code wie jeder andere Code, sie müssen gepflegt werden und schreiben sich nicht aus heiterem Himmel.
  3. TDD wird oft als Ausrede zur Eliminierung von QA-Tests verwendet. "Unser Entwickler hat bereits eine ID geschrieben, die wir versenden können" vernachlässigt das Ende-zu-Ende Feature-orientierte Testen, das die QA abdecken sollte
  4. Ich traue dem Fuchs nicht, der das Hühnerhaus bewacht. Ein falscher Algorithmus kann TDD immer noch mit Bravour bestehen, wenn sowohl im Test als auch in der Implementierung die gleichen Fehler gemacht werden.
  5. Am Ende versuchen alle Methoden, Prozesse zu verwenden, um Talente zu ersetzen.
Mein Hauptstreit mit TDD ist, dass es als magische Lösung für die meisten Entwicklungsprobleme präsentiert wird, aber seine Kosten werden von seinen Befürwortern unter dem Tisch gehalten. Das Verdoppeln oder Verdreifachen Ihrer Code-Basis mit moqs ist nicht kostenlos. Ich sehe lieber ein paar umfassende Komponententests, die während der Entwicklung geschrieben wurden. Der Test-First-TDD-Ansatz, ich habe noch seine Vorteile in einem realen Projekt zu sehen.

Ich verstehe, dass ich jetzt zu Tode geärgert werde, um dies zu veröffentlichen, aber was zum Teufel, wen interessiert das ...

    
Remus Rusanu 27.05.2009 01:21
quelle
20

Kein Argument wird jemanden dazu bringen, TDD zu benutzen.

Sie müssen sie zeigen und die Vorteile demonstrieren. Es ist einfacher, jemandem das Licht zum Vorschein zu bringen, indem man eher zeigt als erzählt.

    
Mitch Wheat 27.05.2009 00:47
quelle
3

Verschiedene Menschen werden auf unterschiedliche Weise überzeugt sein (oder auch nicht), also ist die einzige ehrliche Antwort "es kommt darauf an".

Eine Möglichkeit, die ich schon mehrmals gesehen habe, ist, mit jemandem zusammen zu sitzen, nachdem er sich mit einem Stück Code herumgeschlagen hat, und ihn mit TDD neu zu erstellen. Der resultierende Code ist normalerweise kleiner und klarer.

    
Dave W. Smith 27.05.2009 00:59
quelle
3

Ich übe TDD nicht. Obwohl ich sehe, wie es gut ist, wenn Sie komplexe Projekte haben, in denen Sie viele verschiedene Testfälle testen müssen, sehe ich keinen großen Vorteil darin, sie beispielsweise in einer einfachen Webanwendung zu verwenden.

Eine Art, wie jemand mich davon überzeugen könnte, TDD zu benutzen, wäre, wenn wir das gleiche Projekt machen und sie Seite an Seite machen, sehen, wer bessere Ergebnisse erzielt und wer die Aufgabe schneller erledigt.

    
dtc 27.05.2009 01:00
quelle
2

Passen Sie mit ihnen zusammen. Man muss es nicht "Paarprogrammierung" nennen - das ist für jemanden, der nur widerwillig ist, "radikale" Techniken wie TDD zu betrachten, gruselig - aber wenn Sie beide an einem Schreibtisch sitzen und an demselben Problem arbeiten, ist es einfach demonstrieren den Wert von TDD. Das kann nicht das Ende des Gesprächs sein, aber es ist ein höllischer Anfang. Gibt Ihnen Glaubwürdigkeit für den Rest der Konversation und gibt Ihnen etwas Echtes als Grundlage für weitere Diskussionen.

    
Carl Manaster 27.05.2009 14:36
quelle
2

Der "aha" -Moment für mich war das Lesen von Kapitel 2 von "Test-Driven Development in Microsoft.Net" von James Newkirk. (Nicht dass der Rest des Buches nicht wichtig wäre ... er widmet mehrere Kapitel dem Aufbau einer mehrstufigen Anwendung in TDD).

Er erstellt einen einfachen Stapel, aber Sie können sehen, dass der Code seine Komplexität "entwickelt", anstatt komplex zu beginnen.

Selbst dann werden Sie immer noch Schwierigkeiten haben, Neinsager zu überzeugen, denn es scheint, dass TDD viel mehr Arbeit erfordert als traditionelle Programmierung. Die meisten Anti-TDD-Entwickler vergessen jedoch, zumindest nach meiner Erfahrung, die Entwicklungszeit für Unit-Tests am Ende zu berücksichtigen.

    
SergioL 27.05.2009 14:48
quelle
1

Die aufgeführten Argumente sind keine rationalen, logischen Argumente. Sie haben keine Gründe hinter ihnen (es sei denn, Sie haben nur viel längere echte Argumente zusammengefasst.)

Als solcher denke ich nicht, dass Sie in der Lage sein werden, jemanden zu überzeugen, der diese Behauptungen mit eigenen rationalen Argumenten macht. Der beste Weg wird sein, an die Quelle ihrer Argumente zu appellieren; Erfahrung. Entweder lassen Sie sie TDD vorläufig verwenden, um zu sehen, was sie davon halten, oder aber arbeiten TDD selbst, das ist eindeutig eine sehr gute Arbeit, und präsentieren Sie es als ein Beispiel für sie.

(Ich bin kein TDD-Gläubiger. Das ist ein praktischer Weg, um mich davon zu überzeugen, dass es eine gute Idee war.)

    
mquander 27.05.2009 00:45
quelle
0

Als professioneller Entwickler seit mehr als 10 Jahren ist das beste Argument, das ich vorbringen kann, dass sogar ich meine Fehler gefunden habe, bevor ich wirklich in der Lage war, die Anwendung "auszuführen".

Ich fand auch, dass das Design meines Codes robuster und einfacher zu ändern war, und es gab mir mehr Vertrauen in die Refactoring.

"Ziemlich erfolgreich" ist nicht gleich "Wirklich erfolgreich".

Der andere große Vorteil besteht darin, dass ich keine Testkabel mehr schreiben muss, da die Unit Test-Läufe effektiv zu meinem Testkabelbaum werden.

    
David McEwing 27.05.2009 00:52
quelle
0

Zeigen Sie ihnen diese Präsentation. Es hat mich verkauft.

Ссылка

Jeder Programmierer, der jemals mit einer wirklich komplexen Aufgabe mit vielen Randbedingungen konfrontiert wurde, sollte den Wert von TDD sehen können. Wenn es darum geht, sicherzustellen, dass eine Suchmaschine bestimmten Strings entspricht, ist TDD der einzige Weg, um während der Wartung gesund zu bleiben - der einzige Weg, um sicher zu sein, dass Sie einen Fall behoben haben, ohne einige andere zu brechen ist mit automatisierten Tests.

    
Frank Farmer 27.05.2009 00:54
quelle
0

Durch gründliche Unit-Tests werden Bug-Ereignisse reduziert, aber auch die Rezidivierung oder der durch Rezidiv verursachte Schaden reduziert.

    
plinth 27.05.2009 14:39
quelle

Tags und Links