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.

  1. Vstup Položky, množství, pravidlo slevy a doprava.
  2. Průchod Sečte řádkové ceny všech položek.
  3. Rozhodnutí Podle hranice aplikuje nebo přeskočí slevu.
  4. 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.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.