Graf závislostí (dependency graph) mapuje vzťahy medzi časťami softvérového systému. Jeho uzly predstavujú komponenty ako moduly, služby, balíčky alebo databázy. Spojenia ukazujú, ktoré komponenty volajú, importujú, čítajú alebo inak závisia jeden od druhého. V legacy systéme táto mapa zviditeľní skryté cesty zmien ešte pred začiatkom refactoringu.
Čo graf odhalí
Závislosti existujú na viacerých úrovniach. Zdrojové súbory importujú iné súbory. Moduly volajú zdieľané knižnice. Služby si vymieňajú dáta cez API alebo fronty. Aplikácie závisia aj od databáz, plánovaných úloh a externých systémov. Použiteľný graf jasne hovorí, čo predstavuje každý uzol a aký typ vzťahu zachytáva každé spojenie.
Záleží na smere. Ak modul A volá modul B, zmena v B môže ovplyvniť A aj vtedy, keď sa samotného A nikto nedotkol. Graf dokáže odhaliť aj cykly, kde dva komponenty závisia jeden od druhého a nedajú sa meniť ani nasadzovať nezávisle.
| Signál v grafe | Čo môže znamenať | Čo overiť |
|---|---|---|
| Veľa prichádzajúcich spojení | Široko používaný komponent | Kompatibilitu pri zmene rozhrania |
| Veľa odchádzajúcich spojení | Komponent závislý od mnohých iných | Cesty pri zlyhaní a pri upgrade |
| Cyklus závislostí | Komponenty sa nedajú ľahko izolovať | Rozhodnutia o hraniciach a vlastníctve |
| Nepripojený uzol | Nepoužívaný alebo samostatne prevádzkovaný kód | Reálne použitie za behu pred odstránením |
Prečo legacy systémy potrebujú mapu
Staršie codebase často obsahujú vzťahy, ktoré v aktuálnej dokumentácii chýbajú. Zdieľaná databázová tabuľka dokáže prepojiť inak oddelené moduly. Plánovaný proces dodáva dáta, ktorých existenciu aplikácia jednoducho predpokladá. Knižnica zostáva zamknutá na starej verzii, pretože viaceré komponenty sa spoliehajú na správanie, ktoré sa v novších verziách zmenilo.
Audit legacy codebase porovnáva graf s konfiguráciou za behu, so súbormi pre nasadenie a so samotným kódom. Vďaka tomu sa diagram nepovažuje za úplný vtedy, keď dynamické volania alebo prevádzkové závislosti stoja mimo neho.
Ako graf formuje migračný plán
Graf podporuje analýzu dopadov: stopuje, čoho sa môže dotknúť presun, zmena alebo zánik komponentu. Pomáha aj určiť poradie migrácie. Komponenty na okraji grafu sa zvyčajne izolujú ľahšie. Centrálne komponenty väčšinou potrebujú stabilné rozhrania skôr, než sa dá pohnúť závislým kódom.
Migračný plán zvyčajne využíva graf takto:
- Nájsť hranice. Zoskupiť kód a dáta, ktoré sa menia spoločne.
- Zoradiť prácu. Presúvať komponenty bez toho, aby sa rozbili ich konzumenti.
- Nájsť zdieľané služby. Identifikovať kód, ktorý pred oddelením potrebuje rozhranie.
- Naplánovať overenie. Zamerať testy na spojenia, cez ktoré zmena prechádza.
Ako graf súvisí s ostatnými dôkazmi auditu
Graf závislostí opisuje štruktúru, nie kvalitu. Nehovorí, či je komponent správny, dobre otestovaný alebo často menený. Na tieto otázky treba výsledky testov, históriu zmien a priame code review.
V spojení s technickým dlhom graf ukáže, kde sa prekrýva štrukturálna závislosť s cenou opravy. Zároveň poskytuje použiteľnú mapu pri preberaní a migrácii neznámej codebase, pretože tím dokáže vystopovať zmenu ďalej než len po súbor, v ktorom začína.