Die Note für das Modul wird über die eingereichte Hausarbeit gebildet. Dazu wurde vorab eine Projektskizze eingesammelt und die Hausarbeit besteht aus einem Programmierprojekt (Quelltext) sowie einem Projektbericht (PDF).
Geplanter Bearbeitungszeitraum: 4 Wochen, z.B. ca. 28.7. bis 25.8. oder auch 1-2 Wochen später.
Abgabedatum: wird zu Semesterbeginn festgelegt und hier eingetragen. Verbindlich ist der Termin, der in ILIAS und im LSF steht.
Teamgröße: maximal zwei Personen. Eine Abgabe zu zweit ist erlaubt und muss vorher angekündigt werden, damit die Projektskizze entsprechend zugeschnitten werden kann — ein Zweierprojekt darf und soll mehr Umfang haben als ein Einzelprojekt. Beide Matrikelnummern gehören in den Dateinamen des Berichts (siehe formale Kriterien unten), und der Bericht benennt, wer welchen Teil verantwortet hat. Bewertet wird die Arbeit gemeinsam; wenn die Eigenanteile im Bericht nicht erkennbar sind, ist das ein Mangel des Berichts.
Wir bewerten den Programmcode und den Bericht anhand formaler Kriterien und bewerten außerdem, wie viel, wie gut der Plan inhaltlich umgesetzt und beschrieben wurde.
Dabei bekommt eine 2,0 wer die formalen Kriterien im Wesentlichen knapp umgesetzt hat und die in der Projektskizze beschriebene Minimalanforderung ebefalls knapp umgesetzt hat. Wer Teile des ursprünglichen Plans nicht umsetzt, obwohl das möglich gewesen wäre, oder auch gröbere Fehler in der Programmlogik o.ä. hat, kann entsprechend auch leicht eine 3,0 bekommen auch wenn die formalen Kriterien erfüllt sind. Bei Nichterfüllen der formalen Kriterien ist es leicht möglich, durchzufallen, oder aber (bei nur geringen Verstößen und einer sonst guten Arbeit) nur eine 4,0 zu bekommen. Wenn das Projekt die Minimalanforderungen, die geplant waren, erfüllt, aber insgesamt einen sehr geringen Umfang aufweist, kann auch das zu einer 4,0 führen (wenngleich wir das im Vorfeld durch unsere intensive Diskussion der Projektskizzen weitgehend vermieden haben sollten).
Eine 1,0 gibt es, wenn über die Erfüllung der formalen Kriterien und der selbst gesetzten Mindestanforderungen hinaus erfolgreich gearbeitet wurde.
Formale Kriterien Code¶
Alles ist in einem Git Repository, nach Möglichkeit echte Commit History.
Projekt kann bei anderen durch pyproject.toml und eventuellen Installation-guides in einer README.md lauffähig gemacht werden
Es gibt mindestens einen Unit Test und mindestens einen Doctest (die auch nicht fehlschlagen).
es wurde Exception-Handling betrieben oder begründet, warum nicht notwendig
Type-Hints wurden genutzt an mindestens einer Stelle
Beim Ausführen des Type Checkers mypy werden keine oder höchstens ein Fehler angezeigt
Code-Formatierung enspricht einem Style-Guide
der Linter ruff zeigt keine oder einen Hinweise/ Fehler an
Beim Ausführen des Formatters ruff gibt es keine Änderungen mehr oder höchstens ein-zwei sehr kleine
Interrogate zeigt an, dass mindestens 20% des Codes dokumentiert ist
Projekt enthält eine pyproject.toml, in der alle benötigten Abhängigkeiten erfasst werden
auch falsche Nutzereingaben werden behandelt und führen nicht zum Absturz des Programms
Nice-to-have
Alle Variablen und Methoden tragen vollständige Typeninformationen, sodass mypy --strict keine Fehler anzeigt
Beim Ausführen des Linters ruff gibt es keine Warnhinweise
Interrogate zeigt an, dass mindestens 80% des Codes dokumentiert ist und nahezu jede Methode trägt einen Doctest
Auseinandersetzung mit der Möglichkeit, Code von LLMs/Agenten generieren zu lassen
Einsatz von Design-by-Contract oder verwandten Techniken oder auch generell Einsatz der in der Vorlesung (im Skript) besprochenen Techniken wie z.B. auch Profiling.
Formale Kriterien Bericht¶
Dateiname Matrikelnummer_XYZ.pdf mit frei wählbar XYZ (darf Name, Projekttitel o.ä. sein). Bei Teamabgabe beide Matrikelnummern mit “_” getrennt im Dateinamen aufführen.
Seitenzahl 2-12, ideal 6-10, aber Anhang (Appendix) erlaubt. Deckblatt nicht mitgezählt.
Zitierweise (falls zitiert wird): einheitlich, am liebsten [Abckey26] oder [n] im Text. In der Bibliographie entweder nach Zitierreihenfolge oder Erscheinungsjahr.
Quelltext im Bericht verlinken, wenn öffentlich (z.B. GitHub oder Uni-Gitlab), ansonsten vorab in Sciebo-Uploadfolder ein ZIP hochladen.
PDF sollte nicht größer als 20 MB sein.
Eigenständigkeitserklärung (die darauf verweist, dass nur genau die Werkzeuge genutzt wurden, die im Bericht auch erwähnt werden; insb. soll im weiteren Text für KI-Werkzeuge spezifisch der Umfang der Nutzung erklärt werden).
Leicht vermeidbare Fehler¶
Die Kriterien oben sind keine Geschmacksfragen, sondern Prüfpunkte — und genau deshalb ist es schade, wie oft sie an Kleinigkeiten scheitern. Die folgenden acht Punkte sind nach Häufigkeit geordnet, mit der sie in vergangenen Jahrgängen aufgetreten sind. Alle acht kosten weniger als eine halbe Stunde, wenn man sie vor der Abgabe prüft, und alle acht kosten eine Note, wenn man es nicht tut.
Kein Git-Repository. Das ist mit Abstand der häufigste Einzelbefund — rund ein Drittel der Abgaben kam als Ordner oder ZIP ohne Versionsgeschichte. Der Punkt steht als erster in den formalen Kriterien, und er ist der einzige, den man nicht nachträglich erfüllen kann: Eine Commit-Historie lässt sich am Abgabetag nicht erfinden. Legen Sie das Repository am ersten Tag an (Übung 0, Aufgabe 3) und committen Sie in kleinen Schritten weiter.
Tests, die fehlschlagen. Das Kriterium lautet „mindestens ein Unit Test und mindestens ein Doctest (die auch nicht fehlschlagen)". Ein einziger Aufruf von
uv run pytestvor der Abgabe hätte das gezeigt. Wenn ein Test aus einem bekannten Grund scheitert, den Sie nicht beheben können, schreiben Sie diesen Grund in den Bericht — ein erklärter roter Test ist etwas ganz anderes als ein unerwähnter.Mypy-Fehler. Das Kriterium erlaubt höchstens einen. Häufige Ursachen sind nicht Ihre Schuld: eine Bibliothek ohne Typinformationen, oder eine Python-Version, die neuer ist als das Paket-Ökosystem. Genau dann gehört aber beides in die Arbeit — ein
[[tool.mypy.overrides]]-Eintrag mit Begründung in derpyproject.toml(siehe Code-Qualität) und ein Satz im Bericht. Ohne das sieht es aus, als hätten Sie den Checker nie laufen lassen.Ruff-Befunde, die sich selbst beheben. Die tatsächlich gefundenen waren überwiegend Import-Reihenfolge (
I001) und Zeilenlänge (E501) — beides behebtuv run ruff check --fix .in einem Aufruf, gefolgt vonuv run ruff format ..Docstring-Coverage unter der Grenze. 20 % sind Pflicht, und
uv run interrogate -v .sagt Ihnen die Zahl in einer Sekunde. Wer darunter liegt, hat meist gar nicht nachgesehen.Das Projekt läuft nicht aus einem frischen Klon. Typische Ursachen: eine Abhängigkeit fehlt in der
pyproject.toml, ein absoluter Pfad aus dem eigenen Dateisystem, eine Datendatei, die nie eingecheckt wurde. Testen Sie das wirklich — in einem neuen Verzeichnis, nicht in Ihrem Arbeitsordner:git clone <ihr-repo> /tmp/abgabetest && cd /tmp/abgabetest uv sync && uv run <ihr-programm>Bericht ohne Funktionsnachweis. Abschnitt 4 der Gliederung verlangt ihn, und er ist billig: ein Screenshot, ein Terminal-Mitschnitt, die Ausgabe eines Beispieldurchlaufs. Ohne ihn bleibt beim Lesen die Frage offen, ob das Programm überhaupt läuft — und diese Frage schlägt auf die Note durch, auch wenn es in Wahrheit läuft.
Unerklärte Abweichung von der Projektskizze. Von der Skizze abzuweichen ist ausdrücklich erlaubt und oft vernünftig — sie ist nicht verbindlich. Es nicht zu erwähnen ist der Fehler. Ein Absatz in Abschnitt 5 („Abweichung vom ursprünglichen Plan") genügt, und er wird positiv gelesen, wenn er begründet ist.
Die Prüfung, die alles davon abdeckt¶
Führen Sie das am Tag vor der Abgabe aus, nicht am Abgabetag:
git log --oneline | wc -l # gibt es eine Historie, und ist sie plausibel?
uv run ruff check . && uv run ruff format --check .
uv run mypy .
uv run pytest
uv run interrogate -v .Fünf Befehle, zwei Minuten. Sie decken die Punkte 1 bis 5 vollständig ab; Punkt 6 braucht den frischen Klon von oben, und 7 und 8 sind zwei Absätze im Bericht.
Ein Hinweis zur Einordnung: Diese Liste ist kein Katalog von Kleinigkeiten, an denen Arbeiten scheitern sollen. Sie ist das Gegenteil — die formalen Kriterien sind absichtlich mechanisch prüfbar formuliert, damit Sie sie selbst abhaken können, bevor jemand anderes es tut. Der inhaltliche Teil der Bewertung ist der schwierigere, und dort wollen Sie Ihre Zeit verbringen.
Tipps zum Schreiben des Projektberichts:¶
Fangen Sie direkt damit an, nicht erst, wenn Sie etwas programmiert haben.
Fassen Sie sich kurz und vermeiden Sie Adjektive, die Sie nicht begründen können (typisches LLM-Sprech).
Begründen Sie Ihre Entscheidungen (ggf. geben Sie zu, dass Sie willkürlich etwas ausgewählt haben).
Ordnen Sie ein, was leicht ging und was schwer fiel.
Vermeiden Sie es, den Code Zeile für Zeile nachzuerzählen. Erklären Sie stattdessen konzeptionelle Entscheidungen, die Programmlogik und den Umgang mit spezifischen Datenstrukturen.
Ergebnisse visualisieren: Nutzen Sie Outputs, Plots oder Screenshots aus dem Programm, um die Funktionalität im Bericht zu belegen.
Formale Kriterien nochmal lesen und prüfen, ob Code und Bericht diese erfüllen.
Mögliche Gliederung¶
Einleitung
Motivation,
Zielsetzung (Variante der Projektskizze)
Theoretische Grundlagen & Werkzeuge
Technologien,
Bibliotheken,
Welche Pakete/Bibliotheken kamen zum Einsatz?
Mensch vs. KI: Die Rolle von AI Assistance
Konzept & Implementierung
Programmstruktur,
Kernlogik,
Datenverarbeitung
Warum so?
Warum wurde die Software genau so strukturiert (z. B. Wahl bestimmter Entwurfsmuster, OOP-Strukturen oder funktionaler Ansätze)? Welche Alternativen wurden verworfen und warum?
KI-Konsultation bei Design-Entscheidungen: Wurde die KI bereits bei der Planung und Architektur des Projekts um Rat gefragt? Wenn ja, welche Vorschläge der KI wurden übernommen und wo wurde bewusst von der KI-Empfehlung abgewichen, weil menschliche Intuition/Logik besser passte?
Code-Generierung (Was wurde wie programmiert?):
KI-generiert: Welche Module, Funktionen oder Tests wurden maßgeblich mit KI-Unterstützung (z. B. ChatGPT, Copilot) erstellt? Warum war hier der KI-Einsatz sinnvoll (z. B. Boilerplate-Code, Standard-Algorithmen, Regex)?
Selbst programmiert: Welche Kernlogiken, komplexen Workarounds oder spezifischen Features wurden komplett selbst geschrieben? Warum war hier die eigene Programmierleistung notwendig (z. B. weil die KI den Kontext nicht verstand oder zu fehlerhaftem Code neigte)?
Prompt-Engineering & Iteration: Wie sah die Zusammenarbeit mit der KI aus? Wurde Code blind übernommen oder gab es kritische Iterationsschleifen, in denen KI-Fehler (Halluzinationen, veraltete Syntax) manuell korrigiert werden mussten?
Ergebnisse
Funktionsnachweis,
Beispiel-Durchlauf
Diskussion & Fazit
Inwiefern wurde das Ziel erreicht?
Herausforderungen,
Kritische Reflexion,
Abweichung vom ursprünglichen (Implementierungs)Plan?
Kritische Würdigung: Was lief gut, wo gab es unerwartete Probleme (entweder technischer Natur oder in der Zusammenarbeit mit der KI)? Was würde man beim nächsten Mal anders machen?
Ausblick (darf auch subjektiv sein)
Literatur- & Quellenverzeichnis
falls etwas zitierfähiges genutzt wurde (sonst kann das weg)
Anhang (wenn etwas zu lang für den Haupttext ist)
Ggf. Bedienungsanleitung,
ausgewählte Code-Snippets (nichts länger als eine Seite)