{"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\/pt\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","title":{"rendered":"Princ\u00edpios de desenvolvimento de aplica\u00e7\u00f5es modernas com NGINX. Parte 1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ol\u00e1, amigos. Na v\u00e9spera do lan\u00e7amento do curso <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/h4Ez\/\">\u00abDesenvolvedor Backend em PHP\u00bb<\/a><\/noindex>, tradicionalmente compartilhamos com voc\u00eas a tradu\u00e7\u00e3o de um material \u00fatil.<\/p>\n<p>O software est\u00e1 resolvendo cada vez mais tarefas do dia a dia, enquanto se torna cada vez mais complexo. Como disse uma vez Marc Andreessen, ele est\u00e1 consumindo o mundo. <\/p>\n<p><img decoding=\"async\" alt=\"Princ\u00edpios de desenvolvimento de aplica\u00e7\u00f5es modernas com NGINX. Parte 1\" src=\"\/wp-content\/uploads\/928924e3036beaac518dd4a2674a8a30.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nComo resultado, nos \u00faltimos anos, as abordagens para desenvolvimento e entrega de aplicativos mudaram drasticamente. Foram mudan\u00e7as de escala tect\u00f4nica que levaram ao surgimento de um conjunto de princ\u00edpios. Esses princ\u00edpios se mostraram \u00fateis na forma\u00e7\u00e3o de equipes, no design, desenvolvimento e entrega de seu aplicativo para os usu\u00e1rios finais. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Os princ\u00edpios podem ser resumidos da seguinte forma: <i>o aplicativo deve ser pequeno, em rede e ter uma arquitetura orientada ao desenvolvedor<\/i>. Com base nesses tr\u00eas princ\u00edpios, voc\u00ea pode criar um aplicativo robusto e complexo que pode ser entregue rapidamente e de forma segura ao usu\u00e1rio final, al\u00e9m de ser facilmente escal\u00e1vel e expans\u00edvel.<\/p>\n<p><img decoding=\"async\" alt=\"Princ\u00edpios de desenvolvimento de aplica\u00e7\u00f5es modernas com NGINX. Parte 1\" src=\"\/wp-content\/uploads\/9116869a53fb6cf89d92f1d507d7904f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCada um dos princ\u00edpios propostos possui uma s\u00e9rie de aspectos que discutiremos para mostrar como cada princ\u00edpio contribui para alcan\u00e7ar o objetivo final, que \u00e9 a entrega r\u00e1pida de aplicativos confi\u00e1veis, f\u00e1ceis de manter e usar. Vamos considerar os princ\u00edpios em compara\u00e7\u00e3o com seus opostos, para esclarecer o que significa, por exemplo, 'Certifique-se de usar o <i>princ\u00edpio da pequena dimens\u00e3o<\/i>\u00bb.<\/p>\n<p>Esperamos que este artigo incentive voc\u00ea a utilizar os princ\u00edpios propostos para construir aplicativos modernos, que garantir\u00e3o uma abordagem \u00fanica ao design no contexto de uma pilha de tecnologias em constante crescimento. <\/p>\n<p>Ao aplicar esses princ\u00edpios, voc\u00ea descobrir\u00e1 que est\u00e1 aproveitando as \u00faltimas tend\u00eancias em desenvolvimento de software, incluindo a abordagem <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/devops\/\">DevOps<\/a><\/noindex> para desenvolvimento e entrega de aplicativos, o uso de cont\u00eaineres (por exemplo, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/docker\/\">Docker<\/a><\/noindex>) e frameworks para orquestra\u00e7\u00e3o de cont\u00eaineres (por exemplo, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/tag\/kubernetes\/\">Kubernetes<\/a><\/noindex>), o uso de microsservi\u00e7os (incluindo Arquitetura de Microsservi\u00e7os <noindex>NGINX<\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/what-is-a-service-mesh\/\">arquitetura de rede<\/a><\/noindex> para aplicativos de microsservi\u00e7os.<\/p>\n<p><b>O que \u00e9 um aplicativo moderno?<\/b><\/p>\n<p>Aplicativos modernos? Pilha moderna? O que exatamente significa 'moderno'? <\/p>\n<p>A maioria dos desenvolvedores tem apenas uma ideia geral do que constitui um aplicativo moderno, portanto \u00e9 necess\u00e1rio fornecer uma defini\u00e7\u00e3o clara desse conceito.<\/p>\n<p>Um aplicativo moderno suporta v\u00e1rios clientes, seja uma interface de usu\u00e1rio em uma biblioteca JavaScript React, um aplicativo m\u00f3vel para Android ou iOS, ou um aplicativo que se conecta a outro por meio de uma API. Um aplicativo moderno implica a exist\u00eancia de um n\u00famero indeterminado de clientes para os quais ele fornece dados ou servi\u00e7os.<\/p>\n<p>Um aplicativo moderno fornece uma API para acessar os dados e servi\u00e7os solicitados. A API deve ser imut\u00e1vel e consistente, e n\u00e3o escrita especificamente para uma solicita\u00e7\u00e3o espec\u00edfica de um determinado cliente. A API est\u00e1 dispon\u00edvel via HTTP(S) e fornece acesso a todas as funcionalidades dispon\u00edveis na GUI ou CLI. <\/p>\n<p>Os dados devem estar dispon\u00edveis em um formato comum e compat\u00edvel, como JSON. A API fornece objetos e servi\u00e7os de forma clara e organizada, por exemplo, APIs RESTful ou GraphQL oferecem uma interface adequada.<\/p>\n<p>Os aplicativos modernos s\u00e3o constru\u00eddos em uma pilha moderna, e uma pilha moderna \u00e9 aquela que suporta esses aplicativos, respectivamente. Essa pilha permite que o desenvolvedor crie facilmente um aplicativo com interface HTTP e pontos finais de API bem definidos. A abordagem escolhida permitir\u00e1 que seu aplicativo receba e envie dados no formato JSON com facilidade. Em outras palavras, uma pilha moderna corresponde aos elementos do Aplicativo de Doze Fatores. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nginx.com\/blog\/microservices-reference-architecture-nginx-twelve-factor-app\/\">microsservi\u00e7os<\/a><\/noindex>. <\/p>\n<p>As vers\u00f5es populares desse tipo de pilha s\u00e3o baseadas em <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\">N\u00f3<\/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> e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-content-service\">Go<\/a><\/noindex>. A Arquitetura de Microservi\u00e7os <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nginxinc\/mra-ingenious\">NGINX<\/a><\/noindex> representa um exemplo de uma pilha moderna implementada em cada uma das linguagens mencionadas.<\/p>\n<p>Observe que n\u00e3o estamos promovendo exclusivamente a abordagem de microservi\u00e7os. Muitos de voc\u00eas trabalham com mon\u00f3litos que precisam evoluir, enquanto outros lidam com aplicativos SOA que est\u00e3o se expandindo e evoluindo para se tornarem aplicativos de microservi\u00e7os. Outros ainda est\u00e3o se movendo em dire\u00e7\u00e3o \u00e0 aplica\u00e7\u00e3o de aplicativos sem servidor (serverless), e alguns est\u00e3o implementando combina\u00e7\u00f5es dos mencionados acima. Os princ\u00edpios expostos neste artigo se aplicam a cada um desses sistemas, apenas com algumas pequenas altera\u00e7\u00f5es. <\/p>\n<p><b>Princ\u00edpios<\/b><\/p>\n<p>Agora que chegamos a um entendimento comum sobre o que s\u00e3o aplica\u00e7\u00f5es modernas e uma pilha moderna, \u00e9 hora de mergulhar nos princ\u00edpios de arquitetura e desenvolvimento que ser\u00e3o de grande ajuda na cria\u00e7\u00e3o, implementa\u00e7\u00e3o e manuten\u00e7\u00e3o de uma aplica\u00e7\u00e3o moderna.<\/p>\n<p>Um dos princ\u00edpios \u00e9 \"criar aplica\u00e7\u00f5es pequenas\", vamos apenas cham\u00e1-lo de <i>princ\u00edpio da pequenez<\/i>. Existem aplica\u00e7\u00f5es incrivelmente complexas que consistem em uma grande quantidade de componentes m\u00f3veis. Por sua vez, construir uma aplica\u00e7\u00e3o a partir de pequenos componentes discretos simplifica seu design, manuten\u00e7\u00e3o e opera\u00e7\u00e3o como um todo. (Note que dissemos \"simplifica\", e n\u00e3o \"torna simples\").<\/p>\n<p>O segundo princ\u00edpio \u00e9 que podemos aumentar a produtividade dos desenvolvedores, ajudando-os a se concentrar nas funcionalidades que est\u00e3o desenvolvendo, ao mesmo tempo em que os liberamos das preocupa\u00e7\u00f5es com a infraestrutura e CI\/CD durante a implementa\u00e7\u00e3o. Ent\u00e3o, em poucas palavras, nossa abordagem <i>\u00e9 centrada no desenvolvedor<\/i>.<\/p>\n<p>Por fim, tudo o que diz respeito ao seu aplicativo deve estar conectado \u00e0 rede. Nas \u00faltimas duas d\u00e9cadas, avan\u00e7amos muito em dire\u00e7\u00e3o a um futuro conectado, uma vez que as redes se tornaram mais r\u00e1pidas e as aplica\u00e7\u00f5es mais complexas. Como j\u00e1 mencionado, uma aplica\u00e7\u00e3o moderna deve ser usada pela rede por uma variedade de clientes diferentes. Aplicar o pensamento em rede na arquitetura traz benef\u00edcios significativos que se alinham bem com <i>princ\u00edpio da pequenez<\/i> e o conceito de abordagem <i>centrada no desenvolvedor<\/i>.<\/p>\n<p>Se, ao desenvolver e implementar sua aplica\u00e7\u00e3o, voc\u00ea se lembrar desses princ\u00edpios, ter\u00e1 uma vantagem ineg\u00e1vel no crescimento e na entrega do seu produto.<\/p>\n<p>Vamos explorar esses tr\u00eas princ\u00edpios em mais detalhes.<\/p>\n<p><b>Princ\u00edpio da Pequenez<\/b><\/p>\n<p>Para o c\u00e9rebro humano, \u00e9 dif\u00edcil processar uma grande quantidade de informa\u00e7\u00f5es ao mesmo tempo. Na psicologia, o termo carga cognitiva refere-se \u00e0 quantidade total de esfor\u00e7o mental necess\u00e1rio para reter informa\u00e7\u00f5es na mem\u00f3ria. Reduzir a carga cognitiva dos desenvolvedores \u00e9 uma prioridade, pois assim eles podem se concentrar em resolver o problema, em vez de manter na cabe\u00e7a o atual modelo complexo de toda a aplica\u00e7\u00e3o e as funcionalidades em desenvolvimento. <\/p>\n<p><img decoding=\"async\" alt=\"Princ\u00edpios de desenvolvimento de aplica\u00e7\u00f5es modernas com NGINX. Parte 1\" src=\"\/wp-content\/uploads\/26df2016a46d8b82b45832fe1df9bf23.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>As aplica\u00e7\u00f5es s\u00e3o decompostas pelas seguintes raz\u00f5es:<\/p>\n<ul>\n<li>Redu\u00e7\u00e3o da carga cognitiva sobre os desenvolvedores;<\/li>\n<li>Acelera\u00e7\u00e3o e simplifica\u00e7\u00e3o dos testes;<\/li>\n<li>Entrega r\u00e1pida de altera\u00e7\u00f5es na aplica\u00e7\u00e3o.<\/li>\n<\/ul>\n<p><\/i><br \/>\nExistem v\u00e1rias maneiras de reduzir a carga cognitiva sobre os desenvolvedores, e \u00e9 aqui que o princ\u00edpio da simplicidade entra em jogo.<\/p>\n<p>Assim, tr\u00eas maneiras de reduzir a carga cognitiva:<\/p>\n<ol>\n<li>Reduzir os prazos que eles devem considerar ao desenvolver uma nova funcionalidade \u2013 quanto mais curto o prazo, menor a carga cognitiva.<\/li>\n<li>Reduzir a quantidade de c\u00f3digo em que se trabalha ao mesmo tempo \u2013 menos c\u00f3digo significa menos carga.<\/li>\n<li>Simplificar o processo de realiza\u00e7\u00e3o de altera\u00e7\u00f5es incrementais na aplica\u00e7\u00e3o.<\/li>\n<\/ol>\n<p>\n<b>Redu\u00e7\u00e3o dos prazos de desenvolvimento<\/b><\/p>\n<p>Vamos voltar ao tempo em que a metodologia <code>waterfall<\/code> era o padr\u00e3o para o processo de desenvolvimento, e prazos de seis meses a dois anos para desenvolver ou atualizar uma aplica\u00e7\u00e3o eram uma pr\u00e1tica comum. Normalmente, os engenheiros liam documentos relevantes, como o documento de requisitos do produto (PRD), o documento de refer\u00eancia do sistema (SRD), o plano de arquitetura e come\u00e7avam a juntar todas essas coisas em um \u00fanico modelo cognitivo, de acordo com o qual escreviam o c\u00f3digo. \u00c0 medida que os requisitos e, consequentemente, a arquitetura mudavam, era necess\u00e1rio fazer um esfor\u00e7o significativo para informar toda a equipe sobre as atualiza\u00e7\u00f5es no modelo cognitivo. Essa abordagem, na pior das hip\u00f3teses, poderia simplesmente paralisar o trabalho.<\/p>\n<p>A maior mudan\u00e7a no processo de desenvolvimento de aplica\u00e7\u00f5es foi a implementa\u00e7\u00e3o da metodologia \u00e1gil. Uma das principais caracter\u00edsticas da metodologia <code>agile<\/code> \u00e9 o desenvolvimento iterativo. Por sua vez, isso leva \u00e0 redu\u00e7\u00e3o da carga cognitiva sobre os engenheiros. Em vez de exigir que a equipe de desenvolvedores implemente a aplica\u00e7\u00e3o em um longo ciclo, <code>agile<\/code> a abordagem permite focar em pequenas quantidades de c\u00f3digo que podem ser rapidamente testadas e implantadas, enquanto se obt\u00e9m feedback. A carga cognitiva da aplica\u00e7\u00e3o deslocou-se de prazos de seis meses a dois anos, com um enorme n\u00famero de especifica\u00e7\u00f5es, para adi\u00e7\u00f5es ou altera\u00e7\u00f5es de funcionalidades de duas semanas, orientadas por uma compreens\u00e3o mais difusa de uma grande aplica\u00e7\u00e3o.<\/p>\n<p>A mudan\u00e7a do foco de um aplicativo massivo para fun\u00e7\u00f5es espec\u00edficas e pequenas, que podem ser conclu\u00eddas em um sprint de duas semanas, tendo em mente n\u00e3o mais que uma fun\u00e7\u00e3o do pr\u00f3ximo sprint, representa uma altera\u00e7\u00e3o significativa. Isso aumentou a produtividade do desenvolvimento, ao mesmo tempo que reduziu a carga cognitiva, que estava sempre oscilando.<\/p>\n<p>Na metodologia <code>agile<\/code> sup\u00f5e-se que o aplicativo final ser\u00e1 uma vers\u00e3o levemente modificada do conceito original, portanto, o ponto final do desenvolvimento \u00e9 necessariamente amb\u00edguo. Somente os resultados de cada sprint espec\u00edfico podem ser claros e precisos.<\/p>\n<p><b>Bases de c\u00f3digo pequenas<\/b><\/p>\n<p>O pr\u00f3ximo passo para reduzir a carga cognitiva \u00e9 diminuir a base de c\u00f3digo. Em geral, aplica\u00e7\u00f5es modernas s\u00e3o massivas \u2013 um aplicativo corporativo confi\u00e1vel pode consistir em milhares de arquivos e centenas de milhares de linhas de c\u00f3digo. Dependendo da organiza\u00e7\u00e3o dos arquivos, as rela\u00e7\u00f5es e depend\u00eancias entre o c\u00f3digo e os arquivos podem ser \u00f3bvias ou, ao contr\u00e1rio, dif\u00edceis de discernir. At\u00e9 mesmo a depura\u00e7\u00e3o da execu\u00e7\u00e3o do c\u00f3digo pode apresentar problemas, dependendo das bibliotecas utilizadas e de qu\u00e3o bem as ferramentas de depura\u00e7\u00e3o segregam bibliotecas\/pacotes\/m\u00f3dulos e c\u00f3digo do usu\u00e1rio.<\/p>\n<p>Construir um modelo mental funcional do c\u00f3digo de um aplicativo pode levar um tempo consider\u00e1vel, e novamente impor ao desenvolvedor uma carga cognitiva maior. Isso \u00e9 especialmente caracter\u00edstico de bases de c\u00f3digo monol\u00edticas, onde h\u00e1 uma grande quantidade de c\u00f3digo, e a intera\u00e7\u00e3o entre os componentes funcionais n\u00e3o \u00e9 bem definida, enquanto a separa\u00e7\u00e3o dos objetos de aten\u00e7\u00e3o \u00e9 frequentemente nebulosa, devido \u00e0 falta de limites funcionais. <\/p>\n<p>Uma das maneiras eficazes de reduzir a carga cognitiva dos engenheiros \u00e9 a transi\u00e7\u00e3o para uma arquitetura de microsservi\u00e7os. Na abordagem de microsservi\u00e7os, cada servi\u00e7o foca em um conjunto espec\u00edfico de fun\u00e7\u00f5es; ao mesmo tempo, o significado do servi\u00e7o geralmente \u00e9 definido e compreendido. Os limites do servi\u00e7o tamb\u00e9m s\u00e3o claros \u2013 lembre-se de que a comunica\u00e7\u00e3o com o servi\u00e7o \u00e9 feita atrav\u00e9s de APIs, portanto, os dados gerados por um servi\u00e7o podem ser facilmente transferidos para outro.<\/p>\n<p>A intera\u00e7\u00e3o com outros servi\u00e7os geralmente \u00e9 limitada a alguns servi\u00e7os do usu\u00e1rio e alguns servi\u00e7os do provedor, que utilizam chamadas de API simples e claras, como por meio do REST. Isso significa que a carga cognitiva sobre o engenheiro \u00e9 seriamente reduzida. A tarefa mais dif\u00edcil permanece em entender o modelo de intera\u00e7\u00e3o dos servi\u00e7os e como coisas como transa\u00e7\u00f5es ocorrem entre v\u00e1rios servi\u00e7os. Em \u00faltima an\u00e1lise, o uso de microsservi\u00e7os reduz a carga cognitiva, diminuindo a quantidade de c\u00f3digo, definindo limites claros para o servi\u00e7o e garantindo compreens\u00e3o das rela\u00e7\u00f5es entre usu\u00e1rios e provedores.<\/p>\n<p><b>Pequenas mudan\u00e7as incrementais<\/b><\/p>\n<p>O \u00faltimo elemento do princ\u00edpio <i>pequenez<\/i> \u2013 \u00e9 a gest\u00e3o das mudan\u00e7as. Um grande desafio para os desenvolvedores \u00e9 olhar para a base de c\u00f3digo (mesmo, possivelmente, para seu pr\u00f3prio c\u00f3digo mais antigo) e afirmar: 'Isso \u00e9 uma bagun\u00e7a, precisamos reescrever tudo isso.' \u00c0s vezes, essa \u00e9 a decis\u00e3o correta, e \u00e0s vezes n\u00e3o. Isso imp\u00f5e \u00e0 equipe de desenvolvedores o fardo de uma mudan\u00e7a global de modelo, o que, por sua vez, resulta em uma carga cognitiva em larga escala. \u00c9 melhor que os engenheiros se foquem nas mudan\u00e7as que podem fazer durante o sprint, para depois entregar a funcionalidade necess\u00e1ria a tempo, mesmo que de forma gradual. O produto final deve se parecer com o que foi planejado, mas com algumas mudan\u00e7as e testes para atender \u00e0s necessidades do cliente.<\/p>\n<p>Ao reescrever grandes partes do c\u00f3digo, \u00e0s vezes \u00e9 imposs\u00edvel entregar rapidamente a altera\u00e7\u00e3o, pois outras depend\u00eancias do sistema entram em jogo. Para controlar o fluxo de mudan\u00e7as, pode-se usar a oculta\u00e7\u00e3o de funcionalidades (feature hiding). Em ess\u00eancia, isso significa que a funcionalidade est\u00e1 na produ\u00e7\u00e3o, mas n\u00e3o est\u00e1 acess\u00edvel por meio de vari\u00e1veis de ambiente (env-var) ou outro mecanismo de configura\u00e7\u00e3o. Se o c\u00f3digo passou por todos os processos de verifica\u00e7\u00e3o de qualidade, ele pode estar na produ\u00e7\u00e3o em um estado oculto. No entanto, essa estrat\u00e9gia funciona apenas se a fun\u00e7\u00e3o for ativada no final. Do contr\u00e1rio, ela apenas bagun\u00e7ar\u00e1 o c\u00f3digo e adicionar\u00e1 uma carga cognitiva que o desenvolvedor ter\u00e1 que enfrentar para trabalhar de maneira produtiva. O gerenciamento de mudan\u00e7as e as altera\u00e7\u00f5es incrementais ajudam a manter a carga cognitiva dos desenvolvedores em um n\u00edvel manej\u00e1vel. <\/p>\n<p>Os engenheiros enfrentam muitas dificuldades mesmo ao implementar funcionalidades adicionais simples. Do lado da gest\u00e3o, \u00e9 sensato reduzir a carga desnecess\u00e1ria na equipe para que ela possa se concentrar nos elementos principais da funcionalidade. Existem tr\u00eas coisas que voc\u00ea pode fazer para ajudar sua equipe de desenvolvedores:<\/p>\n<ol>\n<li>Usar uma metodologia <code>agile<\/code>, para limitar o prazo em que a equipe deve se concentrar nas funcionalidades-chave.<\/li>\n<li>Implementar seu aplicativo como v\u00e1rios microsservi\u00e7os. Isso limitar\u00e1 o n\u00famero de funcionalidades implementadas e fortalecer\u00e1 as fronteiras que mant\u00eam a carga cognitiva sob controle durante o trabalho.<\/li>\n<li>Prefira mudan\u00e7as incrementais em vez de grandes e complexas, altere pequenos trechos de c\u00f3digo. Aplique a oculta\u00e7\u00e3o de funcionalidades para implementar mudan\u00e7as, mesmo que elas n\u00e3o sejam vis\u00edveis imediatamente ap\u00f3s a adi\u00e7\u00e3o.<\/li>\n<\/ol>\n<p>\nSe voc\u00ea aplicar o princ\u00edpio da simplicidade em seu trabalho, sua equipe se tornar\u00e1 muito mais feliz, ter\u00e1 um foco melhor na implementa\u00e7\u00e3o das fun\u00e7\u00f5es necess\u00e1rias e ter\u00e1 maior probabilidade de lan\u00e7ar mudan\u00e7as de qualidade mais rapidamente. Mas isso n\u00e3o significa que o trabalho n\u00e3o possa se tornar mais complicado; \u00e0s vezes, implementar uma nova funcionalidade exige a modifica\u00e7\u00e3o de v\u00e1rios servi\u00e7os e esse processo pode ser mais complexo do que um semelhante em uma arquitetura monol\u00edtica. De qualquer forma, os benef\u00edcios de aplicar a abordagem da simplicidade valem a pena.<\/p>\n<p>Fim da primeira parte.<\/p>\n<p>Em breve, publicaremos a segunda parte da tradu\u00e7\u00e3o, mas agora aguardamos seus coment\u00e1rios e convidamos voc\u00ea para <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/mJ6e\/\">dia de portas abertas<\/a><\/noindex>, que acontecer\u00e1 hoje \u00e0s 20:00.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/452748\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f. \u0412 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u0443\u0440\u0441\u0430 \u00abBackend \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430 PHP\u00bb, \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u0432\u0441\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0441\u044c \u0432\u0441\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u041a\u0430\u043a \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u0441\u043a\u0430\u0437\u0430\u043b \u041c\u0430\u0440\u043a \u0410\u043d\u0434\u0440\u0435\u0441\u0441\u0435\u043d, \u043e\u043d\u043e \u043f\u043e\u0433\u043b\u043e\u0449\u0430\u0435\u0442 \u043c\u0438\u0440. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043b\u0435\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-34140","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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\udd47 Princ\u00edpios de desenvolvimento de aplica\u00e7\u00f5es modernas da NGINX. Parte 1 | ProHoster","description":"Ol\u00e1, amigos.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/printsipy-razrabotki-sovremennyh-prilozhenij-ot-nginx-chast-1","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/34140","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=34140"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/34140\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=34140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=34140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=34140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}