Slovník pojmů
Algoritmus
Algoritmus je postup řešení problému, nikoli automaticky konkrétní funkce nebo řádky PHP či JavaScriptu. Stejný postup lze implementovat různě podle jazyka a okolností systému.
Stručná definice
Vstup, kroky a výstup s jasným koncem.
Algoritmus popisuje, jak se ze vstupních dat stane výsledek: může obsahovat posloupnost kroků, rozhodování pomocí podmínek a opakování v cyklech. Aby byl použitelný, musí mít vymezený vstup, očekávaný výstup a ukončení.
Deterministický algoritmus pro stejný vstup vrací stejný výsledek. Randomizovaný postup pracuje s náhodným vstupem; nedeterministický algoritmus je navíc teoretický model s více možnými dalšími kroky. Ani jedna vlastnost není chyba, pokud je součástí zadání a testování.
Jaký problém řeší
Mění obecné zadání na kontrolovatelný postup.
Algoritmus pomáhá rozdělit problém na kroky dřív, než tým rozhodne o konkrétním jazyce, třídě nebo databázovém dotazu.
- výpočet ceny objednávky z položek, slevy a dopravy
- validace vstupu a volba dalšího stavu objednávky
- řazení, filtrování nebo zpracování dávky dat
- popsání opakovatelného postupu pro testy a code review
Praktický příklad
Výpočet ceny objednávky
Pseudokód popisuje postup, ne konkrétní implementaci. Skutečná aplikace navíc určí měnu, daně, zaokrouhlení, kombinování slev a okamžik přidání dopravy.
Tento algoritmus může být uvnitř funkce v PHP nebo JavaScriptu. Funkce je pojmenovaná hranice v programu; algoritmus je postup, který může provádět.
Pseudokód
total = 0
pro každou položku: total += položka.cena * položka.množství
pokud total >= hranice_slevy: total -= sleva
total += doprava
vrať total
Jak funguje
Od položek k celkové ceně
Jde o záměrně malý model; produkční pravidla potřebují přesné okrajové případy.
- Vstup Položky, množství, pravidlo slevy a doprava.
- Průchod Sečte řádkové ceny všech položek.
- Rozhodnutí Podle hranice aplikuje nebo přeskočí slevu.
- Výstup Vrátí výslednou cenu pro další část aplikace.
Hlavní části a varianty
Správnost a náklady jsou různé otázky.
Přesný popis algoritmu usnadňuje domluvu o chování i o dopadu změny.
Vstup a výstup
Popisují, s čím postup pracuje a co slibuje vrátit včetně hranic.
Konečnost
Pro platný vstup musí skončit nebo mít definované řízené ukončení.
Správnost
Výstup musí odpovídat pravidlům, ne jen projít bez technické chyby.
Složitost
Čas a paměť rostou s velikostí vstupu; jeden průchod položkami obvykle roste s jejich počtem.
Omezení a časté chyby
Rychlost posuzujte podle skutečného problému.
Co pomáhá
- vymezit vstupy, výstupy a okrajové případy
- zvolit čitelný postup pro malý dataset
- měřit skutečné úzké místo před optimalizací
Rizika
- vydávat konkrétní kód za samotný algoritmus
- zapomenout na ukončení nebo prázdný vstup
- optimalizovat bez měření a zhoršit čitelnost
Praktické použití
Nejprve ověřte správnost, potom cenu provedení.
Rychlejší algoritmus není vždy nejlepší volbou. U několika položek objednávky může být přímý průchod vhodnější než komplikovaná struktura; u statisíců záznamů se naopak náklady projeví.
Změna algoritmu je změna chování nebo jeho nákladů, proto má mít testy pro hranice slev, nulové položky, neplatné vstupy i pravidla zaokrouhlení.
Algoritmus není ani samotný zdrojový kód, ani business proces. Kód je jedna konkrétní implementace postupu v daném jazyce a business proces může navíc obsahovat člověka, schválení nebo čekání na externí událost. Heuristika zase hledá dostatečně dobrý výsledek bez záruky optimálního řešení. Tento rozdíl pomáhá týmu diskutovat o pravidlech dřív, než začne řešit názvy tříd nebo technický detail.
U ceny objednávky je třeba předem určit například zacházení s prázdným košíkem, zápornou položkou, platností slevového kódu a pořadím daně, dopravy a zaokrouhlení. Teprve tak lze měřit správnost. Až když měření ukáže problém na reálném objemu dat, je užitečné hledat úspornější postup nebo změnit práci s uloženými daty.
Časová složitost není hodnocení elegance kódu, ale popis růstu práce se vstupem. Paměťová složitost obdobně říká, kolik mezivýsledků je nutné držet. Pro malou administrativní dávku může být záměrně přímé řešení vhodnější než obecnější optimalizace, kterou by tým hůře udržoval.
Dobře popsaný algoritmus usnadňuje code review: reviewer může zkontrolovat každý krok proti vstupu a očekávanému výsledku, aniž by se nejdřív prodíral detailem frameworku. Zároveň se lépe pozná, zda změna dopravy, slevy nebo pořadí validace skutečně mění pravidlo, nebo jen způsob zápisu.
Při implementaci se vyplatí ponechat mezivýsledky pojmenované podle významu, například totalInCents nebo discountInCents, místo jedné proměnné s měnícím se účelem. Díky tomu lze samostatně otestovat součet položek, uplatnění slevy i přidání dopravy. Když se pravidla změní, tým snáze určí, která část postupu je příčinou nové hodnoty a která má zůstat beze změny.
Kontrola změny
Zachovejte význam postupu i jeho hranice.
Kvalitní implementace dovolí ověřit výsledek nezávisle na detailech jazyka.
- zapsat vstup, výstup a okrajové případy
- ověřit ukončení každého opakovaného kroku
- oddělit pravidlo od technického detailu
- měřit čas a paměť na relevantních datech
Časté otázky
Algoritmy v běžném vývoji
Je algoritmus totéž co funkce?
Ne. Funkce je konstrukce programu s názvem a kontraktem; může algoritmus implementovat.
Musí být algoritmus napsán v programovacím jazyce?
Ne. Lze jej popsat diagramem nebo pseudokódem; jazyk přidá konkrétní syntaxi.
Je rychlejší algoritmus vždy lepší?
Ne. Musí být správný, přiměřeně čitelný a vhodný pro reálný objem dat.
Co znamená časová složitost prakticky?
Jak se množství práce mění s velikostí vstupu.
Osobní zkušenost
Výpočetní pravidla mají být čitelná a ověřitelná.
Při návrhu e-commerce funkcí rozděluji pravidla na testovatelné kroky a optimalizuji podle skutečné potřeby.