Když chceš vyvíjet pro Android, začni u prostředí a prvního projektu

Z Mazovia

Lidé jsou třetí a největší překážka. Pokud provozní tým cítí, že mu vývojáři předávají nehotovou práci, a vývojáři zase, že je provoz brzdí, žádná automatizace to nespraví. Pomáhá společné vlastnictví služby, společné pohotovosti a to, že se incidenty rozebírají bez hledání viníka. Chyby se mají zapisovat a opravovat v systému, ne v lidech. Teprve když obě strany vidí stejná data a mají stejný cíl, začne DevOps dávat smysl.

Mezi časté provozní chyby patří podcenění indexů, ignorování limitu velikosti dokumentu a spoléhání na to, že databáze sama vyřeší konzistenci. V distribuovaných systémech se nastavuje úroveň čtení a zápisu; příliš volná nastavení zrychlí operace, ale přinesou dočasně neviditelná nebo konfliktní data. Pokud aplikace potřebuje silnou konzistenci, musíte ji vynutit v konfiguraci a často i v logice. Další pastí je migrace schématu za provozu: i bez pevného schématu je potřeba verze dokumentů a postupné přepisování, jinak se v datech objeví nekompatibilní tvary.

Než nainstaluješ cokoli dalšího, rozhodni se, na čem budeš pracovat. Pro Android je oficiální cestou Android Studio, které obsahuje potřebné nástroje pro kompilaci, ladění i testování. Stačí jej stáhnout, nainstalovat a nechat doběhnout prvotní konfiguraci. Během ní si nainstaluj SDK pro alespoň jednu starší a jednu novější verzi systému. Emulátor si nastav tak, aby odpovídal zařízení, na kterém chceš aplikaci reálně testovat – ideálně telefon s běžným rozlišením a rozumnou pamětí.

Konflikty nejsou katastrofa, ale způsob jejich řešení často bývá. Nikdy neřeš konflikt automaticky ani slepým přepsáním jedné strany. Otevři si oba konce, zjisti, co ta druhá změna sledovala, a výsledek spusť. Po každém řešení konfliktu udělej build a testy, protože právě tady vznikají tiché regrese. Pozor na rebase na sdílené větvi: přepisuje historii a kolegům rozbije jejich lokální kopie. Rebase používej na své vlastní, ještě nesdílené větvi; sdílenou větev slučuj běžným merge. Stejně tak nikdy nepushuj přes --force do větve, kterou používá někdo jiný, aniž bys ho předem varoval.

Při růstu codebase se vyplatí měřit dobu běhu a míru selhání. Pokud jednotkové testy trvají déle než několik sekund, něco je špatně. Pokud integrační testy padají na náhodných chybách, je problém v izolaci nebo v prostředí. Sledujte, které testy nejčastěji padají a proč, a opravujte příčinu, ne test. Nakonec platí, že hranice mezi jednotkovými a integračními testy není dogmatická, ale musí být jasná a dodržovaná. Když ji tým zná a respektuje, růst kódu přestane být noční můrou.

První projekt nezakládej jako prázdnou aktivitu, ale použij předpřipravenou šablonu s jednou obrazovkou. Uvidíš tak strukturu souborů a nebudeš muset řešit, co kam patří. Hned na začátku si zvykni na oddělení logiky od vzhledu. Layout patří do souborů s rozvržením, chování do kódu. Když to budeš míchat, později narazíš na nečitelný kód a problémy při změnách. První aplikaci omezte na jednu obrazovku s jedním tlačítkem a jedním textovým polem. Zjistíš, jak se data předávají a jak se mění stav.

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 do mnoha podob a každý dotaz začne skenovat celé kolekce. U dokumentových databází to znamená, že dokumenty rostou do 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.

NoSQL je vhodné nasadit tam, kde znáte přístupové vzory a umíte je promítnout do klíčů, indexů a tvaru záznamů. Když si nejste jistí, začněte relační databází a přejděte k NoSQL jen pro tu část systému, která to skutečně potřebuje. Vyhnete se tak stavu, kdy sice máte moderní úložiště, ale dotazy jsou pomalejší než dřív.

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.

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, události nebo 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.