Pillar page

Modernisering van legacysystemen

Incrementele monoliet-naar-microservices refactoring, migratie van verouderde technologieën naar moderne stacks, cloudmigratie — zonder bedrijfsuitval, met rollbackplan en volledige audit trail.

Elk bedrijf heeft wel een of ander legacysysteem. Sommige hebben er meerdere. Een boekhoudapplicatie uit 2008 die op de een of andere manier nog werkt. Een CRM geschreven door consultants die niemand meer kent. Een magazijn in Access. Elk daarvan zal ooit vervangen moeten worden — de vraag is niet of, maar wanneer en hoe.

Legacy modernisering is een van de moeilijkste soorten IT-projecten. Het vereist het balanceren van drie krachten: bedrijfscontinuïteit behouden (het systeem moet de hele tijd blijven draaien), moderne technologieën introduceren (microservices, cloud, AI) en risicobeheersing (elke refactor kan iets breken dat al jaren werkt).

Waarom niet gewoon „helemaal opnieuw schrijven"?

Uit onze ervaring zijn 9 op de 10 succesvolle moderniseringen incrementele refactoring, geen rewrite. Rewrites zijn conceptueel verleidelijk („we beginnen met een schone lei"), maar in de praktijk hebben ze drie fundamentele problemen:

  • Onzichtbare bedrijfslogica. Het oude systeem bevat jaren aan bedrijfsregels — speciale voorwaarden voor de grootste klanten, belastingvrijstellingen voor specifieke sectoren, workarounds voor regelgeving uit 2015. Het meeste is niet gedocumenteerd. Een rewrite moet dit alles reconstrueren uit het geheugen van mensen of uit codeanalyse.
  • Dubbel werk. Terwijl het nieuwe systeem wordt geschreven, eist de business nog steeds wijzigingen in het oude (regelgeving, nieuwe klanten, kleine bugs). Het team dupliceert het werk (wijzigingen op twee plaatsen) of bevriest het oude systeem (bedrijfsrisico).
  • Big bang deployment. Na een jaar werk is het nieuwe systeem „bijna klaar". Alle gebruikers in één nacht omzetten genereert monumentaal risico. Elk onverwacht probleem betekent terug naar het oude systeem, verlies aan teammoraal, ondermijning van vertrouwen van de business.

Incrementele refactoring (meestal volgens het Strangler Fig-patroon) lost alle drie op: bedrijfslogica wordt geleidelijk ontdekt, één bron van waarheid per entiteit, deployment in fasen met feature flags.

Zes moderniseringspatronen

Elk daarvan adresseert een specifiek risico. In de meeste projecten combineren we er meerdere, waarbij we het patroon per module kiezen.

Strangler Fig

Het oude systeem geleidelijk „omwikkelen" met nieuwe componenten. Oude code blijft draaien, maar elke nieuwe functionaliteit gaat naar een nieuwe microservice en bestaande modules worden één voor één vervangen. Na 12-24 maanden wordt de oude monoliet uitgeschakeld.

Anti-corruption layer

Een adapter die nieuwe code beschermt tegen de eigenaardigheden van het oude systeem (onleesbare veldnamen, vreemde datumformaten, inconsistente types). Alle „lelijke" logica geïsoleerd op één plek — nieuwe code werkt op een schoon domeinmodel.

Database refactoring

Patronen uit Refactoring Databases (Ambler/Sadalage): expand-and-contract voor schemamigraties, datavalidatie voor het verwijderen van oude kolommen, beide schema's parallel houden tijdens applicatiemigratie.

Branch by abstraction

Een abstractielaag rond het oude component introduceren, het nieuwe component parallel implementeren, geleidelijk verkeer omzetten van 0% naar 100% (feature flag). Zonder „big bang" deploy.

Shadow mode

De nieuwe code draait naast de oude — beide verwerken dezelfde verzoeken, maar alleen de resultaten van het oude systeem bereiken de gebruiker. Resultaten worden offline vergeleken. Na bevestiging van compatibiliteit (doorgaans 2-4 weken) zetten we het verkeer om naar de nieuwe code.

Event sourcing voor migratie

We registreren de stream van business events uit het oude systeem en spelen die af in het nieuwe. Hierdoor is voorafgaande validatie van de nieuwe architectuur mogelijk zonder productierisico, en kunnen we naar elke historische toestand terugkeren.

Typisch moderniseringsschema

Voor een gemiddeld systeem (monoliet van ~200k regels code, 5-10 bedrijfsmodules):

  1. Maand 1: Discovery en documentatie. Reverse engineering van de architectuur, mapping van afhankelijkheden, identificatie van datastromen, documentatie van bedrijfsprocessen met hulp van zakelijke stakeholders.
  2. Maand 2: Doelarchitectuur en pilot. Ontwerp van de nieuwe architectuur, technologieselectie, pilot op de eenvoudigste module (proof of concept). Eerste validatie van de aanpak.
  3. Maanden 3-4: Uitsnijden van de eerste productiemodule. Strangler Fig-patroon, shadow mode gedurende 2-3 weken, verkeersomschakeling, hypercare. Eerste echte bedrijfswaarde.
  4. Maanden 5-12: Iteratief uitsnijden van volgende modules. Elk in een cyclus van 4-6 weken: refactor → tests → shadow → productie → hypercare. Continue procesverbetering, vermindering van tijd per module.
  5. Maanden 12-18: Datamigratie en monoliet-decommissionering. Zodra alle kritieke modules zijn uitgesneden, ronden we de historische datamigratie af, schakelen we het oude systeem uit, archiveren we. Vieren.

Oud systeem vs. gemoderniseerd

AspectLegacysysteem (typisch)Na modernisering
Tijd om een nieuwe feature te leveren4-8 weken (hoog regressierisico)3-7 dagen (geautomatiseerde tests minimaliseren risico)
Testdekking5-15% (of geen)>80%, in de CI/CD-pipeline
Beschikbaarheid van ontwikkelaarsLaag (verouderde technologie)Hoog (populaire, moderne stacks)
SecurityOude libraries met ongepatchte CVE'sOWASP-scanning, gitleaks, geautomatiseerde updates
SchalingVerticaal (meer resources voor de monoliet)Horizontaal (specifieke microservices schalen)
ObservabilityLogs in bestanden, geen metricsPrometheus + Grafana + Sentry + SIEM
Compliance (AVG, EU AI Act, ISO 27001)Eisend, duur om aan te tonenIngebouwd in de architectuur, audit-ready

Zes typische risico's — en hoe we ze adresseren

Risico: Geen tests in het legacysysteem

Mitigatie: Eerst bouwen we karakteriseringstests (capture tests) — we leggen het huidige systeemgedrag vast op basis van productielogs en verkeersopnames. Pas daarna beginnen we met refactoring, met de tests als vangnet.

Risico: Kennis geconcentreerd bij één persoon („truck factor 1")

Mitigatie: Kennisoverdracht start in de eerste week van het project. Alle bijeenkomsten met de persoon die het systeem kent worden opgenomen en getranscribeerd, kernprocessen gedocumenteerd, architectonische beslissingen onderbouwd. Na het project begrijpt het hele team het systeem.

Risico: Tijdelijke teamvertraging

Mitigatie: In de eerste 2-3 maanden onderhoudt het team het oude systeem + bouwt het nieuwe. Een natuurlijke vertraging in wijzigingstempo. We mitigeren dit door: prioriteit te geven aan wijzigingen die alleen naar het nieuwe systeem gaan, freeze voor wijzigingen met lage prioriteit in de oude codebase.

Risico: Datamigratie

Mitigatie: Elke datamigratie heeft drie fasen: dry-run (op een productiekopie), staging (in een testomgeving met productieschaal van data), productie (in een onderhoudsvenster of incrementeel). Rollbackplan klaar vóór de start.

Risico: Organisatorische weerstand

Mitigatie: Communicatie met de business vanaf dag één: waarom moderniseren, wat verandert voor de gebruiker, wat is het schema, hoe meten we succes. De eerste iteratie wordt zo gekozen dat snel tastbare waarde wordt getoond (bijv. een nieuwe UI of een sneller rapport).

Risico: Kostenonderschatting

Mitigatie: Discovery (1-2 weken) vóór projectprijsbepaling. Iteraties van 2-3 weken met concrete deliverables — makkelijker bij te sturen dan in een lang „alles tegelijk"-project. Budget met een buffer van 20-30% voor het onverwachte.

Veelgestelde vragen

Wat is een legacysysteem?
Een legacysysteem is software die nog steeds in de organisatie draait maar gebaseerd is op verouderde technologie, diepe technische schuld draagt, tests mist, documentatie mist, of de ontwikkelaar mist die het schreef. Klassieke voorbeelden: een monolithische PHP 5.x- of .NET Framework 4.0-applicatie, een database zonder migraties, een jQuery-frontend, FTP-deployment. Het werkt, maar elke wijziging is hoog-risico en kostbaar.
Waarom moderniseren als het systeem werkt?
Drie hoofdredenen. Ten eerste: onderhoudskosten groeien exponentieel met de leeftijd van het systeem — minder ontwikkelaars kennen de technologie, elke wijziging duurt langer, elke bug heeft een grotere impactradius. Ten tweede: security-risico — oude frameworks hebben ongepatchte kwetsbaarheden, geen leveranciersondersteuning, niet-naleving van AVG/ISO 27001. Ten derde: bedrijfsgroei wordt geblokkeerd — nieuwe eisen (mobile, API, integraties, AI) zijn moeilijk of onmogelijk toe te voegen.
Is het niet makkelijker om alles helemaal opnieuw te schrijven?
Het klassieke „rewrite vs. refactor"-dilemma. Rewrites zijn conceptueel verleidelijk, maar in de praktijk duren ze 2-3 keer langer dan gepland, verdrinkt het project onder het gewicht van het reconstrueren van onzichtbare bedrijfslogica, en moet het oude systeem ondertussen toch nog ontwikkeld worden (dubbel werk). Uit onze ervaring: 9 op de 10 succesvolle moderniseringen zijn incrementele refactoring (Strangler Fig-patroon) — geleidelijk vervangen van stukken van het oude systeem met behoud van bedrijfscontinuïteit. Een rewrite heeft alleen zin voor zeer kleine systemen.
Vereist modernisering bedrijfsuitval?
In de overgrote meerderheid van projecten niet. We gebruiken patronen die het mogelijk maken om componenten „live" te vervangen: blue-green deployment, feature flags, dark launches, oude en nieuwe code parallel draaien met resultaatvergelijking (shadow mode). Korte onderhoudsvensters kunnen nodig zijn voor databasemigraties met significante schemawijzigingen, maar we plannen ze van tevoren (doorgaans 's nachts, in het weekend) met een volledig rollbackplan.
Hoe lang duurt een typische modernisering?
Het hangt af van de schaal. Een enkele monoliet-module uitgesneden als microservice: 1-2 maanden. Een grotere modernisering (5-10 modules, nieuwe database, nieuwe API): 6-12 maanden in iteraties van 2-3 weken. Een volledige enterprise monoliet-transformatie: 18-36 maanden, maar zakelijke waarde verschijnt al na de eerste iteratie — elke uitgesneden module levert onmiddellijk voordelen (snellere wijzigingen, lager risico, betere observability).
Vanaf welke technologieën migreren we het vaakst?
Meest voorkomende paden: PHP 5/7 → PHP 8 of Python (FastAPI) of Node.js (Express/Fastify). .NET Framework 4.x → .NET 8 of Java/Spring Boot. Java EE (JBoss/WebSphere) → Spring Boot of Quarkus. jQuery + monolithische templates → React/Vue/Astro. Oracle DB → PostgreSQL (significante licentiebesparingen). On-premise → cloud (AWS, Azure, GCP, lokale private cloud).
Hoe zit het met bestaande integraties met andere systemen?
Elke bestaande integratie wordt in de discovery-fase in kaart gebracht. Het migratieplan dekt: het behouden van bestaande contracten (interne en externe klanten merken geen verandering), het introduceren van versionering (v1 oud contract, v2 nieuw), het geleidelijk migreren van consumenten naar v2, daarna pas v1 uit dienst stellen. Volledige achterwaartse compatibiliteit tijdens migratie.
Hoe beperkt u het bedrijfsrisico?
Vijf lagen: 1) incrementaliteit — we vervangen één module tegelijk, niet alles ineens; 2) karakteriseringstests — vóór refactoring leggen we het huidige systeemgedrag vast (capture tests), die vervolgens verifiëren dat er niets is gebroken; 3) feature flags — nieuwe functionaliteit wordt geleidelijk uitgerold (1% van gebruikers → 10% → 50% → 100%); 4) rollbackplan voor elke deploy (<5 min); 5) hypercare na uitrol (intensieve monitoring 2-4 weken).
Hoe zit het met systeemdocumentatie die er niet is?
Een veelvoorkomend legacy-probleem. Eerste projectfase: reverse engineering van de documentatie. AI-agenten analyseren de code, het databaseschema, productielogs en genereren: architectuurdiagram, endpoint-lijst, afhankelijkheidskaart, beschrijvingen van bedrijfsprocessen. Deze documentatie wordt vervolgens geverifieerd met zakelijke mensen (klopt het proces met wat we uit de code begrepen). Resultaat: volledige documentatie vóór de refactoring begint, nuttig niet alleen voor het moderniseringsproject maar ook voor het producteam.
Hoe verhouden moderniseringskosten zich tot het onderhoud van het oude systeem?
Op korte termijn is modernisering duurder dan onderhoud (refactoring-investering + parallel onderhoud van het oude systeem). Het break-even point (waar het nieuwe systeem goedkoper te onderhouden wordt dan het oude) ligt typisch na 12-18 maanden. Daarna kost het nieuwe systeem: minder in onderhoud (minder ontwikkelaars, meer automatisering), maakt snellere wijzigingen mogelijk (kortere time-to-market), vermindert risico (betere observability, meer tests, geïsoleerde storingen).

Laten we beginnen met een audit

Een technische audit van een week: in kaart brengen van de huidige toestand, identificatie van de meest urgente moderniseringsgebieden, een gefaseerd plan met concrete bedrijfsuitkomsten in de eerste iteratie.