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.
Top
CC Lizenz (BY NC SA)
CC Lizenz (BY NC SA)