<?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: Ortiz de Arcanjo António David</title>
    <description>The latest articles on DEV Community by Ortiz de Arcanjo António David (@ortizdavid).</description>
    <link>https://dev.to/ortizdavid</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%2F651046%2F503848e3-cf33-4502-a605-6853ab536783.jpg</url>
      <title>DEV Community: Ortiz de Arcanjo António David</title>
      <link>https://dev.to/ortizdavid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ortizdavid"/>
    <language>en</language>
    <item>
      <title>Gerenciamento de Workers numa aplicação Golang</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Mon, 06 Apr 2026 14:02:04 +0000</pubDate>
      <link>https://dev.to/ortizdavid/gerenciamento-de-workers-numa-aplicacao-golang-88p</link>
      <guid>https://dev.to/ortizdavid/gerenciamento-de-workers-numa-aplicacao-golang-88p</guid>
      <description>&lt;p&gt;Atualmente é indispensável que um sistema que cresce esteja preparado para processar tarefas em background.&lt;br&gt;
Essas tarefas não devem interromper o fluxo normal da aplicação.&lt;br&gt;
O melhor é estruturar como esses workers vão se comportar e permitir a configuração dos mesmos.&lt;/p&gt;

&lt;p&gt;Felizmente, Golang nos dá a vantagem de criar estruturas que facilitam esse tipo de aplicações.&lt;br&gt;
Usando Goroutines, channels e contextos de cancelamento, conseguimos criar essa estrutura.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cron jobs VS Workers
&lt;/h1&gt;

&lt;p&gt;Facilmente confundimos Cron Jobs com Workers. Eles partem do mesmo princípio de executar tarefas em segundo plano.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Worker: processa tarefas num ciclo infinito, usando a frequência e número de tentativas.&lt;/li&gt;
&lt;li&gt;Cron Job: trabalha com agendamento, a tarefa é somente executada no tempo definido.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Exemplos mais comuns de Workers
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Processamento de uma regra de negócio&lt;/li&gt;
&lt;li&gt;Envio de dados para uma fila&lt;/li&gt;
&lt;li&gt;Consumo e processamento de filas&lt;/li&gt;
&lt;li&gt;Envio de e-mails recorrentes&lt;/li&gt;
&lt;li&gt;Campanha de mensagens em massa&lt;/li&gt;
&lt;li&gt;Envios de SMS&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  O problema de muitos workers
&lt;/h1&gt;

&lt;p&gt;Quando a aplicação cresce, podemos ter várias tarefas por processar na aplicação.&lt;br&gt;
Encadear cada tarefa torna o código difícil de ler e manter. Nesse caso, devemos achar uma estratégia para organizar e manter esse número de workers.&lt;br&gt;
A forma mais elegante é o worker manager, organizador e orquestrador de workers, responsável pelo registro, chamada e ciclo de vida dos mesmos.&lt;/p&gt;

&lt;h1&gt;
  
  
  Passos para criação do Worker Manager
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Definir uma interface para a base dos workers: Start, Stop e Worker Name&lt;/li&gt;
&lt;li&gt;Criar o manager que agrupa os workers&lt;/li&gt;
&lt;li&gt;Criar um mecanismo para iniciar e parar todos os workers&lt;/li&gt;
&lt;li&gt;Se necessário, uma função para mostrar as infos dos workers registrados no sistema&lt;/li&gt;
&lt;li&gt;Configurar o máximo de tentativas e o intervalo de tempo que os workers vão executar a operação&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Vantagens
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Graceful shutdown: o manager avisa a todos os workers quando parar. Eles não perdem dados, escutam o sinal de cancel e vão parando.&lt;/li&gt;
&lt;li&gt;Estratégias de backoff&lt;/li&gt;
&lt;li&gt;Modularidade&lt;/li&gt;
&lt;li&gt;Código fácil de manter e evoluir&lt;/li&gt;
&lt;li&gt;Arquitetura plug and play&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No futuro veremos como implementar um cron job manager.&lt;/p&gt;

&lt;p&gt;Código fonte: &lt;a href="https://github.com/ortizdavid/golang-pocs/tree/main/worker-manager" rel="noopener noreferrer"&gt;https://github.com/ortizdavid/golang-pocs/tree/main/worker-manager&lt;/a&gt;&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%2Fbkdkdq1gxuocgxkwzze8.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%2Fbkdkdq1gxuocgxkwzze8.png" alt=" " width="800" height="478"&gt;&lt;/a&gt;&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%2Fmemm1pj1bebscnv3dg6w.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%2Fmemm1pj1bebscnv3dg6w.png" alt=" " width="800" height="233"&gt;&lt;/a&gt;&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%2Foqqf4k4y6wbrfg2noy8s.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%2Foqqf4k4y6wbrfg2noy8s.png" alt=" " width="800" height="562"&gt;&lt;/a&gt;&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%2F2a2moievqbb0usszjbhh.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%2F2a2moievqbb0usszjbhh.png" alt=" " width="800" height="1081"&gt;&lt;/a&gt;&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%2Fqyipam4g128pwyw9s4pf.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%2Fqyipam4g128pwyw9s4pf.png" alt=" " width="800" height="237"&gt;&lt;/a&gt;&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%2Fu10yitgsmyu9ji9ltpnz.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%2Fu10yitgsmyu9ji9ltpnz.png" alt=" " width="800" height="719"&gt;&lt;/a&gt;&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%2F8e44o3j17rsdb3nxbiyl.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%2F8e44o3j17rsdb3nxbiyl.png" alt=" " width="800" height="912"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>software</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Por que o seu Microserviço deve permitir Integração via JSON-RPC?</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Tue, 17 Mar 2026 17:48:02 +0000</pubDate>
      <link>https://dev.to/ortizdavid/por-que-o-seu-microservico-deve-permitir-integracao-via-json-rpc-bfe</link>
      <guid>https://dev.to/ortizdavid/por-que-o-seu-microservico-deve-permitir-integracao-via-json-rpc-bfe</guid>
      <description>&lt;p&gt;Embora o REST seja o padrão absoluto para o Frontend, a comunicação entre serviços (Service-to-Service) pede algo mais direto e menos verboso.&lt;/p&gt;

&lt;p&gt;O gRPC é frequentemente citado como a solução de elite, mas traz uma complexidade de infraestrutura (&lt;code&gt;.proto&lt;/code&gt;, geração de código, HTTP/2) que muitos projetos não precisam no dia zero.&lt;br&gt;
O JSON-RPC surge como o "pote de mel": simples como JSON, mas eficiente e intuitivo como uma chamada de função local.&lt;/p&gt;

&lt;h2&gt;
  
  
  Onde cada um brilha?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;REST: Perfeito para recursos públicos. Focado em substantivos (&lt;code&gt;/users&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;gRPC: Ultra-performance e streaming. Focado em contratos rígidos (Binário).&lt;/li&gt;
&lt;li&gt;JSON-RPC: O melhor para comunicação interna ágil. Focado em ações (&lt;code&gt;User.Create&lt;/code&gt;). É nativo em Go e não exige ferramentas externas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementação Enterprise: O que não pode faltar
&lt;/h2&gt;

&lt;p&gt;Para um sistema robusto, não basta apenas "rodar" o RPC. É preciso controle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Capabilities: O serviço deve ser capaz de se "auto-apresentar", listando métodos disponíveis via reflexão no arranque.&lt;/li&gt;
&lt;li&gt;Rastreabilidade: Cada chamada deve carregar um &lt;code&gt;Trace-ID&lt;/code&gt; no Contexto para que saibas exatamente quem iniciou a cadeia de ações.&lt;/li&gt;
&lt;li&gt;Segurança (Internal Key): Autenticação rápida via Headers (&lt;code&gt;X-Internal-Key&lt;/code&gt;) para garantir que apenas serviços autorizados acedam ao motor RPC.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O Desafio da Memória em Go
&lt;/h2&gt;

&lt;p&gt;Um detalhe crítico ao implementar RPC em Go com transações de base de dados: Cuidado com a estabilidade dos ponteiros.&lt;/p&gt;

&lt;p&gt;Ao usar closures (funções anónimas) dentro de transações, evita declarar ponteiros nulos para o retorno. Se tentares preenchê-los apenas dentro da transação, podes enfrentar problemas de visibilidade de memória (Race Conditions) que resultam em &lt;code&gt;nil pointer dereference&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A Boa Prática: Inicializa sempre a tua struct de resposta (&lt;code&gt;new(Struct)&lt;/code&gt; ou &lt;code&gt;&amp;amp;Struct{}&lt;/code&gt;) antes de entrar na transação. aIsso garante um endereço de memória estável e evita que o teu Dispatcher RPC sofra um Panic.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Configurações e Limites
&lt;/h2&gt;

&lt;p&gt;Um motor RPC robusto precisa de fronteiras claras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Timeouts: Controle rígido para que uma chamada não "prenda" o serviço infinitamente.&lt;/li&gt;
&lt;li&gt;Payload Limit: Evita que requisições gigantes saturem a memória do servidor.&lt;/li&gt;
&lt;li&gt;Observabilidade: Logs automáticos de cada método invocado, incluindo a latência e o status da resposta.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Adotar JSON-RPC na arquitetura interna reduz o overhead de roteamento, facilita o debug (é legível, ao contrário do gRPC) e mantém o código limpo.&lt;br&gt;
É a escolha de quem prefere resolver problemas de negócio a lutar contra a infraestrutura.&lt;/p&gt;

&lt;p&gt;O JSON-RPC dá ao teu sistema a fluidez de uma chamada de função com a robustez de um microserviço.&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%2Fow9ay8x6m9qe4llrdsdx.jpg" 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%2Fow9ay8x6m9qe4llrdsdx.jpg" alt=" " width="782" height="662"&gt;&lt;/a&gt;&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%2Fkzno4c6396q1v6bb4pn0.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%2Fkzno4c6396q1v6bb4pn0.png" alt=" " width="800" height="393"&gt;&lt;/a&gt;&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%2F166bmt6x8rqtqf0zxooc.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%2F166bmt6x8rqtqf0zxooc.png" alt=" " width="800" height="429"&gt;&lt;/a&gt;&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%2Ftqg64csmz6rvf1istbm2.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%2Ftqg64csmz6rvf1istbm2.png" alt=" " width="800" height="718"&gt;&lt;/a&gt;&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%2F5jvbixwaomkn95tmyv9r.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%2F5jvbixwaomkn95tmyv9r.png" alt=" " width="800" height="1056"&gt;&lt;/a&gt;&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%2Fwvmoty842edkwe7m7vug.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%2Fwvmoty842edkwe7m7vug.png" alt=" " width="800" height="911"&gt;&lt;/a&gt;&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%2Fzw1lw6fo7ajgvnon540v.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%2Fzw1lw6fo7ajgvnon540v.png" alt=" " width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>go</category>
      <category>architecture</category>
      <category>jsonrpc</category>
    </item>
    <item>
      <title>Minha experiência com gRPC e Golang: Construindo um Motor de Assinatura Digital</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Wed, 04 Mar 2026 10:25:37 +0000</pubDate>
      <link>https://dev.to/ortizdavid/minha-experiencia-com-grpc-e-golang-construindo-um-motor-de-assinatura-digital-4511</link>
      <guid>https://dev.to/ortizdavid/minha-experiencia-com-grpc-e-golang-construindo-um-motor-de-assinatura-digital-4511</guid>
      <description>&lt;p&gt;Nas últimas duas semanas, aceitei um desafio técnico intenso: desenvolver um microserviço de assinatura digital utilizando Go e gRPC.&lt;br&gt;
Foi um projeto que me tirou da zona de conforto (resolver problemas de negócio puros) e me mergulhou profundamente em engenharia de infraestrutura e criptografia.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Desafio Técnico
&lt;/h2&gt;

&lt;p&gt;O objetivo era criar um motor de processamento capaz de receber documentos financeiros em XML, realizar o parse, garantir a integridade via algoritmos de assinatura digital e retornar o documento assinado de forma única.&lt;br&gt;
Tudo isso com foco em alta performance e disponibilidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack de Engenharia
&lt;/h2&gt;

&lt;p&gt;Para suportar essa complexidade, utilizei uma stack robusta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go &amp;amp; gRPC: Escolhidos pela necessidade de baixa latência e comunicação eficiente machine-to-machine (evitando o overhead do JSON/REST).&lt;/li&gt;
&lt;li&gt;HashiCorp Vault: Gestão segura de segredos e chaves privadas (Secret Manager).&lt;/li&gt;
&lt;li&gt;MinIO: Armazenamento de objetos para os arquivos de certificados (.pfx).&lt;/li&gt;
&lt;li&gt;MySQL &amp;amp; Redis: Persistência de metadados e camada de cache para otimização de consultas.&lt;/li&gt;
&lt;li&gt;Criptografia X.509: Lógica para extração de metadados e validação de cadeias de confiança.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Destaques de Implementação
&lt;/h2&gt;

&lt;p&gt;A arquitetura foi pensada para garantir a idempotência e a segurança em repouso, pilares fundamentais em sistemas que lidam com documentos financeiros sensíveis.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Segurança Multitenant: O sistema permite que cada consumidor gerencie seu próprio certificado, isolado e protegido por criptografia através do Vault.&lt;/li&gt;
&lt;li&gt;Performance: Sem interface gráfica e focado em processamento pesado, o gRPC garantiu que múltiplos sistemas pudessem consumir o serviço simultaneamente com estabilidade.&lt;/li&gt;
&lt;li&gt;Cultura de Testes: Para validar a resiliência, desenvolvi scripts de automação em Bash e utilizei o grpcurl para testes de stress, simulando múltiplos clientes em simultâneo.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  O Aprendizado
&lt;/h2&gt;

&lt;p&gt;A grande conclusão prática é que o gRPC é a escolha de excelência para integração entre sistemas onde estabilidade e processamento pesado são inegociáveis. Trabalhar com criptografia e certificados digitais é uma área complexa, mas extremamente gratificante quando vemos os resultados de performance validados na prática.&lt;/p&gt;

&lt;p&gt;Mais um conhecimento adquirido e pronto para ser aplicado em soluções de escala global! &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%2F6rxnbdk66fwnubgsdorw.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%2F6rxnbdk66fwnubgsdorw.png" alt=" " width="800" height="269"&gt;&lt;/a&gt;&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%2Fi6gblzp16dhiyv2w9k30.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%2Fi6gblzp16dhiyv2w9k30.png" alt=" " width="800" height="646"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>microservices</category>
      <category>backend</category>
      <category>grpc</category>
    </item>
    <item>
      <title>Como implementar Injeção de Dependências em Go manualmente?</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Mon, 23 Feb 2026 17:13:19 +0000</pubDate>
      <link>https://dev.to/ortizdavid/como-implementar-injecao-de-dependencias-em-go-manualmente-4i5p</link>
      <guid>https://dev.to/ortizdavid/como-implementar-injecao-de-dependencias-em-go-manualmente-4i5p</guid>
      <description>&lt;p&gt;A linguagem Go permite controlar manualmente as dependências com mais facilidade.&lt;br&gt;
Cada item da sua aplicação pode ser instanciado onde o desenvolvedor desejar. Go nos dá essa liberdade.&lt;/p&gt;

&lt;p&gt;Mas, com o crescimento do projeto, é importante arranjar uma estratégia para carregar as dependências, porque elas podem afetar positiva ou negativamente a aplicação.&lt;br&gt;
Essa liberdade do Go pode dar margem para vários erros de dependências. Para projetos pequenos, faz sentido, mas para grandes projectos pode ser difícil de manter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cenário comum: main inflado
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Instanciar DB, cache, configs no main&lt;/li&gt;
&lt;li&gt;Instanciar repos, services&lt;/li&gt;
&lt;li&gt;Criação e inicialização dos componentes
Isso Faz sentido para projetos com poucos componentes, não reprsenta grandes riscos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Solução: injeção via containers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Criar container de infraestrutura: DB, Cache, Logger, Mensageria e outros.&lt;/li&gt;
&lt;li&gt;Container de serviços: regras de negócio&lt;/li&gt;
&lt;li&gt;Container de repositórios: interação com a base de dados
No Main, só precisamos carregar os containers. o Main se torna o maestro da aplicação.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Vantagens
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Criação dos objetos 1 vez apenas&lt;/li&gt;
&lt;li&gt;Organização dos componentes&lt;/li&gt;
&lt;li&gt;Separação de responsabilidades&lt;/li&gt;
&lt;li&gt;Performance melhorada&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Por que fazer isso manualmente?
&lt;/h2&gt;

&lt;p&gt;Embora existam bibliotecas como Google Wire ou Uber FX, fazer a gestão manual com containers traz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Performance: Sem uso de reflection em tempo de execução.&lt;/li&gt;
&lt;li&gt;Transparência: Você vê exatamente o que está sendo injetado e onde.&lt;/li&gt;
&lt;li&gt;Singleton por Design: Objetos pesados (como pools de DB) são criados apenas uma vez.&lt;/li&gt;
&lt;li&gt;Testabilidade: É fácil substituir um repositório real por um mock nos seus testes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Código-fonte
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ortizdavid/golang-pocs" rel="noopener noreferrer"&gt;https://github.com/ortizdavid/golang-pocs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ortizdavid/golang-pocs/tree/main/dependency-injection" rel="noopener noreferrer"&gt;https://github.com/ortizdavid/golang-pocs/tree/main/dependency-injection&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como tens organizado as dependências nos teus projetos? Abordagem manual ou usas bibliotecas?&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%2Fnxxgzdfbizfizm8sz454.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%2Fnxxgzdfbizfizm8sz454.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&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%2F7g7jrahce22x7866yrq7.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%2F7g7jrahce22x7866yrq7.png" alt=" " width="800" height="972"&gt;&lt;/a&gt;&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%2Fosz8skylmuhkzq6hpbew.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%2Fosz8skylmuhkzq6hpbew.png" alt=" " width="800" height="590"&gt;&lt;/a&gt;&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%2Fbyfn2llzeli26izvk6p0.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%2Fbyfn2llzeli26izvk6p0.png" alt=" " width="800" height="715"&gt;&lt;/a&gt;&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%2F6d4eptvnqszl4ppaer6j.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%2F6d4eptvnqszl4ppaer6j.png" alt=" " width="800" height="634"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>cleancode</category>
      <category>programming</category>
      <category>backend</category>
    </item>
    <item>
      <title>Entrypoint API: Por que o seu /health não é suficiente?</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Thu, 19 Feb 2026 11:03:05 +0000</pubDate>
      <link>https://dev.to/ortizdavid/entrypoint-api-por-que-o-seu-health-nao-e-suficiente-5ec</link>
      <guid>https://dev.to/ortizdavid/entrypoint-api-por-que-o-seu-health-nao-e-suficiente-5ec</guid>
      <description>&lt;p&gt;A maioria das APIs limita-se a retornar um simples &lt;strong&gt;status&lt;/strong&gt; para verificar se funciona ou não, mostrando apenas o estado da aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ambientes sérios
&lt;/h2&gt;

&lt;p&gt;Em ambientes de produção, não basta saber se a aplicação está ativa.&lt;br&gt;
É necessário saber se os recursos essenciais da API estão disponíveis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Base de dados&lt;/li&gt;
&lt;li&gt;Cache&lt;/li&gt;
&lt;li&gt;Storage&lt;/li&gt;
&lt;li&gt;Serviços externos críticos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se um desses componentes estiver indisponível ou em modo degradado, o consumidor precisa saber antes de executar operações mais pesadas.&lt;/p&gt;

&lt;p&gt;Outro ponto importante é disponibilizar um pequeno mapa da API para situar o consumidor (integrador e frontend), expondo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nome do serviço&lt;/li&gt;
&lt;li&gt;Estado atual&lt;/li&gt;
&lt;li&gt;Principais endpoints&lt;/li&gt;
&lt;li&gt;Links úteis (health, info, documentação)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Por que essa preocupação?
&lt;/h2&gt;

&lt;p&gt;Esses itens são importantes para evitar overhead no consumo da API.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evita requisições desnecessárias&lt;/li&gt;
&lt;li&gt;Reduz falhas previsíveis&lt;/li&gt;
&lt;li&gt;Previne erros em cascata&lt;/li&gt;
&lt;li&gt;Permite que o frontend aplique estratégias de contingência&lt;/li&gt;
&lt;li&gt;Melhora a experiência de integração&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O frontend pode, por exemplo, verificar o estado do storage antes de iniciar um upload grande.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como resolver?
&lt;/h2&gt;

&lt;p&gt;A API pode disponibilizar no entrypoint principal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um mapa simples do serviço&lt;/li&gt;
&lt;li&gt;Estado detalhado dos recursos críticos&lt;/li&gt;
&lt;li&gt;Links principais da aplicação&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Também pode expor informações não críticas sobre o ambiente, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limites de upload&lt;/li&gt;
&lt;li&gt;Versão da API&lt;/li&gt;
&lt;li&gt;Configurações relevantes&lt;/li&gt;
&lt;li&gt;Capacidades habilitadas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso permite que o consumidor saiba como interagir com o serviço antes de iniciar operações.&lt;/p&gt;

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

&lt;p&gt;Isso eleva a API de um simples backend para uma solução mais robusta e consciente da experiência do consumidor.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduz requisições desnecessárias&lt;/li&gt;
&lt;li&gt;Diminui erros evitáveis&lt;/li&gt;
&lt;li&gt;Aumenta a previsibilidade&lt;/li&gt;
&lt;li&gt;Melhora a qualidade do serviço&lt;/li&gt;
&lt;/ul&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%2Fx8m1zne9vfhyst1doavd.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%2Fx8m1zne9vfhyst1doavd.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&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%2Fw5qmcs5x8yjb3urr5wbo.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%2Fw5qmcs5x8yjb3urr5wbo.png" alt=" " width="800" height="415"&gt;&lt;/a&gt;&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%2Fa7uti2td07ub041j82ge.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%2Fa7uti2td07ub041j82ge.png" alt=" " width="800" height="492"&gt;&lt;/a&gt;&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%2Fp3n0pl0szkxlchd9hzzk.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%2Fp3n0pl0szkxlchd9hzzk.png" alt=" " width="800" height="1068"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rest</category>
      <category>api</category>
      <category>go</category>
      <category>devex</category>
    </item>
    <item>
      <title>Template Python MongoDB API: Arquitetura (Ferramentas)</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Wed, 14 Jan 2026 10:37:37 +0000</pubDate>
      <link>https://dev.to/ortizdavid/template-python-mongodb-api-arquitetura-ferramentas-47d</link>
      <guid>https://dev.to/ortizdavid/template-python-mongodb-api-arquitetura-ferramentas-47d</guid>
      <description>&lt;p&gt;Um backend de alto nível exige peças que garantam performance e escalabilidade. Para este template, selecionei uma stack focada em prontidão para produção.&lt;/p&gt;

&lt;h1&gt;
  
  
  🛠️ O Ecossistema
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linguagem:&lt;/strong&gt; Python 3.11+&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework:&lt;/strong&gt; FastAPI (Async)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Banco de Dados:&lt;/strong&gt; MongoDB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache &amp;amp; Segurança:&lt;/strong&gt; Redis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage:&lt;/strong&gt; MinIO, Filesystem e Google Storage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observabilidade:&lt;/strong&gt; Prometheus, Grafana e Jaeger&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infra:&lt;/strong&gt; Docker &amp;amp; Docker Compose&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🎯 O porquê de cada escolha:
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ⚡ FastAPI
&lt;/h2&gt;

&lt;p&gt;Por que: Alta performance com &lt;code&gt;asyncio&lt;/code&gt; e documentação automática (Swagger). Agiliza o desenvolvimento com validação rigorosa.&lt;/p&gt;

&lt;h2&gt;
  
  
  🍃 MongoDB
&lt;/h2&gt;

&lt;p&gt;Por que: Flexibilidade de schema com JSON. Permite evoluir o banco de dados sem a burocracia de migrações complexas.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Redis
&lt;/h2&gt;

&lt;p&gt;Por que: Baixíssima latência. Ideal para cache de sessões e Blacklist de tokens JWT e Rate Limiting, protegendo o banco principal de sobrecarga.&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 MinIO &amp;amp; Multi-storage
&lt;/h2&gt;

&lt;p&gt;Por que: Compatibilidade com Amazon S3. Desacopla arquivos do banco de dados e permite migrar para qualquer nuvem facilmente.&lt;/p&gt;

&lt;h2&gt;
  
  
  📊 Prometheus &amp;amp; Grafana
&lt;/h2&gt;

&lt;p&gt;Por que: Visibilidade total. Monitora a saúde da API, latência e recursos em tempo real.&lt;/p&gt;

&lt;h2&gt;
  
  
  🐳 Docker
&lt;/h2&gt;

&lt;p&gt;Por que: Portabilidade absoluta. Garante que o sistema rode idêntico em qualquer ambiente (Cloud-native).&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Conclusão:&lt;/strong&gt; Uma base sólida para sair do zero direto para o nível corporativo.&lt;/p&gt;

&lt;p&gt;O que achou dessa stack? No próximo post, vou detalhar a organização das Camadas para garantir manutenção e escala.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Código fonte:&lt;/strong&gt; &lt;a href="https://github.com/ortiz-python-templates/python-mongodb-api" rel="noopener noreferrer"&gt;https://github.com/ortiz-python-templates/python-mongodb-api&lt;/a&gt;&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%2F1h7qp3720eatdh6w3zq8.jpg" 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%2F1h7qp3720eatdh6w3zq8.jpg" alt=" " width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>fastapi</category>
      <category>mongodb</category>
      <category>docker</category>
    </item>
    <item>
      <title>Identidade e Segurança — Autenticação (Python Template Mongo API)</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Wed, 14 Jan 2026 10:33:42 +0000</pubDate>
      <link>https://dev.to/ortizdavid/identidade-e-seguranca-autenticacao-python-template-mongo-api-105l</link>
      <guid>https://dev.to/ortizdavid/identidade-e-seguranca-autenticacao-python-template-mongo-api-105l</guid>
      <description>&lt;p&gt;Para sistemas modernos, autenticação não é apenas "validar usuário e senha". É sobre garantir persistência segura, performance e rastreabilidade.&lt;br&gt;
Neste exemplo, implementamos um fluxo completo utilizando FastAPI, MongoDB, JWT, Redis e Middleware.&lt;/p&gt;

&lt;h1&gt;
  
  
  Componentes chaves da solução
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dual Token Strategy (Access e Refresh)&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Access Token: Curta duração, enviado via Header ou Cookie para autorizar requisições.&lt;/li&gt;
&lt;li&gt;Refresh Token: Longa duração, armazenado via HttpOnly para gerar novos access tokens com segurança.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Middleware de Autenticação:&lt;/strong&gt; Camada que intercepta as requisições e valida os tokens, liberando automaticamente as rotas públicas (/login, /docs, /health).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token Blacklist (Redis):&lt;/strong&gt; Gerenciamento de estado para tokens revogados durante o logout, impedindo ataques de replay.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Login Activity Tracking:&lt;/strong&gt; Captura rica de dados do ambiente (Dispositivo, Navegador, SO, IP) usando device-detector para auditoria e segurança.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Fluxo de Login (Passo a Passo)
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Requisição de Login:&lt;/strong&gt; O cliente envia email e password. O AuthService valida as credenciais no MongoDB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geração e Persistência:&lt;/strong&gt; O JwtService gera os tokens. Eles são injetados na resposta como Cookies HttpOnly, uma barreira crucial contra ataques XSS.
3.&lt;strong&gt;Registro de Atividade:&lt;/strong&gt; O LoginActivityService analisa o 'User-Agent' e salva o snapshot do acesso (dispositivo e localização).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Middleware em Ação:&lt;/strong&gt; Em cada rota protegida, o Middleware extrai o token, verifica se não está na Blacklist do Redis, valida o usuário e o anexa ao request.state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ciclo de Refresh:&lt;/strong&gt; Quando o Access Token expira, o endpoint /refresh-access-token valida o Refresh Token e emite um novo par, mantendo a UX sem interrupções.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Este fluxo foi pensado para ambientes reais de produção, indo muito além do básico de tutoriais.&lt;br&gt;
A combinação de Stateless JWT com Stateful Blacklist (Redis) oferece o melhor dos dois mundos: escalabilidade e controle.&lt;br&gt;
Na próxima parte, falaremos sobre autorização baseada em Roles &amp;amp; Permissions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Código Fonte:&lt;/strong&gt; &lt;a href="https://github.com/ortiz-python-templates/python-mongodb-api" rel="noopener noreferrer"&gt;https://github.com/ortiz-python-templates/python-mongodb-api&lt;/a&gt;&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%2F1e5x2cttvo397l96q830.jpg" 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%2F1e5x2cttvo397l96q830.jpg" alt=" " width="800" height="595"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>fastapi</category>
      <category>redis</category>
      <category>backend</category>
    </item>
    <item>
      <title>🚀 Production-Ready FastAPI Template (Python)</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Thu, 18 Dec 2025 16:39:17 +0000</pubDate>
      <link>https://dev.to/ortizdavid/production-ready-fastapi-template-python-44k9</link>
      <guid>https://dev.to/ortizdavid/production-ready-fastapi-template-python-44k9</guid>
      <description>&lt;p&gt;Depois de anos desenvolvendo &lt;strong&gt;APIs e sistemas backend em produção&lt;/strong&gt;, organizei e liberei o template que uso como base para projetos reais.&lt;/p&gt;

&lt;p&gt;O objetivo é simples: &lt;strong&gt;começar novos produtos já com arquitetura sólida&lt;/strong&gt;, segurança, observabilidade e produtividade desde o primeiro commit.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧩 O que este template entrega:
&lt;/h3&gt;

&lt;p&gt;🔐 &lt;strong&gt;Identity &amp;amp; Security&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users, Roles &amp;amp; Permissions&lt;/li&gt;
&lt;li&gt;JWT (access + refresh tokens)&lt;/li&gt;
&lt;li&gt;Redis para blacklist de tokens, cache e rate limit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Login Activity tracking&lt;/strong&gt; (auditoria de acessos)&lt;/li&gt;
&lt;li&gt;Middlewares de autenticação e autorização&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🗄️ &lt;strong&gt;MongoDB bem estruturado&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Base model reutilizável (&lt;code&gt;base_mongo_model&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Repositórios separados (Query / Command)&lt;/li&gt;
&lt;li&gt;Índices, views e modelos organizados por domínio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚙️ &lt;strong&gt;Configurações do sistema&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Basic Configurations&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Company Configurations&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature Flags&lt;/strong&gt; nativas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📦 &lt;strong&gt;Storage&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MinIO (S3-compatible)&lt;/li&gt;
&lt;li&gt;Google Cloud Storage&lt;/li&gt;
&lt;li&gt;Filesystem local&lt;/li&gt;
&lt;li&gt;Upload/download seguro&lt;/li&gt;
&lt;li&gt;Gestão de &lt;strong&gt;user attachments&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📨 &lt;strong&gt;Emails&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Envio de emails transacionais&lt;/li&gt;
&lt;li&gt;Templates HTML prontos&lt;/li&gt;
&lt;li&gt;Estrutura simples para novos tipos de email&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📊 &lt;strong&gt;Observabilidade &amp;amp; Infra&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker &amp;amp; Docker Compose&lt;/li&gt;
&lt;li&gt;Logging estruturado&lt;/li&gt;
&lt;li&gt;Tracing com OpenTelemetry / Jaeger&lt;/li&gt;
&lt;li&gt;Métricas prontas para Prometheus&lt;/li&gt;
&lt;li&gt;Dashboards Grafana&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🧰 &lt;strong&gt;Features enterprise&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Feature Flags por ambiente&lt;/li&gt;
&lt;li&gt;Rate limiting&lt;/li&gt;
&lt;li&gt;CORS configurável&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Healthcheck completo&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MongoDB&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;Storage&lt;/li&gt;
&lt;li&gt;CPU, RAM e disco&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;🧱 &lt;strong&gt;Arquitetura limpa&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Código &lt;strong&gt;fácil de ler e manter&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Arquitetura direta ao ponto (sem overengineering)&lt;/li&gt;
&lt;li&gt;Organização por domínio (identity, configurations, files, etc.)&lt;/li&gt;
&lt;li&gt;Separação clara: controllers, services, repositories, schemas e models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🛠️ &lt;strong&gt;Produtividade&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Makefile automatizado&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;comandos Docker&lt;/li&gt;
&lt;li&gt;comandos Python&lt;/li&gt;
&lt;li&gt;setup rápido de ambiente&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Boilerplate mínimo, foco no que importa&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  🎯 Ideal para:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Startups que querem lançar rápido &lt;strong&gt;sem dívida técnica&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Empresas que precisam padronizar FastAPI&lt;/li&gt;
&lt;li&gt;Devs backend que trabalham com sistemas reais&lt;/li&gt;
&lt;li&gt;APIs, microserviços, SaaS e ERPs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔗 &lt;strong&gt;Repositório (Open Source):&lt;/strong&gt;&lt;br&gt;
👉 &lt;em&gt;&lt;a href="https://github.com/ortiz-python-templates/python-mongodb-api" rel="noopener noreferrer"&gt;https://github.com/ortiz-python-templates/python-mongodb-api&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Feedbacks e contribuições são muito bem-vindos 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  🔒 Aviso (importante)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Template pensado para produção real: código legível, arquitetura objetiva e ferramentas que aceleram o dia a dia do backend.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>python</category>
      <category>fastapi</category>
      <category>mongodb</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Como desenvolver software de forma ágil mesmo com poucos requisitos</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Fri, 31 Oct 2025 08:42:11 +0000</pubDate>
      <link>https://dev.to/ortizdavid/como-desenvolver-software-de-forma-agil-mesmo-com-poucos-requisitos-3jei</link>
      <guid>https://dev.to/ortizdavid/como-desenvolver-software-de-forma-agil-mesmo-com-poucos-requisitos-3jei</guid>
      <description>&lt;p&gt;As metodologias ágeis trouxeram muitos benefícios para o desenvolvimento de software nos tempos modernos.&lt;/p&gt;

&lt;p&gt;Mas nem tudo são flores.&lt;br&gt;
Há coisas que não se encaixam na prática — cada empresa tem a sua estrutura, os seus problemas e as suas particularidades.&lt;/p&gt;

&lt;p&gt;Grandes frameworks de agilidade podem, às vezes, complicar mais do que ajudar.&lt;br&gt;
O mundo real é caótico — e é preciso adaptar o ágil à realidade de cada empresa.&lt;/p&gt;

&lt;p&gt;Para o desenvolvedor, o essencial é usar a experiência para se adaptar e manter a produtividade.&lt;br&gt;
Mesmo com poucos requisitos, é possível entregar valor e gerar impacto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Factores externos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Informações nebulosas&lt;/li&gt;
&lt;li&gt;Requisitos limitados&lt;/li&gt;
&lt;li&gt;Experiência reduzida da equipa&lt;/li&gt;
&lt;li&gt;Prazos curtos para o lançamento&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nestes casos, o que realmente orienta o desenvolvimento é a habilidade em arquitetura e design de software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sugestões práticas
&lt;/h2&gt;

&lt;p&gt;Observar cenários semelhantes&lt;br&gt;
Pesquisar softwares da mesma natureza&lt;br&gt;
Adaptar o sistema a padrões internacionais&lt;/p&gt;

&lt;h2&gt;
  
  
  Resolução do problema
&lt;/h2&gt;

&lt;p&gt;O que funciona é um acordo entre a equipa, reduzindo burocracias e focando no essencial.&lt;/p&gt;

&lt;p&gt;Até o WhatsApp pode ser mais ágil que muitas ferramentas complexas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fluxo rápido que funciona na prática
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Identificar o problema&lt;/li&gt;
&lt;li&gt;Definir requisitos mínimos&lt;/li&gt;
&lt;li&gt;Fazer um rascunho simples&lt;/li&gt;
&lt;li&gt;Criar uma branch para resolver o problema&lt;/li&gt;
&lt;li&gt;Implementar a funcionalidade&lt;/li&gt;
&lt;li&gt;Push + Merge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No fim das contas, o que faz a diferença não é o método, mas a capacidade de adaptação.&lt;br&gt;
Os melhores desenvolvedores são os que transformam o caos em clareza e o pouco em resultado.&lt;/p&gt;

</description>
      <category>agile</category>
      <category>softwareengineering</category>
      <category>git</category>
      <category>webdev</category>
    </item>
    <item>
      <title>A refactoração é uma tarefa complexa</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Sat, 25 Oct 2025 20:04:37 +0000</pubDate>
      <link>https://dev.to/ortizdavid/a-refactoracao-e-uma-tarefa-complexa-2igi</link>
      <guid>https://dev.to/ortizdavid/a-refactoracao-e-uma-tarefa-complexa-2igi</guid>
      <description>&lt;p&gt;A refactoração, ao contrário do que a teoria sugere, é uma tarefa muito complexa. Os livros e artigos costumam mostrar exemplos de funções simples e classes pequenas, mas o mundo real está muito distante dessa visão superficial.&lt;br&gt;
Projectos reais carregam uma história — um conjunto de decisões que foram tomadas ao longo do tempo e que levaram o código ao estado actual.&lt;br&gt;
 É comum pensar que o projecto está desorganizado ou que não segue boas práticas, mas muitas dessas decisões foram influenciadas pela pressão do negócio e pela necessidade de entregar rápido.&lt;/p&gt;

&lt;h1&gt;
  
  
  Contexto de projectos reais
&lt;/h1&gt;

&lt;p&gt;Em projectos reais, é comum encontrar arquivos com milhares de linhas. O que realmente ajuda é entender os padrões, perceber a intenção original e agir com cuidado.&lt;br&gt;
Refactorar é muito diferente da teoria. Não se trata apenas de mudar o nome de uma classe, struct ou arquivo — há muitas variáveis envolvidas.&lt;/p&gt;

&lt;h1&gt;
  
  
  Algumas técnicas que ajudam
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Identificar código repetido&lt;/li&gt;
&lt;li&gt;Mover abstrações para helpers&lt;/li&gt;
&lt;li&gt;Fazer refactorações pequenas e seguras, em vez de grandes mudanças de uma só vez
Em outras linguagens, seria comum dividir grandes arquivos em várias classes. Mas em Go, a estrutura da linguagem facilita bastante esse processo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Refactoração em Go
&lt;/h1&gt;

&lt;p&gt;A linguagem Go ajuda muito na refactoração:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Funções a nível de pacote&lt;/li&gt;
&lt;li&gt;Structs a nível de pacote&lt;/li&gt;
&lt;li&gt;Facilidade em isolar helpers, mesmo sem classes
Além disso, usar uma boa IDE faz toda a diferença — facilita navegar, testar e refactorar com segurança.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refactorar é mais sobre compreender o contexto do código do que apenas reescrever funções. É um processo de respeito pela história do projecto e de construção de algo melhor, passo a passo.&lt;/p&gt;

</description>
      <category>go</category>
      <category>refactoring</category>
      <category>softwareengineering</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Estrutura de um Projecto de Back-end</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Mon, 22 Sep 2025 09:58:45 +0000</pubDate>
      <link>https://dev.to/ortizdavid/estrutura-de-um-projecto-de-back-end-603</link>
      <guid>https://dev.to/ortizdavid/estrutura-de-um-projecto-de-back-end-603</guid>
      <description>&lt;p&gt;Criar software ao longo do tempo pode se tornar uma tarefa difícil. À medida que as funcionalidades crescem, é necessário organizar o projeto para facilitar evolução e manutenção.&lt;/p&gt;

&lt;p&gt;Por isso, compartilho uma sugestão que tenho aplicado nas minhas soluções e que tem funcionado muito bem.&lt;/p&gt;

&lt;p&gt;Esta estrutura é simples, independente da linguagem, e ajuda a evoluir o projeto de forma mais organizada.&lt;/p&gt;

&lt;p&gt;A ideia principal é separar código fonte, scripts e arquivos de configuração.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estrutura Genérica
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;src: código fonte da aplicação (core e common)&lt;/li&gt;
&lt;li&gt;database: migrações, seeds e scripts de banco de dados (SQL e MongoDB)&lt;/li&gt;
&lt;li&gt;docker: arquivos de configuração Docker e Docker Compose&lt;/li&gt;
&lt;li&gt;docs: documentação do projeto (API, arquitetura, regras de negócio)&lt;/li&gt;
&lt;li&gt;generic: guia de organização genérica, referência para estruturar o projeto&lt;/li&gt;
&lt;li&gt;observability: monitoramento e métricas (Grafana, Prometheus)&lt;/li&gt;
&lt;li&gt;public: arquivos públicos, imagens, estáticos e templates (emails, relatórios)&lt;/li&gt;
&lt;li&gt;scripts: scripts auxiliares (build, deploy, jobs)&lt;/li&gt;
&lt;li&gt;tests: testes automatizados&lt;/li&gt;
&lt;li&gt;ponto de entrada / EntryPoint: Ex: main.go, app.py ou Program.cs. Faz o setup dos middlewares, controllers e seed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Repositório
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ortizdavid/backend-project-structure" rel="noopener noreferrer"&gt;https://github.com/ortizdavid/backend-project-structure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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%2F7xinr8uv4bvixf7knswc.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%2F7xinr8uv4bvixf7knswc.png" alt=" " width="453" height="652"&gt;&lt;/a&gt;&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%2Fdtj5zvur6oraei0idpf5.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%2Fdtj5zvur6oraei0idpf5.png" alt=" " width="428" height="796"&gt;&lt;/a&gt;&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%2Fhl3khl0k7hu297z74qjk.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%2Fhl3khl0k7hu297z74qjk.png" alt=" " width="467" height="813"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>O Culto à Ignorância</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Mon, 15 Sep 2025 11:37:56 +0000</pubDate>
      <link>https://dev.to/ortizdavid/o-culto-a-ignorancia-4m12</link>
      <guid>https://dev.to/ortizdavid/o-culto-a-ignorancia-4m12</guid>
      <description>&lt;p&gt;Atualmente nas redes sociais cresce uma onda perigosa: a banalização da educação formal e a exaltação da ignorância.&lt;br&gt;
Casos isolados de sucesso financeiro são usados para demonizar a formação acadêmica.&lt;/p&gt;

&lt;h1&gt;
  
  
  Frases comuns
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;"Não preciso de estudos, só de visão."&lt;/li&gt;
&lt;li&gt;"Bill Gates não terminou a faculdade."&lt;/li&gt;
&lt;li&gt;"Conheço pessoas que abandonaram a escola e são bem-sucedidas."&lt;/li&gt;
&lt;li&gt;"Não preciso de estudo, preciso de conexões."&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Verdades duras
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Negócios podem falir por pura ignorância.&lt;/li&gt;
&lt;li&gt;Dispositivos eletrônicos só existem graças a décadas de experimentos científicos.&lt;/li&gt;
&lt;li&gt;Estratégias de marketing nasceram em ambientes acadêmicos.&lt;/li&gt;
&lt;li&gt;Motores, vacinas, redes sociais e a internet são frutos de pesquisa e estudo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Importância do conhecimento
&lt;/h1&gt;

&lt;p&gt;Nosso avanço civilizacional se deve à ciência, à literatura, ao pensamento crítico.&lt;br&gt;
Sem isso, não teríamos vacinas, nem sementes que salvaram milhões da fome, nem a tecnologia que nos conecta agora.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cenário atual
&lt;/h1&gt;

&lt;p&gt;A ignorância se tornou lucrativa. Idiotas falam com certezas absolutas enquanto sábios duvidam.&lt;br&gt;
Conteúdos rasos viralizam. Pesquisa séria é ignorada.&lt;br&gt;
E a juventude está sendo moldada por isso.&lt;/p&gt;

&lt;h1&gt;
  
  
  O Risco Futuro
&lt;/h1&gt;

&lt;p&gt;Se a sociedade continuar nesse culto à ignorância, estaremos perdidos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Não haverá inovação.&lt;/li&gt;
&lt;li&gt;Não haverá quem dedique a vida a entender padrões e criar soluções.&lt;/li&gt;
&lt;li&gt;A humanidade entrará em colapso.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Precisamos resgatar o valor do conhecimento.&lt;br&gt;
A ciência, a educação e o pensamento crítico são os verdadeiros motores da humanidade.&lt;/p&gt;

&lt;p&gt;A ignorância pode dar likes, mas nunca construiu um motor.&lt;br&gt;
Sem conhecimento não há futuro.&lt;/p&gt;

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