Warum fehlt in Joels Test die testgetriebene Entwicklung?

23

Ich habe diesen Blog von Joel Spolsky über 12 Schritte zu besserem Code gelesen . Das Fehlen von Test Driven Development hat mich wirklich überrascht. Also möchte ich die Frage an die Gurus werfen. Lohnt sich TDD nicht wirklich?

Aussenseiter
quelle
13
Dieser Artikel wurde am Mittwoch, den 09. August 2000 (vor ungefähr 12 Jahren) geschrieben. Nicht, dass TDD zu dieser Zeit noch nicht da gewesen wäre, aber ich glaube nicht, dass es fast die Begeisterung genossen hat, die es heutzutage gibt.
Mike
12
Der Joel-Test ist nur ein Satz allgemeiner Richtlinien. Da passt nicht alles rein, was "die Mühe wert" ist.
Yannis
2
Ich habe mir einen eigenen, höchst verantwortungslosen, schlampigen Test ausgedacht, um die Qualität eines Softwareteams zu bewerten. Das Tolle daran ist, dass es ungefähr 3 Minuten dauert ... Das Schöne an The Joel Test ist, dass es einfach ist, schnell ein Ja oder Nein zu jeder Frage zu bekommen. Sie müssen weder Codezeilen pro Tag noch durchschnittliche Fehler pro Wendepunkt ermitteln ... ' - Die Entscheidung, ob Ihr Projekt von TDD profitiert, würde mehr als 3 Minuten dauern könnte herauszufinden , benötigen durchschnittlich Käfer-per-Wendepunkt - das ist , warum es nicht in der Liste
gnat
Umzug nach Joel Stack plz. Es ist eine interessante Frage.
Erik Reppen
Sie sollten in Betracht ziehen, die Antwort zu akzeptieren, die auf Joel verweist und ihn direkt zitiert, da sie nicht aussagekräftiger ist. Siehe programmers.stackexchange.com/a/189493/6586
Bryan Oakley

Antworten:

30

Testgetriebene Entwicklung war praktisch unbekannt, bevor Kent Becks Buch im Jahr 2002 herauskam, zwei Jahre nachdem Joel diesen Beitrag geschrieben hatte. Die Frage ist dann, warum Joel seinen Test nicht aktualisiert hat, oder ob TDD 2000 besser bekannt gewesen wäre, hätte er ihn zu seinen Kriterien gezählt?

Ich glaube, er hätte es nicht getan, aus dem einfachen Grund, dass es wichtig ist, dass Sie einen genau definierten Prozess haben, nicht die spezifischen Details dieses Prozesses. Aus dem gleichen Grund empfiehlt er die Versionskontrolle, ohne ein bestimmtes Versionskontrollsystem anzugeben, oder empfiehlt eine Bug-Datenbank, ohne eine bestimmte Marke zu empfehlen. Gute Teams verbessern und passen sich kontinuierlich an und verwenden Tools und Prozesse, die für ihre jeweilige Situation zu dieser bestimmten Zeit gut geeignet sind. Für einige Teams bedeutet das definitiv TDD. Für andere Teams nicht so sehr. Wenn Sie TDD einführen, stellen Sie sicher, dass es sich nicht um eine Frachtkultmentalität handelt .

Karl Bielefeldt
quelle
1
Also ... oh, du hast den TDD ein wenig getroffen, ist das Kool-Aid-Problem, oder?
Erik Reppen
27

Joel hat dies an einigen Stellen konkret angesprochen.

Er hat erklärt, dass die Dinge Tests nicht in der Lage sind, viele wichtige Fragen zu erfassen, insbesondere subjektive Fragen wie "ist die Benutzeroberfläche dieser Software scheiße?" Seiner Meinung nach haben wir uns bei Windows Vista zu sehr auf automatisierte Tests verlassen.

Er hat geschrieben, dass nach seiner Erfahrung die Arten von Fehlern, die Benutzer tatsächlich finden, in zwei Kategorien fallen: 1) diejenigen, die im allgemeinen Sprachgebrauch auftreten und die die Programmierer selbst gefunden hätten, wenn sie ihren eigenen Code ausgeführt hätten, bevor sie ihn verwendeten , oder 2) Randfälle, die so undurchsichtig sind, dass niemand daran gedacht hätte, Tests zu schreiben, um sie überhaupt abzudecken. Er hat angegeben, dass nur ein sehr kleiner Prozentsatz der Fehler, die er und sein Team in FogBugz behoben haben, die Art von Dingen sind, die Unit-Tests abgefangen hätten. (Ich kann diesen Artikel jetzt nicht finden, aber wenn jemand weiß, welchen ich meine, können Sie den Link hier bearbeiten.)

Und er schreibt, dass es mehr Ärger geben kann, als es sich lohnt, besonders wenn Ihr Projekt zu einem sehr großen Projekt mit vielen Komponententests heranwächst und Sie dann (absichtlich) etwas ändern und am Ende eine sehr große Anzahl defekter Komponententests erhalten. Er verwendet speziell die Probleme, die Unit-Tests verursachen können, als Grund, warum er sie nicht als 13. Punkt in den Joel-Test aufgenommen hat, selbst wenn die Leute vorschlagen, dass er sollte.

Mason Wheeler
quelle
2
Eigentlich hast du recht. Joel übliche MO ist der Strohmann. Als ob TDD keine Bugs für mich entdeckt hätte, also kann es nicht gut sein. Womit etwas übersehen wird, dass es bei TDD nicht um das Testen, sondern um das Design geht. Die zurückgelassenen Tests sind ein Bonus. Oder um zu argumentieren, dass eine kleine Änderung viele Unit-Tests zum Erliegen bringen wird, was darauf hindeutet, dass er es einfach falsch macht. Oder Sie schreiben ein SOLID-Prinzip vollständig neu, bevor Sie es angreifen. So was. Es sind tatsächlich seine Befürworter, die die zirkuläre Logik verwenden, nicht er.
pdr
7
Ich stimme diesen Kommentaren von Joel vollkommen zu. Ich denke, ein noch größeres Problem ist die Sprache - bei vielen dynamischen Sprachen kann ich mir nicht vorstellen, etwas ohne Komponententests zu tun - wie sonst können Sie feststellen, ob ein einfacher Tippfehler ein Problem verursacht, das Sie erst bei einem kritischen Problem sehen werden Moment? In statisch typisierten, kompilierten Sprachen, die zur Reduzierung von Fehlern entwickelt wurden, werden Sie von all den einfachsten Fehlern abgehalten und haben meistens logische Fehler. Dies verringert die Notwendigkeit für die Art der vollständigen Abdeckung, die von TDD bereitgestellt wird.
Bill K
2
@MasonWheeler: Sie argumentieren ernsthaft, dass Compiler- / Typensicherheit die Notwendigkeit von Komponententests überflüssig macht? Sie ignorieren auch absichtlich die Designvorteile von TDD, aber was noch wichtiger ist, Sie müssen eine verdammt lange Zeit damit haben, irgendetwas umzugestalten. Vielmehr hat sich das Gegenteil herausgestellt: Beispielsweise sind .NET-Entwickler, die einer TDD-Methode folgen, plötzlich frustriert über die Menge an Code, die sie schreiben müssen, um einen Compiler zufrieden zu stellen, der im Gegenzug immer weniger hilfreich ist.
pdr
2
@pdr: Ich argumentiere ernsthaft, dass "die Notwendigkeit von Komponententests" in erster Linie die mangelnde Typensicherheit ist. Und da ich kein .NET-Entwickler bin, kann ich nicht wirklich viel über ihre Erfahrungen sagen, aber meiner eigenen Erfahrung nach beruht das Problem beim Refactoring ausschließlich auf zwei Faktoren: ob ich den Code im ersten geschrieben habe oder nicht Ort, und ob der Autor den Code gut geschrieben hat oder nicht. (Hinweis: Die Punkte 1 und 2 sind nicht unbedingt stark miteinander korreliert!)
Mason Wheeler
3
@Pdr Unit Tests beweisen Ihren Code nicht, sie sind meistens eine Syntaxprüfung, können aber während der Entwicklung sehr nützlich sein. Integrations- und Systemtests sind jedoch viel sinnvoller. Auch die meisten Refactorings in statisch typisierten Sprachen können als sicher eingestuft werden. Tatsächlich handelt es sich bei einem Refactoring um eine Reihe bekannter "sicherer" Vorgänge, mit denen Sie Ihren Code transformieren können, ohne Änderungen vornehmen zu müssen. In einer statischen Sprache kann die IDE diese Änderungen häufig für Sie vornehmen und sicherstellen, dass sie sicher sind. Dies ist in dynamischen Sprachen häufig nicht möglich. Daher sind Komponententests erforderlich, um die gleiche Sicherheit zu gewährleisten (nicht zu beweisen)
Bill K
25

Joel Spolsky selbst hat diese Frage bereits 2009 beantwortet :

Joel: Es gibt eine Debatte über testgetriebene Entwicklung ... sollten Sie Unit-Tests für alles haben, diese Art von Sachen ... schreiben mir viele Leute, nachdem sie den Joel-Test gelesen haben, um zu sagen: "Sie sollten eine 13 haben Sache hier: Unit-Tests, 100% Unit-Tests Ihres gesamten Codes. "

Und das scheint mir ein bisschen zu doktrinär in Bezug auf etwas, das Sie vielleicht nicht brauchen. Die ganze Idee der agilen Programmierung besteht darin, Dinge nicht zu tun, bevor Sie sie brauchen, sondern sie nach Bedarf durchzublättern. Ich habe das Gefühl, dass ein automatisiertes Testen von allem oft nicht hilfreich ist. Mit anderen Worten, Sie werden eine Menge Unit-Tests schreiben, um sicherzustellen, dass der Code wirklich funktioniert, und Sie werden auf jeden Fall herausfinden, ob er nicht funktioniert [wenn Sie es nicht tun] schreibe die tests] funktioniert eigentlich noch, ... ich weiß nicht, ich werde solche flammenpost dafür bekommen, weil ich es nicht so gut ausdrücke. Aber ich glaube, wenn ein Team wirklich 100% Code-Abdeckung seiner Unit-Tests hätte, gäbe es ein paar Probleme. Eins, Sie hätten sehr viel Zeit damit verbracht, Unit-Tests zu schreiben, und wären nicht in der Lage, diese Zeit in verbesserter Qualität zu bezahlen. Ich meine, sie hätten eine verbesserte Qualität und die Möglichkeit, Dinge in ihrem Code zu ändern, mit der Gewissheit, dass sie nichts kaputt machen, aber das war's.

Wie ich herausgefunden habe, besteht das eigentliche Problem bei Komponententests darin, dass die Art der Änderungen, die Sie im Verlauf der Codeentwicklung vornehmen, einen konstanten Prozentsatz Ihrer Komponententests beeinträchtigt. Manchmal werden Sie eine Änderung an Ihrem Code vornehmen, die irgendwie 10% Ihrer Komponententests bricht. Absichtlich. Weil Sie das Design von etwas geändert haben ... Sie haben ein Menü verschoben, und jetzt ist alles, was sich darauf verlassen hat, dass dieses Menü da ist ... das Menü ist jetzt woanders. Und so brechen all diese Tests jetzt. Und Sie müssen in der Lage sein, diese Tests erneut zu erstellen, um die neue Realität des Codes widerzuspiegeln.

Das Endergebnis ist also, dass, wenn Ihr Projekt immer größer wird und Sie wirklich viele Komponententests haben, der Betrag an Investitionen in die Pflege dieser Komponententests, die Aktualisierung und die Pflege dieser Komponenten erforderlich ist Wenn sie vergehen, wird dies überproportional zu der Höhe des Nutzens, den Sie daraus ziehen.

Ross Patterson
quelle
2
"Ja wirklich?" Abstimmungen über die Veröffentlichung von Joels eigener Antwort auf die Frage des OP?
Ross Patterson
1
Schwer zu verstehen. Einige Leute benutzen die Stimme, um "Ich stimme zu" zu bedeuten, anstatt "das ist nützlich". Dies sollte natürlich die akzeptierte Antwort sein, da es definitiv ist.
Bryan Oakley
Ich habe noch nie an einem Projekt mit 100% Testabdeckung gearbeitet. Aber wenn Sie eine Testabdeckung von 0% haben, ist das ziemlich aussagekräftig.
Kzqai
Vielen Dank! Ich denke, dies sollte als akzeptierte Antwort markiert werden.
Jalal
5

Niemand außer Joel konnte das mit Sicherheit beantworten. Aber wir können einige Gründe / Beobachtungen ausprobieren.

Zuallererst fehlt das Testen beim Joel-Test nicht

  • Tests werden zweimal in 12 Schritten direkt erwähnt (10 und 12)
  • Die Existenz eines Builds ist einer der ersten Punkte. Die Idee, Builds zu haben, ist, die Kapazität zu bekommen, um zu sehen, ob sie kaputt gehen, also sprechen wir hier (auch) über Tests.

Zweitens besteht die ganze Idee des Joel-Tests (so wie ich es verstehe) darin, schnelle Ja-Nein-Fragen zu stellen. "Machst du TDD?" wird nicht genau passen (Antwort könnte sein: "einige von uns", "für diesen Teil des Codes" oder "wir machen Unit-Test".

Drittens, glaube ich, hat niemand gesagt (selbst Joel), dass diese Punkte, bei denen "die Einzigen Zeit wert sind" (übrigens "programmieren Sie"), nicht darauf stehen, nur dass dies gute, schnelle Fragen sind, die Sie stellen sollten, wenn Sie kommen mit einem Software-Team in Kontakt zu treten, sei es als zukünftiges Teammitglied oder sogar als Kunde - dies ist eine Liste, die ich einigen nicht-technischen Leuten in meiner Umgebung gegeben habe, die nach Hinweisen suchten, wie gut / schlecht ihre eigene IT-Abteilung war. Es ist nicht alles, aber es ist wirklich schlimm, in drei Minuten zu schlagen.

Martin
quelle
3
"Machst du TDD?" sicherlich passt da eine ja-nein frage. Und damit meine ich, dass es eine Frage ist, die jeder mit einem nachdrücklichen "Ja" beantwortet, das heißt eigentlich "Nein".
Yannis
2
@YannisRizos: Ähnlich wie "Verwenden Sie die besten Werkzeuge, die man für Geld kaufen kann?" (Ja, alles in Ordnung.) Und "Haben Programmierer ruhige Arbeitsbedingungen?" (Ohhhh ja ... na ja ... hängt von Ihrem Bezugspunkt für Ruhe ab, denke ich.)
pdr
@pdr Kommt darauf an, ob Sie das Geräusch von Sirenen, die durch geöffnete Fenster kommen, als leise empfinden.
Robert Harvey
Außerdem: "Ja, ich entwerfe von oben nach unten ." ;)
Izkata