Wie man seine eigene Programmier-Arena baut — Ein Blick in den omegaUp-Codebase
Stellen Sie sich vor, Sie müssen eine Programmier-Olympiade für mehrere tausend Teilnehmer organisieren. Es reicht nicht aus, einfach nur Aufgaben zu erstellen — Sie brauchen einen Ort, um Lösungen zu empfangen, sie in Echtzeit zu überprüfen, die Last zu überwachen und sicherzustellen, dass niemand den Server mit bösartigem Code zum Absturz bringt. Kommt Ihnen das bekannt vor?
Genau dafür gibt es omegaUp — eine Open-Source-Plattform, die aus einer Bildungsinitiative in Lateinamerika hervorgegangen ist und sich zu einem leistungsstarken Tool für die Durchführung von Wettbewerben und das Lehren von Algorithmen entwickelt hat. Heute werfen wir einen Blick „unter die Haube" dieses Projekts und finden heraus, warum es nicht nur für Informatiklehrer interessant sein könnte, sondern auch für professionelle Entwickler.
Was ist omegaUp?
Kurz gesagt, es ist ein vollwertiges Ökosystem für die automatische Bewertung von Programmieraufgaben (Online Judge). Das Projekt löst zwei Hauptprobleme:
- Automatisierung: Lehrer müssen nicht mehr hunderte von Codelistings manuell überprüfen. Das System kompiliert den Code, führt ihn durch Tests und vergibt automatisch Punkte.
- Sicherheit: Den Code anderer auszuführen ist immer ein Risiko. omegaUp verwendet fortschrittliche Isolierungsmechanismen, um sicherzustellen, dass der Code eines Teilnehmers nicht aus der „Sandbox" entkommen kann.
Das Projekt ist seit vielen Jahren auf GitHub vertreten, hat eine beeindruckende Community aufgebaut und unterstützt mehrere Programmiersprachen, darunter die Olympiaden-Klassiker: C++, Java, Python.
Unter der Haube: Architektonische Details
Das Projekt ist in mehrere Schlüsselkomponenten unterteilt. Es ist kein gefürchteter Monolith, sondern ein modulares System.
1. Frontend und API (Hauptrepository)
Das Hauptrepository enthält die Logik für die Verwaltung von Benutzern, Aufgaben und Wettbewerben.
- Back-end: Geschrieben in PHP. Entwickler verwenden die DAO- (Data Access Objects) und VO-Muster (Value Objects), was die Arbeit mit der Datenbank vorhersehbar und strukturiert macht. Alle Controller befinden sich im Ordner
frontend/server/src/Controllers. - Internationalisierung: Das Projekt unterstützt Spanisch, Englisch und Portugiesisch. Wenn Sie schon immer herausfinden wollten, wie man
i18nin einem großen Projekt richtig organisiert, werfen Sie einen Blick auffrontend/templates.
2. Das Herz des Systems — Grader (Quark-Projekt)
Das Interessanteste passiert in einem separaten Dienst namens Quark. Hier wird die Warteschlange der eingereichten Lösungen verwaltet. Er ist dafür verantwortlich, dass jede Aufgabe rechtzeitig bewertet wird und die Ergebnisse an den Benutzer übermittelt werden.
3. Sicherheit — omegajail
Wie führt man eine „Black Box" mit Code aus, damit sie nicht die Datenbank löscht? omegaUp verwendet omegajail. Dies ist ein Mechanismus, der auf Linux-Containern und seccomp-bpf basiert. Interessante Tatsache: Er basiert auf Arbeit aus dem Chromium-Projekt (Google). Das System begrenzt streng Systemaufrufe, Speicher und Ausführungszeit.
Warum sollten Entwickler auf dieses Projekt achten?
Auch wenn Sie nicht vorhaben, Ihren eigenen LeetCode-Klon zu starten, gibt es viel vom omegaUp-Codebase zu lernen:
- Arbeit mit interaktiven Aufgaben: Dank der Bibliothek
libinteractiveermöglicht die Plattform die Erstellung von Aufgaben, bei denen der Benutzercode in Echtzeit mit dem Jury-Programm interagieren muss. Dies ist wesentlich komplexer als nur Textdateien beim Output zu vergleichen. - Testorganisation: Das Projekt nutzt aktiv
yarn test. Sie können sehen, wie man ein komplexes System mit vielen Abhängigkeiten mit Tests abdeckt. - Skalierbarkeit: Das System ist darauf ausgelegt, Spitzenlasten während großer Wettbewerbe zu bewältigen.
Wie führt man das Projekt lokal aus?
Die Entwickler haben eine ausgezeichnete Bereitstellungsanleitung vorbereitet. Für einen schnellen Start benötigen Sie den Standard-Toolkit: git, yarn und etwas Geduld für das Kompilieren von Submodulen.
# Клонируем со всеми внутренними зависимостями
git clone --recurse-submodules https://github.com/omegaup/omegaup
cd omegaup
# Если забыли про субмодули при клонировании:
git submodule update --init --recursive
# Установка зависимостей
yarn install
yarn test
Praktischer Nutzen: Wo kann man dies einsetzen?
- In Ihrem Unternehmen: Für die Durchführung interner Hackathons oder die Bewertung von Kandidatenfähigkeiten. Ihre eigene Plattform gibt Ihnen die volle Kontrolle über Daten und Aufgaben.
- Bildung: Wenn Sie Kurse unterrichten oder an einer Universität arbeiten, ist omegaUp eine schlüsselfertige Lösung, die Sie von Routinearbeit befreit.
- Open-Source-Beitrag: Es gibt über 800 offene Issues im Repository. Das Projekt ist offen für Mitwirkende, und es ist eine großartige Gelegenheit, an einem wirklich gefragten Produkt zu arbeiten, das von Zehntausenden von Menschen genutzt wird.
omegaUp ist nicht nur „eine weitere Seite mit Aufgaben". Es ist ein ausgereiftes Engineering-Projekt, das zeigt, wie man sichere und hochlastfähige Systeme für die Codeausführung baut. Wenn Sie sich für Compiler, Linux-Prozessisolierung interessieren oder einfach eine qualitativ hochwertige Implementierung der PHP-Architektur sehen möchten — dieses Repository verdient definitiv einen Platz in Ihren GitHub-Sternen.
Bereit, sich als Olympiaden-Systemarchitekt zu versuchen? Beginnen Sie mit der Dokumentation zur Umgebungseinrichtung.
Ähnliche Projekte
