Sandi Metz und Katrina Owen wollen in ihrem Buch »99 Bottles of OOP« zeigen, dass alles, was man über objektorientierte Programmierung (»OOP«) wissen muss, im amerikanischen Folksong »99 Bottles of Beer« beziehungsweise dessen programmiertechnischer Umsetzung steckt. Wir haben eine Vorabversion des Buches erhalten und prüfen, ob das stimmt…

99 Bottles of OOP Cover

Die US-amerikanische Softwareentwicklerin, Autorin und regelmäßige Sprecherin auf Software-Konferenzen, Sandi Metz, hat mehr als 30 Jahre Erfahrung in der Entwicklung großer, objektorientierter Systeme. Ihre OOP-Wurzeln gehen auf Smalltalk, die »Mutter der Objektorientierung« zurück. In den vergangenen Jahren hat sie sich mit zahlreichen Vorträgen rund um objektorientierte Programmierung und Design einen Namen gemacht.

Mit »Practical Object-Oriented Design in Ruby« hat Sandi bereits das Referenzwerk zu objektorientiertem Design für die Programmiersprache Ruby und darüber hinaus vorgelegt. Bei Amazon erreicht das Buch beispielsweise 4,8 von 5 Sternen, belegt Platz 3 unter Ruby-Büchern und Platz 9 in der Kategorie »Object-Oriented Software Design«.

Katrina Owen ist Softwareentwicklerin bei Github mit einer Leidenschaft für Automatisierung und Refactoring. Sie spricht ebenfalls regelmäßig auf Software-Konferenzen und betreibt unter exercism.io eine Open Source Plattform zur Verbesserung von Programmier-Skills.

Die Idee und der rote Faden des Buches ist, eine zunächst simple und eher prozedurale Lösung des »99 Bottles of Beer«-Problems durch eine Reihe von kleinen Refactoring-Schritten anhand objektorientierter Prinzipien immer weiter so zu optimieren, dass am Ende eine »saubere« und somit wartbare, objektorientierte Implementierung vorliegt. Für die beiden Autorinnen ist »Code clarity« eine zwingende Voraussetzung, egal welchem Entwicklungs-Paradigma man folgt:

Code is read many more times than it is written […] Writing code is like writing a book; your efforts are for other readers.

Zielgruppe des Buches sind sowohl Einsteiger als auch erfahrene Entwickler. Letztgenannte könnten sich allerdings mit den sehr kleinteiligen und manchmal fast schon sklavisch anmutenden, test-getriebenen Entwicklungsschritten eventuell schwer tun. Wer sich drauf einlässt, nimmt aus der Lektüre aber auf alle Fälle etwas mit!


Im ersten Kapitel werden verschiedene Lösungsansätze (»Code Designs«) zur Problemstellung im Detail vorgestellt und bewertet. Außerdem wird grundsätzlich auf das Thema (Code) Design eingegangen:

Design is […] about picking the right abstractions.

Das theoretische Fundament zu entsprechenden Bewertungsmöglichkeiten von Sourcecode (Meinung vs. Fakten; ABC, zyklomatische Komplexität, SLOC) wird dabei anhand von umfangreichen Codebeispielen vermittelt. Außerdem werden erste, grundsätzliche Programmierprinzipien, wie beispielsweise DRY (Don’t Repeat Yourself) und objektorientierte Terminologien, wie Nachrichten und Methoden beziehungsweise deren Unterscheidung erläutert.

Am Ende des Kapitels bleibt von den verschiedenen Lösungsoptionen dann ein Ansatz übrig, welcher das »99 Bottles of Beer«-Problem auf einfache und schnelle Art ohne Rücksicht auf OOD oder sonstige Programmierprinzipien löst und somit »good enough« ist. Die Autorinnen nennen diese erste Implementierung passenderweise »Shameless Green«.

In Kapitel zwei dreht sich alles um test-driven Development (»TDD«). »Shameless Green« wird dabei Zeile für Zeile noch einmal komplett neu entwickelt, diesmal aber eben dem TDD-Prinzip folgend. Außerdem werden erste Refactoring-Konzepte besprochen. Geistige Väter des zweiten Kapitels sind eindeutig Kent Beck und Robert C. Martin. Die Lösung wird Schritt für Schritt test-first entwickelt. Dabei wird jeder Schritt ausführlich nebst Alternativen und Varianten erläutert. Hier bekommt man das erste Mal das Gefühl, den beiden Autorinnen beim Programmieren quasi über die Schulter zu schauen. Bemerkenswert fanden wir in diesem Kapitel besonders die folgende Aussage:

Programmers take the DRY principle to extremes, as if they’re allergic to duplication. DRY is important but if applied too early, and with too much vigor, it can do more harm than good.

In Kapitel drei taucht, wie im echten Leben, eine neue Anforderung auf, womit der bisherige Lösungsansatz an seine Grenzen kommt. Mit dem SOLID-Prinzip wird es nun erstmalig »richtig« objektorientiert. Außerdem werden Code Smells erläutert und Design Pattern gestreift. Der Großteil des Kapitels widmet sich dem Refactoring. Dabei werden abstrakte Konzepte anhand der sogenannten Schwarm-Regel Stück für Stück aus dem Code »geschält«. Bemerkenswert, aber passend zu ihrer oben genannten Haltung bezüglich DRY, ist, dass die Autorinnen über Unterschiede und nicht Gleichheit den Weg zu den im Code versteckten Konzepten weisen:

Difference holds the key to understanding.

Konzeptdichte als auch Praxisbezug von Kapitel drei sind im positiven Sinne überwältigend. Im Vorbeigehen wird mit Avdi Grimms »Spaltenüberschrift-Technik« außerdem auch noch für eines der beiden großen Probleme der Informatik, der Namensfindung, eine sehr praktikable Hilfestellung gegeben.

Nach dem Schulterblick in den vorherigen Kapiteln ist Kapitel vier dann quasi der Blick in den Kopf der Autorinnen beim Programmieren oder wie eine Runde Pair Programming mit den beiden. Der Code wird Zeile für Zeile, und das im wortwörtlichen Sinne, also horizontal refactored. Wenn immer nur eine Zeile gleichzeitig angepasst werden darf, bedarf es natürlich zum Teil wiederum weiterer Tricks, wenn beispielsweise die Signatur einer Methode verändert wird, da sich dies natürlich auf weitere Stellen im Code auswirkt. Aber auch hierzu liefern die Autorinnen passende Antworten. Der Ansatz des horizontalen Refacortings mag pedantisch bis kleinteilig erscheinen, der Code bleibt so aber konstant »grün« und damit jederzeit auslieferbar. Jeder Schritt wird hier wie beim Bergsteigen abgesichert; auf dem Buchcover steht nicht umsonst »Code Responsibly«. Das Vorgehen in kleinen Schritten und strikte Anwenden einiger weniger Regeln führt darüber hinaus dazu, dass sich die relevanten fachlichen Konzepte nach und nach quasi wie von alleine aus dem Code offenbaren:

You don’t have to understand everything before you can do anything.

Kapitel fünf schwenkt mit »Seperating Responsibilities« dann weiter in Richtung Objektorientierung. Als Smalltalk- und somit OO-Veteranin geht Sandi zunächst den Conditionals an den Kragen. Muster im Code deuten den Primitive Obsession-Code Smell an, welchem dann mittels Extract Class-Refactoring der Garaus gemacht wird. Immutability wird vorgestellt und damit einhergehende, aber verfrühte Performance-Bedenken werden ausgeräumt:

Your goal is to optimize for ease of understanding while maintaining performance that’s fast enough. Don’t sacrifice readability in advance of having solid performance data.

Oder, um es mit Kent Becks Worten zu sagen:

Make it work. Make it right. Make it fast. …in that order.

Im abschließenden Kapitel sechs wird der bislang immer noch stark prozedurale Code dann objektorientiert. Das Liskovsche Substitutionsprinzip, Polymorphismus sowie Vererbung werden angewandt und erläutert, entsprechende Klassen für die Spezialfälle des Songs erzeugt und die verbleibenden Conditionals in eine Factory überführt:

Factories don’t know what to do: instead, they know how to choose who does. They consolidate the choosing and separate the chosen.

Da der Code jetzt Open ist, lässt sich auch die zusätzliche Anforderung aus Kapitel drei, welche den gesamten Refactoring-Prozess von »Shameless Green« in Gang gesetzt hat, getreu Kent Becks Motto einfach umsetzen:

Make the change easy (warning: this may be hard), than make the easy change.

Mittels Metaprogrammierung verschwinden dann noch die Conditionals aus der Factory und das alles erfolgt natürlich wieder Schritt für Schritt (»horizontal Refactoring«), sowie abgesichert durch Tests.

Auch in diesem Kapitel wird der Praxisbezug der Autorinnen wieder deutlich, denn sie gehen immer erst über das Problem an die Lösung. Also nicht: »Hier ist Vererbung, lass uns mal nach Problemen suchen, die wir damit lösen können«, was dann üblicherweise zu Tier- oder Fahrzeug-Klassen führt, sondern: »Hier ist unser Problem, lass uns mal versuchen, ob wir es mit Vererbung lösen können«, was zum Aha-Effekt führt, der das Buch auszeichnet.


Martin Fowler hat das entsprechende Referenzwerk zu Refactoring aufgelegt, leider liest sich selbiges im hinteren Teil ähnlich spannend wie eine Kochrezeptsammlung. »99 Bootles of OOP« hingegen ist der Blick in die Küche und zeigt eindrücklich und nachvollziehbar, wie man Refactoring tatsächlich anwendet und wie es einem hilft, die jeweilige Problemdomäne zu erkunden. Unserer Einschätzung nach ein sehr wertvoller, zusätzlicher Nutzen von Refactoring. Grenzen werden aber auch nicht verschwiegen:

The truth about refactoring is that it sometimes makes things worse.

Uns lag eine beta-Version der »Ruby Edition« des Buches vor, was vermuten lässt, dass auch noch weitere Ausgaben in anderen Programmiersprachen folgen. Es handelt sich nicht um eine Einführung in Ruby, sondern in objektorientierte Programmierung und insbesondere deren Praktiken. Die Beispiele sind auf andere objektorientierte Sprachen übertragbar, wobei der Hintergrund der Autorinnen in dynamisch typisierten Sprachen wie Smalltalk und Ruby sie natürlich auch zu entsprechenden OO-Konzepten wie Duck-Typing greifen lässt, welche in statisch typisierten Sprachen Umwege erfordern.

Auf Einstiegsniveau schaffen Sandi Metz und Katrina Owen in dem Buch eine hohe Konzeptdichte mit gutem Praxisbezug. Auch wenn der Song und dessen Lösung trivial erscheinen mag, entsteht durch konsequentes Refactoring unter OOD-Gesichtspunkten am Ende »Clean Code«. Das Buch ist sprachlich als auch didaktisch sehr gut aufgebaut und liest sich von Anfang bis Ende flüssig, was in dem Genre durchaus bemerkenswert ist und womit sich die Autorinnen angenehm vom geistigen Vater »Uncle Bob« abgrenzen. Wir haben Refactoring und TDD selten so nachvollziehbar beschrieben gefunden. Der Titel des Buches ist Programm: die praktischen Programmierpraktiken bekommen etwas mehr Gewicht, als das objektorientierte Design. Das tut dem Buch aber keinen Abbruch, im Gegenteil; einerseits liegt mit »Practical Object-Oriented Design in Ruby« die passende Ergänzung zu OOD ja bereits vor und andererseits ist dies auch nur konsequent, denn:

Object-oriented design is about introducing objects as late as possible!

Mit 49 USD ist das Buch nicht gerade im unteren Preissegment angesiedelt. Die Autorinnen stellen sich aber auch der Frage der »fairen« Preisfindung mit einen interessanten Ansatz: wem der Preis zu hoch ist, soll ihnen eine Postkarte (!) schicken und erhält das Buch umsonst.

Besonders hat uns gefallen, dass in dem Buch nicht eine fertige Implementierung vorgestellt wird, sondern dass die vielen kleinen Entscheidungen, Abzweigungen und auch Sackgassen, mit denen ein Entwickler im Laufe seiner Arbeit konfrontiert ist, vorgestellt und diskutiert werden. Es geht um den Weg und nicht das Ziel, denn Design ist auch zunächst ein Prozess. Programmiert man während der Lektüre mit, so wird die Problemstellung real und das Buch kann seinem Anspruch (»A Practical Guide to Object-Oriented Design«) voll und ganz gerecht werden. Genug Code enthält das Buch dazu…


Bibliographische Angaben

Sandi Metz, Katrina Owen

99 Bottles of OOP – A Practical Guide to Object-Oriented Design

488 Seiten

Potato Canyon Software, LLC., Durham, North Carolina

ISBN-10: 1-944823-00-X

Erste Auflage

Copyright 2016

Version 0.4 beta vom 13. Februar 2017