Onze technieken

Dit is onze stack. Geen lijst van alles wat we ooit gezien hebben, maar de technieken waar ons werk op draait, met erbij wat we ermee gebouwd hebben. Onderaan staat waar we minder ver in gaan.

Microsoft

Het grootste deel van ons werk staat op de Microsoft-stack. Zes jaar doorlopende ontwikkeling aan één enterprise-platform loopt hier doorheen.

.NET en C#
Al onze backends draaien op .NET: DO365, het Office 365-platform van DotOffice, de services achter het Maatje-platform van SmartRobot Solutions, en onze eigen producten Calipso en Appset.
ASP.NET Core
De koppelvlakken van die backends bouwen we met Web API en Minimal APIs. Dat geldt voor DO365 en voor Calipso en Appset volledig, en voor het grootste deel van Maatje.
Azure
DO365 draait als cloudplatform waarbij elke klant binnen de eigen Azure-tenant werkt, met de afscherming die daarbij hoort. Calipso, Maatje en Appset draaien op Azure Kubernetes Service in West Europe, het Nederlandse datacenter van Microsoft. In Maatje loopt de realtime spraak van de zorgrobots via Azure Speech.
Azure DevOps
De backends van Calipso en Appset gaan via Azure DevOps door build, test en deploy. De frontends van diezelfde producten lopen via de pipelines van Vercel.
SharePoint
De klanten van DO365 werken grotendeels via hun eigen SharePoint. Het platform sluit daarop aan in plaats van er een eigen documentopslag naast te zetten, zodat documenten blijven staan waar de organisatie ze al beheert.
Microsoft 365
DO365 levert functionaliteit binnen Office 365 zelf: automatische handtekeningen op basis van de huisstijl, briefpapier en standaard tekstblokken. Zes jaar doorontwikkeling op dat platform is het langste dat we ergens aan gebouwd hebben.
Entra ID
DO365 staat als multi-tenant app-registratie in Entra ID. Gebruikers loggen in met het account dat ze binnen hun eigen organisatie al hebben; de klant kent zelf de rollen en de toegang toe binnen de eigen tenant.

Multi-tenancy

Eén applicatie die meerdere klanten bedient, met hun gegevens gescheiden. Dat klinkt eenvoudiger dan het is, zeker als je begint bij een applicatie die daar niet op ontworpen was. Wil je weten of dat voor jullie software kan, en wat het kost? Dat onderzoeken we in de multi-tenant scan.

Van een omgeving per klant naar één platform
DO365 bestond als een apart gebouwd platform per klant. Dat werkte, maar het aantal losse omgevingen maakte onderhoud zwaar en de stabiliteit wisselend. Wij hebben v2 ontworpen en de architectuur geïmplementeerd: één gedeeld cloudplatform met dezelfde functionaliteit als daarvoor, inclusief de ruimte voor maatwerkdocumenten die klanten gewend waren.
Tenant-scheiding
Elke klant van DO365 werkt binnen de eigen Azure-tenant en grotendeels via de eigen SharePoint. Gedeelde code, gescheiden data: dat is de afweging waar het bij multi-tenancy op aankomt en waar het bij bestaande applicaties meestal misgaat.
Configuratie per klant
In StartPage, de omgeving die we rond het documentplatform TP CDE bouwden, zijn de losse apps per project en per klant aan of uit te zetten. Dat inregelen doet ThinkProject zelf, zonder dat er een ontwikkelaar aan te pas komt.
Provisioning van nieuwe klanten
Een nieuwe klant van DO365 wordt volledig via de interface toegevoegd. Alleen het maatwerk waarvoor klanten bij DotOffice komen zit als plugin in de backend, en daar is een release voor nodig. Bij Maatje voegt de klant de robot zelf toe en autoriseert die eenmalig; daarna kunnen gebruikers met de juiste rechten zelf collega’s aan die robot koppelen.

Frontend

React
De interfaces van DO365 v2, StartPage en Calipso zijn in React gebouwd. Bij StartPage gaat het om losse apps die elk een stuk van het proces afdekken en onafhankelijk van elkaar werken.
TypeScript
Alles wat we in de frontend bouwen schrijven we in TypeScript. Statische typering vangt fouten af voordat ze in een review of in productie opduiken, en maakt een codebase overdraagbaar aan een ander team.
Next.js
Deze site draait op Next.js. We zetten het in waar server-side rendering en vindbaarheid meetellen, en niet voor applicaties die achter een login zitten.
Tailwind CSS
Ons standaardkeuze voor styling, ook op deze site. Opmaak staat bij de component in plaats van in een stylesheet die niemand meer durft op te ruimen.

Backend en infrastructuur

MQTT
De zorgrobots in het Maatje-platform communiceren via MQTT met twee .NET-services: één voor de robots zelf en één voor de klant- en beheerfunctionaliteit.
RabbitMQ
RabbitMQ verzorgt de berichtenstroom tussen de onderdelen van Appset, ons eigen platform.
Node.js
We bouwen server-side ook in Node.js, maar het is niet de reden om ons te bellen. Waar een klant er al op draait, kunnen we ermee vooruit.
CI/CD
Voor DO365 richtten we de pipelines en de Jira-workflow in waardoor releases voorspelbaarder verlopen en er minder mis kan gaan. Die draaien op de Jenkins-omgeving die DotOffice zelf host. Voor onze eigen producten gaat de backend via Azure DevOps en de frontend via Vercel. Welke tooling het wordt volgt uit waar een klant al op zit; het inrichten ervan hoort vanaf het begin bij de opdracht.
Docker en Kubernetes
Calipso, Maatje en Appset draaien in containers op Azure Kubernetes Service, in de regio West Europe. Daardoor blijft een omgeving reproduceerbaar van development tot productie en draaien de services van een platform naast elkaar zonder elkaar in de weg te zitten.

Cloud en databases

Azure
We bouwen op Azure. Daar staat ons werk en daar kunnen we de keuzes van onderbouwen. Op AWS hebben we een paar klanten van DotOffice geholpen, maar dat verkopen we niet als specialisme.
PostgreSQL en MySQL
DO365 draait op MySQL, de rest van onze platformen op PostgreSQL. We ontwerpen het schema, houden queries snel bij groeiende tabellen en voeren migraties uit zonder de omgeving plat te leggen.
Redis
In Calipso en Appset zit Redis op de plekken waar dezelfde gegevens telkens opnieuw opgevraagd zouden worden.

Ook mee gewerkt

Deze zijn we onderweg tegengekomen en kunnen we lezen en onderhouden, maar we noemen ze geen specialisme: Auth0, Stripe, Material UI, Redux, Remix en React Router.