<?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: Afonso Pacifer</title>
    <description>The latest articles on DEV Community by Afonso Pacifer (@afonsopacifer).</description>
    <link>https://dev.to/afonsopacifer</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%2F336730%2Ff0cfb78c-1836-41d7-b88a-4fa66381cdf8.jpeg</url>
      <title>DEV Community: Afonso Pacifer</title>
      <link>https://dev.to/afonsopacifer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/afonsopacifer"/>
    <language>en</language>
    <item>
      <title>Criando componentes para Web #01: Acessibilidade (a11y) na prática com WAI-ARIA</title>
      <dc:creator>Afonso Pacifer</dc:creator>
      <pubDate>Sun, 16 Jun 2024 16:28:03 +0000</pubDate>
      <link>https://dev.to/afonsopacifer/criando-componentes-para-web-01-acessibilidade-a11y-na-pratica-com-wai-aria-45ef</link>
      <guid>https://dev.to/afonsopacifer/criando-componentes-para-web-01-acessibilidade-a11y-na-pratica-com-wai-aria-45ef</guid>
      <description>&lt;h2&gt;
  
  
  O que abordaremos nessa série?
&lt;/h2&gt;

&lt;p&gt;Olá, nessa série de artigos vamos abordar todos as especialidades que uma pessoa profissional de Front-End precisa compreender para criar componentes &lt;strong&gt;acessíveis&lt;/strong&gt;, &lt;strong&gt;performáticos&lt;/strong&gt;, &lt;strong&gt;responsivos&lt;/strong&gt;, &lt;strong&gt;manuteníveis&lt;/strong&gt;, &lt;strong&gt;reutilizáveis&lt;/strong&gt;, &lt;strong&gt;documentados&lt;/strong&gt;, &lt;strong&gt;customizáveis&lt;/strong&gt;, &lt;strong&gt;testados&lt;/strong&gt; e que atendem as reais necessidades de produtos e times de desenvolvimento, independente da tecnologia escolhida, seja &lt;strong&gt;React.js&lt;/strong&gt;, &lt;strong&gt;Angular&lt;/strong&gt;, &lt;strong&gt;Vue.js&lt;/strong&gt; ou qualquer outra.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como vamos abordar cada assunto?
&lt;/h2&gt;

&lt;p&gt;Pensei em seguirmos um roteiro para que cada assunto possa ser abordado com o mesmo padrão, dessa forma não perdemos nenhum ponto importante e ainda me ajuda na hora de escrever hehe.&lt;/p&gt;

&lt;h3&gt;
  
  
  Roteiro genérico:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Introdução&lt;/li&gt;
&lt;li&gt;Qual a importância?&lt;/li&gt;
&lt;li&gt;Principais referências&lt;/li&gt;
&lt;li&gt;Aplicando na prática&lt;/li&gt;
&lt;li&gt;Como testar&lt;/li&gt;
&lt;li&gt;Dicas de especialista&lt;/li&gt;
&lt;li&gt;Próximos passos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ok, agora que estamos alinhados com as ideias por trás dessa série, vamos partir para o primeiro assunto. Bem vindos ao mundo da &lt;strong&gt;a11y&lt;/strong&gt; ❤️.&lt;/p&gt;

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

&lt;p&gt;Primeiro precisamos entender o que significa o tal &lt;strong&gt;a11y&lt;/strong&gt;. Basicamente é a abreviação da palrava em inglês &lt;strong&gt;accessibility&lt;/strong&gt; (acessibilidade), sendo &lt;strong&gt;a + 11 letras no meio + y&lt;/strong&gt;. Apenas abreviamos o termo para facilitar o uso no dia a dia.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Dica&lt;/strong&gt;: Fazemos o mesmo com a palavra &lt;strong&gt;internationalization&lt;/strong&gt; (internacionalização), sendo &lt;strong&gt;i + 18 letras no meio + n&lt;/strong&gt;, logo temos como resultado o tão famoso termo &lt;strong&gt;i18n&lt;/strong&gt; (Que será assunto de um próximo artigo).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dentre todos os aspectos relacionados a acessibilidade web, hoje abordaremos o famoso &lt;strong&gt;WAI-ARIA&lt;/strong&gt;, mas antes, precisamos conhecer a &lt;strong&gt;WAI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WAI&lt;/strong&gt; ou &lt;strong&gt;&lt;a href="https://www.w3.org/WAI/" rel="noopener noreferrer"&gt;Web Accessibility Initiative&lt;/a&gt;&lt;/strong&gt; (Iniciativa de Acessibilidade na Web), é uma iniciativa da &lt;a href="https://www.w3.org" rel="noopener noreferrer"&gt;W3C&lt;/a&gt; para desenvolver padrões e materiais de apoio que nos ajudam a compreender e implementar a acessibilidade.&lt;/p&gt;

&lt;p&gt;Já o &lt;strong&gt;&lt;a href="https://www.w3.org/WAI/standards-guidelines/aria/" rel="noopener noreferrer"&gt;WAI-ARIA&lt;/a&gt;&lt;/strong&gt; nós podemos definir como uma especificação que traz uma extensão para o &lt;code&gt;HTML&lt;/code&gt;, adicionar muito mais dinamismo e controle sobre a semântica.&lt;/p&gt;

&lt;h3&gt;
  
  
  Qual a importância da a11y?
&lt;/h3&gt;

&lt;p&gt;Antes de demonstrar o &lt;strong&gt;WAI-ARIA&lt;/strong&gt; em ação, e para nivelar o conhecimento, precisamos abordar a importância da acessibilidade na web, e para isso, eu trouxe alguns links de experts que já explicaram  muito bem o assunto na comunidade Front-End ❤️.&lt;/p&gt;

&lt;h3&gt;
  
  
  Referências sobre a11y na Web
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a class="mentioned-user" href="https://dev.to/brunopulis"&gt;@brunopulis&lt;/a&gt;: &lt;a href="https://brunopulis.com/introducao-acessibilidade-web/" rel="noopener noreferrer"&gt;Acessibilidade Web: como começar do jeito certo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://talitapagani.com" rel="noopener noreferrer"&gt;Talita Pagani&lt;/a&gt;: &lt;a href="https://www.youtube.com/watch?v=4URTZHk6tz0&amp;amp;t=129s" rel="noopener noreferrer"&gt;Acessibilidade na prática para você nunca mais esquecer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://reinaldoferraz.com.br" rel="noopener noreferrer"&gt;Reinaldo Ferraz&lt;/a&gt;: &lt;a href="https://www.youtube.com/watch?v=MMLQioPwbik" rel="noopener noreferrer"&gt;Acessibilidade na web modo Jedi Master&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Aplicando na prática
&lt;/h2&gt;

&lt;p&gt;Antes de aplicarmos o &lt;strong&gt;WAI-ARIA&lt;/strong&gt;, para que tudo faça sentido precisamos entender de forma prática a importância da semântica e ir muito além de simplesmente dizer que "&lt;code&gt;HTML&lt;/code&gt; semântico é o certo", sem um critério objetivo.&lt;/p&gt;

&lt;p&gt;Vamos começar com um simples componente de &lt;code&gt;toggle button&lt;/code&gt;, e para facilitar o exemplo vamos trabalhar apenas com &lt;code&gt;HTML&lt;/code&gt; + &lt;code&gt;CSS&lt;/code&gt; + &lt;code&gt;JS&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"toggle"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt; OFF &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"toggle__button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt; ON &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resultado:&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%2Fehjxkiryoydl01mv918q.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fehjxkiryoydl01mv918q.gif" alt="Exemplo de toggle button, sendo clicado e alternando o estado de clicado e não clicado" width="252" height="174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PS: O código completo desse exemplo, incluindo CSS e Javascript, pode ser acessado no &lt;a href="https://codepen.io/afonsopacifer/pen/dyEVmeJ" rel="noopener noreferrer"&gt;meu Codepen&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Conseguem perceber os graves problemas de semântica dessa botão? Não?&lt;/p&gt;

&lt;p&gt;Do ponto de vista de um usuário comum, o comportamento está bem claro e bem fácil de entender, mas a semântica não foi feita para um usuário "comum".&lt;/p&gt;

&lt;p&gt;A principal função da semântica no &lt;code&gt;HTML&lt;/code&gt; é ser interpretada por robôs, sejam mecanismos de busca (tentando entender sua página para rankea-la) ou leitores de tela (transcrevendo o conteúdo, iterações e estados para um usuário com deficiência visual).&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;WAI-ARIA&lt;/strong&gt; em especial é extremamente importante para adicionar significado para a interface através da semântica, afinal, entender que uma interface na web não é algo apenas visual, faz parte das bases para um pessoa verdadeiramente profissional em Front-End.&lt;/p&gt;

&lt;p&gt;Para ficar mais claro, vamos testar esse botão com um software leitor de tela e analisar os resultados:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/FfQu6iQwuNQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Como podemos perceber, o &lt;code&gt;toggle-button&lt;/code&gt; não indica o estado de &lt;code&gt;ON&lt;/code&gt; ou &lt;code&gt;OFF&lt;/code&gt;, em outras palavras, não sabemos se o botão está clicado ou não.&lt;/p&gt;

&lt;p&gt;Para corrigir isso, podemos adicionar a propriedade &lt;code&gt;aria-pressed&lt;/code&gt;, que tem como valores possíveis: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;true&lt;/code&gt;: para indicar que está "clicado".&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;false&lt;/code&gt;: indicando que "não esta clicado".&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mixed&lt;/code&gt;: para indicar que está entre os dois estados.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"toggle"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt; OFF &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"toggle__button"&lt;/span&gt; &lt;span class="na"&gt;aria-pressed=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt; ON &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resultado:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/w1-YzKW5MtQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Bem melhor, porém ainda temos um grave problema na experiência do usuário. Apesar do comportamento do botão estar claro, como não existe conteúdo de texto dentro do elemento &lt;code&gt;button&lt;/code&gt;, não é possível saber o que o botão faz, a única informação que o leitor de tela tem é um &lt;code&gt;toggle-button&lt;/code&gt; sem descrição.&lt;/p&gt;

&lt;p&gt;Vamos adicionar um &lt;code&gt;aria-label&lt;/code&gt; para resolver esse problema.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"toggle"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt; OFF &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt;
    &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"toggle__button"&lt;/span&gt;
    &lt;span class="na"&gt;aria-pressed=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt;
    &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"Alterna entre os modos ON e OFF"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt; ON &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resultado:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/fKK7igcqRmg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Ainda podemos ir além, caso o &lt;code&gt;toogle-button&lt;/code&gt; abra &lt;code&gt;dropdown&lt;/code&gt;, podemos vincular os componentes usando o atributo &lt;code&gt;aria-haspopup&lt;/code&gt;, e assim por diante.&lt;/p&gt;

&lt;p&gt;Na categoria &lt;strong&gt;States and Properties&lt;/strong&gt; (Estados e propriedades) do &lt;strong&gt;WAI-ARIA&lt;/strong&gt;, temos uma longa lista de atributos possíveis para adicionar semântica em nossas aplicações, recomendo a consultar a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes" rel="noopener noreferrer"&gt;lista completa na documentação da Mozilla Developer Network&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Indo além com &lt;code&gt;WAI-ARIA Roles&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Quando falamos em componentes, na maioria das vezes criamos elementos que não existem no &lt;code&gt;HTML&lt;/code&gt;, e mesmo quando existem, é bem comum ignorar o elemento nativo e criar um comportamento personalizado, como exemplo ignorar a tag &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;e criar um &lt;code&gt;modal&lt;/code&gt; do zero utilizando apenas &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;. Não há nada de errado com essa pratica, desde que deixe claro para o leitor de tela que o papel (em inglês: &lt;strong&gt;role&lt;/strong&gt;) daquela &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; é se comportar como &lt;code&gt;modal&lt;/code&gt;, ai entram os atributos da categoria &lt;strong&gt;WAI-ARIA Roles&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vamos nos aprofundar com um exemplo mais crítico
&lt;/h3&gt;

&lt;p&gt;Sabe quando utilizamos elementos semânticos do HTML para construir algo? Podemos, por exemplo, criar a estrutura de uma página da seguinte forma não semântica:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou seguindo um &lt;code&gt;HTML&lt;/code&gt; semântico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;header&amp;gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;section&amp;gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;section&amp;gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;footer&amp;gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Até aí tudo bem, aprendemos que devemos escrever de forma semântica e os motivos da sua importância. Mas e quando não encontramos uma tag &lt;code&gt;HTML&lt;/code&gt; perfeita para nossa necessidade? Ai entra o atributo &lt;code&gt;role&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Vamos ao exemplo de um alerta de erro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"snackbar-error"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Ouve um problema ao enviar sua solicitação
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parando para pensar com calma, entendemos que simplesmente jogar um alerta visual na tela não alerta um usuário de leitor de tela, certo?&lt;/p&gt;

&lt;p&gt;Para que o papel de alerta seja realizado corretamente pelo componente, precisamos adicionar esse papel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"snackbar-error"&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"alert"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Ouve um problema ao enviar sua solicitação
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma o leitor de tela avisa ao usuário que existe um alerta e lê a mensagem assim que o alerta for disparado ❤️.&lt;/p&gt;

&lt;p&gt;Mais uma vez eu recomendo consultar a lista completa de &lt;code&gt;roles&lt;/code&gt; na &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles" rel="noopener noreferrer"&gt;documentação da Mozilla Developer Network &lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como testar
&lt;/h2&gt;

&lt;p&gt;Nos exemplos acima, eu usei o leitor de tela chamado &lt;strong&gt;Voice Over&lt;/strong&gt;, que já vem instalado por padrão nos computadores com sistema operacional &lt;strong&gt;macOS&lt;/strong&gt;, mas obviamente existem leitores de tela para &lt;strong&gt;Windows&lt;/strong&gt;, &lt;strong&gt;Linux&lt;/strong&gt;, &lt;strong&gt;Android&lt;/strong&gt;, etc... Recomendo pesquisar, instalar e aprender bem a usar ao menos um leitor de tela, afinal, seria no mínimo estranho projetar interfaces visuais sem monitor, logo, pensar em semântica sem se quer testar o que você esta fazendo, beira o absurdo! (desculpem a falta de decoro, me exaltei rsrsrs).&lt;/p&gt;

&lt;h2&gt;
  
  
  Dicas de especialista
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Na hora de criar um componente, não pule etapas por achar que &lt;code&gt;HTML&lt;/code&gt; é simples. Planeje a semântica, pesquise e teste.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Durante sua analise de requisitos, crie uma tarefa para pesquisar e construir a semântica do componente antes mesmo de começar a trabalhar no &lt;code&gt;CSS&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tente &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/button_role" rel="noopener noreferrer"&gt;recriar um botão sem usar a tag &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;&lt;/a&gt;, o aprendizado vai trazer bons insights, confia.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Lembre-se! Se você se considera uma pessoa boa com &lt;code&gt;HTML&lt;/code&gt;, mas nunca abriu um leitor de tela, repense, saber como o &lt;code&gt;HTML&lt;/code&gt; funciona e ser profissional são coisas diferentes.&lt;/p&gt;

&lt;p&gt;Ah, se você gostou do conteúdo e quer que essa série continue, comente com um feedback e compartilhe com seus amigos Devs.&lt;/p&gt;

&lt;p&gt;E claro! Me siga para mais dicas 😎:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://afonsopacifer.github.io" rel="noopener noreferrer"&gt;Meu site pessoal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/afonsopacifer" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/afonsopacifer" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/afonsopacifer/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.instagram.com/afonsopacifer/" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obrigado por ler e te vejo na próxima ❤️.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>a11y</category>
      <category>webdev</category>
      <category>html</category>
    </item>
    <item>
      <title>5 ideas for personal projects using vanilla javascript</title>
      <dc:creator>Afonso Pacifer</dc:creator>
      <pubDate>Wed, 02 Sep 2020 20:58:03 +0000</pubDate>
      <link>https://dev.to/afonsopacifer/5-ideas-for-personal-projects-using-vanilla-javascript-1p2m</link>
      <guid>https://dev.to/afonsopacifer/5-ideas-for-personal-projects-using-vanilla-javascript-1p2m</guid>
      <description>&lt;p&gt;Building personal projects is one of the must-have habits for any developer, but a big question appears for many developers that make the process stop: &lt;strong&gt;What project am I going to do?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your objective is to create a new personal project to improve your technical skills, the project doesn't have to change the world or be useful to other people. Your project needs to change your world of possibilities and be useful to your technical background improvement.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Spend time thinking in names or other side things that don't help you to improve your skills. &lt;/p&gt;

&lt;p&gt;For tips and tricks, I recommend my last blog post about: &lt;a href="https://dev.to/afonsopacifer/how-you-can-stay-motivated-to-work-on-personal-projects-565a"&gt;How you can stay motivated to work in personal projects.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Cool ideas
&lt;/h1&gt;

&lt;p&gt;Okay, let me show you some ideas for cool projects you can do with pure javascript to improve your technical skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  A web framework for creating Back-End API's
&lt;/h2&gt;

&lt;p&gt;Start an HTTP server, handle all request types, and send the correct response to the client.&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%2Fi%2F0dvo9ckjy9hvnmyevnw2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0dvo9ckjy9hvnmyevnw2.jpg" alt="Alt Text" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is good for learning how the Node.js works with &lt;strong&gt;web applications under the hoods.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A front-end Single Page App
&lt;/h2&gt;

&lt;p&gt;Fetch and replace a piece of code, recreate the browser workflow using the history API and improve the application performance.&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%2Fi%2F08jr9xufjreuycapvn9g.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F08jr9xufjreuycapvn9g.jpg" alt="Alt Text" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is good for understanding the &lt;strong&gt;default browser experience.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A Command Line Tool (CLI) to control your GitHub account
&lt;/h2&gt;

&lt;p&gt;Run your application only in the CLI, add parameters for fetch data from Github API and show them.&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%2Fi%2Ftq0anqc7honz6xkmfsuw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftq0anqc7honz6xkmfsuw.jpg" alt="Alt Text" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is good for learning how the Node.js works without a web server and how to &lt;strong&gt;integrate it with the operational system.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A Chrome extension boilerplate
&lt;/h2&gt;

&lt;p&gt;Create a chrome extension is cool, but the answer for: What extension should I create? Is hard. &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%2Fi%2F6at8nwcuzzwclat8557x.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6at8nwcuzzwclat8557x.jpg" alt="Alt Text" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My tip? Create a todo app and extract the core files and concepts to a new repository. When you have an idea, reuse the boilerplate and save time.&lt;/p&gt;

&lt;p&gt;This is good for learning about &lt;strong&gt;DOM.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A Github Chat Bot
&lt;/h2&gt;

&lt;p&gt;Handle inputs, process your data, and respond like a real user.&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%2Fi%2Fivq8t541x2516e62i12n.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fivq8t541x2516e62i12n.jpg" alt="Alt Text" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is good for understanding &lt;strong&gt;APIs integrations.&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  The gold rule
&lt;/h1&gt;

&lt;p&gt;At this point, you may be probably asking yourself: &lt;strong&gt;What do I need to learn to start any of these projects?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Enjoy all content created by the javascript community around the world. Search for: "How you create a &lt;em&gt;[complete here]&lt;/em&gt;", open 2 or 3 tabs in your browser, read/watch and just start the code.&lt;/p&gt;

&lt;p&gt;Follow the tutorials to get started! When you become more confident, implement your ideas.&lt;/p&gt;

&lt;h1&gt;
  
  
  The real gold rule
&lt;/h1&gt;

&lt;p&gt;If you can't understand anything in your search, don't worry, &lt;strong&gt;you probably need to take a step back and learn the basics.&lt;/strong&gt; It's normal for developers at all levels. If you feel lost when learning any new content, don't give up. Keep calm, ask the community and restart.&lt;/p&gt;

&lt;p&gt;I found a list of resources to help you when creating the projects suggested in this post:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/itnext/how-you-can-build-your-own-web-framework-for-node-js-19e3"&gt;How you can build your own web framework for Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.jeremylikness.com/blog/build-a-spa-site-with-vanillajs/" rel="noopener noreferrer"&gt;Build a Single Page Application (SPA) Site With Vanilla.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/dendekky/how-to-build-a-command-line-tool-with-nodejs-a-step-by-step-guide-386k"&gt;How to build a command line tool with nodejs a step by step guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.chrome.com/extensions/getstarted" rel="noopener noreferrer"&gt;Extend the Browser: Getting Started Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.smashingmagazine.com/2016/10/how-to-develop-a-chat-bot-with-node-js/" rel="noopener noreferrer"&gt;How To Develop A Chat Bot With Node.js&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;The real value in the process of creating personal projects is priceless but don't feel bad if you can't spend time working on side projects. Take your time, learn the most you can. If you keep studying, the same amount of time you spend on reading articles, you’ll be able to use it to code your own projects. Keep calm and keep studying.&lt;/p&gt;

&lt;p&gt;If you liked this content, follow me on &lt;a href="https://github.com/afonsopacifer" rel="noopener noreferrer"&gt;Github&lt;/a&gt; and/or &lt;a href="https://twitter.com/afonsopacifer" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; 💛.&lt;/p&gt;

&lt;p&gt;Cheers.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How you can stay motivated to work on personal projects</title>
      <dc:creator>Afonso Pacifer</dc:creator>
      <pubDate>Mon, 17 Aug 2020 14:33:30 +0000</pubDate>
      <link>https://dev.to/afonsopacifer/how-you-can-stay-motivated-to-work-on-personal-projects-565a</link>
      <guid>https://dev.to/afonsopacifer/how-you-can-stay-motivated-to-work-on-personal-projects-565a</guid>
      <description>&lt;p&gt;After my last post (&lt;a href="https://dev.to/afonsopacifer/how-i-became-a-senior-javascript-developer-with-personal-projects-1lpo"&gt;How I became a senior javascript developer with personal projects&lt;/a&gt;), I received a good question that got me thinking: &lt;/p&gt;

&lt;h1&gt;
  
  
  What keeps you motivated?
&lt;/h1&gt;

&lt;p&gt;I believe this is a simple but deep question. Many people start new side projects and get very excited at the beginning, but after a few days, the energy is gone. WTF happen?&lt;/p&gt;

&lt;p&gt;Recently I’ve read an excellent book called &lt;a href="https://14habits.com/" rel="noopener noreferrer"&gt;14 Habits of Highly Productive Developers&lt;/a&gt; (by my friend &lt;a href="https://twitter.com/zenorocha" rel="noopener noreferrer"&gt;Zeno Rocha&lt;/a&gt;)  which has a complete discussion about the side projects’ topic. I recommend all developers to read the entire book. But, in this blog post, I’ll try to explain how I’m still motivated by my personal projects in the last years. Starting by demystifying an idea.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I don't complete all of my side projects!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yes, you read correctly. &lt;strong&gt;I have many unfinished side projects in my Github account and everything is fine&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The process is the same:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First: I have an awesome idea (in my mind).&lt;/li&gt;
&lt;li&gt;Second: I create a repository and start the project in my code editor.&lt;/li&gt;
&lt;li&gt;Third: I abandon the project.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Tips to complete your side project
&lt;/h1&gt;

&lt;p&gt;I have a list of private empty repositories, &lt;strong&gt;but I also have a list of projects that are done.&lt;/strong&gt; If you have more drafts (or ideas) than finished projects, I have some tips that may help you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Think hard if you really want to do a project
&lt;/h2&gt;

&lt;p&gt;During the first moments after an idea, you are full of motivation, but how do you know if this motivation will exist tomorrow? Simple, wait for tomorrow! If you still want to work on the new project, just START.&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%2Fi%2Faycurl2iy19sfdqd2zv9.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%2Fi%2Faycurl2iy19sfdqd2zv9.PNG" alt="Pomodoro timer" width="555" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I create a &lt;a href="https://afonsopacifer.github.io/vue-meditation/" rel="noopener noreferrer"&gt;Meditation Timer&lt;/a&gt; to keep calm before important decision moments (and learning Vue.js better).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; If you have energy and time, enjoy the moment and do it. Only wait for tomorrow if the project scope is large!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Create a checklist and follow it
&lt;/h2&gt;

&lt;p&gt;Don't spend time/energy thinking or trying to remember common things for all projects. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If your project needs a Readme, take note.&lt;/li&gt;
&lt;li&gt;If your project needs to publish in npm (or similar package registry), take note.&lt;/li&gt;
&lt;li&gt;If your project needs a .gitignore file, take note. And etc...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fw5m9mqpkybevn9i5w645.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%2Fi%2Fw5m9mqpkybevn9i5w645.PNG" alt="checklist for open source projects" width="792" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My &lt;a href="http://afonsopacifer.github.io/open-source-checklist/" rel="noopener noreferrer"&gt;checklist for open source projects&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; If your project needs a cool name, use a beta name, and rename when you decide it, don't spend time overthinking the name instead of starting the project.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Have a generic boilerplate
&lt;/h2&gt;

&lt;p&gt;Don't spend time/energy creating the same files all time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Get ideas from your old projects or ask your friends: &lt;strong&gt;how files are commons in all projects.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yes, creating a boilerplate is a cool first project for you to start.&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%2Fi%2Fmgva700i2gcy3k7cblby.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%2Fi%2Fmgva700i2gcy3k7cblby.PNG" alt="My boilerplate to open source projects" width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My &lt;a href="https://github.com/afonsopacifer/open-source-boilerplate" rel="noopener noreferrer"&gt;generic boilerplate&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Don't try to learn more than one new technology at the same time
&lt;/h2&gt;

&lt;p&gt;Starting a new project for learning a new technology is the best decision you can make. But you need to consider the learning curve for any new thing you want to implement. &lt;strong&gt;If you add multiple learning curves in your project, you’ll probably spend more time on the project and increase your chances to be demotivated&lt;/strong&gt; due to all problems related to the learning process.&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%2Fi%2F38xdbqd7z28mlabmmcbf.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%2Fi%2F38xdbqd7z28mlabmmcbf.PNG" alt="My incomplete calendar project" width="675" height="785"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I don't conclude this &lt;a href="https://github.com/afonsopacifer/react-calendar" rel="noopener noreferrer"&gt;calendar&lt;/a&gt; project because I try to learn (and implement) a lot of new technologies at the same time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Dedicate time (with quality) to your project
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Don't wait for the inspiration moment&lt;/strong&gt;, organize your time to work in your project as if it was your main job. Turn off all notifications and previously select an inspirational playlist to help you focus.&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%2Fi%2F0ldn7ewf3p6miwe0h703.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%2Fi%2F0ldn7ewf3p6miwe0h703.PNG" alt="Pomodoro timer" width="700" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I created a &lt;a href="http://afonsopacifer.github.io/react-pomodoro/" rel="noopener noreferrer"&gt;Pomodoro Timer&lt;/a&gt; for you to focus on your tasks (and learning React.js better).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Define a scope for the project and follow it
&lt;/h2&gt;

&lt;p&gt;In my previous blog post, I shared big projects, but this project was created for one year. Within this period, I worked in a lot of small projects and &lt;strong&gt;the most powerful trick for all size projects is to determine a scope of features and follow them&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqi5civtglaoemr22c45q.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqi5civtglaoemr22c45q.jpg" alt="Kanban board" width="800" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During the working, if you have a new incredible idea, take note and get back to the scope. Believe me, big companies have problems when spending more energy than necessary on their MVPs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Share
&lt;/h2&gt;

&lt;p&gt;Post your project on twitter, Instagram, Facebook, write a blog post about the process or share with a friend.&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%2Fi%2Fz4eq0n4ht7smb52cwum8.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%2Fi%2Fz4eq0n4ht7smb52cwum8.PNG" alt="Afonso Pacifer Github profile" width="800" height="612"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My &lt;a href="https://github.com/afonsopacifer/" rel="noopener noreferrer"&gt;personal Github profile&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don't worry about possible critics about your code, serious developers will help you, not attack you. Share your project and grow with the comments.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;To be exposed to new challenges is scary, but great rewards await for people who can take great steps. &lt;strong&gt;Creating and sharing your side projects are one of the greatest steps in a developer career&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I'm from Brazil and in my country &lt;strong&gt;&lt;a href="https://www.terra.com.br/noticias/dino/95-da-populacao-brasileira-nao-fala-ingles,9f848f68ed451de99742216570b7ccf9gc7gj8du.html#:~:text=Pa%C3%ADs%20ocupa%20a%2041%C2%AA%20posi%C3%A7%C3%A3o%20num%20ranking%20de%2070%20pa%C3%ADses&amp;amp;text=De%20acordo%20com%20levantamento%20feito,apresenta%20algum%20grau%20de%20flu%C3%AAncia." rel="noopener noreferrer"&gt;only 5% of the population speak English&lt;/a&gt;&lt;/strong&gt; (The official Brazilian language is Portuguese), and I was always part of the 95%.&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%2Fi%2F6g3zjookf8onjxnwzazz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6g3zjookf8onjxnwzazz.jpg" alt="Afonso Pacifer studying with your cat" width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Writing in English is hard for me, but this is my new side project: to improve my English skills to meet new people and friends around the world!&lt;/p&gt;

&lt;p&gt;Now, I'll share some of the places where people were reached by my first English blog post a week ago:&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%2Fi%2Farhd9ifbuasxhep33plt.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%2Fi%2Farhd9ifbuasxhep33plt.png" alt="World map" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I received many responses, I couldn't compile all the places on this map! Thanks a lot 💛.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I cannot express my emotion when I see this result after my effort to learn English.&lt;/p&gt;

&lt;p&gt;Remember, &lt;strong&gt;open source is not only about sharing code but is also about sharing experiences and solutions for different people regardless of the nationality or the background!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thanks a lot for reading my second English blog post.&lt;/p&gt;

&lt;p&gt;If you liked this content, follow me on &lt;a href="https://github.com/afonsopacifer" rel="noopener noreferrer"&gt;Github&lt;/a&gt; and/or &lt;a href="https://twitter.com/afonsopacifer" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; 💜.&lt;/p&gt;

&lt;p&gt;Cheers.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>career</category>
      <category>javascript</category>
      <category>motivation</category>
    </item>
    <item>
      <title>How I became a senior javascript developer with personal projects</title>
      <dc:creator>Afonso Pacifer</dc:creator>
      <pubDate>Mon, 10 Aug 2020 20:39:48 +0000</pubDate>
      <link>https://dev.to/afonsopacifer/how-i-became-a-senior-javascript-developer-with-personal-projects-1lpo</link>
      <guid>https://dev.to/afonsopacifer/how-i-became-a-senior-javascript-developer-with-personal-projects-1lpo</guid>
      <description>&lt;h1&gt;
  
  
  Everything can be summed up in short words
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;One of the best decisions in my developer career was to go beyond just using tools.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I decided to create my tools, not for commercial propose,  but to know how these technologies actually work and to improve my tech skills.&lt;/p&gt;

&lt;p&gt;This is a short story about how this decision changed my life.&lt;/p&gt;

&lt;h1&gt;
  
  
  My first big challenge with a personal project
&lt;/h1&gt;

&lt;p&gt;I've always been the &lt;code&gt;CSS&lt;/code&gt; guy. In 2015 my passion for &lt;code&gt;CSS&lt;/code&gt; took me quickly to the status of "reference" in my country (Brazil).&lt;/p&gt;

&lt;p&gt;At this time, inspired by my friend &lt;a href="https://twitter.com/raphamorims" rel="noopener noreferrer"&gt;Raphael Amorim&lt;/a&gt;, I accepted the &lt;a href="https://johnresig.com/blog/write-code-every-day/" rel="noopener noreferrer"&gt;Write Code Every Day&lt;/a&gt; challenge. Basically I worked in open source projects every day for 1 year.&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%2Fi%2F2r37mihqnipgsx4hejzw.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%2Fi%2F2r37mihqnipgsx4hejzw.png" alt="My github profile with 367 days of coding" width="800" height="710"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Okay, but in my first days of coding, my &lt;code&gt;javaScript&lt;/code&gt; skills were &lt;strong&gt;extremely&lt;/strong&gt; limited. &lt;/p&gt;

&lt;p&gt;Everything has changed when I received an invite to talk in &lt;a href="https://www.youtube.com/watch?v=5g-ydL4KZMc" rel="noopener noreferrer"&gt;Front in Valle&lt;/a&gt; (a big front-end conference in my country) that I could talk about any topic. So I had an idea as naive as it was brilliant. &lt;strong&gt;I decided to learn about &lt;code&gt;javascript&lt;/code&gt; creating my own &lt;code&gt;CSS preprocessor&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Banana CSS
&lt;/h2&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%2Fi%2Fnjdulos136yc1jjsykn4.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%2Fi%2Fnjdulos136yc1jjsykn4.png" alt="Banana CSS logo" width="200" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🍌 &lt;em&gt;The Brazilian CSS superset.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In 2016 I created the &lt;code&gt;CSS preprocessor&lt;/code&gt; called &lt;code&gt;banana CSS&lt;/code&gt;, the objective of this project was to learn &lt;code&gt;javascript&lt;/code&gt;, but I ended up learning about &lt;code&gt;Node.js&lt;/code&gt;, how to &lt;code&gt;creating CLIs&lt;/code&gt;, &lt;code&gt;lint&lt;/code&gt;, &lt;code&gt;unit tests&lt;/code&gt;, &lt;code&gt;JSDocs&lt;/code&gt;, &lt;code&gt;continuous integration&lt;/code&gt;, &lt;code&gt;data structures&lt;/code&gt;, &lt;code&gt;AST&lt;/code&gt;, how to create &lt;code&gt;gulp&lt;/code&gt; plugins, and more.&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%2Fi%2Ff57rgq1096ahhd0fb7vg.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ff57rgq1096ahhd0fb7vg.gif" alt="Preprocessor example with flexbox" width="800" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/bananacss" rel="noopener noreferrer"&gt;Link to Banana CSS project.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Going deep in front-end development.
&lt;/h1&gt;

&lt;p&gt;Okay, at this point I felt the necessity to learn more about &lt;code&gt;javascript&lt;/code&gt; in the browser, so &lt;strong&gt;I thought about the main tool I daily use&lt;/strong&gt; and came to the conclusion that it was &lt;code&gt;React.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So...&lt;/p&gt;

&lt;h2&gt;
  
  
  millenium.js
&lt;/h2&gt;

&lt;p&gt;In 2017 I created a project called &lt;code&gt;millenium.js&lt;/code&gt;, the description for this project is:&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%2Fi%2F92ekq9updioatb4osqo2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F92ekq9updioatb4osqo2.jpg" alt="millenium.js logo" width="200" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A &lt;code&gt;javascript&lt;/code&gt; library for creating Functional Stateless Components and render with &lt;code&gt;Virtual DOM&lt;/code&gt;. Ideal for creating ultra-light and fast applications with &lt;code&gt;Redux&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or my favorite description:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🚀 &lt;em&gt;Render your &lt;code&gt;front-end&lt;/code&gt; in less than 12 parsecs.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this project, I learned about performance, good practices for creating &lt;code&gt;front-end&lt;/code&gt; libraries, &lt;code&gt;algorithms&lt;/code&gt;, &lt;code&gt;JSX&lt;/code&gt;, and more. Of course, I kept all the good practices from the old projects.&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%2Fi%2Ff2etjyj6x057q5934kus.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ff2etjyj6x057q5934kus.gif" alt="Example with Redux" width="1008" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See an &lt;a href="https://millenniumjs.github.io/millennium-redux-boilerplate/" rel="noopener noreferrer"&gt;online DEMO with Redux&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/millenniumjs" rel="noopener noreferrer"&gt;Link to millennium.js project.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Using my passions to explore new things
&lt;/h1&gt;

&lt;p&gt;In 2018, after I watched the &lt;a href="https://pt.wikipedia.org/wiki/Ready_Player_One_(filme)" rel="noopener noreferrer"&gt;Ready Player One&lt;/a&gt; movie, I left the movie theater determined to create a game with &lt;code&gt;javascript&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Creating a game with &lt;code&gt;javascript&lt;/code&gt; is relatively simple, you can choose among a lot of tools, read the docs, experiment, and it’s done.&lt;/p&gt;

&lt;p&gt;But, the natural decision (for me) was: &lt;strong&gt;Creating a new tool for creating games&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For this project, I decided to define some funny rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don't use &lt;code&gt;Canvas&lt;/code&gt;/&lt;code&gt;WebGL&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use only &lt;code&gt;CSS&lt;/code&gt; to render animations.&lt;/li&gt;
&lt;li&gt;Write a functional code.&lt;/li&gt;
&lt;li&gt;Try to write the maximum of &lt;code&gt;isomorphic&lt;/code&gt;/&lt;code&gt;universal&lt;/code&gt; code as possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  burnout.js
&lt;/h2&gt;

&lt;p&gt;Finally, I created the &lt;code&gt;burnout.js&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%2Fi%2Fzd0ahwgx9pi0yos3z48p.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%2Fi%2Fzd0ahwgx9pi0yos3z48p.png" alt="burnout.js logo" width="500" height="141"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🎮 &lt;em&gt;The 2D game engine for manage collisions.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this project, I learned more about &lt;code&gt;functional programming&lt;/code&gt;, &lt;code&gt;DOM&lt;/code&gt; performance, &lt;code&gt;algorithms&lt;/code&gt; (for calculating the elements collisions), and much more.&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%2Fi%2Fquoqr0n6h1ydboibxyld.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fquoqr0n6h1ydboibxyld.gif" alt="Game example" width="440" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/burnoutjs" rel="noopener noreferrer"&gt;Link to burnout.js project.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Again, of course, I kept all good practices like &lt;code&gt;unit tests&lt;/code&gt;, &lt;code&gt;unit tests&lt;/code&gt;, &lt;code&gt;unit tests&lt;/code&gt;, hum...&lt;/p&gt;

&lt;h1&gt;
  
  
  Triggers for projects from projects
&lt;/h1&gt;

&lt;p&gt;At this point, I had a revelation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OMG, why did I never think of creating my automated testing tool?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So...&lt;/p&gt;

&lt;h2&gt;
  
  
  N.O.M.s
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;🔮 &lt;em&gt;Universal/isomorphic javascript unit tests for witches.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While working on &lt;code&gt;burnout.js&lt;/code&gt; I built the &lt;code&gt;N.O.M.s&lt;/code&gt; (my testing tool) and wrote &lt;a href="https://github.com/burnoutjs/burnoutjs/tree/master/tests" rel="noopener noreferrer"&gt;100% of the &lt;code&gt;burnout.js&lt;/code&gt; &lt;code&gt;unit tests&lt;/code&gt; using the &lt;code&gt;N.O.M.s&lt;/code&gt; library&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What were the goals of creating my test library?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It should work in the browser and &lt;code&gt;Node.js&lt;/code&gt; (&lt;code&gt;isomorphic&lt;/code&gt;/&lt;code&gt;universal&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Create all assertions in pure &lt;code&gt;Javascript&lt;/code&gt; (not using browser &lt;code&gt;APIs&lt;/code&gt; or &lt;code&gt;Node.js&lt;/code&gt; modules).&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;Emojis&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Don't use a custom &lt;code&gt;CLI&lt;/code&gt; for run tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5z5kjg8255i2jbi23pwt.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5z5kjg8255i2jbi23pwt.gif" alt="Unit test example" width="774" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Curiosity: I used mocha to write the &lt;code&gt;N.O.M.s&lt;/code&gt; unit tests. Ironic but funny 😅!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/afonsopacifer/nomsjs" rel="noopener noreferrer"&gt;Link to N.O.M.s project.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Was it worth reinventing the wheel?
&lt;/h1&gt;

&lt;p&gt;After these personal projects (and &lt;a href="https://github.com/afonsopacifer?tab=repositories" rel="noopener noreferrer"&gt;a lot of others&lt;/a&gt;), in 2019/2020 I spend my time working on corporate products, creating complex Front-End applications, and leading a &lt;code&gt;full-stack&lt;/code&gt; development team.&lt;/p&gt;

&lt;p&gt;For my surprise, in the last years of open source development, I’ve improved my technical level a lot and I had no problems with implementing complex architectures using &lt;code&gt;React.JS&lt;/code&gt;, &lt;code&gt;immutable.js&lt;/code&gt;, &lt;code&gt;web components&lt;/code&gt;, &lt;code&gt;flux&lt;/code&gt;, &lt;code&gt;tests&lt;/code&gt;, &lt;code&gt;PRPL pattern&lt;/code&gt;, &lt;code&gt;back-end APIs&lt;/code&gt; (&lt;code&gt;node.JS&lt;/code&gt;/&lt;code&gt;python&lt;/code&gt;), &lt;code&gt;MongoDB&lt;/code&gt;, and a lot of tools/good practices for web applications!&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;I finish this blog post complementing the first paragraph:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One of the best decisions in my developer career was to go beyond just using tools, &lt;strong&gt;I decided to create them&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thanks a lot for reading my first English blog post.&lt;/p&gt;

&lt;p&gt;If you liked this content, follow me on &lt;a href="https://github.com/afonsopacifer" rel="noopener noreferrer"&gt;Github&lt;/a&gt; and/or &lt;a href="https://twitter.com/afonsopacifer" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; 💜.&lt;/p&gt;

&lt;p&gt;Cheers.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>career</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Arquitetura para aplicações REST com express (node.js) #01: Cada escolha uma renúncia</title>
      <dc:creator>Afonso Pacifer</dc:creator>
      <pubDate>Wed, 19 Feb 2020 21:22:40 +0000</pubDate>
      <link>https://dev.to/afonsopacifer/arquitetura-para-aplicacoes-rest-com-express-node-js-01-cada-escolha-uma-renuncia-21e4</link>
      <guid>https://dev.to/afonsopacifer/arquitetura-para-aplicacoes-rest-com-express-node-js-01-cada-escolha-uma-renuncia-21e4</guid>
      <description>&lt;p&gt;Iniciar um projeto de &lt;code&gt;API REST&lt;/code&gt; usando &lt;code&gt;Node.js&lt;/code&gt; geralmente é algo rápido e relativamente fácil. Você escolhe um framework, lê um artigo e mete bronca no &lt;code&gt;hello world&lt;/code&gt;. Simples assim 👍.&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%2Fchbpwwashhynzr4q9jmf.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fchbpwwashhynzr4q9jmf.gif" alt="Feliz" width="480" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Porém, algo não muito difundido no mundo "javascripteiro" do &lt;code&gt;Node.js&lt;/code&gt; é que, ao escolher um framework para trabalhar você meio que escolhe automaticamente uma filosofia de arquitetura para seguir. Mesmo que, no caso do &lt;code&gt;Express&lt;/code&gt;, a escolha seja não ter arquitetura 👀.&lt;/p&gt;

&lt;p&gt;É complicado entender a necessidade de algo que não temos, nunca vimos ou ouvimos falar. Para termos o que comparar, vou apresentar um conceito que é um dos pilares do famoso e super desenvolvido &lt;code&gt;Ruby on Rails&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Convenção sobre configuração
&lt;/h2&gt;

&lt;p&gt;Por definição:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Convenção sobre configuração ou programação por convenção (do inglês &lt;code&gt;Convention over configuration - CoC&lt;/code&gt;) é um modelo de desenvolvimento de software que busca &lt;em&gt;diminuir o número de decisões&lt;/em&gt; que os desenvolvedores precisam tomar. Visa ganhar simplicidade sem perder flexibilidade.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fonte: &lt;a href="https://pt.wikipedia.org/wiki/Conven%C3%A7%C3%A3o_sobre_configura%C3%A7%C3%A3o" rel="noopener noreferrer"&gt;wikipedia&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Aplicação do conceito no mundo Rails
&lt;/h2&gt;

&lt;p&gt;Diferente do processo padrão (que você aprende em tutoriais pela internet a fora), para iniciar uma &lt;code&gt;API&lt;/code&gt; usando &lt;code&gt;Express&lt;/code&gt;, ao iniciar um projeto usando &lt;code&gt;Ruby on Rails&lt;/code&gt; você roda a ferramenta de linha de comando e faz &lt;code&gt;scaffolding&lt;/code&gt; da base do projeto. Onde já temos toda a estrutura de pastas, padrões de nomenclatura e comunicação entre módulos pré definidos pelo framework:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rails new projeto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;OBS: O exemplo abaixo é um resumo simplificado da estrutura do &lt;code&gt;Rails&lt;/code&gt;. Para uma explicação melhor consulte a &lt;a href="https://guides.rubyonrails.org/getting_started.html" rel="noopener noreferrer"&gt;documentação oficial&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── app/
|  ├-- assets/
|  ├── controllers/
|  ├── helpers/
|  ├── mailers/
|  ├── models/
|  └── views/
├── bin/
├── config/
├── db/
├── public/
├── test/
├── tmp/
├── vendor/
└── assets/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Isso traz algumas vantagens e desvantagens:&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens
&lt;/h3&gt;

&lt;p&gt;Como descrito na definição do conceito, ao ter uma arquitetura pré definida, o desenvolvedor não gasta seu tempo e energia decidindo coisas que não influenciam nas regras de negócio do projeto. Ou seja... Você consegue focar "no que importa" e ganha de brinde uma ótima arquitetura, testada por milhares de pessoas e amplamente documentada.&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo da vida real
&lt;/h4&gt;

&lt;p&gt;Imagine que você estude &lt;code&gt;Ruby on Rails&lt;/code&gt; por cerca de 1 ano. Após esse período você inicia em um trabalho novo onde sua tarefa é ajudar no produto da empresa (que usa &lt;code&gt;Ruby on Rails&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Eu garanto que, em poucos minutos, você consegue (a partir do seu conhecimento prévio) saber exatamente o que cada tipo de arquivo faz, como estão organizados e cada comando para executar o projeto.&lt;/p&gt;

&lt;p&gt;Nesse cenário, você consegue "pular" a etapa de entender o projeto e consegue partir para uma entrega de valor em um tempo bem curto.&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%2Fo8sadkqwlyy3gzsi94gq.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo8sadkqwlyy3gzsi94gq.gif" alt="Eu gosto disso" width="480" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Desvantagens
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Posso ser radical e dizer coisas como:
&lt;/h4&gt;

&lt;p&gt;Em regimes ditatoriais é tirado o poder de escolha da população em prol de coisas como sua segurança e eficiência 👎.&lt;/p&gt;

&lt;p&gt;Na China, por exemplo, a população escolheu abrir mão da própria "liberdade" em favor da segurança. Isso é uma boa troca? Para nosso caso é irrelevante! Mas entender que tirar o poder de escolha de alguém em prol de um ganho qualquer, sempre gera uma troca. Se vale a pena adotar essa escolha, só você pode responder 😱.&lt;/p&gt;

&lt;h4&gt;
  
  
  Sendo mais amigável posso dizer coisas como:
&lt;/h4&gt;

&lt;p&gt;A partir do momento em que você aceita usar uma arquitetura pré pronta, você aceita uma listinha de desvantagens que vem junto. Temos como a mais notável a seguinte afirmação:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cada projeto é um projeto, assumir que a mesma fórmula atende todos os casos é no mínimo &lt;em&gt;ingenuidade&lt;/em&gt; 😑.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  E o Express com isso?
&lt;/h2&gt;

&lt;p&gt;Basicamente aprendemos a criar uma &lt;code&gt;API&lt;/code&gt; de forma muito simples em um único arquivo ou, no máximo, com dois ou três tipos de arquivos (geralmente seguindo um &lt;code&gt;MVC&lt;/code&gt;) que nos apresenta à uma filosofia totalmente oposta à escolhida pelo &lt;code&gt;Rails&lt;/code&gt;. Finalmente lhes apresento o que torna a curva de aprendizado do &lt;code&gt;Express&lt;/code&gt; tão interessante:&lt;/p&gt;

&lt;p&gt;Definição do &lt;code&gt;Express&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Express is a &lt;em&gt;minimal and flexible&lt;/em&gt; &lt;code&gt;Node.js&lt;/code&gt; web application framework that provides a robust set of features for web and mobile applications.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;fonte: &lt;a href="https://expressjs.com/" rel="noopener noreferrer"&gt;expressjs.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ou seja,&lt;/p&gt;

&lt;p&gt;Aqui temos um framework totalmente &lt;strong&gt;flexível, que permite e estimula que o desenvolvedor crie e implemente&lt;/strong&gt; sua própria arquitetura. Não importa o tamanho ou objetivo do projeto, você tem as ferramentas para organizar seu projeto da forma que melhor te atende.&lt;/p&gt;

&lt;p&gt;Instale o Express:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;express
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crie um arquivo &lt;code&gt;index.js&lt;/code&gt;:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&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="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello World!&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Example app listening on port 3000!&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute o projeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;node index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, temos uma &lt;code&gt;API&lt;/code&gt; rodando plenamente.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;OBS: Existe &lt;a href="https://expressjs.com/pt-br/starter/generator.html" rel="noopener noreferrer"&gt;uma ferramenta de linha de comando&lt;/a&gt; que faz &lt;code&gt;scaffolding&lt;/code&gt; no &lt;code&gt;Express&lt;/code&gt;, porém ela não é focada em &lt;code&gt;APIs&lt;/code&gt; e quase não é utilizada.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Com &lt;code&gt;Express&lt;/code&gt; você tem o poder de fazer do seu jeito. Isso é incrível! Mas é aqui que mora o principal problema:&lt;/p&gt;

&lt;h3&gt;
  
  
  Desvantagens
&lt;/h3&gt;

&lt;p&gt;Ter o poder de fazer as coisas do seu jeito, pode ser lido como: "Ter o poder de fazer merda" 💩.&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%2Fq7twr0064r2r28rve506.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7twr0064r2r28rve506.gif" alt="Fazendo besteira" width="224" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sim, é isso mesmo que você leu, a partir do momento em que você não delegou o trabalho de arquitetura para alguém que sabe o que está fazendo (mesmo que no caso do &lt;code&gt;Rails&lt;/code&gt; tentando ser genérico para atender a todos os casos), fica muito fácil construir uma aplicação sem levar em consideração vários aspectos estruturais que são extremamente importantes. Principalmente se você pretende dar manutenção no projeto a longo prazo e em equipe.&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo da vida real:
&lt;/h4&gt;

&lt;p&gt;Imagine que você estude &lt;code&gt;Express&lt;/code&gt; por cerca de 1 ano, após esse período, você inicia em um trabalho novo onde sua tarefa é ajudar no produto da empresa (que usa &lt;code&gt;Express&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Eu garanto que o projeto está organizado de forma diferente do que você fez durante seus estudos, o que aumenta muito a curva de aprendizado para entregar algo de valor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens
&lt;/h3&gt;

&lt;p&gt;Obviamente, se você entende do que está fazendo, o poder de construir uma aplicação da forma que quiser é extremamente eficiente. É possível criar verdadeiras obras de arte em forma de arquitetura que vão poupar muitas horas e "dinheiros" a longo prazo. Isso inclui uma boa documentação, o que vai diminuir muito a curva de aprendizado de alguém novo no projeto, mitigando a principal desvantagem de um arquitetura "personalizada" 💚.&lt;/p&gt;

&lt;p&gt;Claramente esse processo não é trivial, o que nos leva ao próximo tópico:&lt;/p&gt;

&lt;h2&gt;
  
  
  Requisitos
&lt;/h2&gt;

&lt;p&gt;Chegamos à conclusão de que precisamos estudar bastante para entender o que estamos fazendo a nível de arquitetura.&lt;/p&gt;

&lt;p&gt;Para criar um projeto que atende aos requisitos estruturais de uma boa arquitetura, primeiro precisamos saber quais são esses requisitos.&lt;/p&gt;

&lt;p&gt;Vou compartilhar com vocês alguns dos meus objetivos ao criar um novo projeto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Escalabilidade&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Separação de responsabilidades.&lt;/li&gt;
&lt;li&gt;Responsabilidade única.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Manutenibilidade&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Maior facilidade para criação de &lt;code&gt;error handlers&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Maior facilidade para escrita de &lt;code&gt;testes automatizados&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Controllers isolados&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Todos os &lt;code&gt;controllers&lt;/code&gt; são &lt;code&gt;assíncronos&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Facilidade para escrever validações.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Iterações em serviços de forma isolada&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Serviços &lt;code&gt;síncronos&lt;/code&gt; e &lt;code&gt;assíncronos&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Múltiplos serviços para diferentes &lt;code&gt;bancos de dados&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Error handler automático para todas as rotas&lt;/strong&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Essa listinha já é um bom ponto de partida para criar uma&lt;br&gt;
aplicação com excelente qualidade (a de nível de arquitetura).&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%2Fp5r6sphfu5tki6oe5p6n.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp5r6sphfu5tki6oe5p6n.gif" alt="OK" width="500" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora precisamos entender cada um desses requisitos e como implementá-los na prática usando &lt;code&gt;Express&lt;/code&gt;. Mas como esse texto já está muito longo vamos deixar isso para a parte 2.&lt;/p&gt;

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

&lt;p&gt;"Cada escolha uma renúncia" é uma ótima frase para explicar esses processos de decisão.&lt;/p&gt;

&lt;p&gt;Espero que eu tenha conseguido trazer algo de relevante para você que chegou até esse momento da leitura 😁.&lt;/p&gt;

&lt;p&gt;Se você ficou animado ao ler esse artigo, deixe um comentário e um ❤️ para eu saber que tem alguém interessado e que vale a pena continuar a compartilhar esse tipo de conteúdo.&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%2Fw7ljrv6srofiq8xxir3f.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw7ljrv6srofiq8xxir3f.gif" alt="Adeus" width="520" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um abraço e até a próxima.&lt;/p&gt;

</description>
      <category>express</category>
      <category>node</category>
      <category>rest</category>
      <category>api</category>
    </item>
  </channel>
</rss>
