Bij innoveren en digitale transformatie denken veel bedrijven gelijk aan het toepassen van de laatste technieken, zoals kunstmatige intelligentie. Natuurlijk bieden dit soort technologieën veel kansen, maar het is nog belangrijker dat je eerst je digitale diensten snel en frequent kan doorontwikkelen. Een ontwikkelproces met een korte cyclus van bedenken tot ingebruikname zorgt ervoor dat je kan innoveren in kleinere stappen en met minder risico. “Functioneel programmeren” (of FP) is een manier van programmeren die de ontwikkelcyclus kan verkorten en verbeteren.
Het probleem van complexiteit
Zelfs een eenvoudige oplossing wordt complexer naarmate deze uit meer code bestaat. Dat heeft ermee te maken dat de ontwikkelaar voor elke aanpassing eerst de bestaande code moet begrijpen. Veel code en/of slecht georganiseerde code betekent dan dat daar steeds meer tijd voor nodig is. Daarnaast besteed je als bedrijf liever tijd aan functionaliteit die bijdraagt aan het behalen van je bedrijfsdoelstellingen, dan aan een bug.
Wat is functioneel programmeren?
Functioneel programmeren (FP) is geen rocket science, maar heeft wel een solide basis in wiskundige theorieën (o.a. lambdacalculus en categorietheorie). Bij FP bestaat de oplossing zoveel mogelijk uit functies (formules) die alleen gebruik kunnen maken van de data die ze als parameters mee krijgen en niet van data die zich ergens anders in het geheugen van de computer bevindt. Door functies vervolgens op een slimme manier aan elkaar te rijgen en door te geven aan andere functies, kunnen complete oplossingen samengesteld worden (functiecompositie). Het is een manier van programmeren waarin de ontwikkelaar zichzelf bepaalde beperkingen oplegt om op die manier complexiteit te reduceren, testbaarheid te verbeteren en betrouwbaarheid te verhogen. Jij profiteert daarvan met snelle en waardevolle ontwikkelcycli. Hoe dat precies werkt?
Beter begrijpen = minder fouten 🧠
Functioneel geprogrammeerde applicaties zijn vaak sneller en beter te begrijpen, omdat ze ten eerste niet willekeurig gebruik maken van allerlei data binnen de app (in extreme vorm noemen we dat spaghetti-code), maar alleen van de informatie die meegegeven wordt via functie-parameters. Daarnaast is bij functional programming de volgorde van operaties duidelijker in vergelijking tot het meer mainstream “imperatief programmeren”. Kortom, als je bestaande code sneller en beter begrijpt, dan kan je ook sneller aanpassingen doen en heb je minder kans op het introduceren van nieuwe bugs.
“Those who want really reliable software will discover that they must find means of avoiding the majority of bugs to start with.” - Dijkstra
Weg met onvoorspelbaar gedrag! 💥
Iedereen kent ze wel, die bugs in applicaties die soms op willekeurige momenten een app laten crashen. Het voordeel van een "pure" functie binnen functioneel programmeren is dat deze voor dezelfde parameters altijd hetzelfde resultaat geeft. Je kan helaas geen applicaties bouwen die 100% bestaan uit dit soort functies, omdat je ook te maken hebt met een onvoorspelbare “buitenwereld” (neveneffecten), zoals interactie van de gebruiker en externe databronnen. Door toch zoveel mogelijk binnen de regels van FP te werken reduceer je aanzienlijk de kans op willekeurige fouten. Zit er toch ergens een bug, dan kan de voorspelbaarheid van de code ook helpen om de fout sneller te vinden, herstellen en testen.
Veilige turbo op je software 🏎️
Om de snelheid van je software te verhogen wil je het liefst alle processors van de server -of ander apparaat- tegelijkertijd benutten. Dit parallel uitvoeren van code noemen we ook wel concurrency. Als je dit binnen één applicatie doet, dan moet je er rekening mee houden dat de uitvoering van het ene stukje logica de werking van een ander -parallel uitgevoerd- stukje logica zou kunnen verstoren. Functioneel programmeren dwingt je om deze parallelle code beter van elkaar te scheiden, zodat dit soort problemen beperkt kunnen worden en met pure functies zelfs voorkomen. Het resultaat: snellere software met minder bugs.
Effectiever testen bespaart tijd en geld ⏱️
Een snelle software ontwikkelcyclus is niet alleen afhankelijk van het programmeren zelf. Ook (bij voorkeur automatisch) testen van software is belangrijk om als ontwikkelaar te weten of alles nog werkt zoals verwacht nadat je iets hebt aangepast. Het is namelijk veel goedkoper en sneller als je de fout al ontdekt tijdens de ontwikkeling in plaats van tijdens het gebruik in de live-omgeving. Functies zijn vanwege hun voorspelbaarheid ook ideaal om te kunnen testen. Verschillende scenario’s zijn makkelijk na te bootsen door de parameters van desbetreffende functie te laten variëren en vervolgens te kijken of voor elk scenario het juiste antwoord wordt bepaald.
Functional programming bij Everdune
Wij gebruiken nu al een tijdje de open source software “fp-ts” als hulpmiddel om de cloudplatformen voor onze klanten te bouwen in TypeScript volgens de regels van functional programming. Ook voor apps zijn er diverse frameworks beschikbaar die hierbij kunnen helpen. Eerlijk is eerlijk: Het kost wat tijd om FP te leren, maar dat verdient zich dubbel en dwars terug in de kwaliteit van de software en de snelheid waarmee code is aan te passen. Benieuwd of jij en je digitale diensten kunnen profiteren van functioneel programmeren? We denken er graag over mee!