<?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: Alexandre</title>
    <description>The latest articles on DEV Community by Alexandre (@z4nder).</description>
    <link>https://dev.to/z4nder</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%2F525226%2F140b3952-f130-4aad-8949-56608fd7ff4b.png</url>
      <title>DEV Community: Alexandre</title>
      <link>https://dev.to/z4nder</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/z4nder"/>
    <language>en</language>
    <item>
      <title>Programar é uma arte</title>
      <dc:creator>Alexandre</dc:creator>
      <pubDate>Tue, 23 Sep 2025 11:59:06 +0000</pubDate>
      <link>https://dev.to/z4nder/programar-e-uma-arte-3gi9</link>
      <guid>https://dev.to/z4nder/programar-e-uma-arte-3gi9</guid>
      <description>&lt;p&gt;Assim como desenhar, &lt;strong&gt;programar é traduzir o mundo em outra linguagem&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Bons programadores, como bons artistas, não enxergam melhor, mas sabem &lt;strong&gt;organizar, escolher e representar melhor&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Índice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;1. Introdução&lt;/li&gt;
&lt;li&gt;2. Fundamentos&lt;/li&gt;
&lt;li&gt;3. Fundamentos da arte&lt;/li&gt;
&lt;li&gt;
4. Fundamentos da programação

&lt;ul&gt;
&lt;li&gt;4.1. Lógica computacional&lt;/li&gt;
&lt;li&gt;4.2. Estruturas de dados e algoritmos&lt;/li&gt;
&lt;li&gt;4.3. Ferramental (Tooling)&lt;/li&gt;
&lt;li&gt;4.4. Debugging e engenharia reversa&lt;/li&gt;
&lt;li&gt;4.5. Abstração&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;6. Conclusão&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  1. Introdução &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;No início dos meus estudos em programação, sempre caminhei em paralelo com o estudo de desenho. Durante essa jornada, não pude deixar de traçar paralelos entre as duas áreas. O estudo do desenho sempre me pareceu ter um caminho claro: focar nos chamados &lt;strong&gt;fundamentos&lt;/strong&gt; e praticar. Já na programação, sempre busquei identificar esses fundamentos, mas a definição nunca foi tão evidente.&lt;br&gt;&lt;br&gt;
Neste texto, pretendo explorar o que considero serem os &lt;strong&gt;fundamentos da programação&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Fundamentos &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;O que me encanta na ideia de fundamentos é que eles são tópicos inesgotáveis. Você pode &lt;strong&gt;estudá-los por toda a vida&lt;/strong&gt;, e ainda assim haverá sempre mais a aprender. É como anatomia no desenho: você pode aprofundar infinitamente, desde o estudo dos ossos até a simplificação de formas para criar estilos exagerados ou minimalistas. Mas, para que o resultado seja intencional e convincente, precisa estar bem fundamentado.  &lt;/p&gt;

&lt;p&gt;Da mesma forma, um bom desenho ou um bom programa depende da aplicação equilibrada de vários fundamentos ao mesmo tempo. Dominar apenas um não garante um bom resultado final. Os fundamentos não são uma lista que se esgota, mas pontos de &lt;strong&gt;prática constante&lt;/strong&gt; — como um boxeador que treina o mesmo soco todos os dias até que se torne instintivo.  &lt;/p&gt;
&lt;h2&gt;
  
  
  3. Fundamentos da arte &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Como este é um artigo focado em &lt;strong&gt;programação&lt;/strong&gt;, muitos podem não ter tido contato com os &lt;strong&gt;fundamentos da arte&lt;/strong&gt;. Então farei uma breve explicação para seguirmos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Linhas:&lt;/strong&gt; o elemento mais básico para definir contorno, forma e dar sensação de movimento.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Formas:&lt;/strong&gt; blocos de construção de qualquer objeto, representados por figuras geométricas básicas como círculos, quadrados e triângulos. Simplificar a realidade em formas ajuda a construir o desenho de maneira mais precisa.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perspectiva:&lt;/strong&gt; permite criar a ilusão de profundidade e tridimensionalidade em uma superfície plana.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anatomia:&lt;/strong&gt; essencial para desenhar pessoas e animais de maneira realista e proporcional. É o estudo da estrutura corporal, músculos e ossos.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composição:&lt;/strong&gt; refere-se à organização visual dos elementos dentro do espaço. Envolve a disposição, o equilíbrio e a distribuição de objetos, cores e linhas para criar uma obra harmoniosa.
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  4. Fundamentos da programação &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;
&lt;h2&gt;
  
  
  4.1. Lógica computacional&lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Capacidade de &lt;strong&gt;entender uma necessidade&lt;/strong&gt; e transformá-la em um programa. Observe como um desenhista enxerga formas simples (círculos, quadrados) em uma figura complexa.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blenderartists.org/t/planes-of-the-head-from-andrew-loomis-method/1412699" rel="noopener noreferrer"&gt;LINK&lt;/a&gt;&lt;br&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%2Floj8fmbhrwqe6va7pr72.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%2Floj8fmbhrwqe6va7pr72.png" alt="Etapas de um desenho" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O programador deve ter a habilidade de enxergar processos complexos e representa-los de forma simplificada. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo:&lt;/strong&gt; imagine um programador conversando com um cliente sobre um novo projeto. O cliente descreve um fluxo de contratação totalmente manual, que envolve diversos setores, diferentes níveis de permissão, etapas de aprovação, envio de e-mails e muitos outros detalhes.&lt;br&gt;&lt;br&gt;
O papel do programador é &lt;strong&gt;extrair, simplificar e organizar esses fluxos&lt;/strong&gt;, transformando a descrição em um modelo compreensível. Só assim será possível apresentar ao cliente &lt;strong&gt;quais funcionalidades serão desenvolvidas&lt;/strong&gt; e &lt;strong&gt;como elas vão funcionar&lt;/strong&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%2Ft0b8mc7mjbx2r53uxfj7.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%2Ft0b8mc7mjbx2r53uxfj7.png" alt="Diagrama do projeto" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  4.2. Estruturas de dados e algoritmos &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;São formas de organizar e processar informações. Assim como um artista usa a &lt;strong&gt;composição&lt;/strong&gt; para distribuir elementos em uma cena, o programador utiliza estruturas para dar ordem e eficiência aos dados.&lt;/p&gt;

&lt;p&gt;Observe essas 2 artes&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.artstation.com/artwork/nEYBNe" rel="noopener noreferrer"&gt;https://www.artstation.com/artwork/nEYBNe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.artstation.com/artwork/OmomKg" rel="noopener noreferrer"&gt;https://www.artstation.com/artwork/OmomKg&lt;/a&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%2Fsfava7a1zzoxvlpcwfto.png" alt="Comparando 2 artes" width="800" height="340"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Na primeira arte, não há técnicas de composição evidentes; já na segunda, o olhar do observador é conduzido intencionalmente pelos elementos, seguindo o caminho que o artista planejou.&lt;/p&gt;

&lt;p&gt;Da mesma forma, um programador deve saber &lt;strong&gt;escolher as estruturas de dados e algoritmos adequados&lt;/strong&gt; para guiar o fluxo das informações. Usar um &lt;strong&gt;array&lt;/strong&gt; para armazenar uma lista telefônica pode até funcionar, mas não será a decisão mais eficiente — nesse caso, uma estrutura de &lt;strong&gt;mapa&lt;/strong&gt; permitiria buscas muito mais rápidas e organizadas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Lista telefônica usando Vec&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;lista_telefonica&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Peter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"1111-1111"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Carlos"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"2222-2222"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Jordan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"3333-3333"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="c1"&gt;// Procurar telefone do Jordan em um Vec (O(n))&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;telefone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;lista_telefonica&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"Jordan"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;telefone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Telefone do Jordan (Vec): {:?}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;telefone&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="c1"&gt;// Lista telefônica usando HashMap&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;lista_telefonica_map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;HashMap&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;lista_telefonica_map&lt;/span&gt;&lt;span class="nf"&gt;.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Peter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"1111-1111"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;lista_telefonica_map&lt;/span&gt;&lt;span class="nf"&gt;.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Carlos"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"2222-2222"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;lista_telefonica_map&lt;/span&gt;&lt;span class="nf"&gt;.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Jordan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"3333-3333"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Procurar telefone do Jordan em HashMap (O(1))&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lista_telefonica_map&lt;/span&gt;&lt;span class="nf"&gt;.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Jordan"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Telefone do Jordan (HashMap): {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numero&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;Dominar essas estruturas — e os algoritmos que as acompanham — é essencial para compor sistemas complexos. Cada estrutura tem pontos fortes e fracos, e saber quando aplicar cada uma delas é o que diferencia soluções simples de ótimas composições.&lt;/p&gt;

&lt;h2&gt;
  
  
  4.3. Ferramental (Tooling) &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Assim como um artista que utiliza uma &lt;strong&gt;mesa digitalizadora&lt;/strong&gt; consegue desenhar mais rápido, com maior precisão e explorar possibilidades criativas que seriam muito mais trabalhosas no papel, o programador também pode acelerar e ampliar sua capacidade ao dominar suas ferramentas.&lt;/p&gt;

&lt;p&gt;O uso de &lt;strong&gt;LLMs&lt;/strong&gt; para gerar código ou documentação, &lt;strong&gt;scripts de automação&lt;/strong&gt; para eliminar tarefas repetitivas, &lt;strong&gt;Docker&lt;/strong&gt; para garantir ambientes consistentes e até sistemas como o &lt;strong&gt;Nix&lt;/strong&gt; para reproduzir setups complexos traz não apenas mais velocidade, mas também &lt;strong&gt;conforto e segurança&lt;/strong&gt; no dia a dia de desenvolvimento.&lt;/p&gt;

&lt;p&gt;Aprender e dominar essas ferramentas é tão importante quanto aprender uma linguagem de programação: são elas que permitem transformar esforço bruto em eficiência, garantindo que o desenvolvedor trabalhe com mais fluidez e tenha liberdade para explorar soluções mais sofisticadas.&lt;/p&gt;

&lt;h2&gt;
  
  
  4.4. Debugging e engenharia reversa &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Um bom desenvolvedor deve ser capaz de &lt;strong&gt;“executar mentalmente” o código&lt;/strong&gt;, acompanhando cada fluxo de decisão (&lt;code&gt;if&lt;/code&gt;, &lt;code&gt;switch&lt;/code&gt;) e cada loop (&lt;code&gt;for&lt;/code&gt;, &lt;code&gt;while&lt;/code&gt;) como se estivesse rodando o programa na cabeça.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;calcular_frete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;destino&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Frete grátis para pedidos acima de 500&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;500.0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Destino prioritário tem taxa fixa&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;destino&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"capital"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mf"&gt;20.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Valor padrão&lt;/span&gt;
    &lt;span class="mf"&gt;50.0&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você não deve precisar perder tempo executando esse código com todas as suas possibilidades para debugar, enquanto escreve já deve ser capaz de executar as possibilidades de entrada e saída para a função. &lt;/p&gt;

&lt;p&gt;O verdadeiro desafio surge quando algo dá errado: muitas vezes o erro aparece apenas como uma mensagem no console ou um comportamento inesperado na tela do cliente, enquanto &lt;strong&gt;a causa real&lt;/strong&gt; está escondida em camadas mais profundas.&lt;/p&gt;

&lt;p&gt;Depurar significa seguir esse rastro, &lt;strong&gt;passo a passo&lt;/strong&gt;, de cima para baixo, até chegar à raiz do problema. É como um artista que olha para um desenho “estranho” e percebe que a falha não está na pintura final, mas em uma proporção incorreta do esboço inicial. Ter essa habilidade de engenharia reversa, de reconstruir o caminho do erro até sua origem, é o que transforma um desenvolvedor comum em um solucionador de problemas eficiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  4.5. Abstração &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Abstração é o &lt;strong&gt;ato de simplificar&lt;/strong&gt;: olhar para um problema complexo e destacar apenas os pontos essenciais.&lt;br&gt;&lt;br&gt;
Um pintor não precisa desenhar cada fio de cabelo, &lt;strong&gt;apenas sugerir&lt;/strong&gt; volume e textura. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.artstation.com/artwork/kqq0d" rel="noopener noreferrer"&gt;Observe essa pintura&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%2Fur4yz3eh9bxdzroskc13.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%2Fur4yz3eh9bxdzroskc13.png" alt="Pintura compelta" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note que o artista não precisou pintar cada detalhe da cena, alguns elementos da pintura são somente pinceladas; ele &lt;strong&gt;concentrou-se no ponto de interesse&lt;/strong&gt; e deixou de lado elementos desnecessários. Ainda assim conseguimos identificar claramente uma criatura em um pasto de animais com montanhas ao fundo. &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%2F70i72xw8stbofq03bfec.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%2F70i72xw8stbofq03bfec.png" alt="Pintura particionada" width="783" height="643"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em programação, as &lt;strong&gt;abstrações&lt;/strong&gt; existem para organizar o caos. Ao criar uma função como sendEmail, o que realmente importa é a intenção: “enviar um e-mail”. Se será por API, SMTP ou outro provedor é apenas um &lt;strong&gt;detalhe de implementação&lt;/strong&gt;, que deve ser abstraído para poder mudar sem impactar o restante do sistema. Esse isolamento torna o código mais limpo, reutilizável e fácil de manter.&lt;/p&gt;

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

&lt;p&gt;Estudar fundamentos não significa que você dominará tudo, mas sim que terá a &lt;strong&gt;base sólida para evoluir&lt;/strong&gt;. Conhecer os fundamentos permite aplicá-los de forma consciente, adaptá-los e até quebrar regras quando necessário, da mesma forma que um artista usa formas circulares para transmitir suavidade, mas pode inverter a lógica para transmitir algo inesperado.  &lt;/p&gt;

&lt;p&gt;O essencial é entender que fundamentos não se esgotam: quanto mais você pratica, mais naturais se tornam, e mais liberdade você ganha para &lt;strong&gt;criar, inovar e resolver problemas&lt;/strong&gt; de maneira original.  &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Rust Threads safety: Uma comparação com C.</title>
      <dc:creator>Alexandre</dc:creator>
      <pubDate>Mon, 18 Nov 2024 22:54:10 +0000</pubDate>
      <link>https://dev.to/z4nder/rust-threads-safety-uma-comparacao-com-c-1a8h</link>
      <guid>https://dev.to/z4nder/rust-threads-safety-uma-comparacao-com-c-1a8h</guid>
      <description>&lt;p&gt;Nesta &lt;strong&gt;POC&lt;/strong&gt; (Proof of Concept), exploraremos como a linguagem &lt;strong&gt;Rust&lt;/strong&gt; trata as &lt;strong&gt;race conditions&lt;/strong&gt;, comparando-a com &lt;strong&gt;C&lt;/strong&gt;, uma linguagem amplamente usada, mas com menos garantias de segurança para concorrência.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rust Threads safety: Uma Comparação com C
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://doc.rust-lang.org/nomicon/races.html" rel="noopener noreferrer"&gt;Threads Safety: Data Races de C ao Rust&lt;/a&gt;&lt;/strong&gt;  &lt;/p&gt;

&lt;h2&gt;
  
  
  Índice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
1. Introdução
&lt;/li&gt;
&lt;li&gt;
2. Threads
&lt;/li&gt;
&lt;li&gt;
3. Implementação em C

&lt;ul&gt;
&lt;li&gt;
3.1. Código sem Proteção Contra Race Conditions
&lt;/li&gt;
&lt;li&gt;
3.2. Corrigindo com Mutex
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

4. Implementação em Rust

&lt;ul&gt;
&lt;li&gt;
4.1. Problema com Race Conditions
&lt;/li&gt;
&lt;li&gt;
4.2. Resolução com Mutex e Arc
&lt;/li&gt;
&lt;li&gt;
4.3. Mutex vs. RwLock
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

5. Conclusão
&lt;/li&gt;

&lt;li&gt;

6. Referências
&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  1. Introdução &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Em computação, &lt;strong&gt;threads&lt;/strong&gt; são usadas para dividir tarefas de software em subtarefas que podem ser executadas concorrentemente. Ao usar &lt;strong&gt;threads&lt;/strong&gt;, ganhamos tempo de processamento e aproveitamos melhor os recursos da máquina, mas essa concorrência traz desafios, como &lt;strong&gt;race conditions&lt;/strong&gt; que podem gerar inconsistências graves nos dados.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Threads &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Threads&lt;/strong&gt; são unidades de execução que permitem processar tarefas simultaneamente. Podemos pensar em threads como fluxos independentes de execução dentro de um programa, ilustrados na imagem abaixo:  &lt;/p&gt;

&lt;h1&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%2F2uoyr3ps4icgof9t8xc0.png" width="800" height="914"&gt;
&lt;/h1&gt;

&lt;p&gt;Embora as threads tragam vantagens de desempenho, elas introduzem riscos, especialmente ao acessar recursos compartilhados.&lt;/p&gt;

&lt;p&gt;Além disso, threads podem ser usadas para implementar paralelismo, onde múltiplas tarefas são executadas simultaneamente em diferentes núcleos de CPU. Isso permite que o programa aproveite melhor o hardware disponível, acelerando a execução de tarefas independentes.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Implementação em C &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Vamos criar um sistema simples em &lt;strong&gt;C&lt;/strong&gt;:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Um saldo inicial de 1000.
&lt;/li&gt;
&lt;li&gt;Um conjunto de transações que podem ser créditos ou débitos.
&lt;/li&gt;
&lt;li&gt;Processamento paralelo dessas transações usando threads.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  3.1. Código sem Proteção Contra Race Conditions &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;creditar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;tmp_saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Delay simulado&lt;/span&gt;

    &lt;span class="n"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;tmp_saldo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;debitar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Delay simulado&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;processar_transacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;creditar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;debitar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;transactions&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;num_transactions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transactions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transactions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

    &lt;span class="n"&gt;pthread_t&lt;/span&gt; &lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;num_transactions&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;num_transactions&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;pthread_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;processar_transacao&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;transactions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// Cria uma thread para cada transação&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;num_transactions&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;pthread_join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Aguarda todas as threads terminarem&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Saldo final da conta: %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&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;Ao optarmos por um ambiente com &lt;strong&gt;processamento multithreading&lt;/strong&gt; pode acontecer o que chamamos de &lt;strong&gt;race conditions&lt;/strong&gt;, no momento em que 2 threads acessam e modificam um mesmo valor temos uma condição de corrida. Esse problema acontece pois não é garantido uma sincronização do valor acessado em cada thread devido à concorrência entre as chamadas. &lt;/p&gt;

&lt;p&gt;Ao executar várias vezes esse código, o saldo final varia, pois threads acessam e alteram &lt;code&gt;saldo&lt;/code&gt; simultaneamente.&lt;/p&gt;

&lt;h1&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%2Fts89527lobltsjkcv3cf.png" width="800" height="638"&gt;
&lt;/h1&gt;




&lt;h4&gt;
  
  
  3.2. Corrigindo com Mutex &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="n"&gt;pthread_mutex_t&lt;/span&gt; &lt;span class="n"&gt;saldo_mutex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Mutex para proteger o saldo&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;creditar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="n"&gt;pthread_mutex_lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;saldo_mutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Bloqueia o mutex&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;tmp_saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Delay simulado&lt;/span&gt;

    &lt;span class="n"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tmp_saldo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;pthread_mutex_unlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;saldo_mutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Libera o mutex&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;debitar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;pthread_mutex_lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;saldo_mutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Bloqueia o mutex&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;tmp_saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Delay simulado&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmp_saldo&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tmp_saldo&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;pthread_mutex_unlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;saldo_mutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Libera o mutex&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mutex é um primitivo de sincronização que garante que apenas um thread tenha acesso a um recurso compartilhado por vez. O acrônimo &lt;strong&gt;mutex&lt;/strong&gt; vem do termo em inglês &lt;em&gt;mutual exclusion&lt;/em&gt;, que significa "exclusão mútua". &lt;/p&gt;

&lt;p&gt;Quando uma thread adquire um &lt;strong&gt;mutex&lt;/strong&gt;, qualquer outra thread que tente adquirir o mesmo &lt;strong&gt;mutex&lt;/strong&gt; é suspenso até que a primeira thread libere o &lt;strong&gt;mutex&lt;/strong&gt;. Isso evita que dois ou mais processos(threads) tenham acesso simultâneo ao recurso compartilhado. &lt;/p&gt;

&lt;h1&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%2Ffzmz96x1bzhu3id7l7ft.png" width="800" height="789"&gt;
&lt;/h1&gt;

&lt;h3&gt;
  
  
  4. Implementação em Rust &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rust’s rich type system and ownership model guarantee memory-safety and thread-safety — enabling you to eliminate many classes of bugs at compile-time.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pensar em Rust como uma linguagem ausente de &lt;strong&gt;data race&lt;/strong&gt; não é produtivo, mas podemos entender como as &lt;strong&gt;structs&lt;/strong&gt; e seu compilador contribuem trazendo recursos ótimos para segurança de memória e thread. &lt;/p&gt;

&lt;p&gt;Rust trata &lt;strong&gt;race conditions&lt;/strong&gt; com garantias em tempo de compilação, utilizando recursos como &lt;strong&gt;ownership&lt;/strong&gt;, &lt;strong&gt;borrowing&lt;/strong&gt; e estruturas seguras para concorrência:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Arc&lt;/strong&gt;: Compartilhamento seguro de dados imutáveis.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mutex&lt;/strong&gt; e &lt;strong&gt;RwLock&lt;/strong&gt;: Controle de acesso para dados mutáveis.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4.1. Problema com Race Conditions &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Sem o uso das structs Arc e Mutex&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// saldo mutável, mas sem proteção&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;handle1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;move&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// erro: `saldo` é movido para esta thread sem proteção&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;handle2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;move&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// erro: `saldo` é movido para esta thread sem proteção&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="n"&gt;handle1&lt;/span&gt;&lt;span class="nf"&gt;.join&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;handle2&lt;/span&gt;&lt;span class="nf"&gt;.join&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&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;Rust não permite o acesso direto a um dado &lt;strong&gt;mutável&lt;/strong&gt; (saldo) a partir de várias &lt;strong&gt;threads&lt;/strong&gt; sem proteção.&lt;br&gt;
O compilador vai gerar um erro porque saldo está sendo movido para várias threads (&lt;em&gt;handle1&lt;/em&gt; e &lt;em&gt;handle2&lt;/em&gt;) sem um mecanismo seguro.&lt;br&gt;
Mensagem de erro que será exibida é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;error[E0382]: use of moved value: &lt;span class="sb"&gt;`&lt;/span&gt;saldo&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4.2. Resolução com Mutex e Arc &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Usando &lt;code&gt;Mutex&lt;/code&gt; e &lt;code&gt;Arc&lt;/code&gt; conseguimos compilar e executar nosso código, com os problemas de &lt;strong&gt;race condition&lt;/strong&gt; tratados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;ContaBancaria&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;ContaBancaria&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;creditar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;tmp_saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.saldo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nn"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;time&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from_secs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tmp_saldo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;debitar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;tmp_saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.saldo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="nn"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;time&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from_secs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tmp_saldo&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tmp_saldo&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;consultar_saldo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.saldo&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;conta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Mutex&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ContaBancaria&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;  &lt;span class="c1"&gt;// Cria a conta com Arc&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;handles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;transactions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;transaction&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;transactions&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;conta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;clone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;conta&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;move&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;random_sleep_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;thread_rng&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.gen_range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nn"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;time&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from_secs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;random_sleep_time&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;transaction&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;conta&lt;/span&gt;&lt;span class="nf"&gt;.lock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.creditar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;conta&lt;/span&gt;&lt;span class="nf"&gt;.lock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.debitar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transaction&lt;/span&gt;&lt;span class="nf"&gt;.abs&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="n"&gt;handles&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;handles&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="nf"&gt;.join&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Espera todas as threads terminarem&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;saldo_final&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conta&lt;/span&gt;&lt;span class="nf"&gt;.lock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.consultar_saldo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Saldo final da conta: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;saldo_final&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;h4&gt;
  
  
  4.3. Mutex vs. RwLock &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Mutex e RwLock são usados para tratar &lt;strong&gt;race conditions&lt;/strong&gt;, cada um com vantagens específicas:&lt;/p&gt;

&lt;p&gt;Mutex: Garante acesso exclusivo de um recurso para uma thread, bloqueando o acesso das outras até seja liberado. É simples e eficaz, mas mesmo leituras bloqueiam o recurso, tornando-o &lt;strong&gt;menos eficiente em cenários com muitas leituras&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;RwLock: Permite múltiplas leituras simultâneas com .read() e restringe a escrita exclusiva com .write(). É &lt;strong&gt;Ideal para cenários com predominância de leituras&lt;/strong&gt;, pois melhora o desempenho ao permitir paralelismo nas operações de leitura.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Conclusão &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A comparação entre C e Rust destaca abordagens diferentes para resolver &lt;strong&gt;race conditions&lt;/strong&gt;. Enquanto C exige atenção para evitar erros de condições de corrida, Rust reduz esses riscos em tempo de compilação, por meio de ferramentas como Mutex, RwLock e Arc além do modelo de ownership. Isso não apenas torna o código mais seguro, mas também &lt;strong&gt;reduz a carga mental do programador&lt;/strong&gt; evitando bugs silenciosos.&lt;/p&gt;

&lt;p&gt;Em resumo, Rust se posiciona como uma excelente escolha para o desenvolvimento de sistemas &lt;strong&gt;concorrentes&lt;/strong&gt;, oferecendo segurança e confiabilidade.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. Referências &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Repo com os códigos: &lt;a href="https://github.com/z4nder/rust-data-races" rel="noopener noreferrer"&gt;https://github.com/z4nder/rust-data-races&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Race_condition" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Race_condition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.bughunt.com.br/o-que-sao-vulnerabilidades-race-condition/" rel="noopener noreferrer"&gt;https://blog.bughunt.com.br/o-que-sao-vulnerabilidades-race-condition/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/cwi-software/spring-boot-race-condition-e-ambiente-multi-thread-263b21e0042e" rel="noopener noreferrer"&gt;https://medium.com/cwi-software/spring-boot-race-condition-e-ambiente-multi-thread-263b21e0042e&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/troubleshoot/developer/visualstudio/visual-basic/language-compilers/race-conditions-deadlocks" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/troubleshoot/developer/visualstudio/visual-basic/language-compilers/race-conditions-deadlocks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/rust/comments/18faxjg/understanding_threadsafety_vs_race_conditions/?rdt=52263" rel="noopener noreferrer"&gt;https://www.reddit.com/r/rust/comments/18faxjg/understanding_threadsafety_vs_race_conditions/?rdt=52263&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/nomicon/races.html" rel="noopener noreferrer"&gt;https://doc.rust-lang.org/nomicon/races.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=23599598" rel="noopener noreferrer"&gt;https://news.ycombinator.com/item?id=23599598&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>c</category>
      <category>rust</category>
      <category>safety</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Schemas em SQL: Indexes e B+ trees</title>
      <dc:creator>Alexandre</dc:creator>
      <pubDate>Thu, 19 Oct 2023 18:21:27 +0000</pubDate>
      <link>https://dev.to/z4nder/schemas-em-sql-indexes-e-b-trees-20ng</link>
      <guid>https://dev.to/z4nder/schemas-em-sql-indexes-e-b-trees-20ng</guid>
      <description>&lt;p&gt;Indexes e B+ trees qual será a relação dessa engraçada estrutura de dados com nossos queridos indexes do banco?&lt;/p&gt;

&lt;h2&gt;
  
  
  Conteúdo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;1 Prólogo
&lt;/li&gt;
&lt;li&gt;2 O que são indexes
&lt;/li&gt;
&lt;li&gt;3 B Tree e B+ Tree
&lt;/li&gt;
&lt;li&gt;4 Vamos observar na prática
&lt;/li&gt;
&lt;li&gt;5 Conclusão
&lt;/li&gt;
&lt;li&gt;6 Referências
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1 Prólogo &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;O que são &lt;strong&gt;indexes&lt;/strong&gt; e como eles são usados para &lt;strong&gt;optimizar buscas&lt;/strong&gt;? quantas vezes já não adicionamos indexes em colunas de tabelas com milhares de registros e magicamente as queries caíram de alguns segundos para milissegundos, nunca foi magica e sim &lt;strong&gt;Computer Science&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. O que são indexes &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Index são uma estrutura separada da estrutura dos registros tabela, sendo feita uma &lt;strong&gt;cópia de uma parte&lt;/strong&gt; dos seus dados, que servem como um ponteiro para acessar um registro específico.&lt;/p&gt;

&lt;p&gt;Quando pensamos em criar &lt;em&gt;index&lt;/em&gt; existe um conceito que podemos seguir &lt;strong&gt;"As many as you need, As few as you can get away with"&lt;/strong&gt;, em outras palavras, você deve criar índices suficientes para &lt;strong&gt;acelerar as consultas&lt;/strong&gt; e melhorar o desempenho, mas não deve criar muitos índices desnecessários, pois isso pode &lt;em&gt;aumentar o espaço de armazenamento&lt;/em&gt; e a sobrecarga inserções no banco de dados, já que sempre que um registro for inserido vão ser criados também os &lt;code&gt;indexes&lt;/code&gt; existentes.&lt;/p&gt;

&lt;p&gt;Então como sei quais index criar? Para criar seus indexes é preciso olhar para &lt;strong&gt;queries que pretende executar&lt;/strong&gt;, para montar um bom &lt;code&gt;schema&lt;/code&gt; olhamos para os dados que vamos armazenar, já para bons &lt;code&gt;indexes&lt;/code&gt; olhamos para as &lt;code&gt;queries&lt;/code&gt; estamos executando ou pretendemos executar. &lt;/p&gt;

&lt;h3&gt;
  
  
  3. B Tree e B+ Tree &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Como foi dito os indexes são partes dos seus dados armazenados em uma estrutura diferente, essa estrutura é a &lt;code&gt;B+Tree&lt;/code&gt;, antes de entendermos ela precisamos compreender a &lt;code&gt;B Tree&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;B Tree é uma estrutura não lineares diferentes de um &lt;code&gt;Array&lt;/code&gt;, que somente podemos ir para frente e para trás com as árvores podemos navegar para níveis e subníveis dentro dela.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbo4g68okyoe0elfrms1a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbo4g68okyoe0elfrms1a.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;B Tree&lt;/code&gt; diferente a &lt;code&gt;Binary Tree&lt;/code&gt; permite que armazenemos mais de um valor por nó, como na imagem de exemplo onde o primeiro nó tem 2 valores &lt;code&gt;20&lt;/code&gt; e o &lt;code&gt;40&lt;/code&gt; permitindo que tenhamos um bloco de valores em cada nó que recebem o nome de página. &lt;/p&gt;

&lt;p&gt;B+tree é a estrutura de dados que está por trás das &lt;strong&gt;buscas optimizadas&lt;/strong&gt; que o banco faz, é uma estrutura derivada das &lt;code&gt;BTrees&lt;/code&gt;, mas com uma forma diferente de armazenar suas chaves de uma maneira que o processamento sequencial e aleatório de chaves fossem eficientes, sendo bastante usadas em &lt;code&gt;bancos de dados&lt;/code&gt; como MYSQL e &lt;code&gt;sistemas de arquivo&lt;/code&gt; como FTP. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fow409mzr5socc0ywnpiq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fow409mzr5socc0ywnpiq.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A principal diferença de estrutura das duas é que a &lt;code&gt;B+&lt;/code&gt; os dados são armazenados apenas nas folhas(Nós finais, que não tem filhos), e seus nós internos &lt;strong&gt;armazenam ponteiros&lt;/strong&gt; para os filhos e suas folhas são uma &lt;code&gt;linked list&lt;/code&gt; facilitando assim uma busca sequencial de valores se adequando bem melhor para o contexto de bancos de dados, já a &lt;code&gt;B Tree&lt;/code&gt; é mais versátil permitindo um uso em uma variedade maior de contextos.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Prática &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Vamos observar como uma query usa index para encontrar os dados e como seria essa mesma busca se não usássemos os index.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM users;  
EXPLAIN SELECT * FROM users WHERE name='Virux';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ecmo4pq42mzl9kmcdv3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ecmo4pq42mzl9kmcdv3.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como o SQL fez para encontrar um &lt;code&gt;user&lt;/code&gt; baseado no nosso &lt;code&gt;where&lt;/code&gt; ? &lt;/p&gt;

&lt;p&gt;Sem um índice, o MySQL vai ler toda a tabela do início ao fim encontrando os valores desejados, conseguimos comprovar isso observando valor &lt;code&gt;all&lt;/code&gt; no campo &lt;code&gt;type&lt;/code&gt; que o &lt;code&gt;EXPLAIN&lt;/code&gt; nos retorna, ou seja, quanto maior a tabela mais lenta a busca, como &lt;code&gt;Virux&lt;/code&gt; é o registro 9 ele precisou ler 8 registros até encontrar o desejado.&lt;/p&gt;

&lt;p&gt;Executando isso o SQL vai criar um index para esse campo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_name&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora se a coluna &lt;code&gt;name&lt;/code&gt; tiver um index executando a mesma busca será feita de uma forma mais optimizada, buscando na estrutura da &lt;code&gt;B+Tree&lt;/code&gt; que o mysql montou com os seus dados, conseguimos identificar isso com o valor &lt;code&gt;ref&lt;/code&gt; no campo &lt;code&gt;type&lt;/code&gt; que o &lt;code&gt;EXAPLAIN&lt;/code&gt; nos retorna.&lt;/p&gt;

&lt;p&gt;Podemos encontrar esse registro com somente &lt;strong&gt;3 etapas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft2299zfnubhexm3fojj0.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft2299zfnubhexm3fojj0.gif" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Conclusão &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Com isso podemos concluir que buscar usando &lt;strong&gt;index são bem mais optimizadas&lt;/strong&gt;, pois são feitas em uma estrutura de dados separada da sua tabela chamada &lt;code&gt;B+Tree&lt;/code&gt;, mas precisamos criar nossos index com cuidado pensando nas queries que pretendemos executar, pois eles afetam diretamente a desempenho das inserções além de aumentar o espaço de armazenamento. &lt;/p&gt;

&lt;h3&gt;
  
  
  6. Referências &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/B%2B_tree" rel="noopener noreferrer"&gt;B+Tree Wiki&lt;/a&gt; &lt;br&gt;
&lt;a href="https://www.cs.usfca.edu/~galles/visualization/BTree.html" rel="noopener noreferrer"&gt;B+Tree Vizualize&lt;/a&gt; &lt;br&gt;
&lt;a href="https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html" rel="noopener noreferrer"&gt;Doc do mysql sobre index&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mysql</category>
      <category>database</category>
      <category>sql</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Garanta a Eficiência: Escolhendo entre tipos String no SQL</title>
      <dc:creator>Alexandre</dc:creator>
      <pubDate>Tue, 29 Aug 2023 12:27:27 +0000</pubDate>
      <link>https://dev.to/z4nder/garanta-a-eficiencia-escolhendo-entre-tipos-string-no-sql-115m</link>
      <guid>https://dev.to/z4nder/garanta-a-eficiencia-escolhendo-entre-tipos-string-no-sql-115m</guid>
      <description>&lt;p&gt;Garanta a eficiência, nova série fazendo mais sucesso que The Walking Dead, venha aprender como salvar seus strings no seu banco sql.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conteúdo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;1 Prólogo
&lt;/li&gt;
&lt;li&gt;2 CHAR
&lt;/li&gt;
&lt;li&gt;3 VARCHAR
&lt;/li&gt;
&lt;li&gt;4 CHARSET e COLLATE
&lt;/li&gt;
&lt;li&gt;5 Conclusão
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Prólogo &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Dando continuidade à nossa série, já abordamos os valores numéricos agora, chegou a hora de nos aprofundarmos nas strings. Neste artigo, exploraremos as diferenças entre os tipos &lt;code&gt;VARCHAR&lt;/code&gt; e &lt;code&gt;CHAR&lt;/code&gt;, além de fornecer uma compreensão detalhada sobre os conceitos de &lt;code&gt;CHARSET&lt;/code&gt; e &lt;code&gt;COLLATE&lt;/code&gt;, os quais você certamente já encontrou em seus bancos de dados, mas talvez ainda não tenha uma ideia clara de suas finalidades.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. CHAR &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;O tipo de dado CHAR no MySQL é usado para armazenar strings de comprimento fixo.&lt;/p&gt;

&lt;p&gt;Se o valor de uma string CHAR tiver um comprimento menor do que o comprimento especificado, os espaços em branco serão adicionados automaticamente ao final da string para preencher o espaço restante. Esses espaços em branco serão incluídos.&lt;/p&gt;

&lt;p&gt;O tipo de dado CHAR é usado principalmente quando você precisa armazenar strings de comprimento fixo ou quando há um requisito específico para o tamanho da string. As comparações e pesquisas em colunas CHAR são mais rápidas do que em colunas VARCHAR porque não há necessidade de levar em consideração o tamanho variável.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. VARCHAR &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;O tipo de dado VARCHAR armazena strings de comprimento variável, o que significa que o tamanho ocupado no armazenamento depende do comprimento real da string. Por exemplo, se você definir uma coluna VARCHAR(255) e inserir uma string de apenas 10 caracteres, ela ocupará apenas a quantidade de espaço necessária para armazenar esses 10 caracteres.&lt;/p&gt;

&lt;p&gt;O tipo de dado VARCHAR pode ser mais eficiente em termos de armazenamento em comparação com o tipo de dado CHAR se a maioria das strings armazenadas tiver comprimentos variáveis. Isso ocorre porque o espaço alocado para armazenar a string é proporcional ao comprimento real da string e não ao comprimento máximo especificado.&lt;/p&gt;

&lt;p&gt;O tipo de dado VARCHAR &lt;strong&gt;requer espaço adicional de armazenamento para registrar o comprimento real da string&lt;/strong&gt;. Esse espaço extra varia de 1 a 2 bytes, dependendo do tamanho máximo especificado para a coluna VARCHAR.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. CHARSET e COLLATE &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;fixed100&lt;/span&gt; &lt;span class="nb"&gt;CHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;-- 100 bytes "Aaron     ..."&lt;/span&gt;
    &lt;span class="n"&gt;var100&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;-- 5 bytes + 1 Byte "Aaron"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="nv"&gt;`strings`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nv"&gt;`fixed100`&lt;/span&gt; &lt;span class="nb"&gt;char&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nv"&gt;`var100`&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ENGINE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;InnoDB&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;CHARSET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;utf8mb4&lt;/span&gt; &lt;span class="k"&gt;COLLATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;utf8mb4_0900_ai_ci&lt;/span&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;information_schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CHARACTER_SETS&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="k"&gt;CHARACTER_SET_NAME&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1p9o2e6xfvf30wzn8nnn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1p9o2e6xfvf30wzn8nnn.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  CHARSET (utf8mb4)
&lt;/h4&gt;

&lt;p&gt;O CHARSET &lt;strong&gt;&lt;code&gt;utf8mb4&lt;/code&gt;&lt;/strong&gt; é uma configuração no MySQL que define o conjunto de caracteres utilizado para armazenar dados em colunas de texto. Nesse caso, o &lt;strong&gt;&lt;code&gt;utf8mb4&lt;/code&gt;&lt;/strong&gt; refere-se a um conjunto de caracteres multibyte que suporta a codificação UTF-8.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;utf8&lt;/code&gt;&lt;/strong&gt;: Refere-se ao conjunto de caracteres UTF-8, que é um padrão universalmente aceito para representação de caracteres em várias línguas e scripts. O UTF-8 é capaz de representar uma ampla gama de caracteres e é amplamente utilizado em sistemas modernos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;mb4&lt;/code&gt;&lt;/strong&gt;: É uma abreviação de "multibyte 4", indicando que o conjunto de caracteres suporta até 4 bytes por caractere. Isso permite a representação de caracteres que requerem mais de 2 bytes, como emojis e caracteres especiais de diferentes idiomas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  COLLATE (utf8mb4_0900_ai_ci)
&lt;/h4&gt;

&lt;p&gt;A cláusula COLLATE é usada para definir a ordem de classificação de caracteres em operações de comparação e classificação de texto. No caso específico do COLLATE &lt;strong&gt;&lt;code&gt;utf8mb4_0900_ai_ci&lt;/code&gt;&lt;/strong&gt;, é uma sequência de configuração que define a ordem de classificação. Essas definições são as seguintes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;utf8mb4&lt;/code&gt;&lt;/strong&gt;: É um conjunto de caracteres que suporta a codificação UTF-8 de caracteres multibyte. O UTF-8 é um padrão universalmente aceito para representação de caracteres e suporta uma ampla gama de caracteres de diferentes idiomas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;0900&lt;/code&gt;&lt;/strong&gt;: É um indicador da versão do algorítimo usado. Neste caso, &lt;strong&gt;&lt;code&gt;0900&lt;/code&gt;&lt;/strong&gt; refere-se à versão do Unicode Collation Algorithm (ou UCA). As versões mais recentes do MySQL podem introduzir atualizações e melhorias nos conjuntos de caracteres existentes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ai&lt;/code&gt;&lt;/strong&gt;: É uma abreviação de "Accent Insensitive" (insensível a acentos). Isso significa que as comparações de caracteres são realizadas sem levar em consideração os acentos. Por exemplo, as letras "á" e "a" seriam consideradas iguais.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ci&lt;/code&gt;&lt;/strong&gt;: É uma abreviação de "Case Insensitive" (insensível a maiúsculas e minúsculas). Isso significa que as comparações de caracteres são realizadas sem levar em consideração a diferença entre letras maiúsculas e minúsculas. Por exemplo, as letras "A" e "a" seriam consideradas iguais.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Conclusão &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Neste artigo, exploramos a diferença entre os tipos de string &lt;code&gt;VARCHAR&lt;/code&gt; e &lt;code&gt;CHAR&lt;/code&gt; no MySQL. Aprendemos que o &lt;code&gt;CHAR&lt;/code&gt; é ideal para tamanhos fixos, enquanto o &lt;code&gt;VARCHAR&lt;/code&gt; é mais adequado para tamanhos variáveis. Além disso, compreendemos o papel do &lt;code&gt;CHARSET&lt;/code&gt; e &lt;code&gt;COLLATE&lt;/code&gt;, permitindo personalizar a ordenação de texto.&lt;/p&gt;

&lt;p&gt;Com esse conhecimento, podemos tomar decisões mais acertadas ao projetar nossas tabelas no MySQL, garantindo a eficiência e o desempenho ideais para nossas aplicações. A escolha inteligente dos tipos de string e configurações de charset/collate é crucial para um banco de dados otimizado e bem-sucedido.&lt;/p&gt;

</description>
      <category>sql</category>
      <category>mysql</category>
      <category>beginners</category>
      <category>database</category>
    </item>
    <item>
      <title>Garanta a Eficiência: Escolhendo entre tipos decimais no SQL</title>
      <dc:creator>Alexandre</dc:creator>
      <pubDate>Wed, 12 Jul 2023 00:30:56 +0000</pubDate>
      <link>https://dev.to/z4nder/garanta-a-eficiencia-escolhendo-entre-tipos-decimais-no-sql-17de</link>
      <guid>https://dev.to/z4nder/garanta-a-eficiencia-escolhendo-entre-tipos-decimais-no-sql-17de</guid>
      <description>&lt;p&gt;Decimais, existem tantos e qual devo escolher ? Saiba que essa decisão é de total importância para não perder dinheiro em seu software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conteúdo
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Prólogo&lt;/li&gt;
&lt;li&gt;Tipos decimais SQL&lt;/li&gt;
&lt;li&gt;O que é essa precisão ?&lt;/li&gt;
&lt;li&gt;Então quando eu não ira querer precisão&lt;/li&gt;
&lt;li&gt;Vamos observar na prática&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. Prólogo &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Sempre tive dúvidas sobre a razão pela qual existem tantos tipos de dados &lt;code&gt;decimais&lt;/code&gt; no SQL e quando é apropriado utilizá-los, especialmente ao lidar com valores monetários, onde a consistência dos cálculos e a precisão são fundamentais para &lt;strong&gt;evitar perdas financeiras&lt;/strong&gt;. Muitos desses tipos de dados são desconhecidos ou subutilizados no cotidiano de um desenvolvedor web. No entanto, estar ciente dos seus casos de uso diferenças é uma vantagem significativa para quando precisar usar você conseguir identificar.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tipos decimais SQL&lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Existem diversos tipos de dados decimais disponíveis no SQL, cada um com seu próprio propósito e comportamento. Vamos explorar alguns dos tipos mais comuns:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;DECIMAL/NUMERIC&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O tipo &lt;code&gt;DECIMAL&lt;/code&gt; possui um alias (apelido) chamado &lt;code&gt;NUMERIC&lt;/code&gt;, ou seja ambos têm o mesmo comportamento. Esse tipo é especialmente adequado para lidar com valores precisos, como dinheiro, onde é crucial manter a exatidão das informações.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;FLOAT&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O tipo &lt;code&gt;FLOAT&lt;/code&gt; é recomendado para valores aproximados, como estatísticas, por serem eficientes em termos de espaço de armazenamento e desempenho, ocupando um total de 4 bytes de espaço de armazenamento.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;DOUBLE&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O campo &lt;code&gt;DOUBLE&lt;/code&gt; também é apropriado para valores aproximados, mas oferece um range de valores maior em comparação ao &lt;code&gt;FLOAT&lt;/code&gt;. Para acomodar essa flexibilidade, ele requer 8 bytes de espaço de armazenamento. &lt;/p&gt;

&lt;h3&gt;
  
  
  3. O que é essa precisão ?&lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Essa precisão é você saber que se um cliente comprar 2 produtos que custam R$ 20,30 ele vai pagar R$ 20,60 e não R$ 20,59999931231232321. &lt;/p&gt;

&lt;h3&gt;
  
  
  4. Então quando eu não ira querer precisão ?&lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Embora o &lt;code&gt;float&lt;/code&gt; possa introduzir variações nos cálculos, há casos de uso em que eles são vantajosos na prática. Aqui estão dois exemplos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Cálculos científicos e simulações: Em muitas áreas da ciência e da engenharia, os cálculos envolvem números que não exigem uma precisão extrema. Nesses casos, o uso de &lt;code&gt;float&lt;/code&gt; pode ser adequado, pois oferece uma representação aproximada dos valores com eficiência de espaço e desempenho. Por exemplo, em simulações físicas, como modelos de sistemas climáticos ou mecânicos, a precisão aproximada fornecida pelos números de ponto flutuante é suficiente e pode acelerar significativamente os cálculos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Processamento gráfico: Em aplicações de computação gráfica, como jogos ou renderização de imagens, o uso de &lt;code&gt;float&lt;/code&gt; é comum para representar coordenadas 3D, cores e transformações. A natureza aproximada dos números de ponto flutuante não é perceptível para a maioria dos usuários, e a velocidade de processamento é fundamental nesses casos.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  5. Vamos observar na prática&lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Criaremos uma tabela para testes chamada decimals&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;decimals&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;d1&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="n"&gt;d2&lt;/span&gt; &lt;span class="nb"&gt;FLOAT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;-- 4 bytes&lt;/span&gt;
  &lt;span class="n"&gt;d3&lt;/span&gt; &lt;span class="nb"&gt;DOUBLE&lt;/span&gt; &lt;span class="c1"&gt;-- 8 bytes&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;decimals&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;decimals&lt;/span&gt; &lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao executar o SELECT vamos ter o seguinte resultado&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;sum(d1)&lt;/th&gt;
&lt;th&gt;sum(d2)&lt;/th&gt;
&lt;th&gt;sum(d3)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;20.40&lt;/td&gt;
&lt;td&gt;20.400001525878906&lt;/td&gt;
&lt;td&gt;20.400000000000006&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nesse exemplo, criamos uma tabela chamada "decimals" com três colunas: "d1" do tipo DECIMAL(10, 2), "d2" do tipo FLOAT e "d3" do tipo DOUBLE. Em seguida, inserimos duas linhas de dados nessa tabela.&lt;/p&gt;

&lt;p&gt;Ao realizar a soma dos valores de cada coluna usando a cláusula GROUP BY, podemos observar as diferenças resultantes. A coluna "d1", que utiliza o tipo DECIMAL com precisão fixa de duas casas decimais, apresenta um resultado preciso de 20.40.&lt;/p&gt;

&lt;p&gt;No entanto, as colunas "d2" (FLOAT) e "d3" (DOUBLE) demonstram as variações típicas dos números de ponto flutuante. Embora os valores somados sejam teoricamente iguais a 20.40, devido à representação aproximada desses tipos, ocorrem pequenas variações nos resultados. Essas variações podem ocorrer devido a erros de arredondamento ou limitações na precisão dos bits usados para representar os números.&lt;/p&gt;

&lt;p&gt;Essas diferenças podem parecer insignificantes, mas em casos que exigem precisão exata, como manipulação de valores monetários, elas podem levar a perdas ou erros nos cálculos financeiros.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Conclusão &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Exploramos os diferentes tipos de dados decimais no &lt;code&gt;SQL&lt;/code&gt; e destacamos a importância de escolher o tipo correto com base nas necessidades específicas. Ao lidar com valores monetários e cálculos que exigem precisão absoluta, é recomendado utilizar tipos decimais de precisão fixa, como &lt;code&gt;DECIMAL&lt;/code&gt; ou &lt;code&gt;NUMERIC&lt;/code&gt;. Esses tipos garantem resultados consistentes e evitam perdas de valor.&lt;/p&gt;

&lt;p&gt;Embora os números de ponto flutuante (float) possam ser vantajosos em determinados cenários, e*&lt;em&gt;les podem introduzir variações nos cálculos&lt;/em&gt;* devido à natureza aproximada da representação. É essencial avaliar o contexto e a precisão necessária para evitar problemas de arredondamento.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Garanta a Eficiência: Escolhendo Sabiamente o Tipo de Dado Integer no MySQL</title>
      <dc:creator>Alexandre</dc:creator>
      <pubDate>Tue, 04 Jul 2023 18:16:05 +0000</pubDate>
      <link>https://dev.to/z4nder/garanta-a-eficiencia-escolhendo-sabiamente-o-tipo-de-dado-integer-no-mysql-16pc</link>
      <guid>https://dev.to/z4nder/garanta-a-eficiencia-escolhendo-sabiamente-o-tipo-de-dado-integer-no-mysql-16pc</guid>
      <description>&lt;p&gt;Já pensou no motivo de um banco de dados ter tantos tipos de valores inteiros? SMALLINT? BIGINT? É de comer?&lt;/p&gt;

&lt;h2&gt;
  
  
  Conteúdo
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Prólogo&lt;/li&gt;
&lt;li&gt;Escolhendo tipos em modelos de dados&lt;/li&gt;
&lt;li&gt;Tomando uma decisão consciente&lt;/li&gt;
&lt;li&gt;O que posso fazer um Byte ?&lt;/li&gt;
&lt;li&gt;Agora vamos colocar em prática&lt;/li&gt;
&lt;li&gt;Considerações finais&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. Prólogo&lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Nessa vida de desenvolvedor de software, aprendi a valorizar os fundamentos das tecnologias com as quais trabalho. Neste artigo, vamos explorar todos os tipos &lt;strong&gt;INTEGER&lt;/strong&gt; existentes, quais suas características e como podemos usar isso para tomar decisões mais assertivas ao modelar um esquema com &lt;strong&gt;MySQL&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Escolhendo tipos em modelos de dados&lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Um princípio fundamental para modelar dados é avaliar se os tipos escolhidos são os melhores para os valores que serão recebidos. Nesse artigo vamos tentar entender quais tipos de inteiros existem e quais suas diferenças para podermos tomar essa melhor decisão no momento de criar nossas tabelas.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Tomando uma decisão consciente&lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Para conseguirmos tomar a decisão mais consciente precisamos saber quais o &lt;strong&gt;tipos de inteiro&lt;/strong&gt; existentes e qual o espaço ocupado em &lt;strong&gt;Bytes&lt;/strong&gt; por cada tipo, pois independente de você inserir o número inteiro 1 em um registro ele ocupa um espaço diferente de acordo com o tipo de dado do schema.&lt;/p&gt;

&lt;p&gt;Por exemplo, o tipo &lt;strong&gt;TINYINT&lt;/strong&gt; ocupa &lt;code&gt;1 byte&lt;/code&gt;, enquanto o tipo &lt;strong&gt;BIGINT&lt;/strong&gt; ocupa &lt;code&gt;8 bytes&lt;/code&gt;. Portanto, mesmo que você insira o número inteiro 1 em um registro, ele ocupará um espaço diferente dependendo do tipo de dado especificado no esquema (schema).&lt;/p&gt;

&lt;p&gt;Podemos considerar que cada tipo de inteiros nos permitem armazenar um certo range de valores e cada range reserva uma quantidade de Bytes.&lt;/p&gt;

&lt;p&gt;Vamos observar todos os tipos e seus custos de Bytes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Storage (Bytes)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TINYINT&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMALLINT&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MEDIUMINT&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INT&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  4. O que posso fazer um Byte ?&lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F749bb223ohee865q06k9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F749bb223ohee865q06k9.png" alt="Ilustração de uma linha com 8 bits"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com 1 Byte podemos usar 8 Bits, ou seja com o &lt;strong&gt;TINYINT&lt;/strong&gt; podemos armazenar números no seguinte range:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="mi"&gt;11111111&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E caso precisarmos ter um sinal ? Nesse caso vamos precisas separar um bit para isso reduzindo nosso range assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="mi"&gt;1111111&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;negative&lt;/span&gt; &lt;span class="nx"&gt;bit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="mi"&gt;1111111&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;127&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;positive&lt;/span&gt; &lt;span class="nx"&gt;bit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso temos a seguinte tabela:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Storage (Bytes)&lt;/th&gt;
&lt;th&gt;Min Signed&lt;/th&gt;
&lt;th&gt;Max Signed&lt;/th&gt;
&lt;th&gt;Min Unsigned&lt;/th&gt;
&lt;th&gt;Max Unsigned&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TINYINT&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;-128&lt;/td&gt;
&lt;td&gt;127&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;255&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMALLINT&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;-32768&lt;/td&gt;
&lt;td&gt;32767&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;65535&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MEDIUMINT&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;-8388608&lt;/td&gt;
&lt;td&gt;8388607&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;16777215&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INT&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;-2147483648&lt;/td&gt;
&lt;td&gt;2147483647&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;4294967295&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BIGINT&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;-2^63&lt;/td&gt;
&lt;td&gt;2^63-1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2^64-1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  5. Agora vamos colocar em prática&lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="nv"&gt;`books`&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nv"&gt;`id`&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nv"&gt;`title`&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nv"&gt;`num_pages`&lt;/span&gt; &lt;span class="nb"&gt;SMALLINT&lt;/span&gt; &lt;span class="nb"&gt;UNSIGNED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
     &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&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;Nesse trecho de SQL, tomamos a decisão de escolher o tipo de inteiro mais adequado com base no contexto do nosso caso de uso. Ao analisar a coluna &lt;code&gt;num_pages&lt;/code&gt;, que representa o total de páginas de um livro, optamos por utilizar o tipo &lt;strong&gt;SMALLINT&lt;/strong&gt;. Essa escolha foi feita levando em consideração os seguintes fatores:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Valor máximo adequado:&lt;/strong&gt; O tipo &lt;strong&gt;TINYINT&lt;/strong&gt; possui um valor &lt;code&gt;máximo de 255&lt;/code&gt;, o qual poderia ser facilmente ultrapassado por livros com um número significativo de páginas. No entanto, o tipo &lt;strong&gt;SMALLINT&lt;/strong&gt; oferece um tamanho maior, permitindo um valor máximo de 65535. Essa faixa é mais adequada para a representação do número de páginas de um livro na vida real a não ser que você esteja lendo Game of Thrones, ai já seria preciso de um BIGINIT.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Modificador UNSIGNED:&lt;/strong&gt; Utilizamos o modificador &lt;code&gt;UNSIGNED&lt;/code&gt; para indicar que não há necessidade de armazenar valores negativos para o número de páginas de um livro. Isso nos permite aproveitar um limite positivo maior dentro do mesmo tipo de dado, já que não precisamos reservar espaço para o sinal.&lt;/p&gt;

&lt;p&gt;Portanto, ao escolher o tipo &lt;code&gt;SMALLINT UNSIGNED&lt;/code&gt; para a coluna &lt;code&gt;num_pages&lt;/code&gt;, levamos em consideração o valor máximo adequado, a economia de espaço e a exclusão da possibilidade de valores negativos, garantindo uma representação eficiente e precisa do número de páginas dos livros em nosso sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Considerações finais&lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Após compreendermos as diferenças entre os tipos de inteiro, percebi o quanto é importante escolher o tipo de dado adequado para cada situação. Refletindo sobre minha própria experiência, lembro-me das vezes em que utilizei o tipo &lt;strong&gt;INTEGER&lt;/strong&gt; desnecessariamente. Após aprofundar-me nesse assunto e compartilhar essas informações, acredito que não vou mais cometer esse erro. Espero que este artigo tenha sido esclarecedor para vocês também, auxiliando na escolha consciente do tipo de inteiro mais adequado para cada contexto.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://discord.gg/JspQr3GPve" rel="noopener noreferrer"&gt;Venha fazer parte&lt;/a&gt; de um ambiente de aprendizado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb8burs8kanqnoiag1ywf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb8burs8kanqnoiag1ywf.png" alt="Banner da Hive Community"&gt;&lt;/a&gt;&lt;/p&gt;

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