{"id":4002,"date":"2022-04-12T18:30:40","date_gmt":"2022-04-12T21:30:40","guid":{"rendered":"https:\/\/elemarjr.com\/arquiteturadesoftware\/?p=4002"},"modified":"2024-01-11T17:55:19","modified_gmt":"2024-01-11T20:55:19","slug":"construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0","status":"publish","type":"volume-1","link":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/","title":{"rendered":"Construindo arquiteturas que evoluem \/ Cap\u00edtulo 1.5 v3.0"},"content":{"rendered":"<p><strong>Software muda! Muitas vezes para atender novas necessidades do neg\u00f3cio, algumas vezes para acomodar evolu\u00e7\u00f5es tecnol\u00f3gicas.<\/strong> Boas pr\u00e1ticas arquiteturais ajudam a &#8220;aceitar&#8221; melhor as mudan\u00e7as, minimizando custo e riscos.<\/p>\n<div class=\"nota-alerta\">\r\n<table class=\"tabelaalerta\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-citacao\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/> <\/p>\n<p><em>Apesar de nossos melhores esfor\u00e7os, o software se torna mais dif\u00edcil de alterar com o tempo. Por uma variedade de raz\u00f5es, as partes que comp\u00f5em os sistemas de software desafiam a modifica\u00e7\u00e3o f\u00e1cil, tornando-se mais fr\u00e1geis e intrat\u00e1veis com o tempo.\u00a0<\/em><\/p>\n<p>\r\n<p><strong>Ford, Parsons e Kua<\/strong><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p><strong>Com o tempo, a aplica\u00e7\u00e3o de mudan\u00e7as gera, naturalmente, complexidades predat\u00f3rias.<\/strong> Ou seja, resqu\u00edcios de iniciativas ou decis\u00f5es do passado que ficam no c\u00f3digo ou em decis\u00f5es que n\u00e3o foram adequadamente revertidas. <strong>As pr\u00e1ticas da arquitetura devem mitigar essas complexidades de maneira cont\u00ednua e disciplinada.<\/strong><\/p>\n<div class=\"nota-alerta\">\r\n<table class=\"tabelaalerta\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-citacao\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/> <em>Complexity is anything related to the structure of a software system that makes it hard to understand and modify the system.<\/em>\r\n<p><strong>John Ousterhout<\/strong><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>O ritmo das mudan\u00e7as, tecnol\u00f3gicas e de neg\u00f3cios, est\u00e1 acelerado e est\u00e1 ficando cada vez mais acelerado. Ali\u00e1s, essa \u00e9 a caracter\u00edstica que melhor justifica as atividades de arquitetura.<\/p>\n<div class=\"nota-alerta\">\r\n<table class=\"tabelaalerta\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-citacao\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/> <em>If I had to name one primary factor that influences architecture, I\u2019d put rate of change at the top of my list.<\/em>\r\n<p><strong>Greg Hohpe<\/strong><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\nPor tudo isso, <strong><em>Evolvability<\/em> \u00e9 um importante atributo de qualidade para qualquer boa arquitetura, sen\u00e3o o mais importante.<\/strong>\n<hr \/>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> Sempre inclua <em>Evolvability <\/em>entre os atributos de qualidade de seus projetos.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>&nbsp;<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/imgs.xkcd.com\/comics\/fixing_problems.png\" alt=\"Fixing Problems\" \/><\/p>\n<div style=\"background-color: #f0eef4; width: 100%; padding: 35px 30px 20px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px;\">\r\n<p style=\"font-size: 24px; font-weight: bold; line-height: 28px; font-family: Montserrat; color: #432b75;\">Defini\u00e7\u00e3o: Evolvability<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d;\"><\/p>\n<p>Atributo de qualidade relacionado a capacidade de um sistema &#8220;evoluir&#8221;, tanto para atender demandas de neg\u00f3cio como para &#8220;acomodar&#8221; novidades tecnol\u00f3gicas, sem comprometer objetivos do neg\u00f3cio, desrespeitar restri\u00e7\u00f5es ou romper os demais atributos.<\/p>\n<p><\/p>\r\n<\/div>\n<h2>As leis de Lehman<\/h2>\n<p>Ao longo de d\u00e9cadas, <a href=\"https:\/\/pt.wikipedia.org\/wiki\/Meir_M._Lehman\">Meir Lehman<\/a> e <a href=\"https:\/\/en.wikipedia.org\/wiki\/L%C3%A1szl%C3%B3_B%C3%A9l%C3%A1dy\">L\u00e1szl\u00f3 B\u00e9l\u00e1dy<\/a> formularam, propuseram e aprimoraram diversas \u201cleis\u201d que, alegadamente, governam a evolu\u00e7\u00e3o de sistemas de software. Essas leis ficaram conhecidas como \u201cLeis de Lehman\u201d.<\/p>\n<div class=\"nota-techbiz\">\r\n<table class=\"tabelatechbiz\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-techbiz-coluna-1\" valign=\"top\"><img loading=\"lazy\" decoding=\"async\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/avatar-tech-biz-2.png\" alt=\"\" width=\"100\" height=\"120\" \/><\/td>\r\n<td class=\"nota-techbiz-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/avatar-tech-biz-2.png\" alt=\"\" width=\"100\" height=\"120\" \/>\r\n<p style=\"font-size: 24px; font-weight: bold; line-height: 1.1; font-family: Montserrat; margin-bottom: 10px;\">As leis de Lehamn<\/p>\r\n<\/p>\n<p>As \u201cLeis de Lehman\u201d direcionam o comportamento e o projeto das iniciativas para engenharia de software.<\/p>\n<hr \/>\n<p>Nesse epis\u00f3dio, dispon\u00edvel em \u00e1udio e v\u00eddeo, explicamos essas leis.<\/p>\n<p>\r\n<p><a class=\"botao\" href=\"https:\/\/technbiz.eximia.co\/as-leis-de-lehman\/\" target=\"_blank\" rel=\"noopener\">Acessar epis\u00f3dio<\/a><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\nAs \u201cLeis de Lehman\u201d descrevem e ajudam a entender o sens\u00edvel equil\u00edbrio entre as motiva\u00e7\u00f5es para a evolu\u00e7\u00e3o de um software, por adapta\u00e7\u00f5es, e as causas para o aumento da complexidade (em consequ\u00eancia, do lead time para atender demandas do neg\u00f3cio) ao longo do tempo.\n<div class=\"nota-alerta\">\r\n<table class=\"tabelaalerta\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-citacao\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/> <\/p>\n<p><em>Complexity will still increase over time, in spite of our best efforts, but simpler designs allow us to build larger and more powerful systems before complexity becomes overwhelming.<\/em><\/p>\n<p>\r\n<p><strong>John Ousterhout<\/strong><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p><strong>As duas primeiras \u201cleis\u201d formuladas por eles, em 1974, foram a lei da \u201cmudan\u00e7a cont\u00ednua\u201d e a lei da \u201ccomplexidade crescente\u201d.<\/strong> A primeira diz que, ao longo do tempo, um sistema de software precisa ser continuamente adaptado, recebendo novas \u201cadapta\u00e7\u00f5es\u201d, para se manter relevante e satisfat\u00f3rio. A segunda aponta que, enquanto essas \u201cadapta\u00e7\u00f5es\u201d s\u00e3o feitas, o software se torna mais complexo, exceto quando existam esfor\u00e7os explicitamente direcionados para mitigar essa complexidade.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/pt-static.z-dn.net\/files\/d4d\/8804b98edc0f3dbca971166f297927f0.jpg\" alt=\"Qual \u00e9 a rela\u00e7\u00e3o existente entre a imagem e o texto da charge? - Brainly.com.br\" width=\"489\" height=\"283\" \/><\/p>\n<p>As duas leis, deliciosamente evidentes e conflitantes, levam a alguns desdobramentos preocupantes:<\/p>\n<ul>\n<li>Projetos de software bem sucedidos est\u00e3o \u201ccondenados\u201d a demandarem trabalho para mitigar a a complexidade.<\/li>\n<li>Times extremamente eficazes, mas exclusivamente focados em atender as demandas de neg\u00f3cio se tornam, eventualmente, menos produtivos, deteriorando sua capacidade de fazer entregas e, consequentemente, sua efic\u00e1cia.<\/li>\n<li>O esfor\u00e7o para combater a complexidade \u00e9 imperativo para manter o software relevante no m\u00e9dio\/longo prazo.<i class=\"i-twitter\"><\/i><\/li>\n<li>Times de neg\u00f3cio que n\u00e3o se sensibilizam para a necessidade de reduzir a complexidade do software, priorizando somente inclus\u00e3o de features, se condenam a ter suas demandas atendidas em prazos cada vez maiores.<\/li>\n<\/ul>\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 30px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">D\u00edvida t\u00e9cnica<\/p>\r\n<\/p>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Technical_debt\">D\u00edvidas t\u00e9cnicas<\/a>\u00a0surgem quando desenvolvedores de software, de forma deliberada ou n\u00e3o, abrem m\u00e3o de boas pr\u00e1ticas de desenvolvimento para ganhar algum tempo. Entretanto, acabam sofrendo, mais tarde, com os custos e tempos de manuten\u00e7\u00e3o mais altos.<\/p>\n<p><\/div>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> Dissemine as leis de Lehman em sua organiza\u00e7\u00e3o.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h2>Mudan\u00e7as tecnol\u00f3gicas acontecem rapidamente e t\u00eam impactos imprevis\u00edveis<\/h2>\nO conjunto de tecnologias, t\u00e9cnicas, padr\u00f5es e boas pr\u00e1ticas para desenvolver software s\u00e3o din\u00e2micas e inst\u00e1veis. Essa instabilidade, ali\u00e1s, \u00e9 um dos principais desafios para manter e evoluir sistemas.\n<hr \/>\n<p>A emerg\u00eancia de pr\u00e1ticas como a utiliza\u00e7\u00e3o de cont\u00eaineres, aceleradas por tecnologias como <em>Docker<\/em>, por exemplo, impactam a ind\u00fastria de forma definitiva e, para os menos \u201cantenados\u201d, parece surgir de uma hora para outra.<\/p>\nLinguagens novas de programa\u00e7\u00e3o, mais expressivas (pelo menos para alguns dom\u00ednios) tamb\u00e9m surgem em ritmo cada vez mais acelerado. Recentemente, mesmo as linguagens consolidadas tamb\u00e9m passaram a receber atualiza\u00e7\u00f5es mais frequentes. Em consequ\u00eancia disso, bases de c\u00f3digo gigantes que geram sistemas em produ\u00e7\u00e3o, parecem cada vez mais \u201clegadas\u201d em prazos cada vez mais curtos.\n<hr \/>\n<p><em>Frameworks<\/em> Javascript parecem crescer em popularidade e se tornarem obsoletas em ciclos, muitas vezes, menores do que os necess\u00e1rios para o desenvolvimentos de alguns grandes sistemas. Em poucos anos, vimos o decl\u00ednio de <a href=\"https:\/\/jquery.com\/\">jQuery<\/a>; a ascens\u00e3o e a \u201cmorte\u201d de <a href=\"https:\/\/angularjs.org\/\">AngularJS<\/a>; a \u201cprovoca\u00e7\u00e3o\u201d de <a href=\"https:\/\/backbonejs.org\/\">Backbone<\/a> e <a href=\"https:\/\/mustache.github.io\/\">Mustache<\/a>; o progresso com <a href=\"https:\/\/angular.io\/\">Angular<\/a>, <a href=\"https:\/\/pt-br.reactjs.org\/\">React<\/a> e <a href=\"https:\/\/vuejs.org\/\">Vue<\/a>; propostas ousadas multiplataforma como <a href=\"https:\/\/flutter.dev\/\">Flutter<\/a> e <a href=\"https:\/\/www.electronjs.org\/\">Electron<\/a>; etc. <strong>\u00c9 quase imposs\u00edvel dizer qual ser\u00e1 a tecnologia dominante para elabora\u00e7\u00e3o de <em>frontends<\/em> de aqui dois anos.<\/strong><\/p>\nN\u00e3o conseguimos predizer quando mudan\u00e7as impactantes do contexto de desenvolvimento ir\u00e3o ocorrer. Nem mesmo conseguimos antecipar quais ser\u00e3o \u201cpersistentes\u201d (se \u00e9 que essa palavra \u00e9 aplic\u00e1vel), entretanto, sabemos que mudan\u00e7as acontecem e o ritmo parece ser cada vez mais acelerado.\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> Determine qual a obsolesc\u00eancia tecnol\u00f3gica m\u00e1xima admitida.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<div class=\"nota-alerta\">\r\n<table class=\"tabelaalerta\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-citacao\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/> <em>Adicionar evolvability como atributo de qualidade arquitet\u00f4nica implica proteger os demais atributos conforme o sistema evolui. <\/em>\r\n<p><strong>Ford, Parsons e Kua<\/strong><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h2><em>Evolvability<\/em> emerge de &#8220;pr\u00e1ticas evolucion\u00e1rias&#8221;<\/h2>\n<p><em>Evolvability<\/em>, como atributo de qualidade arquitetural, emerge de pr\u00e1ticas de engenharia e arquitetura, adequadas a este fim, executadas ao longo do tempo.<\/p>\n<div class=\"nota-livro\">\r\n<table class=\"tabelalivro\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-livro-coluna-1\" valign=\"top\"><img decoding=\"async\" src=\"https:\/\/m.media-amazon.com\/images\/I\/61kAEC+ouJL.jpg\" alt=\"\" width=\"150\" \/><\/td>\r\n<td class=\"nota-livro-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"https:\/\/m.media-amazon.com\/images\/I\/61kAEC+ouJL.jpg\" alt=\"\" width=\"150\" \/>\r\n<p style=\"font-size: 20px; font-weight: bold; color: #4c4c4c; line-height: 1.1; font-family: Montserrat; margin-bottom: 10px;\">Building Evolutionary Architectures<\/p>\r\nAs pr\u00e1ticas de arquitetura evolucion\u00e1rias foram consolidadas, primeiro, nessa excelente obra. Trata-se da refer\u00eancia mais qualificada para esse tema.\r\n<p><a class=\"botao-livro\" href=\"https:\/\/www.amazon.com.br\/Building-Evolutionary-Architectures-Support-Constant-ebook\/dp\/B075RR1XVG\/\" target=\"_blank\" rel=\"noopener\">Acessar livro<\/a><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>Pr\u00e1ticas arquiteturais evolucion\u00e1rias se caracterizam por:<\/p>\n<ul>\n<li><strong>suportar mudan\u00e7as incrementais<\/strong>, parte por parte, preservando a efici\u00eancia (tempo) na aplica\u00e7\u00e3o de mudan\u00e7as futuras;<\/li>\n<li><strong>serem guiadas por\u00a0<em>fitness funcions,<\/em>\u00a0<\/strong>comprovando continuamente adequa\u00e7\u00e3o a par\u00e2metros de qualidade bem-definidos;<\/li>\n<li><strong>acomodar <em>concerns <\/em>em m\u00faltiplas dimens\u00f5es<em>.<\/em><\/strong><\/li>\n<\/ul>\n<hr \/>\nA escolha da palavra &#8220;evolucion\u00e1ria&#8221; \u00e9 bastante interessante. Ela se afasta, de certa forma, do conceito de &#8220;emerg\u00eancia&#8221;e de arquitetura emergente. Ou seja, n\u00e3o tem como lema desenvolver a arquitetura de maneira &#8220;desregrada&#8221;, simplesmente respondendo ao contexto de maneira desordenada. <strong>Assim, arquitetura evolucion\u00e1ria \u00e9 algo muito diferente de &#8220;n\u00e3o-arquitetura&#8221;, ou da &#8220;Arquitetura Zeca Pagodinho&#8221; (\ud83c\udfb6 deixa a vida me levar, vida leva eu! \ud83c\udfb5).<\/strong>\n<hr \/>\n<div class=\"nota-youtube\">\r\n<table class=\"tabelayoutube\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-youtube-coluna-1\" valign=\"top\"><img loading=\"lazy\" decoding=\"async\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/youtube.png\" alt=\"\" width=\"80\" height=\"80\" \/><\/td>\r\n<td class=\"nota-youtube-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/youtube.png\" alt=\"\" width=\"80\" height=\"80\" \/>\r\n<p style=\"font-size: 24px; font-weight: bold; line-height: 1.1; font-family: Montserrat; margin-bottom: 10px;\">Building Evolutionary Architectures - Craft Conference 2019<\/p>\r\n<\/p>\n<p><a href=\"https:\/\/nealford.com\/\">Neil Ford<\/a> compartilha nessa excelente palestra conceitos e <em>insights\u00a0<\/em>fundamentais para o entendimento das pr\u00e1ticas de arquitetura evolucion\u00e1ria. Uma verdadeira aula, de um dos criadores do conceito.<\/p>\n<p>\r\n<p><a class=\"botao-youtube\" href=\"https:\/\/youtu.be\/xJj9vgDz33U\" target=\"_blank\" rel=\"noopener\" style=\"margin-top: 20px;\">Acessar v\u00eddeo<\/a><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h2><em>Evolvability<\/em> demanda suporte a mudan\u00e7as incrementais<\/h2>\n<strong>Sabendo-se que a necessidade de mudan\u00e7as \u00e9 uma constante, a arquitetura evolucion\u00e1ria preconiza elas sejam acomodadas de maneira incremental.<\/strong> De maneira ampla, sempre que poss\u00edvel, mudan\u00e7as devem ser aplicadas aos poucos, sem grandes saltos ou descontinuidades. Dessa forma, o &#8220;custo da mudan\u00e7a&#8221; fica dilu\u00eddo causando &#8220;menos dor&#8221;.\n<hr \/>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4016 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/pain_time.png\" alt=\"\" width=\"574\" height=\"290\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/pain_time.png 2499w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/pain_time-300x151.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/pain_time-1024x516.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/pain_time-768x387.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/pain_time-1536x774.png 1536w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/pain_time-2048x1033.png 2048w\" sizes=\"(max-width: 574px) 100vw, 574px\" \/><\/p>\n<strong>O &#8220;represamento&#8221; das iniciativas para moderniza\u00e7\u00e3o tecnol\u00f3gica \u00e9 uma das maiores causas para a &#8220;morte&#8221; dos sistemas de software.<\/strong> Mesmo quando tecnologias n\u00e3o agregam &#8220;algo novo&#8221;, o afastamento da trajet\u00f3ria evolutiva das ferramentas, t\u00e9cnicas e pr\u00e1ticas por um tempo prolongado aumenta de maneira exponencial o custo e risco para a mudan\u00e7a, apesar dos custos de oportunidade.\n<hr \/>\n\u00c9 fundamental tentar &#8220;conectar&#8221; a atualiza\u00e7\u00e3o tecnol\u00f3gica com um benef\u00edcio tang\u00edvel, seja para o atingimento dos objetivos do neg\u00f3cio, respeito as restri\u00e7\u00f5es ou atributos de qualidade, implicando, invariavelmente em ganho econ\u00f4mico objetivo e mensur\u00e1vel. <strong>A falta da no\u00e7\u00e3o clara dos ganhos de uma mudan\u00e7a, em pelo menos uma dire\u00e7\u00e3o, \u00e9 sintoma da falta de maturidade para implantar tal mudan\u00e7a. Ali\u00e1s, racioc\u00ednio an\u00e1logo deve ser aplicado a d\u00edvidas t\u00e9cnicas: elas importam apenas quando cobram juros.<\/strong>\n<div class=\"nota-alerta\">\r\n<table class=\"tabelaalerta\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-citacao\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/> <em>Um sistema se torna legado quando nossa capacidade de pagar d\u00edvidas t\u00e9cnicas \u00e9 menor que a necessidade de contrair novas.<\/em>\r\n<p><strong>Fernando Paiva<\/strong><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> Estruture um &#8220;cat\u00e1logo&#8221; das d\u00edvidas t\u00e9cnicas. Gerencie-as!<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h2><em>Evolvability<\/em> demanda &#8220;governan\u00e7a arquitetural&#8221;<\/h2>\n<p><strong>Como garantir que, frente as demandas do dia a dia, times de desenvolvimento de software se comprometam a preservar, sobretudo, atributos de qualidade?\u00a0<\/strong>Restri\u00e7\u00f5es e objetivos de neg\u00f3cio, em geral, s\u00e3o mais f\u00e1ceis de observar. Entretanto, atributos de qualidade, como disponibilidade e seguran\u00e7a s\u00e3o, certamente, bem menos evidentes. O &#8220;caminho&#8221;, entende-se, passa pelo estabelecimento de pr\u00e1ticas de governan\u00e7a.<\/p>\n<div style=\"background-color: #f0eef4; width: 100%; padding: 35px 30px 20px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px;\">\r\n<p style=\"font-size: 24px; font-weight: bold; line-height: 28px; font-family: Montserrat; color: #432b75;\">Governan\u00e7a<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d;\">Conjunto de pr\u00e1ticas e condutas pelas quais se busca certificar que &#8220;resultados planejados&#8221; ser\u00e3o realizados, respeitando condi\u00e7\u00f5es e regras estabelecidas, sem preju\u00edzo para nenhuma das partes.<\/p>\r\n<\/div>\nO estabelecimento de governan\u00e7a arquitetural passa pela defini\u00e7\u00e3o de <em>guidelines\u00a0<\/em>e\u00a0<em>guardrails<\/em> que determinam um &#8220;jeito&#8221; de fazer as coisas e limites claros dentro dos quais h\u00e1 autonomia de atua\u00e7\u00e3o.\n<hr \/>\n<p>Na pr\u00e1tica,\u00a0<em>guidelines\u00a0<\/em>e <em>guardrails <\/em>s\u00e3o estabelecidos pela defini\u00e7\u00e3o de padr\u00f5es e decis\u00f5es arquiteturais, amplamente comunicadas, e pela ado\u00e7\u00e3o de processos e ferramentas de verifica\u00e7\u00e3o.<\/p>\n<p><strong>A <em>evolvability\u00a0<\/em>\u00e9, em \u00faltima inst\u00e2ncia, a principal conex\u00e3o entre a arquitetura de software e a escrita de c\u00f3digo.<\/strong><\/p>\n<h4>&#8220;Testando&#8221; a arquitetura<\/h4>\n<p>H\u00e1 diversas ferramentas dispon\u00edveis para ajudar arquitetos a conduzir governan\u00e7a arquitetural de seus sistemas. Mais recentemente, come\u00e7aram a emergir <em>frameworks<\/em> de testes automatizados visando ajudar nesse prop\u00f3sito.<\/p>\n<p>Bibliotecas como <a href=\"https:\/\/www.archunit.org\/\">ArchUnit (para Java)<\/a> e <a href=\"https:\/\/archunitnet.readthedocs.io\/en\/latest\/\">ArchUnitNET (para .NET)<\/a> permitem &#8220;representar em c\u00f3digo&#8221; <em>guardrails<\/em> importantes, como, por exemplo impedir refer\u00eancias c\u00edclicas.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/archunitnet.readthedocs.io\/en\/latest\/img\/cycle.svg\" alt=\"Cycle\" \/><\/p>\n<pre>IArchRule rule = Slices().Matching(\"Module.(*)\").Should()\r\n                    .BeFreeOfCycles();\r\n<\/pre>\n<h2><em>Evolvability\u00a0<\/em>e\u00a0<em>Architectural Fitness Functions<\/em><\/h2>\n<p><strong>Quando falamos em governan\u00e7a, devemos encontrar meios objetivos &#8211; f\u00f3rmulas &#8211; que se observadas regularmente, demonstram a &#8220;aproxima\u00e7\u00e3o&#8221; da solu\u00e7\u00e3o arquitetural de um &#8220;ideal&#8221; &#8211; por isso, s\u00e3o identificadas como <em>architectural fitness functions.<\/em><\/strong><\/p>\n<div style=\"background-color: #f0eef4; width: 100%; padding: 35px 30px 20px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px;\">\r\n<p style=\"font-size: 24px; font-weight: bold; line-height: 28px; font-family: Montserrat; color: #432b75;\">Defini\u00e7\u00e3o: Architectural Fitness Functions<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d;\"><em>Architecture fitness functions<\/em> s\u00e3o um tipo de fun\u00e7\u00e3o objetivo que \u00e9 usada para resumir o qu\u00e3o perto uma determinada solu\u00e7\u00e3o de arquitetura de software est\u00e1 de atingir os objetivos definidos.<\/p>\r\n<\/div>\n<p><em>Architectural fitness functions<\/em> podem ser hol\u00edsticas &#8211; apuradas com base no software como um todo &#8211; ou isoladas, geradas automaticamente (o ideal) ou atrav\u00e9s de processos manuais, disparadas pelo processo automaticamente ou acionadas explicitamente (como &#8220;desempenho&#8221; em testes de carga), est\u00e1ticas (mensur\u00e1veis a partir do c\u00f3digo) ou din\u00e2micas (demandando <em>software<\/em> em execu\u00e7\u00e3o)<\/p>\n<p>Testes de unidade automatizados, por exemplo, ajudam a estabelecer uma &#8220;rede de prote\u00e7\u00e3o contra regress\u00e3o&#8221; que, combinados com limites m\u00ednimos de cobertura, servem como ind\u00edcios de <em>evolvability<\/em>.<\/p>\n<p>Outro bom indicador \u00e9 a pondera\u00e7\u00e3o das m\u00e9tricas de complexidade de um artefato conforme sua frequ\u00eancia de modifica\u00e7\u00e3o.\u00a0<img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-4020 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/complexity-1.png\" alt=\"\" width=\"218\" height=\"104\" \/><\/p>\n<p>Na f\u00f3rmula acima, sugere-se que a complexidade de um software inteiro pode ser determinada pela complexidade de uma parte (Cp) e a frequ\u00eancia de mudan\u00e7a dessa parte. Interessante observar que a frequ\u00eancia de mudan\u00e7a pode ser medida usando sistemas de controle de vers\u00e3o (que devem ser bem mais do que\u00a0<em>backup\u00a0<\/em>sofisticados)<\/p>\n<div class=\"nota-livro\">\r\n<table class=\"tabelalivro\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-livro-coluna-1\" valign=\"top\"><img decoding=\"async\" src=\"https:\/\/m.media-amazon.com\/images\/I\/511gE5d3QTL.jpg\" alt=\"\" width=\"150\" \/><\/td>\r\n<td class=\"nota-livro-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"https:\/\/m.media-amazon.com\/images\/I\/511gE5d3QTL.jpg\" alt=\"\" width=\"150\" \/>\r\n<p style=\"font-size: 20px; font-weight: bold; color: #4c4c4c; line-height: 1.1; font-family: Montserrat; margin-bottom: 10px;\">A Philosophy of Software Design<\/p>\r\nA ideia de modularizar um sistema, isolando partes mais complexas com menor necessidade de modifica\u00e7\u00f5es \u00e9 a base desse maravilhoso livro.\r\n<p><a class=\"botao-livro\" href=\"https:\/\/www.amazon.com.br\/Philosophy-Software-Design-English-ebook\/dp\/B07N1XLQ7D\" target=\"_blank\" rel=\"noopener\">Acessar livro<\/a><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>Outro bom exemplo, \u00e9 an\u00e1lise de manutenabilidade a partir de indicadores de acoplamento e abstra\u00e7\u00e3o (que veremos em detalhes no pr\u00f3ximo cap\u00edtulo).<\/p>\n<p>Essas fun\u00e7\u00f5es, bem aplicadas, governam a evolu\u00e7\u00e3o do software, desde que incorporadas a pontos chaves do processo (como em libera\u00e7\u00e3o de vers\u00f5es e integra\u00e7\u00e3o de <em>commits<\/em>)<\/p>\n<div class=\"nota-livro\">\r\n<table class=\"tabelalivro\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-livro-coluna-1\" valign=\"top\"><img decoding=\"async\" src=\"https:\/\/images-na.ssl-images-amazon.com\/images\/I\/4147ot1F09L._SX331_BO1,204,203,200_.jpg\" alt=\"\" width=\"150\" \/><\/td>\r\n<td class=\"nota-livro-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"https:\/\/images-na.ssl-images-amazon.com\/images\/I\/4147ot1F09L._SX331_BO1,204,203,200_.jpg\" alt=\"\" width=\"150\" \/>\r\n<p style=\"font-size: 20px; font-weight: bold; color: #4c4c4c; line-height: 1.1; font-family: Montserrat; margin-bottom: 10px;\">The Checkilist Manifesto<\/p>\r\nO argumento central desse livro \u00e9 o estabelecimento de procedimentos de verifica\u00e7\u00e3o, rotineiros, para garantia da qualidade. Trata-se de uma forma de evitar que a &#8220;rotina&#8221; tire o foco de atividades que s\u00e3o fundamentais.\r\n<p><a class=\"botao-livro\" href=\"https:\/\/www.amazon.com.br\/Checklist-Manifesto-How-Things-Right\/dp\/0312430000\/\" target=\"_blank\" rel=\"noopener\">Acessar livro<\/a><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p><strong>Uma &#8220;<em>architectural fitness function<\/em>&#8221; deve proteger as diversas propriedades de um sistema de software na medida em que modifica\u00e7\u00f5es, preferencialmente incrementais, s\u00e3o realizadas.<\/strong> De maneira objetiva, uma solu\u00e7\u00e3o implementada deve ser submetida sob a perspectiva de diversas <em>fitness functions\u00a0<\/em>para garantir que todas as adapta\u00e7\u00f5es realizadas n\u00e3o impactam no atingimento dos objetivos de neg\u00f3cio, restri\u00e7\u00f5es ou atributos de qualidade que suportam. Toda vez que uma <em>fitness function\u00a0<\/em>indicar afastamento do objetivo, sabe-se que h\u00e1 um problema a analisar ou adapta\u00e7\u00e3o a rever na arquitetura.<\/p>\nUm exemplo de <em>fitness function <\/em>din\u00e2mica s\u00e3o as medidas de <em>response time\u00a0<\/em>de um servi\u00e7o. Afinal, trata-se de express\u00e3o objetiva da performance (um dos diversos atributos de qualidade poss\u00edvel). Dependendo da &#8220;gravidade&#8221; a medi\u00e7\u00e3o de <em>fitness functions\u00a0<\/em>poder\u00e1 ser realizada nos ambientes de desenvolvimento, homologa\u00e7\u00e3o e produ\u00e7\u00e3o.\n<hr \/>\nA qualidade das integra\u00e7\u00f5es de um sistema pode ser avaliada com uma <em>fitness function\u00a0<\/em>que avalie a quantidade de implementa\u00e7\u00f5es realizadas\u00a0<em>contract models\u00a0<\/em>(uma medida est\u00e1tica), ou ainda, o respeito aos contratos estabelecidos (uma medida din\u00e2mica).\n<hr \/>\nAdequa\u00e7\u00e3o jur\u00eddica das licen\u00e7as dos softwares consumidos por um sistema de software pode ser determinada por uma <em>fitness function\u00a0<\/em>que verifique, em cada atualiza\u00e7\u00e3o, se os contratos foram alterados e &#8220;acionando advogados&#8221; quando necess\u00e1rio.\n<hr \/>\nCada <em>architectural fitness function\u00a0<\/em>consiste em uma decis\u00e3o arquitetural importante, que precisa ser devidamente registrada em uma ADR.\n<h2>Postergando decis\u00f5es para o &#8220;\u00faltimo momento respons\u00e1vel&#8221;<\/h2>\n<p><strong>Toda decis\u00e3o implica em assumir riscos.<\/strong> Quanto antes uma decis\u00e3o \u00e9 tomada, maiores s\u00e3o os riscos associados a possibilidade dessa decis\u00e3o representar um erro causando preju\u00edzos.<\/p>\nO in\u00edcio dos projetos de desenvolvimento de software, onde tradicionalmente residem boa parte das &#8220;a\u00e7\u00f5es arquiteturais&#8221;, \u00e9, curiosamente, tamb\u00e9m, o momento onde se sabe menos sobre objetivos de neg\u00f3cio, restri\u00e7\u00f5es e atributos de qualidade.\n<hr \/>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/imgs.xkcd.com\/comics\/the_general_problem.png\" alt=\"The General Problem\" \/><\/p>\n<hr \/>\nQuanto mais tarde, em um processo de desenvolvimento, uma decis\u00e3o \u00e9 tomada, maior \u00e9 quantidade de informa\u00e7\u00f5es dispon\u00edveis para fundamentar uma decis\u00e3o e, consequentemente, maiores s\u00e3o as chances de acerto e, proporcionalmente, menor \u00e9 o risco.\n<hr \/>\n<strong>As atividades de um arquiteto, em um contexto evolucion\u00e1rio, s\u00e3o o da busca constante da resolu\u00e7\u00e3o de incertezas. Ali\u00e1s, o grande inimigo \u00e9 a incerteza!\u00a0<\/strong>Isso n\u00e3o significa, entretanto que o arquiteto n\u00e3o deva ter, a todo momento, a &#8220;escolha-com-os-dados-de-agora&#8221;. Ou seja, documentos arquiteturais e discuss\u00f5es precisam revelar a &#8220;posi\u00e7\u00e3o atual&#8221; da arquitetura, indicando, por\u00e9m, onde est\u00e3o os pontos de maior incerteza.\n<hr \/>\n<p>No in\u00edcio dos projetos, a principal preocupa\u00e7\u00e3o dos arquitetos \u00e9 explicitar a estrat\u00e9gia &#8211; padr\u00f5es coerentes para tomada de decis\u00e3o &#8211; que deve ser observada nas escolhas. Se poss\u00edvel, essa &#8220;estrat\u00e9gia&#8221; precisa ser objetiva e observ\u00e1vel, expressa em<em> architectural fitness functions.\u00a0<\/em><strong>Arquitetura evolucion\u00e1ria n\u00e3o \u00e9 emergente, nem baseada em palpites.<\/strong><\/p>\n<h2>Arquiteturas evolutivas combatem as &#8220;origens&#8221; da complexidade<\/h2>\n<div class=\"nota-alerta\">\r\n<table class=\"tabelaalerta\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-citacao\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/> <em>There are two general approaches to fighting complexity. The first approach is to eliminate complexity by making code simpler and more obvious. For example, complexity can be reduced by eliminating special cases or using identifiers in a consistent fashion. The second approach to complexity is to encapsulate it, so that programmers can work on a system without being exposed to all of its complexity at once.<\/em>\r\n<p><strong>John Ousterhout<\/strong><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p><b>A complexidade tem quatro origens gen\u00e9ricas distintas que devem ser combatidas. S\u00e3o elas: dimensionalidade, interdepend\u00eancia, influ\u00eancia do ambiente e irreversibilidade.<\/b><\/p>\n<p>Quanto maior o n\u00famero de vari\u00e1veis envolvidas, maior ser\u00e1 a dimensionalidade. Por isso, por exemplo, qualquer software com mais\u00a0<i>features\u00a0<\/i>se torna mais complexo. A cada novo processo na organiza\u00e7\u00e3o, menor a simplicidade. Toda exce\u00e7\u00e3o suportada aumenta o custo.<\/p>\n<p><b>Opera\u00e7\u00f5es interdependentes demandam, por exemplo, sincroniza\u00e7\u00e3o.<\/b>\u00a0N\u00e3o raro, a indisponibilidade de um recurso impossibilita o uso de outro, aparentemente n\u00e3o relacionado. \u00c9 bastante comum que uma performance mais pobre de uma parte de um sistema deixe ele todo \u201clento\u201d.<\/p>\n<p>Sistemas mais \u201csens\u00edveis\u201d ao ambiente tamb\u00e9m s\u00e3o mais complexos. Afinal, demandam planejamento de conting\u00eancias e\u00a0<i>workarounds<\/i>.<\/p>\n<p>Finalmente, a irreversibilidade tamb\u00e9m demanda cuidados. A\u00e7\u00f5es ou eventos cujo ocorr\u00eancias resultem em consequ\u00eancias que n\u00e3o podem ser desfeitas implicam em custo maior de planejamento<del>, nem sempre eficiente. <\/del>Boa parte das estrat\u00e9gias modernas de desenvolvimento conta com o pressuposto de um \u201crollback\u201d r\u00e1pido. Este \u00e9 o fundamento de iniciativas operacionais como DevOps.<\/p>\n<p>Naturalmente, sistemas tendem para o incremento da dimensionalidade e da interdepend\u00eancia. Al\u00e9m disso, em ambientes cada vez mais abrangentes, \u00e9 dif\u00edcil controlar o impacto do ambiente, marcando, de forma irrevers\u00edvel impactos e preju\u00edzos. \u00a0<b>Se o empenho de um time for orientado a apenas manter os n\u00edveis atuais de complexidade, essa ir\u00e1 aumentar.<\/b><\/p>\n<h2>Sistemas que seguem a lei de Postel evoluem mais f\u00e1cil<\/h2>\n<p id=\"a121\" class=\"gr gs dt gt b gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho dl eq\" data-selectable-paragraph=\"\">A\u00a0<strong class=\"gt io\">Lei de Postel<\/strong>\u00a0\u2014 ou Lei da Robustez \u2014 \u00e9 um princ\u00edpio originalmente descrito como um guia para a\u00a0<strong class=\"gt io\">transfer\u00eancia de dados<\/strong> entre softwares. Contudo, ela \u00e9 bastante compat\u00edvel com arquitetura.<\/p>\n<p data-selectable-paragraph=\"\">A lei preconiza que sistemas sejam 1) conservadores no que enviam e ; 2) liberais no que recebem;<\/p>\n<p data-selectable-paragraph=\"\"><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/imgs.xkcd.com\/comics\/standards.png\" alt=\"Standards\" \/><\/p>\n<h2>Toda grande jornada tem desvios, atalhos e &#8230; aprendizado<\/h2>\n<p><strong>Os sistemas mais interessantes (e \u00fateis) costumam come\u00e7ar com uma excelente dire\u00e7\u00e3o, mas, raramente escopo claramente delimitado.<\/strong> Se h\u00e1 uma certeza \u00e9 de que requisitos mudam, condi\u00e7\u00f5es t\u00e9cnicas tamb\u00e9m.<\/p>\n<p>Arquiteturas de software de qualidade s\u00e3o, acima de tudo, aquelas que permitem que mudan\u00e7as de rumo sejam feitas com menos trauma poss\u00edvel. Quanto mais &#8220;f\u00e1cil de mudar&#8221;, maior o espa\u00e7o entre eventuais descontinuidades.<\/p>\n<h2>\/\/ TODO<\/h2>\n<p>Antes de avan\u00e7ar para o pr\u00f3ximo cap\u00edtulo, recomendo as seguintes reflexo\u00f5es:<\/p>\n<ul>\n<li>\u00c9 poss\u00edvel expressar objetivos, atributos de qualidade e restri\u00e7\u00f5es do sistema em que est\u00e1 trabalhando de forma objetiva?<\/li>\n<li>As m\u00e9tricas de qualidade interna est\u00e3o orientadas a facilitar a manutenabilidade?<\/li>\n<li>Quais partes do seu sistema demandam mais testes?<\/li>\n<li>Qual o n\u00edvel de acoplamento atual do frontend com l\u00f3gicas de neg\u00f3cio?<\/li>\n<\/ul>\n","protected":false},"featured_media":3824,"parent":0,"comment_status":"open","ping_status":"closed","template":"","url":[],"sessoes":[57],"apendices":[],"capitulos":[24],"class_list":["post-4002","volume-1","type-volume-1","status-publish","has-post-thumbnail","hentry","sessoes-secao-1","capitulos-capitulo-1-5"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Construindo arquiteturas que evoluem \/ Cap\u00edtulo 1.5 v3.0 - Manual do Arquiteto de Software<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Construindo arquiteturas que evoluem \/ Cap\u00edtulo 1.5 v3.0 - Manual do Arquiteto de Software\" \/>\n<meta property=\"og:description\" content=\"Software muda! Muitas vezes para atender novas necessidades do neg\u00f3cio, algumas vezes para acomodar evolu\u00e7\u00f5es tecnol\u00f3gicas. Boas pr\u00e1ticas arquiteturais ajudam a &#8220;aceitar&#8221; melhor as mudan\u00e7as, minimizando custo e riscos. Com o tempo, a aplica\u00e7\u00e3o de mudan\u00e7as gera, naturalmente, complexidades predat\u00f3rias. Ou seja, resqu\u00edcios de iniciativas ou decis\u00f5es do passado que ficam no c\u00f3digo ou em [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/\" \/>\n<meta property=\"og:site_name\" content=\"Manual do Arquiteto de Software\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/facebook.com\/eximiaco\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-11T20:55:19+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/1.4.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"600\" \/>\n\t<meta property=\"og:image:height\" content=\"338\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@eximiaco\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"17 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/\",\"name\":\"Construindo arquiteturas que evoluem \/ Cap\u00edtulo 1.5 v3.0 - Manual do Arquiteto de Software\",\"isPartOf\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/1.4.jpg\",\"datePublished\":\"2022-04-12T21:30:40+00:00\",\"dateModified\":\"2024-01-11T20:55:19+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/#primaryimage\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/1.4.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/1.4.jpg\",\"width\":600,\"height\":338},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Volume 1\",\"item\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Construindo arquiteturas que evoluem \/ Cap\u00edtulo 1.5 v3.0\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\",\"name\":\"Manual do Arquiteto de Software\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization\",\"name\":\"EximiaCo\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg\",\"width\":150,\"height\":150,\"caption\":\"EximiaCo\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/facebook.com\/eximiaco\",\"https:\/\/x.com\/eximiaco\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Construindo arquiteturas que evoluem \/ Cap\u00edtulo 1.5 v3.0 - Manual do Arquiteto de Software","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/","og_locale":"pt_BR","og_type":"article","og_title":"Construindo arquiteturas que evoluem \/ Cap\u00edtulo 1.5 v3.0 - Manual do Arquiteto de Software","og_description":"Software muda! Muitas vezes para atender novas necessidades do neg\u00f3cio, algumas vezes para acomodar evolu\u00e7\u00f5es tecnol\u00f3gicas. Boas pr\u00e1ticas arquiteturais ajudam a &#8220;aceitar&#8221; melhor as mudan\u00e7as, minimizando custo e riscos. Com o tempo, a aplica\u00e7\u00e3o de mudan\u00e7as gera, naturalmente, complexidades predat\u00f3rias. Ou seja, resqu\u00edcios de iniciativas ou decis\u00f5es do passado que ficam no c\u00f3digo ou em [&hellip;]","og_url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/","og_site_name":"Manual do Arquiteto de Software","article_publisher":"https:\/\/facebook.com\/eximiaco","article_modified_time":"2024-01-11T20:55:19+00:00","og_image":[{"width":600,"height":338,"url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/1.4.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_site":"@eximiaco","twitter_misc":{"Est. tempo de leitura":"17 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/","name":"Construindo arquiteturas que evoluem \/ Cap\u00edtulo 1.5 v3.0 - Manual do Arquiteto de Software","isPartOf":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website"},"primaryImageOfPage":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/#primaryimage"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/#primaryimage"},"thumbnailUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/1.4.jpg","datePublished":"2022-04-12T21:30:40+00:00","dateModified":"2024-01-11T20:55:19+00:00","breadcrumb":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/#primaryimage","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/1.4.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/1.4.jpg","width":600,"height":338},{"@type":"BreadcrumbList","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/construindo-arquiteturas-que-evoluem-capitulo-1-5-v3-0\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/"},{"@type":"ListItem","position":2,"name":"Volume 1","item":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/"},{"@type":"ListItem","position":3,"name":"Construindo arquiteturas que evoluem \/ Cap\u00edtulo 1.5 v3.0"}]},{"@type":"WebSite","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/","name":"Manual do Arquiteto de Software","description":"","publisher":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization","name":"EximiaCo","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg","width":150,"height":150,"caption":"EximiaCo"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/facebook.com\/eximiaco","https:\/\/x.com\/eximiaco"]}]}},"_links":{"self":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/volume-1\/4002","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/volume-1"}],"about":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/types\/volume-1"}],"replies":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/comments?post=4002"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media\/3824"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media?parent=4002"}],"wp:term":[{"taxonomy":"url","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/url?post=4002"},{"taxonomy":"sessoes","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/sessoes?post=4002"},{"taxonomy":"apendices","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/apendices?post=4002"},{"taxonomy":"capitulos","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/capitulos?post=4002"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}