<?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: Ed Wantuil</title>
    <description>The latest articles on DEV Community by Ed Wantuil (@ed-wantuil).</description>
    <link>https://dev.to/ed-wantuil</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%2F1233666%2F61507a5b-be61-48c4-a9a3-97194281e558.jpeg</url>
      <title>DEV Community: Ed Wantuil</title>
      <link>https://dev.to/ed-wantuil</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ed-wantuil"/>
    <language>en</language>
    <item>
      <title>Cloud Sem Falência: O mínimo que você precisa saber de FinOps</title>
      <dc:creator>Ed Wantuil</dc:creator>
      <pubDate>Mon, 12 Jan 2026 12:35:44 +0000</pubDate>
      <link>https://dev.to/ed-wantuil/cloud-sem-falencia-o-minimo-que-voce-precisa-saber-de-finops-8ao</link>
      <guid>https://dev.to/ed-wantuil/cloud-sem-falencia-o-minimo-que-voce-precisa-saber-de-finops-8ao</guid>
      <description>&lt;p&gt;Imagine a cena: você trabalha em uma empresa consolidada. Vocês têm aquele rack de servidores físicos robusto, piscando luzinhas em uma sala gelada, com piso elevado e controle biométrico (o famoso &lt;strong&gt;On-Premise&lt;/strong&gt;). Tudo funciona. O banco de dados aguenta o tranco, a latência é zero na rede local. Mas a diretoria decide que é hora de "modernizar".&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Vamos migrar para a Nuvem!"&lt;/em&gt;, dizem eles, com os olhos brilhando.&lt;/p&gt;

&lt;p&gt;A promessa no PowerPoint é sedutora: &lt;strong&gt;flexibilidade infinita&lt;/strong&gt;, &lt;strong&gt;segurança gerenciada&lt;/strong&gt; e o mantra mágico: &lt;strong&gt;"pagar só pelo que usar"&lt;/strong&gt;. A migração acontece via &lt;em&gt;Lift-and-Shift&lt;/em&gt; (pegar o que existe e jogar na nuvem sem refatorar). A equipe de Infra e Dev comemoram. O &lt;em&gt;Deploy&lt;/em&gt; é um sucesso.&lt;/p&gt;

&lt;p&gt;Três meses depois, chega a fatura da AWS.&lt;/p&gt;

&lt;p&gt;O diretor financeiro (CFO) não apenas cai da cadeira; ele convoca uma reunião de emergência. O custo, que antes era uma linha fixa e previsível no balanço anual, triplicou e agora flutua violentamente.&lt;/p&gt;

&lt;p&gt;O que deu errado? Simples: &lt;strong&gt;A engenharia tratou a Nuvem como um Data Center físico, apenas alugado.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hoje, vamos falar sobre os riscos dessa mudança e como aplicar &lt;strong&gt;FinOps&lt;/strong&gt; não como burocracia, mas como requisito de arquitetura.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Nota: Usaremos a AWS nos exemplos por ser a stack padrão de mercado, mas a lógica se aplica integralmente ao Azure, GCP e OCI).&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🦄 A Ilusão da Mágica: CAPEX vs. OPEX na Engenharia
&lt;/h2&gt;

&lt;p&gt;Para entender a conta da AWS, você precisa entender como o dinheiro sai do cofre da empresa. A mudança da nuvem não é apenas sobre onde o servidor roda, é sobre quem assume o risco do desperdício.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. CAPEX (Capital Expenditure): A Lógica do "PC Gamer"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CAPEX&lt;/strong&gt; é Despesa de Capital. É comprar a "caixa". Imagine que você vai montar um PC Gamer High-End. Você gasta R$ 20.000,00 na loja. Doeu no bolso na hora, certo? Mas depois que o PC está na sua mesa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Custo Marginal Zero:&lt;/strong&gt; Se você jogar &lt;em&gt;Paciência&lt;/em&gt; ou renderizar um vídeo em 8K a noite toda, não faz diferença financeira para o seu bolso (tirando a conta de luz, que é irrisória perto do hardware). O dinheiro já foi gasto (&lt;strong&gt;Sunk Cost&lt;/strong&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;O Comportamento do Engenheiro (On-Premise):&lt;/strong&gt; Como o processo de compra é lento (meses de cotação e aprovação), você tem medo de faltar recurso.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Mentalidade:&lt;/em&gt; "Vou pedir um servidor com 64 Cores, mesmo precisando de 16. Se sobrar, melhor. O hardware é nosso mesmo."&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Código:&lt;/em&gt; Eficiência não é prioridade financeira. Um código mal otimizado que consome 90% da CPU não gera uma fatura extra no fim do mês.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. OPEX (Operational Expenditure): A Lógica do Uber
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;OPEX&lt;/strong&gt; é Despesa Operacional. É o custo de funcionamento do dia a dia. Na nuvem, você não comprou o carro; você está rodando de Uber 24 horas por dia.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Custo Marginal Real:&lt;/strong&gt; Cada minuto parado no sinal custa dinheiro. Cada desvio de rota custa dinheiro.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;O Comportamento do Engenheiro (Cloud):&lt;/strong&gt; Aqui, a ineficiência é taxada instantaneamente.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Mentalidade:&lt;/em&gt; Aquele servidor de 64 cores e 512GB de ram parado esperando tráfego é como deixar o Uber te esperando na porta do escritório enquanto você trabalha. O taxímetro está rodando.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Código:&lt;/em&gt; Um loop infinito ou uma &lt;em&gt;query&lt;/em&gt; sem índice no banco de dados não deixa apenas o sistema lento; ele &lt;strong&gt;queima dinheiro vivo&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Comparativo para Desenvolvedores (Salve isso)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;CAPEX (On-Premise / Hardware Próprio)&lt;/th&gt;
&lt;th&gt;OPEX (Cloud / AWS / Azure)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Commit Financeiro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Você paga tudo antes de usar (Upfront).&lt;/td&gt;
&lt;td&gt;Você paga depois de usar (Pay-as-you-go).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Latência de Aprovação&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Alta. Precisa de reuniões, assinaturas e compras.&lt;/td&gt;
&lt;td&gt;Zero. Um &lt;code&gt;terraform apply&lt;/code&gt; gasta dinheiro instantaneamente.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Risco de Capacidade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Subutilização.&lt;/strong&gt; Comprar um servidor monstro e usar 10%.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Conta Surpresa.&lt;/strong&gt; Esquecer algo ligado ou escalar infinitamente.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Otimização de Código&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Melhora performance, mas não reduz a fatura do hardware.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Reduz diretamente a fatura.&lt;/strong&gt; Código limpo = Dinheiro no caixa.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Por que isso afeta a sua Arquitetura?
&lt;/h3&gt;

&lt;p&gt;Se você desenha uma arquitetura pensando em CAPEX (Mundo Físico) e a implementa em OPEX (Nuvem), você cria um desastre financeiro.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No CAPEX&lt;/strong&gt;, a estratégia de defesa é: "Superdimensionar para garantir estabilidade". (Compre o maior servidor possível).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No OPEX&lt;/strong&gt;, a estratégia de defesa é: "Elasticidade". (Comece com o menor servidor possível e configure para crescer sozinho &lt;em&gt;apenas&lt;/em&gt; se necessário).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💸 Os 8 Cavaleiros do Apocalipse Financeiro na AWS
&lt;/h2&gt;

&lt;p&gt;Na nuvem, os maiores vilões raramente são tecnologias complexas de IA ou Big Data. Quase sempre são &lt;strong&gt;decisões arquiteturais preguiçosas e falta de governança&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Instâncias "Just in Case": O Custo do Seguro Psicológico
&lt;/h3&gt;

&lt;p&gt;O sobredimensionamento é um vício comum: o desenvolvedor sobe uma instância &lt;code&gt;m5.2xlarge&lt;/code&gt; (8 vCPUs, 32GB RAM) não porque a aplicação exige, mas porque ele "não quer ter dor de cabeça". É o provisionamento baseado no medo, criando uma margem de segurança gigantesca e cara para evitar qualquer risco hipotético de lentidão.&lt;/p&gt;

&lt;p&gt;A realidade nua e crua aparece no CloudWatch: na maior parte do tempo, essa supermáquina opera com apenas 12% de CPU e usa uma fração da memória. Pagar por uma &lt;code&gt;2xlarge&lt;/code&gt; para rodar essa carga é como &lt;strong&gt;fretar um ônibus de 50 lugares para levar apenas 4 pessoas ao trabalho&lt;/strong&gt; todos os dias. Você está pagando pelo "espaço vazio" e pelo motor potente do ônibus, enquanto um carro popular (&lt;code&gt;t3.medium&lt;/code&gt;) faria o mesmo trajeto com o mesmo conforto e muito mais economia.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Ambientes Zumbis: A Torneira Aberta Fora do Expediente
&lt;/h3&gt;

&lt;p&gt;"Ambientes Zumbis" são servidores de Desenvolvimento e Homologação que operam como cópias fiéis da Produção, mas sem a audiência dela. Eles permanecem ligados e faturando às 3 da manhã de um domingo, consumindo recursos de nuvem para processar absolutamente nada. Manter esses servidores ligados 24/7 é o equivalente digital de &lt;strong&gt;deixar o ar-condicionado de um escritório ligado no máximo durante todo o fim de semana&lt;/strong&gt;, com o prédio completamente vazio.&lt;/p&gt;

&lt;p&gt;O impacto financeiro atua como um multiplicador de desperdício. Se você mantém três ambientes (Dev, Staging e Produção) com arquiteturas similares ligados ininterruptamente, seu custo base é &lt;strong&gt;300% do necessário&lt;/strong&gt;. A matemática é cruel: uma semana tem 168 horas, mas seus desenvolvedores trabalham apenas 40. Você está pagando por 128 horas de ociosidade pura por máquina, todas as semanas.&lt;/p&gt;

&lt;p&gt;A primeira cura para esse desperdício é o agendamento automático. Utilizando soluções como o &lt;strong&gt;AWS Instance Scheduler&lt;/strong&gt; (ou Lambdas simples), configuramos os ambientes para "acordar" às 08:00 e "dormir" às 20:00, de segunda a sexta-feira. Apenas essa automação básica, sem alterar uma linha de código da aplicação, reduz a fatura desses ambientes não-produtivos em cerca de &lt;strong&gt;70%&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. O Esquecimento Crônico: O Custo do Limbo
&lt;/h3&gt;

&lt;p&gt;Um dos "pegadinhas" mais comuns da nuvem acontece no momento de desligar as luzes: quando você termina uma instância EC2, o senso comum diz que a cobrança para. O erro está em assumir que a máquina e o disco são uma peça única. Por padrão, ao "matar" o servidor, o volume de armazenamento (EBS) acoplado a ele muitas vezes sobrevive, entrando num estado de limbo financeiro.&lt;/p&gt;

&lt;p&gt;O resultado é o acúmulo de &lt;strong&gt;EBS Órfãos&lt;/strong&gt;: centenas de discos no estado "Available" (não atrelados a ninguém), cheios de dados inúteis ou completamente vazios, pelos quais você paga o preço cheio do gigabyte provisionado. É comparável a vender seu carro, mas esquecer de cancelar o aluguel da vaga de garagem: o veículo não existe mais, mas a cobrança pelo espaço que ele ocupava continua chegando todo mês na fatura.&lt;/p&gt;

&lt;p&gt;A situação piora com os &lt;strong&gt;Elastic IPs (EIPs)&lt;/strong&gt;, que possuem uma lógica de cobrança invertida e punitiva. Devido à escassez mundial de endereços IPv4, a AWS não cobra pelo IP enquanto você o utiliza, mas &lt;strong&gt;começa a cobrar assim que ele fica ocioso&lt;/strong&gt;. É como uma "multa por não uso": se você reserva um endereço IP e não o atrela a uma instância em execução, você paga por estar "segurando" um recurso escasso sem necessidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. O Cemitério de Dados no S3
&lt;/h3&gt;

&lt;p&gt;Buckets S3 tendem a virar "cemitérios digitais" onde logs, backups e assets se acumulam indefinidamente. O erro crucial não é guardar os dados, mas a falta de estratégia: manter 100% desse volume na classe &lt;strong&gt;S3 Standard&lt;/strong&gt;, pagando a tarifa mais alta da AWS por arquivos que ninguém acessa há meses.&lt;/p&gt;

&lt;p&gt;Para entender o prejuízo, imagine o &lt;strong&gt;S3 Standard&lt;/strong&gt; como uma loja no corredor principal de um shopping: o aluguel é caríssimo porque o acesso é imediato e fácil (&lt;strong&gt;baixa latência&lt;/strong&gt;). Manter logs de 2022 nessa classe é como alugar essa vitrine premium apenas para estocar caixas de papelão velhas. Dados "frios", que raramente são consultados, não precisam estar à mão em milissegundos; eles podem ficar num armazém mais distante e barato.&lt;/p&gt;

&lt;p&gt;A solução é o &lt;strong&gt;S3 Lifecycle&lt;/strong&gt;, que automatiza a logística desse "estoque". Primeiro, ele atua na &lt;strong&gt;Transição&lt;/strong&gt;: move automaticamente os dados que envelhecem da "vitrine" (Standard) para o "armazém" (&lt;strong&gt;S3 Glacier&lt;/strong&gt;). No Glacier, você paga uma fração do preço, aceitando que o resgate do arquivo leve alguns minutos ou horas (maior latência), o que é aceitável para arquivos de auditoria ou backups antigos.&lt;/p&gt;

&lt;p&gt;Por fim, o Lifecycle resolve o acúmulo de lixo através da &lt;strong&gt;Expiração&lt;/strong&gt;. Além de mover dados, você configura regras para deletar objetos definitivamente após um período, como remover logs temporários após 7 dias. Isso garante a higiene do ambiente, impedindo que você pague aluguel (seja no shopping ou no armazém) por dados inúteis que não deveriam mais existir.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Snapshots: O Colecionador de Backups Fantasmas
&lt;/h3&gt;

&lt;p&gt;Backups são a apólice de seguro da sua infraestrutura, mas a facilidade de criar snapshots na AWS gera um comportamento perigoso de acumulação. O erro clássico é configurar uma automação de snapshot diário e definir a retenção para "nunca" ou prazos absurdos como 5 anos. Embora os snapshots sejam incrementais (salvando apenas o que mudou), em bancos de dados transacionais com muita escrita, o volume de dados alterados cresce rápido, e a fatura acompanha.&lt;br&gt;
Para visualizar o desperdício, imagine que você compra o jornal do dia para ler as notícias. É útil ter os jornais da última semana na mesa para referência rápida. Mas guardar uma pilha de jornais diários de &lt;strong&gt;três anos atrás&lt;/strong&gt; na sua sala ocupa espaço valioso e custa dinheiro, sendo que a chance de você precisar saber a "cotação do dólar numa terça-feira específica de 2021" é praticamente nula. Você está pagando armazenamento premium por "jornais velhos" que não têm valor de negócio.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Licenciamento Comercial (O Custo Invisível)
&lt;/h3&gt;

&lt;p&gt;Muitas empresas focam tanto em otimizar CPU e RAM que esquecem o elefante na sala: o custo de software. Ao rodar instâncias com &lt;strong&gt;Windows Server&lt;/strong&gt; ou &lt;strong&gt;SQL Server Enterprise&lt;/strong&gt; na AWS no modelo "License Included", você não paga apenas pela infraestrutura; você paga uma sobretaxa pesada pelo direito de uso do software proprietário. Esse custo é embutido na tarifa por hora e, em máquinas grandes, a licença pode custar mais caro que o próprio hardware.&lt;br&gt;
Para ilustrar a desproporção, usar o &lt;strong&gt;SQL Server Enterprise&lt;/strong&gt; para uma aplicação que não utiliza funcionalidades avançadas (como &lt;em&gt;Always On&lt;/em&gt; complexo ou compressão de dados específica) é como &lt;strong&gt;fretar um jato executivo apenas para ir comprar pão na padaria&lt;/strong&gt;. O objetivo (armazenar e recuperar dados) é cumprido, mas você está pagando por um veículo de luxo quando uma bicicleta ou um Uber resolveria o problema com a mesma eficiência e uma fração do custo.&lt;/p&gt;

&lt;p&gt;A primeira camada de solução é a &lt;strong&gt;Otimização de Edição&lt;/strong&gt;. É comum desenvolvedores solicitarem a versão Enterprise por "garantia" ou hábito, sem necessidade técnica real. Uma auditoria simples muitas vezes revela que a versão &lt;strong&gt;Standard&lt;/strong&gt;atende a todos os requisitos da aplicação. Fazer esse &lt;em&gt;downgrade&lt;/em&gt; reduz a fatura de licenciamento imediatamente, sem exigir mudanças drásticas na arquitetura ou no código.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Dilema Geográfico: Reduzindo a Fatura pela Metade
&lt;/h3&gt;

&lt;p&gt;Hospedar aplicações na região &lt;code&gt;sa-east-1&lt;/code&gt; (São Paulo) carrega um ágio pesado: o "Custo Brasil" digital faz com que a infraestrutura local custe, cerca de &lt;strong&gt;50% a mais&lt;/strong&gt; do que na &lt;code&gt;us-east-1&lt;/code&gt; (N. Virgínia). Migrar workloads para os EUA é, frequentemente, a manobra de FinOps com maior retorno imediato (ROI): você corta a fatura desses recursos praticamente pela &lt;strong&gt;metade&lt;/strong&gt; apenas alterando o CEP do servidor, acessando o mesmo hardware por uma fração do preço.&lt;/p&gt;

&lt;p&gt;O principal bloqueador costuma ser o medo da &lt;strong&gt;LGPD&lt;/strong&gt;, mas a crença de que a lei exige residência física dos dados no Brasil é um &lt;strong&gt;mito&lt;/strong&gt;. O Artigo 33 permite a transferência internacional para países com proteção adequada (como os EUA), desde que coberto por contratos padrão. A legislação foca na &lt;em&gt;segurança e privacidade&lt;/em&gt; do dado, não na sua latitude e longitude geográfica.&lt;/p&gt;

&lt;p&gt;Quanto à técnica, a latência para a Virgínia (~120ms) é imperceptível para a maioria das aplicações web, sistemas internos e dashboards. A estratégia inteligente é adotar uma região como &lt;strong&gt;US East como padrão&lt;/strong&gt; para maximizar a economia, reservando São Paulo apenas para exceções que realmente exigem resposta em tempo real (como High Frequency Trading), evitando pagar preço de "primeira classe" para cargas de trabalho que rodariam perfeitamente na econômica.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Serverless: A Faca de Dois Gumes
&lt;/h3&gt;

&lt;p&gt;"Serverless" é computação sem gestão de infraestrutura (como AWS Lambda ou DynamoDB). Diferente de alugar um servidor fixo mensal, aqui você paga apenas pelos milissegundos que seu código executa ou pelo dado que você lê. É como a conta de luz: você só paga se o interruptor estiver ligado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Estratégia:&lt;/strong&gt; Para uso esporádico, é imbatível. Mas e para uso constante? Também pode ser uma excelente escolha! Embora a fatura de infraestrutura possa vir mais alta do que em servidores tradicionais, você elimina o trabalho pesado de manutenção. Muitas vezes, é financeiramente mais inteligente &lt;strong&gt;pagar um pouco mais para a AWS do que custear horas de engenharia&lt;/strong&gt; ou contratar uma equipe dedicada apenas para gerenciar servidores, aplicar patches de segurança e configurar escalas. O segredo é olhar para o Custo Total (TCO), e não apenas para a linha de processamento na fatura.&lt;/p&gt;




&lt;h2&gt;
  
  
  🕵️‍♂️ FinOps: Engenharia Financeira na Prática
&lt;/h2&gt;

&lt;p&gt;FinOps não é apenas sobre "pedir desconto" ou cortar gastos; é a mudança cultural que descentraliza a responsabilidade do custo, empoderando engenheiros a tomar decisões baseadas em dados, não em palpites. Para que essa cultura saia do papel, ela precisa se apoiar em um tripé de governança robusto: a &lt;strong&gt;visibilidade granular&lt;/strong&gt; garantida pelo tageamento correto (saber &lt;em&gt;quem&lt;/em&gt; gasta), a &lt;strong&gt;segurança operacional&lt;/strong&gt; monitorada pelo AWS Budgets (saber &lt;em&gt;quando&lt;/em&gt; gasta) e a &lt;strong&gt;eficiência financeira&lt;/strong&gt; obtida através dos Modelos de Compra inteligentes (saber &lt;em&gt;como&lt;/em&gt; pagar). Sem integrar essas três frentes, a nuvem deixa de ser um acelerador de inovação para se tornar um passivo financeiro descontrolado.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. TAGs: Sem Etiquetas, Sem Dados 🏷️
&lt;/h3&gt;

&lt;p&gt;No AWS Cost Explorer, uma infraestrutura sem tags opera como uma "caixa preta" financeira: você encara uma fatura de $50.000, mas é incapaz de discernir se o rombo veio de um modelo crítico de Data Science ou de um cluster Kubernetes esquecido por um estagiário.&lt;br&gt;
Utiliza tags como &lt;code&gt;custo:centro&lt;/code&gt;, &lt;code&gt;app:nome&lt;/code&gt;, &lt;code&gt;env&lt;/code&gt; e &lt;code&gt;dono&lt;/code&gt; no momento dos recursos transformara números genéricos em rastreáveis, permitindo que cada centavo gasto tenha um responsável atrelado, eliminando definitivamente a cultura de que "o custo da nuvem não é problema meu".&lt;/p&gt;

&lt;h3&gt;
  
  
  2. AWS Budgets e Detecção de Anomalias 🚨
&lt;/h3&gt;

&lt;p&gt;Não espere o fim do mês. Configure o &lt;strong&gt;AWS Budgets&lt;/strong&gt; para alertar quando o custo &lt;em&gt;projetado&lt;/em&gt; (forecasted) ultrapassar o limite.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dica:&lt;/strong&gt; Ative o &lt;strong&gt;Cost Anomaly Detection&lt;/strong&gt;. Ele usa Machine Learning para identificar picos anormais.

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Exemplo:&lt;/em&gt; Um deploy errado fez a cahamada para um Lambda entrar em loop infinito. O Anomaly Detection te avisa em horas, não no fim do mês.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Modelos de Compra: O Fim do On-Demand 💸
&lt;/h3&gt;

&lt;p&gt;Operar 100% em &lt;strong&gt;On-Demand&lt;/strong&gt; é pagar voluntariamente um "imposto sobre a falta de planejamento". A maturidade em FinOps exige abandonar o preço de varejo e adotar um mix estratégico: cubra sua carga de trabalho base (aquela que roda 24/7) com &lt;strong&gt;Savings Plans&lt;/strong&gt;, que oferecem descontos de até &lt;strong&gt;72%&lt;/strong&gt; em troca de fidelidade, e mova cargas tolerantes a interrupções, como processamento de dados e pipelines de CI/CD, para &lt;strong&gt;Spot Instances&lt;/strong&gt;, aproveitando a capacidade ociosa da AWS por até &lt;strong&gt;10% do valor original&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ignorar essa estratégia e manter tudo no On-Demand é uma decisão consciente de desperdiçar orçamento que poderia ser reinvestido em inovação.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Dev Assina o Código e o Cheque
&lt;/h2&gt;

&lt;p&gt;No mundo On-Premise, um código ruim apenas deixava o sistema lento. Na Nuvem, &lt;strong&gt;código ineficiente gera uma fatura imediata&lt;/strong&gt;. A barreira entre Engenharia e Financeiro desapareceu: cada linha de código é uma decisão de compra executada em tempo real. O desenvolvedor não consome apenas CPU, ele consome o orçamento da empresa.&lt;/p&gt;

&lt;p&gt;Para entender o impacto, veja o preço das más práticas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;O Custo da Leitura:&lt;/strong&gt; Uma query sem "&lt;code&gt;WHERE&lt;/code&gt;" ou um &lt;em&gt;Full Table Scan&lt;/em&gt; no DynamoDB não é apenas um problema de performance; você está pagando unidades de leitura para ler milhares de linhas inúteis. É como comprar a biblioteca inteira para ler uma única página.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O Custo da Ineficiência:&lt;/strong&gt; Um código com vazamento de memória engana o &lt;strong&gt;Auto Scaling&lt;/strong&gt;. O sistema provisiona 10 servidores para fazer o trabalho de 2, desperdiçando dinheiro para compensar código ruim.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O Custo do Ruído:&lt;/strong&gt; Logs em modo &lt;code&gt;VERBOSE&lt;/code&gt; esquecidos em produção são vilões. O CloudWatch cobra caro pela ingestão. Enviar gigabytes de "log de lixo" é literalmente pagar frete aéreo para transportar entulho.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A Cultura de Engenharia Consciente de Custos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Estimativa no Refinamento:&lt;/strong&gt; O custo deve ser debatido &lt;em&gt;antes&lt;/em&gt; do código existir. Durante o Refinamento, ao definir a arquitetura, faça a pergunta: &lt;em&gt;"Quais recursos vamos usar e quanto isso vai custar com a volumetria esperada?"&lt;/em&gt;. Se a solução técnica custa $1.000 para economizar $50 de esforço manual, ela deve ser vetada ali mesmo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedback Loop:&lt;/strong&gt; O desenvolvedor precisa ver quanto o serviço dele custa. Painéis do Grafana ou Datadog devem mostrar não só a latência da API, mas o custo diário dela. Só existe responsabilidade quando existe consciência do preço.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cerimônia de Custo (FinOps Review):&lt;/strong&gt; Estabeleça uma reunião recorrente dedicada a olhar o &lt;strong&gt;"Extrato da Conta"&lt;/strong&gt;. O time analisa os custos atuais, investiga picos não planejados da semana anterior e discute ativamente: &lt;em&gt;"Existe alguma oportunidade de desligar recursos ou otimizar este serviço agora?"&lt;/em&gt;. É a higiene financeira mantendo o projeto saudável.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🌐 O Mundo Híbrido e Multicloud: Complexidade é Custo
&lt;/h2&gt;

&lt;p&gt;Nem tudo precisa ir para a AWS, e nem tudo deve sair do seu Data Center local. A maturidade em nuvem não significa "desligar tudo o que é físico", mas sim saber onde cada peça do jogo custa menos. Empresas podem operam em modelos híbridos estratégicos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;O Lugar do Legado (On-Premise):&lt;/strong&gt; Aquele banco de dados gigante ou mainframe que já está quitado, não cresce mais e roda de forma previsível? &lt;strong&gt;Deixe onde está.&lt;/strong&gt; Migrar esses monstros para a nuvem apenas copiando e colando ("Lift-and-Shift") costuma ser um desastre financeiro. Na nuvem, você paga caro por performance de disco (IOPS) e memória que, no seu servidor físico, já são "gratuitos".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O Lugar da Inovação (Nuvem):&lt;/strong&gt; Seu site, aplicativos móveis e APIs que precisam aguentar milhões de acessos num dia e zero no outro? Leve para a nuvem. Lá você paga pela &lt;strong&gt;elasticidade&lt;/strong&gt; e pelo alcance global que o servidor físico não consegue entregar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cuidado com a Armadilha Multicloud&lt;/strong&gt;&lt;br&gt;
Muitos gestores caem na tentação de usar AWS, Azure e Google Cloud ao mesmo tempo sob o pretexto de "evitar ficar preso a um fornecedor" (Vendor Lock-in). Na prática, para a maioria das empresas, isso &lt;strong&gt;triplica o custo operacional&lt;/strong&gt;. Você precisará de equipes especialistas em três plataformas diferentes, perderá descontos por volume (diluindo seu gasto) e pagará taxas altíssimas de transferência de dados (Egress) para fazer as nuvens conversarem entre si. Complexidade técnica é, invariavelmente, custo financeiro.&lt;/p&gt;

&lt;p&gt;Como gerenciar essa infraestrutura sem perder o controle? O uso de ferramentas como &lt;strong&gt;Terraform&lt;/strong&gt; ou &lt;strong&gt;OpenTofu&lt;/strong&gt;. Com elas, criar um servidor não é mais clicar em botões numa tela, mas sim escrever um arquivo de texto (código).&lt;/p&gt;

&lt;p&gt;Isso habilita a &lt;strong&gt;Revisão de Código Financeira&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Um desenvolvedor propõe uma mudança no código da infraestrutura.&lt;/li&gt;
&lt;li&gt;Antes de aprovar, o time revisa num "Pull Request".&lt;/li&gt;
&lt;li&gt;A pergunta muda de &lt;em&gt;"O código está certo?"&lt;/em&gt; para &lt;em&gt;"Por que você alterou a máquina de &lt;code&gt;micro&lt;/code&gt; para &lt;code&gt;extra-large&lt;/code&gt;?"&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O Code Review de infraestrutura torna-se a primeira e mais barata linha de defesa do FinOps, barrando gastos desnecessários antes mesmo que eles sejam criados.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão: A Nuvem não é um Destino, é um Modelo Econômico
&lt;/h2&gt;

&lt;p&gt;Migrar para a nuvem não é apenas trocar de servidor; é adotar um novo paradigma operacional e financeiro. Tratar a AWS como um "datacenter glorificado" é o caminho mais rápido para transformar a inovação em prejuízo: ao fazer isso, você acaba pagando a diária de um hotel cinco estrelas apenas para estocar caixas de papelão que poderiam estar num depósito simples.&lt;/p&gt;

&lt;p&gt;A virada de chave acontece na cultura. Comece pelo básico bem feito: aplique Tags rigorosamente, automatize a limpeza de recursos e traga o custo para o centro das decisões de arquitetura. Lembre-se que, neste novo mundo, a excelência técnica é inseparável da eficiência financeira: &lt;strong&gt;o melhor código não é apenas o que funciona, é o que entrega valor máximo consumindo o mínimo de orçamento.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cloud</category>
      <category>braziliandevs</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Java 25: tudo que mudou desde o Java 21 em um guia prático</title>
      <dc:creator>Ed Wantuil</dc:creator>
      <pubDate>Sun, 28 Sep 2025 21:58:58 +0000</pubDate>
      <link>https://dev.to/ed-wantuil/java-25-tudo-que-mudou-desde-o-java-21-em-um-guia-pratico-1b5n</link>
      <guid>https://dev.to/ed-wantuil/java-25-tudo-que-mudou-desde-o-java-21-em-um-guia-pratico-1b5n</guid>
      <description>&lt;p&gt;Setembro de 2025 está terminando e, com ele, o &lt;strong&gt;Java 25 (LTS)&lt;/strong&gt;, finalmente aquela versão “para levar pra produção sem dor de cabeça”. Confesso: eu quase não acompanho os releases não-LTS. Resultado? Um &lt;strong&gt;combo acumulado de Java 22, 23, 24 e 25&lt;/strong&gt; para digerir de uma vez só. Se você está igual, respira: este é o &lt;strong&gt;guia de sobrevivência&lt;/strong&gt; pra entender o que realmente mudou desde a última LTS (Java 21) e decidir o que vale priorizar no seu ambiente.&lt;/p&gt;

&lt;p&gt;Pra calibrar a expectativa: nesse período pintaram &lt;strong&gt;dezenas de JEPs&lt;/strong&gt;, mas só uma parte virou funcionalidade definitiva. O resto ainda está em &lt;strong&gt;preview/incubation&lt;/strong&gt; ou acabou descartado. Traduzindo: dá pra fechar esse “livro de pendências” sem precisar virar noite, aqui você encontra tudo resumido em blocos práticos.&lt;/p&gt;




&lt;h2&gt;
  
  
  O versionamento do Java
&lt;/h2&gt;

&lt;p&gt;Quando a gente olha a &lt;a href="https://javaalmanac.io/jdk/" rel="noopener noreferrer"&gt;linha do tempo do Java&lt;/a&gt;, dá pra ver as versões com suporte e até quando podemos contar com suas atualizações:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Versão&lt;/th&gt;
&lt;th&gt;Fim do suporte&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Java 25&lt;/td&gt;
&lt;td&gt;Setembro de 2030&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 21&lt;/td&gt;
&lt;td&gt;Dezembro de 2029&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 17&lt;/td&gt;
&lt;td&gt;Outubro de 2027&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 11&lt;/td&gt;
&lt;td&gt;Outubro de 2027&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 8&lt;/td&gt;
&lt;td&gt;Novembro de 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;O modelo de versionamento pode parecer meio esquisito. Por exemplo: o &lt;strong&gt;Java 22 foi aposentado no mesmo dia em que o 23 saiu da concessionária&lt;/strong&gt;. É assim mesmo: versões &lt;strong&gt;não-LTS&lt;/strong&gt; são como &lt;strong&gt;modelos especiais de carro&lt;/strong&gt;, ficam pouco tempo no mercado, servem pra testar novos recursos, mas logo dão lugar ao próximo lançamento. Se você comprou um desses, logo precisa pensar em trocar.&lt;/p&gt;

&lt;p&gt;Já as versões &lt;strong&gt;LTS (Long Term Support)&lt;/strong&gt; são os &lt;strong&gt;modelos de linha, que a montadora garante peça e manutenção por anos&lt;/strong&gt;. Na prática, isso significa receber atualizações de segurança e correções de bugs por muito mais tempo. É por isso que, em sistemas de produção, quase sempre se aposta no &lt;strong&gt;LTS&lt;/strong&gt;: é como escolher um carro popular que qualquer oficina sabe arrumar, em vez de um protótipo cheio de tecnologia nova que pode te deixar parado no acostamento. &lt;/p&gt;




&lt;h2&gt;
  
  
  As atualizações acumulativas
&lt;/h2&gt;

&lt;p&gt;Aqui vamos revisar o pacote de mudanças do &lt;strong&gt;Java 22 até o Java 25&lt;/strong&gt;, mas com um filtro importante: só entram as funcionalidades que já são &lt;strong&gt;definitivas&lt;/strong&gt;. Ou seja, vamos deixar de fora tudo que ainda está em &lt;strong&gt;preview&lt;/strong&gt; ou &lt;strong&gt;incubation&lt;/strong&gt;, porque não são recomendadas para uso em produção.&lt;/p&gt;

&lt;p&gt;Mas antes, vale um parêntese: &lt;strong&gt;o que é uma JEP?&lt;/strong&gt;&lt;br&gt;
JEP significa &lt;strong&gt;JDK Enhancement Proposal&lt;/strong&gt; (Proposta de Melhoria do JDK). É o documento oficial onde a comunidade do OpenJDK descreve e justifica uma mudança na linguagem ou na plataforma. Uma JEP pode ser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Definitiva&lt;/strong&gt; → já aprovada, implementada e pronta pra produção.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preview/Incubation&lt;/strong&gt; → disponível para testes, mas ainda sujeita a mudanças.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rejeitada ou Retirada&lt;/strong&gt; → proposta que não avançou.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neste guia, vou focar apenas nas &lt;strong&gt;JEPs definitivas&lt;/strong&gt;, porque são elas que realmente impactam quem precisa manter sistemas rodando em produção com segurança.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧹 Garbage Collectors
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Garbage Collector (GC)&lt;/strong&gt; é quem cuida da limpeza de memória na JVM. Ele identifica objetos que não têm mais uso e libera esse espaço, evitando os temidos &lt;em&gt;memory leaks&lt;/em&gt;. Entre o Java 22 e o 25, várias melhorias chegaram para &lt;strong&gt;reduzir pausas, melhorar desempenho e evoluir coletores já existentes&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 423: Fixação de Regiões para o G1&lt;/strong&gt; (Java 22)
&lt;/h4&gt;

&lt;p&gt;O &lt;strong&gt;G1&lt;/strong&gt; ganhou a capacidade de “prender” (&lt;em&gt;pin&lt;/em&gt;) regiões do heap enquanto código nativo (&lt;strong&gt;JNI&lt;/strong&gt;) está em áreas críticas. Na prática, isso permite que o GC continue trabalhando normalmente nas outras regiões sem precisar parar tudo.&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/423" rel="noopener noreferrer"&gt;Detalhes na JEP 423&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 474: ZGC - Modo geracional como padrão&lt;/strong&gt; (Java 23)
&lt;/h4&gt;

&lt;p&gt;O &lt;strong&gt;ZGC&lt;/strong&gt; agora roda em &lt;strong&gt;modo geracional por padrão&lt;/strong&gt;. O antigo modo não-geracional foi marcado como &lt;strong&gt;deprecado&lt;/strong&gt; e deve ser removido em versões futuras.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes:&lt;/strong&gt; quem usava &lt;code&gt;-XX:+UseZGC&lt;/code&gt; ativava o ZGC clássico (não-geracional).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agora:&lt;/strong&gt; o mesmo comando já ativa o &lt;strong&gt;ZGC Geracional&lt;/strong&gt;, que separa objetos novos dos de longa duração, otimizando coleta de lixo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/474" rel="noopener noreferrer"&gt;Detalhes na JEP 474&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 475: Expansão tardia das barreiras do G1&lt;/strong&gt; (Java 24)
&lt;/h4&gt;

&lt;p&gt;O &lt;strong&gt;G1&lt;/strong&gt; ganhou uma simplificação no jeito que lida com as suas barreiras (os pontos de anotação de acessos à memória). Agora, a expansão dessas barreiras no compilador &lt;strong&gt;C2&lt;/strong&gt; acontece apenas na &lt;strong&gt;fase final de emissão de código&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes:&lt;/strong&gt; o compilador expandia essas instruções mais cedo, o que aumentava custo de compilação JIT em tempo e memória.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agora:&lt;/strong&gt; com a expansão adiada, o compilador gasta menos recursos no &lt;strong&gt;startup&lt;/strong&gt; e durante o aquecimento da aplicação.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/475" rel="noopener noreferrer"&gt;Detalhes na JEP 475&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 490: ZGC: Remover o modo não-geracional&lt;/strong&gt; (Java 24)
&lt;/h4&gt;

&lt;p&gt;O &lt;strong&gt;ZGC&lt;/strong&gt; completa a transição: o modo &lt;strong&gt;não-geracional&lt;/strong&gt; foi &lt;strong&gt;removido&lt;/strong&gt; de vez.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes:&lt;/strong&gt; era possível escolher entre &lt;code&gt;-XX:+ZGenerational&lt;/code&gt; e &lt;code&gt;-XX:-ZGenerational&lt;/code&gt; para ligar ou desligar o modo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agora:&lt;/strong&gt; ao usar apenas &lt;code&gt;-XX:+UseZGC&lt;/code&gt;, você sempre roda o &lt;strong&gt;ZGC Geracional&lt;/strong&gt;. As flags antigas continuam aceitas, mas só geram aviso de obsolescência.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/490" rel="noopener noreferrer"&gt;Detalhes na JEP 490&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 521: Shenandoah geracional&lt;/strong&gt; (Java 25)
&lt;/h4&gt;

&lt;p&gt;O &lt;strong&gt;Shenandoah&lt;/strong&gt; também entrou na onda &lt;strong&gt;geracional&lt;/strong&gt;. O modo, que antes era &lt;strong&gt;experimental&lt;/strong&gt;, agora é promovido a &lt;strong&gt;recurso de produto&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes:&lt;/strong&gt; precisava usar &lt;code&gt;-XX:+UnlockExperimentalVMOptions&lt;/code&gt; para habilitar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agora:&lt;/strong&gt; pode ser ativado diretamente, sem desbloquear flags experimentais.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Importante:&lt;/strong&gt; o padrão ainda é o &lt;strong&gt;Shenandoah de uma geração&lt;/strong&gt;. Para usar o geracional, é preciso habilitar explicitamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-XX:+UseShenandoahGC -XX:ShenandoahGCMode=generational
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/521" rel="noopener noreferrer"&gt;Detalhes na JEP 521&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💻 JVM
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;JVM&lt;/strong&gt; precisa carregar, ligar e otimizar classes o mais rápido possível. Isso reduz o tempo de inicialização (&lt;em&gt;startup&lt;/em&gt;) e deixa a performance mais previsível em produção. Nos últimos releases, o foco foi acelerar esse arranque e também preparar terreno para &lt;strong&gt;otimizações antecipadas (AOT)&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 458: Executar Programas de Código-Fonte Multiarquivo&lt;/strong&gt; (Java 22)
&lt;/h4&gt;

&lt;p&gt;Agora é possível executar, diretamente com o comando &lt;code&gt;java&lt;/code&gt;, um programa que tenha &lt;strong&gt;vários arquivos &lt;code&gt;.java&lt;/code&gt;&lt;/strong&gt;, sem precisar compilar antes com &lt;code&gt;javac&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes:&lt;/strong&gt; só era possível rodar scripts de &lt;strong&gt;um único arquivo&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agora:&lt;/strong&gt; você pode organizar seu código em múltiplos arquivos e ainda assim rodar de forma imediata.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limite:&lt;/strong&gt; esse recurso &lt;strong&gt;não resolve gerenciamento de dependências externas&lt;/strong&gt;, a ideia aqui é acelerar o desenvolvimento inicial, não substituir ferramentas de build.&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/458" rel="noopener noreferrer"&gt;Detalhes na JEP 458&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 491: Sincronizar threads virtuais sem fixação&lt;/strong&gt; (Java 24)
&lt;/h4&gt;

&lt;p&gt;Essa JEP elimina quase todos os casos em que &lt;strong&gt;threads virtuais&lt;/strong&gt; ficavam “presas” (&lt;em&gt;pinning&lt;/em&gt;) ao usar &lt;code&gt;synchronized&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes:&lt;/strong&gt; ao bloquear dentro de métodos/blocos sincronizados ou em &lt;code&gt;Object.wait()&lt;/code&gt;, a &lt;strong&gt;thread virtual&lt;/strong&gt; mantinha ocupada a &lt;strong&gt;thread de plataforma&lt;/strong&gt;, limitando a escalabilidade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agora:&lt;/strong&gt; nesses cenários, a thread virtual libera a thread de plataforma para que outras possam avançar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Atenção:&lt;/strong&gt; ainda pode haver fixação ao entrar ou voltar de &lt;strong&gt;código nativo&lt;/strong&gt; (JNI/FFM).&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/491" rel="noopener noreferrer"&gt;Detalhes na JEP 491&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 483: Carregamento e Vinculação de Classes Antecipados (AOT)&lt;/strong&gt; (Java 24)
&lt;/h4&gt;

&lt;p&gt;Essa JEP introduz um &lt;strong&gt;cache AOT&lt;/strong&gt; (Ahead-of-Time) que guarda classes já lidas, analisadas, carregadas e vinculadas. Assim, em execuções seguintes, essas classes ficam “pré-prontas” logo no início.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Como funciona:&lt;/strong&gt; você roda uma &lt;strong&gt;execução de treinamento&lt;/strong&gt; para gerar o cache. Depois, a JVM reaproveita esse cache em execuções futuras.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Impacto prático:&lt;/strong&gt; o &lt;strong&gt;tempo de startup&lt;/strong&gt; melhora sensivelmente, sem precisar alterar código-fonte.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/483" rel="noopener noreferrer"&gt;Detalhes na JEP 483&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 484: API de Arquivos de Classe&lt;/strong&gt; (Java 24)
&lt;/h4&gt;

&lt;p&gt;Essa JEP traz uma &lt;strong&gt;API oficial&lt;/strong&gt; para lidar com &lt;strong&gt;arquivos de classe&lt;/strong&gt;. A ideia é permitir que ferramentas e frameworks acompanhem as mudanças no formato de &lt;strong&gt;bytecode&lt;/strong&gt; a cada release do JDK sem depender de bibliotecas externas que precisam ser atualizadas separadamente.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes:&lt;/strong&gt; cada ferramenta precisava de libs de terceiros (como ASM) para interpretar/gerar bytecode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agora:&lt;/strong&gt; a própria &lt;strong&gt;API do JDK&lt;/strong&gt; oferece suporte direto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/484" rel="noopener noreferrer"&gt;Detalhes na JEP 484&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 493: Vinculação de imagens de tempo de execução sem JMODs&lt;/strong&gt; (Java 24)
&lt;/h4&gt;

&lt;p&gt;Essa JEP permite que o &lt;code&gt;jlink&lt;/code&gt; crie &lt;strong&gt;imagens de runtime&lt;/strong&gt; sem precisar dos arquivos &lt;strong&gt;JMOD&lt;/strong&gt; do JDK.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Benefício direto:&lt;/strong&gt; reduz em cerca de &lt;strong&gt;25%&lt;/strong&gt; o tamanho da distribuição do JDK quando essa opção é habilitada na construção.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limitação:&lt;/strong&gt; essa funcionalidade é ativada &lt;strong&gt;em tempo de build do JDK&lt;/strong&gt;, então nem todos os fornecedores vão disponibilizar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/493" rel="noopener noreferrer"&gt;Detalhes na JEP 493&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 514: Ergonomia de Linha de Comando para AOT&lt;/strong&gt; (Java 25)
&lt;/h4&gt;

&lt;p&gt;Essa JEP simplifica a criação de &lt;strong&gt;caches AOT (ahead-of-time)&lt;/strong&gt;, que ajudam a reduzir o tempo de startup das aplicações Java.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Antes (Java 24):&lt;/strong&gt; era preciso seguir um fluxo em duas etapas para gerar e depois montar o cache AOT.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agora (Java 25):&lt;/strong&gt; você pode fazer tudo em uma única execução da JVM, por exemplo:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  java &lt;span class="nt"&gt;-XX&lt;/span&gt;:AOTCacheOutput&lt;span class="o"&gt;=&lt;/span&gt;meu-cache.aot MinhaApp.java
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/514" rel="noopener noreferrer"&gt;Detalhes na JEP 514&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 515: Ahead-of-Time Method Profiling&lt;/strong&gt; (Java 25)
&lt;/h4&gt;

&lt;p&gt;Essa JEP permite disponibilizar, já na inicialização da JVM, &lt;strong&gt;perfis de execução de métodos&lt;/strong&gt; coletados em uma &lt;strong&gt;execução de treinamento&lt;/strong&gt; e armazenados no &lt;strong&gt;cache AOT&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes:&lt;/strong&gt; o compilador JIT precisava observar a execução em tempo real para decidir quais métodos valiam a pena otimizar, o que aumentava o tempo de aquecimento (&lt;em&gt;warmup&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agora:&lt;/strong&gt; com os perfis já prontos no cache AOT, o JIT pode gerar código nativo desde o primeiro momento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/515" rel="noopener noreferrer"&gt;Detalhes na JEP 515&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 518: JFR: Amostragem Cooperativa&lt;/strong&gt; (Java 25)
&lt;/h4&gt;

&lt;p&gt;Essa JEP torna o &lt;strong&gt;JDK Flight Recorder (JFR)&lt;/strong&gt; mais estável e confiável ao coletar &lt;strong&gt;amostras de pilha&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes:&lt;/strong&gt; o JFR podia andar na pilha de threads a qualquer momento, o que aumentava o risco de travamentos ou leituras inconsistentes, especialmente quando usado junto a GCs concorrentes como o &lt;strong&gt;ZGC&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agora:&lt;/strong&gt; a amostragem passa a acontecer em &lt;strong&gt;safepoints&lt;/strong&gt;, reduzindo esses riscos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/518" rel="noopener noreferrer"&gt;Detalhes na JEP 518&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 519: Cabeçalhos de Objetos Compactos&lt;/strong&gt; (Java 25)
&lt;/h4&gt;

&lt;p&gt;Essa JEP promove os &lt;strong&gt;Cabeçalhos de Objetos Compactos&lt;/strong&gt; (introduzidos de forma experimental na JEP 450 / JDK 24) a &lt;strong&gt;recurso de produto&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;O que muda:&lt;/strong&gt; o tamanho do cabeçalho de cada objeto é reduzido.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Impacto prático:&lt;/strong&gt; melhora a &lt;strong&gt;densidade de implantação&lt;/strong&gt; e o &lt;strong&gt;uso de memória&lt;/strong&gt;, especialmente em aplicações que lidam com muitos objetos pequenos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limite:&lt;/strong&gt; não é o padrão; precisa ser habilitado via flag da JVM. Nenhuma API ou código da aplicação precisa ser alterado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/519" rel="noopener noreferrer"&gt;Detalhes na JEP 519&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 520: JFR: Medição de Tempo e Rastreamento de Métodos&lt;/strong&gt; (Java 25)
&lt;/h4&gt;

&lt;p&gt;Essa JEP amplia o &lt;strong&gt;JDK Flight Recorder (JFR)&lt;/strong&gt; com dois novos eventos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;jdk.MethodTiming&lt;/code&gt;&lt;/strong&gt; → mede o tempo gasto por método.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;jdk.MethodTrace&lt;/code&gt;&lt;/strong&gt; → registra a sequência de chamadas entre métodos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/520" rel="noopener noreferrer"&gt;Detalhes na JEP 520&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  📝 Linguagem
&lt;/h3&gt;

&lt;p&gt;A linguagem Java também recebeu refinamentos para tornar o código mais conciso, expressivo e moderno. Essas melhorias ajudam a reduzir a verbosidade histórica e trazem novas formas de escrever programas.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 454: API de Funções e Memória Externas (FFM)&lt;/strong&gt; (Java 22)
&lt;/h4&gt;

&lt;p&gt;Essa JEP entrega uma &lt;strong&gt;API oficial&lt;/strong&gt; para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chamar funções nativas&lt;/strong&gt; (fora da JVM).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acessar memória externa&lt;/strong&gt; com segurança.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Impacto prático: substitui em muitos cenários o frágil &lt;strong&gt;JNI&lt;/strong&gt;, simplificando a integração com bibliotecas C/C++ e o trabalho com buffers &lt;em&gt;off-heap&lt;/em&gt;. Isso melhora produtividade e desempenho em áreas como &lt;strong&gt;I/O, codecs, drivers&lt;/strong&gt; e até &lt;strong&gt;ciência de dados&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;💻 &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep454DepoisExample.java" rel="noopener noreferrer"&gt;Exemplo de código&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/454" rel="noopener noreferrer"&gt;Detalhes na JEP 454&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 456: Variáveis e Padrões Sem Nome&lt;/strong&gt; (Java 22)
&lt;/h4&gt;

&lt;p&gt;Essa JEP permite usar o sublinhado &lt;code&gt;_&lt;/code&gt; quando uma &lt;strong&gt;variável&lt;/strong&gt; ou um &lt;strong&gt;componente de padrão&lt;/strong&gt; é obrigatório pela sintaxe, mas você não vai usá-lo depois.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Onde usar:&lt;/strong&gt; em &lt;code&gt;catch&lt;/code&gt;, &lt;code&gt;switch&lt;/code&gt; com padrões, &lt;code&gt;for&lt;/code&gt; e lambdas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Objetivo:&lt;/strong&gt; reduzir “ruído” no código e deixar claro que aquela variável não tem utilidade real.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detalhe importante:&lt;/strong&gt; o &lt;code&gt;_&lt;/code&gt; passou a ser uma &lt;strong&gt;palavra-chave&lt;/strong&gt;, ou seja, não pode mais ser usado como identificador comum.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Impacto prático:&lt;/strong&gt; código mais limpo, com menos variáveis “descartáveis” fingindo que seriam usadas.&lt;/p&gt;

&lt;p&gt;💻 Exemplos: &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep456AntesExample.java" rel="noopener noreferrer"&gt;Antes da JEP 456&lt;/a&gt; | &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep456DepoisExample.java" rel="noopener noreferrer"&gt;Depois da JEP 456&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/456" rel="noopener noreferrer"&gt;Detalhes na JEP 456&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 467: Comentários de Documentação em Markdown&lt;/strong&gt; (Java 23)
&lt;/h4&gt;

&lt;p&gt;Agora o &lt;strong&gt;JavaDoc&lt;/strong&gt; aceita comentários escritos em &lt;strong&gt;Markdown&lt;/strong&gt;, além do tradicional &lt;strong&gt;HTML&lt;/strong&gt; e das &lt;strong&gt;tags &lt;code&gt;@&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes:&lt;/strong&gt; a documentação precisava ser feita em HTML + tags, o que deixava tudo mais “engessado”.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agora:&lt;/strong&gt; dá para escrever listas, títulos e links de forma mais natural com Markdown.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Impacto prático:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documentação mais legível direto no código.&lt;/li&gt;
&lt;li&gt;Menos atrito para escrever e manter comentários.&lt;/li&gt;
&lt;li&gt;Compatibilidade preservada: você pode misturar HTML, tags JavaDoc e Markdown sem problemas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💻 Exemplos: &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep467AntesExample.java" rel="noopener noreferrer"&gt;Antes da JEP 467&lt;/a&gt; | &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep467DepoisExample.java" rel="noopener noreferrer"&gt;Depois da JEP 467&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/467" rel="noopener noreferrer"&gt;Detalhes na JEP 467&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 485: Stream Gatherers&lt;/strong&gt; (Java 24)
&lt;/h4&gt;

&lt;p&gt;Essa JEP adiciona o método &lt;code&gt;Stream.gather(Gatherer)&lt;/code&gt; e a classe utilitária &lt;code&gt;Gatherers&lt;/code&gt;, permitindo criar &lt;strong&gt;operações intermediárias personalizadas&lt;/strong&gt; em &lt;em&gt;streams&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes:&lt;/strong&gt; para casos como janelas, varreduras incrementais ou deduplicação por critério, era preciso fazer “malabarismos” com &lt;code&gt;collect&lt;/code&gt; e listas temporárias.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agora:&lt;/strong&gt; dá pra implementar essas operações direto no pipeline, de forma clara e reutilizável.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Impacto prático:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pipelines de &lt;em&gt;stream&lt;/em&gt; mais legíveis e expressivos.&lt;/li&gt;
&lt;li&gt;Menos código extra e menos estruturas temporárias.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💻 Exemplos: &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep485AntesExample.java" rel="noopener noreferrer"&gt;Antes da JEP 485&lt;/a&gt; | &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep485DepoisExample.java" rel="noopener noreferrer"&gt;Depois da JEP 485&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/485" rel="noopener noreferrer"&gt;Detalhes na JEP 485&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 506: Valores de Escopo&lt;/strong&gt; (Java 25)
&lt;/h4&gt;

&lt;p&gt;Essa JEP introduz os &lt;strong&gt;valores de escopo&lt;/strong&gt;, uma forma mais simples e segura de compartilhar &lt;strong&gt;dados imutáveis&lt;/strong&gt; dentro da mesma thread e também com &lt;strong&gt;threads filhas&lt;/strong&gt; (incluindo &lt;strong&gt;threads virtuais&lt;/strong&gt;).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes:&lt;/strong&gt; o recurso típico era o &lt;code&gt;ThreadLocal&lt;/code&gt;, mas ele é difícil de raciocinar, tem custo maior e pode causar vazamentos de memória se não for bem gerenciado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agora:&lt;/strong&gt; os valores de escopo oferecem uma alternativa &lt;strong&gt;mais clara e leve&lt;/strong&gt;, funcionando muito bem em conjunto com &lt;strong&gt;concorrência estruturada&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Impacto prático:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Código mais fácil de entender e manter.&lt;/li&gt;
&lt;li&gt;Menor custo para compartilhar dados entre chamadas e threads relacionadas.&lt;/li&gt;
&lt;li&gt;Evita armadilhas comuns do &lt;code&gt;ThreadLocal&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💻 Exemplos: &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep506AntesExample.java" rel="noopener noreferrer"&gt;Antes da JEP 506&lt;/a&gt; | &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep506DepoisExample.java" rel="noopener noreferrer"&gt;Depois da JEP 506&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/506" rel="noopener noreferrer"&gt;Detalhes na JEP 506&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;JEP 511: Declarações de Importação de Módulo&lt;/strong&gt; (Java 25)
&lt;/h3&gt;

&lt;p&gt;Essa JEP permite importar, em &lt;strong&gt;uma única linha&lt;/strong&gt;, &lt;strong&gt;todas as classes públicas&lt;/strong&gt; dos pacotes exportados por um módulo, usando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import module &amp;lt;nome&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes:&lt;/strong&gt; era necessário listar uma sequência longa de &lt;code&gt;import&lt;/code&gt;, pacote por pacote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agora:&lt;/strong&gt; basta importar o módulo inteiro, incluindo exportações transitivas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Impacto prático:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Código mais limpo, sem listas enormes de imports.&lt;/li&gt;
&lt;li&gt;Facilita o uso de &lt;strong&gt;APIs modulares&lt;/strong&gt;, mesmo quando seu código não está dentro de um módulo, o &lt;code&gt;import module&lt;/code&gt;funciona também em projetos não modularizados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💻 Exemplos: &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep511AntesExample.java" rel="noopener noreferrer"&gt;Antes da JEP 511&lt;/a&gt; | &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep511DepoisExample.java" rel="noopener noreferrer"&gt;Depois da JEP 511&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/511" rel="noopener noreferrer"&gt;Detalhes na JEP 511&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 512: Arquivos de Fonte Compactos e &lt;code&gt;main&lt;/code&gt; de Instância&lt;/strong&gt; (Java 25)
&lt;/h4&gt;

&lt;p&gt;Essa JEP é uma das que mais simplificam o &lt;strong&gt;“Hello, World” em Java&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes:&lt;/strong&gt; precisava declarar classe, método &lt;code&gt;main&lt;/code&gt; estático, receber &lt;code&gt;String[] args&lt;/code&gt; e importar explicitamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agora:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;O &lt;code&gt;main&lt;/code&gt; pode ser &lt;strong&gt;de instância&lt;/strong&gt; (sem &lt;code&gt;static&lt;/code&gt; e sem &lt;code&gt;String[] args&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Você pode usar &lt;strong&gt;arquivos de fonte compactos&lt;/strong&gt;, sem declarar a classe explicitamente.&lt;/li&gt;
&lt;li&gt;Há a classe utilitária &lt;code&gt;java.lang.IO&lt;/code&gt; para &lt;strong&gt;E/S simples&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Os &lt;strong&gt;imports básicos do &lt;code&gt;java.base&lt;/code&gt;&lt;/strong&gt; vêm automáticos.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Impacto prático:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Muito menos cerimônia para escrever scripts e exemplos didáticos.&lt;/li&gt;
&lt;li&gt;Ideal para ensino e prototipagem, sem criar um dialeto separado da linguagem: é &lt;strong&gt;Java de verdade&lt;/strong&gt;, só que mais enxuto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💻 Exemplos: &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep512AntesExample.java" rel="noopener noreferrer"&gt;Antes da JEP 512&lt;/a&gt; | &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep512DepoisExample.java" rel="noopener noreferrer"&gt;Depois da JEP 512&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/512" rel="noopener noreferrer"&gt;Detalhes na JEP 512&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 513: Corpos de Construtores Flexíveis&lt;/strong&gt; (Java 25)
&lt;/h4&gt;

&lt;p&gt;Essa JEP permite escrever &lt;strong&gt;instruções antes&lt;/strong&gt; de chamar &lt;code&gt;super(...)&lt;/code&gt; ou &lt;code&gt;this(...)&lt;/code&gt; dentro de um construtor.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes:&lt;/strong&gt; qualquer lógica tinha que vir &lt;strong&gt;depois&lt;/strong&gt; da chamada ao &lt;code&gt;super(...)&lt;/code&gt; ou &lt;code&gt;this(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agora:&lt;/strong&gt; você pode incluir um &lt;strong&gt;prólogo&lt;/strong&gt; no construtor, útil para:

&lt;ul&gt;
&lt;li&gt;validar argumentos,&lt;/li&gt;
&lt;li&gt;calcular variáveis locais,&lt;/li&gt;
&lt;li&gt;inicializar campos ainda não atribuídos.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Regras importantes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No prólogo não é permitido usar &lt;code&gt;this&lt;/code&gt; (não pode acessar campos nem chamar métodos de instância).&lt;/li&gt;
&lt;li&gt;Também não dá pra chamar &lt;code&gt;super&lt;/code&gt;, exceto para atribuir a campos declarados sem inicializador.&lt;/li&gt;
&lt;li&gt;O restante da lógica continua no &lt;strong&gt;epílogo&lt;/strong&gt; (após a chamada a &lt;code&gt;super&lt;/code&gt; ou &lt;code&gt;this&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💻 Exemplos: &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep513AntesExample.java" rel="noopener noreferrer"&gt;Antes da JEP 513&lt;/a&gt; | &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep513DepoisExample.java" rel="noopener noreferrer"&gt;Depois da JEP 513&lt;/a&gt;    &lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/513" rel="noopener noreferrer"&gt;Detalhes na JEP 513&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🔒 Segurança e Criptografia
&lt;/h3&gt;

&lt;p&gt;Segurança continua sendo prioridade no JDK: desde remover mecanismos antigos até incluir algoritmos preparados para resistir até mesmo a ataques de computadores quânticos.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 496: Mecanismo de Encapsulamento de Chaves baseado em reticulados modulares (ML-KEM) resistente a ataques quânticos&lt;/strong&gt; (Java 24)
&lt;/h4&gt;

&lt;p&gt;Essa JEP adiciona suporte ao &lt;strong&gt;ML-KEM&lt;/strong&gt; (lattice-based, padronizado no &lt;strong&gt;FIPS 203&lt;/strong&gt;) na API de &lt;strong&gt;KEM (Key Encapsulation Mechanism)&lt;/strong&gt; do Java.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;O que traz:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Implementação do &lt;strong&gt;ML-KEM&lt;/strong&gt; com parâmetros 512, 768 e 1024 (padrão: 768).&lt;/li&gt;
&lt;li&gt;Permite negociar chaves simétricas de forma resistente a ataques quânticos.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Impacto prático:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Alternativa futura a &lt;strong&gt;ECDH&lt;/strong&gt; ou &lt;strong&gt;RSA&lt;/strong&gt; em cenários de troca de chaves.&lt;/li&gt;
&lt;li&gt;Ainda &lt;strong&gt;não há integração direta com TLS&lt;/strong&gt;, pois isso depende da padronização externa.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resultado:&lt;/strong&gt; aplicações podem começar a experimentar algoritmos pós-quânticos sem depender de libs externas, preparando terreno para um futuro mais seguro.&lt;/p&gt;

&lt;p&gt;💻 Exemplos: &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep496AntesExample.java" rel="noopener noreferrer"&gt;Antes da JEP 496&lt;/a&gt; | &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep496DepoisExample.java" rel="noopener noreferrer"&gt;Depois da JEP 496&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/496" rel="noopener noreferrer"&gt;Detalhes na JEP 496&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 497: Algoritmo de Assinatura Digital baseado em Reticulados Modulares (ML-DSA) resistente a ataques quânticos&lt;/strong&gt; (Java 24)
&lt;/h4&gt;

&lt;p&gt;Essa JEP implementa o &lt;strong&gt;ML-DSA&lt;/strong&gt; (FIPS 204), um algoritmo de assinatura digital resistente a ataques de computadores quânticos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;APIs suportadas:&lt;/strong&gt; &lt;code&gt;KeyPairGenerator&lt;/code&gt;, &lt;code&gt;Signature&lt;/code&gt; e &lt;code&gt;KeyFactory&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parâmetros disponíveis:&lt;/strong&gt; &lt;strong&gt;ML-DSA-44&lt;/strong&gt;, &lt;strong&gt;65&lt;/strong&gt; (padrão) e &lt;strong&gt;87&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Impacto prático:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Permite &lt;strong&gt;assinar e verificar dados&lt;/strong&gt; de forma segura mesmo em cenários futuros de computação quântica.&lt;/li&gt;
&lt;li&gt;Coloca o Java na vanguarda de algoritmos pós-quânticos já padronizados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitações atuais:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ainda &lt;strong&gt;não há integração com JAR signing ou TLS&lt;/strong&gt;, isso depende da evolução dos padrões externos.&lt;/li&gt;
&lt;li&gt;Também não há suporte a &lt;em&gt;pre-hash&lt;/em&gt; ou &lt;em&gt;context strings&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💻 Exemplos: &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep497AntesExample.java" rel="noopener noreferrer"&gt;Antes da JEP 497&lt;/a&gt; | &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep497DepoisExample.java" rel="noopener noreferrer"&gt;Depois da JEP 497&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/497" rel="noopener noreferrer"&gt;Detalhes na JEP 497&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 510: API de Funções de Derivação de Chaves&lt;/strong&gt; (Java 25)
&lt;/h4&gt;

&lt;p&gt;Essa JEP fornece uma API padrão (&lt;code&gt;javax.crypto.KDF&lt;/code&gt;) para &lt;strong&gt;derivar chaves criptográficas&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;O que traz:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Suporte oficial a KDFs (ex.: &lt;strong&gt;HKDF&lt;/strong&gt;) direto no JDK.&lt;/li&gt;
&lt;li&gt;Uso unificado em vez de depender de bibliotecas externas ou implementações caseiras.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Impacto prático:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Facilita cenários como &lt;strong&gt;TLS&lt;/strong&gt;, &lt;strong&gt;HPKE&lt;/strong&gt; e integrações com &lt;strong&gt;HSM/PKCS#11&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Reduz código duplicado e riscos de segurança de soluções ad-hoc.&lt;/li&gt;
&lt;li&gt;O &lt;strong&gt;PBKDF2&lt;/strong&gt; continua disponível via &lt;code&gt;SecretKeyFactory&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;💻 Exemplos: &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep510AntesExample.java" rel="noopener noreferrer"&gt;Antes da JEP 510&lt;/a&gt; | &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/blob/main/src/main/java/com/wantuil/jep/Jep510DepoisExample.java" rel="noopener noreferrer"&gt;Depois da JEP 510&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/510" rel="noopener noreferrer"&gt;Detalhes na JEP 510&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🗑️ Remoções e Depreciações
&lt;/h3&gt;

&lt;p&gt;Parte da evolução do Java é também &lt;strong&gt;remover legados inseguros ou pouco usados&lt;/strong&gt;, simplificando a base da JVM e incentivando o uso das APIs modernas.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 471: Deprecar métodos de acesso à memória em &lt;code&gt;sun.misc.Unsafe&lt;/code&gt; para remoção&lt;/strong&gt; (Java 23)
&lt;/h4&gt;

&lt;p&gt;Essa JEP marca como &lt;strong&gt;deprecados para remoção&lt;/strong&gt; &lt;strong&gt;79 métodos de acesso à memória&lt;/strong&gt; da classe interna &lt;code&gt;sun.misc.Unsafe&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Motivo:&lt;/strong&gt; preparar o ecossistema para migrar de uma API interna e frágil para alternativas oficiais e seguras.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Substitutos recomendados:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VarHandle&lt;/strong&gt; para acesso em memória &lt;em&gt;on-heap&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API de Funções e Memória (FFM)&lt;/strong&gt; para acesso &lt;em&gt;off-heap&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Impacto prático:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bibliotecas e frameworks que ainda usam &lt;code&gt;Unsafe&lt;/code&gt; precisam migrar gradualmente para APIs suportadas.&lt;/li&gt;
&lt;li&gt;A JVM introduz a opção &lt;code&gt;--sun-misc-unsafe-memory-access={allow|warn|debug|deny}&lt;/code&gt; para ajudar a detectar esses usos em tempo de execução.&lt;/li&gt;
&lt;li&gt;Em fases futuras, os métodos vão gerar avisos, exceções e, por fim, serão &lt;strong&gt;removidos&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/471" rel="noopener noreferrer"&gt;Detalhes na JEP 471&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  *&lt;em&gt;JEP 472: Preparação para Restringir o Uso de JNI *&lt;/em&gt; (Java 24)
&lt;/h4&gt;

&lt;p&gt;Essa JEP começa a apertar o cerco ao uso do &lt;strong&gt;JNI&lt;/strong&gt; (Java Native Interface).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;O que muda agora:&lt;/strong&gt; a JVM passa a &lt;strong&gt;emitir avisos&lt;/strong&gt; sempre que código carrega ou vincula bibliotecas nativas via JNI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alinhamento:&lt;/strong&gt; o comportamento de avisos segue o mesmo padrão já adotado pela &lt;strong&gt;API de Funções e Memória (FFM)&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Impacto prático:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Promove o conceito de &lt;strong&gt;“integridade por padrão”&lt;/strong&gt;, incentivando devs a repensarem usos de JNI.&lt;/li&gt;
&lt;li&gt;Prepara o caminho para uma mudança maior: em versões futuras, o acesso nativo deve ser &lt;strong&gt;restringido por padrão&lt;/strong&gt;, exigindo habilitação explícita na inicialização da JVM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/472" rel="noopener noreferrer"&gt;Detalhes na JEP 472&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 479: Remover a porta Windows 32-bit x86&lt;/strong&gt; (Java 24)
&lt;/h4&gt;

&lt;p&gt;Essa JEP removeu do JDK &lt;strong&gt;todo o código e suporte de build&lt;/strong&gt; para Windows 32-bit x86.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Motivo:&lt;/strong&gt; essa arquitetura está em desuso, e manter o suporte gerava complexidade extra na base de código e na infraestrutura de build/testes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benefício:&lt;/strong&gt; manutenção simplificada, menos código legado e foco em plataformas modernas (x64 e ARM).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Impacto prático:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quem ainda depende de Windows 32-bit precisa permanecer em versões antigas do JDK ou migrar para 64-bit.&lt;/li&gt;
&lt;li&gt;O time do OpenJDK concentra esforços em arquiteturas atuais, reduzindo risco de bugs em áreas pouco usadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/479" rel="noopener noreferrer"&gt;Detalhes na JEP 479&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 486: Desativar Permanentemente o Security Manager&lt;/strong&gt; (Java 24)
&lt;/h4&gt;

&lt;p&gt;Essa JEP remove de vez a possibilidade de habilitar o &lt;strong&gt;Security Manager&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;O que muda:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;A flag &lt;code&gt;-Djava.security.manager&lt;/code&gt; na inicialização não tem mais efeito.&lt;/li&gt;
&lt;li&gt;A chamada &lt;code&gt;System.setSecurityManager(...)&lt;/code&gt; agora lança &lt;code&gt;UnsupportedOperationException&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Motivação:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;O recurso tinha &lt;strong&gt;baixo uso&lt;/strong&gt; real.&lt;/li&gt;
&lt;li&gt;Custava caro manter e evoluir, já que criava restrições profundas dentro da JVM.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Impacto prático:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quem ainda tem dependências, flags de build ou parâmetros de runtime ligados ao Security Manager precisa &lt;strong&gt;remover ou atualizar&lt;/strong&gt; essas referências.&lt;/li&gt;
&lt;li&gt;A API restante deve ser &lt;strong&gt;removida em futuras versões&lt;/strong&gt; do JDK.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/486" rel="noopener noreferrer"&gt;Detalhes na JEP 486&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JEP 498: Aviso ao usar métodos de acesso à memória em &lt;code&gt;sun.misc.Unsafe&lt;/code&gt;&lt;/strong&gt; (Java 24)&lt;/p&gt;

&lt;p&gt;Essa JEP dá mais um passo na transição para longe do &lt;code&gt;sun.misc.Unsafe&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;O que muda:&lt;/strong&gt; na &lt;strong&gt;primeira chamada&lt;/strong&gt; a métodos de &lt;strong&gt;acesso à memória&lt;/strong&gt; em &lt;code&gt;Unsafe&lt;/code&gt;, a JVM agora emite um &lt;strong&gt;aviso em tempo de execução&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Opção de controle:&lt;/strong&gt; a flag&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  --sun-misc-unsafe-memory-access={allow|warn|debug|deny}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;define o comportamento (no JDK 24, o padrão é &lt;code&gt;warn&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impacto prático:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Facilita detectar usos de &lt;code&gt;Unsafe&lt;/code&gt; durante a execução.&lt;/li&gt;
&lt;li&gt;Prepara o ecossistema para a futura &lt;strong&gt;remoção definitiva&lt;/strong&gt; desses métodos.&lt;/li&gt;
&lt;li&gt;Alternativas modernas já disponíveis:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VarHandle&lt;/strong&gt; para acesso &lt;em&gt;on-heap&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API de Funções e Memória (FFM)&lt;/strong&gt; para acesso &lt;em&gt;off-heap&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/498" rel="noopener noreferrer"&gt;Detalhes na JEP 498&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;JEP 501: Deprecar a porta x86 32-bit para remoção&lt;/strong&gt; (Java 24)
&lt;/h4&gt;

&lt;p&gt;Essa JEP marca a &lt;strong&gt;porta x86 32-bit&lt;/strong&gt; (ainda existente no Linux, já removida no Windows) como &lt;strong&gt;depreciada para remoção&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;O que muda:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Builds que tentarem habilitar essa porta exibem um &lt;strong&gt;aviso de depreciação&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Só é possível prosseguir se usar a flag:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;--enable-deprecated-ports=yes
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Motivação:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduzir o custo de manutenção.&lt;/li&gt;
&lt;li&gt;Focar os esforços em arquiteturas modernas (x64 e ARM).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Impacto prático:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Projetos que ainda dependem de &lt;strong&gt;Linux 32-bit&lt;/strong&gt; devem planejar a migração para 64-bit.&lt;/li&gt;
&lt;li&gt;A remoção definitiva está no horizonte, então esse é o último aviso antes da saída completa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/501" rel="noopener noreferrer"&gt;Detalhes na JEP 501&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;JEP 503: Remover a porta x86 32-bit&lt;/strong&gt; (Java 25)
&lt;/h3&gt;

&lt;p&gt;Essa JEP remove do JDK &lt;strong&gt;todo o código e suporte de build&lt;/strong&gt; para a porta &lt;strong&gt;x86 32-bit&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Contexto:&lt;/strong&gt; no &lt;strong&gt;Java 24&lt;/strong&gt;, a &lt;strong&gt;JEP 501&lt;/strong&gt; já havia marcado a porta como deprecada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agora:&lt;/strong&gt; a remoção é definitiva, não há mais suporte nem para builds experimentais.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Impacto prático:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simplificação da base de código e da infraestrutura de build/testes.&lt;/li&gt;
&lt;li&gt;Desbloqueio de recursos que não precisam mais manter &lt;em&gt;fallback&lt;/em&gt; para 32-bit.&lt;/li&gt;
&lt;li&gt;Quem ainda depende de ambientes 32-bit precisa permanecer em versões antigas do JDK ou migrar para 64-bit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📖 &lt;a href="https://openjdk.org/jeps/503" rel="noopener noreferrer"&gt;Detalhes na JEP 503&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Fechando o pacote: do Java 21 ao 25
&lt;/h2&gt;

&lt;p&gt;O Java 25 marca a chegada de uma nova &lt;strong&gt;versão LTS&lt;/strong&gt;, quase dois anos depois do Java 21. Nesse período, muita coisa mudou: o GC ficou mais eficiente, a JVM ganhou recursos para inicializar mais rápido, a linguagem ficou mais expressiva e a segurança já está preparada para desafios futuros.&lt;/p&gt;

&lt;p&gt;👉 Por que atualizar é importante?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Estabilidade:&lt;/strong&gt; o Java 25 vai receber suporte até 2030, é nele que a comunidade e fornecedores vão concentrar seus esforços.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance:&lt;/strong&gt; várias melhorias trazem ganhos diretos sem precisar reescrever sua aplicação.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Segurança:&lt;/strong&gt; algoritmos modernos e pós-quânticos já fazem parte do JDK, reduzindo riscos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manutenção:&lt;/strong&gt; quanto antes você atualizar, menor o salto acumulado na próxima migração.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No fim, atualizar não é só “ficar na moda”: é &lt;strong&gt;garantir suporte, segurança e eficiência&lt;/strong&gt; pro seu sistema.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Quer ver tudo isso funcionando na prática?
&lt;/h4&gt;

&lt;p&gt;Montei um &lt;a href="https://github.com/ed-wantuil/java-22-25-playground/tree/main" rel="noopener noreferrer"&gt;playground&lt;/a&gt; com exemplos &lt;strong&gt;antes e depois&lt;/strong&gt; de cada JEP relevante, do Java 22 ao 25. É só clonar e brincar com os códigos.&lt;/p&gt;

</description>
      <category>java</category>
      <category>braziliandevs</category>
      <category>java25</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Seu Sistema Está Pronto pro Pico ou Vai Abandonar o Usuário Quando Mais Precisar?</title>
      <dc:creator>Ed Wantuil</dc:creator>
      <pubDate>Sun, 21 Sep 2025 12:40:35 +0000</pubDate>
      <link>https://dev.to/ed-wantuil/seu-sistema-esta-pronto-pro-pico-ou-vai-abandonar-o-usuario-quando-mais-precisar-4ogb</link>
      <guid>https://dev.to/ed-wantuil/seu-sistema-esta-pronto-pro-pico-ou-vai-abandonar-o-usuario-quando-mais-precisar-4ogb</guid>
      <description>&lt;p&gt;Quando grandes pontes são construídas, engenheiros não economizam em testes. Primeiro, simulam cargas extremas em projetos digitais e maquetes. Depois, com a estrutura pronta, realizam testes reais com caminhões pesados e sensores espalhados por toda a obra. &lt;br&gt;
Tudo isso não é só pra garantir que a ponte fique de pé, é pra ela aguentar o pior congestionamento possível.&lt;br&gt;
 Agora pense: aviões, elevadores, pneus… Quase tudo que usamos no dia a dia passa por testes rigorosos.  Então por que, no desenvolvimento de software, tanta gente ainda confia cegamente que “vai dar tudo certo”?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Spoiler: Não vai. E a realidade cobra, e cobra rápido.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  🔥 Quando Tudo Vai Pro Espaço (Mesmo em Grandes Empresas)
&lt;/h3&gt;

&lt;p&gt;Recentemente, na liberação da pré-venda do Nintendo Switch 2, até sites gigantes tombaram, incapazes de lidar com a avalanche de acessos. E isso não é um caso isolado. Lembra da venda de ingressos do último show que você tentou comprar?&lt;br&gt;
 O problema costuma nascer de um otimismo quase infantil: a crença de que recursos computacionais são infinitos ou de que “problemas de capacidade” são coisa do passado.&lt;br&gt;
 Outros ainda jogam a batata quente exclusivamente pra equipe de infraestrutura, ignorando o fato de que garantir escalabilidade e resiliência é responsabilidade de todo o time, devs, QA, arquitetura, produto e afins.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧪 Planejar, Testar e Validar: O Tríplice Mandamento da Estabilidade
&lt;/h3&gt;

&lt;p&gt;Se você é da área de tecnologia, precisa encarar a realidade: planejar, testar e validar suas aplicações para os momentos de estresse é tão essencial quanto testar uma ponte antes de inaugurá-la.&lt;br&gt;
 Não deixe sua entrega ruir exatamente quando ela mais for necessária. &lt;br&gt;
É aí que entram os testes de carga.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧱 O Que São Testes de Carga?
&lt;/h3&gt;

&lt;p&gt;Testes de carga simulam o comportamento de vários usuários acessando sua aplicação ao mesmo tempo, como se você pudesse provocar, de forma controlada, o pior congestionamento possível na sua "ponte digital".&lt;br&gt;
Esses testes são essenciais para identificar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gargalos de performance;&lt;/li&gt;
&lt;li&gt;Pontos frágeis na arquitetura;&lt;/li&gt;
&lt;li&gt;Limites de capacidade operacional.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sem eles, você está lançando seu sistema às cegas, apostando que ele vai aguentar qualquer volume de acessos e apostar não é estratégia.&lt;br&gt;
Investir em testes de carga é investir em confiança, estabilidade e, no fim das contas, na experiência do usuário, aquele que não vai te perdoar se o app falhar justamente quando ele mais precisar.&lt;/p&gt;


&lt;h3&gt;
  
  
  📏 Antes de Testar: Faça a Estimativa Certa
&lt;/h3&gt;

&lt;p&gt;Mas atenção: antes de testar, é essencial estimar corretamente o volume de acesso que você quer simular.&lt;br&gt;
Esse processo começa com a análise de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Picos históricos de uso da aplicação;&lt;/li&gt;
&lt;li&gt;Projeções para eventos especiais (grandes lançamentos, campanhas de marketing, repercussões inesperadas).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E vai além: você também precisa considerar cenários de falha de infraestrutura, seja no seu data center ou na nuvem.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;☁️ Cloud não é invencível: zonas podem cair, regiões inteiras podem ficar indisponíveis por horas.  Sua aplicação precisa estar preparada para redistribuir a carga e continuar operando.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  🧠 Exemplo Prático: Planejando a Carga
&lt;/h3&gt;

&lt;p&gt;Imagine que seu site, em um dia comum, sustenta 2 mil usuários simultâneos no pico. &lt;br&gt;
Agora, considere um evento especial (tipo Black Friday ou lançamento viral) que pode multiplicar esse número por 5. &lt;br&gt;
Além disso, pense na hipótese de uma falha em uma zona da nuvem, que forçaria sua aplicação a redistribuir a carga em apenas metade da infraestrutura disponível.&lt;br&gt;
Nesse cenário, o teste de carga precisa simular:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;10 mil usuários simultâneos, rodando em 50% da sua estrutura atual.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  🛠️ Ferramentas Para Testes de Carga
&lt;/h3&gt;

&lt;p&gt;Hoje, existem várias ferramentas, gratuitas e corporativas, que ajudam a simular acessos simultâneos, medir performance e identificar pontos críticos. &lt;br&gt;
Entre as mais conhecidas estão:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apache JMeter&lt;/li&gt;
&lt;li&gt;K6&lt;/li&gt;
&lt;li&gt;Locust&lt;/li&gt;
&lt;li&gt;Artillery&lt;/li&gt;
&lt;li&gt;Gatling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos focar aqui no K6, que é leve, simples e bem poderosa.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧪 Criando um Endpoint para Teste com Node.js
&lt;/h3&gt;

&lt;p&gt;Para testar com K6, primeiro vamos subir um serviço local simples com Node.js que sempre retorna um status 200.&lt;br&gt;
Crie o arquivo server.js com o seguinte conteúdo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;const http &lt;span class="o"&gt;=&lt;/span&gt; require&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'http'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

const server &lt;span class="o"&gt;=&lt;/span&gt; http.createServer&lt;span class="o"&gt;((&lt;/span&gt;req, res&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  res.writeHead&lt;span class="o"&gt;(&lt;/span&gt;200, &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type'&lt;/span&gt;: &lt;span class="s1"&gt;'text/plain'&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  res.end&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'OK'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

const port &lt;span class="o"&gt;=&lt;/span&gt; 3000&lt;span class="p"&gt;;&lt;/span&gt;
server.listen&lt;span class="o"&gt;(&lt;/span&gt;port, &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;Server running at http://localhost:&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora temos um endpoint local na porta 3000 (ou a que for exibida no terminal).&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚙️ Instalando o K6
&lt;/h3&gt;

&lt;p&gt;Para utilizar o k6 devemos fazer a instalação da seguinte forma.&lt;/p&gt;

&lt;p&gt;Linux (Ubuntu):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;gnupg ca-certificates
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-m0755&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/apt/keyrings
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://dl.k6.io/key.gpg | &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /etc/apt/keyrings/k6-archive-keyring.gpg
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [signed-by=/etc/apt/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/k6.list
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;k6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mac:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;k6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Windows (com Chocolatey):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;choco &lt;span class="nb"&gt;install &lt;/span&gt;k6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;🚀 Primeiro Teste de Carga com 50 Usuários&lt;br&gt;
Crie o arquivo load-test.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;import http from &lt;span class="s1"&gt;'k6/http'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
import &lt;span class="o"&gt;{&lt;/span&gt; check &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s1"&gt;'k6'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

&lt;span class="nb"&gt;export &lt;/span&gt;const options &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    vus: 50,
    duration: &lt;span class="s1"&gt;'30s'&lt;/span&gt;,
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;export &lt;/span&gt;default &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    const res &lt;span class="o"&gt;=&lt;/span&gt; http.get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'http://localhost:3000'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    check&lt;span class="o"&gt;(&lt;/span&gt;res, &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;'status é 200'&lt;/span&gt;: &lt;span class="o"&gt;(&lt;/span&gt;r&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; r.status &lt;span class="o"&gt;===&lt;/span&gt; 200 &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse script simula 50 usuários virtuais (VUs) acessando o endpoint &lt;code&gt;http://localhost:3000&lt;/code&gt; durante 30 segundos.  Cada VU faz requisições continuamente, e a função check valida se a resposta tem o código de status 200.&lt;br&gt;
Execute-o com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k6 run teste.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  📊 Interpretando os Resultados do K6
&lt;/h3&gt;

&lt;p&gt;Ao executar devemos ter o retorno algo como print abaixo: &lt;br&gt;
￼&lt;br&gt;
&lt;a href="https://media2.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%2Fm3jhrze6ks8h5bofqkir.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fm3jhrze6ks8h5bofqkir.png" alt=" " width="700" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; Nele podemos encontrar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;checks_total / succeeded / failed:  Verifica a quantidade total de verificações (check) feitas, quantas passaram e quantas falharam.  ✅ Neste caso: 1.675.407 verificações com 100% de sucesso. &lt;/li&gt;
&lt;li&gt;
&lt;p&gt; http_req_duration:  Tempo total de duração das requisições HTTP (da saída até a resposta).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;avg: média geral (850.51μs, excelente).&lt;/li&gt;
&lt;li&gt;med: mediana (618μs).&lt;/li&gt;
&lt;li&gt;max: tempo máximo (90.91ms).&lt;/li&gt;
&lt;li&gt;p(90) e p(95): percentis (ex: 95% das requisições levaram até 1.89ms).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;http_req_failed:  Percentual de falhas nas requisições.  ✅ Aqui: 0.00%, nenhuma falha. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;iteration_duration:  Duração de cada iteração completa (requisição + lógica de script).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vus / vus_max:  Quantidade de usuários virtuais ativos (aqui foram fixos em 50). &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;data_received / data_sent:  Volume de dados trafegados durante o teste (283MB recebidos, 139MB enviados). &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;http_reqs:  Total de requisições realizadas: 1.675.407 &amp;gt; Taxa: ~55.843 requisições/segundo.  ✅ O resultado mostra que o endpoint respondeu rapidamente, sem erros, mesmo sob alta taxa de requisições simultâneas.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  📈 Rampas de Carga: Porque Nem Todo Pico Vem de Uma Vez
&lt;/h3&gt;

&lt;p&gt;Em muitos cenários, não basta testar se a aplicação suporta uma determinada carga de forma imediata. Para entender de fato o comportamento do sistema sob diferentes níveis de pressão, é fundamental aplicar rampas de carga nos testes. &lt;br&gt;
Esse tipo de abordagem permite observar como a aplicação responde à medida que o número de usuários cresce gradualmente, além de ser essencial para avaliar a eficácia da elasticidade (escalabilidade automática) e identificar possíveis gargalos ao longo da curva de crescimento.&lt;br&gt;
 Vamos criar um novo código baseado no exemplo anterior que iremos incluir uma rampa de carga. Nesse novo teste, vamos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simular 50 usuários virtuais nos primeiros 30 segundos;&lt;/li&gt;
&lt;li&gt;Aumentar para 100 usuários nos 30 segundos seguintes;&lt;/li&gt;
&lt;li&gt;Manter os 100 usuários por mais 30 segundos;&lt;/li&gt;
&lt;li&gt;E por fim, reduzir a carga de forma gradual até zero ao longo de 30 segundos. Em testes reais, o ideal é que esses tempos sejam maiores e ajustados à realidade do seu sistema, refletindo picos esperados de uso com maior fidelidade.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo com Rampa de Carga&lt;br&gt;
Crie o ramp-load-test.js com o seguinte conteúdo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;import http from &lt;span class="s1"&gt;'k6/http'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
import &lt;span class="o"&gt;{&lt;/span&gt; check &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s1"&gt;'k6'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;export &lt;/span&gt;const options &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    stages: &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="o"&gt;{&lt;/span&gt; duration: &lt;span class="s1"&gt;'30s'&lt;/span&gt;, target: 50 &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="o"&gt;{&lt;/span&gt; duration: &lt;span class="s1"&gt;'30s'&lt;/span&gt;, target: 100 &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="o"&gt;{&lt;/span&gt; duration: &lt;span class="s1"&gt;'30s'&lt;/span&gt;, target: 100 &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="o"&gt;{&lt;/span&gt; duration: &lt;span class="s1"&gt;'30s'&lt;/span&gt;, target: 0 &lt;span class="o"&gt;}&lt;/span&gt;,
    &lt;span class="o"&gt;]&lt;/span&gt;,
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;export &lt;/span&gt;default &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    const res &lt;span class="o"&gt;=&lt;/span&gt; http.get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'http://localhost:3000'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    check&lt;span class="o"&gt;(&lt;/span&gt;res, &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;'status is 200'&lt;/span&gt;: &lt;span class="o"&gt;(&lt;/span&gt;r&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; r.status &lt;span class="o"&gt;===&lt;/span&gt; 200 &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute-o com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k6 run ramp-load-test.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esses testes devem ser executados em duração proporcional ao cenário real, aumentando, sustentando e reduzindo a carga como em eventos reais.&lt;/p&gt;




&lt;h3&gt;
  
  
  🛡️ Use Ferramentas de Observabilidade
&lt;/h3&gt;

&lt;p&gt;Relatórios do K6 são ótimos, mas para diagnósticos profundos, combine os testes com ferramentas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New Relic&lt;/li&gt;
&lt;li&gt;Datadog&lt;/li&gt;
&lt;li&gt;Dynatrace&lt;/li&gt;
&lt;li&gt;Elastic Stack&lt;/li&gt;
&lt;li&gt;Splunk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Elas mostram uso de CPU, memória, latência entre serviços, Apdex, etc. Isso transforma dados em decisões reais sobre arquitetura e negócios.&lt;/p&gt;




&lt;h3&gt;
  
  
  🚨 E Quando Você Não Sabe o Pico?
&lt;/h3&gt;

&lt;p&gt;Em muitos casos, especialmente durante o desenvolvimento de novas aplicações, não teremos um número exato de usuários para simular nos testes de carga. Nesses cenários, é recomendável conduzir um teste de estresse até identificar o ponto de saturação do sistema, sim a principal diferença do teste de carga e de estresse é que o primeiro é utilizado para responder se a aplicação suporta uma determinada carga, em quanto o segundo responde até qual carga a aplicação consegue lhe dar.&lt;br&gt;
 Esse tipo de teste permite fornecer ao time de negócio uma visão clara dos limites atuais da aplicação, possibilitando decisões mais conscientes sobre infraestrutura, roadmap de melhorias e comunicação com usuários. &lt;br&gt;
Sim, a principal diferença entre teste de carga e teste de estresse está no objetivo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O teste de carga busca validar se a aplicação suporta uma carga específica dentro de parâmetros aceitáveis.&lt;/li&gt;
&lt;li&gt;Já o teste de estresse tem como foco descobrir até qual ponto a aplicação consegue lidar com o aumento de carga, identificando o momento em que começa a falhar ou degradar seu desempenho. Para realizar um teste de carga no K6, basta subir a va quantidade de VUs, e se for necessário aumentar a quantidade de rampas para entender o comportamento em cada etapa.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  💡 Dica Final: Elasticidade Também É Desescalar
&lt;/h3&gt;

&lt;p&gt;Ambientes elásticos devem voltar ao normal após o pico. Se os recursos não forem liberados, você pode acabar com:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Overprovisioning;&lt;/li&gt;
&lt;li&gt;Uso desnecessário de máquinas;&lt;/li&gt;
&lt;li&gt;E, claro, aquela fatura de nuvem mais assustadora que bug em produção 👻💸&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧩 Conclusão: Testar é Prevenir, Não Remediar
&lt;/h3&gt;

&lt;p&gt;Toda ponte, avião ou elevador passa por testes antes de ser usado por milhões de pessoas. No mundo digital, o raciocínio precisa ser o mesmo. Não espere o caos para descobrir onde sua aplicação falha.&lt;br&gt;
Testes de carga não são “luxo de grandes empresas”, são prática essencial para qualquer sistema que leve a sério a própria estabilidade, reputação e experiência do usuário. Ignorar isso é aceitar o risco de colapsar quando mais importa.&lt;/p&gt;

</description>
      <category>testesdecarga</category>
      <category>testesdeestresse</category>
      <category>qualidadedesoftware</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>10 Passos Para Conduzir um Pós-Mortem Que Realmente Evita Novos Incidentes</title>
      <dc:creator>Ed Wantuil</dc:creator>
      <pubDate>Sun, 14 Sep 2025 09:00:00 +0000</pubDate>
      <link>https://dev.to/ed-wantuil/10-passos-para-conduzir-um-pos-mortem-que-realmente-evita-novos-incidentes-4795</link>
      <guid>https://dev.to/ed-wantuil/10-passos-para-conduzir-um-pos-mortem-que-realmente-evita-novos-incidentes-4795</guid>
      <description>&lt;p&gt;No último texto, falamos sobre como as crises têm o estranho hábito de aparecer no fim da tarde de uma sexta-feira, e como, muitas vezes, elas são tratadas como eventos isolados. Ignoramos suas causas profundas, apagamos o incêndio, respiramos aliviados... até que tudo se repete.&lt;br&gt;
 Essa repetição constante de falhas nos leva a viver o que pode ser chamado do "dia da marmota", um ciclo vicioso onde sempre voltamos ao mesmo ponto. Como quebrar esse padrão?&lt;br&gt;
 Vamos começar com uma analogia poderosa.&lt;br&gt;
Acidentes de carro acontecem todos os dias. E, geralmente, pelas mesmas razões: distração, imprudência, falta de manutenção.&lt;br&gt;
Pouco se investiga, pouco se documenta, e quase nada muda. Já os acidentes aéreos são raros, mas quando ocorrem, são profundamente analisados. Cada detalhe é estudado, discutido e documentado. &lt;strong&gt;As lições aprendidas são transformadas em normas, manuais e treinamentos.&lt;/strong&gt; O resultado é uma indústria que evolui com cada falha e torna o próximo voo ainda mais seguro.&lt;br&gt;
 No mundo da tecnologia, deveríamos fazer o mesmo. Incidentes acontecem, mas repetir os mesmos erros não pode ser parte do nosso processo.&lt;br&gt;
 Uma ferramenta poderosa para essa transformação é o post mortem: uma análise estruturada, empática e colaborativa dos eventos que levaram à crise, com foco em aprendizado, não em punição.&lt;br&gt;
 A seguir, compartilho &lt;strong&gt;10 passos práticos&lt;/strong&gt; para conduzir um post mortem que vá além do superficial, e que realmente gere evolução contínua.&lt;/p&gt;




&lt;h1&gt;
  
  
  1. Escolha o Momento Certo
&lt;/h1&gt;

&lt;p&gt;Assim como não se investiga um acidente no meio do resgate, não se deve fazer um post mortem no calor do momento.&lt;br&gt;
 Evite realizar a análise logo após o incidente. Nesse momento, as emoções ainda estão à flor da pele, e pode faltar clareza. Por outro lado, esperar demais pode causar esquecimento de detalhes importantes.&lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;Recomendo:&lt;/strong&gt; agendar o post mortem entre &lt;strong&gt;2 a 5 dias úteis após a crise&lt;/strong&gt;, garantindo tempo para análise e preparação, sem deixar o caso esfriar.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Construa uma Linha do Tempo Clara
&lt;/h1&gt;

&lt;p&gt;Uma das primeiras etapas é reconstituir a sequência de eventos, como se estivéssemos narrando uma história real, com começo, meio e fim.&lt;br&gt;
 Inclua:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quando e como o problema foi detectado?&lt;/li&gt;
&lt;li&gt;Quais alertas foram gerados?&lt;/li&gt;
&lt;li&gt;Quem foi acionado?&lt;/li&gt;
&lt;li&gt;Quais decisões foram tomadas?&lt;/li&gt;
&lt;li&gt;Quando e como o sistema foi estabilizado?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 &lt;strong&gt;Ferramenta útil:&lt;/strong&gt; crie uma linha do tempo visual e colaborativa. Isso ajuda todos os envolvidos a terem uma compreensão comum dos fatos.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Envolva as Pessoas Certas
&lt;/h1&gt;

&lt;p&gt;Não é uma reunião aberta. O post mortem deve contar com quem tem contexto e pode contribuir com informações valiosas. &lt;br&gt;
Inclua:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;As pessoas que atuaram na crise;&lt;/li&gt;
&lt;li&gt;Representantes de áreas impactadas;&lt;/li&gt;
&lt;li&gt;Especialistas que possam propor melhorias reais.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 Evite excesso de participantes. Muita gente na sala pode inibir o debate e tornar a reunião improdutiva.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Crie um Ambiente Seguro
&lt;/h1&gt;

&lt;p&gt;Erros acontecem. Mas quando o ambiente é punitivo ou competitivo, as pessoas se calam. E onde não há transparência, não há aprendizado.&lt;/p&gt;

&lt;p&gt;📌 Crie um espaço de confiança:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reforce que o objetivo não é apontar culpados, &lt;strong&gt;mas entender causas e contextos;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Valorize a coragem de quem compartilha falhas;&lt;/li&gt;
&lt;li&gt;Adote o modelo de blameless post mortem, que foca no sistema, e não na pessoa.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  5. Garanta Entendimento para Todos
&lt;/h1&gt;

&lt;p&gt;Nem todos na sala falam o mesmo idioma técnico. E mesmo entre técnicos, há níveis e especialidades diferentes.&lt;/p&gt;

&lt;p&gt;📌 Evite jargões ou explicações incompletas; &lt;br&gt;
📌 Esclareça siglas, processos ou termos; &lt;br&gt;
📌 Lembre-se: a responsabilidade por uma comunicação clara é sempre de quem fala.&lt;/p&gt;

&lt;p&gt;Isso fortalece o entendimento e a colaboração, evitando mal-entendidos que poderiam se tornar novas crises.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Identifique os Fatores Contribuintes
&lt;/h1&gt;

&lt;p&gt;É tentador buscar uma causa única, mas a verdade é que crises são multifatoriais. Pequenas falhas, decisões, suposições ou silêncios se somam até algo quebrar. &lt;br&gt;
Uma forma eficiente de encontrar essas causas é a técnica dos 5 Porquês.&lt;/p&gt;

&lt;p&gt;📌 A ideia é simples: pergunte “por quê?” pelo menos cinco vezes a partir do problema identificado, até chegar à origem mais profunda e mapear os fatores contribuintes.&lt;/p&gt;

&lt;h3&gt;
  
  
  👉 Exemplo prático:
&lt;/h3&gt;

&lt;p&gt;Problema: O site ficou fora do ar por 30 minutos. &lt;br&gt;
1️⃣ Por que o site saiu do ar? → Porque o servidor principal travou.&lt;br&gt;
 2️⃣ Por que o servidor travou? → Porque a CPU estava em 100%.&lt;br&gt;
 3️⃣ Por que a CPU estava em 100%? → Porque houve um pico de tráfego não esperado.&lt;br&gt;
 4️⃣ Por que não esperávamos esse tráfego? → Porque o time de marketing lançou uma campanha sem avisar o time de infraestrutura.&lt;br&gt;
5️⃣ Por que não houve comunicação entre os times? → Porque não existe um processo formal de integração entre marketing e tecnologia.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fatores Contribuintes Identificados
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Comunicação insuficiente: Não há canais ou rituais definidos para alinhar lançamentos de marketing e infraestrutura.&lt;/li&gt;
&lt;li&gt;Monitoramento reativo: Falta de alertas pró‑ativos para variações acima de certo limiar de CPU ou tráfego.&lt;/li&gt;
&lt;li&gt;Autoscaling não configurado (HPA): O Horizontal Pod Autoscaler estava ausente ou com thresholds muito altos, impedindo o escalonamento automático dos recursos.&lt;/li&gt;
&lt;li&gt;Ausência de testes de carga: Possivelmente, nunca foi executado um teste de stress ou carga para validar a capacidade em cenários de pico.&lt;/li&gt;
&lt;li&gt;Processo de resposta a incidentes frágil: Não há runbooks claros nem papéis definidos para acionamento rápido em crise.&lt;/li&gt;
&lt;li&gt;Suposições não documentadas: Ficou implícito que “se todo mundo for avisado no Slack, já basta”, mas sem garantia de visibilidade ou confirmação.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  7. Avalie a Resposta à Crise
&lt;/h1&gt;

&lt;p&gt;Mais do que entender o problema, é essencial analisar como a equipe reagiu. &lt;/p&gt;

&lt;p&gt;Divida a avaliação em três partes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O que funcionou bem e deve ser repetido?&lt;/li&gt;
&lt;li&gt;O que não funcionou e precisa ser eliminado ou ajustado?&lt;/li&gt;
&lt;li&gt;O que poderia ter sido feito de forma diferente?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 Perguntas úteis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;As pessoas sabiam o que fazer?&lt;/li&gt;
&lt;li&gt;Havia documentação clara?&lt;/li&gt;
&lt;li&gt;A comunicação entre times foi fluida?&lt;/li&gt;
&lt;li&gt;Houve decisões acertadas que aceleraram a resolução?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Valorize o que deu certo. Celebrar os acertos cria confiança e constrói maturidade organizacional.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Crie um Plano de Ação Concreto
&lt;/h1&gt;

&lt;p&gt;Um post mortem sem ações claras é como um relatório ignorado numa gaveta.&lt;/p&gt;

&lt;p&gt;Para cada fator identificado, defina:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uma ação preventiva ou corretiva;&lt;/li&gt;
&lt;li&gt;Um responsável claro;&lt;/li&gt;
&lt;li&gt;Um prazo realista;&lt;/li&gt;
&lt;li&gt;Um critério de conclusão.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para ilustrar de forma mais enxuta, vamos focar nos 3 fatores principais identificados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Comunicação insuficiente

&lt;ul&gt;
&lt;li&gt;Ação: Estabelecer um “Release Alignment” quinzenal entre marketing e infraestrutura.&lt;/li&gt;
&lt;li&gt;Responsável: Líder de Infraestrutura.&lt;/li&gt;
&lt;li&gt;Prazo: 2 semanas.&lt;/li&gt;
&lt;li&gt;Critério de conclusão: Primeira reunião realizada e ata validada por ambos os times.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt; Monitoramento reativo

&lt;ul&gt;
&lt;li&gt;Ação: Configurar alertas proativos em Prometheus/Grafana para CPU &amp;gt; 70% e tráfego &amp;gt; 80% da capacidade.&lt;/li&gt;
&lt;li&gt;Responsável: Engenheiro de Observabilidade.&lt;/li&gt;
&lt;li&gt;Prazo: 1 semana.&lt;/li&gt;
&lt;li&gt;Critério de conclusão: Alertas testados com simulação de pico e aprovados em staging.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt; Autoscaling não configurado (HPA)

&lt;ul&gt;
&lt;li&gt;Ação: Implementar HPA no cluster Kubernetes com thresholds para escalar automaticamente.&lt;/li&gt;
&lt;li&gt;Responsável: DevOps.&lt;/li&gt;
&lt;li&gt;Prazo: 10 dias.&lt;/li&gt;
&lt;li&gt;Critério de conclusão: Teste de carga demonstra escalonamento sem degradação de performance.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Com este plano reduzido, cada ação tem clareza de “o quê”, “quem”, “quando” e “como” medir, garantindo que o “dia da marmota” não se repita.&lt;/p&gt;

&lt;p&gt;📌 E o mais importante: acompanhe a execução. O aprendizado só vira prática se for implementado.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. Documente Tudo com Clareza e Intenção
&lt;/h1&gt;

&lt;p&gt;O que nos torna uma espécie avançada não é apenas a linguagem, é a capacidade de registrar e transmitir conhecimento de forma assíncrona ao longo dos séculos. &lt;br&gt;
A documentação de uma crise serve para que outras pessoas, em outros contextos, possam entender, aprender e evitar os mesmos erros.&lt;/p&gt;

&lt;p&gt;📌 Inclua:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A linha do tempo;&lt;/li&gt;
&lt;li&gt;Os fatores identificados;&lt;/li&gt;
&lt;li&gt;As ações tomadas;&lt;/li&gt;
&lt;li&gt;As lições aprendidas;&lt;/li&gt;
&lt;li&gt;Recomendações e observações úteis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Assim como os manuais da aviação são atualizados após cada acidente, devemos usar nossos incidentes para revisar nossos processos e padrões. A documentação é onde esse aprendizado se materializa.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Compartilhe com as Lições Apreendidas (Sempre que Possível)
&lt;/h1&gt;

&lt;p&gt;Aprendizado que fica preso em um time é conhecimento desperdiçado. Sempre que possível, compartilhe o post mortem (ou pelo menos suas lições principais) com outras áreas da organização.&lt;/p&gt;

&lt;p&gt;📌 Isso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evita que outros repitam os mesmos erros;&lt;/li&gt;
&lt;li&gt;Gera cultura de melhoria contínua;&lt;/li&gt;
&lt;li&gt;Cria visibilidade para o esforço e evolução da equipe.
Pode ser em forma de:&lt;/li&gt;
&lt;li&gt;Newsletter interna;&lt;/li&gt;
&lt;li&gt;Apresentação no all hands;&lt;/li&gt;
&lt;li&gt;Canal de incidentes em ferramentas como Slack ou Confluence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 E se o incidente for relevante para o mercado, considere compartilhar publicamente, como fazem grandes empresas de tecnologia, contribuindo para toda a comunidade.&lt;/p&gt;




&lt;h1&gt;
  
  
  ✈️ Conclusão: A Crise Como Alicerce da Evolução
&lt;/h1&gt;

&lt;p&gt;Crises são inevitáveis. Repeti-las, não.&lt;br&gt;
Quando você trata cada incidente como uma oportunidade real de aprendizado, e estrutura esse aprendizado com empatia, clareza e disciplina, sua equipe cresce. Sua cultura amadurece. E sua organização se fortalece.&lt;br&gt;
O post mortem é a ponte entre o que falhou e o que pode ser melhor. Use-o como uma ferramenta de transformação. Faça como a aviação: aprenda com cada queda para voar ainda melhor.&lt;/p&gt;

&lt;p&gt;E quem sabe, um dia, as sextas-feiras voltem a ser só... sextas-feiras. 😄&lt;/p&gt;

</description>
      <category>devops</category>
      <category>incidentes</category>
      <category>crises</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Top 5 Vacilos que Desenvolvedores Cometem em uma Crise (e como evitar)</title>
      <dc:creator>Ed Wantuil</dc:creator>
      <pubDate>Sun, 07 Sep 2025 15:24:45 +0000</pubDate>
      <link>https://dev.to/ed-wantuil/top-5-vacilos-que-desenvolvedores-cometem-em-uma-crise-e-como-evitar-13l8</link>
      <guid>https://dev.to/ed-wantuil/top-5-vacilos-que-desenvolvedores-cometem-em-uma-crise-e-como-evitar-13l8</guid>
      <description>&lt;p&gt;&lt;strong&gt;Sexta-feira, 17:55.&lt;/strong&gt; Você tá fechando o notebook, já pensando na pizza. E aí: TRIM TRIM, toca o telefone. Se você é dev, já sabe o frio na espinha:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“O que será que deu ruim agora?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Poucas coisas assustam mais do que uma sala de crise, especialmente numa sexta à noite. E sejamos honestos: quem trabalha com desenvolvimento de software já viveu isso. Eu também. Mais de uma vez. E aprendi algumas lições valiosas (algumas doídas), tanto pelos meus erros quanto observando os vacilos do time.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Entrar em pânico
&lt;/h2&gt;

&lt;p&gt;Tá escrito até no “Guia do Mochileiro das Galáxias”: não entre em pânico. E isso serve tanto pra salvar galáxias quanto sistemas em produção.&lt;br&gt;
Durante uma crise, é fácil ser dominado pela ansiedade: mil mensagens no Slack, alertas pipocando, usuários surtando... e o medo de ter quebrado tudo. A tentação de sair clicando desesperadamente, derrubando pods ou alterando configs direto no prod é grande. Só que quase sempre... piora tudo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Manter a calma não é ignorar o problema, é agir com clareza.&lt;/strong&gt; &lt;br&gt;
Respira. Reuna o time. Olha os logs. Prioriza. E se der, até dá uma risada (humor também é ferramenta de sobrevivência, como diria o Ford Prefect).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🧠 Pânico gera pressa. Pressa gera erro. E erro... gera mais crise.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Tentar resolver sozinho (e no silêncio)
&lt;/h2&gt;

&lt;p&gt;Principalmente no começo da carreira, muita gente tenta “segurar a bronca” sozinha. Por medo de julgamento ou por não ter noção do impacto. Mas o silêncio só faz a crise escalar.&lt;/p&gt;

&lt;p&gt;Faça diferente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dê visibilidade para sua liderança sobre o incidente e os impactos no negócio;&lt;/li&gt;
&lt;li&gt;Abra uma sala de guerra (quando necessário) com as pessoas certas;&lt;/li&gt;
&lt;li&gt;Defina um "piloto da crise”, evita conflito de ações e atropelo nas decisões.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Procurar culpados no meio do incêndio
&lt;/h2&gt;

&lt;p&gt;Nada trava mais a resolução do que começar uma caça às bruxas no meio do caos.&lt;/p&gt;

&lt;p&gt;Troque julgamento por colaboração:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Foque na solução, não em quem causou.&lt;/li&gt;
&lt;li&gt;Confie que cada pessoa agiu com o conhecimento e contexto que tinha.&lt;/li&gt;
&lt;li&gt;Lembre-se: uma crise raramente acontece por um único erro. São vários elos se rompendo, tipo um acidente aéreo.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Buscar a causa raiz antes de estabilizar o sistema
&lt;/h2&gt;

&lt;p&gt;Entrar no modo “Sherlock Holmes” logo de cara? Nem sempre é o melhor caminho.&lt;/p&gt;

&lt;p&gt;Primeiro estabiliza, depois investiga.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entenda o que está sendo impactado agora;&lt;/li&gt;
&lt;li&gt;Faça um plano de primeira resposta;&lt;/li&gt;
&lt;li&gt;Se precisar reiniciar serviço, aplicar um comando DML no banco ou até colocar um fix rápido no código... faça. Mas trate a causa raiz depois, com calma.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Ignorar o postmortem
&lt;/h2&gt;

&lt;p&gt;Crise resolvida? Ótimo. Agora vem a parte mais importante: aprender com ela.&lt;/p&gt;

&lt;p&gt;Trate incidentes como acidentes aéreos, não como batida de carro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No trânsito, cada um vê seu prejuízo e segue a vida.&lt;/li&gt;
&lt;li&gt;Na aviação, cada fator contribuinte é estudado, documentado e corrigido.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Postmortem é vacina contra bugs reincidentes. Se ninguém documentar o que rolou, vai acontecer de novo. E de novo...&lt;br&gt;
Checklist para um bom postmortem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Como a falha foi identificada? Cliente? Monitoramento?&lt;/li&gt;
&lt;li&gt;Quais foram os impactos reais?&lt;/li&gt;
&lt;li&gt;O que foi feito na primeira resposta?&lt;/li&gt;
&lt;li&gt;Quais fatores contribuíram para o incidente?&lt;/li&gt;
&lt;li&gt;Como evitar que aconteça de novo?&lt;/li&gt;
&lt;li&gt;A observabilidade falhou? Tinha alerta? Dashboard?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  👊 Respira. Aprende. Evolui.
&lt;/h2&gt;

&lt;p&gt;Se você tá no meio de uma crise, ou ainda digerindo a última, calma. Todo mundo erra. Mas errar com consciência e corrigir com colaboração faz toda a diferença.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>postmortem</category>
      <category>deploydesexta</category>
      <category>ptbr</category>
    </item>
  </channel>
</rss>
