Amerikansk annonsplattform · ~20 år gammal kodbas

Modernisering av en monolit på 823 000 rader — utan driftstopp, utan big bang

En .NET Framework 4.8-plattform i drift med 54 projekt och 23 000 commits av historik, moderniserad stegvis till .NET 10 — det gamla systemet fortsätter köra medan det nya tar över sektion för sektion. 19 sektioner med tester på cirka 8 dagar.

  • 823 000 rader legacy-kod
  • 19 sektioner på ~8 dagar
  • SSO utan en enda ändring i det gamla systemet
  • 175 tester från dag ett

Kunden

En amerikansk företagskatalogs- och annonsplattform i drift i nästan två decennier: konsumenter, handlare, återförsäljare, betalningar, transaktionstvister, integrationer med annonsnätverk. En levande verksamhet med riktiga intäkter — och en kodbas ingen vågade röra.

Utmaningen

Systemet: 823 000 rader C# fördelade på 54 projekt, .NET Framework 4.8, WebForms-sidor mer än ett decennium gamla, 581 tabeller i datamodellen och över 23 000 commits av historik. Allt flödar genom en central "hubb"-applikation som åtta separata sajter och tjänster är beroende av.

Det klassiska dilemmat: en total omskrivning är för riskabel och dyr, medan status quo blir dyrare för varje år — de gamla teknikerna saknar support, nya utvecklare vill inte arbeta med dem, och varje ändring är farlig.

Angreppssättet

Vi valde stegvis modernisering ("strangler fig"): det nya systemet växer bredvid det gamla och tar över funktionalitet sida för sida, medan användarna inte märker någonting.

  • Inventering före kod. Alla 123 adminsidor katalogiserades och prioriterades. Ett trettiotal visade sig vara döda eller duplicerade — vi pensionerade dem utan att portera en rad. Mindre omfattning, lägre pris.
  • En osynlig övergång. Den nya applikationen körs på samma adress, bakom samma inloggning. En användare loggar in i det gamla systemet och växlar till de nya sidorna utan en andra inloggning — utan en enda ändring i den gamla koden.
  • Portera bara det som lever. För varje sida spårar vi hela anropskedjan i affärslogiken och porterar bara det som faktiskt används. Död logik dör genom att helt enkelt inte porteras.
  • Tester samma dag. Varje migrerad sektion levereras med automatiserade tester i samma PR — inklusive tester som jämför den nya kodens beteende mot den gamla på identiska data.
  • Beslut på papper. Runt 1 800 rader projektdokumentation (migreringshandbok, beroendeanalys, teststrategi) skrivna före och parallellt med koden — så att varje beslut kan verifieras på nytt i morgon, av vem som helst.

Resultatet

  • 19 adminsektioner — betalningar, tvister, paket, kategorier, rapporter — migrerade på cirka 8 arbetsdagar, med 175 automatiserade tester.
  • Noll risk för den löpande verksamheten: det gamla systemet fortsätter betjäna allt som ännu inte migrerats; övergången är osynlig för användarna.
  • En modern grund (.NET 10) där nya funktioner tar timmar i stället för veckor — och som det är lätt att hitta utvecklare till.
  • Omfattningen krympt före start: de döda sidorna betalades inte för en andra gång.

Snabbheten kommer från AI-accelererad utveckling. Tryggheten kommer från metoden: inventering, paritetstester och en övergång utan big bang. Inget av dem fungerar utan det andra.

Teknik

.NET 10 · ASP.NET Core MVC · EF Core · nginx coexistence · xUnit + Playwright