Unser Ziel war es, die zuvor genannten Kursinhalte an ein diverses und großes Publikum zu vermitteln. Hierzu mussten wir eine technische Lösung für die Skalierung des Übungs- und Hausaufgabenbetriebes einsetzen. In dem ersten Anlauf haben wir 150 Studierende zugelassen.
Veranstaltungsangebot
Der Kurs bestand aus zwei verschiedenen Veranstaltungsformen. Zum einen gab es die Vorlesung, die von Prof. Abedjan gehalten wurde. Hier wurden in erster Linie die theoretischen Konzepte vermittelt und durch Programmierbeispiele in Jupyter Notebooks demonstriert und angewendet. Die Vorlesungsunterlagen basierten auf dem Textbuch „Inferential Thinking“ der Berkeley-Universität und wurden den Studierenden nach der Veranstaltung über die E‑Learning-Plattform ISIS der TU Berlin zur Verfügung gestellt. Nach der ersten Vorlesung wurden die 150 teilnehmenden Studierenden auf die vier angebotenen Übungsstunden aufgeteilt.
Die Übungsstunden wurden somit für jeweils ca. 40 Studierende von den Doktoranden Mahdavi und Esmailoghli gehalten. Ziel der Übungsstunden war es, den vermittelten Stoff aus der Vorlesung praktisch anzuwenden und somit auch zu vertiefen. Hierzu wurden live und am Jupyter Notebook Übungsaufgaben gemeinsam bearbeitet und diskutiert. Außerdem waren die Übungsstunden besonders zu Beginn des Semesters ein gut genutzter Anlass, um etwaige Python-bezogene Fragen zu besprechen und Probleme zu lösen. Grundsätzlich waren die Übungen stets gut besucht und die Diskussionen wurden sehr gut und engagiert von den Studierenden angenommen. Da Aufgaben zentralverwaltet wurden und alle Studierenden in der gleichen Entwicklungsumgebung arbeiteten, gab es eine recht hohe Dynamik und keine technisch verursachten Unterbrechungen.
JupyterHub-Infrastruktur und Hausaufgaben
Zur Verteilung der Kursmaterialien und als zentrales Infrastrukturelement setzten wir für diesen Kurs einen JupyterHub-Server auf. JupyterHub ermöglichte es uns, den Studierenden eine einheitliche Programmierumgebung zu bieten. Somit blieben die Teilnehmer*innen von der Installation und Konfiguration jeglicher Software verschont und konnten sich über den Browser direkt bei der JupyterHub-Plattform anmelden und mit einer zur Nutzung bereitstehenden Entwicklungsumgebung arbeiten. Gerade bei informatikfremden Studierenden, welche bisher keine Programmiererfahrung sammeln konnten, erspart eine solche Umgebung Studierenden und Lehrenden viel Zeit und Frustration.
Abb. 1 zeigt die Architektur unserer Infrastruktur. Im Gegensatz zu der Installation an der UC Berkeley haben wir aus Gründen des Datenschutzes und der generellen Wartbarkeit darauf verzichtet, unser System auf Kubernetes aufzubauen, da hierbei unser Server von Google hätte gehostet werden müssen. Stattdessen haben wir den Server lokal auf einer Maschine mit 256 GB Hauptspeicher und 28 Kernen dockerbasiert installiert. Hierbei haben wir uns an Erfahrungen der Universität Versailles orientiert, die eine ähnliche Infrastruktur aufgesetzt hat. Eine ausführliche Dokumentation der Installation haben wir online zur Verfügung gestelltFootnote 4.
Auf dem JupyterHub-Server hatte jede*r Studierende Zugriff auf einen isolierten Workspace, an dem die Kursmaterialien, die zentral über ein GitHub Repository bereitgestellt wurden, stets aktualisiert verfügbar waren. Darüber hinaus konnten Studierende hier eigene Notebooks erstellen, um zu experimentieren und die Kursinhalte zu vertiefen.
Während des Semesters veröffentlichten wir außerdem insgesamt sieben digitale Hausaufgabenblätter. Pro Hausaufgabenblatt waren maximal 100 Punkte zu erreichen und um zu der schriftlichen Klausur am Ende des Semesters zugelassen zu werden, waren insgesamt mindestens 50 %, sprich 350 Hausaufgabenpunkte, notwendig. Zu der Abschlussnote des Kurses trugen die Hausaufgabenpunkte jedoch nicht bei. Die Hausaufgabenblätter wurden ebenfalls über unsere JupyterHub-Infrastruktur bereitgestellt und ausgegeben. Hierfür nutzten wir die JupyterHub-Erweiterung „nbgrader“, welche die nötigen Tools zur automatisierten Ausgabe und Kontrolle der Aufgaben ermöglicht.
Durch diese Erweiterung lassen sich Aufgabenblätter mit verschiedenen Arten von Zellen erstellen. Die gewöhnlichen Markdown- und Programmcodezellen, welche auch standardmäßig in Jupyter Notebooks verwendet werden, dienten hier als Bearbeitungsbereich für die konkreten Aufgaben. Darüber hinaus lassen sich auch schreibgeschützte Zellen erstellen, welche wir nutzten, um notwendige Bibliotheken zu importieren, Beispiele für die Studierenden anzuführen und um die Aufgabenstellungen darzustellen. Außerdem lassen sich auch Bewertungszellen einfügen. Diese Zellen sind für die Studierenden nicht sichtbar und enthalten Tests, um die Angaben der Studierenden zu überprüfen. Sie lassen sich zudem mit einer Punktzahl versehen, welche dem Studierenden zugeschrieben wird, sofern alle Tests innerhalb dieser Zelle erfolgreich waren. Nach der Bearbeitungszeit, welche meist 2 Wochen betrug, sammelten wir die Aufgabenblätter mithilfe der „nbgrader“-Erweiterung automatisiert ein und starteten die Bewertungsskripte, welche die Aufgabenblätter ausführten, die darin enthaltenen Bewertungszellen überprüften und die erreichten Punktzahlen den Studierenden gutschrieben.
Diese Methode ersparte uns bei über 1000 Abgaben (7 Hausaufgabenblätter bei ca. 150 Studierenden) sehr viel Korrekturzeit, da die Erstellung der Hausaufgaben und der zugehörigen Tests meist an ein bis zwei Arbeitstagen erledigt waren. Die Studierenden erhielten anschließend ihre korrigierten Hausaufgaben zur Einsicht zurück und konnten diese auch mit einer bereitgestellten Musterlösung vergleichen.
Klausur
Am Ende des Semesters fand schließlich die schriftliche Klausur statt, welche den gesamten Stoff des Semesters prüfte. In der Woche vor der Klausur wurde in der Vorlesung zum einen eine Zusammenfassung über die behandelten Themen gegeben, zum anderen wurden auch noch einige Beispielaufgaben auf Klausurniveau vorgestellt und bearbeitet. In den Übungen wurden in dieser Woche auch noch einmal Wiederholungen angeboten und letzte Fragen geklärt. In der Klausur, welche klassisch mit Stift und Papier zu bearbeiten war, wurden meist nach kurzen Python-Programmen gefragt, welche die theoretischen Konzepte, die in dem Kurs behandelt wurden, anwendeten. Hierfür wurde den Studierenden ein „Spickzettel“ zur Verfügung gestellt, auf dem die wichtigsten Python-Funktionen dokumentiert waren. Obwohl wir von den Studierenden eine gewisse Sorgfalt erwarteten, ahndeten wir nicht jeden Syntaxfehler in den Programmen mit Punktabzug sondern legten viel mehr Wert auf Verständnis und die korrekte Anwendung der Konzepte.
Schlussendlich führten wir den bisher ersten Kurs an der TU Berlin durch, der eine JupyterHub-Infrastruktur zur Lehre einsetzte und wir können hieraus ein positives Fazit ziehen. Die Studierenden konnten auf eine vorbereitete Programmierumgebung zugreifen und benötigten hierfür lediglich einen Browser sowie Internetzugang. Auch ermöglichte uns diese Infrastruktur, die Hausaufgaben der Studierenden automatisiert auszugeben, einzusammeln und zu bewerten. Die Infrastruktur wurde von den Studierenden schnell adaptiert und wir erhielten auch hier sehr positives Feedback.