Christoph Tohermes - Thoughts on IT, programming and soft skills

TDD als Erziehungsmaßnahme

In meinem ersten Eintrag im neuen Blog möchte ich mal etwas theory crafting betreiben und mich dem Thema TDD von einer etwas anderen Seite nähern.

Mittlerweile ist es 3 Monate her seitdem ich angefangen habe mich ernsthaft mit TDD zu beschäftigen. Eine zugegebenermaßen noch recht kurze Zeit. Trotzdem habe ich einige Interessante Erfahrungen gewonnen und Eindrücke gesammelt.
Zunächst einmal ist es eine gewisse Hürde Test first zu entwickeln. Es erfordert umdenken und das Umstellen gewohnter Entwicklungsprozesse. Das ist ein Fakt. Es erfordert Mühe und Einarbeitungszeit bis man wirklich den Prozess verinnerlicht hat und die Produktivität nicht mehr allzu viel leidet. Ein von Kritiker sehr häufig genutztes Argument: "Ich verliere sehr viel Zeit." Unstrittig ist jedoch wiederum, das automatisierte Tests heute zu einem de facto Standard geworden sind. Ohne automatisierte Tests kommt eigentlich kein Entwickler mehr aus. Dies führt in eine Zwickmühle: Der Entscheidung zwischen Produktivität auf der einen und Qualität auf der anderen. Es gilt also, den goldenen Weg zu finden, der das Ziel dem Kunden ein solides Endprodukt zur Verfügung zu stellen am besten Unterstützt. Denn: Hier drum geht es immer noch; dem Kunden das Projekt zu liefern das er möchte.

 Eine Art damit umzugehen hat Thomas Bandt im Artikel über "seinen TDD Alltag" beschrieben. Er testet (um es einmal auf das wesentliche zu reduzieren) nur noch Business Logik. Einfache alltägliche Dinge kann man einfacher in Integrationstest testen. Das gewährleistet notwendige Qualität und steigert die Produktivität. Ralf Westphal wiederum vertritt (etwas überspitzt gesagt) die Meinung, dass es keine alternative zu komplett test first getriebener Entwicklung gibt. Seine Argumente sind so einfach wie überzeugend: Qualität, hoher grad von Automatisierung, Evolvierbarkeit. Diese unterschiedlichen Meinungen bieten viel Diskussionsstoff. Ich möchte hier gar nicht so darauf eingehen, was nun der bessere Weg ist.

Nichts ist so wertvoll, wie Erfahrung

Obgleich diese Diskussion sehr spannend ist und es natürlich auch richtig ist diese zu führen, bin ich sicherlich nicht der einzige, der das Gefühl hat, dass das Thema ein zu hohes Gewicht bekommt. TDD ist nur ein Tool zur Qualitätssteigerung. Wenn auch ein sehr effizientes. Es gibt noch andere Möglichkeiten, den meisten ist das natürlich bewußt. Gleichzeitig wird eine interessante Komponente von TDD übersehen: Der, ich taufe es mal, Erziehungseffekt. Wer sich intensiv mit TDD beschäftigt setzt automatisch viele Werte der CCD um, als Beispiel: KISS. Das ist der erste positive Effekt, denn das CCD etwas gutes ist, darüber sind sich wohl alle einig. Gleichzeitig liefert uns korrekt durchgeführtes TDD doch aber auch ein Gefühl für Edge cases. Die Grenzfälle, die unser Programm oftmals vor schwierige Herausforderungen stellen. Mit der Zeit bedenkt man diese Fälle fast automatisch. Wie selbstverständlich werden die passenden Tests für diese Fälle mit erstellt. Darüber hinaus bekommen wir weiterhin ein Gefühl für Fehler.
Der typische Prozess Red-Green-Refactor zwingt das Programm ja zunächst zu "Fehlern". Zug um Zug implementiere ich Feature um Feature. Ich verinnerliche eine Thematik, die für den Entwicklungsprozess besonders wichtig ist.

Meine Beobachtung bzw. These ist nun folgende:
TDD verbessert meine Codequalität auch dann, wenn ich in einem späteren Projekt nicht mehr für jede Komponente einzelne Tests entwerfe, bzw. diese nicht test first entwickle, da ich durch TDD dazu erzogen wurde, bestimmte Fehlerfälle von vorneherein zu bedenken. Das Thema "Fehler" hat durch meine Erfahrungen einen anderen Stellenwert, es ist präsent. Natürlich geht auch dies mit der Zeit verloren, wenn man sich mit TDD für einen gewissen Zeitraum beschäftigt und es danach links liegen lässt. Auch der falsche Ansatz.

Wenn ich jedoch wo möglich TDD verwende, bin ich der festen Überzeugung, dass es auch die Projekte beeinflusst, wo aus welchen Gründen auch immer, kein TDD möglich oder gewünscht ist. Seien es nun die angesprochenen Preisgründe, Brownfield-Projekte, usw.
Meine bisherige Arbeit mit TDD spiegelt genau diese Sichtweise wieder. In meinem Projekt entwickle ich nicht nach TDD. Im Coding Dojo und zu Hause in meinen Projekten wiederum schon. Die während der mit TDD gemachten Erfahrungen kommen mir nun auch in den "business" Projekten zugute. Mein Code ist durch die implizite Anwendung von TDD besser geworden. Es ist nun keine Patentlösung TDD zu nutzen oder nicht zu nutzen. Doch finde ich zeigt dies doch auf, dass eben schon das nachdenken über den TDD Prozess mich in der Entwicklung ohne dieses Tool weiterbringen kann. Denn bei allem was man hier tut sollte die wichtigste Voraussetzung sein nachzudenken. Zu reflektieren wie sind meine Anforderungen, welche Werkzeuge brauche ich. Wie hole ich das Optimum aus diesem Projekt.

Und da bleibt für mich ein Fazit: Ich kann mich durch TDD dazu erziehen besseren Code zu schreiben, da sich meine Denkweise ändert. Selbst wenn ich TDD als Tool bei Projekten danach weglasse.

Mich würde an dieser Stelle wirklich interessieren wie Eure Erfahrungen bei diesem Thema sind und was ihr zum "Erziehungseffekt" zu sagen habt. Ist es schwachsinn was ich hier schreibe, entspricht es auch euren Erfahrungen, oder geht euch die ganze TDD Diskusison mittlerweile auf den Keks? Ich freue mich auf eure Kommentare.

Posted: Jul 30 2010, 04:36 von ChristophToh | mit 7 comment(s) |
Abgelegt unter: , ,

Kommentare

Thomas sagte:

"Unstrittig ist jedoch wiederum, das automatisierte Tests heute zu einem de facto Standard geworden sind. Ohne automatisierte Tests kommt eigentlich kein Entwickler mehr aus."

Einspruch. Den paar tausend Entwicklern im deutschsprachigen Raum, die versuchen "clean" zu werden oder zu bleiben, stehen zehn-, wahrscheinlich sogar hunderttausende gegenüber, die das nicht die Bohne interessiert. Anfänger, Code Monkeys, Leute "die das schon immer so gemacht haben".

Auch ein Punkt, den ich ansprach: überleg mal, wie viele Technologien es gibt, mit denen Software entwickelt wird, die gar kein Tooling für automatisierte Tests bieten (was mich wieder zu Filemaker bringt).

Aber natürlich: für jeden aufgeklärten Entwickler sollte automatisiertes Testen inzwischen ein Standard sein.

Deiner These stimme ich übrigens zu. Ich würde es nicht so dramatisieren und es einen Erziehungseffekt nennen. Es ist ein Teil des persönlichen Entwicklungs- und Lernprozesses jedes Entwicklers. Ich habe auch vor TDD schon versucht meine Architektur ständig zu verbessern und garantiert nie eine SqlDataSource in die View gepackt. Aber zweifelsohne ist TDD ein Werkzeug mit sehr starken "Seiteneffekten" auf die eigene Denkweise und letztlich Verbesserung der Architektur/des Codes.

# Juli 30, 2010 5:52

ChristophToh sagte:

Deinem Einspruch muss ich stattgeben. Es ist natürlich sehr einfach nur an die eigenen Erfahrungen zu denken und dabei zu übersehen, dass es noch andere Entwickler gibt. Die habe ich nun im Eifer des Gefechts übersehen.

Erziehungseffekt ist hier in der positiven Bedeutung gemeint, da ich persönlich eine gute Erziehung für etwas sehr gutes halte. Keinen Zwang oder Einflussnahme gegen den Willen, sondern lernen auf eine "passive" Weise.

# Juli 30, 2010 6:02

Rainer Hilmer sagte:

Ich hatte vor langer Zeit mal einen Artikel im Internet gelesen (sorry URL weiß ich nicht mehr), in dem festgestellt wurde dass ein Entwickler im Laufe der Zeit mehrere Bewusstseinsphasen erlebt. Wenn ich das noch richtig in Erinnerung habe, war es etwa so:

Phase 1: Ich brauche kein TDD, wenn irgendwo Bugs sind, merke ich das auch so.

Phase 2: TDD ist ja ganz lustig, aber es ist viel zu umständlich.

Phase 3: Wie konnte ich nur je ohne TDD programmieren???

Es gab noch eine Phase 4, aber die Beschreibung habe ich vergessen.

Phase 1 beruht rein auf Unwissenheit.

In Phase 2 findet der Umlernprozess statt, den du auch beschrieben hast. Das ist eine gefährliche Zeit. Entweder man schafft den Paradigmenwechsel oder man kehrt TDD für immer den Rücken zu.

Phase 3 durchlebe ich gerade selber. Entwickeln ohne TDD ist für mich wie ungesichert auf einer Balkonbrüstung zu stehen.

Ein weiterer interessanter Aspekt an TDD ist das frühzeitige Aufspüren von Architekturfehlern. Schnell hat man sich in einer Idee verrannt und merkt erst viel später dass alles so gar nicht hinhaut oder zumindest besser gemacht werden könnte. Mit TDD, ich habe es heute erst wieder erlebt, deckt man so etwas schnell auf. Wenn sich ein Unit Test gar nicht atomar schreiben lässt, hat man es wahrscheinlich mit einem Designfehler zu tun.

Gruß

Rainer Hilmer

# Juli 30, 2010 6:59

ChristophToh sagte:

Das frühzeitige Erkennen von  Architekturfehlern ist meiner Meinung nach einer der größten Vorteile von TDD. Gut, dass du diesen Punkt hier nochmal erwähnst. In meinen Augen schließen sich meine These und deine Erkenntnis keinesfalls aus. Auch die Architektonischen Gewinne kann man aus TDD mitnehmen, da man typische Muster wieder findet und vermeiden kann. Generell scheint der Mensch gut mit sich wiederholenden Mustern umgehen zu können.

Auch ich entwickel wo ich kann mit TDD. Die Sicherheit die ich persönlich dadurch gewinne ist groß. Doch auch oder gerade wenn ich mich außerhalb von TDD fallen mir immer wieder Probleme auf, die ich vorher in einem TDD Fall hatte und korrigiere sie automatisch.

Lohnenswerte Synergie wie ich finde.

# Juli 30, 2010 11:12

ralfw sagte:

Beim "Erziehungseffekt" stimme ich dir zu. TDD verändert den Blick und die generelle Heransgehensweise.

Und am Ende ist es so, dass es gar nicht mehr so wichtig ist, ob jmd streng TDD macht oder nicht. Es wird einfach der richtige Effekt erzielt.

Das entspricht der Entwicklung, die die Japaner Shu-Ha-Ri nennen. Sie verläuft vom Lehrling über den "Gesellen" zum Meister.

Ein Meisterprogrammierer transzendiert sozusagen alle Praktiken. Er dient intuitiv, meisterlich den zu erreichenden Qualitäten. Das heißt nicht, dass er TDD nicht einsetzt. Das heißt aber auch nicht, dass er das "sklavisch" tut.

Der Trick ist nun, dass es keinen Sprung gibt in der Entwicklung. Man muss da durch gehen. Man muss es getan haben. Der eine schneller, der andere langsamer. Es ist also ein Entwicklungs-/Erziehungsprozess. Der dauert.

Zum Thema Architektur: TDD deckt keine Architekturfehler auf. Wenn ich TDD betreibe, dann "architekturiere ich live" im Kleinen. TDD führt also zu guten Architekturen im Kleinen.

Aber TDD ersetzt dadurch keine Architekturüberlegungen vorweg. Wenn ich vor dem ersten Test über Architektur nachdenke, dann mache ich mir mein TDD-Vorgehen sogar einfacher. Je mehr Funktionseinheiten ich schon kenne, die per TDD entwickelt werden sollen, desto besser. Für die spare ich mir nämlich den Refaktorisierungsaufwand während TDD.

-Ralf

# Juli 31, 2010 1:39

Rainer Hilmer sagte:

Hallo Ralf,

du schreibst,

"Zum Thema Architektur: TDD deckt keine Architekturfehler auf. Wenn ich TDD betreibe, dann "architekturiere ich live" im Kleinen. TDD führt also zu guten Architekturen im Kleinen."

Schön dass du in der ersten Person geschrieben hast. Wer sich noch nicht so lange mit Software-Architektur beschäftigt hat wie du, trifft in der Planungsphase auch schon einmal falsche Entscheidungen - oder sollte ich der Einzige sein dem das passiert?.

Dass TDD zu guten Architekturen im Kleinen führt, ist das Heilmittel dagegen. Das wollte ich auch damit ausdrücken, hab es nur anders formuliert.

# August 2, 2010 12:23

Rainer Hilmer sagte:

Jeremy D. Miller hat zum Architekturaspekt ein paar schöne Zeilen geschrieben, die meine These bestätigen.

codebetter.com/.../133437.aspx

# August 2, 2010 11:06
Kommentar abgeben

(verpflichtend ) 

(verpflichtend ) 

(optional )

(verpflichtend )