Predstavte si situáciu, ktorú pozná veľa rastúcich firiem: váš e-shop, ERP systém alebo klientsky portál beží na starom, nezdokumentovanom kóde v PHP. Vývojári, ktorí ho pred piatimi rokmi napísali, sú už dávno preč. Súčasný tím sa bojí v kóde urobiť akúkoľvek zmenu, pretože úprava na jednom mieste neočakávane znefunkční tri iné moduly na opačnom konci systému.
Každá požiadavka na novú funkciu zo strany marketingu či obchodu trvá týždne namiesto dní a sprevádzajú ju nekončiace hotfixy. Frustrácia stúpa na oboch stranách: manažment nevidí pokrok a technické oddelenie čelí neustálemu tlaku.
Toto je klasický prejav technologického dlhu (Technical Debt). Podobne ako finančný dlh, aj ten technologický si pýta úroky. V tomto prípade sú nimi pomalšie inovácie, vyššia chybovosť, odchod frustrovaných vývojárov a priame straty tržieb.
V technologickom štúdiu nolimeo pomáhame slovenským stredným a väčším firmám tento dlh dostať pod kontrolu. V tomto článku sa pozrieme na to, ako cez technický audit kvantifikovať riziká v starom softvéri a ako sa pragmaticky rozhodnúť medzi postupným refaktoringom a prepísaním systému od nuly (rewrite).
1. Strangler Fig Pattern: Postupná evolúcia namiesto revolúcie
Najväčšou chybou pri riešení starého softvéru je pokus o okamžité a kompletné prepísanie celého systému za behu. Takéto projekty sa často končia zle: trvajú dlhšie, stoja viac, a keď sa po mesiacoch alebo rokoch konečne spustia, trh sa už posunul inam a pôvodné špecifikácie sú zastarané.
V nolimeu často používame architektonický koncept známy ako Strangler Fig Pattern. Namiesto rizikového odstrihnutia starého systému okolo neho vybudujeme novú headless infraštruktúru a postupne, modul po module, presúvame biznis logiku do nového kódu.
1. POČIATOČNÝ STAV 2. PRECHODNÝ STAV 3. CIEĽOVÝ STAV
┌──────────────────┐
│ Reverzný Proxy │
└──────────────────┘
/ \
/ \
┌──────────────────┐ ┌───────────────┐ ┌───────────────┐ ┌──────────────────┐
│ │ │ Nový Modul │ │ Starý Monolit │ │ │
│ Starý Monolit │ │ (Next.js API)│ │ (Legacy PHP) │ │ Nový Headless │
│ (Legacy PHP) │ └───────────────┘ └───────────────┘ │ Systém (Next.js)│
│ │ │ │ │ │
└──────────────────┘ ▼ ▼ └──────────────────┘
┌──────────────────────────────────┐
│ Spoločná Databáza │
└──────────────────────────────────┘
Ako prebieha Strangler Pattern v praxi?
- Zavedenie proxy brány: Pred starý monolit predsadíme inteligentný reverzný proxy server alebo Next.js API router.
- Migrácia najdôležitejšieho modulu: Identifikujeme najkritickejšiu časť (napríklad vyhľadávanie produktov alebo registráciu zákazníkov). Tento modul vyvinieme nanovo v modernom a type-safe prostredí (napr. Next.js a Medusa.js).
- Smerovanie požiadaviek: Proxy server automaticky začne požiadavky na vyhľadávanie smerovať do nového systému, zatiaľ čo zvyšok webu (objednávky, fakturácia) stále obsluhuje staré PHP.
- Postupné odstavovanie: Krok za krokom migrujeme ďalšie moduly, až kým starý monolit postupne nestratí svoju funkciu a nenahradí ho nová architektúra.
2. Technická implementácia Strangler API Routera v Next.js
Pre realizáciu tohto vzoru v Next.js môžeme použiť dynamickú catch-all API route, ktorá funguje ako inteligentná výhybka. Staré API endpointy deleguje na legacy server, zatiaľ čo refaktorované a optimalizované požiadavky obsluhuje nová microservice.
Nižšie je zjednodušená ukážka TypeScript kódu, ktorý asynchrónne filtruje a smeruje požiadavky podľa zoznamu migrovaných ciest:
// src/app/api/[[...path]]/route.ts
import { NextRequest, NextResponse } from "next/server";
const LEGACY_BACKEND_URL = process.env.LEGACY_BACKEND_URL || "https://legacy-monolith.firma.sk";
const NEW_API_URL = process.env.NEW_API_URL || "https://api-v2.firma.sk";
// Zoznam API ciest, ktoré už obsluhuje nový modul
const MIGRATED_PATHS = [
"/api/v1/products/search",
"/api/v1/cart/add",
"/api/v1/checkout/validate-vat"
];
/**
* Inteligentný asynchrónny router pre smerovanie požiadaviek (Strangler Pattern)
*/
export async function GET(req: NextRequest, { params }: { params: { path?: string[] } }) {
const path = "/" + (params.path?.join("/") || "");
const searchParams = req.nextUrl.search;
// Vyhodnotenie, či daná cesta patrí pod nový refaktorovaný modul
const isMigrated = MIGRATED_PATHS.some(migratedPath => path.startsWith(migratedPath));
const targetBaseUrl = isMigrated ? NEW_API_URL : LEGACY_BACKEND_URL;
const targetUrl = `${targetBaseUrl}${path}${searchParams}`;
try {
const headers = new Headers(req.headers);
// Nastavíme X-Forwarded-Host pre korektné vyhodnotenie pôvodnej domény na cieľovom serveri
headers.set("X-Forwarded-Host", req.headers.get("host") || "");
const response = await fetch(targetUrl, {
method: "GET",
headers: headers,
});
const data = await response.text();
return new NextResponse(data, {
status: response.status,
headers: response.headers,
});
} catch (error: any) {
console.error(`Smerovacia chyba pre ${path}:`, error.message);
return NextResponse.json(
{ error: "Smerovacia brána dočasne zlyhala", detail: error.message },
{ status: 502 }
);
}
}
Prečo je toto riešenie praktické?
- Bez prerušenia prevádzky: Používateľ a Google roboty vidia rovnakú doménu a rovnaké API cesty, no v pozadí sa postupne menia jednotlivé časti systému.
- Rýchlejší rollback: Ak by nový prepísaný endpoint zlyhal, na smerovači ho vieme dočasne vyradiť z poľa
MIGRATED_PATHSa prevádzku presmerovať späť na staré PHP.
3. Rozhodovacia matica: Refaktoring vs. kompletný prepis od nuly
Ako CTO alebo majiteľ firmy musíte robiť rozhodnutia na základe tvrdých dát, nie pocitov. Tu je naša pragmatická rozhodovacia matica pre posúdenie stavu softvéru:
| Kritérium | Kedy zvoliť refaktoring (Strangler evolúciu) | Kedy sa oplatí kompletný prepis (rewrite) |
|---|---|---|
| Architektúra jadra | Kód je síce chaotický, ale databázový model a štruktúra dát sú relatívne správne. | Databáza je tak zle navrhnutá, že každá snaha o zmenu vyžaduje komplikované obchádzky. |
| Jazyk a framework | Používa sa verzia jazyka a frameworku, na ktorú stále vychádzajú bezpečnostné záplaty. | Používa sa nepodporovaný framework alebo verzia PHP staršia ako 7.4 bez podpory. |
| Dostupnosť dokumentácie | Existuje aspoň čiastočná predstava o biznis logike a integračných bodoch. | Nikto vo firme nevie, ako presne sa počítajú ceny, a kód nemá žiadne testy ani dokumentáciu. |
| Čas a rozpočet | Potrebujete priebežne prinášať hodnotu a nemôžete si dovoliť stopnúť vývoj nových funkcií. | Firma má vyčlenené zdroje na paralelný tím a dokáže akceptovať niekoľko mesiacov bez nových marketingových funkcií. |
4. Ako technický audit od nolimea chráni vaše investície
Rozhodnutie o budúcnosti firemného softvéru by ste nemali robiť naslepo. Preto v nolimeu začíname spoluprácu technickým auditom softvérového zdravia.
Senior vývojári prejdú váš repozitár a zanalyzujú ho v štyroch rozmeroch:
- Analýza statického kódu (Static Code Analysis): Pomocou špecializovaných nástrojov zmeriame kognitívnu zložitosť kódu, duplicitu a úroveň pokrytia testami.
- Bezpečnostný audit (Security Hygiene): Odhalíme známe zraniteľnosti v knižniciach (CVE) a skryté riziká prenosu dát.
- Výkonnostné úzke hrdlá (Performance Bottlenecks): Odhalíme neoptimalizované databázové dopyty (
N+1 query problem), ktoré spomaľujú odozvu servera. - Biznisový rizikový profil: Pripravíme prehľadný dokument pre manažment, ktorý preloží technické problémy (napr. chýbajúce typovanie) do reálnych biznisových dôsledkov, napríklad vyšších nákladov na údržbu a pomalšieho nasadzovania zmien.
Výsledkom auditu nie je stostranová teoretická správa, ktorú nikto neprečíta. Získate konkrétny akčný plán s odhadom rozpočtu a časovým harmonogramom, ktorý ukáže, kde začať refaktoring a ako prejsť na modernú, udržateľnú headless architektúru bez zbytočného hazardovania so stabilitou firmy.
Záver: Prestaňte platiť úroky z technologického dlhu
Technologický dlh je tichý zabijak konkurencieschopnosti. Kým trávite mesiace opravovaním starých chýb a lepením záplat na nefunkčný monolit, konkurenti s modernejšími headless systémami vedia nasadzovať nové kampane rýchlejšie a lepšie kontrolovať výkon webu.
V technologickom štúdiu nolimeo nerobíme lacné šablónové weby. Sme seniorné boutique štúdio, kde klienti komunikujú priamo s ľuďmi, ktorí systém navrhujú a vyvíjajú. Staviame robustný softvér s čistým, udržateľným kódom, ktorý firme dáva priestor rásť bez toho, aby ju starý systém držal pod krkom.
Chcete zistiť, či sa váš systém oplatí refaktorovať alebo prepísať? Napíšte nám a prejdeme si stav kódu, riziká aj rozumný plán modernizácie.
