Einleitung, oder warum das Ganze?
Wenn man den Titel dieses Buches liest möchte so mancher sagen, dass es eigentlich genau anders herum sei. Computer sind
intelligent, sie helfen mir bei meiner Arbeit – aber sind immer dann, wenn man sie am dringendsten braucht, irgendwie
kaputt oder machen nicht das, was man von ihnen will. Und genau dieses „Gefühl“ führt gerade bei Programmieranfängern dazu,
den Programmierprozess falsch anzugehen und sorgt für jede Menge Frustration. Dieses Buch soll nun einen Weg aufzeigen, wie
man diese Fehleinschätzung vermeidet und die Frustrationsmomente minimiert, indem wir von Anfang an eine Erkenntnis hochhalten
– der Computer denkt nicht, er arbeitet ab! Ja, auch
ChatGPT
ist erstmal nichts anderes als ein – zugegebenermaßen extrem komplizierter und umfangreicher – Algorithmus, der
abgearbeitet wird. Es wird nun auch bei dem von mir vorgeschlagenen Weg das Programmieren zu lernen immer wieder Zeiten
geben, in denen man den Glauben an sich selbst
verliert und den Laptop am liebsten an die Wand werfen möchte – aber sie werden vermutlich weniger sein als über den
üblichen Weg, Übung für Übung aus einem Buch oder dem Internet abzuschreiben und daraus sein Wissen zu extrahieren.
Als ich mich entschlossen habe, dieses Buch zu verfassen, war meine erste Frage an mich: „braucht die Welt ein weiteres
Programmierbuch?“ und die Antwort ist weniger eindeutig, als man meint. Es gibt unzählige Bücher, Lehrgänge, Tutorials.
Das Internet ist voll von Lehrvideos und die Programmierercommunity ist unendlich hilfsbereit. Die Einträge der Seite
StackOverflow
umfasst einen zweistelligen Millionenwert. Und trotzdem habe ich mich hingesetzt und dieses Buch verfasst. Gehen wir hierzu
zuerst mal darauf ein, für wen dieses Buch eigentlich ist. Es ist für alle diejeinigen gedacht, die ernsthaft mit dem
Programmieren anfangen wollen und irgendwie mit den Standardwerken unfzufrieden sind oder sich mit der Tiefe von anderen
Werken überrupelt fühlen. Oftmals meint der Autor es gut und versucht möglichst schnell in die Tiefe zu gehen, vergisst
hierbei aber für den Anfänger die Erklärungen der Grundlagen einfließen zu lassen. Manche auf den ersten Blick
merkwürdigen Phänomene lassen dann manchen an sich und seiner Auffassungsgabe zweifeln. Es ist nicht wichtig 100
verschiedene Wege zu kennen, wie man ein File öffnet – wir sollten aber durchaus den Anspruch haben zu verstehen,
warum aus dem „ä“ in einem Textfile plötzlich ein „õ“ geworden ist. Hierbei setze ich zwei Dinge beim Leser voraus.
Erstens muss man Spaß daran haben, sich auf neue Denkweisen einzulassen und eine gewisse Neugierde bezüglich der
Verhaltensweisen von Technologie haben. Und man braucht zweitens ein gewisses logisches Verständnis. Man muss leider
sagen, dass wenn man sich schon immer mit logischen Problemstellungen schwer getan hat, das Programmieren vermutlich
keine zufriedenstellende Beschäftigung darstellt. Das Buch ist nichts für diejenigen, die schon fit im Programmieren sind.
Nichts für Leute, die denken, ein Buch zu lesen reicht aus, um anschließend Programmieren zu können. Niemand würde auch
auf die Idee kommen, ein Englisch Schulbuch zu lesen und dann zu behaupten, man könne Englisch sprechen. Und ich bin
der Überzeugung, dass genau für die Zielgruppe der interessierten und engagierten Neulinge ein geeignetes Buch fehlt,
welches sich dem Thema von einer umfassenden und allgmeinen Seite nähert. Und unter „allgemein“ verstehe ich auch, dass
man sich als Programmieranfänger nicht sofort für eine Programmiersrpache entscheiden muss! Die mitunter an
Glaubenskämpfe erinnernde Dogmatik, mit der einige „ihre“ Programmiersprache als die einzig wahre anpreisen, hat meines
erachtens im Kreise von ernsthaften Programmierern nichts zu suchen.
Wer dieses Buch druchliest wird auch nicht ein
Experte in der ein- oder anderen Programmiersrpache sein, da das Buch kein Programmierkurs in einer spezifischen Sprache
ist. Sehr wohl wird er aber ein solides Fundament aufgebaut haben, auf das er das Erlernen einer neuen Programmiersrpache
setzen kann, was ich unter dem Begriff „umfassend“ subsumieren würde. Ich werde zwar auf einige wichtige Sprachen
eingehen, wie C, C++, C#, Java, JavaScript, PHP und Pyhton – das Ziel ist aber weniger diese Sprachen zu lernen,
sondern vielmehr, dass man sich nach dem Durcharbeiten dieses Buches auch auf hier nicht referenzierte Sprachen stürzen
kann. Hierbei fungieren die vorig genannten Programmiersprachen als Beispiele, welche möglichst viele unterschiedliche
Verhanltensweisen demonstrieren sollen. Ich möchte mit diesen Sprachen aber auch an vielen Stellen den Beweis führen,
dass trotz aller Unterschiede im Detail erfreulich viele Gemeinsamkeiten unter diesen Sprachen gefunden werden können.
Eine Programmiersprache lernt man darüberhinaus ohnehin nicht, indem man sich alle möglichen Befehle und Bibliotheken
auswendig merkt – dafür sind es viel zu viele Details. Man lernt eine Programmiersprache, indem man die Befehle bewusst
sucht und anwendet. Und genau dieses Bewusstsein soll dieses Buch vermitteln. Ich werde keinen Wert darauf legen,
in Java alle möglichen Methoden für die Stringmanipulation aufzuzeigen – dies ist kein Nachschlagewerk, da dieses Buch
nicht besser sein kann als das große auf Java spezialisierte Literaturangebot oder die online Dokumentation von Java.
Da man beim Programmieren ja ohnehin gezwungenermaßen einen Rechner vor der Nase hat, kann man auch das beste und
umfangreichste Nachschlagewerk der Welt nutzen, das Internet. Obwohl ich beispielsweise das Buch
„The C Programming Language“
von Kernighan und Ritchie neben mir stehen habe, suche ich oftmals zuerst online nach Informationen zu einzelnen
Problemstellungen. Nur wenn ich die Philosophie von C verstehen möchte, dann greife ich auf das Buch zurück.
Aber kommen wir nochmal auf den Sinn und Unsinn des Buchtitels zu sprechen. Stellen wir uns mal folgende Situation vor:
Ein Mensch – fraglos ein tendenziell „intelligentes“ Wesen – möchte eine Straße überqueren. Der Mensch würde erst links,
dann rechts nach herannahenden Fahrzeugen suchen und für den Fall, dass kein Fahrzeug kommt, die Straße überqueren.
Im Idealfall auch dann, wenn er in Eile ist. Wenn ein Tier eine Straße überquert, würde diese Systematik nicht zu
beobachten sein. Zweifellos ein eher „unintelligentes“ Vorgehen. Wenn wir nun ein kleines selbstfahrendes Spielzeugauto
für diese Aufgabe programmieren müssten, dann könnten wir ein Programm mit folgender „Logik“ implementieren:
Damit würde das Auto beim Überqueren der Straße also einen besseren Job machen als ein Tier. Es würde aber niemand auf
die Idee kommen, dem Auto aufgrund des oben genannten Programms sowas wie „Intelligenz“ zuzusprechen. Das Auto arbeitet
lediglich das Programm ab. Die Intelligenz liegt also beim Programmierer, nicht beim Auto. Im Gegenteil, das Auto arbeitet
das Programm sogar ohne irgendwelches Hinterfragen ab. Wenn sich beispielsweise ein Insekt von rechts schnell nähert, würde
das Auto laut Programm nicht losfahren – es ist also vergleichsweise „dumm“. Auf der anderen Seite wird das Auto immer
zuverlässig beide Straßenseiten prüfen. Menschen hingegen lassen sich beispielsweise zu gerne von anderen Dingen wie
Smartphones ablenken und verursachen deshalb leider immer wieder Unfälle. Der Computer im Spielzeugauto ist also „dumm“
aber „zuverlässig“. Und das wiederum ist eine entscheidende Tatsache, welche für den Programmierer wichtig ist. Er und
nur er kontrolliert den Computer. Und zwar zu 100% (wobei ich hier das Thema „KI“ wie bspw. Neuronale Netze im Zusammenhang
mit reinforced Learing mal ausnehmen möchte – in der zwar auch der Programmierer die Algorithmik festlegt, er aber im
Lernprozess die Kontrolle über die Parameterfindung in gewissen Grenzen aus der Hand gibt und ein Stück weit dem Zufall
überlässt). Wenn also ein Programm nicht das macht, was es soll, wenn es abstürzt oder sonst irgendwelche „Zicken“ macht,
dann nur deshalb, weil ein Programmierer einen Fehler begangen hat – Hardwarefehler mal ausgeklammert.
Was heißt das jetzt für dieses Buch? Zum einen mal, dass man als Programmierer sich immer dieser Verantwortung bewusst
sein muss. Zum anderen, dass man das, was man macht auch durchgängig verstehen muss. Es reicht nicht, aus dem Internet
(sei es StackOverflow oder ChagGPT) oder aus Büchern irgendwelche Codeschnipsel zu kopieren und zu einem Programm
zusammenzufügen. Ich muss Klarheit darüber haben, was ich da eigentlich mache. Aus diesem Grunde werden wir bei allen
Themen so weit in die Grundlagen gehen, dass wir das Verhalten unseres Programms vorhersehen und verstehen können.
Ich werde mich hierbei wie gesagt auch nicht auf eine Programmiersprache konzentrieren, sondern unterschiedliche Sprachen
aufzeigen. Allen gemein wird aber sein, dass sie ohne Lizenzkosten auf unseren Rechnern laufen werden, so dass jeder in
der Lage sein wird, ohne weitere Kosten die Beispiele nachzuvollziehen. Eine Beschreibung für die Installation einer
einfachen Entwicklungsumgebung findet sich im Kapitel
VSCode Installieren.

CC Lizenz (BY NC SA)