Ich spreche hierbei von eigenen Erfahrungen: Die Programmierung habe ich mir selbst mit Q-Basic beigebracht, und es folgte ein langer und steiniger Weg über verschiedene komische Kurse in der Schule. Ich denke aber nicht dass diese Methode heutzutage noch wirklich sinnvoll ist - vor allem weil man dabei viel zu viel Zeit verbrennt.
Deshalb mein Vorschlag: Wir sollten versuchen, Neulinge in die moderne Programmierung einzuführen, und möglichst viele der alten rein technik- und hardwarebezogenen Fallstricke für den Anfang außen vor zu lassen. Heute muss niemand mehr Transistoren schweißen oder Assembler hacken! Dafür sollte gerade am Anfang viel mehr Zeit in die richtigen, nicht rein technikspezifischen Konzepte gesteckt werden: Imperative Programmierung lässt sich am besten mit grafischen Hilfsmitteln erlernen, bei denen man Algorithmen entwickeln muss um Zeichenanweisungen durchzuführen. Zusätzlich kann man aber auch von Anfang an die Mathematisch Geprägte Funktionale Programmierung vorstellen, z.B. anhand von einfachen Taschenrechner Applikationen, und zeigen wie die beiden Konzepte in der modernen Programmierung zusammenspielen.
Das wichtigste ist bei beiden Wegen, dem Neuling möglichst viel Rückmeldung zu geben und ihm die Möglichkeit zu schaffen, schnelle Erfolge in der Programmierung zu sammeln. Später muss dann das Bewusstsein für die Vermeidung von Redundanzen und das Erkennen und Abhandeln von Fehlern geschaffen werden.
Ein Entwickler, der in der Lage ist sein Wissen auch dem blutigsten Anfänger zu erklären, der ist meiner Meinung nach besser und kompetenter als selbst der genialste C-Kernelentwickler oder Haskell-Halbgott. Schließlich ist die Quintessenz unseres Jobs doch nicht nur, immer die neusten und tollsten Techniken auszuprobieren, sondern auch, Wissen zu verbreiten und Dinge einfach und richtig erklären zu können, oder? Wenn wir nur unsere eigenen Techniken verbessern, werden wir langfristig weniger effektiv sein als wenn wir in der Lage sind ein Team "auszuheben" in dem alle über ähnliche Fähigkeiten verfügen.
Viele meiner bisherigen Posts erscheinen in dem Zusammenhang vllt als das genaue Gegenteil - sie befassen sich mit komplizierten Themen des Programmiersprachendesigns - aber dienen sie nur der Vorbereitung meines Vorhabens: Ich analysiere Programmiersprachen nur deshalb so lange, weil ich nach den "richtigen" Konzepten suche um einfache und dennoch gute und leistungsfähige Sprachen zu identifizieren. Nur eine solche Sprache taugt dazu, einem Anfänger die Konzepte einfach und dennoch "richtig" zu erklären. Folglich muss die Sprache in der Lage sein, mit den Fähigkeiten des Entwicklers zu "wachsen" und nicht von vornherein ein Buch mit sieben (oder deutlich mehr!) Siegeln zu sein. Andererseits muss die Sprache aber auch "richtig" sein. Merke: Einfachheit kommt immer erst NACH der Richtigkeit bei einer für das Lernen geeigneten Sprache. (Das wars dann für euch, BASIC und PHP. Achja, UND Java..).
Für mich müsste eine solche Einführung auf sehr viel von dem, was bisher klassischerweise unterrichtet wird, verzichten und stattdessen ganz andere Fokusse setzen.
Ein paar Beispiele für Themen, die jeder Neuling - in noch festzulegender Reihenfolge - lernen und kennen sollte:
- Das binäre Zahlensystem - nur die blutigen Grundlagen. Ohne das Verständnis für binäre Zahlensysteme macht es keinen Sinn, sich mit der Programmierung zu befassen.
- Grundlagen der hardwarenahen Datentypen - Vom Bit zum Byte, zum Integer zu den Gleitkommazahlen. Wie Chars und Strings in diesen Mix mit hereinspielen (Zeichenkodierungen).
- Imperative Programmierung mit grafischen Oberflächen a la Nikki, Logo
- Algorithmen, mit denen häufig benutzter Code ohne Redundanzen auskommt
- Einfache Schleifen und Selbstentwickelte Schleifen
- Referenzen und Objekte
- Objekte und Typen - Typen als Möglichkeit, Daten zu speichern UND Redundanzen zu vermeiden
- Funktionen - Algorithmen ohne Seiteneffekte. Gerade er "Kein Seiteneffekt" Teil wird hier besonders im Mittelpunkt stehen.
- Funktionen als Datentypen - Möglichst einfach und ohne den komplizierten Background
- Unverändlerliche Objekte (Werte) und veränderliche Objekte
- Mehrere Objekte - Collections.
- Operatoren
Die o.g. Liste wirkt vllt heftig, aber eigentlich ist sie es gar nicht: Viele Konzepte lassen sich einem unbelasteten Neuling ohne technischen Hintergrund vllt. sogar leichter erklären als dem Programmiercrack, der in vielen Bereichen, z.B. den Closures, der imperativen Programmierung und der Objektorientierung bereits eine festgefahrene und schwerer zu ändernde Meinung hat, als jemand der das alles ganz unbedarft neu lernen kann. Das Ziel ist ja gerade, keine Sprachenblinde Sicht zu entwickeln sondern möglichst viele moderne Konzepte anhand der Sprache zu erklären und diese zu einem sinnvollen Gesamtbild zusammenzusetzen.
Neben der obigen (unvollständige) Liste wird aber vor allem noch eine passende Programmierumgebung benötigt. Nein.. es kann nicht Eclipse sein, wenn man die Leute nicht schreiend verjagen will. Es sollte eine deutlich abgespeckte Variante dieser IDE mit einer Besonderheit sein: Einer grafischen Oberfläche mit einem "Icon", dass sich durch Programmbefehle steuern und mit Anweisungen versehen lässt.
Kennt ihr Nikki, den Roboter und oder den Zeichenigel? Beide grafischen Lernumgebungen für Pascal bzw. Logo gehörten damals zu besten Umgebungen, die Programmierung direkt durch grafische Rückmeldungen zu lernen, und ich glaube bis heute hat sich an der Attraktivität einfacher grafischer Operationen für Anfänger nichts geändert. Die Umgebung sollte vllt nur mit einem ähnlich einfachen Befehlssatz "attraktivere" evtl. in 3-D gerendete grafische Elemente erzeugen. :-)
Mal sehen wie weit ich das Thema weiterhin verfolge!
No comments:
Post a Comment