{"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\/sk\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","title":{"rendered":"Princ\u00edpy v\u00fdvoja modern\u00fdch aplik\u00e1ci\u00ed od NGINX. \u010cas\u0165 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ahojte, priatelia. Pred spusten\u00edm kurzu <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/h4Ez\/\">\u201eBackend developer na PHP\u201c<\/a><\/noindex>, tradi\u010dne sa s vami del\u00edme o preklad u\u017eito\u010dn\u00e9ho materi\u00e1lu.<\/p>\n<p>Softv\u00e9r rie\u0161i \u010doraz viac ka\u017edodenn\u00fdch \u00faloh, pri\u010dom sa st\u00e1va st\u00e1le zlo\u017eitej\u0161\u00edm. Ako raz povedal Marc Andreessen, pohlt\u00ed svet. <\/p>\n<p><img decoding=\"async\" alt=\"Princ\u00edpy v\u00fdvoja modern\u00fdch aplik\u00e1ci\u00ed od NGINX. \u010cas\u0165 1\" src=\"\/wp-content\/uploads\/928924e3036beaac518dd4a2674a8a30.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV d\u00f4sledku toho sa v posledn\u00fdch rokoch pr\u00edstupy k v\u00fdvoju a dod\u00e1vaniu aplik\u00e1ci\u00ed v\u00e1\u017ene zmenili. Boli to posuny tektonick\u00e9ho rozsahu, ktor\u00e9 viedli k vzniku s\u00faboru princ\u00edpov. Tieto princ\u00edpy sa uk\u00e1zali ako u\u017eito\u010dn\u00e9 pri formovan\u00ed t\u00edmov, navrhovan\u00ed, v\u00fdvoji a doru\u010dovan\u00ed va\u0161ich aplik\u00e1ci\u00ed koncov\u00fdm pou\u017e\u00edvate\u013eom. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Princ\u00edpy m\u00f4\u017eu by\u0165 zhrnut\u00e9 nasledovne: <i>aplik\u00e1cia by mala by\u0165 mal\u00e1, sie\u0165ov\u00e1 a ma\u0165 architekt\u00faru orientovan\u00fa na v\u00fdvoj\u00e1ra<\/i>. Opieraj\u00fac sa o tieto tri princ\u00edpy, m\u00f4\u017eete vytvori\u0165 robustn\u00fa, komplexn\u00fa aplik\u00e1ciu, ktor\u00fa m\u00f4\u017eete r\u00fdchlo a bezpe\u010dne doru\u010di\u0165 koncov\u00e9mu pou\u017e\u00edvate\u013eovi a z\u00e1rove\u0148 je \u013eahko \u0161k\u00e1lovate\u013en\u00e1 a roz\u0161\u00edrite\u013en\u00e1.<\/p>\n<p><img decoding=\"async\" alt=\"Princ\u00edpy v\u00fdvoja modern\u00fdch aplik\u00e1ci\u00ed od NGINX. \u010cas\u0165 1\" src=\"\/wp-content\/uploads\/9116869a53fb6cf89d92f1d507d7904f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKa\u017ed\u00fd z navrhovan\u00fdch princ\u00edpov m\u00e1 mno\u017estvo aspektov, ktor\u00e9 sa pok\u00fasime presk\u00fama\u0165, aby sme uk\u00e1zali, ako ka\u017ed\u00fd princ\u00edp prispieva k dosiahnutiu kone\u010dn\u00e9ho cie\u013ea, ktor\u00fdm je r\u00fdchle dodanie spo\u013eahliv\u00fdch aplik\u00e1ci\u00ed, ktor\u00e9 s\u00fa jednoduch\u00e9 na \u00fadr\u017ebu a pou\u017e\u00edvanie. Budeme sk\u00fama\u0165 princ\u00edpy v porovnan\u00ed s ich protikladmi, aby sme objasnili, \u010do znamen\u00e1, povedzme, \"Uistite sa, \u017ee pou\u017e\u00edvate <i>princ\u00edp malosti<\/i>\u00bb.<\/p>\n<p>D\u00fafame, \u017ee tento \u010dl\u00e1nok v\u00e1s podnieti k tomu, aby ste pou\u017e\u00edvali navrhovan\u00e9 princ\u00edpy v\u00fdstavby modern\u00fdch aplik\u00e1ci\u00ed, ktor\u00e9 poskytn\u00fa jednotn\u00fd pr\u00edstup k navrhovaniu v kontexte neust\u00e1le rast\u00faceho technick\u00e9ho stacku. <\/p>\n<p>Aplikovan\u00edm t\u00fdchto princ\u00edpov zist\u00edte, \u017ee sa dr\u017e\u00edte najnov\u0161\u00edch trendov vo v\u00fdvoji softv\u00e9ru, vr\u00e1tane pr\u00edstupu <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/devops\/\">DevOps<\/a><\/noindex> k v\u00fdvoju a dod\u00e1vaniu aplik\u00e1ci\u00ed, vyu\u017e\u00edvanie kontajnerov (napr\u00edklad, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/docker\/\">Docker<\/a><\/noindex>) a r\u00e1mcov pre orchestr\u00e1ciu kontajnerov (napr\u00edklad, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/kubernetes\/\">Kubernetes<\/a><\/noindex>), vyu\u017e\u00edvanie mikroslu\u017eieb (vr\u00e1tane Mikroslu\u017ebovej Architekt\u00fary <noindex>NGINX<\/noindex> a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/what-is-a-service-mesh\/\">architekt\u00fara sie\u0165ovej komunik\u00e1cie<\/a><\/noindex> pre mikroslu\u017ebov\u00e9 aplik\u00e1cie.<\/p>\n<p><b>\u010co je modern\u00e1 aplik\u00e1cia?<\/b><\/p>\n<p>Modern\u00e9 aplik\u00e1cie? Modern\u00fd stack? \u010co vlastne znamen\u00e1 \u201emodern\u00fd\"? <\/p>\n<p>V\u00e4\u010d\u0161ina v\u00fdvoj\u00e1rov m\u00e1 len v\u0161eobecn\u00fa predstavu o tom, \u010do tvor\u00ed modern\u00fa aplik\u00e1ciu, preto je potrebn\u00e9 poskytn\u00fa\u0165 jasn\u00fa defin\u00edciu tohto pojmu.<\/p>\n<p>Modern\u00e1 aplik\u00e1cia podporuje viacer\u00fdch klientov, \u010di u\u017e je to pou\u017e\u00edvate\u013esk\u00e9 rozhranie na kni\u017enici JavaScript React, mobiln\u00e1 aplik\u00e1cia pre Android alebo iOS, alebo aplik\u00e1cia, ktor\u00e1 sa sp\u00e1ja s inou prostredn\u00edctvom API. Modern\u00e1 aplik\u00e1cia predpoklad\u00e1 existenciu neobmedzen\u00e9ho po\u010dtu klientov, pre ktor\u00fdch poskytuje d\u00e1ta alebo slu\u017eby.<\/p>\n<p>Modern\u00e1 aplik\u00e1cia poskytuje API na pr\u00edstup k po\u017eadovan\u00fdm \u00fadajom a slu\u017eb\u00e1m. API by malo by\u0165 nemenn\u00e9 a trval\u00e9, a nie nap\u00edsan\u00e9 \u0161pecificky na konkr\u00e9tnu po\u017eiadavku z nejak\u00e9ho konkr\u00e9tneho klienta. API je dostupn\u00e9 cez HTTP(S) a poskytuje pr\u00edstup ku v\u0161etk\u00fdm funkci\u00e1m, ktor\u00e9 s\u00fa k dispoz\u00edcii v GUI alebo CLI. <\/p>\n<p>\u00dadaje by mali by\u0165 dostupn\u00e9 v be\u017enom, kompatibilnom form\u00e1te, ako je JSON. API poskytuje objekty a slu\u017eby v zrozumite\u013enej, usporiadanej forme, napr\u00edklad RESTful API alebo GraphQL poskytuj\u00fa vyhovuj\u00face rozhranie.<\/p>\n<p>Modern\u00e9 aplik\u00e1cie s\u00fa postaven\u00e9 na modernom stacku, a modern\u00fd stack je ten stack, ktor\u00fd podporuje tak\u00e9to aplik\u00e1cie. Tak\u00fdto stack umo\u017e\u0148uje v\u00fdvoj\u00e1rovi \u013eahko vytvori\u0165 aplik\u00e1ciu s HTTP rozhran\u00edm a jasn\u00fdmi koncov\u00fdmi bodmi API. Zvolen\u00fd pr\u00edstup umo\u017en\u00ed va\u0161ej aplik\u00e1cii \u013eahko prij\u00edma\u0165 a posiela\u0165 d\u00e1ta vo form\u00e1te JSON. In\u00fdmi slovami, modern\u00fd stack zodpoved\u00e1 prvkom Dvan\u00e1stich faktorov aplik\u00e1cie pre <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\u00e1rne verzie tohto typu stacku s\u00fa zalo\u017een\u00e9 na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-photoresizer\">Java<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-user-manager\">Python<\/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>. Architekt\u00fara mikroslu\u017eieb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-ingenious\">NGINX<\/a><\/noindex> je pr\u00edkladom modern\u00e9ho stacku realizovan\u00e9ho v ka\u017edom z uveden\u00fdch jazykov.<\/p>\n<p>V\u0161imnite si, \u017ee nepropagujeme v\u00fdlu\u010dne mikroslu\u017eobn\u00fd pr\u00edstup. Mnoh\u00ed z v\u00e1s pracuj\u00fa s monolitmi, ktor\u00e9 sa musia rozv\u00edja\u0165, zatia\u013e \u010do in\u00ed sa zaoberaj\u00fa aplik\u00e1ciami SOA, ktor\u00e9 sa roz\u0161iruj\u00fa a vyv\u00edjaj\u00fa na mikroslu\u017eobn\u00e9 aplik\u00e1cie. T\u00ed tret\u00ed smeruj\u00fa k nasadeniu bezserverov\u00fdch aplik\u00e1ci\u00ed a niektor\u00ed implementuj\u00fa kombin\u00e1cie z uveden\u00e9ho. Princ\u00edpy uveden\u00e9 v \u010dl\u00e1nku s\u00fa aplikovate\u013en\u00e9 na ka\u017ed\u00fa z t\u00fdchto syst\u00e9mov len s nieko\u013ek\u00fdmi drobn\u00fdmi zmenami. <\/p>\n<p><b>Principy<\/b><\/p>\n<p>Teraz, ke\u010f sme dosiahli spolo\u010dn\u00e9 porozumenie toho, \u010do je modern\u00e1 aplik\u00e1cia a modern\u00fd stack, nastal \u010das ponori\u0165 sa do princ\u00edpov architekt\u00fary a v\u00fdvoja, ktor\u00e9 v\u00e1m dobre posl\u00fa\u017eia pri v\u00fdvoji, implement\u00e1cii a podpore modernej aplik\u00e1cie.<\/p>\n<p>Jeden z princ\u00edpov znie ako \u201evytv\u00e1rajte mal\u00e9 aplik\u00e1cie\u201c, nechajme to jednoducho nazva\u0165 <i>princ\u00edpom malosti<\/i>. Existuj\u00fa neuverite\u013ene zlo\u017eit\u00e9 aplik\u00e1cie, ktor\u00e9 sa skladaj\u00fa z ve\u013ek\u00e9ho mno\u017estva pohybliv\u00fdch komponentov. Na druhej strane, budovanie aplik\u00e1cie z mal\u00fdch diskr\u00e9tnych komponentov zjednodu\u0161uje jej n\u00e1vrh, \u00fadr\u017ebu a celkov\u00fa pr\u00e1cu s \u0148ou. (V\u0161imnite si, \u017ee sme povedali \u201ezjednodu\u0161uje\u201c, a nie \u201erob\u00ed jednoduch\u00fdm\u201c).<\/p>\n<p>Druh\u00fd princ\u00edp spo\u010d\u00edva v tom, \u017ee m\u00f4\u017eeme zv\u00fd\u0161i\u0165 produktivitu v\u00fdvoj\u00e1rov t\u00fdm, \u017ee im pom\u00e1hame s\u00fastredi\u0165 sa na funkcie, ktor\u00e9 vyv\u00edjaj\u00fa, pri\u010dom ich zbavujeme starost\u00ed o infra\u0161trukt\u00faru a CI\/CD po\u010das implement\u00e1cie. Tak\u017ee, v skratke, n\u00e1\u0161 pr\u00edstup <i>je zameran\u00fd na v\u00fdvoj\u00e1rov<\/i>.<\/p>\n<p>Nakoniec, v\u0161etko, \u010do sa t\u00fdka va\u0161ej aplik\u00e1cie, by malo by\u0165 pripojen\u00e9 k sieti. V posledn\u00fdch 20 rokoch sme sa v\u00fdrazne posunuli k sie\u0165ovej bud\u00facnosti, preto\u017ee siete sa stali r\u00fdchlej\u0161\u00edmi a aplik\u00e1cie zlo\u017eitej\u0161\u00edmi. Ako sme u\u017e zistili, modern\u00e1 aplik\u00e1cia mus\u00ed by\u0165 pou\u017e\u00edvan\u00e1 cez sie\u0165 mnoh\u00fdmi r\u00f4znymi klientmi. Pou\u017eitie sie\u0165ov\u00e9ho myslenia v architekt\u00fare m\u00e1 v\u00fdznamn\u00e9 v\u00fdhody, ktor\u00e9 dobre zapadaj\u00fa do <i>princ\u00edpom malosti<\/i> a konceptu pr\u00edstupu, <i>zameran\u00e9ho na v\u00fdvoj\u00e1rov<\/i>.<\/p>\n<p>Ak si pri v\u00fdvoji a implement\u00e1cii aplik\u00e1cie zapam\u00e4t\u00e1te uveden\u00e9 princ\u00edpy, budete ma\u0165 nepochybn\u00e9 v\u00fdhody pri v\u00fdvoji a dod\u00e1van\u00ed svojho produktu.<\/p>\n<p>Po\u010fme sa na tieto tri princ\u00edpy pozrie\u0165 podrobnej\u0161ie.<\/p>\n<p><b>Princ\u00edp malosti<\/b><\/p>\n<p>\u013dudsk\u00e9mu mozgu rob\u00ed probl\u00e9m naraz prij\u00edma\u0165 ve\u013ek\u00e9 mno\u017estvo inform\u00e1ci\u00ed. V psychol\u00f3gii pojem kognit\u00edvna z\u00e1\u0165a\u017e znamen\u00e1 celkov\u00e9 mno\u017estvo ment\u00e1lnych n\u00e1mahy potrebn\u00fdch na uchovanie inform\u00e1ci\u00ed v pam\u00e4ti. Zn\u00ed\u017eenie kognit\u00edvnej z\u00e1\u0165a\u017ee na v\u00fdvoj\u00e1rov je prioritou, preto\u017ee v takom pr\u00edpade sa m\u00f4\u017eu s\u00fastredi\u0165 na rie\u0161enie probl\u00e9mu, namiesto toho, aby si v hlave udr\u017eiavali aktu\u00e1lny komplexn\u00fd model celej aplik\u00e1cie a vyv\u00edjan\u00fdch funkci\u00ed. <\/p>\n<p><img decoding=\"async\" alt=\"Princ\u00edpy v\u00fdvoja modern\u00fdch aplik\u00e1ci\u00ed od NGINX. \u010cas\u0165 1\" src=\"\/wp-content\/uploads\/26df2016a46d8b82b45832fe1df9bf23.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Aplik\u00e1cie s\u00fa rozdelen\u00e9 z nasleduj\u00facich d\u00f4vodov:<\/p>\n<ul>\n<li>Zn\u00ed\u017eenie kognit\u00edvneho za\u0165a\u017eenia pre v\u00fdvoj\u00e1rov;<\/li>\n<li>R\u00fdchlej\u0161ie a jednoduch\u0161ie testovanie;<\/li>\n<li>R\u00fdchla dod\u00e1vka zmien v aplik\u00e1cii.<\/li>\n<\/ul>\n<p><\/i><br \/>\nExistuje nieko\u013eko sp\u00f4sobov, ako zn\u00ed\u017ei\u0165 kognit\u00edvne za\u0165a\u017eenie pre v\u00fdvoj\u00e1rov, a tu vstupuje do hry princ\u00edp malosti.<\/p>\n<p>Tak\u017ee tri sp\u00f4soby zn\u00ed\u017eenia kognit\u00edvneho za\u0165a\u017eenia:<\/p>\n<ol>\n<li>Zmen\u0161i\u0165 \u010dasov\u00fd r\u00e1mec, ktor\u00fd musia zoh\u013eadni\u0165 pri v\u00fdvoji novej funkcie \u2013 \u010d\u00edm je \u010dasov\u00fd r\u00e1mec krat\u0161\u00ed, t\u00fdm je kognit\u00edvne za\u0165a\u017eenie ni\u017e\u0161ie.<\/li>\n<li>Zn\u00ed\u017ei\u0165 mno\u017estvo k\u00f3du, nad ktor\u00fdm sa pracuje naraz \u2013 menej k\u00f3du, menej za\u0165a\u017eenia.<\/li>\n<li>Zjednodu\u0161i\u0165 proces vykon\u00e1vania inkrement\u00e1lnych zmien v aplik\u00e1cii.<\/li>\n<\/ol>\n<p>\n<b>Zn\u00ed\u017eenie \u010dasov\u00fdch r\u00e1mcov v\u00fdvoja<\/b><\/p>\n<p>Vr\u00e1\u0165me sa do \u010dias, ke\u010f metodol\u00f3gia <code>waterfall<\/code> bola \u0161tandardom pre proces v\u00fdvoja a \u010dasov\u00e9 r\u00e1mce od \u0161iestich mesiacov do dvoch rokov pre v\u00fdvoj alebo aktualiz\u00e1ciu aplik\u00e1cie boli be\u017enou praxou. Zvy\u010dajne najprv in\u017einieri \u010d\u00edtali pr\u00edslu\u0161n\u00e9 dokumenty, ako s\u00fa po\u017eiadavky na produkt (PRD), referen\u010dn\u00fd dokument syst\u00e9mu (SRD), pl\u00e1n architekt\u00fary a za\u010d\u00ednali sp\u00e1ja\u0165 v\u0161etky tieto veci do jednej kognit\u00edvnej modelu, pod\u013ea ktorej p\u00edsali k\u00f3d. Ako sa meniace po\u017eiadavky a architekt\u00fara museli zam\u00fd\u0161\u013ea\u0165 v\u00e1\u017ene \u00fasilie by informova\u0165 cel\u00fd t\u00edm o aktualiz\u00e1ci\u00e1ch kognit\u00edvnej modelu. Tak\u00fdto pr\u00edstup mohol v najhor\u0161om pr\u00edpade jednoducho paralyzova\u0165 pr\u00e1cu.<\/p>\n<p>Najv\u00e4\u010d\u0161ou zmenou v procese v\u00fdvoja aplik\u00e1ci\u00ed sa stalo zavedenie metodol\u00f3gie agile. Jedn\u00fdm z hlavn\u00fdch rysov metodol\u00f3gie <code>agile<\/code> je iterat\u00edvny v\u00fdvoj. To vedie k zn\u00ed\u017eeniu kognit\u00edvneho za\u0165a\u017eenia pre in\u017einierov. Namiesto toho, aby sa od t\u00edmu v\u00fdvoj\u00e1rov vy\u017eadovalo implementova\u0165 aplik\u00e1ciu v jednom dlhom cykle, <code>agile<\/code> pr\u00edstup umo\u017e\u0148uje s\u00fastredi\u0165 sa na mal\u00e9 objemy k\u00f3du, ktor\u00e9 m\u00f4\u017eu by\u0165 r\u00fdchlo testovan\u00e9 a nasaden\u00e9, pri\u010dom sa tie\u017e z\u00edskava sp\u00e4tn\u00e1 v\u00e4zba. Kognit\u00edvne za\u0165a\u017eenie aplik\u00e1cie sa posunulo z \u010dasov\u00e9ho r\u00e1mca od \u0161iestich mesiacov do dvoch rokov s oh\u013eadom na obrovsk\u00e9 mno\u017estvo \u0161pecifik\u00e1ci\u00ed na dvojt\u00fd\u017ed\u0148ov\u00e9 pridanie alebo zmeny funkci\u00ed, zameran\u00e9 na menej jasn\u00e9 porozumenie v\u00e4\u010d\u0161ej aplik\u00e1cii.<\/p>\n<p>Zmenenie zamerania z mas\u00edvnej aplik\u00e1cie na konkr\u00e9tne mal\u00e9 funkcie, ktor\u00e9 m\u00f4\u017eu by\u0165 dokon\u010den\u00e9 v dvojt\u00fd\u017ed\u0148ovom sprinte, s poh\u013eadom dopredu len na jednu funkciu z nasleduj\u00faceho sprintu je v\u00fdznamn\u00e1 zmena. Toto umo\u017enilo zv\u00fd\u0161i\u0165 produktivitu v\u00fdvoja, pri\u010dom sa zni\u017eovalo kognit\u00edvne za\u0165a\u017eenie, ktor\u00e9 sa neust\u00e1le menilo.<\/p>\n<p>V metodol\u00f3gii <code>agile<\/code> sa predpoklad\u00e1, \u017ee kone\u010dn\u00e1 aplik\u00e1cia bude trochu zmenenou verziou p\u00f4vodnej koncepcie, tak\u017ee kone\u010dn\u00fd bod v\u00fdvoja je nevyhnutne nejednozna\u010dn\u00fd. Jasn\u00e9 a presn\u00e9 m\u00f4\u017eu by\u0165 iba v\u00fdsledky jednotliv\u00fdch spintov.<\/p>\n<p><b>Mal\u00e9 k\u00f3dov\u00e9 z\u00e1klady<\/b><\/p>\n<p>\u010eal\u0161\u00edm krokom v zn\u00ed\u017een\u00ed kognit\u00edvneho za\u0165a\u017eenia je zn\u00ed\u017eenie ve\u013ekosti k\u00f3dovej z\u00e1kladne. Modern\u00e9 aplik\u00e1cie s\u00fa zvy\u010dajne mas\u00edvne \u2013 spo\u013eahliv\u00e1, podnikov\u00e1 aplik\u00e1cia m\u00f4\u017ee pozost\u00e1va\u0165 z tis\u00edcov s\u00faborov a stovkami tis\u00edc riadkov k\u00f3du. V z\u00e1vislosti od organiz\u00e1cie s\u00faborov m\u00f4\u017eu by\u0165 vz\u0165ahy a z\u00e1vislosti k\u00f3du a s\u00faborov na jednej strane jasn\u00e9 alebo naopak. Dokonca aj ladenie samotn\u00e9ho vykon\u00e1vania k\u00f3du m\u00f4\u017ee vyvol\u00e1va\u0165 probl\u00e9my v z\u00e1vislosti od pou\u017eit\u00fdch kni\u017en\u00edc a toho, ako dobre n\u00e1stroje na ladenie delimituj\u00fa kni\u017enice\/pakety\/moduly a pou\u017e\u00edvate\u013esk\u00fd k\u00f3d.<\/p>\n<p>Vybudovanie funk\u010dn\u00e9ho ment\u00e1lneho modelu k\u00f3du aplik\u00e1cie m\u00f4\u017ee zabra\u0165 zna\u010dn\u00e9 mno\u017estvo \u010dasu a op\u00e4\u0165 ulo\u017ei\u0165 na v\u00fdvoj\u00e1ra ve\u013ek\u00e9 kognit\u00edvne za\u0165a\u017eenie. To je obzvl\u00e1\u0161\u0165 charakteristick\u00e9 pre monolitick\u00e9 b\u00e1zy k\u00f3du, kde je ve\u013ek\u00e9 mno\u017estvo k\u00f3du a interakcie medzi funk\u010dn\u00fdmi komponentmi nie s\u00fa jasne definovan\u00e9, pri\u010dom rozdelenie pozornosti je \u010dasto rozmazan\u00e9, preto\u017ee nie s\u00fa dodr\u017ean\u00e9 funk\u010dn\u00e9 hranice. <\/p>\n<p>Jedn\u00fdm z efekt\u00edvnych sp\u00f4sobov, ako zn\u00ed\u017ei\u0165 kognit\u00edvne za\u0165a\u017eenie in\u017einierov, je prechod na mikroservisn\u00fa architekt\u00faru. V mikroservisnom pr\u00edstupe sa ka\u017ed\u00fd servis s\u00fastre\u010fuje na jeden s\u00fabor funkci\u00ed; zmysel servisu je zvy\u010dajne definovan\u00fd a zrozumite\u013en\u00fd. Hranice servisu s\u00fa tie\u017e jasn\u00e9 \u2013 pam\u00e4tajte na to, \u017ee komunik\u00e1cia so servisom sa uskuto\u010d\u0148uje pomocou API, tak\u017ee d\u00e1ta generovan\u00e9 jedn\u00fdm servisom m\u00f4\u017eu by\u0165 jednoducho prenesen\u00e9 do in\u00e9ho.<\/p>\n<p>Interakcia s in\u00fdmi slu\u017ebami je zvy\u010dajne obmedzen\u00e1 na nieko\u013eko pou\u017e\u00edvate\u013esk\u00fdch slu\u017eieb a nieko\u013eko slu\u017eieb poskytovate\u013ea, ktor\u00e9 pou\u017e\u00edvaj\u00fa jednoduch\u00e9 a jasn\u00e9 API volania, napr\u00edklad prostredn\u00edctvom REST. To znamen\u00e1, \u017ee kognit\u00edvna z\u00e1\u0165a\u017e na in\u017einiera je v\u00fdrazne zn\u00ed\u017een\u00e1. Najzlo\u017eitej\u0161ou \u00falohou zost\u00e1va pochopenie modelu interakcie slu\u017eieb a toho, ako sa tak\u00e9 veci ako transakcie dej\u00fa v nieko\u013ek\u00fdch slu\u017eb\u00e1ch. Nakoniec pou\u017e\u00edvanie mikroservisov zni\u017euje kognit\u00edvnu z\u00e1\u0165a\u017e, zni\u017euje mno\u017estvo k\u00f3du, stanovuje jasn\u00e9 hranice slu\u017eby a zabezpe\u010duje pochopenie vz\u0165ahov medzi pou\u017e\u00edvate\u013emi a poskytovate\u013emi.<\/p>\n<p><b>Mal\u00e9 inkrement\u00e1lne zmeny<\/b><\/p>\n<p>Posledn\u00fd prvok princ\u00edpu <i>mali\u010dkosti<\/i> \u2013 je to riadenie zmien. \u0160peci\u00e1lnym poku\u0161en\u00edm pre v\u00fdvoj\u00e1rov je pozrie\u0165 sa na k\u00f3dov\u00fa b\u00e1zu (mo\u017eno aj na vlastn\u00fd, star\u0161\u00ed k\u00f3d) a vyhl\u00e1si\u0165: \u201eTo je hrozn\u00e9, mus\u00edme to v\u0161etko prep\u00edsa\u0165.\u201c Niekedy je to spr\u00e1vne rozhodnutie, a niekedy nie. Naru\u0161uje to t\u00edm v\u00fdvoj\u00e1rov bremenom glob\u00e1lnej zmeny modelu, \u010do na opl\u00e1tku vedie k rozsiahlej kognit\u00edvnej z\u00e1\u0165a\u017ei. Lep\u0161ie je, ak sa in\u017einieri zameriavaj\u00fa na zmeny, ktor\u00e9 m\u00f4\u017eu uskuto\u010dni\u0165 po\u010das sprintu, aby potom v prav\u00fd \u010das uviedli potrebn\u00fa funkcionalitu, aj keby to bolo postupne. Kone\u010dn\u00fd produkt by mal pripom\u00edna\u0165 predbe\u017ene pl\u00e1novan\u00fd, ale s niektor\u00fdmi zmenami a testovan\u00edm, aby vyhovel potreb\u00e1m z\u00e1kazn\u00edka.<\/p>\n<p>Pri prepise ve\u013ek\u00fdch \u010dast\u00ed k\u00f3du sa niekedy r\u00fdchla implement\u00e1cia zmien uk\u00e1\u017ee ako nemo\u017en\u00e1, ke\u010f\u017ee vstupuj\u00fa do hry in\u00e9 z\u00e1vislosti syst\u00e9mu. Aby sa kontroloval tok zmien, m\u00f4\u017ee sa vyu\u017ei\u0165 skrytie funkci\u00ed (feature hiding). V princ\u00edpe to znamen\u00e1, \u017ee funkcia je na produkcii, ale nie je pr\u00edstupn\u00e1 prostredn\u00edctvom nastaven\u00ed premenn\u00fdch prostredia (env-var) alebo nejak\u00e9ho in\u00e9ho konfigura\u010dn\u00e9ho mechanizmu. Ak k\u00f3d prejde v\u0161etk\u00fdmi procesmi kontroly kvality, m\u00f4\u017ee sa ocitn\u00fa\u0165 v produkcii v skrytom stave. Av\u0161ak t\u00e1to strat\u00e9gia funguje iba vtedy, ak bude funkcia nakoniec povolen\u00e1. V opa\u010dnom pr\u00edpade len zamie\u0148a k\u00f3d a prid\u00e1va kognit\u00edvnu z\u00e1\u0165a\u017e, ktor\u00fa musia v\u00fdvoj\u00e1ri zvl\u00e1dnu\u0165 na efekt\u00edvnu pr\u00e1cu. Riadenie zmien a inkrement\u00e1lne zmeny samy o sebe pom\u00e1haj\u00fa udr\u017eiava\u0165 kognit\u00edvnu z\u00e1\u0165a\u017e v\u00fdvoj\u00e1rov na prijate\u013enej \u00farovni. <\/p>\n<p>In\u017einieri sa musia vysporiada\u0165 s mno\u017estvom zlo\u017eitost\u00ed aj pri jednoduchom zaveden\u00ed dodato\u010dnej funk\u010dnosti. Z poh\u013eadu vedenia by bolo rozumn\u00e9 zn\u00ed\u017ei\u0165 zbyto\u010dn\u00fa z\u00e1\u0165a\u017e na t\u00edm, aby sa mohol s\u00fastredi\u0165 na k\u013e\u00fa\u010dov\u00e9 prvky funk\u010dnosti. Existuj\u00fa tri veci, ktor\u00e9 m\u00f4\u017eete urobi\u0165, aby ste pomohli svojmu t\u00edmu v\u00fdvoj\u00e1rov:<\/p>\n<ol>\n<li>Pou\u017ei\u0165 metodol\u00f3giu <code>agile<\/code>, aby sa obmedzili \u010dasov\u00e9 r\u00e1mce, v ktor\u00fdch sa t\u00edm mus\u00ed s\u00fastredi\u0165 na k\u013e\u00fa\u010dov\u00e9 funkcie.<\/li>\n<li>Zrealizova\u0165 svoju aplik\u00e1ciu ako nieko\u013eko mikroslu\u017eieb. To obmedz\u00ed po\u010det implementovan\u00fdch funkci\u00ed a posiln\u00ed hranice, ktor\u00e9 udr\u017eiavaj\u00fa kognit\u00edvnu z\u00e1\u0165a\u017e po\u010das pr\u00e1ce.<\/li>\n<li>Preferujte inkrement\u00e1lne zmiany pred ve\u013ek\u00fdmi a robustn\u00fdmi, upravujte mal\u00e9 \u010dasti k\u00f3du. Pou\u017e\u00edvajte skrytie funkci\u00ed na implement\u00e1ciu zmien, aj ke\u010f nebud\u00fa vidite\u013en\u00e9 hne\u010f po pridan\u00ed.<\/li>\n<\/ol>\n<p>\nAk pou\u017eijete vo svojej pr\u00e1ci princ\u00edp malosti, v\u00e1\u0161 t\u00edm bude ove\u013ea \u0161\u0165astnej\u0161\u00ed, lep\u0161ie sa zameria na realiz\u00e1ciu potrebn\u00fdch funkci\u00ed a s v\u00e4\u010d\u0161ou pravdepodobnos\u0165ou r\u00fdchlej\u0161ie zav\u00e1dza kvalitn\u00e9 zmeny. Ale to neznamen\u00e1, \u017ee pr\u00e1ca nem\u00f4\u017ee by\u0165 zlo\u017eit\u00e1; niekedy naopak, zavedenie novej funkcionality vy\u017eaduje modifik\u00e1ciu nieko\u013ek\u00fdch slu\u017eieb a tento proces m\u00f4\u017ee by\u0165 n\u00e1ro\u010dnej\u0161\u00ed ako podobn\u00fd v monolitickej architekt\u00fare. V ka\u017edom pr\u00edpade stoja v\u00fdhody aplik\u00e1cie pr\u00edstupu malosti za to.<\/p>\n<p>Koniec prvej \u010dasti.<\/p>\n<p>\u010coskoro zverejn\u00edme druh\u00fa \u010das\u0165 prekladu, a zatia\u013e \u010dak\u00e1me na va\u0161e koment\u00e1re a poz\u00fdvame v\u00e1s na <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/mJ6e\/\">de\u0148 otvoren\u00fdch dver\u00ed<\/a><\/noindex>, ktor\u00fd sa uskuto\u010dn\u00ed u\u017e dnes o 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.4 - 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\/sk\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\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\/sk\/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\udd47Princ\u00edpy v\u00fdvoja modern\u00fdch aplik\u00e1ci\u00ed od NGINX. \u010cas\u0165 1 | ProHoster","description":"Ahojte, priatelia.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/34140","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=34140"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/34140\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=34140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=34140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=34140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}