Správa zastaralého kódu

Zastaralý kód: Varování, které stále ignorujete, nakonec všechno zničí

Každý softwarový projekt se nakonec setká se zastaralým kódem, komponentami označenými jako zastaralé, nedoporučovanými nebo naplánovanými k odstranění. @deprecated anotace v Javě, DeprecationWarning V Pythonu, přeškrtnuté znaky v automatickém doplňování vašeho IDE, jsou to všechno signály z kódové základny, že něco, co používáte nebo udržujete, bylo nahrazeno. Ignorování těchto signálů nenápadně hromadí riziko, dokud není odstraněna závislost, bezpečnostní záplata nepřeskočí zastaralé API nebo aktualizace frameworku nenaruší vše, co se stále spoléhalo na to, co bylo před třemi hlavními verzemi zastaralé.

Pochopení toho, co znamená slovo „zastaralé“, proč je důležité a jak s ním systematicky zacházet, je jednou z nejpraktičtějších dovedností údržby, které si může vývojový tým osvojit. Tato příručka pokrývá celý obrázek: jasné definice, srovnání s podobnými termíny, varování před zastaralostí napříč jazyky a strukturovaný přístup ke správě zastaralých závislostí dříve, než se stanou produkčními incidenty.

Zastavte objevování zastaralých verzí v produkčním prostředí

SMART TS XL zobrazuje zastaralé komponenty dříve, než se z nich stanou incidenty.

Více informací

Co je zastaralý kód?

Zastaralý kód označuje funkce, metody, API, knihovny nebo celé komponenty, které jsou stále funkční, ale jejichž používání se oficiálně nedoporučuje. Kód nadále funguje, kompiluje se, spouští a produkuje výsledky, ale jeho správci signalizovali, že bude v budoucí verzi odstraněn, nahrazen lepší alternativou nebo jednoduše již nebude udržován ani aktualizován. Používání zastaralého kódu znamená spoléhat se na něco, o co se lidé, kteří jsou za něj zodpovědní, přestali zajímat.

Zastarávání je komunikační mechanismus, nikoli technický stav. Když správce knihovny označí funkci jako zastaralou, říká: „Toto stále funguje, ale máme v úmyslu to odstranit a měli byste z toho dříve migrovat.“ Doba mezi oznámením o zastarávání a skutečným odstraněním se liší, může se jednat o jednu hlavní verzi nebo o pět let, ale směr je vždy stejný. Zastaralé znamená nakonec odstraněné.

Zastaralé vs. znehodnocené: Zmatek v pravopisu

Tato dvě slova se často zaměňují a kontrola pravopisu nepomáhá, protože obě jsou skutečná anglická slova s ​​různými významy.

Zastaralé (v softwaru): označeno jako zastaralé, nedoporučuje se, plánováno k odstranění. Správný termín pro softwarové kontexty.

Odepisovaný (v účetnictví): jehož hodnota se časem snižovala. Například v textu „hardware serveru se odepisoval během tří let“.

Pokud v technické dokumentaci uvidíte výraz „deprecated code“ (zastaralý kód), téměř vždy to znamená „deprecated code“ (zastaralý kód). Autor použil účetní termín, když měl na mysli softwarový termín. Tato chyba je natolik častá, že se v tomto článku objevuje i v datech Search Console. V softwaru vždy používejte zastaralý kód.

Zastaralý vs. zastaralý vs. starší vs. mrtvý kód

Tyto pojmy spolu souvisejí, ale popisují různé stavy kódu. Jejich záměna vede k nepřesným konverzacím a chybným rozhodnutím o prioritách.

ObdobíCo to znamenáJe to odstraněno?Je to udržované?Úroveň rizika
ZastaraléOficiálně nedoporučeno, označeno k budoucímu odstraněníNe, stále přítomnoNe, údržba byla zastavenaStřední, rostoucí v průběhu času
ZastaralýJiž nerelevantní nebo nepoužitelné; nahrazenoNěkdyNeStředně vysoká
DědictvíStarý kód, který stále funguje a může být stále v produkciNe, stále aktivníZřídkaProměnná, závisí na rychlosti změny
Mrtvý kódNikdy nebylo voláno ani dosaženo během prováděníNe, stále ve zdrojiNení k dispozici, nikdy neběžíNízké až střední riziko migrace/auditu
Zastaralý kódKód, který nebyl dlouho používán, ale není formálně zastaralýNeNejasnýStřední, může skrývat předpoklady

Zastaralé vs. obsolentníZastaralé je formální označení, někdo jej výslovně označil tímto @deprecated nebo vydáno oznámení o zastarání. Zastaralý je volnější deskriptor, kód může stále fungovat, ale vzhledem k moderním alternativám již nemá rozumné využití. Veškerý zastaralý kód je nakonec zastaralý, ale ne veškerý zastaralý kód byl formálně zastaralý.

Zastaralý vs. odstraněný : Zastaralý kód stále existuje v kódové základně. Odstraněný kód je pryč. Období zastarávání je okno mezi těmito dvěma stavy, doba, kterou musíte migrovat, než se váš kód pokazí.

Zastaralý vs. starší kód: Zastaralý kód je starý produkční kód, často stále aktivně používaný a udržovaný, který byl napsán v dřívější technologické éře. Zastaralý kód je konkrétně označen k odstranění. Zastaralé programy v COBOLu, které zpracovávají denní transakce, nejsou zastaralé, jsou starší, ale aktivně udržované. Funkce COBOL API označená dodavatelem knihovny jako zastaralá je zastaralá.

Zastaralé vs. vyřazení z provozu : Zastaralé je technický signál v rámci kódové základny nebo knihovny. Vyřazení z provozu je provozní rozhodnutí, které spočívá v ukončení služby, odstranění infrastruktury nebo ukončení podpory produktu. Zastaralé API může běžet roky; vyřazené API je vypnuto k určitému datu.

Jak vypadá zastaralé: Varování napříč jazyky

Varování před zastaráním mají různé podoby v závislosti na jazyku a nástrojích. Jejich rozpoznání na první pohled je prvním krokem k jejich řešení.

Python: Varování před zastaráním

krajta

import warnings

# Marking a function as deprecated
def old_function():
    warnings.warn(
        "old_function is deprecated, use new_function instead",
        DeprecationWarning,
        stacklevel=2
    )
    # original implementation

def new_function():
    # improved implementation
    pass

Python zobrazuje varování o zastaralosti za běhu. Běžná zpráva kompilátoru:

DeprecationWarning: old_function is deprecated, use new_function instead

Nebo pro balíčky třetích stran:

DeprecationWarning: pkg_resources is deprecated as an API.
Use importlib.resources or importlib.metadata instead.

Java: @Zastaralá anotace

Jáva

public class LegacyProcessor {

    @Deprecated
    public void processData(String input) {
        // old implementation
    }

    // Replacement method
    public void processDataV2(String input, ProcessOptions options) {
        // new implementation
    }
}

Kompilátor Javy vytváří:

Note: SomeFile.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

JavaScript/TypeScript: JSDoc @deprecated

javascript

/**
 * @deprecated Use fetchUserById() instead.
 * This function will be removed in version 4.0.
 */
function getUser(id) {
    // old implementation
}

// Modern replacement
async function fetchUserById(id) {
    // new implementation
}

strojopis

class ApiClient {
    /** @deprecated Use post() with typed options instead */
    sendRequest(url: string): Promise<any> {
        // deprecated implementation
    }
}

Zobrazení IDE getUser s přeškrtnutím všude, kde je voláno, a TypeScript @typescript-eslint/no-deprecated Pravidlo to označí v CI.

C++: Atribut [[zastaralé]]

cpp

// C++14 and later
[[deprecated("Use processV2() instead")]]
void process(int value) {
    // old implementation
}

void processV2(int value, ProcessFlags flags = ProcessFlags::Default) {
    // new implementation
}

Kompilátory vytvářejí:

warning: 'process' is deprecated: Use processV2() instead [-Wdeprecated-declarations]

Swift: @available se zastaralým

SWIFT

@available(*, deprecated, renamed: "fetchUser(withID:)")
func getUser(id: String) -> User {
    // old implementation
}

func fetchUser(withID id: String) -> User {
    // replacement
}

Kotlin/Java: @Zastaralé s ReplaceWith

kotlin

@Deprecated(
    message = "Use processItems() instead",
    replaceWith = ReplaceWith("processItems(items)"),
    level = DeprecationLevel.WARNING
)
fun handleItems(items: List<Item>) {
    // deprecated
}

fun processItems(items: List<Item>) {
    // replacement
}

Proč zastaralý kód způsobuje skutečné problémy

Zastaralý kód není jen úklidový problém. Vytváří konkrétní, hromadící se riziko ve čtyřech rozměrech:

Bezpečnostní zranitelnosti. Zastaralá API a knihovny již nedostávají bezpečnostní záplaty. Zastaralá knihovna s neopravenou chybou CVE představuje trvalou zranitelnost, jejíž správci přestali s její opravou, protože chtějí, aby všichni od ní odešli. Organizace, které používají zastaralé komponenty, používají kód se známou zranitelností z vlastní vůle.

Přerušení závislostí při upgradech. Oznámení o zastarání existuje konkrétně proto, že se blíží odstranění. Když dorazí hlavní aktualizace a odstraní zastaralé API, každý systém, který se na něm stále spoléhá, ​​se současně porouchá, v nejhorším možném okamžiku, během upgradu, který měl být rutinní.

Zvýšená složitost údržby. Zastaralý kód vyžaduje, aby vývojáři drželi dva mentální modely současně: co dělá starý kód a co dělá jeho nový ekvivalent. Každý nový člen týmu se musí naučit, kterým částem kódové základny se vyhnout a proč. Tato dvojí složitost se hromadí s každou další zastaralou komponentou.

Skládání technického dluhu. Každá zastaralá závislost je jednotkou technického dluhu. Na rozdíl od jiných dluhů má dluh zastaralého kódu termín, převede se z „varování“ na „porušené“ v okamžiku, kdy je zastaralá komponenta skutečně odstraněna.

Jak zvládat zastaralé závislosti v softwarovém projektu

Krok 1: Inventarizace všech zastaralých verzí

Spusťte systematické skenování, místo abyste postupně vyhledávali zastaralé komponenty. Většina nástrojů nabízí způsoby, jak zobrazit kompletní inventář:

praštit

# Python: find all DeprecationWarning instances
python -W error::DeprecationWarning -m pytest

# JavaScript/Node.js: run with deprecation tracing
node --trace-deprecation app.js

# Java: compile with full deprecation details
javac -Xlint:deprecation *.java

# npm: find deprecated packages
npm outdated
npm audit

Krok 2: Klasifikace podle rizika

Ne všechna zastarání vyžadují okamžitý zásah. Zařaďte každé z nich:

PrioritaKritériaAkce
kritickýZastaralá knihovna kritická z hlediska bezpečnosti; známé CVE; odstranění v další hlavní verziOkamžitě migrovat
VysokýZastaralé v aktuální hlavní verzi; aktivní varování v CIPlán pro aktuální sprint nebo další
StředníZastaralé, ale stále podporováno pro 2 a více hlavních verzí; žádné bezpečnostní riziko.Přidat do nevyřízených záležitostí s časovou osou
NízkéZastaralá anotace v interním kódu s nízkou mírou změnSledování, adresa během souvisejícího refaktoringu

Krok 3: Před migrací vyhledejte všechna použití

Před změnou zastaralé komponenty identifikujte všechna místa, kde se používá. Její změna bez kompletní mapy riskuje, že se ztratí použití, která se tiše přeruší:

krajta

# Using grep for basic search
grep -r "old_function" src/

# Using ast-grep for code-aware search (TypeScript/JS)
ast-grep --pattern 'getUser($ID)' --lang ts

# Using ripgrep with file type filtering
rg "deprecated_method" --type java

U rozsáhlých kódových základen vytvářejí automatizované nástroje pro statickou analýzu kompletní mapu křížových odkazů přesněji než ruční grep, zejména pro nepřímé použití prostřednictvím dynamického odesílání nebo dědičnosti.

Krok 4: Systematická migrace

Postupně nahraďte zastaralé způsoby použití a před přechodem k dalšímu je ověřte:

krajta

# Before: deprecated
import imp
module = imp.load_source('mymodule', '/path/to/mymodule.py')

# After: replacement
import importlib.util
spec = importlib.util.spec_from_file_location('mymodule', '/path/to/mymodule.py')
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)

javascript

// Before: deprecated event property
document.addEventListener('keydown', (event) => {
    const key = event.keyCode;  // deprecated
});

// After: modern replacement
document.addEventListener('keydown', (event) => {
    const key = event.key;   // current standard
});

Krok 5: Přidání bran pro zastarávání do CI/CD

Zabraňte vstupu nových zastaralých použití do kódové základny po vyčištění:

yaml

# .github/workflows/deprecation-check.yml
- name: Check for deprecated API usage (Java)
  run: javac -Xlint:deprecation -Werror src/**/*.java

- name: Check for deprecated packages (Node)
  run: npm audit --audit-level=moderate

- name: ESLint no-deprecated rule (TypeScript)
  run: npx eslint --rule '{"@typescript-eslint/no-deprecated": "error"}' src/

Stanovení zásad pro odpisování

Organizace, které dobře zvládají zastarávání, k němu přistupují jako k otázce zásad, nikoli pouze k technické. Zásady pro zastarávání definují:

Kdo může zastarat. Jeden vývojář by neměl jednostranně zastarat široce používané interní API bez posouzení týmem. Rozhodnutí o zastarání by se měla týkat vlastníků komponent, které je používají.

Jak dlouho trvá období zastarávání. Přiměřená výchozí hodnota: jeden cyklus oznámení o hlavní verzi před odstraněním. Pro veřejná API dvě hlavní verze. Pro interní API jeden cyklus vydání.

Jak jsou sdělovány informace o zastaralých verzích. Anotace v kódu, záznamy v protokolu změn a přímé oznámení známým uživatelům. Oznámení o zastaralých verzích, které existuje pouze v komentáři v kódu, bude přehlédnuto.

Co se rozumí „odstraněno“. Je kód smazán? Přesunut do samostatného volitelného balíčku? Skrytý za příznakem funkce? Jasně definujte konečný stav.

Jak je zdokumentována migrační cesta. Každá anotace o zastarání by měla obsahovat odkaz na nahrazení. @deprecated Use fetchUserById() instead je užitečnější než @deprecated.

Funguje stále zastaralý kód?

Ano, dokud se tak nestane. Zastaralý kód běží normálně až do verze, ze které je skutečně odstraněn. Toto je nejnebezpečnější vlastnost zastaralého kódu: vytváří falešný pocit bezpečí. Systémy, které běží na zastaralých API po celá léta, se mohou jevit stabilní, zatímco riziko náhlého přerušení roste s každým cyklem vydání.

Odpověď na otázku „je bezpečné spouštět zastaralý kód?“ zní: záleží na tom, jak blízko je datum odstranění a jaké je bezpečnostní nastavení zastaralé komponenty. Funkce zastaralá v menší verzi aktivně udržované knihovny bez známých CVE nese nízké bezprostřední riziko. Zastaralá autentizační knihovna s neopravenou zranitelností a oznámeným datem ukončení životnosti nese vysoké bezprostřední riziko.

Jak SMART TS XL Identifikuje zastaralý kód napříč podnikovými systémy

V jednom jazyce je nalezení zastaralého kódu otázkou spuštění správného příznaku kompilátoru nebo pravidla lint. V podnikovém prostředí, které zahrnuje COBOL, JCL, Javu, Python a moderní služby, je třeba zastaralé komponenty každého jazyka najít současně a vztahy mezi nimi jsou stejně důležité jako samotné zastaralé kódy.

SMART TS XLJe statická analýza kódu prohledává všechny jazyky v prostředí a zároveň v celé kódové základně vyhledává zastaralé anotace, zastaralé způsoby použití API a nefunkční vzory kódu. Když je COBOL copybook označen jako zastaralý, SMART TS XL identifikuje každý program, který ji obsahuje. Když je metoda Java API zastaralá, sleduje každé místo volání napříč každou službou v portfoliu.

Funkce analýzy dopadů jde ještě o krok dále: před odstraněním jakékoli zastaralé komponenty vygeneruje kompletní rozsah toho, co toto odstranění ovlivní, které programy, které streamy úloh, které navazující služby, napříč každým jazykem. Tím se riskantní otázka „co se pokazí?“ převede na strukturovaný, vyjmenovaný seznam všeho, co je třeba před odstraněním ověřit.

Díky podpůrnému vyhledávání je možné dotazovat inventář: najít každé použití konkrétní zastaralé funkce, každý odkaz na zastaralý sešit, každé volání zastaralého API, a to během několika sekund, napříč miliony řádků kódu v různých jazycích. U starších modernizačních programů, kde je inventář zastaralých komponent výchozím bodem pro určení rozsahu migrace, tato vyhledávací funkce nahrazuje týdny manuálního auditu cíleným dotazem.