ubuntuusers.de

Buchbesprechung: Think Like a Programmer

buchrezension.png

Der Untertitel des Buches „Think Like a Programmer“ von V. Anton Spraul lautet „Typische Programmieraufgaben kreativ lösen am Beispiel von C++“. Diese Rezension soll zeigen, ob der Anspruch des Titels eingehalten wird.

Aufbau des Buches

Das Buch beginnt recht unkonventionell mit einem Kapitel zu Rätseln wie Schiebepuzzeln und Sudoku. Genau hier sieht der Autor die Stärken von Programmierern, die es schaffen, solche Rätsel zu analysieren, zu abstrahieren und zu lösen.

Die folgenden Kapitel beschäftigen sich dann eher mit der Sprache von C++ und gehen auf einige Programmierprobleme ein, die man mit C++ lösen soll. Dabei werden Arrays, Zeiger, Listen, Klassen und Rekursion erklärt.

Die letzten zwei Kapitel versuchen, die Bedeutung der Wiederverwendung von Code zu erklären und fassen alle vorherigen Aufgaben in einem großen Beispiel zusammen.

Die richtige Zielgruppe finden

think_like_a_programmer.jpg
Cover des Buches

Das Buch „Think Like a Programmer“ richtet sich vor allem an Programmieranfänger, die ihre ersten Schritte in der Programmierwelt gehen. Da C++ im Buch benutzt wird, setzt der Autor die Grundlagen der Programmiersprache voraus. Die Kapitel zu Arrays, Zeiger und Listen zeigen aber auch, dass das Wissen, was man mitbringen sollte, nicht all zu hoch sein muss.

Hier ist aber nicht ganz klar, wer genau die Zielgruppe sein soll. Wenn man schon Erfahrung in C++ hat, wird man vermutlich keine Einführung in Arrays und Listen benötigen, da man diese sicherlich schon aus der STL (Standard Template Library) benutzt hat. Auf der anderen Seite muss aber auch klar gesagt werden, dass der Autor nicht einfach die STL-Container vorstellt, sondern tatsächlich das Konzept hinter diesen Konstrukten. So wird erklärt, wie die Verkettung von Listen in C++ funktioniert oder wie ein Array im Speicher aufgebaut ist. Hier können Programmieranfänger tatsächlich etwas lernen, selbst wenn sie schon einmal Listen in der Hand hatten.

Inhaltliche Auseinandersetzung

Die Einführung über das Thema „Rätsel“ ist sehr gut gelungen. Sie versucht den Leser spielerisch an das Thema Programmierung heranzuführen. Denn bei der Lösung von (logischen) Rätseln geht man meist nicht anders vor als bei einem Programmierproblem. Man untersucht die Randbedingungen, versucht Schemen und Muster wieder zu erkennen, teilt die Aufgabe dann in Unteraufgaben auf und löst diese nacheinander.

Diese Grundzüge des Programmierdenkens sind dem Autor sehr wichtig. Ein Aspekt, den er immer wieder erwähnt, ist: „Niemals ohne Plan.” Bevor man eine Software schreibt, um ein Problem zu lösen, solle man sich klar werden, wie man es lösen will und in welchen Schritten man dazu vorgehen möchte. Der Plan könne dabei im Kopf entstehen oder auf (digitalem) Papier.

Ein weiterer wichtiger Punkt ist für Spraul die Zerlegung der Aufgabe in kleine Teile, sodass der Plan auch übersichtlich bleibt. Wenn man nur einen Planungspunkt „Problem lösen“ hat, ist die Wahrscheinlichkeit hoch, dass man sich bei komplexen Problemen leicht verläuft. Ebenso hilft es laut dem Autor, wenn man versucht, das Problem auf ein einfacheres herunterzubrechen, was man im Optimalfall bereits schon einmal gelöst hat.

Am Ende des Buches geht Spraul auch auf die Stärken und Schwächen von Programmierern ein. Er zeigt dabei natürlich nur ein paar Eigenschaften, arbeitet diese aber sehr gut heraus, sodass man sich sicherlich selbst als Programmierer darin wiederfindet. Vor allem das Thema „Schwächen“ sollte man ernst nehmen, da es oft dazu führt, dass ein Projekt scheitert oder zumindest nicht optimal läuft.

Die Endaufgabe ist die Programmierung des Spiels Galgenmännchen. Dabei wird aber eine besondere Variante programmiert, in der der Computer betrügt und das gesuchte Wort nicht am Anfang auswählt, sondern dieses erst im Laufe des Spiels je nach geratenen Buchstaben einschränkt. Die Idee ist sehr gut, da es alle Aspekte der vorherigen Kapitel zusammenfasst. Vor allem ist die Aufgabe noch relativ einfach, aber gleichzeitig – vor allem für Programmieranfänger – kompliziert genug, dass man einfach nur durch Losprogrammieren nicht zum Ziel kommt. Hier ist also ein überlegtes Vorgehen sinnvoll.

Kritik am Buch

Vor allem die Kapitel 1 und 8 sind sehr empfehlenswert. Hier geht Spraul zum einen auf die Grundlagen des Programmierdenkens ein und versucht zu vermitteln, welche Möglichkeiten man hat, ein Problem zu vereinfachen, um es zu lösen. Vor allem den Aspekt, niemals ohne Plan anzufangen, ist sehr sinnvoll. Ob der Plan nur das Beschreiben der Teilaufgaben oder gleich das komplette Design umfasst, ist dabei unerheblich. Wenn man in kleinen Schritten vorgeht, kann man das Ergebnis zum einen viel leichter testen und prüfen und zum anderen hat man schneller Erfolgserlebnisse.

Im achten Kapitel sind vor allem die Herausstellung der Stärken und Schwächen wichtig. Dies ist etwas, was man sich selbst oft nicht klar macht. Anhand der vorgegebenen Beispiele kann man sich überlegen, welche Stärken und Schwächen man selbst hat. Dies hilft unter Umständen dabei, ein besserer Programmierer zu werden.

Auf die Art ist das Buch auch für erfahrene Programmierer empfehlenswert. Diese können den mittleren Teil mit Arrays und Listen überspringen und nur den Reintext lesen. Ebenso ist der Text in den ersten zwei und letzten zwei Kapiteln oft so allgemein gehalten, dass man auch mit C++ noch keine Berührung gehabt haben muss, um die Prinzipien zu verstehen.

Für echte C++-Anfänger ist das Buch insofern nicht empfehlenswert, weil man damit kein C++ lernt, was aber auch nicht der Anspruch des Autors ist. Man bekommt viel mehr die Prinzipien hinter Containern und Programmierparadigmen erklärt, die – rein zufällig – mit C++ umgesetzt werden. Man hätte aber auch fast jede andere Sprache nutzen können.

Dementsprechend wird auch nicht auf alle C++-Eigenheiten eingegangen, aber zumindest einige werden erwähnt. Sehr gut wird beispielsweise die Speicherverwaltung mit Stack und Heap erklärt, auf der anderen Seite wird das Thema Klassen nur so kurz angeschnitten, dass ihre wirklichen Vorteile wie Polymorphie gar keine Rolle spielen. Hier wurde etwas Potential verschenkt.

Alle Kapitel werden mit Übungen abgeschlossen, die man selbst umsetzen sollte. Leider gibt es keine Musterlösungen. Wie der Autor schreibt, ist jede Lösung richtig, die die Randbedingungen erfüllt und das Problem löst. Aber sicherlich gibt es auch schöne und nicht so schöne Lösungen. Zusätzlich fehlt dem Leser eine Rückmeldung, ob es korrekt ist, was er gemacht hat. Oft merkt man bei solchen Aufgaben gar nicht, dass man einen Fehler begangen oder an etwas nicht gedacht hat. Gerade die Leser des Buches nehmen sich das Werk ja vor, weil sie damit noch Probleme haben.

Fazit

Alles in allem ist „Think Like a Programmer“ (was trotz des englischen Titels in Deutsch erhältlich ist) ein sehr empfehlenswertes Buch. Ohne die Programmierbeispiele in der Mitte hätte man sogar überlegen können, die Essenzen aus den Kapitel 1, 2, 7 und 8 zusammenzufassen und als kleines 50-seitiges Büchlein herauszubringen. Dann könnte man die wichtigen Themen sofort nachlesen. Für reine Programmieranfänger sind die Übungen und Beispiele in der Mitte des Buches aber sehr hilfreich.

Da das Buch auch für „alte Programmierhasen“ den einen oder anderen wichtigen Punkt bereithält, findet sich also wohl jeder wieder. Wer noch nie mit C++ programmiert hat, wird gegebenenfalls kleinere Probleme beim Verständnis haben. Wenn man aber bereits eine andere Programmiersprache beherrscht, ist dies kein so großes Problem mehr.

Dem Untertitel „Typische Programmieraufgaben kreativ lösen am Beispiel von C++“ wird das Buch also gerecht. Einzig das Wort „typisch“ könnte man streichen, da man in der „realen“ Welt sehr selten Container wie Arrays und Listen programmieren muss. Das Prinzip der Problemlösung ist aber auch in komplexeren Fällen sehr ähnlich und daher hilfreich.

Buchinformationen
Titel: Think Like a Programmer
Autor: V. Anton Spraul
Verlag: mitp-Verlag, 2013
Umfang: 296 Seiten
ISBN: 978-3-8266-9278-9
Preis: 29,95 Euro (Softcover) oder 24,99 Euro (EPUB/PDF)