Blog

Späť na všetky články

Prečo je dôležité udržiavať Rails v najaktuálnejšej verzii?

U nás vo freevision často dedíme staršie Ruby on Rails projekty s frameworkami a jazykovými verziami, ktoré buď nezodpovedajú aktuálnym stabilným verziám, alebo majú zastaralé balíky (ktoré sa v Ruby svete volajú gems). Toto sa v IT nazýva technologický dlh. V tomto článku uvádzame niekoľko spôsobov ako k technologickému dlhu pristupovať. Vysvetlíme, ako sa vyhýbame technologickému dlhu v našich vlastných projektoch a prečo je udržiavanie aktuálnych verzií dobrou praxou pre všetky zúčastnené strany.

Urýchľuje vývoj

Aktualizácie verzie Ruby žiaľ stále Rails kód podstatne nezrýchlia (aj keď postupné aktualizácie urobia rozdiel). Na rozdiel od rýchlosti kódu sa však vďaka aktualizáciam výrazne skráti čas potrebný na vývoj. Uvádzame niekoľko príkladov upgradu Railsov, ktoré nám skrátili čas vývoja z niekoľkých hodín na pár minút.

Príklad: set up projektu

Ako developer si musím každý nový projekt najprv lokálne nastaviť, aby som mohol začať robiť zmeny a testovať ich.

Čas potrebný na nastavenie nového projektu závisí od jeho typu, ale vo všeobecnosti by mal byť čo najkratší - dobrý projekt by sa mal dať ľahko nastaviť.

Raz sme dostali taký starý a neudržiavaný projekt, že verzia Ruby, na ktorej bežal, už nebola k dispozícii - doslova sme ju nemohli nájsť v žiadnom Ruby version manager. Bola zastaraná a odstránená, pretože jej používanie už nebolo bezpečné. Lokálne spustenie si teda najprv vyžadovalo aktualizáciu Ruby na novšiu "existujúcu" verziu. Spolu s ďalšími softvérovými úskaliami v rámci tohto projektu nám trvalo aspoň deň, kým sme si projekt lokálne spustili. Projekty, ktoré aktualizujú svoje verzie si zvyčajne vieme nastaviť v priebehu hodiny. Toto je najextrémnejší príklad, ale ukazuje, ako vás technický dlh dobehne už po niekoľkých rokoch zanedbávania softvéru.

Príklad: optimalizácia rýchlosti programu

Ďalším príkladom je zdedený projekt, ktorý sme dostali vo verzii Rails 5 (Rails 7 bola v tom čase aktuálna stabilná verzia = not great, not terrible). Tento projekt mal nastavený proces na pozadí, ktorý každý deň synchronizoval údaje medzi interným modelom a externým zdrojom dát. Po spustení kódu som si všimol, že bol dosť pomalý, pretože zbytočne vytváral záznamy po jednom. Mohol by byť výrazne rýchlejší, keby sme ho spustili ako jeden bulk insert príkaz. V Rails 6 by bola táto zmena veľmi jednoduchá a vyžadovala by úpravu len niekoľkých riadkov - s využitím novej ActiveRecord metódy insert_all.

V Rails 5 by však riešenie vyžadovalo viacero zmien - museli by sme pridať nový gem do nášho Gemfile, ktorý zabezpečuje importovanie viacerých záznamov (napríklad activerecord-import) a následne upraviť kód, aby tento gem mohol využívať.

Príklad: využívanie variantov obrázkov

S takmer každým naším novým projektom sme mali rovnaký problém - museli sme použiť ActiveStorage na ukladanie vlastných súborov s obrázkami a následne vytvoriť varianty, aby bolo možné pri zobrazovaní využívať rôzne veľkosti obrázkov. V minulosti sme museli vyvinúť vlastný modul na pridelenie vlastných variantov priamo k želaným modelom, na ktorý sme použili metaprogramovanie v Ruby.

Toto všetko je teraz zahrnuté v Rails 7+, čo nám umožňuje definovať vlastné varianty len niekoľkými riadkami kódu - Rails túto funkciu zjednocuje, čiže prispôsobený kód už nemusí byť roztrúsený v rôznych častiach kódu/projektu. Opäť tu platí, že novšia verzia = kratší čas potrebný na vývoj.

Bezpečnosť

Pri každom z našich projektov využívame gem bundle-audit, aby sme zaistili že gemy, ktoré používame sú bezpečné. Podľa toho, koľko závislostí (dependencies) projekt využíva, môžu nové zraniteľné miesta vznikať aj na týždennej báze. Ak sú aktualizácie projektu zanedbané dlhšie ako niekoľko mesiacov, používatelia a spoločnosti sa stávajú zraniteľnými voči útokom.

Ako sa staráme o aktuálnosť našich projektov

Aktualizácia nového softvéru so sebou vždy prináša veľa neznámeho. Nižšie nájdete zoznam dôvodov, prečo je aktualizácia Rails väčšinou pomerne jednoduchá a priamočiara, vrátane dôvodov, prečo má zmysel každý projekt pravidelne aktualizovať. Tento zoznam je do veľkej miery inšpirovaný Rails Doktrínou:

  1. Je to veľmi dobre zdokumentované - článok o Rails upgradoch obsahuje kroky potrebné na aktualizáciu pri každom prechode na novú major verziu. Tieto návody väčšinou pomerne dobre pokrývajú najdôležitejšie veci, na ktoré si treba dávať pozor, ale v prípade že to nestačí, k dispozícií sú aj Changelogs.

  2. Nové verzie sú od developerov pre developerov - Rails je vyvíjaný komunitou, ktorá často rieši podobné všeobecné problémy pri vývoji webov ako my. Vďaka tomu prináša každá nová verzia užitočné nové riešenia a funkcie. Ako už bolo spomenuté, týmto sa môže výrazne skrátiť čas, ktorý potrebujeme na vývoj.

  3. Toto pekne nadväzuje na Rails filozofiu “konvencia nad konfiguráciou”. Tvorcovia Rails často prichádzajú s novými spôsobmi, ako veci robiť a postupne ich implementujú do novších verzií, kým pôvodné spôsoby deprekujú.

  4. Deprekovanie prebieha bezpečne a pomaly, väčšinou v rámci cyklu dvoch verzií. To znamená, že každá významná zmena je najprv predstavená iba s upozornením o zastaranosti. To dáva developerom dosť času, aby danú funkciu prestali používať a upozornenie odstránili. Zastaraná funkcia začne vracať chybu až po ďalšej významnej zmene verzie.

Author: Martin Číž

Ľubomír Kukuča

Plánujete aplikáciu?