Nummer 2 - 2019

MAGAZINE

Onafhankelijk tijdschrift voor de Java-professional

Een duik in Java events met de beste sprekers

Scherp je veiligheid aan met Keystroke Dynamics Python voor Java developers? Word zelf een spreker Inclusief op meetups en events! vooruitblik J-spring 2019

TEQnation programmaboekje en plattegrond

Features Java 12: upgraden Interview met Verslag: Uncle Bob of niet? Venkat Subramaniam in Nederland

01 COVER.indd 1 23-04-19 09:30 Adv J-Spring.indd 9 Foto: Frans van Bragt Main Sponsor Adam Bien Rockstar JavaOne De line-up staat online! staat De line-up Bestel nujeticketsBestel op:jspring.nl/tickets/ Co-Sponsors Burr Sutter @ Red Hat Director Director Vind de volledige line-up opjspring.nl Vind devolledigeline-up Uitgelichte sprekers Independent Peter Hilton Consultant Siren Hofvander Partners @ Docly CSO Lead Evangelist Sven Peters @ K15t Software Engineer Software Katherine Stanley Powered by @ IBM 17-04-19 15:37 VOORWOORD

Colofon Java Magazine 02-2019 Voorwoord Content manager: Stijn van de Blankevoort Java leeft in Nederland Eindredactie: Anne Camphuijsen-Wieleman Programmeertalen zijn constant in beweging en zo ook de aanverwan- Projectcoördinator: te technologieën. Dit zorgt ervoor dat je als developer continu je kennis Tedje van Gils up-to-date moet blijven houden. Auteurs: Koen Aerts, Jan-Hein Buhrman, Edwin Derks, Lennard Eijsackers, Gelukkig zijn er middelen om je hierbij te helpen: zo kun je tijdens eve- Erwin de Gier, Mathijs de Groot, Arno Koehler, Arjan Lamers, Joop nementen en meet-ups in één dag(deel) je kennis bijschaven Lanting, Philip Leonard, Sander Mak, Wouter Oet, Robert Scholte, in jouw vakgebied. Veelal gegeven door grootheden uit het vak. Wat dacht je bijvoorbeeld van Clean Coding en Agile meesters Uncle Bob of Koen Vervloesem, Ivo Woltring Venkat Subramaniam? Zij kwamen laatst naar Nederland om lezingen Redactiecommissie: te geven. Heb je deze meet-ups gemist? Dan kun je hier in Java Maga- Stijn van de Blankevoort, Rob Brinkman, Erwin de Gier, zine teruglezen hoe zij over verschillende onderwerpen denken. Peter Hendriks, Ben Ooms, Bas Passon, Martin Smelt, Hedzer Westra, Ivo Woltring Volgende week organiseren we TEQnation (Powered by NLJUG) in de Vormgeving: mooie locatie DeFabrique te Utrecht. Met een sterk inhoudelijk pro- Wonderworks, Haarlem gramma verwachten we de bezoekers een inspirerende dag te kunnen bieden. Sprekers van onder andere Zalando, Uber, Facebook, Spotify en Uitgever: Google zullen hier het podium betreden. Martin Smelt Traffic & Media order: Als je nog iets langer geduld hebt, kun je diep in Java duiken tijdens Marco Verhoog J-Spring 2019 in TivoliVredenburg. Dit evenement, in hartje Utrecht, Drukkerij: is exclusief voor NLJUG’ers. Hier kun je presentaties volgen van high- Senefelder Misset, Doetinchem level Java sprekers zoals Adam Bien, Burr Sutter, Peter Hilton en Siren Hofvander. Advertenties: Richelle Bussenius Lukt het je niet om hier bij te zijn of wil je nu alvast in de materie E-mail: [email protected] duiken? Dit nummer laten we je onder andere nieuwe technieken zien Telefoon: 023 752 39 22 om je veiligheid op te schroeven met Keystroke Dynamics, leer je met Fax: 023 535 96 27 Code Reviews een vriendelijke competitie te starten om je code beter Marc Post te maken en beschrijven we hoe je documentatie schrijft als code. E-mail: [email protected] Heel veel leesplezier en hopelijk tot ziens op onze evenementen! Telefoon: 023 543 00 08 Abonnementenadministratie: Wil je bijdragen aan Java Magazine? Stuur mij dan een mailtje. Tanja Ekel

Stijn van de Blankevoort Lidmaatschap van de NLJUG kost € 44,50 (België € 45,50) per jaar, waarbij Java Content-/Communitymanager NLJUG Magazine gratis verschijnt. Naast het Java Magazine krijgt u gratis toegang tot de [email protected] vele NLJUG workshops en het J-Fall congres. Het NLJUG is lid van het wereldwijde netwerk van JAVA user groups. Voor meer informatie of wilt u lid worden, zie www.nljug.org. Een nieuw lidmaatschap wordt gestart met de eerst mogelijke editie voor een bepaalde duur. Het lidmaatschap zal na de eerste (betalings)periode stilzwijgend worden omgezet naar lidmaatschap van onbepaalde duur, tenzij u uiterlijk één maand voor afloop van het initiële lidmaatschap schriftelijk (per brief of mail) opzegt. Na de omzetting voor onbepaalde duur kan op ieder moment schriftelijk worden opgezegd per wettelijk voorgeschreven termijn van 3 maanden. Een lidmaatschap is alleen mogelijk in Nederland en België. Uw opzegging ontvangen wij bij voorkeur telefonisch. U kunt de Klantenservice bereiken via: 023-5364401. Verder kunt u mailen naar [email protected] of schrijven naar NLJUG BV, Ledenadministratie, Richard Holkade 8, 2033 PZ Haarlem. Verhuisberichten of bezorgklachten kunt u doorgeven via [email protected] (Klantenservice).

Wij nemen je gegevens, zoals naam, adres en telefoonnummer op in een gegevensbestand. De verwerking van uw gegevens voeren wij uit conform de bepalingen in de Algemene Verordening Gegevensbescherming. De gegevens worden gebruikt voor de uitvoering van afgesloten overeenkomsten, zoals de abonnementenadministratie en, indien je daar toestemming voor hebt gegeven, om je op de hoogte te houden van interessante informatie en/of aanbiedingen. je kunt uw persoonsgegevens opvragen om inzicht te krijgen in welke gegevens wij van je hebben, deze te corrigeren of, na beëindiging van de abonnee-overeenkomst, te laten verwijderen. Stuur hiertoe een kaartje aan NLJUG BV, afd. klantenservice, Richard Holkade 8, 2033 PZ Haarlem of een e-mail naar [email protected].

JAVA MAGAZINE | 02 2019

03 VOORWOORD.indd 3 23-04-19 14:15 MASTERS OF JAVA 2019 het officieuze NK Java Programmeren

De Masters of Java, georganiseerd door de NLJUG, met First8 als hoofdsponsor, is de roemruchte “funprogging contest”, die toegankelijk is voor iedere Java developer. Vorig jaar hebben Sijmen en David dat bewezen: deze twee studenten werden bekroond tot “Master of Java 2018”! Pakt jouw team dit jaar de titel? In deze wedstrijd wordt niet de API-kennis, maar de echte programmeervaardigheid getest.

Schrijf je snel in en wees verzekerd van deelname! Onder de 25 eerste inschrijvers verloten we twee VIP-Pakketten met onder andere een hotel overnachting en toegang tot het exclusieve speakers diner.

Ga jij dit jaar de strijd aan met je collega’s? Een team bestaat uit maximaal twee developers. Het team dat aan het einde van de dag de meeste punten heeft, mag zich “Master of Java 2019” noemen. Er zal naast eeuwige roem natuurlijk gestreden worden voor mooie en spectaculaire prijzen!

EEN NLJUG EVENT Datum: woensdag 30 oktober 2019 Tijd: 12.00 – 18.00 uur Locatie: Pathé bioscoop, Ede Voor wie: Iedere Java developer

Ook dit jaar maakt First8 weer zes uitdagende opdrachten voor jullie. De collega’s van First8 werken met enthousiasme, bevlogenheid en passie aan deze en andere gave opdrachten. Iets voor jou? We maken graag kennis met je.

www.first8.nl

Aanmelden: nljug.org/masters-of-java-2019

00-00 Masters of Java 2019 V2.indd 12 18-04-19 11:58 INHOUDSOPGAVE

06 KEYSTROKE DYNAMICS

10 BLOCKCHAIN POWERED CODE REVIEWS Trust, decentralization and security

14 DOCS-AS-CODE Hoe word ik een bekende spreker? Een verfrissende kijk De Java-wereld staat bekend om zijn open source gedachte en het op documentatie 24 denken in communities. Een belangrijk uitgangspunt is dan ook het delen van kennis delen met anderen. Van nature vinden we het allemaal 19 COLUMN JOOP spannend om voor een groep te spreken. Zeker als het publiek dan ook nog eens 20 INTERVIEW veel van het onderwerp weet en juist die vraag stelt waar jij geen antwoord op VENKAT SUBRAMANIAM hebt. Dit artikel geeft je tips en trucs en beschrijft hoe je in kleine stappen een goede spreker kunt worden. 24 HOE WORD IK EEN BEKENDE SPREKER? Claim jouw plaats in de spotlights

28 GLASSFISH In een nieuwe vijver Java 12 – 8 nieuwe features 30 PYTHON VOOR JAVA 40 Voor Java 12 zijn 8 nieuwe Met voorbeelden! features (JEP’s) geïmplementeerd. In dit DEVELOPER SURVEY artikel zullen deze features beschreven 34 worden. Laten we kijken of er in versie 36 J-SPRING VOORUITBLIKKEN 12 features zitten die het interessant maken om te upgraden. 40 JAVA 12 8 nieuwe features

42 SPRING FU Spring Fu – de weg De weg naar declaratieve naar declaratieve Spring Applicaties 42 Spring Applicaties 46 SPRING WEBFLUX Het Spring Framework is al ruim 17 jaar Event driven microservices een begrip op de JVM. Oorspronkelijk met Spring Webflux begonnen als een inversion of control container en door de jaren heen 50 UNCLE BOB EVENT uitgegroeid tot een populair full- In Utrecht en Apeldoorn featured framework voor (web)applicatie 52 COLUMN MAVEN ontwikkeling. Met Spring Fu dient zich een volgende evolutie aan: declaratieve configuratie op basis van een fluent API. 55 BESTUURSCOLUMN

SCHRIJVEN VOOR JAVA MAGAZINE? Ben je een enthousiast lid van NLJUG en zou je graag willen bijdragen aan Java Magazine? Of ben je werkzaam in de IT en zou je vanuit je functie graag je kennis willen delen met de NLJUG-community? Dat kan! Neem contact op met de redactie, leg uit op welk gebied je expertise ligt en over welk onderwerp je graag zou willen schrijven. Direct artikelen inleveren mag ook. Mail naar [email protected] en wij nemen zo spoedig mogelijk contact met je op.

JAVA MAGAZINE | 02 2019

05 INHOUD.indd 5 23-04-19 13:02 06 Keystroke Dynamics Authenticatie gebaseerd op menselijk gedrag

Om een veilige applicatie te bouwen worden vaak 2 of meer authenticatie mechanismen gecombineerd. Vaak is dit voor een webapplicatie een combinatie van authenticatie met gebruikersnaam en wachtwoord plus een token gegenereerd vanaf een mobiele telefoon. Dit is natuurlijk niet het meest gebruiksvriendelijke proces. Mobiele applicaties hebben het voor- deel van out-of-the-box fingerprint authenticatie of gezichtsherkenning, maar dit kunnen we niet gebruiken voor web-applicaties. In dit artikel introduceer ik de concepten achter keystroke dynamics – een gebruikers-gedrag gebaseerd authenticatie mechanisme – en laat ik zien hoe je dit kan toepassen in een web-applicatie.

Keystroke dynamics is gebaseerd op het feit dat elke gebruiker een unieke manier heeft om te typen op een computer, net zoals ie- dereen een unieke handschrift heeft. Rythme, aanslag, pauzes tussen de aanslagen enzo- voort zijn samengenomen tot een patroon, op basis waarvan de gebruiker te identificeren is. Aan de hand van deze patronen kan een per- Lennard Eijsackers soonsgebonden classifier gecreëerd worden, is een Data Engineer een model die de gebruikers kan onderschei- bij Dataworkz en den aan de hand van hun type patronen. Hoe houdt zich graag be- accurater deze classifier, hoe beter we in staat zig met de laatste zijn de identiteit van de gebruiker te verifië- ontwikkelingen in ren. Elke nieuwe inlogpoging van de gebruiker de software wereld. wordt gevalideerd tegen deze classifier. Om een classifier te creëren die de gebruikers kan identificeren moeten we eerst de type patronen van de gebruikers verzamelen. De gebruiker wordt tijdens het registreren gevraagd om een bepaalde zin te herhalen om deze features te kunnen verzamelen. Het suc- cesvol herhalen van deze zin noemen we een sample. In de literatuur staat beschreven dat minder dan 6 samples niet aangeraden wordt, aangezien dit de accuracy van onze classifier Afbeelding 1. zou beïnvloeden.1 Ook de lengte van deze zin Disclaimer: Authenticatie heeft ook invloed : samples van korter dan 10 Key Press Latency: De tijd tussen het is een complex probleem, characters niet aangeraden.2 aanslaan van toets A en het aanslaan van met veel risico’s als het Deze samples worden gebruikt om de type toets B verkeerd in een applicatie patronen van een gebruiker te verzamelen. Key Release Latency: De tijd tussen het los- geïmplementeerd wordt. In de literatuur zijn verschillende features laten van toets A en het loslaten van toets Dit artikel is alleen bedoeld relevant bevonden voor het identificeren van B. Dit kan een negatieve waarde zijn als de om de concepten achter een patroon (Afbeelding 1). gebruiker toets B eerst loslaat. keystroke dynamics te Flight Time: De tijd tussen het loslaten van introduceren, niet om een Dwell Time: De tijd tussen het aanslaan van toets A en het aanslaan van toets B. Dit kan productie klaar product te een toets A het loslaten van toets A een negatieve waarde zijn als de gebruiker tonen.

JAVA MAGAZINE

06-09 KEYSTROKE DYNAMICS.indd 6 23-04-19 09:30 KEYSTROKE DYNAMICS

toets B aanslaat voordat de gebruiker toets A loslaat. Digraph: De tijd tussen het aanslaan van toets A en het loslaten van toets B. Dit kan Authenticatie gebaseerd op menselijk gedrag gegeneraliseerd worden naar features van het type N-graph, waar N de hoeveelheid toetsen aangeeft.

Op basis van deze features kan een template worden gecreëerd. Deze template bevat een aggregatie van de features van de gebruikers type patronen verzameld tijdens registratie. Aan de hand van deze template trainen we een classifier. Deze classifier wordt uiteinde- lijk gebruikt om de gebruiker te identificeren. Drie verschillende categorieën van classifiers worden toegepast in dit veld:

Statistische classifiers: Deze classifiers Listing 1. onderscheiden gebruikers van elkaar d.m.v. een maat van statistische afstand, zoals bijvoorbeeld de euclidische afstand, Web-based KEYSTROKE de afstand tussen twee punten in een Authenticatie systeem DYNAMICS IS n-dimensionale ruimte. Als n=2 dan is dit Maar hoe implementeren we dit in een web- simpelweg de stelling van Pythagoras. applicatie? Daarvoor beginnen we met het ver- GEBASEERD Denk hier bijvoorbeeld aan de K-means en zamelen van de type-patronen in de browser. OP HET FEIT Nearest Neighbours algorithmes De moderne web API triggert een `Keyboar- DAT ELKE Fuzzy Logic: Fuzzy logic creëert een regel dEvent` om een gebruikersinteractie met gebaseerde classifier, die ipv 0/1 boolean het toetsenbord te beschrijven. Er zijn drie GEBRUIKER logica, het resultaat van een regel tussen 0 soorten events, namelijk het keyup-, key- EEN UNIEKE en 1 definieert. press- en het keydown-event. De keydown- MANIER Artificiële neurale netwerken: Neurale net- en keyup-events beschrijven respectievelijk werken zijn in staat non-lineaire beslis- het indrukken en loslaten van een toets. Het HEEFT OM sings-grenzen te maken in waarmee we keypress event is een variatie op het keydown TE TYPEN, onze gebruikers kunnen onderscheiden. event: deze vuurt alleen op normale charac- NET ZOALS ter-toetsen (en sluit dus toetsen zoals `Alt` Om de classifiers te evalueren en de accuraat- en `Shift`). IEDEREEN heid van de classifier in te schatten wordt Voor het meten van een gebruikers type pa- EEN UNIEK gebruik gemaakt van twee maatstaven. De troon is het belangrijk dat we accuraat de tijd false acceptance rate (FAR) geeft aan welk tussen twee toetsaanslagen kunnen meten. HANDSCHRIFT percentage van gebruikers foutief geïdentifi- Hiervoor is de `Performance` interface be- HEEFT ceerd werd als een andere gebruiker door de schikbaar in browsers. Volgens de specifica- classifier. De false rejection rate (FRR) geeft ties zou `performance.now()` een timestamp aan welk percentage gebruikers niet geïden- met een precisie van microseconden terug tificeerd werd. Zoals je je misschien wel kan moeten geven, maar vanwege bepaalde voorstellen, is de FAR hier de belangrijk- cyber-aanvallen (zoals Spectre) is de precisie ste maatstaf: we willen namelijk niet dat afgerond op milliseconden. Om accuraat een kwaadaardige gebruikers zich makkelijk voor classifier te trainen hebben we tijdmetingen kunnen doen als een ander. met hoge precisie nodig. Helaas is hier geen Eenmalig een classifier trainen is niet genoeg. alternatief voor beschikbaar in browsers. Gebruikers zullen over tijd hun type patronen veranderen. Iemand die voor het eerst een In listing 1 zie je een TypeScript voorbeeld toetsenbord gebruikt zal een jaar later heel van hoe we deze keyboard-events kunnen anders typen. We moeten dus continu onze verzamelen. De applicatie registreert de tijd classifiers hertrainen en herevalueren. van interactie met `performance.now()` en

JAVA MAGAZINE | 02 2019

06-09 KEYSTROKE DYNAMICS.indd 7 23-04-19 09:30 08

haalt de relevante informatie uit het `Key- boardEvent`. Zodra de gebruiker de opdracht zin succesvol heeft getypt, wordt het naar het backend-systeem gestuurd. Feature extractie Aan de hand van de verzamelde keyboard- events kunnen we de relevante features voor Listing 2. onze classifier extraheren en daarmee het template van de gebruiker creëren.

In listing 2 staat het resulterende JSON object wat naar de backend gestuurd wordt. Dit object bevat een sample van de gebruiker. Om hier de relevante features uit te extrahe- ren, moeten we onze events aggregeren per sample per gebruiker (sessie). De complexiteit ligt hem hier in dat er geen garantie is dat het event voor het aanslaan van de q-toets wordt gevolgd door het loslaten van de q-toets. De volgende reeks geeft bijvoorbeeld het pro- bleem aan ((q, keydown), (w, keydown), (w, keyup), (q, keydown)). Een simpele sliding- window operatie om de features te bere- Listing 3. kenen over de lijst van events, waarbij een aggregatie wordt uitgevoerd over twee events tegelijkertijd (zoals bij de SQL LAG operator) volstaat dus niet. Daarom is het belangrijk om eerst de lijst van events te reduceren tot een lijst van tuples keydown- en keyup-tijden per key (Listing 3). Listing 4.

In listing 4 transformeren we de lijst van netwerken gebruiken alle data beschikbaar VOOR HET keystroke-events naar een lijst van tuples. om een classifier te trainen door middel van Vervolgens kunnen we deze lijst aggregeren beslissings-grenzen tussen de verschillende METEN VAN om onze features te berekenen. datapunten. Als we een neuraal netwerk ge- EEN TYP- bruiken, die de data van alle gebruikers nodig PATROON Om bijvoorbeeld de dwell time te berekenen, heeft om daar de beslissings-grenzen tussen kunnen we simpelweg de keydown-tijd van te bepalen, betekent dat de trainingstijd (li- IS HET de keyup-tijd aftrekken. De complete set neair) langer wordt de meer gebruikers er zijn BELANGRIJK van features is op een soortgelijke manier te en we willen niet dat onze gebruikers moeten DAT WE berekenen. Aan de hand van deze aggregatie wachten totdat er een classifier getraind is. van de features creëren we het template van In plaats daarvan is de beste manier om een ACCURAAT de gebruiker. algoritme zoals Nearest Neighbours te ge- DE TIJD bruiken. K-Nearest Neighbours (k-NN) zijn in TUSSEN De juiste classifier kiezen staat snel een de set aan templates te door- De volgende stap is om een classifier te trai- zoeken naar de dichtstbijliggende punten. De TWEE TOETS- nen aan de hand van het template, zodat we afstand tussen punten wordt bepaald aan AANSLAGEN nieuwe inlogpogingen kunnen valideren. Zo- de hand van de euclidische afstand van alle als eerder vermeld, bestaan er verschillende features. In andere woorden: hoe meer het KUNNEN benaderingen om een classifier te maken. De type patroon van een inlogpoging afwijkt van METEN vraag is: “Wat is de ideale classifier voor een het template van een gebruiker, hoe groter de web-based authenticatie systeem”? euclidische afstand zal zijn. Als het template gevonden door het algoritme We willen een oplossing dat waarmee het overeenkomt met de template van de gebrui- systeem bij registratie van nieuwe gebrui- ker die op dit moment inlogt, dan weten we kers snel een classifier kan trainen. Neurale dat de correcte gebruiker in aan het loggen

JAVA MAGAZINE

06-09 KEYSTROKE DYNAMICS.indd 8 23-04-19 09:30 KEYSTROKE DYNAMICS

als een authenticatie mechanisme: voor HET KAN een goede approximatie van de FAR zijn we afhankelijk van de hoeveelheid gebruikers NOG VERDER in ons systeem! Maar er zijn al succesvolle GAAN: EEN studies gedaan met groepen zo klein als 12 3 BOZE GEBRUI- gebruikers. KER TYPT TypingDNA ANDERS Een framework, dat gebruik maakt van DAN EEN keystroke dynamics zoals beschreven in deze artikel is TypingDNA.4 TypingDNA bestaat uit ONTSPANNEN twee delen: een JavaScript client en een set GEBRUIKER Afbeelding 2. aan backend API’s (zie afbeelding 2). Door het importeren van het `typingdna.js` script wordt is. Als het niet overeenkomt blokkeren we de in de achtergrond de type patronen van de inlogpoging. Hier zijn een aantal heuristieken gebruiker verzamelt. Deze kunnen dan mee- bij nodig: als er weinig gebruikers zijn, zal een gestuurd worden naar jouw applicatie, waarna punt sneller nabij zijn dan als we al veel ge- met de TypingDNA API’s de gebruiker’s type bruikers in ons systeem hebben. Er is dus een patronen geregistreerd kunnen worden of maximale afstand die we kunnen accepteren, geverifieerd kan worden of de type patronen een threshold. matchen met de verwachte gebruiker (Afbeel- ding 3). In afbeelding 2 zie je een (simplistisch) voorbeeld van een k-NN algoritme aan de hand van twee features. De rode punten in dit figuur zijn het template van de gebruiker: de aggregatie van de type patronen van de gebruiker verzameld tijdens de registratie en latere inlogpogingen. De cirkel representeert de threshold van deze classifier. Aan de hand van de template wordt deze waarde bepaald. Afbeelding 3. Het blauwe punt is een nieuwe inlogpoging, die in dit geval geblokkeerd zal worden, aan- gezien deze buiten de threshold valt. De toekomst De complexiteit in het trainen van een Recentelijk zijn er wetenschappelijke arti- Nearest Neighbour classifier voor keystroke kelen verschenen waarin keystroke dyna- dynamics ligt in het bepalen van de FAR en de mics werd gebruikt om de emotie van een FRR. De FAR is het percentage false positives, gebruiker te bepalen.Een boze gebruiker typt onterechte succesvolle authenticaties. Maar anders dan een ontspannen gebruiker. Wat dit kunnen we pas meten als we meetpunten ook een interessante ontwikkeling in dit veld hebben waar een gebruiker foutief geïdenti- is het gebruik van keystroke dynamics om te ficeerd werd. Dit is makkelijk te realiseren in bepalen of een gebruiker liegt of niet. In het een gecontroleerde studie, maar in web- wetenschappelijke artikel werd een accuraat- based authenticatiesysteem kunnen we niet heid van 75% bereikt! Er zijn dus nog genoeg wachten op foutieve identificaties. Dat is wat mogelijkheden in dit veld, en ik ben benieuwd we juist proberen te voorkomen! wat de toekomst ons brengt. In plaats daarvan moeten we een benadering vinden voor de FAR. Dit kan bijvoorbeeld door in Nearest Neighbours voor elke nieuwe re- gistratie de templates van de dichtstbijzijnde REFERENTIES gebruikers te vergelijken met de template van [1] Keystroke dynamics as a biometric for authentication - F. Monrose and A. D. Rubin de nieuwe registrant. Als deze geaccepteerd [2] Dimensionality reduction and feature extraction applications in identifying compu- worden door de classifier weten we dat deze ter users - D. Bleha and M. Obaidat te tolerant is. Met deze approximatie van [3] A systematic review on keystroke dynamics - P. Pisani, A. Lorena de FAR kunnen we ook de threshold afstand [4] https://github.com/TypingDNA/Demos/tree/master/NodeJs/login - Een voor- beeld NodeJS app met TypingDNA optimaliseren. Hierin ligt wel een probleem voor het gebruik van keystroke dynamics

JAVA MAGAZINE | 02 2019

06-09 KEYSTROKE DYNAMICS.indd 9 23-04-19 09:30 10 Blockchain powered code reviews A key driver of the hype around Blockchain technologies has been the recent boom in crypto currencies, where tech companies are able to source vast amounts of public investment via ICOs (Initial Coin Offerings). The validity of cryptocurrencies as a store of value in the 21st cen- tury is very much up for economic discussion, given their huge volatility in value against fiat currencies. However, the underlying blockchain technology that the majority of these coins employ seems to provide more tangible value to the tech community. That is: trust, decentra- lization and security.

For an online supermarket like Picnic, trust the members of the team. For some time it and security are two highly coveted properties had been the case that the developers who in supply chain management. The develop- were more proactive about code reviewing, or ment of Blockchain technologies and proto- who valued the process more, were picking up cols by IBM for such purposes have caught our the actual task at hand. This lead to a shift attention. In addition to such developments, in the dispersion of knowledge and weight of we decided to turn Blockchain technology to a this responsibility fell onto the few. It became novel task: our development process. clear that we needed a way to encourage Phil is a Tech Lead a healthier balance for such an important and Java Developer Motivation responsibility. at Picnic. When At Picnic, our Java backend development pro- he is not building cess revolves around code reviews. We believe Concept backend systems it to be a key influencer on code quality and What we set out to promote in the Picnic tech or evangelising for knowledge sharing across the variety of sys- team was simple: reactive program- tems that make up the Picnic tech ecosystem. Give back what you take. Better still, give ming he is looking back more if you can. for ways to improve While we can promote knowledge sharing to To quantify the discrepancy between PRs and the development a certain extent, via means of tech talks and reviews, we make a parallel to the upload/ process. impromptu coffee discussions, at the end of download ratio metric implemented in a the day a true understanding of backend sys- number of popular peer-to-peer file sharing tems lies within the code. The same can be protocols such as BitTorrent. The availability said for the quality of our code. Having multi- of the torrent being shared on the network ple keen eyes scan through your lines of code is dependant upon people uploading at helps us all keeping to a high development least what they download. The health of the standard. It aids in catching bugs early, pre- network diminishes if the formula in image 1 venting critical issues, and it keeps the code holds for all users U. clean, readable and architecturally sound. We strive to increase the bus factor within the backend team, and ownership of code and systems amongst us all. But how do you go about quantifying and incentivizing this we simply quantify our sharing metric as in practice without using physical buses? image 2. -> we simply quantify our sharing metric as in image 2 for any developer d.. As Java developers at Picnic, we have a simple general policy: that your code is reviewed by at least two other developers. Even with such a requirement, we discovered that the task of reviewing wasn’t naturally dispersed amongst

JAVA MAGAZINE

10-13 CODE REVIEWS.indd 10 23-04-19 09:30 CODE REVIEWS

Given that we strive for two reviewers on every pull request, we should strive for a review network health as seen in the formula in image 3.

With this in mind, how do we encourage and incentivize developers to aim for this golden ratio, to keep the network healthy and to keep developers happy? Reviewer Leaderboard To try and address this issue, Nathan Kooij and myself developed a leaderboard and fun incentive scheme based on this simple reviewing metric as seen in image 4. Develo- pers are ranked based on their reviewing ratio Developers mine coins based on their contributions to code reviews. over our GitHub projects. For every hour that a developer has a ratio above one (and thus at least helping retain the network health) they receive a proportionate chunk of Picnic Coin in return.

We wanted to be sure to keep this a light- hearted yet informative affair, and to avoid shaming of colleagues we anonymize develo- pers with a ratio below one. They can reveal their names by signing in using their GitHub account. Gathering data from GitHub The backend is powered by a lightweight Python application using the PyGithub API. We fetch pull requests from the Github API at a fixed rate and reduce them to our metrics which we serve to a Vue.js frontend app seen in image 5. Image 5.

We have to filter the data where GitHub marks developers as reviewers on their own pull requests, and sidestep 0 division meaning that the number of authored pull requests is bounded below by 1. Image 6. Private Ethereum Blockchain Given our up to date code reviewing metrics a single starting point for the blockchain to we can use this to pay out our hard working form all other transactions from. We can initi- developers in Picnic Coin. Picnic Coin is powe- alize the node with the command in image 6. red by the popular contract based cryptocur- rency Ethereum. We booted up a private Geth Once initialized, we can run our Geth node Ethereum node and initialized it with what is with a specific configuration. We indicate to referred to as a genesis block. This is simply Geth that this is a private network, to conduct

JAVA MAGAZINE | 02 2019

10-13 CODE REVIEWS.indd 11 23-04-19 09:30 12

THE MOTIVA- TION FOR CREATING THIS LEADERBOARD Image 7. WAS TO RAISE AWARENESS AND ENCOU- mining on a single thread (required in order as much as I take” is understandable, it’s RAGE A FAIR to verify transactions) and to expose the RPC the minimum requirement of the fair usage interface so that our backend app can issue policy. While at the time we were happy that USAGE POLICY transactions directly to the node in image 7. we had achieved such an increase in revie- FOR CODE wing effort in around a year and a half in, our REVIEWING Paying developers thirst for quality code reviews wasn’t fully With our Ethereum node up and running, we quenched. can now issue transactions from our backend Python application based on our reviewing Image 8. ratios. Using the Ethereum web3 interface we can create accounts and generate wallet addresses for developers, and then proceed to pay them at a given going rate. We can fix the payment rate to any factor of wei (being Ethereum’s smallest denomination).

We then make the payment from the main account (etherbase), and we schedule this whole procedure at a rate of once an hour.

We expose the wallet addresses, account balances, ratios, and developer information to our frontend app. Image 8. Analysis The primary motivation for creating this leaderboard was to raise awareness and to essentially encourage a fair usage policy for code reviewing within Picnic. We opened the leaderboard to the backend developers at Picnic at the end of April 2018. After almost a year, we took a look at the data to see whether it had any tangible impact on our code review process. We inspected GitHub data from our backend, data engineering and data science related repositories.

Since adopting an intense code review process towards the end of 2016 we have observed a steady upwards trend of how much we value reviewing code in relation to how much we produce, as seen in image 9.

As we approach the time we introduced the leaderboard, we see that the average effort that a developer spends on reviewing code as opposed to producing it begins to plateau at around 1.0. The reasoning of “I should give

JAVA MAGAZINE

10-13 CODE REVIEWS.indd 12 23-04-19 09:30 CODE REVIEWS

As mentioned previously, our goal is to incen- tivize developers to push towards a ratio of 2. We want to offset the diminishing of know- ledge sharing as the company grows at a rapid rate into 2019. Having at least two sets of eyes on each pull request is our standard mo- del, so this is certainly attainable. Since the introduction of leaderboard, developers have been galvanized once again to dedicate more effort towards reviewing code by highlighting individual reviewer performance. It is great to Image 9. see this uplift in effort continue into 2019. Sustaining the Trend The deviation between reviews and pull request trends is ever increasing. Unsurprisin- gly, as we expand our tech team year in year out we see an increase in the rate of open PRs. What is striking to notice is that since adopting code reviews we have seen an ever increasing rate of code reviews that surpasses that of the number of PRs being opened. The gap is drawing ever larger which is great news for code quality, knowledge sharing and bug catching. From the graph in figure 10 of rolling PR and review numbers, this trend is clear.

It is also clear that the introduction of the leaderboard had no significant effect on our growth in this regard. It turns out we were already on the right path. What is promising for the future however is that there appears Image 10. to be no slowing down in the rate at which we are reviewing pull requests. From the crossover point at December 2017 to February covered is that our process is already rapidly of 2018 we saw an increase of 1.74x in the rate approaching our goal. Such gamification has at which we are increasing our code reviews had an effect on prompting developers to be over opening pull requests in this time period. more aware of their review contributions, but Looking at the same window a year on and with a distinct existing upwards trajectory it this rate has increased to 1.98. We are now is hard for us to single out the leaderboard as doubling the rate at which we are diverging being the sole reason for this reinvigoration these efforts. of the existing trend. What it did however, was start a wider conversation within the tech Conclusion team on the topic of fair code reviews. At Picnic we have gamified code reviews. We have devised a novel solution to address the We believe that the introduction of such imbalance in code production versus code a leaderboard would be more pronounced reviewal in pursuit of knowledge sharing and within organisations with a far more sluggish a fairer code review process. What we dis- code review process.

JAVA MAGAZINE | 02 2019

10-13 CODE REVIEWS.indd 13 23-04-19 09:30 14 Docs-as-code “On Sunday, October 19th, 2008, I sat down in my San Francisco apartment with a glass of apple cider and a clear mind. After a period of reflection, I had an idea. While I’m not specifi- cally trained as an author of prose, I am trained as an author of code. What would happen if I approached blogging from a software development perspective? What would that look like?” - ‘Blogging Like a Hacker’ van Tom Preston-Werner, medeoprichter van GitHub.

Bovenstaande quote was mogelijk de eerste de gevraagde applicatieversie. Daarnaast kun- referentie en misschien wel de eerste aanzet nen nieuwe features direct worden gedocu- tot docs-as-code. Het idee van docs-as-code is menteerd op de feature branch. dat documentatie wordt geschreven met de- Met de documenten in platte tekst kunnen zelfde mindset en toolset, die wij als program- de vertrouwde tools worden gebruikt. Je hoeft meurs reeds hebben. Denk hierbij aan tools, dus niet meer te werken met vervelende zoals het versiebeheersysteem, issue tracker, teksteditors, maar met je eigen editor of fa- review cyclus, automatische testen, etcetera. voriete IDE. Dit betekent minder contextwis- Mathijs de Groot selingen en meer focus. Hetzelfde geldt voor is één van de vak- Als het idee wordt losgelaten dat documen- het uitvoeren van documentatiereviews: je idioten bij JDriven tatie statisch is, maar dat het evolueert net hoeft niet langer commentaar in documenten met een focus op als de code van een applicatie, dan kunnen de of losse e-mails heen-en-weer te sturen en Java development, bestaande werkprocessen die wij als ontwik- handmatig aanpassingen te mergen, maar je modularisatie en kelaars dagelijks gebruiken en continu opti- gebruikt de vertrouwde reviewtools, zoals pull containerplatfor- maliseren ook hierop worden toegepast. requests of Crucible. men. Fout in de documentatie gevonden? Nieuw Veel organisaties hebben de docs-as-code item in de issue tracker! aanpak al omarmd, zoals Google, GitHub docs, Bootstrap, Stack Overflow Blog en nog Out-of-date vele anderen. Niets is zo vervelend als het lezen van verouderde documentatie, waarbij de lezer Voorbeeld wordt gevoed met incorrecte of onvolledige Een praktische invulling informatie. Dit is een reden waarom sommige van docs-as-code is ontwikkelaars zelfs helemaal gestopt zijn met het toevoegen van een het schrijven van documentatie, vaak met folder naast de applica- het argument dat “de code de waarheid is”. tie source-folder, voor Dit klopt, maar er mist dan wel informatie, documentatie in platte zoals wat de aanleiding was, welke intenties tekst die bij elke build er waren, welke opties overwogen zijn en de automatisch centraal wordt gepubliceerd. aannames of randvoorwaarden. AsciiDoc Up-to-date Documentatie schrijven in platte tekst stelt Met een docs-as-code mindset is documen- je in staat om meer te halen uit de reeds aan- tatie up-to-date houden beter te borgen. wezige tools. Met de code en documentatie Bijvoorbeeld doordat bij elke significante samen in versiebeheer is het mogelijk om een aanpassing het pull request, Crucible review diff te doen tussen twee commits, branches of pair-review een documentatie-update of tags. Met behulp van versiebeheer wordt moet bevatten. In Scrum-termen: dit wordt altijd de juiste documentatie opgeleverd met nu onderdeel van je Definition of Done.

JAVA MAGAZINE

14-17 DOCS AS CODE.indd 14 23-04-19 09:30 DOCS-AS-CODE

Samenwerken Praktische toepassing Los van de tools en technieken die worden Binnen ons project zijn wij gestart met de gebruikt, is het essentieel dat de documen- docs-as-code werkwijze. Hierbij hebben tatie onderdeel wordt van de workflow, de verschillende teams deze werkwijze opgepakt software development lifecycle. Hierbij wordt door middel van een pragmatische invulling, in de analyse- en designfases vastgelegd aansluitend op de reeds aanwezige tools. waarom bepaalde keuzes zijn gemaakt en wat de intentie is. Tijdens de implementatie- en In de codebases van de teams zijn docu- testfases wordt dit verder aangevuld, waarbij mentatiemappen opgenomen. Jenkins wordt DOCS-AS-CODE het geheel zich herhaalt om ook de documen- gebruikt om de documentatie periodiek GEEFT EEN tatie iteratief te verbeteren. centraal te publiceren. Hier is de volledige VERFRISSENDE content doorzoekbaar, doordat deze wordt geïndexeerd. KIJK OP HET MAKEN EN ONDERHOUDEN VAN DOCUMEN- TATIE MET DE REEDS VERTROUWDE Als documenteren op dezelfde golflengte zit TOOLS EN als het ontwikkelwerk, dan documenteren De documentatie is geschreven in AsciiDoc sommige developers opeens wel. Wanneer en PlantUML voor het maken van tekst- PROCESSEN documentatie hetzelfde wordt behandeld gebaseerde diagrammen en waar nodig als code, dan kan gesproken worden van docs- aangevuld met binaire afbeeldingen. De as-code. AsciiDoc documentatie wordt door middel van de AsciiDoctor Gradle plug-in omgezet Platte tekst naar HTML5. Vervolgens publiceert Jenkins de Markdown is een populair formaat, het heeft masterbranch continu naar Confluence door eenvoudige opmaakelementen en is een middel van de docToolchain tool. Wijzigingen veelgebruikte standaard, zoals in readme in code en documentatie worden gereviewd bestanden. De eenvoud van Markdown is door het toebedelen van Crucible reviews of meteen de grootste tekortkoming, daarnaast pull requests. heeft MarkDown vele implementaties van de syntax, net zoals bij de verschillende regex implementaties. Voor het schrijven van documentatie in platte tekst is AsciiDoc een voor de hand liggende keuze. AsciiDoc is een rijkere taal voor de opmaak van tekst, in combinatie met de As- ciiDoctor tooling en PlantUML voor diagram- men. Het heeft zelf al een aantal handige features, waardoor je het kunt gebruiken voor het schrijven van kleine artikelen, maar ook complete boeken. AsciiDoc is een geac- cepteerd formaat bij onder andere uitgever O’Reilly. docToolchain AsciiDoc en AsciiDoctor zijn al eerder in Java docToolchain is een implementatie van de Magazine langsgekomen. Zie voor meer infor- docs-as-code aanpak voor software archi- matie de artikelen ‘AsciiDoctor’ en ‘Genereer tectuur en automatisering. In dit voorbeeld een gebruikershandleiding – Met je tests’ door wordt van deze brede open source tool respectievelijk Hubert Klein Ikkink en Martijn Dashorst. Beide zijn terug te vinden op de Java alleen de publicatie-functie naar Confluence Magazine website van de NLJUG. gebruikt ten behoeve van de build automati- sering.

JAVA MAGAZINE | 02 2019

14-17 DOCS AS CODE.indd 15 23-04-19 09:30 16

In mijn ervaring zijn vergelijkbare tools slecht gedocumenteerd, niet goed onderhouden of plugins { lastiger in te passen in een Jenkins build- id 'org.asciidoctor.convert' version '1.5.3' straat met Gradle. }

apply plugin: 'java' Zie voor meer informatie: apply plugin: 'org.asciidoctor.convert' https://doctoolchain.github.io/docToolchain/ version = '1.0.0-SNAPSHOT' Er zijn twee mogelijkheden voor het gebruik asciidoctorj { van docToolchain. De tool (codebase) kan in version = '1.5.5' een bestaand project worden toegevoegd, } maar docToolchain kan ook worden gebruikt asciidoctor { als externe tool. attributes \ 'build-gradle': file('build.gradle'), In deze opzet is ervoor gekozen om de tool 'sourcedir': project.sourceSets.main.java.srcDirs[0], 'endpoint-url': 'http://example.org', op de Jenkins slaves te plaatsen en niet in de 'source-highlighter': 'coderay', codebase. Hiermee worden de codebases van 'imagesdir': 'images', de verschillende teams/services niet onnodig 'toc': 'left', 'icons': 'font', groot en kan het lifecycle management van 'setanchors': '', de tool centraal worden geregeld. Hiermee 'idprefix': '', is er wel een afhankelijkheid ontstaan met 'idseparator': '-', 'docinfo1': '' (specifieke) Jenkins slaves en moet de tool lo- } kaal geïnstalleerd zijn als het volledige proces moet worden doorlopen. Listing 1: build.gradle - AsciiDoctor Gradle plug-in configuratie.

Voorbeeld implementatie mooie pagina met 60 regels aan features, De flow van AsciiDoc document tot Conflu- zoals code includes, includes uit andere pa- ence pagina bestaat uit drie stappen: gina’s, links en een inline afbeelding. 1. Converteer de geschreven AsciiDoc naar HTML5 met AsciiDoctor Er is gekozen om de conversie naar HTML 2. Publiceer de gegenereerde HTML naar niet door docToolchain te laten doen, maar Confluence met docToolchain door de AsciiDoctor Gradle plug-in. Hiermee 3. Automatiseer het proces met Jenkins worden ontwikkelaars in staat gesteld om de HTML te genereren zonder dat docToolchain Converteer AsciiDoc nodig is. Daarnaast geeft dit project-specifie- naar HTML5 ke aanpassingsmogelijkheden (listing 1). Als AsciiDoc voorbeelddocument wordt een GitHub project gebruikt van asciidoctor/ Converteer AsciiDoc naar HTML5: asciidoctor-gradle-examples. Het $ gradlew asciidoctor asciidoc-to-html-example bevat een

JAVA MAGAZINE

14-17 DOCS AS CODE.indd 16 23-04-19 09:30 DOCS-AS-CODE

Publiceer HTML naar Confluence confluence = [:] Installeer docToolchain v1.1.0 en plaats confluence.with { input = [ // array of files to upload to Confluence een kopie van het Config.groovy bestand [ file: "build/asciidoc/html5/example-manual.html", uit de open source tool in je eigen project. ancestorId: 30937980 ], Geef het bestand een omschrijvende naam, ] bijvoorbeeld: PublishToConfluenceConfig. api = 'https://[confluence_server]/[api_context]/rest/api/' groovy. Vul het confluence deel van de configuratie // the key of the confluence space to write to aan met de eigenschappen van jouw Conflu- spaceKey = 'XYZ' ence server (listing 2). // split “.sect2” sections from the current page into subpages createSubpages = false Het is het id van Confluence pa- ancestorId // prefix for each page title to make pages unique gina waar de betreffende pagina onder wordt pagePrefix = '' geplaatst. Het pagina id kan worden gevon- credentials = “user:pass_or_token”.bytes.encodeBase64().toString() den met de confluence API: https://[ser- ver]/[context]/rest/api/search3/1.0/ // HTML Content that will be included with every page published search?queryString=MyPageName extraPageContent = 'This is a generated page, do not edit!' browser. }

Het ancestorId is dé koppeling met de Confluence locatie en stelt je in staat om Listing 2: PublishToConfluenceConfig.groovy - docToochain configuratie. structuur aan te brengen in een (reeds gevulde) Confluence space. Als het id leeg is, wordt de pagina onder de root van de space toegevoegd. def user = System.getenv()['CONFLUENCE_CREDENTIALS_USR'] def pass = System.getenv()['CONFLUENCE_CREDENTIALS_PSW'] if (user && pass) { Publiceer naar Confluence: println "Confluence authentication set by system environment variables"

confluence.credentials = (user + ':' + pass) $ doctoolchain . publishToConfluence .bytes.encode-Base64().toString() -PmainConfigFile=PublishToConfluenceC } else if (confluence.credentials) { onfig.groovy --no-daemon println "Confluence authentication set by configuration file" } else { De Confluence.input heeft ook mogelijk- throw new IllegalArgumentException("No Confluence credentials heden voor URL’s en specifieke paginatitels, are set by environment variables or configuration file, see readme Confluence spaces, titel-prefixes en het file") } maken van meerdere subpagina’s. Listing 3: PublishToConfluenceConfig.groovy - Credentials ophalen. Automatiseren Het automatiseren van de voorgaande stap- pen in een Jenkins pipeline met behulp van stukje logica toe om de credentials uit omge- een Jenkinsfile is nu vrij eenvoudig. vingsvariabelen op te halen (listing 3).

Zorg er wel voor dat de Confluence credentials Zet de voorgaande stappen van het converte- niet in versiebeheer komen. Maak deze leeg ren van AsciiDoc naar HTML en het publiceren in de PublishToConfluenceConfig.groovy naar Confluence in de Jenkinsfile, samen met configuratie file: credentials = ''. het ophalen van de credentials (listing 4).

Voeg de Confluence credenties toe aan Beperkingen Jenkins als Jenkins Credentials, bijvoorbeeld voorbeeldimplementatie met id: credentials-confluence-api- Binnen één Confluence space moeten alle publish. Overigens ondersteunt de Con- paginatitels uniek zijn. Dit kan een probleem fluence Cloud API tokens. Voeg onderaan zijn als meerdere lagen van de documenta- PublishToConfluenceConfig.groovy een tie een gelijksoortige structuur hebben met

JAVA MAGAZINE | 02 2019

14-17 DOCS AS CODE.indd 17 23-04-19 09:30 18

bijbehorende titels, zoals inleiding en beslis- singen, of als de space wordt gedeeld met bestaande content. Een specifieke of globale paginatitel prefix kan hier uitkomst bieden in de docToolchain configuratie.

docToolchain updatet en voegt pagina’s Jenkins pipeline. toe aan Confluence, maar zal geen pagina’s verwijderen. Ook na het hernoemen van #Jenkins declarative pipeline syntax een pagina zal de oorspronkelijke pagina pipeline { niet worden verwijderd. Het is mogelijk dat agent any de Confluence space wordt gedeeld met triggers { bestaande, handmatig aangebrachte content. pollSCM('*/5 * * * *') Een oplossing kan zijn om periodiek de sub- } pagina’s onder het ancestorId op te ruimen stages { en de content opnieuw te genereren. stage('Checkout') { steps { De Confluence search API heeft meerdere checkout scm } bekende problemen met speciale karakters. } De gepubliceerde paginatitels en gekozen stage('Convert to HTML5') { prefixes kunnen geen van deze karakters steps { sh './gradlew asciidoctor' bevatten. } } Confluence is niet een ideaal medium als stage('Publish to Confluence') { environment { documentatie van meerdere branches of CONFLUENCE_CREDENTIALS = releases moet worden ondersteund. credentials('credentials-confluence-api-publish') } steps { Aandachtspunten docs-as-code sh 'doctoolchain \ Docs-as-code is niet de gouden hamer voor . \ kennisborging. Kennisborging en kennisdeling publishToConfluence \ is altijd al een lastig punt binnen organisaties -PmainConfigFile=PublishToConfluenceConfig.groovy \ --no-daemon' en vaak al binnen teams. Organisatorisch zal } er enige vorm van uniformiteit nodig zijn om } documentatie laagdrempelig beschikbaar te } } maken.

Door de verspreiding over de verschillende Listing 4: Jenkinsfile - Publicatie pipeline. codebases is hergebruik van documentatie content lastig, net als de ondersteuning voor meerdere talen. tekstdocumenten in versiebeheer geeft vele voordelen met betrekking tot samenwerking Er zal altijd overkoepelende documentatie zijn en het up-to-date houden van documentatie. die niet in één van de codebases thuishoort, Adoptie kan relatief eenvoudig en gefaseerd zoals een landschapsoverzicht, systeemar- gebeuren. Daarentegen zijn niet alle tools chitectuur, team overstijgende afspraken of even volwassen en vergt de mindset en orga- Lightweight Architectural Decision Records nisatorische kant aandacht. (ADR). Hier kan een apart project voor gene- rieke documentatie een uitkomst bieden. LINKS Conclusie Voorbeelduitwerking: https://github.com/madegroot/asciidoctor-gradle-html- Docs-as-code geeft een verfrissende kijk docToolchain-example op het maken en onderhouden van docu- docToolchain https://doctoolchain.github.io/docToolchain/ mentatie met de reeds vertrouwde tools Naslagwerk: http://www.writethedocs.org/ en processen. Gebruikmakend van platte-

JAVA MAGAZINE

14-17 DOCS AS CODE.indd 18 23-04-19 09:30 COLUMN

Rollen en patronen

Joop Lanting is vaste columnist Uit mijn werk deed ik dan boodschap- Over lagere kasten gesproken, in de au- voor Java Magazine pen. In de supermarkt werd ik steevast tomatisering zijn vrouwen dat kennelijk aangeklampt door dames die “iets niet nog steeds. konden vinden”: ze zagen me aan voor de Zijn ze sexy en slim, dan gaan ze de filiaalchef. Vóór de supermarkt stond een verkoop in. Ik bedoel als commercieel vage figuur met een stapel zo mogelijk medewerker, niet als artikel! nog vagere krantjes, gekleed in confectie: Sexy en dom? Dan kunnen ze nog dienen bedelaar in vaste dienst. als receptie gezichtje of rondleidster. Onze maatschappij is gestructureerd met Toen kwam zijn baas langs, ter controle, Niet sexy? Dan kunnen ze nog nuttig zijn en door de verschillen tussen mensen. een jonge kerel in driedelig pak. De taak- als secretaresse, koffiejuffrouw of toilet Alle mensen gelijk? verdeling was duidelijk. beheer, anders zijn ze niet te handhaven. Vergeet het maar! Alle Menschen werden Lelijk? Brüder? Nou, een beetje, maar niet Singapore Airlines laat zijn lieftallige Dan moeten ze maar weg. Veel klanten, overdrijven. Zodra de Franse revolu- stewardessen rondhollen in prachtige py- ook vrouwelijke, nemen een program- tie een feit was (Egalité!) werden de jama’s, maar let op de kleuren: die meid merende meid niet serieus. kameraad-baas en de kameraad-loop- in het groen is de baas (bazin dan). Zij Ik moest eens een presentatie geven jongen gecreëerd,en dat was nog maar deelt de lakens uit, maar niet de dekens samen met een vrouwelijke collega. We het begin. Verder zijn we (min of meer) en de menukaarten. spraken af dat zij de presentatie zou te onderscheiden in mannen en vrou- Die knul in uniform met strepen is de doen en dat ik reserve zou zijn voor lasti- wen, groot en klein, sterk en zwak, dom co-piloot. Van hem krijg je niets te eten, ge vragen. Maar voor elke vraag wendde en slim, enzovoort. En áls we op elkaar zelfs niet onder bedreiging. men zich tot mij, zelfs toen ik achter in lijken worden we in verschillende rolpa- de zaal ging staan. Denk vooral niet dat tronen geduwd, soms is het een kwestie En dan de automatisering. De eerste keer het in de 21e eeuw veranderd is. van het verkeerde moment of plaats, en dat ik als consultant mee ging naar een soms omdat er maar plaats was voor één grote klant leerde ik wat mijn plaats was: Het is treurig dat veel automatiseerders bepaalde functionaris. En we krijgen ter wij wandelden een grote zaal binnen met niet op hun meritus worden beoordeeld. onderscheid verschillende pakjes aan. tientallen werkplekken, computers en Hun kleding, hun kapsel, hun dialect, printers. ... De eerste indruk is natuurlijk een Rolpatronen zijn fundamenteel in o.a. Mijn collega bitste: “daar hangt een daalder waard, maar een boer’n knul, de politiek, op kantoor en in het leger. printerkabel los, niet aanzitten anders een Marokkaan en een juffrouw met een Wat dat laatste betreft, ik was in dienst denken ze dat je monteur bent”. zagggte G hebben gemeen dat ze laag niet in voor officiersopleiding: niemand Tot dan toe had ik computermonteur een worden ingeschat. Wanneer ik terug kijk luistert naar me. Het leger is gebouwd achtenswaardig beroep gevonden; dat op mijn carrière en met wie ik te maken op gezag; zonder dat doet iedereen maar bleek een lagere kaste te zijn. heb gehad dan waren mensen als zij vaak raak. Sterren en strepen maken het Techneuten (was ik kennelijk) kunnen het waardevolst. onderscheid. En orders zijn orders. niet presenteren of toespreken; althans Om maar te zwijgen over gekleurde Gaat het fout, dan kost dat misschien dat is hier en daar de opinie. Toen ik eens collega’s en personen van buitenlandse mensenlevens, maar dan is de eerste met verkopende collega voor een zaaltje origine. Die vertrouw je niet. vraag die gesteld wordt: “Zijn de orders klanten stond wilde er een beslist weten Daarbij krijgt de hypocrisie de overhand: opgevolgd?” Niet: “Wie zijn schuld waarom een disk van 370Mb slechts uit het Westen komen interessante lui, was dat?”. Een officiële herdenking in 340Mb netto bleek te zijn. Mijn maat uit het Oosten en Zuiden komen domme uniform op de TV heeft de prioriteit, niet was hulpeloos. Ik nam het dus maar over profiteurs...... behalve uit India, want de krijgsraad. Maar rijd je als gewoon en legde in het kort een disk drive uit meneer Anand is een groot schaker! soldaat met je jeep een paaltje om ... { blokken, sporen, gaps, heads, platters } tot tevredenheid van de klanten. ;JOOP! In de burgermaatschappij is het niet Mijn confrater heeft mij die vernedering anders. In mijn ‘goeie tijd’ ging ik voor nooit vergeven, maar de order was wel mijn baan gekleed in pak met stropdas. gescoord.

JAVA MAGAZINE | 02 2019

19 COLUMN JOOP.indd 19 23-04-19 09:30 20

Venkat Subramaniam Over lesgeven, eenvoud en kwalitatieve code

Toen Venkat Subramaniam op 13 november 2018 in België was voor Devoxx, hebben de mensen van Team Rockstars IT hem gestrikt voor een interview. Hierbij het verslag van Java Magazine.

Venkat Subramaniam is een bekende auteur mijn code gaat kijken, schrijf ik de code heel en spreker over agile development. Hij be- anders. En als ze er dan écht naar kijken en zoekt de ene na de andere conferentie, vaak er commentaar op leveren, gaat het vaak om als spreker. Toch slaagt hij erin om zijn tijd aspecten waarvan ik dacht: wauw, dat had ik zeer efficiënt te gebruiken. Zelfs verre reizen niet gezien. Dat menselijke aspect is voor mij zijn voor hem productief: “Een vlucht van acht heel waardevol.” of negen uur is een geweldige tijd om me te focussen op een artikel of een hoofdstuk in Voor Subramaniam gaat het om het juiste Koen Vervloesem is een boek dat ik aan het schrijven ben of op evenwicht vinden tussen zich afzonderen een freelance jour- een ingewikkeld stuk code. Ik ben dan heel zodat hij zich kan focussen en met anderen in nalist met interesse productief. Terwijl veel mensen tijdens hun interactie gaan voor hun nieuwe gezichtspun- in vele onderwer- vlucht films kijken, programmeer ik liever: het ten. “Er zijn momenten waarop ik met men- pen, waaronder is beter dan elke andere vorm van in-flight sen wil werken en er zijn momenten waarop programmeren in entertainment. Reizen om op vakantie te ik in isolatie wil zijn en tijd wil besteden aan Java, Python, Ruby, gaan, is een hele andere modus dan reizen denken.” en JavaScript. als onderdeel van je werk. In het laatste geval wordt het een deel van je routine om op elk Iets ingewikkelds moment tijdens de vlucht zoveel mogelijk eenvoudig maken werk gedaan te krijgen.” Eenvoud speelt een grote rol in Subramani- ams drive om les te geven: “We leven in een Volgens Subramaniam is een vliegtuig zonder hele ingewikkelde wereld. En veel mensen internettoegang zelfs een voordeel. “Ook al maken ingewikkelde dingen nog ingewikkel- zijn we afhankelijk van het internet om din- der. Er zijn zelfs mensen die erin slagen om gen op te zoeken, een vlucht is een geweldig eenvoudige dingen ingewikkeld te maken. Als moment zonder onderbrekingen: geen Twit- ik iets ingewikkelds, al is het maar iets kleins, ter of Facebook. Ook al hebben de meeste eenvoudig kan maken door het jargon weg vliegtuigen waarmee ik nu vlieg wel internet- te nemen en mensen kan laten inzien hoe toegang, ik maak er een punt van om dat niet eenvoudig het is, dan voel ik me goed.” in te schakelen. Die vier tot acht uur zonder internet zijn immers absoluut kostbaar: ik kan Zoals Subramaniam het uitlegt, lijkt het al- me dan op één specifiek probleem focussen.” lemaal eenvoudig. Maar dat is het niet: “De weg om dingen te vereenvoudigen, is echt een Leren uit kritiek moeilijke weg. Ik heb gelukkig de luxe dat ik Subramaniam zou echter niet zijn hele werk- veel tijd kan vrijmaken als het nodig is. En dan dag in de lucht willen vliegen. Hij leert ook doe ik soms twee dagen niets anders dan een veel van interacties met anderen, vooral van probleem aanpakken dat ik wil vereenvoudi- kritiek die anderen op zijn werk leveren. “Als gen. Ik zit dan urenlang op een zaterdag code anderen naar mijn code kijken en er kritiek te schrijven, te herschrijven, weg te gooien op leveren, dan leer ik daar veel van. Alleen en na een uur of zeven heb ik dan een stukje al wanneer ik weet dat iemand anders naar gedistilleerde code dat echt werkt en inzichte-

JAVA MAGAZINE

20-23 INTERVIEW.indd 20 23-04-19 09:30 INTERVIEW

Over lesgeven, eenvoud en kwalitatieve code

lijk is. Voor mij is dat probleem dan belangrijk Niet zo’n slecht idee PROGRAMME- genoeg om me erin te verdiepen en andere om les te geven REN IS VEEL verplichtingen even opzij te zetten.” Die gave om ingewikkelde zaken eenvoudig te maken en het ook eenvoudig uit te leggen, LEUKER DAN Subramaniam beschouwt zichzelf niet als had Subramaniam al tijdens zijn studies. ELKE ANDERE een rockstar developer, zegt hij. “Er is zoveel Toen hij doctoreerde, kwamen zijn klasgeno- VORM VAN dat ik niet weet en wanneer ik over een nieuw ten vaak naar hem als ze met een probleem concept of idee leer, dan worstel ik er vaak zaten. “Ik legde het dan uit en dan zeiden ze IN-FLIGHT EN- weken, maanden, soms jaren mee. Ik heb niet vaak: ‘Wauw, waarom is dit zo eenvoudig als TERTAINMENT die spreekwoordelijke plotselinge klik. Het is jij het uitlegt, terwijl ik er dagen mee gewor- voor mij echt een strijd. Ik ben geen rockstar steld heb?’” developer, maar een spartelende program- meur. En dat vind ik goed. Het zou maar saai Later, toen hij onderwijsassistent was, vroeg zijn als ik al die inzichten eenvoudig zou ver- zijn professor hem eens om voor zijn klas krijgen. De strijd om ertoe te komen, maakt te staan om vragen van zijn studenten te het juist zo spannend.” beantwoorden over computerarchitecturen.

JAVA MAGAZINE | 02 2019

20-23 INTERVIEW.indd 21 23-04-19 09:30 22

IK BEN GEEN ROCKSTAR DEVELOPER, MAAR EEN SPARTELENDE PROGRAMMEUR

“Ik was eerst doodsbenauwd, want ik moest groot voordeel dat je erover lesgeeft, omdat je vragen beantwoorden twee dagen voordat de dan echt dieper in de materie graaft.” studenten hun examen hadden. Mijn uitleg was dus heel belangrijk. Dat was de eerste Lesgeven is volgens Subramaniam een be- keer dat ik voor studenten stond. Toen de les langrijke feedbackklus: “Als je iets uitlegt en voorbij was, zeiden de studenten dat mijn uit- je ziet dat de persoon voor je het niet begrijpt, leg echt een verschil maakte. En toen dacht dan weet je dat je het niet op de juiste manier ik ’s avonds: misschien is het niet zo’n slecht aanbrengt en dan besef je dat je het zelf ook idee om les te geven. Toen startte ik aan de niet helemaal begrijpt.” Subramaniam geeft universiteit met doceren en na tien jaar begon een voorbeeld van toen hij C++ doceerde. “Ik ik ook op conferenties te spreken.” was een concept aan het uitleggen en ik zag duidelijk dat niemand een idee had waarover Meer inzicht door les te geven ik sprak. Toen ik thuiskwam, ging ik zitten Subramaniam is ook gepassioneerd door les- en begon ik na te denken waarom niemand geven, omdat het hem verplicht dieper op de het leek te begrijpen. Toen besefte ik dat ik materie in te gaan. “Als mensen zeggen dat zelf niet begreep wat ik dacht begrepen te ze tien of vijftien jaar ervaring in een industrie hebben, terwijl ik het al vijf jaar doceerde. Dat hebben, dan betekent dat niets. Het gaat niet was echt een zenuwslopende ervaring.” om de hoeveelheid tijd die je erin hebt ge- stopt, maar om hoe diep je op de materie in- De uren erna verdiepte Subramaniam zich gaat. Als je aan het programmeren bent op je dan ook in het onderwerp. “En toen opende werk, dan los je een probleem op en ga je naar er zich plots een kleine deur en zag ik een het volgende probleem. Dat is heel belangrijk kamer waarvan ik niet wist dat die bestond: ik en die ervaring heb je nodig om les te geven. begreep het eindelijk. De volgende dag legde Maar als je programmeert, is het ook een ik het uit en zeiden mijn studenten: ‘Dit is zo

JAVA MAGAZINE

20-23 INTERVIEW.indd 22 23-04-19 09:30 INTERVIEW

eenvoudig, waarom legde je het gisteren niet tijd te besteden aan kwalitatieve code, een zo uit?’ En daarop antwoordde ik eerlijk dat ik probleem. Wie wel heeft geïnvesteerd in het het toen nog niet begreep.” vakmanschap van programmeren, zal zich in een veel comfortabelere positie bevinden.” Soms kan een onderwerp ook onverwachte diepgang herbergen. Zo herinnert Subrama- Geen tijd voor kwaliteit niam zich dat hij eens een presentatie wilde Helaas ziet Subramaniam dat organisa- geven over ‘type inference’ op de JavaOne- ties meer en meer onder tijdsdruk komen conferentie: “Toen ik de presentatie begon te staan. “Ze zeggen dan dat ze geen tijd voor te bereiden, dacht ik: ‘Wat kan ik hier hebben om kwalitatieve code te schrijven over zeggen, in twee minuten heb ik toch en geautomatiseerde tests op te zetten. Ze alles verteld?’ Maar toen begon ik dieper na jagen gewoon hun deadlines achterna. Dat te denken over het onderwerp en vond ik laag moet uiteraard ook gebeuren. Maar als een na laag van complexiteit. Het is net zoals junior developer jarenlang van deadline naar bergbeklimmen, één van mijn andere hobby’s. deadline holt, dan heeft hij of zij alleen maar Je gaat niet ‘gewoon’ naar de top. Je moet geprogrammeerd in deze strakke structuur allerlei kronkelende paadjes volgen. Ik ont- volgens deadlines. Als je dat vijf à tien jaar dekte dat er zoveel te vertellen valt over ‘type doet, ben je misschien ondertussen wel senior inference’ dat ik het zelfs moeilijk vond om developer, maar heb je nooit de tijd gehad het tot een presentatie van één uur samen te om de vaardigheden te ontwikkelen die nodig persen. Uiteindelijk heeft deze presentatie zijn om kwalitatieve code te schrijven. Als je twee uur lang geduurd, omdat de toehoorders dan een keer een kritiek stukje code dient te zo betrokken waren en met me begonnen te schrijven, dan kun je dat niet, omdat je nooit discussiëren.” de kans hebt gekregen om het te leren.” WE HEBBEN 1820, geen 2018 Zelfs bij bedrijven die het belang van kwalita- Bedrijven spannen steeds vaker een proces tieve code inzien, zit die korte termijn focus TIJD NODIG aan wegens de lage kwaliteit van software die nog diep ingebakken. Subramaniam geeft OM FOUTEN ze gebruiken, zeker in de VS. Subramaniam is een voorbeeld van een bedrijf waar hij les TE MAKEN EN niet gelukkig met deze evolutie, maar gelooft ging geven over ‘test-driven development’. dat dit wel tot iets positiefs zal leiden: “Ik “De CTO zei me: ‘Het is geweldig wat je doet, DAARUIT TE geloof dat onze industrie door deze evolutie maar ik heb een tijdlijn nodig. Vertel me hoe LEREN gereguleerd zal worden. Er zullen wetten ko- lang mijn ontwikkelaars nodig hebben om er men die kwaliteit vereisen voor software, zo- goed in te worden.’ Ik moest hem zeggen dat als dat nu al in de medische industrie vereist het een jaar, misschien twee jaar zou duren is. In 1820 liepen dokters letterlijk met bloed voor zijn ontwikkelaars productief zouden op hun jas rond, omdat ze niet beter wisten. worden. Mijn antwoord maakte hem zicht- Pas later ontdekte men dat de dokters zo baar overstuur. Hij dacht dat zijn ontwik- infecties van de ene naar de andere patiënt kelaars na een dag geautomatiseerde tests verspreidden. Pas toen men het concept van zouden schrijven. Maar we hebben tijd nodig ziektekiemen begreep, begon men allerlei om fouten te maken en daaruit te leren. Het beperkingen op te leggen om de verspreiding is net zoals leren fietsen. Je leert pas fietsen van ziektekiemen tegen te gaan, zoals het door te fietsen. Je valt, je kneust je knieën en steriliseren van materiaal. Dat kost geld, maar dat hoort er allemaal bij. Ik ben bezorgd dat het is nodig.” we niet meer de tijd nemen om vaardigheden te leren om kwaliteit af te leveren.” Subramaniam legt de link met de huidige software-industrie: “Voor ons beroep zitten Over agility we nu niet in 2018, maar in 1820. Ons gebrek En zo komen we bij Subramaniams stok- aan discipline en kwaliteit zadelt ons met paardje: agility. “Agility is voor mij code in gigantische kosten op. Software wordt on- hoge kwaliteit en code met hoge snelheid dertussen in alle aspecten van het menselijk kunnen ontwikkelen. Maar je kunt die snel- leven gebruikt. In situaties waar het om heid pas halen wanneer je die snelheid nodig menselijke levens gaat of om hoge financiële hebt en als je vertraagt wanneer je moet ver- belangen, moeten we de manier veranderen tragen. Veel organisaties willen onmiddellijk waarop we software ontwikkelen. Wanneer de snelheid zonder te vertragen. En daardoor die regulering er komt, hebben de ontwikke- zijn ze nu vertraagd, omdat ze niet de moge- laars die nooit de kans hebben gekregen om lijkheid hebben om sneller te gaan.”

JAVA MAGAZINE | 02 2019

20-23 INTERVIEW.indd 23 23-04-19 09:30 24 Hoe word ik een bekende spreker? Claim jouw plaats in de spotlights

De Java-wereld staat bekend om zijn open source gedachte en het denken in communities. Een belangrijk uitgangspunt is dan ook het delen van kennis delen met anderen. Hoe mooi is het als anderen straks jouw ideeën gebruiken? Dat klinkt natuurlijk leuk, maar hoe word je een bekend spreker? Van nature vinden we het allemaal spannend om voor een groep te spreken. Zeker als het publiek dan ook nog eens veel van het onderwerp weet en juist die vraag stelt waar jij geen antwoord op hebt. Dit artikel geeft je tips en trucs en beschrijft hoe je in kleine stappen een goede spreker kunt worden.

Om de vraag goed te kunnen beantwoorden, combinatie van ergens zelfverzekerd kun- heb ik drie developers geïnterviewd waar- nen staan en toch weer uit de comfort zone bij bovenstaande vragen centraal staan. stappen, is wat je moet blijven zoeken. Het Dit artikel is dus tot stand gekomen naar spreekt voor zich dat trainingen op het gebied aanleiding van die interviews, gecombineerd van spreken, ondersteunen aan een carrière met mijn eigen ervaringen. Als eerste ben ik als spreker. Er wordt ook ‘speaker training’ naar het mooie Brugge in België afgereisd om aangeboden, het is goed om daar naartoe te met Stephan Janssen over dit onderwerp te gaan. Koen Aerts is spreken. Stephan is de oprichter van Devoxx, werkzaam binnen Voxxed Days en Devoxx4Kids. Hij heeft overal De stappen tot een bekende spreker zouden Ordina. Na diverse in de wereld al gesproken, met als toppunt er als volgt uit kunnen zien: jaren als software de technical keynote op JavaOne (tegenwoor- Eigen collega’s: de eerste talk geef je aan je ontwikkelaar dig CodeOne) met een publiek van 17.000 eigen collega’s, bijvoorbeeld jouw team of gewerkt te hebben, developers. op de afdeling waar je werkzaam bent. is hij nu manager Eigen organisatie: geef een talk binnen je van Ordina JTech, Vervolgens heb ik een gesprek met Edwin eigen organisatie. Natuurlijk is het belang- Codestar, JSRoots Derks gehad. Edwin werkt bij Ordina JTech rijk dat het een onderwerp betreft waar je en Pythoneers. en heeft al diverse talks gegeven. Hij is trots veel van af weet. op zijn ‘thinking twice about migrating to Lokale JUG (Java User Group): (bijna) iedere serverless’ talk. De ene dag staat hij met deze stad in Nederland heeft tegenwoordig een talk op Codemotion Amsterdam om hem eigen JUG of een meetup groep. Neem vervolgens de volgende dag bij Devoxx UK contact op met deze groepen en probeer nogmaals te presenteren. hier talks te gaan geven. Iedere groep staat hier open voor, zeker als je ook de locatie Kaya Weers, werkzaam bij ING, heeft ook veel en het eten kunt regelen (bijvoorbeeld via ambitie om de komende jaren haar kennis jouw werkgever). te gaan delen met onze mooie open source Quickie op een conferentie: de volgende community. Kaya stond vorig jaar op de ING stap is geaccepteerd te worden op je eerste Innovation Bootcamp met een publiek van 600 conferentie. Voor sommige conferenties, collega’s. Voor Kaya is het belangrijk om een bijvoorbeeld J-Fall en Devoxx Antwerpen, talk te geven over een onderwerp dat zij, even- worden enorm veel cfp’s (Call For Papers) als haar publiek, erg leuk en interessant vindt. ingediend. CFP is het proces waarbij een conferentie vraagt om talks in te sturen. Neem kleine stapjes Dit is bij veel conferenties een openbaar Het is belangrijk om kleine stapjes te nemen proces en dit betekent dat iedereen zijn in je ontwikkeling tot spreker. Een goede of haar talk zelf in kan dienen. Er zijn veel

JAVA MAGAZINE

24-27 HOE WORD IK EEN BEKENDE SPREKER.indd 24 23-04-19 09:30 BEKENDE SPREKER Hoe word ik een bekende spreker? Claim jouw plaats in de spotlights

JAVA MAGAZINE | 02 2019

24-27 HOE WORD IK EEN BEKENDE SPREKER.indd 25 23-04-19 09:30 26

verschillende type talks (keynote, technical session, Hands-on lab, quickie, etc.) en er is veel verschil tussen het aantal inschrij- vingen. Soms is de verhouding tot het aantal inschrijvingen en beschikbare slots 10:1. Het is dus moeilijk om op deze talks geaccepteerd te worden. De ratio voor een quickie is echter anders. Het is (relatief) ge- makkelijk om hier geaccepteerd te worden, dus start met dit type talk. Conferentie: Als je enkele quickies gedaan hebt, is het tijd voor de volgende stap. Probeer geaccepteerd te worden op conferenties en na enkele talks te groeien naar een volwaardige talk in een grote zaal tijdens de primetime uren van de conferen- tie. Sommige conferenties zijn populairder bij sprekers dan anderen, kies hier dus ook verstandig. Er zijn overzichten waar alle conferenties en de bijbehorende cfp’s aan- Kaya Weers. gekondigd worden. https://github.com/ softwaremill/it-cfp-list en www.papercall. mensen reviewen en aanscherpen en zorg dat HET IS BE- io/events zijn hier goede voorbeelden je sprekerservaring volledig en actueel is. Zet van. Voor conferenties in het buitenland ook de kleinere talks (bijvoorbeeld die je bij je LANGRIJK zijn Nederlandse sprekers interessant. eigen werkgever gegeven hebt) erbij, want het OM EEN PAK- Het niveau in Nederland ligt hoog en voor is belangrijk om te laten zien welke ervaring je buitenlandse conferenties zijn wij weer allemaal al hebt. KENDE TITEL internationale sprekers. Dat kan aantrek- EN EEN AAN- kelijk zijn voor de organisator. Jouw voorstel wordt doorgaans beoordeeld TREKKELIJKE Main speaker op een top conferentie: door een programmacommissie. Op het natuurlijk zijn het vele kleine stapjes, maar moment dat zij de spreker nog niet kennen, is ABSTRACT TE uiteindelijk sta je als main speaker op top het moeilijker te beoordelen wat de kwaliteit SCHRIJVEN conferenties te spreken. Tijdens je eerste van de spreker en de talk is. Daar helpt de conferentie talks zal je de reis en verblijfs- biografie en sprekerservaring natuurlijk al kosten zelf, of vanuit jouw organisatie, bij, maar probeer je ook in die commissie te betalen. Naarmate je bekender wordt, kun verplaatsen. Hoe kunnen zij nu echt zien hoe je aan de conferentie vragen om hier in goed je bent? Wellicht heb je een heel gaaf tegemoet te komen; open source project of heb je beeldmateri- Java champion of CodeOne Rockstar: het is aal (foto’s of zelfs video) beschikbaar van fijn als je uiteindelijk erkenning krijgt van- je talks. Eén beeld zegt meer dan duizend uit onze open source community. Andere woorden en dat geldt hier ook. Probeer dus Java Champions kunnen jou benoemen tot ook bij talks beeldmateriaal te verzamelen, Java Champion en de beste sprekers op waardoor je kunt laten zien dat je een goede CodeOne worden uitgeroepen tot CodeOne spreker bent. Rockstar. Uiteraard wordt er hierbij geke- ken naar je sprekerservaring, maar er zijn Dan komt natuurlijk de inhoud van je talk nog veel meer belangrijke criteria. Verderop zelf. Het is belangrijk om een pakkende titel in dit artikel wordt daar nog verder bij stil en een aantrekkelijke abstract te schrijven. gestaan; Zou je als bezoeker van de conferentie zelf naar deze talk gaan? Ook hier is het belang- Verkoop jezelf als spreker rijk om jouw voorstel door anderen te laten It’s a dirty job, but somebody’s gotta do it! reviewen. Het is belangrijk veel aandacht te besteden aan het materiaal dat je gebruikt tijdens het Voorbereiding talk insturen van cfp’s. Dezelfde vragen komen Op het moment dat jouw voorstel geselec- telkens terug bij dit proces. Zo wordt er teerd is, begint de voorbereiding van de talk. altijd om een biografie en sprekerservaring Belangrijk is dat je de materie goed beheerst. gevraagd. Laat je biografie door diverse Het makkelijkste is om te vertellen over een

JAVA MAGAZINE

24-27 HOE WORD IK EEN BEKENDE SPREKER.indd 26 23-04-19 09:30 BEKENDE SPREKER

Edwin Derks. Stephan Janssen.

onderwerp waar je tijdens je werk of tijdens wereld niet meer weg te denken, maar ook een hobbyproject mee bezig bent. Kaya geeft LinkedIn kan helpen bij je naamsbekendheid. daarbij ook aan dat je het onderwerp natuur- Actief zijn met het schrijven van artikelen lijk ook erg leuk moet vinden, want je kunt de en blogs draagt daar ook aan bij. Je kunt inhoud natuurlijk pas goed overdragen als je natuurlijk ook nog boeken schrijven, reageren er zelf enthousiast over bent! op Stackoverflow items en het contributen aan open source projecten. Zo is Edwin bij- Het oefenen van de talk is erg belangrijk. Be- voorbeeld druk bezig met Jakarta EE en is hij gin met oefenen voor de spiegel en oefen ver- daarvoor benoemt als Independent Developer volgens met iemand die je vertrouwt (partner, Advocate. Het is natuurlijk mooi als je veel ouder, etc.). Ook het opnemen en terugkijken content van je talks kunt hergebruiken voor je van je talk is erg waardevol. Je talk en presen- social media communicatie en vice versa. tatievaardigheden worden snel beter als je op deze manier oefent. Stephan wil zijn talk Conclusie eerst 5 keer gepresenteerd hebben, voordat Tegenwoordig zijn er veel mensen enthou- hij met de talk naar een conferentie gaat. siast over het delen van hun kennis en het Vervolgens zijn er natuurlijk boeken, websites spreken op conferenties. Het gevolg is dat en trainingen, die vertellen over het presente- onze open source community leeft als nooit ren zelf. Veel van deze theorie is te herleiden tevoren en op iedere hoek van de straat naar het zelfverzekerd kunnen presenteren. wordt kennis gedeeld. Iedere avond is er wel Als de presentatie start, weet het publiek al een interessant event (bijvoorbeeld mid- in de eerste minuut of daar een zelfverze- dels Meetups) waar je bij kunt zijn. Hopelijk kerde spreker staat. Je bent eerder geboeid en moedigt dit artikel nog meer mensen aan om neemt meer aan op het moment dat iemand stappen te maken richting het delen van ken- zelfverzekerd overkomt. nis en het spreken tijdens conferenties. Het klein beginnen en vervolgens steeds stapjes Wat nog meer? maken om jezelf te blijven prikkelen, is de es- Naast het spreken zijn er natuurlijk nog ande- sentie van dit artikel. Verder is voorbereiding re zaken van belang om een bekende spreker en zelfverzekerd op het podium kunnen gaan te worden. Een groot netwerk in de developer staan de sleutel tot succes. community is belangrijk. Op conferenties en Veel van bovenstaande tips komen voort uit tijdens meetups heb je veel gelegenheid om de interviews met Stephan, Edwin en Kaya. bij te praten met je bestaande netwerk en Graag wil ik hen dan ook bedanken voor hun kennis te maken met nieuwe developers. input en tijd die ze genomen hebben om dit artikel mogelijk te maken. Ik wens hen en ook Verder is natuurlijk het gebruik van social me- de rest van onze community heel veel succes dia niet te onderschatten. Twitter is in onze met de toekomstige talks!

JAVA MAGAZINE | 02 2019

24-27 HOE WORD IK EEN BEKENDE SPREKER.indd 27 23-04-19 09:30 28 Glassfish in een nieuwe vijver Wie zich bezig houdt met alle ontwikkelingen op het gebied van de totstandkoming van het Jakarta EE platform, kan het niet ontgaan zijn dat op 29 januari het dan eindelijk zover was… Glassfish, Oracle’s Java EE 8 compatible applicatieserver, is in zijn geheel gemigreerd naar de Foundation. Daarmee zwemt Eclipse Glassfish 5.1 nu in de open source vijver van de . Nu kun je denken: waarom is dit zo belangrijk? Daar zal ik je alles over vertellen in dit artikel.

Voordat we meteen de details ingaan, wil ik Java EE 8 compatible applicatieserver is. Dat jullie graag eerst even van een stukje context wil zeggen dat deze voldoet aan de Java EE 8 en geschiedenis voorzien. Als je namelijk specificaties. Dat wil echter níet zeggen dat er de historie van Glassfish doorloopt, kom je niets gedaan mocht worden aan de referentie erachter dat dit de oudste Java-gebaseerde implementaties van deze specificaties. Naast applicatieserver is. Het is net zo oud als Java veel juridisch geneuzel is één van de redenen zelf! dat de migratie bijna anderhalf jaar geduurd heeft, dat de implementaties behoorlijk opge- Edwin Derks is Wil je hier meer over weten, dan wil ik je poetst moesten worden om aan de kwaliteit- Software Architect doorverwijzen naar de blog van Arjan Tijms seisen van Eclipse te voldoen. Er moest code en CodeSmith bij (zie referentie 4). Hij vertelt daar in detail herschreven worden en ook zijn dependencies Ordina JTech. Hij hoe de evolutie van Glassfish is verlopen. Ter vervangen, omdat ze niet meer compatibel heeft naast Java illustratie: bij de start van dit project, moest waren, of misschien zelfs op de blacklist ston- ook een passie ik nog beginnen aan de middelbare school! den. Wat de staat van deze server onder het voor cloud-driven Voor mij waren veel van die details daarom bewind van Oracle ook was, het zou nu een development en ook niet bekend en dit gaf mij een beter beeld opgefriste, moderne applicatieserver moeten serverless architec- van hoe Glassfish uiteindelijk bij Oracle, en nu zijn, die zich moet kunnen meten met de ture. dus bij Eclipse is beland. Met die voorkennis is concurrenten, ook al ondersteunt Glassfish het hopelijk ook voor jullie beter te begrijpen nog geen JDK nieuwer dan versie 8. waarom Glassfish zo’n belangrijke rol speelt in het Java ecosysteem. Relatie met Payara Daarover gesproken, gebruik je Glassfish Eclipse Glassfish 5.1 in een als applicatieserver in productie? Daarvoor notendop is de commerciële support helaas al jaren Terug naar het heden. Concreet betekent geleden beëindigd door Oracle (zie referentie de release van Eclipse Glassfish 5.1 dat het 8). Kun je vanwege redenen moeilijk of niet Glassfish project zelf, en alle componenten van Glassfish naar een andere Java EE vendor waaruit deze server bestaat, gemigreerd zijn migreren, is het wellicht verstandig om toch naar de projectstructuur en versiebeheer van eens te kijken naar Payara. de Eclipse Foundation. Als voorwaarde voor de release moesten deze worden getest met, Dit is namelijk een applicatieserver die en voldoen aan, de TCK’s (Technology Compa- Glassfish gebruikt als basis, en voegt daar een tibility Kit). Tevens moet het ondergebracht aantal commerciële functies aan toe, inclusief worden als open source projecten bij Eclipse. productie support wanneer je dat wenst. De Dit proces is online te volgen (zie referentie 1). ontwikkelaars van deze server doen met suc- ces hun uiterste best om voorop te lopen in Maar wat heeft die migratie dan voor impact adoptie van nieuwe ontwikkelingen op Java gehad op de applicatieserver zelf, naast het EE en MicroProfile gebied en ze staan achter migreren en testen van de code? Een belang- hun product. rijk detail is dat Glassfish momenteel nog een

JAVA MAGAZINE

28-29 GLASFISH.indd 28 23-04-19 09:30 Including Timetable & Floorplan

AI & ML IOT & EMBEDDEDAR & VR METHODOLOGY & CULTURE

OPEN SOURCE CLOUD & SERVERLESS NEW & COOL

May 15th, 2019 DeFabrique | Utrecht, the Netherlands

1.000+ Attendees | 50+ Speakers | 25+ Companies

Insert 01 cover.indd 9 18-04-19 12:50 What is TEQnation? From the community to the community!

TEQnation is the Developer Conference of biggest tech companies and 50+ national and Tomorrow, bringing more than 50 speakers, international speakers! A big thank you to our various exhibitors, live demonstrations and partners, without them this wouldn’t be pos- numerous networking opportunities and you sible: ABN AMRO, Red Hat and many more. are part of it! Get ready to join the buzz that is TEQnation and We’ve been gearing up for a new and improved Code, Innovate & Create with fellow developers. edition of TEQnation. We’re super excited and you should be too. There are major technological trends disrupt- ing the IT business and that’s what we’re Why you might ask? Today you will encounter focussing on at TEQnation. 1.000+ like-minded developers, 25+ of the You can expect the following tracks:

AI & ML IOT & EMBEDDEDAR & VR METHODOLOGY & CULTURE

AI & ML IOT & EMBEDDEDAR & VR METHODOLOGY OPEN SOURCE CLOUD & SERVERLESS NEW & COOL & CULTURE

Show your passion with like-minded people, improve your skills and have fun in an easy-going atmosphere at TEQnation 2019. OPEN SOURCE CLOUD & SERVERLESS NEW & COOL

Insert 02-02 This is TQ.indd 2 24-04-19 10:00 Welcome to TEQnation!

TEQnation is a day full of learning, meeting other Tech addicts and Alshahwan from Facebook, Dave Zolotusky from Spotify, Steven having fun! We’ve been working on this edition of TEQnation for a Bryen from AWS, Alexander Shopov from Uber … and that’s just while now and we can say: We are more than proud of what we’ve the tip of the iceberg. accomplished. Here are some general tips for you to make the best out of your day: As the event team, we put quite some work into an event like this, but seeing everyone have a special, one-of-a-kind day where they • Don’t forget to download the NLJUG event app, all information can enjoy themselves and see the biggest speakers this world has to such as the timetable, fl oorplan and abstracts are included in it. offer, makes it all worth it. • We hope you’ve taken your laptop with you to make notes or get your hands dirty in the workshops. But we wouldn’t be able to do this without the program committee • Be sure you are on time for the session you want to join, full=full for selecting and bringing together such amazing speakers. Speak- and the early bird takes the worm! ing of the line-up, it’s almost impossible to get better speakers than you will see today. Just a selection of who you are able to see today: A very warm welcome to TEQnation from the program committee Jennifer Beecher from Zalando, Seth Vargo from Google, Nadia and the event team. We hope you have a wonderful day!

The event team

Stijn van de Blankevoort Lisanne Breeman Richelle Bussenius Marc Post Martin Smelt Anita de Jonge Amanda de Beer Community- & Content Junior Event Partner Partner Initiator Event Video Manager Manager Manager Manager Manager Manager

Program committee Download the NLJUG event app now For all the latest information of the TEQnation event

Bert Jan Schrijver Ramon Wieleman Michael Teeuw Joep Kokkeler Jeroep van Erp iTunes CTO Founder Creative Technical Big Data Engineer Software Architect @ OpenValue @ Code Nomads Innovator @ Politie @ XebiaLabs

Google Play Store

Bas Passon Manon van den Burg Richard Kettelerij Axel Goblet Sr. Java Consultant Data Solutions Co-founder Data Scientist @ First8 Consultant @ Mindloops @ BigData Republic @ Info Support

Insert 03-03 Voorwoord.indd 3 24-04-19 09:59 04

Banking for better, for generations to come Our society is facing some huge challenges: climate change, scarcity of raw materials and social inequalities. We all need to do better, and banks can play a key role in helping society to improve. Our products and services affect millions of lives, and we are always looking for ways to make things better. Either you waste time talking, or you act. ABN AMRO chooses to act. Banking for Ferhat Yildiz: Ferhat better, for generations to come. is a DevOps Engineer / Architect within the Cen- ter of Expertise Software How this transfers to Tech and how Tech we switched from ties to sneakers, and how Development contributes to ABN AMRO’s purpose will be we give developers much more autonomy. explained in our keynote and in 2 technical Indeed, developers have a voice in what we sessions at TEQNation 2019 of which we are deliver as a bank. Good example is Tikkie the proud main sponsor. which was an idea of one of our scrum teams. The opening keynote Wearables TEQNation is a technical conference and now The payment landscape will change more in a bank is giving a keynote! Most presump- the coming five years than it has in the last 50 tions of banks are that they are boring, not years. When it was cash or paper cheques then, Laura Rehorst: Laura is inspiring and developers cannot be creative payments now come in many forms. Customers product owner within the there. We would like to show the opposite in are digitally driven and expect convenient ways Center of Expertise Soft- our keynote. In 20 minutes we will show how of paying, for instance with wearables. ware Development

JAVA MAGAZINE

04-05 TEQN-ABN AMRO.indd 4 23-04-19 11:50 ADVERTORIAL

Marcel Kramer: Marcel is Jonnes Bouma: Jonnes Mohammad Zarifi: Yvonne Duits: Yvonne is Lead Engineer of the Data is Lead Engineer of the Mohammad is a Senior product owner Payments Quality & Analytics grid Retail products grid Development Engineer within the Accounts, Pay- within the Accounts, Pay- ments & Packages grid ments & Packages grid

Together with our partners, we enable ABN Main stand AMRO customers to pay with different types As a main sponsor we have a cool main stand of passive and active wearables. We have where we will give a lot of demos like a 3D developed the wearable payment solution interactive Model System landscape. Gloria Tsang: Gloria is an together with our customers, which means Besides that we’ll show you how we handle IT People strategist who that we have refined the solution based on secure coding with Fortify, Nexus and Splunk. is organizing all kind of their feedback. PSD2 is hot today so our Open Banking team events with as main goal Please join the session and come and take a will demo how we build an API for multi ban- to share knowledge in and look into the future world of payments. Get king with banks like ING, Rabobank, BUNQ, outside ABN AMRO insights in how we have refined the wearable and many more. solution with our customers and what the Please ask the people at our stand about our customer feedback and observations were on ABN AMRO Developers Portal, which is freely wearables. available to all developers. We are moving to the cloud, so we demo From COBOL to Kubernetes some of our AWS solutions and we will show COBOL, really? Yes this language, developed you how we solved connecting to many other in the 60’s of the last century, is still being clouds like Azure and Google. used in many banks like ours. But we are Want to test some wearables like our watch Eddy Vos: Eddy is a Senior slowly taking our journey to Cloud Native. solutions or rings? We will showcase a collec- Development Engineer In this session Ferhat and Laura will share tion of them in our stand where you can ask within Global Markets their lessons learned during the ABN AMRO’s our wearable developers all your questions Grid working on Java pro- Kubernetes adoption. They discuss how about these solutions. jects, MeetUps and Tech Kubernetes accelerated the bank’s Digital Need a selfie? Pepper will be here to assist Events Transformation and demonstrate parts of our you! Try to find out what else Pepper can do Continuous Compliance infrastructure. for you! Ready for more prizes? Besides giving away VR Escape rooms a prize at our VR stands, we will give away Say what? VR at a bank? a prize at our main stand. Please join us in We already had some success with our AR the main break with a big quiz and win a cool app LockDown. This was the first mobile gadget! AR escape room where you had to identify Still have questions? All our colleagues can Keynote a masked hacker and prevent a financial be easily spotted with their green shirts so 10:20 disaster. This year we level up and bring you a please find them and ask away! Room: Copraloods VR escape room. You have to solve 3 different challenges within 10 minutes. The fastest We hope to welcome you Wearables time at the end of the day will get a great on TEQNation2019! 11:30- 12:15 price at our stand. Ok, 10 minutes and 1000+ Room: Kalvermelk 2c people are coming so what are my changes? We have 2 VR escape rooms available so at COBOL to Kuburnetes least 100 people will have a chance to play. 12:30- 13:15 But come early to Loods 5 at the Fun Zone. Room: Kalvermelk 1

JAVA MAGAZINE | 02 2019

04-05 TEQN-ABN AMRO.indd 5 23-04-19 11:50 ENTRANCE P2

11 Copraloods

Parking

4 0 Kalvermelk 10 1 Wardrobe 3 a Silo 36 Kalvermelk 2 2 b 2 c 7 6 Loods 7 5 6 7 4 Entrance Loods 6 9 8 Micro 1st FLOOR 14 Mengerij 9 15 2 1 Nieuwe 13 5 Fabriek 10 11 12 Loods 5

1. ABN AMRO 5. NS 9. Open Web 13. Thales 2. Red Hat 6. Rijksoverheid 10. Rabobank 14. KLM 3. IBM 7. Capgemini 11. SUSE 15. Ordina 4. ING 8. Volksbank 12. Oracle 22

Insert 06-07 Plattegrond.indd 8 24-04-19 09:58

65 Floor plan ENTRANCE P2 TEQnation

Room number Name 1 Kalvermelk 1 2 Kalvermelk 2abc (upstairs) 4 Micro Mengerij 11 5 Loods 5 Copraloods 6 Loods 6 7 Loods 7 9 Nieuwe Fabriek 10 Silo 36 11 Copraloods Parking

4 0 Kalvermelk 10 1 Wardrobe 3 a Silo 36 Kalvermelk 2 2 b 2 c 7 6 Loods 7 5 6 7 4 Entrance Loods 6 9 8 Micro 1st FLOOR 14 Mengerij 9 15 2 1 Nieuwe 13 5 Fabriek 10 11 12 Loods 5

MAIN SPONSOR CO-SPONSOR

22

Insert 06-07 Plattegrond.indd 9 24-04-19 09:58

65 Timetable TEQnation

Nieuwe Fabriek - Copraloods Silo 36 Kalvermelk 1 Kalvermelk 2a Kalvermelk 2b Kalvermelk 2c Workshops/hackathons

Building a global, Get Shit Done - 25 tips to Stream Processing: scalable front-end Data and the Environment focus, get work done and Choosing the right tool 09:00 - 09:45 platform @ Port Of Rotterdam become a better developer for the job Willem Veelenturf & Pieter van der Meer Ramon Wieleman & Giselle van Dongen Bob Bijvoet Artem Makarov

10:00 - 10:10 Opening - Bert Jan Schrijver

10:10 - 10:40 Keynote: Open Source en sustainability - Marcel Kramer & Jonnes Bouma

10:40 - 11:00 Keynote: Cloud-Native Infrastructure: Beyond running in the cloud - Dave Zolotusky

11:00 - 11:30 Coffee break

The clash of the titans: Base64 is not encryption - 700 tons of code later/ a live serverless battle Introduction to Face Take your virtual assistant The evolution of a Delivery Wearables a better story for When your IDE will not cut between AWS Lambda- Processing with to the next level 11:30 - 12:15 Pipeline at scale Mohammad Zarifi & Kubernetes Secrets it you need a Spoon Azure functions and Computer Vision with Watson Aino Andriessen Yvonne Duits Seth Vargo Alexander Shopov Google functions Gabriel Bianconi Edward Ciggaa Niels Oldenburger

Stereoscopic Real-time From COBOL to Kubernetes: Bringing data to life, Style Transfer AI - Art is Automated Test Design and A 250 Year Old Bank’s OpenID Connect: the open Friendly fire: how security Power up your IoT apps handling less 12:30 - 13:15 not what you see? Bug Fixing @Facebook Cloud Native Journey answer to Facebook login software messes up with AI in minutes structured data Martin Förtsch & Nadia Alshahwan Ferhat Yildiz & Felix Bartels Julie Matviyuk Hans Boef Eugene Bogaart Thomas Endres Laura Rehorst

13:15 - 14:00 Lunch break

14:00 - 14:30 Check out this keynote in the NLJUG Event App

14:30 - 14:50 Keynote: When technology meets empathy - Tim van Deursen

Why you should get involved Build your own voice Web development: Appreciative Agile & Code2Navigate, in a local developer com- recognition solution from script kiddies to Mesh Networking for IoT 15:05 - 15:50 Appreciated Humans from bit to bike munity - a panel discussion with Alexa professional developers Jeroen Resoort Jennifer Beecher Rob van Loon with community experts Johan Janssen Daniël Wedema Thodoris Bais

15:50 - 16:10 Coffee break

Forecasting passengers Building a cloud native Skyrocketing Development What every developer Programming your Building Intelligent Banking Reinvented: with machine learning Crypto Currency Of Your Microservices needs to know about autonomous drone with 16:10 - 16:55 Apps using AI services IoT Payments at KLM trading platform with With Micronaut cryptography Droneblocks and Python Steven Bryen Pim Stolk Alexander Backus & Spring WebFlux Hubert A. Klein Ikkink Angelo van der Sijpt Robert van Mölken Daan Debie Erwin de Gier

Live exploiting your open Discovering unknown Adventures in Me, My Code and I DataScience as a Service Check in the 17:05 - 17:55 source dependencies with EventStorming autonomous sailing Rosanne Joosten Arno Broekhof NLJUG Event app Brian Vermeer Mariusz Gil Ivor Boers & Michel Drenthe

17:55 - 18:50 Drinks and Networking

Check out the latest information in the NLJUG Event App, downloadable via iTunes or the Google Play Store.

Insert 08-09 Programma.indd 8 24-04-19 14:13 AI & ML IOT & EMBEDDEDAR & VR METHODOLOGY & CULTURE

AI & ML IOT & EMBEDDEDAR & VR METHODOLOGY OPEN SOURCE CLOUD & SERVERLESS NEW & COOL & CULTURE

Nieuwe Fabriek - Copraloods Silo 36 Kalvermelk 1 Kalvermelk 2a Kalvermelk 2b Kalvermelk 2c OPEN SOURCE CLOUD & SERVERLESS NEW & COOL Workshops/hackathons

Building a global, Get Shit Done - 25 tips to Stream Processing: scalable front-end Data and the Environment focus, get work done and Choosing the right tool 09:00 - 09:45 platform @ Port Of Rotterdam become a better developer for the job Willem Veelenturf & Pieter van der Meer Ramon Wieleman & Giselle van Dongen Bob Bijvoet Artem Makarov

10:00 - 10:10 Opening - Bert Jan Schrijver

10:10 - 10:40 Keynote: Open Source en sustainability - Marcel Kramer & Jonnes Bouma

10:40 - 11:00 Keynote: Cloud-Native Infrastructure: Beyond running in the cloud - Dave Zolotusky

11:00 - 11:30 Coffee break

The clash of the titans: Base64 is not encryption - 700 tons of code later/ a live serverless battle Introduction to Face Take your virtual assistant The evolution of a Delivery Wearables a better story for When your IDE will not cut between AWS Lambda- Processing with to the next level 11:30 - 12:15 Pipeline at scale Mohammad Zarifi & Kubernetes Secrets it you need a Spoon Azure functions and Computer Vision with Watson Aino Andriessen Yvonne Duits Seth Vargo Alexander Shopov Google functions Gabriel Bianconi Edward Ciggaa Niels Oldenburger

Stereoscopic Real-time From COBOL to Kubernetes: Bringing data to life, Style Transfer AI - Art is Automated Test Design and A 250 Year Old Bank’s OpenID Connect: the open Friendly fire: how security Power up your IoT apps handling less 12:30 - 13:15 not what you see? Bug Fixing @Facebook Cloud Native Journey answer to Facebook login software messes up with AI in minutes structured data Martin Förtsch & Nadia Alshahwan Ferhat Yildiz & Felix Bartels Julie Matviyuk Hans Boef Eugene Bogaart Thomas Endres Laura Rehorst

13:15 - 14:00 Lunch break

14:00 - 14:30 Check out this keynote in the NLJUG Event App

14:30 - 14:50 Keynote: When technology meets empathy - Tim van Deursen

Why you should get involved Build your own voice Web development: Appreciative Agile & Code2Navigate, in a local developer com- recognition solution from script kiddies to Mesh Networking for IoT 15:05 - 15:50 Appreciated Humans from bit to bike munity - a panel discussion with Alexa professional developers Jeroen Resoort Jennifer Beecher Rob van Loon with community experts Johan Janssen Daniël Wedema Thodoris Bais

15:50 - 16:10 Coffee break

Forecasting passengers Building a cloud native Skyrocketing Development What every developer Programming your Building Intelligent Banking Reinvented: with machine learning Crypto Currency Of Your Microservices needs to know about autonomous drone with 16:10 - 16:55 Apps using AI services IoT Payments at KLM trading platform with With Micronaut cryptography Droneblocks and Python Steven Bryen Pim Stolk Alexander Backus & Spring WebFlux Hubert A. Klein Ikkink Angelo van der Sijpt Robert van Mölken Daan Debie Erwin de Gier

Live exploiting your open Discovering unknown Adventures in Me, My Code and I DataScience as a Service Check in the 17:05 - 17:55 source dependencies with EventStorming autonomous sailing Rosanne Joosten Arno Broekhof NLJUG Event app Brian Vermeer Mariusz Gil Ivor Boers & Michel Drenthe

17:55 - 18:50 Drinks and Networking

Check out the latest information in the NLJUG Event App, downloadable via iTunes or the Google Play Store.

Insert 08-09 Programma.indd 9 24-04-19 14:13 10

TEQnation presents IBM Take your virtual assistant to the next level with Watson

Edward Ciggaar works as developer advocate one provided in the lab. You will work with for the IBM Innovation Space in Amsterdam. the API’s graphical tool to train a machine He spent the first 10+ years of his career at learning model and design a dialog flow, IBM developing Java applications for several that your assistant can leverage to help your of our larger customers. His passion is to per- customer. You will learn about intents and sonally interact with developers and to show entities, and when to how use them. Finally, them the possibilities of our technology. He you’ll see how easy it is to share your bot with is always in to build fun demos and sample others by linking it to an assistant, which can Edward Ciggaar is a code that support developer productivity. His have multiple integrations like e.g. Slack or Developer Advocate focus areas are IBM Cloud, the Watson APIs Messenger. at IBM. and blockchain. In his spare time Edward As this session will be hands-on, please don’t loves to play soccer, both in real-life as well forget to bring your laptop and make sure you as online (FIFA). have an IBM Cloud account.

Also interested in taking your virtual as- If you don’t have one, you can sign up for free Take your virtual sistant to the next level, but don’t know at: https://ibm.biz/BdzFvQ assistant to the next where to start? Then, come join us and learn level with Watson how to build your own assistant with Watson. Looking very much forward to welcome you 11:30 – 12:15 Think about a topic and how to turn your own and let’s have some fun coding together!! Room: dialog into a conversational agent, or use the Nieuwe Fabriek

Power up your IoT apps with AI in minutes

Hans is a developer advocate based in deployed to its runtime in a single-click. Amsterdam. He helps developers building You can use a collection of Watson REST APIs apps efficient and faster with different (open to manage data-, data, image and/or speech source) technologies. His focus is on AI and related assets and the people who need to IoT and a combination of both. He speaks use these assets. at different (international) events, gives workshops and hosts local meet-ups and par- As this session will be hands-on, please don’t Hans Boef is a Develo- ticipates in hackathons as a mentor. forget to bring your laptop and make sure you per Advocate at IBM have an IBM Cloud account. In this workshop you will prototype IoT apps and enhance them with AI. You will use If you don’t have one, you can sign up for free opensource software (Node-RED) and Watson at: https://ibm.biz/Bdzc44 Api’s.

Node-RED is a programming tool (which is part of the Node.js foundation) for wiring Power up your together hardware devices, APIs and online IoT apps with AI services in new and interesting ways. in minutes It provides a browser-based editor that makes 12:30-13:15 it easy to wire together flows using the wide Room: range of nodes in the palette that can be Nieuwe Fabriek

JAVA MAGAZINE

10 IBM.indd 10 23-04-19 11:41 ADVERTORIAL

TEQnation presents ING Banking Reinvented: IoT Payments

With “Banking of Things” we enable any IoT made sure that everything we built is secure device to perform autonomous transactions by design. on your behalf in a secure manner. Then I’l like to bridge over to our community With this talk, I’ll take you on a journey of of developers, our reason to be completely how we created a completely new IoT pay- open-source and how both have helped us ment platform under 9 months. immensely to build our product This payment platform consists of Part of the talk would also be about pilots we did in production with various companies and Pim Stolk is an iOS 1. IoT SDKs in various languages ranging from how we solved their need for an IoT payment developer and is working Node JS, Python, C to Swift and Kotlin. platform and enabled them to move from a at the ING for the past 2. A backend built entirely in Swift using subscription to a pay per use business model. 7 years. Pim is a true . Last but not the least I would like to end mobile and techno- 3. iOS and Android native applications. the talk with some challenges we faced as a logy enthusiast and is team and how we overcame them to deliver a currently the tech lead I would be presenting our experience of using production ready product in a short span of 9 at FINN – Banking of Swift on the server in production. All the tech- months. Things by ING working nical challenges we faced and lessons that on a new IoT platform we learned along the way. The reason why mainly written in Swift. we chose Kitura over and Perfect. Our experience in using Kitura and the support we received from IBM along the way. 16:00 – 16:45 Alongwith that I would like to tell you how we Room: Silo 36

TEQnation presents Capgemini The clash of the titans: a live serverless battle between AWS Lambda-Azure functions and Google functions

In the world of cloud there are two major each of the setups perform when we start battles ongoing between the big three AWS, firing requests towards each setup. You will Azure and Google. One on AI and one on be able to initiate the requests yourself and serverless. Todays battle will be all about therefor impact the output. After exact 10 serverless. Which Serverless solution is best minutes we will stop and check the outco- equipped to solve our use case? For this we mes. Each setup and output will be checked have challenged our AWS, AZURE and Google by jury that looks at approach, performance Specialists to configure their systems at best and costs of the solution. Niels Oldenburger is and a perform a live battle against each other. Cloud Lead at Capgemini. Each contester will reveal their best practise You can win cool prices with your prediction on secrets on how they have approach it and who will win during the battle. Come and join how they configured the setup. After we have us! After the session all setups will be shared seen what approach is chosen, it is time to on github for public use and self test. RUMBLE!!!!

Which setup is best configured for the chal- 11:30 – 12:15 lenge? On the live screen you can see how Room: Kalvermelk 1

JAVA MAGAZINE | 02 2019

11 TEQN-ING-CAPGEMINI.indd 11 23-04-19 11:52 12

TEQnation presents Volksbank Web development: from script kiddies to professional developers

Daniël Wedema started his passion for programming at the Artificial Intelligence lab in Gronin- gen. After moving to the Big City in de Randstad, Daniël worked on several web development projects focusing on the backend before joining de Volksbank. Here a team was formed to create a platform for multi-themed multi-channel enterprise scale frontend applications. The love for the dynamic frontend world started, but suffered hard times during the chaotic JavaS- cript era. The introduction of TypeScript and its use in major web frameworks reignited the love. Finally scalable frontend development is possible. Since then Daniël has been preaching the frontend gospel and tries to reconnect an enthusiastic community of full stack web developers.

Web development has created a divided nal coding tools and standards. The core of web community with two sides: frontend versus development still revolves around the trinity backend. Traditionally frontend developers HTML, CSS, and JavaScript. These languages by see backend code as needlessly verbose, while themselves limit scalability. However, there is backend developers dislike frontend code for a large active open source community with an allowing dirty hacks and needing a jungle of overwhelming collection of frontend solutions ever-changing tools. that abstract away from the basics. However, both frontend and backend solutions The introduction of TypeScript (by Microsoft) Daniël Wedema is a serve a single purpose: keep the business hap- is a game changer in frontend development. sr. Software Engineer py. This is challenging for any organization, but TypeScript is a superset of JavaScript that com- at de Volksbank. at de Volksbank this challenge is even multi- piles into browser supported JavaScript. Many plied by four! De Volksbank is a family of brands of the features of backend development that with their own identity and requirements: SNS make it enterprise ready are now available in bank, ASN bank, BLG Wonen, and RegioBank. the frontend: type annotations, compile-time Traditionally the IT department had been type checking, interfaces, generics, namespa- organized along brand identity, i.e. there was a ces, and more. The syntax of TypeScript is very separate ASN IT team, SNS IT Team, etc. Over similar to that of Java, making it easy for bac- time de Volksbank realized that there was a lot kend developers to start writing Angular code. of overlap in business requirements between Some of the major solutions for scalable web the brands. In the end all brands are offering applications are React (by Facebook) and their customers similar banking experiences. Angular (by Google). React ships with JavaS- Out of this realization came the single plat- cript and is better suited for asynchronous form, multi brand strategy. In this strategy all data presentation. Angular is focused on data business processes and customer interaction entry through web forms and is shipped with are standardized across brands. Brand identity TypeScript by default. At de Volksbank Angular is limited to the frontend with different color was chosen for its focus on type safety and schemes, font types, tone of voice, imagery, handling of web forms. lines, etc. A dedicated UX team designs UI ele- Building applications at de Volksbank has ments and aligns these with the four brands. A brought backend developers closer to frontend frontend platform is available that implements using languages they understand better. At the these primary brand identities. Any team using same time it has brought frontend developers these multi-branded elements automatically closer to backend by applying design patterns get multi-branded applications. It is not possi- and adding type information to their code. An ble to create a single solution for a single brand. enthusiastic community is growing at de Volks- Keeping brand identity discussions away from bank which participates in open discussion, DevOps teams allows the teams to organize mentoring and support. along actual business value like mortgages, transactions, savings, insurances, etc. Scaling a frontend platform to an enterprise 14:55 – 15:40 community of 70 developers requires professio- Room: Kalvermelk 1

JAVA MAGAZINE

12 VOLKSBANK.indd 12 23-04-19 09:59 ADVERTORIAL Met Java-kennis kun je bij de Rijksoverheid alle kanten uit

Java-specialisten kom je op elk ministerie en de politiek aspecten zijn van grote invloed en bij elke rijksdienst tegen. Ontwikkelaars op onze processen. We zitten momenteel die alles weten van bewezen front-end en midden in een traject om middels CICD snel- back-end technologieën. Hun werk raakt het ler, wendbaarder en gecontroleerde te kunnen leven van bijna alle 17 miljoen Nederlanders. reageren op politieke en maatschappelijke Van de vooraf ingevulde aangifte (VIA) tot veranderingen. In deze sessie delen we onze het aanvragen van studiefinanciering. Van uitdagingen, ervaringen, motivaties, beslui- het betalen van invoerrechten tot het vinden ten, lessons-learned en aanbevelingen van dit Aino Andriessen Java van smokkelwaar op containerschepen. De nog steeds voortdurende traject’. specialist bij de Belasting- gemeenschappelijke deler? Java speelt bijna Genoeg redenen waarom je TEQnation en de dienst. altijd een cruciale rol. Daarom is de Rijksover- sessie van Aino Andriessen niet mag missen. heid goed vertegenwoordigd op TEQnation op Aino en de aanwezige rijksmedewerkers staan 15 mei 2019. Maak kennis met Java-specialis- je graag te woord op TEQnation op 15 mei ten van onder andere de Belastingdienst en 2019. de Kamer van Koophandel, het ministerie van Defensie en Rijkswaterstaat. Meer informatie over ICT’ers bij de Rijksover- heid en de impact van hun werk op Nederland Aino Andriessen van de Belastingdienst ver- lees je op www.werkenvoornederland.nl/ict telt in een plenaire sessie over continuous de- livery bij de Belastingdienst. Aino Andriessen: ‘Bij de Belastingdienst worden honderden applicaties ontwikkeld bijvoorbeeld voor de inning of de ondersteuning van de douane en 11:30-12:15 het uitbetalen van toelages. De sociale impact Room: Kalvermelk 2a

Hoeveel impact wil jij als ICT’er?

Als ICT-professional bij de Rijksoverheid doe je werk dat ertoe doet. De kans is groot dat je bij ons oplossingen bedenkt, ontwikkelt, implementeert of onderhoudt die e ect hebben op 17 miljoen Nederlanders. Denk aan de automatische bediening van bruggen en sluizen. De besturing van marineschepen tijdens militaire missies. De uitbetaling van toeslagen en subsidies. Digitaal forensisch onderzoek. En de registratie van de import en export via de Nederlandse havens.

Meer info: www.werkenvoornederland.nl/ICT

www.werkenvoornederland.nl

JAVA MAGAZINE | 01 2019

13 TEQN-BELASTINGDIENST.indd 13 23-04-19 15:37 14 Putting data on a map and building open source based GEO applications

With a background in experimental phy- Code2Navigate, from bit to bike sics (PhD), I have always been interested Spring is in the air. With the weather impro- in investigating how things work and what ving this means that the Dutch are massively they can create. When I entered the field of going out and enjoying their spare time with GIS (Geographical Information System), my a nice trip on their bicycles. Or they leave the investigative mindset remained and it is now car at home and take their bicycle for their focused on coding and creating GEO applica- work commute. But how do you plan such a tions and data analysis. bike trip? Do you always choose the fastest Rob van Loon, Open road? Or do you want to prefer cycle paths Source Developer and I have a broad work experience with GIS over normal roads? Do you want to avoid GEO expert @Ordina software and my skills includes system archi- industrial areas? What if you would like to tecture, code implementation, and system get an ice-cream on the way or add a local testing and control till finished product. I supermarket to your route? can work with web-based applications and data processing, as well as simple scripts and In this presentation we will show hands-on tools. what it is like to program a routing network A combination of postgresql and python is with python in the Dutch province of North- my systems of choice, however I am happy to Holland. Using the Dijkstra Algorithm for the use other tools if they are a better suited to fastest route as starting point we will gra- fit the problem at hand. I work well in a team dually add more data and constraints to the as both a lead developer, mentor and team algorithm. With a web viewer using OpenLay- developer. ers, we can visually see the consequences of extending our code. This we will do by using open-source data and software only.

14:55 - 15:40 Room: Klavermelk 2a

JAVA MAGAZINE

14 TEQN ORDINA.indd 14 24-04-19 09:53 Hier maak je echt het verschil

Stel je eens voor...

Naamloos-1 1 9-10-2018 11:53:46 SMART ISN’T SMART ENOUGH FOR YOU? #WORKYOURTALENTS werkenbijabnamro.nl

Ontmoet ABN AMRO tijdens TEQnation en ga de uitdaging aan in onze VR Escape Room

Naamloos-1 1 23-4-2019 12:09:29 GLASSFISH

Relatie met MicroProfile Wederom daarover gesproken, naast Java EE bestaat er nog een set van specificaties voor het Java EE ecosysteem: Eclipse MicroProfile. Veel met Glassfish concurrerende applicatie- servers zoals Payara, Wildfly en OpenLiberty implementeren naast de Java EE specificaties óók de MicroProfile specificaties. Dat bete- kent dat je in die applicatieservers naadloos het volledige spectrum van specificaties tot je beschikking hebt, maar in Glassfish niet.

Niemand kan de toekomst voorspellen, naar Jakarta EE 8 en Glassfish 5.2 hiermee te WE KUNNEN maar ik denk dat adoptie van MicroProfile releasen. Dat zal de situatie voor iedereen (in- in Glassfish er niet van gaat komen. Daar is clusief de schrijver van dit artikel) makkelijker DISCUSSIËREN sowieso nog niet over gesproken in de discus- maken en kunnen we daadwerkelijk uitkijken OF ER ZONDER sies die gevoerd worden. Ook al hanteert naar nieuwe specificaties voor het Jakarta EE PRODUCTIE- Eclipse officieel geen referentie implemen- platform, zoals JNoSQL. taties meer, Glassfish zal in ieder geval voor- SUPPORT EN lopig een applicatieserver blijven die als doel Conclusie MICROPRO- heeft om compatibel implementaties van een Ik realiseerde me dat bij de geboorte van FILE IMPLE- Java EE versie als zodanig aan te bieden. En Jakarta EE 8, het Java EE label tegelijker- daar zitten (nog) geen MicroProfile specifica- tijd daadwerkelijk begraven werd. In eerste MENTATIES ties tussen. Wellicht in de toekomst, als er instantie vond ik het jammer dat het Java EE WEL EEN onder de vorming van Jakarta EE specificaties label, met zijn rijke historie en waar ik zelf TOEKOMST van MicroProfile geadopteerd worden, komen zoveel mee gewerkt heb, te gronde gaat. de implementaties daarvan beschikbaar in IS VOOR Glassfish. We zullen meemaken hoe dit gaat MAAR! Zoals de geschiedenis van Glassfish GLASSFISH lopen. dicteert, kun je na 25 jaar meerdere malen gerebrand en vertimmerd te zijn, sterk uit de ALS APPLICA- Toekomst van Glassfish bus komen als een volwassen product waar TIESERVER Tot die tijd kunnen we discussiëren of er mensen van houden en graag in hun dagelijk- zonder productiesupport en MicroProfile se leven mee werken. Hopelijk is de evolutie implementaties wel een toekomst is voor naar Jakarta EE daarmee een mooie stap voor Glassfish als applicatieserver. Zeker als deze het platform, met Glassfish als solide basis applicatieserver mee moet in de cloud-native daarvoor. Java-visie van Eclipse, zoals ze die voor ogen hebben met Jakarta EE.

Vergeet echter niet dat het migreren van Glassfish wel één van de belangrijkste milestones was om het Jakarta EE platform REFERENTIES van de grond te krijgen. In één van de laatste 1. https://www.eclipse.org/ee4j/status.php Jakara EE Town Hall Meetups (zie referentie 2. https://projects.eclipse.org/projects/ee4j.glassfish/downloads 6) is een presentatie gegeven over de status 3. https://www.payara.fish 4. https://blog.payara.fish/glassfish-5.1-release-marks-major-milestone-for-java- van Jakarta EE, met de focus op hoe Glassfish ee-transfer daar een plekje in heeft. 5. http://jakarta.ee 6. https://www.meetup.com/jakartatechtalks_/ Hierin kunnen we zien dat Glassfish 5.1 nog 7. http://www.jnosql.org/ een officiële Java EE 8 compatible applica- 8. https://www.zdnet.com/article/oracle-abandons-commercial-support-for-glassfish- tieserver is. Nu aan Eclipse en de community jee-server/ de taak om daadwerkelijk alles te rebranden

JAVA MAGAZINE | 02 2019

28-29 GLASFISH.indd 29 23-04-19 09:30 30 Python voor Java ontwikkelaars Python is een programmeertaal die begin jaren ‘90 is ontwikkeld door de Nederlander Guido van Rossum. Het heeft de laatste jaren een sterke groei doorgemaakt. Python is een general purpose programming language die relatief gemakkelijk te leren is. Een andere reden voor de stijgende populariteit is dat Python zeer geschikt is voor data analyse en machine learning. Dit artikel beschrijft Python vanuit een Java perspectief. Het beschrijft de verschillen en over- eenkomsten van beide programmeertalen, met een focus op de programmeertaal zelf en niet zozeer op alle (overigens mooie!) packages en frameworks die er zijn. We geven je een aantal korte code voorbeelden hoe je bepaalde zaken typisch in Python programmeert. De voorbeel- den werken allemaal in Python 3.7.

Python vindt zijn oorsprong in een aantal of constructie wordt door de REPL gelezen, talen: ABC, C/C++ en Modula-3. Het is in de geëvalueerd en eenduidig afgedrukt, mits basis een imperatieve programmeertaal. De die expressie een object oplevert anders dan taal leent zich prima voor een procedurele-, None (waarover later meer). De meeste voor- object-georiënteerde en een functionele beelden in dit artikel zullen getoond worden programmeerstijl. als een interactieve sessie in de REPL.

Indentering bepaalt code block Dynamically-typed en Jan-Hein Bührman grouping Strongly-typed is Python Software Misschien wel het meest opvallende ken- Python is dynamically-typed. Dus variabelen Craftsman bij merk van Python is hoe code sections/blocks zijn, in tegenstelling tot Java, niet statisch ge- Ordina Pythoneers. worden aangegeven. Daar waar bijvoorbeeld associeerd met een type. Python is echter wel Hij kent de Python vanuit C/Java de bekende curly braces ({, }), strongly-typed; elk object heeft een specifiek programmeertaal worden gebruikt, wordt bij Python de blokvor- type aan zich verbonden. Dit in tegenstelling vanaf de totstand- ming bepaald door indent level. Zie bijvoor- tot bijvoorbeeld JavaScript. Expliciete con- koming. Daarnaast beeld listing 1. versie is dus nodig waar dat vereist is. Zie ter houdt hij zich graag illustratie de volgende sessie in listing 2. bezig met soft- warekwaliteit. Je ziet dat je niet zomaar een int bij een string kunt optellen. Dit wordt run-time bewaakt. Wanneer een fout wordt gedetecteerd, dan Listing 1. wordt een Exception gegenereerd. Je zult ook opgemerkt hebben dat # gebruikt wordt voor Door de dedent van het 2de print statement, commentaar. hoort deze niet bij de for-loop. De standaard Style Guide for Python code (PEP-8) adviseert Static type checkers om een indent-level van 4 posities te gebrui- In recente versies van Python is het mogelijk ken, gebruikmakend van spaties, geen tabs. om de code van type-annotaties te voorzien. Daarmee kunnen compile time inconsisten- Read-Eval-Print Loop ties gesignaleerd worden en veel IDE’s spelen Python heeft vanaf het begin een read-eval- hier ook op in. Dit helpt enorm bij onderhoud- print loop (REPL). Een expressie/statement baarheid en leesbaarheid.

JAVA MAGAZINE

30-33 PHYTON VOOR JAVA.indd 30 23-04-19 09:30 PYTHON

Mypy is de meest gebruikte statische type checker. Gecompileerd versus geïnterpreteerd versus Virtual Machine Veruit de meest gebruikte Python (en tevens referentie) implementatie is CPython. Dit is een in C/C++ geschreven compiler/interpre- ter die zo’n beetje op elk denkbaar platform beschikbaar is. Het laden van een module gebeurt in CPython in twee stappen: 1. Allereerst wordt de code ingelezen en ge- Listing 2. compileerd naar een machine en onafhankelijke zogenaamde byte code, vergelijkbaar met hoe in Java een .java file gecompileerd wordt naar een .class file. Deze gecompileerde modules worden, indien mogelijk, in een cache directory op- geslagen als files met een .pyc extensie. 2. Vervolgens wordt de byte code geïnterpre- teerd door de CPython (byte code) interpre- ter, of - in andere woorden - geëxecuteerd door de CPython Virtual Machine.

In tegenstelling tot Java wordt in de CPython implementatie code niet verder naar native object code doorgecompileerd. Er zijn echter andere Python implementaties waar dat anders werkt. Zo is er Python implementatie voor het Java platform, Jython genaamd. Deze runt in de JVM en er is directe interoperability tussen Java en Python. En er bestaat ook een Listing 3. implementatie met een Just-in-Time (JIT) compiler, PyPy. Deze voert momenteel de Python benchmarks gemiddeld genomen 7.6 op int objecten levert in tegenstelling tot Java IN RECENTE keer sneller uit. een float op; de floordiv operator // is toege- voegd voor integer division. Verder hebben we VERSIES VAN Geen source file per class nog ** voor machtsverheffen, als equivalent PYTHON IS In tegenstelling tot Java is er geen 1-op-1 voor de pow functie. HET MOGELIJK relatie tussen classes en source files (Python modules). Je kunt een willekeurig aantal func- Sequence types OM DE CODE ties en classes (inclusief geen enkele) in een Sequence types zijn, onder andere, list ([41, VAN TYPE- module definiëren. 42, 43]), tuple ((“foo”, 42, 1.5)) en range ANNOTATIES (range(4, 8)). Zoals je ziet, is het syntactische Types verschil tussen list- en tuple initialisers de TE VOORZIEN De meest gebruikte ingebouwde types met vierkante haak ([...]) versus de ronde haak voorbeelden worden hieronder beschreven. ((...)).

Numeriek Lists zijn enigszins vergelijkbaar met Java’s Numerieke types zijn int, float, en complex, ArrayList en ze zijn mutable. Dit soort (met notatie 1+2j). Ints kunnen willekeurig containers worden gewoonlijk gebruikt voor grote waarden bevatten. Anders dan in Java, homogene verzamelingen, net zoals in Java. worden octale getallen niet geprefixed met 0, Tuples kun je vergelijken met een immutable maar met 0o. variant van Java’s Pair, maar dan voor een willekeurig aantal entries in plaats van 2. () Verder hebben we de bekende operatoren, representeert een lege tuple, en (3,) een tuple zoals +, -, * , / en %. De operator / (truediv) met een enkel element.

JAVA MAGAZINE | 02 2019

30-33 PHYTON VOOR JAVA.indd 31 23-04-19 09:30 32

Listing 4.

Listing 5.

In listing 3 zie je een paar voorbeelden om Maar er zijn meer manieren om een dict te PYTHON elementen uit de sequence te selecteren, initialiseren zoals te zien in listing 6. MAAKT PRO- gevolgd door nog een paar andere operaties. Sets GRAMMEREN Je ziet de conventie, net als bij Java, dat Verder hebben we ook nog sets met als syn- GEWOON NOG indexen starten op 0, startwaarden inclu- tax {“pi”, “e”} of (net zoals bij de Sequence LEUKER DAN sief zijn, en eind-/stop-waarden gewoonlijk types) via de constructor (set(...)) met als exclusief zijn. argument een zogenaamde Iterable. Op sets HET AL WAS! zijn operaties beschikbaar als elem in s, elem Alle bovenstaande operaties kunnen ook op not in s, s1 <= s2 (issubset), s1 | s2 (union), s1 immutable sequences uitgevoerd worden, dus & s2 (intersection), - (difference) en ^ (sym- dit werkt evengoed op tuples en (op + en * na) metric_difference). ook op ranges. Op de mutable varianten zoals list, kunnen vanzelfsprekend ook nog allerlei Strings operaties, methods en expressies worden Strings in Python zijn, net als in Java, im- losgelaten om ze te wijzigen, zie listing 4. mutable sequences van Unicode elementen. Zo zijn “foo” en ‘bar’ voorbeelden van strings. List comprehensions De double- en single quotes hebben geen Lists kunnen ook door zogenaamde list verschillende betekenis, behalve dat je in een comprehensions gedefinieerd worden. Dit double-quoted string de single quote niet is het eenvoudigste uit te leggen door een hoeft te escapen en vice versa. De vanuit Java voorbeeld. In dit geval wordt een lijst met de bekende escape sequences zoals \b, \n, \t, eerste 8 machten van twee samengesteld, \x.., etc. worden herkend. Via andere escape gevolgd door een tweede voorbeeld waar het sequences zijn ook unicode characters te opnemen van de elementen in de lijst wordt coderen. bepaald door een toegevoegde conditional, zie listing 5. De speciale betekenis van de backslash ver- valt als je de string prefixt met r, als in Dictionaries r”raw\text”. Dit is vooral handig wanneer je Dicts zijn vergelijkbaar met Java’s HashMap. reguliere expressies wilt definiëren. De syntax van de constant initialiser zijn door komma gescheiden key: value entries tussen Triple-quoted strings, als in “””Some text.”””, curly braces, zoals bijvoorbeeld {“pi”: 3.14, kunnen newlines bevatten en deze worden “e”: 2.71}, of {3.14: “pi”, 2.71: “e”}. letterlijk overgenomen, inclusief eventuele

JAVA MAGAZINE

30-33 PHYTON VOOR JAVA.indd 32 23-04-19 09:30 PYTHON

Listing 6.

leading white space op de volgende regel. Strings kunnen net zo geïndexeerd en gesliced worden als de eerder beschreven im- mutable sequences. Een enkele index levert echter gewoon een string op, geen char of iets dergelijks.

Er zijn veel handige en leuke methods gedefi- nieerd voor string objecten; in listing 7 vind je Listing 7. slechts een zeer kleine selectie.

Bytes Python komt met een zeer uitgebreide, Bytes lijken op strings, maar bevatten binaire complete, standard library. data. Strings hebben een encode method om En als dat niet volstaat, dan is voor vrijwel bytes te genereren en bytes een decode me- elk denkbare functionaliteit een extern thod om strings te genereren. Byte constants package beschikbaar. Packages kunnen hebben een b voor de openings-aanhalingste- eenvoudig geïnstalleerd worden. Er is kens (b”...”). een doorzoekbare Python Package Index beschikbaar die alle Python packages van None, Booleans enige betekenis indexeert. None wordt gebruikt om een ‘Null’-achtig Python maakt programmeren gewoon nog object te identificeren. Functies/methods die leuker dan het al was! niets retourneren, retourneren eigenlijk None. Het hierboven getoonde is slechts een Booleans kennen we als False en True, zijnde beperkte greep van alle aspecten en moge- instances van het bool type. De logische lijkheden van de Python programmeertaal. operators verschillen qua symbool/naam van Desondanks hoop ik dat ik je voldoende C/Java: dat zijn hier de reserved keywords nieuwsgierig hebt gemaakt om nader kennis and, or en not. Maar gelijk aan Java is er de te maken met de taal. Ik wens je veel pro- short-circuit evaluatie van de boolean opera- grammeerplezier met Python! toren and en or. De ternary operator cond ? a : b wordt in Python geschreven als a if cond else b. Wrap-up, waarom Python? LINKS Waarom zou je als Java-developer Python wil- Python website: https://www.python.org/ len leren? Bijvoorbeeld hierom: Python Package Index: https://pypi.org/ Static Type Checker for Python: http://mypy-lang.org/ Python heeft een compacte, zeer expres- Python Enhancement Proposals: https://www.python.org/dev/peps/ sieve syntax. Met weinig woorden en met Alternative Python implementations: krachtige expressies en statements kan PyPy: https://pypy.org/ in korte tijd veel functionaliteit gecreëerd Jython: https://www.jython.org/ worden. Functionaliteit die er ook nog eens GraalVM: https://www.graalvm.org/docs/reference-manual/languages/python/ Cython: https://cython.org/ elegant uitziet, goed leesbaar is en goed onderhoudbaar is.

JAVA MAGAZINE | 02 2019

30-33 PHYTON VOOR JAVA.indd 33 23-04-19 09:30 34 First8 Open Source Survey 2018 Een inkijkje in de open source programmeur

Open source software is steeds meer mainstream aan het worden. Toen First8 in 1999 van start ging, was het vrijgeven van de broncode van programma’s een nieuw fenomeen. Wij zagen al snel in dat dit een game changer dit was. We zijn van meet af aan gespecialiseerd in Java en open source technologie. Inmiddels is open source niet meer weg te denken uit het software-landschap.

We hebben nu voor het derde jaar op rij een en werk je al 14 jaar lang met deze program- vragenlijst voorgelegd aan de bezoekers van matuur. Je kiest op basis van ideologie voor de J-Fall. Door de resultaten komen we steeds 26 open source applicaties waarmee je werkt. beter te weten wat een programmeur be- Ook al kom je meestal in aanraking met open weegt om met open source te werken en wat source via je studie, toch pluk je de meeste hij ermee doet. Ook krijgen we een eerste in- kennis van het internet. Laagdrempelige bug kijk in de trends die er hier zijn. De resultaten reports zijn de belangrijkste manier om bij te geven een mooi beeld in het hoe en waarom dragen en de keuze tussen open- en closed Arjan Lamers is van werken met open source. source valt meestal positief uit naar open Architect en Secu- source. rity Specialist bij First8. Hij is vooral Trends in open source bezig in de agrari- Omdat we nu meermalen de enquête hebben sche sector en doet afgenomen, wordt het mogelijk voorzichtig de promotieonderzoek eerste trends te beschrijven. Het lijkt erop dat naar performance programmeurs in de keuze van bedrijven voor van services archi- open source de mogelijkheid code te revie- tectuur in zijn vrije wen belangrijker inschatten. De vraag met tijd. welke pakketten ze werken, levert ook enkele interessante trends op. Qua development tools zijn Git, Eclipse en Maven steevast de Mannelijke en vrouwelijke belangrijkste die in omloop zijn en verliezen open source programmeurs SVN, ANT en CVS terrein. Bij de front-end Hoewel er een overdaad aan mannen is tools zitten Angular en Redux in de lift en (86%), lijken er iets meer vrouwen (14%) bij te zijn Wicket en Velocity dalers. Verder lijken komen vergeleken met vorig jaar (2017). Deze Glassfish en Tomee als applicatie-container vrouwen zijn gemiddeld jonger (32 jaar) dan steeds verder uit de gratie te raken, waar de mannen (39 jaar) en ze werken korter met Tomcat z’n hegemonie voortzet. open source (5 jaar versus 14 jaar). Wel heb- ben vrouwelijke programmeurs typisch een Studie is het begin, maar je universitaire opleiding waar bij de mannen leert pas echt op het internet hbo meer de norm is. Vorig jaar (2017) werd al duidelijk dat men steeds meer via een studie in contact komt Wie ben je als open source met open source, terwijl dat daarvoor meer programmeur? via interesse en/of het werk gebeurde. Deze Als open source programmeur ben je dus trend lijkt zich te versterken, want bij de meestal man, hoog opgeleid (minstens hbo) huidige enquête geeft bijna de helft aan open

JAVA MAGAZINE

34-35 OPEN SOURCE SURVEY.indd 34 23-04-19 09:30 OPEN SOURCE SURVEY

source in de studietijd te hebben leren ken- nen. Dat betekent dus dat de studie van een programmeur garant staat voor de introductie in de wereld van open source.

Toch wordt studie niet als eerste genoemd als het om de bron van kennis over open source gaat. Als we hiernaar vragen, legt de opleiding het ruimschoots af tegen de online moge- lijkheden. Ook duik je als programmeur bij Een inkijkje in de open source programmeur vragen niet de boeken in, maar geven Google en Stackoverflow je de antwoorden. Kort en goed: al is de kennismaking veelal via de lichte verbetering ten opzichte van het jaar studie, de échte leerschool is internet. 2017). Op andere onderwerpen, zoals continuï- teit, backwards compatibility, de beschikbaar- Samenwerkers, Doe- heid van features en support, scoort open het-zelvers en Bewakers source consistent beter. Ook over het jaar 2018 kunnen we duidelijk drie types programmeurs onderscheiden. Bedrijven en open source De ‘Samenwerker’ hecht er veel waarde aan Als professionele open source program- om samen een open source gemeenschap te meur heb je natuurlijk ook een antwoord/ vormen. De Samenwerker is vaak te vinden mening over de vraag waarom bedrijven in fora voor kennis en vragen. De ‘Doe-het- voor open source zouden moeten kiezen. EEN LEVER- zelver’ daarentegen werkt meer vanuit zijn Als we hiernaar vragen, krijgen we duidelijke eigen kracht en die van de Google query. Niet- antwoorden. Niet opnieuw het wiel uitvinden ANCIER BIEDT temin is ook deze programmeur trots op z’n en de onafhankelijkheid van leveranciers zijn PRAKTISCH code en deelt die graag. Voor de ‘Bewaker’ ligt net als in 2017 de belangrijkste redenen. Het NOOIT ZO’N het zwaartepunt van open source meer bij de is logisch dat deze twee als even belangrijk manier waarop de transparantie van de code worden gezien; ze houden immers verband. UITGEBREIDE bijdraagt aan de veiligheid van software. Een leverancier biedt praktisch nooit zo’n LIBRARY uitgebreide library als die bij open source Bezieldheid meestal beschikbaar is. Het is dus lastiger te ALS DIE BIJ Los van deze typeringen, tekenen zich ook achterhalen of wat je wilt maken al bestaat. OPEN SOURCE duidelijk verschillen af rond bezieling met MEESTAL BE- open source. Wie hoog scoort op dit spectrum Bijdragen en kosten vindt de ideologie, transparantie en vrijheid Hoe dragen programmeurs bij aan open sour- SCHIKBAAR IS van open source belangrijk. Aan de lage kant ce? Zoals je zou verwachten: hoe laagdrem- vind je de programmeurs die ontwikkelsnel- peliger, hoe vaker het gebeurt. Een bug report heid belangrijker vinden, net als het feit dat of reactie in een forum kost nu eenmaal veel open source gratis is. Wie hier hoger scoort, minder tijd dan een feature contributie of het heeft ook vaak met meer applicaties gewerkt schrijven van een artikel. en in het algemeen meer ervaring met open Dat open source software gratis is, blijkt source. Relatief gezien scoren overigens maar voor weinigen van doorslaggevend maar weinig programmeurs echt laag op dit belang in hun keuze voor software en ook spectrum. niet als aspect van de open source cultuur. De openheid van open source zit hem voor de Open source versus programmeur niet zozeer in de lage financiële closed source drempel. Het lijkt hem meer te gaan om open In vergelijking scoort open source op de in de zin van eerlijk en transparant. meeste vlakken beter dan closed source. Gaat het echter om security, dan zijn de resulta- Als open source programmeur ben je dus ten gemengd. Voor het technische deel van meestal man, hoog opgeleid (minstens hbo) security – zoals kwetsbaarheden en grip op en werk je al 14 jaar lang met deze program- wijzigingen – geven programmeurs duidelijk matuur. de voorkeur aan open source. Maar gaat het om de niet-technische aspecten, zoals certifi- Dat open source software gratis is, blijkt voor cering en aansprakelijkheid, dan heeft closed weinigen van doorslaggevend belang in hun source nog duidelijk de voorkeur (ondanks een keuze voor software.

JAVA MAGAZINE | 02 2019

34-35 OPEN SOURCE SURVEY.indd 35 23-04-19 09:30 36 J-Spring vooruitblik Kickass Apps with Boring Tech: Interactive Hacking #slideless Adam Bien: Java (EE), Jakarta EE, MicroProfile, In this session I will hack a full stack appli- WebStandards enthusiast. NLJUG Alumni. cation from microservice backend to Web- Standards frontend without any esoteric What happens, when you focus on the do- frameworks, technologies or libraries. main and ignore the technology? Questions are highly welcome and are going to be answered in real time. Adam Bien is JavaOne Kickass Apps with Boring Tech at 10:00 – 10:50 Rockstar, Java Champion and more.

Coding style matters: Why you should care about code style and what you should care about Peter Hilton is a software developer, wri- Coding style matters, but not only in the way ter, speaker, trainer, and musician. Peter’s you think. famously waste time professional interests are business process arguing indentation styles, while whole teams management, web application development, lack a consistent vision for their code style, functional design, agile software development and consistent code. This talk highlights what and documentation. Peter currently consults as really matters, and what you need to learn to Peter Hilton is an inde- a product manager for Signavio in Berlin, and write code with vision and style. pendent Consultant delivers the occasional presentation and work- shop. Peter’s software development interests Attendees will learn about how things like include process management, web applicati- formatting, writing idiomatic code, naming, ons, service architecture, software development and coding paradigms affect code style. You’ll methodology and practices, and web-based also learn about concrete approaches to de- collaboration. Peter has presented at numerous veloping a team coding style, including code European developer conferences, co-authored review, style guides, and automation. Good ‘Play for Scala’ (Manning Publications), and coding style matters, and is the key to team has taught ‘Fast Track to Play with Scala’. productivity and code longevity. Coding style matters at 10:00 – 10:50

An introduction to Apache Kafka - this is Event Streaming, not just Messaging Katherine Stanley is a Software Engineer in The amount of data the world produces is the IBM Event Streams team based in the growing exponentially every year and many UK. Through her work on IBM Event Streams companies are realising the potential of harnes- she has gained knowledge about running sing this data. A lot of this is generated in the Apache Kafka on Kubernetes and running form of a never ending stream of events, with enterprise Kafka applications. In her previous publishers creating the events and subscribers Katherine Stanley is a role she specialised in cloud native Java ap- consuming them in many different ways. This is Software Engineer at IBM plications and microservices architectures. where Apache Kafka comes in, Kafka isn’t just Katherine has co-authored an IBM Redbook a messaging system - it’s an event streaming on Java microservices and has contributed to platform. This session will introduce Kafka and the open source microservice project Game explain concepts such as topic partitioning, On. She enjoys sharing her experiences and consumer groups and exactly-once semantics. haspresentedat conferencesaround the Finally, learn about more advanced concepts world, including JavaOne in San Francisco, such as stream processing using the Java Kafka DevoxxUK and OSCON in London and JFokus Streams library, cross-datacenter replication and in Sweden. integration with other messaging systems. An introduction to Apache kafka at 11:05 – 11:55

JAVA MAGAZINE

36 JPSRING VOORUITBLIK.indd 36 23-04-19 09:30 ADVERTORIAL J-SPRING

Met Java-kennis kun je bij de Rijksoverheid alle kanten uit Java-specialisten kom je op elk ministerie en bij elke rijksdienst tegen. Ontwikkelaars die al- les weten van bewezen front-end en back-end technologieën. Hun werk raakt het leven van bijna alle 17 miljoen Nederlanders. Van de vooraf ingevulde aangifte (VIA) tot het aanvragen van studiefinanciering. Van het betalen van invoerrechten tot het vinden van smokkelwaar op containerschepen. De gemeenschappelijke deler? Java speelt bijna altijd een cruciale rol. Daarom is de Rijksoverheid goed vertegenwoordigd op J-Spring op 29 mei 2019. Maak op de beursvloer (stand 11) kennis met de Java-specialisten van de Belastingdienst, het ministerie van Defensie, de Dienst Uitvoering Onderwijs (DUO), de Kamer van Koophandel en de Rijks ICT Gilde (RIG).

Maarten Smeets van het Centraal Justitieel response times, CPU usage, memory usage, Incassobureau (CJIB) verzorgt de plenaire garbage collection behavior for these different sessie 'Performance of Microservices on JVMs with several different frameworks such different JVMs’. Maarten over zijn sessie: as Reactive Spring Boot, regular Spring Boot, ‘A lot is happening in world of JVMs. Oracle Spring Fu and MicroProfile. During this pre- changed its support policy roadmap for the sentation I will describe the test setup used Oracle JDK. GraalVM has been open sourced which includes Prometheus and Grafana. I by Oracle. AdoptOpenJDK provides binaries will show you some remarkable differences Maarten Smeets and is supported by (among others) Azul between the different JVM versions and van het Centraal Systems, IBM and Microsoft. Large software implementations. This will help choosing the Justitieel Incasso- vendors provide their own supported OpenJDK JVM with the right characteristics for your bureau (CJIB). distributions such as Amazon (Coretto), Red- specific use-case!’ Hat and SAP (SapMachine). Next to Oracle JDK and OpenJDK there are also different Genoeg redenen waarom je J-Spring en de JVM implementations such as Eclipse OpenJ9 sessie van Maarten Smeets niet mag missen. and Azul Systems Zing. JDK major and minor Maarten en de aanwezige rijksmedewerkers versions have differences and the JDK might staan je graag te woord in stand 11 op de run directly on the OS or within a container. beursvloer van J-Spring 2019. Next to that, JVMs support different garbage collection algorithms which influence your ap- Meer informatie over ICT’ers bij de Rijksover- plication behavior. There are many options for heid en de impact van hun werk op Nederland running your Java application and the choices lees je op www.werkenvoornederland.nl/ict you make matter! Performance is an impor- tant factor to take into consideration when choosing your JVM. How do the different JVMs compare with respect to performance when running different Microservice implementati- ons? Does a specific framework provide best performance on a specific JVM implemen- J-Spring session tation? I've performed elaborate measures at 14:10 - 15:00 of (among other things) start-up times,

JAVA MAGAZINE | 02 2019

37Naamloos-1 JSPRING 1 OVERHEID.indd 37 24-4-201923-04-19 13:00:13 15:39 38 J-Spring vooruitblik

OAuth2 demystified Emond Papegaaij is een Plain Old Java Ont- In this presentation I will show you the world wikkelaar bij Topicus Security en de grondleg- of the OAuth2 specifications, yes plural, there ger van de Identity & Access Management are multiple specifications. I will explain oplossing Topicus KeyHub. Ook is hij een what flow (or grant types as they are actually actief lid van de open source community, called) will work for what situation, what waar hij onder andere committer is op Apa- flows you should not use - yes the specifi- che Wicket. Al sinds zijn studie Technische cation even defines flows nobody should Emond Papegaaij is Informatica aan de Universiteit Twente heeft use - and how these flows work. I will also een Java Ontwikkelaar hij al een voorliefde voor wiskunde. Crypto- shed some light on auxiliary specifications for bij Topicus Security. grafie, waar blockchain zwaar op steunt, valt OAuth2 in mobile apps and in-browser appli- dus helemaal in zijn straatje. cations, because those applications warrant special treatment. Almost every developer will have to face this But the fun does not stop here. For example, at some point in his or her career: authori- did you know that recently a specification was zation with OAuth2. It doesn’t matter if you finalized that allows severely constrained de- build mobile apps, web applications or even vices to perform an OAuth2 flow? Or that you develop for embedded systems in the IoT, can bind your access token to a client certifi- everybody seems to use OAuth2 nowadays. cate to constrain its usage to a single server? But how does this protocol work and what’s And all of this does not yet even touch OpenID up with all these different flows? Can’t you Connect: the authentication protocol built on just use your favorite library XYZ and go for top of OAuth2. As you can see, there’s plenty it? Yes you can, but you will probably do it to tell and talk about and I hope you will all go wrong and you will end up vulnerable to some home with just a little more understanding of form of attack. the OAuth2 protocol family.

OAuth2 demystified at 15:25 - 16:15

Supersonic, Subatomic Java with Quarkus A lifelong developer advocate, community Introducing Quarkus.io. The rise in popularity organizer, and technology evangelist, Burr of the ® container as the primary way Sutter is a featured speaker at technology to package your application seemed like a events around the globe—from Bangalore to simple change on the surface. Yet, as we saw Brussels and Berlin to Beijing - he is currently with the Java Docker Fail problem, it was not Red Hat’s Director of Developer Experience. a transition completely without challenges for A Java Champion since 2005 and former pre- the Java™ community. Furthermore, we have sident of the Atlanta Java User Group, Burr now seen a number developers at many or- Burr Sutter is Director founded the DevNexus conference—now the ganizations considering moving to Node.js or of Developer Experience second largest Java event in the U.S.—with Golang to get the performance and tiny me- at Red Hat. the aim of making access to the world’s lea- mory footprint they need to run in a Kuberne- ding developers affordable to the developer tes/OpenShift environment. In this session, community. When not speaking abroad, Burr we’ll demonstrate how you can optimize your is also the passionate creator and orchestra- enterprise Java apps, your APIs, your micro- tor of highly-interactive live demo keynotes services, and your “serverless functions” for at Red Hat Summit, the company’s premier a Kubernetes/OpenShift environment—vastly annual event. smaller, vastly faster, and fundamentally more scalable.

Supersonic, Subatomic Java with Quarkus at 11:05 – 11:55

JAVA MAGAZINE

38 JPSRING VOORUITBLIK.indd 38 23-04-19 14:34 ADVERTORIAL J-SPRING

J-Spring presents Rabobank

Using GraphQL in banking app Currently we have a transaction overview I will discuss a few of those plans and the running on Websphere. In the future all ap- technical solutions for this. The first thing I plications will have to go to the cloud (PCF). want to talk about is a real-time dashboard Technically, the current application is not of your transactions. This means that we will very "cloud ready". Since there are also some have to support some way of streaming. This new business requirements, this is a good is possible with GraphQL, however it is not time to remake the whole application. We are supported within Spring Boot GraphQL yet. starting from scratch so we can make sure We either have to wait until they will support Martijn Jansen is that the application is completely created this, or create something for ourselves. We currently working at with the newest techniques the market cur- will also talk to our backend that provides the Rabobank for two rently has to offer. At first, both business and that transactions to us: they use Elastic years as Lead Deve- private users were using this screen, but since Search so it is possible for them to open up a loper. He started as the beginning of this year only business users websocket where we can listen to. Then we a PHP Developer and have access to this screen. Therefore, the new will have to pass those transactions directly made the switch to version of the application will be focused on to the frontend. Besides streaming, we also Java three years ago. business users. want to support deferring the data. Same With over 12 years of The first decision that had to be made was story as streaming: it is not available yet in programming experi- the framework we are going to use. We chose the Spring Boot version but we can build this ence, he is passionate Spring Boot. I don't think this needs a lot of ourselves as well. The reason why we would about trying out new explanation. We all love the "Spring Magic". do this is because we can show the first infor- technologies. With a For the second decision we started to think mation to the frontend faster, before we have few small talks within about the interface. We could have gone for all the information needed. First we collect the Rabobank, this is a standard REST interface, but instead we the accounts, and then with those accounts his first time as spea- chose to use GraphQL for this. In the future we will collect the transactions. We can send ker on a big event. we will create different screens which all the accounts already, so the frontend can require different information. With GraphQL start building the screen while we collect the we can create one endpoint that will be able transactions in the frontend. to deliver all the information our frontend One other thing we want to create is the abi- needs. Besides that, the frontend will only lity for users to create their own dashboard by receive the information it needs in the order it changing the columns they would like to see. requested that. Since we are running on PCF (which is running Since we just started with this new applica- on Azure) we will be using a CosmosDB for tion, we have a lot of plans for the future. this.

Using GraphQL in banking app at 11:05 – 11:55

A life of working and learning in IT: challenge accepted! Wouter Oet works as a Software Engineer for In an ever changing world, developers some- the Rabobank. He is passionate about Java times struggle to keep up with all the changes based technologies and spends way to much happening. There are just too many releases free time at meetup’s. Wouter loves to share of languages, frameworks and libraries to knowledge and help people to grow. keep up with. Not to mention the broadening of our profession. Pipelines, runtimes, secu- rity and Ops are also part of it. We are going Keynote at 09:10 - 09:35 to face that challenge head on. Find out the Wouter Oet works best approaches and learn to love learning. as a Software Challenge accepted!! Engineer for the Rabobank.

JAVA MAGAZINE | 02 2019

39 JSPRING RABO.indd 39 24-04-19 10:04 40 Java 12 8 nieuwe features Op het moment van schrijven van dit artikel is de countdown voor de Java SE 12 release nog gaande en zijn er alleen preview builds beschikbaar. Op 19 maart 2019 is het eindelijk zover en zal de final release beschikbaar komen. Voor Java 12 zijn 8 nieuwe features (JEP’s) geïmple- menteerd. In dit artikel zullen deze features beschreven worden.

Oracle heeft sinds Java SE 10 een 6 maanden maakt het voor JDK-ontwikkelaars gemak- releaseschema aangekondigd. De deadline kelijk om bestaande micro-benchmarks uit te is dus fixed gemaakt. Dit betekent dat het voeren en nieuwe benchmarks te maken. Een aantal JDK Enhancement Proposals (JEP) dat micro-benchmark meet de prestaties van een geïmplementeerd kan worden per release klein codefragment. variabel is geworden. Eens in de drie versies zal een zogenaamde Long-term support (LTS) 3 JEP 325: Switch Expressions versie worden gemaakt. Java SE 11 is zo’n LTS (Preview) Ivo Woltring is versie en zal door Oracle nog tot september Ik denk dat de meeste ontwikkelaars deze JEP Software Architect 2023 ondersteund worden. De versies die het interessantst vinden van alle JEP’s in deze en Codesmith bij tussen LTS versies uitkomen krijgen alleen release. Een vernieuwde switch statement die JTech Ordina. support tot een nieuwe versie uit komt. Laten gemoderniseerd is. Met twee voorbeelden zal we kijken of er in versie 12 features zitten die dit geïllustreerd worden. het interessant maken om te upgraden... Het voorbeeld in listing 1 laat zien dat je meerdere case labels kan hebben en dat 1 JEP 189: Shenandoah: Garbage alleen wat rechts van de pijl staat wordt uit- Collector met korte pauze tijd gevoerd en ook als return waarde geldt. In de laatste paar releases van Java is veel Aan de rechterkant van de pijl kan ook een aandacht aan de Garbage Collector (GC) be- code blok staan zoals getoond in listing 2. Het steed en JEP 189 is er ook een voor. Deze JEP break statement kan nu ook een argument voegt een nieuwe garbage collector toe aan bevatten dat als return waarde geldt. de JVM met de naam Shenandoah. Shenan- De nieuwe switch statement is een “Preview” doah is een algoritme dat vooral geschikt is feature. Dat betekent dat het niet per default voor toepassingen waarvoor reactiesnelheid geactiveerd is binnen de JDK. Om deze te acti- en voorspelbare korte pauzes belangrijk zijn. veren zal de parameter --enable-preview De korte pauze tijd wordt verkregen door meegegeven moeten worden. meer garbage collection werk gelijktijdig De code voorbeelden in dit artikel zijn uit- (concurrent) te doen met het draaiende Java geprobeerd met behulp van een OpenJDK 12 programma. Om deze GC te activeren moet je Docker image. Het commando om een jshell deze opties meegeven: -XX:+UnlockExperimen te starten met alle nieuwe features geacti- talVMOptions -XX:+UseShenandoahGC. veerd staat in listing 3.

De Shenandoah GC is niet die ene GC die alle 4 JEP 334: JVM Constants API GC’s zal gaan regeren. De Shenandoah GC legt Deze JEP Introduceert een API voor het model- de nadruk op responsiviteit er zijn andere GC- leren van constanten in de constante pool. Deze algoritmen die prioriteit geven aan doorvoer API is nuttig voor programma's en libraries die of geheugen gebruik. De gebruiker zal dus zich bezighouden met bytecode-instructies en zelf moeten kiezen waar ze de nadruk willen het manipuleren van class bestanden. leggen. 5 JEP 340: One AArch64 Port, 2 JEP 230: Microbenchmark Suite Not Two JEP 230 voegt een standaardreeks micro- Niet heel veel detail is gegeven over deze JEP, benchmarks toe aan de JDK-broncode en maar het komt er op neer dat van de voorheen

JAVA MAGAZINE

40-41 JAVA 12.indd 40 23-04-19 09:30 JAVA 12

twee beschikbare ARM ports er nog maar 1 over blijft, zodat contributeurs zich nog maar op 1 64-bits ARM implementatie hoeven te concentreren. Listing 1 8 nieuwe features 6 JEP 341: Default CDS Archives CDS staat voor Class-Data Sharing. Met CDS kan een reeks klassen worden voorverwerkt in een gedeeld archiefbestand. Waarom is dit nodig? De JVM doet veel magie tijdens het laden van klassen. De JVM interpreteert de klasse, slaat deze op in een interne structuur, voert een aantal controles uit, lost de symbo- len op en verbindt deze, etc. Dan is de klasse klaar om te werken. Al deze stappen vergen enige tijd. Bovendien laadt elke JVM-instantie gewoonlijk dezelfde systeem klassen zoals bijvoorbeeld String, Integer en URLConnec- tion die standaard in Java zijn opgenomen. Listing 2 Al deze klassen hebben geheugen nodig. Wanneer we een gedeeld archief hebben dat voorverwerkte klassen bevat, kan deze tijdens runtime worden toegewezen aan het geheu- gen. Als gevolg hiervan kan het de opstarttijd en geheugen voetafdruk verminderen. Met de implementatie van deze JEP zullen CDS archives standaard gegenereerd worden. Listing 3 7 JEP 344: Abortable Mixed Collections for G1 Garbage Collection kan een grote invloed hebben op de performance van je applicatie. hield. Meestal alleen maar terug leverend na LATEN WE De G1 Garbage Collector kan geconfigureerd een volledige Garbage Collection en omdat G1 worden om niet langer dan een opgegeven tijd een volledige Garbage Collection probeert te EENS KIJKEN te pauzeren (-XX:MaxGCPauseTimeMillis). De voorkomen, kon dat dus lang duren. OF IN VERSIE G1 zal dan proberen dit doel te halen, maar dit 12 FEATURES is niet altijd mogelijk. Conclusie Om te voldoen aan het door de gebruiker In eerste instantie zat JEP 326 (Raw String ZITTEN geleverde pauze tijddoel, zorgt deze JEP er- Literals) ook in deze release, maar heeft de DIE HET voor dat de G1 Garbage Collector het garbage release niet gehaald. Door het niet halen van collection-proces afbreekt door de set met deze JEP is de enige voor ontwikkelaars inte- INTERESSANT afval verzamelde gebieden te splitsen in ver- ressante JEP die van de switch en deze is niet MAKEN OM TE plichte en optionele onderdelen en de garbage standaard geactiveerd. Het zal me dus niks UPGRADEN collection af te breken van het optionele on- verbazen als upgraden van Java 11 naar Java 12 derdeel als het doel voor de pauzetijd anders voor velen niet hoog op de prioriteitenlijst zal niet wordt bereikt. Het maakt de G1 dus weer komen te staan. een stukje slimmer en efficiënter. 8 JEP 346: Promptly Return Unused Committed Memory from G1 REFERENTIES Oracle verbetert de G1 Garbage Collector zodat https://openjdk.java.net/projects/jdk/12/ het automatisch Java heap geheugen naar het https://www.oracle.com/technetwork/java/java-se-support-roadmap.html besturingssysteem retourneert als het niet https://hub.docker.com/_/openjdk https://openjdk.java.net/projects/code-tools/jmh/ actief is. http://ivo2u.nl/oa Tot deze JEP geïmplementeerd werd kon het voorkomen dat de G1 lang geheugen vast

JAVA MAGAZINE | 02 2019

40-41 JAVA 12.indd 41 23-04-19 09:30 42 Spring Fu De weg naar declaratieve Spring Applicaties

Het Spring Framework is al ruim 17 jaar een begrip op de JVM. Oorspronkelijk begonnen als een inversion of control container en door de jaren heen uitgegroeid tot een populair full-featured framework voor (web)applicatie ontwikkeling. Met Spring Fu dient zich een volgende evolutie aan: declaratieve configuratie op basis van een fluent API.

Sinds de introductie van het Spring Frame- uitermate eenvoudig om applicaties te bou- work is XML het formaat waarin de configu- wen met een minimum aan zelfgeschreven ratie van de applicaties wordt uitgewerkt. configuratie en (boilerplate) code, door middel Door de jaren heen zijn andere manieren van van het toepassen van veelgebruikte conven- configureren toegevoegd aan het framework ties bij het initialiseren van componenten. om op die manier tegemoet te komen aan Ondanks de onmiskenbare waarde die Spring de wensen van ontwikkelaars. Denk hierbij Boot biedt aan ontwikkelaars, is de werking aan configuratie op basis van annotaties, ook van de applicatie echter minder transparant Arno Koehler is wel bekend als JavaConfig. Dit begon met @ voor de ontwikkelaar. Oftewel, het bevat een Agile Software Autowired en @Component en groeide uit extra dosis van de eerder genoemde Spring Engineer bij naar @Profile. Framework “magie”. Sourcelabs. Hij houdt zich graag Minder Magie Het toevoegen van een dependency aan het bezig met Java, Niet zelden wordt in ontwikkelteams gere- classpath kan er onder meer toe leiden dat de Kotlin, Graphql en fereerd aan de Spring Framework “magie”, applicatie op een andere container draait (bij- alle onderdelen van die zijn werk doet onder de motorkap als voorbeeld of Tomcat) of dat er nieuwe het Spring Frame- verklaring voor de werking van de applicatie, componenten worden geïnitialiseerd en work op de JVM. zonder te weten hoe het exact werkt. Spring toegevoegd aan de context. Dit alles zonder Daarnaast volgt hij Framework is opgedeeld in diverse modules expliciete configuratie toe te voegen. Zo toe- Android ontwikke- die achter de schermen veelvoorkomende gankelijk als Spring Boot kan zijn voor rapid lingen op de voet. uitdagingen wegnemen voor ontwikkelaars. prototyping met een minimum aan code, zo Het idee achter deze modules is het leveren complex kan het zijn bij het troubleshooten van een dienst en/of het oplossen van een van grotere applicaties met een veelvoud aan probleem. Dit zodat de ontwikkelaars zich dependencies. Spring Boot leunt net als het kunnen richten op het implementeren van Spring Framework op classpath scanning, de maatwerkonderdelen van hun applicaties. annotation processing en dynamic proxies. Dit Te denken valt aan de bedrijfslogica, zodat alles veroorzaakt tijdens startup en runtime men zich niet hoeft te richten op technische overhead, omdat de configuratie op dat uitdagingen. Door deze verschuiving van moment moet worden herleid op basis van focus is er echter niet altijd evenveel zicht op bijvoorbeeld annotaties. Daarnaast worden de interne werking van het Spring Framework dynamic proxies gemaakt om componenten en zijn modules. te initialiseren, te verrijken en hun werking te geven. Medio 2014 is Spring Boot beschikbaar geko- men. Dit is de volgende en uitzonderlijk popu- Voor Sébastien Deleuze, Spring Framework laire evolutie in de levensloop van het Spring committer and Spring Fu lead @Pivotal, was Framework. Spring Boot is gestoeld op een dat een belangrijke drijfveer om op zoek te eenvoudig en sterk basisprincipe: “Conventi- gaan naar een nieuwe manier. Een manier on over configuration”. Spring boot maakt het om explicieter (declaratief) om te gaan met

JAVA MAGAZINE

42-45 SPRING FU.indd 42 23-04-19 09:30 SPRING FU

De weg naar declaratieve Spring Applicaties

de configuratie van Spring (Boot) applicaties support voor het schrijven van DSL’s ten op- VOOR IEDER- en het terugdringen van startup overhead en zicht van Java. Vanwege die reden behandelt dit EEN DIE NOG memory footprint. artikel alleen de Kotlin gebaseerde KoFu DSL. GEEN KOTLIN Spring Fu Momenteel is een belangrijke voorwaarde bij GEBRUIKT, IS De naam Spring Fu klinkt misschien wat het gebruik van deze declaratieve configuratie vreemd, maar het verwijst vooral naar de dat expliciet moet worden gekozen voor de DIT EEN MOOIE functionele manier van Beans definiëren. reactive web stack die in Spring 5 is geïntro- AANLEIDING Daarnaast staat ‘fu’ natuurlijk voor expertise duceerd, genaamd WebFlux. WebFlux is de OM DAT WEL of meesterschap (net zoals bij kung-fu). Het implementatie van de reactive web-stack in project is een verzameling van nieuwe Spring het Spring Framework en biedt support voor TE DOEN! Framework features die gerelateerd zijn aan reactive streams. Het kan gekozen worden als expliciete configuratie en runtime efficiëntie. alternatief voor de Servlet gebaseerde Spring De ervaringen die opgedaan zijn in Spring Fu MVC implementatie. vinden met enige regelmaat - nu al! - hun weg naar toekomstige Spring (Boot) relea- Een minimaal voorbeeld ses. Zeker gezien de populariteit van micro Kotlin biedt een compacte syntax en onder- frameworks en serverless is er voor Spring steuning voor het realiseren van DSL’s. Daar- Framework nog wel wat te winnen als het naast is het goed om te weten dat functies en gaat om snellere applicatie startup en lagere variabelen buiten een class (top-level) gede- memory footprint. clareerd kunnen worden en dat het mogelijk is om meerdere classes samen te bundelen in Allereerst kijken we naar het onderdeel uit één enkel overzichtelijk bestand. Omdat het Spring Fu dat declaratieve configuratie mogelijk één van de doelstellingen is van het Spring Fu maakt: KoFu. Kofu is de DSL (domain specific project om in toenemende mate van Kotlin language) die is ontwikkeld om deze manier een first-class citizen te maken binnen het van declaratieve configuratie te faciliteren. Spring Framework, wordt Kotlin gebruikt in Sinds kort is naast deze Kotlin variant ook een het nu volgende codevoorbeeld. Met de KoFu Java versie beschikbaar, genaamd JaFu. Kotlin DSL kan een eenvoudige reactive webapplica- is first-class citizen in Spring Fu en biedt extra tie worden geconfigureerd.

JAVA MAGAZINE | 02 2019

42-45 SPRING FU.indd 43 23-04-19 09:30 44

ONDANKS DAT SPRING FU ZELF NOOIT EEN FRAMEWORK ZAL ZIJN VOOR PRODUCTIE- WAARDIGE APPLICATIES, IS HET WEL DE AANJAGER VOOR INNOVATIE IN HET SPRING FRAMEWORK

Voorbeeld 1: HelloSpringFuApp.kt.

Startpunt van het gebruik van de Kotlin DSL handlerfunctie die verantwoordelijk is voor de is de webApplication functie. Binnen deze daadwerkelijke afhandeling van het request. functie wordt de volledige configuratie van de Dit is vergelijkbaar met functies die van een applicatie gespecificeerd, waaronder eventu- RequestMapping annotatie voorzien zijn in ele Spring beans, serverconfiguratie, codecs, een RestController uit Spring MVC. routes en/of handlers. KoFu ondersteunt een declaratieve manier van configureren. 1. Entrypoint van de KoFu DSL. Hierbinnen Dat betekent dat alles expliciet moet worden worden alle componenten die de webappli- gedeclareerd. Er wordt geen gebruik gemaakt catie opmaken gedeclareerd. van traditionele configuratiemogelijkheden, 2. Beans functie waarbinnen alle Spring zoals classpath scanning. Framework beans worden gedeclareerd. 3. Bean declaratie van de SampleHandler. NB: De voorbeeld webapplicatie bestaat uit een dankzij de reified generics uit Kotlin worden enkel endpoint: /hello. Bij het aanroepen van bean declaraties zeer compact. dit endpoint wordt de tekst “Hello World” 4. Serverfunctie waarbinnen zich specifieke als response gegeven. Endpoints kunnen in configuratie bevindt voor het beschrijven KoFu gedefinieerd worden door middel van van de webapplicatie, zoals routerfuncties, een routerfunctie. Binnen deze routerfunc- codecs en server runtimes. In het voorbeeld tie kunnen één of meerdere routedefinities is te zien dat Netty als engine gekozen is worden gedeclareerd. Een routedefinitie en dat deze op poort 8080 draait (beide bestaat uit een URI en een referentie naar een standaard instellingen).

[main] n.s.a.f.FuDemoApplicationKt : Starting FuDemoApplicationKt [main] n.s.a.f.FuDemoApplicationKt : No active profile set, falling back to default profiles: default [main] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port(s): 1000 [main] n.s.a.f.FuDemoApplicationKt : Started FuDemoApplicationKt in 1.212 seconds (JVM running for 1.546)

Voorbeeld 2.

JAVA MAGAZINE

42-45 SPRING FU.indd 44 23-04-19 09:30 SPRING FU

5. Router declaratie waarin de diverse voor serverless applicaties waarbij startup beschikbaar te maken endpoints worden tijd en memory footprint van groot belang geplaatst. zijn. Gezien de grote aantrekkingskracht van 6. Referentie naar de SampleHandler bean het Micronaut Framework voor microservices uit // #3. met een kleine footprint, zou dit wel eens een 7. Request mapping, in dit geval een HTTP belangrijke stap voor het Spring Framework GET naar (http://localhost:8080)/hello. kunnen zijn om hun sterke positie, ook op dit Voor de afhandeling wordt een functiere- deel van de markt, te vergroten. ferentie opgenomen naar de in de Sample- Handler class aanwezige functie met de Experimenteel naam ‘hello’. Spring Fu is een incubator project. Dat impli- 8. De definitie van de handlerfunctie ceert dat het niet bedoeld is om een productie (geschreven als een Kotlin expression applicatie mee te maken. Dat is ook niet het function). Deze functie handelt het uit- doel. Spring Fu bestaat alleen om - in een zo eindelijke request af. Spring Fu zorg voor beperkt mogelijke scope - nieuwe features het doorgeven van een ServerRequest in- voor het Spring Framework te ontwikkelen. stantie als parameter, zodat alle relevante De goed werkende concepten dienen dan ook informatie uit het request toegankelijk is. zo snel mogelijk hun weg te vinden naar het Vervolgens wordt gebruik gemaakt van de Spring Framework zelf. Wel bestaat de vraag static method ‘ok()’ uit de ServerResponse aan de community om ook bij te dragen aan class om een response te instantiëren Spring Fu, te weten in de vorm van feedback HET BEVAT met HTTP statuscode 200 (ok) en als body en pull requests. “Hello world!”. EEN EXTRA Tot slot DOSIS VAN Wanneer de applicatie wordt gestart, is de Waarom is dit nou zo interessant? Als je nu al DE SPRING output zoals voorbeeld 2. Kotlin en Spring gebruikt, dan is de Kotlin DSL waarschijnlijk dé manier waarop je binnenkort FRAMEWORK De startup tijd van de applicatie is lager dan code gaat bouwen. Voor iedereen die nog “MAGIE” voor een vergelijkbare Spring Boot applicatie, geen Kotlin gebruikt, is dit een mooie aanlei- omdat geen classpath scanning en annotation ding om dat wel te doen! De code wordt er in processing nodig zijn. Daarnaast is het geheu- ieder geval - ook voor niet-Java developers en gengebruik van de applicatie zo laag mogelijk Java junioren - alleen maar duidelijker van. wegens het actief zijn van de meest minimale Ondanks dat Spring Fu dus zelf nooit een set features uit het Spring Framework. Framework zal zijn voor productiewaardige applicaties, is het wel de aanjager voor in- Native image met GraalVM novatie in het Spring Framework. Daarnaast Eén van de interessante features is het is ook de roadmap van Spring Fu erg veelbelo- bouwen van een native image van een Spring vend. Bovenaan de lijst staat bijvoorbeeld de Fu applicatie met behulp van GraalVM. Een asynchrone stack van Spring MVC. Daarnaast native image is een ‘ahead of time’ gecompi- wordt al veel werk verzet op het gebied van leerde executable die geen gebruik maakt van integratie met R2DBC (de reactive driver de Java HotSpot VM, maar thread scheduling voor JDBC databases) in Spring Fu. Al met al en memory management van Substrate VM zeer interessante ontwikkelingen waarvan gebruikt. Door de ‘ahead of time’ compilatie we alleen maar kunnen hopen dat ze zo snel is er beperkte support voor reflectie en moet mogelijk richting de andere onderdelen van gebruik gemaakt worden van extra files, die het Spring Framework mogen komen! aangeven welke classes op welk moment nodig zijn. Wel zorgt dit alles voor een lagere memory overhead en een snellere startup.

Om zelf aan de slag te gaan, kan gebruikt REFERENTIES gemaakt worden van het voorbeeld van • Uitgewerkte versie: https://github.com/sourcelabs-nl/spring-fu-javamag Sébastien Deleuze (er een ‘fork’ versie in • Herkomst naam Spring Fu: “expertise or mastery of specified skill or area of knowledge” https://en.wiktionary.org/wiki/-fu de voetnoten met de code uit dit artikel). • Aankondiging Spring Fu https://spring.io/blog/2018/10/02/the-evolution-of-spring-fu De applicatie heeft na het compileren met • https://github.com/spring-projects/spring-fu GraalVM nog maar een startup tijd van 0.024 seconden. Dit kan met name interessant zijn

JAVA MAGAZINE | 02 2019

42-45 SPRING FU.indd 45 23-04-19 09:30 46 Spring Webflux Event driven microservices met Spring Webflux

Microservice architecturen kunnen aan de ene kant veel voordelen opleveren. Ze kunnen ech- ter ook complex zijn om te implementeren en onderhouden. In dit artikel bespreken we hoe we omgaan met de complexiteiten van microservices door gebruik te maken van event driven communicatie en de reactive benadering van Spring Webflux.

Een gedistribueerde microservices architectuur implementeren van verschillende asynchrone heeft als voordeel dat de verschillende services scenario’s. Wij hebben deze architectuur toe- onafhankelijk van elkaar gewijzigd en gede- gepast bij de realisatie van een platform voor ployed kunnen worden. Hierdoor is de impact het handelen in cryptocurrency met de naam van een deployment laag en kunnen features ‘We Are Blox’ (1). snel worden gerealiseerd en uitgerold. Dit verhoogt weer de mogelijkheid om te experi- Applicatie menteren met verschillende features en oplos- De ‘We Are Blox’ app maakt het mogelijk om Erwin de Gier is singen. Een tweede voordeel is dat de services eenvoudig te handelen in verschillende cryp- Software Architect onafhankelijk van elkaar kunnen schalen. tocurrency. De gebruiker maakt een account bij Trifork Amster- aan (of logt in met een social media account), dam. Uiteraard zijn er ook uitdagingen, bijvoorbeeld verifieert een ID bewijs door middel van het op het gebied van communicatie en data consistentie. Hoe zorg je ervoor dat de juiste informatie bij de juiste services aankomt? Welke data vertelt me de echte waarheid over de state van mijn systeem? Een geaccepteer- de oplossing hiervoor is om gebruik te maken van een ‘append-only’ event-log. Hierbij ge- beurt alle communicatie door middel van het schrijven van een event naar de event-log. De verschillende services kunnen zich abonneren op deze event-log en de voor hun interes- sante events verwerken. De event-log bevat de absolute waarheid met betrekking tot de state van de applicatie.

Services hebben hier een afgeleide view op. Deze afgeleide views zijn ‘eventual con- sistent’, het duurt even voordat de events verwerkt zijn in de specifieke services. Deze ‘eventual consistent’ view biedt weer een uitdaging als we de resultaten van onze actie aan de gebruiker willen tonen. Werken met events betekent in de praktijk dat je veel asychrone code zult schrijven. Het adopteren van ‘Reactive Programming’ helpt hierbij door onder andere een ‘callback hell’ te voorkomen en krachtige operators te bieden voor het Afbeelding 1. Afbeelding 3.

JAVA MAGAZINE

46-49 WEBFLUX.indd 46 23-04-19 09:30 SPRING WEBFLUX

opsturen van een foto, kan geld storten met iDEAL / credit card / etc. en kan dit geld vervolgens gebruiken om een portfolio op te bouwen van BTC, ETH, XRP of andere cryp- tomunten. Uiteraard is het mogelijk om de investeringen weer te verkopen en de Euro’s uit te keren naar een eigen bankrekening Event driven microservices met Spring Webflux (Afbeelding 1). naar de services. Dit zijn Commands voor Architectuur & Technologie: mutaties en Queries voor leesoperaties. Het CQRS, ES & Reactive gebruik van deze berichten is gebaseerd Afbeelding 2. Zoals gezegd, is de communicatie tussen op CQRS. Voor de REST facade maken we de services gebaseerd op een event log. In gebruik van Spring Webflux, het reactieve principe consumeren de services elkaars zusje van Spring Web. Voor CQRS maken we events zonder dat ze weten waar deze events gebruik van Axon Framework. De eventbus en MET REACTIVE vandaan komen of naartoe gaan. Ze publice- eventstore worden geïmplementeerd door een PROGRAMMING ren de events op een eventbus. De eventbus open source product, AxonServer (2). Deze WORDT slaat vervolgens berichten op (append only) kan dus zowel events opslaan als doorsturen en publiceert deze naar alle eventhandlers. naar de consumerende services. ASYNCHRONE Een eventhandler kan gezien worden als een Aangezien de events voor ons de absolute CODE EEN abonnement op een specifiek event. Dit is waarheid zijn, moeten we deze events gebrui- STUK de enige manier waarop services onderling ken voor het bepalen van de state van onze communiceren. De gebruikersinteractie met applicatie. Elk muterend Command wordt LEESBAARDER het platform gaat via een mobiele applicatie. gevalideerd tegen de huidige state, de state We hebben ervoor gekozen om de com- wordt opgebouwd door de events af te spelen municatie tussen de mobiele applicatie en en toe te passen op een aggregate. Dit pat- de server backend op de traditionele manier tern heet Event Sourcing (3). via REST te laten verlopen. Zoals bekend, is REST in essentie een synchroon protocol. Als Voorbeeld: we kijken naar de functionaliteit, is het voor het genereren van quotes de gebruikers het fijnst als ze direct feedback Voordat een gebruiker crypto currency kan krijgen op hun acties. Om dit te realiseren, kopen of verkopen, moet deze een prijs aan- maken we gebruik van een REST facade die vragen. Dit noemen we een quote. Bij deze synchrone calls vertaalt naar onze asynchrone actie wil de gebruiker direct resultaat zien op backend (Afbeelding 2). het scherm (Afbeelding 3). De code van de REST façade voor deze functie De REST facade stuurt specifieke berichten Listing 1. @RequestMapping(value = “/quote”, produces = {“application/json;charset=UTF-8”},method = RequestMethod.POST) public Mono> createQuote( @RequestBody QuoteRequest quoteRequest) { String quoteId = UUID.randomUUID().toString(); //1

Flux quoteResponse = this.queryGateway .subscriptionQuery(new FindQuoteQuery(quoteId), FindQuoteResponse.class, FindQuoteResponse.class) .updates(); //2

this.commandGateway.send(createQuoteCommand(quoteId, quoteRequest)); //3

return quoteResponse .filter(response -> response.getQuoteEntry() != null) .timeout(Duration.ofMillis(timoutMillis)) .next() .map(this::validateQuote) .map(translator::convertFoundQuoteToQuoteResponse) .map(quoteResponse -> ResponseEntity.ok().body(quoteResponse)) .onErrorReturn(ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).build()); //4 }

JAVA MAGAZINE | 02 2019

46-49 WEBFLUX.indd 47 23-04-19 09:30 48

@CommandHandler public void createQuote(CreateQuoteCommand command) { requestQuoteFromTradingEngine(command) //1 .flatMap(quote -> eventBus.publish(createSuccessEvent(quote, command.getQuoteId()))) .retryWhen(Retry.any().exponentialBackoff(Duration.ofMillis(initialBackoff), Duration.ofMillis(maxBackoff)).retryMax(retryMax)) //2 .doOnError(error -> eventBus.publish(createFailureEvent(command, error))) .subscribe(); } Listing 2. @EventHandler public void onSuccess(QuoteRequestSuccessEvent event) { QuoteEntry quoteEntry = createSuccessQuoteEntryFromEvent(event); entityManager.persist(quoteEntry); is te vinden in Listing 1. this.queryUpdateEmitter.emit(FindQuoteQuery.class, query -> quoteEntry.getQuoteId().equals(query.getQuoteId()), new FindQuoteResponse(quoteEntry)); We genereren eerst een uniek ID voor de } quote die we gaan aanmaken (regel 1). Vervolgens gebruiken we Project Reactor om @EventHandler public void onFailure(QuoteRequestFailureEvent event) { een subscriptie aan te maken op updates van QuoteEntry quoteEntry = createFailureQuoteEntryFromEvent(event); deze quote. Dit doen we door een FindQuo- entityManager.persist(quoteEntry); teQuery te versturen over de Axon query bus. this.queryUpdateEmitter.emit(FindQuoteQuery.class, query -> quoteEntry.getQuoteId().equals(query.getQuoteId()), In dit geval geven we aan dat het om een new FindQuoteResponse(quoteEntry)); subscriptionQuery gaat. De response hiervan } is van type Flux (regel 2). Flux is het datatype wat aangeeft dat 0 of meer objecten over tijd Listing 3. kunnen arriveren. Als de Quote Service de quote gegenereerd heeft wordt deze ver- return quoteResponseFlux.log() stuurd via de query gateway en ontvangen we .filter(response -> response.getQuoteEntry() != null) .timeout(Duration.ofMillis(timoutMillis)) hem aan deze kant. Om dit proces te starten ... sturen we een CreateQuoteCommand (regel 3). Deze operatie is ook asynchroon. Listing 4.

Het laatste statement van deze methode is taat van deze chain is een Mono, aangezien een reactive chain. Laten we hier doorheen we Spring Webflux gebruiken kunnen we deze lopen om te bekijken wat er precies gebeurt. Mono direct teruggeven. Spring zal subscriben Allereerst gebruiken we ‘filter’ om alleen op deze Mono en het resultaat parsen naar de responses door te laten die gevuld zijn. JSON als dit binnenkomt. Dit resultaat wordt De ‘filter’ operatie heeft als argument een als HTTP Response naar de client verstuurd. functie die een boolean teruggeeft. Hierna specificeren we een ‘time-out’. De subscrip- Listing 2 toont de ontvangende kant van de tion query is een remote call, dus er kan van CreateQuote command waarin de quote wordt alles misgaan, inclusief dat we geen antwoord opgehaald van het externe systeem dat de terug ontvangen. Mochten we een leeg ant- marktdata beheert. De call naar dit systeem woord terugkrijgen, dan laat ons filter geen wordt gedaan door de methode “requestQuo- items door. Om te voorkomen dat onze REST teFromTradingEngine” (regel 1). Deze aanroep controller geen antwoord teruggeeft, gebrui- doen we binnen de ‘flatMap’ operatie. We ken we de time-out operatie, na de gespecifi- gebruiken ‘flatMap’ omdat de requestQuo- ceerde time-out geeft deze een exceptie. teFromTradingEngine zelf asynchroon is en een Mono teruggeeft. We zijn maar geïnteresseerd in één quote, ‘next’ is de operatie die ons het eerst vol- Een tweede voordeel van de ‘flatMap’ is dat gende item teruggeeft. Deze transformeert we een retry kunnen doen om het moment de Flux (0 of meer) naar een Mono (0 of 1). We dat een fout optreedt. Als requestQuo- gebruiken de map operatie om te valideren teFromTradingEngine een exceptie gooit, dan en te converteren naar een QuoteResponse wordt de ‘retryWhen’ operator aangeroepen. en uiteindelijk een ResponseEntity. Tot slot De ‘retryWhen’ operator is een variant op ‘re- hebben we nog twee operaties voor Exception try’. De standaard ‘retry’ resubscribed altijd in handling, zowel in het geval van een error of het geval van een Exceptie. In dit geval houdt een lege waarde geven we een HTTP status dat in dat de code in de ‘flatMap’ opnieuw service unavailable terug (regel 4). Het resul- wordt uitgevoerd. Aan retryWhen kun je een

JAVA MAGAZINE

46-49 WEBFLUX.indd 48 23-04-19 09:30 SPRING WEBFLUX

publisher meegeven die 0 of 1 waardes terug- eerste of laatste resultaat. Voor het in detail IN PRINCIPE geeft (of een Exceptie). In dit geval gebruiken testen van reactive chains kun je gebruik we de reactor-extra library (4) om exponential maken van de StepVerifier (6). Spring Web- CONSUMEREN backoff (5) toe te passen. Hierdoor kunnen we flux controllers kun je testen met WebTest- DE SERVICES met een steeds grotere delay de externe func- Client(7). Step through debugging is niet echt ELKAARS tie opnieuw aanroepen. Ook kunnen we een mogelijk, omdat je dan het opbouwen van de maximum aantal retries meegeven. Als de ex- reactive chain debugged. Eventueel kun je een EVENTS terne aanroep blijft falen, wordt een exceptie breakpoint zetten in een lambda statement. ZONDER DAT gegooid. In het geval van een valide response ZE WETEN sturen we een SuccessEvent, in het geval van Het is ook mogelijk om de logging expressie- een Exceptie een FailureEvent. Beide worden ver te maken. Listing 4 toont het gebruik van WAAR DEZE opgeslagen in onze eventstore, zodat we deze de ‘log’ operator, deze zorgt ervoor dat elke EVENTS later kunnen afhandelen. operatie aanroep wordt gelogd. Ook kun je gebruik maken van de ‘doOnXXX’ operators. VANDAAN Listing 3 toont de event handling kant waarin Deze operators zijn specifiek bedoeld voor het KOMEN OF het resultaat wordt opgeslagen in een relatio- operaties met side effects, zoals logging. Er is NAARTOE nele database. Ook versturen we dit opgesla- bijvoorbeeld een doOnError en een doOnEach. gen resultaat via de queryUpdateEmitter naar Tot slot zal het opgevallen zijn dat we gebruik GAAN alle subscribers van de query (zie listing 1). Bij maken van de non-reactive en blocking Spring het versturen van dit resultaat is het mogelijk Data JPA. Dit is mogelijk, omdat al onze om een conditie mee te geven die bepaalt Spring Data aanroepen in een Event Handler welke subscribers het resultaat ontvangen. of Query Handler plaatsvinden. Deze worden Aan de subscribe kant (listing 1 regel 2) geven altijd op een aparte thread uitgevoerd en we een quote ID mee. Aan de versturende blocken dus niet de main thread. kant versturen we alleen een resultaat naar een subscriber met hetzelfde ID. Hiermee Conclusie is deze specifieke use case af. De client De asynchrone eigenschappen van werken ontvangt na een asynchrone omweg in de met events en remote messaging zorgen backend een synchrone response op de vraag. doorgaans voor uitdagingen bij het schrijven De gebruiker ziet op het scherm een quote van code. Als je je beperkt tot de standaard voor het kopen van de cryptomunt. Java 8 API, dan zal je gebruik moeten maken van Runnables, callbacks en/of Completable- Caveats Futures. Door het toevoegen van Project Re- Uiteraard zijn er ook uitdagingen verbonden actor, zoals library, kun je gebruik maken van aan het gebruik van Spring WebFlux en Pro- Reactive Programming. Hiermee wordt asyn- ject Reactor. Ten eerste zijn veel libraries nog chrone code een stuk leesbaarder en heb je niet reactive of zelfs niet asynchroon. Toen uitgebreide mogelijkheden voor bijvoorbeeld we het project begonnen, was bijvoorbeeld retries en error handling. De uitdagingen zit- Spring Security 5 nog niet volledig geïmple- ten vooral in het gebruik van niet asynchrone menteerd op het gebied van OAuth. Verder libraries, testen en debugging. maakt zowel het Axon Framework als Swag- ger (code generatie op basis van api specifica- ties) nog veelvuldig gebruik van Completable Futures. Deze zijn overigens eenvoudig om te zetten naar een Mono (Mono.toFuture & Mono.fromFuture). REFERENTIES https://www.weareblox.com https://axoniq.io/download Unit tests vereisen ook enige aanpassing. https://microservices.io/patterns/data/event-sourcing.html Het helpt als de code die je test netjes een https://github.com/reactor/reactor-addons Flux (of Mono) teruggeeft. In de test heb je https://en.wikipedia.org/wiki/Exponential_backoff dan de mogelijkheid om hier op te subscriben https://projectreactor.io/docs/test/release/api/reactor/test/StepVerifier.html (Flux.subscribe) of te blocken (Flux.blockFirst https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/spring- / Flux.blockLast). Door te blocken, wordt de framework/test/web/reactive/server/WebTestClient.html code weer synchroon en wordt gewacht op het

JAVA MAGAZINE | 02 2019

46-49 WEBFLUX.indd 49 23-04-19 09:30 50 Uncle Bob

Robert C. Martin, Uncle Bob.

Op bezoek bij de Apeldoorn JUG Eind 2018 werd het idee geboren om de Apeldoorn Java User Group op te richten. In de afgelopen jaren zijn er verschillende regionale Java User Groups ontstaan in het midden en westen van het land. Apeldoorn JUG richt zich echter op Java developers in het oosten van land.

Sander Mak is Maar met een idee alleen ben je er niet. Vier Eerdere locaties waren simpelweg niet groot Fellow bij Luminis. Apeldoornse bedrijven (Belastingdienst, genoeg vanwege de overweldigende be- Als Java Champion Kadaster, Profit4Cloud en Luminis Apeldoorn) langstelling. Uncle Bob hield een vlammend en Apeldoorn JUG namen het initiatief om ook daadwerke- betoog voor software craftsmanship in deze lead is hij nauw lijk events te gaan organiseren. Er is haast ‘Church of Clean Code’. betrokken bij geen betere start denkbaar dan een Apel- zowel de lokale als doorn JUG kick-off met Robert C. Martin! Een Uiteraard houdt de Apeldoorn JUG het niet bij internationale Java developer grootheid als Uncle Bob in Ne- één event. Op meetup.com/ApeldoornJUG kun community. derland: dat gebeurt niet iedere dag. De vier je op de hoogte blijven van al onze volgende initiatiefnemers hoefden dan ook niet lang na events. See you there! te denken toen deze kans zich voordeed. Woensdagavond 6 februari was het zover. UNCLE BOB HIELD EEN VLAMMEND BETOOG Zo’n 300 Java developers vonden hun weg naar de Jachtlaankerk in Apeldoorn. Ja, dat VOOR SOFTWARE CRAFTSMANSHIP IN DEZE lees je goed: een developer event in een kerk. ‘CHURCH OF CLEAN CODE’

JAVA MAGAZINE

50-51 UNCLE BOB.indd 50 23-04-19 09:30 UNCLE BOB

Op bezoek in Utrecht Begin februari was Uncle Bob voor twee dagen te gast bij de Rabobank. Onder het thema “Coding a better world together” vond dit tweedaagse evenement plaats in een uitverkocht auditorium. Met uitverkocht bedoel ik dan ook gewoon helemaal vol, want dit evenement was gratis te bezoeken. Uncle Bob, ook bekend als Robert C. Martin, is een Amerikaanse soft- ware engineer en schrijver. Hij is vooral bekend om zijn boekenreeks rondom clean coding en het Agile manifesto.

Het grote podium is bijna helemaal leeg. Naast Uncle Bob waren er ook break-out Naast een bankje, stoel en een tafel staat er sessies met de sprekers Rosanne Joosten bijna niks. Uncle Bob gaat zitten en opent en Brian Vermeer. Dit was een bijzondere zijn tablet waar zijn presentatie op staat. Nog aangelegenheid, omdat ze tegelijkertijd op voordat hij begonnen is, krijgen we al een hetzelfde podium aan het presenteren waren. sneak peak van wat gaat komen. De presen- De bezoekers konden middels een draadloze tatie bevat honderden sheets. Later blijkt headset kiezen naar wie ze luisterden. dat hij weinig van de sheets gebruik heeft De eerste dag stond in het teken van deve- gemaakt. Hij kent zijn presentatie binnenste- lopment en de tweede dag in het teken van Wouter Oet is Java buiten en praat alles vloeiend aan elkaar. Of architectuur. Uncle Bob ging op de tweede Geek @ Rabobank. zoals hij het zelf formuleert: “just winging it”. dag in op het proces rond software-ontwik- Hij vertelt met passie en overtuiging over keling. Zo benadrukte hij hoe belangrijk agile software craftsmanship. Waarbij je als junior werken kan zijn. Dat agile niet bedoelt is om enkele jaren onder een senior staat, die jou snel te gaan, maar om snel bij te kunnen helpt om echt goed te worden in jouw vak- sturen. Ook in de context van architectuur gebied. Waarbij je pas na afronding hiervan werden sommige punten van de vorige dag jezelf software engineer mag noemen. Iets benadrukt: de kern van snel gaan, is goed Op bezoek bij de Apeldoorn JUG dat in meer gereguleerde vakgebieden, zoals gaan. advocatuur vaker voorkomt. Ook heeft hij Zijn kleine rants over databases en ESB’s het over standaardisatie en vermindering van zijn vermakelijk en zijn hele verhaal werkt het aantal programmeertalen. In tijden van enthousiasmerend. Een van zijn opmerkin- falende softwareprojecten en applicaties, die gen is me erg bijgebleven: het is belangrijker zo lek als een mandje zijn misschien iets om dat software aan te passen is, dan dat de over na te denken. software doet wat het zou moeten doen. YouTube Ook op deze dag waren er andere sprekers Het is erg moeilijk Naast dit enigszins filosofische onderwerp uitgenodigd. Dit keer stonden Roy Braam, om twee dagen aan komt hij ook met concrete tips, richtlijnen en Sander Mak, Roy van Rijn en Jan Ouwens op informatie, tips prachtige oneliners. Enkele opmerkelijke: het podium. en bemoedigende Publiceer niet je code coverage buiten het Als afsluiter had Uncle Bob een Q&A sessie. Na woorden samen team, want dan gaat het een eigen leven de vele vragen uit het publiek was het officiële te vatten in een leiden. deel van het evenement afgelopen. Veel men- artikel. Daarom kan In de context van het Single-Responsibili- sen zijn nog lang gebleven voor een hapje en je de twee volle ty-Principle: hoe weet je wanneer iets maar een drankje. Sommige mensen hadden zelfs dagen terug kijken één ding doet? Totdat je er geen nieuwe boeken meegenomen om te laten signeren. op YouTube. Zoek methodes uit kan extracten: “extract till Hiermee kwamen twee geweldige dagen tot naar “Rabobank” you can’t extract no more”. een einde. Het was een groot succes en het is en “Uncle Bob”. Wat is het geheim van snel gaan in soft- wat mij betreft zeker voor herhaling vatbaar. ware development? Niet de wegblokkades bouwen, die je in de toekomst langzaam zullen maken. De kern van snel gaan, is UNCLE BOB’S KLEINE RANTS OVER DATABASES goed gaan. De beste definitie van analyse is, is wat EN ESB’S ZIJN VERMAKELIJK EN ZIJN HELE VER- analisten doen. HAAL WERKT ENTHOUSIASMEREND

JAVA MAGAZINE | 02 2019

50-51 UNCLE BOB.indd 51 23-04-19 09:30 52 COLUMN

Meer met Maven Lifecycle Phases

In elke editie zal Robert Scholte een probleem voorleggen en deze oplossen met behulp van Apache Maven om meer inzicht te geven in Maven zelf en de vele beschikbare plug-ins. Met JUnit 5 zijn de API en de Engines op- gedeeld in aparte jars en daarmee kwam ook een dependency-scope probleem aan het licht. Maven kent de test-scope, maar nu is er behoefte aan onderscheid tussen test-compile (met alleen de API) en test-runtime (inclusief engines). Dit Classgroup isolation is helaas niet zo eenvoudig op te lossen, Kort geleden is één van mijn lang uit- Wat hier staat, is dus: gooi alle classes maar is wel toegevoegd aan de issuelijst. staande wensen eindelijk gerealiseerd: op één hoop en draai JUnit. Dit betekent zuivere isolatie van classes bij het uit- dat er geen onderscheid meer is tussen Eén van mijn favoriete features die voeren van unittesten is nu mogelijk met de verschillende groepen classes en dat aan de junit-platform-maven-plugin JUnit 5 Platform. alle main-classes toegang hebben tot is toegevoegd is de -optie: Om het probleem te begrijpen, is het de test-classes en test-dependencies. daarmee is het eindelijk mogelijk om goed om te weten hoe JUnit werkt. Dit is Een groot deel van dit soort onterechte een goede scheiding te maken tussen het beste uit te leggen aan de hand van gebruik zal bij het gebruik van een build- de verschillende type classes, met als de commandline aanroep, want in prin- tool tijdens het compileren al naar voren ultieme waarde ABSOLUTE (met zelfs 4 cipe werken IDEs en buildtools uiteinde- komen, omdat daar de main-classes wel isolation-levels!): lijk ook op een vergelijkbare manier. afgeschermd zijn. Maar, bijvoorbeeld reflection zal niet herkend worden. MAIN Op de FAQ-pagina van JUnit staat het - target/classes - main dependencies... volgende: Wellicht iets minder interessant, maar TEST ook voor de test-classes geldt ongeveer - target/test-classes HOW DO I RUN JUNIT FROM hetzelfde: zij zouden alleen gebruik moe- - test dependencies... MY COMMAND WINDOW? JUNIT PLATFORM ten maken van de JUnit API classes (als - junit-platform-launcher 1. Set your CLASSPATH ( JUnit class files, your @org.junit.Test en junit.framework.Test- - junit-jupiter-engine class files, including your JUnit test classes, Case). Er is geen reden om bijvoorbeeld - junit-vintage-engine libraries your class files depend on ) - more runtime-only test engines... 2. Invoke the runner: JUnitCore te gebruiken. Zuiver gezien wil ISOLATOR je de volgende isolatie levels: - junit-platform-isolator java org.junit.runner.JUnitCore - junit-platform-isolator-worker Test Framework -> Main classe -> Test Framework ABSOLUTE is helaas niet de default. Dat is MERGED, waarbij de MAIN en TEST Ondertussen heeft Christian Stein een levels zijn samengevoegd (de traditionele ZUIVERE ISOLATIE maven-plugin geschreven genaamd opzet dus). ABSOLUTE zorgde ervoor junit-platform-maven-plugin. Die heeft dat een aantal projecten hun testen niet VAN CLASSES BIJ hetzelfde doel als de maven-surefire- meer succesvol konden uitvoeren. Echter, HET UITVOEREN VAN plugin, maar is volledig gebaseerd op ik vermoed dat dit een ‘design-flaw’ aan- UNITTESTEN IS NU JUnit5 Platform. Het JUnit platform is toont dat opgelost zou moeten worden een abstractielaag voor het uitvoeren van in dat project. Een mooie kans om een MOGELIJK MET JUNIT testen, dus ook TestNG is mogelijk, mits kritische blik op je project te werpen en PLATFORM ISOLATOR daarvoor een engine is. te verbeteren!

JAVA MAGAZINE

54 COLUMN.indd 52 23-04-19 13:03 Het Capgemini Effect

Innovatie brengt organisaties verder als het ook echt werkt.

Hoe ontstaat het Capgemini effect? Samen met onze klanten brengen we in kaart waar innovatie op de juiste manier toe te passen is. We slaan een brug tussen opdrachtgevers en een ecosysteem van start-ups en strategische technologie partners. Zo zorgen we ervoor dat innovatie niet beperkt blijft tot een idee, maar de onderneming echt verder brengt.

Ondek het Capgemini effect www.capgemini.nl

01-166.18GeneralNaamloos-1 1 ad Capgemini Innovation_215 x 275.indd 1 11/27/201823-4-2019 12:11:452:42:07 PM 17-20 JUNE 2019 // SOFTWARE DEVELOPMENT CONFERENCE

JAVA HIGHLIGHTS INCLUDE...

Upgrade Time: Choose Java 11 or the “Other” One… Kotlin with Paulien van Alst, Passionate Software Engineer at OpenValue Teaching Kotlin 60+ EXPERT SPEAKERS Introduction to Micronaught: 8 INSPIRATIONAL KEYNOTES Lightweight Microservices with Ahead of Time Compilation with Graeme 14 CORE TOPICS Rocher, Creator of Grails and Micronaut

Keeping Up with Java with Sander Mak, USE PROMO CODE Java Champion, Author of O’Reilly’s “Java 9 Modularity” & Fellow at Luminis JAVA10 FOR 10% OFF YOUR CONFERENCE ...or take a deep dive into Java with TICKET AT GOTOAMS.NL Sander Mak’s Java.Next: Keeping up with Java Masterclass

Senior Java professionals (HBO/WO) met internationale ervaring binnen 2 tot 6 weken op een innovatieve manier aan uw team toegevoegd, geen wervingskosten

Uw nieuwe collega werkend vanuit een WorldEmp kantoor in India onder westerse omstandigheden en de hoogste ethische standaarden Hij/zij wordt direct door u aangestuurd - net als uw lokale medewerkers

Via een hightech videocommunicatie continu onderdeel van uw team Door een uniek werving- en selectieprogramma een uitstekende technische, communicatieve en culturele fit

Neem contact op voor een live demo: [email protected] of 088-4002900

Neem contact op voor een live demo Mail: [email protected] Telefoon: 088-4002900

052-052_Adv GOTO-WE.indd 52 17-04-19 10:42 BESTUURSCOLUMN

Van het bestuur Lente!

De lente is begonnen en dat betekent: veel activiteiten op de NLJUG-agenda. Zo werden we afgelopen maand vereerd met een bezoek van Robert Cecil Martin alias ‘Uncle Bob’. In verschillende zeer goed bezochte meetups bij onder andere de Rabobank deelde Uncle Bob zijn verhaal ‘coding a better world together’. Op pagina’s 50-51 lees je meer over zijn Dutch road tour. Martin Smelt is Bestuurslid Ook de komende maanden staat ons nog jaar organiseren (events, meetups, acadamy, stichting NLJUG veel te wachten! Zo is het op 29 mei weer tijd awards, magazine enzovoorts), laat het ons voor onze succesvolle voorjaarsconferentie dan weten. Niet alleen zijn de bijeenkomsten J-Spring (ook dit jaar weer in TivoliVredenburg echt gezellig, het is natuurlijk voor iedereen Utrecht). Het programma staat inmiddels goed een bijdrage te kunnen leveren aan de online en we mogen denk ik best trots zijn op community, je kennis te delen met je collega’s de sprekers line-up voor dit jaar (jspring.nl). of jezelf beter te etaleren. Als echte Javaan denk ik dat deze editie van J-Spring er eentje is die je zeker niet mag mis- Voor nu wens ik je heel veel leesplezier met het sen! Wees er wel op tijd bij, want vorig jaar nieuwe nummer van Java Magazine en wellicht was het event al snel uitverkocht. tot ziens op een van onze aankomende events.

TEQnation 2019 Hartelijke groet, Net zo interessant is natuurlijk de ‘all develo- Martin Smelt pers’ conferentie TEQnation 2019. Een groots opgezette conferentie onder auspiciën van de NLJUG met naast (natuurlijk!) veel over Java ook aandacht voor andere talen, disruptive technologieën en af en toe een kijkje onder de motorkap bij grote techgiganten als Spotify, Google, Amazon, Facebook en Uber. Daar- naast uiteraard ook vele bekende namen uit onze eigen NLJUG community zoals Johan Janssen, Hubert Klein Ikkink, Rosanne Joos- ten, Brian Vermeer, Jeroen Resoort, Pieter van der Meer, Erwin de Gier en Bert Jan Schrijver. Kortom, een must visit. Nieuw lid redactiecommissie Tot slot wil ik via deze weg Ted Vinke (First 8) van harte welkom heten als nieuw lid van de redactiecommissie Java Magazine. Lees je dit en denk je: ik zou ook best graag iets willen doen voor de NLJUG community en/of voor een van de activiteiten die wij door het gehele

JAVA MAGAZINE | 02 2019

55 BESTUURSCOLUMN.indd 55 23-04-19 09:30 Hét event voor en door developers waar technologie, humor en lekker eten bij elkaar komen.

gaming edition

19 juni 2019 17:00 - 21:00 uur Locatie: Ordina, Nieuwegein

Meld je nu aan via www.codeandcomedy.nl

Naamloos-1 1 24-4-2019 09:33:09