Zusammenfassung der Vorlesung: Projektentwicklung und Programmierung in C

Diese Zusammenfassung fasst die wesentlichen Inhalte der Vorlesung zum Systempraktikum und zur Projektentwicklung und Programmierung in C zusammen. Sie richtet sich an Studierende und soll das Lernen unterstützen, indem sie die behandelten Themen strukturiert und verständlich darstellt.


Einführung zur Gruppenphase

Systempraktikum: Überblick

  • Bearbeitung eines Projekts bis zum Ende des Semesters
  • Arbeit in Vierergruppen
  • Wöchentliche Treffen mit dem Tutor der Gruppe (verpflichtend)
  • Notenfindung durch Prüfung am Semesterende

Themen der heutigen Veranstaltung

  • Projektvorstellung
  • Terminübersicht
  • Tipps zur Projektplanung
  • Debugging

Projekt: Spielclient „Mühle“

Quelle

Wikipedia: Mühle (Spiel)

Projektstruktur

  • Vier Meilensteine
  • Vorgegebene Zwischenschritte (Lernziele)
  • Viele Freiheiten bei der Gestaltung
  • Eigene Zeit- und Projektplanung
  • Webinterface des Servers: sysprak.priv.lab.nm.ifi.lmu.de

Gameserver

Verbindung zum Gameserver

  • Der Server ist nur aus dem MWN erreichbar
  • VPN Client: eduVPN
  • SSH-Tunnel:
    ssh -Nf -D 8080 kennung@remote.cip.ifi.lmu.de
  • SOCKS5 Proxy im Browser einrichten
  • Remote am CIP-Pool: SSH Anleitung

Meilensteine des Projekts

Das Projekt ist in vier Meilensteine unterteilt, die die schrittweise Entwicklung und Implementierung sicherstellen.

1. Prologphase des Protokolls

  • Beschreibung: Entwicklung der grundlegenden Kommunikationsphase.
  • Ziele: Sicherstellen, dass die Grundkommunikation zwischen den Prozessen funktioniert.

2. Konfigurationsdatei, Prozesse, Shared Memory

  • Beschreibung: Implementierung der Konfigurationsdatei und Einrichtung des Shared Memory-Systems.
  • Ziele: Der Client soll die Konfiguration korrekt lesen und die Prozesse effizient miteinander kommunizieren lassen.

3. Vollständiges Protokoll und Interprozesskommunikation (IPC)

  • Beschreibung: Entwicklung eines vollständigen Kommunikationsprotokolls und Implementierung der IPC.
  • Ziele: Ermöglichen eines reibungslosen Datenaustauschs und eine sinnvolle Darstellung auf dem Spielfeld.

4. Spiellogik/KI

  • Beschreibung: Entwicklung der Spiellogik und der Künstlichen Intelligenz.
  • Ziele: Verbesserung der Spiellogik, um strategische Entscheidungen zu treffen und nicht nur zufällig zu gewinnen.

Details zu den Meilensteinen: Auf den Aufgabenblättern (siehe „Material“ in Moodle).


Gruppenbildung und Zusammenarbeit

Gruppenfindung

  • Selbstorganisiert in Moodle bis Donnerstag, 14.11. 12:00h
  • Gruppen sollen sich zu viert formieren
  • Exakt eine Abgabe pro Gruppe

Abgabe Meilensteinplanung

  • Deadline: Bis Sonntag, 24.11.
  • Format: Per Email als Text oder PDF an sysprak-admin@nm.ifi.lmu.de
  • Anforderungen: Jede Gruppe muss einen Meilensteinplan im standardisierten Format einreichen.

Tipps für die Zusammenarbeit

  • Regelmäßige Meetings: Treffen mit dem Tutor, um den Fortschritt zu besprechen.
  • Klare Aufgabenverteilung: Jede Gruppe sollte Aufgaben sinnvoll verteilen und bei den zugewiesenen Aufgaben bleiben.
  • Empfehlung: Bei unterschiedlichem Arbeitstempo innerhalb der Gruppe eigene Git-Branches nutzen, um eigenständig Fortschritte zu erzielen, ohne die Gruppe zu behindern.

Empfehlungen für effektive Zusammenarbeit

  • Kommunikation: Offene und regelmäßige Kommunikation innerhalb der Gruppe.
  • Verantwortung: Jeder sollte seine Aufgaben ernst nehmen und zur Gruppenleistung beitragen.
  • Flexibilität: Bei Über- oder Unterforderung sollten alternative Wege wie eigene Branches genutzt werden.

Abgabeanforderungen

Projektabgabe

  • Kompilierbares Projekt: Jede Gruppe muss ein kompilierbares Projekt einreichen, das eine ausführbare Datei erzeugt.
  • Umfang: Das Projekt muss den Anforderungen des Praktikums entsprechen. Ein einfaches “Hello World” ist nicht ausreichend.
  • Format: ZIP-File mit Quellcode, keine Binärdateien.
  • Automatisches Überprüfungsskript: Ein Skript wird bereitgestellt, das die Abgabe auf Speicherverwaltung und funktionale Anforderungen überprüft.

Wichtige Punkte

  • Kompilierung: Das Projekt muss fehlerfrei kompilieren und eine ausführbare Datei erzeugen.
  • Quellcode: Nur der Quellcode wird eingereicht, Binärdateien sind nicht erlaubt.
  • Meilensteinplan: Jede Gruppe muss einen Meilensteinplan im standardisierten Format bis zum 24.11. abgeben.

Bonusregelung

Kriterien für Bonuspunkte

  1. Speicherverwaltung:

    • Keine „memory leaks“ laut Valgrind:
      valgrind --leak-check=full --show-leak-kinds=all --trace-children=yes
    • Keine Fehler: Speicher muss korrekt verwaltet werden (keine noch allokierten Bereiche, die nicht freigegeben wurden).
  2. Stabilität des Clients:

    • Drei Runden fehlerfrei gegen sich selbst spielen: Der Client muss stabil im Turnierbetrieb laufen.

Notenverbesserung

  • Je eine Drittel-Note Verbesserung als Bonus:
    • Implementiertes Projekt: Sollte laut Valgrind keine „memory leaks“ haben.
    • Stabilität im Turnierbetrieb: Drei Runden fehlerfrei gegen sich selbst spielen.

Details zur Bonusvergabe

  • Valgrind: Nutzung von Nalgorithm zur Überprüfung der Speicherverwaltung.
  • Automatische Tests: Das Überprüfungsskript testet die Abgabe auf die genannten Kriterien.

Klausurvorbereitung

Art der Klausur

  • Praktische Programmierklausur am Rechner
  • Dauer: Zweieinhalb Stunden

Vorbereitung

  • Teilnahme am Praktikum: Erleichtert die Klausurvorbereitung.
  • Testphase: Zwei Wochen vor der Klausur wird die Prüfungsumgebung bereitgestellt.
  • Werkzeuge: Nutzung von Standard-Texteditoren, keine speziellen IDEs erforderlich.

Vorbereitungstipps

  • Umgebungscheck: Nutzt die Testphase, um euch mit der Prüfungsumgebung vertraut zu machen.
  • Editor-Wahl: Wählt einen Texteditor, mit dem ihr euch wohlfühlt und effizient arbeiten könnt.
  • Zeitmanagement: Übt das Programmieren unter Zeitdruck, um die zweieinhalb Stunden effektiv zu nutzen.

Grundlagen der Projektentwicklung

Das magische Dreieck

Das magische Dreieck der Projektentwicklung umfasst drei zentrale Faktoren, die miteinander in Balance gehalten werden müssen:

  1. Zeit: Begrenzte Zeit zur Fertigstellung des Projekts.
  2. Umfang: Menge und Qualität der zu entwickelnden Inhalte.
  3. Kosten: Ressourcen wie Zeit, Geld und technische Mittel.

Magisches Dreieck

Projektphasen

  1. Ziele festlegen: Definieren, was das Projekt erreichen soll.
  2. Chancen/Risiken analysieren: Identifikation potenzieller Chancen und Risiken.
  3. Inhalte festlegen: Bestimmung der Projektinhalte und -anforderungen.
  4. Kosten/Zeit schätzen: Abschätzung der benötigten Ressourcen und Zeit.

Ablauf des Projekts in vier Phasen

  1. Definition:

    • Aufgaben/Abläufe/Termine planen
    • Meilensteine festlegen
  2. Planung:

    • Definierte Inhalte umsetzen
    • Ziele erreichen
    • Kontrolle der Zwischenergebnisse
  3. Durchführung:

    • Umsetzung der geplanten Aufgaben
    • Entwicklung des Projekts
  4. Projektabschluss:

    • Review
    • Präsentation der Ergebnisse
    • Endabnahme

Wichtige Aspekte

  • Anforderungsanalyse: Verständnis der Bedürfnisse des Auftraggebers.
  • Risikomanagement: Identifikation und Umgang mit möglichen Risiken.
  • Qualitätssicherung: Sicherstellung der hohen Qualität des Endprodukts.

Kommunikation im Team

Wichtigkeit

Effektive Kommunikation ist entscheidend für den Projekterfolg. Sie fördert die Zusammenarbeit und verhindert Missverständnisse.

Methoden

  • Regelmäßige Meetings: Halten den Fortschritt transparent und ermöglichen schnelle Problemlösungen.
  • Klare Aufgabenverteilung: Jeder kennt seine Verantwortung und trägt zum Gesamterfolg bei.
  • Offene Diskussionen: Fördern Kreativität und helfen, Missverständnisse zu vermeiden.

Kommunikationstechniken

  • Kommentare im Code:
    • Ziele: Erhöhung der Wartbarkeit, Erleichterung der Kommunikation im Team, Förderung des Nachdenkens.
    • Regeln für gute Kommentare:
      • So viel wie nötig, so wenig wie möglich
      • Algorithmen, Designentscheidungen, Zusammenhänge erklären
      • Triviales vermeiden
      • Sprechende Namen helfen, Abschnitte selbsterklärend zu gestalten

Richtlinien für Kommentare

  • Designentscheidungen: Erklärt komplexe Logik und warum bestimmte Entscheidungen getroffen wurden.
  • Vermeiden von Redundanz: Kommentiert nicht offensichtliche Codezeilen.

Beispiele für gute Kommentare

// Warum verwenden wir ein Interface hier anstelle eines konkreten Typs
void initializeGame(GameInterface *game) {
    // Implementierung
}

Was zu vermeiden ist

  • Unklare oder irrelevante Kommentare wie “DoMagic” oder “Blackhole13”.
  • Überflüssige Kommentare, die aus der Funktionssignatur ersichtlich sind.

Testen und Debugging in C

Testmethoden

  • Manuelles Testen: Überprüfung der Verbindung zum Server, Durchführung von Prolog und Spielzügen.
  • Integration Testing: Sicherstellen, dass einzelne Module korrekt miteinander kommunizieren.
  • Randfälle und Extreme: Testen von Speicherfehlern, Pufferüberläufen und Race Conditions.

Debugging-Techniken

  • Breakpoints setzen: Halten an spezifischen Stellen im Code, um den Programmfluss zu überwachen.
  • Step-Into vs. Step-Over:
    • Step-Into: Eintreten in Funktionsaufrufe zur detaillierten Fehleranalyse.
    • Step-Over: Zeilenweises Durchlaufen ohne in Funktionen einzutreten.
  • Backtrace nutzen: Übersicht über den aktuellen Stack-Frame zur Identifikation von Fehlerquellen.

Beispiel Debugging-Sitzung

int main() {
    // Setzen eines Breakpoints hier
    initializeGame(&game);
    return 0;
}

Tools

  • Nalgorithm: Überprüfung der Speicherverwaltung, Identifikation von Speicherlecks und Fehlern.
  • GitLab: Verwaltung der Projektabgaben und Branches.
  • Debugger (z.B. GDB): Werkzeug zur Fehlersuche und Analyse des Programmflusses.

Best Practices

  • Randfälle testen: Überprüft, wie das Programm mit ungewöhnlichen oder extremen Eingaben umgeht.
  • Modular testen: Testet einzelne Module unabhängig, bevor sie integriert werden.
  • Kommentare nutzen: Dokumentiert während des Debuggings, was untersucht wurde und welche Lösungen gefunden wurden.

Praktische Beispiele aus der Vorlesung

Beispiel 1: Insertion Sort Debugging

Während des Debuggings eines Insertion Sort-Algorithmus wurden folgende Schritte durchgeführt:

  1. Breakpoint setzen: In der main-Funktion und in der insert-Funktion.
  2. Programm ausführen: Schrittweise durch den Code gehen, um den Fehler zu identifizieren.
  3. Fehleranalyse: Entdeckung, dass ein Parameter falsch initialisiert wurde (y wurde zu 0 gesetzt statt korrekt aktualisiert).
  4. Korrektur: Anpassung der Parameterübergabe und der Schleifenbedingungen.
void insert(int array[], int size, int value) {
    int i = size - 1;
    while (i >= 0 && array[i] > value) {
        array[i + 1] = array[i];
        i--;
    }
    array[i + 1] = value;
}

Beispiel 2: Speicherfehler erkennen

Durch den Einsatz von Nalgorithm konnten Speicherlecks und doppelte Freigaben identifiziert und behoben werden. Dies gewährleistet eine stabile und effiziente Speicherverwaltung.


Weiterer Ablauf

Notenfindung

  • Durch praktische Abschlussprüfung
  • Termin wird noch bekanntgegeben
  • Voraussetzungen für das Bestehen des Kurses:
    • Das abgegebene Projekt muss sich kompilieren lassen und dem Umfang des Praktikums entsprechen.
    • Bestehen der Abschlussprüfung

Bonusregelung

  • Wer die Abschlussprüfung besteht (Note min. 4,0), kann einen Bonus aus der Gruppenphase erhalten
  • Abgaben im falschen Format verlieren ihre Chance auf Bonus
  • Je eine Drittel-Note Verbesserung als Bonus für:
    1. Implementiertes Projekt hat laut Valgrind keine „memory leaks“ (still reachable ist ein leak) & keine Fehler:
      valgrind --leak-check=full --show-leak-kinds=all --trace-children=yes
    2. Ihr Client kann drei Runden fehlerfrei gegen sich selbst spielen

Termine

  • Gruppenfindung: Selbstorganisiert in Moodle bis Donnerstag, 14.11. 12:00h
  • Abgabe Meilensteinplanung: Bis Sonntag, 24.11. Per Email als Text oder PDF an sysprak-admin@nm.ifi.lmu.de – exakt eine Abgabe pro Gruppe
  • Zwischenstandspräsentationen:
  • Projektabgabe: Sonntag, 09.02.

Zusammenfassung

Diese Vorlesung hat die wesentlichen Aspekte der Projektentwicklung und Programmierung in C behandelt, einschließlich der Planung und Umsetzung von Projekten, effektiver Teamkommunikation sowie Test- und Debugging-Strategien. Die Einhaltung der Meilensteine und Abgabeanforderungen ist entscheidend für den Erfolg im Kurs und die Vorbereitung auf die abschließende Klausur.

Wichtige Takeaways

  • Strukturierte Planung: Meilensteine und klare Aufgabenverteilung fördern den Projekterfolg.
  • Effektive Kommunikation: Regelmäßige Abstimmungen und transparente Kommunikation verhindern Missverständnisse.
  • Gründliches Testen: Umfassende Tests und Debugging sichern die Qualität und Stabilität des Projekts.
  • Dokumentation: Gute Kommentare und Dokumentationen erleichtern die Wartung und Erweiterung des Codes.