<?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>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>
    <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>
  </channel>
</rss>
