Masters of Code reloaded

Masters of Java (MoJ) is onze welbekende NL-JUG funprogging contest gebaseerd op Java SE, toegankelijk voor iedere Java ontwikkelaar. De wedstrijd wordt jaarlijks georganiseerd in samenwerking met partners, zoals Sogeti. In de wedstrijd worden deelnemers op API kennis en programmeervaardigheid getest en dingen zij in teamverband naar diverse prijzen.

Hoe zit een typische wedstrijd in elkaar? Deze bestaat uit verschillende ronden. In een ronde wordt eenzelfde opdracht door ieder team afzonderlijk gemaakt. De tijd waarbinnen een team met een correcte oplossing komt, bepaald het aantal behaalde punten in die ronde. Een opdracht voor Masters of Java wordt aangeleverd door de bedenker ervan in vorm van een jar. Deze jar bevat onder andere de omschrijving van de opdracht, informatie over de bedenker en zijn/haar organisatie, een broncode bestand wat door deelnemers aangepast moet kunnen worden in hun client en een test klasse. Deze test klasse controleert of een inzending van een team correct is.

Het systeem waarin deelnemers tijdens een wedstrijd hun opdrachten maken, heet Masters of Java Software (MoJS) (Ctrl-Alt-Development, 2016). MoJS is een Java SE client/server oplossing. Een eclipse-plugin helpt bedenkers van opgaven bij de inrichting daarvan. Het systeem functioneerde goed, maar voldeed niet aan alle nieuwe eisen en wensen. Het schaalde bijvoorbeeld beperkt naar grotere aantallen gebruikers. Getest werd niet met JUnit, maar met een MoJS-specifiek mechanisme. Het voorzag ook niet goed in het opnemen van dependencies in opgaven, wat zeker in testcode handig kan zijn.

Binnen Sogeti’s Java Core Team ontstond daarom de wens MoJS van de grond af opnieuw te schrijven. Jaap Coomans startte hiertoe een ontwerpproject voor het nieuwe systeem, Masters of Code (MoC) (Sogeti Nederland BV, 2016). Van een implementatie kwam het echter niet vanwege tijdgebrek. In de zomer van 2015 gloorde er dan toch, dankzij onze relatie met de Fontys Hogeschool voor ICT (FHICT), nieuwe licht aan de horizon. Sogeti’s Java & Open Source businessline is daar Partner in Education. Startend met Java SE in het 2e jaar, doorlopen FHICT software engineering studenten in het 3e jaar de hele JEE 7 stack. Het geleerde wordt in praktijk gebracht in de zogenaamde proftaak: een software engineering project van 20 weken in teams van 4-6 studenten. In overleg met Frank Coenen (blokleider 2e semester, jaar 3) en het Java Core Team maakte ik vorig jaar een projectopzet waarin één van de klassen MoC zou gaan doorontwerpen en bouwen. In vijfvoud wel te verstaan, want de klas werd opgedeeld in vijf teams. De klas werd vervolgens vanuit FHICT begeleid door Petra Heck en vanuit Sogeti door ondergetekende.

Eisen aan het nieuwe systeem waren allereerst dat het zo goed als onbeperkt (horizontaal) kan schalen naar grote aantallen gebruikers. Verder moest het standaard dependency-management en build-mechanismen gebruiken. Dit laatste om de creativiteit van bedenkers van opgaven niet onnodig te beknotten. Om de studenten op stoom te helpen, werden deze eisen gedeeltelijk al in een hoog niveau architectuur oplossing vertaald, zoals geschetst in figuur 1. Voor bedenkers van opdrachten wordt een Maven-archetype gedefinieerd wat vrijwel onbeperkte vrijheid geeft voor bedenkers van opgaven. Dependencies zijn eenvoudig op te nemen, ook is het mogelijk andere JVM-talen te gebruiken. Een bedenker maakt via het archetype een opdracht, welke als jar (met sources) in een repository manager, zoals Artifactory, beschikbaar wordt gesteld op het afgeschermde netwerk. Meerdere JEE 7 applicatie servers draaien parallel de presentatie en business logica van Masters of Code. Een load balancer verdeelt via sticky sessions de web-clients waarop deelnemers hun opdrachten maken tijdens de wedstrijd over de JEE 7 servers.

 

figuur 1

Het zwaarste werk wordt verricht door de workspace servers. In figuur 1 zijn het er twee, maar dit kunnen er zoveel zijn als nodig. Een workspace server beheert de workspaces van één of meerdere teams. Een workspace is, zoals in eclipse, een map op het bestandssysteem met daarin maven-projecten. De taak van de workspace-server is om de opdrachten uit te pakken in de workspace van een team, een bewerkbaar bestand daarin aan te passen als gevolg van een bewerking via in de browser en dan of op verzoek van een team of bij inzending ervan een opdracht te compileren en/of testen. Dit laatste via Apache Maven Invoker (Apache software foundation, 2016), een handige library om vanuit Java een nieuw Maven proces te starten in een nieuwe JVM. Dit minimaliseert de kans op verstoring van het hoofdproces van een Workspace server, maar maakt één en ander wel wat zwaarder. Berichtenverkeer tussen een JEE 7 server en een Workspace server verloopt mede daarom asynchroon via JMS queues. Door het aantal threads van een workspace server te begrenzen dat berichten van een queue ophaalt, kan de last van deze server begrenst worden. Vanwege de asynchrone communicatie tussen JEE 7 servers en workspace servers en andere functionele eisen werd de studenten aanbevolen ook de communicatie tussen web-browser en JEE 7 server grotendeels asynchroon te laten verlopen. Websockets zijn hiervoor bij uitstek geschikt.

Na een kleine 20 weken kwamen de verschillende teams met verrassend goede en verschillende oplossingen. Een enkel team had voor een JSF frontend gekozen, de meesten voor Angular. Sommigen hadden vrijwel alle communicatie tussen browser en JEE 7 server met websockets georganiseerd. Geen sinecure gezien de complexiteit van de applicatie! Sogeti’s Java Core Team koos uiteindelijk de oplossing van team 61b (Raymond van der Cammen, Jeroen Schepens, Berry Hermans, Jason Leeraert, Alexander Schoonderwaldt en Patrick Nolet) voor doorontwikkeling. Het frontend van dit team zag er bijzonder gelikt uit, terwijl het backend, grotendeels geïmplementeerd door Jeroen Schepens, tevens dik in orde was. De laatste hand wordt nu gelegd aan de open-sourcing van het systeem op github.

Toekomstige Masters of Java edities zullen het gebruiken en enthousiaste ontwikkelaars worden bij deze alvast uitgenodigd pull requests te doen. Dank aan alle betrokkenen voor jullie inzet en enthousiasme!

 

Bibliografie