Bij Mediquest zijn er twee DevOps-teams: team DBA, vernoemd naar het administreren van databases; en team Clojure, vernoemd naar het programmeren met Clojure. In deze blogpost belichten we het programmeren met Clojure.
Mediquest is één van de ongeveer twintig bedrijven in Nederland die werken met deze programmeertaal. Waarom Clojure? Wat is het? Hoe is het om ermee te werken? Onze collega Erwin is softwareontwikkelaar in team Clojure en neemt ons mee.
Software begint bij code. In het algemeen geldt: hoe minder code hoe minder fouten. Clojure is een taal die ontwikkelaars in staat stelt om met relatief weinig code veel uit te drukken. Clojure-code beschrijft de essentiële complexiteit, inherent aan het op te lossen probleem, terwijl de onnodige complexiteit (de technologische overhead) wordt beperkt tot een minimum.
Met Clojure kan je op veel plaatsen minder code schrijven: in browsers met ClojureScript, op servers via Clojure en ClojureCLR tot scripting op besturingssystemen via de Clojure-variant Babashka. Zo schrijf je van voor- tot achterkant in dezelfde taal.
Deze uitdrukkingskracht en dit bereik stelt Clojure-teams in staat om met een relatief klein ontwikkelteam veel software te beheren.
Clojure is tien jaar geleden in Mediquest geïntroduceerd door oud-collega Cees van Kemenade die een low-code platform maakte genaamd de ‘Business Process Engine’. Met dit platform kunnen procesflows (e.g. als deze data wordt aangeleverd, doe dan deze controles, verstuur deze e-mails, sla het hier versleuteld op) visueel worden gedefinieerd. Die plaatjes leiden tot uitvoerbare code. Zo kunnen mensen met weinig programmeerervaring processen programmeren. Sommige van die flows draaien nog steeds, maar vanaf vijf jaar geleden kwamen er in Mediquest meer Clojure-ontwikkelaars, ontstond team Clojure en verschoof de aandacht naar ontwikkeling van het portaal.
Dankzij Clojure biedt Mediquest nu een portaal vol applicaties met componenten (gecertificeerd op gebied van kwaliteit en privacy) voor dashboards, voor het maken en distribueren van vragenlijsten en om bestanden te uploaden en downloaden. Elk van deze bouwstenen kan worden geconfigureerd om aan specifieke klantwensen te voldoen. Zo wordt het portaal ingezet voor onder meer Mijn Positieve Gezondheid, mijnPerined en PREM.
‘Volgens mij worden sinds Clojure dingen sneller ontwikkeld.’ – Corine Horsch, Data Scientist (team Datalab)
Een uniek kenmerk van Clojure (of beter gezegd van de programmeertaal Lisp, waar Clojure een variant van is) zijn de ‘verkeerd geplaatste’ haakjes. Waar andere programmeertalen vaak lezen als doSomething(1, 2)
lees je in Clojure (do-something 1 2)
. Ja, zeker voor programmeurs, is dat even schrikken. Maar gelukkig, deze haakjes tezamen met de syntax voor lijsten ‘()
, []
voor reeksen, #{}
voor sets en {}
voor dictionaries vormen tachtig procent van de Clojure-regels.
Met die haakjes is Clojure-code zelf ook een datastructuur in Clojure, namelijk een lijst. Daarom noemen Clojure-programmeurs code ook wel data. Dit maakt het mogelijk voor programmeurs om code te schrijven die code aanpast. En zo als het ware een eigen programmeertaal binnen Clojure te ontwikkelen, die specifiek aansluit op het domein. (Mocht je als programmeur deze zogenaamde macro’s beter willen begrijpen, de blogpost The Nature of Lisp legt het uitgebreid uit.) Zo is een groot deel van de expressiviteit en kracht van Clojure dankzij deze onconventionele haakjesplaatsing.
_Bron: xkcd_
Uiteraard kun je ook in Clojure complexe en moeilijk te onderhouden code schrijven. Echter, de taal is zo ontworpen dat dit wordt ontmoedigd. De meeste programmeerproblemen kunnen uiteindelijk worden uitgedrukt met die paar eerder genoemde basisdatastructuren zoals lijsten, sets en dictionaries, en Clojure blinkt uit in het hanteren van deze datastructuren.
‘Het is beter om honderd functies te hebben die opereren op één data-abstractie, dan tien functies op tien datastructuren.’ – Rich Hickey, maker van Clojure (in navolging van computerwetenschapper Alan Perlis)
De datastructuren zijn namelijk onveranderlijk (dit maakt het makkelijk erover te redeneren), mocht je parallel code willen aanspreken zijn daar faciliteiten voor en er zijn allerlei functies die opereren op al deze lijsten, sets en dictionaries (en ook de datastructuren van het hostplatform), omdat die alle de zogenaamde sequence-interface implementeren. Dit voorkomt een hoop bugs veroorzaakt door een taal zelf.
Bugs die optreden komen meestal voort uit fouten in het ontwerp zelf (de essentiële complexiteit), en niet dankzij programmeerfouten door de taal (onnodige complexiteit).
Een groot deel van wat Clojure zo prettig maakt om mee te werken komt door de haakjes aan de buitenkant: je hebt als ontwikkelaar toegang tot draaiende code via een REPL; je kan vragen stellen aan draaiende code en deze wijzigen, en je kan Clojure op eenvoudige wijze uitbreiden met nieuwe concepten.
De haakjes wennen overigens wel, voor nieuwe Clojure-programmeurs is vaak het werken met onveranderlijke datastructuren (het zogenoemde functioneel programmeren) het lastigst om te leren. Hoewel er meer programmeertalen de functionele kant op zijn gegaan de afgelopen jaren.
Goed, ik denk dat het Clojure-evangelie nu genoeg is verkondigd. Al met al is het als ontwikkelaar prettig werken met Clojure vanwege de robuuste datastructuren, dezelfde code kunnen schrijven op voor- en achterkant, het gemak van redeneren en de krachtige abstractiemogelijkheden. Clojure speelt een essentiële rol bij het tijdig opleveren van kwalitatief hoogstaande software bij Mediquest.
Erwin – softwareontwikkelaar team Clojure
Deze blog verscheen eerst op de Mediquest-website. Zie https://home.mediquest.nl/een-kijkje-in-de-keuken-van-team-clojure/.