Eine Python-Übung stellen, die Ihre Klasse im Browser ausführt
Eine Programmieraufgabe besteht aus einer Datei, einigen Worten, die erklären, was zu tun ist, und optional Tests, die sagen, ob sie funktioniert. Sie schreiben sie einmal und weisen sie so vielen Klassen zu, wie Sie möchten; alle Lernenden erhalten ihre eigene Kopie zum Ausprobieren und Kaputtmachen. Alles hier gilt auch für Java-, Go-, Node-, TypeScript-auf-Node- und Bash-Aufgaben, und die Seite zu den Sprachen sagt, wo sie sich unterscheiden.
Die Übung schreiben
Klicken Sie im Modul auf „Neue Aufgabe“, wählen Sie die Karte „Python“, und Sie erhalten einen Editor mit dem Startcode auf der einen und den Anweisungen auf der anderen Seite. Die Anweisungen unterstützen Überschriften, Listen und Code, damit ein Beispiel wie ein Beispiel aussieht.
Was Sie in der Datei lassen, ist der Ausgangspunkt jeder lernenden Person: ein Gerüst mit einem Docstring, eine halbfertige Funktion oder eine leere Datei.
- Die Aufgabe hinzufügen. Klicken Sie auf dem Tab „Aufgaben“ des Moduls auf „Neue Aufgabe“, und die Karten öffnen sich direkt darunter, eine für jede Art, gruppiert unter „Code“, „Diagramm“, „Quiz“ und „Lab“, sodass auch ein Quiz oder ein Lab nur einen Klick entfernt ist, sobald die Gruppe gewählt ist; Esc oder „Schließen“ räumt sie weg. Ein Modul ohne Aufgaben zeigt die Karten sofort. Klicken Sie auf die Karte „Python“, und die Aufgabe öffnet sich als untitled-python; benennen Sie sie jederzeit mit dem Stift neben ihrem Namen oben im Editor. Die Seite „Aufgaben“ hat dieselben Karten, wobei Sie zuerst Kurs und Modul wählen: nützlich, wenn Sie wissen, was Sie schreiben möchten, bevor Sie entschieden haben, in welches Modul es gehört.
- Den Startcode schreiben. Das, was alle Lernenden beim ersten Mal öffnen.
- Die Anweisungen schreiben. Was von ihnen verlangt wird, neben dem Code und nicht auf einem Handout.
- Zuweisen. Wählen Sie die Lernenden oder die ganze Klasse. Alle erhalten ihre eigene Kopie.

Tests hinzufügen, die für Sie bewerten
Sie können jeder Aufgabe, die ein Programm ausführt, Tests beifügen: pytest für Python, JUnit 5 für Java, go test für Go und den eigenen Test-Runner von Node für JavaScript und TypeScript. Ein Bash-Test ist ein Skript, das besteht, wenn es ohne Fehler endet. Lernende klicken auf „Tests ausführen“ und sehen, welche bestanden haben; Sie sehen dasselbe Ergebnis auf ihrer Seite, ohne sie zu fragen.
Tests können versteckt sein, was bei einer Prüfung der Sinn ist: Die Lernenden sehen, dass vier von sechs bestanden haben, nicht die Assertions, die fehlgeschlagen sind, die Übung bleibt also die Übung.
Versteckt heißt nicht, dass Lernende keine Möglichkeit haben, ihre Arbeit zu prüfen. Ihr Tab „Tests“ ist dann ein leeres Feld, das ihnen gehört und mit ihrer Kopie gespeichert wird, mit zwei Schaltflächen: „Meine Tests ausführen“ führt ihr Programm gegen dieses Feld aus und hält nichts fest, und „Versteckte Tests ausführen“ führt Ihre aus, woher das Bestanden oder Nicht bestanden in ihrer Aufgabenliste kommt. Ihre eigenen Tests können dieses Ergebnis nie ändern, und die Pakete der Aufgabe werden für beide installiert. Zeigen Sie Ihre Tests später, ersetzen sie das Feld der Lernenden, sobald diese Person die Aufgabe das nächste Mal öffnet.
Eine Datendatei mitgeben, wenn sie gebraucht wird
Eine Aufgabe kann eine Datendatei mitführen, die das Programm liest, eine CSV mit Messwerten oder eine Textdatei, in der Wörter gezählt werden. Sie liegt beim Ausführen neben dem Code, sodass `open('data.csv')` tut, was es sagt.
Sie muss reiner Text sein, was die Plattform durch Lesen der Datei entscheidet und nicht dadurch, dass sie dem Namen traut: Ein in data.csv umbenanntes Bild wird abgelehnt, und eine Textdatei ohne Endung wird angenommen. Eine Byte-Order-Mark, die Excel an den Anfang jeder exportierten CSV schreibt, wird entfernt, damit die erste Zeile sauber gelesen wird. Lernende können in ihrer eigenen Kopie neben Ihrer eine eigene Datendatei anhängen: jeweils eine, das Anhängen einer weiteren ersetzt sie, und ihr Name muss sich von Ihrem unterscheiden. Eine Datendatei ist höchstens 64 KB groß.
Mehr als eine Datei geben
Eine Programmieraufgabe muss nicht aus einer einzigen Datei bestehen. Ihre Dateien sind ein Baum neben dem Editor: „Neue Datei“ und „Neuer Ordner“ legen eine an, „Hochladen“ bringt Textdateien von Ihrem Rechner, und „Umbenennen oder verschieben“ nimmt einen ganzen Pfad, sodass lib/helpers.py eine Datei in einen Ordner namens lib legt und das Programm sie von dort importiert. Eine Aufgabe fasst bis zu 50 Dateien mit je bis zu 64 KB, insgesamt 1 MB, und nur Text: Ein Upload wird durch Lesen geprüft, ein in data.csv umbenanntes Bild wird also abgelehnt. Jede Datei öffnet sich in ihrer eigenen Sprache, README.md ist also Markdown und eine .csv reiner Text.
Das Programm ist die Datei mit dem Vermerk „Ausführen“ beginnt hier, und Sie können es auch umbenennen oder in einen Ordner verschieben. Seine Endung bleibt die der Sprache, und ein Java-, C#-, Haskell- oder Kotlin-Programm behält seinen Namen, wohin es auch geht. „Entfernen“ nimmt eine Datei sofort weg, mit „Rückgängig“ daneben für einige Sekunden. Ein Ordner existiert, solange eine Datei darin liegt, ein neuer Ordner beginnt also mit seiner ersten Datei. Im Baum wechseln die Pfeiltasten zwischen Dateien und öffnen und schließen Ordner, die Eingabetaste öffnet eine Datei, F2 benennt sie um und Entf entfernt sie.
Beim Zuweisen der Aufgabe wird jede Datei an alle Lernenden kopiert, die denselben Baum sehen und in ihrer Kopie jede Datei bearbeiten können. Eigene Dateien hinzufügen können sie nur, wenn die Aufgabe mehr als eine Datei erlaubt, und die Dateien, die Sie ihnen gegeben haben, behalten ihre Namen. Übungsdateien und die Testumgebungen haben denselben Baum. Es gibt weiterhin genau eine Testdatei und eine Paketliste, die eine Datei ganz oben im Baum ist, gekennzeichnet mit „Pakete“, beschrieben unter „Jede Sprache, in der eine Aufgabe gestellt werden kann“. Einer Webseite und einer SQL-Aufgabe lassen sich keine zusätzlichen Dateien geben, denn ihre Bereiche sind das, woraus sie bestehen. Für eine Übung, die eine Datei bleiben muss, entfernen Sie das Häkchen bei „Mehr als eine Datei“ auf dem Einstellungs-Tab der Aufgabe; die vorhandenen Dateien bleiben und lassen sich weiterhin umbenennen und verschieben.
Projekte mit Ordnern und die echten Paketdateien, die sie verwenden, haben in diesem Handbuch eigene Seiten, ebenso das Laden einer ganzen Aufgabe aus einem Git-Repository.
Ein Notebook, für Data Science
Wählen Sie beim Anlegen einer Aufgabe „Notebook“, und Sie erhalten ein Jupyter-Notebook: Zellen mit Text und Zellen mit Python, in einer Datei, die sich in Jupyter, VS Code oder Colab öffnet. Sie fügen Zellen hinzu, verschieben und entfernen sie und bearbeiten eine Textzelle in Markdown.
„Ausführen“ führt alle Code-Zellen von oben nach unten in einem sauberen Prozess aus und zeigt die Ausgabe jeder Zelle darunter: ausgegebenen Text, den Wert ihrer letzten Zeile, eine Tabelle aus pandas und eine Abbildung aus matplotlib. Die Zellen teilen ihre Variablen wie in Jupyter, aber zwischen den Klicks bleibt nichts erhalten, sodass das, was Lernende sehen, das ist, was das Notebook wirklich tut. Schlägt eine Zelle fehl, hält die Ausführung dort an, nennt die Zelle und die Zeile und sagt, dass die folgenden Zellen nicht ausgeführt wurden.
Gespeichert werden die Zellen und nie ihre Ausgaben, sodass ein Notebook kein Ergebnis zeigen kann, das sein Code nicht mehr erzeugt. Ein neues Notebook deklariert pandas, numpy und matplotlib in requirements.txt, ganz oben in seinem Dateibaum; entfernen Sie, was die Aufgabe nicht braucht, denn jedes Paket verlangsamt die erste Ausführung. Eine Aufgabe mit Paketen erhält mindestens 30 Sekunden zum Ausführen, sofern Sie nicht selbst ein Limit setzen.
Versteckte Tests funktionieren wie bei einem Programm: Die Code-Zellen werden zu einer Python-Datei zusammengefügt, und Ihre Tests rufen die eigenen Funktionen des Notebooks beim Namen auf. Abgabe, Bewertung, Gruppen, Zeitlimits und der Rest sind wie bei jedem Programm.
Sie können auch jeweils eine Zelle ausführen. Jede Code-Zelle hat ihr eigenes „Ausführen“, und Umschalt+Eingabetaste führt die Zelle aus und springt zur nächsten. Ein Live-Kernel behält die Variablen zwischen den Zellen, sodass Sie in einer Zelle Daten laden und in der nächsten verwenden können, ohne sie erneut zu laden; „Alle ausführen“ führt jede Code-Zelle der Reihe nach aus, und „Kernel neu starten“ vergisst alles und beginnt sauber. Das „Ausführen“ der Seite selbst ist anders: Es beginnt immer bei null und führt das ganze Notebook aus, was die Prüfung ist, dass es sich von oben reproduzieren lässt. Ein Kernel hält nach 15 Minuten ohne Nutzung an, oder wenn eine Zelle länger als eine Minute läuft oder zu viel Speicher braucht, und die Zelle sagt das, und die nächste startet einen sauberen Kernel. `input()` in einer Zelle schlägt in dieser Zelle fehl, und andere Zeilen, die mit `%` oder `!` beginnen, werden ausgelassen, und das wird gesagt. `%pip install name==1.2.3` installiert genau eine Version eines Pakets aus der freigegebenen Liste; ein Paket lässt sich einem laufenden Kernel nicht hinzufügen, daher startet es den Kernel neu, und die Variablen aus früheren Zellen sind weg, bis Sie sie erneut ausführen. Ein Paket, das alle Lernenden brauchen, gehört stattdessen in requirements.txt. „Unterbrechen“ stoppt eine laufende Zelle und behält den Kernel und seine Variablen, und eine pandas-Tabelle wird als Tabelle dargestellt.
Um ein vorhandenes Notebook zu übernehmen, klicken Sie auf „.ipynb importieren“ und wählen die Datei: Ihre Zellen ersetzen die auf der Seite („Verlauf“ stellt die frühere Version wieder her), ihre gespeicherten Ausgaben werden nicht übernommen, und ein Notebook für eine andere Sprache oder eines mit über 200 Zellen oder 60 KB ohne Ausgaben wird mit der Begründung abgelehnt. „.ipynb exportieren“ lädt das Notebook für Jupyter, VS Code oder Colab herunter, mit dem, was die Zellen in diesem Moment zeigen.
Für Gruppen stellen
Eine Aufgabe kann statt für Einzelne für Gruppen gestellt werden. Jede Gruppe erhält eine Kopie, die alle darin bearbeiten und abgeben können, und die Punktzahl gehört der Gruppe. Sie bilden die Gruppen auf dem Tab „Personen“ der Aufgabe unter „Gruppen“: automatisch, aus allen im Modul oder aus allen, die gerade online sind, oder von Hand, indem Sie jede lernende Person unter die Überschrift ihrer Gruppe verschieben. Es wird beim Ändern gespeichert.
Eine Gruppenaufgabe wird nur über eine Gruppe gehalten, das Zuweisen an jemanden ohne Gruppe wird also abgelehnt, und die Meldung nennt die Person. Eine Aufgabe, die bereits einzelnen Personen zugewiesen wurde, kann erst zur Gruppenarbeit werden, wenn Sie sie davon herunternehmen, und das Feld sagt das. Ein Quiz kann keine Gruppenarbeit sein.
In einer Datei tippt immer nur eine Person: Sie erscheint den übrigen der Gruppe als ihre, schreibgeschützt und mit ihrem Namen, während die anderen Dateien der Aufgabe bearbeitbar bleiben, und ein zugeklappter Laptop gibt die Datei etwa eine Minute später frei. Für eine Gruppenaufgabe wird nichts pro Person gespeichert, es gibt also keine getrennte Kopie, Punktzahl oder Aufzeichnung, wer sie geöffnet hat, und eine Fristverlängerung für ein Mitglied gilt für die ganze Gruppe.
Ein Zeitlimit setzen, wenn Sie eines möchten
Jede Aufgabe kann ein Zeitlimit haben: Setzen Sie auf dem Einstellungs-Tab der Aufgabe das Häkchen bei „Ein Zeitlimit setzen“ und legen Sie die Minuten fest, bis zu vier Stunden. Die Uhr startet, wenn jede lernende Person die Aufgabe zum ersten Mal öffnet, und wird von der Plattform geführt, ein Neuladen oder gelöschte Cookies starten sie also nicht neu, und wenn Sie ihre Arbeit zum Bewerten öffnen, startet keine.
Sie wählen, was Ablaufen bedeutet, und die beiden Möglichkeiten sind ein Vermerk in den Unterlagen, dass sie darüber lagen, oder dass die Arbeit tatsächlich angehalten wird. Ohne Häkchen wird das Überschreiten den Lernenden und Ihnen angezeigt, und nichts wird abgelehnt; setzen Sie das Häkchen bei „Die Arbeit beenden, sobald die Zeit abgelaufen ist“, enden Speichern und Abgabe zu diesem Zeitpunkt, wobei ein Quiz immer angenommen und bewertet wird, wie spät es auch ankommt. In beiden Fällen geht kein getippter Text verloren, denn der Editor speichert eine Sekunde nach dem letzten Tastenanschlag.
Wird Arbeit zurückgegeben, erhalten Lernende eine neue Uhr. Jede Aufgabenliste, die der Lernenden und die Ihres Moduls, zeigt ein Abzeichen „Zeitlich begrenzt“ mit den Minuten, bevor jemand die Aufgabe öffnet, denn das Öffnen startet die Uhr.
Wie lange eine Ausführung dauern darf
Das ist etwas anderes als das Zeitlimit: Es ist die Dauer, die ein Klick auf „Ausführen“ oder ein Testlauf dauern darf, bevor das Programm angehalten wird. Ohne Änderung sind es 10 Sekunden für Python, Bash, Node und SQL und 20 für Java, Go und TypeScript auf Node, die zuerst kompiliert werden müssen. Eine Go-, Java- oder TypeScript-Aufgabe, die Pakete deklariert, erhält 45, damit eine erste Ausführung Zeit hat, sie zu laden und zu bauen.
Um es zu ändern, legen Sie auf dem Einstellungs-Tab der Aufgabe „Wie lange sie laufen darf“ in Sekunden fest, bis zu 60; 0 behält den Standard oben bei. Ein kürzeres Limit als der Standard ist erlaubt, „lass das in zwei Sekunden fertig werden“ ist also eine faire Übung, und ein Wert über 60 wird abgelehnt und nicht stillschweigend gesenkt. Lernende können keine Sekunde mehr verlangen, als die Aufgabe erlaubt.
Eine Ausführung, die wegen der Zeit angehalten wird, sagt das und behält, was sie bis dahin ausgegeben hatte. Die Standardeingabe ist ein Feld unter dem Code, bis zu 16 KB, und ein Programm, das viel zu viel ausgibt, wird in der Ausgabe abgeschnitten, mit einem Hinweis darauf.
Wo alles zu einer Aufgabe liegt
Eine Aufgabe hat vier Tabs. Im „Aufgaben-Editor“ schreiben Sie sie. „Aufgabeneinstellungen“ enthält, was Lernende sehen und ändern dürfen, wie lange sie laufen darf, „KI fragen“, das Zeitlimit, das Fälligkeitsdatum und die Bewertung. „Status“ zeigt, wer sie hat und wie es läuft, und „Personen“ zeigt, für wen sie ist, ihre Eigentümer und, bei Gruppenarbeit, die Gruppen.
Nichts hier hat eine Schaltfläche „Speichern“
Jede Einstellung speichert sich einen Moment nach der Änderung selbst und zeigt „Gespeichert“ neben dem Feld, zu dem sie gehört. Das gilt für die ganze Plattform und nicht nur für diese Seite: die Einstellungen einer Aufgabe, eines Moduls, die Angaben und der Tarif Ihrer Einrichtung, die Quiz-Editoren und der Verfügbarkeitskalender einer Gastgeberin oder eines Gastgebers.
Ein Wert, den die Plattform nicht annimmt, wird beim Tippen neben dem Feld abgelehnt, und nichts wird gesendet, bis es etwas ist, das gespeichert werden kann. Ein Feld mit einer Grenze sagt Ihnen beim Annähern, wie viel Platz noch bleibt, statt das nächste Zeichen stillschweigend abzulehnen.
Die einzige Stelle, an der noch eine Schaltfläche gedrückt wird, ist dort, wo das Drücken jemand anderen erreicht. Das Speichern eines Angebots lädt die Kundschaft ein, die darin neu angekreuzt wurde, und das lässt sich nicht zurücknehmen, es ist also eine Entscheidung und keine Pause beim Tippen.
Häufige Fragen
- Können Lernende die Tests sehen?
- Nur wenn Sie es erlauben, mit „Tests für Lernende sichtbar“ auf dem Einstellungs-Tab der Aufgabe. Versteckte Tests melden eine Zahl und sonst nichts, was Sie für eine Prüfung wollen, und Lernende können in ihrem Tab „Tests“ weiterhin eigene Tests schreiben; sichtbare Tests sind besser zum Üben, denn einen fehlschlagenden Test zu lesen, ist eine Fähigkeit.
- Brauchen Lernende Python auf dem Rechner?
- Nein. Der Code läuft auf unseren Maschinen, jedes Mal in einem frischen Container.
- Kann ich eine Übung mit der Klasse des nächsten Jahres wiederverwenden?
- Ja. Eine Aufgabe gehört der Person, die sie geschrieben hat, und nicht dem Modul, Sie können also dieselbe erneut zuweisen oder einer anderen Lehrkraft anbieten.
- Wie lange darf ein Programm laufen?
- Standardmäßig zehn Sekunden, zwanzig für Java, Go und TypeScript auf Node, und bis zu einer Minute, wenn Sie es in der Aufgabe erhöhen.