{"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\/sv\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","title":{"rendered":"Principer f\u00f6r utveckling av moderna applikationer fr\u00e5n NGINX. Del 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hej, v\u00e4nner. I inf\u00f6randet av kursen <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/h4Ez\/\">\u00abBackend-utvecklare p\u00e5 PHP\u00bb<\/a><\/noindex>, delar vi traditionellt med oss av en \u00f6vers\u00e4ttning av nytt material.<\/p>\n<p>Programvaran l\u00f6ser allt fler vardagliga uppgifter, samtidigt som den blir mer och mer komplex. Som Mark Andreessen en g\u00e5ng sa, den konsumerar v\u00e4rlden. <\/p>\n<p><img decoding=\"async\" alt=\"Principer f\u00f6r utveckling av moderna applikationer fr\u00e5n NGINX. Del 1\" src=\"\/wp-content\/uploads\/928924e3036beaac518dd4a2674a8a30.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSom ett resultat har angreppss\u00e4tten f\u00f6r utveckling och leverans av applikationer f\u00f6r\u00e4ndrats avsev\u00e4rt under de senaste \u00e5ren. Det har skett tektoniska skift som har lett till en upps\u00e4ttning principer. Dessa principer har visat sig vara anv\u00e4ndbara f\u00f6r att forma team, designa, utveckla och leverera din applikation till slutanv\u00e4ndarna. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Principerna kan sammanfattas p\u00e5 f\u00f6ljande s\u00e4tt: <i>applikationen ska vara liten, n\u00e4tverksbaserad och ha en utvecklarfokuserad arkitektur.<\/i>Genom att basera er p\u00e5 dessa tre principer kan ni skapa en p\u00e5litlig, omfattande applikation som snabbt och s\u00e4kert kan levereras till slutanv\u00e4ndaren, samt enkelt skalas och utvidgas.<\/p>\n<p><img decoding=\"async\" alt=\"Principer f\u00f6r utveckling av moderna applikationer fr\u00e5n NGINX. Del 1\" src=\"\/wp-content\/uploads\/9116869a53fb6cf89d92f1d507d7904f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVarje f\u00f6reslagen princip har ett antal aspekter som vi kommer att diskutera f\u00f6r att visa hur varje princip bidrar till det slutgiltiga m\u00e5let, vilket \u00e4r snabb leverans av p\u00e5litliga applikationer som \u00e4r enkla att underh\u00e5lla och anv\u00e4nda. Vi kommer att betrakta principerna i j\u00e4mf\u00f6relse med sina motsatser, f\u00f6r att klarg\u00f6ra vad som menas med, till exempel, \"Se till att du anv\u00e4nder <i>principen om litenhet.<\/i>\u00bb.<\/p>\n<p>Vi hoppas att denna artikel inspirerar er att till\u00e4mpa de f\u00f6reslagna principerna f\u00f6r att bygga moderna applikationer som s\u00e4kerst\u00e4ller en enhetlig designansats i sammanhanget av en st\u00e4ndigt v\u00e4xande teknikstack. <\/p>\n<p>Genom att till\u00e4mpa dessa principer kommer ni att uppt\u00e4cka att ni f\u00f6ljer de senaste trenderna inom programvaruutveckling, inklusive angreppss\u00e4ttet <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/devops\/\">DevOps<\/a><\/noindex> f\u00f6r utveckling och leverans av applikationer, anv\u00e4ndning av containrar (t.ex. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/docker\/\">Docker<\/a><\/noindex>), och ramverk f\u00f6r orkestrering av containrar (t.ex. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/kubernetes\/\">Kubernetes<\/a><\/noindex>), anv\u00e4ndning av mikrotj\u00e4nster (inklusive Mikrotj\u00e4nstarkitektur <noindex>NGINX<\/noindex> och <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/what-is-a-service-mesh\/\">n\u00e4tverksarkitektur<\/a><\/noindex> f\u00f6r mikrotj\u00e4nstapplikationer.<\/p>\n<p><b>Vad \u00e4r en modern applikation?<\/b><\/p>\n<p>Moderna applikationer? Modern teknikstack? Vad inneb\u00e4r egentligen \"modern\"? <\/p>\n<p>De flesta utvecklare har bara en allm\u00e4n uppfattning om vad som utg\u00f6r en modern applikation, s\u00e5 det \u00e4r viktigt att ge en tydlig definition av detta begrepp.<\/p>\n<p>En modern applikation st\u00f6der flera klienter, oavsett om det \u00e4r ett anv\u00e4ndargr\u00e4nssnitt med JavaScript-biblioteket React, en mobilapplikation f\u00f6r Android eller iOS, eller en applikation som ansluter till en annan via API. En modern applikation inneb\u00e4r att det finns ett obest\u00e4mt antal klienter som den tillhandah\u00e5ller data eller tj\u00e4nster f\u00f6r.<\/p>\n<p>En modern applikation tillhandah\u00e5ller ett API f\u00f6r att f\u00e5 \u00e5tkomst till de beg\u00e4rda uppgifterna och tj\u00e4nsterna. API:t b\u00f6r vara of\u00f6r\u00e4ndrat och konstant, snarare \u00e4n skrivet specifikt f\u00f6r en viss f\u00f6rfr\u00e5gan fr\u00e5n en specifik klient. API:t \u00e4r tillg\u00e4ngligt via HTTP(S) och ger \u00e5tkomst till all funktionalitet som finns i GUI eller CLI. <\/p>\n<p>Data b\u00f6r vara tillg\u00e4ngliga i ett allm\u00e4nt accepterat, kompatibelt format, som JSON. API:t erbjuder objekt och tj\u00e4nster i ett f\u00f6rst\u00e5eligt, organiserat format, till exempel RESTful API eller GraphQL som ger ett anst\u00e4ndigt gr\u00e4nssnitt.<\/p>\n<p>Moderna applikationer byggs p\u00e5 en modern stack, och en modern stack \u00e4r den som st\u00f6der s\u00e5dana applikationer. Denna stack g\u00f6r det m\u00f6jligt f\u00f6r utvecklaren att enkelt skapa en applikation med HTTP-gr\u00e4nssnitt och tydliga API-slutpunkter. Den valda tillv\u00e4gag\u00e5ngss\u00e4tt g\u00f6r att din applikation enkelt kan ta emot och skicka data i JSON-format. Med andra ord motsvarar den moderna stacken elementen i Twelve-Factor-applikationen f\u00f6r <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/microservices-reference-architecture-nginx-twelve-factor-app\/\">mikrotj\u00e4nster<\/a><\/noindex>. <\/p>\n<p>Popul\u00e4ra versioner av denna typ av stack baseras p\u00e5 <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> och <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-content-service\">Go<\/a><\/noindex>. Mikrotj\u00e4nstarkitektur <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-ingenious\">NGINX<\/a><\/noindex> representerar ett exempel p\u00e5 en modern stack, implementerad p\u00e5 vart och ett av de n\u00e4mnda spr\u00e5ken.<\/p>\n<p>Observera att vi inte f\u00f6respr\u00e5kar enbart en mikrotj\u00e4nstansats. M\u00e5nga av er arbetar med monoliter som m\u00e5ste utvecklas, medan andra hanterar SOA-applikationer som utvidgas och utvecklas till att bli mikrotj\u00e4nstapplikationer. Tredje gruppen r\u00f6r sig mot att till\u00e4mpa serverl\u00f6sa applikationer, medan vissa implementerar kombinationer av ovanst\u00e5ende. Principerna som beskrivs i artikeln \u00e4r till\u00e4mpliga p\u00e5 var och en av dessa system med vissa mindre justeringar. <\/p>\n<p><b>Principerna<\/b><\/p>\n<p>Nu n\u00e4r vi har uppn\u00e5tt en gemensam f\u00f6rst\u00e5else f\u00f6r vad moderna applikationer och moderna stackar \u00e4r, \u00e4r det dags att dyka ner i de arkitektur- och utvecklingsprinciper som kommer att vara till stor nytta f\u00f6r er i utvecklingen, implementeringen och underh\u00e5llet av moderna applikationer.<\/p>\n<p>En av principerna l\u00e5ter som \"skapa sm\u00e5 applikationer\", l\u00e5t oss kalla den <i>principen om litenhet<\/i>. Det finns enormt komplexa applikationer som best\u00e5r av m\u00e5nga r\u00f6rliga komponenter. Att bygga en applikation av sm\u00e5 diskreta komponenter f\u00f6renklar dess design, underh\u00e5ll och arbete \u00f6verlag. (Notera att vi sa \"f\u00f6renklar\" och inte \"g\u00f6r enkelt\").<\/p>\n<p>Den andra principen \u00e4r att vi kan \u00f6ka utvecklarnas produktivitet genom att hj\u00e4lpa dem att koncentrera sig p\u00e5 de funktioner de utvecklar, samtidigt som vi frig\u00f6r dem fr\u00e5n oro \u00f6ver infrastruktur och CI\/CD under implementeringen. S\u00e5, sammanfattningsvis, v\u00e5r metod <i>\u00e4r utvecklarorienterad<\/i>.<\/p>\n<p>Slutligen, allt som r\u00f6r din applikation b\u00f6r vara kopplat till n\u00e4tverket. Under de senaste 20 \u00e5ren har vi gjort stora framsteg mot en n\u00e4tverksframtid eftersom n\u00e4tverken har blivit snabbare och applikationerna mer komplexa. Som vi redan har konstaterat, b\u00f6r moderna applikationer anv\u00e4ndas \u00f6ver n\u00e4tverket av m\u00e5nga olika klienter. Att till\u00e4mpa ett n\u00e4tverksinriktat t\u00e4nkande i arkitekturen har betydande f\u00f6rdelar som passar bra med <i>principen om litenhet<\/i> och konceptet av <i>utvecklarorienterad<\/i>.<\/p>\n<p>Om du h\u00e5ller dessa principer i minnet vid utveckling och implementering av en applikation, kommer du att ha en oemotst\u00e5ndlig f\u00f6rdel i utvecklingen och leveransen av din produkt.<\/p>\n<p>L\u00e5t oss titta p\u00e5 dessa tre principer mer i detalj.<\/p>\n<p><b>Principen om litenhet<\/b><\/p>\n<p>Det m\u00e4nskliga sinnet har sv\u00e5rt att ta in stora m\u00e4ngder information samtidigt. Inom psykologi h\u00e4nvisar termen kognitiv belastning till den totala m\u00e4ngden mentala insatser som kr\u00e4vs f\u00f6r att h\u00e5lla information i minnet. Att minska den kognitiva belastningen hos utvecklare \u00e4r en prioritet eftersom de d\u00e5 kan fokusera p\u00e5 att l\u00f6sa problem ist\u00e4llet f\u00f6r att h\u00e5lla en komplex modell av hela applikationen och de funktioner som utvecklas i huvudet. <\/p>\n<p><img decoding=\"async\" alt=\"Principer f\u00f6r utveckling av moderna applikationer fr\u00e5n NGINX. Del 1\" src=\"\/wp-content\/uploads\/26df2016a46d8b82b45832fe1df9bf23.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Applikationer dekomponeras av f\u00f6ljande sk\u00e4l:<\/p>\n<ul>\n<li>Minska den kognitiva belastningen p\u00e5 utvecklarna;<\/li>\n<li>Snabbare och enklare testning;<\/li>\n<li>Snabb leverans av \u00e4ndringar i applikationen.<\/li>\n<\/ul>\n<p><\/i><br \/>\nDet finns flera s\u00e4tt att minska den kognitiva belastningen p\u00e5 utvecklarna, och h\u00e4r kommer principen om sm\u00e5skalighet in i bilden.<\/p>\n<p>S\u00e5, tre s\u00e4tt att minska den kognitiva belastningen:<\/p>\n<ol>\n<li>Minska tidsramarna som de m\u00e5ste ta h\u00e4nsyn till vid utvecklingen av en ny funktion \u2013 ju kortare tidsram, desto l\u00e4gre kognitiv belastning.<\/li>\n<li>Minska m\u00e4ngden kod som hanteras samtidigt \u2013 mindre kod = mindre belastning.<\/li>\n<li>F\u00f6renkla processen att g\u00f6ra inkrementella \u00e4ndringar i applikationen.<\/li>\n<\/ol>\n<p>\n<b>Minskning av utvecklingens tidsramar<\/b><\/p>\n<p>L\u00e5t oss \u00e5terv\u00e4nda till en tid n\u00e4r metodologin <code>waterfall<\/code> var standard i utvecklingsprocessen, och tidsramar p\u00e5 mellan sex m\u00e5nader och tv\u00e5 \u00e5r f\u00f6r att utveckla eller uppdatera en applikation var vanligt. Generellt sett l\u00e4ste ingenj\u00f6rerna f\u00f6rst de relevanta dokumenten, s\u00e5som produktkrav (PRD), systemreferensdokument (SRD), arkitekturplanen och b\u00f6rjade sammanfoga alla dessa saker i en kognitiv modell som de skrev kod efter. Allteftersom kraven och d\u00e4rmed arkitekturen f\u00f6r\u00e4ndrades, kr\u00e4vdes stora insatser f\u00f6r att informera hela teamet om uppdateringarna av den kognitiva modellen. Ett s\u00e5dant tillv\u00e4gag\u00e5ngss\u00e4tt kunde i v\u00e4rsta fall helt paralysera arbetet.<\/p>\n<p>Den st\u00f6rsta f\u00f6r\u00e4ndringen i utvecklingsprocessen f\u00f6r applikationer var inf\u00f6randet av agile-metodologin. En av de fr\u00e4msta egenskaperna hos <code>agile<\/code> -metodologin \u00e4r iterativ utveckling. Detta i sin tur leder till att den kognitiva belastningen p\u00e5 ingenj\u00f6rerna minskar. Ist\u00e4llet f\u00f6r att kr\u00e4va att utvecklarteamet genomf\u00f6r applikationen under en l\u00e5ng cykel, <code>agile<\/code> m\u00f6jligg\u00f6r tillv\u00e4gag\u00e5ngss\u00e4ttet att fokusera p\u00e5 sm\u00e5 kodm\u00e4ngder som snabbt kan testas och implementeras, samtidigt som man f\u00e5r feedback. Den kognitiva belastningen f\u00f6r applikationen har flyttats fr\u00e5n tidsramar p\u00e5 sex m\u00e5nader till tv\u00e5 \u00e5r i samband med ett stort antal specifikationer till en tv\u00e5veckors tillsats eller \u00e4ndring av funktioner, med fokus p\u00e5 en mer diffus f\u00f6rst\u00e5else f\u00f6r en stor applikation.<\/p>\n<p>Fokusf\u00f6rflyttning fr\u00e5n en massiv applikation till specifika sm\u00e5 funktioner som kan slutf\u00f6ras under en tv\u00e5veckors sprint, med endast en funktion fr\u00e5n n\u00e4sta sprint i \u00e5tanke, \u00e4r en betydande f\u00f6r\u00e4ndring. Detta har m\u00f6jliggjort \u00f6kad utvecklingsproduktivitet samtidigt som den kognitiva belastningen har minskat, som st\u00e4ndigt har varierat.<\/p>\n<p>I metodologin <code>agile<\/code> antagas den slutliga applikationen vara en n\u00e5got modifierad version av det ursprungliga konceptet, s\u00e5 den slutgiltiga utvecklingspunkten \u00e4r n\u00f6dv\u00e4ndigtvis oklar. Endast resultaten fr\u00e5n varje specifik sprint kan vara tydliga och klara.<\/p>\n<p><b>Sm\u00e5 kodbaser<\/b><\/p>\n<p>N\u00e4sta steg i att minska den kognitiva belastningen \u00e4r att minska kodbasen. Vanligtvis \u00e4r moderna applikationer massiva - en p\u00e5litlig f\u00f6retagsapplikation kan best\u00e5 av tusentals filer och hundratusentals rader kod. Beroende p\u00e5 hur filerna \u00e4r organiserade kan relationerna och beroenden mellan kod och filer vara uppenbara eller tv\u00e4rtom. Till och med fels\u00f6kning av sj\u00e4lva kodens k\u00f6rning kan skapa problem beroende p\u00e5 de anv\u00e4nda biblioteken och hur v\u00e4l fels\u00f6kningsverktygen avgr\u00e4nsar bibliotek\/paket\/moduler och anv\u00e4ndarkod.<\/p>\n<p>Att bygga en mental arbetsmodell av applikationens kod kan ta en avsev\u00e4rd m\u00e4ngd tid och \u00e5terigen belasta utvecklaren med stor kognitiv belastning. Detta \u00e4r s\u00e4rskilt typiskt f\u00f6r monolitiska kodbaser d\u00e4r det finns mycket kod vars interaktion mellan funktionella komponenter inte \u00e4r tydligt definierad, och gr\u00e4nserna f\u00f6r uppm\u00e4rksamhetsobjekten ofta \u00e4r diffusa, d\u00e5 de funktionella gr\u00e4nserna inte respekteras. <\/p>\n<p>Ett effektivt s\u00e4tt att minska den kognitiva belastningen p\u00e5 ingenj\u00f6rerna \u00e4r att \u00f6verg\u00e5 till en mikrotj\u00e4nstarkitektur. I mikrotj\u00e4nstmetoden fokuserar varje tj\u00e4nst p\u00e5 ett specifikt funktionsset; inneb\u00f6rden av tj\u00e4nsten \u00e4r vanligtvis definierad och tydlig. Gr\u00e4nserna f\u00f6r tj\u00e4nsten \u00e4r ocks\u00e5 klara - kom ih\u00e5g att kommunikationen med tj\u00e4nsten sker via API, s\u00e5 data som genereras av en tj\u00e4nst kan enkelt \u00f6verf\u00f6ras till en annan.<\/p>\n<p>Interaktionen med andra tj\u00e4nster \u00e4r vanligtvis begr\u00e4nsade till n\u00e5gra anv\u00e4ndartj\u00e4nster och n\u00e5gra av leverant\u00f6rens tj\u00e4nster som anv\u00e4nder enkla och rena API-anrop, till exempel via REST. Detta minskar den kognitiva belastningen p\u00e5 ingenj\u00f6ren avsev\u00e4rt. Den mest utmanande uppgiften kvarst\u00e5r att f\u00f6rst\u00e5 modellen f\u00f6r interaktion mellan tj\u00e4nster och hur saker som transaktioner sker \u00f6ver flera tj\u00e4nster. Sammanfattningsvis minskar anv\u00e4ndningen av mikrotj\u00e4nster den kognitiva belastningen genom att minska m\u00e4ngden kod, ange tydliga gr\u00e4nser f\u00f6r tj\u00e4nster samt s\u00e4kerst\u00e4lla en f\u00f6rst\u00e5else f\u00f6r relationerna mellan anv\u00e4ndare och leverant\u00f6rer.<\/p>\n<p><b>Sm\u00e5 inkrementella f\u00f6r\u00e4ndringar<\/b><\/p>\n<p>Det sista elementet av principen <i>sm\u00e5 detaljer<\/i> \u2013 \u00e4r f\u00f6r\u00e4ndringshantering. En s\u00e4rskild frestelse f\u00f6r utvecklare \u00e4r att titta p\u00e5 kodbasen (\u00e4ven kanske sin egen \u00e4ldre kod) och s\u00e4ga: \"Det h\u00e4r \u00e4r skr\u00e4p, vi m\u00e5ste skriva om allt det h\u00e4r.\" Ibland \u00e4r det r\u00e4tt beslut, och ibland \u00e4r det inte det. Det l\u00e4gger en tyngd p\u00e5 utvecklarteamet som beh\u00f6ver g\u00f6ra en global f\u00f6r\u00e4ndring av modellen, vilket i sin tur leder till en stor kognitiv belastning. Det \u00e4r b\u00e4ttre att ingenj\u00f6rer fokuserar p\u00e5 de f\u00f6r\u00e4ndringar de kan g\u00f6ra under sprinten, s\u00e5 att de kan lansera n\u00f6dv\u00e4ndig funktionalitet i tid, om \u00e4n gradvis. Den slutliga produkten ska likna det som f\u00f6rst planerades, men med vissa f\u00f6r\u00e4ndringar och tester f\u00f6r att m\u00f6ta kundens behov.<\/p>\n<p>N\u00e4r stora delar av koden skrivs om kan det ibland vara om\u00f6jligt att snabbt leverera f\u00f6r\u00e4ndringar, eftersom andra systemberoenden kommer in i bilden. F\u00f6r att kontrollera f\u00f6r\u00e4ndringsfl\u00f6det kan man anv\u00e4nda funktionell d\u00f6lja (feature hiding). I princip inneb\u00e4r detta att funktionen finns i produktionen, men den \u00e4r otillg\u00e4nglig genom milj\u00f6variabler (env-var) eller n\u00e5got annat konfigurationssystem. Om koden har genomg\u00e5tt alla kvalitetskontroller kan den finnas i produktionen i ett dolt tillst\u00e5nd. Denna strategi fungerar dock endast om funktionen s\u00e5 sm\u00e5ningom kommer att aktiveras. Annars kommer den bara att \u00f6verbelasta koden och \u00f6ka den kognitiva belastningen som utvecklaren m\u00e5ste hantera f\u00f6r att kunna arbeta produktivt. Hantering av f\u00f6r\u00e4ndringar och inkrementella f\u00f6r\u00e4ndringar hj\u00e4lper sj\u00e4lva till att h\u00e5lla utvecklarnas kognitiva belastning p\u00e5 en hanterbar niv\u00e5. <\/p>\n<p>Ingenj\u00f6rer m\u00e5ste \u00f6vervinna m\u00e5nga sv\u00e5righeter \u00e4ven vid enkel implementering av ytterligare funktionalitet. Ur ledningens perspektiv \u00e4r det klokt att minska den on\u00f6diga belastningen p\u00e5 teamet s\u00e5 att de kan fokusera p\u00e5 de viktigaste funktionerna. Det finns tre saker du kan g\u00f6ra f\u00f6r att hj\u00e4lpa ditt utvecklarteam:<\/p>\n<ol>\n<li>Anv\u00e4nda en metodologi <code>agile<\/code>, f\u00f6r att begr\u00e4nsa tidsramarna inom vilka teamet ska fokusera p\u00e5 nyckelfunktionerna.<\/li>\n<li>Genomf\u00f6ra din applikation som flera mikrotj\u00e4nster. Detta begr\u00e4nsar antalet som implementeras funktioner och f\u00f6rst\u00e4rker gr\u00e4nserna som h\u00e5ller den kognitiva belastningen under arbetet.<\/li>\n<li>F\u00f6redra inkrementella f\u00f6r\u00e4ndringar framf\u00f6r stora och skrymmande, f\u00f6r\u00e4ndra sm\u00e5 kodbitar. Anv\u00e4nd funktionell d\u00f6lja f\u00f6r att genomf\u00f6ra f\u00f6r\u00e4ndringar \u00e4ven om de inte kommer att synas direkt efter att de har lagts till.<\/li>\n<\/ol>\n<p>\nOm du till\u00e4mpar principen om sm\u00e5thingar i ditt arbete, kommer ditt team att bli mycket lyckligare, b\u00e4ttre fokusera p\u00e5 att genomf\u00f6ra n\u00f6dv\u00e4ndiga funktioner och med st\u00f6rre sannolikhet snabbt kunna lansera kvalitativa f\u00f6r\u00e4ndringar. Men det betyder inte att arbetet inte kan bli mer komplicerat; ibland kan det tv\u00e4rtom, implementering av nya funktioner kr\u00e4va modifiering av flera tj\u00e4nster och denna process kan vara mer komplicerad \u00e4n motsvarande i en monolitisk arkitektur. I vilket fall som helst, f\u00f6rdelarna med att till\u00e4mpa sm\u00e5thingar \u00e4r v\u00e4rda det.<\/p>\n<p>Slutet av f\u00f6rsta delen.<\/p>\n<p>Snart publicerar vi den andra delen av \u00f6vers\u00e4ttningen, men just nu v\u00e4ntar vi p\u00e5 era kommentarer och bjuder in er till <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/mJ6e\/\">\u00f6ppen hus dag<\/a><\/noindex>, som \u00e4ger rum idag klockan 20.00.<br \/>\n<br \/>K\u00e4lla: <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\/sv\/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=\"sv_SE\" \/>\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\/sv\/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\udd47Principer f\u00f6r utveckling av moderna applikationer fr\u00e5n NGINX. Del 1 | ProHoster","description":"Hej, v\u00e4nner.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/34140","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=34140"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/34140\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=34140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=34140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=34140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}