Jak na výběr technologií na projektu

Ahoj, tato stránka je určena zejména pro tech leady a mentory na projektech Česko.Digital, kteří se chtějí více dozvědět o tom, jak se mohou vybírat technologie na “dobro” projektech.

Pokud po přečtení budeš potřebovat další informace ohledně vývoje webu, přečti si článek od @Tomáš Znamenáček (Unlicensed) zde na blogu Česko.Digital.

Co se vše dozvíš?

Hodnoty, na kterých stavíme při vývoji řešení

  • Z pohledu technologií se snažíme najít efektivní řešení s ohledem na výsledek. Nebráníme se používání zajímavých nových technologií (i mimo mainstream), ale o to více se snažíme technologie dokumentovat a zajistit, že všichni dobrovolníci detaily použité technologie chápou.

  • Vybíráme technologie, které jsou vhodné ve vztahu ke konkrétnímu případu/projektu (každý nový projekt přináší svá specifika - ať už v závislosti na tom, zda zadavatel má již produkt a tým, který jej nyní spravuje nebo se má vytvořit nový produkt, kdy záleží na komplexnosti řešení a také může záviset výběr technologie na tom, jak snadněji najdeme dobro vývojáře.

  • Náš hlavní cíl je být transparentní, vše řešit v rámci repozitáře na Githubu. Včetně definice infrastruktury (Infrastructure as a Code), CI/CD pipeliny (Github Actions) a případně dokumentace API nebo informací potřebných k lokálnímu vývoji.

    • Samotný Github repozitář by měl ideálně obsáhnout veškeré know-how kolem technické stránky projektu a sám o sobě by měl stačit ke kompletnímu technickému předání projektu (například by nemělo být potřebné žádné manuální nastavení produkčního prostředí, vše by mělo fungovat automaticky přes pipelinu v repozitáři).

  • Neschopnost dodat zadané úkoly z jakýchkoli důvodů je v dobrovolnické komunitě normální, uvědomujeme si že v životě se může stát cokoli a dobrovolnická práce není naše zaměstnání. Důležité ale je být transparentní a dávat do týmu vědět, že nestíháme. Jedna ze služeb č.d je právě zajišťování dostatečně velké komunity, která může v projektu pokračovat. Díky tomu odpadá tlak na zodpovědnost za dodávání, projekt na jednom člověku nikdy nestojí.

 

Výběr technologií na projektu

Na projektech používáme širokou škálu technologií, jejichž volbu podřizujeme zejména možnostem a preferencím zadavatelů a vývojářských týmů. Jinými slovy, nepoužíváme jeden konkrétní „stack“ pro každý projekt a každý případ. Přesto existuje řada obecných principů a konkrétních postupů, kterými se při volbě technologií řídíme.

Webové stránky

Při vytváření webových stránek preferujeme statický web, který je zkompletován do souborů HTML z obsahových podkladů a šablon. Dodatečnou interaktivitu pak poskytuje JavaScript běžící na klientu. Takové řešení nám v případech, kdy je to možné, umožňuje použít finančně nenáročný hosting (často i zdarma), vysokou rychlost načítání stránek a výbornou odolnost proti přetížení požadavky.

Jinými slovy, ideální technologie je pro nás tzv. Jamstack. Webové stránky jsou sestaveny pomocí generátoru, jako je např. Next.js — ten používá např. náš web —, NuxtJS, Hugo nebo Jekyll.

Obsah webových stránek doporučujeme udržovat primárně v souborech typu Markdown, které jsou uloženy přímo v repozitáři projektu. Pro snazší editaci nasazujeme moderní systémy na správu obsahu (CMS). V odůvodněných případech obsah udržujeme v databázi typu Airtable.

Stránky hostujeme pomocí služeb jako jsou GitHub Pages, Vercel, Netlify, Cloudflare Pages a podobné, které zaručují vysokou škálovatelnost, nejsou náročné na údržbu, a umožňují automatické nasazování projektu ze zdrojových kódů v repozitáři.

Serverové součásti projektu (API) zpravidla implementujeme v JavaScriptu nebo TypeScriptu a hostujeme pomocí serverlesstechnologií jako Vercel Functions, AWS Lambda nebo Cloud Functions.

Pro měření návštěvnosti používáme primárně službu Plausible, která nevyžaduje tzv. „cookie lištu”. V odůvodněných případech používáme Google Analytics, kdy preferujeme řešení bez ukládání cookies.

Dobrým příkladem je repozitář našeho webu na GitHubu.

Serverové služby a aplikace

Při volbě technologií pro služby a aplikace běžící na serveru se rozhodujeme zejména podle dostupnosti vývojářů pro konkrétní platformu a zkušeností či preferencí zadavatele. Jinými slovy, snažíme se používat široce rozšířené programovací jazyky a frameworky: tedy např. spíše Python než Haskell.

Bez ohledu na volbu vývojové platformy služby a aplikace provozujeme jako Docker kontejnery, což nám přináší jednak dostatečnou míru odstínění nasazené aplikace od specificky nastaveného prostředí, různých verzí závislostí, a podobně, jednak přináší široké možnosti nasazení v testovacím a produkčním prostředí. Jinými slovy, výchozím bodem je pro nás Dockerfile v repositáři, který umožňuje sestavení Docker image.

Sestavení Docker image automatizujeme přes služby typu GitHub Actions, AWS CodeBuild nebo Google Cloud Build, což nám umožňuje automatizovat nasazování aplikace v testovacím nebo produkčním prostředí, podle příslušné větve repozitáře (tzv. continuous delivery).

Služby hostujeme většinou ve veřejném cloudu: Amazon Web Services (AWS), Google Cloud Platform (GCP), Azure, a podobně. Snažíme se využívat finančně výhodných a ekologických řešení jako je např. Google Cloud Run.

Docker využíváme též pro efektivní lokální vývoj. Pokud služba i aplikace vyžaduje externí zdroje, např. databázi, definujeme je v konfiguračním souboru pro Docker Compose a usnadňujeme tak vývojářům zapojení do projektu.

Pro správu infrastruktury využíváme nástroje Terraform. Jinými slovy, snažíme se infrastrukturu „nenaklikávat“, ale vytváříme ji automatizovaně, včetně nutné konfigurace. Definice infrastruktury je součástí repozitáře, což jednak usnadňuje porozumění architektuře dané služby či aplikace, jednak umožňuje zapojení správy infrastruktury do continuous delivery celého projektu.

Dobrým příkladem je repozitář projektu Jehlomat na GitHubu.

Mobilní vývoj

Mobilní aplikace vyvíjíme buď pomocí nástrojů jako je např. Flutter, nebo v nativních nástrojích dané platformy. Disponujeme vývojářskými účty v Apple Store a Google Play. Dobrými příklady jsou repozitáře projektů Loono, Movap (Apple) a Movapp (Android) na našem GitHubu.

Kam se v případe dotazů obrátit?

  1. Při jakékoli otázce je nejlepší komunikovat na Slacku a spíše než psaní soukromých zpráv volit veřejnou zprávu buď do:

    1. kanálu projektu, kde tagnete relevantního projektového koordinátora nebo tech leada.

    2. organizačního kanálu #ceskodigital-tech, kde se řeší všechny otázky ohledně běžících projektů v rámci č.d

  2. Pokud poptáváme dobrovolníky na nějaký technický úkol nebo roli, je potřebné napsat detailní poptávku do kompetenčního kanálu (#vyvoj). Při jakékoli nejasnosti ohledně role nebo formy příspěvku je nejlepší se nejdříve poradit v kanále #ceskodigital-tech.

  3. V případě jakékoli další nejasnosti nebo nutnosti, nebo nutnosti eskalace doporučujeme tagnout CTO.