Pokud zvolíš IDE jen podle popularity, budeš ladit prostředí místo kódu
Neignorujte chybová hlášení. Podrobná chybová zpráva z databáze prozradí názvy tabulek, sloupců i typy dat a útočníkovi výrazně usnadní další postup. V produkčním prostředí proto zapněte obecné chybové stránky a podrobnosti logujte pouze na server. Totéž platí pro ladící nástroje, které nesmí být veřejně dostupné.
Testování mobilních aplikací stojí na dvou pilířích: ručním průzkumu a automatizaci. Rozdíl mezi nimi není v tom, který je lepší, ale v tom, co který dokáže odhalit. Ruční testování vyniká tam, kde jde o vzhled, plynulost a chování při reálném používání. Automatizace zase zvládne opakovat stovky scénářů bez únavy. Rozhodující je pochopit, kdy nasadit který přístup.
Největší chyba vzniká hned na začátku: tým si vybere NoSQL podle popularity a pak se snaží dotazovat stejně jako v relační databázi. Jenže bez schématu se data snadno rozutečou barvy stěn do obýváku mnoha podob a každý dotaz začne skenovat celé kolekce. U dokumentových databází to znamená, že dokumenty rostou barvy stěn do obýváku obrovských struktur, které se špatně aktualizují, a u key-value úložišť se zase zvětšuje počet požadavků, protože chybí vhodné seskupení. Výsledkem je vyšší latence a složitější provoz, ne rychlejší aplikace.
Začněte jednotným formátem odpovědí. Každé volání by mělo vracet stejnou obálku: data, stavový kód, případně seznam chyb. U chyb vždy uvádějte strojově čitelný kód, lidsky čitelnou zprávu a pole, kterého se týká. Vyhněte se tomu, aby jedna chyba vracela řetězec a jiná objekt. Frontend pak nemusí řešit desítky variant a stačí mu jedna funkce pro zpracování odpovědi.
Druhá věc je debugger. Zkus nastavit zarážku na řádek, spustit program a projít se po kódu. Pokud musíš místo toho vkládat tiskové výpisy, prostředí ti práci neusnadní. Dobrý debugger umí zobrazit hodnoty proměnných, krokovat barvy stěn do obýváku volaných funkcí a zastavit se při výjimce. To se nedá nahradit hezkým barevným schématem.
Nejčastější chyba je dokumentace psaná ručně vedle kódu. Časem se rozejde a nikdo nepozná, která verze platí. Lepší je generovat dokumentaci z anotací nebo ze schématu a udržovat ji jako součást repozitáře. Pokud to nejde, zaveďte pravidlo, že změna endpointu bez úpravy dokumentace neprojde revizí. Verzujte API a v dokumentaci vždy uveďte, které verze se změna týká.
NoSQL není jedna databáze ani univerzální náhrada relačního modelu. Je to soubor přístupů, které se vzdávají pevného schématu a často i části transakčních záruk výměnou za jiný způsob ukládání a dotazování. Mezi hlavní skupiny patří dokumentové databáze, key-value úložiště, širokosloupcové systémy a grafové databáze. Každá z nich řeší jiný typ problému a jinak se v ní navrhují data.
Před nasazením si napište seznam pěti až deseti nejčastějších dotazů a odhadněte, kolik dat budou číst a zapisovat. Podle toho navrhněte klíče a seskupení dokumentů tak, aby jeden dotaz sáhl na co nejmenší počet míst. U dokumentových databází pomáhá vnořovat data, která se čtou společně, ale zároveň hlídat velikost dokumentu. U grafů zase dávejte pozor na superuzly s obrovským počtem vazeb, které zdržují procházení. Bez tohoto kroku skončíte s pomalými dotazy i na výkonném clusteru.
Dokumentace REST API není popis toho, co jsme naprogramovali, ale smlouva mezi backendem a frontendem. Pokud si ji backend i frontend vyloží jinak, vznikají chyby, které se hledají těžko. Cílem je, aby se vývojář na frontendu dozvěděl z dokumentace vše potřebné bez ptaní a aby se kontrakt nezměnil, aniž by si toho někdo všiml.
Kdy NoSQL dává smysl a kdy ne NoSQL použijte tam, kde je přirozeně hierarchický nebo nepravidelný obsah, kde se mění podoba záznamů a kde potřebujete horizontální škálování zápisu. Typicky jde o katalogy s různými atributy, telemetrii, uživatelské profily, vztahy v grafech. Naopak pro silně transakční agendu s mnoha vzájemně provázanými tabulkami, složitými joiny a požadavkem na okamžitou konzistenci je relační databáze stále bezpečnější volba. Není to ideologie, ale otázka přístupového vzoru.
Pozor také na doplňování kódu a na to, jak prostředí rozumí typům. Některá prostředí nabízejí našeptávání jen podle názvů, jiná skutečně analyzují kód. Rozdíl poznáš ve chvíli, kdy pracuješ s knihovnou, kterou dobře neznáš. Vyzkoušej to na jedné funkci s více parametry a sleduj, zda ti prostředí ukáže jejich názvy a typy.
Funkce, která má přes 30 řádků, obvykle dělá víc věcí. Rozdělte ji. Každá funkce by měla mít jednu odpovědnost a ideálně vracet hodnotu, ne měnit okolní stav. Vyhněte se hlubokému vnořování if bloků – použijte guard clauses na začátku funkce. Místo if (podminka) { ... } else { ... } často stačí otočit podmínku a vrátit se včas. Tím se sníží počet úrovní odsazení a kód se čte shora dolů jako příběh.