Programmier Lern Plattform
Im Rahmen eines universitären Abschlussprojekts vor meiner Bachelorarbeit habe ich eine Full-Stack-Plattform für die Programmierausbildung konzipiert und entwickelt, die auch das Thema meiner Bachelorarbeit darstellt. Die Plattform dient als spezielle Übungsumgebung für die Einführungskurse in die Programmierung an der Universität und bietet ähnliche Funktionen wie Plattformen wie LeetCode oder HackerRank, ist jedoch speziell auf den Lehrplan und die Lernziele der Kurse zugeschnitten.

Übersicht
Die Plattform ermöglicht es den Studierenden, Programmieraufgaben direkt im Browser mithilfe einer integrierten Entwicklungsumgebung zu lösen. Die Aufgabenbeschreibungen werden neben einem Code-Editor angezeigt, sodass die Studierenden Lösungen schreiben und diese anhand benutzerdefinierter Testfälle ausführen können. Die Eingabedaten werden über die Standardeingabe bereitgestellt, und die Programmausgabe wird automatisch mit einer Referenzimplementierung verglichen.
Zwar basiert die aktuelle Übungsreihe auf C++, doch wurde die Architektur so konzipiert, dass sie mit minimalen Änderungen auch weitere Programmiersprachen unterstützt.
Bei der Entwicklung wurden Konzepte des Requirements Engineering angewendet. So wurde beispielsweise eine User-Story-Map erstellt, in der die Personas, Aktivitäten, Epics und User Stories zusammen mit ihren Akzeptanzkriterien dargestellt sind. Die User Stories wurden als Aufgaben im Backlog behandelt und im Laufe dieses elfwöchigen Projekts einzelnen Meilensteinen zugeordnet.

Automatisierte Code-Auswertung
Eine spezielle Ausführungs-Pipeline übernimmt die Kompilierung, Validierung und das Testen der von den Benutzern eingereichten Lösungen.
Vor der Ausführung durchlaufen die Lösungen eine Validierungsphase, in der aufgabenspezifische Anforderungen durchgesetzt werden können, darunter:
- Erkennung verbotener Header, Funktionen oder Sprachmerkmale
- Überprüfung der erforderlichen Funktionen
- Validierung von Funktionsnamen, Rückgabetypen und Parameteranzahlen
- Durchsetzung aufgabenspezifischer Codierungsbeschränkungen
Bei Testläufen werden sowohl die Lösung des Studierenden als auch eine Referenzimplementierung in isolierten Umgebungen kompiliert und anhand der bereitgestellten Eingabe ausgeführt. Die resultierenden Ausgaben werden automatisch verglichen.
Studierende können Lösungen auch offiziell einreichen, die anhand verdeckter Testfälle bewertet werden, um festzustellen, ob die Übung abgeschlossen wurde. Alle Einreichungen werden gespeichert und mit dem Konto des Studierenden verknüpft, sodass der Fortschritt verfolgt und überprüft werden kann.

Benutzerrollen und Verwaltung
Die Plattform nutzt ein rollenbasiertes Zugriffsmodell, das folgende Rollen umfasst:
- Studierende – Lösen Aufgaben, führen Tests durch und reichen Lösungen ein
- Betreuer – Überprüfen die Profile der Studierenden und deren Einreichungsverlauf
- Administratoren – Verwalten Aufgaben, Benutzer und die Plattformkonfiguration
Die Authentifizierung erfolgt über eine JWT-basierte Autorisierung, wobei die Benutzerrollen direkt in die Token-Nutzlast eingebettet sind.

Verteilte System-Architektur
Das Backend besteht aus mehreren containerisierten Diensten, die ausschließlich über ein internes Docker-Netzwerk miteinander kommunizieren.
Kernkomponenten
- Reverse-Proxy für TLS-Terminierung und externen Zugriff
- Node.js/Express-API-Server, geschrieben in TypeScript
- React-Frontend, geschrieben in TypeScript mit Tailwind CSS
- PostgreSQL-Datenbank für Benutzer-, Übungs- und Einreichungsdaten
- Redis-Warteschlange für die asynchrone Jobverteilung
- Go-basierte Runner-Dienste, die für die Orchestrierung isolierter Kompilierungs- und Ausführungsumgebungen zuständig sind
Nur der Reverse-Proxy ist nach außen hin zugänglich, während alle anderen Dienste innerhalb des internen Netzwerks isoliert bleiben, wodurch die Angriffsfläche der Plattform verringert wird.


Offline-First-Desktop-Erlebnis
Ein wesentliches Unterscheidungsmerkmal gegenüber bestehenden Programmierplattformen ist die Möglichkeit, offline zu arbeiten.
Die Plattform umfasst herunterladbare ausführbare Dateien für verschiedene Betriebssysteme, die Übungen vom zentralen Server synchronisieren. Die Studierenden können die Übungen auch ohne Internetverbindung mithilfe eines lokal installierten Compilers weiter bearbeiten und überprüfen.
Die Desktop-Anwendung gewährleistet die gleiche Funktionalität wie die Webversion, indem sie einen lokalen Webserver betreibt und über den Browser dieselbe Benutzeroberfläche anzeigt. Abgeschlossene Übermittlungen werden mit der zentralen Plattform synchronisiert, sobald die Verbindung wiederhergestellt ist.
Der Offline-Client vereint:
- einen lokalen API-Server
- einen lokalen Ausführungs-Runner
- die Logik zur Synchronisierung der Übungen
- die Authentifizierung und die Verarbeitung von Einsendungen
in einer einzigen Go-Anwendung.

Technologien
Frontend
- TypeScript
- React
- Tailwind CSS
Backend
- Node.js
- Express
- TypeScript
- Go
Infrastruktur
- Docker
- Redis
- PostgreSQL
- Reverse-Proxy mit TLS
Authentifizierung und Sicherheit
- JWT-basierte Authentifizierung
- Rollenbasierte Autorisierung
- Containerisolierte Codeausführung
- Interne Dienstkommunikation über Docker-Netzwerkfunktionen
Wichtigste Erfolge
- Konzeption und Umsetzung einer kompletten Lernplattform von Grund auf
- Aufbau eines sicheren, verteilten Systems zur Code-Ausführung unter Verwendung isolierter Container
- Entwicklung automatisierter Validierungs- und Benotungsabläufe für Programmierübungen
- Implementierung rollenbasierter Verwaltungs- und Überwachungsfunktionen
- Erstellung eines Offline-fähigen Clients mit nahtloser Synchronisation mit der zentralen Plattform
- Aufbau einer skalierbaren Architektur, die für die zukünftige Unterstützung mehrerer Sprachen geeignet ist