<?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: Laura Fumagalli</title>
    <description>The latest articles on DEV Community by Laura Fumagalli (@fumagallilaura).</description>
    <link>https://dev.to/fumagallilaura</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%2F802780%2F4e1c0934-22b3-4919-bd29-7f05e1c76620.jpeg</url>
      <title>DEV Community: Laura Fumagalli</title>
      <link>https://dev.to/fumagallilaura</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fumagallilaura"/>
    <language>en</language>
    <item>
      <title>Programação funcional - primeiras impressões com Clojure</title>
      <dc:creator>Laura Fumagalli</dc:creator>
      <pubDate>Thu, 25 Sep 2025 01:23:09 +0000</pubDate>
      <link>https://dev.to/fumagallilaura/programacao-funcional-primeiras-impressoes-com-clojure-10dc</link>
      <guid>https://dev.to/fumagallilaura/programacao-funcional-primeiras-impressoes-com-clojure-10dc</guid>
      <description>&lt;p&gt;O intuito deste artigo é ser a &lt;strong&gt;primeira parte&lt;/strong&gt; de um material introdutório à Programação Funcional. Usarei Clojure, uma linguagem que usa esse paradigma muito diferente da tradicional Orientação a Objetos amplamente utilizada no mercado de trabalho e ensinada em faculdades tradicionais. Se você tem a mente aberta para uma nova linguagem de programação e acredita que uma sintaxe e paradigma novos te levarão a novos horizontes, este artigo é para você! Vou também fazer algumas comparações com linguagens historicamente consideradas orientadas a objeto (como Java, por exemplo).&lt;/p&gt;

&lt;p&gt;Logo de início, já vou trazer que a Programação Funcional tem muito a agregar. Com ela, é possível escrever códigos mais robustos, menos suscetíveis a erros e expandir sua forma de pensar. Por exemplo, a &lt;strong&gt;imutabilidade&lt;/strong&gt;, um conceito comum nesse paradigma, minimiza a possibilidade de encontrarmos defeitos oriundos da manipulação de estado em lugares desconhecidos. Uma grande vantagem de aprender Programação Funcional é utilizar os benefícios do paralelismo, que trarei aqui mais adiante. Escrever código paralalizável em uma linguagem de paradigma funcional é muito mais fácil. A ausência de efeitos colaterais nas funções de um programa permite que essas funções sejam executadas sem uma ordem definida e em paralelo. A programação funcional nos ajuda a pensar sempre em construir funções sem efeitos colaterais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que Clojure?
&lt;/h2&gt;

&lt;p&gt;Essa linguagem possui recursos interessantes para nos ajudar a manter o foco nos aspectos inerentes à linguagem e à Programação ƒuncional: a sintaxe, que é simples e muito diferente das linguagens mais populares, e um sistema dinâmico de tipos, o que vai nos permitir evitar pensar em Orientação a Objetos por um tempo. &lt;strong&gt;Clojure é um dialeto Lisp&lt;/strong&gt;. Enquanto todas as outras linguagens, como Java, Golang, C# etc, derivam do Algol (como C), linguagens de Paradigma Funcional, como Clojure, Scala ou Elixir por exemplo, são da família do Lisp. Lisp é uma linguagem que trouxe a ideia de que é possível utilizar apenas funções matemáticas para reprezentar estruturas de dados básicas, aliado ao conceito de código como dado. Depois do "choque inicial", é possível perceber que a sintaxe é extremamente simples, com poucos símbolos ou palavras-chaves reservadas.&lt;/p&gt;

&lt;p&gt;Clojure roda na máquina virtual Java, o que permite que &lt;strong&gt;programas escritos nesta linguagem usem bibliotecas escritas em Java&lt;/strong&gt;! Dito isto, você precisa instalar o kit de desenvolvimento do Java, JDK, antes de instalar o Clojure em si. Basta seguir o passo a passo da própria documentação no site oficial deles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Primeiro código em Clojure (e o REPL)
&lt;/h2&gt;

&lt;p&gt;Algo que pode parecer estranho no começo é o fato de &lt;strong&gt;não depurar o código da forma tradicional&lt;/strong&gt; em Clojure. REPL é um ambiente imterativo onde escrevemos códigos e eles são &lt;strong&gt;interpretados&lt;/strong&gt; de imediato, gerando resultados muito rápidos. É ideal para trechos pequenos e validação de ideias.&lt;/p&gt;

&lt;p&gt;REPL é um acrônimo para &lt;em&gt;read, evaluate, print e loop&lt;/em&gt;. Isto quer dizer que ele vai ler nossos comandos, interpretá-los, exibir na tela o resultado e repetir o processo.&lt;/p&gt;

&lt;p&gt;Programar no REPL é algo bem comum entre quem tem familiaridade com Clojure. Claro, em algum momento, nossos códigos vão parar em arquivos e serão empacotados. Mas o REPL fornece um ambiente muito prático para experimentação e testes. Algumas pessoas substituem desenvolvimento guiado por testes pelo constante uso do REPL, mas eu não recomendo. É sempre melhor criar casos de testes para garantir a consistência e qualidade do código, independente da linguagem. Se hoje você sente dificuldade com TDD, ou Desenvolvimento Orientado por Testes (Test-Driven Development), aprender a desenvolver em Clojure é uma excelente oportunidade de treinar essa prática.&lt;/p&gt;

&lt;p&gt;Para entender esse tal de REPL na prática, vamos usar o Boot "clj". Basta abrir o terminar e digitar &lt;code&gt;clj&lt;/code&gt; ou &lt;code&gt;clojure&lt;/code&gt; que vai abrir um terminal interativo esperando você fornecer alguma informação, o terminal diz: &lt;code&gt;user=&amp;gt;&lt;/code&gt;. Isso significa que já podemos escrever código! É possível sair desse contexto apertando "ctrl + d".&lt;/p&gt;

&lt;h2&gt;
  
  
  Primeiros contatos com Clojure
&lt;/h2&gt;

&lt;p&gt;Aqui vou fazer uma abordagem um pouco diferente sobre essa linguagem. O código em Clojure me lembrou muito RPN (Reverse Polish Notation / Notação Polonesa Reversa). RPN basicamente é um método para escrever expressões matemáticas onde os operadores (+, -, *) são colocados depois dos números (operandos), eliminando a necessidade de parênteses. Exemplo de uso: "O motor de cálculo converte a fórmula (10 + 5) * 2 para a expressão RPN 10 5 + 2 * para poder processá-la". É normalmente usado em sistemas de back-end, como calculadoras e motores de regras (rule engines), para avaliar de forma rápida e sem ambiguidade fórmulas complexas de juros, tarifas ou limites de crédito.&lt;/p&gt;

&lt;p&gt;Entrando no REPL e digitando &lt;code&gt;(+ 1 2)&lt;/code&gt; o resultado, como esperado, é &lt;code&gt;3&lt;/code&gt;. Mas a sintaxe parece bem diferente das linguagens com as quais estamos acostumadas. Vamos à explicação:&lt;/p&gt;

&lt;p&gt;Acontece que a linha dentro do &lt;code&gt;()&lt;/code&gt; é uma lista composta de &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt; e &lt;code&gt;2&lt;/code&gt;. O primeiro elemento dessa lista é sempre uma função que é executada e os demais  elementos desta lista são argumentos para esta função. O mesmo se aplica para as outras operações aritméticas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(* 2 3)
(/ 2 2)
(- 0 2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se for uma operação um pouco mais complexa, fica da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(* 2 (+ 3 3))
;; isto é um comentário em Clojure e vamos
;; utilizá-lo para demonstrar o retorno das funções
;; 12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este exemplo é onde Clojure mostra mais um diferencial no sentido de sintaxe, fruto de sua herança de Lisp. Pensando na matemática, é claro que a soma será executada primeiro. O diferencial, porém, é que a linguagem exige os parênteses, o que não deixa margem alguma para dúvidas do que precede o quê. A ordem de execução de código é sempre de dentro para fora.&lt;/p&gt;

&lt;p&gt;E para concatenar Strings? Assim: &lt;code&gt;(str "Hello, " "world!")&lt;/code&gt;&lt;br&gt;
Podemos também verificar se duas Strings são iguais:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(= "Hello" "Hi")`
;; false
(= "Hi" "Hi")
;; true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Importante observar&lt;/strong&gt; que, diferente de muitas linguagens, o &lt;code&gt;=&lt;/code&gt; é uma função em Clojure que verifica se duas coisas são iguais. O &lt;strong&gt;&lt;code&gt;=&lt;/code&gt; não é um operador de associação&lt;/strong&gt;, normalmente utilizado na construção de variáveis.&lt;/p&gt;

&lt;p&gt;E como verificamos se um número é par?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(even? 2)
;; true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E se um número é múltiplo de 3?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(= 0 (mod 9 3))
;; true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste último exemplo, o que acontece é que verificamos o módulo da divisão entre 9 e 3. O resultado será utilizado como o segundo argumento na função que verifica igualdade, &lt;code&gt;=&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nossas próprias funções
&lt;/h2&gt;

&lt;p&gt;Começando do básico, vamos criar uma função que recebe um nome e da um "oi". Para criar funções, fazemos o seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(defn oi [nome]
  (str "Oi, " nome "!"))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Namespaces
&lt;/h3&gt;

&lt;p&gt;Ao criar a função é possível ler a saída: &lt;code&gt;#'user/oi&lt;/code&gt;&lt;br&gt;
Isto quer dizer que alguma coisa com o nome &lt;code&gt;oi&lt;/code&gt; acabou de ser criada, e encontra-se no &lt;em&gt;namespace&lt;/em&gt; padrão, &lt;em&gt;user&lt;/em&gt;. Namespaces em Clojure representam a mesma ideia que em outras linguagens, como pacotes em Java, sendo uma forma de agrupar funções. A combinação do namespace e do nome da função forma o identificador de tal função&lt;/p&gt;

&lt;p&gt;A função &lt;code&gt;+&lt;/code&gt;, por exemplo, é encontrada no namespace &lt;em&gt;clojure.core&lt;/em&gt;, sendo o identificador &lt;em&gt;clojure.core/+&lt;/em&gt;.&lt;br&gt;
Como o namespace &lt;em&gt;clojure.core&lt;/em&gt; é disponibilizado por padrão, a função &lt;code&gt;+&lt;/code&gt; está sempre disponível.&lt;br&gt;
Funções em outros namespaces precisam ser incluídas no nosso cófigo antes de serem utilizadas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Com a função criada, vamos invocar com o nome desejado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(oi "zé")
;; "Oi, zé!"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;O &lt;code&gt;defn&lt;/code&gt; nos indica que vamos criar uma função.&lt;/li&gt;
&lt;li&gt;Depois, damos um nome a ela (neste caso, &lt;em&gt;oi&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Logo a seguir, vem a lista de argumentos, cercada por &lt;em&gt;[&lt;/em&gt; e &lt;em&gt;]&lt;/em&gt;. Neste caso, temos apenas um argumento, então fica &lt;em&gt;[nome]&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Em seguida vem o que realmente é executado: a concatenação de Strings. Note que não precisamos definir o que será retornado. A última instrução é o que será retornado.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O Trecho que concatena Strings tem uma particularidade: é aplicado 3 argumentos. Esta é uma de várias &lt;strong&gt;funções que são aplicáveis em uma quantidade indeterminada de argumentos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;E como seria uma função que verifica se um número é múltiplo de 3?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(defn multiplo-de-3? [dividendo]
  (= 0 (mod dividendo 3)))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então podemos chamar a função assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(multiplo-de-3? 9)
;; true

(multiplo-de-3? 20)
;; false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sobre os condicionais
&lt;/h2&gt;

&lt;p&gt;Para simplificar o exemplo, vamos exibir a palavra &lt;em&gt;sim&lt;/em&gt; se um número for par, e, caso contrário, a palavra &lt;em&gt;não&lt;/em&gt;. O código fica assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(defn par? [numero]
  (if (even? numero)
    "sim"
    "não"))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma, temos a saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(par? 5)
;; "não"
(par? 4)
;; "sim"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;if&lt;/em&gt; tem muito cara de uma função também, mas ela é na verdade o que é chamado de &lt;em&gt;forma especial&lt;/em&gt;: um recurso base do Clojure.&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;if&lt;/em&gt; recebe 3 argumentos: O primeiro é uma verificação que retorna verdadeiro ou falso. Os demais argumentos representam algo a ser executado de acordo com o resultado da verificação. Em caso de verdadeiro, o segundo argumento é avaliado e retornado. Caso contrário, o argumento 3 é que é avaliado e retornado.&lt;/p&gt;

&lt;p&gt;É importante salientar que &lt;strong&gt;apenas nil e false são considerados realmente falsos&lt;/strong&gt; para verificação de condições. Outros, como &lt;em&gt;0&lt;/em&gt; e String vazia, que são comuns em outras linguagens, serão avaliados como verdadeiros!&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Consultando a documentação
&lt;/h3&gt;

&lt;p&gt;Sempre que você quiser saber mais sobre algum recurso do Clojure, você pode experimentar a documentação dentro do REPL! &lt;br&gt;
Para isso, use a função &lt;em&gt;doc&lt;/em&gt;:&lt;br&gt;
&lt;code&gt;(doc if)&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agora, quando houver outra condição além de duas, a macro &lt;code&gt;cond&lt;/code&gt; pode ajudar. Ela recebe pares de condicionais e expressões. Segue um exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(defn saldo [valor]
  (cond (&amp;lt; valor 0) "negativo"
    (&amp;gt; valor 0) "positivo"
    :else "zero"))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando testamos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(saldo 900)
;; "positivo"

(saldo -900)
;; "negativo"

(saldo 0)
;; "zero"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, quando o valor é menor que zero, o primeiro teste, logo de cara, retorna verdadeiro, e a expressão que o segue, &lt;em&gt;"negativo"&lt;/em&gt; , é avaliada (neste caso, não faz nada, apenas retorna a String &lt;em&gt;"negativo"&lt;/em&gt;). Quando o valor é maior que zero, o primeiro teste (&lt;code&gt;(&amp;lt; valor 0)&lt;/code&gt;) falha, retornando falso, mas o teste seguinte retorna verdadeiro, e a expressão correspondente é avaliada. Agora, quando o valor é exatamente &lt;em&gt;0&lt;/em&gt;, as duas primeiras verificações retornam falso, e a última verificação (&lt;code&gt;:else&lt;/code&gt;) é validada e &lt;em&gt;"zero"&lt;/em&gt; é retornado.&lt;/p&gt;

&lt;p&gt;O que significa este &lt;code&gt;:else&lt;/code&gt;? Nada demais, na real. Como qualquer coisa diferente de &lt;em&gt;nil&lt;/em&gt; e &lt;em&gt;false&lt;/em&gt; é considerada verdadeira, qualquer coisa que colocássemos ali no lugar do &lt;code&gt;:else&lt;/code&gt; funcionaria como uma forma de fazer com que &lt;em&gt;"zero"&lt;/em&gt; fosse retornado por padrão. Se quiser, teste lá com valores como 1 ou "milhão". Bem, não é realmente qualquer coisa: números (mesmo que 0), Strings (mesmo que vazias), caracteres, coleções... O &lt;code&gt;:else&lt;/code&gt; é apenas uma convenção adotada por algumas pessoas as quais eu andei copiando.&lt;/p&gt;

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

&lt;p&gt;Ufa! Acho que agora temos a capacidade de aumentar um pouco mais a complexidade dos problemas que podemos tratar. Aqui aprendemos como interagir com o REPL do Clojure, chamar funções, criar nossas próprias funções e trabalhar com condicionais. No próximo artigo, resolveremos um problema bastante comum no mundo da programação: o Fizz-Buzz. Você verá como a solução para este problema fica bem sucinta em Clojure.&lt;/p&gt;

</description>
      <category>clojure</category>
      <category>programming</category>
      <category>functionalreactiveprogramming</category>
      <category>backend</category>
    </item>
    <item>
      <title>Do zero ao backend: seu plano (com IA e PDI)</title>
      <dc:creator>Laura Fumagalli</dc:creator>
      <pubDate>Mon, 08 Sep 2025 20:44:19 +0000</pubDate>
      <link>https://dev.to/fumagallilaura/do-zero-ao-backend-junior-seu-plano-com-ia-e-pdi-1mlc</link>
      <guid>https://dev.to/fumagallilaura/do-zero-ao-backend-junior-seu-plano-com-ia-e-pdi-1mlc</guid>
      <description>&lt;p&gt;Se você quer ser um desenvolvedor backend junior, mas não sabe por onde começar, ou se já começou e está se sentindo perdido no meio do caminho, esse artigo é pra você. Vamos falar de tudo que você precisa aprender, sem enrolação, sem jargões complicados, e com exemplos práticos do que fazer, como fazer e como medir seu progresso. E sim, vamos falar de como usar a Inteligência Artificial a seu favor, porque ela é sua aliada, não sua concorrente.&lt;/p&gt;

&lt;p&gt;Antes de tudo, vamos entender o que é um PDI. PDI significa &lt;strong&gt;Plano de Desenvolvimento Individual&lt;/strong&gt;. É um plano que você mesmo monta para guiar seu crescimento profissional. Ele não é um documento rígido, nem algo que só gestores fazem. É uma ferramenta sua, para você se organizar, saber onde está, onde quer chegar e o que precisa fazer para chegar lá. Vou te ensinar a montar o seu ao longo do texto.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Escolha uma linguagem de programação e comece a codar
&lt;/h3&gt;

&lt;p&gt;Você não precisa ser expert em Java, Go, Kotlin, C#, Python, Swift ou qualquer outra. O que você precisa é escolher uma, aprender o básico e começar a construir coisas simples com ela.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que um junior precisa fazer:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Implementar funcionalidades pequenas seguindo guias técnicos, usando ferramentas e frameworks padrão da linguagem. Resolver problemas técnicos simples, seja com ajuda da IA, seja conversando com alguém mais experiente, se tiver acesso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo prático novo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Você recebe o desafio de criar um endpoint que salva o nome e a idade de um pet num sistema de petshop. Segue um passo a passo que alguém do time preparou, ou então usa a IA para gerar um exemplo inicial. Escreve o código, testa localmente, e quando não funciona direito, refina sua pergunta para a IA ou mostra exatamente onde travou para alguém que entende mais. Por exemplo: “o nome do pet salva, mas a idade some, o que pode ser?”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como medir seu progresso:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Peça para alguém revisar seu código, ou use ferramentas de análise estática, tipo o Sonarqube. Veja se ele está seguindo as especificações, se está legível, se está dentro das boas práticas. Observe quantas vezes você precisou de ajuda externa. Se for muitas vezes, tudo bem, é normal no começo. O importante é reduzir isso com o tempo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atitude que faz diferença:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não fique com vergonha de perguntar, nem de pedir ajuda à IA. Mas antes de perguntar, tente. Pesquise, leia a documentação, tente resolver sozinho por 15 minutos. Depois, vá com a pergunta pronta, mostrando o que você já tentou, seja com IA ou com outra pessoa.&lt;/p&gt;


&lt;h3&gt;
  
  
  2. Aprenda algoritmos e estruturas de dados básicos
&lt;/h3&gt;

&lt;p&gt;Não precisa virar um cientista da computação agora. Mas precisa entender o básico para resolver problemas do dia a dia.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que um junior precisa fazer:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Implementar algoritmos simples como ordenação por seleção, busca linear, cálculo de fatorial. Usar estruturas como arrays, listas encadeadas e pilhas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo prático novo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Você está montando um sistema de fila para um food truck. Usa uma lista encadeada para adicionar pedidos no final e remover do começo. Ou então, precisa calcular quantos combos foram vendidos no dia. E faz isso com um loop simples somando valores de um array. Se travar, pergunta à IA: “como somar todos os valores de um array em Python?” e depois adapta ao seu caso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como medir seu progresso:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Faça exercícios em plataformas como HackerRank, LeetCode (na seção easy), Codewars ou até em projetos pessoais. Verifique se seu código funciona, se é eficiente o suficiente para o problema, e se está legível. Compare sua solução com a da IA ou com a de colegas, para ver outras formas de resolver.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atitude que faz diferença:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não pule essa parte achando que “não vai usar no trabalho”. Você vai. Mesmo que seja só para entender o que os outros estão falando. E se não tiver com quem discutir, use a IA para simular um debate: “me mostre 3 formas diferentes de resolver isso”.&lt;/p&gt;


&lt;h3&gt;
  
  
  3. Aprenda Git e comece a colaborar em projetos
&lt;/h3&gt;

&lt;p&gt;Git não é opcional. É obrigatório. E não é só dar commit. É entender fluxo, branches, resolver conflitos, participar de code reviews.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que um junior precisa fazer:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Clonar repositórios, criar branches, fazer commits com mensagens boas, resolver conflitos simples com ajuda da IA ou de outra pessoa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo prático novo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Você precisa ajustar a regra de cálculo de frete no backend. Cria uma branch chamada “feature/frete-gratis-acima-100”, faz commits com mensagens como “adiciona condição para frete grátis acima de R$100”, e quando alguém pede ajuste, você sabe voltar lá e editar sem quebrar tudo. Se encontrar um conflito, cola o erro na IA e pergunta: “como resolver esse conflito de merge no Git?”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como medir seu progresso:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Veja quantos commits você faz por semana, se as mensagens são claras, se você consegue resolver conflitos sem ajuda ou com menos ajuda ao longo do tempo. Use a IA para revisar suas mensagens de commit: “essa mensagem é clara o suficiente?”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atitude que faz diferença:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Escreva mensagens de commit que fazem sentido. Não escreva “arrumei bug”. Escreva “corrige cálculo de frete quando valor é exatamente R$100”. Isso mostra profissionalismo. E se não tiver certeza, pergunte à IA ou a um colega.&lt;/p&gt;


&lt;h3&gt;
  
  
  4. Entenda o básico de CI/CD
&lt;/h3&gt;

&lt;p&gt;CI/CD é integração e entrega contínua. Parece complicado, mas no nível junior, você só precisa saber executar e monitorar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que um junior precisa fazer:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Executar pipelines de deploy em ambientes de desenvolvimento ou staging. Monitorar logs para ver se deu certo ou se quebrou.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo prático novo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Você termina sua tarefa de adicionar um novo campo “observações” no cadastro de cliente. Executa o pipeline de deploy no ambiente de testes, abre o sistema lá, vê que o campo aparece, mas está cortado. Volta nos logs, descobre que faltou um ajuste no CSS do frontend e avisa o time antes de virar problema em produção. Se os logs estiverem confusos, copia um trecho e pergunta à IA: “o que esse erro no log significa?”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como medir seu progresso:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Veja se você consegue executar o pipeline sozinho. Se consegue identificar um erro pelo log. Se consegue avisar o time quando algo quebrou. Use a IA para decifrar mensagens de erro que parecem em outra língua.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atitude que faz diferença:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não ignore os logs. Mesmo que pareça chato, leia. É ali que você vai aprender a entender o que acontece depois que seu código sai da sua máquina. E se não entender, transforme o log numa pergunta para a IA.&lt;/p&gt;


&lt;h3&gt;
  
  
  5. Construa APIs simples
&lt;/h3&gt;

&lt;p&gt;APIs são o coração do backend. Você precisa saber criar, testar e documentar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que um junior precisa fazer:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Criar APIs REST simples, com autenticação básica (como JWT), e paginação quando necessário.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo prático novo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Você cria um endpoint POST /enviar-cupom que recebe um código e devolve “válido” ou “expirado”. Usa JWT pra garantir que só clientes logados possam enviar, e adiciona paginação porque a loja tem 10 mil cupons e não pode carregar tudo de uma vez. Tudo seguindo um rascunho que o tech lead deixou no Notion, ou então gerado pela IA com base na sua descrição do problema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como medir seu progresso:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Peça para alguém testar sua API, ou use a IA para gerar casos de teste. Veja se ela responde como esperado, se a autenticação funciona, se a paginação está certa. Use ferramentas como Postman ou Insomnia para testar você mesmo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atitude que faz diferença:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Teste sua API antes de entregar. Não espere os outros encontrarem os erros. Seja o primeiro a quebrar seu próprio código. E se não souber como testar, pergunte à IA: “quais testes devo fazer nesse endpoint?”.&lt;/p&gt;


&lt;h3&gt;
  
  
  6. Aprenda o básico de segurança
&lt;/h3&gt;

&lt;p&gt;Segurança não é só coisa de especialista. No nível junior, você precisa saber o mínimo para não entregar um sistema cheio de brechas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que um junior precisa fazer:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Implementar autenticação e autorização básicas, como JWT e HTTPS, com ajuda da IA ou de alguém mais experiente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo prático novo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Você configura o sistema pra forçar HTTPS em todas as requisições, porque viu que o login estava sendo enviado sem criptografia. Usa um middleware simples com JWT, copia a estrutura de um projeto antigo ou gerado pela IA, mas testa linha por linha pra entender o que cada parte faz e pergunta: “por que a chave secreta não pode ser hardcoded?” seja para a IA ou para um colega.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como medir seu progresso:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Revise seu próprio código. Veja se o token está sendo validado corretamente, se o HTTPS está forçado. Peça feedback de alguém que entende mais, ou use a IA para fazer uma “revisão de segurança básica”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atitude que faz diferença:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não subestime a segurança. Um sistema funcional que vaza dados é pior do que um sistema quebrado. E se não tiver especialista por perto, use a IA como primeiro filtro: “isso aqui tem risco de segurança?”.&lt;/p&gt;


&lt;h3&gt;
  
  
  7. Conheça padrões de arquitetura básicos
&lt;/h3&gt;

&lt;p&gt;Você não precisa ser arquiteto, mas precisa saber o que é MVC, Repository, Singleton, e quando usá-los.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que um junior precisa fazer:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Aplicar esses padrões em projetos pequenos, com apoio da IA ou de alguém mais experiente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo prático novo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Você está fazendo um sistema de agendamento de banho para pets. Separa o código em Controller (recebe a data e o pet), Service (verifica se o horário está disponível) e Repository (salva no banco). Usa Singleton pra garantir que só exista uma conexão com o calendário de horários, evitando conflitos. Se não tiver certeza da implementação, pergunta à IA: “como aplicar Singleton em Java para gerenciar conexão com banco?”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como medir seu progresso:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Peça revisão de código, ou use a IA para avaliar se você aplicou o padrão corretamente. Pergunte “por que usamos isso aqui?” para entender o contexto, seja para a IA ou para um colega.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atitude que faz diferença:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não aplique padrão só porque viu em algum lugar. Entenda o problema que ele resolve. Se não fizer sentido, não force. E use a IA para te ajudar a entender o “porquê”, não só o “como”.&lt;/p&gt;


&lt;h3&gt;
  
  
  8. Entenda o básico de Infra como Código (IaC)
&lt;/h3&gt;

&lt;p&gt;Você não precisa escrever scripts de Terraform ainda, mas precisa entender os conceitos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que um junior precisa fazer:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Entender o que é IaC, o que é estado, o que é infra declarativa vs imperativa, e os componentes básicos de templates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo prático novo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Você participa de uma reunião onde alguém fala “o state do Terraform tá bagunçado”. Você não entende na hora, mas depois pesquisa e aprende que o state é como um “retrato” da infra atual. Explica pro estagiário: “é tipo um save point do jogo, se apagar, você perde o progresso”. Se ficar confuso, pergunta à IA: “me explique o state do Terraform como se eu tivesse 10 anos”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como medir seu progresso:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Responda perguntas técnicas. Participe de discussões. Faça quizzes online. Mostre que você entende os conceitos, mesmo que não saiba codar ainda. Use a IA para simular uma entrevista técnica sobre o tema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atitude que faz diferença:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Pergunte sempre “por que usamos isso?”. Entender o motivo é mais importante do que decorar o que faz. E se ninguém puder responder, a IA pode te dar uma base sólida para continuar.&lt;/p&gt;


&lt;h3&gt;
  
  
  9. Conheça os serviços de computação em nuvem
&lt;/h3&gt;

&lt;p&gt;EC2, Lambda, ECS, EKS, Fargate... você não precisa saber usar todos, mas precisa saber para que servem. Conceitos básicos também são importantes e úteis, como saber o que é VPC, Zonas de Disponibilidade, latência, idempotência etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que um junior precisa fazer:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Explicar a diferença entre eles, e em que cenário cada um é útil.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo prático novo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Você precisa escolher onde rodar um script que envia lembretes de vacina por SMS. Pergunta: “Lambda é melhor aqui porque roda só de vez em quando, né?”. E compara com EC2: “EC2 seria como alugar um celular 24h pra mandar 3 SMS por dia. Desnecessário”. Se tiver dúvidas, pergunta à IA: “me dê um exemplo real de quando usar Lambda vs EC2”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como medir seu progresso:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Participe de discussões técnicas. Responda perguntas. Faça simulações mentais: “se eu tivesse que escalar uma API que recebe 100 requisições por minuto, qual serviço eu usaria?”. Use a IA para validar seu raciocínio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atitude que faz diferença:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não fique só na teoria. Crie uma conta na AWS, Azure ou GCP, e experimente. Mesmo que seja só para clicar e ver como as coisas funcionam. E se não entender algo, transforme em pergunta para a IA. Não tenha medo de custos inesperados, sempre leia a documentação do serviço, principalmente a parte FinOps, antes de utilizar para ter certeza que não terá gastos inesperados. Reserve de um a cindo dólares para caso aconteça e SEMPRE monitore sua conta, diariamente, até ter segurança de que não esqueceu nada lá rodando e gastando. Sempre desligue os serviços após usá-los, se esquecer de derrubar um serviço por dias, isso pode gerar gastos. Mas não tenha receio, lembre-se: você deve ser a primeira pessoa a investir em você!&lt;/p&gt;


&lt;h3&gt;
  
  
  10. Saiba usar logs e monitoramento
&lt;/h3&gt;

&lt;p&gt;Seu código vai quebrar. E você precisa saber onde e por que.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que um junior precisa fazer:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Implementar logs nas suas aplicações, e saber onde procurar quando algo der errado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo prático novo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Você adiciona um log.info("Pedido #123 finalizado com sucesso") e um log.error("Falha ao processar pagamento do pedido #123") no código. Quando o sistema trava, você vai direto nos logs do Kibana, filtra por “erro”, descobre que o problema era um cartão expirado e já sugere uma mensagem amigável pro usuário. Se o log for confuso, copia e cola na IA: “o que esse erro significa?”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como medir seu progresso:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Veja se você consegue encontrar o erro sozinho olhando os logs. Se consegue explicar o que aconteceu. Se consegue sugerir uma solução. Use a IA para te ajudar a interpretar padrões ou mensagens estranhas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atitude que faz diferença:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não ignore os logs. Eles são seus melhores amigos quando tudo der errado. E se você não entende o que estão dizendo, a IA pode ser sua tradutora.&lt;/p&gt;


&lt;h3&gt;
  
  
  11. Aprenda SQL e NoSQL
&lt;/h3&gt;

&lt;p&gt;Banco de dados é essencial. Relacional ou não, você precisa saber mexer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que um junior precisa fazer:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Escrever consultas básicas, entender tabelas, chaves, coleções, documentos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo prático novo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Você precisa listar todos os clientes que compraram ração premium nos últimos 30 dias. Escreve:&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;SELECT&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;email&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ultima_compra&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'2025-03-01'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;categoria_produto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'premium'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No MongoDB, faz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clientes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;ultimaCompra&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$gt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ISODate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2025-03-01&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="na"&gt;categoria&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;premium&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E cria uma view chamada “clientesPremiumAtivos” pra equipe de marketing usar sem precisar escrever SQL. Se não lembrar a sintaxe, pergunta à IA: “como escrever isso em SQL?”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como medir seu progresso:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Teste suas consultas. Veja se elas retornam o que deveriam. Peça revisão. Use ferramentas de migration como Flyway ou Liquibase para versionar suas alterações no banco. Ou use a IA para revisar sua query: “isso aqui está certo? Eu quero listar todos os clientes que compraram ração premiun nos último 30 dias”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atitude que faz diferença:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não trate o banco como um detalhe. Ele é parte fundamental da sua aplicação. Aprenda a pensar em performance e consistência desde o começo. E se não tiver com quem discutir, discuta com a IA.&lt;/p&gt;




&lt;h3&gt;
  
  
  12. Entenda o básico de cache
&lt;/h3&gt;

&lt;p&gt;Cache é para deixar seu sistema mais rápido. E você precisa saber quando e como usar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que um junior precisa fazer:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Entender o que é TTL, cache local vs distribuído, e quando vale a pena usar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo prático novo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Você percebe que toda vez que alguém abre a página inicial, o sistema consulta o banco pra pegar os 5 produtos mais vendidos. Como isso não muda a cada minuto, você sugere: “vamos guardar isso no Redis por 1 hora?”. E explica: “cache local é tipo anotar no seu caderno, cache distribuído é tipo anotar no mural da empresa: todo mundo vê”. Se não tiver certeza, pergunta à IA: “quando usar cache local vs Redis?”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como medir seu progresso:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Veja se você consegue identificar cenários de uso. Se consegue explicar os conceitos. Se consegue configurar um cache simples com ajuda. Use a IA para te ajudar a montar um exemplo prático.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atitude que faz diferença:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não saia colocando cache em tudo. Cache mal usado pode piorar seu sistema. Pense antes de agir. E use a IA para simular cenários: “se eu colocar cache aqui, o que pode dar errado?”.&lt;/p&gt;




&lt;h3&gt;
  
  
  13. Use IA a seu favor (e aprenda a fazer bons prompts)
&lt;/h3&gt;

&lt;p&gt;IA não vai te substituir. Mas vai te ajudar muito, se você souber usar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que um junior precisa fazer:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Saber estruturar prompts claros para obter respostas úteis de modelos de linguagem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo prático novo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Você pergunta pra IA: “me dê um exemplo de código em Python que valida CPF”. Ela te dá algo genérico. Você refina: “quero em Flask, como decorator, retornando 400 se for inválido”. Aí ela entrega certinho. Você testa, entende, e ainda pergunta: “como eu testo isso com Pytest?”. Usa a IA pra aprender, não pra colar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como medir seu progresso:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Veja se suas perguntas estão gerando respostas úteis. Se você consegue iterar e melhorar o prompt quando a resposta não serve. Se você usa a IA para aprender, não só para copiar. Peça para a IA avaliar seu próprio prompt: “como eu poderia melhorar essa pergunta?”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atitude que faz diferença:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Nunca copie e cole sem entender. Use a IA como tutor, não como dependência. Sempre pergunte “por que isso funciona?”. E se a resposta não fizer sentido, reformule a pergunta. A IA melhora conforme você melhora suas perguntas.&lt;/p&gt;




&lt;h3&gt;
  
  
  Como montar seu PDI (Plano de Desenvolvimento Individual)
&lt;/h3&gt;

&lt;p&gt;Agora que você sabe o que precisa aprender, vamos montar seu PDI. Ele tem 4 partes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Onde você está hoje?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Faça uma autoavaliação honesta. Em cada tópico acima, se pergunte: “eu sei fazer isso sozinho?”, “eu preciso de ajuda da IA ou de alguém?”, “eu nem sei por onde começar?”. Anote.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Onde você quer chegar?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Defina um objetivo claro. Exemplo: “em 3 meses, quero conseguir implementar uma API com autenticação e deploy sozinho, usando IA como apoio quando necessário”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;O que você vai fazer para chegar lá?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Liste ações concretas. Ex: “fazer 2 exercícios de algoritmos por semana com revisão da IA”, “ler a documentação do Express.js e comparar com exemplos da IA”, “assistir 1 vídeo por semana sobre Git e depois simular os comandos com ajuda da IA”, “usar IA para revisar meus prompts e melhorar minhas perguntas”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Como você vai medir?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Defina indicadores. Exemplo: “conseguir resolver 80% dos exercícios sem ajuda”, “fazer 5 commits por semana com mensagens boas revisadas pela IA ou por colegas”, “entregar 1 API por mês revisada por alguém ou validada pela IA”.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Revise seu PDI a cada 2 semanas. Ajuste. Comemore os progressos. E siga em frente.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusão (e lembrete final)
&lt;/h3&gt;

&lt;p&gt;Ser junior não é sobre saber tudo. É sobre estar disposto a aprender, errar, corrigir e evoluir. O mercado não espera que você seja perfeito. Espera que você seja curioso, organizado e proativo.&lt;/p&gt;

&lt;p&gt;Use esse guia como mapa. Monte seu PDI. Use a IA como aliada. Troque com outras pessoas sempre que possível, porque conversa traz insights que a IA ainda não reproduz. Mas se você estiver sozinho, saiba que a IA é um ótimo parceiro de estudos.&lt;/p&gt;

&lt;p&gt;Lembre-se: cada linha de código que você escreve, cada erro que você corrige, cada pergunta que você faz, seja para a IA ou para um ser humano, é um passo na direção certa.&lt;/p&gt;

&lt;p&gt;Você consegue. E quando duvidar, volte aqui. Acredite em você.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>backend</category>
      <category>career</category>
    </item>
    <item>
      <title>Na era da IA, o maior erro de um Programador é não aprender a programar</title>
      <dc:creator>Laura Fumagalli</dc:creator>
      <pubDate>Sun, 10 Aug 2025 13:49:18 +0000</pubDate>
      <link>https://dev.to/fumagallilaura/na-era-da-ia-o-maior-erro-de-um-programador-e-nao-aprender-a-programar-5b8l</link>
      <guid>https://dev.to/fumagallilaura/na-era-da-ia-o-maior-erro-de-um-programador-e-nao-aprender-a-programar-5b8l</guid>
      <description>&lt;p&gt;Em uma era de crescente automação e ferramentas de inteligência artificial que geram código, como essa frase do título pode fazer sentido? A resposta está na diferença crucial entre "gerar software" e "saber programar". E essa distinção, que reavalia o papel da faculdade e a forma como aprendemos, é o que definirá o sucesso profissional nos próximos anos.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Era do "Vibe Coding" e a Oportunidade Escondida
&lt;/h2&gt;

&lt;p&gt;Estamos entrando em um período em que a criação de software se tornará acessível a um número cada vez maior de pessoas, incluindo aquelas sem formação técnica aprofundada. Designers, analistas e outros profissionais poderão usar ferramentas avançadas para "vibe coding", ou seja, materializar suas ideias em código funcional sem escrever cada linha manualmente.&lt;/p&gt;

&lt;p&gt;Longe de ser uma ameaça, essa democratização é uma oportunidade. Primeiramente, ela eleva o valor percebido do software e do trabalho de quem o constrói. Em segundo lugar, e mais importante, cria uma nova e crescente demanda por especialistas. Afinal, ferramentas de low-code, no-code ou "vibe-code" têm um elemento em comum: elas produzem código.&lt;/p&gt;

&lt;p&gt;E a regra de ouro da engenharia de software permanece intacta: &lt;strong&gt;quanto mais código, mais bugs&lt;/strong&gt;. Quem irá depurar, otimizar e resolver os problemas complexos que essas ferramentas inevitavelmente criarão? Nós, os programadores que entendemos os fundamentos. O futuro não é sobre menos trabalho, mas sobre um trabalho mais especializado e valioso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Redescobrindo o Valor da Faculdade
&lt;/h2&gt;

&lt;p&gt;Durante anos, ouvi sobre a ideia de que um diploma não era necessário para se tornar um programador de sucesso. E, de fato, não é um pré-requisito para entrar no mercado. No entanto, minha experiência me faz avaliar e reconhecer um valor diferente do que tantos pregam: o poder dos fundamentos adquiridos na educação formal.&lt;/p&gt;

&lt;p&gt;Durante a minha pós-graduação, uma disciplina de Inteligência Artificial me desafiou a implementar uma rede neural com backpropagation do zero, em Java, a partir de um livro. Foi um processo árduo, que exigiu interpretar conceitos matemáticos complexos e traduzi-los em lógica de programação. Parecia apenas um trabalho acadêmico. Hoje, percebo que aquela experiência construiu uma base tão sólida que me permite navegar com facilidade pelos "hypes" tecnológicos atuais, seja IA, blockchain ou qualquer outra novidade. A tecnologia de superfície muda, mas os princípios fundamentais permanecem os mesmos há décadas.&lt;/p&gt;

&lt;p&gt;A Ilusão do Aprendizado na Internet e a Disciplina da Sala de Aula&lt;br&gt;
"Mas hoje não é mais fácil aprender tudo pela internet?" Essa é uma pergunta legítima, mas que esconde uma armadilha. O problema nunca foi a falta de conteúdo. Desde o início dos anos 2000, tínhamos acesso a mais livros e apostilas do que poderíamos consumir. O verdadeiro desafio é a forma como interagimos com esse conhecimento.&lt;/p&gt;

&lt;p&gt;Hoje, corremos o risco de cair na falsa sensação de aprendizado. Assistir a um podcast ou a um vídeo explicando um conceito complexo é uma forma de consumo passivo. É completamente diferente de ler um paper, um livro técnico e lutar para implementar aquele conhecimento. &lt;strong&gt;A primeira abordagem informa; a segunda, forma.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;É aqui que a faculdade revela seu maior trunfo. Ela oferece um currículo estruturado que nos força a estudar tópicos fundamentais, mesmo aqueles que consideraríamos "chatos" ou distantes da prática imediata, como teoria das redes, compiladores ou arquitetura de computadores. Sem essa obrigatoriedade, muitos de nós, por mais proativos que sejamos, pularíamos de um tópico para outro, acumulando um conhecimento superficial que se desfaz rapidamente. A faculdade nos obriga a construir o alicerce, tijolo por tijolo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão: Programe, Não Apenas Gere Código
&lt;/h2&gt;

&lt;p&gt;O objetivo desta reflexão não é defender a universidade como o único caminho, mas sim destacar a importância de um aprendizado ativo e profundo dos fundamentos da computação. O programador do futuro não será aquele que apenas sabe usar a ferramenta mais recente para gerar código, mas aquele que compreende o que acontece por baixo do capô.&lt;/p&gt;

&lt;p&gt;Portanto, &lt;strong&gt;o convite é para uma mudança de mentalidade&lt;/strong&gt;. Mergulhe em livros, implemente algoritmos do zero, entenda a teoria por trás da prática. Seja através de uma graduação ou de um estudo autodidata disciplinado, &lt;strong&gt;invista na construção de uma base sólida&lt;/strong&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Escalabilidade DE ZERO A MILHÕES DE USUÁRIOS</title>
      <dc:creator>Laura Fumagalli</dc:creator>
      <pubDate>Sun, 13 Jul 2025 14:39:22 +0000</pubDate>
      <link>https://dev.to/fumagallilaura/escalabilidade-de-zero-a-milhoes-de-usuarios-452d</link>
      <guid>https://dev.to/fumagallilaura/escalabilidade-de-zero-a-milhoes-de-usuarios-452d</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Esse é a postagem 2 de uma série de postagens sobre arquitetura de sistemas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Projetar um sistema que ofereça suporte a milhões de usuários é desafiador e uma jornada que exige refinamento contínuo e melhorias contínuas. Neste artigo, construímos um sistema que oferece suporte a um único usuário e o escalamos gradualmente para atender a milhões de usuários. Após essa leitura, você dominará algumas técnicas que vão ajudar a decifrar as perguntas sobre design de sistemas que sempre surgem.&lt;/p&gt;

&lt;p&gt;Assim como uma maratona começa com um único passo, a construção de um sistema complexo também começa com etapas simples. Nas imagens a seguir, você encontrará uma série de representações de arquiteturas de sistemas que ilustram essa evolução. Para facilitar o entendimento inicial, começaremos com uma abordagem básica, na qual todo o sistema é executado em um único servidor.&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%2Fmk84gffsywyznibnvvv8.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%2Fmk84gffsywyznibnvvv8.png" alt="Figura 1-1" width="482" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A imagem acima (Figura 1-1) mostra a ilustração de uma configuração de servidor único onde tudo está sendo executado em um servidor: aplicativo web, banco de dados, cache, etc.&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%2F10lqha80bgp1tw5tff4a.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%2F10lqha80bgp1tw5tff4a.png" alt="Figura 1-2" width="496" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A imagem acima (Figura 1-2) é a mesma coisa, porém numerado com a ordem que as coisas acontecem. Para entender essa configuração, é útil investigar o fluxo de solicitações e a origem do tráfego. Vamos analisar primeiro o fluxo de solicitações:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;As pessoas usuárias acessam sites por meio de nomes de domínio, como &lt;em&gt;api.mysite.com&lt;/em&gt;. Normalmente, o Sistema de Nomes de Domínio (DNS) é um serviço pago fornecido por terceiros e não hospedado por nossos servidores.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O endereço de Protocolo de Internet (IP) é retornado ao navegador ou aplicativo móvel. No exemplo, o endereço IP 15.125.23.214 é retornado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assim que o endereço IP for obtido, as solicitações do Protocolo de Transferência de Hipertexto (HTTP) são enviadas diretamente ao seu servidor web.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O servidor web retorna páginas HTML ou respostas JSON para renderização.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Em seguida, vamos examinar a origem do tráfego. O tráfego para o seu servidor web vem de duas fontes: aplicativo web e aplicativo móvel.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Aplicativo web: ele usa uma combinação de linguagens do lado do servidor (Java, Python, etc.) para lidar com lógica de negócios, armazenamento, etc., e linguagens do lado do cliente (HTML e JavaScript) para apresentação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aplicativo móvel: o protocolo HTTP é o protocolo de comunicação entre o aplicativo móvel e o servidor web. JavaScript Object Notation (JSON) é o formato de resposta de API normalmente usado para transferir de dadosdevido à sua simplicidade. Um exemplo de resposta da API em formato JSON é mostrado abaixo:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;GET /users/12&lt;/code&gt; - Recupera o objeto da pessoa usuária cujo &lt;code&gt;id = 12&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi06mx8cji9qrxpcuek08.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%2Fi06mx8cji9qrxpcuek08.png" alt="Figura 1.3" width="511" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Exemplo de retorno:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"firstName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Laura"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lastName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fumagalli"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"streetAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rua XPTO, 1800"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"São Paulo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Brazil"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"postalCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12345-678"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"phoneNumbers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"1191234-5678"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"1994321-8765"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Banco de dados
&lt;/h3&gt;

&lt;p&gt;Com o crescimento da base de usuários, um servidor não é suficiente e precisamos de vários servidores: um para o tráfego web/móvel e outro para o banco de dados (Figura 1-3). Separar os servidores de tráfego web/móvel (camada web) e de banco de dados (camada de dados) permite que eles sejam dimensionados de forma independente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quais bancos de dados usar?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Você pode escolher entre um banco de dados relacional tradicional e um banco de dados não relacional. Vamos examinar suas diferenças.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bancos de dados relacionais&lt;/strong&gt; também são chamados de sistemas de gerenciamento de banco de dados relacional (RDBMS) ou banco de dados &lt;strong&gt;SQL&lt;/strong&gt;. Os mais populares são MySQL, banco de dados Oracle, PostgreSQL, etc.&lt;/p&gt;

&lt;p&gt;Bancos de dados relacionais representam e armazenam dados em tabelas e linhas. Você pode realizar operações de junção usando SQL em diferentes tabelas de banco de dados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bancos de dados não relacionais&lt;/strong&gt; também são chamados de bancos de dados &lt;strong&gt;NoSQL&lt;/strong&gt;. Os mais populares são CouchDB, Neo4j, Cassandra, HBase, Amazon DynamoDB, etc. Esses bancos de dados são agrupados em quatro categorias: armazenamentos de chave-valor, armazenamentos de gráficos, armazenamentos de colunas e armazenamentos de documentos. Operações de junção geralmente não são suportadas em bancos de dados não relacionais&lt;/p&gt;

&lt;p&gt;Para a maioria dos desenvolvedores, bancos de dados relacionais são a melhor opção, pois existem há mais de 40 anos e, historicamente, têm funcionado bem. No entanto, se os bancos de dados relacionais não forem adequados para seus casos de uso específicos, é fundamental explorar além dos bancos de dados relacionais. Bancos de dados não relacionais podem ser a escolha certa se:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seu aplicativo requer latência superbaixa.&lt;/li&gt;
&lt;li&gt;Seus dados não são estruturados ou você não possui dados que se relacionam de algum forma (relacionais).&lt;/li&gt;
&lt;li&gt;Você só precisa serializar e desserializar os dados (JSON, XML, YAML, etc.).&lt;/li&gt;
&lt;li&gt;Você precisa armazenar uma grande quantidade de dados.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Escalabilidade vertical vs. escalabilidade horizontal
&lt;/h2&gt;

&lt;p&gt;A escalabilidade vertical, conhecida como "scale-up", significa o processo de adicionar mais potência (CPU, RAM, etc.) aos seus servidores. A escalabilidade horizontal, conhecida como "scale-out", permite que você escale adicionando mais servidores ao seu pool de recursos.&lt;/p&gt;

&lt;p&gt;Quando o tráfego é baixo, a escala vertical é uma ótima opção, e a simplicidade dessa escala vertical é sua principal vantagem. Infelizmente, ela vem com sérias limitações.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;escalabilidade vertical&lt;/strong&gt; tem um limite rígido. É impossível adicionar CPU e memória ilimitadas em um único servidor.&lt;/p&gt;

&lt;p&gt;A escalabilidade vertical não possui failover e redundância. Se um servidor cair, o site/aplicativo cai completamente com ele.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;escalabilidade horizontal&lt;/strong&gt; é mais desejável para aplicações de grande escala devido às limitações do escalonamento vertical.&lt;/p&gt;

&lt;p&gt;Na arquitetura anterior, os usuários eram conectados diretamente ao servidor web. Os usuários não conseguiriam acessar o site se o servidor web estivesse offline. Em outro cenário, se muitos usuários acessassem o servidor web simultaneamente e ele atingisse o limite de carga do servidor web, os usuários geralmente experimentariam uma resposta mais lenta ou não conseguiriam se conectar ao servidor. Um balanceador de carga(&lt;strong&gt;Load Balancer&lt;/strong&gt;) é a melhor técnica para resolver esses problemas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Load Balancer
&lt;/h2&gt;

&lt;p&gt;Um balanceador de carga distribui uniformemente o tráfego de entrada entre servidores web definidos em um conjunto de balanceamento de carga. A imagem a seguir (Figura 1-4) mostra como um balanceador de carga funciona.&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%2Fr2maqe43hl2wps7v8cw1.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%2Fr2maqe43hl2wps7v8cw1.png" alt="Figura 1-4" width="552" height="581"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conforme mostrado na imagem acima (Figura 1-4), os usuários se conectam diretamente ao IP público do balanceador de carga. Com essa configuração, os servidores web não podem mais ser acessados diretamente pelos clientes. Para aumentar a segurança, são utilizados IPs privados para a comunicação entre os servidores. Um IP privado é um endereço IP acessível apenas dentro da rede local, ou seja, ele não é alcançável a partir da internet. Dessa forma, o balanceador de carga se comunica com os servidores web utilizando esses IPs privados.&lt;/p&gt;

&lt;p&gt;Após a adição de um balanceador de carga e de um segundo servidor web, conseguimos resolver com sucesso o problema de failover e melhorar a disponibilidade da camada web. Abaixo estão os detalhes dessa implementação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Se o Servidor 1 ficar offline, todo o tráfego será automaticamente redirecionado para o Servidor 2 , garantindo que o site permaneça acessível.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Isso evita que o sistema fique fora do ar. Além disso, podemos adicionar um novo servidor web saudável ao pool de servidores, mantendo o balanceamento de carga e a alta disponibilidade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Caso o tráfego do site aumente rapidamente e dois servidores não sejam suficientes, o balanceador de carga também consegue lidar com esse cenário. Basta adicionar mais servidores ao pool, e o balanceador começará automaticamente a distribuir as requisições entre todos eles.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora que a camada web está mais robusta e resiliente, surge uma nova pergunta: &lt;strong&gt;e a camada de dados?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Atualmente, o design utiliza apenas um único banco de dados, o que significa que não há suporte para failover nem redundância nessa camada. Isso representa um ponto único de falha e pode colocar a disponibilidade do sistema em risco.&lt;/p&gt;

&lt;p&gt;Uma solução comum e eficaz para esse problema é a replicação de banco de dados , uma técnica amplamente utilizada para garantir redundância, alta disponibilidade e tolerância a falhas. Vamos explorar como implementá-la a seguir.&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%2F4ffba83wwt1u4q8zqf9g.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%2F4ffba83wwt1u4q8zqf9g.png" alt="Figura 1-5" width="434" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Replicação de banco de dados
&lt;/h2&gt;

&lt;p&gt;Citado da Wikipédia: "A replicação de banco de dados pode ser usada em muitos sistemas de gerenciamento de banco de dados, geralmente com um relacionamento primário/secundário entre o original (primário) e as cópias (secundárias)" [3].&lt;/p&gt;

&lt;p&gt;Um banco de dados primário geralmente é responsável pelas operações de escrita. Já os bancos de dados secundários recebem cópias dos dados do primário e são utilizados apenas para operações de leitura. Todos os comandos que modificam os dados, como &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt; ou &lt;code&gt;UPDATE&lt;/code&gt;, devem ser enviados ao banco de dados primário. A maioria das aplicações realiza muito mais operações de leitura do que de escrita, por isso o número de bancos de dados secundários em um sistema costuma ser maior do que o de primários. A imagem anterior (Figura 1-5) ilustra essa arquitetura com um banco de dados primário e vários secundários.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vantagens da replicação de banco de dados:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ Melhor desempenho&lt;/p&gt;

&lt;p&gt;No modelo primário/secundário, todas as gravações e atualizações ocorrem no nó primário, enquanto as operações de leitura são distribuídas entre os nós secundários. Essa divisão de responsabilidades melhora o desempenho do sistema, pois permite que um maior número de consultas seja processado em paralelo.&lt;/p&gt;

&lt;p&gt;✅ Confiabilidade e tolerância a falhas&lt;/p&gt;

&lt;p&gt;Se um servidor de banco de dados for afetado por um desastre natural, como um tufão ou terremoto, os dados ainda estarão disponíveis nos outros nós secundários. Isso reduz drasticamente o risco de perda de dados e aumenta a disponibilidade do sistema, mesmo em cenários adversos.&lt;/p&gt;

&lt;p&gt;✅ Alta disponibilidade: &lt;/p&gt;

&lt;p&gt;Ao replicar dados em diferentes locais, seu site permanece em operação mesmo se um banco de dados estiver offline, pois você pode acessar dados armazenados em outro servidor de banco de dados.&lt;/p&gt;

&lt;p&gt;Discutimos anteriormente como o uso de um balanceador de carga contribui significativamente para a melhoria da disponibilidade da camada web. Agora, aplicamos a mesma pergunta à camada de dados: &lt;strong&gt;e se um dos bancos de dados ficar offline?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A arquitetura apresentada na imagem acima (Figura 1-5) é capaz de lidar com falhas nos bancos de dados de forma eficiente. Abaixo estão os cenários possíveis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Se apenas um banco de dados secundário estiver disponível e ele ficar offline , as operações de leitura serão temporariamente direcionadas ao banco de dados principal até que o problema seja resolvido. Assim que a falha for detectada, um novo banco de dados secundário será provisionado para substituir o antigo e retomar a redundância. Caso múltiplos bancos de dados secundários estejam disponíveis, as consultas de leitura são automaticamente redirecionadas para os nós ainda saudáveis. Paralelamente, um novo nó secundário é criado para substituir o que falhou, mantendo o nível desejado de disponibilidade e balanceamento de carga.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Se o banco de dados principal ficar indisponível , um dos bancos de dados secundários será promovido a novo banco de dados principal . Durante esse processo, todas as operações (incluindo escritas) são temporariamente executadas no novo nó principal. Em seguida, um novo banco de dados secundário é adicionado para retomar o processo de replicação.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ Importante: Em ambientes de produção, a promoção automática de um novo banco de dados principal pode ser um processo complexo. Isso ocorre porque, dependendo do tipo de replicação utilizada (síncrona ou assíncrona), alguns dados podem não estar totalmente atualizados nos bancos de dados secundários. Nesses casos, é necessário realizar uma etapa de recuperação de dados para garantir a consistência antes da promoção oficial do novo nó principal. &lt;/p&gt;

&lt;p&gt;Embora existam outros métodos de replicação, como replicação circular por exemplo, que podem trazer vantagens adicionais em certos cenários, essas configurações tendem a ser mais complexas e fogem ao escopo deste artigo. Pessoas leitoras interessadas podem pesquisar sobre para aprofundar seus conhecimentos sobre esses tópicos, é um estudo bem interessante.&lt;/p&gt;

&lt;p&gt;A imagem abaixo (Figura 1-6) ilustra o projeto atualizado do sistema após a inclusão do balanceador de carga e da replicação do banco de dados. Essa arquitetura reflete uma evolução importante na disponibilidade e escalabilidade do sistema, garantindo maior resiliência frente a falhas e aumento de tráfego.&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%2Fis9q4fywskg89uimkm3w.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%2Fis9q4fywskg89uimkm3w.png" alt="Figura 1.6" width="484" height="831"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Excelente! Agora vamos dar uma olhada no design atual do sistema:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um usuário consulta o DNS e obtém o endereço IP público do balanceador de carga.&lt;/li&gt;
&lt;li&gt;Em seguida, o usuário estabelece a conexão com o balanceador de carga usando esse endereço IP.&lt;/li&gt;
&lt;li&gt;A solicitação HTTP é então roteada para um dos servidores web disponíveis (Servidor 1 ou Servidor 2), conforme a política de balanceamento configurada.&lt;/li&gt;
&lt;li&gt;Quando uma requisição envolve leitura de dados, o servidor web recupera as informações de um banco de dados secundário.&lt;/li&gt;
&lt;li&gt;Já as operações que modificam os dados, como inserções, atualizações ou exclusões, são sempre direcionadas ao banco de dados primário, garantindo consistência nos dados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora que você tem uma compreensão sólida das camadas web e de dados, vamos dar o próximo passo: melhorar o tempo de resposta e carregamento do sistema.&lt;/p&gt;

&lt;p&gt;No próximo artigo, vou explorar como isso pode ser alcançado com a adição de uma camada de &lt;strong&gt;cache&lt;/strong&gt; e com a utilização de uma &lt;strong&gt;Rede de Distribuição de Conteúdo (CDN)&lt;/strong&gt; para armazenar e entregar conteúdo estático, como arquivos JavaScript, CSS, imagens e vídeos.&lt;/p&gt;

&lt;p&gt;Continue acompanhando para descobrir como otimizar ainda mais o desempenho da sua aplicação.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Entrevistas de design de sistemas</title>
      <dc:creator>Laura Fumagalli</dc:creator>
      <pubDate>Thu, 10 Jul 2025 12:52:55 +0000</pubDate>
      <link>https://dev.to/fumagallilaura/entrevistas-de-design-de-sistemas-3gdk</link>
      <guid>https://dev.to/fumagallilaura/entrevistas-de-design-de-sistemas-3gdk</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Esse é a postagem 1 de uma série de postagens sobre arquitetura de sistemas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As entrevistas de &lt;strong&gt;design de sistemas&lt;/strong&gt; são, sem dúvida, um dos maiores desafios em qualquer processo técnico. Diferente de perguntas diretas sobre algoritmos ou estruturas de dados, aqui não existe “uma resposta certa”. O objetivo é claro: projetar uma arquitetura escalável para alguma coisa, como, por exemplo, um feed de notícias, sistema de mensagens, mecanismo de busca, etc... Mas o escopo é muito amplo, a abordagem é aberta, e a pressão é real.&lt;/p&gt;

&lt;p&gt;E se você já se sentiu perdido sobre por onde começar, saiba que você &lt;strong&gt;não está sozinho(a)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Meu nome é Laura Fumagalli , trabalho em um dos maiores bancos da América Latina, tenho formação em Engenharia de Software e em Arquitetura de Soluções e Software. E foi justamente essa bagagem prática, aliada à ajuda de uma amiga incrível (super referência em IA, inclusive. Quer conhecer? &lt;a href="https://dev.to/analaura"&gt;clique aqui&lt;/a&gt; ), que me motivou a compartilhar aqui meu conhecimento acumulado ao longo dos ultimos anos.&lt;/p&gt;

&lt;p&gt;Este é o &lt;strong&gt;primeiro de uma série de posts&lt;/strong&gt; que vou compartilhar nos próximos dias. E acredite, vai valer a pena acompanhar.&lt;/p&gt;

&lt;p&gt;O objetivo? Ajudar você , seja lá qual for seu papel, a ir além e alcançar o próximo nível em design e arquitetura de sistemas . Porque esse tema não é apenas para desenvolvedoras e desenvolvedores. É para todo mundo que trabalha ou convive com sistemas complexos.&lt;/p&gt;

&lt;p&gt;Você é gestora ou gestor de projetos ? Acompanhe para entender melhor a linguagem do seu time e tomar decisões mais assertivas.&lt;/p&gt;

&lt;p&gt;É desenvolvedora ou desenvolvedor ? Acompanhe para aprender a projetar soluções mais robustas, escaláveis e alinhadas com o negócio.&lt;/p&gt;

&lt;p&gt;Está buscando uma nova oportunidade ? Acompanhe para se preparar com antecedência e mostrar durante a entrevista que você entende do que realmente importa.&lt;/p&gt;

&lt;p&gt;Essa jornada é para todos. E eu vou guiar quem se interessar passo a passo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Arquitetura de Sistemas na Prática: Estratégias Para Quem Quer Entender e Aplicar
&lt;/h2&gt;

&lt;p&gt;Empresas em todo o mundo adotam entrevistas de design de sistemas não por acaso. Elas buscam avaliar habilidades que vão além do código: comunicação, pensamento estruturado, capacidade de resolver problemas complexos e a maneira como você discute soluções com outras pessoas. Sim, &lt;strong&gt;comunicação&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Essas entrevistas simulam situações reais: você recebe um problema vago e precisa transformá-lo em uma solução clara e funcional. E isso é exatamente o que fazemos no dia a dia como engenheiros e arquitetos de software.&lt;/p&gt;

&lt;p&gt;O objetivo desse artigo (e da série que vem por aí) é te mostrar como pensar como um arquiteto de sistemas, seja para se preparar para uma entrevista técnica, seja para melhorar sua prática no trabalho.&lt;/p&gt;

&lt;p&gt;Vou compartilhar estratégias reais, passos estruturados e exemplos práticos de como projetar sistemas escaláveis. Você vai aprender a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entender os requisitos e restrições de um sistema;&lt;/li&gt;
&lt;li&gt;Escolher as tecnologias certas para cada cenário;&lt;/li&gt;
&lt;li&gt;Comunicar suas ideias de forma clara e assertiva;&lt;/li&gt;
&lt;li&gt;Pensar em escala, segurança e performance desde o início;&lt;/li&gt;
&lt;li&gt;Ajustar sua abordagem conforme o feedback do entrevistador ou do time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Minha intenção é que você saia dessa leitura mais confiante, mais preparado(a) e, acima de tudo, mais curioso(a) para mergulhar fundo nesse universo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entender é o Primeiro Passo Para Projetar Bem
&lt;/h2&gt;

&lt;p&gt;O design de sistemas não começa com tecnologia. Ele começa com comunicação . Uma boa arquitetura nasce do diálogo, da capacidade de ouvir, questionar e entender profundamente o problema que está sendo apresentado. Muitas pessoas entram em uma entrevista técnica já querendo propor soluções complexas sem sequer ter clareza dos requisitos reais. E isso pode ser um ponto crítico.&lt;/p&gt;

&lt;p&gt;Lembre-se: o objetivo não é mostrar que você sabe de tudo logo de cara, mas sim demonstrar que consegue pensar de forma estruturada, adaptável e colaborativa. A entrevista é uma conversa, não uma prova fechada. E isso reflete diretamente no mundo real: quanto mais você entender o negócio, os usuários e as restrições envolvidas, mais relevante e eficaz será sua contribuição como engenheiro ou arquiteto. Converse com quem está na chamada, pergunte se aquela abordagem faz sentido antes de continuar, isso com certeza vai fazer toda a diferença no resultado final!&lt;br&gt;
&lt;/p&gt;

&lt;br&gt;
Nos próximos artigos, vamos mergulhar fundo nesses passos, desde a análise inicial até a escolha das tecnologias certas, balanceamento de trade-offs e detalhamento da arquitetura de forma &lt;strong&gt;simples&lt;/strong&gt;. Vamos aprender juntos como projetar sistemas que façam sentido e não "apenas funcionem".

&lt;p&gt;Até breve!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Virtual Threads, Records e Pattern Matching no Java: Simplificando a Vida do Dev</title>
      <dc:creator>Laura Fumagalli</dc:creator>
      <pubDate>Sun, 09 Feb 2025 13:34:30 +0000</pubDate>
      <link>https://dev.to/fumagallilaura/virtual-threads-records-e-pattern-matching-no-java-simplificando-a-vida-do-dev-42m5</link>
      <guid>https://dev.to/fumagallilaura/virtual-threads-records-e-pattern-matching-no-java-simplificando-a-vida-do-dev-42m5</guid>
      <description>&lt;p&gt;Fala galera! Faz um tempo que não apareço aqui, mas como hoje estou nostálgica, decidi que vou falar sobre três funcionalidades massas que chegaram (ou foram aprimoradas, como preferir) no Java: Virtual Threads, Records e Pattern Matching. Se já cansou de escrever código verboso ou de ter que lidar com concorrência complexa, esses recursos vão fazer seus trazer luz ao seu código. Bora lá?&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Virtual Threads: Concorrência sem Dor de Cabeça
&lt;/h2&gt;

&lt;p&gt;Imagina o seguinte: você precisa lidar com milhares de tarefas simultâneas, como processar requisições em um servidor web. Tradicionalmente, no Java, isso significava criar threads do sistema operacional, o que pode ser pesado e limitado. Mas agora, com os &lt;em&gt;Virtual Threads&lt;/em&gt; (parte do &lt;em&gt;Project Loom&lt;/em&gt;), você pode criar milhões de threads leves e eficientes, gerenciadas pela JVM.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;O que muda?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Menos overhead: threads leves que não sobrecarregam o sistema.&lt;/li&gt;
&lt;li&gt;Código mais simples: sem precisar de frameworks complexos para lidar com concorrência.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Exemplo prático:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Runnable&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Rodando em uma virtual thread!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;};&lt;/span&gt;

&lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startVirtualThread&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Simples assim!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você já sofreu com &lt;code&gt;CompletableFuture&lt;/code&gt; ou &lt;em&gt;frameworks&lt;/em&gt; reativos, os Virtual Threads são um respiro de ar fresco, uma brisa no verão. Eles chegaram oficialmente no Java 21, então já dá para começar a testar!&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Records: Adeus, Boilerplate!
&lt;/h2&gt;

&lt;p&gt;Quantas vezes você já escreveu uma classe só para carregar dados, com getters, setters, &lt;code&gt;equals&lt;/code&gt;, &lt;code&gt;hashCode&lt;/code&gt; e &lt;code&gt;toString&lt;/code&gt;? Com os &lt;strong&gt;Records&lt;/strong&gt;, isso acabou! Introduzidos no &lt;strong&gt;Java 16&lt;/strong&gt;, eles são uma forma super concisa de criar classes imutáveis para armazenar dados.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;O que é um Record?&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Uma classe que automaticamente gera métodos como &lt;code&gt;equals()&lt;/code&gt;, &lt;code&gt;hashCode()&lt;/code&gt; e &lt;code&gt;toString()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Campos são imutáveis e acessados via métodos gerados automaticamente.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Exemplo prático:&lt;/strong&gt;
&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;Person&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;

&lt;span class="nc"&gt;Person&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"João"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// João&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Person[name=João, age=25]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Percebeu como o código ficou limpo? Records são perfeitos para DTOs, entidades e qualquer lugar onde você precise carregar dados sem complicação.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Pattern Matching: Escreva Menos, Faça Mais
&lt;/h2&gt;

&lt;p&gt;Já precisou verificar o tipo de um objeto e fazer um casting manual? Isso pode ser chato e propenso a erros. Com o &lt;strong&gt;Pattern Matching&lt;/strong&gt;, o Java trouxe uma forma bem mais elegante de lidar com isso.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;O que é?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uma maneira de verificar o tipo de um objeto e extrair seus dados em uma única operação.&lt;/li&gt;
&lt;li&gt;Funciona com &lt;code&gt;instanceof&lt;/code&gt; e, a partir do &lt;strong&gt;Java 17&lt;/strong&gt;, com &lt;code&gt;switch&lt;/code&gt; também.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Exemplo com &lt;code&gt;instanceof&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Olá, mundo!"&lt;/span&gt;&lt;span class="o"&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;obj&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// Verifica e faz o casting automaticamente&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toUpperCase&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// OLÁ, MUNDO!&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exemplo com &lt;code&gt;switch&lt;/code&gt;:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"É um inteiro: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;  &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"É uma string: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt;        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"Tipo desconhecido"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;};&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// É um inteiro: 42&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pattern Matching torna o código mais legível e menos repetitivo. É aquela funcionalidade que, depois que você começa a usar, não quer mais largar.&lt;/p&gt;




&lt;h2&gt;
  
  
  Por Que Isso Importa?
&lt;/h2&gt;

&lt;p&gt;Essas funcionalidades mostram como o Java está evoluindo para ser mais moderno, eficiente e fácil de usar. Resumindo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Virtual Threads&lt;/strong&gt;: Para concorrência escalável e simples.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Records&lt;/strong&gt;: Para classes de dados sem boilerplate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pattern Matching&lt;/strong&gt;: Para código mais limpo e seguro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você ainda não experimentou essas features, recomendo fortemente! Elas estão aí para tornar nossa vida de dev mais produtiva e menos estressante. E aí, o que você achou? Já usou alguma delas? Conta aqui nos comentários!&lt;/p&gt;

&lt;p&gt;Abraços e happy coding! 🚀&lt;/p&gt;




&lt;h1&gt;
  
  
  Java #DevCommunity #Programação #DicasDev
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Verificando o status da instalação SQL</title>
      <dc:creator>Laura Fumagalli</dc:creator>
      <pubDate>Fri, 25 Feb 2022 18:28:37 +0000</pubDate>
      <link>https://dev.to/fumagallilaura/verificando-o-status-da-instalacao-sql-3bk1</link>
      <guid>https://dev.to/fumagallilaura/verificando-o-status-da-instalacao-sql-3bk1</guid>
      <description>&lt;p&gt;Uma instância de um banco de dados é similar à instalação de um software (mais especificamente um serviço) que roda em segundo plano no seu computador. Existem serviços que rodam tanto localmente em sua máquina quanto em servidores remotos ao redor do mundo.&lt;/p&gt;




&lt;p&gt;Abra o terminal e digite o seguinte comando (deve ser exibido o status de active no Linux / started no macOS)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Linux&lt;/span&gt;
&lt;span class="nx"&gt;sudo&lt;/span&gt; &lt;span class="nx"&gt;systemctl&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="nx"&gt;mysql&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;macOS&lt;/span&gt;
&lt;span class="nx"&gt;brew&lt;/span&gt; &lt;span class="nx"&gt;services&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fs3.us-east-2.amazonaws.com%2Fassets.app.betrybe.com%2Fback-end%2Fsql%2Fimages%2Fmysqlinstallation11-a446ef9267a34cc18e33107e50326b15.gif" 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%2Fs3.us-east-2.amazonaws.com%2Fassets.app.betrybe.com%2Fback-end%2Fsql%2Fimages%2Fmysqlinstallation11-a446ef9267a34cc18e33107e50326b15.gif" alt="active sql linux" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fs3.us-east-2.amazonaws.com%2Fassets.app.betrybe.com%2Fback-end%2Fsql%2Fimages%2Fmysqlinstallation13-00af0f9ac51678745159e469f16516d1.gif" 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%2Fs3.us-east-2.amazonaws.com%2Fassets.app.betrybe.com%2Fback-end%2Fsql%2Fimages%2Fmysqlinstallation13-00af0f9ac51678745159e469f16516d1.gif" alt="active sql mac" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso o serviço esteja parado, você pode usar o comando a seguir para iniciá-lo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Linux&lt;/span&gt;
&lt;span class="nx"&gt;systemctl&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="nx"&gt;mysql&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;macOS&lt;/span&gt;
&lt;span class="nx"&gt;brew&lt;/span&gt; &lt;span class="nx"&gt;services&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="nx"&gt;mysql&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para parar o serviço do MySQL , você pode usar o comando stop&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Linux&lt;/span&gt;
&lt;span class="nx"&gt;systemctl&lt;/span&gt; &lt;span class="nx"&gt;stop&lt;/span&gt; &lt;span class="nx"&gt;mysql&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;macOS&lt;/span&gt;
&lt;span class="nx"&gt;brew&lt;/span&gt; &lt;span class="nx"&gt;services&lt;/span&gt; &lt;span class="nx"&gt;stop&lt;/span&gt; &lt;span class="nx"&gt;mysql&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para sair, aperte ctrl+c.&lt;/p&gt;




&lt;h2&gt;
  
  
  Configurando a inicialização e senha do servidor MYSQL
&lt;/h2&gt;

&lt;p&gt;Por padrão, após a instalação, seu servidor vai estar configurado para iniciar junto ao sistema. Caso não queira que isso aconteça, para poupar memória RAM, você pode desativar o início automático utilizando o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Linux&lt;/span&gt;
&lt;span class="nx"&gt;sudo&lt;/span&gt; &lt;span class="nx"&gt;systemctl&lt;/span&gt; &lt;span class="nx"&gt;disable&lt;/span&gt; &lt;span class="nx"&gt;mysql&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;macOS&lt;/span&gt;
&lt;span class="nx"&gt;brew&lt;/span&gt; &lt;span class="nx"&gt;services&lt;/span&gt; &lt;span class="nx"&gt;stop&lt;/span&gt; &lt;span class="nx"&gt;mysql&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Esse&lt;/span&gt; &lt;span class="nx"&gt;comando&lt;/span&gt; &lt;span class="nx"&gt;remove&lt;/span&gt; &lt;span class="nx"&gt;os&lt;/span&gt; &lt;span class="nx"&gt;serviços&lt;/span&gt; &lt;span class="nx"&gt;não&lt;/span&gt; &lt;span class="nx"&gt;utilizados&lt;/span&gt;
&lt;span class="nx"&gt;brew&lt;/span&gt; &lt;span class="nx"&gt;services&lt;/span&gt; &lt;span class="nx"&gt;cleanup&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A primeira vez que for utilizar após iniciar o computador, será necessário iniciar o servidor com o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Linux&lt;/span&gt;
&lt;span class="nx"&gt;sudo&lt;/span&gt; &lt;span class="nx"&gt;systemctl&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="nx"&gt;mysql&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;macOS&lt;/span&gt;
&lt;span class="nx"&gt;brew&lt;/span&gt; &lt;span class="nx"&gt;services&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="nx"&gt;mysql&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se desejar ativar novamente que ele inicie junto ao computador, basta usar o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Linux&lt;/span&gt;
&lt;span class="nx"&gt;sudo&lt;/span&gt; &lt;span class="nx"&gt;systemctl&lt;/span&gt; &lt;span class="nx"&gt;enable&lt;/span&gt; &lt;span class="nx"&gt;mysql&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;macOS&lt;/span&gt;
&lt;span class="nx"&gt;brew&lt;/span&gt; &lt;span class="nx"&gt;services&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="nx"&gt;mysql&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;você poderá agora acessar seu servidor pela linha de comando. Para visualizar quais bancos de dados estão disponíveis, você deve usar o comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mysql -u root -p&lt;/code&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Docker Compose</title>
      <dc:creator>Laura Fumagalli</dc:creator>
      <pubDate>Wed, 16 Feb 2022 21:03:06 +0000</pubDate>
      <link>https://dev.to/fumagallilaura/docker-compose-35kb</link>
      <guid>https://dev.to/fumagallilaura/docker-compose-35kb</guid>
      <description>&lt;p&gt;****É um arquivo pelo qual conseguimos configurar todo um ambiente de containers de maneira muito mais simples.&lt;br&gt;
Usando o Compose , definimos em um arquivo de configuração YAML todos os detalhes para executar nosso ambiente de desenvolvimento local, aproveitando todas as vantagens do Docker , sem se preocupar em subir cada um dos containers que envolvem um app com seus parâmetros específicos no run .&lt;/p&gt;

&lt;p&gt;Outros recursos importantes que também precisamos entender são os &lt;strong&gt;Volumes&lt;/strong&gt; . Eles são componentes do Docker responsáveis por prover a preservação de informações. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Networks - Redes no Docker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Por padrão, o Docker possui 3 redes que são criadas junto com ele: bridge , none e host . Cada uma delas tem características específicas quanto a conectividade para seus containers . Podemos consultá-las executando:&lt;br&gt;
&lt;code&gt;docker network ls&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bridge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ao ser iniciado, todo container é associado a uma rede e, caso uma rede não seja especificada explicitamente por nós, ele será associado a rede Bridge .&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Host&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ao associarmos um container a essa rede, ela passa a compartilhar toda stack de rede do host , ou seja, da máquina que roda o ambiente Docker . O uso desta rede é recomendada apenas para alguns serviços específicos, normalmente de infra, em que o container precisa desse compartilhamento. Caso contrário, a recomendação é evitá-la.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;None&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Essa é uma rede que não possui nenhum driver associado. Dessa maneira, ao atribuir um container a ela, o mesmo ficará isolado. Ela é útil quando temos containers que utilizam arquivos para a execução de comandos ou para se comunicar, por exemplo, um container de backup ou que rode apenas um script localmente.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Docker - YouTube Course</title>
      <dc:creator>Laura Fumagalli</dc:creator>
      <pubDate>Wed, 16 Feb 2022 18:01:38 +0000</pubDate>
      <link>https://dev.to/fumagallilaura/docker-youtube-course-14mo</link>
      <guid>https://dev.to/fumagallilaura/docker-youtube-course-14mo</guid>
      <description>&lt;p&gt;Container - is an isolated environment for running an application&lt;/p&gt;

&lt;p&gt;!==&lt;/p&gt;

&lt;p&gt;Virtual Machine - is an abstraction of a machine (physical hardware) - Hypervisors&lt;/p&gt;




&lt;p&gt;Installing Docker - the lattest version&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Dockerfile - is a file that include instructions packge a image (contains everything that application needs to run)&lt;/p&gt;

&lt;p&gt;Container - Is just a process then use that image.&lt;br&gt;
Docker run inside a container an isolated environment&lt;/p&gt;




&lt;p&gt;Docker in action&lt;/p&gt;

</description>
      <category>docker</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Back End - Docker Parte 2</title>
      <dc:creator>Laura Fumagalli</dc:creator>
      <pubDate>Tue, 15 Feb 2022 21:15:45 +0000</pubDate>
      <link>https://dev.to/fumagallilaura/back-end-docker-parte-2-5f88</link>
      <guid>https://dev.to/fumagallilaura/back-end-docker-parte-2-5f88</guid>
      <description>&lt;p&gt;Imagens Docker são arquivos que funcionam como espécies de fotos de programas, bibliotecas, frameworks ou mesmo sistemas operacionais, a partir das quais construimos containers e executamos códigos dentro do Docker .&lt;/p&gt;

&lt;p&gt;Para listar todas as imagens que foram baixadas em algum momento no seu computador:&lt;br&gt;
&lt;code&gt;docker images&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Dessa forma podemos verificar que a imagem está devidamente instalada localmente como pode ser visto a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;REPOSITORY     TAG       IMAGE ID       CREATED        SIZE
hello-world    latest    bc11b176a293   6 weeks ago    9.14kB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fs3.us-east-2.amazonaws.com%2Fassets.app.betrybe.com%2Fback-end%2Fdocker%2Fdocker-images%2Fimages%2Fdocker-image-process-ecf083d6a6f9a0826603c69079f6718d.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%2Fs3.us-east-2.amazonaws.com%2Fassets.app.betrybe.com%2Fback-end%2Fdocker%2Fdocker-images%2Fimages%2Fdocker-image-process-ecf083d6a6f9a0826603c69079f6718d.png" alt="Docker resume" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para sabermos se o container da imagem foi criado a partir da imagem, basta rodar o seguinte comando que retorna a lista de containers ativos e inativos (parâmetro -a ):&lt;br&gt;
&lt;code&gt;docker ps -a&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A partir de uma imagem, podemos ter vários containers .&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Podemos ter vários containers reproduzindo uma mesma imagem do Docker .&lt;br&gt;
*&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Para remover a imagem (o comando -f serve para forçar a remoção do recurso):&lt;br&gt;
&lt;code&gt;docker rmi -f bc11b176a293&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sem a flag -f , o Docker irá nos alertar que já foram criados containers a partir da imagem que estamos tentando excluir, pois a remoção dessa imagem também removerá a fonte de referência dos containers criados a partir dela. Para excluir a imagem mesmo assim, é preciso acrescentar a flag -f .&lt;br&gt;
Ao excluir uma imagem, os containers gerados a partir dela não serão excluídos, apenas ficaram órfãos das camadas da imagem que a utilizavam para executar suas funções. A partir do momento que excluímos uma imagem que era referência para um container, precisaremos baixar uma nova imagem se quisermos rodar os containers criados novamente&lt;/p&gt;

&lt;p&gt;======================================================&lt;/p&gt;

&lt;p&gt;Comando que baixa a imagem, mas não cria nenhum container:&lt;br&gt;
&lt;code&gt;docker pull &amp;lt;imagem&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Uma imagem é um arquivo imutável e a partir dele um ou mais containers podem ser gerados. Uma imagem do Docker é criada a partir do processo de build * de um arquivo chamado Dockerfile **.&lt;/p&gt;

&lt;p&gt;Frequentemente no contexto de programação, o termo build ('construir' em português) se refere ao trabalho de pegar aquele conjunto de instruções que definimos antes (o nosso "script", "código fonte"), e a partir dele, construir um produto que seja executável de maneira mais simples - que por tanto, é melhor para distribuir.&lt;br&gt;
** O Dockerfile é um arquivo que contém as instruções necessárias (como um "script") para que rodemos uma aplicação: Sistema Operacional (SO) utilizado, bibliotecas que devem ser instaladas, arquivos que devem ser inicializados, etc.&lt;/p&gt;

&lt;p&gt;Confirmar a existência daquela imagem:&lt;br&gt;
&lt;code&gt;docker images&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Já para sabermos se o container da imagem hello-world foi criado a partir da imagem, basta rodar o seguinte comando:&lt;br&gt;
&lt;code&gt;docker ps -a&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Podemos ter vários containers reproduzindo uma mesma imagem do Docker .&lt;/strong&gt;&lt;br&gt;
Toda imagem possui sua IMAGE ID e todo container possui seu CONTAINER ID . Ambos são identificadores únicos desses elementos dentro do Docker e servem como referência para outras possibilidades de comando.&lt;/p&gt;

&lt;p&gt;Depois de obter o IMAGE ID , basta executar o comando docker rmi -f  , em que rmi vem de " R e m over I magem" ( remove image(s) ).&lt;/p&gt;

&lt;p&gt;Depois de obter o IMAGE ID , basta executar o comando docker rmi -f  , em que rmi vem de " R e m over I magem" ( remove image(s) ).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;É importante ressaltar que ao excluir uma imagem, os containers gerados a partir dela não serão excluídos, apenas ficaram órfãos das camadas da imagem que a utilizavam para executar suas funções.
Portanto, para gerar novos containers precisaremos de uma nova imagem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;=========================================&lt;/p&gt;

&lt;p&gt;Toda imagem no Docker pode ter uma ou várias camadas e esse sistema é conhecido como Layered File System (Sistema de Arquivos em Camadas) .&lt;/p&gt;

&lt;p&gt;Como em praticamente toda instância dentro Docker , cada camada também é representada por um código único (uma hash) . A finalidade dessas camadas é que elas possam ser reaproveitadas por outras imagens .&lt;/p&gt;

&lt;p&gt;========================================&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker start -ai meu_container
# Aqui passamos o parâmetro `-ai` ao comando `start`,
# para dizer que queremos acoplar ao container (`a`, de 'attach'),
# de modo interativo (`i`, de 'interactive').
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;=======================================&lt;/p&gt;

&lt;p&gt;um Servidor HTTP (Ou servidor web) é um aplicativo capaz de disponibilizar arquivos (como páginas de internet) através de requisições via protocolo de comunicação HTTP , que é o mais utilizado na navegação via internet.&lt;/p&gt;

&lt;p&gt;Existem vários servidores http no mercado. No nosso exemplo, utilizaremos o Servidor HTTP Apache , bastante popular entre pessoas desenvolvedoras da linguagem PHP .&lt;/p&gt;

&lt;p&gt;rode o seguinte comando para baixar a imagem do servidor:&lt;br&gt;
&lt;code&gt;docker run -d -P httpd:2.4&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;É importante ressaltar que a porta 80 é a porta interna que é enxergada somente dentro do container e a porta 55000 é a porta externa, ou seja, aquela que pode ser acessada em nossa máquina.&lt;/p&gt;

&lt;p&gt;A forma que temos de identificar os containers é por meio do CONTAINER ID , porém, esses números complexos podem acabar nos confundindo na execução de algum comando.&lt;br&gt;
Para resolver isso, existe a possibilidade de nomear seu container. Dessa forma, não precisamos depender de ids aleatórios que o Docker atribui e assim ficará mais fácil parar ou remover o container.&lt;br&gt;
Para dar um nome ao container, basta utilizar a flag --name :&lt;br&gt;
&lt;code&gt;docker run -d -P --name site-trybe httpd:2.4&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A atribuição aleatória das portas é feita pela flag -P e, para especificar a porta, utilizamos a flag -p . Desse modo, devemos seguir a sintaxe -p : .&lt;br&gt;
&lt;code&gt;docker run -d -p 54321:80 httpd:2.4&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Nesse exemplo, mapeamos a porta 54321 do nosso computador à porta 80 do container. Agora podemos acessar o site estático mantido pelo servidor Apache acessando o endereço &lt;a href="http://localhost:54321" rel="noopener noreferrer"&gt;http://localhost:54321&lt;/a&gt; no navegador.&lt;/p&gt;

&lt;h1&gt;
  
  
  Nesse exemplo, mapeamos a porta 54321 do nosso computador à porta 80 do container. Agora podemos acessar o site estático mantido pelo servidor Apache acessando o endereço &lt;a href="http://localhost:54321" rel="noopener noreferrer"&gt;http://localhost:54321&lt;/a&gt; no navegador.
&lt;/h1&gt;

&lt;p&gt;o uso do parâmetro -P , ele é utilizado para que o Docker faça um mapeamento de portas automático para acesso ao container.&lt;/p&gt;

&lt;p&gt;Um detalhe importante é que a porta do container vai variar dependendo da aplicação que você está rodando . No caso do servidor http , a porta padrão de acesso para páginas web é a 80 .&lt;br&gt;
Em uma aplicação de React por outro lado, a imagem deveria expor a porta 3000 como padrão, então é importante saber qual porta sua aplicação vai usar antes de rodar o parâmetro -p .&lt;/p&gt;

&lt;p&gt;======================================&lt;/p&gt;

&lt;p&gt;Então, para criarmos containers para nossas aplicações, precisamos iniciar criando a imagem deles! E temos a alternativa de fazê-los a partir dos arquivos Dockerfile *.&lt;br&gt;
 também podemos "commitar" (como no git ) alterações que fazemos em nossos containers, salvando eles em novas imagens.&lt;br&gt;
Para isso podemos usar o comando docker commit , que serve literalmente para pegarmos as alterações (que são etapas adicionais) que fizemos no nosso container e salvar elas em uma imagem (nova ou já existente).&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Back End - Docker</title>
      <dc:creator>Laura Fumagalli</dc:creator>
      <pubDate>Mon, 14 Feb 2022 18:43:43 +0000</pubDate>
      <link>https://dev.to/fumagallilaura/back-end-docker-4mkn</link>
      <guid>https://dev.to/fumagallilaura/back-end-docker-4mkn</guid>
      <description>&lt;p&gt;&lt;strong&gt;Processo de deploy&lt;/strong&gt; ou implantação - se uma pessoa desenvolve utilizando uma distribuição 'A' de Linux , outra utiliza Windows, outra utiliza Mac e no servidor roda uma distribuição 'B' de Linux, todas elas estão trabalhando no mesmo projeto, e da mesma forma, estão disponibilizando-o para o ambiente de produção, em um servidor remoto comum.&lt;/p&gt;

&lt;p&gt;Por meio do &lt;strong&gt;Docker&lt;/strong&gt; , resolvemos o problema de incompatibilidade com outros sistemas&lt;/p&gt;

&lt;p&gt;É essencial saber Docker , tanto para se adequar ao mercado como para aproveitar seus benefícios durante o ciclo de vida de nossas aplicações.&lt;/p&gt;

&lt;p&gt;=============================================&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fazendo a instalação do Docker Engine&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No Linux, o Docker não possui uma interface gráfica de utilização (GUI) oficial, contudo, existem várias opções não-oficiais disponíveis, bem como uma extensão oficial da Microsoft para a plataforma no VSCode , que pode ajudar muito no gerenciamento de seus containers .&lt;br&gt;
(&lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Desinstalando versões anteriores: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt-get remove docker* containerd runc&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Detalhe, o Docker preserva informações sobre imagens, containers , volumes e redes na pasta /var/lib/docker/ . Nesse processo, esses arquivos não são apagados.&lt;br&gt;
Caso nenhum dos pacotes esteja instalado, esse comando retornará um erro E: Impossível encontrar o  , nesse caso, é só prosseguir com a instalação.&lt;/p&gt;

&lt;p&gt;(&lt;a href="https://docs.docker.com/engine/install/ubuntu/" rel="noopener noreferrer"&gt;https://docs.docker.com/engine/install/ubuntu/&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Atualizando os índices dos pacotes do apt:&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
&lt;code&gt;sudo apt-get update&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;ou&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt-get upgrade&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Habilitando HTTPS para o apt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Adicionando uma chave de acesso ao repositório remoto:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Se tudo correr bem, você não deve receber nenhum retorno visual.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adicionando o repositório&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;echo \&lt;br&gt;
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \&lt;br&gt;
  | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Perceba que adicionamos o repositório stable (em $(lsb_release -cs) stable ), isso significa que teremos somente o repositório com as versões estáveis do Docker .&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Em distribuições baseadas no Ubuntu (como o Linux Mint ), talvez você precise alterar o comando $(lsb_release -cs) para uma versão do ubuntu que seja compatível com aquele sistema. Exemplo: Caso você utilize o Linux Mint Tessa , você deve alterar o valor para bionic .&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Instalando Docker Engine&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt-get install docker-ce docker-ce-cli containerd.io&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adicionando um usuário ao grupo de usuários docker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;⚠️ Atenção ⚠️: Esse procedimento faz com que seu usuário tenha os mesmos privilégios do usuário root (o superusuário no linux) na execução dos comandos Docker *, então use-o com moderação, apenas em ambiente de desenvolvimento.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo groupadd docker&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Caso ocorra uma mensagem: groupadd: grupo 'docker' já existe , é só prosseguir.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo usermod -aG docker $USER&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;newgrp docker&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Iniciando o Daemon do Docker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo systemctl status docker&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Esse comando deve retornar algo como um pequeno relatório sobre o serviço, onde consta seu status de funcionamento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Thu 2021-09-23 11:55:11 -03; 2s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
    Process: 2034 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=0&amp;gt;
   Main PID: 2034 (code=exited, status=0/SUCCESS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso o parâmetro Active esteja como stop/waiting ou no nosso caso, como inactive , rode o comando start para iniciá-lo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo systemctl start docker&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ao consultar o status novamente, o processo deverá estar como start/ running/ active .&lt;/p&gt;

&lt;p&gt;Habilite o daemon do Docker para iniciar durante o boot :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo systemctl enable docker&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Validando a instalação&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker run hello-world&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fs3.us-east-2.amazonaws.com%2Fassets.app.betrybe.com%2Fback-end%2Fdocker%2Fimages%2Fintroduction%2Fdocker-hello-world-2b2270efe59572e16c5029758436dede.gif" 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%2Fs3.us-east-2.amazonaws.com%2Fassets.app.betrybe.com%2Fback-end%2Fdocker%2Fimages%2Fintroduction%2Fdocker-hello-world-2b2270efe59572e16c5029758436dede.gif" alt="retorno" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando damos o comando docker run hello-world , estamos pedindo para que ele busque em seu repositório oficial, uma imagem chamada hello-world que é um exemplo simples de um container , esse que ao final, nos retorna uma mensagem de texto&lt;/p&gt;

&lt;p&gt;============================&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desinstalando o Docker Engine&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt-get purge docker-ce docker-ce-cli containerd.io&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;=========================&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rodando o sistema operacional Ubuntu em um container&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Os comandos do Docker funcionam no seguinte formato:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker &amp;lt;comando&amp;gt; &amp;lt;sub-comando&amp;gt; &amp;lt;parâmetros&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O formato do comando para rodar um container é o seguinte:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker container run &amp;lt;nome-da-imagem&amp;gt;:&amp;lt;tag&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Em que  representa a versão daquela imagem, caso nenhuma seja passada, ele assumira que é a última versão disponível ( latest ).&lt;/p&gt;

&lt;p&gt;======================&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Listando containers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No Docker , é possível saber quais containers estão ativos com o seguinte comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker container ls&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;ou&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker container ls -a&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;E caso você queira saber somente sobre o último container criado (independente do status dele), você pode usar o parâmetro -l&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker container ls -l&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Obs: o comando run também cria um novo container para aquela imagem toda vez que é executado.&lt;/p&gt;

&lt;p&gt;Significado de cada coluna:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CONTAINER&lt;/strong&gt; ID: Identificador único*;&lt;br&gt;
&lt;strong&gt;IMAGE&lt;/strong&gt;: O nome da imagem utilizada para a criação do container ;&lt;br&gt;
&lt;strong&gt;COMMAND&lt;/strong&gt;: O comando executado/ em execução dentro do container ;&lt;br&gt;
&lt;strong&gt;CREATED&lt;/strong&gt;: Quando foi criado o container ;&lt;br&gt;
&lt;strong&gt;STATUS&lt;/strong&gt;: O status atual do mesmo, no nosso caso, encerrado;&lt;br&gt;
&lt;strong&gt;PORT&lt;/strong&gt;: A porta que estamos utilizando para nos comunicar com o container*&lt;em&gt;;&lt;br&gt;
**NAMES&lt;/em&gt;*: O apelido do container , como não definimos nenhum, foi criado um aleatório.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quando executamos algum comando relacionado ao container , podemos nos referenciar tanto pelo campo ID (inteiro ou parte dele), quanto pelo campo NAMES .
** Veremos isso mais adiante, mas o docker pode disponibilizar uma porta de acesso para aplicação.
Para isso, conseguimos fazer uma atribuição de uma porta do sistema hospedeiro, apontando para uma outra porta, no sistema cliente, no formato : .
Exemplo 8080:3000 , em que a porta 8080 do meu sistema representa a porta 3000 do container .&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;========================&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rodando um comando adicional antes de terminar o container&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker container run &amp;lt;nome-da-imagem&amp;gt;:&amp;lt;tag&amp;gt; &amp;lt;comando&amp;gt; &amp;lt;argumentos-do-comando&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Exemplo: &lt;code&gt;docker container run ubuntu echo 'Hello World!'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;================================&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rodando o container de forma interativa&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O comando -ti são dois comandos juntos:
-t que indica pro docker que estamos requisitando um terminal no container que consiga imprimir o retorno dos nossos comandos;
-i que estabelece uma interface de comunicação física com esse terminal, no caso, por meio do teclado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo: &lt;code&gt;docker container run -ti ubuntu&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fs3.us-east-2.amazonaws.com%2Fassets.app.betrybe.com%2Fback-end%2Fdocker%2Fimages%2Fintroduction%2Fdocker-container-run-ti-ubuntu-1530d65dedaf44073151cc0c4008df45.gif" 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%2Fs3.us-east-2.amazonaws.com%2Fassets.app.betrybe.com%2Fback-end%2Fdocker%2Fimages%2Fintroduction%2Fdocker-container-run-ti-ubuntu-1530d65dedaf44073151cc0c4008df45.gif" alt="docker interativo" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O domínio do usuário root no terminal do container é o CONTAINER ID do mesmo, nesse caso 65897a6b07fb ( root@65897a6b07fb ) ;&lt;br&gt;
O comando cat /etc/lsb-release retorna os dados da distribuição, no caso, o Ubuntu 20.04 que é a imagem utilizada;&lt;br&gt;
Para sair desse terminal interno do container e retornar ao seu terminal, é só utilizar o comando exit .&lt;/p&gt;

&lt;p&gt;====================&lt;/p&gt;

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

&lt;p&gt;docker    é o formato padrão para comandos não-abreviados no CLI;&lt;br&gt;
Utilize o parâmetro --help no  ou  para ter a relação completa do que pode ser executado a partir deles;&lt;br&gt;
Exemplo: docker container --help , ou docker container run --help .&lt;br&gt;
Os  são opcionais na execução dos comandos;&lt;br&gt;
O conteúdo faz referência a documentação oficial dos comandos no Docker Docs .&lt;br&gt;
(&lt;a href="https://docs.docker.com/engine/reference/commandline/docker/" rel="noopener noreferrer"&gt;https://docs.docker.com/engine/reference/commandline/docker/&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Criar e rodar um container:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Deve criar um novo container e roda-lo logo em seguida:&lt;br&gt;
&lt;code&gt;docker container run &amp;lt;parâmetros&amp;gt; &amp;lt;imagem&amp;gt;:&amp;lt;tag&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O parâmetro --name define um  para aquele container (ao invés de um nome aleatório) :&lt;br&gt;
&lt;code&gt;docker container run --name &amp;lt;nome-da-sua-escolha&amp;gt; &amp;lt;imagem&amp;gt;:&amp;lt;tag&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Modo 'Cleanup': O parâmetro --rm deve garantir que o container seja removido ao final da execução (útil para testar imagens sem ficar acumulando containers novos) :&lt;br&gt;
&lt;code&gt;docker container run --rm &amp;lt;imagem&amp;gt;:&amp;lt;tag&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O parâmetro -d (de --detach , desacoplado em português) rodará esse container em segundo plano:&lt;br&gt;
&lt;code&gt;docker container run -d &amp;lt;imagem&amp;gt;:&amp;lt;tag&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trabalhar em segundo plano significa que a aplicação está rodando, porém de forma assíncrona ao comando, ou seja, embora não esteja visível, o processo está lá, funcionando por de trás dos panos. É possível validar isso com o comando &lt;code&gt;docker ps -a&lt;/code&gt; .&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O comando -d em outros aplicativos e serviços também pode estar associado ao conceito de daemon , que também é uma forma de se referenciar aplicativos que estão funcionando em segundo plano.&lt;br&gt;
No exemplo da imagem ubuntu, faz sentido passar o parâmetro &lt;code&gt;-d&lt;/code&gt; associado ao &lt;code&gt;-it&lt;/code&gt; como em: &lt;br&gt;
&lt;code&gt;docker container run -dit ubuntu&lt;/code&gt; , o que manterá o container ativo em segundo plano, já com um terminal disponível para acesso;&lt;/p&gt;

&lt;p&gt;(Comando antigo) * Abreviação do comando docker container run :&lt;br&gt;
&lt;code&gt;docker run &amp;lt;parâmetros&amp;gt; &amp;lt;imagem&amp;gt;:&amp;lt;tag&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nas versões mais novas, o Docker vem adotando comandos mais verbosos, nos quais identificamos a entidade ( container , image , etc) que estamos trabalhando, antes de realizar o comando (o que o torna mais semântico).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;======================================================&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Criar um container sem executá-lo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cria um container com a imagem de referência, mas não o executa imediatamente:&lt;br&gt;
&lt;code&gt;docker container create &amp;lt;parâmetros&amp;gt; &amp;lt;imagem&amp;gt;:&amp;lt;tag&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O parâmetro -it nesse contexto, deve garantir que ao iniciar o container , ele se mantenha ativo e disponha de um terminal de acesso:&lt;br&gt;
&lt;code&gt;docker container create -it &amp;lt;imagem&amp;gt;:&amp;lt;tag&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;=======================================================&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Listar containers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lista ( ls , list em inglês) todos os &lt;strong&gt;containers ativos&lt;/strong&gt;:&lt;br&gt;
&lt;code&gt;docker container ls&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Lista todos os &lt;strong&gt;containers ativos e inativos&lt;/strong&gt; :&lt;br&gt;
&lt;code&gt;docker container ls -a&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Lista o último &lt;strong&gt;container criado&lt;/strong&gt; (independente do seu estado) :&lt;br&gt;
&lt;code&gt;docker container ls -l&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;(Comando antigo) Abreviação do comando docker container ls (que também pode ser chamado como docker container ps ):&lt;br&gt;
&lt;code&gt;docker ps &amp;lt;parâmetro&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;============================================&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Iniciar, reiniciar, pausar, resumir e parar um container&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Inicia* um container usando referências de sua identificação única (campo CONTAINER ID , parcialmente ou inteiro) , ou pelo nome (campo NAMES ) que foi definido:&lt;br&gt;
&lt;code&gt;docker container start &amp;lt;CONTAINER ID || NAMES&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Reinicia um container usando as referências citadas anteriormente:&lt;br&gt;
&lt;code&gt;docker container restart &amp;lt;CONTAINER ID || NAMES&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Pausa um container usando as referências citadas anteriormente:&lt;br&gt;
&lt;code&gt;docker container pause &amp;lt;CONTAINER ID || NAMES&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Tira um container do modo de pausa usando as referências citadas anteriormente:&lt;br&gt;
&lt;code&gt;docker container unpause &amp;lt;CONTAINER ID || NAMES&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Encerra um container usando as referências citadas anteriormente:&lt;br&gt;
&lt;code&gt;docker container stop &amp;lt;CONTAINER ID || NAMES&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;(Comando antigo) São abreviações para os comandos anteriores:&lt;br&gt;
&lt;code&gt;docker &amp;lt;start || restart || pause || unpause || stop&amp;gt; &amp;lt;CONTAINER ID || NAMES&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fs3.us-east-2.amazonaws.com%2Fassets.app.betrybe.com%2Fback-end%2Fdocker%2Fimages%2Fintroduction%2Fdocker-container-start-stop-tip-997e8ec0f472b99e24a1ac70fbff3dd2.gif" 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%2Fs3.us-east-2.amazonaws.com%2Fassets.app.betrybe.com%2Fback-end%2Fdocker%2Fimages%2Fintroduction%2Fdocker-container-start-stop-tip-997e8ec0f472b99e24a1ac70fbff3dd2.gif" alt="docker commands" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;====================================================&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retomando o acesso a um container interativo rodando em segundo plano&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Caso você tenha iniciado um container em segundo plano utilizando -dit , você pode acessar esse container rodando o comando attach :&lt;br&gt;
&lt;code&gt;docker container attach &amp;lt;CONTAINER ID || NAMES&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Abreviação do comando docker container attach  :&lt;br&gt;
&lt;code&gt;docker attach &amp;lt;CONTAINER ID || NAMES&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Excluindo containers específicos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se o container não estiver ativo, esse comando deve remover o mesmo:&lt;br&gt;
&lt;code&gt;docker container rm &amp;lt;CONTAINER ID || NAMES&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Se o container estiver ativo, você deve passar o parâmetro -f (forçar) para parar sua execução e depois efetuar a remoção:&lt;br&gt;
&lt;code&gt;docker container rm -f &amp;lt;CONTAINER ID || NAMES&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;(Comando antigo) Abreviação do comando docker container rm :&lt;br&gt;
&lt;code&gt;docker rm &amp;lt;CONTAINER ID || NAMES&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limpando containers que não estão sendo utilizados&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker container prune&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;============================================&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitorando os processos dentro de um container&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O comando top , assim como nos terminais linux, traz as informações sobre os processos que estão sendo rodados, mas dentro daquele container , o que não inclui, por exemplo, serviços que são compartilhados com o sistema hospedeiro. Ele é útil para quando estamos os rodando em segundo plano:&lt;br&gt;
&lt;code&gt;docker container top &amp;lt;CONTAINER ID || NAMES&amp;gt;&lt;/code&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>GitHub Pages React</title>
      <dc:creator>Laura Fumagalli</dc:creator>
      <pubDate>Tue, 25 Jan 2022 01:24:47 +0000</pubDate>
      <link>https://dev.to/fumagallilaura/github-pages-13lc</link>
      <guid>https://dev.to/fumagallilaura/github-pages-13lc</guid>
      <description>&lt;p&gt;// first the command:&lt;br&gt;
// npm install gh-pages --save-dev&lt;/p&gt;

&lt;p&gt;// add on packge.json:&lt;/p&gt;

&lt;p&gt;// in the top, in the top of "name":&lt;br&gt;
// "homepage": "&lt;a href="http://fumagallilaura.github.io/vetmap" rel="noopener noreferrer"&gt;http://fumagallilaura.github.io/vetmap&lt;/a&gt;",&lt;/p&gt;

&lt;p&gt;// in the begin of "scripts" key:&lt;br&gt;
// "predeploy": "npm run build",&lt;br&gt;
// "deploy": "gh-pages -d build",&lt;/p&gt;

&lt;p&gt;// after the application is ready, run the command:&lt;br&gt;
// npm run deploy&lt;/p&gt;

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