Från magasinets tema till projektpraxis
Passande tjänste- och tekniksidor för inlägget
Avveckling av legacy-system misslyckas sällan i „byggandet“ av den nya lösningen, utan vid övergången: data måste förbli korrekta, gränssnitten får inte brista, och driften måste fortsätta under omställningen. I många företag är en Big-Bang-cutover därför inte ett alternativ – beroenden är för stora, kostnaderna för avbrott för höga, återställningen för svår.
I praktiken visar sig ett stegvis förfarande fungera med Strangler Pattern (funktionella delar kopplas över successivt), Parallelbetrieb (det gamla och det nya systemet körs temporärt parallellt) och tydliga regler för Datenkonsistenz. Detta inlägg visar hur du kan kombinera dessa byggstenar så att de är hållbara i den dagliga verksamheten för IT-ledning, administration och projektansvariga – inklusive typiska felbilder, konsekvenser för driften och beslutspunkter i rollout.
Varför steg-för-steg-ansatsen ofta är den realistiska vägen för att avveckla ett legacy-system
Legacy-system är sällan „bara en applikation“. Ofta är följande kopplat: batchkörningar, filgränssnitt (SFTP-mappar, nätverksenheter), utskrifts- och skanningsprocesser, lokala verktyg, BI-extrakt, e-postreläer, specialhårdvara, Shadow-IT-uttag och manuella workarounds. Vid en Big Bang måste alla dessa flöden fungera samma helg – inklusive behörigheter, stamdata, historik och specialfall.
Steg-för-steg-ansatsen minskar risken, men förskjuter den inte automatiskt „neråt“. Den gör riskerna synligare och mer hanterbara, men kräver i gengäld rena arkitektur- och driftbeslut: Var routas trafiken? Vem är dataägare? Vilken konsistens är verksamhetsmässigt nödvändig, var räcker tidsfördröjning? Och hur undviker ni att parallellkörning blir ett permanent bygge?
Strangler Pattern i företagsrealitet: inte „Microservices“, utan klara Schnittkanten
Det Strangler Pattern betyder: ni bygger nya funktioner bredvid det gamla systemet och omdirigerar trafiken stegvis tills den gamla delen är överflödig. Viktigt: detta är ingen arkitektur-religionsstrid („Monolith vs. Microservices“), utan ett Migrationsmuster. Det fungerar även om målarkitekturen fortsatt är en monolit – bara modernare, mer underhållbar och bättre integrerbar.
Det viktigaste beslutet: Dela upp efter processer, inte efter tabeller
I många avvecklingar skär man ut datadrivet („Vi tar först tabellerna för kunder och order“). Det leder ofta till smärtsam parallellkörning eftersom processer går tvärs över dessa data. Bättre är ett processorienterat snitt, t.ex. „offertskapande“, „godsmottagning“, „reklamationshantering“ eller „serviceärende till faktura“.
Praxisregel: En Strangler-etapp bör täcka ett fackligt slutet flöde som i det nya systemet kan drivas och övervakas ända-till-ända. Det innefattar ingångar (UI, API, import), bearbetning (affärsregler) och utgångar (utskrift, export, bokföring, avisering).
Strangler braucht einen „Umlenker“: Gateway, Proxy oder Routing-Schicht
För att användare och anslutna system inte varje gång ska behöva lära sig nya endpunkter används ofta ett routningslager. Beroende på utgångsläge kan det vara: en reverse proxy framför webbapplikationer, ett API-gateway för serviceendpoints eller ett integrationslager som sammanför filgränssnitt och händelser. Avgörande är driftsdugligheten: central konfiguration, tydliga loggar, övervakning och en kontrollerad rollback.
För administratörer är det viktigt att detta lager inte blir en blackbox. De behöver spårbar routing (vilket request gick vart), korrelation över loggar (t.ex. Request-ID) och definierade timeouts/retry-regler, så att fel inte „fastnar“.
Parallelbetrieb ist ein Betriebszustand – kein „Projekttrick“
Parallell drift betyder: gamla och nya komponenter arbetar samtidigt produktivt under en tid. Det är normalt, men kostsamt – framför allt i driften. Ni får fler rörliga delar, mer övervakning, större incidentpotential och mer komplexa ansvarsområden. Därför måste parallell drift planeras som ett tidsbegränsat driftsläge, inklusive avbrottskriterier.
Typische Parallelbetriebs-Modelle (und wann sie passen)
- Omkoppling efter användargrupper (pilotgrupp → vågor): lämpligt när användarroller är tydligt åtskiljbara och processer inte korsar grupperna.
- Omkoppling efter tenanter/platser: bra vid filial-/fabrikstrukturer när dataflöden mellan platser är begränsade.
- Omkoppling efter processsteg: t.ex. „ny registrering, fakturering fortfarande i det gamla“ – riskabelt om många återkopplingar finns, men ibland ofrånkomligt.
- Omkoppling efter objekttyp: t.ex. nya anläggningstillgångar i det nya systemet, äldre poster i det gamla – kan fungera om tydliga regler för historik/rapportering finns.
Ur driftsynpunkt bör ni utforma parallell drift så att felområdena förblir små: ett fel i den nya komponenten får inte dra med sig legacy-systemet (t.ex. genom blockerande gränssnitt eller databaslås), och omvänt får inte legacy sabotera alla nya flöden genom instabila exporter.
Feature Flags und Routing-Regeln: Kontrolle statt „wir rollen aus und hoffen“
Feature Flags är omkopplare som låter er aktivera/deaktivera funktioner selektivt – utan nytt deployment. För IT-ledning och projektansvariga är inte den tekniska detaljen avgörande, utan styrningen: Vem får slå om? Hur dokumenteras varför omställningen gjordes? Hur snabbt kan ni gå tillbaka? Vilka beroenden uppstår (t.ex. om data redan genererats i det nya formatet)?
En rimlig praxis är ett litet ändringsprotokoll (Decision Log) per omkopplingsåtgärd: tidpunkt, ägare, berörd användargrupp, förväntad effekt, övervakningsindikator, rollback-villkor. Det förhindrar det klassiska „Ingen vet längre varför det routas så“.
Datenkonsistenz im Rollout: Der Kern, an dem viele Ablösungen hängen
Datakonsistens betyder att data är fackmässigt korrekta, fullständiga och tillgängliga i förväntad ordning. I parallell drift blir det svårt eftersom två system skriver samtidigt eller åtminstone båda gör anspråk på ”sanningen”. Här avgörs om Legacy-avlösningen verkar stabil eller om ni tvingas köra delta-avstämningar i månader.
Först klarlägg: Vem är „System of Record“ per dataområde?
Ni behöver per dataområde (t.ex. kundfordringar, artiklar, priser, order, lagerrörelser, verifikationer) en fastställning av vilket system som är ledande. Det är inte bara en arkitekturfråga utan operativ:
- Var görs korrigeringar vid supportfall?
- Var ligger godkännandeprocessen (fyra-ögon, SoD/separation av funktioner)?
- Vilka revisionsspår krävs (vem ändrade vad när)?
- Hur undviker man efterarbete vid månadsbokslut?
I tidiga Strangler-faser är det ofta rimligt att låta Legacy initialt vara dataägare och att den nya komponenten „enda“ konsumerar. Senare vänder ni ledarskapet. Denna ledarskapsväxling är en egen milstolpe och kräver ett tydligt cutover-fönster samt kommunikations- och godkännandeplan.
Synkroniseringsmönster: Dual Write, CDC och Events – med realistiska förväntningar
Det finns flera sätt att synkronisera data mellan gammalt och nytt. Inget är „kostnadsfritt“.
- Dual Write: En åtgärd skriver i båda systemen (t.ex. skapa order → Legacy och nytt system). Fördel: snabb tillgänglighet. Nackdel: felhantering blir komplex (vad händer om system A skriver men system B inte?), dessutom uppstår beroenden och ofta prestandarisker.
- Change Data Capture (CDC): Ändringar extraheras som deltas från databasloggen eller via triggers/replikation. Fördel: lösare koppling mellan applikation och synkronisering. Nackdel: ni replikerar även „tekniska“ ändringar och måste rekonstruera fackmässiga händelser; dessutom blir schemändringar i Legacy plötsligt en integrationsrisk.
- Event-baserad integration: Systemet publicerar fackmässiga händelser (t.ex. „Order godkänd“), som andra system konsumerar. Fördel: tydlig facksemantik. Nackdel: kräver rena händelsedefinitioner, idempotens (flerkörning utan skada) och ett bärkraftigt driftskoncept för meddelandehantering.
För beslutsfattare är avgörande: datakonsistens är inte binärt. Vissa processer kräver stark konsistens (omedelbart korrekt, t.ex. betalningsgodkännanden), andra tolererar eventuell konsistens (kort fördröjning, t.ex. sökindex, rapportering, aviseringar). Denna klassificering bör tidigt avstämmas med verksamheten och revision/audit.
Konflikter och dubbletter: Planera uttryckligen för den „hässliga vägen“
I parallellkörning uppstår konflikter typiskt så här: Två system ändrar samma objekt, men efter olika regler. Eller en import körs dubbelt eftersom en retry kom „för tidigt“. Eller en användare korrigerar data i legacy medan det nya gränssnittet redan var omställt.
Ni behöver bindande regler för detta:
- Konfliktlösning: „Last write wins“ är sällan korrekt ur ett domänmässigt perspektiv. Bättre är prioriteringar (ledande system vinner) eller semantiska sammanslagningsregler (t.ex. kontaktstamdata vs. villkor).
- Idempotens: Varje integration ska klara upprepad bearbetning utan dubbletter (t.ex. samma verifikationsnummer, samma externa referens).
- Dead-Letter/Karantän: Obearbetbara deltaändringar måste vara sökbara, med tydligt ansvar och möjlighet till omstart.
Utan dessa regler glider datakonsistensen ner i „Excel-avstämning“ och manuellt efterarbete – med motsvarande frustration och svårt mätbara följdkostnader.
Utrullningsdesign: Vågor, godkännanden och återgång, utan att överbelasta driften
En bra utrullning är mer än „deployment + utbildning“. I parallellkörning måste ni sammanfläta utrullning och drift: Vem hanterar First-Level vid fel? Vilka loggar är omedelbart tillgängliga? Hur eskaleras? Vilka processer får inte ändras i en våg (t.ex. månadsbokslut, inventering, prisändring)?
Vågsplanering med hårda kriterier
Det har visat sig vara bra med en vågplanering med tydliga inträdeskriterier, inte bara datum. Exempel på hårda kriterier:
- Övervakningsdashboards och alerting för den nya komponenten är i drift och testade (inklusive reducerat „alarm-brus“).
- Runbooks för typiska incidenter finns (timeouts, köstockning, felaktiga importer, behörighetsfel).
- Deltaavstämning är automatiserad och levererar begripliga rapporter (differenser per objekttyp, tidsfönster, orsakskategori).
- Rollback-mekanism är övad (minst i Staging/Pre-Prod realistiskt genomspelad).
Särskilt den sista punkten underskattas ofta: Rollback är inte „vi slår tillbaka“. Om det nya systemet redan har genererat data måste ni veta hur dessa data blir synliga i legacy eller hur ni korrekt migrerar/neutraliserar de genererade uppgifterna.
Cutover–mini‑cutovers istället för Big Bang
Även i Strangler Pattern finns cutovers – men mindre. Typiskt är mini‑cutovers vid byte av ett processteg eller vid omställning av dataägarskap. Varje mini‑cutover behöver:
- Dataro (kort, men bindande): Vem får ändra vad under tiden?
- Avstämning: Vad har ändrats sedan sista synkroniseringen?
- Omkoppling: Routing/Feature Flags, jobb, scheman, behörigheter.
- Verifikation: Affärsmässiga smoke‑tester (t.ex. skapa order → följesedel → faktura), plus tekniska kontroller (köer, felkvoter, DB‑belastning).
För IT‑ledning är det viktigt att dessa steg dokumenteras som en upprepbar process och är personellt säkrade. Annars hänger projektsuccén på enskilda personer som „vet hur det går till“.
Stabilisera gränssnitten först: Det underskattade fundamentet för legacy‑avveckling
Många legacy‑system kommunicerar via etablerade gränssnitt: CSV‑exporter till mappar, nattjobb, direkta databasåtkomster från tredjepartsverktyg, e‑postbaserade arbetsflöden. En stegvis avveckling blir avsevärt enklare om ni först inventerar gränssnittslandskapet och konsoliderar på ett fåtal ställen.
Praktiskt betyder det: Identifiera systemkritiska integrationspunkter (t.ex. finansbokföring, leverans, produktionsåterkopplingar, identiteter/behörigheter) och bygg upp tydliga kontrakt där. „Kontrakt“ avser här inte juridik utan teknisk stabilitet: versionering, entydiga fält, stabila ID:n, dokumenterad felhantering, definierade SLA:er för dataleverans.
Om ni etablerar en intern API-/integrationsgovernancemodell (ägare, deprecationsregler, test-/stagingvägar) minskar risken att en legacy-ändring plötsligt lamslår er nya komponent. En lämplig intern länkning skulle till exempel vara ett inlägg om API-governance och deprecationsstrategier.
Säkerhet, behörigheter och revision: Parallelldrift skärper frågan
I parallelldrift uppstår ofta dubbla användar- och rollmodeller. Det leder till skuggrättigheter: en användare är korrekt begränsad i det nya systemet, men har fortfarande omfattande rättigheter i legacy – och väljer i slutändan den „enklare vägen“. Dessutom finns tekniska konton (servicekonton) för synkronisering, import, köer och batchjobb.
Konkreta punkter som ni bör klargöra tidigt:
- Identity-källa: Varifrån kommer användare och grupper? AD/Entra ID? Ett eget IAM? Viktigt är att provisioneringen är spårbar.
- Rollmapping: Om roller inte passar 1:1 behövs övergångsroller som är tidsbegränsade och som recertifieras.
- Servicekonton: Minimala rättigheter, rotation av secrets, ren loggning. Särskilt synkroniseringskonton är annars en ingångspunkt och svåra att revidera.
- Auditspår: När dataägarskapet skiftar måste det vara tydligt var beviset för ändringar finns och hur det kan spåras över båda systemen.
Viktigt för beslutsfattare: Säkerhet är här inte ett „ytterligare omfång“, utan påverkar genomförbarheten av rollouten. Att i efterhand anpassa behörigheter i parallelldrift är oftast dyrare än ett tidigt, pragmatiskt snitt för roller och servicekonton.
Övervakning, loggning och driftöverlämning: Utan observability blir parallelldrift blind
I parallelldrift är felbilder ofta indirekta: en delta ligger kvar, en retry körs oändligt, en kö stockar sig eller ett tidskritiskt jobb kolliderar med en databaslåsning. Om ni bara ser detta via användarärenden är det för sent. Ni behöver därför från början ett observability-minimum: monitoring (tillstånd), logging (händelser) och – där det är meningsfullt – tracing (kedja över system).
Praktiska, driftvänliga signaler är till exempel:
- Synkroniserings-backlog (hur många ändringar som „väntar“), plus åldern på den äldsta posten.
- Felkvoter per gränssnitt och felklass (validering, timeout, auth, datakonflikt).
Vid överlämning till drift spelar vilket verktyg som används en mindre roll än om ansvarsfördelning och runbooks är tydliga. Om ni har On-Call eller beredskap måste driften kunna agera vid typiska störningar utan att utvecklare behöver ägna sig åt detektivarbete.
När Strangler Pattern inte passar (eller bara med tydliga begränsningar)
Det finns situationer där stegvis avveckling bara fungerar i begränsad utsträckning:
- Extremt tät transaktionskoppling: Om nästan varje transaktion går över alla moduler och kräver strikt konsistens blir parallellkörning snabbt ohanterlig.
- Direkta DB-åtkomster från tredjepartssystem: Om flera verktyg skriver/läser direkt mot legacy-tabeller måste detta vildväxande först upphöra eller kontrolleras.
- Oklar dataägarskap: Om det inte går att fastställa vem som äger datan uppstår konflikter – och avvecklingen blir mer politisk än teknisk.
- Bristande driftdisciplin: Utan rena miljöer, reproducerbara deployments och övervakning blir varje mellansteg en risk.
Det innebär inte att ni är tvingade till en Big Bang. Men ni måste då byta ordning: först stabilisera integrationspunkter, centralisera dataåtkomster, klargöra roller och ägarskap – och först därefter tillämpa Strangler Pattern.
En praktisk arbetsplan för stegvis legacy-avveckling
Som vägledning för projektansvariga har en arbetsgång i tydliga etapper visat sig fungera. Den exakta formen beror på system och bransch, men logiken är robust:
- Inventar & beroenden: gränssnitt, jobb, dataflöden, användargrupper, kritiska tidsfönster (bokslut, inventering).
- Definiera gränssnitt: processmoduler, dataägarskap per område, integrationskontrakt.
- Routing & Schalter bauen: Gateway/Proxy, Feature Flags, central loggning.
- Fastställ datapath: CDC/Event/Dual Write, konfliktregler, karantän, avstämningsrapporter.
- Pilot med verklig belastning: inte bara demo, utan med verkliga fall, inklusive undantag.
- Fasvis utrullning: inträdeskriterier, Cutover-Checklisten, rollback-övningar.
- Avstängning & städning: avaktivera gamla vägar, ta bort jobb, återkalla rättigheter, uppdatera dokumentation.
Den sista punkten är avgörande: Många organisationer låter legacy-komponenter fortsätta „för säkerhets skull“. Resultatet: dubbla kostnader, oklart riskläge, ingen vågar stänga av. Planera dekommissioneringen som ett delprojekt med tidsplan, ansvariga och bevis (t.ex. „inga åtkomster sedan X veckor“, „alla exporter omställda“, „revisionskrav uppfyllda“).
Slutsats: Stegvis avveckling innebär att behandla konsistens och drift som en produkt
En stegvis avveckling av legacy är inte automatiskt enklare – men i många företag är det det enda realistiska alternativet. Strangler Pattern fungerar om ni i varje etapp definierar klara processgränser, planerar parallellkörning som ett faktiskt driftläge och inte lämnar datakonsistens åt slumpen. Avgörande är tidiga beslut om dataägarskap, robusta synkroniseringsmönster med konfliktregler samt ett rollout-design med vågor, godkännanden och övade återgångar.
Om ni planerar en ersättning och vill gå igenom gränssnitten, parallell drift eller konceptet för datakonsistens på ett strukturerat sätt, når ni oss via .
nästa steg
När ett ämne blir ett verkligt projekt bör arkitektur, befintligt bestånd och drift tidigt ses över gemensamt.
Vi stöder inte bara vid enstaka frågor, utan även när kodsfragment, legacy-frågor eller portalidéer ska utvecklas till ett robust företagsprojekt.
- Nuläge, målbild och tekniska risker bedöms tillsammans.
- REST, dataåtkomst, portaler och utrullning skjuts inte upp som sena följder.
- Ni ser tidigt vilken väg som är ekonomiskt och driftmässigt hållbar.