Einsatz testgetriebener Entwicklung nimmt langsam zu

Nach einer Umfrage von Martinig & Associates ist der Einsatz testgetriebener Entwicklung zwischen 2006 und 2008 von 14% auf 20% der befragten Organisationen gestiegen. Das ist auf der einen Seite erfreulich, auf der anderen Seite zeigt es aber, dass wir noch immer bei den „Early Adoptern“ sind. Daran gemessen, dass TDD im Gegensatz zu informellem „Nachtesten“ bei gleichem oder sogar verringertem Aufwand fast die doppelte Testabdeckung erreicht (persönliche Erfahungen sowohl von mir als auch von Johannes Link), dürfte die geringe Nutzung weder an wirtschaftlichen noch an methodischen Gründen liegen. Ich vermute eher, dass viele Entwickler sich zunächst subjektiv langsamer fühlen, wenn sie testgetrieben arbeiten — und nicht das Durchhaltevermögen haben, sich einmal zwei oder drei Monate auf das Verfahren einzulassen, bevor sie aufgeben. Dann würden Sie nämlich feststellen, dass sie deutlich weniger Fehler beheben müssen und damit wesentlich schneller sind, als vorher. Vielleicht nicht bis zu ersten „hingerotzten“ Version, aber sicher bis zum produktionsfähigen Code. Nur wenige Teams schaffen dieen Schritt denn auch aus eigener Kraft ohne Coaching.

Crystal in einem Satz

Alistair Cockburn fasst die Essenz der Crystal Methoden in seinem Blog-Eintrag „Crystal is about Self-Awareness“ sehr schön zusammen:

  • Scrum is about self-organization
  • XP is about self-discipline
  • Crystal is about self-awareness

Vielleicht kommt es daher, dass sich viele Anfänger zunächst auf Rezeptverfahren wie Scrum und XP (Version 1.0) stürzen: Konzepte der Selbst-Erkenntnis sind sperrig und benötigen mehr Erfahrung, als klare Kochrezepte. „Crystal ist für Fortgeschrittene“ sagt Alistair auch deutlich.

Die Rezepte sind ein guter Start. Über kurz oder lang fällt aber eine Entscheidung: Bleibt man auf Rezeptniveau, indem man über Prozesse und Praktiken streitet, dann kann man die Einführung agiler Verfahren irgendwann als gescheitert betrachten. Oder übernimmt das Team irgendwann über Retrospektiven die Kontrolle und beginnt, den Prozess als Arbeitsmittel selbst zu gestalten. Dann ist man im wesentlichen bei Crystal gelandet bzw. hat den Schritt nachvollzogen, den XP beim Übergang auf Version 2.0 gemacht hat.

Wie Unternehmen die Krise überleben

Roland Berger hat in der Studie „Be flexible – How engineered products companies prepare for the downturn“ 500 Maschinen- und Anlagenbauer untersucht, wie sie mit wirtschaftlichem Abschwung umgehen und Krisen überleben. Als zyklische Branche ist gerade die Investitionsgüterindustrie besonders anfällig für konjunkturelle Schwankungen. Das Resümee: Die besten Unternehmen können so flexibel auf die Krise reagieren, dass sie Konjunktureinbrüche sogar als Chance nutzen können, ihre eigene Marktposition zu stärken.

Wie die meisten anderen Sparten steigt der Anteil der IT an der Wertschöpfung auch im Maschinen- und Anlagenbau stetig. Die von Berger postulierte Flexibilität setzt unter anderem auch entsprechende Flexibilität in Forschung und Entwicklung voraus, nicht nur, aber auch bei der IT. Verfahren und Vorgehensmodelle, die zu Laufzeiten von vielen Jahren führen, können da schnell zum Ballast werden.

Agile Verfahren erlauben hier viel größere Flexibilität. Agile Planungstechniken fügen sich elegant und nahtlos in eine szenariobasierte Unternehmensplanung ein, wie sie Berger bei den erfolgreichen Unternehmen beobachtet. Zu Beginn der Rezession könnte noch ausreichend Zeit bleiben, flexibler zu werden.

„Machen Sie Flexibilität zur Sache des Top-Managements“ zählt Roland Berger als einen der fünf strategischen Bausteine auf, um die Krise zu überleben. Diese Forderung dürfte nicht nur für den Maschinenbau gelten.

PS: Mehr über agile Planungstechniken erzähle ich u.a. auf den XPDays 2008 in Hamburg oder auf der OOP 2009 in München

Studienteilnehmer gesucht für Studie zu agilen Team

Chaehan So vom Institut für Organisations- und Sozialpsychologie der Humboldt Universität Berlin sucht agile Teams für eine Teilnahme an einer Studie. Das Ziel der Studie lässt sich am besten in Chaehans eigenen Worten beschreiben: „The current study uses an organizational psychology lens to gain a fundamental understanding of how Agile Practices influence socio-psychological mechanisms leading to more effective projects“.
Wer an einer Teilnahme interessiert ist, findet weitere Informationen auf der Studienseite.

Hürden gegen Akzeptanztest-getriebene Entwicklung

Brian Marick fasst in seinem Blog-Eintrag „Barriers to acceptance-test driven design“ die wichtigsten Startprobleme gegen den Einsatz von Akzeptanztests zusammen.

Interessanterweise habe ich vor allem bei größeren Mengen alten Codes genau die umgekehrte Erfahrung gemacht: Teams waren eher bereit, Akzeptanttests als Grundlage für ihre Entwicklung zu nehmen, als Unit-Tests. Das liegt möglicherweise daran, dass Unittests gut funktionieren, wenn man auf der grünen Wiese startet. Sind erhebliche Mengen alten Codes vorhanden, ist der in der Regel so schlecht testbar, dass Akzeptanztests den leichteren Weg darstellen, schnell die Testabeckung zu erreichen, die man braucht, um das System sicher ändern zu können.

Notizen von der OOPSLA – Refactoring Werkzeuge

Einmal im Jahr gönne ich mir den Besuch der OOPSLA. Zum einen, um Bekanntschaften und Freundschaften zu pflegen, aber auch, um einen Überblick zu bekommen, was derzeit an (wirklich) neuen Dingen aufkommt, abseits der aufgeregten Marketing-Hypes. Ich möchte hier über für mich interessante Erkenntnisse berichten.

Am ersten Tag entschloss ich mich kurzfristig, als Zuhörer am zweiten Workshop über Refactoringwerkzeuge teilzunehmen. Eine Entscheidung, die sich gelohnt hat, obwohl ich normalerweise „Präsentationsworkshops“ meide. Der Workshop hat einen guten Überblick über den aktuellen Stand der Forschung zum Thema Refactoring gegeben — und deutlich gemacht, dass wir hier erst am Beginn einer Entwicklung stehen, die unsere Arbeit über die nächsten Jahre wesentlich beeinflussen wird.

Zu den Vorträgen:

Refactoring bei IntelliJ

Dimitri Jemerov von JetBrains (IntelliJ, Resharper) stellte die Mechanismen hinter den Refactoring Browser von IntelliJ IDEA vor. Er basiert auf einem gemeinsamen „Refactoring Workflow Framework“, mit dem sich die einzelnen Operationen relativ einfach implementieren lassen. Jemerov sprach von einer „Refactoring DSL“, die bei IntelliJ dafür entwickelt wurde.

Während die Grundlagen relativ gut standardisierbar sind (und die vorgestellten Ideen auch entsprechend wenig überraschend), liegt der Teufel und damit auch der Aufwand im Detail. Hier diktiert die Sprachkomplexität auch die Komplexität des Refactorings. Gerade bei Java mit seinen Einschränkungen was wo erlaubt ist, führt das beim Refactoring gelegentlich auch zu Ergebnissen, die nicht gerade schön sind. Die Begründung war pragmatisch: Normalerweise wird refaktorisierter Code nicht mehr überprüft. Daher muss er zu 100% korrekt sein, auch wenn das Ergebnis nicht gerade elegant ist.

Interessante Features von IntelliJ, die er vorstellte, waren:

  • Extract Method bei mehreren Ergebniswerten: Hier werden komplette Klassen erzuegt und extrahiert.
  • Refactorings über mehrere Sprachen: Während der aktuelle Stand (Rename, Move) noch nicht so aufregend ist, wird derzeit daran gearbeitet, die interne Darstellung sprachübergreifend zu gestalten, um auch komplexe Refactorings sprachübergreifend zu ermöglich. Geplant ist Unterstützung von Java, Ruby, Groovy, Python und XML (wenn ich keinen vergessen habe…)
  • Veränderung von Typen: Als Beispiel ersetzte Dimitri ein Array durch eine Liste, ein Beispiel für ein ziemlich komplexes Refactoring, das auch nur teilautomatisiert möglich ist. Leider reichte die Zeit nicht aus, das im Detail darzustellen.

Die anschließende Diskussion kreiste vor allem um den Konflikt zwischen 100% korrektem Umbau des Codes, eleganten Ergebnissen und Unterstützung des Entwicklers. Es dürfte hier kaum möglich sein, den richtigen Weg zu finden.

Oberflächen für Refactoring Werkzeuge

Dustin Campbell, der vor wenigen Monaten von DevExpress (Refactor!) zu Microsoft wechselte, demonstrierte aktuelle Entwicklungen in der Oberfläche von Refactoring Werkzeugen am Beispiel von Refactor!. Der Trend geht dahin, den Browser nahtlos in den Editor zu integrieren: Keine Dialogboxen mehr, keine Sammlungen von Shortcuts, statt dessen kontext-sensitive Erweiterungen des Editors. Wer mit Eclipse arbeitet, kennt ähnliche Ansätze bereits vom Umbenennen eines Identifikators: Drückt man vor dem Editieren eines Identifikators eine bestimmte Tastenkombination, werden auch alle anderen Vorkommen umbenannt. Refactor! treibt diesen Ansatz wesentlich weiter: Das Werkzeug ist darauf optimiert, mit einem einzigen Shortcut kontextsensitiv zu arbeiten.

Die Demonstration war beeindruckend, hier wurde ziemlich sicher die derzeit beste Lösung für die Oberfläche des Werkzeugs präsentiert. Ob die dahinter liegenden Mechanismen mit den Anforderungen großer Systeme mithalten können, weiß ich nicht. Ebenso wenig ist mir klar, ob diese Art der Oberfläche für Umbauten an großen Systemen noch adäquat ist, insbesondere in Situationen, in denen bewusst nicht-vollständige Refactorings eingesetzt werden sollen. Das lässt sich sicherlich nur durch praktischen Einsatz herausfinden (Bekannt ist, dass Refactor! für C++ erhebliche Stabilitätsprobleme hat. Die Versionen für C# (und andere .NET Sprachen) scheinen nicht so extrem unter diesem Problem zu leiden). Unabhängig davon ist die enge Integration von Editor und Refactoring sehr interessant (sie war genau genommen bereits in John Grants und Don Roberts „Ur-Refactoring-Browser“ angelegt) und ich hoffe, dass sie sich auf breiter Basis durchsetzen.

Werkzeuge zur Entwicklung von Refactoring Werkzeugen

Dieser Teil des Workshops richtete sich naturgemäß eher an jene, die selbst Refactoring bauen, als an deren Anwender. Ich fand die Vorträge dennoch interessant, weil sie einen guten Eindruck liefern, mit welchen Problemen derzeit gekämpft wird und was uns die Zukunft hier bringen kann.

Verbesserung der Analyse

Max Schäfer von der Oxford University stellte eine Refactoring Engine vor, die sich vor allem um Namensprobleme kümmert, um sicher zu stellen, dass die verbreiteten Probleme, die Refactoringwerkzeuge mit Verschattung von Namen haben. Aus Anwendersicht war die Nachricht interessant, dass keines der marktüblichen Werkzeuge hier wirklich sauber arbeitet. Es lohnt sich also weiterhin, darauf zu achten, dass man die Verschattungsregeln der Sprachen nicht zu sehr ausreizt — eine Regel, die schon im Interesse der Lesbarkeit von Programmen sinnvoll ist.

Framework für den Bau von Refactoring Werkzeugen

Jeffery Overbey, ein Diplomand von Ralph Johnson an der Univerity of Illinois, Urbana Champaign, demonstrierte einen Ansatz, die für brauchbares Refactoring notwendigen Syntaxbäume aus speziellen Grammatiken zu erzeugen. Sein Demonstrationsobjekt war ein Transformationswerkzeug für Fortran-Programme. Hier ging es eher im Detailprobleme, die eher für Werkzeugbauer von Interesse sind, wie zum Beispiel der Umgang mit Kommentaren und Einrückungen, Themen die im klassischen Compilerbau kaum eine Rolle spielen, für die Akzeptanz von Refactoring Werkzeugen aber entscheidend ist. Der Vortrag hat schön gezeigt, dass Refactoringwerkzeuge derzeit eine ähnliche Entwicklung durchmachen, wie Compiler in den 70er Jahren. Das halte ich durchaus für einen Grund, sich auf die Werkzeuge der nächsten zwanzig Jahre zu freuen 🙂

Refactoring auf höherer Ebene

Macneil Shonle von der University of San Diego stellte ein Plug-in für Eclipse vor, das versucht, Java Refactorings auf höherer Ebene umzusetzen (Arcum). Auch wenn sich der Vortrag eher um Grundlagenforschung drehte, zeigte er doch, dass zumindest die angelsächsischen Universitäten mittlerweile den Ball aufgenommen haben und an den komplexen Problemen wie Migrationen von Bibliotheken forschen. Sollten diese Arbeiten für den professionellen Einsatz reif werden — womit ich nicht in den nächsten zehn Jahren rechne —, könnte das den Umgang mit Architektur und Bibliotheken ähnlich revolutionieren, wie die derzeitigen Werkzeuge den Umgang mit Code und Design verändert haben.

Analyse des Refactoring von Entwicklern

Emerson Murphy-Hill von der Portland State University berichtete über Strategien, um herauszufinden, welche Refactorings an einer Codebasis durchgeführt wurden. Auch er stellte noch mehr Fragen vor, als Antworten. Ziel ist die Verbesserungen von Refactoringwerkzeugen, das Thema kann aber auch relevant werden, um Dokumentations- und Revisionsanforderungen zu erfüllen, oder in Wartungssituationen den Code zu verstehen. Zweifel sind aber angebracht: Murphy-Hill stellte fest, dass nur ca. 10% der Refactorings mit Werkzeugen durchgeführt werden und nur etwa ein Drittel sich überhaupt im Versionsmanagement niederschlagen. Sein Resümee: Wir kennen (noch) keine zuverlässige Methode, durchgeführte Refactorings zu ermitteln.

Zum Nachdenken hat auch eine Erkenntnis am Rande angeregt: Deutete ein Check-in in das Versionsmanagement einen Kommentar, der auf Refactoring hindeutet, war die Anzahl der darin enthaltenen Umbauten halb so groß [sic!], wie bei Check-ins ohne solche Kommentare. Es wäre interessant, ob sich das auf die Zuverlässigkeit von Check-in-Kommentaren verallgemeinern lässt.

Refactoring Lab

Josh Kerievsky, Autor des Buchs „Refactoring to Patterns“ und Gründer von „Industrial Logic„, zeigte den Einsatz seines „Refactoring Labs“, eines Trainingswerkzeugs für Refactoring. Die Studenten werden vor eine Refactoringaufgabe gestellt und das Lab analysiert den gewählten Lösungsweg und macht Verbesserungsvorschläge, z.B. dass bestimmte Schritte, die manuell gemacht wurden, einfacher im Refactoringbrowser durchgeführt werden können. Die Regeln sind als JUnit-Tests hinterlegt und überprüfen z.B. wie oft die Tests gestartet wurden und welche Optionen beim Umbau eingesetzt wurden. Ein sehr nettes Werkzeug für die Schulung.

Refactoring für Nebenläufigkeit

Der Organisator Danny Dig berichtete über seine Arbeiten am MIT, in denen er versuchte, sequenziell geschriebenen Code in Code umzustellen, der die Java 5 Unterstützung für Nebenläufigkeit nutzt. Das Werkzeug heißt Concurrencer und ist als Eclipse-Plugin verfügbar. Die Wirksamkeit des Tools wurde mit 6 Open Source Projekten überprüft. Die Ergebnisse waren zwar nicht perfekt, aber deutlich besser, als die manuellen Umstellungen der Entwickler, die die entsprechenden Werkzeuge betreuen. Immerhin machte das Werkzeug keine Fehler, die zu Fehlfunktionen der Software führen können — im Gegensatz zu vier solchen Fehlern im offiziellen, manuell umgestellten Code. Als wichtige Richtung für die zukünftige Entwicklung wurde die Integration mit Analysewerkzeugen angesprochen: Deren Ergebnisse sollten die Entwickler durch die notwendigen Schritte leiten.

Wer vor dem Problem steht, Java Code threadsafe zu machen, sollte sich das Tool genauer ansehen.

Refactoring von Programmen zur Matrixmanipulation

Beverly Sanders von der University of Florida erzählte über den Einsatz von Refactoring in der algebraischen Chemie. Dabei werden chemische Reaktionen simuliert, was im Wesentlichen darauf hinausläuft, Lösungen für die Schrödingergleichungen zu finden. Die Programme laufen auf hoch-parallelen Supercomputern mit speziellen DSLs für Matrizenumformungen. Hier wird Refactoring nicht zur Verbesserung des Designs eingesetzt, sondern um die Performance und Ausführungskomplexität zu verbessern. Das geht oft nicht durch pures Ansehen, sondern auf der Basis von Messungen. Für mich war die Einsicht spannend, dass man Refactoring auch in zunächst anderen Domänen mit ganz anderen Zielen betreiben kann. Der Schluss liegt nahe, dass wir hier erst ganz am Anfang stehen.

Resümee

Refactoring steht erst am Anfang. Sowohl für die Werkzeuge im breiten Einsatz, als auch in Randthemen besteht noch erheblicher Forschungsbedarf, der zunehmend von den Universitäten auch angegangen wird. Aus Sicht des Praktikers kann man nur hoffen, dass sich diese Forschung so bald wie möglich in breit einsetzbaren Produkten niederschlägt. Das könnte die Art, wie wir programmieren weg vom Programme schreiben hin zu Software entwickeln revolutionieren — vorausgesetzt, die Ausbildung wird auch entsprechend angepasst.

Refactoringseminar in München

Es ist bald wieder so weit: Am 19. und 20. November gebe ich in Zusammenarbeit mit SIGS Datacom zum dritten Mal öffentlich das zweitägige Intensivseminar „Refactoring in der Praxis oder die Kunst schmerzfreier Änderungen„. In dem Seminar werden die Teilnehmer ausgehend von unlesbarem Code durch diszipliniertes Refactoring zunächst wartbaren Code erzeugen und dann daraus Ansätze für eine Architektur entwickeln. Neben der praktischen Arbeit gibt es natürlich auch Hintergrundinformationen und die notwendige Theorie. Der Kurs ist bisher von dem Teilnehmern mit der Note 1,6 benotet worden.

Weitere Informationen und die Anmeldeseite finden Sie hier.

Einführung agiler Entwicklung bei Yahoo International

Das schweizer Online-Magazin devagile berichtet über einen Vortrag über die Einführung agiler Techniken bei Yahoo International, die alle Yahoo-Aktivitäten außerhalb der USA bündelt. Spannend fand ich den Ansatz, den Teams freizustellen, ob sie weiterhin traditionell arbeiten wollen, oder mit einem agilen Ansatz. Alle europäischen Teams hatten sich darauf hin nach einem Jahr für agiles Arbeiten entschieden, während sich asiatische Teams deutlich schwerer taten. Ich interpretiere das als weiteres Indiz, wie eng agile Entwicklung und Kultur zusammen hängen.