{"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\/pl\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","title":{"rendered":"Zasady tworzenia nowoczesnych aplikacji wed\u0142ug NGINX. Cz\u0119\u015b\u0107 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Cze\u015b\u0107, przyjaciele. W zwi\u0105zku z nadchodz\u0105cym uruchomieniem kursu <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/h4Ez\/\">\u201eBackend Developer na PHP\u201d<\/a><\/noindex>, tradycyjnie dzielimy si\u0119 z wami t\u0142umaczeniem przydatnego materia\u0142u.<\/p>\n<p>Oprogramowanie rozwi\u0105zuje coraz wi\u0119cej codziennych zada\u0144, jednocze\u015bnie staj\u0105c si\u0119 coraz bardziej z\u0142o\u017cone. Jak kiedy\u015b powiedzia\u0142 Marc Andreessen, poch\u0142ania ono \u015bwiat. <\/p>\n<p><img decoding=\"async\" alt=\"Zasady tworzenia nowoczesnych aplikacji wed\u0142ug NGINX. Cz\u0119\u015b\u0107 1\" src=\"\/wp-content\/uploads\/928924e3036beaac518dd4a2674a8a30.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nW rezultacie, w ci\u0105gu ostatnich kilku lat podej\u015bcia do tworzenia i dostarczania aplikacji uleg\u0142y powa\u017cnym zmianom. By\u0142y to przemieszczenia tektoniczne, kt\u00f3re doprowadzi\u0142y do powstania zestawu zasad. Zasady te okaza\u0142y si\u0119 przydatne w formowaniu zespo\u0142\u00f3w, projektowaniu, tworzeniu i dostarczaniu aplikacji ko\u0144cowym u\u017cytkownikom. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Zasady mo\u017cna podsumowa\u0107 w nast\u0119puj\u0105cy spos\u00f3b: <i>aplikacja powinna by\u0107 ma\u0142a, sieciowa i mie\u0107 architektur\u0119 skupion\u0105 na deweloperze<\/i>. Opieraj\u0105c si\u0119 na tych trzech zasadach, mo\u017cna stworzy\u0107 niezawodn\u0105, kompleksow\u0105 aplikacj\u0119, kt\u00f3ra mo\u017ce by\u0107 szybko i bezpiecznie dostarczona do ko\u0144cowego u\u017cytkownika oraz \u0142atwo skalowalna i rozwijalna.<\/p>\n<p><img decoding=\"async\" alt=\"Zasady tworzenia nowoczesnych aplikacji wed\u0142ug NGINX. Cz\u0119\u015b\u0107 1\" src=\"\/wp-content\/uploads\/9116869a53fb6cf89d92f1d507d7904f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKa\u017cda z proponowanych zasad ma szereg aspekt\u00f3w, kt\u00f3re omawiamy, aby pokaza\u0107, jak ka\u017cda zasada przyczynia si\u0119 do osi\u0105gni\u0119cia ko\u0144cowego celu, jakim jest szybkie dostarczanie niezawodnych aplikacji \u0142atwych w utrzymaniu i u\u017cytkowaniu. B\u0119dziemy rozpatrywa\u0107 zasady w por\u00f3wnaniu z ich przeciwie\u0144stwami, aby wyja\u015bni\u0107, co to znaczy, powiedzmy, \u201eUpewnij si\u0119, \u017ce stosujesz <i>zasad\u0119 ma\u0142o\u015bci<\/i>\u00bb.<\/p>\n<p>Mamy nadziej\u0119, \u017ce ten artyku\u0142 zach\u0119ci ci\u0119 do korzystania z proponowanych zasad budowania nowoczesnych aplikacji, kt\u00f3re zapewni\u0105 jednolite podej\u015bcie do projektowania w kontek\u015bcie nieustannie rosn\u0105cego staku technologii. <\/p>\n<p>Stosuj\u0105c te zasady, odkryjesz, \u017ce korzystasz z najnowszych trend\u00f3w w tworzeniu oprogramowania, w tym podej\u015bcia <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/devops\/\">DevOps<\/a><\/noindex> do tworzenia i dostarczania aplikacji, wykorzystania kontener\u00f3w (np. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/docker\/\">Docker<\/a><\/noindex>) i framework\u00f3w do orkiestracji kontener\u00f3w (np. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/kubernetes\/\">Kubernetes<\/a><\/noindex>), wykorzystania mikroserwis\u00f3w (w tym Architektury Mikroserwis\u00f3w <noindex>NGINX<\/noindex> i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/what-is-a-service-mesh\/\">architektura sieciowa<\/a><\/noindex> dla aplikacji mikroserwisowych.<\/p>\n<p><b>Czym jest nowoczesna aplikacja?<\/b><\/p>\n<p>Nowoczesne aplikacje? Nowoczesny stos? Co dok\u0142adnie oznacza \u201enowoczesny\u201d? <\/p>\n<p>Wi\u0119kszo\u015b\u0107 deweloper\u00f3w ma jedynie og\u00f3lne poj\u0119cie o tym, z czego sk\u0142ada si\u0119 nowoczesna aplikacja, dlatego nale\u017cy precyzyjnie zdefiniowa\u0107 to poj\u0119cie.<\/p>\n<p>Nowoczesna aplikacja obs\u0142uguje wielu klient\u00f3w, niezale\u017cnie od tego, czy jest to interfejs u\u017cytkownika w bibliotece JavaScript React, aplikacja mobilna na Androida lub iOS, czy aplikacja, kt\u00f3ra \u0142\u0105czy si\u0119 z inn\u0105 za pomoc\u0105 API. Nowoczesna aplikacja zak\u0142ada istnienie nieokre\u015blonej liczby klient\u00f3w, dla kt\u00f3rych dostarcza dane lub us\u0142ugi.<\/p>\n<p>Nowoczesna aplikacja udost\u0119pnia API do uzyskiwania \u017c\u0105danych danych i us\u0142ug. API powinno by\u0107 stabilne i niezmienne, a nie pisane z my\u015bl\u0105 o specyficznych \u017c\u0105daniach z konkretnego klienta. API jest dost\u0119pne przez HTTP(S) i zapewnia dost\u0119p do ca\u0142ej funkcjonalno\u015bci, jak\u0105 oferuje GUI lub CLI. <\/p>\n<p>Dane musz\u0105 by\u0107 dost\u0119pne w powszechnie akceptowalnym, kompatybilnym formacie, takim jak JSON. API dostarcza obiekty i us\u0142ugi w zrozumia\u0142ej, zorganizowanej postaci; na przyk\u0142ad RESTful API lub GraphQL zapewniaj\u0105 odpowiedni interfejs.<\/p>\n<p>Nowoczesne aplikacje budowane s\u0105 na nowoczesnym stosie, a nowoczesny stos to taki stos, kt\u00f3ry obs\u0142uguje takie aplikacje. Taki stos umo\u017cliwia deweloperowi \u0142atwe tworzenie aplikacji z interfejsem HTTP i wyra\u017anymi punktami ko\u0144cowymi API. Wybrana metoda pozwoli twojej aplikacji \u0142atwo przyjmowa\u0107 i wysy\u0142a\u0107 dane w formacie JSON. Innymi s\u0142owy, nowoczesny stos odpowiada elementom aplikacji Twelve-Factor. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/microservices-reference-architecture-nginx-twelve-factor-app\/\">mikroserwis\u00f3w<\/a><\/noindex>. <\/p>\n<p>Popularne wersje tego typu stosu opieraj\u0105 si\u0119 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\">W\u0119ze\u0142<\/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> i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-content-service\">Go<\/a><\/noindex>. Architektura mikro us\u0142ugowa <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-ingenious\">NGINX<\/a><\/noindex> uciele\u015bnia przyk\u0142ad nowoczesnego stosu, wdro\u017conego w ka\u017cdym z wymienionych j\u0119zyk\u00f3w.<\/p>\n<p>Zauwa\u017c, \u017ce nie propagujemy wy\u0142\u0105cznie podej\u015bcia mikro us\u0142ugowego. Wielu z was pracuje z monolitami, kt\u00f3re musz\u0105 ewoluowa\u0107, podczas gdy inni maj\u0105 do czynienia z aplikacjami SOA, kt\u00f3re rozwijaj\u0105 si\u0119 i przekszta\u0142caj\u0105 si\u0119 w mikro us\u0142ugi. Niekt\u00f3rzy pod\u0105\u017caj\u0105 w kierunku stosowania aplikacji bezserwerowych (serverless), a niekt\u00f3rzy wprowadzaj\u0105 kombinacje z powy\u017cszymi. Zasady przedstawione w artykule maj\u0105 zastosowanie do ka\u017cdego z tych system\u00f3w, z pewnymi drobnymi modyfikacjami. <\/p>\n<p><b>Zasady<\/b><\/p>\n<p>Teraz, kiedy osi\u0105gn\u0119li\u015bmy wsp\u00f3lne zrozumienie, czym jest nowoczesna aplikacja i nowoczesny stos technologiczny, nadszed\u0142 czas, aby zanurzy\u0107 si\u0119 w zasady architektury i rozwoju, kt\u00f3re b\u0119d\u0105 wam s\u0142u\u017cy\u0107 w opracowywaniu, wdra\u017caniu i utrzymywaniu nowoczesnej aplikacji.<\/p>\n<p>Jedna z zasad brzmi: \u201etw\u00f3rz ma\u0142e aplikacje\u201d, nazwijmy j\u0105 po prostu <i>zasad\u0105 ma\u0142o\u015bci<\/i>. Istniej\u0105 niezwykle z\u0142o\u017cone aplikacje, kt\u00f3re sk\u0142adaj\u0105 si\u0119 z wielu ruchomych komponent\u00f3w. Z kolei budowanie aplikacji z ma\u0142ych dyskretnych komponent\u00f3w upraszcza jej projektowanie, konserwacj\u0119 i og\u00f3lne dzia\u0142anie. (Zauwa\u017ccie, powiedzieli\u015bmy \u201eupraszcza\u201d, a nie \u201eczyni prostym\u201d).<\/p>\n<p>Druga zasada polega na tym, \u017ce mo\u017cemy zwi\u0119kszy\u0107 produktywno\u015b\u0107 programist\u00f3w, pomagaj\u0105c im skupi\u0107 si\u0119 na funkcjach, kt\u00f3re opracowuj\u0105, zwalniaj\u0105c ich od trosk o infrastruktur\u0119 i CI\/CD podczas realizacji. A wi\u0119c, w skr\u00f3cie, nasze podej\u015bcie <i>jest zorientowane na programist\u00f3w<\/i>.<\/p>\n<p>Wreszcie, wszystko, co dotyczy waszej aplikacji, powinno by\u0107 pod\u0142\u0105czone do sieci. W ci\u0105gu ostatnich 20 lat znacznie posun\u0119li\u015bmy si\u0119 ku przysz\u0142o\u015bci sieci, poniewa\u017c sieci sta\u0142y si\u0119 szybsze, a aplikacje bardziej z\u0142o\u017cone. Jak ju\u017c ustalili\u015bmy, nowoczesna aplikacja powinna by\u0107 u\u017cywana przez wiele r\u00f3\u017cnych klient\u00f3w w sieci. Zastosowanie my\u015blenia sieciowego w architekturze ma znacz\u0105ce zalety, kt\u00f3re dobrze wsp\u00f3\u0142graj\u0105 z <i>zasad\u0105 ma\u0142o\u015bci<\/i> i koncepcj\u0105 podej\u015bcia, <i>kt\u00f3re jest zorientowane na programist\u00f3w<\/i>.<\/p>\n<p>Je\u015bli przy projektowaniu i wdra\u017caniu aplikacji b\u0119dziecie pami\u0119ta\u0107 o tych zasadach, b\u0119dziecie mie\u0107 niezaprzeczaln\u0105 przewag\u0119 w rozwoju i dostarczaniu swojego produktu.<\/p>\n<p>Przyjrzyjmy si\u0119 tym trzynom zasadom bardziej szczeg\u00f3\u0142owo.<\/p>\n<p><b>Zasada ma\u0142o\u015bci<\/b><\/p>\n<p>Ludzki m\u00f3zg ma trudno\u015bci z jednoczesnym przetwarzaniem du\u017cej ilo\u015bci informacji. W psychologii termin \u201eobci\u0105\u017cenie poznawcze\u201d oznacza og\u00f3ln\u0105 ilo\u015b\u0107 wysi\u0142ku umys\u0142owego potrzebnego do zapami\u0119tania informacji. Zmniejszenie obci\u0105\u017cenia poznawczego programist\u00f3w jest priorytetowe, poniewa\u017c w takim przypadku mog\u0105 oni skoncentrowa\u0107 si\u0119 na rozwi\u0105zaniu problemu, zamiast utrzymywa\u0107 w g\u0142owie aktualny, z\u0142o\u017cony model ca\u0142ej aplikacji i opracowywanych funkcji. <\/p>\n<p><img decoding=\"async\" alt=\"Zasady tworzenia nowoczesnych aplikacji wed\u0142ug NGINX. Cz\u0119\u015b\u0107 1\" src=\"\/wp-content\/uploads\/26df2016a46d8b82b45832fe1df9bf23.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Aplikacje s\u0105 dekomponowane z nast\u0119puj\u0105cych powod\u00f3w:<\/p>\n<ul>\n<li>Zmniejszenie obci\u0105\u017cenia poznawczego dla programist\u00f3w;<\/li>\n<li>Przyspieszenie i uproszczenie testowania;<\/li>\n<li>Szybkie dostarczanie zmian w aplikacji.<\/li>\n<\/ul>\n<p><\/i><br \/>\nIstnieje kilka sposob\u00f3w, aby zmniejszy\u0107 obci\u0105\u017cenie poznawcze dla programist\u00f3w, i tu z pomoc\u0105 przychodzi zasada ma\u0142o\u015bci.<\/p>\n<p>Zatem trzy sposoby na obni\u017cenie obci\u0105\u017cenia poznawczego:<\/p>\n<ol>\n<li>Zmniejszy\u0107 ramy czasowe, kt\u00f3re musz\u0105 by\u0107 brane pod uwag\u0119 podczas tworzenia nowej funkcji \u2013 im kr\u00f3tszy czas, tym ni\u017csze obci\u0105\u017cenie poznawcze.<\/li>\n<li>Zmniejszy\u0107 ilo\u015b\u0107 kodu, nad kt\u00f3rym pracuj\u0105 jednocze\u015bnie \u2013 mniej kodu \u2013 mniejsze obci\u0105\u017cenie.<\/li>\n<li>Upro\u015bci\u0107 proces wprowadzania inkrementalnych zmian w aplikacji.<\/li>\n<\/ol>\n<p>\n<b>Zmniejszenie ram czasowych w rozwijaniu<\/b><\/p>\n<p>Powr\u00f3\u0107my do czas\u00f3w, gdy metodologia <code>waterfall<\/code> by\u0142a standardem w procesie rozwoju, a ramy czasowe od sze\u015bciu miesi\u0119cy do dw\u00f3ch lat na opracowanie lub aktualizacj\u0119 aplikacji by\u0142y powszechn\u0105 praktyk\u0105. Zazwyczaj in\u017cynierowie najpierw czytali odpowiednie dokumenty, takie jak wymagania produktu (PRD), dokument referencyjny systemu (SRD), plan architektury i zaczynali \u0142\u0105czy\u0107 te wszystkie rzeczy w jedn\u0105 model poznawczy, wed\u0142ug kt\u00f3rego pisali kod. W miar\u0119 jak wymagania i architektura si\u0119 zmienia\u0142y, nale\u017ca\u0142o w\u0142o\u017cy\u0107 wiele wysi\u0142ku, aby poinformowa\u0107 ca\u0142y zesp\u00f3\u0142 o aktualizacjach modelu poznawczego. Takie podej\u015bcie w najgorszym przypadku mog\u0142o po prostu sparali\u017cowa\u0107 prac\u0119.<\/p>\n<p>Najwi\u0119ksz\u0105 zmian\u0105 w procesie tworzenia aplikacji by\u0142o wprowadzenie metodologii agile. Jedn\u0105 z kluczowych cech metodologii <code>agile<\/code> jest iteracyjne programowanie. To z kolei prowadzi do zmniejszenia obci\u0105\u017cenia poznawczego in\u017cynier\u00f3w. Zamiast wymaga\u0107 od zespo\u0142u programistycznego wdro\u017cenia aplikacji w jednym d\u0142ugim cyklu, <code>agile<\/code> podej\u015bcie to pozwala koncentrowa\u0107 si\u0119 na ma\u0142ych fragmentach kodu, kt\u00f3re mo\u017cna szybko testowa\u0107 i wdra\u017ca\u0107, otrzymuj\u0105c jednocze\u015bnie feedback. Obci\u0105\u017cenie poznawcze aplikacji przesun\u0119\u0142o si\u0119 z ram czasu od sze\u015bciu miesi\u0119cy do dw\u00f3ch lat, bior\u0105c pod uwag\u0119 ogromn\u0105 liczb\u0119 specyfikacji, na dwutygodniowe dodanie lub zmian\u0119 funkcji, z bardziej rozmytym zrozumieniem du\u017cej aplikacji.<\/p>\n<p>Przesuni\u0119cie uwagi z masywnych aplikacji na konkretne ma\u0142e funkcje, kt\u00f3re mog\u0105 by\u0107 zrealizowane w dwutygodniowym sprincie, z my\u015bleniem o maksymalnie jednej funkcji na nast\u0119pny sprint, stanowi znaczn\u0105 zmian\u0119. Umo\u017cliwi\u0142o to zwi\u0119kszenie produktywno\u015bci rozwoju, jednocze\u015bnie zmniejszaj\u0105c obci\u0105\u017cenie poznawcze, kt\u00f3re nieustannie si\u0119 zmienia.<\/p>\n<p>W metodologii <code>agile<\/code> zak\u0142ada si\u0119, \u017ce ko\u0144cowa aplikacja b\u0119dzie nieco zmienion\u0105 wersj\u0105 pierwotnej koncepcji, dlatego ostateczny punkt zako\u0144czenia rozwoju musi by\u0107 zasadniczo niejednoznaczny. Jasne i wyra\u017ane mog\u0105 by\u0107 tylko wyniki ka\u017cdego konkretnego sprintu.<\/p>\n<p><b>Ma\u0142e bazy kodu<\/b><\/p>\n<p>Nast\u0119pnym krokiem w zmniejszaniu obci\u0105\u017cenia poznawczego jest redukcja bazy kodu. Zazwyczaj nowoczesne aplikacje s\u0105 masywne \u2013 solidna, korporacyjna aplikacja mo\u017ce sk\u0142ada\u0107 si\u0119 z tysi\u0119cy plik\u00f3w i setek tysi\u0119cy linii kodu. W zale\u017cno\u015bci od organizacji plik\u00f3w, zwi\u0105zki i zale\u017cno\u015bci mi\u0119dzy kodem a plikami mog\u0105 by\u0107 oczywiste lub wr\u0119cz przeciwnie. Nawet debugowanie samego wykonania kodu mo\u017ce stwarza\u0107 problemy, w zale\u017cno\u015bci od u\u017cywanych bibliotek i tego, jak dobrze narz\u0119dzia do debugowania oddzielaj\u0105 biblioteki\/pakiety\/modu\u0142y od kodu u\u017cytkownika.<\/p>\n<p>Stworzenie roboczej mentalnej mapy kodu aplikacji mo\u017ce zaj\u0105\u0107 znaczn\u0105 ilo\u015b\u0107 czasu i ponownie na\u0142o\u017cy\u0107 na dewelopera du\u017c\u0105 kognitywn\u0105 ci\u0119\u017car. Jest to szczeg\u00f3lnie charakterystyczne dla monolitycznych baz kodu, w kt\u00f3rych wyst\u0119puje wiele kodu, a interakcja mi\u0119dzy komponentami funkcjonalnymi nie jest jasno okre\u015blona, a podzia\u0142 obiekt\u00f3w uwagi jest cz\u0119sto zamazany, poniewa\u017c nie s\u0105 przestrzegane granice funkcjonalne. <\/p>\n<p>Jednym z efektywnych sposob\u00f3w na zmniejszenie obci\u0105\u017cenia poznawczego in\u017cynier\u00f3w jest przej\u015bcie na architektur\u0119 mikrous\u0142ug. W podej\u015bciu mikrous\u0142ugowym ka\u017cdy serwis koncentruje si\u0119 na jednym zestawie funkcji; w tym sensie serwis jest zazwyczaj jasno zdefiniowany i zrozumia\u0142y. Granice serwisu s\u0105 tak\u017ce jasne \u2013 pami\u0119taj, \u017ce komunikacja z serwisem odbywa si\u0119 za po\u015brednictwem API, wi\u0119c dane generowane przez jeden serwis mog\u0105 by\u0107 \u0142atwo przekazywane do innego.<\/p>\n<p>Interakcja z innymi us\u0142ugami jest zazwyczaj ograniczona do kilku us\u0142ug u\u017cytkownik\u00f3w i kilku us\u0142ug dostawcy, kt\u00f3re wykorzystuj\u0105 proste i czyste wywo\u0142ania API, na przyk\u0142ad za pomoc\u0105 REST. To znacznie redukuje obci\u0105\u017cenie poznawcze in\u017cyniera. Najtrudniejszym zadaniem pozostaje zrozumienie modelu interakcji us\u0142ug i tego, jak takie rzeczy jak transakcje przebiegaj\u0105 w wielu us\u0142ugach. Ostatecznie wykorzystanie mikroserwis\u00f3w zmniejsza obci\u0105\u017cenie poznawcze, redukuj\u0105c ilo\u015b\u0107 kodu, wyznaczaj\u0105c wyra\u017ane granice us\u0142ugi i zapewniaj\u0105c zrozumienie relacji mi\u0119dzy u\u017cytkownikami a dostawcami.<\/p>\n<p><b>Ma\u0142e, inkrementalne zmiany<\/b><\/p>\n<p>Ostatni element zasady <i>drobnostki<\/i> \u2013 to zarz\u0105dzanie zmianami. Deweloperzy cz\u0119sto maj\u0105 pokus\u0119 spojrze\u0107 na baz\u0119 kodu (nawet na sw\u00f3j w\u0142asny, starszy kod) i stwierdzi\u0107: \u201eTo jest z\u0142e, musimy to wszystko przepisa\u0107.\u201d Czasami to w\u0142a\u015bciwa decyzja, a czasami nie. Nosi to ze sob\u0105 ci\u0119\u017car globalnej zmiany modelu na zesp\u00f3\u0142 deweloperski, co z kolei prowadzi do du\u017cego obci\u0105\u017cenia poznawczego. Lepiej, aby in\u017cynierowie koncentrowali si\u0119 na zmianach, kt\u00f3re mog\u0105 wprowadzi\u0107 w ci\u0105gu sprintu, aby nast\u0119pnie terminowo wdro\u017cy\u0107 potrzebn\u0105 funkcjonalno\u015b\u0107, nawet je\u015bli stopniowo. Finalny produkt powinien przypomina\u0107 wst\u0119pnie zaplanowany, ale z pewnymi zmianami i testowaniem, aby odpowiada\u0142 potrzebom klienta.<\/p>\n<p>Podczas przepisywania du\u017cych fragment\u00f3w kodu czasami szybka realizacja zmian okazuje si\u0119 niemo\u017cliwa, gdy\u017c w gr\u0119 wchodz\u0105 inne zale\u017cno\u015bci systemu. Aby kontrolowa\u0107 przep\u0142yw zmian, mo\u017cna zastosowa\u0107 ukrywanie funkcji (feature hiding). W zasadzie oznacza to, \u017ce funkcjonalno\u015b\u0107 istnieje w \u015brodowisku produkcyjnym, ale nie jest dost\u0119pna przez ustawienia zmiennych \u015brodowiskowych (env-var) lub jaki\u015b inny mechanizm konfiguracyjny. Je\u015bli kod przeszed\u0142 wszystkie procesy kontroli jako\u015bci, mo\u017ce znale\u017a\u0107 si\u0119 w produkcji w ukrytym stanie. Ta strategia dzia\u0142a jednak tylko wtedy, gdy funkcja ostatecznie zostanie w\u0142\u0105czona. W przeciwnym razie jedynie za\u015bmieci kod i zwi\u0119kszy obci\u0105\u017cenie poznawcze, z kt\u00f3rym deweloper b\u0119dzie musia\u0142 sobie poradzi\u0107, aby pracowa\u0107 wydajnie. Zarz\u0105dzanie zmianami i zmiany inkrementalne same w sobie pomagaj\u0105 utrzyma\u0107 obci\u0105\u017cenie poznawcze deweloper\u00f3w na dost\u0119pnym poziomie. <\/p>\n<p>In\u017cynierowie musz\u0105 pokonywa\u0107 wiele trudno\u015bci nawet przy prostym wdra\u017caniu dodatkowej funkcjonalno\u015bci. Z perspektywy kierownictwa rozs\u0105dne b\u0119dzie zmniejszenie zb\u0119dnego obci\u0105\u017cenia dla zespo\u0142u, aby m\u00f3g\u0142 skupi\u0107 si\u0119 na kluczowych elementach funkcjonalno\u015bci. Istniej\u0105 trzy rzeczy, kt\u00f3re mo\u017cesz zrobi\u0107, aby pom\u00f3c swojemu zespo\u0142owi deweloper\u00f3w:<\/p>\n<ol>\n<li>Zastosowa\u0107 metodologi\u0119 <code>agile<\/code>, aby ograniczy\u0107 ramy czasowe, w kt\u00f3rych zesp\u00f3\u0142 musi skupi\u0107 si\u0119 na kluczowych funkcjach.<\/li>\n<li>Zrealizowa\u0107 swoje aplikacje jako kilka mikroserwis\u00f3w. Ograniczy to liczb\u0119 wdra\u017canych funkcji i wzmocni granice, kt\u00f3re utrzymuj\u0105 obci\u0105\u017cenie poznawcze podczas pracy.<\/li>\n<li>Preferuj zmiany inkrementalne wobec du\u017cych i niepor\u0119cznych, zmieniaj ma\u0142e fragmenty kodu. Stosuj ukrywanie funkcji, aby wprowadza\u0107 zmiany, nawet je\u015bli nie b\u0119d\u0105 one widoczne od razu po dodaniu.<\/li>\n<\/ol>\n<p>\nJe\u015bli zastosujesz zasad\u0119 ma\u0142o\u015bci w swojej pracy, tw\u00f3j zesp\u00f3\u0142 stanie si\u0119 znacznie szcz\u0119\u015bliwszy, lepiej skupi si\u0119 na realizacji niezb\u0119dnych funkcji i b\u0119dzie mia\u0142 wi\u0119ksz\u0105 szans\u0119 na szybkie wprowadzenie jako\u015bciowych zmian. Jednak to nie oznacza, \u017ce praca nie mo\u017ce sta\u0107 si\u0119 bardziej skomplikowana; czasami wprowadzenie nowej funkcjonalno\u015bci wymaga modyfikacji kilku serwis\u00f3w, a ten proces mo\u017ce by\u0107 trudniejszy ni\u017c w przypadku architektury monolitycznej. W ka\u017cdym razie, korzy\u015bci p\u0142yn\u0105ce z zastosowania podej\u015bcia ma\u0142o\u015bci s\u0105 tego warte.<\/p>\n<p>Koniec pierwszej cz\u0119\u015bci.<\/p>\n<p>Wkr\u00f3tce opublikujemy drug\u0105 cz\u0119\u015b\u0107 t\u0142umaczenia, a teraz czekamy na wasze komentarze i zapraszamy na <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/mJ6e\/\">dzie\u0144 otwarty<\/a><\/noindex>, kt\u00f3ry odb\u0119dzie si\u0119 ju\u017c dzisiaj o 20:00.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <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.1.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\/pl\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Zasady tworzenia nowoczesnych aplikacji od NGINX. Cz\u0119\u015b\u0107 1 | ProHoster","description":"Cze\u015b\u0107, przyjaciele.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/34140","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=34140"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/34140\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=34140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=34140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=34140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}