Blog · 5 september 2024

Wat tijd ons kan leren over modellen

Inzichten van onze senior consultant Stijn Vannieuwenhuyse over modelleren

Als trainer en coach bij Aardling moet ik vaak uitleggen wat Domain-Driven Design (DDD) is. Een van de grote concepten van DDD is modelleren, en hoewel het een eenvoudig te begrijpen concept is, is het soms lastig om te definiëren wat een model eigenlijk is.

Zo beschrijft Eric Evans, auteur van "Domain-Driven Design: Tackling Complexity in the Heart of Software", het:

Met andere woorden, een model is:

  1. Altijd een abstractie. Het is geen exacte replica, en om het bruikbaar en nuttig te maken, abstraheren en vereenvoudigen we elementen.

  2. Opgebouwd uit zorgvuldig gekozen aspecten van het domein die we in het model willen opnemen.

  3. Een poging om een bepaald probleem op te lossen. Het is niet alleen een voorstelling, het helpt ons een vooropgesteld doel te bereiken.

Een goed voorbeeld van een model is een metrokaart. Het is een abstractie, het is niet de echte wereld. Het model bevat visualisaties van lijnen, haltes en stations; elke lijn heeft haar eigen kleur en naam. Het is een schematische voorstelling en ze is vooral nuttig voor iemand die door de stad reist. Het is ook een duidelijk ander model dan wat een bedrijf voor spooronderhoud zou gebruiken. Zij moeten andere dingen zien, zoals precieze afstanden tussen stations, hun huidige elektrificatiestatus, en stations die momenteel niet in gebruik zijn. Maar voor de reiziger die de stad doorkruist, is dat soort detail niet belangrijk.

Het voorbeeld van de metrokaart illustreert de kernideeën achter wat een model is en waarom het nuttig is. De laatste tijd gebruik ik een ander voorbeeld om de waarde van modelleren aan te tonen: Tijd.

Ik heb een aantal kernlessen over modelleren geleerd door het voorbeeld van Tijd te gebruiken. Die lessen ga ik hieronder uitpakken.

Modellen zijn gebouwd op modellen.

Een digitale kalender zoals gCal is een model dat ons toelaat onze tijd te beheren en ervoor te zorgen dat we geen dubbele boekingen hebben, enzovoort. Maar het is ook gebaseerd op een dieper, onderliggend model: Tijd.

Tijd is een abstractie voor iets wat in de fysieke wereld gebeurt en wat we moeten beschrijven, en we hangen er attributen aan als gedrag. We kunnen de tijd niet zien voorbijgaan, maar we erkennen allemaal dat ze bestaat, en dat helpt ons erover te redeneren.

Modellen zijn imperfect en onvolledig

De eerste inspiratie voor een model is vaak gebaseerd op iets wat waarneembaar is in de echte wereld. Maar het interessante is dat we die dingen vaak vereenvoudigen. De rotatie van de aarde is bijvoorbeeld niet elke dag dezelfde. Sommige dagen draait de aarde wat sneller, andere dagen wat trager, afhankelijk van het seizoen en hoe dicht we bij de zon staan, maar we zijn het er allemaal over eens dat het gemiddeld 24 uur is. Terwijl het in werkelijkheid soms 23 uur en nog wat is, en andere keren 24 uur en nog wat. Hetzelfde geldt voor dagen. Eén omwenteling rond de zon duurt geen 365 dagen. Het is min of meer 365 en een kwart, maar we hebben afgesproken dat kwart te negeren, zodat het makkelijker wordt om erover te redeneren, en makkelijker om na te denken in gewone jaren.

In dit model hebben we ook een compensatiemechanisme, namelijk de schrikkeldag. Dat compensatiemechanisme zorgt ervoor dat we niet hoeven na te denken over de details en de complexiteit van de echte situatie. We kunnen het nadenken over die details meer dan 1000 dagen uitstellen, zodat we maar om de 4 jaar één dag nodig hebben om het gedrag van het model te compenseren tegenover de echte wereld. Een model hoeft dus niet perfect te zijn, of perfect nagebootst, maar het model moet in de meeste gevallen goed genoeg zijn, en mechanismen hebben om met bijzondere situaties of uitzonderingen om te gaan.

Modellen hebben nieuwe abstracties nodig

Ook al is het model gebaseerd op waarneembare dingen, de werkelijkheid biedt misschien niet genoeg oplossingen om het probleem van de gebruiker echt op te lossen. In het geval van Tijd hebben we met alleen dagen en jaren niet genoeg taal om af te spreken wanneer we iemand ontmoeten. Het enige waarneembare in deze context is de hoogte van de zon ten opzichte van onze omgeving. Maar mensen hadden meer opties nodig, dus begonnen we nieuwe concepten en abstracties in te voeren. Dat zijn nieuwe abstracties om het probleem op te lossen. In dit geval begonnen de mensen in het Nabije Oosten de dag op te delen in 10 gelijke delen plus één deel voor de dageraad en één deel voor de schemering, wat ons de basis gaf voor de dag van 12 uur, en het equivalent daarvan voor de nacht van 12 uur. En ook al waren die delen in het begin variabel, omdat ze afgestemd waren op de hoeveelheid licht en donker, geleidelijk evolueerde dit model naar een vaste tijd, die we een uur noemden.

Modellen hebben termen nodig

Soms moeten we, om een probleem op te lossen, nieuwe abstracties bedenken die nog niet in het domein bestaan. Maar die nieuwe abstracties hebben namen nodig. We hebben woorden en middelen nodig om die concepten te communiceren, om het model te beschrijven en te gebruiken. Daarvoor moeten we terminologie en taal uitvinden en hergebruiken. Om terug te keren naar ons voorbeeld: soms kunnen we woorden gebruiken die we al kennen, zoals Dag en Nacht, of we kunnen namen gebruiken uit bestaande concepten. Het woord Maand in de Germaanse talen komt bijvoorbeeld van de Maan en komt min of meer overeen met de maancyclus.

Andere woorden komen uit een andere context of kregen een nieuwe betekenis, zoals Uur. De oorsprong van het Uur ligt in "eender welke tijdsperiode", maar het werd geleidelijk preciezer en veranderde in hoe we vandaag over het Uur denken. En soms is een woord helemaal nieuw. De term "Week" vindt zijn oorsprong in "een reeks van, " en heeft dus niets met Tijd te maken. Sommige van die termen zijn willekeurig gekozen, en dat is heel normaal. We hebben nieuwe concepten gevonden en uitgevonden, en die concepten hadden namen nodig; we vonden inspiratie om ons heen om die dingen te beginnen beschrijven en erover te redeneren.

Modellen evolueren met de tijd

Wanneer we nieuwe dingen uitvinden, moeten we er rekening mee houden dat het misschien niet de beste manier is, dus moeten we ruimte laten om concepten na verloop van tijd opnieuw uit te vinden of te herdefiniëren.

Een voorbeeld daarvan is de schrikkelseconde. De aarde vertraagt geleidelijk door getijdenkrachten. Ons model van tijd loopt daardoor eigenlijk achter op de fysieke tijd. En omdat we dat opmerken, moeten we ons eraan aanpassen. Er is nu sprake van het invoeren van een schrikkelminuut om dat verschil op te vangen.

Dus ook al werkt een model, er zijn altijd nieuwe inzichten om het te verbeteren, en het is zinvol om het model na verloop van tijd te laten evolueren om het beter te maken.

Modellen zijn contextueel

Modellen zoals Tijd zijn contextueel. Het model dat ik beschreven heb, geldt bijvoorbeeld alleen op aarde. Op een andere planeet werkt het niet. Een jaar op Mars duurt geen 365 dagen, het is langer. En zelfs de dagen zijn ook iets langer. Op Mars kun je een gelijkaardig model bouwen, een dat op dezelfde principes gebaseerd is, maar in de details verschilt. Modellen kunnen ook afhangen van cultuur. De gregoriaanse kalender is één model, maar er zijn andere modellen in de wereld, gebaseerd op andere tijden en anders gedefinieerd, die voor andere mensen zinvol zijn.

Dat zijn mijn zes lessen over wat Tijd ons kan leren over modelleren. Ik hoop dat dit je helpt bij het nadenken over je eigen modellen.

Stijn Vannieuwenhuyse is senior consultant en trainer bij Aardling. Wil je je kritieke softwaresystemen verbeteren? Laten we praten.