Zaterdagochtend, 8 uur, de wekker gaat. Even schiet het nog door je heen: “zaterdag… wekker… klopt niet?”. Al snel komt het besef: vandaag is de grote dag, de dag waarop je geschiedenis kunt schrijven.
Goed, het is niet zo belangrijk als de verjaardag van je moeder, of 5 mei, of Sinterklaas, maar toch… de NLJUG Masters of Java, editie 2015, is vandaag even het belangrijkste wat er is.
Onder de bezielende leiding van diverse Sogeti-medewerkers en op kantoor bij First8 strijden zo’n twintig teams, bestaande uit een of twee personen, om de tweede plaats. De winnaar is tenslotte al bekend, dat wordt Johan. (Vooruitlopend op zijn derde zege op rij heeft hij zijn eenmansteam vast "Hattrick" gedoopt.) Middels zes uiteenlopende opdrachten wordt uitgemaakt hoe hoog je op de ranglijst komt te staan en of je je op maandagochtend nog bij je werkgever kunt vertonen.
De basis is simpel: voor elke opdracht krijg je een stuk code dat moet worden aangevuld of gecorrigeerd. Zodra alle meegeleverde testen het bekende groene balkje geven, ben je klaar. De eerste die klaar is krijgt de meeste punten, de laatste de minste. Red je het niet binnen de gestelde tijd, dan krijg je helemaal geen punten.
Ons tweemans-team bestaat uit een voormalige organisator van de Masters Of Java en een rookie die voor de eerste keer meedoet (en door eerstgenoemde gestrikt is als teammaat om gezichtsverlies te voorkomen).
De eerste opdracht is een opwarmertje: schrijf een methode die valideert of de input voldoet aan een bepaald formaat e-mailadres. Ondergetekenden zijn het direct met elkaar eens, dat doe je met een reguliere expressie! Zo gezegd zo gedaan, behalve dan die laatste 1 procent. Het ding blijkt net niet te werken en als we denken het te hebben opgelost, slaagt die laatste test wel, maar faalt een andere weer. Dit blijkt een patroon dat zich dat gedurende de dag nog een aantal keer zal herhalen. Met wat kunst- en vliegwerk zijn we niet als eerste klaar, maar toch in ieder geval als een van de eersten.
In de ruimte waar de vroege finishers de opdracht alvast nabespreken (om de zwoegende concurrentie niet te storen) blijkt al dat het makkelijker had gekund dan onze oplossing. Als je gewoon de binnenkomende String in een paar stukken knipt en dan kijkt wat je overhoudt, ben je misschien wat minder elegant, maar wel sneller klaar. Dat is iets om te onthouden voor de volgende opdrachten: snelheid boven alles.
Nu we onze doelstelling van de dag al behaald hebben (bij minimaal 1 opdracht punten halen) is de druk van de ketel. De volgende opgave gaat over Smith numbers. Daar hebben we in een ver verleden wel ooit van gehoord, maar het is toch wel fijn dat in de omschrijving wordt uitgelegd wat dat precies zijn (een getal waarvan de som van de cijfers gelijk is aan de som van de cijfers van alle priemfactoren). De uitdaging is nu om niet te lang bij de theorie te blijven, maar zo snel mogelijk in de code te duiken. We drukken eerst maar eens op Test om te zien of er misschien al wat tests kant-en-klaar gehaald worden.
Terwijl de ene helft van ons team nog in de stress zit om de theorie, heeft de andere helft al ontdekt dat er een mooie opbouw in de opdracht zit. Eerst een methode maken om te bepalen of iets een priemgetal is, dan één om te bepalen wat de priemfactoren van een getal zijn en tot slot de onontkoombare isSmithNumber(int). Het resultaat van de ene stap kan in de volgende gebruikt worden, dus langzaam strompelen we al puzzelend naar de finish van deze opgave. Tot onze vreugde zijn we ook dit keer op tijd en kunnen we 517 punten toevoegen aan ons totaal.
Al bij beide opgaven punten gehaald, dat gaat lekker! We beginnen langzaam waanvoorstellingen te krijgen van glorieuze huldigingsceremonies en een dikke prijs (wat voor coole gadget zou het dit jaar zijn?). Gezichtsverlies is inmiddels wel uitgesloten, dus met opgewekt gemoed en licht euforisch gaan we de volgende opgave in. Dit keer zijn Sudoku-puzzels het onderwerp. Even zijn we bang dat we de puzzels daadwerkelijk moeten oplossen, maar het blijkt alleen te gaan om het valideren van een volledig ingevulde Sudoku. De regels hiervoor zijn natuurlijk simpel, maar dat er uitgerekend tweedimensionale arrays voor gebruikt zijn maakt het er niet makkelijker op. Allereerst hebben we even onenigheid over wat nu de rijen zijn en wat de kolommen, totdat we ons realiseren dat dat geen sikkepit uitmaakt, omdat we toch beide moeten valideren. We besluiten voor elke validatie (kolom, rij, blok) in een Map van Integers naar Booleans bij te houden welke cijfers wel en niet voorkomen. Licht bewerkelijk, maar prima uit te voeren. Het struikelblok blijken de blokken van 3 bij 3. We gaan voor lelijk maar effectief en zitten dus al snel met wat geneste loops. Wat je normaal uit je mouw schudt is onder tijdsdruk toch iets gecompliceerder en dus maken we een paar domme fouten. Ook nu gloriëren we weer en kunnen we een mooie zwik punten aan ons totaal toevoegen. Toch beleven we in de nabespreekruimte weer een ‘facepalm’ momentje als iemand oppert dat je de cijfers gewoon in een Set van Integers kan gooien om vervolgens te valideren of deze 9 elementen bevat. Lelijker, maar sneller.
Na een gezellige lunch, met natuurlijk de nodige nerd-trashtalk om de anderen te intimideren, wordt er weer geconcentreerd op de volgende opdracht. Deze opdracht tapt uit een heel ander vaatje. Er is een kant en klare applicatie om een badminton competitie te plannen en de stand bij te houden. Deze zit echter vol met bugs. Dat wordt speuren geblazen! Naarmate de tijd vordert horen we om ons heen steeds meer verwensingen en de ruimte begint langzaam naar angstzweet te ruiken. Ook wijzelf hebben moeite de bugs te vinden in de (bewust) onooglijke code. Even wordt het spel stilgelegd voor een tip, maar daarna moeten we toch echt weer verder. De klok tikt langzaam naar de vermaledijde nul en de gong galmt door de speakers om het allesvernietigende einde van de opdracht te verkondigen. Simultaan gaan er overal handen van onthutste developers de lucht in en er gaat een zucht door de zaal. Wij besluiten het positief te bekijken en constateren dat de concurrentie ook geen punten heeft gehaald. Niets aan het handje!
Na deze deceptie snakt de zaal naar een simpele opdracht. Helaas worden we ook dit keer weer massaal aangetast in onze eer door een opgave waar zelfs de organisatie geen chocola van blijkt te kunnen maken. De auteur van de opdracht is helaas niet aanwezig voor verdere verduidelijking en een last-minute vertaling van de omschrijving van Nederlands naar Engels blijkt de opgave geen goed te hebben gedaan. Gelukkig wordt het door de meeste deelnemers sportief opgepikt en wij houden ons vast aan hetzelfde mantra van de vorige opdracht: geen extra achterstand!
Inmiddels is het einde van de middag aangebroken en is het tijd voor de laatste opdracht. We constateren dat we theoretisch nog kunnen winnen, dus we gaan er vol tegenaan. Het (af)maken van een virtuele CPU. Terwijl één van ons direct driftig op het toetsenbord begint te rammelen zit de ander nog met een groot vraagteken boven z’n hoofd de opdracht voor de derde keer te lezen. Een voor een worden alle testen groen, behalve natuurlijk die laatste weer. Ondertussen is de uiteindelijke winnaar na een luttele 5 minuten al klaar.
Met een briljante ingeving (laten we het zo noemen) weet de ander (die met dat vraagteken) ook de laatste test groen te krijgen. We zijn klaar!
Bij de prijsuitreiking blijkt dat we een vijfde plaats hebben behaald, helaas geen prijs voor ons, maar we zijn tenminste geen laatste geworden. Omdat het uitslagenbord van links naar rechts scrollt lukt het daadwerkelijk een fotootje te knippen waarop het net lijkt alsof we op de eerste plek zijn geëindigd. Niemand die het gelooft natuurlijk, maar zo'n plaatje doet het vast goed bij de koffieautomaat. Na de uitreiking van de derde en tweede plaats, staat er voor de winnaar een grote doos LEGO (Mindstorms natuurlijk) klaar, en inderdaad, deze is voor Johan.