{"id":34140,"date":"2019-10-31T21:56:35","date_gmt":"2019-10-31T18:56:35","guid":{"rendered":"https:\/\/prohoster.info\/blog\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1\/"},"modified":"2019-10-31T21:56:35","modified_gmt":"2019-10-31T18:56:35","slug":"printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","title":{"rendered":"Principy v\u00fdvoje modern\u00edch aplikac\u00ed od NGINX. \u010c\u00e1st 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ahoj, p\u0159\u00e1tel\u00e9. P\u0159ed zah\u00e1jen\u00edm kurzu <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/h4Ez\/\">\u201eBackend v\u00fdvoj\u00e1\u0159 na PHP\u201c<\/a><\/noindex>, tradi\u010dn\u011b s v\u00e1mi sd\u00edl\u00edme p\u0159eklad u\u017eite\u010dn\u00e9ho materi\u00e1lu.<\/p>\n<p>Software st\u00e1le v\u00edce \u0159e\u0161\u00ed ka\u017edodenn\u00ed \u00fakoly a z\u00e1rove\u0148 se st\u00e1v\u00e1 slo\u017eit\u011bj\u0161\u00edm. Jak jednou \u0159ekl Marc Andreessen, pohlcuje sv\u011bt. <\/p>\n<p><img decoding=\"async\" alt=\"Principy v\u00fdvoje modern\u00edch aplikac\u00ed od NGINX. \u010c\u00e1st 1\" src=\"\/wp-content\/uploads\/928924e3036beaac518dd4a2674a8a30.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV d\u016fsledku toho se v posledn\u00edch n\u011bkolika letech p\u0159\u00edstupy k v\u00fdvoji a dod\u00e1vce aplikac\u00ed v\u00e1\u017en\u011b zm\u011bnily. Bylo to tektonick\u00e9 posunut\u00ed, kter\u00e9 vedlo k rozvoji \u0159ady princip\u016f. Tyto principy se uk\u00e1zaly jako u\u017eite\u010dn\u00e9 p\u0159i formov\u00e1n\u00ed t\u00fdmu, n\u00e1vrhu, v\u00fdvoji a dod\u00e1vce va\u0161\u00ed aplikace koncov\u00fdm u\u017eivatel\u016fm. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Principy lze shrnout n\u00e1sledovn\u011b: <i>aplikace by m\u011bla b\u00fdt mal\u00e1, s\u00ed\u0165ov\u00e1 a m\u00edt architekturu zam\u011b\u0159enou na v\u00fdvoj\u00e1\u0159e<\/i>. Na t\u011bchto t\u0159ech principech m\u016f\u017eete vytvo\u0159it spolehlivou, komplexn\u00ed aplikaci, kter\u00e1 m\u016f\u017ee b\u00fdt rychle a bezpe\u010dn\u011b dod\u00e1na koncov\u00e9mu u\u017eivateli a snadno \u0161k\u00e1lov\u00e1na a roz\u0161i\u0159ov\u00e1na.<\/p>\n<p><img decoding=\"async\" alt=\"Principy v\u00fdvoje modern\u00edch aplikac\u00ed od NGINX. \u010c\u00e1st 1\" src=\"\/wp-content\/uploads\/9116869a53fb6cf89d92f1d507d7904f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKa\u017ed\u00fd z uveden\u00fdch princip\u016f m\u00e1 \u0159adu aspekt\u016f, kter\u00e9 prodiskutujeme, abychom uk\u00e1zali, jak ka\u017ed\u00fd princip p\u0159isp\u00edv\u00e1 k dosa\u017een\u00ed kone\u010dn\u00e9ho c\u00edle, j\u00edm\u017e je rychl\u00e9 dod\u00e1n\u00ed spolehliv\u00fdch aplikac\u00ed, kter\u00e9 jsou snadn\u00e9 na \u00fadr\u017ebu a pou\u017e\u00edv\u00e1n\u00ed. Budeme zkoumat principy ve srovn\u00e1n\u00ed s jejich protiklady, abychom objasnili, co znamen\u00e1, dejme tomu, \u201eUjist\u011bte se, \u017ee pou\u017e\u00edv\u00e1te <i>princip malosti<\/i>\u00bb.<\/p>\n<p>Douf\u00e1me, \u017ee v\u00e1s tento \u010dl\u00e1nek povzbud\u00ed k pou\u017eit\u00ed doporu\u010den\u00fdch princip\u016f pro budov\u00e1n\u00ed modern\u00edch aplikac\u00ed, kter\u00e9 zajist\u00ed jednotn\u00fd p\u0159\u00edstup k n\u00e1vrhu v kontextu nep\u0159etr\u017eit\u011b rostouc\u00edho technologick\u00e9ho stacku. <\/p>\n<p>Aplikac\u00ed t\u011bchto princip\u016f zjist\u00edte, \u017ee sledujete nejnov\u011bj\u0161\u00ed trendy ve v\u00fdvoji softwaru, v\u010detn\u011b p\u0159\u00edstupu <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/devops\/\">DevOps<\/a><\/noindex> k v\u00fdvoji a dod\u00e1vce aplikac\u00ed, pou\u017e\u00edv\u00e1n\u00ed kontejner\u016f (nap\u0159\u00edklad <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/docker\/\">Docker<\/a><\/noindex>) a framework\u016f pro orchestraci kontejner\u016f (nap\u0159\u00edklad <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/kubernetes\/\">Kubernetes<\/a><\/noindex>), pou\u017e\u00edv\u00e1n\u00ed mikroservis\u016f (v\u010detn\u011b Mikroservisn\u00ed architektury <noindex>NGINX<\/noindex> a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/what-is-a-service-mesh\/\">architektura s\u00ed\u0165ov\u00e9 komunikace<\/a><\/noindex> pro mikroservisn\u00ed aplikace.<\/p>\n<p><b>Co je modern\u00ed aplikace?<\/b><\/p>\n<p>Modern\u00ed aplikace? Modern\u00ed stack? Co p\u0159esn\u011b znamen\u00e1 \u201emodern\u00ed\u201c? <\/p>\n<p>V\u011bt\u0161ina v\u00fdvoj\u00e1\u0159\u016f m\u00e1 jen obecnou p\u0159edstavu o tom, z \u010deho se skl\u00e1d\u00e1 modern\u00ed aplikace, a proto je nutn\u00e9 poskytnout jasn\u00e9 vymezen\u00ed tohoto pojmu.<\/p>\n<p>Modern\u00ed aplikace podporuje n\u011bkolik klient\u016f, a\u0165 u\u017e je to u\u017eivatelsk\u00e9 rozhran\u00ed na knihovn\u011b JavaScript React, mobiln\u00ed aplikace pro Android nebo iOS, nebo aplikace, kter\u00e1 se p\u0159ipojuje k jin\u00e9mu prost\u0159ednictv\u00edm API. Modern\u00ed aplikace p\u0159edpokl\u00e1d\u00e1 existenci neur\u010dit\u00e9ho po\u010dtu klient\u016f, pro kter\u00e9 poskytuje data nebo slu\u017eby.<\/p>\n<p>Modern\u00ed aplikace poskytuje API pro p\u0159\u00edstup k po\u017eadovan\u00fdm dat\u016fm a slu\u017eb\u00e1m. API by m\u011blo b\u00fdt nem\u011bnn\u00e9 a st\u00e1l\u00e9, nikoli napsan\u00e9 konkr\u00e9tn\u011b pro specifick\u00fd po\u017eadavek z konkr\u00e9tn\u00edho klienta. API je dostupn\u00e9 p\u0159es HTTP(S) a zaji\u0161\u0165uje p\u0159\u00edstup ke v\u0161em funkc\u00edm, kter\u00e9 jsou dostupn\u00e9 v GUI nebo CLI. <\/p>\n<p>Data by m\u011bla b\u00fdt dostupn\u00e1 ve standardn\u00edm, kompatibiln\u00edm form\u00e1tu, jako je JSON. API poskytuje objekty a slu\u017eby v srozumiteln\u00e9, organizovan\u00e9 podob\u011b, nap\u0159\u00edklad RESTful API nebo GraphQL poskytuj\u00ed p\u0159ehledn\u00e9 rozhran\u00ed.<\/p>\n<p>Modern\u00ed aplikace jsou postaveny na modern\u00edm stacku, a modern\u00ed stack je ten stack, kter\u00fd takov\u00e9 aplikace podporuje. Tento stack umo\u017e\u0148uje v\u00fdvoj\u00e1\u0159i snadno vytv\u00e1\u0159et aplikaci s HTTP rozhran\u00edm a jasn\u00fdmi koncov\u00fdmi body API. Zvolen\u00fd p\u0159\u00edstup umo\u017en\u00ed va\u0161\u00ed aplikaci snadno p\u0159ij\u00edmat a pos\u00edlat data ve form\u00e1tu JSON. Jin\u00fdmi slovy, modern\u00ed stack odpov\u00edd\u00e1 prvk\u016fm Dvan\u00e1cti faktorov\u00e9 aplikace. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/microservices-reference-architecture-nginx-twelve-factor-app\/\">mikroslu\u017eby<\/a><\/noindex>. <\/p>\n<p>Popul\u00e1rn\u00ed verze tohoto typu stacku jsou zalo\u017eeny na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-photoresizer\">Javy<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-user-manager\">CouchDB<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-photouploader\">Node<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-album-manager\">Ruby<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-pages\">PHP<\/a><\/noindex> a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-content-service\">Go<\/a><\/noindex>. Mikroslu\u017ebov\u00e1 architektura <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-ingenious\">NGINX<\/a><\/noindex> z p\u0159edstavuje p\u0159\u00edklad modern\u00edho stacku realizovan\u00e9ho v ka\u017ed\u00e9m z uveden\u00fdch jazyk\u016f.<\/p>\n<p>V\u0161imn\u011bte si, \u017ee nepropagujeme v\u00fdhradn\u011b mikroslu\u017ebov\u00fd p\u0159\u00edstup. Mnoz\u00ed z v\u00e1s pracuj\u00ed s monolity, kter\u00e9 se mus\u00ed rozv\u00edjet, zat\u00edmco jin\u00ed se zab\u00fdvaj\u00ed SOA aplikacemi, kter\u00e9 se roz\u0161i\u0159uj\u00ed a vyv\u00edjej\u00ed, aby se staly mikroslu\u017ebov\u00fdmi aplikacemi. N\u011bkte\u0159\u00ed se orientuj\u00ed na implementaci bezserverov\u00fdch (serverless) aplikac\u00ed a n\u011bkte\u0159\u00ed zav\u00e1d\u011bj\u00ed kombinace v\u00fd\u0161e zm\u00edn\u011bn\u00e9ho. Principy uveden\u00e9 v \u010dl\u00e1nku jsou aplikovateln\u00e9 na ka\u017ed\u00fd z t\u011bchto syst\u00e9m\u016f s n\u011bkolika drobn\u00fdmi \u00fapravami. <\/p>\n<p><b>Principy<\/b><\/p>\n<p>Nyn\u00ed, kdy\u017e jsme dos\u00e1hli spole\u010dn\u00e9ho porozum\u011bn\u00ed, co vlastn\u011b modern\u00ed aplikace a modern\u00ed tech stack obn\u00e1\u0161ej\u00ed, je \u010das pono\u0159it se do z\u00e1sad architektury a v\u00fdvoje, kter\u00e9 v\u00e1m pomohou v navrhov\u00e1n\u00ed, implementaci a \u00fadr\u017eb\u011b modern\u00ed aplikace.<\/p>\n<p>Jedna z t\u011bchto z\u00e1sad zn\u00ed: \u201evytv\u00e1\u0159ejte mal\u00e9 aplikace\u201c, poj\u010fme ji jednodu\u0161e nazvat <i>principem malosti<\/i>. Existuj\u00ed neuv\u011b\u0159iteln\u011b slo\u017eit\u00e9 aplikace, kter\u00e9 se skl\u00e1daj\u00ed z velk\u00e9ho mno\u017estv\u00ed pohybliv\u00fdch komponent\u016f. Na druhou stranu stavba aplikace z mal\u00fdch diskr\u00e9tn\u00edch komponent\u016f usnad\u0148uje jej\u00ed n\u00e1vrh, \u00fadr\u017ebu a celkovou pr\u00e1ci s n\u00ed. (V\u0161imn\u011bte si, \u017ee jsme \u0159ekli \u201eusnad\u0148uje\u201c, nikoli \u201e\u010din\u00ed jednoduchou\u201c).<\/p>\n<p>Druh\u00e1 z\u00e1sada spo\u010d\u00edv\u00e1 v tom, \u017ee m\u016f\u017eeme zv\u00fd\u0161it produktivitu v\u00fdvoj\u00e1\u0159\u016f t\u00edm, \u017ee jim pom\u016f\u017eeme soust\u0159edit se na funkce, kter\u00e9 vyv\u00edjej\u00ed, a z\u00e1rove\u0148 je osvobod\u00edme od starost\u00ed o infrastrukturu a CI\/CD b\u011bhem implementace. Tak\u017ee, zkr\u00e1cen\u011b \u0159e\u010deno, n\u00e1\u0161 p\u0159\u00edstup <i>je zam\u011b\u0159en na v\u00fdvoj\u00e1\u0159e<\/i>.<\/p>\n<p>Nakonec by v\u0161e, co se t\u00fdk\u00e1 va\u0161\u00ed aplikace, m\u011blo b\u00fdt p\u0159ipojeno k s\u00edti. B\u011bhem posledn\u00edch 20 let jsme se v\u00fdrazn\u011b posunuli sm\u011brem k s\u00ed\u0165ov\u00e9 budoucnosti, jeliko\u017e s\u00edt\u011b se staly rychlej\u0161\u00edmi a aplikace slo\u017eit\u011bj\u0161\u00edmi. Jak jsme ji\u017e zjistili, modern\u00ed aplikace by m\u011bly b\u00fdt pou\u017e\u00edv\u00e1ny p\u0159es s\u00ed\u0165 mnoha r\u016fzn\u00fdmi klienty. Aplikace my\u0161len\u00ed o s\u00edti v architektu\u0159e p\u0159in\u00e1\u0161\u00ed zna\u010dn\u00e9 v\u00fdhody, kter\u00e9 se dob\u0159e sb\u00edhaj\u00ed s <i>principem malosti<\/i> a konceptem p\u0159\u00edstupu, <i>zam\u011b\u0159en\u00e9ho na v\u00fdvoj\u00e1\u0159e<\/i>.<\/p>\n<p>Pokud budete b\u011bhem v\u00fdvoje a implementace aplikace m\u00edt na pam\u011bti uveden\u00e9 z\u00e1sady, budete m\u00edt nepopirateln\u00e9 v\u00fdhody v rozvoji a dod\u00e1n\u00ed va\u0161eho produktu.<\/p>\n<p>Pod\u00edvejme se nyn\u00ed podrobn\u011bji na tyto t\u0159i z\u00e1sady.<\/p>\n<p><b>Princip malosti<\/b><\/p>\n<p>Lidsk\u00e9mu mozku se obt\u00ed\u017en\u011b vn\u00edm\u00e1 velk\u00e9 mno\u017estv\u00ed informac\u00ed najednou. V psychologii term\u00edn kognitivn\u00ed z\u00e1t\u011b\u017e ozna\u010duje celkov\u00e9 mno\u017estv\u00ed du\u0161evn\u00edho \u00fasil\u00ed pot\u0159ebn\u00e9ho k udr\u017een\u00ed informac\u00ed v pam\u011bti. Sn\u00ed\u017een\u00ed kognitivn\u00ed z\u00e1t\u011b\u017ee na v\u00fdvoj\u00e1\u0159e je prioritou, proto\u017ee v takov\u00e9m p\u0159\u00edpad\u011b se mohou soust\u0159edit na \u0159e\u0161en\u00ed probl\u00e9m\u016f, m\u00edsto aby museli ve sv\u00e9 mysli udr\u017eovat aktu\u00e1ln\u00ed slo\u017eit\u00fd model cel\u00e9 aplikace a vyv\u00edjen\u00fdch funkc\u00ed. <\/p>\n<p><img decoding=\"async\" alt=\"Principy v\u00fdvoje modern\u00edch aplikac\u00ed od NGINX. \u010c\u00e1st 1\" src=\"\/wp-content\/uploads\/26df2016a46d8b82b45832fe1df9bf23.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Aplikace se dekonstruktuj\u00ed z n\u00e1sleduj\u00edc\u00edch d\u016fvod\u016f:<\/p>\n<ul>\n<li>Sn\u00ed\u017een\u00ed kognitivn\u00ed z\u00e1t\u011b\u017ee pro v\u00fdvoj\u00e1\u0159e;<\/li>\n<li>Zrychlen\u00ed a zjednodu\u0161en\u00ed testov\u00e1n\u00ed;<\/li>\n<li>Rychl\u00e9 dod\u00e1n\u00ed zm\u011bn v aplikaci.<\/li>\n<\/ul>\n<p><\/i><br \/>\nExistuje n\u011bkolik zp\u016fsob\u016f, jak sn\u00ed\u017eit kognitivn\u00ed z\u00e1t\u011b\u017e pro v\u00fdvoj\u00e1\u0159e, a pr\u00e1v\u011b sem vstupuje princip mal\u00e9 velikosti.<\/p>\n<p>Tak\u017ee t\u0159i zp\u016fsoby, jak sn\u00ed\u017eit kognitivn\u00ed z\u00e1t\u011b\u017e:<\/p>\n<ol>\n<li>Zkr\u00e1tit \u010dasov\u00e9 r\u00e1mce, na kter\u00e9 mus\u00ed br\u00e1t ohled p\u0159i v\u00fdvoji nov\u00e9 funkce \u2013 \u010d\u00edm krat\u0161\u00ed \u010dasov\u00fd r\u00e1mec, t\u00edm ni\u017e\u0161\u00ed kognitivn\u00ed z\u00e1t\u011b\u017e.<\/li>\n<li>Sn\u00ed\u017eit mno\u017estv\u00ed k\u00f3du, se kter\u00fdm je t\u0159eba pracovat najednou \u2013 m\u00e9n\u011b k\u00f3du = m\u00e9n\u011b z\u00e1t\u011b\u017ee.<\/li>\n<li>Zjednodu\u0161it proces prov\u00e1d\u011bn\u00ed inkrement\u00e1ln\u00edch zm\u011bn v aplikaci.<\/li>\n<\/ol>\n<p>\n<b>Sn\u00ed\u017een\u00ed \u010dasov\u00fdch r\u00e1mc\u016f v\u00fdvoje<\/b><\/p>\n<p>Vra\u0165me se do doby, kdy byla metodologie <code>waterfall<\/code> standardem v procesu v\u00fdvoje a \u010dasov\u00e9 r\u00e1mce od \u0161esti m\u011bs\u00edc\u016f do dvou let pro v\u00fdvoj nebo aktualizaci aplikace byly b\u011b\u017enou prax\u00ed. Obvykle in\u017een\u00fd\u0159i nejprve p\u0159e\u010detli p\u0159\u00edslu\u0161n\u00e9 dokumenty, jako jsou po\u017eadavky na produkt (PRD), syst\u00e9mov\u00fd referen\u010dn\u00ed dokument (SRD), pl\u00e1n architektury a za\u010dali tyto v\u011bci spojovat do jedn\u00e9 kognitivn\u00ed modelu, podle kter\u00e9 psali k\u00f3d. Jak se po\u017eadavky a tud\u00ed\u017e architektura m\u011bnily, bylo t\u0159eba vynalo\u017eit velk\u00e9 \u00fasil\u00ed na informov\u00e1n\u00ed cel\u00e9ho t\u00fdmu o aktualizac\u00edch kognitivn\u00edho modelu. Tento p\u0159\u00edstup v nejhor\u0161\u00edm p\u0159\u00edpad\u011b mohl pr\u00e1ci doslova paralyzovat.<\/p>\n<p>Nejv\u011bt\u0161\u00ed zm\u011bnou v procesu v\u00fdvoje aplikac\u00ed bylo zaveden\u00ed metodologie agile. Jednou z hlavn\u00edch charakteristik metodologie <code>agile<\/code> je iterativn\u00ed v\u00fdvoj. To pro zm\u011bnu vede ke sn\u00ed\u017een\u00ed kognitivn\u00ed z\u00e1t\u011b\u017ee pro in\u017een\u00fdry. M\u00edsto toho, aby t\u00fdm v\u00fdvoj\u00e1\u0159\u016f musel realizovat aplikaci b\u011bhem jednoho dlouh\u00e9ho cyklu, <code>agile<\/code> p\u0159\u00edstup umo\u017e\u0148uje soust\u0159edit se na mal\u00e9 objemy k\u00f3du, kter\u00e9 lze rychle otestovat a nasadit, p\u0159i\u010dem\u017e se z\u00edsk\u00e1 i zp\u011btn\u00e1 vazba. Kognitivn\u00ed z\u00e1t\u011b\u017e aplikace se posunula z \u010dasov\u00e9ho r\u00e1mce od \u0161esti m\u011bs\u00edc\u016f do dvou let s ohledem na obrovsk\u00e9 mno\u017estv\u00ed specifikac\u00ed na dvout\u00fddenn\u00ed p\u0159id\u00e1n\u00ed nebo zm\u011bny funkce, zam\u011b\u0159en\u00e9 na je\u0161t\u011b rozmazan\u011bj\u0161\u00ed porozum\u011bn\u00ed velk\u00e9 aplikaci.<\/p>\n<p>Posun zam\u011b\u0159en\u00ed z masivn\u00edch aplikac\u00ed na konkr\u00e9tn\u00ed mal\u00e9 funkce, kter\u00e9 lze dokon\u010dit b\u011bhem dvout\u00fddenn\u00edho sprintu, p\u0159i\u010dem\u017e se d\u00edv\u00e1me dop\u0159edu maxim\u00e1ln\u011b na jednu funkci z n\u00e1sleduj\u00edc\u00edho sprintu, je zna\u010dn\u00e1 zm\u011bna. To p\u0159isp\u011blo k zv\u00fd\u0161en\u00ed produktivity v\u00fdvoje, p\u0159i\u010dem\u017e se sn\u00ed\u017eila kognitivn\u00ed z\u00e1t\u011b\u017e, kter\u00e1 neust\u00e1le kol\u00edsala.<\/p>\n<p>V metodologii <code>agile<\/code> se p\u0159edpokl\u00e1d\u00e1, \u017ee kone\u010dn\u00e1 aplikace bude pon\u011bkud pozm\u011bn\u011bnou verz\u00ed p\u016fvodn\u00ed koncepce, a proto je kone\u010dn\u00fd bod v\u00fdvoje nezbytn\u011b nejasn\u00fd. Jasn\u00e9 a p\u0159esn\u00e9 mohou b\u00fdt pouze v\u00fdsledky ka\u017ed\u00e9ho konkr\u00e9tn\u00edho sprintu.<\/p>\n<p><b>Mal\u00e9 k\u00f3dov\u00e9 b\u00e1ze<\/b><\/p>\n<p>Dal\u0161\u00edm krokem ke sn\u00ed\u017een\u00ed kognitivn\u00ed z\u00e1t\u011b\u017ee je zmen\u0161en\u00ed k\u00f3dov\u00e9 b\u00e1ze. Obecn\u011b plat\u00ed, \u017ee modern\u00ed aplikace jsou masivn\u00ed \u2013 spolehliv\u00e1 firemn\u00ed aplikace m\u016f\u017ee obsahovat tis\u00edce soubor\u016f a stovky tis\u00edc \u0159\u00e1dk\u016f k\u00f3du. V z\u00e1vislosti na organizaci soubor\u016f mohou b\u00fdt vazby a z\u00e1vislosti k\u00f3du a soubor\u016f z\u0159ejm\u00e9, nebo naopak. I lad\u011bn\u00ed samotn\u00e9ho prov\u00e1d\u011bn\u00ed k\u00f3du m\u016f\u017ee zp\u016fsobovat probl\u00e9my v z\u00e1vislosti na pou\u017eit\u00fdch knihovn\u00e1ch a na tom, jak dob\u0159e ladic\u00ed n\u00e1stroje odd\u011bluj\u00ed knihovny\/pakety\/moduly a u\u017eivatelsk\u00fd k\u00f3d.<\/p>\n<p>Vytvo\u0159en\u00ed funk\u010dn\u00ed ment\u00e1ln\u00ed modelu k\u00f3du aplikace m\u016f\u017ee zabrat zna\u010dn\u00e9 mno\u017estv\u00ed \u010dasu a op\u011bt klade na v\u00fdvoj\u00e1\u0159e vysokou kognitivn\u00ed z\u00e1t\u011b\u017e. To je obzvl\u00e1\u0161\u0165 charakteristick\u00e9 pro monolitn\u00ed k\u00f3dov\u00e9 z\u00e1klady, kde je velk\u00e9 mno\u017estv\u00ed k\u00f3du, jeho\u017e interakce mezi jednotliv\u00fdmi funk\u010dn\u00edmi komponentami nen\u00ed jasn\u011b definov\u00e1na, a rozd\u011blen\u00ed p\u0159edm\u011bt\u016f pozornosti je \u010dasto rozmazan\u00e9, proto\u017ee funk\u010dn\u00ed hranice nejsou dodr\u017eov\u00e1ny. <\/p>\n<p>Jedn\u00edm z efektivn\u00edch zp\u016fsob\u016f, jak sn\u00ed\u017eit kognitivn\u00ed z\u00e1t\u011b\u017e na in\u017een\u00fdry, je p\u0159echod na mikroslu\u017eby. V p\u0159\u00edstupu k mikroslu\u017eb\u00e1m se ka\u017ed\u00fd servis zam\u011b\u0159uje na jeden soubor funkc\u00ed; smysl slu\u017eby je obvykle definov\u00e1n a srozumiteln\u00fd. Hranice slu\u017eby jsou tak\u00e9 jasn\u00e9 \u2013 pamatujte, \u017ee komunikace se slu\u017ebou prob\u00edh\u00e1 pomoc\u00ed API, tak\u017ee data generovan\u00e1 jednou slu\u017ebou mohou b\u00fdt snadno p\u0159ed\u00e1na do jin\u00e9.<\/p>\n<p>Interakce s jin\u00fdmi slu\u017ebami je obvykle omezena na n\u011bkolik u\u017eivatelsk\u00fdch slu\u017eeb a n\u011bkolik slu\u017eeb poskytovatele, kter\u00e9 vyu\u017e\u00edvaj\u00ed jednoduch\u00e9 a p\u0159ehledn\u00e9 API vol\u00e1n\u00ed, nap\u0159\u00edklad pomoc\u00ed REST. To znamen\u00e1, \u017ee kognitivn\u00ed z\u00e1t\u011b\u017e na in\u017een\u00fdra se v\u00fdrazn\u011b sni\u017euje. Nejt\u011b\u017e\u0161\u00edm \u00fakolem z\u016fst\u00e1v\u00e1 pochopen\u00ed modelu interakce slu\u017eeb a toho, jak nap\u0159\u00edklad transakce prob\u00edhaj\u00ed mezi v\u00edce slu\u017ebami. V\u00fdsledkem je, \u017ee pou\u017e\u00edv\u00e1n\u00ed mikroservis\u016f sni\u017euje kognitivn\u00ed z\u00e1t\u011b\u017e, zmen\u0161uje mno\u017estv\u00ed k\u00f3du, vyty\u010duje jasn\u00e9 hranice slu\u017eby a zaji\u0161\u0165uje pochopen\u00ed vztah\u016f mezi u\u017eivateli a poskytovateli.<\/p>\n<p><b>Mal\u00e9 inkrement\u00e1ln\u00ed zm\u011bny<\/b><\/p>\n<p>Posledn\u00ed prvek principu <i>mali\u010dkosti<\/i> \u2013 je to \u0159\u00edzen\u00ed zm\u011bn. Zvl\u00e1\u0161tn\u00edm poku\u0161en\u00edm pro v\u00fdvoj\u00e1\u0159e je pod\u00edvat se na k\u00f3dovou z\u00e1kladnu (dokonce mo\u017en\u00e1 na sv\u016fj vlastn\u00ed, star\u0161\u00ed k\u00f3d) a prohl\u00e1sit: \u201eTo je hrozn\u00e9, v\u0161echno to mus\u00edme p\u0159epsat.\u201c N\u011bkdy je to spr\u00e1vn\u00e9 rozhodnut\u00ed, jindy ne. T\u00edm se na v\u00fdvoj\u00e1\u0159sk\u00fd t\u00fdm nalo\u017e\u00ed b\u0159emeno glob\u00e1ln\u00ed zm\u011bny modelu, co\u017e zase vede k rozs\u00e1hl\u00e9 kognitivn\u00ed z\u00e1t\u011b\u017ei. Je lep\u0161\u00ed, aby se in\u017een\u00fd\u0159i soust\u0159edili na zm\u011bny, kter\u00e9 mohou prov\u00e9st b\u011bhem sprintu, aby pot\u00e9 v\u010das nasadili pot\u0159ebnou funk\u010dnost, i kdy\u017e postupn\u011b. Kone\u010dn\u00fd produkt by m\u011bl p\u0159ipom\u00ednat p\u0159edem napl\u00e1novan\u00fd, ale s n\u011bkter\u00fdmi \u00fapravami a testov\u00e1n\u00edm, aby vyhovoval pot\u0159eb\u00e1m klienta.<\/p>\n<p>P\u0159i p\u0159episov\u00e1n\u00ed velk\u00fdch \u010d\u00e1st\u00ed k\u00f3du se n\u011bkdy rychle realizovat dod\u00e1n\u00ed zm\u011bn zd\u00e1 nemo\u017en\u00e9, proto\u017ee zde vstupuj\u00ed do hry jin\u00e9 z\u00e1vislosti syst\u00e9mu. Pro \u0159\u00edzen\u00ed toku zm\u011bn lze pou\u017e\u00edt skr\u00fdv\u00e1n\u00ed funkc\u00ed (feature hiding). V podstat\u011b to znamen\u00e1, \u017ee funkce je v produkci, ale nen\u00ed p\u0159\u00edstupn\u00e1 pomoc\u00ed nastaven\u00ed prom\u011bnn\u00fdch prost\u0159ed\u00ed (env-var) nebo jin\u00e9ho mechanismu konfigurace. Pokud k\u00f3d pro\u0161el v\u0161emi procesy kontroly kvality, m\u016f\u017ee se ocitnout v produkci ve skryt\u00e9m stavu. Tato strategie v\u0161ak funguje pouze v p\u0159\u00edpad\u011b, \u017ee funkce bude nakonec povolena. V opa\u010dn\u00e9m p\u0159\u00edpad\u011b bude pouze zane\u0159\u00e1\u010fovat k\u00f3d a p\u0159id\u00e1 kognitivn\u00ed z\u00e1t\u011b\u017e, kterou bude muset v\u00fdvoj\u00e1\u0159 zvl\u00e1dnout pro produktivn\u00ed pr\u00e1ci. \u0158\u00edzen\u00ed zm\u011bn a inkrement\u00e1ln\u00ed zm\u011bny samy o sob\u011b pom\u00e1haj\u00ed udr\u017eovat kognitivn\u00ed z\u00e1t\u011b\u017e v\u00fdvoj\u00e1\u0159\u016f na dostupn\u00e9 \u00farovni. <\/p>\n<p>In\u017een\u00fd\u0159i se mus\u00ed vyrovn\u00e1vat s mnoha komplikacemi, i p\u0159i jednoduch\u00e9m zav\u00e1d\u011bn\u00ed nov\u00fdch funkcionalit. Z pohledu managementu by bylo rozumn\u00e9 sn\u00ed\u017eit nadbyte\u010dn\u00e9 zat\u00ed\u017een\u00ed t\u00fdmu, aby se mohl soust\u0159edit na kl\u00ed\u010dov\u00e9 prvky funkcionality. Existuj\u00ed t\u0159i v\u011bci, kter\u00e9 m\u016f\u017eete ud\u011blat, abyste pomohli sv\u00e9mu t\u00fdmu v\u00fdvoj\u00e1\u0159\u016f:<\/p>\n<ol>\n<li>Pou\u017e\u00edvat metodologii <code>agile<\/code>, aby se omezil \u010dasov\u00fd r\u00e1mec, ve kter\u00e9m se t\u00fdm mus\u00ed soust\u0159edit na kl\u00ed\u010dov\u00e9 funkce.<\/li>\n<li>Implementovat svou aplikaci jako n\u011bkolik mikroslu\u017eeb. To omez\u00ed po\u010det zav\u00e1d\u011bn\u00fdch funkc\u00ed a pos\u00edl\u00ed hranice, kter\u00e9 udr\u017euj\u00ed kognitivn\u00ed z\u00e1t\u011b\u017e b\u011bhem pr\u00e1ce.<\/li>\n<li>Preferujte inkrement\u00e1ln\u00ed zm\u011bny p\u0159ed velk\u00fdmi a objemn\u00fdmi, m\u011b\u0148te mal\u00e9 \u010d\u00e1sti k\u00f3du. Pou\u017e\u00edvejte skr\u00fdv\u00e1n\u00ed funkc\u00ed, abyste realizovali zm\u011bny, i kdy\u017e nebudou viditeln\u00e9 hned po p\u0159id\u00e1n\u00ed.<\/li>\n<\/ol>\n<p>\nPokud ve sv\u00e9 pr\u00e1ci zohledn\u00edte princip malosti, v\u00e1\u0161 t\u00fdm se stane mnohem \u0161\u0165astn\u011bj\u0161\u00edm, l\u00e9pe se zam\u011b\u0159\u00ed na realizaci pot\u0159ebn\u00fdch funkc\u00ed a s v\u011bt\u0161\u00ed pravd\u011bpodobnost\u00ed rychleji zavede kvalitn\u00ed zm\u011bny. To ale neznamen\u00e1, \u017ee pr\u00e1ce nem\u016f\u017ee b\u00fdt slo\u017eit\u011bj\u0161\u00ed; n\u011bkdy naopak m\u016f\u017ee implementace nov\u00fdch funkc\u00ed vy\u017eadovat modifikaci n\u011bkolika slu\u017eeb, a tento proces m\u016f\u017ee b\u00fdt slo\u017eit\u011bj\u0161\u00ed ne\u017e v monolitick\u00e9 architektu\u0159e. V ka\u017ed\u00e9m p\u0159\u00edpad\u011b st\u00e1ly v\u00fdhody p\u0159\u00edstupu malosti za to.<\/p>\n<p>Konec prvn\u00ed \u010d\u00e1sti.<\/p>\n<p>Brzy zve\u0159ejn\u00edme druhou \u010d\u00e1st p\u0159ekladu, a zat\u00edm \u010dek\u00e1me na va\u0161e koment\u00e1\u0159e a zveme v\u00e1s na <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/mJ6e\/\">den otev\u0159en\u00fdch dve\u0159\u00ed<\/a><\/noindex>, kter\u00fd se kon\u00e1 ji\u017e dnes v 20:00.<br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/452748\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f. \u0412 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u0443\u0440\u0441\u0430 \u00abBackend \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430 PHP\u00bb, \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u0432\u0441\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0441\u044c \u0432\u0441\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u041a\u0430\u043a \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u0441\u043a\u0430\u0437\u0430\u043b \u041c\u0430\u0440\u043a \u0410\u043d\u0434\u0440\u0435\u0441\u0441\u0435\u043d, \u043e\u043d\u043e \u043f\u043e\u0433\u043b\u043e\u0449\u0430\u0435\u0442 \u043c\u0438\u0440. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043b\u0435\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-34140","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043e\u0442 NGINX. \u0427\u0430\u0441\u0442\u044c 1 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:56:35+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:56:35+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Principy v\u00fdvoje modern\u00edch aplikac\u00ed od NGINX. \u010c\u00e1st 1 | ProHoster","description":"Ahoj, p\u0159\u00e1tel\u00e9.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043e\u0442 NGINX. \u0427\u0430\u0441\u0442\u044c 1 | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f.","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:56:35+00:00","article:modified_time":"2019-10-31T18:56:35+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"34140","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 18:05:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:27:30","updated":"2026-01-21 18:05:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/34140","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=34140"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/34140\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=34140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=34140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=34140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}