„Wie kann Programmieren am besten erlernt werden“ ist eine Grundfrage unserer Industrie. Ich werde in diesem Beitrag das Lernen von Null betrachten. Diese Unterscheidung ist wichtig, da in der IT-Industrie nicht hauptsächlich der Nachwuchs lernen muss, sondern auch altgediente Veteranen. Nach den Aussagen in Karriereberatungen zu Informatik- und IT-bezogenen Berufswegen zu urteilen, ist dies sogar ein definierendes Merkmal dieser Berufszweige.
Tatsächlich richten sich die meisten Tutorials, Guides und Vorlesungen sowie die meiste Dokumentation an erfahrene Programmierer (die dieses Material auch schreiben). Dementsprechend setzen sie meist eine große Menge an Vorwissen und Verständnis voraus. Das ist sehr viel effizienter für erfahrene Programmierer, da nicht in jedem Schriftstück wieder die Grundlagen beschrieben werden. Und es ist auch weniger aufwendig in der Erstellung – versteht sich. Es ist genau dieser Fakt, der für die tatsächlichen Erstlinge ein großes Problem darstellt: für diejenigen, die noch nicht eine gewisse informationstechnische Grundbildung besitzen, sind dadurch die meisten Ressourcen schlicht ungeeignet.
Ich denke, diese informationstechnische Grundbildung ist erreicht, wenn ein (selbst oberflächliches) Verständnis von Programmierung und Internettechnologien mit einem guten Verständnis für Betriebssysteme und die maschinennahen Vorgänge kombiniert wird. Sobald dies erreicht ist, stehen alle Wege offen und Fachbücher und Projektdokumentation können gelesen und verstanden werden. Ich bin nicht der Meinung, ein volles Verständnis aller durch eine bestimmte Programmiersprache gebotenen Möglichkeiten wäre notwendig. Viel wichtiger finde ich, dass die Vorgänge in der eigenen Programmierumgebung bekannt sind.
Ich behaupte, dass dieses Phänomen der informationstechnischen Grundbildung vergleichbar mit dem ist, was in der Mathematik „mathematical maturity“ genannt wird. So wird die Grundbildung genannt, die in den allermeisten mathematischen Fachbüchern und -artikeln als gegeben vorausgesetzt wird. Sie ist die Grundlage fast aller Kommunikation: viele erfahrene Mathematiker haben größte Schwierigkeiten, ein Konzept zu erklären, ohne auf dieses Vokabular und Verständnis zurückzugreifen – ohne also die „mathematical maturity“ der Adressaten anzunehmen. Das Erreichen dieser Stufe wird als separates Problem betrachtet.
Nehmen wir einmal an, die Methoden des Lernens in der Informatik unterscheiden sich ebenfalls in „vor Erreichen der informationstechnischen Grundbildung“ und „nach Erreichen der informationstechnischen Grundbildung“. Wie die Welt „nach Erreichen der informationstechnischen Grundbildung“ aussieht, soll nicht Thema dieses Artikels sein, sondern die Ausbildung, in der diese Grundbildung erreicht werden soll. Ich habe die üblichen Methoden in fünf Ansätze unterteilt:
„Fang mit Python an“ oder „Versuch mal, so eine einfache Webseite zu bauen“. Die häufigsten Ratschläge würden wahrscheinlich so oder so ähnlich lauten. Einen besonderen Hintergedanken hat dies oft nicht, es ist einfach ein Startpunkt: „Mach einfach mal“
Und das ist auch sicherlich kein schlechter Rat! Doch ich behaupte, diese Startpunkte sind nicht korrekt gewählt. Denn was eine Webseite *ist*, was ein Browser tut, oder was „Python“ sein soll, was im Programmverlauf passiert und warum, das ist für jeden Anfänger ein Buch mit sieben Siegeln.
Zum Erringen der nötigen informationstechnischen Grundbildung hat dieser Ansatz also einen großen Nachteil: er ist sehr frustrierend. Schon allein die Bereitstellung einer anständigen Toolchain führt zum Kontakt mit den Innereien eines modernen Betriebssystems – $PATH und Paketmanager und Prozessorarchitekturen („wollen sie für x86 oder ARM installieren?“). Es ist sicher möglich, sich hier durchzuwurschteln, aber es gibt Schöneres.
In meiner Einschätzung zeichnet sich dieser Lernpfad hauptsächlich dadurch aus, dass er ohne Probleme zwischen Tür und Angel beschrieben werden kann. Der Aufwand und die Frustration liegen dadurch aber ganz auf den Schultern des Neulings.
Ein anderer Ansatz ist der des klassischen Informatikstudiums. Viel Augenmerk wird hier auf die Entwicklung gesetzt: ein Kurs zu Datenbanken beispielsweise hat nicht nur den Anspruch, Studenten zur Nutzung einer bestimmten Datenbank (oder einer Klasse von Datenbanken) zu befähigen, sondern oft auch zum *Design* derselben, zur Schaffung neuer Datenbanksysteme. Dies ist das allgemeine Muster: ein Kurs zu Chipdesign und Befehlssätzen (instruction sets) hat meist nicht nur das Ziel, die Assembler-Programmierung für x86-Systeme zu vermitteln, sondern beispielsweise die Zusammenstellung einer eigenen RISC-Architektur.
Dies ist sicherlich eine gute Methode für die Ausbildung von Wissenschaftlern und Spezialisten, die genau an diesen Dingen arbeiten möchten. Und gerade die Datenbankprogrammierung braucht genau diesen Hintergrund. Allerdings arbeiten die allermeisten Programmierer in ihrer ganzen Karriere nicht direkt an einem Datenbanksystem: sie nutzen nur die vorhandenen Systeme. Genauso, wie nur ein verschwindend geringer Prozentsatz der Programmierer direkt an Betriebssystemen arbeitet, sondern bestehende Betriebssysteme nutzt.
Dies war im Übrigen früher anders! Noch in den Siebzigern wurde für jede neue Generation von Computern nicht nur ein neues Betriebssystem, sondern sogar ein neuer Befehlssatz verwendet. Dementsprechend größer war auch der Anteil an Programmierern, die an solchen Systemen arbeiteten. Ich denke, dieser Ansatz ist heute nicht mehr auf die Anforderungen der allermeisten Programmierer zugeschnitten.
Der dritte häufig verwendete Ansatz ist die Verwendung von typischen Tutorials, Grundvorlesungen und Ähnlichem. Berühmt ist mittlerweile der CS50-Kurs der Harvard-Universität, der die Grundlagen der Programmierung vermitteln soll und von Erstsemestern verschiedener Studiengänge durchlaufen wird. Er ist im Internet verfügbar (beispielsweise auf Youtube)
Andere Grundvorlesungen verfolgen ähnliche Konzepte, und außerhalb der Universitäten gibt es im Internet noch zahlreiche andere Grundlagenkurse. Ich zähle zu dieser Kategorie auch die Bootcamps, die in den letzten zehn Jahren überall aus dem Boden geschossen sind.
Der Ansatz hier ist oft, einen Überblick über verschiedenste Aspekte zu bieten. Der CS50-Lehrplan beinhaltet beispielsweise jeweils nur eine Vorlesung für Scratch, Python, und Webtechnologien (HTML, CSS und Javascript) – kaum genug Zeit, um diese Werkzeuge tatsächlich zu beherrschen, aber vielleicht genug, um ein grobes Verständnis und einen ersten Eindruck zu bekommen. Dies scheint auch das Ziel zu sein: wenn ein Student später etwas lernt, bei dem beispielsweise Kenntnisse in Javascript vorausgesetzt werden, ist nun die Reaktion von „was ist Javascript?“ zu „das habe ich schon einmal gehört“ übergegangen. Genug, um nicht direkt die Orientierung zu verlieren.
Ich finde diese Methode grundsätzlich nicht schlecht. Allerdings denke ich auch, dass sie zu einer falschen Idee davon führen kann, was Kompetenz bedeutet. In einer solch kurzen Zeit kann man keine Kompetenz erreichen. Wer nun den Fehler macht, dieses vage Gefühl von „da war mal was“ für den Normalzustand zu halten, wird sich im schlimmsten Fall für einen anderen Berufsweg entscheiden. In diesem Ansatz muss also auf jeden Fall deutlich werden, dass es sich nur um einen ersten Überblick handelt und alle behandelten Themen in der Zukunft noch einmal in größerem Detail erkundet werden müssen. In einem technologieorientierten Studiengang ist dies auch sicher tatsächlich der Fall. Wenn ein solcher Kurs allerdings als Nebenfach für einen wirtschaftsorientierten Studiengang gewählt wurde, wird dies unwahrscheinlicher. Und ebenso gibt es sicher viele Autodidakten, die einen so aufgebauten Grundlagenkurs für ihr Selbststudium besuchen, und dann aber gerade nicht das behandelte Material in größerer Tiefe betrachten.
Ich denke daher, dass sich diese Methode nur für strukturierte Ausbildungswege eignet, die alle behandelten Themen noch einmal explizit aufgreift. Die informationstechnische Grundbildung kann mit diesem High-Level-Ansatz allein meiner Meinung nach nicht erreicht werden, denn viele benötigte Begrifflichkeiten und Konzepte können in einem solchen ersten Überblick nicht behandelt werden.
Diese Variante ist hauptsächlich im deutschsprachigen Raum vorhanden, und zwar die duale Ausbildung zum gelernten Fachinformatiker, in den Geschmacksrichtungen Anwendungsentwicklung und Systemintegration.
Das duale Ausbildungssystem genießt international einen hervorragenden Ruf, und das aus gutem Grund: die Kombination aus schulischer und praktischer Ausbildung, mit direkten Einblicken in den beruflichen Alltag und die betrieblichen Anforderungen, ist ein Erfolgsrezept. Zwei Nachteile hat dieses System in der Ausbildung von Informatikern jedoch: zum einen ist der technische und methodische Stand in Ausbildungsbetrieben oft nicht auf der Höhe der Zeit und zum anderen wirkt der zeitliche Aufwand in Kombination mit dem in dieser Zeit deutlich reduzierten Einkommen prohibitiv für die meisten Anfänger in der Programmierung.
Die duale Ausbildung ist allerdings tatsächlich eine gute Option für Praktiker. Viele Informatikstudenten wären mit einer solchen Berufsausbildung wohl besser bedient. Wer die Zeit und Gelegenheit hat, macht hier nichts falsch. Allerdings: Augen auf bei der Betriebswahl!
Als Letztes gibt es noch die verschiedenen „Roadmaps“, die hauptsächlich dem Selbststudium dienen. Die Idee dahinter ist wie folgt: es gibt sehr viele gute Artikel, Videos, Bücher, Kurse und Blogbeiträge zu Einzelthemen, und sehr viele recht schlechte Artikel und Kurse zu großen Themenfeldern. Die Besten unter Letzteren sind zwar manchmal auch kostenlos verfügbar, auf Plattformen wie Coursera oder Youtube, oft sind es aber auch teils recht teure Kurse auf Plattformen wie Udemy.
Es kann aber ein guter Ansatz sein, in einer Roadmap einen eigenen großen Kurs aus den Einzelfeldern zusammenzustellen, wenn denn die Reihenfolge stimmt. Dies ist auch mein eigener Ansatz.
Die bekannteste Sammlung von Roadmaps ist diese: Developer Roadmap
Als eines der beliebtesten Repositories auf ganz GitHub hat sie sicherlich viele junge Entwickler geleitet. Bei näherer Betrachtung fallen allerdings direkt große Lücken auf, besonders bei den ersten Schritten. Tatsächlich würde beispielsweise ein angehender Frontend-Entwickler nach dieser Roadmap nie auch nur die Grundlagen eines Betriebssystems lernen - schwer vorstellbar.
Diese Roadmaps sind allerdings durchaus geeignet, um nach Erwerb der informationstechnischen Grundbildung eine Anleitung zu den Anforderungen einer beruflichen Praxis zu geben. Direkt mit ihnen anzufangen ist aber wahrscheinlich eine recht frustrierende Erfahrung.
Ich bin überzeugt, dass eine informationstechnische Grundbildung, mit einem gut konstruierten Einführungskurs dieser Art, im Selbststudium erreicht werden kann. Darauf aufbauend kann fast jede praxisrelevante Fähigkeit ohne spezielle Anleitung erlernt werden. Natürlich kann eine strukturierte Fortbildung noch schneller zu Kompetenzen führen, aber wer die Zeit investieren kann, kann sich das Geld sparen.
Meine zentrale These: ein optimaler Lehrplan zur Erlangung von informationstechnischer Grundbildung muss so aufgebaut sein, dass kein Element eingeführt wird, dessen Bestandteile nicht bereits bekannt sind, und sollte dadurch auch möglichst kein Vorwissen voraussetzen.
Aus dieser einfachen Anforderung baut sich bereits ein gewisser Baum auf, da die meisten Themengebiete der höheren Programmierung direkt ausscheiden. Stattdessen finden sich die meisten sinnvollen Themen im maschinennahen Bereich, wie der Funktionsweise von Betriebssystemen oder dem Aufbau eines modernen Computers.
Mein Vorschlag für den Aufbau eines solchen Lehrplans ist dieser: Beginnen Sie mit dem Buch „But How Do It Know?“. Es ist aus gutem Grund ein Standardwerk: ohne technisches Vorwissen anzunehmen, zeigt es Schritt für Schritt den Bau eines funktionsfähigen Computers, komplett mit ALU, RAM und I/O-Bus. Damit ist der schwierigste Teil bereits geschafft, da wir im Folgenden auf alle eingeführten Elemente zurückgreifen können.
Im Anschluss daran muss das nächste Ziel sein, ein Verständnis für den modernen Computer und dessen Betriebssystem aufzubauen, welche im Prinzip identisch sind mit dem Objekt des erwähnten Buchs, aber in den Details doch sehr verschieden. Meiner Ansicht nach sollte hier eine simple Linux-Distribution als Grundlage dienen, da Linux erstens im Backend- und Serverbereich dominant ist und zweitens als Open Source System vollständig transparent ist.
Erst wenn ein moderner Computer verständlich geworden ist, kann man ihn auch kompetent verändern. Und dies ist schließlich die Essenz – sowohl der Programmierung als auch der Administration.
Wenn nun der Computer im Prinzip verstanden ist, und ein modernes Betriebssystem ebenfalls, dann kann die nächste Stufe beginnen. Hier gibt es mindestens zwei, relativ getrennte Bereiche: das weitere Verständnis der modernen Rechnerwelt auf der einen und die eigene Programmierfähigkeit auf der anderen Seite.
Die moderne Rechnerwelt weiter zu verstehen würde beispielsweise bedeuten, das Internet und die Interaktion mit Webservern zu betrachten. Es ist leicht zu sehen, dass dieses Verständnis auch ohne tatsächliche Programmierkenntnisse erworben werden kann. Und ebenso ist es unstrittig, dass die Programmierung auf dem eigenen Computer nicht direkt abhängig von einem Verständnis für Internettechnologien ist. Beide Bereiche können also unabhängig voneinander verfolgt werden.
Und schon nach etwa ein, zwei Monaten intensiven Studiums, oder nach sechs Monaten berufsbegleitender Weiterbildung, sollte so eine informationstechnische Grundbildung erreichbar sein. Direkt in einen IT-Beruf einzusteigen wäre dann natürlich noch sehr herausfordernd. Aber doch ist wohl die Hürde genommen, an der die meisten scheitern, und der Weg in diese Richtung geebnet. Und das ganz ohne den Frust und den Schmerz, den dieser Prozess für die meisten Anfänger bedeutet.