Rozhovor s Josefem Muškem, CTO v BizMachine
Společnost BizMachine vyvíjí živou aplikaci Prospector, která je postavená na desítkách milionů záznamů a používají ji tisíce uživatelů. Umožňuje jim vyhledávat, zobrazovat, analyzovat a exportovat data o firmách. Vývoj, který neustále za touto aplikací probíhá, má v BizMachine hlavní dva cíle: aby byla aplikace robustní a klientům poskytovala stabilní službu a aby byla zároveň schopna neustálé inovace v reakci na nové klientské požadavky (use cases).
Aspirací platformy Prospector je pomocí několika principů, například separací dat, tagů nebo prostřednictvím hierarchie vyřešit obrovské množství klientských potřeb. Nejen o tom se v rozhovoru rozpovídal Josef Mušek, CTO v BizMachine.
Jaké technologie používáte pro vývoj a proč?
Prospector se skládá z dvou hlavních komponent, integračního API a webového rozhraní, se kterým interagují uživatelé. Integrační API je psané v Microsoft .NET C# a webové rozhraní je vyvíjené na Reactu (javascriptová knihovna). Obojí se vyvíjí v jiných nástrojích a k tomu naši vývojáři pracují jak na Windows, tak na Macu. Aby toho nebylo málo, produkční verze jsou nasazené na Microsoft Azure Cloud. To vše s sebou nese velkou potřebu univerzality, aby obě komponenty mohly využívat co nejvíce společných nástrojů. Microsoft Cloud nám mnohé z aktivit ulehčuje. Jak už to u cloudového vývoje bývá, přinesl zároveň i potřebu změn v přístupu k vývoji.
Jak se tedy změnil váš přístup k vývoji?
Začali jsme na specifických technologiích Azure Cloudu a teď se posouváme směrem k agnostickým open source technologiím jako jsou Docker a Kubernetes, tzn. k technologiím, které lze používat jak v cloudu, tak i lokálně. Microsoft tyto technologie nabízí na svém cloudu jako službu, což nám velice pomohlo v jejich začlenění. Tyto technologie mají pozitivní dopad na vývoj už od samotného počátku, protože zmenšují rozdíly mezi prostředími a tedy možnost neočekávaného chování. Ušetřený čas pak můžeme věnovat novému vývoji a efektivněji opravovat nalezené chyby. Ověřujeme si, že používání open source technologií je pro náš styl vývoje velkým přínosem a v kombinaci s Azure Cloud, který potřebné technologie nabízí a za nás spravuje, je pro nás přechod snazší a rychlejší.Jak nasazujete a vydáváte nové verze aplikace?
Za poslední dva roky jsme v BizMachine prošli poměrně velkou změnou přístupu. Pro samotný vývoj nadále využíváme standardní nástroje jako jsou Microsoft Visual Studio, Visual Studio Code a Git. Snažíme se ale mnohem více než v minulosti využívat možnosti automatizace.
Před dvěma lety byl náš vývoj silně založen na lidském faktoru: vývojář udělal změny, které sám dal do úložiště, sám to sestavil a sám taky nasadil. Bez vývojáře se nic nestalo. Měl sice velkou svobodu, ale, jak říká klasik, with great power comes great responsibility (s velkou mocí přichází velká zodpovědnost). Obrovská flexibilita byla zároveň výhodou i nevýhodou. Vývojář tehdy neměl příliš mnoho důvodů se hlouběji zamýšlet nad tím, jaký dopad bude mít daná změna a zpravidla se testoval jen lokální dopad, ale netestovala se interakce s ostatními komponentami. Z časových důvodů nebylo často možné vše na různých prostředích otestovat. Lidský faktor se ukázal jako velká nevýhoda zejména při reprodukci procesu: lidé nejsou neomylní a reprodukovat stejný krok ve stejném sledu se stejnými parametry je skoro nemožné. Navíc to vývojáře moc nebaví. Vývojáři si mohli také dovolit trochu “divočet”, například změnit verzi frameworku, a ovlivnit tím chování něčeho, co přímo nesouviselo s jejich změnou. Bez zásahu člověka se také nic nemohlo provést, nic naplánovat či připravit dopředu. Každé prostředí bylo nutné měnit manuálně. Když jsme potřebovali nasadit nějaké změny, někdo si k tomu musel sednout třeba i v deset večer.
Dnes když vývojář udělá změnu, uloží ji na server, kde se všechny změny scházejí, server následně vytvoří binárky a pak přichází ke slovu Docker. Automatický proces vezme výsledný kontejner a nasadí na jedno prostředí. Čeká se na human interaction a po otestování, když je všechno v pořádku, se stejný kontejner automaticky nasadí na další prostředí, druhé, třetí, podle potřeby. Prvotně proces nasazení sice vývojář musí popsat pomocí skriptu, ale opakovaná spuštění jsou už automatizovaná. Můžeme je načasovat kdykoli, třeba mimo pracovní dobu. Nasazuje se zpravidla stejným skriptem na různých prostředích. Tedy když si funkčnost vyzkoušíme na předprodukčním, staging prostředí a je to v pořádku, máme velkou míru důvěry, že na produkčním prostředí to bude taky fungovat a nemusíme proces hlídat až do konce. Do skriptu je také možné vložit automatické kontroly, které nám nasazení vrátí zpátky, pokud by někde nastala chyba. Výhodou automatizace je zároveň mnohem menší chybovost: na rozdíl od člověka dobře napsaný skript nikdy neudělá chybu. Jsme schopni mnohem snadněji procesy replikovat a v kombinaci s Dockerem víme přesně, kde co je a v jaké verzi včetně závislostí. Pokud je problém v nasazené verzi, můžeme si dokonce stejný kontejner pustit lokálně a ověřit si chování pro potřeby řešení chyby. V BizMachine věříme, že automatizace je v jednadvacátém století nevyhnutelná, pokud chceme držet krok s tím, co dělají jiné úspěšné firmy.
Zmínil jsi kontejnerové služby Docker. Jakou s nimi máte zkušenost?
Momentálně jsme ve fázi implementace této technologie. Snažíme se připravovat všechny kroky tak, abychom se tam co nejdříve dostali. Prvním krokem je vytvořit výstupní balíček našeho buildu (sada knihoven a exe souborů) a z něj Docker image. Doposud jsme vydávali balíček a ten spouštěli přímo na daném prostředí. Místo toho bychom teď chtěli vydávat Docker image a v cílovém prostředí spouštět instance kontejneru založené na vydaném image.
A co vývoj v Cloudu? Jak vám v tom pomáhá?
V dnešní době je skoro všechno v cloudu. Je zajímavé, že přitom moc vývojářů s tímto vývojem ještě nemá praktickou zkušenost, vnímají to jako něco magického nebo dokonce těžkého. Jde ale o trend, kterým se postupně ubírají všechny firmy, protože když se nemusí starat o infrastrukturu, tak mají více času věnovat se tomu podstatnému, svému produktu. V BizMachine se snažíme využívat agnostické technologie, které můžeme použít jak na vývoj pro různé cloudové platformy, tak on premise, například právě kontejnerovou platformu Docker. Nad ní běží orchestrátor Kubernetes, který původně vyvinul Google a hlavně je to open-sourcový projekt. Aplikace se pak nasazuje do různých prostředí stejně, ať už je v cloudu nebo lokálně, díky jednotnému rozhraní. Obecně nám toto pomáhá získat jiný nadhled na konkrétní problém. Využití paměti je dobrý příklad, kde na vlastním HW je to limitace, takže s ní při vývoji musíme počítat, ale v cloudu si můžeme říct o obrovské množství a limitací je naopak doba, po kterou jej potřebujeme.i.
Vývoj a nasazování v cloudu a automatizace, jak to přesně spolu souvisí?
Cloud dává už předdefinovanou sadu možností, služeb je omezený počet a cesta je relativně jasně vymezená. Se sadou nástrojů nám taky relativně jasně stanovuje, jak to udělat, aby se to povedlo. Cloud používá široká komunita uživatelů, služby jsou proto minimalistické a je jich omezený počet na druhou stranu cloudová služba musí být stabilní a využívá ho široké spektrum uživatelů pro různé účely. V cloudu to není jednodušší, ale standardizovanější. Když mám vlastní infrastrukturu, jde o doménovou znalost společnosti.
Pro vývojáře samotná znalost vývoje v cloudu představuje velkou výhodu: když si osvojí vývoj v Azure Cloud od Microsoftu a změní zaměstnání, kde se používá Google Cloud, interní procesy sice budou jiné, ale sada možností bude obdobná, jen minimálně omezená firemními směrnicemi. Nemusí se tudíž učit další technologie. Když budou vědět, že nová aplikace bude releasovaná jako Docker kontejner, de facto budou vědět všechno o daném prostředí, jaké má vstupy a výstupy. Nemusí pak přemýšlet nad tím, jestli to bude v Azure nebo Googlu.
Jaké výhody má nový přístup k vývoji pro vaše klienty?
Samozřejmě se snažíme, aby pro klienta byla jakákoliv změna při vývoji buď nepostřehnutelná, anebo pozitivní, například ve zrychlení odezvy webového rozhraní. Aktuálně nám vše zmíněné umožňuje nasazovat nové verze bez výpadku, přidávat nové funkce a zároveň obsluhovat větší množství klientů ve stejný čas. To, co děláme při vývoji na Prospectoru, aplikujeme v různé míře také v dalších typech práce, třeba u datové přípravy nebo na klientských projektech. V tomto směru nám open source technologie pomáhají zlepšovat přepoužitelnost řešení jako celku nebo jeho částí, zvyšovat kvalitu dat a být efektivnější při přípravě nových projektů.