<?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.us-east-2.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>Breakdown de Cálculos: A Fórmula que Conta a Própria História</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Wed, 14 Oct 2026 00:14:46 +0000</pubDate>
      <link>https://dev.to/ortizdavid/breakdown-de-calculos-a-formula-que-conta-a-propria-historia-432i</link>
      <guid>https://dev.to/ortizdavid/breakdown-de-calculos-a-formula-que-conta-a-propria-historia-432i</guid>
      <description>&lt;p&gt;Algumas regras de negócio não são só código. São fórmulas.&lt;br&gt;
Fórmulas complexas, agregações pesadas, fórmulas que contam a história de um processo inteiro.&lt;/p&gt;

&lt;p&gt;Na maioria dos casos, a regra pode estar certa. Está no papel e está na classe de negócio. Mas onde estão os passos?&lt;/p&gt;

&lt;p&gt;A prática comum é guardar apenas o resultado final.&lt;br&gt;
O certo é guardar os passos até ao resultado: a fórmula com cada parte, os operadores, os valores intermediários e descrições relevantes.&lt;/p&gt;

&lt;p&gt;Qual é a solução?&lt;br&gt;
Breakdown de Fórmulas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conceito
&lt;/h2&gt;

&lt;p&gt;Em vez de o sistema guardar somente total = 5000, ele guarda o processo completo. Essa técnica torna-se a única fonte da verdade.&lt;br&gt;
Cada parte do sistema pega no que precisa desse breakdown: uma parte vai para a BD, outra é libertada no front, outra alimenta o fluxo de negócio.&lt;br&gt;
Podemos até disponibilizar endpoints de simulação para pré-visualizações, sabendo que será sempre o mesmo cálculo final.&lt;br&gt;
Esta fonte organizada pode servir para vários consumidores.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Decompor: Quebre a fórmula em passos atómicos e auditáveis. Base + Taxa - Desconto = Total não é 1 cálculo, são 3 passos.&lt;/li&gt;
&lt;li&gt;Estruturar: Cada passo tem Label, Formula, Valor e Descrição. Não só números.&lt;/li&gt;
&lt;li&gt;Centralizar: Uma única função pura retorna o Breakdown completo. Front, Back e relatórios consomem o mesmo objeto.&lt;/li&gt;
&lt;li&gt;Expor: O front usa o breakdown para criar experiências interativas. O utilizador não vê só o total, vê como chegou lá.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Onde usar
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Formulário de crédito&lt;/li&gt;
&lt;li&gt;Formulário de vendas&lt;/li&gt;
&lt;li&gt;Emissão de fatura com vários itens&lt;/li&gt;
&lt;li&gt;Simuladores (velocidade, aceleração, juros)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;De dashboards com indicadores bonitos até formulários onde o cálculo é feito dinamicamente.&lt;/p&gt;

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

&lt;p&gt;Cálculo bom não é o que só acerta no resultado. É o que se explica sozinho.&lt;br&gt;
Quando a sua fórmula guarda a própria história, ganha transparência para o negócio, auditabilidade para o CTO e confiança para o cliente.&lt;br&gt;
Pare de guardar totais. Comece a guardar histórias.&lt;/p&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/tree/main/calculation-breakdown" rel="noopener noreferrer"&gt;https://github.com/ortizdavid/golang-pocs/tree/main/calculation-breakdown&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flacufflcv5igrspwua14.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flacufflcv5igrspwua14.png" alt=" " width="800" height="307"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh1u4xg4ykbn84aibrnky.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh1u4xg4ykbn84aibrnky.png" alt=" " width="800" height="380"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fom16smrphkrd6acnitvs.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fom16smrphkrd6acnitvs.png" alt=" " width="800" height="375"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjiyniuo3e1rwsl1pipzt.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjiyniuo3e1rwsl1pipzt.png" alt=" " width="800" height="375"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F502dne9arbpn210ygsv6.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F502dne9arbpn210ygsv6.png" alt=" " width="800" height="373"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fry1ajimpwwiaxbllps7b.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fry1ajimpwwiaxbllps7b.png" alt=" " width="800" height="395"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6pdy6l8g50wkndv5ogq9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6pdy6l8g50wkndv5ogq9.png" alt=" " width="800" height="896"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4zsfexbaytvohsz4d129.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4zsfexbaytvohsz4d129.png" alt=" " width="800" height="712"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>softwareengineering</category>
      <category>backend</category>
    </item>
    <item>
      <title>10 anos de PHP</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Mon, 05 Oct 2026 15:51:06 +0000</pubDate>
      <link>https://dev.to/ortizdavid/10-anos-de-php-587h</link>
      <guid>https://dev.to/ortizdavid/10-anos-de-php-587h</guid>
      <description>&lt;p&gt;Este ano completei &lt;strong&gt;10 anos de experiência com a linguagem PHP&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;O meu primeiro sistema &lt;strong&gt;REAL&lt;/strong&gt; não foi em Go. Foi em PHP procedural.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2016.&lt;/strong&gt; 3º ano da faculdade. Projeto de bacharelado: &lt;strong&gt;Sistema de Gestão de Museu&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Eu estava viciado em C e C++. C e Assembly para Arquitetura de Computadores, e C++ para Estrutura de Dados e Algoritmos 1 e 2. Ponteiros, listas ligadas, filas, pilhas, árvores e grafos, tudo feito à mão.&lt;/p&gt;

&lt;p&gt;Em paralelo, aprendia Java e Orientação a Objetos na cadeira de Programação 2, além de Prolog e Haskell em Programação Declarativa.&lt;/p&gt;

&lt;p&gt;Mas o projeto do museu pedia outro nível: levantamento de requisitos, análise, diagramas UML, base de dados, interface gráfica, gestão de utilizadores...&lt;/p&gt;

&lt;p&gt;A solução mais rápida? &lt;strong&gt;PHP + MySQL.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Foi ali que a ficha caiu. Pela primeira vez, eu não estava só a programar. Eu estava a ser &lt;strong&gt;Engenheiro de Software&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O PHP serviu de ponte para o próximo nível de aplicações (do 3º ao último ano): sistemas que lidavam com interfaces gráficas, perfis de acesso, persistência de dados, refinamento de requisitos funcionais e não funcionais, e a tradução direta de regras de negócio em código.&lt;/p&gt;

&lt;p&gt;Isso explodiu-me a mente:&lt;br&gt;
Requisito -&amp;gt; Documentação -&amp;gt; Modelação -&amp;gt; Base de Dados -&amp;gt; Implementação -&amp;gt; Apresentação.&lt;/p&gt;

&lt;p&gt;E não parei mais.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;2017 - 2018:&lt;/strong&gt; Aperfeiçoei os conhecimentos em PHP Orientado a Objetos e arrisquei criar um ORM próprio para manipular bases de dados — um trabalho que evoluiu ao longo dos anos.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;2019 - 2023:&lt;/strong&gt; Desenvolvi mais de 30 sistemas em PHP e MySQL. Sistemas reais que geriam negócios, freelancers académicos, plataformas de gestão, de tudo um pouco.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O PHP deu-me o que a faculdade muitas vezes não dá: &lt;strong&gt;visão de ponta a ponta e orientação a projetos&lt;/strong&gt;. Foi graças a ele que me destaquei.&lt;/p&gt;

&lt;p&gt;Em 2023 migrei para Go em busca de máxima performance e arquitetura. Mas até hoje mantenho projetos pessoais em PHP. E agora, sigo a criar duas novas ferramentas para retribuir à comunidade: o &lt;strong&gt;LiteTable&lt;/strong&gt; e o &lt;strong&gt;VeloxRouter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Obrigado, PHP. Tu não foste apenas uma linguagem. Foste a minha verdadeira escola de engenharia.&lt;/p&gt;




&lt;p&gt;E tu? Qual foi o teu primeiro sistema real? Ainda te lembras? 👇&lt;/p&gt;

</description>
      <category>backend</category>
      <category>career</category>
      <category>php</category>
      <category>programming</category>
    </item>
    <item>
      <title>Como implementar Auto-Healing para Blindar Microsserviços em Go em Infra Volátil</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Thu, 01 Oct 2026 19:02:25 +0000</pubDate>
      <link>https://dev.to/ortizdavid/como-implementar-auto-healing-para-blindar-microsservicos-em-go-em-infra-volatil-akj</link>
      <guid>https://dev.to/ortizdavid/como-implementar-auto-healing-para-blindar-microsservicos-em-go-em-infra-volatil-akj</guid>
      <description>&lt;p&gt;Muitas aplicações precisam de restart manual porque o Redis, Postgres ou RabbitMQ ficou offline por apenas 30 segundos. Por que é que preciso acordar às 3h da manhã para dar restart na API se a infra já voltou?&lt;br&gt;
O sistema em produção deve se curar sozinho. Para isso, precisamos de um mecanismo que tente reconectar dependências perdidas sem derrubar o processo principal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conceitos-Chave
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Self-Healing: Capacidade da app detectar uma dependência morta e tentar reviver sozinha.&lt;/li&gt;
&lt;li&gt;Exponential Backoff / Ticker: Intervalos controlados para varredura contínua sem saturar a rede.&lt;/li&gt;
&lt;li&gt;Hot-Swap de Dependência: Trocar em runtime uma implementação No-Op por uma Real quando o serviço volta.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Anatomia da Blindagem
&lt;/h2&gt;

&lt;p&gt;O nosso InfraResources não deve apenas iniciar uma vez. Ele deve vigiar continuamente os recursos e realizar a troca dinâmica de forma concorrente em background, utilizando goroutines isoladas e proteção via sync.RWMutex para evitar condições de corrida (race conditions).&lt;/p&gt;

&lt;h2&gt;
  
  
  Base para a Implementação
&lt;/h2&gt;

&lt;p&gt;A base continua sendo a Programação por Contratos. Como já temos interfaces e implementações No-Op, o ciclo de auto-healing valida o estado atual através de verificações de Ping com timeout controlado, aplica o fallback automático caso a conexão falhe, ou executa o hot-swap transparente para o cliente real assim que o serviço se estabiliza.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefícios Reais
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Zero Ops de madrugada: A app se recupera sozinha de quedas de rede em clouds gratuitas ou instáveis.&lt;/li&gt;
&lt;li&gt;Sem K8s: Resiliência a nível de aplicação, sem precisar de orquestrador externo.&lt;/li&gt;
&lt;li&gt;Degradação Elegante: O sistema funciona sem cache/fila até eles voltarem, em vez de morrer.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Muita gente acha que alta disponibilidade é ter Kubernetes. Na verdade, é fazer sua app saber viver sem e se curar quando a dependência volta. Implementar Auto-Healing com No-Ops é como dar um sistema imunológico para seu microsserviço em Go.&lt;/p&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/tree/main/resilience" rel="noopener noreferrer"&gt;https://github.com/ortizdavid/golang-pocs/tree/main/resilience&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuzet72128fakr28yagih.jpeg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuzet72128fakr28yagih.jpeg" alt=" " width="800" height="282"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjpgwuiulwd7szo7yxmli.jpeg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjpgwuiulwd7szo7yxmli.jpeg" alt=" " width="800" height="368"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3k7at58rs6h2109agxsk.jpeg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3k7at58rs6h2109agxsk.jpeg" alt=" " width="800" height="261"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbu74zv952fnpqvzrxjr4.jpeg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbu74zv952fnpqvzrxjr4.jpeg" alt=" " width="800" height="432"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fajvt2l9qi7mmwl9xrwiw.jpeg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fajvt2l9qi7mmwl9xrwiw.jpeg" alt=" " width="800" height="335"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ysaa4zgllr9to6a7y1s.jpeg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ysaa4zgllr9to6a7y1s.jpeg" alt=" " width="799" height="380"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2tj0ha18c3n61pst2ox4.jpeg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2tj0ha18c3n61pst2ox4.jpeg" alt=" " width="800" height="878"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fymsdzgnnp4wkjagy4we0.jpeg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fymsdzgnnp4wkjagy4we0.jpeg" alt=" " width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>performance</category>
      <category>microservices</category>
      <category>backend</category>
    </item>
    <item>
      <title>O CARTEL DE VAGAS EM ANGOLA</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Mon, 21 Sep 2026 20:21:08 +0000</pubDate>
      <link>https://dev.to/ortizdavid/o-cartel-de-vagas-em-angola-51m3</link>
      <guid>https://dev.to/ortizdavid/o-cartel-de-vagas-em-angola-51m3</guid>
      <description>&lt;p&gt;Há um CARTEL DE VAGAS em Angola.&lt;br&gt;
Muita gente sabe. Mas prefere calar. Por medo de cancelamento e retaliação.&lt;/p&gt;

&lt;p&gt;Mas a verdade é que já tens sofrido a retaliação, já tens sofrido o cancelamento.&lt;br&gt;
Quando passas por todas as fases do processo seletivo e a vaga desaparece.&lt;br&gt;
Quando estás à espera do feedback final e, num instante, vês outros a começarem na vaga que esperas há meses, sem precisão envolvida.&lt;/p&gt;

&lt;p&gt;QUEM FORMA O CARTEL?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Grandes bancos&lt;/li&gt;
&lt;li&gt;Consultorias famosas&lt;/li&gt;
&lt;li&gt;Big Four&lt;/li&gt;
&lt;li&gt;Instituições públicas&lt;/li&gt;
&lt;li&gt;Empresas médias
É praticamente impossível entrar só com capacidade.
Sabe por quê?
Porque a vaga nunca foi pública.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O "NETWORKING" QUE NÃO É NETWORKING&lt;br&gt;
Em Angola existe um "networking" que, na verdade, é um CARTEL.&lt;br&gt;
As melhores vagas de 1M, 2M, 3M KZ não vão para o LinkedIn.&lt;br&gt;
Não vão para o Emprego.co.ao.&lt;br&gt;
Não vão para lugar nenhum.&lt;br&gt;
Elas vão:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Para o grupo de WhatsApp dos "amigos".&lt;/li&gt;
&lt;li&gt;Para o "filho do meu colega".&lt;/li&gt;
&lt;li&gt;Para o "sobrinho do diretor".
Requisitos? Zero.
Portfólio? Ninguém vê.
Experiência comprovada? Raramente.
Teste técnico? Nem pensar.
O único requisito é: Ser dos nossos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;E QUEM FICA DE FORA?&lt;br&gt;
Profissionais com 5, 7, 10 anos de código.&lt;br&gt;
Java, C#, React, Arquitetura, Node.&lt;br&gt;
Que constroem sistemas. Que resolvem problemas.&lt;br&gt;
São ignorados por anos.&lt;br&gt;
Porque não são "do grupo".&lt;/p&gt;

&lt;p&gt;OS DEVS ESTÃO CANSADOS&lt;br&gt;
Os devs estão cansados.&lt;br&gt;
Cansados de bater na porta fechada.&lt;br&gt;
Cansados de ver quem não entrega ganhar 3M KZ enquanto quem entrega rala.&lt;br&gt;
Por isso muitos fizeram o que precisava ser feito:&lt;br&gt;
Derrubaram a parede e saíram.&lt;/p&gt;

&lt;p&gt;DERRUBARAM A PAREDE&lt;br&gt;
Foram para o empreendedorismo, criaram produtos, arriscaram e deram cara ao desafio de começar uma empresa.&lt;br&gt;
Foram para o mercado global.&lt;br&gt;
Lá não existe cartel.&lt;br&gt;
Lá existe: Código. Entrega. Resultado. Dólar.&lt;br&gt;
Ninguém pergunta "de quem tu és filho".&lt;br&gt;
Perguntam:&lt;br&gt;
"Consegues entregar em 2 semanas?"&lt;/p&gt;

&lt;p&gt;A VERDADE DÓI, MAS LIBERTA&lt;br&gt;
Enquanto se depender do cartel local, eles controlam a empregabilidade, salário e motivação profissional.&lt;br&gt;
Quando se vai para o empreendedorismo ou para o mercado global, eles não mandam mais.&lt;br&gt;
Chega de mendigar migalha.&lt;br&gt;
Chega de preço de banana.&lt;br&gt;
Chega de porta fechada.&lt;br&gt;
Chega de fingir que "networking" é meritocracia.&lt;/p&gt;

&lt;p&gt;JÁ PASSASTE POR ISSO?&lt;br&gt;
Comenta "CARTEL" se já passaste por isso.&lt;br&gt;
Quero ver quantos foram ignorados.&lt;/p&gt;

&lt;p&gt;Na próxima publicação, voltarei aos posts técnicos e falarei sobre Auto-healing numa aplicação Go.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmuzp83nipe71eymr0oo2.jpeg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmuzp83nipe71eymr0oo2.jpeg" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>discuss</category>
      <category>interview</category>
    </item>
    <item>
      <title>A Culpa não é do teu Currículo</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Mon, 14 Sep 2026 18:22:41 +0000</pubDate>
      <link>https://dev.to/ortizdavid/a-culpa-nao-e-do-teu-curriculo-5979</link>
      <guid>https://dev.to/ortizdavid/a-culpa-nao-e-do-teu-curriculo-5979</guid>
      <description>&lt;p&gt;Não é o teu CV.&lt;br&gt;
Não são as tuas habilidades.&lt;br&gt;
Não é falta de soft skills.&lt;/p&gt;

&lt;p&gt;É o sistema.&lt;/p&gt;

&lt;p&gt;Um sistema viciado. Desenhado para justificar rejeições e criar 100 requisitos ocultos que ninguém cumpre.&lt;/p&gt;

&lt;p&gt;A realidade em Angola é esta:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Processos longos e confusos&lt;br&gt;
15 fases. Entrevistas que correm bem. Perguntas técnicas e comportamentais com cenários reais, todas respondidas. E depois... silêncio. Sem feedback.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Candidatos esquecidos&lt;br&gt;
Gente capacitada, com experiência comprovada, que passou em todas as fases e fica 1, 2 anos à espera de retorno.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Entradas rápidas e sem critério&lt;br&gt;
E na mesma vaga, entram pessoas com menos capacidade, menos experiência, sem passar por metade das fases. Em poucas semanas.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Porquê?&lt;br&gt;
Porque a triagem já começou antes do anúncio. Faz parte do teatro.&lt;br&gt;
Os "DELES" já foram escolhidos primeiro.&lt;/p&gt;

&lt;p&gt;O que pesa mais que o CV:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Indicações - o famoso QI&lt;/li&gt;
&lt;li&gt;Membros da família&lt;/li&gt;
&lt;li&gt;Amigos do círculo
&lt;/li&gt;
&lt;li&gt;Testes de fachada&lt;/li&gt;
&lt;li&gt;Rivalidades escondidas&lt;/li&gt;
&lt;li&gt;Mal uso da IA para filtrar candidatos. E quem percebe os erros da IA, aproveita.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pedem "sopa de letras" de requisitos intangíveis. Requisitos que nem o próprio gestor domina.&lt;/p&gt;

&lt;p&gt;Tu gastas horas a melhorar o CV com técnicas dadas por RH experiente. E nada funciona.&lt;br&gt;
Porque a culpa não é do currículo. É do sistema.&lt;/p&gt;

&lt;p&gt;Já passaste por isso?&lt;br&gt;
Comenta aqui qual foi a fase mais absurda que já enfrentaste num processo seletivo.&lt;/p&gt;

&lt;p&gt;Vamos expor isso. Precisamos falar sobre isso.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fljkdd0rhzt2ll1pd3b9o.jpeg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fljkdd0rhzt2ll1pd3b9o.jpeg" alt=" " width="800" height="1394"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hiring</category>
      <category>career</category>
    </item>
    <item>
      <title>A Invisibilidade dos devs angolanos</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Tue, 08 Sep 2026 14:40:40 +0000</pubDate>
      <link>https://dev.to/ortizdavid/a-invisibilidade-dos-devs-angolanos-1dhh</link>
      <guid>https://dev.to/ortizdavid/a-invisibilidade-dos-devs-angolanos-1dhh</guid>
      <description>&lt;p&gt;O maior problema dos Devs Angolanos não é técnica. É invisibilidade.&lt;/p&gt;

&lt;p&gt;Tive esse debate esses dias e a verdade doeu:&lt;/p&gt;

&lt;p&gt;"Nós angolanos somos fechados neste lado" &lt;br&gt;
“Apenas mostram cargos e status”&lt;br&gt;
"Quantos devs que trabalham remoto partilham a experiência??"&lt;br&gt;
"É a praga do 'SE TIREI, SE SAFEI'. Estes têm afundado o bastante."&lt;/p&gt;

&lt;p&gt;E é verdade.&lt;/p&gt;

&lt;p&gt;Enquanto os indianos mostram resultado e são contratados...&lt;br&gt;
Enquanto os brasileiros fazem 20 webinar, bootcamp, postam código, ensinam de graça só para serem vistos...&lt;/p&gt;

&lt;p&gt;Nós ficamos nos grupinhos. &lt;br&gt;
Cada um tentando construir a própria ponte pra atravessar o rio.&lt;/p&gt;

&lt;p&gt;Supondo que o problema seja atravessar o rio, é imprudente cada um gastar tempo e dinheiro construindo sua ponte sozinho. &lt;/p&gt;

&lt;p&gt;Com colaboração conseguimos construir a ponte e todos passam mais rápido e criamos mais oportunidades para os devs angolanos.&lt;/p&gt;

&lt;p&gt;O Dev angolano não vende o peixe. Raramente partilha conhecimento, por mais simples que seja.&lt;br&gt;
Não mostra portfólio. Não tem presença. Não cria reputação. &lt;br&gt;
Resultado: preferem contratar quem aparece.&lt;/p&gt;

&lt;p&gt;Se continuarmos a divulgar, a ensinar, a mostrar resultado...&lt;br&gt;
Eles virão atrás dos angolanos também.&lt;/p&gt;

&lt;p&gt;Chega de individualismo. &lt;br&gt;
Chega de obsolescência no cantinho.&lt;br&gt;
A partilha pode ser o termômetro para cada um entender em que fase se encontra e qual será a próxima.&lt;/p&gt;

&lt;p&gt;Vamos partilhar conhecimento. &lt;br&gt;
Vamos atrair remoto. &lt;br&gt;
Vamos construir a ponte juntos.&lt;/p&gt;

</description>
      <category>software</category>
      <category>angola</category>
      <category>remote</category>
    </item>
    <item>
      <title>Por que contratar um Dev Remoto Angolano?</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Tue, 01 Sep 2026 14:06:57 +0000</pubDate>
      <link>https://dev.to/ortizdavid/por-que-contratar-um-dev-remoto-angolano-2il4</link>
      <guid>https://dev.to/ortizdavid/por-que-contratar-um-dev-remoto-angolano-2il4</guid>
      <description>&lt;p&gt;Enquanto todo mundo disputa os mesmos devs caros nos EUA e Europa, existe um mercado inteiro de talento sendo ignorado: Angola.&lt;/p&gt;

&lt;p&gt;Aqui vão 4 motivos reais:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Custo x Qualidade
Formação sólida, bilíngue PT/EN, fuso GMT+1. Mesma qualidade técnica, investimento 3x menor. Oportunidade que gera impacto real.&lt;/li&gt;
&lt;li&gt;Fome de Crescimento
Aqui as vagas são poucas e muito concorridas. Quando um dev angolano recebe uma chance global, ele agarra com as duas mãos e entrega 200%.&lt;/li&gt;
&lt;li&gt;Resiliência nível Hard
Aprender a programar com poucos recursos te ensina a ser criativo e resolver problema. Qualquer desafio de produto é pequeno perto disso.&lt;/li&gt;
&lt;li&gt;Pagamento? Resolvido
SWIFT, Wise, Payoneer, Deel. Já não é mais desculpa. O dinheiro chega em USD.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Angola está cheia de talento que só precisa da primeira porta aberta.&lt;/p&gt;

&lt;p&gt;Dê essa oportunidade. Você ganha um dev leal, dedicado e com algo pra provar. Nós ganhamos a chance de mostrar nosso valor.&lt;/p&gt;

&lt;p&gt;Angola pode ser a nova Índia do desenvolvimento de software.&lt;/p&gt;

&lt;p&gt;Aqui existem milhares de desenvolvedores resilientes, criativos e altamente qualificados. Gente que entrega resultado de excelência mesmo com poucos recursos, internet instável e prazos apertados.&lt;/p&gt;

&lt;p&gt;A tua empresa pode contratar esse talento hoje. &lt;br&gt;
Mesma qualidade de um dev da Europa/EUA. Custo muito menor. Impacto social gigante.&lt;/p&gt;

&lt;p&gt;Dê a primeira oportunidade remota para um desenvolvedor angolano. &lt;br&gt;
A tua empresa contrata talento e consequentemente muda a realidade de uma família inteira.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffa18896nbryussotqi6e.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffa18896nbryussotqi6e.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>angola</category>
      <category>remote</category>
      <category>developer</category>
      <category>software</category>
    </item>
    <item>
      <title>Trabalho Remoto - Como receber os Pagamentos</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Sun, 30 Aug 2026 21:29:08 +0000</pubDate>
      <link>https://dev.to/ortizdavid/trabalho-remoto-como-receber-os-pagamentos-17fb</link>
      <guid>https://dev.to/ortizdavid/trabalho-remoto-como-receber-os-pagamentos-17fb</guid>
      <description>&lt;p&gt;Se enumerarmos os fatores que levantam dúvidas e atrapalham o primeiro passo no trabalho remoto, com certeza a forma de Pagamento e Recebimento do salário ocupa o 1º lugar.&lt;/p&gt;

&lt;p&gt;A incerteza de como a empresa fará os pagamentos do salário e de como o Desenvolvedor vai receber, afasta as negociações.&lt;/p&gt;

&lt;h2&gt;
  
  
  Realidade de Angola
&lt;/h2&gt;

&lt;p&gt;No meu caso, Angola não oferece condições para pagamentos internacionais como es da Europa e América, por exemplo. Esse favor coloca Angola fora de do mapa de trabalho remoto.&lt;/p&gt;

&lt;p&gt;Há muitos casos em que a empresa opta por outros candidatos de países que facilitam essa transação. No meu caso, perdi e continuo a perder  várias oportunidades de emprego, por causa dessa incerteza, desde o jurídico até o financeiro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Métodos/ Sistemas Conhecidos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;WISE&lt;/li&gt;
&lt;li&gt;Revoult&lt;/li&gt;
&lt;li&gt;Payoneer&lt;/li&gt;
&lt;li&gt;USDT&lt;/li&gt;
&lt;li&gt;Stripe &lt;/li&gt;
&lt;li&gt;Nomes Global&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Solução Oficial
&lt;/h2&gt;

&lt;p&gt;A solução mais segura que encontrei foi a transferência internacional por meio do sistema SWIFT.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o SWIFT?
&lt;/h2&gt;

&lt;p&gt;Em poucas palavras: SWIFT é a forma oficial de transferências entre países. Todas transferências comerciais entrar países passam por esse sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estrutura do SWIFT
&lt;/h2&gt;

&lt;p&gt;O Swift é formado pelo IBAN, Endereço do Banco, Código Swift, Registo Bancário, Contacto do Banco e Endereço do Beneficiário.&lt;/p&gt;

&lt;h1&gt;
  
  
  Como usar o SWIFT para pagamentos
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Solicitar os dados SWIFT no seu banco.&lt;/li&gt;
&lt;li&gt;Organizar os dados SWIFT num arquivo PDF ou Imagem&lt;/li&gt;
&lt;li&gt;Fornecer os dados a Empresa&lt;/li&gt;
&lt;li&gt;O valor chega em dólares, na conta do seu banco comercial&lt;/li&gt;
&lt;li&gt;Converter o valor de USD para AOA&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Observações
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A transferência internacional com SWIFT pode durar de 3 a 5 dias úteis&lt;/li&gt;
&lt;li&gt;Necessita de conversão por parte da Empresa, mas é simples&lt;/li&gt;
&lt;li&gt;A transferência requer validação de N bancos intermediários e outras instituições &lt;/li&gt;
&lt;li&gt;O beneficiário sofre pequenos descontos, totalizando aproximadamente 13 000 AOA&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;No início duvidava desse método. &lt;br&gt;
O primeiro contacto foi estranho pela demora mas ganhei confiança nesse método actualmente é o que mais confio.&lt;/p&gt;

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

&lt;p&gt;O SWIFT pode ser a resposta que as empresas estrangeiras procuram durante o recrutamento de Profissionais Angolanos.&lt;br&gt;
As empresas internacionais podem economizar muito, dando oportunidade aos programadores angolanos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo
&lt;/h2&gt;

&lt;p&gt;Em seguida forneço uma imagem com os dados necessários para uma transferência Swift, usando o banco BAI.&lt;/p&gt;

&lt;p&gt;Para mais informações, contactar o seu banco pode trazer as melhores respostas.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpae3rl4le7gczlb6qinr.jpeg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpae3rl4le7gczlb6qinr.jpeg" alt=" " width="800" height="616"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>remote</category>
      <category>backend</category>
    </item>
    <item>
      <title>Minha experiência: 1 ano de Trabalho Remoto</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Sun, 16 Aug 2026 21:59:30 +0000</pubDate>
      <link>https://dev.to/ortizdavid/minha-experiencia-1-ano-de-trabalho-remoto-1amg</link>
      <guid>https://dev.to/ortizdavid/minha-experiencia-1-ano-de-trabalho-remoto-1amg</guid>
      <description>&lt;h2&gt;
  
  
  Como começou
&lt;/h2&gt;

&lt;p&gt;Em junho de 2025 comecei a trabalhar remotamente como Backend Engineer.&lt;br&gt;
Stack: Python, MongoDB e Redis para o desenvolvimento de uma plataforma administrativa multi-organizações, focada no setor jurídico e com expansão para RH e financeiro de cada cliente.&lt;/p&gt;

&lt;p&gt;3 meses depois ingressei em outra oportunidade como Golang Developer, desenvolvendo microsserviços para diferentes produtos: motor de assinatura de documentos, serviço de log e auditoria de sistemas, gestão completa de produtos e até controle de frota com autenticação OTP.&lt;/p&gt;

&lt;p&gt;Depois de 1 ano trabalhando ativamente e de forma deliberada com a cultura remota, adquiri experiências que serão úteis em qualquer oportunidade. Acredito que é o formato que mais se identifica comigo: foco, testar, corrigir e entregar.&lt;/p&gt;

&lt;p&gt;O que esses trabalhos têm em comum: orientação a resultado. São muitas demandas e todos os sistemas têm um requisito básico: multi-tenant. Eu já tinha noções sobre o tema, mas aprendi na prática a lidar com a complexidade de isolar dados sem vazamento entre organizações.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evolução
&lt;/h2&gt;

&lt;p&gt;Anteriormente eu tinha uma má impressão sobre o trabalho remoto. Como seria avaliado? Como mostrar resultados? Como ficariam as interações?&lt;br&gt;
Com o tempo, essas questões se tornaram fáceis para mim.&lt;/p&gt;

&lt;p&gt;Remoto não é desvantagem. Apenas exige um tempo de adaptação, tanto para a empresa quanto para o profissional.&lt;br&gt;
Quem ingressa no remoto e colhe bons resultados, raramente deseja voltar ao formato 100% presencial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparação com o presencial
&lt;/h2&gt;

&lt;p&gt;O formato presencial é bom: há interações pessoais cara a cara, confraternizações, facilidade para explicar inquietações aos líderes e agilidade no dia a dia. Mas, felizmente, a área de software nos dá a possibilidade de trabalhar remoto e entregar mais resultados, abrindo mão apenas da interação pessoal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pontos fortes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Orientação a resultado&lt;/li&gt;
&lt;li&gt;Eficiência&lt;/li&gt;
&lt;li&gt;Reuniões mais curtas&lt;/li&gt;
&lt;li&gt;Sem conversas paralelas&lt;/li&gt;
&lt;li&gt;Obriga a automatizar processos de desenvolvimento&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Desafios
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cobrança maior, pela falta de outros elementos de acompanhamento&lt;/li&gt;
&lt;li&gt;Risco de acúmulo de tarefas em pouco tempo&lt;/li&gt;
&lt;li&gt;Pouca interação pessoal, o que pode ser um problema para alguns&lt;/li&gt;
&lt;li&gt;Questões documentais podem ser menos rigorosas&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Espero permanecer por muitos anos trabalhando remotamente.&lt;br&gt;
Tem sido satisfatório trabalhar nesse formato, de qualquer lugar, entregando resultados com pouca burocracia.&lt;/p&gt;

</description>
      <category>backend</category>
      <category>remote</category>
      <category>go</category>
      <category>python</category>
    </item>
    <item>
      <title>Como implementar No-Ops para Blindar Microsserviços em Go</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Tue, 12 May 2026 13:52:29 +0000</pubDate>
      <link>https://dev.to/ortizdavid/como-implementar-no-ops-para-blindar-microsservicos-em-go-12kd</link>
      <guid>https://dev.to/ortizdavid/como-implementar-no-ops-para-blindar-microsservicos-em-go-12kd</guid>
      <description>&lt;p&gt;Muitas aplicações morrem (&lt;code&gt;panic&lt;/code&gt;) porque um serviço de telemetria ou um broker de mensagens ficou offline por apenas 5 segundos.&lt;br&gt;
Por que é que a minha API de vendas caiu se o problema foi no servidor de logs, de cache ou de tracing?&lt;/p&gt;

&lt;p&gt;O sistema em produção deve resistir em caso de falha de infraestrutura. Para isso, basta definirmos prioridades e criticidade de acordo com o contexto da aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conceitos-Chave
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fail Fast: Para a Database. Se não há dados, não há negócio. Trava o processo cedo.&lt;/li&gt;
&lt;li&gt;Fail-Safe / Graceful Degradation: Para Observabilidade e serviços auxiliares. Se o Tracing caiu, a vida continua.&lt;/li&gt;
&lt;li&gt;Null Object Pattern (No-Op): A técnica de implementar interfaces com métodos vazios (ou neutros) para evitar verificações de &lt;code&gt;if resource != nil&lt;/code&gt; constantes no código de negócio.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Anatomia da Blindagem
&lt;/h2&gt;

&lt;p&gt;A nossa estrutura de &lt;code&gt;InfrapResources&lt;/code&gt; deve ser inteligente ao inicializar os contratos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hard Dependencies: Aquelas que definem o estado (ex: Postgres para transações, Redis para Auth).&lt;/li&gt;
&lt;li&gt;Soft Dependencies: Aquelas que auxiliam o sistema (ex: RabbitMQ para eventos assíncronos, Prometheus, OpenTelemetry).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Base para a Implementação
&lt;/h2&gt;

&lt;p&gt;A base da nossa resiliência reside na Programação por Contratos. Ao definirmos interfaces claras em &lt;code&gt;ports&lt;/code&gt;, permitimos que a aplicação decida, em tempo de boot, qual "peça" encaixar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A peça Real: Conecta ao serviço e executa operações reais.&lt;/li&gt;
&lt;li&gt;A peça No-Op: Silencia falhas e mantém o sistema estável (executa uma operação "vazia").&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ambas respeitam rigorosamente os contratos de infraestrutura: &lt;code&gt;Database&lt;/code&gt;, &lt;code&gt;Cache&lt;/code&gt;, &lt;code&gt;MessageBroker&lt;/code&gt;, entre outros.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefícios Reais
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Developer Experience (DX): O programador não precisa de espalhar &lt;code&gt;if r.Resource != nil&lt;/code&gt; em todo o lado. O contrato está lá e é seguro chamá-lo.&lt;/li&gt;
&lt;li&gt;Resiliência: A app sobrevive em ambientes instáveis (como instâncias gratuitas ou clouds com flutuações de rede).&lt;/li&gt;
&lt;li&gt;Testabilidade: No-Ops são, na prática, Mocks prontos para testes de integração e desenvolvimento local rápido.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Muita gente confunde resiliência com 'nunca falhar'. Na verdade, resiliência é saber o que fazer quando a falha acontece.&lt;br&gt;
Implementar No-Ops em Go é uma das formas mais elegantes de garantir que o teu sistema não entra em pânico por causa de uma dependência não-crítica&lt;/p&gt;

&lt;p&gt;Código Fonte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ortizdavid/golang-pocs/tree/main/resilience" rel="noopener noreferrer"&gt;https://github.com/ortizdavid/golang-pocs/tree/main/resilience&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%2F6tvs8gplvnmxhr1ktw1z.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%2F6tvs8gplvnmxhr1ktw1z.png" alt=" " width="800" height="229"&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%2Fwifpq31ydj45d0876rp5.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%2Fwifpq31ydj45d0876rp5.png" alt=" " width="800" height="397"&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%2Fgngbr9ndrx30dlp7tlas.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%2Fgngbr9ndrx30dlp7tlas.png" alt=" " width="800" height="424"&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%2Fs9fay5l9epv9hxhj8ull.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%2Fs9fay5l9epv9hxhj8ull.png" alt=" " width="800" height="381"&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%2Fivyupjyzayti9at82jld.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%2Fivyupjyzayti9at82jld.png" alt=" " width="800" height="779"&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%2F8ziycgjiyrfae4w0zymh.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%2F8ziycgjiyrfae4w0zymh.png" alt=" " width="800" height="803"&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%2Fe0vp09hwzdunadcbm32p.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%2Fe0vp09hwzdunadcbm32p.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%2Fqoleqacfmn6vbvl5kkbj.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%2Fqoleqacfmn6vbvl5kkbj.png" alt=" " width="800" height="755"&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%2Fdi7ncmzeiko7c5lfjoqp.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%2Fdi7ncmzeiko7c5lfjoqp.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>resilience</category>
      <category>microservices</category>
      <category>go</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>Gerenciamento de Cron Jobs em Golang</title>
      <dc:creator>Ortiz de Arcanjo António David</dc:creator>
      <pubDate>Fri, 24 Apr 2026 15:02:56 +0000</pubDate>
      <link>https://dev.to/ortizdavid/gerenciamento-de-cron-jobs-em-golang-2i13</link>
      <guid>https://dev.to/ortizdavid/gerenciamento-de-cron-jobs-em-golang-2i13</guid>
      <description>&lt;p&gt;Dando continuidade à nossa série sobre tarefas em segundo plano, hoje vamos focar em algo que todo o sistema robusto precisa: Cron Jobs.&lt;/p&gt;

&lt;p&gt;Muitas vezes, precisamos executar uma tarefa em intervalos específicos: a cada 30 minutos, 15 segundos, ou a cada 2 horas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recapitulando: Worker vs Cron Job
&lt;/h2&gt;

&lt;p&gt;Embora ambos rodem em background:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Worker: Foca no processamento contínuo (ex: consumir uma fila até que ela fique vazia).&lt;/li&gt;
&lt;li&gt;Cron Job: Foca na recorrência agendada (ex: gerar um relatório de 15 em 15 minutos).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Exemplos comuns de Cron Jobs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Limpeza de arquivos temporários: Evitar que o disco fique cheio com logs antigos.&lt;/li&gt;
&lt;li&gt;Relatórios de Negócio: Consolidar vendas do dia anterior.&lt;/li&gt;
&lt;li&gt;Sincronização de Dados: Atualizar taxas de câmbio ou stocks de APIs externas.&lt;/li&gt;
&lt;li&gt;Backup de Segurança: Realizar dumps periódicos de tabelas críticas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O problema da falta de orquestração
&lt;/h2&gt;

&lt;p&gt;Quando começamos a criar vários jobs espalhados pelo código, o problema aparece rápido:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visibilidade: Quais tarefas estão ativas agora?&lt;/li&gt;
&lt;li&gt;Resiliência: Se uma tarefa entrar em "panic", ela vai derrubar toda a minha API?&lt;/li&gt;
&lt;li&gt;Encerramento Limpo: Se eu desligar o servidor, as tarefas param no meio do caminho corrompendo dados?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A solução é simples: um Cron Job Manager.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passos para criação do Cron Job Manager
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Definir uma Interface: Padronizar as operações necessárias, com nome, um tempo de agendamento e o método de execução.&lt;/li&gt;
&lt;li&gt;Implementar o Engine com Tickers: Usar &lt;code&gt;time.NewTicker&lt;/code&gt; para intervalos regulares.&lt;/li&gt;
&lt;li&gt;Isolamento de Erros (Recover): Capturar e logar erros sem interromper o Manager.&lt;/li&gt;
&lt;li&gt;Contexto de Cancelamento: Propagar o &lt;code&gt;context.Context&lt;/code&gt; para que todas as Goroutines respeitem o sinal de paragem do sistema.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Vantagens desta Arquitetura
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Graceful Shutdown: recebe o sinal de cancelamento do Sistema Operativo e avisa os jobs para terminarem as suas operações de forma segura.&lt;/li&gt;
&lt;li&gt;Desacoplamento: O motor do Cron não conhece a regra de negócio; ele apenas executa "contratos".&lt;/li&gt;
&lt;li&gt;Observabilidade: Centralização de logs, permitindo rastrear o início e o fim de cada operação.&lt;/li&gt;
&lt;li&gt;Plug and Play: Adicionar um novo job é simples. Basta registarmos no Manager.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Código fonte: &lt;a href="https://github.com/ortizdavid/golang-pocs/tree/main/cronjob-manager" rel="noopener noreferrer"&gt;https://github.com/ortizdavid/golang-pocs/tree/main/cronjob-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%2Fsb8vpg67hx4nz1hi1ps1.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%2Fsb8vpg67hx4nz1hi1ps1.png" alt=" " width="800" height="414"&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%2Firhqf5xexesrezrqgaji.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%2Firhqf5xexesrezrqgaji.png" alt=" " width="800" height="414"&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%2F55wtv2v4zixx9vlyjhgx.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%2F55wtv2v4zixx9vlyjhgx.png" alt=" " width="800" height="574"&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%2Fe0l4icmc17jgbw6frs3e.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%2Fe0l4icmc17jgbw6frs3e.png" alt=" " width="800" height="960"&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%2F25wcx335b8jig6ma31re.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%2F25wcx335b8jig6ma31re.png" alt=" " width="800" height="261"&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%2Fpv12fx4z306kwyvhedkd.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%2Fpv12fx4z306kwyvhedkd.png" alt=" " width="800" height="634"&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%2Fz40tfnlskaxd4pke437g.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%2Fz40tfnlskaxd4pke437g.png" alt=" " width="800" height="707"&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%2Fwgzyzx3mmjl7so6vbem2.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%2Fwgzyzx3mmjl7so6vbem2.png" alt=" " width="800" height="707"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>backend</category>
      <category>software</category>
      <category>cleancode</category>
    </item>
    <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>
  </channel>
</rss>
