Alle notities
NOTE DROP / 01FIELD NOTE≈ 3 MIN

Wat operations-ervaring verandert aan hoe je code schrijft

Wie software in productie heeft beheerd, kijkt anders naar time-outs, foutmeldingen, herstel en de rust van voorspelbaar gedrag.

Code ziet er op een ontwikkelomgeving vaak overzichtelijk uit. Een invoer gaat naar binnen, een resultaat komt naar buiten en de happy flow doet precies wat er is afgesproken. In productie bestaat die overzichtelijkheid maar zelden.

Daar zijn netwerken langzaam, externe diensten tijdelijk onbereikbaar en gegevens niet altijd zo netjes als het voorbeeld in de documentatie.

Mijn achtergrond in systeembeheer en operations heeft daarom blijvend veranderd hoe ik software schrijf.

Een afhankelijkheid is ook een faalroute

Bij een externe API denk ik niet alleen aan het succesvolle antwoord. Ik wil ook weten hoe lang we wachten, welke fouten opnieuw geprobeerd mogen worden en wanneer een retry het probleem juist groter maakt. Een databaseverbinding is niet alleen een configuratieregel, maar ook een plek waar capaciteit, latency en herstelgedrag samenkomen.

Dat betekent niet dat iedere functie vol defensieve code moet staan. Het betekent wel dat belangrijke grenzen expliciet zijn: time-outs hebben een bewuste waarde, fouten verliezen hun context niet en een mislukte actie laat het systeem in een begrijpelijke toestand achter.

Een foutmelding is onderdeel van de bediening

Goede logging is geen verzameling losse zinnen als something went wrong. Een bruikbare melding vertelt welke stap mislukte, voor welk technisch onderdeel en met welke informatie iemand verder kan zoeken — zonder gevoelige gegevens te lekken.

De echte test is simpel: kan iemand die niet bij het bouwen aanwezig was het probleem onder tijdsdruk onderzoeken?

Observability begint niet bij een dashboard. Het begint bij code die kan uitleggen wat zij aan het doen was.

Daarom vind ik correlatie-id’s, betekenisvolle foutcategorieën en meetbare processtappen belangrijk. Niet omdat ieder systeem een indrukwekkend observability-platform nodig heeft, maar omdat onbekend gedrag veel duurder is dan zichtbaar falen.

Herstel hoort bij het ontwerp

Een deployment is pas geruststellend als ook duidelijk is hoe je ervan terugkomt. Kan een wijziging achterwaarts compatibel worden uitgerold? Blijft een database-migratie werken wanneer tijdelijk twee applicatieversies actief zijn? Kunnen we een taak veilig opnieuw uitvoeren?

Die vragen beïnvloeden de code ruim voordat er een pipeline draait. Ze leiden tot idempotente processen, kleinere wijzigingen en minder verborgen aannames. Vaak leveren ze ook een eenvoudiger ontwerp op.

Rust is een technisch resultaat

Betrouwbaarheid wordt soms voorgesteld als extra werk na het bouwen van een feature. Voor mij zit het al in de definitie van de feature. Software is niet klaar wanneer zij één keer het juiste resultaat geeft, maar wanneer haar gedrag onder normale verstoringen voorspelbaar blijft.

Operations-ervaring maakt een ontwikkelaar misschien wat achterdochtiger. Ik zie dat vooral als nuttige nieuwsgierigheid: wat gebeurt er als dit antwoord te laat komt, als deze taak twee keer draait of als iemand morgen alleen de logs heeft?

Goede software geeft op die vragen geen perfecte garanties. Wel eerlijke, doordachte antwoorden.

michael@schouman:~

MS_ personal shell v2026.15.1

Typ help voor beschikbare commando’s.