Legacy — nem csupán régi kód. Ez egy működő rendszer, amely pénzt hoz a vállalkozásnak, de lassítja a fejlődést. A mobilalkalmazás-fejlesztésben a legacy lehet Objective-C-ben írva, elavult könyvtárakat vagy architekturális mintákat használ. A CAST Software (2024) jelentése szerint a kódsorok átlagos életkora az enterprise projektekben meghaladja a 14 évet. A legacy-vel való munka stratégiája határozza meg, hogy az fék lesz-e vagy irányítható eszköz marad.
Főbb pontok
Legacy — kód vagy rendszer, amely továbbra is élesben működik, de már nem felel meg a modern minőségi szabványoknak. A legacy lehet elavult nyelven írva (pl. Objective-C a Swift helyett), nem támogatott könyvtárakat vagy olyan architekturális mintákat használ, amelyeket régóta antimintáknak tekintenek.
A legacy legfőbb jellemzője a tesztek hiánya. Michael Feathers (2004) meghatározása szerint a legacy kód kód tesztek nélkül. Ha a viselkedés nem változtatható meg biztonságosan, a rendszer korától függetlenül legacy státuszban van. Friss kód egységtesztek nélkül — az első naptól legacy.
A legacy nem feltétlenül rossz. Egy jól megtervezett Java 8 rendszer megbízhatóbb és érthetőbb lehet, mint egy kaotikus Kotlin kód coroutine-okkal. A kód kora nem minőségi mutató — az a fontos, mennyire alkalmas a rendszer változtatásokra és bővítésre.
Minden sikeres rendszer idővel legacy-vé válik. Ez természetes folyamat: a technológiák gyorsabban fejlődnek, mint ahogy a kód újraírható. Az 5 éve Swift 2-ben írt alkalmazás ma legacy, bár a létrehozásakor modern volt.
A legacy üzleti értékét gyakran alábecsülik. A rendszer stabilan működik, tranzakciókat dolgoz fel, adatokat tárol — az újraírás kockázatokkal jár. A Standish Group (2024) szerint a teljes újraírási projektek 35%-a kudarccal végződik. Gazdaságilag nem a legacy-től való megszabadulás indokolt, hanem a vele való munkamegtanulás.
A legjobb stratégiák — fokozatos migráció, a régi kód új interfészek mögé való elrejtése és automatizált tesztelés. A legacy csak akkor válik problémává, amikor már nem változtatható kiszámítható költséggel.
Automatizált tesztek hiánya — a fő mutató. Ha egy kódsor megváltoztatása után a fejlesztő nem tudja futtatni a teszteket és meggyőződni arról, hogy semmi nem romlott el — legacy-val van dolga. További jel: a telepítési eljárás órákig tart és manuális műveleteket igényel.
A dokumentáció nem egyezik a kóddal — egy másik jelző. Az architekturális diagramok elavultak, a kommentek olyan viselkedést írnak le, amely már megváltozott. Time-to-ramp-up egy új fejlesztő számára meghaladja az egy hónapot — a rendszer magas komplexitásának és alacsony karbantarthatóságának jele.
További jelek: monolitikus architektúra egyértelmű határok nélkül, manuális tesztelés mint fő ellenőrzési módszer, hosszú CI pipeline (több mint 30 perc), aktuális verzió nélküli könyvtárak használata és a függőségek frissítésének képtelensége a szomszédos modulok törése nélkül.
„Törékeny kód” jelenség — egy helyen történő változtatás három másikat tönkretesz. Ez a szoros kapcsolódás (tight coupling) következménye, amikor a modulok túl sokat tudnak egymásról. Minél magasabb a coupling, annál gyorsabban kerül át a rendszer a legacy kategóriába.
Sebesség csökkenése — a fő kockázat. Egy egyszerű funkció hozzáadása a kód tanulmányozásához órákat, a teszteléshez napokat igényel. A Stripe (2024) szerint a fejlesztők idejük 33%-át technikai adósság leküzdésére fordítják, amely közvetlenül kapcsolódik a legacy modulok jelenlétéhez a projektben.
Szakértelem elvesztése — az eredeti kód szerzői elhagyják a céget, a dokumentáció pedig hiányos. Az új fejlesztők félnek hozzányúlni az érthetetlen modulokhoz, ami a „befagyott kód” hatásához vezet: a modul nem fejlődik, de tovább működik. Az ilyen rendszerek Bus faktora kritikusan alacsony.
Biztonság — az elavult könyvtárak ismert sebezhetőségeket tartalmaznak. Az OpenSSL 1.0.2 vagy a Jackson elavult verzióinak használata Java projektekben közvetlen út a biztonsági incidensekhez, amelyek a vállalkozást a hírnévbe és ügyfelekbe kerülhetnek.
Csapat demotiválódása — a legacy-vel való munka javítási stratégia nélkül csökkenti a fejlesztők elégedettségét. A csapat már nem büszke a termékre, a fluktuáció nő, ami tovább lassítja a rendszer fejlődését.
Jellemző tesztek — az első lépés bármilyen legacy kód változtatás előtt. Futtasd a kódot ismert bemeneti adatokon és rögzítsd a várt kimenetet. Ezek a tesztek specifikációként rögzítik a jelenlegi viselkedést. Golden master testing — variáns, ahol a kimeneti adatokat egy referenciához hasonlítják.
Seam analízis – olyan pontok keresése, ahol a kapcsolódás megszakítható a viselkedés megváltoztatása nélkül. Michael Feathers több seam típust különböztet meg: preprocessor seam, object seam, link seam. Object seam — a leggyakoribb: valós objektum lecserélése teszt-stubra egy interfészen keresztül.
Sprout method és Sprout class — technikák új kód hozzáadására a régi mellett, nem pedig benne. A meglévő metódus módosítása helyett hozz létre egy új metódust a szükséges logikával és hívd meg a régiből. Ez minimalizálja a működő kód eltörésének kockázatát.
class LegacyPaymentProcessor {
def process(payment) {
// 200 sor legacy kód, amihez nem szabad nyúlni
logPayment(payment) // sprout method
}
def logPayment(payment) {
// új kód hozzáadva a legacy mellé
}
}
Strangler Fig minta — ajánlott megközelítés a legacy migrációhoz. Az új modul párhuzamosan készül, a forgalom fokozatosan kerül át a régiről az újra. A régi modul természetesen „meghal”, amikor már nem kap kéréseket. A minta minimalizálja a kockázatokat és lehetővé teszi a visszaállást problémák esetén.
Branch by Abstraction — technika, ahol absztrakció jön létre a régi és új implementáció felett. A klienskód átvált az absztrakcióra, a régi implementáció fokozatosan újra cserélődik. Példa: a hálózati réteg cseréje AFNetworking-ről Alamofire-re egy egységes NetworkService protokollon keresztül.
Fokozatos migráció — az átmenet kis lépésekre bontása: régi modul elrejtése → tesztek írása → új modul létrehozása → párhuzamos futtatás → régi modul eltávolítása. Minden lépés a rendszer stabil állapotával zárul, lehetővé téve a változtatások telepítését bármikor.
Gyakran Ismételt Kérdések
A teljes újraírás a legkockázatosabb lehetőség. A Big Rewrite projektek csak 25%-a fejeződik be sikeresen határidőre. Jobb a Strangler Fig mintát alkalmazni: cseréld ki a modulokat fokozatosan, a termék leállítása nélkül. Minden iteráció üzleti értéket hoz, a kockázatok pedig időben eloszlanak.
Kezdd jellemző tesztekkel: futtasd a modult ismert adatokon, rögzítsd az eredményt. Golden master testing — egyszerű mód a viselkedés rögzítésére. Adj hozzá teszteket minden alkalommal, amikor kódsorhoz nyúlsz. 6 hónap múlva egy olyan vázad lesz, amely véd a regressziók ellen.
Ha a rendszer stabil, nem igényel gyakori változtatásokat és nem befolyásolja más modulok fejlesztési sebességét — hagyd békén. „If it ain’t broken, don’t fix it” — ésszerű megközelítés elszigetelt legacy modulokhoz alacsony változtatási gyakorisággal. Csak akkor nyúlj a kódhoz, ha üzleti változtatásokra van szükség.
Használj szemantikus verziókezelést és lépésenként frissíts: patch → minor → major. Minden könyvtárhoz írj kompatibilitási teszteket. A Dependabot vagy Renovate automatizálja a PR-ek létrehozását a frissítésekhez. Ha a könyvtár deprecated — tervezd meg a cserét absztrakción keresztül.
Technikai adósság — metafora a halasztott fejlesztések költségének becslésére. Legacy — konkrét rendszer vagy kód, amely már elavult. A technikai adósság egy hónap alatt felhalmozódhat, a legacy időt igényel. Nem minden technikai adósság válik legacy-vé, de minden legacy tartalmaz technikai adósságot.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is