Als Jugendgruppenleiter engagiere ich mich ehrenamtlich und organisierte so mit anderen zusammen das Sommerlager meiner Jugendgruppe mit immerhin über 180 Teilnehmern.
Letztes Jahr kam mir die Idee die dort stattfindenden Arbeitskreise, zwischen welchen die Teilnehmer wählen können automatisch zuzuweisen. Hieraus wuchs dann nach und nach eine komplette Verwaltungssoftware zur Durchführung von Jugendfahrten mit (fast) allem was man dafür benötigt:
- Checkin-System für Reisebusse
- Zimmereinteilungssystem
- Wahlsystem für Arbeitskreise (kurz AK)
- Tagesprogramm-Planer mit Anzeige für die Teilnehmer
- Teilnehmer-Datenbank mit Suchfunktion und allen Infos zum Teilnehmer über Wahlen, Kontaktdaten der Eltern etc.
Ich entschied mich für eine Umsetzung mit Node.JS. So konnte ich auf HTML5 und CSS setzen, eine Verfügbarkeit überall garantieren und ohne viel Aufwand mit Websockets eine sehr dynamische Oberfläche schaffen. Außerdem wollte ich schon länger mal etwas Größeres mit Node.JS machen, was ich aber sicherlich nicht nochmals tun werde! Die Asynchronität und das fehlende Multithreading fliegt einem spätestens bei der Berechnung der AK-Wahlen um die Ohren.
Die Teilnehmer-Datenbank
Hier werden kurz gesagt alle Informationen, die das System über einen Teilnehmer hat, zusammengefasst und durchsuchbar dargestellt. Am meisten benötigt wurde es um die Eltern eines Teilnehmers kontaktieren zu können oder sein Zimmer rausfinden zu können.
Das Check-In System für die Reisebusse
Am Abfahrtstag muss möglichst schnell festgestellt werden, dass alle Teilnehmer da sind und vor allem wer in welchem Bus fährt. Den Kindern ist dabei wichtig mit ihren Freunden zusammen fahren zu können. Also machen wir jedes Jahr mehrere Check-Ins (für jeden Reisebus einen) und lassen die Leute sich hier einchecken. Nebenbei werden auch noch andere letzte Formalia geklärt.
Um anschließend nicht x Papierlisten von Hand auf Vollständigkeit prüfen zu müssen, existiert dieses Checkin-System, welches auch über mehrere Computer hinweg immer den aktuellen Füllstand der Busse und fehlenden Personen anzeigt und aktualisiert. Am Ende kann ganz einfach eine PDF-Datei mit der genauen Liste für jeden Bus gedruckt werden.
Die Zimmerverwaltung
Bei der Zimmerverwaltung handelt es sich um eine Art zweitem Check-In vor Ort. Hier werden zuvor vom Vortrupp die verfügbaren Zimmer samt Betten- und Zustellbettenzahl erfasst und ihnen anschließend eine Kategorie („Leiter m“, „Leiter w“, „Teilnehmer m“, „Teilnehmer w“) zugewiesen.
Die Kinder kommen nun mit ihrem Teilnehmerausweis und können durch Scannen des aufgedruckten Barcodes in das richtige Zimmer sehr schnell eingecheckt werden. Gleichzeitig wird sichergestellt, dass Mädchen nicht aus Versehen in ein Jungszimmer oder Leiter in ein Teilnehmerzimmer gebucht werden. Spätere Änderungen sind schnell per Drag&Drop möglich, sollten sich einzelne Teilnehmer noch umentscheiden (was jedes Jahr zu Hauf passiert).
Das Tagesprogramm
Hier wird das genaue Tagesprogramm für jeden Tag eingetragen. Ein typischer Tagesablauf beinhaltet mehrere Küchendienste samt anschließender Mahlzeiten, Großgruppenspiele, ein Bühnenprogramm und einen Reinigungs- und einen Nachtdienst. Für jeden dieser Typen und ein paar Weitere könnten spezifische Zusatzinformationen gespeichert werden. Zurzeit geht dies jedoch nur für die Küchen- und Nachtdienste (wo Dienstteilnehmer eingetragen werden können), sowie Hauptverantwortungen für Großgruppenspiele. Diese Informationen werden auf dem Infoboard angezeigt.
Das Infoboard – Die Anzeige für Teilnehmer
Hier werden die für den heutigen Tag wichtigen Informationen in Form eines Blackboards angezeigt. Dazu gehören der nächste Küchen- und Reinigungsdienst, das heutige und morgige Tagesprogramm, bisher veröffentlichte Bilder der Fahrt (direkt verknüpft mit unserem Online-Fotoalbum), sowie einen Lauftext und eine Freifläche zum Einblenden sonstiger Informationen für uns.
Das Arbeitskreis-Wahlsystem
Problem: Die Kinder kriegen eine Auswahl von 12-15 Arbeitskreisen (zB. Seifenkisten bauen, Scrapbooks basteln, Drachen bauen) zu Beginn vorgestellt und können wählen was sie am Liebsten machen würden, was am zweitliebsten und was am drittliebsten. Es finden insgesamt 3 Durchläufe statt, also nach jedem Durchlauf wechselt man in einen anderen Arbeitskreis. Die Kinder wählen, indem sie ihre Wünsche auf einen Zettel schreiben. Das wurde dann bisher von Hand ausgewertet und versucht möglichst gut zuzuteilen. Das kostete die zuständigen Leiter 2 Tage ihrer wertvollen Urlaubszeit im Leiterbüro.
Es schrie förmlich nach einer automatisierten Lösung. Und da ich in der Uni gerade das Modul „Algorithmen und Berechnungskomplexität I“ belegte, versuchte ich die Sache auf das Rucksack-Problem zu reduzieren. Das scheiterte letztlich an der Tatsache, dass die 3 Prioritäten der Wahl nicht den 3 Durchläufen entsprachen, sondern jeweils eigenständige Teilaspekte waren und das Problem somit etwas komplexer. Es musste also eine eigene Lösung her. Die entsprechende Umsetzung in Node.JS kostete mich sehr viel Zeit, was auch daran lag, dass Node.JS sehr schnell sehr frustrierend für solche komplexeren Algorithmen wird. Ich setzte sogar während der Konzeption zwischenzeitlich auf Java, nur um überhaupt mal einen funktionierenden Algorithmus erarbeiten zu können.
Für die Bedienung wollte ich eine möglichst intuitive UI haben, da auch Technik-Laien das System bedienen sollten und vor allem es auch nach meiner Zeit noch verwendet werden soll.
Die Lösung:
- Die Arbeitskreise werden zu Beginn der Fahrt vorgestellt. Jeder AK hat eine feste Nummer
- Die Teilnehmer wählen direkt nach der Vorstellung auf Zetteln ihre AK’s, indem sie 3 AK-Nummern nach Prioritäten sortiert auf ihren Wahlzettel schreiben
- Der zuständige Leiter tippt die Wahlen in die Liste (Screenshot) ab. Wenn eine Wahl zulässig ist (keine Doppelwahlen), wird die Zeile grün unterlegt, andernfalls ein Fehler ausgegeben und die Eingabe gelöscht
- Die Berechnung wird über die Weboberfläche gestartet und vom Node.JS-Server ausgeführt. Hierzu werden 5000 mögliche Zuteilungen berechnet, indem die Eingabe (also die gewählten AK’s) vor jedem Durchlauf randomisiert wird.
- Der Algorithmus ermittelt für jeden Durchlauf einen Gesamtzufriedenheitswert basierend darauf, ob der AK gewählt wurde, mit welcher Priorität, und wie viele potenzielle Freunde auch in dem AK sind (Vergleich mit Zimmergenossen, Jahrgangsstufe und Klasse des Teilnehmers). Das Ergebnis des besten Durchlaufs wird gespeichert
- Das Ergebnis wird ausgegeben und kann per Drag&Drop von Hand nachträglich korrigiert werden (vgl. Screenshot)
Man sieht, dass die einzelnen Teilnehmer farblich hinterlegt sind. Die Farbe sagt dabei aus, wie viele ihrer gewählten Arbeitskreise die Teilnehmer auch tatsächlich bekommen haben.