Das Lesen und Verstehen von Quellcode gehört zu den wichtigsten Disziplinen eines Software-Entwicklers, der sich im Arbeitsalltag ständig in fremden Code einarbeiten und diesen erweitern und pflegen muss. Für Diomidis Spinellis ist dies jedoch kein notwendiges Übel: er macht aus der Not eine Tugend. Wer es sich zur Gewohnheit macht, guten Code zu lesen, wird selbst besseren Code schreiben, so heisst es auf dem Rücken seines fast 500 Seiten langen Titels, der vom amerikanischen Software Development Magazin mit dem Produktivitätspreis 2004 ausgezeichnet wurde. Spinellis, der heute als Assistenz-Professor an der Universität Athen tätig ist, hat sich seine Erfahrung seit 1985 durch die (Mit)Arbeit an preisgekrönter Software erarbeitet.
In der Einführung geht Spinellis zunächst auf die Motivation ein: warum liest man eigentlich Code, und wie kann man unter den verschiedenen Beweggründen an die Sache herangehen? Im Folgenden wählt Spinellis einen Bottom-Up-Ansatz und bringt dem Leser zunächst im zweiten Kapitel, „Basic Programming Elements“, die grundsätzlichen Elemente eines Programms nahe, und durchleuchtet Funktionen, Variablen, und Kontrollstrukturen. Hierzu werden zwei komplette Programme, echo und expand, Schritt für Schritt besprochen. Das dritte Kapitel, „Advanced C Data Types“, widmet sich weiterführenden Konzepten der C-Programmierung, wie Zeiger, Strukturen, Unions und dynamischer Speicheranforderung. Im vierten Kapitel, „C Data Structures“, werden Datenstrukturen wie u.a. Stack, Vektoren oder Graphen besprochen. Die Einführung in die Programmierung schliesst das Kapitel fünf, „Advanced Control Flow“, in dem weiterführende Konzepte wie Rekursion oder Exceptions untersucht werden. Wie schon das zweite Kapitel ziehen auch die drei letztgenannten Kapitel zahlreiche Quellcodes zur Analyse heran, die die entsprechenden Typen und Strukturen implementieren. In Kapitel sechs, „Tackling Large Projects“, beschäftigt sich Spinellis nicht mit dem Quellcode an sich, sondern mit Projektorganisation, Konfiguration, Versionskontrolle und Test. Auch hier werden in gewohnter Manier Dateien analysiert, diesmal jedoch Ant- und Make-Dateien. Die folgenden beiden Kapitel widmen sich zwei weiteren Bereichen der Softwareentwicklung, „Coding Standards and Conventions“, und „Documentation“, und schließlich stellt Spinellis eine Reihe von „Code-Reading Tools“ in Kapitel zehn vor, um im letzten Kapitel ein komplettes Beispiel durchzuspielen, welches die besprochene Theorie in der Praxis anwendet: die hsqldb Datenbank soll im eine neue SQL-Funktion erweitert werden. Im Anhang findet sich neben Informationen zum auf der beigelegten CD-ROM enthaltenen Quellcode ein Kapitel „Maxims for Reading Code“ mit Textauszügen aus den einzelnen Kapiteln, die sich als wesentliche Leitsätze aus dem Inhalt herausziehen lassen.
Die kurze Inhaltsangabe macht bereits deutlich, dass das Buch viel mehr als nur das eigentliche Code Reading behandelt. Damit wird der Titel zu einem wertvollen Erfahrungsschatz, aus dem ein Entwickler, unabhängig von seiner Erfahrung, einige interessante Informationen schöpfen kann. Gleichzeitig tun sich hier aber auch zwei Probleme auf, die meinen Gesamteindruck schmälern: zunächst behandelt Spinellis in zwei Kapiteln sehr grundlegende Programmierkonzepte, die für den erfahrenen Entwickler nicht mehr von Interesse sein sollten – wem es an grundlegenden Kenntnissen fehlt, der wird kein Buch zum Thema Code Reading lesen. Umfassendere Themen wie Datenstrukturen und Graphentheorie werden ebenfalls behandelt, können in einem solchen Buch jedoch gar nicht in der nötigen Tiefe behandelt werden. So quält man sich mitunter durch die Kapitel und findet nur am Rande interessante Informationen, wie z.B. die Bemerkung, dass von der Benutzung der Methode alloca
in der FreeBSD Entwicklergemeinde abgeraten wird, weil sie als nichtportabel angesehen wird, während in GNU Entwicklerkreisen zur Benutzung geraten wird, weil sie ungewollte Speicherlöcher vermeidet. Auch folgende Kapitel wie „Tackling Large Projects“ oder „Architecture“ sind durchaus lesenswert, befriedigen aber nicht die Erwartungen, die ich an das Buch hatte. Das einzige Kapitel, das diese einigermaßen erfüllt, war „Code-Reading Tools“, und dieses behandelt teilweise ebenfalls nur sehr grundlegende Themen wie reguläre Ausdrücke oder das Unix Kommandozeilentool grep, beides Möglichkeiten, denen man als Software-Entwickler meist früh begegnet. Tools, die explizit die Interpretation von Quellcode unterstützen sollen, werden nicht genannt; stattdessen aber z.B. der Profiler gprof oder das Windows-SDK Tool API Spy zum Mitschneiden von Win32-API-Aufrufen.
Ein roter Faden ist durchaus erkennbar, jedoch leider nicht in der Weise, wie man es erwarten würde. So findet man mit „Code Reading“ letztendlich ein Buch, das gut das erste Semester im Fach Programmierung oder Software Engineering abdecken könnte. Beginnend mit einer Einführung in die C-Programmierung geht es weiter zu Datenstrukturen und Algorithmen, von dort aus dann zu Projektorganisation und -management. Spinellis glänzt mit seinen soliden (pre-ANSI-C) Programmierkenntnissen und weiß hier und da interessante Details zu erzählen; für den eifrigen Leser (lies: Student?) hat er am Ende eines jeden Kapitels Übungen zusammengestellt, häufig in der Form „Durchsuchen Sie den Quellcode der CD und nennen Sie mindestens fünf verschiedene Vorkommen von <Thema des Kapitels>“. Wer ein studienbegleitendes Buch zum Einstieg in die Softwareentwicklung sucht, findet mit „Code Reading“ einen Titel, der über die klassischen Vorlesungsbeispiele wie z.B. die Bibliotheksverwaltung hinausgeht und handfeste Beispiele zur Verdeutlichung heranzieht – das ist der Punkt, mit dem sich das Buch aus der Masse hervorhebt. Leider auch der einzige, denn der erfahrene Entwickler wird seine durch Lesen des Rückentextes entstehenden Erwartungen nicht befriedigt finden und nur wenig Neues aus „Code Reading“ lernen.
Die Seite des Autors zum Buch: http://www.spinellis.gr/codereading/
Addison-Wesley Verlag, Effective Software Development Series, 2003;
ISBN 0-201-79940-5