Monorepo jako cesta k úspoře nákladů na vývoj

Ve chvíli, kdy se rozhodnete pro vývoj více než jedné aplikace, je efektivní způsob sdílení technických řešení klíčem k ušetření investovaného času a výdajů.

Matěj ChalkMatěj ChalkFull-stack engineer | FlowUp

Nx a Angular

Někdy jedna aplikace prostě nestačí. K dosažení všech svých potenciálních uživatelů často budete potřebovat nejen web, ale i mobilní aplikace pro Android a iOS. Vývoj ne jedné, ale rovnou tří aplikací, se však už může pěkně prodražit. K uživatelské aplikaci se vám navíc může hodit ještě oddělené administrátorské rozhraní, které s ní ale také musí sdílet značnou část vaší business logiky. Případně můžete mít produktů více a nebudete chtít plýtvat rozpočtem na tom, že byste každou aplikaci vybudovali vždy znovu od nuly a jejich údržba by probíhala odděleně. V těchto případech je výběr správného technického řešení kritický.

Moderní řešení podobných situací nabízí tzv. monorepo. Místo toho, aby byly zdrojové kódy každého projektu uloženy samostatně, je několik projektů vyvíjených v jednom společném repozitáři.

Monorepo umožňuje mnohem jednodušeji sdílet kód implementující funkcionalitu společnou pro více projektů. Navíc pomáhá centralizovat automatizaci pro build a release, nástroje pro vývoj a verze závislostí. Z těchto (a dalších) důvodů jsou monorepa dnes standardem ve velkých společnostech jako jsou Google, Microsoft či Facebook.

Co v monorepu můžete vybudovat?

Nx poskytuje open-source implementaci monorepa. Nabízí prvotřídní nástroje pro vývoj založený na webových technologiích, včetně rozšíření pro framework Angular. Jinými slovy umožňuje Nx vytvořit jakýkoliv typ aplikace, na kterou lze uplatnit webové technologie. A těmi lze v dnešní době implementovat už mnohem více než jenom jednoduché webové stránky.

  • V základní verzi je Angular určený pro tzv. single-page aplikace. SPA jsou webové aplikace poskytující rychlejší a interaktivnější user experience oproti tradičním multi-page aplikacím, přičemž jsou stále distribuované přes web (místo instalace tedy stačí mít odkaz).

  • Je-li požadováno SEO, lze v kombinaci s technologií Angular Universal implementovat server-side rendering. Tímto váš web zoptimalizujete pro webové vyhledávače (např. pro Google) a zároveň zrychlíte načtení první navštívené stránky.

  • Tradičně bylo nutné mobilní aplikace pro Android a iOS vyvíjet zvlášť (typicky separátními týmy, jelikož každá platforma je postavena na jiných technologiích). Moderní alternativou je použít framework pro hybridní mobilní aplikace, jenž vám dovolí vytvořit aplikace pro obě platformy „jednou ranou. Jedním z těchto frameworků je Ionic, který má pro Angular prvotřídní podporu. Umožňuje tedy vašim vývojářům vytvořit nativní aplikaci pro Android i iOS zaráz, a to podobným způsobem jako klasickou aplikaci v Angularu.

  • V Angularu jde vytvořit i progresivní webové aplikace, tj. webové aplikace, které na mobilních zařízeních fungují podobně jako nativní. Výhodou PWA je, že jelikož jedna aplikace zastává funkci webu a zároveň nativní aplikace, dostanete váš produkt na trh mnohem dříve.

Jaké výhody má monorepo?

Monorepo může vývoj zefektivnit jak technologicky, tak i z hlediska procesního řízení. Na našich projektech jsme zaznamenali následující výhody.

Znovupoužitelnost kódu

Největší výhodou je samozřejmě schopnost jednoduše využívat existující kód napříč více projekty. Ve vývoji softwaru je důležitým principem nesnažit se znovu vynalézt kolo. Lepší je problém vyřešit jednou a pak jinde používat toto řešení.

U Nx slouží k organizaci kódu knihovny, které může využívat více aplikací. Sdílené knihovny pak může tým testovat, dokumentovat i udržovat na jednom místě. Dodržování tohoto přístupu vám pomůže dlouhodobě snížit výdaje za údržbu. Investováním času do správného řešení problému eliminujete nutnost řešit tento problém opakovaně.

Sdílení CI/CD

Postupná integrace (Continuous Integration; CI) a postupné nasazování (Continuous Delivery; CD) jsou důležitými nástroji v moderním vývoji softwaru, které tento proces dokáží zrychlit a zároveň zkvalitnit. CI/CD může také zlepšit komunikaci mezi zákazníkem a vývojáři, jelikož obě strany mají neustále přístup k aktuální verzi vyvíjeného produktu.

Správně nastavit automatizované testy, build a release však může zabrat nějakou dobu. Monorepo má tu výhodu, že stačí CI/CD nakonfigurovat jednou a tento systém se pak uplatní na všechny aplikace v repozitáři (včetně těch, které přibudou později).

Rychlejší onboarding

Obvykle trvá vývojářům nějakou dobu, než se zaškolí do nových projektů. Nejdříve se totiž musejí seznámit s novou codebase (tj. repozitářem zdrojových kódů), ve které mohou být jiné praktiky, technologie nebo pipeline (tj. automizovaná integrace či nasazování), než na které byli doposud zvyklí.

Zaznamenali jsme však, že práce v monorepu tento problém výrazně ulehčuje. Když vývojář obrátí svou pozornost od jedné aplikace v monorepu ke druhé, je již na codebase, pipeline i technologie (včetně společných knihoven) zvyklý. Je tedy schopen začít naplno přispívat za mnohem kratší dobu. Máme zkušenost, že se místo dnů či týdnů může jednat i o pouhé hodiny.

Rychlý a efektivní proces zaškolování je v agilním vývoji značnou výhodou, jelikož jste schopni dle aktuální poptávky snižovat či zvyšovat náklady určené pro vývoj mnohem flexibilněji. Pokud se například zrovna blíží datum doručení jedné z aplikací, je možné na tento projekt narychlo alokovat vývojáře z projektu s menší prioritou.

Vyšší kvalita kódu

Kvalita kódu se často podceňuje, jelikož je z krátkodobého hlediska lákavější jít za nejrychlejším možným řešením. Přitom tento přístup (zejména pokud vývojáři nedostávají prostor k pravidelné údržbě) z dlouhodobého hlediska vždy vede k vyšším nákladům, jelikož se kód postupem času udržuje čím dál tím hůř. Opravy a nové funkce pak trvají déle než předtím.

Udržitelnost kódu je v monorepu obzvlášť důležitá vzhledem k velikosti repozitáře. Nx z tohoto důvodu poskytuje řadu nástrojů a návodů k lepší organizaci kódu. Knihovny nejsou jen elegantním způsobem pro sdílení kódu. Kromě toho také vedou vývojáře k dělení systému na více samostatných částí, čímž pomáhají k udržování smysluplného grafu závislostí (s automatickou validací). Tyto izolované moduly lze udržovat samostatně, včetně dokumentace a automatických testů. Aplikace pak vzniká jejich spojením. Jinými slovy, architektura monorepa pomáhá kód lépe strukturovat a podporuje osvědčené praktiky.

Monorepo také zvyšuje viditelnost změn. Když je technické řešení rozložené do mnoha různých repozitářů (udržovaných a verzovaných zvlášť), musejí se velké změny dělat pomalu a opatrně, jelikož je obtížné odhadnout jejich celkový dopad na jinou codebase. V jediném repozitáři je tento proces mnohem jednodušší. Nx dokonce rozpoznává zasažené aplikace a knihovny automaticky. Vývojářům to tedy umožňuje významné změny vykonávat s mnohem vyšší jistotou.

Další výhodou je snadnější správa verzí díky prosazení tzv. single version policy. Ta se týká jak závislostí třetích stran (jednodušeji se aktualizují všechny aplikace naráz), tak i vlastních knihoven (odpadá režie publikace balíčků).

Případ z praxe

Pro představu, jak se monorepo používá v praxi, se s vámi nyní podělím o technické informace z jednoho z našich projektů.

Požadavky

V době, kdy jsme pro nejmenovanou firmu zveřejnili nativní aplikaci pro iOS/Android, jsme následně dostali za úkol pro stejnou značku (říkejme jí Kočička) vytvořit také webové stránky. Zároveň jsme s touto společností začali plánovat také novou nativní aplikaci pro jinou značku (Pejsek), kterou bylo třeba dostat na trh za velmi krátkou dobu. Jelikož měla aplikace Pejsek podobné technické požadavky jako aplikace Kočička, byl plán splnit tento deadline s využitím podobného technického řešení.

Řešení

Abychom dokázali naše technická řešení škálovat nahoru, začali jsme migrací na Nx monorepo, čímž jsme získali možnost efektivně sdílet již vytvořený kód. Monorepo tvořily 3 aplikace:

  • dříve vytvořená nativní mobilní aplikace Kočička (Ionic a Angular),

  • nová nativní mobilní aplikace Pejsek (také Ionic a Angular),

  • nové webové stránky Kočička včetně server-side renderingu (Angular a Angular Universal).

Refaktorovali jsme kód na knihovny, které jsme rozdělili podle jejich rozsahu na:

  • sdílené knihovny s obecnou funkcionalitu určenou všem aplikacím,

  • specifické knihovny obsahující business logiku pro značku Kočička,

  • knihovny určené pro nativní mobilní aplikace.

Příklad monorepa

Investování času do počáteční migrace se nám vyplatilo, protože nám množství následně sdíleného kódu celkově čas naopak ušetřilo. A jakmile jsme oba nové produkty úspěšně dostali na trh, měli jsme už postavené dobré základy pro dlouhodobou údržbu (s možností přidat v budoucnu další aplikace).

Shrnutí

Pokud je pravděpodobné, že budete chtít vytvořit více aplikací s podobnými rysy, monorepo by pro vás mohlo být tou pravou volbou. Počáteční investicí do vybudování kvalitních technických základů můžete při vývoji vašich projektů z dlouhodobého hlediska ušetřit peníze i čas. Hlavní výhodou monorepa je možnost využívat toho, co jste už vytvořili („do it once, do it right“). Dále pomáhá centralizovat automatizaci a proces, snadněji zaškolovat vývojáře a vytvářet celkově kvalitnější kód.

Jsme na stejné vlně?

Kontaktujte nás

hello@flowup.cz

Kontaktujte nás prostřednictvím tohoto formuláře a my vám odpovíme e‑mailem, co nejdříve to půjde. Pokud nám ve zprávě zanecháte také své číslo, zavoláme vám. Těšíme se na vaše zprávy!

Sídlíme v Brně

Kopečná 980/43

Brno

602 00

Česká republika

map