{"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\/ro\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","title":{"rendered":"Principiile dezvolt\u0103rii aplica\u021biilor moderne de la NGINX. Partea 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Salut, prieteni. \u00cen pragul lans\u0103rii cursului <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/h4Ez\/\">\u201eDezvoltator Backend pe PHP\u201d<\/a><\/noindex>, ne \u00eemp\u0103rt\u0103\u0219im tradi\u021bional traducerea unui material util.<\/p>\n<p>Software-ul rezolv\u0103 din ce \u00een ce mai multe sarcini cotidiene, devenind totodat\u0103 din ce \u00een ce mai complex. A\u0219a cum spunea c\u00e2ndva Marc Andreessen, acesta absoarbe lumea. <\/p>\n<p><img decoding=\"async\" alt=\"Principiile dezvolt\u0103rii aplica\u021biilor moderne de la NGINX. Partea 1\" src=\"\/wp-content\/uploads\/928924e3036beaac518dd4a2674a8a30.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCa urmare, \u00een ultimii c\u00e2\u021biva ani, abord\u0103rile \u00een dezvoltarea \u0219i livrarea aplica\u021biilor s-au schimbat dramatic. Acestea au fost schimb\u0103ri de o magnitudine tectonic\u0103, care au dus la formarea unui set de principii. Aceste principii s-au dovedit utile \u00een formarea echipelor, proiectarea, dezvoltarea \u0219i livrarea aplica\u021biei dumneavoastr\u0103 utilizatorilor finali. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Principiile pot fi rezumate astfel: <i>aplica\u021bia trebuie s\u0103 fie mic\u0103, \u00een re\u021bea \u0219i cu o arhitectur\u0103 axat\u0103 pe dezvoltator<\/i>. Plec\u00e2nd de la aceste trei principii, pute\u021bi crea o aplica\u021bie fiabil\u0103, complex\u0103, care poate fi livrat\u0103 rapid \u0219i \u00een siguran\u021b\u0103 utilizatorului final, \u0219i care este, de asemenea, u\u0219or de scalat \u0219i extins.<\/p>\n<p><img decoding=\"async\" alt=\"Principiile dezvolt\u0103rii aplica\u021biilor moderne de la NGINX. Partea 1\" src=\"\/wp-content\/uploads\/9116869a53fb6cf89d92f1d507d7904f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFiecare dintre principiile propuse are o serie de aspecte pe care le vom discuta pentru a ar\u0103ta cum fiecare principiu contribuie la atingerea scopului final, care este livrarea rapid\u0103 a aplica\u021biilor fiabile, u\u0219or de \u00eentre\u021binut \u0219i de folosit. Vom analiza principiile \u00een raport cu opusul lor, pentru a clarifica ce \u00eenseamn\u0103, de exemplu, \u201eAsigura\u021bi-v\u0103 c\u0103 utiliza\u021bi <i>principiul micimii<\/i>\u00bb.<\/p>\n<p>Sper\u0103m c\u0103 acest articol v\u0103 va determina s\u0103 folosi\u021bi principiile propuse pentru construirea aplicatiilor moderne, care vor oferi o abordare unitar\u0103 \u00een contextul unui stiv tehnologic \u00een continu\u0103 expansiune. <\/p>\n<p>Aplic\u00e2nd aceste principii, ve\u021bi constata c\u0103 utiliza\u021bi cele mai recente tendin\u021be \u00een dezvoltarea software-ului, inclusiv abordarea <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/devops\/\">DevOps<\/a><\/noindex> pentru dezvoltarea \u0219i livrarea aplica\u021biilor, utilizarea containerelor (de exemplu, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/docker\/\">Docker<\/a><\/noindex>) \u0219i cadrul pentru orchestrarea containerelor (de exemplu, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/kubernetes\/\">Kubernetes<\/a><\/noindex>), utilizarea microservicelor (inclusiv Arhitectura Microservicelor <noindex>NGINX<\/noindex> \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/what-is-a-service-mesh\/\">arhitectura de re\u021bea<\/a><\/noindex> pentru aplica\u021biile microservicii.<\/p>\n<p><b>Ce este o aplica\u021bie modern\u0103?<\/b><\/p>\n<p>Aplica\u021bii moderne? Stiv modern? Ce \u00eenseamn\u0103 exact \u201emodern\u201d? <\/p>\n<p>Majoritatea dezvoltatorilor au doar o \u00een\u021belegere general\u0103 a ceea ce constituie o aplica\u021bie modern\u0103, a\u0219a c\u0103 este important s\u0103 oferim o defini\u021bie clar\u0103 acestui concept.<\/p>\n<p>O aplica\u021bie modern\u0103 sus\u021bine mai mul\u021bi clien\u021bi, fie c\u0103 este vorba despre o interfa\u021b\u0103 utilizator pe biblioteca JavaScript React, o aplica\u021bie mobil\u0103 pentru Android sau iOS, sau o aplica\u021bie care se conecteaz\u0103 cu alta prin API. O aplica\u021bie modern\u0103 implic\u0103 existen\u021ba unui num\u0103r nedefinit de clien\u021bi, pentru care aceasta ofer\u0103 date sau servicii.<\/p>\n<p>O aplica\u021bie modern\u0103 ofer\u0103 un API pentru accesarea datelor \u0219i serviciilor solicitate. API-ul ar trebui s\u0103 fie constant \u0219i stabil, \u0219i nu scris specific pentru o anumit\u0103 solicitare din partea unui anumit client. API-ul este disponibil prin HTTP(S) \u0219i ofer\u0103 acces la toat\u0103 func\u021bionalitatea disponibil\u0103 \u00een GUI sau CLI. <\/p>\n<p>Datele trebuie s\u0103 fie accesibile \u00eentr-un format comun, compatibil, precum JSON. API-ul ofer\u0103 obiecte \u0219i servicii \u00eentr-o form\u0103 clar\u0103 \u0219i organizat\u0103; de exemplu, API-urile RESTful sau GraphQL ofer\u0103 o interfa\u021b\u0103 adecvat\u0103.<\/p>\n<p>Aplica\u021biile moderne sunt construite pe un stiv\u0103 modern\u0103, iar o stiv\u0103 modern\u0103 este aceea care sus\u021bine astfel de aplica\u021bii. Aceast\u0103 stiv\u0103 permite dezvoltatorului s\u0103 creeze cu u\u0219urin\u021b\u0103 o aplica\u021bie cu o interfa\u021b\u0103 HTTP \u0219i puncte finale API clare. Abordarea aleas\u0103 va permite aplica\u021biei tale s\u0103 recep\u021bioneze \u0219i s\u0103 trimit\u0103 date \u00een format JSON f\u0103r\u0103 dificult\u0103\u021bi. Cu alte cuvinte, stiva modern\u0103 corespunde elementelor aplica\u021biei din 12 factori pentru <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/microservices-reference-architecture-nginx-twelve-factor-app\/\">microservicii<\/a><\/noindex>. <\/p>\n<p>Versiunile populare ale acestui tip de stiv\u0103 se bazeaz\u0103 pe <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> \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-content-service\">Go<\/a><\/noindex>. Arhitectura microservicelor <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-ingenious\">NGINX<\/a><\/noindex> reprezint\u0103 un exemplu de stiv\u0103 modern\u0103 implementat\u0103 \u00een fiecare dintre limbajele men\u021bionate.<\/p>\n<p>Re\u021bine\u021bi c\u0103 nu promov\u0103m exclusiv abordarea microservicelor. Mul\u021bi dintre voi lucra\u021bi cu monolite care trebuie s\u0103 evolueze, \u00een timp ce al\u021bii se ocup\u0103 de aplica\u021bii SOA care se extind \u0219i se dezvolt\u0103 pentru a deveni aplica\u021bii microservicii. Al\u021bii se \u00eendreapt\u0103 spre implementarea aplica\u021biilor f\u0103r\u0103 server (serverless), iar unii implementeaz\u0103 combina\u021bii din cele men\u021bionate anterior. Principiile expuse \u00een articol se aplic\u0103 fiec\u0103rei dintre aceste sisteme cu unele modific\u0103ri minore. <\/p>\n<p><b>Principi<\/b><\/p>\n<p>Acum, c\u0103 am ajuns la o \u00een\u021belegere comun\u0103 despre ce \u00eenseamn\u0103 aplica\u021biile moderne \u0219i stiva modern\u0103, este timpul s\u0103 ne aprofund\u0103m principiile arhitecturii \u0219i dezvolt\u0103rii care v\u0103 vor fi de mare ajutor \u00een dezvoltarea, implementarea \u0219i suportul aplica\u021biei moderne.<\/p>\n<p>Unul dintre principii sun\u0103 astfel: \u201ecrea\u021bi aplica\u021bii mici\u201d, s\u0103-i spunem <i>principiul mic\u0103\u021bii<\/i>. Exist\u0103 aplica\u021bii incredibil de complexe constituite dintr-un num\u0103r mare de componente mobile. Pe de alt\u0103 parte, construirea unei aplica\u021bii din componente mici \u0219i discrete simplific\u0103 proiectarea, \u00eentre\u021binerea \u0219i lucrul cu aceasta \u00een general. (Observa\u021bi c\u0103 am spus \u201esimplific\u0103\u201d, nu \u201eface simplu\u201d).<\/p>\n<p>Al doilea principiu const\u0103 \u00een faptul c\u0103 putem cre\u0219te productivitatea dezvoltatorilor, ajut\u00e2ndu-i s\u0103 se concentreze asupra func\u021biilor pe care le dezvolt\u0103, eliber\u00e2ndu-i de griji legate de infrastructur\u0103 \u0219i CI\/CD \u00een timpul implement\u0103rii. A\u0219adar, pe scurt, abordarea noastr\u0103 <i>este orientat\u0103 spre dezvoltatori<\/i>.<\/p>\n<p>\u00cen cele din urm\u0103, tot ce \u021bine de aplica\u021bia dvs. trebuie s\u0103 fie conectat la re\u021bea. \u00cen ultimii 20 de ani, am avansat semnificativ spre un viitor \u00een re\u021bea, pe m\u0103sur\u0103 ce re\u021belele au devenit mai rapide, iar aplica\u021biile mai complexe. Dup\u0103 cum am discutat deja, aplica\u021bia modern\u0103 trebuie s\u0103 fie utilizat\u0103 prin re\u021bea de c\u0103tre o varietate de clien\u021bi diferi\u021bi. Aplicarea g\u00e2ndirii \u00een re\u021bea \u00een arhitectur\u0103 aduce avantaje semnificative, care se alinieaz\u0103 bine cu <i>principiul mic\u0103\u021bii<\/i> \u0219i concep\u021bia abord\u0103rii, <i>orientat\u0103 spre dezvoltatori<\/i>.<\/p>\n<p>Dac\u0103, \u00een timpul dezvolt\u0103rii \u0219i implement\u0103rii aplica\u021biei, ve\u021bi avea \u00een vedere principiile men\u021bionate, ve\u021bi avea un avantaj incontestabil \u00een dezvoltarea \u0219i livrarea produsului dumneavoastr\u0103.<\/p>\n<p>S\u0103 analiz\u0103m aceste trei principii \u00een detaliu.<\/p>\n<p><b>Principiul mic\u0103\u021bii<\/b><\/p>\n<p>Creierului uman \u00eei este greu s\u0103 perceap\u0103 simultan o cantitate mare de informa\u021bii. \u00cen psihologie, termenul \u00eenc\u0103rc\u0103tur\u0103 cognitiv\u0103 se refer\u0103 la totalitatea eforturilor mintale necesare pentru a p\u0103stra informa\u021biile \u00een memorie. Reducerea \u00eenc\u0103rc\u0103turii cognitive asupra dezvoltatorilor este o prioritate, deoarece \u00een acest fel pot s\u0103 se concentreze pe solu\u021bionarea problemei, \u00een loc s\u0103 men\u021bin\u0103 \u00een minte modelul complex actual al \u00eentregii aplica\u021bii \u0219i func\u021biile dezvoltate. <\/p>\n<p><img decoding=\"async\" alt=\"Principiile dezvolt\u0103rii aplica\u021biilor moderne de la NGINX. Partea 1\" src=\"\/wp-content\/uploads\/26df2016a46d8b82b45832fe1df9bf23.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Aplica\u021biile sunt decompuse din urm\u0103toarele motive:<\/p>\n<ul>\n<li>Reducerea \u00eenc\u0103rc\u0103turii cognitive pentru dezvoltatori;<\/li>\n<li>Accelerarea \u0219i simplificarea test\u0103rii;<\/li>\n<li>Livrarea rapid\u0103 a modific\u0103rilor \u00een aplica\u021bie.<\/li>\n<\/ul>\n<p><\/i><br \/>\nExist\u0103 mai multe modalit\u0103\u021bi de a reduce \u00eenc\u0103rc\u0103tura cognitiv\u0103 asupra dezvoltatorilor, iar aici intervine principiul microliterei.<\/p>\n<p>A\u0219adar, trei modalit\u0103\u021bi de a reduce \u00eenc\u0103rc\u0103tura cognitiv\u0103:<\/p>\n<ol>\n<li>Reducerea intervalelor de timp pe care trebuie s\u0103 le considere atunci c\u00e2nd dezvolt\u0103 o nou\u0103 func\u021bie \u2013 cu c\u00e2t intervalul este mai scurt, cu at\u00e2t mai mic\u0103 este \u00eenc\u0103rc\u0103tura cognitiv\u0103.<\/li>\n<li>Reducerea cantit\u0103\u021bii de cod asupra c\u0103ruia se lucreaz\u0103 simultan \u2013 mai pu\u021bin cod, mai pu\u021bin\u0103 \u00eenc\u0103rc\u0103tur\u0103.<\/li>\n<li>Simplificarea procesului de a face modific\u0103ri incrementale \u00een aplica\u021bie.<\/li>\n<\/ol>\n<p>\n<b>Reducerea intervalelor de timp pentru dezvoltare<\/b><\/p>\n<p>S\u0103 ne \u00eentoarcem la vremurile c\u00e2nd metodologia <code>waterfall<\/code> era standard pentru procesul de dezvoltare, iar intervalele de \u0219ase luni p\u00e2n\u0103 la doi ani pentru dezvoltarea sau actualizarea unei aplica\u021bii erau o practic\u0103 obi\u0219nuit\u0103. De obicei, inginerii citeau mai \u00eent\u00e2i documentele relevante, cum ar fi cerin\u021bele pentru produs (PRD), documentul de referin\u021b\u0103 al sistemului (SRD), planul arhitectural \u0219i \u00eencepeau s\u0103 combine toate aceste lucruri \u00eentr-un singur model cognitiv, conform c\u0103ruia scriau cod. Pe m\u0103sur\u0103 ce cerin\u021bele \u0219i, prin urmare, arhitectura se schimbau, se f\u0103ceau eforturi considerabile pentru a informa \u00eentreaga echip\u0103 despre actualiz\u0103rile modelului cognitiv. O astfel de abordare, \u00een cel mai r\u0103u caz, putea pur \u0219i simplu s\u0103 paralizeze activitatea.<\/p>\n<p>Cea mai mare schimbare \u00een procesul de dezvoltare a aplica\u021biilor a fost introducerea metodologiei agile. Una dintre tr\u0103s\u0103turile principale ale metodologiei <code>agile<\/code> este dezvoltarea iterativ\u0103. Acest lucru duce la reducerea \u00eenc\u0103rc\u0103turii cognitive asupra inginerilor. \u00cen loc s\u0103 cear\u0103 echipei de dezvoltatori s\u0103 implementeze aplica\u021bia \u00eentr-un singur ciclu lung, <code>agile<\/code> abordarea permite concentrarea asupra unor volume mici de cod, care pot fi rapid testate \u0219i desf\u0103\u0219urate, primind astfel \u0219i feedback. \u00cenc\u0103rc\u0103tura cognitiv\u0103 a aplica\u021biei s-a mutat de la un interval de \u0219ase luni p\u00e2n\u0103 la doi ani, av\u00e2nd \u00een vedere o cantitate uria\u0219\u0103 de specifica\u021bii, la o ad\u0103ugare sau modificare de func\u021bie de dou\u0103 s\u0103pt\u0103m\u00e2ni, concentr\u00e2ndu-se pe o \u00een\u021belegere mai vag\u0103 a unei aplica\u021bii mari.<\/p>\n<p>Mutarea accentului de la aplica\u021bii masive la func\u021bii mici \u0219i specifice, care pot fi finalizate \u00een timpul a dou\u0103 s\u0103pt\u0103m\u00e2ni, av\u00e2nd \u00een vedere \u00een mod constant maxim o func\u021bie din sprintul urm\u0103tor, reprezint\u0103 o schimbare semnificativ\u0103. Aceasta a permis cre\u0219terea productivit\u0103\u021bii \u00een dezvoltare, reduc\u00e2nd totodat\u0103 \u0219i \u00eenc\u0103rc\u0103tura cognitiv\u0103 fluctuant\u0103.<\/p>\n<p>\u00cen metodologia <code>agile<\/code> se presupune c\u0103 aplica\u021bia final\u0103 va fi o versiune oarecum modificat\u0103 a conceptului ini\u021bial, astfel \u00eenc\u00e2t scopul final al dezvolt\u0103rii este inevitabil vag. Numai rezultatele fiec\u0103rui sprint specific pot fi clare \u0219i precise.<\/p>\n<p><b>Baze de cod mici<\/b><\/p>\n<p>Urm\u0103torul pas \u00een reducerea \u00eenc\u0103rc\u0103turii cognitive este diminuarea dimensiunii bazei de cod. \u00cen general, aplica\u021biile moderne sunt masive - o aplica\u021bie de \u00eencredere, de corpora\u021bie poate consta din mii de fi\u0219iere \u0219i sute de mii de linii de cod. \u00cen func\u021bie de organizarea fi\u0219ierelor, rela\u021biile \u0219i dependen\u021bele codului \u0219i fi\u0219ierelor pot fi evidente sau dimpotriv\u0103. Chiar \u0219i depanarea execu\u021biei codului poate cauza probleme, \u00een func\u021bie de bibliotecile utilizate \u0219i de c\u00e2t de bine instrumentele de depanare delimiteaz\u0103 bibliotecile\/pachetele\/modulele de codul utilizatorului.<\/p>\n<p>Construirea unui model mental de munc\u0103 al codului aplica\u021biei poate necesita o cantitate considerabil\u0103 de timp, din nou impun\u00e2nd dezvoltatorului o \u00eenc\u0103rc\u0103tur\u0103 cognitiv\u0103 mare. Aceasta este deosebit de caracteristic\u0103 bazelor de cod monolitice, unde exist\u0103 o mare cantitate de cod, interac\u021biunea \u00eentre componentele func\u021bionale fiind nedefinit\u0103, iar separarea obiectelor de aten\u021bie este adesea estompat\u0103, deoarece grani\u021bele func\u021bionale nu sunt respectate. <\/p>\n<p>Una dintre metodele eficiente de a reduce \u00eenc\u0103rc\u0103tura cognitiv\u0103 a inginerilor este trecerea la arhitectura microserviciilor. \u00cen abordarea microserviciilor, fiecare serviciu se concentreaz\u0103 pe un set specific de func\u021bii; \u00een acest sens, semnifica\u021bia serviciului este \u00een general definit\u0103 \u0219i clar\u0103. Grani\u021bele serviciului sunt, de asemenea, clare - \u021bine\u021bi minte c\u0103 comunicarea cu un serviciu se face prin API, astfel \u00eenc\u00e2t datele generate de un serviciu pot fi transferate cu u\u0219urin\u021b\u0103 altuia.<\/p>\n<p>Interac\u021biunea cu alte servicii este de obicei limitat\u0103 la c\u00e2teva servicii de utilizator \u0219i la c\u00e2teva servicii ale furnizorului care utilizeaz\u0103 apeluri API simple \u0219i clare, de exemplu, prin intermediul REST. Aceasta \u00eenseamn\u0103 c\u0103 sarcina cognitiv\u0103 a inginerului este considerabil redus\u0103. Cea mai complicat\u0103 sarcin\u0103 r\u0103m\u00e2ne \u00een\u021belegerea modelului de interac\u021biune al serviciilor \u0219i a modalit\u0103\u021bii \u00een care lucruri precum tranzac\u021biile se desf\u0103\u0219oar\u0103 \u00een cadrul mai multor servicii. \u00cen cele din urm\u0103, utilizarea microserviciilor reduce sarcina cognitiv\u0103, diminu\u00e2nd cantitatea de cod, stabilind limite clare \u00eentre servicii \u0219i asigur\u00e2nd o \u00een\u021belegere a rela\u021biilor dintre utilizatori \u0219i furnizori.<\/p>\n<p><b>Modific\u0103ri incrementale mici<\/b><\/p>\n<p>Ultimul element al principiului <i>mici<\/i> \u2013 este gestionarea schimb\u0103rilor. O tenta\u021bie special\u0103 pentru dezvoltatori este s\u0103 priveasc\u0103 baza de cod (chiar \u0219i, poate, propria lor codur\u0103 mai veche) \u0219i s\u0103 declare: \u201eEste o mizerie, trebuie s\u0103 rescriem totul.\u201d Uneori aceasta este o decizie corect\u0103, iar alteori nu. Aceasta impune echipei de dezvoltatori povara schimb\u0103rii globale a modelului, ceea ce, la r\u00e2ndul s\u0103u, duce la o sarcin\u0103 cognitiv\u0103 major\u0103. Ar fi mai bine ca inginerii s\u0103 se concentreze asupra modific\u0103rilor pe care le pot face \u00een timpul sprintului, pentru a lansa \u00een timp util func\u021bionalitatea necesar\u0103, chiar dac\u0103 gradual. Produsul final ar trebui s\u0103 semene cu cel preplanificat, dar cu unele modific\u0103ri \u0219i teste, pentru a corespunde nevoilor clientului.<\/p>\n<p>Atunci c\u00e2nd se rescrie p\u0103r\u021bi mari de cod, uneori este imposibil s\u0103 livr\u0103m rapid modific\u0103rile, deoarece apar alte dependen\u021be ale sistemului. Pentru a controla fluxul modific\u0103rilor, se poate utiliza ascunderea func\u021bionalit\u0103\u021bii (feature hiding). Practic, este vorba despre faptul c\u0103 func\u021bionalitatea exist\u0103 \u00een produc\u021bie, dar nu este accesibil\u0103 prin intermediul variabilelor de mediu (env-var) sau al oric\u0103rui alt mecanism de configurare. Dac\u0103 codul a trecut toate procesele de verificare a calit\u0103\u021bii, acesta poate ajunge \u00een produc\u021bie \u00eentr-o stare ascuns\u0103. Totu\u0219i, aceast\u0103 strategie func\u021bioneaz\u0103 doar dac\u0103 func\u021bia va fi activat\u0103 \u00een cele din urm\u0103. \u00cen caz contrar, aceasta va aglomera codul \u0219i va ad\u0103uga o povar\u0103 cognitiv\u0103 de care dezvoltatorul va trebui s\u0103 fac\u0103 fa\u021b\u0103 pentru a lucra eficient. Managementul modific\u0103rilor \u0219i modific\u0103rile incrementale ajut\u0103 la men\u021binerea sarcinii cognitive a dezvoltatorilor la un nivel gestionabil. <\/p>\n<p>Inginerii se confrunt\u0103 cu multe dificult\u0103\u021bi chiar \u0219i atunci c\u00e2nd implementeaz\u0103 func\u021bionalitate suplimentar\u0103. Din perspectiva conducerii, ar fi \u00een\u021belept s\u0103 reduce\u021bi povara inutil\u0103 asupra echipei, astfel \u00eenc\u00e2t s\u0103 se poat\u0103 concentra pe elementele cheie ale func\u021bionalit\u0103\u021bii. Exist\u0103 trei lucruri pe care le pute\u021bi face pentru a ajuta echipa de dezvoltatori:<\/p>\n<ol>\n<li>Utiliza\u021bi metodologii <code>agile<\/code>, pentru a limita termenul \u00een care echipa trebuie s\u0103 se concentreze pe func\u021biile cheie.<\/li>\n<li>Implementa\u021bi aplica\u021bia dumneavoastr\u0103 ca mai multe microservicii. Aceasta va limita num\u0103rul de func\u021bionalit\u0103\u021bi implementate \u0219i va \u00eent\u0103ri grani\u021bele care men\u021bin sarcina cognitiv\u0103 \u00een timpul muncii.<\/li>\n<li>Preferati modific\u0103rile incrementale \u00een locul celor mari \u0219i voluminoase, modifica\u021bi buc\u0103\u021bi mici de cod. Folosi\u021bi ascunderea func\u021biilor pentru a implementa modific\u0103rile, chiar dac\u0103 acestea nu vor fi vizibile imediat dup\u0103 ad\u0103ugare.<\/li>\n<\/ol>\n<p>\nDac\u0103 ve\u021bi aplica principiul simplit\u0103\u021bii \u00een munca dumneavoastr\u0103, echipa dumneavoastr\u0103 va fi mult mai fericit\u0103, se va concentra mai bine pe implementarea func\u021bionalit\u0103\u021bilor necesare \u0219i va avea o probabilitate mai mare de a lansa modific\u0103ri de calitate mai rapid. \u00cens\u0103, acest lucru nu \u00eenseamn\u0103 c\u0103 munca nu poate deveni mai complex\u0103; uneori, dimpotriv\u0103, implementarea unei noi func\u021bionalit\u0103\u021bi necesit\u0103 modific\u0103ri ale mai multor servicii \u0219i acest proces poate fi mai dificil dec\u00e2t \u00een cazul unei arhitecturi monolitice. Oricum, beneficiile aplic\u0103rii abord\u0103rii simplit\u0103\u021bii merit\u0103 efortul.<\/p>\n<p>Sf\u00e2r\u0219itul primei p\u0103r\u021bi.<\/p>\n<p>\u00cen cur\u00e2nd vom publica a doua parte a traducerii, iar acum a\u0219tept\u0103m comentariile dumneavoastr\u0103 \u0219i v\u0103 invit\u0103m la <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/mJ6e\/\">ziua por\u021bilor deschise<\/a><\/noindex>, care va avea loc chiar ast\u0103zi la ora 20:00.<br \/>\n<br \/>Sursa: <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.2.1 - 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\/ro\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Principiile de dezvoltare a aplica\u021biilor moderne de la NGINX. Partea 1 | ProHoster","description":"Salut, prieteni.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/34140","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=34140"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/34140\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=34140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=34140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=34140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}