Jak spolehlivě odhadovat délku softwarových projektů
Důležité je také testovat chybové stavy. Mnoho vývojářů testuje pouze happy path a zapomíná na to, co se stane, když API vrátí chybu. Vytvořte test, kde mock API vrací chybu, a ověřte, že akce dispatchuje správnou chybovou akci. Tím zajistíte, že vaše aplikace korektně zobrazí chybovou hlášku. Nezapomeňte také na testování stavů s nulovými daty – asynchronní akce by měly fungovat i při prázdné odpovědi.
Začněte u reducerů. Reducer je funkce, která přijímá stav a akci a vrací nový stav. Testování spočívá v tom, že zavoláte reducer s konkrétním stavem a akcí a porovnáte výsledek s očekávaným. Důležité je neměnit původní stav – reducer musí být čistý. Při psaní testů vždy vytvořte nový objekt stavu, abyste předešli vedlejším efektům. Typická chyba je testovat reducer přes celý store, což zbytečně komplikuje izolaci. Místo toho importujte reducer přímo a testujte ho jako samostatnou jednotku.
Kde se nejčastěji ztrácí čas Největším zdrojem nepřesností jsou skryté závislosti a chybějící specifikace. Pokud zadání není jasné, odhadněte čas na vyjasnění a do odhadu zahrňte rezervu na změny rozsahu. Vždy počítejte s tím, že se během vývoje objeví nečekané problémy — zastaralé knihovny, nesoulad verzí nebo chybná data. Přidejte proto k celkovému času rezervu 20–30 % pro neznámé. Tato rezerva není zbytečná, je to investice do reálnosti.
Doporučuji používat techniku tří bodů: optimistický, pesimistický a nejpravděpodobnější odhad pro každý úkol. Vypočítejte průměr vážený vzorcem (optimistický + 4 × nejpravděpodobnější + pesimistický) / 6. Tím získáte realističtější hodnotu, než kdybyste spoléhali na první dojem. Zaznamenávejte si historická data — kolik času jste skutečně potřebovali u minulých úkolů, a porovnávejte s odhady. To vám postupně umožní kalibrovat vlastní přesnost.
End-to-end testy jsou nejdražší, proto jich musí být minimum. Měly by pokrývat jen hlavní uživatelské cesty, jako je registrace, nákup nebo odhlášení. Pokud máte 500 jednotkových testů, stačí 5–10 end-to-end. Dbejte na to, aby běžely v izolovaném prostředí s čistými daty. Častou chybou je spouštět je proti produkčnímu prostředí nebo s reálnými platebními branami – to vede k nestabilitě a bezpečnostním rizikům. Pro end-to-end testy používejte vlastní testovací uživatele a fiktivní platební metody.
Nezapomínejte ani na testování okrajových případů. Mnozí vývojáři testují pouze šťastnou cestu (happy path), ale skutečná hodnota testů se projeví při zpracování prázdných vstupů, velkých čísel nebo neplatných argumentů. NUnit nabízí atribut [TestCase], který umožňuje předávat různé vstupy do jedné testovací metody. Tím se vyhnete kopírování kódu a snadno pokryjete více scénářů.
Vyvarujte se odhadování v týmu pod tlakem na rychlost. Když je termín krátký, lidé mají tendenci snižovat čísla, ale to nezvýší produktivitu, jen to vede k přepracování a chybám. Místo toho požádejte o čas na rozmyšlenou a odhady konzultujte s kolegy, kteří znají jiné části systému. Různé pohledy odhalí rizika, která jste neviděli. Nezapomínejte ani na administrativu, schůzky a e-maily — tyto „neviditelné" činnosti zaberou běžně 10–15 % pracovního dne.
Během sprintu se držte tří pravidel: denní stand-up max 15 minut, sprint review na konci a retrospektiva. Stand-up není report pro manažera, ale synchronizace práce. Každý řekne, co dělal včera, co dnes a co ho blokuje. Pokud narazíte na blokátor, neřešte ho na stand-upu, ale domluvte si schůzku po něm. Většina českých týmů dělá chybu, že stand-up protahuje na 30 minut a řeší technické detaily – to zabíjí efektivitu.
Jednou z častých pastí je používání OR v podmínkách, které znesnadňuje optimalizátoru volbu indexu. Pokud je to možné, nahraďte OR pomocí UNION ALL na dvě samostatné podmínky. Podobně se vyhněte používání NOT IN, které bývá pomalejší než NOT EXISTS. Důležité je také sledovat statistiky tabulek – pokud se často mění data, spouštějte pravidelně aktualizaci statistik, aby optimalizátor měl přesné informace o rozložení hodnot. V neposlední řadě se vyplatí pečlivě testovat dotazy na reálných datech, ne na malé testovací sadě.
Významný vliv na výkon má také práce s daty na aplikační úrovni. Pokud potřebujete agregace, jako jsou součty nebo průměry, nechte je spočítat SQL, a ne v programovacím jazyce. Místo načítání všech záznamů a jejich filtrování v paměti aplikace vždy filtrujte v dotazu. Pomůže také stránkování výsledků – používejte LIMIT a OFFSET, ale mějte na paměti, že velký OFFSET je neefektivní. Pro listování velkými datovými sadami zvažte tzv. keyset pagination, která je založena na podmínce větší než poslední ID.