<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Felipe Freitas</title>
    <description>The latest articles on DEV Community by Felipe Freitas (@felipefreitasffs).</description>
    <link>https://dev.to/felipefreitasffs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F20197%2Fe6fa9e15-baa3-4110-a866-1e99b5fe7fbe.jpeg</url>
      <title>DEV Community: Felipe Freitas</title>
      <link>https://dev.to/felipefreitasffs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/felipefreitasffs"/>
    <language>en</language>
    <item>
      <title>Separando o Deploy do Release - Como Entregar Valor com Segurança e Flexibilidade</title>
      <dc:creator>Felipe Freitas</dc:creator>
      <pubDate>Wed, 16 Oct 2024 19:51:27 +0000</pubDate>
      <link>https://dev.to/felipefreitasffs/separando-o-deploy-do-release-como-entregar-valor-com-seguranca-e-flexibilidade-1176</link>
      <guid>https://dev.to/felipefreitasffs/separando-o-deploy-do-release-como-entregar-valor-com-seguranca-e-flexibilidade-1176</guid>
      <description>&lt;p&gt;Ainda é comum encontrar equipes de desenvolvimento que associam cada &lt;strong&gt;deploy&lt;/strong&gt; em produção diretamente a uma nova &lt;strong&gt;release&lt;/strong&gt; do produto. Embora esses dois conceitos estejam interligados, tratá-los como sinônimos pode limitar a flexibilidade e aumentar os riscos. Ao &lt;strong&gt;separar o deploy da release&lt;/strong&gt;, as equipes ganham mais controle sobre o ciclo de vida do software, possibilitando uma entrega mais segura e previsível. Estratégias como &lt;strong&gt;Feature Flags&lt;/strong&gt;, &lt;strong&gt;Canary Releases&lt;/strong&gt; e &lt;strong&gt;Blue-Green Deployment&lt;/strong&gt; permitem realizar deploys frequentes sem expor os usuários a mudanças imediatas, facilitando a experimentação, a mitigação de riscos e a entrega contínua de valor. Para as empresas, isso significa maior agilidade para responder ao mercado, melhor experiência do usuário e um caminho mais seguro para inovação.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deploy vs. Release
&lt;/h2&gt;

&lt;p&gt;Antes de mais nada, é importante definir o que entendemos por deploy e release:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deploy&lt;/strong&gt;: Refere-se ao processo de transferir código para um ambiente seja o de desenvolvimento, homologação ou produção. O código pode incluir novas funcionalidades, correções de bugs, ou até mesmo pequenos ajustes que não são perceptíveis para o usuário final.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Release&lt;/strong&gt;: É o momento em que uma nova versão de uma aplicação é disponibilizada ao usuário final. Ela pode englobar um conjunto de novas funcionalidades ou uma mudança significativa no sistema.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Logo, um deploy em produção pode ocorrer sem que os usuários percebam uma nova "release", pois os mecanismos de ativação dessas funcionalidades podem ser controlados de diferentes formas.&lt;/p&gt;

&lt;p&gt;Para empresas que adotam práticas de alta performance, o deploy frequente é uma realidade. De acordo com o &lt;em&gt;State of DevOps Report 2023&lt;/em&gt;, equipes de elite realizam deploys sob demanda, o que pode significar &lt;strong&gt;vários deploys por dia&lt;/strong&gt;, dependendo da necessidade. Essas equipes têm a capacidade de fazer mudanças em produção de forma frequente e segura.&lt;/p&gt;

&lt;p&gt;Manter o código em produção antes de liberá-lo proporciona às equipes de desenvolvimento tempo para testes adicionais e ajustes sem impactar diretamente os usuários. Empresas que implementam essa prática reportam uma menor taxa de falhas por deploy, aumentando a previsibilidade dos lançamentos e a confiança no processo de entrega.&lt;/p&gt;




&lt;h2&gt;
  
  
  Estratégias para Manter Deploy e Release Separados
&lt;/h2&gt;

&lt;p&gt;Existem várias estratégias que permitem separar o deploy do release, oferecendo benefícios tanto técnicos quanto de negócio. Vamos explorar as principais técnicas: &lt;strong&gt;Feature Flags&lt;/strong&gt;, &lt;strong&gt;Blue-Green Deployment&lt;/strong&gt;, &lt;strong&gt;Canary Releases&lt;/strong&gt;, &lt;strong&gt;Rolling Deployment&lt;/strong&gt; e &lt;strong&gt;A/B Testing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnfh6shdejxs8qopalhza.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnfh6shdejxs8qopalhza.gif" alt="Image description" width="800" height="992"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Feature Flags&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;As &lt;strong&gt;Feature Flags&lt;/strong&gt; permitem que novas funcionalidades sejam ativadas ou desativadas dinamicamente, sem a necessidade de novos deploys. Isso significa que o código está presente, mas desativado, aguardando o momento ideal para ser liberado. A prática de Feature Flags não apenas melhora a flexibilidade, como também aumenta a segurança.&lt;/p&gt;

&lt;h4&gt;
  
  
  Benefícios das Feature Flags:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Ativação dinâmica de funcionalidades.&lt;/li&gt;
&lt;li&gt;Facilidade para testes A/B.&lt;/li&gt;
&lt;li&gt;Desativação rápida em caso de problemas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Blue-Green Deployment&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;No &lt;strong&gt;Blue-Green Deployment&lt;/strong&gt;, dois ambientes de produção são mantidos: Blue (ativo) e Green (inativo). O código é implantado no ambiente inativo (Green) e, quando pronto, o tráfego de produção é redirecionado para ele. Isso garante um processo de transição suave entre versões e evita interrupções.&lt;/p&gt;

&lt;h4&gt;
  
  
  Benefícios:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Zero downtime durante o lançamento.&lt;/li&gt;
&lt;li&gt;Rollback rápido e seguro.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Canary Releases&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;No &lt;strong&gt;Canary Releases&lt;/strong&gt;, apenas uma pequena porcentagem de usuários recebe as novas funcionalidades inicialmente. Isso permite que a equipe monitore o desempenho e identifique potenciais problemas antes de realizar um rollout completo.&lt;/p&gt;

&lt;h4&gt;
  
  
  Benefícios:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Testes em produção com risco minimizado.&lt;/li&gt;
&lt;li&gt;Identificação precoce de problemas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;A/B Testing&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;A/B Testing&lt;/strong&gt; permite que diferentes versões de uma funcionalidade sejam testadas simultaneamente com subconjuntos de usuários, possibilitando que as equipes avaliem a eficácia de mudanças e ajustem funcionalidades antes do lançamento para todos os usuários.&lt;/p&gt;

&lt;h4&gt;
  
  
  Benefícios:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Tomada de decisões baseada em dados reais.&lt;/li&gt;
&lt;li&gt;Melhoria contínua de funcionalidades.
### 5. &lt;strong&gt;Rolling Deployment&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O &lt;strong&gt;Rolling Deployment&lt;/strong&gt; é uma estratégia na qual a nova versão do sistema é implantada gradualmente, substituindo aos poucos as instâncias da versão antiga, até que todas as instâncias estejam executando a versão mais recente. Isso minimiza o impacto em produção, uma vez que sempre há instâncias ativas da versão anterior enquanto a nova versão está sendo implantada.&lt;/p&gt;

&lt;h4&gt;
  
  
  Benefícios:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Evita downtime, mantendo instâncias ativas durante o processo.&lt;/li&gt;
&lt;li&gt;Permite rollback parcial em caso de problemas durante a implantação.&lt;/li&gt;
&lt;li&gt;Reduz o risco de falhas em massa.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Impacto no Negócio e Produto
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Lançamentos Mais Previsíveis e Menos Arriscados&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A separação entre deploy e release permite que o lançamento de novas funcionalidades seja mais previsível, reduzindo os riscos de interrupções inesperadas para o usuário final. Empresas que adotam essa separação têm &lt;strong&gt;menos falhas em produção&lt;/strong&gt;, o que impacta diretamente a confiança do cliente e a percepção de qualidade do produto. Essa previsibilidade ao lançar funcionalidades de forma suave e sem interrupções também influencia positivamente a &lt;strong&gt;taxa de satisfação dos clientes&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Agilidade para Reagir a Oportunidades de Mercado&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Manter o código em produção antes de liberá-lo para todos os usuários oferece às empresas uma vantagem significativa na resposta rápida a mudanças de mercado, como novas regulamentações ou feedbacks de clientes. Essa prática permite ajustes imediatos sem a necessidade de longos ciclos de desenvolvimento e grandes releases, garantindo que as empresas estejam preparadas para capturar oportunidades com agilidade. Empresas que implementam &lt;strong&gt;Continuous Delivery (CD)&lt;/strong&gt; podem responder a mudanças em tempo real com maior precisão e eficiência, permitindo que novas funcionalidades ou ajustes sejam implementados de maneira segura e incremental.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Decisões Baseadas em Dados&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Técnicas como Feature Flags e A/B Testing permitem que decisões de produto sejam baseadas em dados reais pois permite que as empresas coletem dados valiosos sobre o comportamento do usuário antes de liberar uma funcionalidade para todos, o que resulta em funcionalidades mais adequadas ao comportamento dos usuários. Decisões orientadas por dados levam a mais confiança, proatividade e otimização de custos. O uso de dados para monitorar e medir a eficácia de um deploy permite ajustes precisos no momento de uma release, melhorando a experiência do usuário e minimizando riscos&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Redução de Custos com Suporte e Manutenção&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Uma das maiores vantagens das práticas de deploy ágil e entrega contínua é a &lt;strong&gt;redução significativa de custos com suporte e manutenção&lt;/strong&gt;. Ao implantar código em pequenos incrementos e com controle rigoroso sobre a liberação de funcionalidades, as empresas conseguem evitar grandes mudanças disruptivas, o que diminui a necessidade de intervenções de emergência no suporte. Como o código é testado em produção em pequenos lotes, os incidentes são detectados e resolvidos antes que atinjam uma parcela significativa de usuários. Isso diminui o volume de problemas de suporte que requerem solução imediata, resultando em economia de tempo e dinheiro.&lt;/p&gt;




&lt;h2&gt;
  
  
  Integração com Metodologias Ágeis
&lt;/h2&gt;

&lt;p&gt;No contexto de metodologias ágeis, a separação entre &lt;strong&gt;deploy&lt;/strong&gt; e &lt;strong&gt;release&lt;/strong&gt; permite uma &lt;strong&gt;entrega contínua&lt;/strong&gt; de valor ao longo das sprints. Em vez de aguardar até o fim de cada sprint para liberar todas as funcionalidades de uma vez, as equipes podem realizar deploys frequentes, mantendo novas funcionalidades em "&lt;em&gt;standby&lt;/em&gt;" até que estejam maduras para serem ativadas. Essa abordagem garante maior flexibilidade na priorização de tarefas e no planejamento de lançamentos, possibilitando ajustes com base em feedbacks e minimizando o risco de grandes interrupções ou retrabalhos.&lt;/p&gt;

&lt;p&gt;Essa prática não só facilita a validação incremental de funcionalidades ao longo do ciclo de desenvolvimento, como também protege a &lt;strong&gt;estabilidade do ambiente de produção&lt;/strong&gt;. Ao implantar funcionalidades de maneira controlada, as equipes podem testar e verificar partes do código em produção sem afetar diretamente os usuários, mantendo a consistência da entrega de valor sem comprometer a qualidade ou a segurança do sistema.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A separação entre &lt;strong&gt;deploy&lt;/strong&gt; e &lt;strong&gt;release&lt;/strong&gt; não só otimiza a eficiência técnica, como também gera impactos positivos para o negócio. Técnicas como &lt;strong&gt;Feature Flags&lt;/strong&gt;, &lt;strong&gt;Canary Releases&lt;/strong&gt;, &lt;strong&gt;Blue-Green Deployment&lt;/strong&gt; e &lt;strong&gt;A/B Testing&lt;/strong&gt; são essenciais para garantir que o valor seja entregue aos clientes de forma segura e controlada, permitindo que as equipes alinhem suas entregas com objetivos estratégicos. Além de melhorar a experiência do usuário, essas práticas aumentam a flexibilidade e mitigam o risco de interrupções, contribuindo para um processo mais ágil e responsivo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;State of DevOps Report 2023&lt;/em&gt;. Disponível em: &lt;a href="https://services.google.com/fh/files/misc/2023_final_report_sodr.pdf" rel="noopener noreferrer"&gt;https://services.google.com/fh/files/misc/2023_final_report_sodr.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;How Being a Data-Driven Company Leads to Better Outcomes_. Harvard Business Review. Disponível em: &lt;a href="https://hbr.org/2020/02/how-being-a-data-driven-company-leads-to-better-outcomes" rel="noopener noreferrer"&gt;https://hbr.org/2020/02/how-being-a-data-driven-company-leads-to-better-outcomes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Feature Toggles (aka Feature Flags)&lt;/em&gt;. Hodgson, Pete. Disponível em: &lt;a href="https://martinfowler.com/articles/feature-toggles.html" rel="noopener noreferrer"&gt;https://martinfowler.com/articles/feature-toggles.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>Modernizando Plataformas Monolíticas - Minha experiência com o Strangler Pattern</title>
      <dc:creator>Felipe Freitas</dc:creator>
      <pubDate>Thu, 03 Oct 2024 17:55:21 +0000</pubDate>
      <link>https://dev.to/felipefreitasffs/modernizando-plataformas-monoliticas-minha-experiencia-com-o-strangler-pattern-164j</link>
      <guid>https://dev.to/felipefreitasffs/modernizando-plataformas-monoliticas-minha-experiencia-com-o-strangler-pattern-164j</guid>
      <description>&lt;p&gt;Nos últimos tempos, tenho trabalhado na modernização de uma plataforma que, com o passar dos anos, começou a enfrentar desafios de performance e manutenção. Com o passar do tempo, sistemas de software tendem a sofrer com algo conhecido como &lt;strong&gt;entropia de software&lt;/strong&gt;. Isso acontece quando o código vai se tornando cada vez mais complicado e desorganizado à medida que novas funcionalidades são adicionadas, bugs são corrigidos e ajustes rápidos são feitos. A entropia vai se acumulando, e de repente, o sistema que antes funcionava bem vira um labirinto cheio de dependências que dificultam a manutenção e afetam a performance.&lt;/p&gt;

&lt;p&gt;Esse aumento da entropia é comum em &lt;strong&gt;sistemas monolíticos&lt;/strong&gt;. À medida que o sistema cresce, fica cada vez mais difícil adicionar ou mudar algo sem quebrar outras partes, e a performance acaba caindo.&lt;/p&gt;

&lt;p&gt;Foi aí que comecei a aplicar o &lt;strong&gt;Strangler Pattern,&lt;/strong&gt; em vez de tentar reescrever o monolito do zero, essa abordagem incremental vem me permitindo transformar o sistema sem derrubar tudo de uma vez.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é a Entropia de Software?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;entropia de software&lt;/strong&gt; é um fenômeno comum em sistemas que vão crescendo e evoluindo com o tempo, especialmente em &lt;strong&gt;sistemas monolíticos&lt;/strong&gt;. No contexto da engenharia de software, o termo "entropia" é emprestado da física e refere-se à desordem ou ao aumento da complexidade em um sistema. Quanto mais tempo um sistema é mantido e mais mudanças são feitas nele, mais ele tende a se desorganizar e ficar difícil de entender e modificar. Isso acontece por uma série de razões:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Correções de bugs&lt;/strong&gt; e implementações rápidas acabam sendo feitas sem o devido planejamento, o que resulta em “remendos” no código.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Novas funcionalidades&lt;/strong&gt; são adicionadas, muitas vezes sobre partes já antigas e mal documentadas, aumentando a complexidade do código.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependências e interligações&lt;/strong&gt; começam a surgir em excesso, tornando o sistema mais frágil – qualquer pequena alteração pode ter um efeito cascata em outras partes do sistema.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com o tempo, essas mudanças incrementais tornam o sistema menos eficiente e mais difícil de manter, e isso pode resultar em problemas graves de performance, bugs recorrentes e aumento dos custos de manutenção. Além disso, a entropia do software cria barreiras para que novos desenvolvedores entendam e trabalhem no sistema, desacelerando o ritmo de entrega e inovação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8y35dmjsnll3rhf3xlsn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8y35dmjsnll3rhf3xlsn.png" alt="Entropia de Software" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.chatbotslife.com/software-entropy-explained-causes-effects-and-remedies-baada6ae083b" rel="noopener noreferrer"&gt;https://blog.chatbotslife.com/software-entropy-explained-causes-effects-and-remedies-baada6ae083b&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Como o Strangler Pattern entra em cena?
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Strangler Pattern&lt;/strong&gt; é uma estratégia de refatoração usada para modernizar sistemas monolíticos de maneira gradual. Em vez de tentar reescrever o sistema inteiro de uma só vez – o que pode ser arriscado e demorado – essa abordagem permite que você migre funcionalidades específicas para novas implementações de forma controlada e progressiva.&lt;/p&gt;

&lt;p&gt;O nome "Strangler" é inspirado em uma planta parasita que cresce ao redor de uma árvore, eventualmente substituindo-a. No contexto de software, a ideia é "estrangular" o monolito antigo, migrando suas funcionalidades para componentes novos e mais eficientes. Com o tempo, o sistema monolítico é substituído de forma incremental por serviços modernos, sem a necessidade de reescrever tudo de uma vez.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como o Strangler Pattern funciona na prática?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Identificação de funcionalidades&lt;/strong&gt;: O primeiro passo é identificar as funcionalidades ou módulos mais críticos ou problemáticos no sistema. Muitas vezes, essas são as partes que mais afetam a performance ou que são mais difíceis de manter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desenvolvimento de novos serviços&lt;/strong&gt;: Após identificar as áreas chaves, começamos a desenvolver serviços independentes que substituem essas partes específicas. Importante: o sistema antigo continua rodando enquanto os novos serviços são testados e implementados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decomposição contínua&lt;/strong&gt;: Ao longo do tempo, seguimos esse processo até que o sistema antigo seja completamente "estrangulado" e substituído pelos novos serviços.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Por que usar o Strangler Pattern?
&lt;/h3&gt;

&lt;p&gt;Essa abordagem tem várias vantagens, especialmente em ambientes onde uma reescrita completa do sistema não é viável:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Redução de riscos&lt;/strong&gt;: Ao invés de realizar uma reescrita completa, o Strangler Pattern permite que a transição ocorra de forma incremental e segura. Isso reduz drasticamente o risco de falhas catastróficas, uma vez que você pode testar cada nova parte à medida que a antiga vai sendo substituída.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evolução contínua&lt;/strong&gt;: O sistema evolui de forma incremental, com novas funcionalidades sendo adicionadas aos novos serviços sem adicionar mais complexidade ao antigo sistema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalabilidade&lt;/strong&gt;: Novos serviços podem ser escalados de forma independente, aumentando a eficiência e a resposta do sistema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manutenção facilitada&lt;/strong&gt;: Cada serviço novo é construído com uma arquitetura mais moderna e organizada, facilitando a manutenção e evolução contínua do sistema.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na minha experiência, essa abordagem foi essencial para lidar com a entropia acumulada e, ao mesmo tempo, garantir que não houvesse interrupções drásticas no serviço. O &lt;strong&gt;Strangler Pattern&lt;/strong&gt; tem permitido modernizar a plataforma gradualmente, começando pelas partes que mais impactavam a performance e causavam sobrecarga.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbo1yt1t5kq9h8erb8ly0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbo1yt1t5kq9h8erb8ly0.png" alt="Strangler Pattern" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://microservices.io/patterns/refactoring/strangler-application.html" rel="noopener noreferrer"&gt;https://microservices.io/patterns/refactoring/strangler-application.html&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Impacto na performance e manutenção
&lt;/h2&gt;

&lt;p&gt;Desde que comecei a aplicar o Strangler Pattern, já percebi várias melhorias:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: A separação das partes críticas para novos serviços mais eficientes reduziu gargalos e melhorou o tempo de resposta do sistema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manutenção&lt;/strong&gt;: A modularização tornou o código mais organizado, facilitando a identificação e correção de problemas, além de reduzir o risco de criar novos bugs ao fazer alterações.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Novas Funcionalidades&lt;/strong&gt;: Implementar novos recursos ficou muito mais rápido e menos arriscado, já que agora o sistema é mais modular e estável.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Um processo contínuo
&lt;/h2&gt;

&lt;p&gt;Estou no meio dessa jornada de modernização, e o &lt;strong&gt;Strangler Pattern&lt;/strong&gt; tem se mostrado uma abordagem muito eficaz. A transição está acontecendo de forma gradual, o que me permite focar nas partes mais problemáticas e resolver os problemas de forma eficiente, sem grandes interrupções.&lt;/p&gt;

&lt;p&gt;Se você também está enfrentando o desafio da &lt;strong&gt;entropia de software&lt;/strong&gt; e está procurando uma forma de modernizar seu sistema, o Strangler Pattern pode ser uma excelente escolha. Ele permite refatorar e melhorar gradualmente o sistema, sem riscos significativos de uma interrupção drástica, e ajuda a deixar o sistema mais escalável, eficiente e fácil de manter.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Modernizar sistemas pode ser um desafio, mas com a abordagem certa, como o &lt;strong&gt;Strangler Pattern&lt;/strong&gt;, é possível realizar essa transição de forma incremental e obter resultados significativos. No meu caso, essa abordagem foi a chave para transformar uma plataforma antiga em algo mais ágil, escalável e muito mais fácil de manter.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://microservices.io/patterns/refactoring/strangler-application.html" rel="noopener noreferrer"&gt;https://microservices.io/patterns/refactoring/strangler-application.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.chatbotslife.com/software-entropy-explained-causes-effects-and-remedies-baada6ae083b" rel="noopener noreferrer"&gt;https://blog.chatbotslife.com/software-entropy-explained-causes-effects-and-remedies-baada6ae083b&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://martinfowler.com/bliki/StranglerFigApplication.html" rel="noopener noreferrer"&gt;https://martinfowler.com/bliki/StranglerFigApplication.html&lt;/a&gt;&lt;/p&gt;




</description>
      <category>architecture</category>
      <category>microservices</category>
    </item>
    <item>
      <title>Containers vs. Serveless</title>
      <dc:creator>Felipe Freitas</dc:creator>
      <pubDate>Wed, 13 Oct 2021 20:02:01 +0000</pubDate>
      <link>https://dev.to/felipefreitasffs/containers-vs-serveless-3i3g</link>
      <guid>https://dev.to/felipefreitasffs/containers-vs-serveless-3i3g</guid>
      <description>&lt;h2&gt;
  
  
  O que são containers
&lt;/h2&gt;

&lt;p&gt;Um contêiner é um pacote leve, autônomo e executável de um software que inclui tudo o que é necessário para executá-lo: código, tempo de execução, ferramentas do sistema, bibliotecas do sistema e configurações. Eles podem ser executados em qualquer lugar em um único pacote, de forma rápida, consistente e confiável, independentemente do ambiente de implantação.&lt;/p&gt;

&lt;p&gt;Como os contêineres compartilham recursos do sistema com o servidor host em vez de emular um sistema operacional virtual, eles são mais eficientes do que as máquinas virtuais. Ao isolar um aplicativo do ambiente de host externo, os contêineres permitem a implantação de aplicativos sem conflitos.&lt;/p&gt;

&lt;p&gt;Os contêineres corrigem o problema de execução do software quando ele é movido de um único ambiente de computação, essencialmente, isolando-o do ambiente, possibilitando mover aplicativos em contêineres facilmente entre hosts.&lt;/p&gt;

&lt;p&gt;Qualquer tipo de aplicativo pode ser executado em um contêiner. Um aplicativo em contêiner será executado da mesma maneira, não importa onde esteja hospedado. Os contêineres podem ser facilmente movidos e implantados onde necessário independentemente de seu conteúdo.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é serveless
&lt;/h2&gt;

&lt;p&gt;Serveless não significa que não haja servidores envolvidos. Serverless é um serviço de computação baseado em nuvem e, assim como tudo na nuvem, ele é executado em servidores. Portanto, sua experiência é sem servidor, mesmo que a infraestrutura subjacente não seja.&lt;/p&gt;

&lt;p&gt;Serveless é uma arquitetura de execução na qual o código do aplicativo é executado sob demanda. Da perspectiva do usuário, o único trabalho necessário para executar o código é carregá-lo e acionar quando ele deve ser executado. É por isso que é chamado de sem servidor - não há servidor para manter.&lt;/p&gt;

&lt;p&gt;Os aplicativos serveless são hospedados por um fornecedor terceirizado que cobra apenas com base no tempo de execução de cada função. O provedor de nuvem gerencia dinamicamente a alocação de recursos da máquina. Serverless permite escrever e implantar código sem o incômodo de gerenciar a infraestrutura subjacente, o que aumenta a produtividade do desenvolvedor. Você está abstraindo totalmente a infraestrutura.&lt;/p&gt;

&lt;p&gt;Todo o aplicativo ou parte de um aplicativo é dividido em várias funções, cada uma das quais é acionada em resposta a um evento como uma solicitação HTTP, a chegada de uma nova mensagem na fila de mensagens ou o salvamento ou modificação de um novo objeto no armazenamento. É possível executar essas funções em um determinado momento ou periodicamente, um recurso que é útil para tarefas cron.&lt;/p&gt;

&lt;p&gt;Serveless é ótimo se você tiver picos repentinos de tráfego que precisam ser detectados e tratados instantaneamente. O aplicativo é totalmente encerrado se não houver tráfego. Você paga apenas pelos recursos que usa. Sem uso, sem custos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Serveless é muito adequada para uma variedade de tarefas, mas está longe de ser um substituto completo para implantar e gerenciar seus próprios contêineres. Serveless é projetado para funcionar em conjunto com os contêineres, em vez de substituí-los.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que essas tecnologias tem em comum?
&lt;/h2&gt;

&lt;p&gt;Permitem que os desenvolvedores se concentrem em seu código em vez de na infraestrutura. Isso aumenta a velocidade de desenvolvimento.&lt;/p&gt; 

&lt;p&gt;Ambos são perfeitamente adequados para microsserviços e arquiteturas baseadas em componentes. Ao usá-los, a implantação e o escalonamento costumam ser mais rápidos e econômicos do que na arquitetura monolítica clássica, porque você está manipulando pequenas partes do aplicativo em vez de tudo.&lt;/p&gt;

&lt;p&gt;Apesar dessas semelhanças, cada tecnologia tem suas próprias vantagens, desvantagens e casos de uso.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aLyMcIPo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/egl8yvf5azq5l31s9nmu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aLyMcIPo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/egl8yvf5azq5l31s9nmu.png" alt="Image comparativo container e serveless"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prós Containers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A principal vantagem de um contêiner é que você pode combinar o aplicativo e todas as suas dependências em um pequeno pacote organizado e executá-lo em qualquer lugar. Isso fornece um nível sem precedentes de flexibilidade e portabilidade e permite que você continue sendo um provedor agnóstico baseado em nuvem.&lt;/li&gt;
&lt;li&gt;Os contêineres podem ser executados em qualquer servidor Linux moderno, bem como em certas versões do Windows.&lt;/li&gt;
&lt;li&gt;As soluções baseadas em contêiner podem ser facilmente transferidas entre provedores de nuvem.&lt;/li&gt;
&lt;li&gt;Você pode configurar seu próprio ambiente de host local ou usar um serviço de nuvem pública como ECS.&lt;/li&gt;
&lt;li&gt;Você pode colocar em contêineres um aplicativo escrito em qualquer tipo de linguagem.&lt;/li&gt;
&lt;li&gt;Os contêineres podem funcionar pelo tempo que você precisar.&lt;/li&gt;
&lt;li&gt;No ecossistema de containers, existem ferramentas abrangentes para a análise de containers.&lt;/li&gt;
&lt;li&gt;Você pode gerenciar todos os recursos, definir todas as políticas, monitorar a segurança e determinar como seu aplicativo é implementado e como se comporta. Você pode depurar e monitorar como quiser. Este não é o caso do serveless pois tudo é gerenciado pelo seu provedor de nuvem.&lt;/li&gt;
&lt;li&gt;Os contêineres de sua equipe terão o mesmo ambiente de desenvolvimento, independentemente do sistema operacional usado. Isso torna incrivelmente fácil para equipes maiores serem eficientes.&lt;/li&gt;
&lt;li&gt;Crucial para qualquer aplicativo empresarial, os contêineres permitem testes e depuração abrangentes, bem como monitoramento de desempenho. Os microserviços podem ser ajustados para atender aos requisitos de desempenho do sistema subjacente. Com total controle sobre o ambiente do contêiner, vem todo o poder para observar o que acontece dentro e fora dos contêineres. Isso permite depuração e teste eficazes e abrangentes, usando uma gama completa de recursos, bem como monitoramento de desempenho em profundidade em todos os níveis.&lt;/li&gt;
&lt;li&gt;A tecnologia de contêiner permite que você torne seus aplicativos tão grandes quanto desejar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Contra Containers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Você precisa saber mais sobre o ambiente e os diferentes recursos ao seu alcance. É uma curva de aprendizado íngreme para todos, porque basicamente você é quem implanta e gerencia o programa.&lt;/li&gt;
&lt;li&gt;Usar contêineres significa que você não terá escalonamento automático. É algo que você precisa configurar sozinho. Felizmente, ferramentas específicas do fornecedor, como AWS Auto Scaling, tornam isso mais fácil.&lt;/li&gt;
&lt;li&gt;Os contêineres também podem ser dimensionados de acordo com a demanda. Em contraste com o serveless, o dimensionamento do contêiner é de responsabilidade do usuário.&lt;/li&gt;
&lt;li&gt;O Kubernetes normalmente é escalonado de acordo com o uso de CPU ou memória. Em arquiteturas baseadas em eventos, o Kubernetes costuma reagir tarde demais, pois o número de mensagens pendentes na fila não afeta o escalonamento. Esse problema pode ser contornada com um sistema de observabilidade das filas e ativando triggers para escalonar um serviço.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prós Serveless
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Você nunca paga pelo tempo ocioso de suas funções, portanto, se não houver tráfego, não haverá cobrança na sua fatura mensal. Quase todos os provedores sem servidor têm níveis gratuitos, que incluem uma quantidade fixa mensal de solicitações e tempo de execução. Normalmente, o volume fornecido é mais do que suficiente para que um pequeno site ou startup opere gratuitamente.&lt;/li&gt;
&lt;li&gt;A escalabilidade é o ponto forte do serverless. As funções sem servidor são dimensionadas automaticamente conforme necessário de acordo com a demanda, sendo que o dimensionamento é realizado inteiramente pelos provedores de nuvem. Isso economiza esforço administrativo e reduz a complexidade. &lt;/li&gt;
&lt;li&gt;As tecnologias serveless podem ser escalonadas de zero à carga de pico. Para um grande número de eventos, o provedor de nuvem garante que as funções serveless sejam dimensionadas rapidamente para lidar com os eventos. Isso torna os aplicativos serveless particularmente adequados para arquiteturas baseadas em eventos e aplicativos de negócios com picos de carga.&lt;/li&gt;
&lt;li&gt;Você não precisa gerenciar nenhuma infraestrutura. Não há atualizações do sistema operacional para instalar, nem patches de segurança, o provedor cuida disso para você.&lt;/li&gt;
&lt;li&gt;Ajudam a reduzir o tempo de desenvolvimento e a colocar seus produtos no mercado com mais rapidez. Se você não tem que se concentrar em sua infraestrutura, então você pode gastar seu tempo construindo o melhor produto possível.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Contra Serveless
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O serverless é executado em plataformas de host específicas, muitas das quais são baseadas na nuvem pública (como AWS Lambda ou Azure Functions).&lt;/li&gt;
&lt;li&gt;As estruturas serveless suportam um número limitado de linguagens que variam de plataforma para plataforma.&lt;/li&gt;
&lt;li&gt; A maioria das plataformas serveless são projetada para suportar cargas de trabalho stateless. No entanto você pode se conectar a serviços de armazenamento externo (como S3 no AWS), as funções (Lambdas) em si não podem ter estado. Isso traz novos requisitos de segurança para os dados.&lt;/li&gt;
&lt;li&gt; As funções serveless são projetadas para serem executadas por um curto período antes de serem encerradas.&lt;/li&gt;
&lt;li&gt; Não podem ser migradas facilmente entre provedores de nuvem. Isso se deve à implementação específica do provedor de nuvem de produtos sem servidor, como AWS Lambda e Azure Functions. Por exemplo, para migrar uma função AWS Lambda para uma função do Azure, os gatilhos (por exemplo, gatilhos HTTP, gatilhos de fila, gatilhos de banco de dados) teriam que ser reescritos.&lt;/li&gt;
&lt;li&gt; Como os servidores permanecem frios antes que um aplicativo faça ping neles, há uma certa latência envolvida na execução de tarefas. Para aplicativos em que a velocidade é fundamental, como e-commerce e páginas de pesquisa, o serveless pode não ser a solução ideal.&lt;/li&gt;
&lt;li&gt; O tempo de execução é gerenciado pelo provedor de nuvem, o que representa desafios adicionais na análise de desempenho. Sem a capacidade de instalar agentes para recuperar métricas diretamente do tempo de execução, deve-se confiar totalmente nos recursos das plataformas em nuvem.&lt;/li&gt;
&lt;li&gt;Aplicativos complexos podem ser difíceis de construir usando uma arquitetura serveless. Você terá que fazer muita coordenação e gerenciar dependências entre todas as funções sem servidor, o que pode ser uma tarefa difícil para aplicativos grandes e complicados.&lt;/li&gt;
&lt;li&gt;Observabilidade, monitoramento e depuração não são fáceis de fazer com a abordagem serveless. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Casos de uso serveless vs. contêiner
&lt;/h2&gt;

&lt;p&gt;Os contêineres são ideais para situações em que você precisa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Suportar aplicativos mais complexos e de longa execução, onde você precisa de um alto nível de controle ambiental e tem os recursos para configurar e manter o aplicativo.&lt;/li&gt;
&lt;li&gt;Manter a paridade do ambiente à medida que o código do sistema desce na cadeia de entrega (CI/CD). &lt;/li&gt;
&lt;li&gt;Mover aplicativos rapidamente entre diferentes servidores host.&lt;/li&gt;
&lt;li&gt;Manter a capacidade de mover cargas de trabalho entre o local e a nuvem.&lt;/li&gt;
&lt;li&gt;Disponibilizar serviços de forma contínua.&lt;/li&gt;
&lt;li&gt;Quando precisar de flexibilidade e controle total do seu sistema ou quando precisar migrar serviços legados.&lt;/li&gt;
&lt;li&gt;Construir uma solução que interaja com fornecedores e/ou bibliotecas terceiras, que dependam de diferentes protocolos ou exija linguagens específicas para desenvolvimento.&lt;/li&gt;
&lt;li&gt;São perfeitos para um aplicativo ou um grande site de comércio eletrônico. Um site como este contém muitas partes, como listas de produtos, processamento de pagamentos, gerenciamento de estoque e muito mais. Você pode usar contêineres para empacotar qualquer um desses serviços sem se preocupar com limites de tempo ou problemas de memória.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enquanto isso, serveless é ótimo quando você deseja:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quando você precisa de velocidade de desenvolvimento mais rápida, escalonamento automático e custos de tempo de execução drasticamente menores.&lt;/li&gt;
&lt;li&gt;Executar o código que consome muitos recursos rapidamente, de forma pontual.&lt;/li&gt;
&lt;li&gt;Executar quantidades finitas de código de aplicativo na nuvem sem ter que configurar um servidor virtual ou pagar por recursos de nuvem contínuos.&lt;/li&gt;
&lt;li&gt;Serveless é melhor usado para aplicativos que precisam ser capazes de realizar tarefas, mas não necessariamente precisam ser executados. Por exemplo, serveless é uma ótima opção para um aplicativo de Internet das Coisas (IoT) que detecta a presença de água para detectar vazamentos em uma instalação de armazenamento de água. O aplicativo não precisa ser executado o tempo todo, mas precisa estar pronto para agir em caso de vazamento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como pode ser observado, ambas estruturas possuem fortes pontos positivos e são totalmente complementares permitindo que arquiteturas possam utilizar o melhor dos dois mundos, coexistindo serverless e containeres na solução de diferentes problemas computacionais&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.sumologic.com/blog/serverless-vs-containers/"&gt;https://www.sumologic.com/blog/serverless-vs-containers/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/devops-dudes/containers-vs-serverless-which-one-you-should-choose-in-2020-38b1a0fa2b8a"&gt;https://medium.com/devops-dudes/containers-vs-serverless-which-one-you-should-choose-in-2020-38b1a0fa2b8a&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.extremenetworks.com/extreme-networks-blog/serverless-or-containers-why-not-both/"&gt;https://www.extremenetworks.com/extreme-networks-blog/serverless-or-containers-why-not-both/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.thundra.io/containers-vs-serverless"&gt;https://blog.thundra.io/containers-vs-serverless&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://caylent.com/containers-vs-serverless"&gt;https://caylent.com/containers-vs-serverless&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/adnanrahic/containers-vs-serverless-from-a-devops-standpoint-e4n"&gt;https://dev.to/adnanrahic/containers-vs-serverless-from-a-devops-standpoint-e4n&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rancher.com/containers-vs-serverless-computing/"&gt;https://rancher.com/containers-vs-serverless-computing/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cloudflare.com/learning/serverless/serverless-vs-containers/"&gt;https://www.cloudflare.com/learning/serverless/serverless-vs-containers/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x-team.com/blog/serverless-vs-containers/"&gt;https://x-team.com/blog/serverless-vs-containers/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ipt.ch/en/impuls/cloud-native-how-container-vs-serverless"&gt;https://ipt.ch/en/impuls/cloud-native-how-container-vs-serverless&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bioinformatics.csiro.au/blog/converting-traditional-architecture-to-cloud-native-applications/"&gt;https://bioinformatics.csiro.au/blog/converting-traditional-architecture-to-cloud-native-applications/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
  </channel>
</rss>
