<?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: Fabricio_Gonçalves</title>
    <description>The latest articles on DEV Community by Fabricio_Gonçalves (@espigah).</description>
    <link>https://dev.to/espigah</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%2F129762%2F313e4001-f760-442d-aa4f-d81315389b1b.jpeg</url>
      <title>DEV Community: Fabricio_Gonçalves</title>
      <link>https://dev.to/espigah</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/espigah"/>
    <language>en</language>
    <item>
      <title>REST Não Basta Mais: Por que suas APIs precisam de "Contexto" na era da IA</title>
      <dc:creator>Fabricio_Gonçalves</dc:creator>
      <pubDate>Wed, 21 Jan 2026 00:40:45 +0000</pubDate>
      <link>https://dev.to/espigah/rest-nao-basta-mais-por-que-suas-apis-precisam-de-contexto-na-era-da-ia-2md2</link>
      <guid>https://dev.to/espigah/rest-nao-basta-mais-por-que-suas-apis-precisam-de-contexto-na-era-da-ia-2md2</guid>
      <description>&lt;p&gt;A evolução das APIs parece ter estagnado nos últimos anos. Enquanto as ferramentas de inteligência artificial e os agentes autônomos evoluem a uma velocidade absurda, a forma como nossas APIs entregam dados continua rígida e engessada.&lt;/p&gt;

&lt;p&gt;Se você trabalha com desenvolvimento, já deve ter percebido: estamos tentando conectar máquinas a sistemas que ainda dependem de manuais feitos para humanos. E é aqui que o problema começa.&lt;/p&gt;

&lt;h2&gt;
  
  
  O gargalo: APIs feitas para humanos, usadas por agentes
&lt;/h2&gt;

&lt;p&gt;Quando criamos uma API tradicional, projetamos tudo esperando que um humano esteja no controle. Partimos do princípio que o desenvolvedor do outro lado vai ler a documentação, compreender as nuances de funcionamento do sistema e ter o bom senso de respeitar os limites para não quebrar nada, por exemplo. &lt;/p&gt;

&lt;p&gt;O problema é que as LLMs (modelos de linguagem) não possuem essa intuição. Elas são literais. Se você der um endpoint para um agente de IA e pedir uma tarefa em massa, ele vai executar da forma mais rápida e bruta possível, sem saber que aquela "pancada" de requisições pode derrubar o seu servidor por falta de um direcionamento claro sobre o comportamento esperado.&lt;/p&gt;

&lt;h2&gt;
  
  
  O perigo da falta de contexto: O script "destruidor"
&lt;/h2&gt;

&lt;p&gt;Imagine o seguinte cenário: você pede para uma IA ler 1.000 objetos de uma API e clonar esses dados em outro endpoint. É algo trivial.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sem contexto:&lt;/strong&gt; A IA gera um loop &lt;code&gt;for&lt;/code&gt; simples e dispara os 1.000 pedidos em milissegundos. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O resultado:&lt;/strong&gt; Para muitos sistemas, isso é um ataque DoS involuntário. A IA entregou o que você pediu, mas o sistema caiu porque ela não sabia que precisava "segurar a onda".&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Ideia: O método &lt;code&gt;CONTEXT&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Inspirado no método &lt;code&gt;OPTIONS&lt;/code&gt; (que os navegadores já usam para entender permissões), por que não criar um padrão voltado especificamente para agentes de IA? A ideia é explorar um conceito de um método chamado &lt;strong&gt;CONTEXT&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O fluxo funcionaria assim: antes de o agente fazer qualquer &lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;POST&lt;/code&gt; ou &lt;code&gt;DELETE&lt;/code&gt;, ele faria uma consulta rápida ao endpoint usando esse "método" de contexto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como isso muda o jogo na prática
&lt;/h3&gt;

&lt;p&gt;Ao consultar esse metadado, a API retornaria um JSON com as "regras de etiqueta" do sistema. Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/v1/clonar-objetos"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rules"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rate_limit_advice"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Nunca faça mais de 5 requisições por segundo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"criticality"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"side_effects"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Este comando gera carga pesada no banco de dados"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com essa informação em mãos, a IA muda o comportamento na hora. Em vez de um script agressivo, ela gera um código com um sleep (pausa) entre as chamadas, respeitando a saúde da infraestrutura sem que você precise dizer isso explicitamente no prompt inicial.&lt;/p&gt;

&lt;h2&gt;
  
  
  O futuro é padronizar o contexto
&lt;/h2&gt;

&lt;p&gt;Precisamos parar de criar scripts e "peripécias" por fora para tentar controlar as IAs. O ideal é que as APIs forneçam, de forma padronizada e natural, o contexto necessário para que os agentes trabalhem com segurança.&lt;/p&gt;

&lt;p&gt;Fornecer contexto deveria ser o padrão, não a exceção. Assim como verificamos permissões de CORS, deveríamos verificar o "comportamento esperado" de uma API antes de qualquer interação.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Quer ver a explicação completa e como essa ideia foi testada na prática?&lt;/strong&gt; Assista ao vídeo: &lt;a href="https://www.youtube.com/watch?v=JsFGUJVLf_s" rel="noopener noreferrer"&gt;REST Não Basta Mais: O Problema do Contexto nas APIs&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;O que você acha dessa abordagem?&lt;/strong&gt; Acredita que um padrão de metadados para agentes facilitaria o desenvolvimento de integrações mais seguras ou prefere controlar tudo no prompt? &lt;/p&gt;

</description>
      <category>api</category>
      <category>ai</category>
      <category>webdev</category>
      <category>backend</category>
    </item>
    <item>
      <title>Cursor | AI Infused SDLC - Potencializando o Desenvolvimento com Inteligência Artificial</title>
      <dc:creator>Fabricio_Gonçalves</dc:creator>
      <pubDate>Sun, 24 Aug 2025 03:32:56 +0000</pubDate>
      <link>https://dev.to/espigah/cursor-ai-infused-sdlc-potencializando-o-desenvolvimento-com-inteligencia-artificial-4cl1</link>
      <guid>https://dev.to/espigah/cursor-ai-infused-sdlc-potencializando-o-desenvolvimento-com-inteligencia-artificial-4cl1</guid>
      <description>&lt;h1&gt;
  
  
  Cursor | AI Infused SDLC
&lt;/h1&gt;

&lt;p&gt;O Ciclo de Desenvolvimento de Software (SDLC) é a espinha dorsal de qualquer projeto de tecnologia, mas por décadas seguimos suas fases de forma manual e, frequentemente, desconectada. E se pudéssemos infundir cada etapa com inteligência artificial, transformando a IA de uma ferramenta pontual em uma verdadeira parceira estratégica?&lt;/p&gt;

&lt;p&gt;Neste artigo, vou mostrar como uma abordagem "AI Infused SDLC" utilizando o &lt;strong&gt;Cursor IDE&lt;/strong&gt; pode mudar a maneira como planejamos, projetamos e codificamos software.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Ferramenta Central: Cursor e suas "Rules"
&lt;/h2&gt;

&lt;p&gt;Antes de mergulhar nas fases do SDLC, é fundamental entender a peça central desta abordagem: o &lt;strong&gt;Cursor IDE&lt;/strong&gt;, um editor de código projetado especificamente para trabalhar com IA. Sua principal força reside na capacidade de injetar contexto de forma precisa através das &lt;strong&gt;"Cursor Rules"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As "Cursor Rules" funcionam como uma memória contextual estruturada para o modelo de IA, organizamos as informações em camadas hierárquicas da seguinte forma:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Regras genéricas de time:&lt;/strong&gt; Padrões de arquivo, boas práticas de desenvolvimento e abordagens metodológicas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regras específicas do projeto:&lt;/strong&gt; Stack tecnológico, padrões de código e convenções internas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Informações organizacionais:&lt;/strong&gt; Canais de comunicação, ferramentas utilizadas e processos estabelecidos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regras de negócio:&lt;/strong&gt; Requisitos específicos do domínio, como regras de repasse ou validações particulares.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arquitetura do sistema:&lt;/strong&gt; Organização física e semântica do projeto.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O resultado é um &lt;strong&gt;contexto enriquecido&lt;/strong&gt; que permite à IA gerar PRDs, implementações e documentação perfeitamente alinhadas ao projeto, frequentemente de forma transparente para o usuário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fase 1: Planning — Planejamento Inteligente
&lt;/h2&gt;

&lt;p&gt;O Planning é a fase inicial onde definimos objetivos, escopo e viabilidade do projeto. Com o Cursor IDE, essa etapa ganha uma dimensão analítica mais profunda através do processamento inteligente de informações.&lt;/p&gt;

&lt;p&gt;A IA pode consolidar dados de múltiplas fontes para apoiar decisões estratégicas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Análise de Mercado:&lt;/strong&gt; Processamento de documentos de pesquisa e tendências&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avaliação Técnica:&lt;/strong&gt; Revisão de arquiteturas similares e tecnologias disponíveis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estimativas de Esforço:&lt;/strong&gt; Baseadas em projetos anteriores e complexidade identificada&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O resultado é um &lt;strong&gt;roadmap de projeto fundamentado&lt;/strong&gt; que serve como base sólida para as fases seguintes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fase 2: Análise Inteligente de Requisitos
&lt;/h2&gt;

&lt;p&gt;A análise de requisitos é tradicionalmente uma das fases mais críticas do SDLC, onde a clareza dos objetivos determina o sucesso do projeto. O grande diferencial desta abordagem é que &lt;strong&gt;o piloto da IDE não precisa ser necessariamente um desenvolvedor&lt;/strong&gt;. Com o Cursor e suas regras contextuais bem configuradas, um product owner pode conduzir essa fase com eficiência.&lt;/p&gt;

&lt;p&gt;Utilizando o &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;, a IA ganha acesso autorizado a múltiplas fontes de conhecimento, construindo um entendimento profundo e multidimensional do desafio:&lt;/p&gt;

&lt;h3&gt;
  
  
  Cenário prático conduzido por um Product Owner:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Análise de Código:&lt;/strong&gt; A IA examina o repositório para mapear a arquitetura atual, identificar padrões existentes e possíveis pontos de impacto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consulta a Bancos de Dados:&lt;/strong&gt; Investigação de esquemas e dados para compreender como uma nova funcionalidade afetará a estrutura existente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revisão Documental:&lt;/strong&gt; Processamento de transcrições de reuniões, especificações técnicas e documentos de design para extrair requisitos essenciais.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O resultado final é uma &lt;strong&gt;tarefa detalhada gerada automaticamente no Jira&lt;/strong&gt;, completa com resumo técnico, análise de impacto e critérios de aceitação preliminares. Tudo isso sem interromper o fluxo de trabalho dos desenvolvedores.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fase 3: Design Colaborativo e Prototipação
&lt;/h2&gt;

&lt;p&gt;Com a tarefa inicial estruturada, avançamos para a fase de Design — momento em que resistimos à tentação de "sair codificando" e priorizamos o refinamento da solução. Aqui, o time de desenvolvimento assume o protagonismo, utilizando a IA como parceira de brainstorming e prototipação.&lt;/p&gt;

&lt;p&gt;O objetivo central desta fase é criar um &lt;strong&gt;plano de desenvolvimento detalhado&lt;/strong&gt;, frequentemente materializado como uma &lt;code&gt;task list&lt;/code&gt; dentro do próprio repositório. Este artefato funciona como uma ponte crucial: traduz necessidades de negócio em um roteiro técnico executável.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como a IA do Cursor contribui:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gera exemplos de código para ilustrar abordagens propostas: &lt;em&gt;"Para o novo endpoint, poderíamos seguir este padrão de DTO"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Sugere estruturas de função: &lt;em&gt;"A lógica de cálculo de juros pode ser encapsulada nesta função específica"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Propõe padrões arquiteturais adequados ao contexto do projeto&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Importante:&lt;/strong&gt; Todos esses exemplos são inseridos na &lt;code&gt;task list&lt;/code&gt; como referência e orientação, &lt;strong&gt;mas nenhum código de produção é alterado nesta fase&lt;/strong&gt;. É um momento de planejamento estratégico e alinhamento de expectativas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fase 4: Codificação Estratégica — A Escalada Controlada
&lt;/h2&gt;

&lt;p&gt;Com um roadmap técnico claro, iniciamos a fase de codificação seguindo uma filosofia de "escalada controlada": subimos degrau a degrau, tarefa a tarefa, sempre com validação contínua. Esta abordagem substitui a corrida desordenada por um processo metodológico e seguro.&lt;/p&gt;

&lt;h3&gt;
  
  
  O processo se estrutura em três momentos distintos:
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Preparação — Elaborando o Guia de Execução
&lt;/h4&gt;

&lt;p&gt;O desenvolvedor cria um documento &lt;code&gt;.md&lt;/code&gt; detalhado que serve como "manual de instruções" para a IA. Este guia lista as tarefas da &lt;code&gt;task list&lt;/code&gt;, fornece contexto adicional e inclui exemplos específicos para implementação. É o momento crucial de "planejar antes de executar".&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Definição — Estabelecendo o Diálogo
&lt;/h4&gt;

&lt;p&gt;Com o guia preparado, o desenvolvedor inicia uma conversa estruturada no chat do Cursor, descrevendo precisamente a mudança desejada e referenciando o documento &lt;code&gt;.md&lt;/code&gt;. A IA processa essas informações e apresenta a &lt;code&gt;task list&lt;/code&gt; de forma organizada e pronta para execução.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Execução — Implementação Iterativa e Refinada
&lt;/h4&gt;

&lt;p&gt;Esta é onde a metodologia se destaca. O desenvolvedor trabalha &lt;strong&gt;rigorosamente item por item&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solicita à IA a implementação da primeira tarefa&lt;/li&gt;
&lt;li&gt;Analisa criteriosamente o código gerado e seus impactos&lt;/li&gt;
&lt;li&gt;Solicita refinamentos quando necessário: &lt;em&gt;"Excelente estrutura, mas vamos extrair essa lógica para uma função separada para melhorar a testabilidade"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Só avança para o próximo item quando o atual está 100% validado&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esta disciplina garante solidez em cada etapa, eliminando retrabalho e mantendo a qualidade do código em padrões elevados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escopo deste Artigo
&lt;/h2&gt;

&lt;p&gt;É importante destacar que neste artigo focamos especificamente nas &lt;strong&gt;quatro primeiras fases do SDLC&lt;/strong&gt;: Planning, Análise, Design e Codificação. As demais etapas — Testes, Deploy e Manutenção — também possuem potencial significativo para serem revolucionadas com IA, mas merecem um tratamento detalhado que será abordado em artigos futuros.&lt;/p&gt;

&lt;p&gt;Cada uma dessas fases restantes apresenta desafios únicos e oportunidades específicas para integração inteligente que justificam uma análise dedicada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Desafios e Cuidados Essenciais
&lt;/h2&gt;

&lt;p&gt;A adoção de IA no SDLC não é um mar de rosas. Novos desafios emergem e exigem atenção constante:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Context Rot (Degradação de Contexto):&lt;/strong&gt; Excesso de tokens pode comprometer a precisão do modelo. É fundamental ser seletivo sobre quais informações fornecer à IA.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overreliance (Dependência Excessiva):&lt;/strong&gt; O código gerado sempre necessita validação humana criteriosa. Erros não detectados podem causar sérios problemas em produção. A IA é uma parceira poderosa, jamais uma substituta infalível.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentação Redundante:&lt;/strong&gt; A IA pode gerar documentação excessiva e desorganizada. É essencial implementar processos de curadoria para manter apenas conteúdo relevante e atualizado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;O mantra fundamental:&lt;/strong&gt; seja &lt;strong&gt;paciente e meticuloso&lt;/strong&gt;. Todo output deve ser registrado, estruturado e, principalmente, revisado com rigor técnico.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lições Aprendidas na Prática
&lt;/h2&gt;

&lt;p&gt;Mesmo ainda em fase experimental, alguns insights valiosos já emergiram:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nivelamento de Desenvolvedores:&lt;/strong&gt; Profissionais menos experientes ganham significativa confiança e segurança, utilizando a IA como um "senior pair programmer" sempre disponível.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aceleração para Especialistas:&lt;/strong&gt; Desenvolvedores seniores conseguem acelerar drasticamente tarefas repetitivas, liberando tempo para se concentrar em desafios arquitetônicos complexos e decisões estratégicas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qualidade do Input é Crítica:&lt;/strong&gt; Todo contexto fornecido é fundamental. Conversas de equipe, decisões arquiteturais e regras de negócio devem estar meticulosamente documentadas e acessíveis para maximizar a eficácia da IA.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusão: Rumo a um SDLC Inteligente
&lt;/h2&gt;

&lt;p&gt;Um SDLC infundido com IA, especialmente através de ferramentas como o Cursor IDE, representa uma evolução natural do desenvolvimento de software. Não se trata de substituir a expertise humana, mas de amplificá-la exponencialmente.&lt;/p&gt;

&lt;p&gt;Esta abordagem transforma cada fase — desde a análise inicial até a entrega final — em um processo mais inteligente, orientado por dados e focado na estratégia. Ao adotar essa mentalidade, transcendemos o papel de "codificadores" para nos estabelecermos como verdadeiros &lt;strong&gt;arquitetos de soluções digitais&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O futuro do desenvolvimento de software não está na competição entre humanos e máquinas, mas na colaboração sinérgica entre ambos.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Qual sua experiência com IA no desenvolvimento? Compartilhe nos comentários como você tem usado ferramentas como o Cursor em seus projetos!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cursor</category>
      <category>sdlc</category>
      <category>sdd</category>
    </item>
    <item>
      <title>Evoluindo a Segurança de Transações em Apps Mobile: Da Senha ao Device Binding</title>
      <dc:creator>Fabricio_Gonçalves</dc:creator>
      <pubDate>Mon, 09 Jun 2025 00:25:57 +0000</pubDate>
      <link>https://dev.to/espigah/evoluindo-a-seguranca-de-transacoes-em-apps-mobile-da-senha-ao-device-binding-8p3</link>
      <guid>https://dev.to/espigah/evoluindo-a-seguranca-de-transacoes-em-apps-mobile-da-senha-ao-device-binding-8p3</guid>
      <description>&lt;p&gt;Salve, pessoal! Depois de iniciar minha trilha de gestão, tem me faltado tempo pra experimentar algumas coisas no mundo de desenvolvimento, mas essa semana me deparei com um problema que para alguns deve ser algo rotineiro, mas que para mim não é. &lt;/p&gt;

&lt;p&gt;Estou falando simplesmente de &lt;strong&gt;garantir uma transação segura por meio de aparelhos móveis&lt;/strong&gt;. Fácil, não é mesmo? 😅&lt;/p&gt;

&lt;p&gt;Me dei conta que poderia não ser... por isso resolvi fazer um POC e entender melhor como podemos fazer uma transação de forma segura. Claro, não é um problema do meu dia a dia, posso no final estar falando groselha, e se for, fique à vontade para aparecer nos comentários ;)&lt;/p&gt;

&lt;p&gt;Pois bem. Ainda que seja para falar de um tema cabeludo aqui, o objetivo não é entrar nas profundezas desse tema falando de criptografia quântica e o escambau, mas somente ilustrar um fluxo evolutivo de uma forma que, pra mim, parece aceitável de se lidar com esse problema.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; Este post foca em conceitos didáticos para iniciantes. Em produção, sempre consulte especialistas em segurança e siga as melhores práticas da sua organização.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🎯 O Que Vamos Abordar
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Por que senhas simples não bastam &lt;/li&gt;
&lt;li&gt;Evolução progressiva de segurança (do jeito que fui entendendo)&lt;/li&gt;
&lt;li&gt;JWT, biometria e device binding na prática&lt;/li&gt;
&lt;li&gt;Implementação de múltiplos fatores de autenticação&lt;/li&gt;
&lt;li&gt;Fallbacks para dispositivos sem biometria&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ❌ Tentativa 1: O Básico Inseguro (Meus Tempos de Inocência)
&lt;/h2&gt;

&lt;p&gt;No passado muito distante, quando nem sabia o que era um JWT, era muito comum pensar que um fluxo onde o app faz a autenticação pra logar no aparelho e depois, no máximo, colocando novamente a senha, já estaria apto a fazer uma transação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O cenário que eu achava suficiente:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🔓 Usuário faz login
🔓 Para cada transação: digita senha novamente
💸 Executa transação
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas isso tem alguns riscos bem graves que só fui perceber depois:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Alguém com acesso ao aparelho pode facilmente reutilizar a sessão&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nenhuma prova é exigida na hora da transação de que quem está enviando é realmente o dono da conta&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vulnerabilidade a shoulder surfing:&lt;/strong&gt; Senhas podem ser observadas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sem contexto:&lt;/strong&gt; Nenhuma informação sobre dispositivo ou localização&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚠️ Tentativa 2: Melhorando com JWT (Descobrindo Tokens)
&lt;/h2&gt;

&lt;p&gt;Não muito diferente da primeira, mas já com a evolução de usar o JWT. Então o usuário loga no sistema, recebe seu JWT, e usa esse JWT (mais a senha, talvez) para efetuar a transação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O fluxo que pensei ser mais esperto:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🔐 Login → recebe JWT
🔐 Transação → envia JWT + (opcional) senha
💸 Servidor valida e executa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ganhos em relação à tentativa 1:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Token curto, com validade controlada&lt;/li&gt;
&lt;li&gt;✅ Possibilidade de usar claims no JWT para indicar escopos ou expiração específica para transações&lt;/li&gt;
&lt;li&gt;✅ Stateless (servidor não precisa armazenar sessões)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ainda assim, há problemas sérios:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;O JWT pode ser interceptado se não houver HTTPS&lt;/strong&gt; (ou se tiver alguma falha na implementação)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Não há fator de prova adicional no momento da transação&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Não está claro se quem usa o JWT é realmente o dono do aparelho&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Falta de contexto transacional:&lt;/strong&gt; JWT não está vinculado à transação específica&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛡️ Tentativa 3: Adicionando Biometria (Achando que Resolvi Tudo)
&lt;/h2&gt;

&lt;p&gt;A abordagem agora, um pouco mais elaborada, pode ser dividida em 2 frentes, que depois podem se completar:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.1 Biometria&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Os aparelhos móveis evoluíram bastante. Não é difícil encontrar aparelhos com a capacidade de usar biometria para reconhecer o "dono" do aparelho. Adicionando isso no fluxo, garantimos que só o dono do aparelho possa autorizar uma transação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que achei que seria a solução final:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🔐 Login → recebe JWT
👤 Biometria local confirma identidade
🔐 Transação → envia JWT
💸 Servidor executa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Melhorias:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Prova local de identidade&lt;/li&gt;
&lt;li&gt;✅ Experiência do usuário melhorada&lt;/li&gt;
&lt;li&gt;✅ Segurança adicional contra uso não autorizado&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mas, calma... 🤔
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A biometria por si só não protege contra sequestro de token (JWT), por exemplo.&lt;/strong&gt; O servidor não tem como saber se a transação realmente passou pela verificação biométrica. Ou seja, a autenticação local não garante integridade da transação.&lt;/p&gt;

&lt;p&gt;Um atacante pode simplesmente interceptar o JWT e fazer a requisição diretamente, contornando completamente a biometria.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔐 Tentativa 4: Device Binding + Desafio (Agora Sim Ficou Sério!)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;3.2 Device Binding + Desafio&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Uma nova etapa é adicionada no fluxo: a autorização do aparelho (device binding).&lt;/p&gt;

&lt;p&gt;Aqui começamos a ficar sérios! Introduzimos o conceito de &lt;strong&gt;device binding&lt;/strong&gt; com &lt;strong&gt;challenge-response&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Aqui, um "desafio" (challenge) é gerado pelo servidor e enviado para o app. Esse desafio é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Assinado pelo dispositivo&lt;/strong&gt; (com uma chave privada que está segura no aparelho e protegida por biometria)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Devolvido para o servidor&lt;/strong&gt;, que valida com a chave pública&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  O que isso traz de ganho?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;O desafio é algo que expira, é único e não reutilizável&lt;/li&gt;
&lt;li&gt;Somente o aparelho autorizado consegue responder corretamente&lt;/li&gt;
&lt;li&gt;A transação fica atrelada a um contexto: quem, quando, de qual dispositivo, e com qual fator de autenticação&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Como Funciona:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Registro do Dispositivo:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   📱 App gera par de chaves (pública/privada)
   🔑 Chave privada fica protegida no dispositivo (TEE/Secure Enclave)
   📤 Chave pública é enviada e registrada no servidor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fluxo de Transação:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   🔐 Login normal → recebe JWT
   💸 Usuário inicia transação
   🎲 Servidor gera challenge único
   👤 App solicita biometria para liberar chave privada
   ✍️ App assina o challenge com chave privada
   📤 Envia JWT + challenge assinado + dados da transação
   ✅ Servidor valida assinatura com chave pública registrada
   💸 Transação aprovada
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ganhos Significativos:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Prova criptográfica&lt;/strong&gt; de que a requisição veio do dispositivo específico&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Challenge único&lt;/strong&gt; previne replay attacks&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Biometria integrada&lt;/strong&gt; ao processo de assinatura&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Contexto completo:&lt;/strong&gt; quem, quando, de onde e com qual fator&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Implementação Prática:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;React Native - Gerando chaves seguras:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Keychain&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-keychain&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;TouchID&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-touch-id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Gera e armazena chaves do dispositivo&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;generateDeviceKeys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;biometryType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TouchID&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isSupported&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;biometryType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;privateKey&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;generateKeyPair&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Armazena chave privada protegida por biometria&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Keychain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setInternetCredentials&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;transaction_key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;device_key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;privateKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;accessControl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Keychain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ACCESS_CONTROL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BIOMETRY_ANY&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Enviar ao servidor&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Assina challenge com biometria&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signChallenge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;challenge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TouchID&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;authenticate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Confirme a transação&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Keychain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getInternetCredentials&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;transaction_key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;signWithPrivateKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;challenge&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🏆 Tentativa 5: Juntando Tudo (e Mais Um Pouco)
&lt;/h2&gt;

&lt;p&gt;Agora sim, o fluxo começa a ganhar cara de algo minimamente robusto!&lt;/p&gt;

&lt;p&gt;Antes de realizar a transação, introduzimos um novo tipo de token: o &lt;strong&gt;token de autorização&lt;/strong&gt;. Até agora, o JWT que usamos era um token de autenticação, usado para identificar quem está fazendo a requisição. Mas ele não diz muita coisa sobre a intenção de fazer uma transação específica.&lt;/p&gt;

&lt;p&gt;O token de autorização vem para preencher essa lacuna. A versão mais robusta adiciona uma camada extra: &lt;strong&gt;tokens de autorização específicos para transação&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Diferença Entre Tokens (Que Eu Finalmente Entendi):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JWT de Autenticação:&lt;/strong&gt; "Eu sou o usuário X"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token de Autorização:&lt;/strong&gt; "Eu tenho permissão para fazer ESTA transação específica AGORA"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ele pode ter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Um tempo de expiração curtíssimo&lt;/strong&gt; (ex: 30 segundos)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ser vinculado a uma transação específica&lt;/strong&gt; (ex: ID do pagamento ou valor envolvido)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ser liberado somente após a autenticação biométrica + assinatura do desafio&lt;/strong&gt;, e gerado no lado do servidor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O app envia esse token ao backend como parte da requisição da transação, e o backend só valida a operação se esse token de autorização estiver presente, válido e íntegro.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assim, conseguimos aplicar os três pilares da segurança:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Autenticação&lt;/strong&gt; (JWT de login)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autorização&lt;/strong&gt; (token específico para a transação)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prova de posse&lt;/strong&gt; (biometria + assinatura criptográfica do desafio)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Fluxo Completo:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. 🔐 Login → JWT de autenticação
2. 💸 Usuário inicia transação (valor: R$ 1000)
3. 🎲 Servidor gera challenge + token de autorização temporário
   - Válido por 30 segundos
   - Vinculado ao valor exato e destinatário
   - Só é liberado após validação completa
4. 👤 App solicita biometria
5. ✍️ App assina challenge + dados da transação
6. 📤 Envia: JWT + token de autorização + challenge assinado
7. ✅ Servidor valida TUDO:
   - JWT válido?
   - Token de autorização válido e não expirado?
   - Assinatura do challenge correta?
   - Dados da transação batem?
8. 💸 Transação aprovada
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Implementação do Token de Autorização:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;

&lt;span class="c"&gt;// Gera token específico para transação&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;generateTransactionToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userID&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="n"&gt;TransactionData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;challengeID&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;claims&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;TransactionClaims&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;UserID&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;      &lt;span class="n"&gt;userID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Amount&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;      &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Recipient&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Recipient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;ChallengeID&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;challengeID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;RegisteredClaims&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;jwt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RegisteredClaims&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;ExpiresAt&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;jwt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewNumericDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;jwt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewWithClaims&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jwt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SigningMethodHS256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SignedString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secretKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Valida transação completa&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;validateTransaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;authJWT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;authToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="n"&gt;TransactionData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// 1. Valida usuário&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;validateAuthJWT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;authJWT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// 2. Valida token de autorização&lt;/span&gt;
    &lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;validateAuthToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;authToken&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// 3. Verifica dados&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Amount&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Amount&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Recipient&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Recipient&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"dados não conferem"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// 4. Valida assinatura do challenge&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;verifyChallenge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChallengeID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PublicKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔄 Fallbacks e Considerações Práticas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Para Dispositivos Sem Biometria:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Senha de Transação:&lt;/strong&gt; Como bancos tradicionais&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SMS/Email OTP:&lt;/strong&gt; Segundo fator via comunicação externa&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App Authenticator:&lt;/strong&gt; TOTP (Time-based One-Time Password)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// React Native - Escolha do método de autenticação&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;TouchID&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-touch-id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getAuthenticationMethod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;biometrySupported&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TouchID&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isSupported&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;biometrySupported&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;userPreferences&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;biometry&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;biometric_challenge&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userPreferences&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transactionPassword&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;transaction_password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sms_otp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🛡️ Os Três Pilares Implementados
&lt;/h2&gt;

&lt;p&gt;Nossa solução final atende aos três pilares fundamentais da segurança:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Autenticação&lt;/strong&gt; (Quem é?)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;JWT de login válido&lt;/li&gt;
&lt;li&gt;Identidade confirmada&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Autorização&lt;/strong&gt; (Pode fazer?)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Token específico para a transação&lt;/li&gt;
&lt;li&gt;Escopo limitado e temporal&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Prova de Posse&lt;/strong&gt; (Está realmente aqui?)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Biometria + assinatura criptográfica&lt;/li&gt;
&lt;li&gt;Device binding comprovado&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ Resumo dos Benefícios
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Múltiplas camadas de segurança&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Proteção contra replay attacks&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Device binding criptográfico&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Tokens com escopo limitado&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Fallbacks para diferentes cenários&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Experiência do usuário fluida&lt;/strong&gt;&lt;br&gt;
✅ &lt;strong&gt;Detecção de anomalias&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Próximos Passos
&lt;/h2&gt;

&lt;p&gt;Para quem quer se aprofundar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Estude criptografia aplicada&lt;/strong&gt; (curvas elípticas, RSA)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implemente rate limiting&lt;/strong&gt; e throttling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adicione logging e auditoria&lt;/strong&gt; detalhados&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Considere WebAuthn/FIDO2&lt;/strong&gt; para web&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teste com pen testing&lt;/strong&gt; profissional&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  📚 Referências Técnicas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Segurança Geral
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://owasp.org/www-project-mobile-security-testing-guide/" rel="noopener noreferrer"&gt;OWASP Mobile Security Testing Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pages.nist.gov/800-63-3/" rel="noopener noreferrer"&gt;NIST Digital Identity Guidelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/rfc/rfc8725.txt" rel="noopener noreferrer"&gt;JWT Best Current Practices (RFC 8725)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fidoalliance.org/specifications/" rel="noopener noreferrer"&gt;FIDO Alliance Specifications&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  React Native
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/oblador/react-native-keychain" rel="noopener noreferrer"&gt;React Native Keychain&lt;/a&gt; - Secure storage&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/naoufal/react-native-touch-id" rel="noopener noreferrer"&gt;React Native Touch ID&lt;/a&gt; - Biometric auth&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://reactnative.dev/docs/security" rel="noopener noreferrer"&gt;React Native Security&lt;/a&gt; - Best practices&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/training/sign-in/biometric-auth" rel="noopener noreferrer"&gt;Android Biometric Auth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.apple.com/documentation/localauthentication" rel="noopener noreferrer"&gt;iOS LocalAuthentication&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Golang
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pkg.go.dev/crypto" rel="noopener noreferrer"&gt;Go Crypto Packages&lt;/a&gt; - Cryptography in Go&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/golang-jwt/jwt" rel="noopener noreferrer"&gt;JWT Go&lt;/a&gt; - JWT implementation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://golang.org/doc/security" rel="noopener noreferrer"&gt;Go Security&lt;/a&gt; - Security best practices&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Go_SCP_Cheat_Sheet.html" rel="noopener noreferrer"&gt;OWASP Go Cheat Sheet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Juntando tudo, parece que agora temos uma transação minimamente segura:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Temos a identidade do usuário&lt;/strong&gt; (login)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temos a confirmação de que é ele mesmo, e que está no aparelho certo&lt;/strong&gt; (biometria + device binding)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temos a autorização contextual, com tempo curto e uso único&lt;/strong&gt; (token da transação)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em cenários onde não há suporte à biometria, usar uma &lt;strong&gt;senha específica para transações&lt;/strong&gt; (como já é feito em bancos) também é totalmente aceitável - desde que seja tratada com o mesmo cuidado de um fator sensível.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Esse post não pretende esgotar o assunto&lt;/strong&gt; - longe disso - mas sim mostrar que, mesmo para quem não lida com isso todo dia, é possível montar soluções coerentes, seguras e evolutivas.&lt;/p&gt;

&lt;p&gt;Este guia apresenta uma evolução didática para implementar transações seguras em mobile. &lt;strong&gt;Em produção, sempre:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consulte especialistas em segurança&lt;/li&gt;
&lt;li&gt;Faça pen testing regular&lt;/li&gt;
&lt;li&gt;Monitore logs de segurança&lt;/li&gt;
&lt;li&gt;Mantenha-se atualizado com vulnerabilidades&lt;/li&gt;
&lt;li&gt;Implemente gradualmente e teste muito&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Segurança não é um destino, é uma jornada contínua de melhorias e adaptações.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Se você já implementou algo parecido ou tem sugestões, manda nos comentários! Estou aprendendo também.&lt;/strong&gt; 😉&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Observação Importante
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Na prática, considere soluções como OAuth 2.0, Auth0, Firebase Auth ou AWS Cognito&lt;/strong&gt; que já implementam esses fluxos de forma segura e testada.&lt;br&gt;&lt;br&gt;
O aprendizado aqui é válido para entender os conceitos, mas em produção, "não reinvente a roda" 🛞&lt;/p&gt;




</description>
      <category>mobilesecurity</category>
      <category>reactnative</category>
      <category>authentication</category>
      <category>jwt</category>
    </item>
    <item>
      <title>Arquitetura Viva: Moldando Sistemas para Mudanças</title>
      <dc:creator>Fabricio_Gonçalves</dc:creator>
      <pubDate>Fri, 06 Dec 2024 21:52:39 +0000</pubDate>
      <link>https://dev.to/espigah/arquitetura-viva-moldando-sistemas-para-mudancas-48a9</link>
      <guid>https://dev.to/espigah/arquitetura-viva-moldando-sistemas-para-mudancas-48a9</guid>
      <description>&lt;p&gt;Por vezes, ainda me pego conversando sobre arquitetura de software com algumas pessoas. Apesar de já ter escrito umas ideias aqui e ali, senti que faltava colocar no papel uma visão que vai além das “badaladas” &lt;strong&gt;clean architecture&lt;/strong&gt;, &lt;strong&gt;ports and adapters&lt;/strong&gt; e &lt;strong&gt;DDD&lt;/strong&gt;. Ou talvez, pensando bem, essa visão esteja exatamente entre essas abordagens, porque todas bebem de fontes parecidas.&lt;/p&gt;

&lt;p&gt;No fim, pode até não ser nada novo. Mas talvez seja algo que o curso “zero to hero” nunca mencionou. Então, resolvi deixar aqui mais uma peça desse quebra-cabeça que é a arquitetura de software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Domínio
&lt;/h2&gt;

&lt;p&gt;No contexto de &lt;strong&gt;Domain-Driven Design (DDD)&lt;/strong&gt;, o &lt;strong&gt;domínio&lt;/strong&gt; é, essencialmente, o coração do sistema. É a área de atuação ou o problema que o software foi criado para resolver. Pense no domínio como aquela parte do mundo real que o software tenta modelar e onde executa suas operações.&lt;/p&gt;

&lt;p&gt;Parece simples, né? E é um conceito que você vai encontrar em muitos livros e artigos. Mas, na prática, a aplicação desse conceito é tudo menos… linear.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entre livros e a realidade do dia a dia
&lt;/h2&gt;

&lt;p&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%2Fpqcpdbpujuj3rieoo8ak.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%2Fpqcpdbpujuj3rieoo8ak.png" alt="Image description" width="720" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uma das imagens mais famosas do DDD é a divisão clara entre subdomínios, cada um com seus próprios times (ou time) e sistemas bem organizados. Por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time A&lt;/strong&gt;: cuida de Optimal Acquisition, Purchasing, Inventory e Resource Planning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No mundo ideal, tudo estaria tão bem definido que o sistema rodaria como um relógio, com sinergia total entre os times e os domínios.&lt;/p&gt;

&lt;p&gt;Agora, vamos temperar isso com um pouco de realidade. Imagine que, na segunda semana do projeto, a empresa percebe que o Time A está sobrecarregado. Então, dividem o trabalho assim:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time B&lt;/strong&gt;: assume Purchasing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time C&lt;/strong&gt;: fica com Resource Planning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Algumas semanas depois, alguém do Time C sai da equipe, e eles precisam se fundir com o Time B, formando o Time BC. Para complicar ainda mais, o Time A transfere parte de Inventory para o Time BC.&lt;/p&gt;

&lt;p&gt;E aí fica a pergunta: &lt;strong&gt;seus sistemas aguentariam essas mudanças de time sem colapsar?&lt;/strong&gt; A forma como você constrói software permite flexibilidade para reorganizar partes do sistema sem muito esforço?&lt;/p&gt;

&lt;h2&gt;
  
  
  O que vejo por aí
&lt;/h2&gt;

&lt;p&gt;Embora a ideia de separar pastas em “models”, “views” e “controllers” esteja caindo em desuso, ainda vejo muitos projetos seguindo essa abordagem — só que com nomes diferentes. Uma unica pasta infrasctructure, com tudo dentro, por exempl.&lt;/p&gt;

&lt;p&gt;Mesmo que as literaturas mais famosas sobre DDD e clean architecture não sejam muito prescritivas sobre organização de pastas, muitos desenvolvedores tentam copiar essas estruturas diretamente, sem considerar se elas realmente fazem sentido no contexto do projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  O sistema não é só seu (e nem do seu time)
&lt;/h2&gt;

&lt;p&gt;Mudanças são inevitáveis. E, pensando nisso, gosto de construir sistemas baseados em módulos plug 'n play. Esses módulos devem ser coesos, com baixo acoplamento e fáceis de mover ou até mesmo deletar, se necessário.&lt;/p&gt;

&lt;p&gt;Para alcançar essa flexibilidade, é essencial entender que boa parte do código de infraestrutura deve se alinhar às necessidades do domínio. Essa relação próxima faz com que infraestrutura e domínio funcionem juntos como uma unidade lógica.&lt;/p&gt;

&lt;p&gt;Mas, além da infraestrutura e do domínio, há outro elemento importante no design dos meus sistemas: as bibliotecas (ou libs, cross cutting libs).&lt;/p&gt;

&lt;h2&gt;
  
  
  O papel das libs
&lt;/h2&gt;

&lt;p&gt;As libs são componentes standalone, ou seja, não dependem do domínio. Isso significa que elas podem ser reutilizadas em qualquer projeto, tornando o sistema mais modular e sustentável a longo prazo.&lt;/p&gt;

&lt;p&gt;No modelo básico, podemos visualizar assim:&lt;br&gt;
&lt;a href="https://miro.medium.com/v2/resize:fit:640/format:webp/1*2Yx38jXKm4wTRUqVCSE8ZQ.png" rel="noopener noreferrer"&gt;https://miro.medium.com/v2/resize:fit:640/format:webp/1*2Yx38jXKm4wTRUqVCSE8ZQ.png&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Porém, como frisei até aqui, gosto de mais uma camada separando as coias, camada de &lt;strong&gt;módulo&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modulos
&lt;/h2&gt;

&lt;p&gt;Os módulos desempenham um papel fundamental na estruturação de projetos, pois permitem agrupar funcionalidades relacionadas, promovendo coesão e encapsulamento. Eles facilitam a manutenção, tornam o código mais reutilizável e ajudam a manter a separação de responsabilidades clara e bem definida.&lt;/p&gt;

&lt;p&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%2Fggzejtr5kfkfw5xrgw0y.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%2Fggzejtr5kfkfw5xrgw0y.png" alt="Image description" width="569" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em um sistema maior, onde existem vários módulos, o desenho evolui para algo assim:&lt;/p&gt;

&lt;p&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%2Fnf4424bim6jjfapiajyk.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%2Fnf4424bim6jjfapiajyk.png" alt="Image description" width="800" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Regra de ouro: nada é compartilhado diretamente entre módulos. Isso mantém o sistema modular e reduz a complexidade de dependências.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que essa abordagem?
&lt;/h2&gt;

&lt;p&gt;Com essa organização, garantimos que:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Flexibilidade&lt;/strong&gt;: É fácil mover ou reaproveitar partes do sistema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reutilização&lt;/strong&gt;: Libs podem ser usadas em múltiplos projetos, economizando esforço.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolamento&lt;/strong&gt;: Problemas em um módulo não afetam outros diretamente.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Essa mentalidade ajuda a construir sistemas que acompanham as mudanças organizacionais e evoluem sem virar uma bola de neve técnica.&lt;/p&gt;

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

&lt;p&gt;No fim, não mostrei muito código aqui, mas tentei compartilhar uma visão sobre como as abordagens que escolhemos para estruturar nossos sistemas não são apenas técnicas: elas impactam diretamente e são impactadas pelo nosso dia a dia de trabalho.&lt;/p&gt;

&lt;p&gt;Cada decisão de design, desde a organização dos módulos até a reutilização de libs, reflete nas facilidades e nos desafios que enfrentamos em um projeto. Então, pensar na arquitetura como algo vivo e que deve acompanhar as mudanças da equipe e do negócio é o que nos ajuda a construir sistemas mais sustentáveis e adaptáveis.&lt;/p&gt;

&lt;p&gt;Espero que essa reflexão te inspire a olhar para suas escolhas arquiteturais com uma perspectiva prática e estratégica. Afinal, arquitetura de software é menos sobre diagramas e mais sobre preparar o terreno para evoluir sem perder o controle. 🚀&lt;/p&gt;

</description>
      <category>arquiteturadesoftwere</category>
      <category>desenvolvimentodesoftwere</category>
      <category>cleancode</category>
      <category>ddd</category>
    </item>
    <item>
      <title>GO — Estrutura de projetos</title>
      <dc:creator>Fabricio_Gonçalves</dc:creator>
      <pubDate>Tue, 18 Jun 2024 20:39:08 +0000</pubDate>
      <link>https://dev.to/espigah/go-estrutura-de-projetos-1j0k</link>
      <guid>https://dev.to/espigah/go-estrutura-de-projetos-1j0k</guid>
      <description>&lt;p&gt;Comecei a programar usando golang de verdade esse ano (2022), e a coisa que logo fiz foi procurar referências de como seria a melhor forma de evoluir minha estrutura para o projeto. Esse post será só mais um dentre tantos outros que falam do mesmo assunto, e, talvez até por isso, resolvi escrevê-lo.&lt;/p&gt;

&lt;p&gt;Primeiro que golang já é todo diferentoso na forma que lida com pastas/packages, e, pra melhorar, tem uma essência bastante opinativa, com muitas docs oficiais informando como seria o “goway” de se fazer algo (cheio de não me toque), entretanto, na forma que você vai organizar seus arquivos e pastas, não tem bem um direcionamento, então, meio que cada um dá a sua interpretação de mundo pra essa parte.&lt;/p&gt;

&lt;p&gt;Irei dividir esse post em 3 referências e depois mostrar como ficou a mistura dessas referências no projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Primeira referência
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Um sistema complexo que funciona invariavelmente evoluiu de um sistema simples que funcionou.&lt;br&gt;
-- Lei de Gall&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para pequenas aplicação a estrutura do projeto deve ser simples.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A346%2F1%2A_zTyOnU7yCe9wl4a1AZlAg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A346%2F1%2A_zTyOnU7yCe9wl4a1AZlAg.png" alt="Imagem para um projeto simples com tudo na raiz"&gt;&lt;/a&gt;&lt;br&gt;&lt;a href="https://innovation.enova.com/gophercon-2018-how-do-you-structure-your-go-apps/" rel="noopener noreferrer"&gt;https://innovation.enova.com/gophercon-2018-how-do-you-structure-your-go-apps/&lt;/a&gt;
  &lt;/p&gt;

&lt;h2&gt;
  
  
  Segunda referência
&lt;/h2&gt;

&lt;p&gt;A “comunidade” fez um levantamento de um conjunto de padrões de layout de projeto históricos e emergentes comuns no ecossistema Go. Nesse levante tem muita coisa bacana, mas o que me chamou a atenção foram as pastas &lt;code&gt;/cmd&lt;/code&gt; e &lt;code&gt;/internal&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  /cmd
&lt;/h3&gt;

&lt;p&gt;Principais aplicações para este projeto.&lt;br&gt;
O nome do diretório para cada aplicativo deve corresponder ao nome do executável que você deseja ter(ex.: /cmd/myapp).&lt;/p&gt;

&lt;h3&gt;
  
  
  /internal
&lt;/h3&gt;

&lt;p&gt;Aplicativo privado e código de biblioteca. Este é o código que você não quer que outros importem em seus aplicativos ou bibliotecas. Observe que esse padrão de layout é imposto pelo próprio compilador Go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Terceira referência
&lt;/h2&gt;

&lt;p&gt;Arquiteturas que separam melhor os “detalhes” do que realmente entrega valor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A300%2F0%2A6endj9h0yHQcrwpY.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A300%2F0%2A6endj9h0yHQcrwpY.png" alt="Imagem mostrando que a infra esta envolvendo o domínio"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;h2&gt;
  
  
  Resultado
&lt;/h2&gt;

&lt;p&gt;Para aplicação simples tento manter simples, contudo, quando o escopo fica um pouco maior, tento fazer uma leve diferenciação do que é “core”/domain do que é detalhe/infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A201%2F1%2AcAqVTwIsa--ZW2IOKvi3WQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A201%2F1%2AcAqVTwIsa--ZW2IOKvi3WQ.png" alt="Imagem mostrando uma pasta para infra e outra para domínio"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;Notem que no &lt;em&gt;cmd&lt;/em&gt; não tenho a pasta tuttipet, como sugere o projeto de referência. No começo eu tentei usar o padrão sugerido, mas como esta API já saiu com uma interface de linha de comando e um provider para terraform resolvi deixar desta forma.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A521%2F1%2AEZWz2j9gY4NRSLY7ChQ9Jw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A521%2F1%2AEZWz2j9gY4NRSLY7ChQ9Jw.png" alt="Imagem mostrando os arquivos dentro da pasta domínio"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;Dando um rápido zoom no core. Tento ser simplista aqui e não criar pastas. Mantenho somente 1 ponto de contato com o mundo externo (main.go), o que for generalizado tem seu próprio arquivo e o que não for fica dentro do seu contexto, simples.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A446%2F1%2Al0SOZMv7hsEYnkTbYTQU6g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A446%2F1%2Al0SOZMv7hsEYnkTbYTQU6g.png" alt="Imagem mostrando o tuttipet"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;Com o tuttipet.New (curto, conciso e evocativo) a camada “suja” consegue interagir com os usecases (acho a palavra usecase mais fácil de assimilar que interactor)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A500%2Fformat%3Awebp%2F1%2ArzfpebxLUEokne63Pvs5Ag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A500%2Fformat%3Awebp%2F1%2ArzfpebxLUEokne63Pvs5Ag.png" alt="Imagem mostrando as pasta dentro de infra"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;Dando um rápido zoom nos detalhes. Aqui simplesmente estão as ferramentas pelas quais o domínio vai conseguir o seu sucesso.&lt;/p&gt;

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

&lt;p&gt;Ainda sou pimpolho nos caminho que golang oferece, ainda tateando o que dá pra fazer com ele, no entanto, mesmo sem gostar do jeitinho Go de fazer algumas coisa, o mesmo tem se mostrado bastante simples e robusto.&lt;/p&gt;

&lt;p&gt;Resumo, tentando deixar simples quando dê e se ficar complexo de mais … volto pra prancheta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Outras referências
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/booscaaa/implementando-clean-architecture-com-golang-4n0a"&gt;https://dev.to/booscaaa/implementando-clean-architecture-com-golang-4n0a&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/golang-standards/project-layout" rel="noopener noreferrer"&gt;https://github.com/golang-standards/project-layout&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.boot.dev/golang/golang-project-structure/" rel="noopener noreferrer"&gt;https://blog.boot.dev/golang/golang-project-structure/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/bnkamalesh/goapp" rel="noopener noreferrer"&gt;https://github.com/bnkamalesh/goapp&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.wolfe.id.au/2020/03/10/how-do-i-structure-my-go-project/" rel="noopener noreferrer"&gt;https://www.wolfe.id.au/2020/03/10/how-do-i-structure-my-go-project/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.logrocket.com/flat-structure-vs-layered-architecture-structuring-your-go-app/" rel="noopener noreferrer"&gt;https://blog.logrocket.com/flat-structure-vs-layered-architecture-structuring-your-go-app/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://developer20.com/how-to-structure-go-code/" rel="noopener noreferrer"&gt;https://developer20.com/how-to-structure-go-code/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/jinxankit/go-project-structure-and-guidelines-4ccm"&gt;https://dev.to/jinxankit/go-project-structure-and-guidelines-4ccm&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/bxcodec/go-clean-arch" rel="noopener noreferrer"&gt;https://github.com/bxcodec/go-clean-arch&lt;/a&gt;&lt;br&gt;
&lt;a href="https://golangexample.com/example-go-clean-architecture-folder-pattern/" rel="noopener noreferrer"&gt;https://golangexample.com/example-go-clean-architecture-folder-pattern/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.calhoun.io/flat-application-structure/" rel="noopener noreferrer"&gt;https://www.calhoun.io/flat-application-structure/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://go.dev/doc/effective_go#names" rel="noopener noreferrer"&gt;https://go.dev/doc/effective_go#names&lt;/a&gt;&lt;br&gt;
&lt;a href="https://go.dev/blog/package-names" rel="noopener noreferrer"&gt;https://go.dev/blog/package-names&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Post original: &lt;a href="https://medium.com/@espigah/go-layout-do-projeto-18aacce8089d" rel="noopener noreferrer"&gt;https://medium.com/@espigah/go-layout-do-projeto-18aacce8089d&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>tips</category>
      <category>architecture</category>
    </item>
    <item>
      <title>On-Call Cookbook</title>
      <dc:creator>Fabricio_Gonçalves</dc:creator>
      <pubDate>Mon, 03 Jun 2024 12:23:28 +0000</pubDate>
      <link>https://dev.to/espigah/on-call-cookbook-2j24</link>
      <guid>https://dev.to/espigah/on-call-cookbook-2j24</guid>
      <description>&lt;h3&gt;
  
  
  On-Call Cookbook
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Objetivo
&lt;/h4&gt;

&lt;p&gt;Este cookbook fornece diretrizes práticas para a organização de um esquema de on-call(guardião, plantão, motorista da rodada e etc) eficiente e resiliente, com base nas melhores práticas de Site Reliability Engineering (SRE).&lt;/p&gt;

&lt;p&gt;Se você quiser saber mais sobre On-Call, sugiro a leitura do &lt;a href="https://dev.to/espigah/desvendando-o-mundo-do-on-call-desafios-e-estrategias-para-uma-operacao-eficiente-33bk"&gt;post anterior&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Definição e Escopo
&lt;/h4&gt;

&lt;p&gt;O on-call durante o expediente refere-se a períodos em que os membros da equipe estão disponíveis para responder a incidentes e alertas durante o horário de trabalho normal. Isso difere de sobreaviso ou plantão, que geralmente envolvem disponibilidade fora do horário de trabalho.&lt;/p&gt;

&lt;h3&gt;
  
  
  Coisas que uma Pessoa de On-Call Deve Fazer
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Monitoramento de Sistemas:&lt;/strong&gt; Verifique painéis de monitoramento e responda a alertas de desempenho, disponibilidade e erros.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responder a Incidentes:&lt;/strong&gt; Responda prontamente a alertas e chamados, diagnostique e resolva problemas rapidamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comunicação:&lt;/strong&gt; Mantenha uma comunicação clara e eficiente com a equipe, stakeholders e outros departamentos afetados pelos incidentes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentação:&lt;/strong&gt; Documente os incidentes e as ações tomadas para resolvê-los, para referência futura e aprendizado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Análise de Logs:&lt;/strong&gt; Analise logs de servidores, aplicações e redes para identificar causas raiz de problemas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalonamento de Problemas:&lt;/strong&gt; Saiba quando e como escalar problemas para níveis superiores ou outras equipes especializadas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manutenção Preventiva:&lt;/strong&gt; Realize verificações regulares de sistemas e infraestrutura para prevenir problemas antes que eles ocorram.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atualizações e Patches:&lt;/strong&gt; Aplique atualizações e patches de segurança para manter o ambiente seguro e estável.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backup e Recuperação:&lt;/strong&gt; Garanta que os backups estejam sendo feitos corretamente e teste os processos de recuperação.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revisão Pós-Incidente:&lt;/strong&gt; Participe de revisões pós-incidente para analisar o que aconteceu e como melhorar no futuro.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Formas de Organizar o On-Call
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Escalas Rotativas:&lt;/strong&gt; Crie um cronograma de on-call rotativo para distribuir a carga de trabalho de maneira justa entre todos os membros da equipe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ferramentas de Monitoramento e Alerta:&lt;/strong&gt; Utilize ferramentas para gerenciar alertas e escalonamentos de forma eficiente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runbooks e Playbooks:&lt;/strong&gt; Desenvolva e mantenha runbooks e playbooks detalhados para guiar a equipe de on-call em diferentes tipos de incidentes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reuniões Regulares:&lt;/strong&gt; Realize reuniões regulares de revisão de on-call para discutir incidentes recentes, melhorias no processo e feedback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treinamento e Desenvolvimento:&lt;/strong&gt; Prover treinamentos contínuos para a equipe de on-call, incluindo simulações de incidentes e workshops de novas tecnologias ou processos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentação Centralizada:&lt;/strong&gt; Mantenha uma base de conhecimento centralizada onde todos os procedimentos, runbooks e documentação de sistemas estejam acessíveis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Balanceamento de Carga:&lt;/strong&gt; Analise a carga de incidentes e ajuste as escalas de on-call para garantir que nenhum membro da equipe fique sobrecarregado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ferramentas de Comunicação:&lt;/strong&gt; Utilize ferramentas de comunicação eficientes para coordenar a resposta a incidentes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedback Contínuo:&lt;/strong&gt; Implemente um sistema de feedback contínuo para que os membros da equipe possam sugerir melhorias e relatar problemas com o processo de on-call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatização:&lt;/strong&gt; Automatize tarefas repetitivas e processos de monitoramento para reduzir a carga de trabalho manual durante os períodos de on-call.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Hands-On / Hands-Off
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Transferência de Conhecimento:&lt;/strong&gt; No período de hands-off, compartilhe informações detalhadas sobre quaisquer problemas em andamento ou potenciais riscos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentação Atualizada:&lt;/strong&gt; Assegure que toda a documentação relevante está atualizada e acessível antes de finalizar o turno.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Briefing de Transferência:&lt;/strong&gt; Realize um briefing rápido para o próximo on-call, destacando pontos críticos e status atual.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evitar o Término no Último Dia da Semana:&lt;/strong&gt; Planeje o término do on-call para o meio da semana, como quarta ou quinta-feira, para facilitar a transição de responsabilidades e permitir tempo para resolver problemas em andamento antes do final de semana.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Seguindo estas práticas, você poderá criar um ambiente on-call eficiente e resiliente, garantindo que sua equipe esteja bem preparada para lidar com incidentes e manter a alta disponibilidade dos sistemas.&lt;/p&gt;

</description>
      <category>sre</category>
      <category>devops</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Definindo SLO - "Let Go!"</title>
      <dc:creator>Fabricio_Gonçalves</dc:creator>
      <pubDate>Tue, 21 May 2024 15:11:54 +0000</pubDate>
      <link>https://dev.to/espigah/definindo-slo-let-go-5ahl</link>
      <guid>https://dev.to/espigah/definindo-slo-let-go-5ahl</guid>
      <description>&lt;h1&gt;
  
  
  Let Go!
&lt;/h1&gt;

&lt;p&gt;Na trajetória da Engenharia de Confiabilidade (SRE), uma dificuldade inicial pode residir na evangelização das práticas, em especial na definição de Objetivos de Nível de Serviço (SLO). Com base na inspiração proporcionada pelo modelo VALET da The Home Depot, apresento a proposta do padrão “Let Go!” como uma opção acessível para aqueles que estão iniciando e necessitam de uma abordagem simplificada para que todos possam assimilar.&lt;/p&gt;

&lt;p&gt;Antes que qualquer projeto seja lançado, é imprescindível conquistar o selo mínimo de aprovação “Go!”. Para atingir esse marco, é essencial definir e docuemntar o “Let”.&lt;/p&gt;

&lt;h2&gt;
  
  
  L — Latency
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O serviço responde rapidamente quando eu o uso?
Quão rápido meu serviço tem que ser?&lt;/li&gt;
&lt;li&gt;O que faremos se o serviço estiver demorando mais que o esperado?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  E — Errors
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O serviço gera um erro quando eu o uso?&lt;/li&gt;
&lt;li&gt;O que faremos se o serviço estiver com mais erro que o esperado?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  T — Traffic
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Quanto volume de negócios meu serviço pode suportar?&lt;/li&gt;
&lt;li&gt;O que faremos se o volume for maior (ou muito menor) que o esperado?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A adoção do padrão "Let Go!" pode ser um ponto de virada na implementação eficaz da Engenharia de Confiabilidade (SRE), proporcionando uma estrutura clara e concisa para novos projetos. Estabelecer e documentar parâmetros de Latency, Errors e Traffic permite não apenas a medição objetiva da performance do serviço, mas também a definição de ações proativas para manter a confiabilidade. Com este padrão, equipes podem navegar com mais segurança nas etapas iniciais de um projeto, garantindo que cada serviço lançado atenda aos requisitos mínimos de desempenho e resiliência. Assim, o "Let Go!" não apenas simplifica a complexidade inicial, mas também estabelece uma base sólida para a evolução contínua das práticas de SRE dentro da organização.&lt;/p&gt;

</description>
      <category>engenhariadeconfiabilidade</category>
      <category>sre</category>
      <category>letgo</category>
      <category>confiabilidade</category>
    </item>
    <item>
      <title>Desvendando o Mundo do On-call: Desafios e Estratégias para uma Operação Eficiente</title>
      <dc:creator>Fabricio_Gonçalves</dc:creator>
      <pubDate>Wed, 22 Nov 2023 12:03:12 +0000</pubDate>
      <link>https://dev.to/espigah/desvendando-o-mundo-do-on-call-desafios-e-estrategias-para-uma-operacao-eficiente-33bk</link>
      <guid>https://dev.to/espigah/desvendando-o-mundo-do-on-call-desafios-e-estrategias-para-uma-operacao-eficiente-33bk</guid>
      <description>&lt;p&gt;Estar de &lt;em&gt;on-call&lt;/em&gt;, também conhecido como plantão, guardião ou suporte, é uma atividade crucial para assegurar a disponibilidade e confiabilidade dos sistemas de produção. Embora essencial, essa prática complexa e desafiadora pode ter um impacto significativo na vida pessoal e profissional dos envolvidos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evolução nas Responsabilidades e Distribuição de Tarefas
&lt;/h2&gt;

&lt;p&gt;Tradicionalmente, administradores de sistemas e engenheiros de operações eram encarregados do &lt;em&gt;on-call&lt;/em&gt;, com o desenvolvimento "jogando" o projeto para o time de operações. Contudo, a abordagem &lt;em&gt;"you build, you run it"&lt;/em&gt; ganhou força, exigindo que os desenvolvedores assumam a responsabilidade pela manutenção do que entregam. Em alguns casos, equipes plantão(NOC, SRE e etc)  podem fazer triagens, seguindo &lt;em&gt;runbooks&lt;/em&gt; antes de escalar para o time principal.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Essência de Estar de Plantão
&lt;/h2&gt;

&lt;p&gt;Estar de &lt;em&gt;on-call&lt;/em&gt; vai além de simplesmente corrigir problemas de produção. Alinhado com práticas DevOps, inclui a automação de tarefas, diagnóstico, mitigação, correção e escalonamento de incidentes. A pessoa de &lt;em&gt;on-call&lt;/em&gt; não apenas lida com o ciclo de vida do incidente, mas também realiza tarefas de produção não urgentes, promovendo oportunidades de aprendizado e compartilhamento de conhecimento com a equipe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modus Operandi na Prática
&lt;/h2&gt;

&lt;p&gt;Ao receber um alerta ou chamado, a pessoa de &lt;em&gt;on-call&lt;/em&gt; tria o problema e trabalha para sua resolução, sendo a primeira linha de defesa para garantir interrupções mínimas. Contudo, estar de &lt;em&gt;on-call&lt;/em&gt; não implica ser um herói; a configuração ideal envolve uma abordagem colaborativa, onde a triagem inicial é seguida por escalonamentos conforme necessário. Além disso, é crucial aprimorar continuamente o trabalho diário (DevOps), onde a pessoa responsável pelo plantão (on-call) desempenha um papel fundamental para garantir que o amanhã seja ainda melhor do que o hoje.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manter-se Bem e Ponderado
&lt;/h2&gt;

&lt;p&gt;Para desempenhar efetivamente, é crucial manter a calma e a clareza mental. Embora existam duas abordagens de pensamento - ação intuitiva e funções cognitivas racionais - em sistemas complexos, a segunda tende a produzir melhores resultados. Portanto, estar em um estado calmo e racional é fundamental para resolver problemas de forma eficaz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reduzindo a Carga Cognitiva com Diretrizes Claras
&lt;/h2&gt;

&lt;p&gt;Diretrizes precisas são essenciais para as responsabilidades de &lt;em&gt;on-call&lt;/em&gt;, desde a leitura do &lt;em&gt;handoff&lt;/em&gt; anterior até a escalada de incidentes após um tempo pré-determinado. Procedimentos bem definidos abrangem o gerenciamento de incidentes, escalonamento, redação de post-mortems, execução de &lt;em&gt;runbooks&lt;/em&gt; e trocas de &lt;em&gt;on-call&lt;/em&gt; a curto prazo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rotação Eficiente e Seus Benefícios
&lt;/h2&gt;

&lt;p&gt;Uma rotação eficaz proporciona maior transparência, responsabilidade e confiabilidade nos serviços. Isso resulta em respostas rápidas a alertas, clientes mais satisfeitos e uma equipe mais coesa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Desafios e Estratégias de Atenuação
&lt;/h2&gt;

&lt;p&gt;Além dos benefícios, o &lt;em&gt;on-call&lt;/em&gt; apresenta desafios, como impactos na vida pessoal, exigências técnicas e pressão psicológica. Estratégias para atenuar esses desafios incluem mensuração da sobrecarga operacional, controle de alertas e garantia de tempo adequado para lidar com incidentes, evitando atropelos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão: Um Mundo Desafiador, Mas Gerenciável
&lt;/h2&gt;

&lt;p&gt;Estar de &lt;em&gt;on-call&lt;/em&gt; é uma responsabilidade complexa, mas com estratégias claras, comunicação eficaz e uma abordagem colaborativa, é possível enfrentar os desafios e garantir a estabilidade dos sistemas críticos. A busca contínua por melhores práticas e o equilíbrio entre trabalho e bem-estar são fundamentais para uma operação de &lt;em&gt;on-call&lt;/em&gt; eficiente e sustentável.&lt;/p&gt;

&lt;p&gt;E aí, curtiu? Eu adoraria saber: como você e sua equipe superam os desafios e contratempos? &lt;/p&gt;

&lt;p&gt;vlw!&lt;/p&gt;

</description>
      <category>sre</category>
      <category>devops</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Mantenha o foco em entregar valor com DevOps, SRE e FinOps</title>
      <dc:creator>Fabricio_Gonçalves</dc:creator>
      <pubDate>Sun, 26 Feb 2023 11:43:33 +0000</pubDate>
      <link>https://dev.to/espigah/mantenha-o-foco-em-entregar-valor-com-devops-sre-e-finops-3j0e</link>
      <guid>https://dev.to/espigah/mantenha-o-foco-em-entregar-valor-com-devops-sre-e-finops-3j0e</guid>
      <description>&lt;p&gt;Nesse texto irei trazer algumas coisas que demorei a aprender na trilha que segui de desenvolvimento de software, talvez por não ter seguido um caminho mais “tradicional”, ou talvez porque não se vê tantos holofotes/clickbaits sobre esses assuntos para quem escolheu o caminho de transformar café em código.&lt;/p&gt;

&lt;p&gt;Quantos blogs sobre a melhor forma de usar a memória na tecnologia X você já viu? Um vídeo sobre melhor estrutura de dados para o problema Y? Alguém falando no passarinho azul que você deveria prestar atenção nas melhorias assintóticas? &lt;/p&gt;

&lt;p&gt;Mas quantos falam sobre confiabilidade? Ou sobre maximizar o retorno sobre o investimento? Que te ensinam a transformar o seu ambiente para que todos trabalhem focados em entregar valor? &lt;/p&gt;

&lt;p&gt;Talvez o que tenha me levado a ser um programador um cado melhor não foi saber extrair até a última gota de suco que um framewok pode dar, talvez tenha sido algo mais simples, talvez até mais obvio, talvez tenha sido o fato de eu ter aprendido que devemos resolver o problema considerando a perspectiva do usuário/cliente e a perspectiva de quem paga para manter o sistema de pé.&lt;/p&gt;

&lt;p&gt;Aqui entra o kit de ferramentas que no início costumamos deixar para trás, e, estranhamente, depois temos um certa resistência em voltar para buscar esse tal kit, ou simplesmente, talvez por conta de como a mídia/mercado lida com ele, não damos a devida atenção, apesar disso, esse kit é o que traz a &lt;em&gt;transformação&lt;/em&gt;. Aqui entram as ferramentas que vem com a cultura DevOps, as práticas de SRE e os princípios do FinOps.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;A cultura DevOps&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Muito se fala em DevOps, mas colocar toda a teoria em pratica não é trivial. Você facilmente verá vagas DevOps que estarão pedindo conhecimentos em alguma FERRAMENTA de CI/CD, FERRAMENTA disso e FERRAMENTA daquilo. Talvez por isso que essa “cultura”, quase que ironicamente, tem ficado distante do mundinho das pessoas desenvolvedoras, onde muitas vezes ainda se joga o pacotinho por cima do muro e o detentor do conhecimento sobre a FERRAMENTA de sustentação que acaba ficando com a carga da operação.&lt;/p&gt;

&lt;p&gt;O DevOps até pode ser isso sim, todavia, como cultura, deve ajudar a alinhar pessoas, processos e ferramentas para um foco mais direcionado ao cliente. Como cultura, não deve ser de um time, não deve ser de uma pessoa. Você, todos os dias, pode praticar essa cultura, você pode ser a pessoa que está em busca de aumentar a transparência, a comunicação e a colaboração.&lt;/p&gt;

&lt;h3&gt;
  
  
  Algumas das principais práticas de DevOps incluem:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Colaboração: DevOps enfatiza a necessidade de as equipes trabalharem juntas de forma integrada, quebrando silos e promovendo uma cultura de colaboração entre os departamentos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automação: DevOps enfatiza o uso de ferramentas e processos de automação para agilizar o desenvolvimento, teste e implantação, reduzindo a probabilidade de erro humano e melhorando a eficiência.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integração Contínua: DevOps promove a integração contínua de alterações de código, permitindo que as equipes detectem e resolvam problemas no início do processo de desenvolvimento.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Entrega contínua: o DevOps enfatiza a importância da entrega contínua, permitindo que as equipes lancem software com rapidez e confiança.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Continuous Deployment: DevOps promove o uso de continuous deploy, permitindo que as equipes liberem alterações de código de forma automática e contínua, sem a necessidade de intervenção humana.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Teste: DevOps enfatiza a necessidade de testes completos durante todo o ciclo de vida do desenvolvimento de software, garantindo que o software seja confiável, seguro e de alta qualidade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Monitoramento: o DevOps enfatiza a importância do monitoramento de software na produção, permitindo que as equipes detectem e resolvam rapidamente os problemas à medida que surgem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Segurança&lt;/em&gt;: DevOps coloca uma forte ênfase na segurança em todo o ciclo de vida do desenvolvimento de software, garantindo que o software esteja seguro e protegido contra ameaças potenciais. (DevSecOps é quase um pleonasmo)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aprendendo com as falhas: DevOps promove uma cultura de aprendizado e melhoria contínua, incentivando as equipes a aprender com as falhas e fazer melhorias iterativas ao longo do tempo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Melhoria do trabalho diário: DevOps incentiva as equipes a melhorar continuamente seus processos de trabalho diários, buscando maior eficiência e eficácia em todos os aspectos do ciclo de vida do desenvolvimento de software.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Referências:&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com.br/Accelerate-Software-Performing-Technology-Organizations/dp/1942788339/ref=pd_bxgy_img_sccl_2/135-5440031-7659961?pd_rd_w=XoYik&amp;amp;content-id=amzn1.sym.57f5b0c5-8f2e-45a4-8595-2eb0fcbe85cd&amp;amp;pf_rd_p=57f5b0c5-8f2e-45a4-8595-2eb0fcbe85cd&amp;amp;pf_rd_r=Z4STKJARY0ZM7VRBEWTJ&amp;amp;pd_rd_wg=gKi5O&amp;amp;pd_rd_r=0656e1dd-435f-4305-a94c-502b3c5b702c&amp;amp;pd_rd_i=1942788339&amp;amp;psc=1"&gt;Accelerate: The Science of Lean Software and DevOps: Building and Scaling High Performing Technology Organizations&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com.br/DevOps-Handbook-World-Class-Reliability-Organizations/dp/1942788002"&gt;The DevOps Handbook: How to Create World-Class Agility, Reliability, and Security in Technology Organizations&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com.br/Phoenix-Project-DevOps-Helping-Business/dp/1942788290/ref=d_pd_sbs_sccl_2_3/135-5440031-7659961?pd_rd_w=X76RX&amp;amp;content-id=amzn1.sym.d5ffa5eb-c14b-4098-a3c1-e33e4cc20b5c&amp;amp;pf_rd_p=d5ffa5eb-c14b-4098-a3c1-e33e4cc20b5c&amp;amp;pf_rd_r=EDNPANTA7VMCETSHM0JR&amp;amp;pd_rd_wg=DzPwK&amp;amp;pd_rd_r=6604e900-fe05-4323-b5bc-6074aa00bccc&amp;amp;pd_rd_i=1942788290&amp;amp;psc=1"&gt;The Phoenix Project: A Novel about It, Devops, and Helping Your Business Win&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com.br/Unicorn-Project-Developers-Disruption-Thriving/dp/1942788762/ref=pd_bxgy_img_sccl_2/135-5440031-7659961?pd_rd_w=imjpE&amp;amp;content-id=amzn1.sym.57f5b0c5-8f2e-45a4-8595-2eb0fcbe85cd&amp;amp;pf_rd_p=57f5b0c5-8f2e-45a4-8595-2eb0fcbe85cd&amp;amp;pf_rd_r=TYVSMPR5F58V049SQDC1&amp;amp;pd_rd_wg=M75t3&amp;amp;pd_rd_r=992e99e9-ef1d-41ae-8877-1db8a65532bb&amp;amp;pd_rd_i=1942788762&amp;amp;psc=1"&gt;The Unicorn Project&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;As práticas de SRE&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;SRE vai no mesmo caminho de DevOps, dado que o próprio Google inicia o livro com &lt;code&gt;class SRE implements interface DevOps&lt;/code&gt; não seria surpresa esse caminho, contudo não se trata de manter FERRAMENTAS de observabilidade ou FERRAMENTA XPTO, tampouco pra ser a operação com uma nova roupagem. SRE emerge das práticas de engenharia para mudar todo o ciclo de vida de desenvolvimento de sistemas (SDLC). No kit de ferramentas de SRE você vai ter o seu usuário/cliente no centro da discussão. Você vai aprender que a esperança não é uma estratégia, então, com isso, você precisa responder a seguinte pergunta:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Com que seus usuários/clientes se importam?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Se você não tem esse resposta, não adianta nenhum código, não adianta nenhuma metodologia ágil hypada. Sem essa resposta é tiro no escuro. Em suma, aqui você vai adquirir ferramentas para construir o projeto confiável e manter-lo saudável em produção.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;SLA&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Se alguma demanda chegou para ser feita sem que fique claro a volumetria, tempo máximo que uma operação pode ser executada e quantidade de erros máximos tolerados (existem muitos outros SLIs para seus SLAs, mas não é o foco aqui), provavelmente não estamos com um SLA bem definido, ou seja, provavelmente não estamos nos esforçando para ter uma métrica que corresponda, mesmo que de forma imprecisa, a satisfação do nosso usuário/cliente. Sem SLA não estaremos prontos para criar mecanismos de defesa(SLO) para que os problemas não impactem negativamente a receita.&lt;/p&gt;

&lt;h3&gt;
  
  
  Algumas das principais práticas do SRE incluem:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Objetivos de nível de serviço (SLOs): defina objetivos claros e mensuráveis para a disponibilidade, latência e desempenho de seus sistemas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Orçamentos de erro: Use SLOs para definir orçamentos de erro, que definem o nível aceitável de degradação do serviço que pode ocorrer sem afetar os usuários.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automação: Automatize o máximo possível para reduzir o risco de erro humano e melhorar a confiabilidade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Monitoramento: Monitore seus sistemas continuamente para detectar e diagnosticar problemas rapidamente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resposta a incidentes: Desenvolva um processo de resposta a incidentes claro e bem documentado para minimizar o tempo de inatividade e mitigar o impacto das falhas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Revisão pós-incidente: Conduza revisões completas pós-incidente para identificar as causas principais das falhas e evitar que elas ocorram novamente no futuro.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Referências:&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com.br/Engenharia-Confiabilidade-Google-Administra-Sistemas/dp/8575225170"&gt;Engenharia de Confiabilidade do Google: Como o Google Administra Seus Sistemas de Produção&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com.br/Site-Reliability-Workbook-Betsy-Beyer/dp/1492029505/ref=asc_df_1492029505/?tag=googleshopp00-20&amp;amp;linkCode=df0&amp;amp;hvadid=379795170134&amp;amp;hvpos=&amp;amp;hvnetw=g&amp;amp;hvrand=17478923460081924050&amp;amp;hvpone=&amp;amp;hvptwo=&amp;amp;hvqmt=&amp;amp;hvdev=c&amp;amp;hvdvcmdl=&amp;amp;hvlocint=&amp;amp;hvlocphy=9100838&amp;amp;hvtargid=pla-487962114669&amp;amp;psc=1"&gt;The Site Reliability Workbook: Practical Ways to Implement SRE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com.br/Seeking-SRE-David-Blank-edelman/dp/1491978864/ref=asc_df_1491978864/?tag=googleshopp00-20&amp;amp;linkCode=df0&amp;amp;hvadid=379726163686&amp;amp;hvpos=&amp;amp;hvnetw=g&amp;amp;hvrand=17478923460081924050&amp;amp;hvpone=&amp;amp;hvptwo=&amp;amp;hvqmt=&amp;amp;hvdev=c&amp;amp;hvdvcmdl=&amp;amp;hvlocint=&amp;amp;hvlocphy=9100838&amp;amp;hvtargid=pla-525340042043&amp;amp;psc=1"&gt;Seeking Sre: Conversations about Running Production Systems at Scale&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com.br/Database-Reliability-Engineering-Laine-Campbell/dp/1491925949/r"&gt;Database Reliability Engineering: Designing and Operating Resilient Database Systems&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com.br/Microsservi%C3%A7os-Prontos-Para-Produ%C3%A7%C3%A3o-Padronizados/dp/8575226215/ref=pd_bxgy_img_sccl_1/135-5440031-7659961?pd_rd_w=KCkdY&amp;amp;content-id=amzn1.sym.57f5b0c5-8f2e-45a4-8595-2eb0fcbe85cd&amp;amp;pf_rd_p=57f5b0c5-8f2e-45a4-8595-2eb0fcbe85cd&amp;amp;pf_rd_r=MF3ZM7Y3C99BDXBJ45X0&amp;amp;pd_rd_wg=j922C&amp;amp;pd_rd_r=48786a6c-8585-4ced-9bf1-ca2548240a4f&amp;amp;pd_rd_i=8575226215&amp;amp;psc=1"&gt;Microsserviços Prontos Para a Produção: Construindo Sistemas Padronizados em uma Organização de Engenharia de Software&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Os princípios do FinOps&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;É uma prática comum no mercado que a gestão do custo da nuvem seja centralizada em uma área. Essas informações de custo são passadas ao setor financeiro, que tenta se manter atualizado sobre o custo dos próximos meses da nuvem.&lt;/p&gt;

&lt;p&gt;Assim como na era Dev vs Ops, já ficou claro que essa fluxo não é sustentável, precisamos nos conscientizar que nossas aplicações são (ou deveriam ser) da responsabilidade de quem constrói, lembra “&lt;strong&gt;you build it, you run it”?,&lt;/strong&gt; então por que a responsabilidade sobre custos e de como maximizar o retorno sobre o investimento não deveria ficar com quem desenvolve?&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Mudança cultural&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Existe toda uma jornada FinOps para ser aplicada, e assim como DevOps, também há uma barreira cultural. FinOps trata de remover silos e bloqueadores, capacitar os times de engenharia para fornecer melhores recursos, aplicativos e migrações com mais eficiência; também traz uma conversa multifuncional sobre onde e quando investir, deixando claro para todos porque estão tomando essas decisões.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aqui estão alguns dos princípios-chave do FinOps:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Responsabilidade: Cada equipe e indivíduo deve ser responsável pelos custos que incorrer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Responsabilidade: Equipes e indivíduos devem ser responsabilizados por seus gastos e devem ter visibilidade do impacto de suas decisões no orçamento geral.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Proatividade: é importante identificar e resolver possíveis problemas de custo antes que eles se tornem um problema.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Eficiência: Otimize os gastos usando os recursos mais econômicos e eliminando o desperdício.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transparência: tornar os custos visíveis e compreensíveis para todos na organização.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Colaboração: promova a colaboração entre as equipes para garantir que os custos sejam gerenciados de forma eficaz em toda a organização.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Referências:&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.finops.org/"&gt;FinOps Foundation — What is FinOps?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/pt/blogs/aws-cloud-financial-management/tag/finops/"&gt;AWS Cloud Financial Management&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/wellarchitected/latest/cost-optimization-pillar/welcome.html"&gt;Cost Optimization Pillar — AWS Well-Architected Framework&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Extreme programming (XP) [bônus]
&lt;/h2&gt;

&lt;p&gt;XP é uma metodologia ágil de desenvolvimento de software que se concentra na entrega rápida e contínua de software de alta qualidade. A metodologia XP enfatiza que o software atenda às &lt;strong&gt;necessidades do cliente&lt;/strong&gt; e seja desenvolvido de forma eficiente. A metodologia XP já está meio fora de moda, eu sei, mas justamente por isso que escolhi colocá-la nessa lista. Pra tentar mostrar que quase todas as soluções, em algum ponto, passam pelo cliente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Práticas da XP:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cliente presente: O cliente está envolvido no processo de desenvolvimento do início ao fim, trabalhando de perto com a equipe de desenvolvimento para garantir que o software atenda às suas necessidades.&lt;/li&gt;
&lt;li&gt;Comunicação constante: A comunicação é uma parte essencial do XP, com desenvolvedores trabalhando em pares e se comunicando regularmente com o cliente para garantir que os requisitos do projeto sejam compreendidos.&lt;/li&gt;
&lt;li&gt;Desenvolvimento iterativo e incremental: O desenvolvimento é feito em pequenas iterações, com cada iteração resultando em um software funcional que pode ser testado pelo cliente.&lt;/li&gt;
&lt;li&gt;Testes contínuos: A equipe de desenvolvimento escreve testes automatizados para cada parte do código, garantindo que o software seja testado continuamente.&lt;/li&gt;
&lt;li&gt;Integração contínua: As atualizações de código são integradas continuamente ao projeto principal, permitindo que a equipe de desenvolvimento monitore as alterações e corrija quaisquer problemas que surgirem.&lt;/li&gt;
&lt;li&gt;Design simples: O design do software é mantido simples e fácil de entender, com a equipe de desenvolvimento se concentrando em criar um software funcional em vez de recursos complexos.&lt;/li&gt;
&lt;li&gt;Refatoração de código: O código é continuamente refinado e melhorado para garantir sua qualidade e manutenibilidade.&lt;/li&gt;
&lt;li&gt;Propriedade coletiva do código: Todos os membros da equipe têm responsabilidade pelo código, permitindo que qualquer pessoa faça alterações e melhorias quando necessário.&lt;/li&gt;
&lt;li&gt;Entrega contínua: O software é entregue regularmente em pequenos incrementos, permitindo que o cliente teste e forneça feedback sobre o produto em tempo hábil.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Devemos lembrar que a programação é uma forma de resolver problemas, e não um fim em si. Se ficarmos presos na obsessão pela otimização prematura e pelo conhecimento técnico detalhado, podemos perder de vista o objetivo principal: entregar valor para o usuário/cliente. As práticas DevOps, SRE e FinOps podem nos ajudar a manter o foco nesse objetivo, trabalhando em equipe, criando soluções eficientes e com custos controlados.&lt;/p&gt;

&lt;p&gt;Por fim, gostaria de deixar um último pensamento:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“O software é uma arte. É algo que requer habilidade, paciência e dedicação. É um processo contínuo de aprendizado, erro e correção. E acima de tudo, é um processo colaborativo, que exige a contribuição de muitos para alcançar o sucesso.” — Linus Torvalds&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Espero ter contribuído com algumas ideias para a sua jornada como pessoa desenvolvedora. Lembre-se sempre de manter o foco no usuário/cliente, trabalhar em equipe e buscar o aprendizado constante. E acima de tudo, não se esqueça de tomar um café de vez em quando para manter as ideias fluindo!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>finops</category>
      <category>sre</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Observando sistemas distribuídos</title>
      <dc:creator>Fabricio_Gonçalves</dc:creator>
      <pubDate>Sat, 27 Aug 2022 20:54:46 +0000</pubDate>
      <link>https://dev.to/espigah/observando-sistemas-distribuidos-3cfe</link>
      <guid>https://dev.to/espigah/observando-sistemas-distribuidos-3cfe</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Esse blogpost emergiu com a necessidade que tive de juntar o que li sobre observabilidade. Adianto que não será uma abordagem muito profunda sobre o assunto, interessando,  sugiro fortemente que leia as referências =)&lt;/p&gt;

&lt;p&gt;Agradeço aqui também o &lt;a href="https://www.linkedin.com/in/andrehtorres/"&gt;Sr. André&lt;/a&gt; e meu caro &lt;a href="https://www.linkedin.com/in/wstiehler/"&gt;Will&lt;/a&gt; por terem me ajudado com esse conteúdo &amp;lt;3. Vlw, pessoal!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Uma realidade em nossos sistemas e que as coisas irão falhar - pequenas alterações podem resultar em muitos resultados inesperados, incluindo interrupções e falhas globais que impactam todos os clientes. Essa é a realidade dos sistemas complexos.&lt;/p&gt;

&lt;p&gt;O estudo Microsoft Operations Framework (MOF) de 2001 (veja como já tem tempo) descobriu que empresas de alto desempenho usavam uma abordagem disciplinada para resolver problemas, empregando &lt;strong&gt;telemetria&lt;/strong&gt; em produção a fim de entender os possíveis fatores contribuintes para focar na solução do problema.&lt;/p&gt;

&lt;p&gt;Já em 2015 no state of DevOps Report, tivemos uma “revelação”, neste relatório ficou claro que empresas de alto desempenho podiam resolver incidentes de produção muito mais rápido que seus pares tendo como prática o uso de controle de versão e &lt;strong&gt;telemetria&lt;/strong&gt; junto com monitoramento proativo para conseguirem &lt;a href="https://engeteles.com.br/o-que-e-mttr/"&gt;MTTR&lt;/a&gt; rápido&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Observabilidade?
&lt;/h2&gt;

&lt;p&gt;Segundo a teoria de controle, a observabilidade é uma medida que descreve quão bem podem os estados de um sistema ser inferidos a partir do conhecimento de suas saídas externas&lt;sup&gt;1&lt;/sup&gt;. A observabilidade e a controlabilidade são conceitos oriundos da matemática e da engenharia e tratam de criação e manutenção de sistemas.&lt;/p&gt;

&lt;p&gt;Com microsserviços, a observabilidade pode ser difícil de alcançar devido à grande complexidade do contexto. Seja em data centers ou na nuvem, para atingir a excelência operacional e atender aos objetivos de negócios, você precisa entender e aprimorar o desempenho dos seus sistemas. As soluções de observabilidade permitem que você colete e analise dados de aplicativos e infraestruturas para que seja possível entender os seus estados internos e ser alertado, solucionar e resolver problemas com disponibilidade e performance de aplicativos para melhorar a experiência do usuário final.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitoramento == Observabilidade?
&lt;/h2&gt;

&lt;p&gt;Há uma pequena, porém pertinente, diferença nas palavras &lt;em&gt;monitorar&lt;/em&gt; que é um verbo, algo que você faz e &lt;em&gt;observabilidade&lt;/em&gt; que é um substantivo, o atributo de um sistema, ou seja, podemos dizer que observabilidade de um sistema é a extensão como que podemos compreender o estado interno desse sistema a partir de suas saídas.&lt;/p&gt;

&lt;p&gt;A monitoração, por outro lado, é algo que fazemos. Nós monitoramos o sistema. Nós observamos.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Pilares da observabilidade
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Registros (logs)
&lt;/h3&gt;

&lt;p&gt;Um log de evento é um registro imutável com carimbo de data/hora de eventos discretos que aconteceram ao longo do tempo. Os logs de eventos em geral vêm em 3 formas, mas são fundamentalmente os mesmos: um carimbo de data/hora e uma carga útil de algum contexto. As três 3 formas são: Texto, Estruturado e Binário.&lt;/p&gt;

&lt;h3&gt;
  
  
  Métricas
&lt;/h3&gt;

&lt;p&gt;As métricas são uma representação numérica de dados medidos em intervalos de tempo. Como os números são otimizados para armazenamento, processamento, compactação e recuperação, as métricas permitem uma retenção de dados mais longa, bem como consultas mais fáceis. Isso torna as métricas perfeitamente adequadas para a construção de painéis que refletem tendências históricas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rastreamento (tracing)
&lt;/h3&gt;

&lt;p&gt;Um rastreamento (trace ou tracing) é uma representação de uma série de eventos distribuídos, causalmente relacionados, que codificam o fluxo de requisição de ponta a ponta através de um sistema distribuído.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que precisamos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Agregação de logs
&lt;/h3&gt;

&lt;p&gt;Você deve encarar a implementação de uma ferramenta para agregação de logs como um pré requisito para implementar uma arquitetura de microsserviços&lt;br&gt;
uma abordagem que pode ser útil é utilizar ids de correlação nos logs&lt;br&gt;
Os logs são um modo fácil e incrível de obter informações de seus sistemas, porém, a medida que houver mais microsserviços e mais requisições, você acabará gerando muitos dados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agregação de métricas
&lt;/h3&gt;

&lt;p&gt;Assim como o desafio de observar logs de diferentes lugares, precisamos encontrar maneiras melhores de coletar e visualizar dados de nossos sistemas. &lt;/p&gt;

&lt;h3&gt;
  
  
  Tracing distribuído
&lt;/h3&gt;

&lt;p&gt;Basicamente, uma arquitetura de microsserviços é um conjunto de processos que atuam em colaboração para executar algum tipo de tarefa, então, faz sentido, quando queremos entender como nosso sistema realmente se comporta em um ambiente de produção, que sejamos capazes de ver os relacionamentos entre os nossos microsserviços. Aqui sugiro fortemente o estudo de &lt;a href="https://opentelemetry.io/"&gt;OpenTelemetry&lt;/a&gt; (antigo OpenTracing).&lt;/p&gt;

&lt;h3&gt;
  
  
  SLAs e SLOs
&lt;/h3&gt;

&lt;p&gt;SLA é um acordo entre as pessoas que criam o sistema e as pessoas que o utilizam.&lt;br&gt;
Os slos definem o que a equipe se compromete a oferecer, logo, atingir o SLO é satisfazer os requisitos de um SLA, de forma simplista podemos pensar nos slos como o que uma equipe precisa fazer para que a empresa atinja  seus slas. Você pode se aprofundar um pouco mais nesse assunto &lt;a href="https://espigah.medium.com/service-level-objective-slo-e-a-jornada-do-usu%C3%A1rio-afd5713abdc2"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Alertas
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Alertas são problemas&lt;/strong&gt;. Precisamos notificar alguém para que seja tomada alguma ação. O desafio em um ambiente de microsserviços é descobrir exatamente &lt;strong&gt;quais tipos de problemas devem fazer com que uma pessoa seja acordada às três da manhã.&lt;/strong&gt; Você pode se aprofundar um pouco mais nesse assunto &lt;a href="https://medium.com/olist/multiwindow-multi-burn-rate-alerts-5bdaf388bcd6"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Monitoração semântica
&lt;/h3&gt;

&lt;p&gt;Na monitoração semântica definimos um modelo para a semântica aceitável em nosso sistema. Nosso objetivo não é apenas garantir que  estamos gerando &lt;strong&gt;telemetria&lt;/strong&gt; em torno da saúde do aplicativo, mas também medir até que ponto estamos atingindo nosso objetivo organizacional. Quais são as propriedades que o sistema deve ter para que achemos que ele está funcionando com médias aceitáveis? Em boa medida, a monitoração semântica exige uma mudança em nosso comportamento. &lt;strong&gt;Em vez de verificar a presença de erros, precisamos fazer constantemente a pergunta: o sistema está se comportando do modo como esperamos?&lt;/strong&gt; Exemplos de perguntas que podem ajudar: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Novos clientes podem se cadastrar?&lt;/li&gt;
&lt;li&gt;Estamos despachando pedidos a uma taxa considerada normal?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um dos maiores desafios é chegar a um consenso acerca de como será esse modelo. Como podemos ver, &lt;strong&gt;não estamos falando de algo no baixo nível como "o uso de CPU não deve exceder 95%";&lt;/strong&gt; estamos fazendo afirmações de nível alto sobre o nosso sistema. É nessa hora que o dono do produto (product owner) deve entrar em cena - mas talvez seja sua tarefa como operador garantir que a discussão como o dono do produto realmente ocorra. &lt;/p&gt;

&lt;h3&gt;
  
  
  Possibilitar a criação de métricas como parte do trabalho diário
&lt;/h3&gt;

&lt;p&gt;Você precisa que todos criem métricas facilmente. Para isso, devemos ter a infraestrutura e as bibliotecas necessárias para facilitar o máximo possível alguém de criar telemetria para qualquer funcionalidade. Ao gerar telemetria de produção como parte do trabalho diário, temos cada vez mais capacidade não apenas de ver o problemas quando ocorrem, mas também de projetar nosso trabalho, de modo que problemas em projetos e operações possam ser revelados com antecedência.&lt;/p&gt;

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

&lt;p&gt;Conforme vimos, há muitos aspectos em que devemos pensar. É preciso garantir que será possível usar as informações para fazer perguntas sobre seu sistema. &lt;strong&gt;Você é capaz de dizer com confiança que o sistema está funcionando de modo adequado aos seus usuários?&lt;/strong&gt; Com o tempo será necessário coletar mais informações e aprimorar as ferramentas para melhorar a observabilidade das aplicações.&lt;/p&gt;

&lt;p&gt;Sistemas distribuídos podem ser complicados de entender e quando mais distribuídos forem, mais difícil será a tarefa de resolver os problemas que emergem por esta natureza. À medida que sua arquitetura de microsserviço se torna mais complexa, será mais difícil saber como anteceder os problemas que poderiam ocorrer. Desse modo será essencial mudar sua maneira de pensar, afastando-se das atividades que, em sua maior parte, são de monitoração, e avançar em direção a deixar o seu sistema mais observável. &lt;/p&gt;

&lt;p&gt;Considere fortemente adotar SLOs e alertas com base nesses preceitos a fim de reduzir a fadiga de alertas e manter sua atenção com um foco apropriado. Assegure-se de investir em telemetria de nível empresarial, de aplicativo, de infra estrutura, de software cliente (frontend), de pipeline de implementação…&lt;/p&gt;

&lt;p&gt;Acima de tudo, trata-se de aceitar que nem tudo será conhecido antes de o sistema chegar ao ambiente produtivo. Melhore sua capacidade de  lidar com o desconhecido &lt;/p&gt;

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

&lt;p&gt;[1] &lt;a href="https://en.wikipedia.org/wiki/Observability"&gt;https://en.wikipedia.org/wiki/Observability&lt;/a&gt;&lt;br&gt;
&lt;a href="https://sre.google/workbook/implementing-slos/"&gt;The Site Reliability Workbook (cap 2)&lt;/a&gt;&lt;br&gt;
&lt;a href="https://books.google.com.br/books/about/The_DevOps_Handbook.html?id=ui8hDgAAQBAJ&amp;amp;redir_esc=y#:~:text=Following%20in%20the%20footsteps%20of,and%20win%20in%20the%20marketplace"&gt;The DevOps Handbook (cap 14)&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.amazon.com.br/Building-Microservices-Second-Sam-Newman/dp/1492034029/ref=asc_df_1492034029/?tag=googleshopp00-20&amp;amp;linkCode=df0&amp;amp;hvadid=379733272930&amp;amp;hvpos=&amp;amp;hvnetw=g&amp;amp;hvrand=906317415168947384&amp;amp;hvpone=&amp;amp;hvptwo=&amp;amp;hvqmt=&amp;amp;hvdev=c&amp;amp;hvdvcmdl=&amp;amp;hvlocint=&amp;amp;hvlocphy=9100838&amp;amp;hvtargid=pla-464425939893&amp;amp;psc=1"&gt;Building Microservices: Designing Fine-Grained Systems (cap 10)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>sre</category>
      <category>observability</category>
      <category>observabilidade</category>
    </item>
    <item>
      <title>Adaptive Throttling — Lidando com sobrecarga</title>
      <dc:creator>Fabricio_Gonçalves</dc:creator>
      <pubDate>Tue, 04 Jan 2022 21:55:04 +0000</pubDate>
      <link>https://dev.to/espigah/adaptive-throttling-lidando-com-sobrecarga-31p</link>
      <guid>https://dev.to/espigah/adaptive-throttling-lidando-com-sobrecarga-31p</guid>
      <description>&lt;p&gt;Um throttle “auto regulado” no lado do client até a leitura do capítulo ‘Handling Overload’ do livro SRE do Google era uma abordagem desconhecida pra mim, então, resolvi fazer alguns testes, durante esse processo descobri que não tinha muito material sobre esse tema e nem uma lib para fazer exatamente o que eu queria, então resolvi escrever esse post.&lt;/p&gt;

&lt;h1&gt;
  
  
  Client-Side Throttling
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Não importa o quão eficiente seja sua política de balanceamento de carga, eventualmente alguma parte do seu sistema ficará sobrecarregada. O tratamento adequado das condições de sobrecarga é fundamental para o funcionamento de um sistema de serviço confiável — SRE-Book&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Existem várias maneiras de lidar com sobrecarga, dependendo da parte da aplicação com a qual você está trabalhando, entretanto, achar que algo, ou algum estratégia, será 100% à prova de falhas, um equivoco . Você pode tornar sua infra melhor escalável, pode empregar limite de carga para rejeitar solicitações adicionais que você sabe que não pode lidar imediatamente, customer quotas e etc. Embora todas essas sejam ótimas abordagens para resolver o problema, fazer mais perto do client (na origem) para tentar não repassar o tráfego quando o back-end está tendo dificuldades, será um caminho para melhorar o funcionamento de outras estratégias.&lt;/p&gt;

&lt;h1&gt;
  
  
  Como aplicar a Client-Side Throttling
&lt;/h1&gt;

&lt;p&gt;Quando um client detecta que uma parte significativa de suas solicitações recentes foi rejeitada, ele começa a se autorregular e limitar a quantidade de tráfego de saída que gera, o que é chamado de Adaptive throttling. A ideia original para a implementação vem do capítulo ‘Handling Overload’ do livro SRE do Google.&lt;/p&gt;

&lt;p&gt;O Adaptive throttling é calculado da seguinte forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MRwvaWqV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/295/0%2AOXp4y4hwywclnogd" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MRwvaWqV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/295/0%2AOXp4y4hwywclnogd" alt="Adaptive throttling" width="295" height="51"&gt;&lt;/a&gt;&lt;br&gt;
(Por Google)&lt;/p&gt;

&lt;p&gt;Porém, de acordo com Rafael Capucho, existe um possível problema com esta abordagem.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Minha preocupação com essa probabilidade é que, se o servidor ficar inativo por mais de 2 minutos, o valor P0 ficará em 1, rejeitando localmente cada nova solicitação ao servidor, de modo que o aplicativo cliente não será capaz de configurar um nova conexão. Como resultado disso, o aplicativo cliente nunca terá outra solicitação chegando ao servidor.&lt;br&gt;
Gostaria de sugerir uma nova medida de probabilidade, P 1 , que limita em 90%… — Rafael Capucho&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--68uAlGIV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/205/0%2ANv5ewUTxNCdxCl8E.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--68uAlGIV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/205/0%2ANv5ewUTxNCdxCl8E.jpg" alt="Adaptive throttling 2" width="205" height="68"&gt;&lt;/a&gt;&lt;br&gt;
(Por Rafael Capucho)&lt;/p&gt;

&lt;p&gt;Esta foi a abordagem usada na biblioteca &lt;a href="https://www.npmjs.com/package/adaptive-throttling"&gt;adaptive-throttling&lt;/a&gt;. Onde você passa sua requisição é ela autorregula os limites de saidá. Segue um exemplo de uso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
const { AdaptiveThrottling } = require('adaptive-throttling');
const axios = require('axios');

const adaptiveThrottling = AdaptiveThrottling();

adaptiveThrottling
  .execute(() =&amp;gt; {
    return axios.get('/user?ID=12345');
  })
  .then((response) =&amp;gt; {
    console.log('success', response.data);
  })
  .catch((error) =&amp;gt; {
    // Se o servidor estiver com dificuldades 
    // erros "The request was throttled." podem ser lançados, nem indo no servidor, ajudado assim a aliviar a sobrecarga.
console.log('error', error.message);
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fiz um desenho tentando evidenciar onde o cenário com Adaptive Throttling complementa algumas outras soluções de contorno.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q9x7nJ5q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/1%2A9KZpB4iIFYg_fqvKSRbGLQ%402x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q9x7nJ5q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/1%2A9KZpB4iIFYg_fqvKSRbGLQ%402x.png" alt="Adaptive throttling 3" width="700" height="1299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enfim, como não existe uma solução mágica, considere fundamental garantir que as tarefas individuais sejam protegidas contra sobrecarga e Adaptive throttling vem pra ser mais um ferramenta com esse propósito.&lt;/p&gt;

&lt;h1&gt;
  
  
  Bônus
&lt;/h1&gt;

&lt;p&gt;Neste mesmo capítulo temos uma parte que aborda quando aplicar retry e como, aproveitando que estava com a mão na massa, fiz uma “extensão”&lt;br&gt;
para a lib influenciado pela parte sobre “per-client retry budget request”, porém, no meu caso, usei a própria probabilidade de rejeitar request, que vimos em Client-Side Throttling, como limitador das retentativas.&lt;br&gt;
(&lt;a href="https://www.npmjs.com/package/adaptive-throttling-with-retry"&gt;adaptive-throttling-with-retry&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>sre</category>
      <category>frontend</category>
      <category>throttling</category>
      <category>resiliency</category>
    </item>
    <item>
      <title>Princípios da jornada de SRE</title>
      <dc:creator>Fabricio_Gonçalves</dc:creator>
      <pubDate>Mon, 25 Oct 2021 12:26:31 +0000</pubDate>
      <link>https://dev.to/espigah/principios-da-jornada-de-sre-8pi</link>
      <guid>https://dev.to/espigah/principios-da-jornada-de-sre-8pi</guid>
      <description>&lt;h2&gt;
  
  
  O que faz um SRE? 
&lt;/h2&gt;

&lt;p&gt;E, de uma forma bem alto nível são somente dois: Medir e Garantir. E para isso existe uma série de princípios que devem ser compreendidos. Além de auxiliar no ciclo de vida do produto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lrgD-cuz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://fabriciodezain.files.wordpress.com/2021/10/image-1.png%3Fw%3D607" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lrgD-cuz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://fabriciodezain.files.wordpress.com/2021/10/image-1.png%3Fw%3D607" alt="SRExSLO_AGILE_DEVOPS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Principios para SRE
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    * Aceitando os riscos&lt;br&gt;
    * Níveis de serviço (SLx)&lt;br&gt;
    * Eliminando Toil&lt;br&gt;
    * Monitoração&lt;br&gt;
    * Automação&lt;br&gt;
    * Engenharia de Release&lt;br&gt;
    * Simplicidade&lt;br&gt;
    * Design de Sistema (Grandes) Não Abstrato (NALSD)&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Aceitando os riscos &lt;a&gt;&lt;/a&gt;&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;Aceitar o risco significa estabelecer um nível aceitável de confiabilidade, que pese os custos do que está sendo assumido em relação ao risco. E para aceitar o risco a filosofia de usar error budget precisa estar bem establecida para que funcione.&lt;/p&gt;

&lt;h3&gt;
  
  
  Níveis de serviço (SLx) &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Coração da engenharia de confiabilidade, os SLO&lt;code&gt;s, SLI&lt;/code&gt;s e SLA&lt;code&gt;s e Error Budgets. o SLA, a promessa feita para o cliente, é o mínimo disposto em contrato, os SLO&lt;/code&gt;s são os objetivos que você quer atingir além desse contrato, e os SLI são os indicadores que você vai utilizar pra acompanhar como estão o andamento desses objetivos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2IWFNVtV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://fabriciodezain.files.wordpress.com/2021/10/image.png%3Fw%3D1024" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2IWFNVtV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://fabriciodezain.files.wordpress.com/2021/10/image.png%3Fw%3D1024" alt="SRExSLO_AGILE_DEVOPS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Eliminando Toil &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Reduzir as tarefas repetitivas para gastar energia em coisas urgentes com automação e um meta importante para o SRE. Simplesmente se estamos querendo reduzir nosso TOIL precisamos automatizar coisas, mas com o devido planejamento porque algo automatizado erradamente gera ainda mais pŕobelamas. O objetivo de qualificar algo como TOIL justamente indica para onde o esforço com automação deve ir, ou seja, problemas no fluxo de valor não devem ser, a priori, qualificados como TOIL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Monitoração &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;que seu serviço produz as métricas de que você precisa. Alguns padores como 4 golden signals, RED E LEV podem fornecer o template inicial para algumas métricas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automação &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Automatize tudo que possa ser automatizado, mas certifique-se de garantir, como qualquer outro código, a qualidade/confiabilidade por meio de testes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Engenharia de Release &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Tenha padrões de lançamento. Monitore as estatísticas sobre seus lançamentos. Entenda bem como continuous integration  (CI), continuous delivery(CD) e continuous deployment (CD) funcionam de verdade.&lt;/p&gt;

&lt;h3&gt;
  
  
  Simplicidade &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Sistemas simples tendem a ser confiáveis ​​e fáceis de operar, porem, medir a complexidade dos sistemas não será uma tarefa fácil. Saber com quanto tempo alguém leva para fazer mudanças, ou o tempo que alguém leva pra ter uma visão abrangente de alto nível do serviço pode ajudar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design de Sistema (Grandes) Não Abstrato (NALSD) &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;to de manutenção dos sistemas que projetam. Pratique a capacidade de aferir, projetar e avaliar (grandes) sistemas, não deixe nada "abstrato" antes de implementar algo. Deixar de construir um plano de falha para alguma ponta solta pode custar caro, isso não significa implementar, mas sim que evite ser pego de surpresa se algo falhar. Na fase de concepção use perguntas como: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;É possível?&lt;/li&gt;
&lt;li&gt;Isso é viável?&lt;/li&gt;
&lt;li&gt;É resiliente?&lt;/li&gt;
&lt;li&gt;Podemos fazer melhor? &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Desta forma estaremos mais perto de construir sistemas saudáveis e duradouros.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--amlJ8DYL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://fabriciodezain.files.wordpress.com/2021/10/7-key-principles402x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--amlJ8DYL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://fabriciodezain.files.wordpress.com/2021/10/7-key-principles402x.png" alt="Princípios da jornada de SRE"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sre</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
