Programmieren

Aus Unterrichtsmaterial
Dies ist die bestätigte Version dieser Seite, allerdings nicht deren neueste Version. Die neueste Version ansehen.
Wechseln zu:Navigation, Suche

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. [1]

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[2][3]. 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[3].

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[4]. 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

Spiral-Ansatz

Lese-Ansatz

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

  1. Felleisen, M.; ACM. 2018. A Programmable Programming Language. CACM 2018. https://www.youtube.com/watch?v=91hynuuM_As
  2. 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
  3. 3,0 3,1 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
  4. 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