Pređi na sadržaj

Modernizacija nasleđenog sistema bez pisanja od nule

Strahinja Polovina · Inženjering10 min čitanja

Najopasnija rečenica u vlasništvu nad softverom verovatno glasi „hajde da ovo jednostavno napišemo iz početka“. Izgovara se za sisteme koji to i zaslužuju, stare petnaest godina, nedokumentovane, koje drži dvoje ljudi što se sećaju zašto se modul za fakturisanje ponaša baš tako. Izgovara se, međutim, i za sisteme koji nose posao, one kroz koje svakog dana prolaze porudžbine, zalihe, naplata i zarade, pa posao stane onog trenutka kada oni stanu. Veliko prepisivanje zavodi zato što je čisto: nov sistem, ovaj put napravljen kako treba, i jednog dana samo prebacite prekidač. Bilans je manje čist, jer prepisivanje sistema koji radi propada dovoljno često i dovoljno skupo da tu rečenicu treba tretirati kao tvrdnju kojoj je potreban dokaz, a ne kao plan.

Postoji alternativa koja se znatno češće završi: postepena zamena, poznata kao strangler fig obrazac, nazvan po smokvi koja obraste stablo domaćina dok stablo više ništa ne drži. Novi sistem raste oko starog, preuzima modul po modul, a stari se gasi onog dana kada više ništa ne rutira ka njemu. Manje je dramatično od pisanja od nule, i to je upravo poenta.

Zašto veliko prepisivanje propada

Načini na koje propada toliko su predvidivi da su dobili imena. Prvi je efekat drugog sistema: tim koji sistem gradi iznova unosi u novu verziju svaku ambiciju koju je stara potiskivala. Projekat definisan kao „ono što stari sistem radi, na modernom stacku“ tiho postaje „ono što stari sistem radi, plus izveštavanje koje je prodaja oduvek tražila, plus plugin arhitektura, plus multi-tenancy ako nam ikad zatreba“. Obim raste baš u projektu u kojem je trebalo da bude fiksan, jer stari sistem stoji tu kao svakodnevni podsetnik na sve što nikada nije umeo.

Drugi je zamrznuti prozor za nove funkcionalnosti. Prepisivanje ostaje prepisivanje samo dok meta miruje, pa se stari sistem zamrzava dok se novi gradi, ali posao se ne zamrzava. Osamnaest meseci je dugo da prodaji govorite kako nema ničeg novog, i skoro nijedna kompanija tu liniju ne izdrži, pa izmene ipak ulaze u stari sistem, nova verzija juri pokretnu metu, a jaz između njih se širi tačno u trenutku kada je trebalo da se zatvara.

Treći su podaci koje niko ne razume. Sistem koji deset godina vodi jedan posao nije opisan dokumentacijom nego svojim ponašanjem. Čudno zaokruživanje u obračunu popusta, statusni kod koji postoji zbog jednog klijenta iz 2016. godine i noćni job koji popravlja ono što dnevna smena pokvari ne stoje ni u jednoj specifikaciji, jer stari sistem jeste specifikacija. Prepisivanje te zahteve otkriva u najgorem mogućem trenutku, posle prelaska i u produkciji, kroz tikete podrške, i to otkriće obično i ubije projekat.

Kako postepena zamena zaista izgleda

Strangler obrazac ima mali broj pokretnih delova. Prvo ispred starog sistema staje fasada, sloj za rutiranje koji prima svaki zahtev i prvog dana sve prosleđuje netaknuto. Ništa se ne menja osim što od tog trenutka vi držite ulazna vrata, a to je cela prva etapa i vredi više nego što izgleda: odatle pa nadalje, gde koji deo funkcionalnosti živi postaje odluka o rutiranju koju vi kontrolišete, nevidljiva ljudima koji sistem koriste. Fasada može biti API gateway, reverse proxy ili tanak servis koji sami napišete, jer je tehnologija daleko manje važna od same činjenice da fasada postoji.

Zatim zamena ide modul po modul. Ograničen deo sistema, recimo izrada ponuda, pravi se iznova kao nov servis na namerno dosadnom stacku, jer je modernizacija poslednje mesto na kojem treba trošiti budžet za novotarije. Novi modul radi paralelno sa starim: oba primaju iste ulaze, oba proizvode rezultate, a rezultati se porede. Odgovor starog modula je onaj koji klijenti vide, dok odgovor novog ide u senku, gde se loguje i uporedno analizira.

Prelazak se dešava po modulu i tek kada se brojevi poklope. Ne na datum iz plana i ne kada demo izgleda dobro, nego kada je izveštaj o razlikama dovoljno dugo bio čist, ili objašnjivo nečist, da mu se veruje. Tada fasada rutira izradu ponuda ka novom modulu, stari ostaje da radi kao rezerva, a pažnja prelazi na sledeći modul. Svaki korak je mali, izmeren i reverzibilan, a to je upravo ono što prelazak preko noći nikada nije.

Stari sistem nije neprijatelj. On je specifikacija, test orakul i rezerva, sve do dana kada više ništa ne rutira ka njemu.

Kako se bira prvi modul

Prvi modul nosi nesrazmeran deo sudbine projekta, jer je njegov pravi zadatak da dokaže mašineriju, dakle fasadu, paralelni rad, usaglašavanje i prelazak, na nečemu što ne može da potopi firmu. Tri filtera obave najveći deo posla. Slaba spregnutost: birajte nešto što sa ostatkom sistema deli najmanje tabela i poziva, na primer generisanje dokumenata, notifikacije ili tok izveštavanja, da prvog dana ne razmršujete ceo čvor. Velika muka: birajte nešto na šta se ljudi aktivno žale, da prvi prelazak proizvede rezultat koji primeti neko van projekta. Najbolji kandidat je često proces koji tim već krpi izvozima i prekucavanjem, jer je sloj tabela oko nasleđenog sistema mapa mesta koja bole. Merljivost: birajte nešto čiji se rezultat može mehanički uporediti, kao što su generisani dokumenti, izračunati zbirovi ili vremena odziva, jer cela disciplina prelaska zavisi od toga da postoje brojevi koje treba poklopiti.

Ono što prvi modul ne treba da bude jeste impresivan: mali, iritantan i prebrojiv pobeđuje veliki i strateški. Modul koji se za šest nedelja napravi i čisto pređe donosi više kredibiliteta od onog koji traje šest meseci i možda pređe. Strateški moduli dolaze kasnije, kada mašinerija preživi kontakt sa produkcijom.

Problem podataka

Kod je lakša polovina modernizacije, a teža su podaci. Vladajuće načelo je grubo: stari sistem ostaje izvor istine dok novi ne dokaže suprotno, modul po modul. U praksi to znači da podaci teku u jednom smeru dok je modul u senci, pa se sinhronizuju sa starog na novi kroz change-data-capture ako stara baza to podržava, ili noćnom paketnom obradom ako platforma dozvoljava samo toliko. Novi modul čita svoju sinhronizovanu kopiju, računa svoje odgovore i ne upisuje ništa na šta se bilo ko oslanja.

Između senke i prelaska stoji period usaglašavanja, i tu isplivavaju stvarni zahtevi. Oba sistema obrađuju isti radni dan, job za razlike poredi rezultate, a svako neslaganje se istražuje. Kod većine neslaganja greši novi sistem, i to onako kako nijedna specifikacija ne bi uhvatila: nedokumentovano zaokruživanje, klijent sa posebnim tretmanom. Kada se razrešavaju jedno po jedno, dok je modul u senci, to su jeftine lekcije, a ista otkrića posle prelaska preko noći postaju ispadi u produkciji.

Neka neslaganja pokazuju u suprotnom smeru: greši stari sistem, a posao tu grešku godinama tiho apsorbuje. To su odluke, a ne bagovi: sačuvati staro ponašanje zbog kontinuiteta ili ga ispraviti i reći ljudima kojih se tiče? Oba odgovora mogu biti ispravna, a pogrešno je jedino doneti odluku slučajno, što je uradilo svako prepisivanje koje dva sistema nikada nije pustilo da rade uporedo. Tek na prelasku vlasništvo nad podacima modula menja stranu: novi sistem postaje onaj koji upisuje, a job za usaglašavanje nastavlja da radi još neko vreme, kao alarmna žica.

Kada je pisanje od nule ispravan potez

Poštenje traži i protivargument, jer postepena zamena nije besplatna: fasada, sinhronizacija i paralelni rad koštaju truda koji bi čisto prepisivanje preskočilo. Taj režijski trošak je osiguranje, a osiguranje se ne isplati kupovati za svaku kuću. Ako je sistem dovoljno mali da fokusirana zamena izađe za 2-3 meseca, mašinerija koordinacije može koštati više od rizika koji uklanja. Ako je platforma zaista mrtva, sa okruženjem za izvršavanje za koje se niko ne može zaposliti, hardverom koji se ne može zameniti i proizvođačem koji više ne postoji, možda i nema ničeg stabilnog što bi se davilo. A ako sistem koristi malo ljudi koji mogu da podnesu tvrdo prebacivanje, recimo interni alat jednog tima do kojeg možete prošetati i porazgovarati, paralelni rad je opreznost koju situacija ne traži.

Čak i tada zadržite dve navike iz postepenog pristupa: migrirajte podatke pre roka, a ne na sam rok, i pustite stari i novi sistem da rade uporedo na period provere, ako za to postoji ikakav način. Odluka između pisanja od nule i strangler obrasca određuje koliko će sigurnosni aparat biti veliki, a ne menja to da li se rezultati proveravaju pre nego što se bilo ko na njih osloni.

Politička strana

Modernizacija koja traje godinu dana politički je projekat, kakva god bila arhitektura. Dva sistema koja rade uporedo znače da se plaćaju oba, pa će u nekom trenutku razuman čovek postaviti pitanje kojeg se svaki dug projekat plaši: hoće li se ovo ikada završiti? Najpotcenjenija osobina strangler obrasca je to što odgovor proizvodi sam. Pošto se zamenjuje modul po modul, napredak je prebrojiv: preneti moduli, udeo saobraćaja koji opslužuje novi sistem, incidenti po prelasku. Projekat tako dobija rezultat na tabli umesto procene završenosti koja je godinu dana stajala na osamdeset procenata.

Poverenje održava nedeljni demo nečeg stvarnog: ne slajdovi, nego novi modul za ponude koji pravi ovonedeljne stvarne ponude pored onih iz starog modula, sa razlikama na ekranu. Ljudi koji odlučuju gledaju kako se neslaganja smanjuju iz nedelje u nedelju, a to za poverenje čini više nego ijedan plan. Obaveze namerno ostaju male: nikada ne obećavajte datum kada stari sistem umire, nego obećajte sledeći modul, isporučite ga i ponovite. Tim ritmom vodimo modernizaciju nasleđenih sistema i on je razlika između modernizacije u koju posao veruje i one koju samo trpi.

O starom sistemu se obično govori kao o problemu, a ako se s njim postupa kako treba, on je upravo suprotno: potpuna i živa specifikacija onoga što posao traži, test orakul koji ocenjuje svaki odgovor zamene i rezerva koja svaki korak čini reverzibilnim. Veliko prepisivanje baca sve tri, pa onda propada zato što ih nema. Postepena zamena ih namerno troši, modul po modul, sve do dana kada neko pogleda tabelu rutiranja, vidi da ništa više ne pokazuje na stari sistem i ugasi ga bez ijedne drame. Tako je i trebalo da izgleda.

Da li je sistem koji nosi posao odavno za zamenu?

Kritične sisteme modernizujemo modul po modul, sa starim kao sigurnosnom mrežom. Dijagnostički razgovor je besplatan.