Programmieren

Aus Unterrichtsmaterial
Zur Navigation springen Zur Suche springen
Die Druckversion wird nicht mehr unterstützt und kann Darstellungsfehler aufweisen. Bitte aktualisiere deine Browser-Lesezeichen und verwende stattdessen die Standard-Druckfunktion des Browsers.

Bei der Definition des Programmierens kann zwischen einem engeren und weiteren Begriffsverständnis unterschieden werden. Thuné & Eckerdal (2009) unterscheiden daher fünf unterschiedliche Arten, wie Programmieren wahrgenommen werden kann. Die Wahrnehmungsweisen steigern sich dabei dahingehend, dass das Verständnis von Programmieren schrittweise immer weiter gefasst wird. Das wohl engste Verständnis von Programmieren ist das Nutzen einer Programmiersprache, um Programmtexte zu schreiben. Weiter kann Programmieren als eine Denkweise gesehen werden, die Anweisungen in einer Programmiersprache so zueinander in Beziehung setzt, dass sie bei der Ausführung des Programms geschehen. Darüber hinaus kann Programmieren als Herstellung von Computerprogrammen, wie sie im täglichen Leben vorkommen, verstanden werden. Ein noch weiteres Begriffsverständnis wird dadurch definiert, dass zusätzlich zum oben Beschriebenen, Computerprogrammierung als Argumentationsmethode gesehen wird, die eine Problemlösung ermöglicht. Das weiteste Begriffsverständnis sieht letztlich das Programmieren als eine Art des Denkens, um Probleme zu lösen, die zur Erstellung von Computerprogrammen führen, wie sie im täglichen Leben vorkommen. Zusätzlich wird Programmieren als eine Fertigkeit wahrgenommen, die außerhalb des Programmierkurses und für andere Zwecke als die Computerprogrammierung eingesetzt werden kann.  

Definitionen von Programmierung

In der Literatur gibt es einige Definitionen von Programmierung, welche einander z.T. ergänzen und z.T. widersprechen. Hier sind einige aufgeführt

Programmierung als präzise Kommunikation zwischen Menschen

Matthias Felleisen sieht Programmierung als den Prozess, Code zu schreiben. Code, nach seiner Auffassung, ist ein Stück Information, welches auf möglichst präzise Weise Ideen zwischen Menschen kommuniziert. Daraus folgt unmittelbar der Anspruch, für jedes Feld der Expertise eine Programmiersprache zu haben, welche die Ideen aus dem jeweiligen Feld möglichst einfach in hoher Präzision darstellen kann. Wenn Programmierung also primär als Kommunikation zwischen Menschen gesehen wird, ist die Wahl (oder Entwicklung) der verwendeten Programmiersprache von zentraler Bedeutung. <ref>Felleisen, M.; ACM. 2018. A Programmable Programming Language. CACM 2018. https://www.youtube.com/watch?v=91hynuuM_As</ref>

Programmierung als Prozess mit Blick auf das Endprodukt

Programmierung wird von einigen Expert:innen als ein Prozess gesehen, in dem einer Maschine Anweisungen gegeben werden, welche zu einem späteren Zeitpunkt oder wiederholt auszuführen sind<ref>Alan F. Blackwell. 2002. First Steps in Programming: A Rationale for Attention Investment Models. In Proceedings of the IEEE 2002 Symposia on Human Centric Computing Languages and Environments (HCC'02) (HCC '02). IEEE Computer Society, Washington, DC, USA</ref><ref name=":0">Schulte, Carsten. 2013. Reflections on the role of Programming in Primary and Secondary Computing Education. https://panda.uni-paderborn.de/pluginfile.php/1835874/mod_resource/content/2/Schulte_2013_Reflections%20on%20the%20role%20of%20programming%20in%20primary%20and%20secondary%20computing%20education.pdf</ref>. Eine Zusammenfassung solcher Anweisungen zu einer Abfolge aus Eingabe, Verarbeitung, und Ausgabe wird auch "Programm" genannt. Manche Definitionen enthalten des Weiteren, dass die Eingabe variabel sein kann, was z.B. das Einstellen einer Mikrowelle oder das Verwenden von Markdown aus der Definition von Programmierung ausschließt - nicht aber das Programmieren von Office-Skripten<ref name=":0" />.

Diese Definition von Programmierung beinhaltet auch den Prozess, von einer Idee angefangen zu einem Endprodukt zu gelangen, welches die gewünschte automatisierte Funktion erfüllt. Dazu muss eine programmierende Person u.A. Komplexität abstrahieren und in einem kreativen Prozess neue Lösungen suchen und finden.

Ansätze zum Unterrichten von Programmierung

PRIMM

PRIMM ist ein Ansatz zur Unterrichtung von Programmierung in fünf Schritten: Predict, Run, Investigate, Modify, Make<ref>Sentance, S.; Waite, J.; Kallia, M. 2019. Teaching computer programming with PRIMM: a sociocultural perspective. https://www.tandfonline.com/doi/full/10.1080/08993408.2019.1608781</ref>. Es hat eine empirisch nachgewiesene Effektstärke von r=0.13 auf die Leistungen in Programmier-Tests.

Predict & Run

Im ersten Schritt geht es darum, dass Lernende vorhersagen, was ein Programmcode tun wird, wenn er ausgeführt wird. Nach der vollständigen Vorhersage werden die Vorhersagen unterschiedlicher Lernender miteinander verglichen und diskutiert. Erst dann wird der Code ausgeführt und das tatsächliche Ergebnis beobachtet.

Investigate

Im Investigate-Schritt bekommen die Lernenden Fragen gestellt, welche die Effekte einzelner Code-Teile abfragen. Das Beantworten der Fragen sollte in der Form von Diskussionen stattfinden, welche zwischen den Lernenden geführt werden. Damit kann u.A. auch das Vokabular zum Beschreiben von Code trainiert werden.

Um geeignete Fragen zu stellen, kann z.B. das Block-Modell verwendet werden. So können zuerst Fragen zu nicht-intuitiven Atomen, danach zu Blöcken, und schließlich zu Relationen und dem ganzen Programm gestellt werden.

Modify & Make

Zuletzt geht es darum, den Lernenden den Schritt vom Lesen und Verstehen von Code zum Schreiben von Code zu ermöglichen. Dazu werden den Lernenden Aufgaben gestellt, in denen sie ein bereits fertiges Programm modifizieren müssen, um z.B. seine Funktionalität zu ändern oder einen Bug zu fixen. Diese Aufgaben werden zunehmend umfangreicher, bis die Lernenden schließlich Aufgaben bekommen, in denen sie ein vorgegebenes Problem mit komplett neuem Code lösen müssen.

Strategien zum Gestalten von Einsteigerkursen Programmierung (Merrienboer et al.)

Experten-Ansatz

Der Expertenansatz ist ein Top-Down-Ansatz, bei welchem Anfänger mit einem komplexen, aber motivierendem, Programmierproblem beginnen. Dabei wird das Algorithmen und Programmdesign betont, indem auf der obersten Ebene begonnen wird und ein Problem so lange schrittweise verfeinert wird, bis die eigentliche Sprachebene erreicht wurde. Ziel ist es, durch das Verfeinern des Problems den Fokus auf den semantischen Inhalt zu setzten und Programmieraufgaben in kleinere Teilaufgaben zu zerlegen.

Spiral-Ansatz

Bei dem Spiralansatz steht das paralleles, schrittweise Lehren im Fokus. Jeder der Schritte enthält syntaktische und semantische Aspekte, welche jedes Mal eine minimale Erweiterung des Vorwissens darstellen. Dabei ist darauf zu achten, dass auch der Bezug und der Zusammenhang zu dem bisherigen Wissen hergestellt wird. Ein weiterer wichtiger Aspekt, der in jedem Schritt erfüllt sein muss, ist, dass die erlernten Themen mit viel Übung trainiert wird. Dabei wird mit einfachen Codierungsproblemen begonnen und schrittweise werden die zulösenen Probleme komplexer, anspruchsvolles Algorithmen design wird daher auch erst später im Kurs behandelt.

Lese-Ansatz

Wie beim vorherigen Ansatz nimmt auch beim Leseansatz die Schwierigkeit allmählich zu, allerdings nicht schrittweise, sondern aufgeteilt in vier Phasen. Die erste Phase beinhaltet das Durchführen vorgegebener gut gestalteter und funktionierender Programme. Dabei werden Stärken und Schwächen des Programmes bewertet und vor allem das Verhalten beobachtet. In der Zweiten Phase werden die zuvor durchgeführten Programme gelesen und abgeschrieben, wodurch Sprachmerkmale erlernt werden. Die dritte Phase beinhaltet das Modifizieren und Erweitern des Programmes, dabei werden nicht nur Codierungsaspekte berücksichtigt, sondern auch Disignaspekte. In der letzten Phase generieren die Lehrenden selbstständig Programme.

Deklarative Unterrichtstaktiken

Bei deklarativen Taktiken erklären Schüler neue Informationen selbst, entweder mündlich oder durch Notizen, um die neuen Anweisungen mit vorhandenem Wissen in Beziehung zu setzen. Der wesentliche Aspekt liegt für den deklarativen Unterricht auf der Vermittlung von Fakten, wie Sprachaussagen und syntaktischen Regeln, in Verbindung mit schematischem Wissen. Dies geschieht zum Beispiel durch Präsentieren eines Designprozesses durch Entwurfsdiagramme.

Prozedurale Unterrichtstaktiken

Wesentliche Aspekte von prozeduralen Taktiken sind die Unterstützung von Erkenntnisprozessen, Zusammenstellung und Abstimmung. Prozedurale Taktiken umfassen hauptsächlich die didaktische Gestaltung des Unterrichts durch Methoden wie ausgearbeitete Beispiele, Aufgabenvariation und das Üben grundlegender kognitiver Fähigkeiten.

STREAM

STREAM ist ein Programmierprozess, welcher das Ziel hat, einfach genug zu sein, um in einem Einsteigerkurs neben dem Programmieren selbst unterrichtet zu werden. Dabei soll in möglichst wenigen, einfach nachvollziehbaren Schritten ein erstes lauffähiges Programm entstehen, um die ersten Erfolgserlebnisse so schnell wie möglich zu erzielen. STREAM teilt sich auf in die Schritte Stubs, Tests, Representations, Evaluation, Attributes, und Methods. STREAM in Reinform setzt eine objektorientierte Programmiersprache voraus, kann aber auch ohne viel Aufwand auf funktionale oder hybride Programmiersprachen übertragen werden.

Stubs

Im ersten Schritt erstellen die Schüler:innen ein sogenanntes "laufendes Skelett", d.h. ein Programm, welches zwar kompiliert, aber noch nichts tut. Dazu erstellen sie nur eine Klasse mit ihren gewünschten Methoden allerdings ohne Übergabeparameter. Die Methodenrümpfe bleiben ebenfalls leer, mit Ausnahme von einfachen Rückgabewerten, damit das Programm kompiliert (z.B. bei einer Methode vom Rückgabetypen int die Zeile "return 0;").

Tests

Im zweiten Schritt werden Testfälle festgelegt. Diese stellen eine Konkretisierung der Anforderungen an jede Methode dar. Dies geschießt im Anfängerkurs üblicherweise durch die Lehrkraft, die diese lediglich austeilt. Viele IDEs bieten dafür bereits integrierte Tools, in die lediglich eine CSV-Datei importiert werden muss.

Representations

Im dritten Schritt denken sich die Schüler:innen mindestens zwei, ggf. auch mehrere mögliche Repräsentationen für die Eingabeparameter der Methoden sowie für die Attribute der Klasse aus. Z.B. könnte das Datum in einer Datums-Klasse ähnlich wie bei der UNIX-Time in Form einer einzelnen Zahl gespeichert sein, welche die Tage seit einem festgelegten Anfangstag bezeichnet; oder sie könnten in der Form von drei separaten Zahlen abgelegt sein, welche den Tag, den Monat, und das Jahr darstellen.

Evaluation

Nachdem die Schüler:innen sich die Repräsentationen ausgedacht haben, geht es darum, sie zu vergleichen. Dazu wird für jedes Vergleichskriterium eine sogenannte "Representation Evaluation Matrix" (REM) erstellt, in welcher jede Methode, die implementiert werden soll, auf Basis des Kriteriums bewertet wird. Für einen Einsteigerkurs ist das einzig notwendige Kriterium der Aufwand, die Methode bei gegebener Repräsentation zu implementieren; bei Anwendung des Verfahrens auf fortgeschrittenem Level würden sich u.A. auch Laufzeiteffizienz als Vergleichskriterium anbieten.

Im Beispeil einer Datums-Klasse könnte eine REM zum Implementationsaufwand z.B. so aussehen:

Attributes

Bevor im letzten Schritt die Methoden implementiert werden, müssen nun die Attribute angelegt und an geeigneter Stelle initialisiert werden. Die Attribute sollten dabei direkt mit ihrer jeweiligen Funktion und u.U. Constraints annotiert werden. Z.B. sollte bei der Datums-Klasse - bei einer Repräsentation in Form von drei separaten Variablen für Tag, Monat, Jahr - der Monat mit "1 <= month <= 12" annotiert werden.

Methods

Der letzte Schritt ist der, in dem die Methoden tatsächlich implementiert werden. Dabei ist es wichtig, dass immer nur eine Methode auf einmal implementiert und dann getestet wird, bevor die Schüler:innen zur nächsten Methode fortschreiten.

Beim implementieren einer Methode gilt außerdem das Mañana-Prinzip, welches besagt: "Falls du beim Implementieren das Gefühl hast, du könntest eine Hilfsmethode gebrauchen, implementiere deine Methode so als gäbe es die Hilfsmethode bereits; implementiere die Hilfsmethode später." Diese Hilfsmethoden müssen, damit das Programm weiterhin kompiliert, immer direkt als Stubs erstellt werden (s. Schritt 1).

Schwierigkeiten von und Strategien für das Unterrichten von Programmierung

Schwierigkeiten von Anfänger beim Programmieren

Eine Schwierigkeit von Anfängern ist, dass unklar ist, wofür Programmieren genutzt wird. Das heißt, dass die Orientierung fehlt. Des Weiteren fällt es Anfängern schwer die allgemeinen Eigenschaften der Maschine zu Verstehen und damit auch zu Kontrollieren. Eine andere häufige Schwierigkeit für Anfänger bildet die Notation. Auch das Erfassen der Struktur also von Standartmustern stellet Lernende vor Herausforderungen. Außerdem ist die Pragmatik eine Schwierigkeit, also die Fähigkeit Programme zu spezifizieren, entwickeln, Test und am Ende zu debuggen.

Strategien fürs Unterrichten, um Herausforderungen zu reduzieren

Eine Strategie ist Fortschritt, bei welchem die Lernenden vom Konsumenten zum Produzenten werden sollen, also vom Anwender zum Entwickler anwendbar ist dieser Ansatz zum Beispiel auf Code. Der Fortschritt wird dabei in Bezug auf die Komplexität der Aufgaben organisiert und nicht auf die Komplexität der Sprachkonstrukte.

Eine weitere Strategie ist das Verwenden von theoretischen und praktischen Beispielen, welche für Schüler verständlich sein sollten, mit den Lernzielen übereinstimmen und ein neues Konzept wirkungsvoll vermitteln. Damit durch die abwechselnden Beispiele der Lernerfolg gesteigert wird und Probleme besser von den Lernenden gelöst werden können.

Abstraktion und Muster ist eine weitere Strategie. Dabei wir die Mustererkennung verstärkt, sodass wiederkehrende Programmabschnitte erkannt werden. Außerdem werden Modelle und konzeptionelle Rahmenbedingungen verstärkt, das heißt Programmkonzepte werden getrennt von der Programmiersprache.

Die letzte Strategie ist Prozess, welche beinhaltet, dass Programmierprozesse aufzeigt werden. Dabei ist allerdings zu beachten, dass Musterlösungen Selbstvertrauen der Lernenden rauben kann. Daher sollen die Lernenden lernen lieber viele kleine Schritte anstatt einen Großen zu machen, das Fehler zum Programmierprozess dazugehören und das manchmal Code umgeschrieben werden muss. Schüler sollten sich das Konzept dabei selbst erklären und näherbringen. Dies kann entweder durch Top-Down passieren, also das Schrittweise Verbessern und Verfeinern eines Programms oder durch Bottom-up, also erst ausprobieren, umstrukturieren, testen und erst später verbessern.


<references group="Caspersen, Michael E., 2017 - Teaching Programming" /> <references />