<?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: Bruno Souza</title>
    <description>The latest articles on DEV Community by Bruno Souza (@devxbr).</description>
    <link>https://dev.to/devxbr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1430026%2Fed36a6ed-2125-43b6-9277-e99b8f58061c.png</url>
      <title>DEV Community: Bruno Souza</title>
      <link>https://dev.to/devxbr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devxbr"/>
    <language>en</language>
    <item>
      <title>Bora falar do padrão Strategy?</title>
      <dc:creator>Bruno Souza</dc:creator>
      <pubDate>Tue, 10 Feb 2026 22:04:55 +0000</pubDate>
      <link>https://dev.to/devxbr/bora-falar-do-padrao-strategy-21c5</link>
      <guid>https://dev.to/devxbr/bora-falar-do-padrao-strategy-21c5</guid>
      <description>&lt;p&gt;Se você já se pegou pensando &lt;em&gt;“putz, esse &lt;code&gt;if/else&lt;/code&gt; aqui tá crescendo demais”&lt;/em&gt; ou &lt;em&gt;“cada nova regra quebra algo que já funcionava”&lt;/em&gt;, é bem provável que o &lt;strong&gt;padrão Strategy&lt;/strong&gt; seja exatamente o que você está procurando.&lt;/p&gt;

&lt;p&gt;Neste post, vamos falar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O que é o Strategy&lt;/li&gt;
&lt;li&gt;Qual problema ele resolve&lt;/li&gt;
&lt;li&gt;Quando usar (e quando NÃO usar)&lt;/li&gt;
&lt;li&gt;Exemplos práticos&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  O problema clássico
&lt;/h2&gt;

&lt;p&gt;Imagine um sistema que precisa executar uma ação de formas diferentes dependendo do contexto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tipos diferentes de cálculo&lt;/li&gt;
&lt;li&gt;Regras que mudam por ambiente (QA, prod)&lt;/li&gt;
&lt;li&gt;Variações de comportamento por cliente, país ou feature&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O caminho mais comum (e perigoso) costuma ser algo assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if tipo == A {
  faz isso
} else if tipo == B {
  faz aquilo
} else if tipo == C {
  faz outra coisa
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Funciona? Funciona.&lt;br&gt;
Escala? Nem um pouco 😅&lt;/p&gt;

&lt;p&gt;Cada nova regra:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;aumenta a complexidade&lt;/li&gt;
&lt;li&gt;quebra o princípio aberto/fechado (&lt;a href="https://pt.wikipedia.org/wiki/Princ%C3%ADpio_do_aberto/fechado" rel="noopener noreferrer"&gt;Open/Closed&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;transforma a função num monstro difícil de testar&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  O que é o padrão Strategy
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Strategy&lt;/strong&gt; é um padrão de projeto comportamental que resolve exatamente esse problema.&lt;/p&gt;

&lt;p&gt;A ideia central é simples:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Encapsular comportamentos intercambiáveis atrás de uma interface comum&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ou seja:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;você define &lt;em&gt;o que&lt;/em&gt; precisa ser feito (interface)&lt;/li&gt;
&lt;li&gt;cria várias formas de fazer isso (strategies)&lt;/li&gt;
&lt;li&gt;escolhe qual usar em tempo de execução&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sem &lt;code&gt;if/else&lt;/code&gt; espalhado.&lt;br&gt;
Sem acoplamento desnecessário.&lt;/p&gt;


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

&lt;p&gt;Conceitualmente, temos três peças:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Strategy (interface)&lt;/strong&gt; – define o contrato&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concrete Strategies&lt;/strong&gt; – implementações do comportamento&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context&lt;/strong&gt; – quem usa a strategy&lt;/li&gt;
&lt;/ol&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Context -&amp;gt; Strategy
              ↑
   -------------------------
   |           |           |
StrategyA  StrategyB  StrategyC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Exemplo prático
&lt;/h2&gt;

&lt;p&gt;Vamos imaginar um cenário simples: &lt;br&gt;
cálculo de taxa.&lt;/p&gt;
&lt;h3&gt;
  
  
  Interface
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;TaxStrategy&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Implementações
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;BrazilTax&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;BrazilTax&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="m"&gt;0.15&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;USATax&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;USATax&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="m"&gt;0.08&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Context
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Tax&lt;/span&gt; &lt;span class="n"&gt;TaxStrategy&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;FinalValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Uso
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Tax&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;BrazilTax&lt;/span&gt;&lt;span class="p"&gt;{}}&lt;/span&gt;
&lt;span class="n"&gt;final&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FinalValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Trocar a regra não exige mudar o &lt;code&gt;Order&lt;/code&gt;. &lt;br&gt;
Só trocar a strategy.&lt;/p&gt;


&lt;h2&gt;
  
  
  Registry de strategies
&lt;/h2&gt;

&lt;p&gt;Em sistemas maiores, é comum usar um &lt;strong&gt;registry&lt;/strong&gt; para centralizar as strategies disponíveis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;TaxStrategy&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;"br"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;BrazilTax&lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;
    &lt;span class="s"&gt;"us"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;USATax&lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;extensão do sistema&lt;/li&gt;
&lt;li&gt;leitura do código&lt;/li&gt;
&lt;li&gt;configuração por ambiente ou feature&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Quando usar Strategy
&lt;/h2&gt;

&lt;p&gt;Use Strategy quando:&lt;/p&gt;

&lt;p&gt;✅ Você tem variações de comportamento&lt;br&gt;
✅ Essas variações crescem com o tempo&lt;br&gt;
✅ Você quer eliminar &lt;code&gt;if/else&lt;/code&gt; baseados em tipo, regra ou contexto&lt;br&gt;
✅ Testabilidade é importante&lt;/p&gt;


&lt;h2&gt;
  
  
  Quando NÃO usar
&lt;/h2&gt;

&lt;p&gt;Nem tudo precisa de Strategy 👀&lt;/p&gt;

&lt;p&gt;Evite quando:&lt;/p&gt;

&lt;p&gt;❌ Existe só uma implementação e nenhuma chance real de variação&lt;br&gt;
❌ A abstração adiciona mais complexidade do que resolve&lt;br&gt;
❌ O comportamento nunca muda&lt;/p&gt;

&lt;p&gt;Padrão de projeto não é troféu — é ferramenta.&lt;/p&gt;


&lt;h2&gt;
  
  
  Erro comum ao usar Strategy
&lt;/h2&gt;

&lt;p&gt;Um erro clássico é deixar a strategy &lt;strong&gt;conhecer o contexto errado&lt;/strong&gt;, como ambiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"qa"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="c"&gt;// lógica especial&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se isso começa a aparecer, é sinal de que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;você precisa de strategies diferentes&lt;/li&gt;
&lt;li&gt;ou de comportamentos injetáveis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Strategy boa é &lt;strong&gt;pura&lt;/strong&gt; e &lt;strong&gt;focada em uma única responsabilidade&lt;/strong&gt;.&lt;/p&gt;




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

&lt;p&gt;O padrão Strategy é um dos padrões mais úteis no dia a dia, especialmente em sistemas que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;evoluem rápido&lt;/li&gt;
&lt;li&gt;têm regras de negócio mutáveis&lt;/li&gt;
&lt;li&gt;precisam ser fáceis de testar e manter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você sente que seu código está virando uma árvore de &lt;code&gt;if/else&lt;/code&gt;, talvez não seja falta de esforço&lt;/p&gt;

&lt;p&gt;Talvez só esteja faltando uma boa Estratégia 😉&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>codequality</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>O que é engenheiro de alta performance</title>
      <dc:creator>Bruno Souza</dc:creator>
      <pubDate>Mon, 02 Dec 2024 21:04:54 +0000</pubDate>
      <link>https://dev.to/devxbr/o-que-e-engenheiro-de-alta-performance-4677</link>
      <guid>https://dev.to/devxbr/o-que-e-engenheiro-de-alta-performance-4677</guid>
      <description>&lt;p&gt;Olá, Mentes Tech!&lt;/p&gt;

&lt;p&gt;Conclui um curso muito massa hoje, me forneceu insights valiosos e também reforçou práticas do dia a dia, e que me permitiu escrever sobre o assunto.&lt;/p&gt;

&lt;p&gt;Um &lt;strong&gt;engenheiro de alta performance&lt;/strong&gt; é um profissional que se destaca por sua capacidade de entregar resultados consistentes e superiores, combinando competências técnicas, comportamentais e estratégicas. Ele não se limita a cumprir suas funções básicas, mas vai além, aplicando princípios de eficiência, inovação e qualidade em tudo o que faz.  &lt;/p&gt;

&lt;p&gt;Aqui estão algumas características de um engenheiro de alta performance:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Foco na eficiência&lt;/strong&gt;: Busca continuamente otimizar processos, reduzir desperdícios e aumentar a produtividade, muitas vezes utilizando metodologias como Lean, Six Sigma ou Agile.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Habilidade em resolução de problemas&lt;/strong&gt;: Analisa problemas complexos de forma estruturada, identificando causas raiz e implementando soluções eficazes.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Conhecimento atualizado&lt;/strong&gt;: Está sempre em busca de aprendizado contínuo para acompanhar as novas tecnologias, tendências e boas práticas do setor.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Liderança e trabalho em equipe&lt;/strong&gt;: Atua como um facilitador em projetos, colaborando e liderando equipes para alcançar objetivos comuns.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compromisso com qualidade&lt;/strong&gt;: Garante que os produtos, serviços ou projetos que entrega atendam ou superem os padrões esperados.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Capacidade de adaptação&lt;/strong&gt;: Enfrenta mudanças e desafios com flexibilidade, ajustando rapidamente suas abordagens e estratégias.  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ser um engenheiro de alta performance significa integrar conhecimento técnico, visão estratégica e habilidades interpessoais para alcançar resultados extraordinários e gerar impacto positivo nas organizações.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Reference Counting vs Tracing Garbage Collection</title>
      <dc:creator>Bruno Souza</dc:creator>
      <pubDate>Mon, 02 Sep 2024 18:24:00 +0000</pubDate>
      <link>https://dev.to/devxbr/reference-counting-vs-tracing-garbage-collection-51ac</link>
      <guid>https://dev.to/devxbr/reference-counting-vs-tracing-garbage-collection-51ac</guid>
      <description>&lt;p&gt;Olá, Mentes Tech!&lt;/p&gt;

&lt;p&gt;Você sabe o que é contagem de referência e rastreamento de referências no contexto de desalocação de memória ?&lt;/p&gt;

&lt;p&gt;A diferença entre rastreamento de referências (ou &lt;em&gt;tracing garbage collection&lt;/em&gt;) e contagem de referências (&lt;em&gt;reference counting&lt;/em&gt;) está na abordagem que cada técnica usa para identificar e liberar a memória de objetos que não estão mais em uso. &lt;br&gt;
Vou explicar cada um e, em seguida, destacar as principais diferenças.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contagem de Referências (&lt;em&gt;Reference Counting&lt;/em&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Como funciona&lt;/strong&gt;: Cada objeto na memória tem um contador que rastreia quantas referências (ou ponteiros) apontam para ele. Quando uma nova referência ao objeto é criada, o contador é incrementado. Quando uma referência é removida, o contador é decrementado. Se o contador atingir zero, significa que o objeto não é mais acessível e pode ser liberado (sua memória pode ser recolhida).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Vantagens&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simples de entender e implementar.&lt;/li&gt;
&lt;li&gt;Recolhe a memória imediatamente quando o contador chega a zero, o que pode reduzir a quantidade de memória usada.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Desvantagens&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ciclos de referência&lt;/strong&gt;: Se dois ou mais objetos referenciam uns aos outros em um ciclo, suas contagens de referência nunca chegam a zero, causando vazamentos de memória.&lt;/li&gt;
&lt;li&gt;Pode ser menos eficiente, pois cada criação ou remoção de referência requer uma atualização do contador, o que pode ter um impacto no desempenho.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Rastreamento de Referências (&lt;em&gt;Tracing Garbage Collection&lt;/em&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Como funciona&lt;/strong&gt;: Esta abordagem envolve duas fases principais: &lt;em&gt;marcação&lt;/em&gt; e &lt;em&gt;varredura&lt;/em&gt;. Primeiro, o coletor de lixo (garbage collector) inicia a partir das raízes (como variáveis globais, locais e registradores) e rastreia todas as referências aos objetos na memória, marcando aqueles que são acessíveis. Em seguida, ele varre a memória para coletar (liberar) objetos que não foram marcados, pois esses não são mais acessíveis.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Vantagens&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Não sofre de problemas de ciclos de referência, pois o coletor de lixo é capaz de identificar objetos que não são mais acessíveis, independentemente de ciclos.&lt;/li&gt;
&lt;li&gt;Pode ser mais eficiente em termos de tempo de execução para certos tipos de aplicações, especialmente em linguagens com gerenciamento de memória complexo.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Desvantagens&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pode introduzir pausas na execução do programa, embora os garbage collectors modernos, como o de Go, sejam projetados para minimizar essas pausas.&lt;/li&gt;
&lt;li&gt;Geralmente, o processo de rastreamento pode ser mais complexo e consome mais recursos do que a contagem de referências, dependendo de como o garbage collector é implementado.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Principais Diferenças
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gestão de Ciclos&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contagem de Referências: Problemas com ciclos de referência, onde dois ou mais objetos referenciam uns aos outros, resultando em vazamento de memória.&lt;/li&gt;
&lt;li&gt;Rastreamento: Não tem problemas com ciclos, pois o coletor rastreia e marca todos os objetos acessíveis.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Complexidade e Desempenho&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contagem de Referências: Simples, mas cada operação de incremento e decremento pode impactar o desempenho, especialmente em programas que fazem muitas operações com ponteiros.&lt;/li&gt;
&lt;li&gt;Rastreamento: Mais complexo e pode causar pausas na execução do programa, mas geralmente mais eficiente em lidar com diferentes padrões de uso de memória.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tempo de Coleta&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contagem de Referências: Coleta a memória imediatamente quando a contagem chega a zero.&lt;/li&gt;
&lt;li&gt;Rastreamento: Coleta a memória periodicamente, quando o garbage collector executa seu ciclo.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implementação&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contagem de Referências: Mais simples de implementar, mas menos robusto em aplicações complexas.&lt;/li&gt;
&lt;li&gt;Rastreamento: Mais robusto, mas a implementação do garbage collector pode ser bastante complexa.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Em resumo, a contagem de referências é mais simples e imediata, mas pode falhar em certos cenários (como ciclos de referência), enquanto o rastreamento é mais robusto e flexível, mas pode ter um impacto maior no desempenho devido à complexidade da sua implementação.&lt;/p&gt;

</description>
      <category>go</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Tipos de estratégia de balanceamento de carga</title>
      <dc:creator>Bruno Souza</dc:creator>
      <pubDate>Fri, 12 Jul 2024 15:41:30 +0000</pubDate>
      <link>https://dev.to/devxbr/tipos-de-estrategia-de-balanceamento-de-carga-48bo</link>
      <guid>https://dev.to/devxbr/tipos-de-estrategia-de-balanceamento-de-carga-48bo</guid>
      <description>&lt;p&gt;Olá, Mentes Tech!&lt;/p&gt;

&lt;p&gt;Trabalhei essa semana em um estratégia de balanceamento de cargas, e antes dessa pesquisa, confesso que conhecia/usava somente 3 das que estão na lista abaixo, bora falar de estratégias ?&lt;/p&gt;

&lt;p&gt;O balanceamento de carga é uma técnica para melhorar a disponibilidade e a eficiência dos serviços de TI, distribuindo as cargas de trabalho de maneira equitativa entre vários recursos de computação. &lt;/p&gt;

&lt;p&gt;Aqui estão algumas estratégias comuns de balanceamento de carga:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Round Robin
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Descrição&lt;/strong&gt;: As solicitações são distribuídas sequencialmente entre os servidores.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vantagens&lt;/strong&gt;: Simples de implementar e eficaz para cargas uniformemente distribuídas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desvantagens&lt;/strong&gt;: Não leva em consideração a carga atual dos servidores, podendo sobrecarregar servidores mais lentos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Least Connections
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Descrição&lt;/strong&gt;: As solicitações são enviadas para o servidor com o menor número de conexões ativas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vantagens&lt;/strong&gt;: Ajuda a evitar sobrecarga em servidores ocupados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desvantagens&lt;/strong&gt;: Pode não ser eficiente se as conexões tiverem durações variáveis.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Least Response Time
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Descrição&lt;/strong&gt;: Direciona as solicitações para o servidor com o menor tempo de resposta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vantagens&lt;/strong&gt;: Geralmente resulta em uma distribuição mais equilibrada, considerando a capacidade de resposta dos servidores.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desvantagens&lt;/strong&gt;: Pode exigir monitoramento constante dos tempos de resposta.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. IP Hash
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Descrição&lt;/strong&gt;: Usa um algoritmo de hash baseado no endereço IP do cliente para determinar o servidor de destino.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vantagens&lt;/strong&gt;: Garante que as solicitações de um cliente específico sejam sempre direcionadas ao mesmo servidor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desvantagens&lt;/strong&gt;: Pode levar a uma distribuição desigual se os IPs não forem distribuídos uniformemente.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Weighted Round Robin
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Descrição&lt;/strong&gt;: Extensão do Round Robin, onde cada servidor é atribuído a um peso, e servidores com maior capacidade recebem mais solicitações.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vantagens&lt;/strong&gt;: Permite considerar as capacidades diferentes dos servidores.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desvantagens&lt;/strong&gt;: Requer configuração manual dos pesos, o que pode ser complexo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Weighted Least Connections
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Descrição&lt;/strong&gt;: Combina os conceitos de Least Connections e pesos, direcionando as solicitações para servidores com menos conexões ativas, ponderados por sua capacidade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vantagens&lt;/strong&gt;: Equilibra carga de forma mais eficaz em ambientes heterogêneos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desvantagens&lt;/strong&gt;: Pode ser mais complexo de configurar e monitorar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Random
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Descrição&lt;/strong&gt;: Direciona as solicitações para um servidor escolhido aleatoriamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vantagens&lt;/strong&gt;: Simples e pode ser eficaz em ambientes com servidores de capacidades semelhantes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desvantagens&lt;/strong&gt;: Pode resultar em distribuição desigual e ineficiente.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8. Consistent Hashing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Descrição&lt;/strong&gt;: Utiliza uma técnica de hash que mapeia solicitações para servidores de forma a minimizar a redistribuição de carga quando servidores são adicionados ou removidos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vantagens&lt;/strong&gt;: Boa escalabilidade e estabilidade em sistemas dinâmicos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desvantagens&lt;/strong&gt;: Pode ser complexo de implementar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9. Server Health Monitoring
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Descrição&lt;/strong&gt;: Monitora a saúde dos servidores e desvia o tráfego de servidores que estão falhando ou sobrecarregados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vantagens&lt;/strong&gt;: Aumenta a resiliência e a disponibilidade do sistema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desvantagens&lt;/strong&gt;: Requer ferramentas adicionais e monitoramento contínuo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10. Anycast Routing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Descrição&lt;/strong&gt;: Usa a topologia da rede para direcionar as solicitações para o servidor mais próximo (em termos de roteamento).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vantagens&lt;/strong&gt;: Pode reduzir a latência.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desvantagens&lt;/strong&gt;: Pode ser complexo de implementar e depende da infraestrutura da rede.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Cada estratégia tem seus prós e contras, e a escolha da melhor técnica de balanceamento de carga depende das necessidades específicas da aplicação, da infraestrutura disponível e dos requisitos de desempenho e disponibilidade.&lt;/p&gt;

&lt;p&gt;Após conhecer as estratégias disponíveis,&lt;br&gt;
optei por usar o Weighted Round Robin, pois é o cenário proposto, dividir a carga de trabalho entre servidores.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>O que é BDD e quando você deve considerar</title>
      <dc:creator>Bruno Souza</dc:creator>
      <pubDate>Mon, 17 Jun 2024 23:06:10 +0000</pubDate>
      <link>https://dev.to/devxbr/o-que-e-bdd-e-quando-voce-deve-considerar-4160</link>
      <guid>https://dev.to/devxbr/o-que-e-bdd-e-quando-voce-deve-considerar-4160</guid>
      <description>&lt;p&gt;Olá, Mentes Tech!&lt;/p&gt;

&lt;p&gt;O desenvolvimento orientado por comportamento (Behavior-Driven Development, ou BDD) é uma abordagem de desenvolvimento de software que estende o Test-Driven Development (TDD) ao focar na colaboração entre desenvolvedores, testadores e stakeholders não técnicos. &lt;br&gt;
O objetivo do BDD é garantir que todos os envolvidos no desenvolvimento do software compartilhem uma compreensão clara do comportamento desejado do sistema.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/devxbr/go-bdd" rel="noopener noreferrer"&gt;Repositório Github&lt;/a&gt;&lt;br&gt;
Implementação realizada usando Golang e &lt;a href="https://github.com/cucumber/godog" rel="noopener noreferrer"&gt;GoDog&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Como Funciona o BDD
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Especificação de comportamentos&lt;/strong&gt;: No BDD, os requisitos do software são definidos como especificações de comportamento, geralmente utilizando a linguagem Gherkin. &lt;br&gt;
Esta linguagem permite escrever cenários de teste em um formato de história, como "Dado, Quando, Então", que são compreensíveis tanto para técnicos quanto para não técnicos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cenários de teste&lt;/strong&gt;: Esses cenários são descrições claras e detalhadas de como o sistema deve se comportar em determinadas situações. Por exemplo:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="kd"&gt;Feature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Calculator
  As a user
  I want to use a calculator
  So that I can add numbers

  &lt;span class="kn"&gt;Scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Add two numbers
    &lt;span class="nf"&gt;Given &lt;/span&gt;I have a calculator
    &lt;span class="nf"&gt;When &lt;/span&gt;I add 2 and 3
    &lt;span class="nf"&gt;Then &lt;/span&gt;the result should be 5

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

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automatização de testes&lt;/strong&gt;: Esses cenários são então usados como base para criar testes automatizados. &lt;br&gt;
Ferramentas como Cucumber, SpecFlow, ou Godog (para Go) executam esses cenários e verificam se o comportamento do sistema corresponde às especificações.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Desenvolvimento iterativo&lt;/strong&gt;: O BDD promove um ciclo iterativo onde cenários de teste são escritos antes do desenvolvimento do código. &lt;br&gt;
Isso garante que o desenvolvimento seja guiado pelos requisitos de comportamento do usuário.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Benefícios do BDD
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Melhor comunicação e colaboração&lt;/strong&gt;: O BDD facilita uma comunicação clara entre todos os membros da equipe. &lt;br&gt;
As especificações de comportamento são escritas em uma linguagem natural, compreensível por todos, o que promove uma colaboração mais eficaz.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Requisitos claros e não ambíguos&lt;/strong&gt;: A escrita de cenários de teste antes da codificação ajuda a esclarecer os requisitos, reduzindo ambiguidades e mal-entendidos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Foco no valor de negócio&lt;/strong&gt;: O BDD mantém o foco no comportamento que traz valor para o usuário final. &lt;br&gt;
Isso ajuda a garantir que o software entregue realmente atenda às necessidades do negócio.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documentação viva&lt;/strong&gt;: Os cenários de BDD servem como uma documentação viva do sistema, sempre atualizada e refletindo o comportamento atual do software.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Testes automatizados&lt;/strong&gt;: O BDD promove a criação de uma suite de testes automatizados robusta, facilitando a detecção precoce de erros e a realização de regressão.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Facilita a refatoração&lt;/strong&gt;: Com uma suite de testes automatizados baseada em cenários de BDD, é mais fácil refatorar o código com confiança, sabendo que qualquer regressão será detectada imediatamente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Maior confiança na qualidade&lt;/strong&gt;: A combinação de especificações claras, colaboração eficaz e testes automatizados robustos resulta em maior confiança na qualidade do software entregue.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Por que você, como desenvolvedor, deve considerar usar BDD
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Alinhamento com as expectativas do usuário&lt;/strong&gt;: O BDD ajuda a garantir que você está desenvolvendo funcionalidades que realmente atendem às necessidades do usuário final, reduzindo retrabalho e ajustes tardios.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Redução de erros&lt;/strong&gt;: Ao escrever testes antes do código, você pode detectar e corrigir problemas logo no início do processo de desenvolvimento, economizando tempo e esforço a longo prazo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documentação automática&lt;/strong&gt;: Os cenários de teste servem como documentação do sistema, facilitando a manutenção e a compreensão do código, tanto para você quanto para novos membros da equipe.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Melhoria contínua&lt;/strong&gt;: O BDD promove uma cultura de melhoria contínua, onde você está constantemente revisando e refinando tanto o código quanto os testes, resultando em um produto final de alta qualidade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Confiança na refatoração&lt;/strong&gt;: Com uma suite de testes robusta, você pode refatorar o código com segurança, sabendo que as mudanças serão verificadas automaticamente contra os cenários de comportamento especificados.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em resumo, o BDD não só melhora a qualidade do software, mas também facilita a comunicação, colaboração e alinhamento entre todos os envolvidos no desenvolvimento, resultando em um processo de desenvolvimento mais eficiente e eficaz.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>bdd</category>
      <category>tdd</category>
      <category>go</category>
    </item>
    <item>
      <title>Kong Gateway - Validando configurações específicas para exposição de serviços</title>
      <dc:creator>Bruno Souza</dc:creator>
      <pubDate>Fri, 31 May 2024 23:37:59 +0000</pubDate>
      <link>https://dev.to/devxbr/kong-gateway-validando-configuracoes-especificas-para-exposicao-de-servicos-adg</link>
      <guid>https://dev.to/devxbr/kong-gateway-validando-configuracoes-especificas-para-exposicao-de-servicos-adg</guid>
      <description>&lt;p&gt;Olá, Mentes Tech!&lt;/p&gt;

&lt;p&gt;Essa semana testei o deck files lint que é uma feature do deck, que usa o projeto &lt;a href="https://github.com/daveshanley/vacuum" rel="noopener noreferrer"&gt;vacuum&lt;/a&gt; para esta implementação.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[Caso Uso] Existe a necessidade de identificar o proprietário de cada rota em nosso ecossistema. &lt;br&gt;
Como solução, foi requisitado que todas as rotas contenham a propriedade tags preenchida com nome da squad e que a versão do Kong seja mantida em 3.1.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Referência: &lt;a href="https://quobix.com/vacuum/rulesets/understanding/" rel="noopener noreferrer"&gt;Ruleset&lt;/a&gt;&lt;br&gt;
Repositório: &lt;a href="https://github.com/devxbr/kong-business-rules-lint" rel="noopener noreferrer"&gt;kong-business-rules-lint&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Criei duas regras, uma para validar se a propriedade tag existe e possui valor, e a segunda regra é se a propriedade _format_version é 3.1.&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%2Fr8mlk1xldzs9c1cgntkr.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%2Fr8mlk1xldzs9c1cgntkr.png" alt="ruleset.yml" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Criei duas configurações de rotas&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%2Frzhqx858khtmbpc8wz60.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%2Frzhqx858khtmbpc8wz60.png" alt="config.yml" width="642" height="444"&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%2Fmm1lbb1vca2c35wwg961.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%2Fmm1lbb1vca2c35wwg961.png" alt="corrupted.yml" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então criei uma imagem com deck na versão latest&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%2Fr5jvoysuor70346e70x1.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%2Fr5jvoysuor70346e70x1.png" alt="Dockerfile" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No Dockerfile tem comandos para validar o arquivo de configuração contra um ruleset.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;RUN deck file validate corrupted.yml&lt;/code&gt;&lt;br&gt;
&lt;code&gt;RUN deck file lint -s corrupted.yml ruleset.yml&lt;/code&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%2Fjsw3ug03rnfr0p5ndazg.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%2Fjsw3ug03rnfr0p5ndazg.png" alt="Output" width="800" height="104"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chegamos ao fim...&lt;/p&gt;

&lt;p&gt;como você configura seu Gateway Kong?&lt;/p&gt;

</description>
      <category>kong</category>
      <category>deck</category>
      <category>gateway</category>
    </item>
    <item>
      <title>[Discussão] - Como você implementa suas apis ?</title>
      <dc:creator>Bruno Souza</dc:creator>
      <pubDate>Tue, 21 May 2024 20:49:54 +0000</pubDate>
      <link>https://dev.to/devxbr/discussao-como-voce-implementa-suas-apis--2cml</link>
      <guid>https://dev.to/devxbr/discussao-como-voce-implementa-suas-apis--2cml</guid>
      <description>&lt;p&gt;Olá, Mentes Tech!&lt;/p&gt;

&lt;p&gt;Se você, como primeiro passo pensou em planejamento, temos algo em comum.&lt;/p&gt;

&lt;p&gt;Planejar uma Api antes de meter a mão na massa, é a melhor decisão que você pode tomar antes de iniciar o desenvolvimento.&lt;/p&gt;

&lt;p&gt;E no planejamento, a etapa de especificação não deve ser ignorada, esta etapa é crucial para garantir o sucesso da sua integração.&lt;/p&gt;

&lt;p&gt;Por aqui, estou planejando minhas Apis, usando OAS 3.0&lt;br&gt;
&lt;a href="https://editor.swagger.io/" rel="noopener noreferrer"&gt;Editor Swagger - OAS 3.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E aí, qual ferramenta você usa para planejar sua Api ?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Analogia receita de bolo VS algoritmo VS linguagem de programação</title>
      <dc:creator>Bruno Souza</dc:creator>
      <pubDate>Tue, 21 May 2024 14:37:45 +0000</pubDate>
      <link>https://dev.to/devxbr/analogia-receita-de-bolo-vs-algoritmo-vs-linguagem-de-programacao-34he</link>
      <guid>https://dev.to/devxbr/analogia-receita-de-bolo-vs-algoritmo-vs-linguagem-de-programacao-34he</guid>
      <description>&lt;p&gt;Olá, Mentes Tech!&lt;/p&gt;

&lt;p&gt;Hoje me peguei pensando no que uma receita de bolo, algoritmos e linguagens de programação tem em comum.&lt;/p&gt;

&lt;p&gt;Uma receita de bolo é um guia com passos bem definidos com um objetivo final de te entregar um bolo, desde que a receita seja seguida conforme descrito.&lt;/p&gt;

&lt;p&gt;Na receita diz 2 ovos, mas eu só tenho 1, vai assim mesmo.&lt;br&gt;
Pouts, deu errado, é culpa da receita.&lt;/p&gt;

&lt;p&gt;O Algoritmo é uma sequencia lógica bem definida com instruções para máquina.&lt;/p&gt;

&lt;p&gt;A linguagem de programação nesta analogia pode ser visto como os ingredientes para executar a receita que neste caso é o algoritmo.&lt;/p&gt;

&lt;p&gt;Conclusão, se você possuir um bom raciocínio lógico para propor bons algoritmos, para resolver problemas complexos, a linguagem de programação será seu ingrediente premium para conclusão dos melhores "bolos".&lt;/p&gt;

&lt;p&gt;E quanto mais linguagens conhecer, melhor será sua proposta para execução da "receita de bolo" e até mesmo aprimoramento da mesma.&lt;/p&gt;

</description>
      <category>novice</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Jornada pessoal em Machine Learning</title>
      <dc:creator>Bruno Souza</dc:creator>
      <pubDate>Thu, 16 May 2024 15:57:54 +0000</pubDate>
      <link>https://dev.to/devxbr/jornada-pessoal-em-machine-learning-2c3n</link>
      <guid>https://dev.to/devxbr/jornada-pessoal-em-machine-learning-2c3n</guid>
      <description>&lt;p&gt;Olá, Mentes Tech!&lt;/p&gt;

&lt;p&gt;Quero muito contar como está sendo minha jornada estudando e construindo IA, matemática e estatística foi uma matéria que me cativou bastante durante a graduação, e a pouco tempo venho me aventurando com tensor flow + python para construção de modelos.&lt;/p&gt;

&lt;p&gt;E está sendo incrível desenvolver, e com minha bagagem como dev facilitou alguns caminhos, principalmente na modelagem de dados, compreender profundamente estrutura de dados e algoritmo, tem me permitido deslanchar no desenvolvimento.&lt;/p&gt;

&lt;p&gt;Está semana, eu conclui meu primeiro modelo, ele ainda está em treinamento, mas já é possível ver os resultados, como estou em fase de aprendizado (soa engraçado neh, aprendendo para ensinar), e contando um pouco mais é exatamente o tipo de ML que eu construí por aprendizado por reforço.&lt;/p&gt;

&lt;p&gt;E o que ela faz?&lt;/p&gt;

&lt;p&gt;Neste post &lt;a href="https://dev.to/devxbr/o-que-me-motivou-a-criar-uma-plataforma-de-negociacao-em-criptomoedas-2ie2"&gt;aqui&lt;/a&gt; eu conto sobre a plataforma que estou construindo, e este modelo será para refinar as entradas e futuramente predizer o próximo fechamento.&lt;/p&gt;

&lt;p&gt;Massa ou nã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%2F9hewrb7fusob4gww2rdf.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%2F9hewrb7fusob4gww2rdf.png" alt="imagem da ia criptix" width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por enquanto estou usando aprendizado por reforço, mas quero testar também, rede neural recorrente (RNN) com uma arquitetura de rede LSTM (Long Short-Term Memory).&lt;/p&gt;

&lt;p&gt;E aí o que achou ?&lt;br&gt;
Bora falar sobre ?&lt;/p&gt;

&lt;p&gt;estou bastante empolgado.&lt;/p&gt;

</description>
      <category>ia</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>DEV não coloque a mão na massa até ter certeza do que você deve implementar</title>
      <dc:creator>Bruno Souza</dc:creator>
      <pubDate>Wed, 15 May 2024 14:05:29 +0000</pubDate>
      <link>https://dev.to/devxbr/dev-nao-coloque-a-mao-na-massa-ate-ter-certeza-do-que-voce-deve-implementar-3ph8</link>
      <guid>https://dev.to/devxbr/dev-nao-coloque-a-mao-na-massa-ate-ter-certeza-do-que-voce-deve-implementar-3ph8</guid>
      <description>&lt;p&gt;Olá, Mentes Tech!&lt;/p&gt;

&lt;p&gt;Se você disser sim, para qualquer das perguntas abaixo, este texto é para você.&lt;/p&gt;

&lt;p&gt;Tenho retrabalho ?&lt;/p&gt;

&lt;p&gt;A minha entrega não cumpre com o esperado pelo cliente ?&lt;/p&gt;

&lt;p&gt;Não consigo entender o que o meu cliente quer ?&lt;/p&gt;

&lt;p&gt;Na carreira de um Engenheiro de Software, isto é mais comum do que parece.&lt;/p&gt;

&lt;p&gt;E pode acontecer quando o cliente está indeciso, quando não há clareza dos objetivos, quando não está relacionado a alguma métrica ou algum número que você gostaria que aumentasse ou diminuísse, uma ui que não está amigável.&lt;/p&gt;

&lt;p&gt;Note que as situações o problema não está na sua implementação, mas na forma como você entendeu o desafio. concorda que aqui temos uma possibilidade do ponto de falha ser o planejamento, em vários níveis ?&lt;/p&gt;

&lt;p&gt;Mas o meu foco é no desenvolvimento de software, imagine que você possui uma especificação do que o cliente quer.&lt;/p&gt;

&lt;p&gt;Alinhe expectativas, faça protótipos, mapeie os pontos de solução em alto nível, um ponto de solução pode ser granular e pode chegar a nível de registradores, dependendo da entrega.&lt;/p&gt;

&lt;p&gt;Antes de colocar a mão na massa. &lt;br&gt;
Após alguns anos fazendo o planejamento antes da implementação, ir para IDE é somente para digitar, pois a solução já está validada planejada e vai fazer exatamente o que foi proposta para fazer no planejamento, note que todo esforço está concentrado no planejamento e não na execução.&lt;/p&gt;

&lt;p&gt;Codificar virou apenas uma tarefa de digitação, ou delegar para o Copilot.&lt;/p&gt;

&lt;p&gt;Como você planeja suas entregas ?&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Por que você deveria priorizar a documentação de suas experiências</title>
      <dc:creator>Bruno Souza</dc:creator>
      <pubDate>Fri, 26 Apr 2024 20:37:08 +0000</pubDate>
      <link>https://dev.to/devxbr/por-que-voce-deveria-considerar-documentar-4700</link>
      <guid>https://dev.to/devxbr/por-que-voce-deveria-considerar-documentar-4700</guid>
      <description>&lt;p&gt;Olá, Mentes Tech! &lt;br&gt;
Na anotação de hoje, gostaria de compartilhar por que você, tech leitor, deveria considerar escrever sobre suas experiências, seja de forma pública ou privada.&lt;/p&gt;

&lt;p&gt;Após passar algum tempo como desenvolvedor de software, percebi que frequentemente me deparava com problemas que já havia resolvido em algum momento da minha carreira. Atualmente, os desafios que enfrento são complexo e meu time atua em componentes conceitualmente conhecidos como cross-cutting concerns. &lt;/p&gt;

&lt;p&gt;Por isso, tornou-se essencial documentar minha jornada de alguma forma, seja para revisitar soluções aplicadas, reforçar o aprendizado, ou simplesmente documentar a experiência, que também pode servir para pessoas com menor senioridade.  &lt;/p&gt;

&lt;p&gt;Este post será um texto em constante evolução, uma fonte viva de motivação para que você também embarque nessa jornada de documentação.&lt;/p&gt;

&lt;p&gt;Vamos começar a documentar!&lt;/p&gt;

</description>
      <category>carreira</category>
    </item>
    <item>
      <title>Golang - Singleton Design pattern</title>
      <dc:creator>Bruno Souza</dc:creator>
      <pubDate>Thu, 25 Apr 2024 23:42:36 +0000</pubDate>
      <link>https://dev.to/devxbr/golang-singleton-design-pattern-59o8</link>
      <guid>https://dev.to/devxbr/golang-singleton-design-pattern-59o8</guid>
      <description>&lt;p&gt;Conceitualmente o padrão singleton define que somente uma instância deve existir em todo o sistema.&lt;br&gt;
É como ter um guardião solitário que garante que apenas uma única cópia de si mesma esteja presente, independentemente de quantas vezes seja chamado.&lt;/p&gt;

&lt;p&gt;Estou avançando nos estudos em golang e decidi mergulhar na implementação deste padrão tão debatido e controverso. &lt;br&gt;
É aquele tipo de padrão que desperta paixões e críticas, amado por alguns como uma solução elegante e odiado por outros como um antipadrão a ser evitado a todo custo.&lt;/p&gt;

&lt;p&gt;singleton.go&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package main

import (
    "fmt"
    "sync"
)

var lock = &amp;amp;sync.Mutex{}

type singleton struct {
}

var singleInstance *singleton

func getInstance() *singleton {
    if singleInstance == nil {
        lock.Lock()
        defer lock.Unlock()
        if singleInstance == nil {
            fmt.Println("create singleton")
            singleInstance = &amp;amp;singleton{}
        } else {
            fmt.Println("singleton already created.")
        }
    } else {
        fmt.Println("singleton already created.")
    }

    return singleInstance
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;main.go&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package main

import (
    "fmt"
)
func main() {
    for i := 0; i &amp;lt; 3; i++ {
        go getInstance()
    }
    fmt.Scanln()
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída esperada&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;create singleton
singleton already created.
singleton already created.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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