Daljnji razvoj starog sustava bivao je sve teži.
Aplikacija je radila na .NET Frameworku, njezini su se dijelovi povezivali preko WCF-a, a velik dio poslovne logike nalazio se u pohranjenim procedurama baze podataka. Zbog toga je bilo teško pratiti koje dijelove sustava neka izmjena zahvaća, a daljnji razvoj zahtijevao je mnogo usklađivanja i opreza.
Trebalo je rješenje uz koje se svakodnevni rad mogao nastaviti, dok sustav postupno postaje lakši za održavanje i proširivanje.
Arhitekturu smo mijenjali korak po korak.
Isplanirali smo smjer modernizacije, a važne tehničke odluke dokumentirali smo i uskladili s klijentom. Novi moduli postupno su preuzimali zadatke starog koda, pa tijekom preoblikovanja nije trebalo odjednom zamijeniti cijelu aplikaciju.
Izgradili smo više modularnih monolita s kodom organiziranim prema načelima Clean Architecture i s jasno razdvojenim odgovornostima. Komunikaciju između modula organizirali smo preko medijatora kako bi njihov rad bio pregledniji, a daljnji razvoj lakši za vođenje.
Testiranje smo učinili dijelom razvojnog procesa.
U razvojni proces uveli smo okvir za testiranje koji je pokrivao cijelu piramidu testiranja. Rad sustava provjeravali smo na više razina, od jediničnih testova preko integracijskih do testova koji provjeravaju cijele procese.
Tako je testiranje pratilo i modernizaciju i razvoj novih funkcija. Provjere su pomagale u otkrivanju pogrešaka i u procjeni je li postojeće ponašanje uz izmjene ostalo ispravno.
Razvili smo module za višekratnu upotrebu.
Upravljanje ovlastima izradili smo kao samostalan modul za višekratnu upotrebu, koji je kasnije uveden i u tri druga proizvoda tadašnjeg naručitelja. Učitavanje podataka za modul izvješćivanja ostvarili smo pomoću Azure Data Factoryja.
Na ta dva modula razvili smo i novi proizvod. Tako su se rješenja nastala tijekom modernizacije mogla iskoristiti i izvan postojeće platforme.
Automatizirali smo obradu podataka iz dokumenata.
Izradili smo zasebnu Azure Functions uslugu koja je pomoću Azure OpenAI-ja izdvajala strukturirane podatke iz učitanih dokumenata i prosljeđivala ih u bazu podataka. Time smo obradu dokumenata povezali s procesom upravljanja podacima na platformi.
Razvojni rad podržali smo i AI alatima.
U svakodnevnom razvoju koristili smo GitHub Copilot i Claude. Osim toga, izradili smo vlastiti MCP poslužitelj koji je agentima za kodiranje pomagao pronaći dijelove koda i informacije o projektu potrebne za zadatak.
Te smo alate uklopili u rad tima, uz tehničko projektiranje, razvoj i testiranje.
Modernizacija je postavila temelje i za daljnji razvoj.
Od stare aplikacije postupno smo izgradili modularnu platformu koja se može proširivati korak po korak. Moduli za višekratnu upotrebu podržali su razvoj daljnjih proizvoda, a ugrađeni okvir za testiranje pomagao je provjeravati rad sustava na više razina.
Iskustvo stečeno u tom zajedničkom radu prenosimo i u projekte tvrtke operandor: razumijevanje postojećeg sustava, postupno preoblikovanje i razvoj koji se može provjeriti.