Samenvatting
Een technisch kijkje in de development-keuken van Freedom Internet
Published on July 18, 2022
Vanzelfsprekend automatiseren we zoveel mogelijk bij Freedom Internet. Behalve dat dit bedrijfseconomisch verstandig is, zijn we echte nerds en dus vinden we processen automatiseren ook leuk. Vanuit mijn perspectief als senior software engineer wil ik jullie graag meenemen met de technische kant van ons order management systeem genaamd SOMS, een applicatie gebouwd in Ruby on Rails.
SOMS
Ons order management systeem is omgedoopt tot SOMS: Subscription and Order Management System. (Alle grappen over dat het heel soms niet werkt zijn al gemaakt, maar wees vooral creatief). Het systeem is ontwikkeld als een webapplicatie zodat er geen specifieke server-client infrastructuur hoeft te worden opgezet. Een webapplicatie heeft als groot voordeel dat het in principe een website is die opgeroepen kan worden in de meestvoorkomende browsers: browsers die praktisch alle gebruikers al geïnstalleerd hebben op hun computer. SOMS is een systeem waar klanten nooit rechtstreeks mee te maken hebben; de applicatie wordt uitsluitend gebruikt door mensen van Freedom of via andere portals. Als je ons belt of mailt dan is de kans groot dat een Freedommer SOMS in beeld heeft staan om te bekijken wat je hebt besteld of wat je op dit moment afneemt van ons. Maar ook als je onze website of het persoonlijke dashboard op mijn.freedom.nl gebruikt, dan wordt er op de achtergrond vaak contact gemaakt met SOMS. Verder wordt SOMS ook gebruikt als een bron voor managementinformatie. SOMS vormt op die manier een spin in het web voor Freedom.
SOMS is ontwikkeld als back-end (met een UI voor Freedommers) om alles rondom abonnementen te automatiseren. Bestel je bij ons een internetverbinding? Dan is het eindresultaat een actief abonnement in SOMS. Bestel je vervolgens tv? Ook dan is het eindresultaat een abonnement in SOMS. Zeg je iets op? Dan wordt in SOMS dat abonnement verwijderd. Ga je verhuizen? Dan gaan we in SOMS de noodzakelijke gegevens wijzigen. SOMS vormt op die manier de ‘single source of truth’ ten opzichte van andere interne systemen.
Uiteindelijk bewaren we in SOMS wie je bent, waar je woont, wat je hebt besteld, wat je afneemt en vervolgens ook niet meer dan dat. We streven er naar om alleen het noodzakelijke in SOMS te bewaren. Dat betekent bijvoorbeeld dat we opslaan op welk adres je internetverbinding wordt geleverd maar dat we andere gegevens zoals je geslacht niet opslaan omdat dat gegeven niet relevant is voor onze dienstverlening.
Ruby on Rails
We ontwikkelen SOMS in het framework Ruby on Rails. Daarin is ruby de programmeertaal zoals javascript, c++, python en go dat ook zijn. Rails is dan het web application framework gebouwd in ruby. Het is een zogenaamd ‘opiniated’ framework. Dat betekent dat de ontwikkelaars van het framework al bepaalde keuzes hebben gemaakt zodat we als gebruiker van het framework daar niet over hoeven na te denken. Denk aan bijvoorbeeld formulieren, cookies, databasetoegang en security. Zo’n opiniated framework als Rails is vaak een zegen en soms een vloek. Maar hier geldt: maak een verstandige keuze en ga uit van datgene wat het vaakst van toepassing is. Daarbij geldt ook dat je in Rails praktisch altijd de mogelijkheid hebt om af te wijken van wat al besloten is voor je. Rails wordt/werd o.a. gebruikt door GitHub, Twitter, Shopify en Netflix. Je ziet met Rails vaak dat het in de start-up fase wordt gebruikt waarin functionaliteit en opleveringssnelheid de belangrijkste voorwaarden zijn.
In een wat verder verleden - voordat ik werkte voor Freedom - was de beslissing al gemaakt om het order management systeem SOMS als webapplicatie te ontwikkelen in Ruby on Rails. Wat mij betreft een goede beslissing. Ruby on Rails is erg geschikt om start-ups zoals Freedom te faciliteren. Ervaren Rails-developers kunnen zeer snel een webapplicatie (door)ontwikkelen in Ruby on Rails. Natuurlijk zijn er andere en vergelijkbare frameworks. Denk aan Laravel in PHP of Django in Python. Maar uiteindelijk moet je praktisch en economisch zijn: welke developers heb je beschikbaar, waar zijn ze handig mee en zijn de huidige developers relatief snel op te leiden om te programmeren in het gekozen framework? Vanuit die vragen is Ruby on Rails naar voren gekomen. Op basis van de huidige situatie zien we ook geen redenen om te kiezen voor een ander framework.
Persoonlijk ben ik een groot fan van Ruby on Rails en ik heb er meer dan 15 jaar ervaring mee. Het verhaal met web application frameworks zoals Rails is hetzelfde als met besturingssystemen. Er zijn mensen fan van Windows, van Apple’s besturingssystemen of van Linux. En ze hebben allemaal gelijk. Het punt is uiteindelijk namelijk erg simpel: werk met datgene waar je het makkelijkst, snelst en fijnst in werkt. Dat is voor jezelf leuk en voor je werkgever/opdrachtgever het slimste. Zo geldt dat ook voor web application frameworks zoals Rails. Ik heb gewerkt met Symfony (de basis van Laravel), met Java’s Spring Boot, met Django en dus met Rails. En in mijn optiek doen ze niet voor elkaar onder. De een is schaalbaarder, de andere trekt meer developers aan en weer een andere heeft een actievere community en betere support. Uiteindelijk blijft de manier van kiezen voor een framework hetzelfde: kies wat voor de huidige situatie verstandig is en probeer niet te veel de toekomst in te vullen.
Bestellen
Om wat begrip te krijgen van SOMS is het handig om een veel gebruikt orderproces te doorlopen waarbij we beginnen met de postcodecheck. De meeste aspirantleden bestellen via onze website. Tijdens het bestelproces wordt voortdurend contact gelegd met SOMS en zelfs al vóór het bestellen. Het start namelijk op het moment dat je de beschikbaarheid checkt met een postcode en huisnummer. Bij de postcodecheck op de website wordt in SOMS gecheckt wat er leverbaar is op jouw postcode. Die informatie over leverbaarheid hebben we zelf meestal niet en halen we op bij onze partners via zogenaamde API’s. Nadat de postcodecheck klaar is levert SOMS aan de website een lijst met beschikbare internetverbindingen die jij in je browser te zien krijgt. Nadat je een keuze hebt gemaakt uit de beschikbare verbindingen, start je het bestelproces.
Tijdens het bestelproces maak je keuzes over de producten die je wilt hebben en hoe je de installatie wilt uitvoeren. Denk aan huren/kopen van een modem, wel/geen monteur en wel/geen tv of telefonie. Ook vul je bepaalde gegevens in zoals je mailadres en tenslotte klik je op de knop ‘bestellen’ waarmee je bestelorder definitief wordt. Zoals eerder genoemd wordt er voortdurend contact gelegd met SOMS. Bij elke stap in het orderproces wordt in SOMS gecontroleerd of de order in de huidige staat bevestigd kan worden. Nadat je definitief bestelt, gaat SOMS voor je aan de slag.
Orders, taken en abonnementen
Op het moment van daadwerkelijk bestellen treedt er op de achtergrond van alles in werking. Dit merk je aan mailtjes die je krijgt, een thuisbezorgd pakket hardware, een monteur die langskomt en een internetverbinding die opgeleverd wordt. Dit wordt geheel geautomatiseerd aangestuurd door SOMS via een systeem van orders en taken.
Elke bestelling die je doet, levert in SOMS een order op die afgerond moet gaan worden. Een order is een breed begrip. Ook het wijzigen van je snelheid is een order. Of zelfs het aanpassen van je IBAN. Simpel gezegd: alles wat wijzigt aan jouw abonnement of je gegevens wordt realiteit via een nieuwe order. Een order is gekoppeld aan een klant en bestaat uit meerdere taken. Alle taken worden in principe automatisch uitgevoerd. Mocht een taak niet uitgevoerd kunnen worden om welke reden dan ook, dan kan een Freedommer ingrijpen en de taak opnieuw laten uitvoeren en desnoods eerst aanpassen. Pas als álle taken zijn voltooid, is ook de order voltooid. Het eindresulaat van een order zijn een of meerdere nieuwe of aangepaste abonnementen.
Ook een taak is een breed begrip, maar het komt erop neer dat een taak invoer ontvangt, iets geautomatiseerd doet en uitvoer produceert. Die uitvoer kan gebruikt worden als invoer voor een andere taak of om informatie op te slaan in SOMS. Zo is er een taak genaamd EmailHardwareSent
, deze taak wacht tot de hardware verzonden is van onze partner naar een klant. Als dat het geval is, dan stuurt de taak een mailtje naar de klant. Een andere taak is CanalDigitaalCreate
, met deze taak wordt bij Canal Digitaal een tv-abonnement besteld en gekoppeld aan onze klant. Nog een ander voorbeeld is de taak InternetConnectivityCheck
: we controleren uiteindelijk of je interverbinding daadwerkelijk ‘up’ is door heen en weer te pingen tussen jouw aansluiting en onze servers. Daar zorgt deze taak voor. Voor een internetorder zijn er soms meer dan 20 taken nodig om uiteindelijk de order te voltooien. Sommige taken worden uitgevoerd direct nadat een andere taak is voltooid. Maar er zijn ook taken waarbij SOMS om de zoveel tijd checkt of ze uitgevoerd kunnen worden omdat er gewacht moet worden op bepaalde condities. Kortom, taken doen in SOMS het meeste werk en zijn noodzakelijk om orders te voltooien.
Als een order met al z’n taken is afgerond dan levert dat een of meerdere nieuwe of gewijzigde abonnementen op. Vanuit één order kan bijvoorbeeld internet en tv zijn besteld. Dan is het resultaat twee abonnementen: een voor de internetaansluiting en een voor tv. We hebben SOMS zo ingericht dat abonnementen uiteindelijk los kunnen bestaan van orders. Op die manier kunnen we orders verwijderen terwijl de abonnementen blijven bestaan. Dit sluit mooi aan op onze constante jacht op dataminimalisatie.
Ondanks dat ik het hier voornamelijk over orders en taken heb gehad, vormen uiteindelijk de abonnementen in SOMS de bron van wat er op dit moment aan klanten geleverd wordt. Anders gezegd: orders en taken in SOMS vertellen ons wat er staat te gebeuren, abonnementen vertellen ons wat er gebeurt op dit moment.
Tot slot
Wat ik hierboven beschrijf is een ‘high over’ van onze SOMS-applicatie. Hopelijk heb ik hiermee een mooie aanzet gegeven voor een goed inzicht in onze automatisering en specifiek het order- en abonnementendeel ervan. Wil je ergens meer van weten? Wil je misschien zelfs dat we eens stukje broncode behandelen? Laat het mij vooral weten!