<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Desenvolvimento para a Web - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Desenvolvimento para a Web - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 16 May 2026 19:16:38 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/tag/desenvolvimento-para-a-web/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ O que acontece quando você clica em um URL no seu navegador ]]>
                </title>
                <description>
                    <![CDATA[ Neste artigo, quero que meus leitores tenham uma ideia sobre um conceito básico do mundo da web. Anteriormente, escrevi artigos sobre coisas que importam no mercado de hoje, como a jornada do Angular [https://www.freecodecamp.org/news/angular-a-journey-into-one-of-the-most-popular-front-end-tools-in-todays-job-market/] , o básico sobre React, [https://www.freecodecamp.org/news/start-your-journey-into-the-world-of-react-by-learning-these-basics-d6e05d3655e3/]  entre outros (textos em inglês). Hoj ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/o-que-acontece-quando-voce-clica-em-um-url-no-seu-navegador/</link>
                <guid isPermaLink="false">650ce67686ff8703fbd8765b</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento para a Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Fri, 22 Sep 2023 01:34:50 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/09/browser.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/what-happens-when-you-hit-url-in-your-browser/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What happens when you click on a URL in your browser</a>
      </p><p>Neste artigo, quero que meus leitores tenham uma ideia sobre um conceito básico do mundo da web. Anteriormente, escrevi artigos sobre coisas que importam no mercado de hoje, como a <a href="https://www.freecodecamp.org/news/angular-a-journey-into-one-of-the-most-popular-front-end-tools-in-todays-job-market/">jornada do Angular</a>, o <a href="https://www.freecodecamp.org/news/start-your-journey-into-the-world-of-react-by-learning-these-basics-d6e05d3655e3/">básico sobre React,</a> entre outros (textos em inglês). Hoje, porém, quero que meus leitores vejam o que ocorre quando eles clicam para acessar um URL.</p><p>O tópico é autoexplicativo –<strong><strong> </strong>o que acontece quando clicamos em algum<strong> URL? </strong></strong>– vamos começar!</p><p>Antes de discutir <strong>o que acontece quando clicamos em algum<strong> URL</strong></strong>, devemos, de fato, saber o que é um URL e o que significam as diferentes partes do URL, certo? Vamos, então, entender mais sobre os URLs.</p><h2 id="url-localizador-de-recursos-uniforme"><strong>URL – Localizador de recursos uniforme</strong></h2><p>Se olharmos para o que significa a abreviação, temos outra questão autoexplicativa: é algo que tem o local do recurso que queremos acessar. É o <strong>endereço do local</strong> em que queremos ir para interagir com informações ou encontrá-las.</p><p>Vamos olhar para o seu dia a dia. Se você quiser visitar a casa do seu amigo para algum trabalho ou para obter informações, você precisa do endereço dele. A mesma coisa acontece aqui nesse grande mundo da web: temos que dar ao navegador um endereço do site que queremos acessar. O <strong>site é como a casa e o URL é o endereço</strong>.</p><h3 id="anatomia-de-um-url"><strong>Anatomia de um URL</strong></h3><p>Sabemos o que é o URL, mas ainda não sabemos sobre as partes de um URL. Vamos lá!</p><p>Veja este exemplo:</p><p>https://www.exemplo.com/pagina1</p><p>Aqui, a primeira parte é '<strong>https</strong>'. Ela, basicamente, diz ao navegador qual protocolo ele deve usar. Pode ser <strong>http</strong>, <strong>https</strong>, <strong>ftp</strong>, entre outros. Um <strong>protocolo</strong> é um conjunto de regras que o navegador usa para comunicação pela rede. '<strong>https</strong>' é basicamente uma versão segura, ou seja, as informações são trocadas de maneira segura.</p><p>A segunda parte, <strong>www.exemplo.com</strong>, é um <strong>nome de domínio</strong>. Você pode relacioná-la com a casa do seu amigo. É o endereço de um site. Nós o usamos para chegar ao servidor (computador treinado) que é responsável por fornecer as informações para esse site. Espere! Eu não mencionei um segundo atrás que URL é o endereço? Agora, eu também menciono que nome de domínio é o endereço. Você pode ter ficado confuso. Tente não ficar!</p><h3 id="diferen-a-entre-url-e-nome-de-dom-nio"><strong>Diferença entre URL e nome de domínio</strong></h3><p>A principal diferença entre os dois é que o URL é um endereço completo. O URL informa sobre o método através do qual as informações devem ser trocadas, o caminho depois de chegar a esse site. Considere que o nome de domínio faz parte de um URL.</p><p>Vamos pegar nosso exemplo anterior para entender melhor. Você pode dizer que o endereço residencial do seu amigo é um nome de domínio, enquanto o URL não só diz o endereço da casa do amigo (nome de domínio), mas também como você vai se comunicar, como falar em uma sala em separado (segura) ou na frente de todos (onde as informações podem vazar). Ele também diz o caminho, ou seja, qual parte da casa você visitará depois de entrar na casa. Portanto, o nome de domínio faz parte do URL. Um nome de domínio com mais informações é um URL.</p><p>Espero que agora esteja claro para você o que é o URL. Vamos para a próxima parte.</p><h2 id="nome-de-dom-nio"><strong>Nome de domínio</strong></h2><p>Na parte anterior, expliquei sobre nomes de domínio, mas não em profundidade. Eu quero que você saiba um pouco mais sobre isso. Como eu disse, o nome de domínio é o endereço do site. Ele dá uma <strong>identidade única</strong> ao seu site em um mundo tão grande como o da web. Dois nomes de domínio não podem iguais, PORÉM – Sim! Existe um 'porém' – esta não é a única definição de um nome de domínio. Há outra coisa por trás disso. Vamos ver o que é essa coisa.</p><p>Como sabemos, quando chegamos a qualquer URL ou nome de domínio, esse site é aberto com seu conteúdo. Um servidor (um computador treinado) o serve. Também sabemos que cada computador tem um endereço IP que é usado para comunicação através da internet. É um endereço como o autoexplicativo 'endereço IP'. Quando chegamos a qualquer URL, estamos realmente chegando ao endereço IP do computador que é responsável por servir o conteúdo do site (hospedagem).</p><p>No entanto, agora, você pode pensar: que diabos... tudo é um endereço? Por que esse nome de domínio existe se o endereço IP está lá? Por que não podemos usar o endereço IP para obter o conteúdo do site?</p><p>Sim! Você pode usar endereços IP para obter o conteúdo do site, mas será que você seria capaz de lembrar o endereço IP associado a cada site? Obviamente que não! É difícil lembrar o endereço IP de cada site. É por isso que os nomes de domínio surgiram.</p><p>Você pode comparar isso à sua lista de contatos. Você não consegue se lembrar do número de cada pessoa, mas pode se lembrar do nome dela. O mesmo conceito se aplica aqui. Você não pode se lembrar desses endereços IP assustadores, mas pode facilmente se lembrar de nomes de domínio.</p><p>Essa enorme quantidade de dados é mantida em um banco de dados onde o nome de domínio com seu endereço IP é armazenado. Um sistema que armazena nomes de domínio com seu endereço IP correspondente é conhecido como DNS (<em>Domain name system</em> ou, em português, sistema de nomes de domínio). Acredito que você já deva ter ouvido falar sobre isso.</p><p>Já discutimos bastante o básico. Agora, aprofunde-se no processo do que acontece quando chegamos a qualquer URL.</p><h2 id="procura-no-dns-para-encontrar-endere-os-ip"><strong>Procura no DNS para encontrar endereços IP</strong></h2><p>Após chegar ao URL, a primeira coisa que precisa acontecer é resolver o endereço IP associado ao nome de domínio. O DNS ajuda a resolver isso. <strong>O DNS é como uma lista telefônica</strong> e nos ajuda a <strong>fornecer o endereço IP que está associado ao nome de domínio</strong>, assim como nossa lista telefônica fornece um número de telefone que está associado ao nome da pessoa.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/09/dns.png" class="kg-image" alt="dns" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/09/dns.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/09/dns.png 772w" sizes="(min-width: 720px) 720px" width="772" height="382" loading="lazy"></figure><p>Essa é a visão geral, mas há quatro camadas pelas quais essa consulta de nome de domínio passa. Vamos entender os passos:</p><p>1. Depois de clicar no URL, o <strong>cache do navegador</strong> é verificado, pois o navegador mantém seus registros DNS por algum tempo para os sites que você visitou anteriormente. Portanto, em primeiro lugar, a consulta DNS é executada aqui para encontrar o endereço IP associado ao nome de domínio.</p><p>2. O segundo lugar onde a consulta DNS é executada é no <strong>cache do sistema operacional</strong>, seguido pelo <strong>cache do roteador</strong>.</p><p>3. Se, nas etapas acima, uma consulta DNS não for resolvida, então é preciso a ajuda do servidor para resolver. O servidor de resolução nada mais é do que seu ISP (provedor de serviços de Internet). A consulta é enviada para o ISP onde a consulta DNS é executada no <strong>cache do ISP</strong>.</p><p>4. Se, na terceira etapa, nenhum resultado for encontrado, então são solicitados envios para o servidor <strong>superior</strong> ou <strong>raiz</strong> da hierarquia DNS. Lá nunca acontece de ele dizer que não há resultados encontrados. Na verdade, ele diz de onde essa informação pode ser obtida. Se você estiver pesquisando o endereço IP do domínio de nível superior (.com, .net, .gov, .org). Ele diz ao servidor resolvedor para pesquisar o servidor <strong>TLD</strong> (domínio de nível superior).</p><p>5. Agora, o servidor de resolução pede ao servidor TLD para fornecer o endereço IP do nosso nome de domínio. O TLD armazena informações de endereço do nome de domínio. Ele diz ao servidor de resolução para pedi-lo ao <strong>servidor de nomes autoritativos</strong>.</p><p>6. O servidor de nomes autoritativos é responsável por saber tudo sobre o nome de domínio. Finalmente, o resolvedor (ISP) obtém o endereço IP associado ao nome de domínio e o envia de volta ao navegador.</p><p>Depois de obter um endereço IP, o resolvedor o armazena em seu cache para que, da próxima vez, se a mesma consulta vier, ele não precise ir a todas essas etapas novamente. Agora, ele poderá fornecer o endereço IP a partir de seu cache.</p><p>Isso é tudo sobre as etapas que são seguidas para resolver o endereço IP que está associado ao nome de domínio. Dê uma olhada abaixo para entender melhor:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/09/dns_resolve.png" class="kg-image" alt="dns_resolve" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/09/dns_resolve.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/09/dns_resolve.png 865w" sizes="(min-width: 720px) 720px" width="865" height="465" loading="lazy"></figure><h2 id="a-conex-o-tcp-inicia-com-o-servidor-pelo-navegador"><strong>A conexão TCP inicia com o servidor pelo navegador</strong></h2><p>Uma vez que o <strong>endereço IP</strong> do computador (onde as informações do seu site estão) é <strong>encontrado</strong>, ele <strong>inicia a conexão</strong> com ele. Para se comunicar pela rede, o <strong>protocolo de internet</strong> é seguido. <strong>TCP/IP</strong> é o protocolo mais comum. Uma conexão é construída entre os dois usando um processo chamado '<em>TCP 3-way handshake</em>' (em português, aperto de mão em três vias). Vamos entender o processo resumidamente:</p><p>1. Um computador <em>client</em> envia uma <strong>mensagem SYN</strong> para saber se o segundo computador está aberto a uma nova conexão ou não.</p><p>2. Em seguida, o <strong>outro computador</strong>, se estiver aberto a uma nova conexão, envia <strong>mensagem de confirmação</strong>, também com mensagem SYN.</p><p>3. Depois disso, o <strong>primeiro computador</strong> recebe sua mensagem e confirma enviando uma <strong>mensagem ACK</strong>.</p><p>Para entender melhor, veja o diagrama abaixo.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/09/process.png" class="kg-image" alt="process" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/09/process.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/09/process.png 859w" sizes="(min-width: 720px) 720px" width="859" height="297" loading="lazy"></figure><h2 id="a-comunica-o-inicia-processo-de-solicita-o-e-resposta-"><strong>A comunicação inicia (processo de solicitação e resposta)</strong></h2><p>Finalmente, a conexão é construída entre o <em>client</em> e o servidor. Agora, os dois podem se comunicar e compartilhar informações. Após a conexão bem-sucedida, o <strong>navegador (<em>client</em>)</strong> envia uma solicitação para um servidor dizendo que quer receber esse conteúdo. O servidor sabe tudo em termos de qual resposta ele deve enviar para cada solicitação. Assim, o <strong>servidor responde</strong>. Essa resposta contém todas as informações que você solicitou, como a página da web, o código de status, o controle de cache e assim por diante. O navegador, então, renderiza o conteúdo que foi solicitado.</p><p>É isso! Todo o processo acima acontece quando clicamos em qualquer URL. Esse processo demorado, porém, leva menos que segundos para ser concluído. Essa é a resposta para a pergunta "o que acontece quando acessamos qualquer URL em um navegador?"</p><p>Agradecemos a leitura!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Deploy no Heroku – como colocar uma aplicação ou site da web em produção ]]>
                </title>
                <description>
                    <![CDATA[ Quando se trata de fazer o deploy (em português, implantação) de uma aplicação, geralmente existem duas opções: um VPS [https://pt.wikipedia.org/wiki/Servidor_virtual_privado] (servidor virtual privado) ou um PaaS [https://pt.wikipedia.org/wiki/Plataforma_como_servi%C3%A7o]  (plataforma como serviço). Este artigo mostrará a você uma receita de como publicar uma aplicação em produção em um PaaS como o ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/deploy-no-heroku-como-colocar-uma-aplicacao-ou-site-da-web-em-producao/</link>
                <guid isPermaLink="false">64dd140cfa562503c1cafb1f</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento para a Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Felipe Archanjo ]]>
                </dc:creator>
                <pubDate>Sun, 20 Aug 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/preview.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-deploy-an-application-to-heroku/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Heroku Deploy – How to Push a Web App or Site to Production</a>
      </p><p>Quando se trata de fazer o <em>deploy</em> (em português, implantação) de uma aplicação, geralmente existem duas opções: um <a href="https://pt.wikipedia.org/wiki/Servidor_virtual_privado">VPS</a> (servidor virtual privado) ou um <a href="https://pt.wikipedia.org/wiki/Plataforma_como_servi%C3%A7o">PaaS</a> (plataforma como serviço). Este artigo mostrará a você uma receita de como publicar uma aplicação em produção em um PaaS como o <a href="https://www.heroku.com/">Heroku</a>.</p><blockquote>Nota da tradução: ao final de 2022, o Heroku encerrou o <em><strong>tier</strong> </em>gratuito para implantação. Os planos mensais básicos por lá, no momento desta tradução, custam 5 dólares ao mês.</blockquote><h2 id="passo-1-criar-o-projeto"><strong>Passo 1 - criar o projeto</strong></h2><p><br>O primeiro passo é criar uma estrutura simples para o nosso projeto com alguns arquivos básicos. Para este artigo, vou criar um servidor de demonstração com NodeJS.</p><p>Em uma nova pasta, vou abrir um terminal e executar o comando <code>npm init -y</code> para criar um projeto. O servidor fictício será desenvolvido em Express. Assim, precisamos executar o comando <code>npm install express</code> para instalar esse módulo.</p><p>Assim que essa biblioteca estiver instalada, podemos criar um arquivo para o nosso projeto, chamado <code>app.js</code>. Dentro dele, escreveremos o código para o nosso servidor simples:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/server.png" class="kg-image" alt="server" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/08/server.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/08/server.png 974w" sizes="(min-width: 720px) 720px" width="974" height="768" loading="lazy"><figcaption>Versão <a href="https://carbon.now.sh/?bg=rgba(171%2C%20184%2C%20195%2C%201)&amp;t=seti&amp;wt=none&amp;l=javascript&amp;ds=true&amp;dsyoff=20px&amp;dsblur=68px&amp;wc=true&amp;wa=true&amp;pv=56px&amp;ph=56px&amp;ln=false&amp;fl=1&amp;fm=Hack&amp;fs=14px&amp;lh=133%25&amp;si=false&amp;es=2x&amp;wm=false&amp;code=const%2520app%2520%253D%2520require(%2522express%2522)()%253B%250A%250Aconst%2520PORT%2520%253D%2520process.env.PORT%2520%257C%257C%25203000%253B%250A%250Aapp.get(%2522%2522%252C%2520(req%252C%2520res)%2520%253D%253E%2520%257B%250A%2520%2520res.send(%2522Hello%2520world%2522)%253B%250A%257D)%253B%250A%250Aapp.listen(PORT%252C%2520()%2520%253D%253E%2520%257B%250A%2520%2520console.log(%2560App%2520up%2520at%2520port%2520%2524%257BPORT%257D%2560)%253B%250A%257D)%253B">RAW</a> do projeto</figcaption></figure><p>Podemos iniciar a aplicação executando <code>node app.js</code>. Em seguida, podemos testá-la no seguinte URL <code>http://localhost:3000</code>. Neste ponto, você deve ver a mensagem <code>Hello World</code> no navegador.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/output.png" class="kg-image" alt="output" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/08/output.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/08/output.png 614w" width="614" height="157" loading="lazy"></figure><h2 id="passo-2-sistema-de-controle-de-vers-o"><strong>Passo <strong>2 - </strong>sistema de controle de versão</strong></h2><p>O próximo passo é escolher um sistema de controle de versão e colocar nosso código em uma plataforma de desenvolvimento em um repositório.</p><p>O sistema de controle de versão mais popular é o <a href="https://git-scm.com/">Git</a>, juntamente com o <a href="https://github.com/">Github</a> como plataforma de desenvolvimento. É isso que usaremos aqui.</p><p>No GitHub, crie um repositório para sua aplicação, como mostrado abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/1.png" class="kg-image" alt="1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/08/1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/08/1.png 845w" sizes="(min-width: 720px) 720px" width="845" height="813" loading="lazy"></figure><p>Para enviar o seu código local para um repositório, você precisa executar os comandos listados no GitHub após clicar no botão <code>Create repository</code>:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/git.png" class="kg-image" alt="git" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/08/git.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/08/git.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/08/git.png 1088w" sizes="(min-width: 720px) 720px" width="1088" height="235" loading="lazy"><figcaption>Comandos para enviar nosso código para o repositório do Github</figcaption></figure><p><strong>Importante: </strong>antes de fazer isso, precisamos ignorar alguns arquivos. Queremos enviar para o repositório apenas o código que escrevemos, sem as dependências (os módulos instalados).</p><p>Para isso, precisamos criar um arquivo <code>.gitignore</code> e, dentro dele, escrever o nome dos arquivos que queremos ignorar.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/ignore.png" class="kg-image" alt="ignore" width="448" height="220" loading="lazy"><figcaption>Estrutura de pastas e arquivo .gitignore</figcaption></figure><p>Agora, podemos escrever os comandos listados na imagem acima (aquela do GitHub).</p><p>Se você executou os comandos corretamente, eles estarão na página do seu repositório. Se você atualizar a página, deverá ver seus arquivos, exceto aqueles que você ignorou explicitamente, ou seja, os do diretório <code>node_modules</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/git-master.png" class="kg-image" alt="git-master" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/08/git-master.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/08/git-master.png 903w" sizes="(min-width: 720px) 720px" width="903" height="268" loading="lazy"></figure><h2 id="passo-3-vincular-o-reposit-rio-ao-heroku">Passo <strong>3 - </strong>vincular o repositório ao<strong> Heroku</strong></h2><p><br>Neste passo, podemos vincular o repositório do GitHub à nossa aplicação no Heroku.</p><p>Primeiro, crie uma aplicação no Heroku e siga os passos listados na plataforma.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/heroku-new.png" class="kg-image" alt="heroku-new" width="539" height="122" loading="lazy"></figure><p>Assim que a aplicação for criada, uma janela semelhante a esta deve aparecer:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/heroku-shoud-see.png" class="kg-image" alt="heroku-shoud-see" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/08/heroku-shoud-see.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/08/heroku-shoud-see.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/08/heroku-shoud-see.png 1179w" sizes="(min-width: 720px) 720px" width="1179" height="566" loading="lazy"><figcaption>Painel da aplicação</figcaption></figure><p>Agora, se você olhar para a navegação na parte superior, verá <code>Overview</code>, <code>Resources</code>, <code>Deploy</code>, <code>Metrics</code> e assim por diante. Certifique-se que <code>Deploy</code> esteja selecionado. Em seguida, na segunda linha, clique no ícone do GitHub.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/search-and-cionnect.png" class="kg-image" alt="search-and-cionnect" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/08/search-and-cionnect.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/08/search-and-cionnect.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/08/search-and-cionnect.png 1061w" sizes="(min-width: 720px) 720px" width="1061" height="422" loading="lazy"><figcaption>Clique para conectar</figcaption></figure><p>Procure pela aplicação desejada, que, no nosso caso, é <code>demo-deploy-app-09</code> . Em seguida, clique em <code>Connect</code>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/deploy.png" class="kg-image" alt="deploy" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/08/deploy.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/08/deploy.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/08/deploy.png 1026w" sizes="(min-width: 720px) 720px" width="1026" height="583" loading="lazy"><figcaption><em>Branch</em> da implantação (<em>deploy</em>)</figcaption></figure><p>Uma vez que a aplicação esteja conectada com sucesso à sua conta do Heroku, você pode clicar em <code>Deploy Branch</code> para implantar a sua aplicação.</p><p><br>Se desejar, você também pode selecionar a opção <code>Enable Automatic Deploys</code>, que buscará automaticamente o código do seu repositório do GitHub sempre que você fizer um <em>push </em>para esse repositório.</p><p><br>Assim que a aplicação for implantada, você pode clicar em <em>View</em> para abrir a sua aplicação.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/final.png" class="kg-image" alt="final" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/08/final.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/08/final.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/08/final.png 1031w" sizes="(min-width: 720px) 720px" width="1031" height="706" loading="lazy"></figure><h2 id="passo-4-configurar-o-heroku-para-executar-corretamente-a-aplica-o"><strong>Passo <strong>4 - </strong>c<strong>onfigur</strong>ar o<strong> Heroku </strong>para executar corretamente a aplicação</strong></h2><p><br>Se você abrir a aplicação nesse momento, deverá ver algo parecido com isso:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/errr.png" class="kg-image" alt="errr" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/08/errr.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/08/errr.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/08/errr.png 1056w" sizes="(min-width: 720px) 720px" width="1056" height="789" loading="lazy"></figure><p>Isso mesmo: um erro. Isso ocorre porque o Heroku não sabe como iniciar nossa aplicação.</p><p>Se você se lembra, executamos o comando <code>node app.js</code> para iniciar a aplicação localmente. O Heroku não tem como saber quais comandos precisa executar para iniciar a aplicação. É por isso que ele gerou um erro.</p><p>Para resolver esse problema, precisamos criar um arquivo chamado <code>Procfile</code> com o seguinte conteúdo: <code>web: node ./app.js</code>.</p><p>Para atualizar nossa aplicação, tudo o que precisamos fazer é enviar um novo <em>commit </em>para o GitHub. Se tivermos ativado a opção de <code>Automatic Deploys</code>, o código será automaticamente puxado para o Heroku. Caso contrário, precisamos clicar novamente <code>Deploy Branch</code>.</p><p>Assim que a aplicação for reconstruída, deveríamos vê-la funcionando assim:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/deployed.png" class="kg-image" alt="deployed" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/08/deployed.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/08/deployed.png 636w" width="636" height="263" loading="lazy"></figure><h2 id="passo-5-como-adicionar-um-complemento"><strong>Passo <strong>5 - </strong>como adicionar um complemento</strong></h2><p><br>Um dos principais benefícios que o Heroku oferece é a facilidade de adicionar recursos na forma de complementos (<em>add-ons</em>) ao seu projeto. Esses recursos externos podem ser bancos de dados, ferramentas de registro e monitoramento, ferramentas de Integração e Entrega Contínua (CI/CD) ou ferramentas de teste.</p><p>Agora vamos ver como adicionar um novo recurso ao seu projeto. Primeiro, acessamos <em>Resources </em>(em português, recursos) e, a partir daí, adicionaremos uma nova ferramenta para testes.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/add-addon.png" class="kg-image" alt="add-addon" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/08/add-addon.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/08/add-addon.png 796w" sizes="(min-width: 720px) 720px" width="796" height="629" loading="lazy"></figure><p>Clique em <code>Find more add-ons</code> e, depois, procure por <code>Loadmill</code>.</p><p>O Loadmill é uma ferramenta de teste que é realmente ótima para testes de regressão e testes de carga.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/install-loadmill.png" class="kg-image" alt="install-loadmill" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/08/install-loadmill.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/08/install-loadmill.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/08/install-loadmill.png 1130w" sizes="(min-width: 720px) 720px" width="1130" height="649" loading="lazy"></figure><p>Clique em <code>Install…</code>. Em seguida, escolha a aplicação que deseja vincular.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/provision-add-on.png" class="kg-image" alt="provision-add-on" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/08/provision-add-on.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/08/provision-add-on.png 747w" sizes="(min-width: 720px) 720px" width="747" height="593" loading="lazy"></figure><p>Neste passo, o Heroku criará automaticamente uma conta para você na plataforma fornecida.</p><p>Na guia de recursos, você pode ver o recurso que foi adicionado há pouco:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/ff.png" class="kg-image" alt="ff" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/08/ff.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/08/ff.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/08/ff.png 1141w" sizes="(min-width: 720px) 720px" width="1141" height="502" loading="lazy"></figure><p>Se você acessar esse complemento, deverá ver o painel de controle com um tutorial de introdução e um teste de demonstração criado para você.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/08/fff2.png" class="kg-image" alt="fff2" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/08/fff2.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/08/fff2.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/08/fff2.png 1139w" sizes="(min-width: 720px) 720px" width="1139" height="449" loading="lazy"><figcaption>Painel do Loadmill</figcaption></figure><h1 id="conclus-o"><strong>Conclusão</strong></h1><p>O Heroku permite que os desenvolvedores implantem rapidamente e quase sem esforço uma aplicação em um servidor web.</p><p>Ele também oferece uma variedade de <em>plug-ins</em> que você pode integrar à sua aplicação.</p><p>Uma solução PaaS sempre permitirá que você avance mais rapidamente do que uma solução com um VPS, onde você precisa configurar tudo desde o início.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Minha jornada para me tornar um desenvolvedor da web desde o início sem fazer a faculdade de Ciência da Computação (e o que eu aprendi) ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Sergei Garcia Primeiro, eu gostaria de me apresentar. Meu nome é Sergei Garcia. Sou um desenvolvedor de front-end em tempo integral, com 2 anos de experiência. Nesse tempo, trabalhei como desenvolvedor de front-end para uma empresa de consultoria que está entre as 500 da Forbes e para uma ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/minha-jornada-para-me-tornar-um-desenvolvedor-da-web-desde-o-inicio-sem-fazer-a-faculdade-de-ciencia-da-computacao/</link>
                <guid isPermaLink="false">64ac35edd4e9dc0571a40c96</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento para a Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Mon, 10 Jul 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/1_zVDcaM6mqhi9m0LP_Sq4Ag.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/my-journey-to-becoming-a-web-developer-from-scratch-without-a-cs-degree-2-years-later-and-what-i-4a7fd2ff5503/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">My journey to becoming a web developer from scratch without a CS degree (and what I learned from…</a>
      </p><p>Escrito por: Sergei Garcia</p><p>Primeiro, eu gostaria de me apresentar. Meu nome é Sergei Garcia. Sou um desenvolvedor de <em>front-end</em> em tempo integral, com 2 anos de experiência. Nesse tempo, trabalhei como desenvolvedor de <em>front-end</em> para uma empresa de consultoria que está entre as 500 da Forbes e para uma pequena empresa.</p><p>Isso pode não parecer muita experiência, mas terminar meu segundo ano como desenvolvedor foi um grande marco para mim. Eu não tinha experiência real fazendo desenvolvimento para a web — e não tinha muita experiência em programação em geral, somente alguns treinamentos básicos em C# e Java que obtive de alguns cursos <em>on-line</em>. Também não era formado em Ciência da Computação. Na verdade, minha graduação foi em gerenciamento de projetos de TI.</p><p>Eu nunca escrevi sobre minha experiência, apesar de toda a ajuda que recebi de recursos maravilhosos como o Medium, o Stack Overflow e subreddits de programação do Reddit. Então, hoje, eu decidi mudar isso. Hoje, vou contar sobre o que deu certo e o que não deu certo. Se você estiver embarcando nessa jornada, espero que tenha mais sorte do que eu.</p><p>Sei que há muitos artigos como este, mas não são muitos os que discutem o processo com o benefício de dois anos de retrospectiva prática.</p><p>Vou começar com a minha jornada, incluindo o que deu errado ao longo do caminho. Se você só se importa com as minhas sugestões para o caminho mais curto possível para se tornar um desenvolvedor da web desde o início, fique à vontade para pular para a última seção: <strong>O caminho mais curto</strong>.</p><p>Então, sem mais delongas, vamos começar!</p><h3 id="no-es-b-sicas"><strong>Noções básicas</strong></h3><p>Depois de decidir que queria entrar em desenvolvimento para a web, a primeira pergunta em minha mente foi "O que eu preciso aprender?" Depois de fazer algumas pesquisas, acabei traçando meu caminho de aprendizagem com base no que a maioria das posições de desenvolvedor para a web de nível básico pediam:</p><ul><li>JavaScript</li><li>HTML e CSS</li><li>Pré-processadores de CSS (LESS e SASS)</li><li>Design responsivo</li><li>Angular</li><li>Padrões de design</li><li>Git</li><li>NodeJS</li><li>Automatizadores de tarefas (como o Grunt e o Gulp)</li></ul><p>Veja como foi.</p><h4 id="javascript"><strong>JavaScript</strong></h4><p>Comecei minha jornada aprendendo JavaScript através da <a href="https://www.pluralsight.com/browse?=&amp;q=Code%20School&amp;type=all&amp;sort=default">CodeSchool</a> (atual PluralSight, paga) e da <a href="https://www.codecademy.com/">Codecademy</a> (gratuita). Se você não sabe sobre eles, eles são ótimos sites que permitem que você aprenda a programar usando apenas o seu navegador.</p><blockquote>Nota da tradução: a opinião do autor do texto sobre a antiga CodeSchool é positiva. No entanto, ele demonstra, em partes do texto, não gostar das alternativas oferecidas pela PluralSight. Este artigo, porém, foi lançado antes de a Code School ter sido fechada e seus cursos terem sido movidos para a PluralSight. Caso tenha interesse em consultar os cursos da CodeSchool na PluralSight, é possível fazer esta busca <a href="https://www.pluralsight.com/browse?=&amp;q=Code%20School&amp;type=all&amp;sort=default">aqui</a>. Na tradução, buscamos atualizar os links sempre que possível.</blockquote><p>Descobri que recursos de aprendizagem como esses eram os melhores quando você está apenas começando. Apenas saiba que esse método de aprendizagem fica cansativo rapidamente quando você entra em coisas mais avançadas, já que seus algoritmos para verificar se você resolveu o exemplo de código corretamente têm alguns problemas de precisão. Os dois cursos introdutórios ao JavaScript foram excelentes e eu recomendo os dois.</p><p>Assim que tirei o básico do caminho, comecei a obter uma base mais forte em JavaScript lendo o livro <a href="http://eloquentjavascript.net/" rel="noopener">Eloquent JavaScript: A Modern Introduction to Programming</a> (em inglês, gratuito – a segunda edição do livro tem uma <a href="https://github.com/braziljs/eloquente-javascript">tradução gratuita em português</a>), de Marijn Haverbeke.</p><p>Esse livro foi recomendado para mim por muitas pessoas nos fóruns de JavaScript como uma leitura obrigatória, e por um bom motivo. Foi um livro difícil – especialmente se você está apenas aprendendo programação como eu estava naquela época – mas fico feliz por não ter desistido e continuado. Foi fenomenal devido ao vasto escopo de conceitos de programação que abrange, mesmo que, às vezes, fosse um pouco denso demais. Faça o que fizer, não pule os desafios de código. Depois de terminar esse livro, você poderá finalmente dizer com confiança que tem uma boa compreensão do JavaScript.</p><p>Você também pode, como opção, aprender jQuery (embora eu realmente não recomende aprendê-lo agora – mais sobre isso mais tarde). Você pode aprender sobre ele neste curso de <a href="https://learn.jquery.com/">jQuery</a> (em inglês).</p><h4 id="html-e-css"><strong><strong><strong>HTML </strong>e<strong> CSS</strong></strong></strong></h4><p>Depois de aprender JavaScript, passei a aprender os fundamentos de HTML, CSS e design para a web através <a href="https://www.pluralsight.com/paths/building-websites-with-html-css-and-javascript">deste caminho de aprendizagem de HTML e CSS</a>. Esses cursos ainda são meus favoritos hoje, já que o ritmo é ótimo e o escopo geral do que cobrem me permitiu adquirir uma base mais forte.</p><p>Você também experimentar algo como <a href="https://www.codecademy.com/learn/web">o curso HTML e CSS da Codecademy</a> e obter resultados semelhantes. Se estiver pronto para um desafio, o curso do Udacity de <a href="https://www.udacity.com/course/intro-to-html-and-css--ud304">Introdução a HTML e CSS</a> é muito mais completo e um pouco mais desafiador.</p><p><strong><strong>B</strong>ô<strong>nus</strong></strong>: se você puder colocar as mãos no livro <a href="https://www.amazon.com/HTML-CSS-Design-Build-Websites/dp/1118008189/ref=sr_1_3?ie=UTF8&amp;qid=1471443779&amp;sr=8-3&amp;keywords=john+ducket"><em>HTML and CSS: Design and Build Websites</em></a><em>,</em> de Jon Duckett, ele também é um ponto de partida sólido para aprender HTML e CSS (com uma pitada de design para a web). Ele tem avaliações bem altas (4,7/5 na Amazon) e oferece uma introdução sólida ao mundo do desenvolvimento web. É um belo livro graças ao seu design limpo, com letras grandes e páginas coloridas. Eu frequentemente volto a esse livro só para admirá-lo.</p><h4 id="less-sass"><strong>Less/Sass</strong></h4><p>Para quem não conhece, Less e Sass são transpiladores de CSS que permitem escrever CSS de uma maneira mais elegante. Isso permite que você faça coisas que normalmente não são suportadas, como aninhar regras do CSS. Uma vez terminado, esses transpiladores de CSS "compilam" seu código e o convertem em CSS normal.</p><p>Existem 2 grandes transpiladores de CSS no momento: o <strong>Less </strong>e o <strong>Sass</strong>. O Sass é o mais popular, mas eu achei mais fácil aprender Less primeiro, principalmente porque usar o Sass em seu computador requer também instalar Ruby, algo que eu não gostava.</p><p>Você pode obter uma visão geral rápida, mas completa, do Less usando o <a href="http://winless.org/online-less-compiler">Online Less Compiler</a>, da WinLess, e seus exemplos de código para ver como seu código Less se transformaria em CSS. Você também pode experimentar o Sass <em>on-line</em> usando o <a href="http://www.sassmeister.com/">SassMeister</a> (embora ele não inclua exemplos de código).</p><p>Tanto faz se você aprender o Less ou o Sass primeiro. Eles são extremamente semelhantes. Então, uma vez que você conheça um, praticamente conhecerá o outro. Você pode encontrar uma ótima comparação rápida entre Less e Sass no artigo de Shelby Moulden, <a href="http://shelbymoulden.com/blog/?post=comparison-between-less-and-sass">Comparison between LESS &amp; SASS</a> (em inglês).</p><h4 id="design-responsivo"><strong>Design responsivo</strong></h4><p>Eu aprendi originalmente sobre design responsivo e sobre o Bootstrap usando o caminho de HTML e CSS que citei acima, mas, recentemente, achei o curso da Udacity, feito pelo pessoal do Google, sobre <a href="https://www.udacity.com/course/responsive-web-design-fundamentals--ud893">o básico em design responsivo para a web</a> fantástico. Ele cobre o básico e mais, de maneira muito mais completa.</p><p>Você pode fazer design responsivo sem qualquer estrutura adicional, mas é muito mais fácil com a ajuda de uma estrutura responsiva como o Bootstrap. A documentação oficial do Bootstrap é muito bem feita. Então, você não terá problemas em começar com ele.</p><p>Se você está tendo problemas para entender os princípios básicos, leia o post do blog da Froont sobre os <a href="http://blog.froont.com/9-basic-principles-of-responsive-web-design/">9 princípios básicos do design responsivo para a web</a> (em inglês). Ele tem belas animações, limpas e simples, que ajudam a ilustrar visualmente os princípios do design responsivo para a web.</p><h4 id="angular"><strong>Angular</strong></h4><p>Eu realmente não sabia o que exatamente o Angular era naquela época, mas eu sabia que todo mundo estava falando sobre ele, e que, se eu quisesse me tornar um desenvolvedor para a web, eu precisava aprendê-lo. Descobri que o <a href="https://www.youtube.com/watch?v=HCR7i5F5L8c">Design Decisions in AngularJS</a>, da Google, dava a melhor visão geral do que era o AngularJS e sobre como ele melhorou a criação de aplicações para a web.</p><p>Primeiro, pensei em aprender AngularJS através de sua documentação oficial, mas isso acabou sendo uma péssima ideia. A documentação não era muito fácil para iniciantes, e a formatação desordenada dificultava a leitura e a compreensão.</p><p>Passei, então, a aprender AngularJS através da antiga CodeSchool (atual PluralSight). Com minha experiência positiva nos cursos de JavaScript e de CSS também de lá, eu esperava nada menos do que um ótimo curso. Eu estava errado. O curso foi um desastre desde o início, já que o algoritmo usado para verificar se você acertou o exemplo de código, às vezes, não funcionava direito e marcava sua solução claramente certa como incorreta. Houve até momentos em que tudo o que era necessário para consertar o sistema de validação quebrado era uma atualização de página. Quanto ao conteúdo do curso, também não foi dos melhores. Ele fez um trabalho mais ou menos em explicar os componentes básicos de uma aplicação em AngularJS, mas fez um péssimo trabalho em integrá-los em uma aplicação real. Acabei ficando com muito mais perguntas do que quando eu comecei.</p><p>Depois de algumas pesquisas em fóruns, descobri a <a href="https://egghead.io/">Egghead.io</a> (gratuita, mas com uma versão paga), onde tive muito melhor sorte. O material do curso era muito mais limpo, conciso e completo, proporcionando uma experiência muito melhor. Sem mencionar que, além de seus cursos, eles têm aulas de 2 a 5 minutos que cobrem tópicos importantes (por exemplo: o que é um controlador? O que é um filtro? O que é $scope?) Isso facilita muito a compreensão do básico. Eles também têm alguns vídeos que exigem pagamento, mas geralmente são os que cobrem tópicos de Angular mais avançados, que você não precisará até mais tarde. Fiz o curso <a href="https://egghead.io/courses/angularjs-app-from-scratch-getting-started">AngularJS Fundamentals</a> e fiquei totalmente satisfeito com os resultados (e também me tornei um grande fã dos cursos da Egghead.io no processo).</p><h4 id="padr-es-de-design"><strong>Padrões de design</strong></h4><p>Padrões de design são basicamente soluções de código reutilizáveis que podem ser repetidamente usadas para resolver problemas comuns de software. Ter uma base sobre eles tornará você um desenvolvedor de software muito mais competitivo em qualquer linguagem de programação. Isso também tornará mais fácil para você entender o código de outras pessoas, já que você identificará rapidamente qual padrão de design foi usado no código para entendê-lo melhor.</p><p>Descobri que as 2 melhores fontes para aprender isso são os cursos <a href="http://www.dofactory.com/javascript/design-patterns">JavaScript Design Patterns</a>, da doFactory, e <a href="http://www.dofactory.com/javascript/design-patterns"></a><a href="https://addyosmani.com/resources/essentialjsdesignpatterns/book/">Learning JavaScript Design Pattterns</a>, de Addy Osmani. Achei o curso da doFactory muito mais fácil de entender, mas o livro de Addy Osmani era muito mais completo.</p><h4 id="ferramentas-do-desenvolvedor-do-chrome"><strong>Ferramentas do desenvolvedor do Chrome</strong></h4><p>O Chrome traz as ferramentas mais poderosas para um desenvolvedor para a web. Quanto mais cedo você dominar as ferramentas do desenvolvedor, mais tempo você pode economizar mais tarde. O curso gratuito <a href="http://discover-devtools.codeschool.com/" rel="noopener"></a><a href="https://www.pluralsight.com/search?q=chrome%20developer%20tools">Explore and Master Chrome DevTools</a> faz um ótimo trabalho em apresentá-los.</p><h4 id="git-controle-de-vers-o-"><strong>Git (Controle de versão)</strong></h4><p>Ah, o Git — a ferramenta de que eu nunca soube que precisava até descobrir o que ela poderia fazer. O Git basicamente permite que você acompanhe as alterações feitas no seu código para que, se as coisas derem errado, você possa reverter para um ponto anterior no tempo. Ele também permite que você veja o histórico do seu código.</p><p>Achei o curso gratuito do <a href="https://try.github.io/levels/1/challenges/1">Github</a> uma maneira amigável de se começar. O <a href="https://www.atlassian.com/git/tutorials/">treinamento de Git da Atlassian</a> foi fantástico, pois cobre os comandos mais avançados disponíveis. O <a href="https://www.codeschool.com/learn/git"></a><a href="https://www.pluralsight.com/courses/mastering-git">roteiro de aprendizagem de Git</a> da antiga CodeSchool (atual Pluralsight) também é ótimo em cobrir os fundamentos do Git.</p><h4 id="nodejs"><strong>NodeJS</strong></h4><p>Não demorou muito para eu aprender que ter uma compreensão básica de NodeJS me ajudaria muito na minha busca de me tornar um desenvolvedor para a web (mais sobre isso em breve).</p><p>Tentei os cursos da antiga CodeSchool no Node, mas achei que eles realmente careciam de conteúdo. Achei a <a href="http://nodeschool.io/">NodeSchool.io</a> muito melhor para o entendimento do básico, além de ser divertida! Amei a abordagem prática que ela oferecia, que era semelhante a da CodeSchool e da Codecademy — com o bônus de que eu estava realmente executando o NodeJS.</p><h4 id="automatizadores-de-tarefas-grunt-e-gulp-"><strong>Automatizadores de tarefas (Grunt e Gulp)</strong></h4><p>O Grunt e o Gulp foram uma grande surpresa para mim, pois eu não tinha ideia de que ferramentas como essas existiam – mas estou extremamente feliz pelo fato de que elas existam! Basicamente, esses automatizadores de tarefas permitem automatizar tarefas comuns. Por exemplo, lembra do Less e do Sass? Normalmente, você teria que executar manualmente o compilador de CSS toda vez que você fizesse uma edição para que ele compilasse o CSS e, em seguida, atualizasse o navegador. Usando um automatizador de tarefas, você pode configurá-lo para observar seus arquivos Less/Sass em busca de alterações e, quando detectar uma alteração, compilar seu CSS e atualizar automaticamente o navegador. Isso é imensamente útil para reduzir seu tempo de desenvolvimento.</p><p>Existem 2 automatizadores de tarefas principais no momento: o Grunt e o Gulp. Embora eles façam exatamente a mesma coisa, eles funcionam de maneiras muito diferentes, com o Grunt sendo muito mais detalhado e orientado à configuração, enquanto o Gulp é mais rápido de escrever, dando preferência ao código em vez de a configuração.</p><p>Conhecer o NodeJS ajudará você a escrever arquivos do Grunt e do Gulp melhores, já <strong>que ambos são executados no NodeJS. </strong>Você pode escolher o que quiser, mas achei o Gulp muito mais fácil de aprender e escrever. Eu ainda hoje prefiro p Gulp por causa de sua abordagem minimalista – mas poderosa – baseada em <em>pipes</em>.</p><p>Achei que os cursos da Scotch.io sobre <a href="https://scotch.io/tutorials/a-simple-guide-to-getting-started-with-grunt">Grunt</a> e <a href="https://scotch.io/tutorials/automate-your-tasks-easily-with-gulp-js">Gulp</a> estão entre os melhores que existem.</p><h3 id="desafios-que-enfrentei-no-meu-primeiro-emprego">Desafios que enfrentei no meu primeiro emprego</h3><p>Uma vez que eu cobri os fundamentos do desenvolvimento para a web, eu estava pronto para a minha primeira entrevista em desenvolvimento para uma posição de nível básico. Não vou entrar em detalhes sobre a entrevista, já que esse não é o foco principal deste artigo. Vou dizer, apenas, que me disseram que meu conhecimento relativamente forte de JavaScript me ajudou a garantir a posição. (Obrigado, Eloquent JavaScript!)</p><p>Devo dizer que fiquei bastante nervoso no meu primeiro projeto. Envolveu a criação de componentes reutilizáveis para a web com HTML, CSS e JavaScript, juntamente com Bootstrap, Sass e Grunt como ferramental. Os dois maiores erros que encontrei no início foram:</p><ol><li><strong>Medo do fracasso.</strong> Como eu era o novato, estava constantemente com medo de meu código estar errado ou malfeito. Então, passei muito tempo verificando tudo e aderi às melhores práticas de programação. Por causa disso, raramente tentei soluções criativas de novas maneiras por medo de que pudesse não funcionasse corretamente no final. Isso efetivamente diminuiu minha vontade de aprender coisas novas.</li><li><strong>Fazer as coisas porque a pessoa "X" que sabe melhor do que eu disse isso.</strong> Fiz muito disso no início. Embora não esteja completamente errado fazer as coisas de uma certa maneira apenas porque o especialista "X" no assunto disse isso – sem tentar saber o porquê – me levou a não saber realmente quando as coisas foram feitas da maneira que foram. Logo, aprendi que havia exceções para tudo, e que <strong>você sempre deve tentar saber a razão por trás das melhores práticas.</strong></li></ol><p>Felizmente, tive um líder de equipe compreensivo durante meu primeiro projeto, que me ajudou a superar esses problemas. Ele constantemente me motivava a tentar coisas novas, mesmo que as coisas dessem errado às vezes. Ele também me disse para questionar tudo, até mesmo seus ensinamentos.</p><p>Com o tempo, aprendi a lição. A partir daí, sempre fui uma pessoa ansiosa para tentar coisas novas. Eu sempre tento entender por que as melhores práticas existem, quando elas estão certas e quando não se aplicam a uma situação.</p><p>Usar o AngularJS em um projeto real também representou um grande desafio para mim. Isso ocorreu principalmente porque muitas das coisas que eu fiz com ele, eu fiz sem entender totalmente por que aconteciam. Costumava pensar que era "a magia do Angular".</p><p>Houve muitas vezes em que eu gostaria de saber como o Angular realmente funcionava, mas me assustava simplesmente olhar para a documentação.</p><p>Acabei me deparando com um livro incrível chamado <a href="http://teropa.info/build-your-own-angular/">Build Your Own AngularJS</a>. Eu não li todo ele, mas ler a seção sobre Escopos e sobre os Watchers (em português, algo como "observadores") e como eles funcionavam realmente revelou como a magia por trás do Angular não era, realmente, mágica. Era apenas uma maneira inteligente de manter a vinculação de dados usando verificaçãoe escopos aninhados. Eu recomendo esse livro para quem busca entender completamente o AngularJS.</p><p>O outro desafio que enfrentei um ano depois foi a rapidez com que o desenvolvimento para a web progrediu. Eu tinha acabado de dominar AngularJS e o Grunt. Estava me sentindo todo orgulhoso e poderoso – apenas para logo descobrir que Gulp e ReactJS estavam no horizonte. Um ano depois de aprendê-los, o Webpack começou a ganhar terreno – e eu tive que aprender isso também. Como você pode imaginar, uma grande parte de mim ficou bastante decepcionada com a rapidez com que alguns dos meus conhecimentos se tornaram obsoletos. Um colega de trabalho, porém, logo me esclareceu dizendo algo que mudou a forma como eu via bibliotecas e estruturas para sempre:</p><blockquote><strong>"Bibliotecas e frameworks podem se tornar obsoletos, mas os conceitos e soluções que propõem muitas vezes sobrevivem ao tempo."</strong></blockquote><p>Ele estava certo. O AngularJS pode ter se tornado obsoleto, mas entender completamente a magia por trás dele me ajudou a entender melhor a arquitetura de componentes da web do React, que era uma melhoria do conceito de diretivas do Angular. Também me ajudou a entender como o ReactJS ganhou tanta popularidade, bem como que tipo de futuro que eu poderia esperar.</p><p>Não me lembro de ter enfrentado outros grandes desafios em meus projetos subsequentes. O que vou dizer, no entanto, é que, ao longo dos 2 anos em que tenho trabalhado com desenvolvimento para a web, a coisa que mais ajudou a ter sucesso (de acordo com meus próprios colegas de trabalho) foi minha empolgação e minha motivação para estar sempre à procura de coisas novas para aprender. Logo descobri que essa era uma combinação vencedora no desenvolvimento para a web, já que as coisas por aqui mudam muito, muito rápido, com novos frameworks e bibliotecas surgindo constantemente.</p><p>Por outro lado, a outra coisa que me ajudou muito – e algo que descobri muito recentemente, na verdade – foi entender o que <strong>não</strong> aprender. Isso se tornou fundamental para o meu processo de me tornar um desenvolvedor para a web melhor.</p><p>Não é incomum ver pessoas criticando o ritmo anormalmente rápido de evolução das tecnologias da web, ou como uma nova biblioteca ou estrutura do JavaScript é lançada quase todos os dias. Com o tempo, porém, eu entendi:</p><blockquote><em>Você não precisa aprender cada biblioteca ou estrutura nova.</em></blockquote><p>Muitas vezes, é uma ótima ideia fazer um aplicação simples do tipo Hello World como exemplo para poder ver o que uma estrutura oferece. Então, você pode seguir em frente. Geralmente, porém, você deve tentar se concentrar no que melhor se adapta às necessidades do seu projeto. Isso pode ser difícil no início, mas, felizmente, existem ótimos, lugares como o Stack Overflow, o Medium e o Reddit, onde você pode encontrar discussões úteis sobre os <em>frameworks</em> e descobrir quais se encaixam melhor em seus casos de uso específicos.</p><h3 id="indo-mais-longe">Indo mais longe</h3><p>Nos anos seguintes, passei a melhorar continuamente das seguintes maneiras:</p><h3 id="javascript-1">Javascript</h3><p>Depois de terminar o Eloquent JavaScript, é bastante fácil dizer e sentir que você domina JavaScript, mas então vem o <a href="https://github.com/getify/You-Dont-Know-JS">You Don't Know JS</a> e absolutamente destrói você (ou pelo menos fez isso comigo). Essa série de livros (gratuita por sinal) foi mencionada para mim várias vezes por alguns desenvolvedores sêniores no escritório como <em>o livro</em> para ler, e que só depois de lê-lo eu poderia dizer que sei totalmente JavaScript. Eles estavam certos, já que, página após página, ele continuamente me surpreendeu sobre a complexidade do JavaScript, bem como muitas, muitas armadilhas comuns que pessoas experientes e sem experiência, sem uma compreensão adequada do JavaScript, podem ter.</p><p>Ler essa série de livros realmente abriu minha mente. Também a recomendo para quem quiser se chamar um desenvolvedor especialista do JavaScript. Uma vez que você tirou isso do caminho, há 2 recursos extras que eu recomendo para obter um conhecimento de JavaScript ainda mais avançado:</p><ul><li><a href="https://vimeo.com/97419177">JavaScript, The Better Parts</a>: Uma palestra incrível de D. Crockford, que fala sobre os maiores pontos fracos do JavaScript, suas "Foot Guns", e como utilizá-las como seus pontos fortes.</li><li><a href="https://medium.com/javascript-scene/the-two-pillars-of-javascript-ee6f3281e7f3#.91eor7lrd">The Two Pillars of JavaScript:</a> um ótimo artigo do reconhecido autor Eric Elliott, que escreve artigos sobre JavaScript no Medium, que fala sobre os 2 grandes pilares do JavaScript: herança prototípica e programação funcional.</li></ul><p>Depois de ter uma compreensão profunda de JavaScript, prossiga com o ECMASCript 2015 (também conhecido como ES6), o padrão do JavaScript mais recente e atual. O artigo da Smashing Magazine <a href="https://www.smashingmagazine.com/2015/10/es6-whats-new-next-version-javascript/">ECMAScript 6 (ES6): What's New In The Next Version Of JavaScript</a> é uma ótima breve revisão do que há de novo no ES6. Você pode tentar ES6 no navegador usando o <a href="https://babeljs.io/repl/">transpiler on-line do Babel</a>.</p><h3 id="css">CSS</h3><p>O CSS pode ser uma bagunça e ficar desorganizado muito, muito rapidamente. Houve algumas metodologias diferentes propostas para escrever CSS mais limpo, mas duas delas se destacam. Recomendo que você leia sobre elas o mais rápido possível para se manter competitivo:</p><ul><li><a href="https://smacss.com/">SMACSS</a>: arquitetura escalável e modular para o CSS. Este é um guia flexível para o desenvolvimento de sites pequenos e grandes.</li><li><a href="http://getbem.com/">BEM</a>: uma metodologia que ajuda você a obter componentes reutilizáveis e compartilhamento de código no <em>front-end</em>.</li></ul><p>Eu, pessoalmente, prefiro o SMACSS por causa de seu visual mais limpo, mas algumas empresas e frameworks do CSS ainda usam o BEM. Então, vale a pena conhecer ambos.</p><p>Você também deve começar a se concentrar no desempenho do CSS. O artigo da Smashing Magazine, <a href="https://www.smashingmagazine.com/2016/03/managing-mobile-performance-optimization/">Managing Mobile Performance Optimization</a>, e o artigo da HTML5 Rocks, <a href="http://www.html5rocks.com/en/tutorials/speed/high-performance-animations/">High Performance Animation</a>, fizeram um ótimo trabalho em fornecer uma vantagem inicial a respeito. Uma leitura rápida dos artigos deve dar a você uma base sólida.</p><h3 id="bundlers-do-javascript">Bundlers do JavaScript</h3><p>Nesse momento, você já deve ter uma forte compreensão de Grunt ou Gulp. A próxima etapa é adicionar um <em>bundler</em> do JavaScript ao seu automatizador de tarefas, o que permitirá uma organização mais modular da sua aplicação em JavaScript.</p><p>Os melhores no momento são:</p><ul><li><a href="http://browserify.org/">Browserify</a>: permite que você solicite módulos no navegador, agrupando todas as suas dependências.</li><li><a href="https://webpack.github.io/">Webpack</a>: basicamente, o Browserify versão avançada. Mais difícil de configurar e ajustar.</li></ul><p>O minicurso <a href="https://scotch.io/tutorials/getting-started-with-browserify">Getting Started with Browserify</a> da Scotch.io pode dar um pontapé inicial para o uso do Browserify, enquanto o artigo de David Fox Powell, <a href="http://xn--why%20cant%20anyone%20write%20a%20simple%20webpack%20tutorial-mo32b/?" rel="noopener">Why Can’t Anyone Write a Simple Webpack Tutorial?</a>, é uma ótima introdução ao Webpack, divertida de ler.</p><p>Pessoalmente, não passei muito tempo usando o Webpack, mas, no meu tempo com ele, tenho que dizer que tem sido incrível – mesmo que seja um pouco mais difícil de configurar. Se você está apenas começando, eu usaria o Browserify, já que é muito mais simples de configurar. Apenas esteja ciente de que o Webpack é o futuro, e que projetos maiores estão começando a usá-lo.</p><h3 id="react">React</h3><p>O React está rapidamente ganhando popularidade, e não parece estar desacelerando – a ponto de as pessoas perguntarem "O React está acabando &nbsp;com o Angular?"</p><p>O programa <a href="https://scotch.io/tutorials/learning-react-getting-started-and-concepts">Learning React.js: Getting Started and Concepts</a>, da Scotch.io, fornece uma visão geral sólida do React. Depois de tirar isso do caminho, continue com o curso <a href="https://egghead.io/courses/react-fundamentals" rel="noopener">React Fundamentals</a>, da Egghead.io, onde você criará uma aplicação em React totalmente funcional e, em seguida, migrará para a sintaxe da ES6. Você pode acompanhar a <a href="https://react.dev/">documentação oficial do React</a>, que é muito bem-feita e permitirá que você a domine completamente.</p><p>Como o React é apenas a visualização, é altamente recomendável que você aprenda Redux. A maioria dos cursos sobre Redux é um pouco complexa, na minha opinião, mas <a href="https://css-tricks.com/learning-react-redux/">CSS Tricks Leveling Up with React: Redux</a> consegue um ótimo equilíbrio entre simplicidade e ser informativo ao começar com Redux.</p><p>Você também já deve ter ouvido falar do Flux neste momento, mas se você está se perguntando por que você deve usar o Redux em vez do Flux, confira a pergunta no Stack Overflow sobre <a href="http://stackoverflow.com/questions/32461229/why-use-redux-over-facebook-flux">Por que usar o Redux em vez do Flux?</a> que foi respondida pelo criador do Redux!</p><h3 id="relembrando-meus-erros-e-o-que-aprendi">Relembrando meus erros e o que aprendi</h3><p>Cometi muitos erros nos meus 2 anos de aprendizado de desenvolvimento para a web. No geral, acho que meu maior erro foi não dominar o básico antes de passar para bibliotecas e frameworks. Acho que isso se aplica a quase todas as linguagens de programação por aí, mas, na minha opinião, se aplica ainda mais ao JavaScript. Isso ocorre porque, em muitos aspectos, o JavaScript é uma linguagem quebrada e contém diversos "Foot Guns" (você já deve ter ouvido falar disso se você assistiu à palestra de D. Crockford, "JavaScript, The Better Parts", que mencionei anteriormente). Eles podem tornar a vida insuportavelmente difícil se você não os entender completamente.</p><p>Lembro-me de uma vez ter ficado preso em um problema do AngularJS com $scope que levei 3 dias para depurar, apenas para descobrir que não era nem mesmo um problema do AngularJS, mas um problema de JavaScript que eu mesmo causei por não entender como <em>ele</em> funciona.</p><h3 id="c-digo-limpo">Código limpo</h3><p>É estranho que eu não veja isso ser falado com tanta frequência. Eu nem sempre me importei em escrever código limpo, mas honestamente é uma das coisas que mais me orgulho de ter aprendido. Isso porque todo mundo adora reclamar como seu último lugar teve uma das piores e mais feias bases de código do mundo. Então, por que ninguém pode falar sobre como o último lugar em que esteve foi maravilhoso? Como seu código acabou tão limpo e bem-feito que eles ficaram orgulhosos dele?</p><p>Essa é uma tendência que eu gostaria de mudar, e acredito que uma diferença pode ser feita se um número suficiente de pessoas pressionar por ela. Esforce-se para tornar os nomes de variáveis e funções compreensíveis, mesmo que você tenha que escrever um pouco mais. Não fazer isso só levará você a ter que documentá-lo manualmente em algum momento no futuro para torná-lo mais claro. Isso também fará com que sua base de código geral se torne mais difícil de entender por novos desenvolvedores e por você mesmo. Sim, você mesmo. Por que você mesmo? Porque se você não está aplicando código limpo, o que faz você pensar que seus colegas de trabalho devem aplicá-lo e escrever código limpo para você entender facilmente? É hora de dar o exemplo.</p><p>Se isso não for um incentivo bom o suficiente, as pessoas muitas vezes reconhecem e valorizam os escritores de código limpo. Você descobrirá que, escrevendo código limpo, seus colegas de trabalho e amigos gostarão ainda mais de trabalhar com você e, por sua vez, viverão uma vida mais feliz.</p><h3 id="jquery">jQuery</h3><p>Alguns de vocês podem notar que eu também não dei muita ênfase ao jQuery. Isso porque, na minha experiência, achei que o jQuery me fez mais mal do que bem no início. Alguns de vocês podem não concordar, mas deixe-me explicar: quando eu aprendi pela primeira vez, a ideia geral que eu tive era de que o jQuery estava em todos os lugares e que você poderia usá-lo para praticamente tudo. Por causa disso, eu me acostumei a usar o jQuery para praticamente qualquer coisa e, para qualquer problema que eu encontrasse, eu procurava uma solução para ele que usasse o jQuery.</p><p>Não me entenda mal, o jQuery foi incrível no meu tempo usando-o, tão incrível, na verdade, que eu ignorei cegamente que 90% do que eu fazia com o jQuery poderia ser feito nativamente em navegadores modernos em uma sintaxe igualmente fácil.</p><p>Agora, você pode estar pensando: "mas o que há de errado nisso? O jQuery não pesa tanto assim e, usando-o, você ainda acaba escrevendo menos código do que se fizesse as coisas nativamente." Certo, mas usar jQuery sobre APIs nativas não era o problema. O problema era que toda a minha maneira de pensar e todas as soluções para problemas comuns que eu conhecia até então exigiam que o jQuery funcionasse. Isso se tornou um grande problema quando recebi meu primeiro projeto e me disseram que o jQuery não era uma dependência.</p><p>Usar o jQuery me tornou inútil sem ele e me fez ignorar completamente os métodos e soluções nativas que sempre existiram. Isso também tornou todas as minhas soluções menos transportáveis, já que usá-las exigia jQuery.</p><p>Desde então, tenho me esforçado para não usar o jQuery, a menos que seja absolutamente necessário e realmente forneça uma grande melhoria na eficiência e legibilidade de nossa base de código (por exemplo, na manipulação pesada do DOM).</p><p>Mais uma vez, não me entenda mal, o jQuery é ótimo. Se, contudo, eu pudesse voltar no tempo e conhecer meu eu passado que estava apenas aprendendo desenvolvimento para a web, eu me aconselharia fortemente a não aprender tanto jQuery até ter aprendido a fazer as coisas sem ele. Se você está tendo problemas para fazer a mudança como eu fiz, confira <a href="http://youmightnotneedjquery.com/" rel="noopener">You Might Not Need jQuery</a>.</p><h3 id="cursos">Cursos</h3><p>Quanto ao material didático: embora muitos dos cursos da antiga CodeSchool tenham sido excelentes (o ramo de HTML e CSS foi especialmente fantástico), alguns de seus cursos sobre frameworks não eram tão interessantes assim (AngularJS, BackboneJS, etc.).</p><p>Também fiz muitos cursos da <a href="https://www.pluralsight.com/">Pluralsight</a>, que não mencionei. Depois de todo esse tempo, cheguei à conclusão de que escolher alguns dos caminhos de aprendizado deles é, em geral, <strong>uma má ideia e não confiável</strong>. Como seus cursos são feitos por professores que nem sempre (na minha opinião) são muito bons no ensino, descobri que a qualidade dos cursos deles flutua muito, já que seus padrões de qualidade de curso são inexistentes. Já tive cursos em que até a pessoa que dava o curso parecia que estava adormecendo. Eu, honestamente, não tenho tempo de atenção para continuar prestando atenção em um curso de 6 a 10 horas – e muitos deles duram esse tempo, se não mais.</p><p>Passei umas boas 80 a 100 horas de treinamento na Pluralsight e, honestamente, gostaria de resgatar uma boa parte desse tempo de volta. Não me entenda mal, há alguns cursos incríveis na Pluralsight, mas o foco deles na quantidade em vez da qualidade realmente me fez perder meu tempo. Eu poderia ter aprendido muito mais se tivesse feito cursos de fontes melhores, como a Egghead.io, onde eles valorizavam mais a qualidade do que a quantidade.</p><p>A única razão pela qual eu poderia pensar em alguém usando a PluralSight para outros cursos é para fazer um curso que nenhum outro site tenha em alguma tecnologia mais obscura (como Installshield, ou Xamarin), ou para fazer alguns cursos muito específicos que eles sabem que foram muito bem recebidos e revisados (como o Angular Fundamentals, de John Papa).</p><p>No geral, se você quiser usar a Pluralsight, certifique-se de que está fazendo cursos escolhidos a dedo por alguém que os fez primeiro e que são reconhecidos como de alta qualidade e úteis.</p><p>Eu também tentei recentemente o treinamento da <a href="https://teamtreehouse.com/" rel="noopener">Team Treehouse</a> e tenho que dizer que estou impressionado com a qualidade dos cursos. O material didático é altamente extenso.</p><p>Depois de percorrer os caminhos de aprendizado de HTML, CSS e JavaScript de lá, vejo que você poderia facilmente adquirir a base de praticamente tudo. Não acredita? Basta olhar para <a href="https://teamtreehouse.com/tracks">as trilhas de aprendizado</a> de lá e me dizer se não são incríveis. Claro, é um pouco caro, já que custam uns 30 dólares por mês, mas, na minha opinião, valem muito a pena. (Estou pagando por eles agora para aprender WordPress, já que preciso dele para um projeto freelance, e o material é ótimo).</p><h3 id="uma-palavra-sobre-os-cursos-pagos">Uma palavra sobre os cursos pagos</h3><p>Senti a necessidade de falar sobre isso, pois notei o consenso geral de que você pode aprender programação sem pagar um centavo e ser tão competitivo quanto alguém que pagou por um curso. Embora seja verdade, não posso enfatizar o suficiente o valor que pagar pelo curso certo tem. Claro, muito do material mais valioso do curso sobre o qual escrevi é gratuito, mas muito dele também é pago. Isso ocorre principalmente porque, às vezes, você simplesmente não consegue superar ter alguém explicando cuidadosamente as coisas para você de uma maneira visual.</p><p>Sim, existem cursos pagos de aprendizagem terríveis que eu desaconselho, já que sua proposta de valor é questionável, mas outros, como a Egghead.io, a antiga CodeSchool e a Team Treehouse oferecem um ótimo valor por cada centavo investido, apesar de sua assinatura mensal relativamente cara (25 a 30 dólares por mês). Além disso, todos eles têm avaliações gratuitas de 7 a 15 dias para que você possa ver qual funciona melhor para você.</p><p>Se você jogar suas cartas corretamente, pagar 1-2 meses de qualquer uma delas pode facilmente render a você um conhecimento que você só obteria de outra forma depois de se deparar com inúmeros artigos e postagens de blog ao longo de um ano. Eles são honestamente muito bons.</p><p>Então, sim, eles não são necessários, mas, se você puder pagar pelo menos um mês, pode ter certeza que terá uma grande vantagem.</p><h3 id="o-segredo-para-o-sucesso">O segredo para o sucesso</h3><p>Eu conheci vários desenvolvedores nos últimos 2 anos em que fui um desenvolvedor para a web. Ao longo da minha jornada, conheci alguns desenvolvedores que realmente se destacaram – desenvolvedores que estavam claramente em um patamar todo próprio, e que eu e muitos outros admiramos. Descobri que essas pessoas compartilhavam algumas características, que eu gostaria de compartilhar com vocês agora. Essas são, na minha opinião, o segredo para ser um desenvolvedor para a web de sucesso:</p><ul><li><strong>Ame o que faz.</strong> Esta é simplesmente a característica mais importante de todas. Se você não ama o que faz (seja estilizar em CSS ou programar em JavaScript), isso vai ficar claro no que você faz. Aqueles que são apaixonados pelo que fazem, muitas vezes, se destacam claramente da multidão.</li><li><strong>Seja generoso e compartilhe seu conhecimento</strong>. É muito fácil querer manter em segredo aquele novo hack de CSS/JavaScript que você encontrou e que resolve os problemas do projeto, mas não faça isso. As pessoas que mais compartilham seu conhecimento costumam ser as mais valiosas, já que podem ser colocadas em qualquer tipo de equipe e melhorar sua qualidade por uma margem enorme.</li><li><strong>Esteja sempre atento às novidades</strong>. A maioria dos desenvolvedores de sucesso que conheci compartilham essa característica comum. Seja lendo blogs, gastando muito tempo em discussões relacionadas à programação ou até mesmo falando sobre o que há de novo no desenvolvimento para a web durante os intervalos para o almoço. Estar à procura de coisas novas o tempo todo permite que os melhores desenvolvedores fiquem sempre à frente na corrida.</li></ul><h3 id="o-caminho-mais-curto">O caminho mais curto</h3><p>Ufa, esse artigo demorou um pouco para terminar (6 horas e contando). Estamos quase terminando! Você deve estar se perguntando: "Ok, história legal, mas qual é o caminho mais rápido?" Assim sendo, aqui está.</p><p>Eu organizei isso da maneira que eu aceitaria se pudesse voltar e fazer as coisas direito. Eu também adicionei alguns bônus, que eu adoraria ter tido naquela época. Aproveite!</p><h3 id="javascript-2">Javascript</h3><ol><li><a href="https://www.pluralsight.com/paths/javascript-core-language">Caminho de aprendizagem de Javascript</a> ou o curso da <a href="https://teamtreehouse.com/tracks/full-stack-javascript">Team Treehouse</a> (pago) OU <a href="https://www.codecademy.com/learn/javascript">Curso de Javascript da Codecademy</a></li><li><a href="http://eloquentjavascript.net/" rel="noopener">Eloquent JavaScript</a></li><li><a href="https://github.com/getify/You-Dont-Know-JS" rel="noopener">You Don’t Know JS</a></li><li><a href="http://jstherightway.org/" rel="noopener">JS: The Right Way</a></li><li><a href="https://egghead.io/courses/learn-es6-ecmascript-2015" rel="noopener">Learn ES6</a> da Egghead.io</li></ol><h4 id="html-e-css-1"><strong>HTML e CSS</strong></h4><ol><li><a href="https://www.pluralsight.com/paths/building-websites-with-html-css-and-javascript">Caminho de aprendizagem de HTML e CSS</a> ou o curso da <a href="https://teamtreehouse.com/tracks" rel="noopener">Team Treehouse</a> (pago), <a href="https://www.amazon.com/HTML-CSS-Design-Build-Websites/dp/1118008189/ref=sr_1_3?ie=UTF8&amp;qid=1471454089&amp;sr=8-3&amp;keywords=jon+ducket" rel="noopener">HTML and CSS: Design and Build Websites</a> de John Ducket OU <a href="https://www.codecademy.com/learn/web" rel="noopener">o curso de HTML e CSS da Codecademy</a>.</li><li><a href="https://css-tricks.com/specifics-on-css-specificity/" rel="noopener">Specifics on CSS Specifity</a> da CSS Tricks</li><li><a href="http://learnlayout.com/" rel="noopener">Learn CSS Layout</a></li><li><a href="https://smacss.com/" rel="noopener">SMACSS</a></li><li><a href="http://blog.froont.com/9-basic-principles-of-responsive-web-design/" rel="noopener">9 basic principles of responsive web design</a> da Froont</li><li><a href="https://www.udacity.com/course/responsive-web-design-fundamentals--ud893" rel="noopener">Responsive Web Design Fundamentals</a> da Google na Udacity (faça o curso se não faz os caminho de aprendizagem do número 1)</li><li><a href="https://www.smashingmagazine.com/2016/03/managing-mobile-performance-optimization/" rel="noopener">Managing Mobile Performance Optimization</a> da Smashing Magazine OU <a href="https://www.udacity.com/course/browser-rendering-optimization--ud860" rel="noopener">Browser Rendering Optimization</a> e <a href="https://www.udacity.com/course/website-performance-optimization--ud884" rel="noopener">Website Performance Optimization</a> da Google na Udacity</li><li><a href="https://developers.google.com/web/fundamentals/?hl=en" rel="noopener">Web fundamentals</a> da Google</li></ol><h4 id="ferramentas-do-desenvolvedor"><strong>Ferramentas do desenvolvedor</strong></h4><ol><li><a href="https://www.pluralsight.com/search?q=chrome%20developer%20tools">Explore and Master DevTools</a></li><li><a href="https://www.codecademy.com/learn/learn-git" rel="noopener">Learn Git</a> da Codecademy e <a href="https://docs.github.com/en/get-started/quickstart/set-up-git">Github</a></li><li><a href="https://www.smashingmagazine.com/2012/01/introduction-to-linux-commands/" rel="noopener">Introduction to Linux Commands</a> da Smashing Magazine</li><li><a href="https://scotch.io/tutorials/automate-your-tasks-easily-with-gulp-js" rel="noopener">Automate Your Tasks Easily with Gulp.js</a> da Scotch.io</li></ol><h4 id="angularjs"><strong>AngularJS</strong></h4><ol><li><a href="https://www.youtube.com/watch?v=HCR7i5F5L8c" rel="noopener">Design Decisions in AngularJS</a> dos desenvolvedores do Google (Introdução ao AngularJS)</li><li><a href="https://egghead.io/courses/angularjs-app-from-scratch-getting-started" rel="noopener">AngularJS fundamentals</a> da Egghead.io</li><li><a href="https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md" rel="noopener">John Papa’s Angular Styleguide</a></li><li><a href="https://scotch.io/tutorials/creating-a-single-page-todo-app-with-node-and-angular" rel="noopener">Creating a Single Page Todo App with Node and Angular</a> (MEAN) da Scotch.io</li><li><a href="https://egghead.io/courses/angularjs-application-architecture" rel="noopener">AngularJS application structure</a> da Egghead.io (pago) OU <a href="https://scotch.io/tag/angular-js" rel="noopener">cursos de Angular</a> da Scotch.io</li></ol><h4 id="react-1"><strong>React</strong></h4><ol><li><a href="https://scotch.io/tutorials/learning-react-getting-started-and-concepts" rel="noopener">Learning React.js: Getting Started and Concepts</a> da Scotch.io</li><li><a href="https://egghead.io/lessons/javascript-intro-to-webpack" rel="noopener">Intro to webpack</a> da Egghead.io</li><li><a href="https://egghead.io/courses/react-fundamentals" rel="noopener">React Fundamentals</a> da Egghead.io</li><li><a href="https://css-tricks.com/learning-react-redux/" rel="noopener">Leveling Up with React: Redux</a> da CSS Tricks</li></ol><h4 id="back-end"><strong>Back-end</strong></h4><ol><li><a href="http://nodeschool.io/" rel="noopener">NodeJS tutorials da NodeSchool.io</a></li><li><a href="http://www.looah.com/source/view/2284" rel="noopener">How I explained REST to my Wife</a></li><li><a href="https://scotch.io/tutorials/creating-a-single-page-todo-app-with-node-and-angular" rel="noopener">Creating a Single Page Todo App with Node and Angular</a> da Scotch.io (Node, ExpressJS, MongoDB, Angular, REST)</li></ol><h4 id="b-nus-recursos"><strong>Bônus: recursos</strong></h4><p>Totalmente opcionais, mas alguns dos meus artigos e recursos favoritos que encontrei com o passar dos anos que, acredito, serão do seu agrado se estiver interessado no assunto específico.</p><ul><li><a href="http://jgthms.com/web-design-in-4-minutes/" rel="noopener">Web Design in 4 minutes</a>. Um tutorial muito criativo e original interactive que ensina o básico sobre design para a web.</li><li><a href="http://www.awwwards.com/" rel="noopener">Awwards</a>. Procurando por inspiração para o design para a web? Os seus problemas acabaram.</li><li><a href="https://medium.com/javascript-scene/why-hiring-is-so-hard-in-tech-c462c3230017" rel="noopener">Why Hiring is so hard in tech</a>, de Eric Elliott. Aqui, Eric faz um trabalho incrível resumindo como é surpreendentemente difícil encontrar desenvolvedores ótimos e dá dicas de como se tornar um deles.</li><li><a href="https://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis" rel="noopener">NoSQL database systems mega comparison</a>, de Kristof Kovacs. Uma comparação incrível entre os sistemas de bancos de dados NoSQL mais populares: MongoDB, Redis, CouchDB, Cassandra, ElasticSearch e muito mais.</li><li><a href="https://xss-game.appspot.com/" rel="noopener">XSS Game</a>. Bugs relacionados a <em>cross-site scripting</em> (XSS) são um dos tipos mais comuns e perigosos de vulnerabilidades nas aplicações para a web. Usando esse recurso sensacional, você pode aprender a encontrar e explorar os bugs de XSS, além de evitar que eles aconteçam em sua aplicação para a web.</li><li><a href="https://github.com/Droogans/unmaintainable-code" rel="noopener">How To Write Unmaintainable Code</a>. Um artigo engraçadíssimo sobre como <em><em>n</em>ão</em><strong><strong> </strong></strong>escrever código limpo e de fácil manutenção.</li></ul><h4 id="b-nus-minhas-ferramentas"><strong>Bônus: minhas ferramentas</strong></h4><p>Também achei que seria legal compartilhar algumas das ferramentas que descobri (umas bastante conhecidas; outras, nem tanto) que tornaram minha vida como desenvolvedor mais fácil.</p><ul><li><a href="https://www.jetbrains.com/webstorm/" rel="noopener">Jetbrains Webstorm</a>: IDE completo para o desenvolvimento para a web. (Meu editor favorito) É pago, mas oferece um ano de licença gratuita para estudantes.</li><li><a href="https://atom.io/" rel="noopener">Atom.io</a>: Editor de texto altamente extensível, com recursos semelhantes aos de IDEs concorrentes, como o Webstorm. Gratuito.</li><li><a href="https://www.sublimetext.com/" rel="noopener">Sublime Text</a>: Editor de texto muito rápido, com suporte a <em>plug-ins </em>e muito bonito. (Normalmente, eu mantenho Webstorm/Atom instalados para o trabalho mais pesado e uso o Sublime Text para edições rápidas em arquivos.)</li><li><a href="http://caniuse.com/" rel="noopener">caniuse.com</a>: Suporte aos navegadores é essencial para os sites da web. Esse é o recurso número 1 para descobrir quais recursos têm suporte em quais versões dos navegadores.</li><li><a href="https://c9.io/" rel="noopener">Cloud 9</a>: Ambiente de desenvolvimento baseado em nuvem e IDE com suporte a Git que roda em Linux. Ótimo para programar remotamente e testar NodeJS ou outras coisas do lado do servidor sem precisar instalar nada em sua máquina.</li><li><a href="https://codepen.io/" rel="noopener">CodePen</a>, <a href="http://plnkr.co/edit" rel="noopener">Plunker</a> e <a href="https://jsfiddle.net/" rel="noopener">JSFiddle</a>: Ótimos <em>playgrounds </em>de <em>front-end</em> baseados em nuvem que permitem que você faça demonstrações rápidas de HTML/CSS/JS que você pode compartilhar ou trabalhar nelas mais tarde se criar uma conta gratuita. O CodePen é, muitas vezes, melhor para coisas relacionadas a CSS por causa de sua interface minimalista e infinidade de recursos relacionados a CSS, o Plunker para demonstrações do JavaScript por causa de seus poderosos recursos de JS e o JSFiddle para demonstrações em que você deseja colaborar com outras pessoas em tempo real, graças ao seu recurso de colaboração de compartilhamento de editor ao vivo.</li><li><a href="http://www.vanillalist.com/" rel="noopener">Vanilla List</a>: Um repositório de plug-ins e bibliotecas do JavaScript usando apenas JavaScript Vanilla (ou puro, o que significa que eles não exigem bibliotecas para funcionar, como o jQuery).</li><li><a href="http://youmightnotneedjquery.com/" rel="noopener">YouMightNotNeedjQuery</a>: Provavelmente, não. Descubra você mesmo.</li><li><a href="https://www.publicapis.com/" rel="noopener">PublicAPIs</a>: Já se perguntou quais APIs existem por aí? Este é um ótimo lugar para descobrir!</li><li><a href="https://www.gravit.io/" rel="noopener">Gravit.io</a>: Aplicativo de design baseado em nuvem rivalizando com o Adobe Illustrator. (Gratuito!) Útil para maquetes rápidas e design para a web.</li><li><a href="https://color.adobe.com/" rel="noopener">Adobe Kuler</a>: Webapp para ajudá-lo a criar combinações de cores harmoniosas para qualquer site. Também tem uma parte chamada "Explore", de paletas de cores criadas por outros designers, bem como um sistema de classificação para ajudar a inspirá-lo.</li><li><a href="http://chir.ag/projects/name-that-color" rel="noopener">Name that color</a>: Pare de gastar seu tempo descobrindo como nomear suas variáveis de cor em Less/Sass e apenas use o nome legítimo das cores com este webapp.</li></ul><h3 id="conclus-o">Conclusão</h3><p>Eu só gostaria de dizer que realmente gostei de escrever isso. Fico muito feliz por finalmente ter sido capaz de dar algo de volta à comunidade de programação incrivelmente solidária em todos os lugares.</p><p>Como alguns de vocês já perceberam, este é o meu primeiro artigo, mas podem ter certeza de que pretendo escrever mais. Só não espere um por semana. Lembre-se: qualidade sobre quantidade!</p><p>Espero que este artigo tenha sido útil para vocês. Até a próxima vez! Um abraço!</p><p>Para os curiosos sobre o que o autor vem fazendo, acompanhe seu <a href="https://medium.com/@sgarcia.dev">blog no Medium</a>!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Aprende o sistema de grelha do Bootstrap 4 em 10 minutos ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Elena-Cristina Conacel > Tradução em português europeu O sistema de grelha do Bootstrap 4 é utilizado para layouts responsivos. Um layout responsivo representa a forma como os elementos ficam alinhados numa página em resoluções diferentes. É importante compreender como utilizar o sistema de grelha (do inglês, grid system) ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/aprenda-o-sistema-de-grelha-do-bootstrap-4-em-10-minutos/</link>
                <guid isPermaLink="false">6449325e0fb65d064e627d2a</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento para a Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Afonso Branco ]]>
                </dc:creator>
                <pubDate>Mon, 15 May 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_9nkJt3S1Fe_KMkDtpIhgXw.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/learn-the-bootstrap-4-grid-system-in-10-minutes-e83bfae115da/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Learn the Bootstrap 4 Grid System in 10 Minutes</a>
      </p><p>Escrito por: Elena-Cristina Conacel</p><blockquote>Tradução em português europeu</blockquote><p>O sistema de grelha do Bootstrap 4 é utilizado para layouts responsivos.</p><p>Um layout responsivo representa a forma como os elementos ficam alinhados numa página em resoluções diferentes. É importante compreender como utilizar o sistema de grelha (do inglês, <em>grid system</em>) antes de aprender qualquer outro componente do Bootstrap 4, porque, para qualquer elemento que utilizes, terás de colocá-lo algures no ecrã.</p><p>Vamos começar!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/bIvdmOpWL2YSwkrfoTrOUWMPwyhyjhgyDDND.gif" class="kg-image" alt="bIvdmOpWL2YSwkrfoTrOUWMPwyhyjhgyDDND" width="800" height="600" loading="lazy"><figcaption>Crédito da <a href="https://dribbble.com/shots/4948320-Computer-Mouse">imagem</a> para <a href="https://dribbble.com/animade">Animade</a></figcaption></figure><h3 id="-ndice"><strong>Índice</strong></h3><ul><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-o-sistema-de-grelha-do-bootstrap-4-em-10-minutos/#recipientes-do-bootstrap-4">Recipientes do Bootstrap 4</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-o-sistema-de-grelha-do-bootstrap-4-em-10-minutos/#linhas-do-bootstrap-4">Linhas do Bootstrap 4</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-o-sistema-de-grelha-do-bootstrap-4-em-10-minutos/#colunas-do-bootstrap-4">Colunas do Bootstrap 4</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-o-sistema-de-grelha-do-bootstrap-4-em-10-minutos/#leitura-adicional">Leitura adicional</a></li></ul><p>A grelha do Bootstrap 4 consiste em recipientes (do inglês, <em>containers</em>), linhas e colunas. Vamos observar cada um e explicá-los.</p><h3 id="recipientes-do-bootstrap-4"><strong>Recipientes do Bootstrap 4</strong></h3><p>Um recipiente do Bootstrap 4 é um elemento com a classe <code>.container</code>. O recipiente é a raiz do sistema de grelha do Bootstrap 4 e é utilizado para controlar a largura do layout.</p><p>O recipiente do Bootstrap 4 contém todos os elementos na página. Isto quer dizer que a tua página deve ter a seguinte estrutura: primeiro o corpo da página HTML, dentro dele, deves adicionar um recipiente e todos os outros elementos dentro do recipiente.</p><pre><code class="language-html">&lt;body&gt;
   &lt;div class="container"&gt;
    ...
   &lt;/div&gt;
&lt;/body&gt;</code></pre><p>A simples classe <code>.container</code> define a largura do layout com base na largura do ecrã. Esta posiciona o conteúdo no centro da página, alinhando-o horizontalmente. Existe espaçamento igual entre o recipiente do Bootstrap 4 e o limite esquerdo e direito da página.</p><p>O <code>.container</code> diminui gradualmente à medida que a largura do ecrã diminui e ocupa a largura toda em mobile. A largura do recipiente é definida dentro da biblioteca do Bootstrap 4 para todas as dimensões de ecrã. Podes ver os <a href="https://getbootstrap.com/docs/4.1/layout/grid/#grid-options" rel="noopener">tamanhos exatos aqui</a>.</p><p>Um recipiente de largura completa ocupa 100% da dimensão do ecrã, independentemente da largura do ecrã. Para utilizá-lo é necessário adicionares a classe .<code>container-fluid</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1rf1sYoCfHD8IlHcFIed9qH5pttf4Bf1KSsw.png" class="kg-image" alt="1rf1sYoCfHD8IlHcFIed9qH5pttf4Bf1KSsw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/1rf1sYoCfHD8IlHcFIed9qH5pttf4Bf1KSsw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1rf1sYoCfHD8IlHcFIed9qH5pttf4Bf1KSsw.png 800w" sizes="(min-width: 720px) 720px" width="800" height="230" loading="lazy"></figure><pre><code class="language-html">&lt;div class="container"&gt;
  Hello! I am in a simple container.
&lt;/div&gt;

&lt;div class="container-fluid"&gt;
  Hello! I am in a full-width container.
&lt;/div&gt;</code></pre><p>Podes observar o CodePen <a href="https://codepen.io/cristinaconacel/pen/XBLVre" rel="noopener">aqui</a>.</p><p>Para ver as diferenças entre os dois tipos de recipientes, podes abrir o <em>pen</em> na tua consola e alternar entre dimensões de ecrã.</p><h3 id="linhas-do-bootstrap-4"><strong>Linhas do Bootstrap 4</strong></h3><p>As linhas do Bootstrap 4 são cortes horizontais do ecrã. São utilizadas apenas como invólucros das colunas. Para utilizá-las, precisas da classe <code>.row</code>.</p><pre><code class="language-html">&lt;div class="row"&gt;
  ...
&lt;/div&gt;</code></pre><p>Aqui estão as coisas mais importantes para memorizares sobre as linhas do Bootstrap 4:</p><ul><li><strong>São utilizadas apenas para conter colunas<strong>. </strong></strong>Se colocares outros elementos dentro da linha juntamente com colunas não irás obter o resultado esperado.</li><li><strong>Têm de ser colocadas dentro de recipientes<strong>. </strong></strong>Se não fizeres isto, irás obter um <em>scroll </em>horizontal na tua página. Isto acontece porque as linhas têm margens negativas à esquerda e de 15 à direita. O recipiente tem <em>paddings </em>de 15px. Por isso, ele neutraliza as margens.</li><li><strong>As colunas têm de ser descendentes da linha<strong>. </strong></strong>Caso contrário, não vão ficar alinhadas. As linhas e colunas são criadas para trabalhar em conjunto nesta hierarquia rigorosa.</li></ul><h3 id="colunas-do-bootstrap-4"><strong>Colunas do Bootstrap 4</strong></h3><p>Podemos agora avançar para a parte interessante deste tutorial, as colunas do Bootstrap 4. As colunas são óptimas! Ajudam-te a dividir o ecrã horizontalmente.</p><p>Se colocares apenas uma coluna na tua linha, esta irá ocupar toda a largura. Se adicionares duas colunas, cada uma delas irá ocupar 1/2 da largura. O mesmo acontece para qualquer número de colunas.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/aaNpgARcShivW4WorInpghjdLbX7Jiohd2DA.png" class="kg-image" alt="aaNpgARcShivW4WorInpghjdLbX7Jiohd2DA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/aaNpgARcShivW4WorInpghjdLbX7Jiohd2DA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/aaNpgARcShivW4WorInpghjdLbX7Jiohd2DA.png 800w" sizes="(min-width: 720px) 720px" width="800" height="187" loading="lazy"></figure><pre><code class="language-html">&lt;div class="container"&gt;
  &lt;div class="row"&gt;
    &lt;div class="col"&gt;
      ...
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="row"&gt;
    &lt;div class="col"&gt;
      ...
    &lt;/div&gt;
    &lt;div class="col"&gt;
       ...
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="row"&gt;
    &lt;div class="col"&gt;
      ...
    &lt;/div&gt;
    &lt;div class="col"&gt;
       ...
    &lt;/div&gt;
    &lt;div class="col"&gt;
      ...
    &lt;/div&gt;
    &lt;div class="col"&gt;
       ...
    &lt;/div&gt;
    &lt;div class="col"&gt;
       ...
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</code></pre><p><em>Podes ver este código no<em> </em></em><a href="https://codepen.io/cristinaconacel/pen/NOLEyy" rel="noopener"><em><em>CodePen</em></em></a><em><em>.</em></em></p><p><strong>Observação<strong>: </strong></strong>as colunas não estão coloridas. Apenas adicionei cores para uma descrição mais atrativa visualmente/de maneira a que tenham melhor aspeto.</p><h3 id="definir-dimens-es-para-colunas"><strong>Definir dimensões para colunas</strong></h3><p>Utilizar a classe <code>.col</code> define dinamicamente a largura para as colunas. Isto quer dizer que, dependendo do número de colunas numa linha, a largura da coluna será a largura do recipiente dividida pelo número de colunas.</p><p>Existe, porém, outra forma de definir colunas. Podes utilizar classes para colunas e definir o seu tamanho.</p><p>Desde o início, a grelha do Bootstrap 4 consiste em 12 colunas. Podes selecionar qualquer dimensão entre 1 e 12 para a tua coluna. Se quiseres 3 colunas iguais, podes utilizar <code>.col-4</code> em cada uma (porque 3*4 colunas cada = 12). Como alternativa, podes definir dimensões diferentes para elas. Aqui estão alguns exemplos:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/3ib3OrRrGbxeQNZengIzNKNf4Pkm3nYuVGW8.png" class="kg-image" alt="3ib3OrRrGbxeQNZengIzNKNf4Pkm3nYuVGW8" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/3ib3OrRrGbxeQNZengIzNKNf4Pkm3nYuVGW8.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/3ib3OrRrGbxeQNZengIzNKNf4Pkm3nYuVGW8.png 800w" sizes="(min-width: 720px) 720px" width="800" height="275" loading="lazy"></figure><pre><code class="language-html">&lt;div class="row"&gt;
  &lt;div class="col-6"&gt;
    ...
  &lt;/div&gt;
  &lt;div class="col-6"&gt;
     ...     
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="row"&gt;
  &lt;div class="col-5"&gt;
    ...
  &lt;/div&gt;
  &lt;div class="col-7"&gt;
     ...     
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="row"&gt;
  &lt;div class="col-3"&gt;
    ...
  &lt;/div&gt;
  &lt;div class="col-4"&gt;
     ...     
  &lt;/div&gt;
&lt;/div&gt;
&lt;div class="row"&gt;
  &lt;div class="col-6"&gt;
    ...
  &lt;/div&gt;
  &lt;div class="col-7"&gt;
     ...     
  &lt;/div&gt;
&lt;/div&gt;</code></pre><p>Podes ver este código no <a href="https://codepen.io/cristinaconacel/pen/xyaQNw" rel="noopener">CodePen</a>.</p><p>Se a soma das colunas na tua linha não resultar em 12, elas não vão ocupar toda a linha. Se a soma das colunas ultrapassar 12 então a coluna segue para a linha seguinte. A primeira linha irá exibir apenas os primeiros elementos cuja soma resulta em 12 ou menos.</p><h3 id="definir-pontos-de-quebra-para-colunas"><strong>Definir pontos de quebra para colunas</strong></h3><p>Se pegares no exemplo acima e o quiseres exibir em <em>mobile</em>, podes deparar-te com alguns problemas. Exibir cinco colunas em mobile vai tornar o conteúdo ilegível.</p><p>É aqui que entram em ação os componentes mais potentes do Bootstrap 4. De maneira a teres layouts diferentes em ecrãs de dimensões diferentes, não vais precisar de escrever <em>media queries</em>. Em vez disso, podes utilizar os pontos de quebra das colunas.</p><p>Um ponto de quebra é uma variável do Bootstrap 4 que representa a resolução de ecrã. Quando estás a especificar um ponto de quebra para uma classe, estás a indicar à classe para estar ativa apenas em resoluções que são pelo menos tão grandes como o número que o ponto de quebra armazena.</p><p>A classe mais simples que vamos aprender é a classe <code>.col-[breakpoint]</code>. Quando utilizas esta classe, estás a definir o comportamento para as colunas apenas quando são exibidas em dispositivos com um resolução de pelo menos o que está definido no ponto de quebra. Até ao ponto de quebra fornecido, as tuas colunas vão alinhar-se verticalmente desde o início. Após o teu ponto de quebra, estas vão alinhar-se horizontalmente por causa da classe.</p><p>O Bootstrap tem 4 pontos de quebra que podes utilizar:</p><ul><li><code>.col-sm</code> para telemóveis maiores (dispositivos com resoluções ≥ 576px);</li><li><code>.col-md</code> para <em>tablets </em>(≥768px);</li><li><code>.col-lg</code> para computadores portáteis (≥992px);</li><li><code>.col-xl</code> para computadores (≥1200px)</li></ul><p>Digamos que queres exibir duas colunas, uma após a outra verticalmente, em ecrãs pequenos e na mesma linha em ecrãs maiores. Terás de especificar o ponto de quebra onde as colunas ficam na mesma linha.</p><p>No nosso exemplo, vamos utilizar o ponto de quebra <code>.col-lg</code> e ver como as colunas ficam em ecrãs diferentes. Para resoluções que são menores do que o ponto de quebra fornecido (&lt;992px), as colunas serão exibidas verticalmente. Isto significa que em dispositivos <em>mobile </em>e <em>tablets</em>, as colunas terão este aspeto:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/JZZ4xgPEjOQ09MBX8NoX65F9XLn4esZ2HnCi.png" class="kg-image" alt="JZZ4xgPEjOQ09MBX8NoX65F9XLn4esZ2HnCi" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/JZZ4xgPEjOQ09MBX8NoX65F9XLn4esZ2HnCi.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/JZZ4xgPEjOQ09MBX8NoX65F9XLn4esZ2HnCi.png 800w" sizes="(min-width: 720px) 720px" width="800" height="310" loading="lazy"><figcaption>Exibição para resoluções &lt; 992px (dispositivos <em>mobile</em>).</figcaption></figure><p>Para dispositivos que têm uma resolução que é maior ou igual ao ponto de quebra (≥992px), as colunas ficam na mesma linha. Isto significa que, em portáteis e computadores vais obter este resultado:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/YCvBIbCtFgLI9Ret9gwVbnkNxuu1wk8EjR-l.png" class="kg-image" alt="YCvBIbCtFgLI9Ret9gwVbnkNxuu1wk8EjR-l" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/YCvBIbCtFgLI9Ret9gwVbnkNxuu1wk8EjR-l.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/YCvBIbCtFgLI9Ret9gwVbnkNxuu1wk8EjR-l.png 800w" sizes="(min-width: 720px) 720px" width="800" height="83" loading="lazy"><figcaption>Exibição para resoluções &gt;= 992px (portáteis e ecrãs maiores).</figcaption></figure><pre><code class="language-html">&lt;div class="row"&gt;
 &lt;div class="col-lg"&gt;
   ...
 &lt;/div&gt;
 &lt;div class="col-lg"&gt;
    ...   
 &lt;/div&gt;
&lt;/div&gt;</code></pre><p>Podes ver este código no <a href="https://codepen.io/cristinaconacel/pen/OBoqqz" rel="noopener">CodePen</a>.<em><em> </em></em>Se abrires o Codepen noutra janela e observares a página em resoluções diferentes, verás as colunas a alterar o seu posicionamento.</p><p>Se quisesses que as duas colunas ficassem na mesma linha a partir da dimensão de telemóveis maiores, poderias utilizar <code>.col-sm</code>, para <em>tablets </em><code>.col-md</code> e para ecrãs extra largos <code>.col-xl</code>.</p><h3 id="definir-dimens-es-e-pontos-de-quebra-para-colunas"><strong>Definir dimensões e pontos de quebra para colunas</strong></h3><p>Podes combinar as dimensões e os pontos de quebra e utilizar apenas uma classe com o formato <code>.col-[breakpoint]-[tamanho]</code>.</p><p>Por exemplo, se quiseres que três colunas de dimensões diferentes fiquem alinhadas numa linha com a resolução de um portátil, precisas de fazer isto:</p><pre><code class="language-html">&lt;div class="row"&gt;
  &lt;div class="col-lg-4"&gt;
    ...
  &lt;/div&gt;
  &lt;div class="col-lg-3"&gt;
    ...
  &lt;/div&gt;
  &lt;div class="col-lg-5"&gt;
    ...     
  &lt;/div&gt;
&lt;/div&gt;</code></pre><p>Irás obter este resultado em resoluções &lt;992px:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/KH7dwBmHGHssTgFII9tlk0IlzJ2lTFjoDuY1.png" class="kg-image" alt="KH7dwBmHGHssTgFII9tlk0IlzJ2lTFjoDuY1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/KH7dwBmHGHssTgFII9tlk0IlzJ2lTFjoDuY1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/KH7dwBmHGHssTgFII9tlk0IlzJ2lTFjoDuY1.png 800w" sizes="(min-width: 720px) 720px" width="800" height="411" loading="lazy"></figure><p>Para ecrãs que são ≥992px, o resultado será este:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/xLOVbs29mzGIiSe9WKNfIUyKwL2fEc6n0pp8.png" class="kg-image" alt="xLOVbs29mzGIiSe9WKNfIUyKwL2fEc6n0pp8" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/xLOVbs29mzGIiSe9WKNfIUyKwL2fEc6n0pp8.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/xLOVbs29mzGIiSe9WKNfIUyKwL2fEc6n0pp8.png 800w" sizes="(min-width: 720px) 720px" width="800" height="94" loading="lazy"></figure><p>De novo, podes ver este código no <a href="https://codepen.io/cristinaconacel/pen/ReYOwZ" rel="noopener">CodePen</a>.</p><p>Se, porém, quiseres exibir uma coluna por linha em resoluções <em>mobile </em>mais pequenas, duas colunas por linha em <em>tablets </em>e quatro em portáteis ou dispositivos de maior resolução, o que podes fazer?</p><p>Adicionas várias classes para uma única coluna a descrever o comportamento em cada resolução. Ao utilizar várias classes, especificas que o conteúdo ocupará seis lugares em <em>tablets</em> e três em portáteis.</p><pre><code class="language-html">&lt;div class="row"&gt;
  &lt;div class="col-sm-6 col-lg-3"&gt;
    ...
  &lt;/div&gt;
  &lt;div class="col-sm-6 col-lg-3"&gt;
    ...
  &lt;/div&gt;
  &lt;div class="col-sm-6 col-lg-3"&gt;
     ...     
  &lt;/div&gt;
  &lt;div class="col-sm-6 col-lg-3"&gt;
     ...     
  &lt;/div&gt;
&lt;/div&gt;</code></pre><p>O resultado será apresentado assim em <em>tablets</em>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/8Ub6sFDws2UJO8qyLNx3zXiWMylQWpIeLPyX.png" class="kg-image" alt="8Ub6sFDws2UJO8qyLNx3zXiWMylQWpIeLPyX" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/8Ub6sFDws2UJO8qyLNx3zXiWMylQWpIeLPyX.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/8Ub6sFDws2UJO8qyLNx3zXiWMylQWpIeLPyX.png 800w" sizes="(min-width: 720px) 720px" width="800" height="180" loading="lazy"></figure><p>Em portáteis e resoluções maiores, terás este resultado:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/hVaaOjxUkTRDXBpyKNRBIZt6mzerVq-UoFHO.png" class="kg-image" alt="hVaaOjxUkTRDXBpyKNRBIZt6mzerVq-UoFHO" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/hVaaOjxUkTRDXBpyKNRBIZt6mzerVq-UoFHO.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/hVaaOjxUkTRDXBpyKNRBIZt6mzerVq-UoFHO.png 800w" sizes="(min-width: 720px) 720px" width="800" height="58" loading="lazy"></figure><p>Este exemplo também está disponível no <a href="https://codepen.io/cristinaconacel/pen/mjZBPO" rel="noopener">CodePen</a>.</p><p>Como exercício, podes tentar criar linhas com números diferentes de colunas, dependendo da dimensão do ecrã, e verificar o comportamento na consola do teu navegador.</p><h3 id="deslocar-colunas"><strong>Deslocar colunas</strong></h3><p>Se não quiseres que as colunas fiquem encostadas umas às outras, podes utilizar a classe <code>.offset-[breakpoint]-[tamanho]</code>, juntamente com o <code>.col-[breakpoint]-[tamanho]</code>.</p><p>Utilizar esta classe é como adicionar uma coluna vazia antes da tua coluna. Aqui está um simples exemplo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/b7dxvLZ2St8xI37XTc0R8kFvdfae2Zjvqbmf.png" class="kg-image" alt="b7dxvLZ2St8xI37XTc0R8kFvdfae2Zjvqbmf" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/b7dxvLZ2St8xI37XTc0R8kFvdfae2Zjvqbmf.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/b7dxvLZ2St8xI37XTc0R8kFvdfae2Zjvqbmf.png 800w" sizes="(min-width: 720px) 720px" width="800" height="102" loading="lazy"></figure><pre><code class="language-html">&lt;div class="row"&gt;
  &lt;div class="col-md-4 offset-md-4"&gt;
     ...     
  &lt;/div&gt;  
  &lt;div class="col-md-4"&gt;
     ...     
  &lt;/div&gt;  
&lt;/div&gt;</code></pre><p>Podes ver este código no <a href="https://codepen.io/cristinaconacel/pen/KGxYaL" rel="noopener">CodePen</a>.</p><p>Podes utilizar a classe em qualquer coluna da linha. Aqui estão mais alguns exemplos:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/tem6Qp-WqVavEKizT-OIshNBMSDDrSVP3wIY.png" class="kg-image" alt="tem6Qp-WqVavEKizT-OIshNBMSDDrSVP3wIY" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/tem6Qp-WqVavEKizT-OIshNBMSDDrSVP3wIY.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/tem6Qp-WqVavEKizT-OIshNBMSDDrSVP3wIY.png 800w" sizes="(min-width: 720px) 720px" width="800" height="154" loading="lazy"></figure><pre><code class="language-html">&lt;div class="row"&gt;
  &lt;div class="col-md-4"&gt;
     ...     
  &lt;/div&gt;  
  &lt;div class="col-md-4 offset-md-4"&gt;
     ...     
  &lt;/div&gt;  
&lt;/div&gt;
&lt;div class="row"&gt;
  &lt;div class="col-md-4 offset-md-2"&gt;
     ...    
  &lt;/div&gt;  
  &lt;div class="col-md-4 offset-md-2"&gt;
     ...     
  &lt;/div&gt;  
&lt;/div&gt;
&lt;div class="row"&gt;
  &lt;div class="col-md-6 offset-md-3"&gt;
     ...
  &lt;/div&gt;   
&lt;/div&gt;</code></pre><h3 id="colocar-linhas-dentro-de-colunas"><strong>Colocar linhas dentro de colunas</strong></h3><p>Pode ser uma surpresa, mas podes adicionar uma linha dentro de uma coluna!</p><p>A linha em questão (que terá a largura da sua coluna pai) será, então, dividida em 12 colunas (mais pequenas) que podes referenciar através das classes <code>.col-* </code>.</p><p>Vamos observar o que acontece quando inserimos uma nova linha dentro de uma coluna:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/SiRLnZuYJJqLeAK2eN42Xhb9dZz9s87wDaN7.png" class="kg-image" alt="SiRLnZuYJJqLeAK2eN42Xhb9dZz9s87wDaN7" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/SiRLnZuYJJqLeAK2eN42Xhb9dZz9s87wDaN7.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/SiRLnZuYJJqLeAK2eN42Xhb9dZz9s87wDaN7.png 800w" sizes="(min-width: 720px) 720px" width="800" height="130" loading="lazy"></figure><pre><code class="language-html">&lt;div class="row"&gt;
    &lt;div class="col-md-8"&gt;
        ...
        &lt;div class="row"&gt;
            &lt;div class="col-md-5"&gt;
               ...
            &lt;/div&gt;
            &lt;div class="col-md-7"&gt;
               ...   
            &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;     
    &lt;/div&gt;
    &lt;div class="col-md-4"&gt;
       ...
    &lt;/div&gt;
&lt;/div&gt;</code></pre><p>Podes ver este código no <a href="https://codepen.io/cristinaconacel/pen/OBoGZr" rel="noopener">CodePen</a>.</p><p>Ao saber isto, podes aprofundar muito a organização da tua informação. As colunas vão fornecer uma maneira simples de poderes gerir o teu espaço.</p><p>Isto termina os conhecimentos básicos em relação ao sistema responsivo de grelha do Bootstrap 4.</p><h3 id="leitura-adicional"><strong>Leitura adicional</strong></h3><p>Se tiveres mais algum tempo, aqui estão alguns recursos bastante úteis:</p><ul><li><a href="https://getbootstrap.com/docs/4.1/layout/grid/" rel="noopener">Documentação oficial do sistema de grelha</a> (link em inglês), do GetBootstrap</li><li><a href="https://scrimba.com/p/pD5KUE/cdm3asD" rel="noopener">Tutorial em vídeo</a> (link em inglês), do Scrimba</li></ul><p>Este artigo foi publicado inicialmente no <a href="https://bootstrapbay.com/blog/day-2-bootstrap-4-grid-system-tutorial-examples/" rel="noopener">blog BootstrapBay</a>. Faz parte de uma grande série de tutoriais do Bootstrap 4 chamada <a href="https://bootstrapbay.com/blog/14-days-bootstrap-4/" rel="noopener">14 Days of Bootstrap 4</a> (14 Dias de Bootstrap 4, em inglês). Se desejares continuar a aprender sobre os componentes do Bootstrap 4, estes artigos são um bom sítio para começar.</p><p>Se quiseres alavancar o teu desenvolvimento com um template do Bootstrap, podes verificar o nosso <a href="http://bootstrapbay.com/" rel="noopener">marketplace</a>.</p><p>Antes de te aprofundares, contudo, tira um momento para celebrar as tuas novas habilidades obtidas!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/gS3FeSJGquHlZEzANXWSsAakOD2FbabpNvD7.gif" class="kg-image" alt="gS3FeSJGquHlZEzANXWSsAakOD2FbabpNvD7" width="800" height="600" loading="lazy"><figcaption>Crédito da <a href="https://dribbble.com/shots/4198035-Sweet-Berry-Wine">imagem</a> para <a href="https://dribbble.com/jonasmosesson">Jonas Mosesson</a></figcaption></figure> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como se tornar um desenvolvedor e conseguir o seu primeiro emprego o quanto antes. ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Sam Williams Você já pensou em se tornar um desenvolvedor de software ou está pensando em trocar de carreira? Este artigo dará a você um plano sólido para aprender desenvolvimento de software e conseguir seu primeiro emprego! Por que ser um desenvolvedor? Se você está considerando se tornar ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-e-conseguir-o-seu-primeiro-emprego-o-quanto-antes-a-developer-and-get-your-first-job-as-quickly-as-possible/</link>
                <guid isPermaLink="false">63f3db9a58018c06027bfa6b</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento para a Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Barbara Reis Bayer ]]>
                </dc:creator>
                <pubDate>Mon, 17 Apr 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_LMEECiXhk715h-VCFyb-GA.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/become-a-developer-and-get-your-first-job-fast-7b8ac26d84c6/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to become a developer and get your first job as quickly as possible</a>
      </p><p>Escrito por: Sam Williams</p><p>Você já pensou em se tornar um desenvolvedor de <em>software</em> ou está pensando em trocar de carreira? Este artigo dará a você um plano sólido para aprender desenvolvimento de <em>software</em> e conseguir seu primeiro emprego!</p><h3 id="por-que-ser-um-desenvolvedor"><strong>Por que ser um desenvolvedor<strong>?</strong></strong></h3><p>Se você está considerando se tornar um desenvolvedor, mas não tem certeza se é uma boa ideia, aqui estão algumas coisas a se pensar: </p><ol><li>Há uma demanda muito grande por desenvolvedores — no momento em que este artigo foi escrito, o <em>site</em> Indeed tinha 37.739 anúncios de emprego para 'desenvolvedor' no Reino Unido e 145.640 nos Estados Unidos. Esses números só aumentarão, já que o Departamento de Estatísticas de Trabalho dos Estados Unidos estima um aumento de 17% entre 2014 e 2024. </li><li>O trabalho pode ser muito variado e interessante — como desenvolvedor, você pode trabalhar em uma variedade de projetos, de<em> sites</em> da <em>web</em> de <em>e-commerce</em> a jogos de computador, de aplicações para dispositivos móveis à inteligência artificial. Quase todas as habilidades são transferíveis entre cada uma dessas áreas. Isso quer dizer que você não estará preso a um só emprego. </li><li>O trabalho pode ser bastante flexível — como a maior parte do seu trabalho é ler e escrever código, tudo o que você precisa é de um computador. Isso quer dizer que pode ser feito em qualquer lugar, a qualquer hora. Há um número crescente de desenvolvedores que trabalham remotamente em casa ou enquanto viajam ao redor do mundo. </li></ol><h3 id="como-se-tornar-um-desenvolvedor"><strong>Como se tornar um desenvolvedor</strong></h3><p>Ser um desenvolvedor requer muitas habilidades e há dois fatores importantes para se desenvolver uma habilidade: a prática eficaz e o apoio de desenvolvedores sênior. Você precisa maximizar ambos para que venha a se tornar o melhor desenvolvedor possível. Há três boas maneiras de se ter certeza de que você está em um caminho rápido para começar a sua carreira de desenvolvedor: </p><h4 id="bootcamps-cursos-intensivos-de-programa-o-"><strong><strong><em>Bootcamps</em></strong> (cursos intensivos de programação)</strong></h4><p>Estes cursos são excelentes, pois são projetados para pegar alguém com pouca ou nenhuma experiência e torná-lo preparado para conseguir um emprego em três meses. Isso quer dizer muita prática efetiva e uma ajuda imensa dos desenvolvedores que coordenam o <em>bootcamp</em>. </p><p>Os problemas que você pode ter com <em>bootcamps</em> é que eles geralmente têm uma duração de três meses de ensino em tempo integral e podem custar de 4 a 20 mil dólares. Isso é muito dinheiro para desembolsar, especialmente se você não estiver recebendo durante esses três meses. </p><h4 id="achando-um-mentor"><strong>Achando um mentor</strong></h4><p>Esta é a situação perfeita: você começa a programar e tem um desenvolvedor como seu mentor e tutor. Pode ser algum amigo, um membro da família ou apenas um desenvolvedor que queira ajudar você. Você não terá tanta ajuda como em um <em>bootcamp</em>, mas ter alguém com quem se possa contar quando se encontra um obstáculo é muito útil. Além do mais, ter alguém que acompanhe você e que se certifique que você está dedicando o tempo necessário aos estudos pode ajudar você a se manter no caminho certo. </p><p>Isso tudo soa formidável, mas encontrar um mentor pode ser difícil. Nem todo mundo conhece alguém que trabalha como desenvolvedor e isso requer muito trabalho extra para o mentor. Se você conhece algum desenvolvedor, ele pode se recusar a ser seu mentor e você precisará respeitar isso. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/GhrrQUXaT2aRowkxKEs6T4RJQjsm4pu8yyiU.jpg" class="kg-image" alt="GhrrQUXaT2aRowkxKEs6T4RJQjsm4pu8yyiU" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/GhrrQUXaT2aRowkxKEs6T4RJQjsm4pu8yyiU.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/GhrrQUXaT2aRowkxKEs6T4RJQjsm4pu8yyiU.jpg 800w" sizes="(min-width: 720px) 720px" width="800" height="533" loading="lazy"><figcaption>Ter um mentor pode ser ótimo.</figcaption></figure><h4 id="conseguindo-um-trabalho-como-desenvolvedor"><strong>Conseguindo um trabalho como desenvolvedor</strong></h4><p>Isso pode parecer meio estranho, já que você precisa estar apto a programar antes de conseguir um emprego, mas explicarei mais tarde como chegar a esse ponto sem um mentor ou <em>bootcamp. </em>Quando você conseguir seu primeiro emprego, você poderá ter uma imensa vantagem — estará sendo pago para praticar programação enquanto trabalha com desenvolvedores sênior<em>. </em>O que mais você pode querer? &nbsp;</p><p>Trabalhar como um desenvolvedor também deixará você exposto a um lado do desenvolvimento que você não conhecerá nos estudos: o lado comercial. Essa é uma parte imensa do desenvolvimento, já que não há nenhuma razão em fazer um produto que ninguém quer e lidar com clientes é uma habilidade que leva tempo para se aprender.</p><h3 id="come-ando-o-planejamento"><strong>Começando o planejamento</strong></h3><p>Como nem todo mundo pode custear um <em>bootcamp</em> ou conhece alguém para ser seu mentor, darei aqui um plano para conseguir seu primeiro emprego como desenvolvedor. Foi praticamente assim <a href="https://www.freecodecamp.org/news/getting-your-first-developer-job-with-little-experience-ff7b18299d6c">que eu fui de engenheiro a desenvolvedor em somente 4 meses</a> (texto em inglês).</p><h4 id="encontrando-um-emprego"><strong>Encontrando um emprego </strong></h4><p>Para criar um bom plano você precisa ter um objetivo em mente. Nossa meta é conseguir um emprego o mais rápido possível, o quanto antes você conseguir seu primeiro emprego, mais rápido terá o estímulo de praticar a programação todos os dias tendo o apoio de desenvolvedores sênior e com o bônus de receber por isso. </p><p>Há muitas maneiras de se entrar no mundo do desenvolvimento, desde ciência de dados e inteligência artificial a desenvolvimento de jogos, mas o setor mais fácil para se entrar é o de desenvolvedor para a <em>web. </em>Se você estiver com outros planos no momento, lembre-se de que começar no desenvolvimento para a <em>web</em> não quer necessariamente dizer que você estará preso a isso para sempre. Você aprenderá muito e com isso poderá transferir esse conhecimento adquirido para o campo desejado. </p><p>Quando eu procurei por <strong>desenvolvedor para a web júnior</strong>, a primeira vaga de emprego que eu vi foi para <strong>desenvolvedor para a web júnior em <em>front-end</em></strong>. Os requisitos eram os seguintes:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/rLbZUCrDgAFdd5Il24L8frle9KTmNtdARZu2.png" class="kg-image" alt="rLbZUCrDgAFdd5Il24L8frle9KTmNtdARZu2" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/rLbZUCrDgAFdd5Il24L8frle9KTmNtdARZu2.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/rLbZUCrDgAFdd5Il24L8frle9KTmNtdARZu2.png 800w" sizes="(min-width: 720px) 720px" width="800" height="547" loading="lazy"></figure><p>Podemos dar uma olhada em alguns anúncios de empregos similares e achar as exigências que aparecem mais frequentemente. Estas são os mais prováveis: </p><ul><li>Conhecimento em <em>front-end</em>: HTML, CSS e JavaScript </li><li>Habilidade de criar <em>sites</em> responsivos para a <em>web</em></li><li>Um portfólio demonstrando sua experiência e habilidades</li><li>Conhecimento em controle de versão </li></ul><p>Outras habilidades bônus podem incluir: </p><ul><li>Bibliotecas do JavaScript: jQuery, AJAX, Bootstrap </li><li>Conhecimento em depuração (do inglês, <em>debugging</em>) </li></ul><h3 id="criando-o-plano"><strong>Criando o plano </strong></h3><p>Agora que sabemos o que precisamos aprender para cumprir os requisitos, podemos criar um planejamento de como aprender o que precisamos para alcançar nossas metas. Tente seguir esse planejamento passo a passo, já que será muito mais fácil aprender o conteúdo mais avançado se você já souber os que vêm antes. </p><h4 id="html-e-css"><strong><strong>HTML </strong>e<strong> CSS</strong></strong></h4><p>Esses são os blocos construtores da maioria dos <em>sites</em> da <em>web</em> hoje em dia. Você precisa desenvolver um bom entendimento deles se quiser ter uma chance de conseguir um emprego. Por sorte, há centenas de recursos pagos e gratuitos por aí que podem ajudar você a dominar essas competências.</p><p>O <a href="https://www.freecodecamp.org/portuguese/learn/">freeCodeCamp</a> é um <em>site</em> que ensina a você tudo o que envolve o desenvolvimento para a <em>web</em> e é incrível. Ele dá o passo a passo através de pequenas aulas. Foi onde eu aprendi HTML, CSS, e JavaScript!</p><p>Começaremos com a certificação de Design Responsivo para Web e com o <strong>Básico de HTML e HTML5</strong> e com o <strong>CSS Básico</strong>. Essas seções introduzirão você ao HTML e ao CSS. Até o final delas, você estará criando formas e estilizando HTML com variáveis em cascatas.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/9NnVZviy8j8wW69H6Dh5vYQcLwchkTGSvJSF.png" class="kg-image" alt="9NnVZviy8j8wW69H6Dh5vYQcLwchkTGSvJSF" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/9NnVZviy8j8wW69H6Dh5vYQcLwchkTGSvJSF.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/9NnVZviy8j8wW69H6Dh5vYQcLwchkTGSvJSF.png 800w" sizes="(min-width: 720px) 720px" width="800" height="608" loading="lazy"><figcaption>Uma imagem que você criará no <em>CSS Básico: variáveis do CSS em cascata</em></figcaption></figure><p>Para aperfeiçoar nosso CSS, completaremos a nossa seção de <strong>design visual aplicado</strong> até podermos <strong>criar uma forma mais complexa usando o CSS e o HMTL</strong>. Depois, faremos todo o <strong>design responsivo para a web</strong> e a seção do <strong>CSS Flexbox</strong>. Estamos pulando alguns dos desafios e seções por agora, já que o nosso objetivo é aprender o que precisamos imediatamente. As outras seções são ótimas, mas não precisaremos delas no momento. </p><p>Agora que aprendemos a usar o HTML e o CSS para construir e estilizar uma página de <em>web</em>, teremos uma prática mais efetiva completando o <strong>design responsivo para a web</strong>. Esses projetos usarão tudo o que aprendemos até agora para construir cinco <em>sites</em>.</p><h4 id="controle-de-vers-o"><strong>Controle de versão</strong></h4><p>O controle de versão é um sistema onde você salva arquivos para que possa vê-los novamente no futuro e perceber o que você alterou e em que momento. Isso provavelmente será usado em toda empresa de <em>software</em> em que você for trabalhar. Assim, ter esse conhecimento é muito importante.</p><p>Aprenda como instalar o Git, crie uma conta no GitHub e trabalhe com ambos. Há um tutorial ótimo em <a href="https://product.hubspot.com/blog/git-and-github-tutorial-for-beginners">Uma Introdução ao Git e GitHub</a> (em inglês). Você pode aprender os dois antes mesmo dos projetos de design do HTML e CSS e começar a usar o controle de versão desses projetos.</p><p>Quando souber como usar o controle de versão, tente fazer todos os seus projetos em um editor local (como o <a href="https://code.visualstudio.com/">VS Code</a>) e faça um <em>upload</em> deles para o CodePen quando terminá-los. Trabalhar em um editor local será exatamente o que você fará em um emprego. Isso, portanto, ajudará você a construir mais essa experiência.</p><p>Há muitas maneiras de se usar o Git/controle de versão, mas você quer saber como criar um repositório no GitHub, vinculá-lo a uma pasta local, incorporar os trabalhos que você fez e colocar tudo isso no GitHub. Uma vez que você possa fazer isso, será capaz de trabalhar de maneia efetiva e, assim, fazer realmente parte do time de desenvolvedores.</p><h4 id="javascript"><strong><strong>JavaScript</strong></strong></h4><p>O JavaScript é a linguagem que alimenta 94.8% dos <em>sites</em> da <em>web </em>na internet. Isso representa muitos sites! O JavaScript permite mudar um site de estático para um completamente interativo. </p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/0Nbc87SRHKhCzKuwMSSQTeT8xMz4nHkdGOxE.jpg" class="kg-image" alt="0Nbc87SRHKhCzKuwMSSQTeT8xMz4nHkdGOxE" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/0Nbc87SRHKhCzKuwMSSQTeT8xMz4nHkdGOxE.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/0Nbc87SRHKhCzKuwMSSQTeT8xMz4nHkdGOxE.jpg 800w" sizes="(min-width: 720px) 720px" width="800" height="450" loading="lazy"></figure><p>Para aprender JavaScript, podemos fazer o <strong>certificação de algoritmos e estruturas de dados em JavaScript</strong>, no <a href="https://www.freecodecamp.org/portuguese/learn/">freeCodeCamp</a>. Como o Javascript é uma parte tão grande dos<em> sites</em> modernos, completaremos toda a grade dessa certificação. Pode parecer muito trabalho, mas quando você trabalha como desenvolvedor para a <em>web</em>, passará a maior parte do tempo escrevendo em JavaScript. Assim, é importante que você realmente tenha capacidade de trabalhar com ele.</p><h4 id="construindo-seu-portf-lio"><strong>Construindo seu portfólio </strong></h4><p>Para mostrar do que você é capaz, você precisa ter um portfólio para mostrar aos seus possíveis empregadores. Felizmente, você já terá 10 projetos — 5 em HTML e CSS e 5 em JavaScript. Assegure-se de ter todos eles em controle de versão e transferidos para o GitHub para que outras pessoas (futuros empregadores) possam vê-los e saber do potencial do seu trabalho. &nbsp;</p><p>Agora, você poderá voltar ao <em>site</em> de portfólio que você construiu e atualizar com todos os seus projetos novos. Você também pode utilizar seus conhecimentos em JavaScript para adicionar interatividade à sua página. Pode ser uma descrição em <em>pop-up</em> quando o usuário passar sobre um de seus projetos, um <em>slideshow</em> de imagens ou até mesmo um <em>minigame</em>.</p><h3 id="a-procura-de-emprego"><strong>A procura de emprego</strong></h3><p>Se você fez tudo até agora, já deve cumprir os requisitos de muitos empregos para desenvolvedor para a <em>web </em>júnior. Esse é o momento de se candidatar a alguns empregos. </p><p>Para se candidatar a maioria dos empregos, você precisara de um currículo (CV). Ele deve destacar seus pontos fortes sem atrair atenção demais a quanto tempo você está programando ou ao fato de que você não tem nenhuma experiência comercial. </p><p>Aqui está o CV que eu usei para conseguir meu segundo emprego: &nbsp;</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/2TPq8xaUaP7SFMggokwL4w1hnWXBN3CHBcfW.png" class="kg-image" alt="2TPq8xaUaP7SFMggokwL4w1hnWXBN3CHBcfW" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/2TPq8xaUaP7SFMggokwL4w1hnWXBN3CHBcfW.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/2TPq8xaUaP7SFMggokwL4w1hnWXBN3CHBcfW.png 794w" sizes="(min-width: 720px) 720px" width="794" height="1123" loading="lazy"></figure><p>Saber a quais empregos você deve se candidatar também é importante. Isso pode parecer errado, mas você deveria se candidatar a empregos onde você consegue cumprir 80% (ou mais) dos requisitos. Você sempre pode salientar que, como um desenvolvedor autodidata, você provavelmente atingirá outras exigências mais rápido que os demais. </p><p>É claro que isso não quer dizer que você deva se candidatar a <strong>todo</strong> emprego em que você atenda aos requisitos. Apenas se candidate aos trabalhos que você considere interessantes e que você aceitaria se fossem oferecidos a você. </p><h4 id="usando-os-recrutadores"><strong>Usando os recrutadores</strong></h4><p>Os recrutadores podem ser ferramentas poderosas para conseguir seu primeiro emprego. Eles sabem o que a empresa quer, frequentemente têm empregos que não estão anunciados nos classificados e querem que você consiga o emprego... é assim que eles são pagos.</p><p>Para ter certeza de que seu CV estará nas mãos do maior número possível de recrutadores, precisaremos nos candidatar em vários <em>sites</em>. Comece com os <em>sites</em> maiores, como o <em>Indeed</em> e o <em>Total Jobs</em>, mas tente encontrar sites menores também.</p><p>Muitos desenvolvedores falam sobre o fato de recrutadores serem "terríveis", mas precisamos nos certificar de que podemos ter neles aliados. Sempre que você falar com um recrutador, assegure-se de ser educado e respeitoso. Se eles sondarem você sobre trabalhos que estão muito aquém do que você deseja, agradeça-os e recuse, mas lembre-os de que tipo de emprego você está procurando.</p><p>Meus dois primeiros empregos vieram de recrutadores perguntando sobre um emprego que não era adequado para mim, mas eles tinham outra oferta que era perfeita. Por isso, não seja tão duro com eles. </p><h3 id="continue-se-aprimorando"><strong>Continue se aprimorando</strong></h3><p>Você, provavelmente, não conseguirá uma entrevista e oferta de trabalho na primeira semana em que estiver se candidatando. Você pode não conseguir uma entrevista nem no primeiro mês, mas isso dará a você mais tempo para se aperfeiçoar. </p><p>Agora que alcançamos os requisitos básicos, podemos começar a adicionar mais <strong>itens interessantes de se ter</strong> no kit de ferramentas. Agora é a hora de acrescentar uma nova ferramenta na sua caixa. Incorporar mais habilidades às suas fará com que mais empregadores queiram você e, assim, aumentará suas chances de conseguir uma entrevista. Aqui estão alguns conhecimentos para se adquirir: </p><h4 id="aprenda-uma-biblioteca"><strong>Aprenda uma biblioteca </strong></h4><p>Existem bibliotecas de JavaScript que podem facilitar muito a sua vida. Uma das bibliotecas mais populares é o jQuery, que ajuda com a manipulação do DOM, funções de objetos e de <em>arrays</em> e muito mais.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/JMHNSHdpHxncf6ouMuWnovyaubs41lLqz93Z.png" class="kg-image" alt="JMHNSHdpHxncf6ouMuWnovyaubs41lLqz93Z" srcset="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/JMHNSHdpHxncf6ouMuWnovyaubs41lLqz93Z.png 600w" width="600" height="311" loading="lazy"></figure><p>Eu recomendaria aprender a utilizar o jQuery porque é uma ótima introdução à utilização das bibliotecas em JavaScript. Há vários cursos e tutoriais para aprender jQuery, mas eu ainda prefiro o do freeCodeCamp.</p><blockquote>Nota da tradução: no momento da tradução deste texto, outras bibliotecas foram adquirindo uma importância maior no mundo do desenvolvimento e, agora, conhecer bibliotecas como o React, o Vue ou o Angular serão de maior utilidade para você no desenvolvimento para a web.</blockquote><h4 id="completando-as-aulas-de-html-e-css"><strong>Completando as aulas de HTML e CSS </strong></h4><p>Volte para as aulas de HTML e CSS do freeCodeCamp e complete o resto das lições em <strong>design visual aplicado, acessibilidade aplicada</strong> e <strong>CSS Grid</strong>. </p><h4 id="aprendendo-como-o-javascript-funciona"><strong>Aprendendo como o JavaScript funciona </strong></h4><p>Saber usar o JavaScript é ótimo, mas entender como ele funciona pode ajudar você a se tornar um desenvolvedor muito melhor. Isso permitirá escrever o melhor código possível, já que você saberá o como e o porquê que esse código conserta o problema. </p><p>Para atingir esse conhecimento profundo de JavaScript, eu recomendo fortemente a série de livros "<a href="https://github.com/getify/You-Dont-Know-JS">You Don't Know JS</a>". Os primeiros dois livros são ótimos para compreender os princípios básicos do JavaScript. Entendê-los dará a você um excelente fundamento com o qual você poderá se tornar um desenvolvedor ainda melhor. Eles podem ser acessados <a href="https://github.com/getify/You-Dont-Know-JS">ON-LINE e GRATUITAMENTE</a> ou comprados no formato de <a href="https://www.amazon.co.uk/s/ref=dp_byline_sr_book_1?ie=UTF8&amp;text=Kyle+Simpson&amp;search-alias=books-uk&amp;field-author=Kyle+Simpson&amp;sort=relevancerank">capa dura</a>. </p><h4 id="criando-projetos"><strong>Criando projetos </strong></h4><p>Outro jeito de aperfeiçoar suas habilidades é criando projetos. Eles podem ser qualquer coisa, mas seu objetivo é praticar usando as ferramentas com as quais você tenha menos experiência. Não é bom com <em>arrays</em>? Crie um aplicativo de lista de compras. Um pouco hesitante em estilização? Tente fazer uma cópia exata de algum <em>site</em> da <em>web </em>existente.</p><p>Esses projetos deverão aprimorar seus conhecimentos. Então, se for fácil demais ou muito complicado, pare e comece um projeto que se ajuste melhor ao seu nível. </p><p>Às vezes, ao criar um projeto, você talvez precise aprender uma habilidade completamente diferente. Aprender enquanto se faz pode ser um aprendizado excelente para algumas pessoas. </p><h3 id="entrevistas"><strong>Entrevistas</strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/si-pgLtrX14CeKaLjqGK9TjSkcdr9u4lKRVL.jpg" class="kg-image" alt="si-pgLtrX14CeKaLjqGK9TjSkcdr9u4lKRVL" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/si-pgLtrX14CeKaLjqGK9TjSkcdr9u4lKRVL.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/si-pgLtrX14CeKaLjqGK9TjSkcdr9u4lKRVL.jpg 800w" sizes="(min-width: 720px) 720px" width="800" height="372" loading="lazy"></figure><p>Depois de se candidatar a diversos empregos e de continuar a aprimorar suas habilidades, esperamos que você seja convidado a uma entrevista. Essa é sua hora de brilhar. Há diversos artigos sobre como abordar o processo de entrevistas. Então, eu não examinarei muito a fundo os detalhes aqui, mas destacarei o que <a href="https://medium.com/@samwsoftware/how-to-secure-the-job-of-your-dreams-by-smashing-your-interview-61f38b7cdd0e">este artigo</a> (em inglês) diz: </p><ul><li>Conheça seu CV </li><li>Conheça a empresa </li><li>Pratique suas habilidades </li><li>Seja pontual, educado e confiante </li><li>Faça perguntas </li><li>Acompanhe o processo após a entrevista </li></ul><p>Se você seguir todos esses conselhos, você terá uma boa chance de conseguir uma oferta de emprego. Mesmo que não consiga, certifique-se de pedir um <em>feedback</em> para poder usá-lo da melhor maneira na sua próxima entrevista. </p><h3 id="resumo"><strong>Resumo </strong></h3><p>Se você quer se tornar um desenvolvedor, deve buscar um emprego de desenvolvedor para a <em>web</em> júnior o mais rápido possível para conseguir a experiência e o apoio de desenvolvedores sênior. Para conseguir esse tipo de emprego, você precisa: </p><ul><li>aprender HTML, CSS e JavaScript </li><li>construir um portfólio de projetos menores </li></ul><p>Uma vez que você tenha feito isso, você pode começar a se candidatar a vagas de emprego. </p><p>Então, prepare-se bem para as entrevistas e continue a adquirir novas habilidades enquanto espera por <em>aquela</em> oferta. </p><p>Obrigado por ler este guia para se tornar um desenvolvedor e para conseguir seu primeiro emprego. Se gostou dele, <a href="https://medium.com/@samwsoftware">siga o autor no Medium</a> para ver mais dicas e truques para desenvolvedores.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/BXkVzP4g632xPGiEZpYAHIEVphLWtaypKmBz.gif" class="kg-image" alt="BXkVzP4g632xPGiEZpYAHIEVphLWtaypKmBz" width="800" height="288" loading="lazy"></figure> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como incorporar vídeo e áudio ao seu HTML ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Abhishek Jakhar O HTML nos permite criar reprodutores de vídeo e áudio baseados em padrões que não requerem o uso de plug-ins. Adicionar vídeo e áudio a um site é quase sempre tão fácil quanto adicionar imagens ou formatar algum texto. Existem duas formas diferentes de incluir elementos ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-incorporar-video-e-audio-ao-seu-html/</link>
                <guid isPermaLink="false">63dd9247b42da706e17c41fb</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento para a Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Marcos Adriano ]]>
                </dc:creator>
                <pubDate>Sun, 16 Apr 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_jB3XGWVtrr8qOl21gCOAmQ.gif" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/video-audio-in-html-a-short-guide-69f721878b47/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to embed video and audio in your HTML</a>
      </p><p>Escrito por: Abhishek Jakhar</p><p>O HTML nos permite criar reprodutores de vídeo e áudio baseados em padrões que não requerem o uso de <em>plug-ins</em>. Adicionar vídeo e áudio a um site é quase sempre tão fácil quanto adicionar imagens ou formatar algum texto.</p><p>Existem duas formas diferentes de incluir elementos de vídeo. Discutiremos as duas abaixo.</p><h4 id="v-deo"><strong>Vídeo </strong></h4><p>A tag <code>&lt;video&gt;</code> nos permite inserir arquivos de vídeo no HTML, bem similar ao modo como imagens são inseridas.</p><p>Os atributos que podemos inserir são:</p><ul><li><code>src</code>: este atributo representa a fonte, que é muito semelhante ao atributo <code>src</code> usado no elemento de imagem. Adicionaremos o link para um arquivo de vídeo nesse atributo.</li><li><code>type</code>: este será video/mp4, pois .mp4 é o formato de vídeo que estamos usando. Também podemos usar diferente formatos de vídeo, como .ogg ou .webm. Nesse caso, o valor de <code>type</code> mudaria para video/ogg ou video/WebM, respectivamente.</li></ul><blockquote><strong><strong>Not</strong>a<strong>: </strong></strong>alguns formatos de vídeo comuns são WebM, Ogg, MP4.</blockquote><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_4epxHpB0Z94ZaNq64bL9WA.png" class="kg-image" alt="1_4epxHpB0Z94ZaNq64bL9WA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1_4epxHpB0Z94ZaNq64bL9WA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_4epxHpB0Z94ZaNq64bL9WA.png 800w" sizes="(min-width: 720px) 720px" width="800" height="500" loading="lazy"><figcaption>&lt;video&gt; na página</figcaption></figure><p>Agora, temos esse vídeo na nossa página, mas tem um problema. Esse vídeo não está sendo reproduzido automaticamente e também não há controles para iniciar o vídeo. Temos que adicioná-los manualmente usando o atributo <code>controls</code> na nossa tag de vídeo.</p><p>Esse atributo não possui nenhum valor, porque é um atributo booleano. Isso significa que ele só pode ser <code>true</code> ou <code>false</code>.</p><p>Ter o atributo <code>controls</code> na nossa tag de vídeo significa que o valor dele será <code>true</code> e exibirá os controles de reprodução.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_FKJojPyvDky1kM3gK5Z7KA.png" class="kg-image" alt="1_FKJojPyvDky1kM3gK5Z7KA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1_FKJojPyvDky1kM3gK5Z7KA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_FKJojPyvDky1kM3gK5Z7KA.png 800w" sizes="(min-width: 720px) 720px" width="800" height="500" loading="lazy"><figcaption>&lt;video&gt; com o atributo Controls</figcaption></figure><p>Se removermos o atributo <code>controls</code>, também podemos fazer o vídeo ser reproduzido automaticamente usando o atributo <code>autoplay</code>. Esse também é um atributo booleano.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_TOOc_dxlcW6q7Cr3AUbxJQ.gif" class="kg-image" alt="1_TOOc_dxlcW6q7Cr3AUbxJQ" width="640" height="360" loading="lazy"><figcaption>tag &lt;video&gt; com o atributo autoplay (mas sem o atributo controls)</figcaption></figure><p>Como você pode ver, o vídeo está iniciando sozinho e não há controle. É verdade que não precisamos pressionar <em>play</em> para iniciar o vídeo, mas também não podemos pará-lo.</p><p>Também podemos ter controles e reprodução automática juntos.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_jB3XGWVtrr8qOl21gCOAmQ-1.gif" class="kg-image" alt="1_jB3XGWVtrr8qOl21gCOAmQ-1" width="640" height="360" loading="lazy"><figcaption>tag &lt;video&gt; com reprodução automática e atributo controls</figcaption></figure><p>Você pode fornecer atributos diferentes para o elemento de vídeo, dependendo do requisito.</p><p>Eu mencionei acima que existem duas formas diferentes de adicionar a tag vídeo. Vamos testar a outra forma.</p><h4 id="tag-source"><strong>Tag source</strong></h4><p>Anteriormente, usamos um elemento de vídeo com tag de fechamento automático, mas, aqui, fecharemos a tag de vídeo. Agora, temos uma tag de abertura e de fechamento.</p><p>Nos também removeremos os atributos <code>type</code> e <code>source</code> da tag <code>video</code> e os colocaremos em outra tag.</p><pre><code>&lt;video&gt;  &lt;source src="http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4" type="video/mp4"&gt;&lt;/video&gt;</code></pre><p>Tudo o que fizemos foi mover os atributos para o elemento <code>source</code></p><p>Por que faríamos isso?</p><p>Bem, na maioria dos casos, com o vídeo, teremos várias fontes, já que precisamos fornecer diferentes tipos de arquivo, dependendo de qual navegador está visualizando seu vídeo, pois diferentes navegadores oferecem suporte a diferentes tipos de arquivo.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_pHYI6GbxxHUL5A_FDTdK1A.png" class="kg-image" alt="1_pHYI6GbxxHUL5A_FDTdK1A" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1_pHYI6GbxxHUL5A_FDTdK1A.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_pHYI6GbxxHUL5A_FDTdK1A.png 800w" sizes="(min-width: 720px) 720px" width="800" height="702" loading="lazy"></figure><p>O vídeo ficará exatamente igual. Agora, no entanto, temos um suporte mais amplo dos navegadores.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_P4pGSwzIVaFxWtT6tenhsA.png" class="kg-image" alt="1_P4pGSwzIVaFxWtT6tenhsA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1_P4pGSwzIVaFxWtT6tenhsA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_P4pGSwzIVaFxWtT6tenhsA.png 800w" sizes="(min-width: 720px) 720px" width="800" height="497" loading="lazy"><figcaption>Vídeo com suporte amplo de navegadores (sem atributos)</figcaption></figure><p>Se quisermos adicionar atributos como <code>controls</code>, <code>autoplay</code>, <code>loop</code> etc., adicionaremos a tag <code>&lt;video&gt;</code>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_Ff1qRhcSQfqvHgcjbSrcsg.gif" class="kg-image" alt="1_Ff1qRhcSQfqvHgcjbSrcsg" width="640" height="360" loading="lazy"><figcaption>Vídeo com suporte mais amplo a navegadores e outros atributos</figcaption></figure><h4 id="elemento-de-udio"><strong>Elemento de áudio</strong></h4><p>A tag <code>&lt;audio&gt;</code> é bastante similar à tag <code>video</code>. Entretanto, a única principal diferença é que não há recursos visuais.</p><p>Podemos usar o elemento de áudio para iniciar um arquivo de vídeo na nossa página da web — como se fosse um arquivo mp3.</p><p>Agora, assim como a tag de vídeo, existem duas formas diferentes de se fazer isso.</p><ul><li>Usar uma tag única representando o elemento inteiro.</li><li>Abrir e fechar tags com um elemento filho no meio.</li></ul><p>Temos aqui uma tag de abertura e de fechamento. Então, adicionaremos o elemento <code>source</code> no meio.</p><p>A estrutura de pastas ficará assim:</p><pre><code>|-- project    |-- audio      |-- sample.mp3      |-- sample.ogg    |-- css      |-- main.css      |-- normalize.css    index.html
</code></pre><p>O atributo <code>controls</code> não existe na tag <code>&lt;audio&gt;</code> no exemplo acima. O elemento <code>&lt;audio&gt;</code> não aparecerá no documento HTML.</p><p>Você pode ver que existem apenas algumas diferenças importantes aqui. O valor no atributo <code>type</code> mudou de "video/mp4" para “audio/mp3”. No atributo <code>src</code>, nós mudamos de um arquivo de vídeo com a extensão .mp4 para um arquivo de áudio com a extensão .mp3.</p><p>Assim como o elemento de vídeo, não poderemos realmente parar ou iniciar o áudio sem controles. Portanto, adicionaremos o atributo <code>controls</code> ao elemento de áudio.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1__d_AaBpz1QWH8csBB_-m8w.gif" class="kg-image" alt="1__d_AaBpz1QWH8csBB_-m8w" width="640" height="360" loading="lazy"><figcaption>Elemento de aúdio (&lt;audio&gt;&lt;/audio&gt;) com várias fontes para suporte mais amplo aos navegadores</figcaption></figure><p>Você também pode adicionar outros atributos à tag <code>&lt;audio&gt;</code> como <code>autoplay</code>, <code>loop</code>, etc.</p><p>Cobrimos aqui o essencial sobre os elementos <code>video</code> e <code>audio</code> no HTML.</p><p>Você pode ler mais sobre vídeo e áudio nos links abaixo:</p><ul><li><a href="https://developer.mozilla.org/pt-BR/docs/Web/HTML/Element/video">Documentação da web da MDN — Vídeo</a></li><li><a href="https://developer.mozilla.org/pt-BR/docs/Web/HTML/Element/audio">Documentação da web da MDN — Áudio</a></li></ul><p>Espero que você tenha achado este artigo informativo e útil. Obrigado pela leitura!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como utilizar a repetição espaçada com o Anki para aprender a programar mais rapidamente ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Steven Gilbert  Imagine que você pode acelerar o seu aprendizado e melhorar a memorização nos fundamentos, técnicas e comandos de programação. Hoje, mostrarei a você como fazer isso, utilizando a repetição espaçada e uma ferramenta gratuita de código aberto chamada Anki.  Muito atestam os benefícios da ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-utilizar-a-repeticao-espacada-com-o-anki-para-aprender-a-programar-mais-rapidamente/</link>
                <guid isPermaLink="false">63696e2e1c6e8805bd494b59</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento para a Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Jorge Felipe Ribeiro Portela ]]>
                </dc:creator>
                <pubDate>Tue, 11 Apr 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_Nhu0oiFBy4jJLlpJpRWGtA.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/use-spaced-repetition-with-anki-to-learn-to-code-faster-7c334d448c3c/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to use spaced repetition with Anki to learn to code faster</a>
      </p><p>Escrito por: Steven Gilbert </p><p>Imagine que você pode acelerar o seu aprendizado e melhorar a memorização nos fundamentos, técnicas e comandos de programação.</p><p>Hoje, mostrarei a você como fazer isso, utilizando a repetição espaçada e uma ferramenta gratuita de código aberto chamada <strong>Anki</strong>. </p><p>Muito atestam os benefícios da repetição espaçada:</p><ul><li>O campeão do jogo Jeopardy!, <a href="https://en.wikipedia.org/wiki/Roger_Craig_%28Jeopardy!_contestant%29">Robert Craig</a>, afirma que ele deve parte do seu sucesso a utilizar o Anki para memorizar curiosidades. </li><li>O perfil <a href="https://www.freecodecamp.org/news/use-spaced-repetition-with-anki-to-learn-to-code-faster-7c334d448c3c/undefined">Googley as Heck</a>, que estudou em tempo integral por 8 meses para uma <a href="https://medium.freecodecamp.com/why-i-studied-full-time-for-8-months-for-a-google-interview-cc662ce9bb13#.3d9qfnhq5">entrevista para o Google</a> (texto em inglês), diz que <em>"Repetição espaçada é a chave para a memorização... Você se tornará um expert ao revisitar e revisar ao longo do tempo. Se fizer isso, chegará em um ponto onde não esquecerá dos detalhes."</em></li><li><a href="https://sivers.org/">Derek Sivers</a>, fundador do CDBaby, <a href="https://sivers.org/srs">escreveu</a> (texto em inglês) que a repetição espaçada é <em>"a técnica de programação mais útil que encontrei em 14 anos de programação de computadores."</em></li></ul><p>Para mim, pessoalmente, o Anki tem sido uma parte indispensável do meu esforço para aprender a programar. Uso o Anki para lembrar de ideias importantes para programar em HTML, CSS, JavaScript e de comandos do Git e do Bash.</p><p>Atualmente, estou em <a href="https://partiuintercambio.org/o-que-e-deferral-e-para-que-ele-serve/">processo de adiamento de matrícula (deferral)</a> na UC-Berkeley Law School. O Anki será parte integral da minha estratégia para dominar as leis.</p><p>Neste artigo, abordarei:</p><ul><li>O que é repetição espaçada</li><li>Como o Anki auxilia com a repetição espaçada</li><li>Como isso pode acelerar o seu aprendizado e aumentar a sua retenção de conceitos de programação. </li></ul><h3 id="o-que-a-repeti-o-espa-ada"><strong>O que é a repetição espaçada?</strong></h3><p>A <a href="https://pt.wikipedia.org/wiki/Repeti%C3%A7%C3%A3o_espa%C3%A7ada">repetição espaçada</a> visa resolver o <a href="https://www.supermemo.com/english/princip.htm#optimal_intervals">problema de esquecimento</a> (texto em inglês). Ela sustenta que o momento ideal para se lembrar de uma nova informação é no momento em que você está prestes a esquecê-la.</p><p>Por exemplo, supondo que você não saiba qual é a capital da <a href="https://pt.wikipedia.org/wiki/Col%C3%B4mbia">Colômbia</a> e que, neste exato momento, eu diga para você qual é a capital do país: </p><p><em>"A capital da Colômbia é Bogotá</em>."</p><p>Vamos supor que sua memória seja do tipo que se lembrará desse novo fato – que a capital da Colômbia é Bogotá – após sua primeira exposição à informação, por um período de<strong> 20 minutos</strong>. Depois disso, você esquecerá da informação.</p><p>Mas, se em <strong>19 minutos e 59 segundos</strong>, enquanto estamos tomando um café, eu relembrar você dessa informação... &nbsp;</p><p>"A capital da Colômbia é Bogotá."</p><p>...a teoria da repetição espaçada diz que você será capaz de lembrar que Bogotá é a capital da Colômbia por agora, digamos <strong>40 minutos</strong>. Depois disso, você esquecerá novamente.</p><p>Se eu relembrar você novamente <strong>39 minutos e 59 segundos depois </strong>disso...</p><p>"A capital da Colômbia é Bogotá."</p><p>...você será capaz de reter essa informação geográfica na memória por um período ainda maior – digamos, até <strong>uma hora</strong>.</p><p>Se continuarmos assim – eu continuarei lembrando você de que a capital da Colômbia é Bogotá, justamente no momento em que você estiver prestes a esquecer – o tempo entre os lapsos de memória cresce exponencialmente de horas para dias, depois para meses, depois para anos.</p><p>Ao final, como diz a teoria, o conhecimento – de que Bogotá é a capital da Colômbia – ficará mais ou menos permanentemente alojado em sua memória.</p><p>Essa noção de declínio da memória ao longo do tempo é conhecida como a curva de esquecimento e foi desenvolvida por <a href="https://en.wikipedia.org/wiki/Hermann_Ebbinghaus">Herman Ebbinghaus</a>, em 1885.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/lmXQiQYcqNbLyTGoAVxbKZvmbGURF20DmZxq.jpg" class="kg-image" alt="lmXQiQYcqNbLyTGoAVxbKZvmbGURF20DmZxq" width="449" height="497" loading="lazy"><figcaption>Stahl et al 2010; CNS Spectr</figcaption></figure><p>Essa ideia – de que é mais eficiente e eficaz espaçar o aprendizado ao longo do tempo em vez de estudar demais – é conhecida como <a href="https://pt.wikipedia.org/wiki/Efeito_do_espa%C3%A7amento">efeito de espaçamento</a>.</p><p>Juntos, a curva de esquecimento e o efeito de espaçamento são conceitos fundamentais por trás da repetição espaçada.</p><p>Dependendo da sua curva de esquecimento, você determina o <a href="http://www.lac.ane.pl/pdf/5409.pdf">intervalo ideal</a> (texto em inglês) para relembrar você mesmo de um item da memória (qualquer informação). Você espaça o reforço do item de memória de acordo. Piotr Woźniak, um pioneiro em pesquisa de memória, <a href="https://www.supermemo.com/english/princip.htm#optimal_intervals">resume</a> essas ideias (texto em inglês):</p><blockquote>O intervalo ideal é calculado com base em dois critérios contraditórios:<br><br>1. Os intervalos devem ser o mais longos possível para obter a frequência mínima de repetições e aproveitar melhor o chamado efeito de espaçamento, que diz que intervalos mais longos entre repetições, até certo limite, produzem memórias mais fortes.<br><br>2. Os intervalos devem ser curtos o bastante para garantir que o aprendizado ainda seja lembrado.</blockquote><p>Nesse momento, você pode estar se perguntando: "mas como saber<em> precisamente</em> o momento em que estamos prestes a esquecer de que a capital da Colômbia é Bogotá? Como saber qual é o intervalo ideal?".</p><p>É claro que seria muito difícil saber com exatidão sem muitas tentativas e erros detalhados e uma atenção aos detalhes no nível de Charles Darwin. Felizmente, porém, não precisamos de tanta diligência porque um amigo bem conhecido pode nos ajudar: <strong>o software </strong>(você também pode usar um sistema não automatizado chamado de <a href="https://en.wikipedia.org/wiki/Leitner_system">sistema Leitner</a> – texto em inglês).</p><p>O software, construído sobre muitas pesquisas sobre a memória, pode ajudá-lo a determinar o momento ideal para reforçar a memorização. Mais especificamente, estamos falando do <strong>software de repetição espaçada</strong>.</p><h3 id="o-que-o-anki"><strong>O que é o Anki? </strong></h3><p>O <a href="https://apps.ankiweb.net/">Anki </a>é uma ferramenta de software de repetição espaçada de <a href="https://github.com/dae/anki">código aberto</a> desenvolvida e cuidada por <a href="https://github.com/dae/">Damien Elmes</a>. Você pode pensar que ele é uma espécie de "programa de flashcards inteligente", que aproveita a repetição espaçada e torna a memorização mais eficiente. </p><p>O Anki foi construído com base na premissa de que você se lembra melhor do conhecimento com lembretes periódicos e estrategicamente cronometrados. O que significa que é construído sobre as vantagens da repetição espaçada.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/8eeD7QQ2cqKBAmq4ivMcDzQhmrNbY0uKd4HZ.jpg" class="kg-image" alt="8eeD7QQ2cqKBAmq4ivMcDzQhmrNbY0uKd4HZ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/8eeD7QQ2cqKBAmq4ivMcDzQhmrNbY0uKd4HZ.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/8eeD7QQ2cqKBAmq4ivMcDzQhmrNbY0uKd4HZ.jpg 630w" width="630" height="369" loading="lazy"><figcaption><a href="https://www.wired.com/2008/04/ff-wozniak/">Créditos da imagem no link</a></figcaption></figure><p>Você pode usar o Anki para lembrar virtualmente de qualquer coisa que precise ser lembrada.</p><p>Observe, no entanto, que o Anki não substitui o aprendizado. Você deve primeiro entender o material que está aprendendo e, em seguida, recorrer ao Anki, o que o ajudará de maneira brilhante a reter o conhecimento adquirido. O Anki é uma parte do processo de aprendizagem que vem após a compreensão.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/UG2cK2im2551HZaYin9OhVyLVdWE-ip0kKx4.png" class="kg-image" alt="UG2cK2im2551HZaYin9OhVyLVdWE-ip0kKx4" width="480" height="170" loading="lazy"><figcaption><a href="https://www.gwern.net/Spaced%20repetition">Créditos da imagem no link</a></figcaption></figure><p>Existem outros softwares de repetição espaçada no mundo, como o <a href="https://www.supermemo.com/english/smintro.htm">SuperMemo</a>, criado por Piotr Woźniak, mencionado acima. Na verdade, o Anki utiliza uma versão do <a href="https://en.wikipedia.org/wiki/Anki_%28software%29">algoritmo</a> que foi utilizado no SuperMemo. </p><p>Eu me concentrei no Anki porque é o software que me acostumei a utilizar, e funciona bem. Além disso, ele é de código aberto e gratuito. Se você já usou o SuperMemo ou outra ferramenta de software de repetição espaçada, ficaremos felizes de saber sobre suas experiências.</p><p>Se você decidir usar o Anki também, eu o encorajo a<a href="https://www.wired.com/2008/04/ff-wozniak/?currentPage=all"> ler sobre</a> Woźniak (texto em inglês) e sobre o que ele tem a dizer sobre memória, aprendizado e <a href="https://www.supermemo.com/articles/genius.htm">criatividade</a> (texto em inglês), pois é bastante pontual.</p><p>No que diz respeito aos dispositivos para uso, o Anki vem em uma versão para desktop na qual, se você nunca usou o Anki antes, é recomendável começar. Há também:</p><ul><li>Um aplicação para a web gratuita, <a href="https://apps.ankiweb.net/" rel="noopener">AnkiWeb</a>.</li><li>Um aplicação para Android gratuita, <a href="https://play.google.com/store/apps/details?id=com.ichi2.anki&amp;hl=en" rel="noopener">AnkiDroid</a>, totalmente compatível e sincronizável com o AnkiWeb para desktop.</li><li>Para usuários de Iphone, a aplicação <a href="https://itunes.apple.com/us/app/ankimobile-flashcards/id373493387?mt=8" rel="noopener">AnkiMobile</a> encontra-se no valor de U$24,99 na App Store (no momento em que este texto foi escrito).</li></ul><h3 id="como-o-anki-funciona"><strong>Como o Anki funciona</strong></h3><p>Saiba que você pode se <a href="https://apps.ankiweb.net/docs/manual.html">aprofundar</a> em como usar e configurar o Anki (documentação em inglês). Eu apenas dou a você uma visão geral para que você entenda a essência do software.</p><ol><li>Você cria "<strong>baralhos</strong>", ou seja, um grupo de cartas que representam uma grande categoria. Por exemplo, "JavaScript" ou "Capitais de Lugares" podem compor o "baralho".</li></ol><p>Este é um exemplo de um deck no app Anki na versão desktop (não se preocupe com os itens "New", "Learning" e "To Review" por agora. Comentarei sobre essas opções mais a frente):</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/ZiDvGOE4JheKaajYqHONhZGSxWvO14YsOD-j.png" class="kg-image" alt="ZiDvGOE4JheKaajYqHONhZGSxWvO14YsOD-j" width="283" height="220" loading="lazy"><figcaption>Exemplo de um baralho do Anki</figcaption></figure><p>2. &nbsp;Você adiciona <strong><em>cards</em></strong><em> (cartões)</em> ao seu <em><strong>deck </strong>(baralho), </em>que é customizado com HTML e CSS.</p><p>Um <em>card </em>pode ser um <em>flashcard </em>com conteúdo frontal e traseiro padrão, onde você primeiro é apresentado ao lado frontal. Aqui é um exemplo de um <em>deck </em>de "Capitais":</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/ryIdZ3jHPJw83npgNb9pIfwcnlHj73IMf-N3.png" class="kg-image" alt="ryIdZ3jHPJw83npgNb9pIfwcnlHj73IMf-N3" width="189" height="287" loading="lazy"><figcaption>Exemplo de um cartão do Anki — Parte da frente padrão</figcaption></figure><p>Quando você já souber a resposta, selecione <em><strong><strong>Show Answer</strong> </strong></em>(mostrar a resposta) para revelar a resposta localizada no verso do cartão:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/JSE9oBdeDkYfFUobJdpbkTI-Of-Za28eot6o.png" class="kg-image" alt="JSE9oBdeDkYfFUobJdpbkTI-Of-Za28eot6o" width="221" height="288" loading="lazy"><figcaption>Cartão do Anki – frente e verso padrão</figcaption></figure><p>Dica: há outros tipos de cartões, além do tipo flashcard com frente e verso, como o de <a href="https://en.wikipedia.org/wiki/Cloze_test">exclusão cloze</a> (texto em inglês) com a qual você se familiarizará. A exclusão cloze é um tipo de cartão particularmente útil que eu utilizo o tempo todo (na verdade, a maioria dos meus cartões utilizam a exclusão cloze) porque é útil e simples na organização das informações. Criar <strong><em>cards </em></strong>no Anki é uma arte. Quanto mais você praticar, melhor você ficará. Como regra geral, você vai querer tentar seguir o <a href="https://www.supermemo.com/en/articles/20rules">princípio de informação mínima</a> (texto em inglês), que significa, essencialmente, manter algo muito simples. Você quer manter os seus <em><strong>cards </strong></em>o mais simples possível, porque o simples é mais fácil de lembrar.</p><p>3. Assim que terminar de adicionar os <strong><em>cards</em></strong>, você deve começar a praticar no Anki. </p><p>Vamos voltar ao <strong><em>card </em></strong>Colômbia-Bogotá para ver como o processo funciona.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/D4napkahfAswTdCBbFhamvi8IrQNDwQwkS11.png" class="kg-image" alt="D4napkahfAswTdCBbFhamvi8IrQNDwQwkS11" width="220" height="287" loading="lazy"><figcaption>Escolha quando você gostaria de ser lembrado novamente</figcaption></figure><p>Depois de selecionar <strong><em>Show Answer</em></strong>, é mostrado o verso do <strong><em>card</em></strong>. Você, então, pode se perguntar:</p><p>Foi muito difícil chegar à resposta?</p><ul><li>Se você não souber a resposta, você pode selecionar <strong><em>Again </em></strong>(novamente)<strong><em>, </em></strong>que mostrará o <strong><em>card </em></strong>novamente em <strong><em>menos de um minuto</em></strong>. </li><li>Se você encontrou a resposta depois de fazer uma pausa e vasculhar em sua memória, pode selecionar <strong><em>Good </em></strong>(bom), que mostrará o cartão novamente em <strong><em>menos de 10 minutos</em></strong>.</li><li>Se a resposta foi fácil, você pode escolher <strong><em>Easy </em></strong>(fácil) e <strong>não</strong> visualizará o <strong><em>card </em></strong>novamente por <strong><em>quatro dias</em></strong>.</li></ul><p>O programa Anki, então, acompanha o estado do seu progresso: quais cartões revisar e quando. Isso significa que o Anki está fazendo o trabalho tedioso de acompanhar sua curva de esquecimento para cada cartão.</p><p>Esse é o poder da automatizar a repetição espaçada com software.</p><p>Eu poderia apontar que você pode mudar algumas variáveis do algoritmo de repetição espaçada do Anki. Você faz isso acessando as opções do deck e personalizando o que deseja personalizar, como o número de cartões revisáveis por dia, as opções de intervalo de tempo, entre outras variáveis.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/xshWnFcgpmakDQP6jDl1bJt-PGcKAhTUNM4D.png" class="kg-image" alt="xshWnFcgpmakDQP6jDl1bJt-PGcKAhTUNM4D" width="434" height="372" loading="lazy"><figcaption>Personalizando as opções do seu deck</figcaption></figure><p>No começo, porém, talvez você queira deixar essas configurações de lado e apenas usar os padrões. À medida que você se sentir mais confortável com o Anki, poderá começar a ser criativo com as opções do deck.</p><p>Vamos revisitar nosso <strong><em>deck</em></strong> JavaScript:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/pvwi8XDqMFmczxQBCTLVAT04fOS93JjhhOXy.png" class="kg-image" alt="pvwi8XDqMFmczxQBCTLVAT04fOS93JjhhOXy" width="283" height="220" loading="lazy"><figcaption>Exemplo de deck do Anki</figcaption></figure><ul><li><strong><em>New </em></strong>(novo) significa que você adicionou 4 novos cartões ao seu baralho de JavaScript e eles estão prontos para serem revisados.</li><li><strong><em>Learning</em></strong> (em fazer de aprendizado) significa que, se você estiver trabalhando em um deck e escolher, digamos, <em><strong>Good </strong></em>(bom) &lt; 10m, o Anki armazenará esse cartão na fila de aprendizado e o mostrará novamente em 10 minutos. Veja mais detalhes <a href="https://apps.ankiweb.net/docs/manual.html#learning">aqui</a>.<strong> </strong></li><li><strong><em>To Review</em></strong> (para revisar) representa o número de cartões pendentes para revisão.<strong> &nbsp;</strong></li></ul><p>Tudo isso ficará muito mais claro quanto mais você usar o Anki.</p><h3 id="com-come-ar-com-o-anki"><strong>Com começar com o Anki </strong></h3><p>A respeito de tutoriais e como usar o Anki, a <a href="https://apps.ankiweb.net/docs/manual.html">documentação</a> do sites é fenomenal e provavelmente responderá a maioria das suas perguntas. Também há alguns <a href="https://www.youtube.com/channel/UCFt1oYUNiwkMaJTSZiFEodQ">vídeos de tutoriais</a> úteis. &nbsp;</p><p>Enquanto isso, darei a você uma lista para iniciar com o Anki e o porquê a <a href="https://www.amazon.com/Checklist-Manifesto-How-Things-Right/dp/0312430000">checklist</a> pode ser útil.</p><p>1. &nbsp; Leia o <a href="https://sivers.org/srs">artigo </a>de Derek Siver (em inglês) sobre repetição espaçada e o porquê ela reforça muito do que descrevi.</p><p>2. Leia a <a href="https://www.wired.com/2008/04/ff-wozniak/">entrevista </a>da Wired com Piotr Woźniak (em inglês), pois ela oferece uma visão holística da repetição espaçada, aprendizado e pesquisa de memória. </p><p>3. Leia <a href="https://www.supermemo.com/en/articles/20rules" rel="noopener">Effective learning: Twenty rules of formulating knowledge</a> (em inglês), de Piotr Wózniack. Ele fornece técnicas de como formular e estruturar seus <strong>cartões</strong> do Anki. </p><p>Em especial, lembre-se de que a repetição espaçada não substitui o aprendizado. Por isso, é importante você entender o material antes de iniciar o método de repetição espaçada. Primeiro, entenda. Depois, reforce com o Anki. Lembre-se de usar imagens e a <strong>metodologia de manter as coisas simples </strong>para criar os seus <strong>cards </strong>quando possível.</p><p>4. Crie seus próprios <strong>decks</strong>.</p><p>5. Lembre-se de manter seus <strong>decks </strong>com tópicos amplos e gerais. Por exemplo, se você está aprendendo JavaScript, não crie um <strong>deck </strong>chamado "Closures" e outro chamado "Herança prototipada". Em vez disso, crie um <strong>deck </strong>"JavaScript". Consulte <a href="https://apps.ankiweb.net/docs/manual.html#manydecks">Using Decks Appropriately</a>, na documentação para mais detalhes.</p><p>6. Procure se acostumar com a <a href="https://www.youtube.com/watch?v=FnrigOzpJQo">exclusão cloze</a> (vídeo em inglês), pois ela ajudará bastante o seu aprendizado.</p><p>7. Entenda as desvantagens.</p><p>Existem poucas desvantagens na repetição espaçada. A interferência na recordação é uma delas.</p><p>Por exemplo, você pode imaginar sofrer interferência na recordação com, digamos, as capitais de Martinica, Mauritânia e Ilhas Maurício, pois todas elas possuem nomes parecidos. </p><p>Algumas interferências são difíceis de escapar e você pode querer implementar outros <em>hacks </em>de memória nesses casos. Você, porém, pode limitar a desvantagem mantendo seus cartões com conteúdo simples.</p><p>Aprenda mais sobre as desvantagens <a href="https://www.gwern.net/Spaced%20repetition">aqui</a> (vejas as desvantagens abaixo) e <a href="https://www.supermemo.com/en/articles/20rules">aqui</a> (veja como combater as interferências abaixo) - textos em inglês.</p><p>8. Lembre-se de manter seus <em>decks </em>e <em>cards</em> sincronizados. Escolha uma "base inicial" como a versão para desktop e, em seguida, sincronize com o AnkiWeb e um dos aplicativos de celular sempre que fizer uma alteração. Criar seus <em>cards</em> e <em>decks</em> leva um certo tempo. Evite a dor de cabeça de ter que refazer esse trabalho.</p><p>9. Faça do Anki um hábito. Para ver os frutos da magia dessa ferramenta acontecerem, você deve tomar uma decisão e se comprometer a revisar seus <strong>cards </strong>todos os dias. Associe o Anki a uma xícara de café, pela manhã, ou na hora do almoço, ou com algo positivo. Encontre maneiras de tornar o Anki um hábito. </p><h4 id="recapitulando-"><strong>Recapitulando<strong><strong><strong>:</strong></strong></strong></strong></h4><ul><li>A repetição espaçada é a ideia de que você pode se lembrar de uma informação com mais eficiência se for exposto a ela no momento do esquecimento;</li><li>A ferramenta Anki automatiza a repetição espaçada. Isso contribui para uma ferramenta de memorização incrivelmente eficiente e útil.</li><li>O Anki pode ajudá-lo a construir sua base de conhecimento de fundamentos, técnicas e práticas recomendadas de programação de computadores. &nbsp;</li><li>Além do conhecimento de programação de computadores, você pode usar o Anki para lembrar de qualquer outra coisa que queira adicionar à sua memória. </li><li>Lembre-se: o Anki faz parte do processo de aprendizado, não é um substituto dele. Você deve primeiro entender, depois usar o Anki.</li></ul><p>Se você tiver dúvidas, pode enviar uma mensagem para o <a href="https://twitter.com/gilbertginsberg">Twitter do autor</a>.</p><h4 id="leituras-adicionais-algumas-em-ingl-s-"><strong>Leituras adicionais (algumas em inglês):</strong></h4><ul><li><a href="https://pt.wikipedia.org/wiki/Repeti%C3%A7%C3%A3o_espa%C3%A7ada">Repetição espaçada</a>, Wikipédia</li><li><a href="https://pt.wikipedia.org/wiki/Curva_do_esquecimento">Curva do esquecimento</a>, Wikipédia</li><li><a href="https://pt.wikipedia.org/wiki/Efeito_do_espa%C3%A7amento">Efeito do espaçamento</a>, Wikipédia</li><li><a href="https://pt.wikipedia.org/wiki/Hermann_Ebbinghaus">Hermann Ebbinghaus</a>, Wikipédia</li><li><a href="https://en.wikipedia.org/wiki/Leitner_system">Sistema Leitner</a>, Wikipedia (em inglês)</li><li><a href="https://github.com/dae/anki" rel="noopener">Damien Elmes</a>, criador do Anki</li><li><a href="https://docs.ankiweb.net/#/">Documentação do Anki</a> (em inglês)</li><li><a href="https://www.supermemo.com/english/princip.htm" rel="noopener">General principles of SuperMemo</a> (em inglês), por Piotr Woźniak</li><li><a href="https://www.supermemo.com/articles/genius.htm" rel="noopener">The roots of creativity and genius</a> (em inglês), por Piotr Woźniak</li><li><a href="https://www.wired.com/2008/04/ff-wozniak/?currentPage=all" rel="noopener">Want to Remember Everything You’ll Ever Learn? Surrender to This Algorithm</a> (em inglês), por Gary Wolf para Wired</li><li><a href="https://sive.rs/srs">Memorizing a programming language using spaced repetition software</a> (em inglês), por Derek Sivers</li><li><a href="https://www.jackkinsella.ie/articles/janki-method" rel="noopener">Using spaced repetition systems to learn and retain technical knowledge</a> (em inglês), por Jack Kinsella</li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como se tornar um desenvolvedor para a web full-stack ]]>
                </title>
                <description>
                    <![CDATA[ Desenvolvedores para a web full-stack são o canivete suíço do mundo da programação. Ter essa designação significa que você pode produzir soluções de ponta a ponta, um conjunto de habilidades altamente comercializáveis e ágeis. O que, no entanto, é realmente necessário para alcançar esse status? Seja você novo, experiente ou ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/</link>
                <guid isPermaLink="false">63ee0d3058018c06027bf2ce</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento para a Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Matheus Ribeiro ]]>
                </dc:creator>
                <pubDate>Mon, 10 Apr 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/full-stack-web-developer-3.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-become-a-full-stack-web-developer-in-2020/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Become a Full Stack Web Developer – Handbook for Beginners</a>
      </p><p>Desenvolvedores para a web <em>full-stack</em> são o canivete suíço do mundo da programação. Ter essa designação significa que você pode produzir soluções de ponta a ponta, um conjunto de habilidades altamente comercializáveis e ágeis. O que, no entanto, é realmente necessário para alcançar esse status?</p><p>Seja você novo, experiente ou especializado em uma das pontas da stack, há muito o que digerir aqui. Sinta-se livre para mergulhar fundo desde o início ou para pular direto para o tópico no qual você precisa de mais ajuda.</p><ul><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/#primeiro-o-que-realmente-torna-um-desenvolvedor-full-stack">Primeiro, o que realmente torna um desenvolvedor full-stack?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/#antes-de-seguir-em-frente-vamos-falar-sobre-foco">Antes de seguir em frente, vamos falar sobre foco</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/#ent-o-por-onde-come-amos">Então, por onde começamos?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/#front-end">Front-end</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/#back-end">Back-end</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/#devops-e-a-nuvem">DevOps e a nuvem</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/#design">Design</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/#outras-coisas-se-voc-est-apenas-come-ando">Outras coisas se você está apenas começando</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/#outras-coisas-se-voc-estiver-procurando-por-mais">Outras coisas se você estiver procurando por mais</a></li></ul><h2 id="primeiro-o-que-realmente-torna-um-desenvolvedor-full-stack">Primeiro, o que realmente torna um desenvolvedor full-stack?</h2><p>É divertido e está na moda dizer que qualquer <a href="https://full-stack.netlify.com/">desenvolvedor de <em>front-end</em> é um desenvolvedor <em>full-stack</em></a> (texto em inglês), mas ser capaz de pôr um site no ar através do <a href="https://www.netlify.com/">Netlify</a> não o torna <em>full-stack</em>.</p><p>Não se sinta desencorajado – é só que, sendo realista, essa experiência por si só não será suficiente para justificar o título em sua próxima entrevista. Apesar de você estar tecnicamente criando e implantando seu trabalho do início ao fim, Netlify, <a href="https://vercel.com/">Zeit</a> e outros provedores dão a você o poder de fazer isso com suas ferramentas mágicas que removem a necessidade de realizar a maioria das operações da <em>stack</em>.</p><p>Não que eu queira desdenhar do que podemos realizar agora como desenvolvedores de <em>front-end</em>. O crescente movimento de compilar e fazer <em>deploy</em> de sites estáticos simplificou esse processo no lado do <em>back-end</em>, com benefícios para todos.</p><p>Além disso, com a flexibilidade das diferentes ferramentas disponíveis, como a possibilidade de executar JavaScript no servidor, nossas habilidades podem ser transferidas para mais casos de uso do que nunca.</p><h3 id="de-onde-viemos">De onde viemos</h3><p>O cenário de desenvolvimento para a web está mudando rapidamente. O <a href="https://wordpress.org/">Wordpress</a> vem sendo o rei do CMS há algum tempo, representando mais de um terço dos sites que usam CMS e ajudando o PHP a ganhar popularidade. Outros, contudo, preferem suas próprias soluções.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/wordpress-cms-share.jpg" class="kg-image" alt="wordpress-cms-share" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/wordpress-cms-share.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/wordpress-cms-share.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/wordpress-cms-share.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/wordpress-cms-share.jpg 1800w" sizes="(min-width: 720px) 720px" width="1800" height="1000" loading="lazy"><figcaption><a href="https://trends.builtwith.com/cms">https://trends.builtwith.com/cms</a></figcaption></figure><p>Essas "soluções próprias" representam uma stack da web mais tradicional, como a <a href="https://en.wikipedia.org/wiki/LAMP_(software_bundle)">LAMP</a>. Nesses casos, você tinha servidores da web, geralmente executando algum tipo de sistema de gerenciamento de conteúdo e uma linguagem do lado do servidor (como o PHP), que faria a interface com os bancos de dados e produziria o código que acabaria por ser entregue ao navegador.</p><p>Além disso, você pode ter o JavaScript fazendo alguns recursos interativos e CSS gerenciando a exibição da página. Agora, em alguns casos, basta ter um servidor gerenciado com Wordpress para determinados provedores. Outros sites maiores, porém, exigiriam outra equipe para gerenciar esses serviços e o <em>pipeline </em>de <em>deploy </em>para colocar o código em produção.</p><h3 id="onde-estamos-e-para-onde-vamos">Onde estamos e para onde vamos</h3><p>Embora o <a href="https://trends.builtwith.com/cms/WordPress">Wordpress não vá desaparecer tão cedo</a>, as arquiteturas <a href="https://aws.amazon.com/serverless/">serverless</a> e <a href="https://jamstack.org/">JAMstack</a> estão ganhando força (textos e sites em inglês). Para quem não está familiarizado, a ideia não é literalmente a de que não existem servidores, mas de usar servidores que são gerenciados para você na nuvem.</p><p>Serviços como o <a href="https://aws.amazon.com/lambda/">AWS Lambda</a> permitem criar uma "função" que processa entradas e saídas simples. Anexe-a ao <a href="https://aws.amazon.com/pt/api-gateway/">gateway da API</a> e você terá imediatamente um <em>endpoint</em> com o qual poderá interagir sem precisar gerenciar um servidor.</p><p>Outros, como o <a href="https://aws.amazon.com/s3/">S3</a>, deixam você despejar HTML, CSS, JS, imagens e qualquer outro recurso estático no armazenamento e servir o site diretamente neles. Nada é processado no servidor, você está simplesmente servindo os arquivos estáticos para o <em>client</em>.</p><p>A parte brilhante disso é que o servidor não fica sobrecarregado e normalmente sai bem mais barato. Em muitos casos, você também terá um enorme aumento de desempenho, já que servir um site usando o S3 exigirá menos processamento para enviar a <a href="https://developers.google.com/web/tools/lighthouse/audits/ttfb">primeira resposta ao navegador</a>, o que pode levar a uma melhor experiência do usuário.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/brett-rambo-thumbs-up.gif" class="kg-image" alt="brett-rambo-thumbs-up" width="480" height="300" loading="lazy"><figcaption>Um joinha para uma boa experiência de usuário!</figcaption></figure><p>A ideia não é convencê-lo a usar o JAMstack, mas mostrar que o paradigma do <em>full-stack</em> está mudando e vale a pena prestar atenção nisso. Ainda existe uma noção conservadora da diferença no trabalho, mas isso está mudando.</p><p>Agora, são as equipes de DevOps que gerenciam recursos na nuvem e <em>deploys</em>. Os desenvolvedores de back-end agora criam APIs e código que fazem interface com serviços usando ferramentas como funções lambda. Os desenvolvedores de <em>front-end</em> trabalham principalmente com Javascript na criação de aplicações em <a href="https://reactjs.org/">React</a> ou <a href="https://vuejs.org/">Vue</a>, que acessam os serviços que os desenvolvedores de <em>back-end</em> criaram. Isso pode ou não incluir coisas como CSS, mas é mais um vespeiro discutir sobre em qual título essa tarefa se enquadra "oficialmente" (spoiler: depende da equipe).</p><p>Embora ainda haja uma noção de divisão de tarefas, a linha está ficando turva, tornando mais viável expandir o seu foco.</p><h2 id="antes-de-seguir-em-frente-vamos-falar-sobre-foco">Antes de seguir em frente, vamos falar sobre foco</h2><p>Pode ser bastante tentador querer mergulhar a fundo e tratar de todo o espectro de um desenvolvedor <em>full-stack</em>, mas há algo que precisa ser dito sobre foco. É a base da expressão "<a href="https://en.wikipedia.org/wiki/Jack_of_all_trades,_master_of_none">jack of all trades, master of none</a>" (algo como "pau para toda obra, mestre de nada" em tradução livre), em que você tenta aprender um pouco de cada parte do <em>full-stack</em>, mas nunca domina nada de verdade.</p><p>Isso pode ser perigoso quando você ainda é um iniciante e está começando a desenvolver seus pontos fortes. Portanto, tente avaliar que tipo de aluno você é e concentre-se no que é importante. Se você estiver tendo dificuldades com um currículo muito abrangente, ele não necessariamente vai ajudá-lo a adquirir a experiência necessária para conseguir aquele primeiro emprego ou o emprego dos sonhos que você está buscando.</p><p>Uma abordagem diferente seria, por exemplo, ter um foco em particular, mas desenvolver suas habilidades <em>full-stack</em> ao redor desse ponto forte. Você pode ser um desenvolvedor de <em>front-end</em> que pode fazer <em>deploy</em> de suas próprias aplicações da web e constrói seu conhecimento em cima desse conhecimento fundamental.</p><p>Além disso, ser um desenvolvedor <em>full-stack</em> não é necessariamente ser capaz de dizer que você conhece as linguagens x, y e z. Entender de programação e conceitos de design de software, bem como ser capaz de enfrentar qualquer desafio pela frente, seja qual for a <em>stack</em>, é o que faz um grande desenvolvedor.</p><p>Resumindo, tente descobrir o que é melhor para você e não deixe que grandes ambições atrapalhem o domínio da sua jornada.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/mr-miyagi-approves.gif" class="kg-image" alt="mr-miyagi-approves" width="480" height="260" loading="lazy"><figcaption>O Sr. Miyagi aprova</figcaption></figure><h2 id="ent-o-por-onde-come-amos">Então, por onde começamos?</h2><p>Para fins deste artigo, vamos manter as divisões tradicionais que compõem a <em>stack</em> (<em>front-end</em>, <em>back-end</em> etc.). Embora <a href="https://medium.com/better-programming/2020-001-full-stack-pronounced-dead-355d7f78e733">algumas pessoas digam que isso não existe mais</a> (texto em inglês), realisticamente, existe uma infinidade de empregos para desenvolvedores <em>full-stack</em> e, no dia a dia, eles se referem a essas divisões tradicionais. O "desenvolvedor <em>full-stack</em>" definitivamente veio para ficar.</p><p>No que diz respeito à <em>stack</em>, tenderemos às arquiteturas <em>serverless</em>/JAMstack, porque elas não param de crescer. Se você as aprender, isso só o tornará mais desejável, com diversos empregos surgindo em torno delas.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/boomshakalaka.gif" class="kg-image" alt="boomshakalaka" width="530" height="320" loading="lazy"><figcaption>Boomshakalaka!</figcaption></figure><p>Como você notará abaixo, o objetivo não é ser abrangente com todos os tipos de banco de dados e todas as soluções de renderização. Um desenvolvedor forte deve ser capaz de ser flexível com suas ferramentas, se esforçando para entender os conceitos de seu trabalho, em vez de ter a mente fechada e só ser capaz de ser produtivo em um <em>framework</em>.</p><p>Em um momento, você pode estar confortável usando React no seu trabalho atual (e está tudo bem!), mas seu próximo trabalho pode ser pesado no Vue, ou ("surpresa!") seu líder de equipe decide reescrever a aplicação com <a href="https://svelte.dev/">Svelte</a>. Tente entender por que você está usando um <em>framework </em>de interface do usuário em primeiro lugar e como ele está ajudando você a resolver o problema em questão.</p><p>Agora, vamos ao que interessa...</p><h2 id="front-end">Front-end</h2><p>O <em>front-end</em> de um site ou aplicação geralmente é a interface do usuário com a qual a pessoa que usa seu serviço interage. A linguagem de mais destaque aqui é o Javascript, do qual você normalmente dependerá para usar bibliotecas de interface de usuário, como o React ou o Vue, para gerenciar os componentes do seu projeto.</p><p>O uso desses <em>frameworks </em>de IU permite que você crie "componentes", essencialmente blocos de código que acabarão por produzir HTML com a capacidade de criar interações e estados dinâmicos junto com seu código. Isso é muito poderoso e, embora possa haver uma pequena curva de aprendizado no início, fica muito agradável de utilizar depois que você pega o jeito.</p><p>Seja você novo na área ou bem experiente, alguma hora você deve se deparar com o jQuery. Embora tenha seus méritos e tenha servido bem à comunidade, os recursos nativos do Javascript cresceram muito e diminuíram a demanda pela funcionalidade que o jQuery era capaz de fornecer. Agora, em vez disso, os desenvolvedores se utilizam dos <em>frameworks </em>de IU e do Javascript nativo.</p><p>Por isso, é bom entender o que é o jQuery, mas não recomendo dedicar seu tempo a aprendê-lo a essa altura. O lado bom é que, se você conseguir um trabalho que o use, pode escrever Javascript nativo junto com o jQuery. Então, aprender o Javascript puro é a resposta certa.</p><h3 id="ent-o-o-que-devo-aprender">Então, o que devo aprender?</h3><p>Se você realmente está começando agora, dedique seu tempo a aprender o básico do HTML e CSS. Pode não ser tão divertido e atraente como mergulhar direto no Javascript, mas ter <a href="https://www.freecodecamp.org/news/put-down-the-javascript-learn-html-css/">uma boa base sobre os fundamentos</a> (texto do autor em inglês) do que faz a web será a chave para começar com o pé direito.</p><p>Em seguida, aprenda Javascript. Ele continuará sendo o rei no futuro próximo. O Javascript fornecerá a base de qualquer <em>framework </em>ou biblioteca que você utilizar. Assim, entender os detalhes de como a linguagem em si funciona ajudará a impulsioná-lo em sua jornada para aprender o lado do <em>front-end</em> das coisas.</p><p>Isso também vai facilitar a sua vida quando você estiver tentando entender algumas das complexidades dos diferentes padrões e <a href="https://reactjs.org/docs/getting-started.html#javascript-resources">conceitos por trás dos <em>frameworks</em></a> que você usar.</p><p>Falando em <em>frameworks</em>, React e Vue são provavelmente os melhores candidatos, dada a sua popularidade. O React é o mais popular do grupo e vai continuar crescendo. Sua equipe está sempre trabalhando para amadurecer o <em>framework </em>e produzir APIs que ajudarão a criar aplicações para a web modernas e rápidas.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/front-end-framework-usage.jpg" class="kg-image" alt="front-end-framework-usage" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/front-end-framework-usage.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/front-end-framework-usage.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/front-end-framework-usage.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/front-end-framework-usage.jpg 1800w" sizes="(min-width: 720px) 720px" width="1800" height="830" loading="lazy"><figcaption><a href="https://2019.stateofjs.com/front-end-frameworks/#front_end_frameworks_section_overview">Estado dos frameworks JS em 2019</a></figcaption></figure><p>Iniciar um projeto com <a href="https://github.com/facebook/create-react-app">create-react-app</a> ou <a href="https://www.gatsbyjs.org/">Gatsby</a>, inclusive, facilita a configuração de uma aplicação em React para que você esteja imediatamente pronto para mexer no código.</p><p>Embora haja benefícios em citar pré-processadores de CSS e ferramentas como o Sass, há uma porção de soluções agora para CSS, incluindo o <a href="https://cssinjs.org/">CSS-in-JS</a>.</p><p>Embora colocar o CSS dentro do JS tenha seus <a href="https://www.freecodecamp.org/news/you-dont-need-css-in-js-why-i-use-stylesheets/">prós e contras</a> (texto do autor em inglês), não vale necessariamente a pena indicar uma direção específica do que usar, já que depende muito da equipe.</p><p>Compreender o básico e o poder do CSS e como usá-lo em sua forma mais básica vai ajudar você a se preparar para utilizá-lo, independentemente do <em>framework</em>.</p><h3 id="recursos">Recursos</h3><ul><li><a href="https://www.freecodecamp.org/portuguese/learn/2022/responsive-web-design/">Certificação de Design responsivo para a web (novo) do freeCodeCamp</a></li><li><a href="https://www.freecodecamp.org/news/put-down-the-javascript-learn-html-css/">Put Down the Javascript: Learn HTML &amp; CSS first</a> (artigo do autor em inglês)<strong> </strong></li><li><a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_overview">MDN Introdução ao Javascript</a> </li><li><a href="https://justjavascript.com/">Curso por e-mail Just Javascript</a> (em inglês) </li><li><a href="https://lab.reaal.me/jsrobot/">Jogo educativo JSRobot</a> (em inglês)</li><li><a href="https://react.dev/learn">Introdução ao React da reactjs.org</a> (em inglês)</li><li><a href="https://www.gatsbyjs.org/tutorial/">Tutoriais da gatsbyjs.org</a> (em inglês)</li></ul><h2 id="back-end">Back-end</h2><p>No mundo do JAMstack, o <em>back-end</em> geralmente se refere às APIs que nossos <em>front-ends</em> usam para criar experiências dinâmicas ao interagir com os <em>endpoints</em> do <em>client</em> (como os das APIs <a href="https://en.wikipedia.org/wiki/Create,_read,_update_and_delete">CRUD</a>). A possibilidade de fazer essas solicitações do lado do <em>client</em> elimina a necessidade de ter que fazer qualquer processamento antes que a página seja servida ao navegador.</p><p>Apesar de não ser bom achar que você só pode programar com uma linguagem, ser capaz de escrever em JavaScript dá uma boa vantagem aqui, já que você pode se introduzir aos fundamentos de trabalhar com o lado do <em>back-end</em> das coisas com uma linguagem familiar (ou vice-versa, com o <em>front-end</em>).</p><p>O <a href="https://nodejs.org/en/">NodeJS</a> é um ambiente de tempo de execução comum, que você encontrará na maioria dos ambientes na nuvem como opção e que dará a você uma experiência semelhante ao que você esperaria em um navegador. A principal diferença é que você não terá acesso a determinadas APIs do navegador nem haverá um objeto <code>Window</code> com suas APIs associadas.</p><p>Dito isto, o Python também é <a href="https://pypl.github.io/PYPL.html">outra linguagem popular</a> que está crescendo, especialmente devido à sua popularidade na comunidade de ciência e engenharia de dados. PHP e Ruby, embora sejam ambos válidos e ofereçam opções no mercado de trabalho, não parecem ser tão populares e nem <a href="https://madnight.github.io/githut/">tendem a crescer</a> tanto quanto Javascript e Python.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/language-popularity.jpg" class="kg-image" alt="language-popularity" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/language-popularity.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/language-popularity.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/language-popularity.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/language-popularity.jpg 1800w" sizes="(min-width: 720px) 720px" width="1800" height="530" loading="lazy"><figcaption><a href="https://madnight.github.io/githut/#/pull_requests/2019/4">Linguagens populares no GitHub</a></figcaption></figure><p>Com a linguagem de sua escolha, sua melhor aposta será aprender a criar serviços na nuvem com os quais suas aplicações possam interagir.</p><p>Criar um lambda simples com que você possa brincar, seja na AWS, na Netlify ou em qualquer outro provedor de serviços na nuvem, proporcionará uma boa experiência sobre o que você pode esperar ao trabalhar na área.</p><p>Mesmo que você não trabalhe diretamente em um lambda no emprego que conseguir, vai poder começar a se familiarizar com conceitos que são fundamentais para se trabalhar com o <em>back-end</em>. Cedo ou tarde, você usará essas funções para se conectar a outros serviços e bancos de dados para criar seus próprios serviços dinâmicos.</p><h3 id="ent-o-o-que-devo-aprender-1">Então, o que devo aprender?</h3><p>Se você já está se empenhando em aprender Javascript do lado do <em>front-end</em> das coisas, continue usando o Javascript para o seu <em>back-end</em>. Rode um lambda usando <a href="https://docs.netlify.com/functions/overview/">as funções do Netlify</a>, onde você só precisa se concentrar no código e o Netlify cuida do resto (como compilar e fazer o <em>deploy</em> da função).</p><p>Com a sua linguagem de escolha e primeira função, tente começar a trabalhar com outros serviços dentro do seu código para adquirir experiência trabalhando com APIs de terceiros.</p><p>Talvez construir um <em>endpoint </em>que possa <a href="https://github.com/colbyfayock/tweet">enviar um tweet</a> usando a <a href="https://developer.twitter.com/en/docs">API do Twitter</a> (mas não abuse dela). Aprenda a criar um banco de dados e configurar sua função para interagir com ele em um padrão CRUD. Isso dará a você um caso de uso mais realista de como uma aplicação típica pode interagir com um <em>back-end</em>.</p><p>Seu objetivo aqui deve ser criar serviços com os quais seu <em>front-end</em> interaja por meio de um <em>endpoint</em> para executar operações para a pessoa que usa sua aplicação. A boa notícia é que, dado o crescimento de tecnologias da nuvem, você terá uma porção de opções, <a href="https://aws.amazon.com/free/">algumas delas gratuitas</a>, para começar a brincar.</p><h3 id="recursos-1">Recursos</h3><ul><li><a href="https://kentcdodds.com/blog/super-simple-start-to-serverless">Super simple start to Netlify functions</a> (em inglês) </li><li><a href="https://www.netlify.com/blog/2018/07/09/building-serverless-crud-apps-with-netlify-functions-faunadb/">Building Serverless CRUD apps with Netlify Functions &amp; FaunaDB</a> (em inglês) </li></ul><h2 id="devops-e-a-nuvem">DevOps e a nuvem</h2><p>O DevOps decorre da necessidade de se criar soluções que suavizam e aceleram o processo de levar o código da sua escrita à sua implementação.</p><p>Esse trabalho pode variar de muitas responsabilidades a umas poucas, seja escrever scripts bash para uma solução personalizada, seja escrever um modelo de <a href="https://aws.amazon.com/cloudformation/">CloudFormation</a> que cria todos os recursos necessários para que uma aplicação seja executada.</p><p>Normalmente, você encontrará isso como parte de uma orquestração maior de fluxos de trabalho de <a href="https://en.wikipedia.org/wiki/CI/CD">CI/CD</a> que automatizam os processos de compilação e <em>deploy</em>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/continuous-integration-continuous-deploy-1.jpg" class="kg-image" alt="continuous-integration-continuous-deploy-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/continuous-integration-continuous-deploy-1.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/continuous-integration-continuous-deploy-1.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/continuous-integration-continuous-deploy-1.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/continuous-integration-continuous-deploy-1.jpg 1800w" sizes="(min-width: 720px) 720px" width="1800" height="823" loading="lazy"><figcaption>Pipeline CI / CD</figcaption></figure><p>Isso muda constantemente! Dada a febre do <em>serverless</em>, surgiu o <a href="https://serverless.com/">framework serverless</a> para gerenciar muito disso para você de uma maneira mais fácil, o que levou a AWS a criar sua própria solução, o <a href="https://aws.amazon.com/serverless/sam/">SAM</a>. Ferramentas como o <a href="https://jenkins.io/">Jenkins</a> já existem há algum tempo para parte do CI/CD, mas agora estamos vendo o <a href="https://github.com/features/actions">GitHub</a>, o <a href="https://about.gitlab.com/product/continuous-integration/">GitLab</a> e outros provedores de controle de versão fornecerem suas próprias soluções. Vemos também ferramentas, como o <a href="https://circleci.com/">CircleCI</a>, que se conectam diretamente ao seu projeto.</p><p>Essas soluções, contudo, ainda não são perfeitas – escrever modelos do CloudFormation pode ser assustador. Escrever scripts de automação também não é muito divertido, embora seja supergratificante quando eles funcionam!</p><p>O processo, porém, está melhorando. É aí que produtos como Netlify e Zeit entram. Apesar de estarem mais enraizados no lado da hospedagem estática, onde você compila sua aplicação e a despeja no armazenamento, suas ofertas estão crescendo, como as <a href="https://www.netlify.com/products/functions/">Funções da Netlify</a>, que não passam de AWS Lambdas mais fáceis de configurar e de fazer <em>deploy </em>para um <em>endpoint </em>totalmente funcional (é realmente superfácil).</p><h3 id="ent-o-o-que-devo-aprender-2">Então, o que devo aprender?</h3><p>Se for a primeira vez que você configura esse tipo de coisa, comece com o Netlify. Configure uma aplicação do React ou mesmo apenas um arquivo HTML simples em um repositório do GitHub, conecte-o a uma nova conta do Netlify e veja o <em>deploy </em>acontecer.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/netlify-setup.jpg" class="kg-image" alt="netlify-setup" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/netlify-setup.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/netlify-setup.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/netlify-setup.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/netlify-setup.jpg 1800w" sizes="(min-width: 720px) 720px" width="1800" height="740" loading="lazy"><figcaption>Configuração fácil com <a href="https://www.netlify.com/">Netlify</a></figcaption></figure><p>A partir daí, ou se você já tiver um pouco de experiência, comece a pesquisar sobre o que está acontecendo internamente. O Netlify, provavelmente, está pegando seu código, executando os comandos que você configurou (como <code>yarn build</code>) em um ambiente virtual, despejando os arquivos gerados em algum armazenamento, como o S3, e colocando uma CDN, como o CloudFront, na frente para servir de <em>endpoint</em>.</p><p>Primeiro, tente fazer isso manualmente do seu computador, usando o AWS Console e sua CLI e, em seguida, escreva um script para automatizar todo o processo de integração com o Circle CI em seu projeto no GitHub em vez do Netlify para que o <em>deploy </em>realmente aconteça no AWS.</p><p>Indo mais além, você pode criar serviços para fazer interface com o seu <em>back-end</em>. Você tem um banco de dados que seus serviços usam? Você pode automatizar a criação desse banco de dados usando CloudFormation ou scripts bash.</p><p>Tratar sua infraestrutura como código, com recursos descartáveis e facilmente recriáveis, ajudará você e seus projetos a se tornarem mais flexíveis e a terem uma melhor capacidade de voltar a funcionar em caso de falha.</p><p>Tudo isso vale para qualquer provedor de nuvem ou CI/CD, não apenas para a AWS e o Circle CI. Escolha sua ferramenta de nuvem e fluxo de trabalho favorita e mande ver. A questão é começar a observar as necessidades do seu projeto e descobrir o que realmente está acontecendo nas partes automatizadas da <em>stack</em>. Assim, você vai aprender mais e se tornará mais criativo para lidar com necessidades do seu projeto.</p><h3 id="recursos-2">Recursos</h3><ul><li><a href="https://www.netlify.com/blog/2016/09/29/a-step-by-step-guide-deploying-on-netlify/">A Step-by-Step Guide: Deploying on Netlify</a> (em inglês) </li><li><a href="https://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/HostingWebsiteOnS3Setup.html">Tutorial: Configuring a static website on Amazon S3 </a> (em inglês)</li><li><a href="https://www.freecodecamp.org/news/aws-certified-cloud-practitioner-training-2019-free-video-course/">AWS Certified Cloud Practitioner Training 2019 - A Free 4-hour Video Course</a> (em inglês)</li><li>Consulte os recursos de Javascript da sessão de front-end acima</li></ul><h2 id="design">Design</h2><p>Sim, você deve entender o básico de design. Não, você não precisa ser um designer.</p><p>Há muitos aspectos do design que acelerarão suas habilidades como desenvolvedor. Todo mundo sabe que designers visuais e de experiência do usuário fazem mágica, mas ter um entendimento básico pode impedir que sua aplicação se torne uma grande decepção.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/pied-piper-user-interface.jpg" class="kg-image" alt="pied-piper-user-interface" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/pied-piper-user-interface.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/pied-piper-user-interface.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/pied-piper-user-interface.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/pied-piper-user-interface.jpg 2000w" sizes="(min-width: 720px) 720px" width="2000" height="1000" loading="lazy"><figcaption>A aplicação fictícia Pied Piper deu ruim por causa de uma má experiência de usuário</figcaption></figure><p>Todos no processo de desenvolvimento estão trabalhando em direção a uma meta que afeta um usuário final de uma forma ou de outra. Ser capaz de entender quais necessidades seu trabalho está tentando resolver e como isso afeta os usuários ajudará a equipe como um todo a desenvolver uma solução final mais abrangente.</p><p>Considere um desenvolvedor de <em>back-end</em> criando uma API para permitir que alguém gerencie usuários em uma aplicação. Os requisitos da API são bastante enxutos e incluem apenas o nome do usuário. Fornecer isso como um único campo "nome" em vez de "nome" e "sobrenome" pode não ser a solução mais intuitiva para a maioria, mas pode ser um descuido que complica como o desenvolvedor do <em>front-end</em> expõe isso na interface do usuário, o que tornaria difícil para o desenvolvedor exibir ou poderia confundir o usuário final que está consumindo o produto.</p><p>Além de tudo isso, o design pode impactar diretamente a conversão. Se você estiver desenvolvendo na área de comércio eletrônico, fazer um botão que não se parece com um botão pode impedir que as pessoas adicionem um produto ao carrinho. Isso, é claro, impedirá uma compra, o que significa receita perdida. Entender como humanizar a interface do usuário, mesmo em um nível básico, pode literalmente gerar mais dinheiro para o seu projeto ou, pelo menos, ajudar as pessoas a usá-lo com mais facilidade.</p><p>Mais importante do que isso, é importante que seu site seja acessível. Muitas pessoas têm necessidades diferentes, seja porque elas não podem ver cores do mesmo jeito ou porque não podem ouvir os sons que sua aplicação produz. Você precisa reconhecer as necessidades alheias e tentar criar um design de tal modo que sua aplicação seja acessível a todos.</p><h3 id="ent-o-o-que-devo-aprender-3">Então, o que devo aprender?</h3><p>Embora eu não espere que você faça um curso inteiro para isso, tente ser consciente e curioso. Talvez, da próxima vez, não pule aquele <a href="https://www.freecodecamp.org/news/tag/design/">artigo de design</a> que você viu aparecer no <a href="https://twitter.com/freecodecamp">Twitter do freeCodeCamp</a>.</p><p>Ao criar soluções, tente imaginar como seu trabalho será usado. O que os outros desenvolvedores da sua equipe precisarão na sua API? O que as pessoas que usam sua aplicação precisam na sua interface?</p><p>Você também pode tentar se inspirar no que os outros estão fazendo em seu espaço. Que aparência você espera que uma aplicação tenha ao fornecer funcionalidades semelhantes? Isso não é licença para copiar ou roubar, mas é bom entender as necessidades que a solução está resolvendo. Reflita no motivo do botão Adicionar ao Carrinho ser tão grande, por que estão deixando os usuários darem zoom em uma foto de produto ou como você pode tornar o design de uma tabela um pouco mais utilizável.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/dribbble-table-design.jpg" class="kg-image" alt="dribbble-table-design" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/dribbble-table-design.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/dribbble-table-design.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/dribbble-table-design.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/dribbble-table-design.jpg 1800w" sizes="(min-width: 720px) 720px" width="1800" height="1060" loading="lazy"><figcaption><a href="https://dribbble.com/search/shots/popular/product-design?q=table">Design de produto "tabela" no Dribbble</a></figcaption></figure><p>Quanto à acessibilidade, tente aprender o básico. Há cada vez mais recursos disponíveis para ajudá-lo a entender as necessidades das pessoas. Tente entender quais deficiências existem e como elas podem afetar o uso da sua aplicação. Quem sabe, você poderá até encontrar alguns padrões comuns de como lidar com essas questões.</p><p>Na maioria das vezes, não é muito difícil incorporar essas questões. Se você adquirir o hábito de fazer isso desde o início, nem vai pensar sobre o assunto na próxima vez em que você construir uma aplicação.</p><h3 id="recursos-3">Recursos</h3><ul><li><a href="https://thoughtbot.com/upcase/design-for-developers">Design for developers</a> (em inglês) </li><li><a href="https://hackdesign.org">Hack Design</a> (em inglês) </li><li><a href="https://designforhackers.com/">Design for Hackers</a> (em inglês) </li><li><a href="https://webaim.org/intro/">Introduction to Web Accessibility</a> (em inglês) </li></ul><h2 id="outras-coisas-se-voc-est-apenas-come-ando">Outras coisas se você está apenas começando</h2><p>Muito deste artigo pressupõe que você já domine alguns conceitos básicos, como entender o que é o <a href="https://pt.wikipedia.org/wiki/Git">Git</a> e o controle de versão ou simplesmente configurar o editor de código. Se você está mesmo começando só agora, vai ser útil ter pelo menos uma compreensão simples desses conceitos, porque vai ficar cada vez mais desafiador sem eles.</p><p>Também é preciso falar sobre aprender a usar o terminal. Pode ser assustador não usar uma GUI quando se está começando, mas uma vez que você começar a se acostumar, vai descobrir rapidamente que será mais produtivo usando um terminal, e, de qualquer maneira, muitos projetos exigem o uso do terminal.</p><h3 id="ent-o-o-que-devo-aprender-4">Então, o que devo aprender?</h3><p>Primeiro de tudo, configure seu editor de código. O <a href="https://code.visualstudio.com/">Visual Studio Code</a> está em alta agora, mas há outros que o servirão bem, dependendo de suas preferências, como o <a href="https://atom.io/">Atom</a> ou o <a href="https://www.sublimetext.com/">Sublime Text</a>. Você também vai encontrar IDEs baseados na nuvem, como o <a href="https://repl.it/">Repl.it</a>, ou pode começar com uma barreira de entrada mais baixa, brincando no <a href="https://codepen.io/">CodePen</a> ou no <a href="https://jsfiddle.net/">JSFiddle</a>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/visual-studio-code-so-hot.jpg" class="kg-image" alt="visual-studio-code-so-hot" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/visual-studio-code-so-hot.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/visual-studio-code-so-hot.jpg 970w" sizes="(min-width: 720px) 720px" width="970" height="570" loading="lazy"><figcaption>O Visual Studio Code tá pegando fogo agora</figcaption></figure><p>De qualquer modo, assim que estiver pronto para programar, você vai precisar entender o que é o controle de versão. O Git é o maior representante disso no momento. O Git é uma ferramenta poderosa que permite rastrear alterações no código e se tornar mais produtivo colaborando com outros desenvolvedores.</p><p>Familiarize-se com alguns dos comandos básicos do Git, como adicionar novas alterações, bem como o que são as <em>branches </em>e como usá-las. O mundo do Git é enorme, você não precisa dominá-lo imediatamente, mas logo vai aprender que há uma quantidade infinita de coisas novas para aprender em sua jornada para dominar o Git.</p><p>Muitas ferramentas que você vai usar, como o <a href="https://www.gitkraken.com/">GitKraken</a>, têm interfaces gráficas disponíveis, mas elas ainda são um pouco limitadas no que podem fazer. Aprender a lidar com os terminais padrão na sua máquina ou baixar outras opções, como o <a href="https://iterm2.com/">iterm2</a> (minha preferência) ou o <a href="https://xtermjs.org/">Xterm.js</a>, valerá mais a pena. Bônus: você vai se sentir como um hacker dos filmes toda vez que usá-los (ou será que sou só eu?).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/hacking-swordfish.gif" class="kg-image" alt="hacking-swordfish" width="480" height="255" loading="lazy"><figcaption>Hugh Jackman hackeando em Swordfish</figcaption></figure><h3 id="recursos-4">Recursos</h3><ul><li><a href="https://www.codecademy.com/articles/visual-studio-code">Introduction to Visual Studio Code</a> (em inglês) </li><li><a href="https://docs.github.com/pt/get-started/quickstart/hello-world">Tutoriais de Git do Github</a> </li><li> <a href="https://learngitbranching.js.org/?locale=pt_BR">Learn Git Branching!</a></li><li><a href="https://blog.teamtreehouse.com/introduction-to-the-mac-os-x-command-line">Introduction to the command line on Mac</a> (em inglês)</li></ul><h2 id="outras-coisas-se-voc-estiver-procurando-por-mais">Outras coisas se você estiver procurando por mais</h2><p>Existem muitas outras coisas em que você pode se aprofundar. Lembre-se de não dispersar o seu foco e tente não se sobrecarregar. Se, no entanto, estiver se sentindo confiante com a sua situação, há alguns outros conceitos que ajudarão você a enfrentar desafios no mundo real.</p><h3 id="testes-e-as-diferentes-metodologias"><a href="https://en.wikipedia.org/wiki/Software_testing">Testes</a> e as diferentes metodologias</h3><p>Escrever código é uma coisa, mas ser capaz de configurar testes eficazes solidificará o seu código e evitará que bugs apareçam. Você não quer perder seu tempo no futuro ou mesmo perder a renda do seu produto quando o site cair. Aprender a escrever testes e as diferentes abordagens é importante para solidificar seu código.</p><h3 id="ferramentas-do-navegador-como-o-chrome-devtools">Ferramentas do navegador, como o <a href="https://developers.google.com/web/tools/chrome-devtools">Chrome DevTools</a></h3><p>Uma das ferramentas mais poderosas que você pode ter ao depurar sua aplicação, na minha opinião, é ser capaz de fazer isso no navegador.</p><p>Seja observando como o DOM está sendo renderizado, <a href="https://developers.google.com/web/tools/chrome-devtools/inspect-styles/edit-styles">mexendo no CSS</a> (texto em inglês) ou depurando suas solicitações de rede, você aprenderá rapidamente a economizar tempo e identificar mais facilmente de onde o bug está vindo.</p><h3 id="http-e-como-depurar-solicita-es-no-painel-de-rede"><a href="https://developers.google.com/web/fundamentals/performance/http2">HTTP</a> e como depurar solicitações no <a href="https://developers.google.com/web/tools/chrome-devtools/network">painel de rede</a></h3><p>Já que a web é baseada na internet, sua aplicação acabará fazendo solicitações para outros servidores. Quando isso acontece, entender os gargalos de solicitação ou simplesmente como uma solicitação está sendo feita pode ajudá-lo a entender por que sua aplicação parece lenta ou por que o botão Salvar não está funcionando.</p><p>Ter uma compreensão básica de como as solicitações funcionam e de como visualizá-las para depuração ajudará muito na sua jornada.</p><h3 id="software-de-c-digo-aberto-e-gerenciadores-de-pacotes">Software de código aberto e gerenciadores de pacotes</h3><p>Aqui, o assunto não é tanto sobre uma habilidade ou ferramenta para aprender, mas um modo como o software é distribuído. Ao começar a criar soluções com código, você logo perceberá que muitos de nós dependemos de pacotes de código aberto. Na maioria das vezes, é através do <a href="https://www.npmjs.com/">npm</a>, se estiver escrevendo em Javascript, o que nos ajuda a sermos mais produtivos, já que não precisamos reinventar a roda toda vez.</p><p>Passe algum tempo entendendo o conceito de código aberto e até considere retribuir colaborando no seu projeto favorito. Dar uma mão é geralmente muito bem-vindo, além de ajudá-lo a ganhar experiência, e você pode até mesmo ganhar <a href="https://www.gatsbyjs.org/contributing/contributor-swag/">brindes no seu primeiro pull request aprovado</a> (texto em inglês)! Porém, seja respeitoso! Há uma pessoa de verdade do outro lado da solicitação também.</p><h2 id="o-que-mais">O que mais?</h2><p>Esta lista pode não acabar nunca, pois o mundo da programação é imenso. O que mais você acha que é importante na jornada para se tornar um mestre do desenvolvimento? Envie um <a href="https://twitter.com/colbyfayock">tweet ou mensagem direta</a> para o autor se acha que ele deixou passar algo importante!</p><h2 id="voc-est-com-tudo-hora-de-unir-todas-as-pontas">Você está com tudo! Hora de unir todas as pontas</h2><p>Dada toda a experiência que você terá acumulado com o que vimos, você já deve ser capaz de criar uma aplicação inteiro do início ao fim sozinho. Você tem ideia do poder que tem?</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/thanos-glove-1.gif" class="kg-image" alt="thanos-glove-1" width="480" height="199" loading="lazy"><figcaption>Thanos preparando a manopla</figcaption></figure><p>É aqui que a diversão começa. Tente criar uma aplicação do zero – não importa o que seja, basta criar algo. A melhor coisa que você pode fazer para aprender é ganhar experiência fazendo. Não importa se é um dos milhões de tutoriais de listas de tarefas por aí ou se vai se ensinar a programar construindo uma das maiores redes sociais, como o <a href="https://thenextweb.com/2012/04/10/instagrams-ceo-had-no-formal-programming-training-hes-a-marketer-who-learned-to-code-by-night/">criador do Instagram</a> (texto em inglês).</p><p>A partir daqui, você deve ser capaz de criar:</p><ul><li>Um <em>front-end</em> de aplicação da web que é executada no navegador</li><li>Serviços de <em>back-end</em> para os quais sua aplicação da web pode fazer solicitações por meio de <em>endpoints</em></li><li>Escrever um script para se conectar a uma ferramenta de CI/CD para automatizar seu processo de compilação e <em>deploy</em></li><li>Bônus: tomar boas decisões sobre a aparência da sua interface para que as pessoas possam usá-la bem!</li></ul><p>Vá em frente e desenvolva! <a href="https://twitter.com/intent/tweet?text=My%20%23codejourney%20started%20with...%0A%0AHow%20to%20Become%20a%20Full%20Stack%20Web%20Developer%20in%20a%20JAMstack%202020%0A@colbyfayock%20@freecodecamp%0Ahttps%3A%2F%2Fwww.freecodecamp.org%2Fnews%2Fhow-to-become-a-full-stack-web-developer-in-2020">Compartilhe com o autor sua jornada na programação</a> no Twitter usando a hashtag #codejourney. Adoraríamos de saber mais sobre o que você passou, o que construiu ou para onde está indo e o que quer construir.</p><figure class="kg-card kg-image-card"><img src="https://res.cloudinary.com/fay/image/upload/w_2000,h_400,c_fill,q_auto,f_auto/w_1020,c_fit,co_rgb:007079,g_north_west,x_635,y_70,l_text:Source%20Sans%20Pro_64_line_spacing_-10_bold:Colby%20Fayock/w_1020,c_fit,co_rgb:383f43,g_west,x_635,y_6,l_text:Source%20Sans%20Pro_44_line_spacing_0_normal:Follow%20me%20for%20more%20JavaScript%252c%20UX%252c%20and%20other%20interesting%20things!/w_1020,c_fit,co_rgb:007079,g_south_west,x_635,y_70,l_text:Source%20Sans%20Pro_40_line_spacing_-10_semibold:colbyfayock.com/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_68,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_145,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_222,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_295,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/v1/social-footer-card" class="kg-image" alt="Siga-me para mais Javascript, UX e outras coisas interessantes!" width="2000" height="400" loading="lazy"></figure><ul><li><a href="https://twitter.com/colbyfayock">Siga o autor no Twitter</a></li><li><a href="https://youtube.com/colbyfayock">Inscreva-se no canal do autor no YouTube</a></li><li><a href="https://www.colbyfayock.com/newsletter/">✉️ Inscreva-se na newsletter do autor</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Aprenda Bootstrap 4 em 30 minutos criando um site ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Said Hayani (Tradução em português europeu) Guia para iniciantes > "O Bootstrap é uma biblioteca de front-end gratuita e de código aberto para criação de sites e aplicações para a web. Contém modelos de design criados em HTML e CSS para tudo, desde tipografia, formulários, botões, navegação e ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/aprenda-bootstrap-4-em-30-minutos-ao-criar-uma-pagina/</link>
                <guid isPermaLink="false">63a42dde6389b20662b61252</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento para a Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Tiago Costa Rebelo ]]>
                </dc:creator>
                <pubDate>Mon, 06 Mar 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_1_a4TocueD3AqEpsDDv4bA.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/learn-bootstrap-4-in-30-minute-by-building-a-landing-page-website-guide-for-beginners-f64e03833f33/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Learn Bootstrap 4 in 30 minutes by building a landing page website</a>
      </p><p>Escrito por: Said Hayani</p><p>(Tradução em português europeu)</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_a9OoxPsn-hrbjYpbNV6DzA.gif" class="kg-image" alt="1_a9OoxPsn-hrbjYpbNV6DzA" width="579" height="286" loading="lazy"></figure><h3 id="guia-para-iniciantes">Guia para iniciantes</h3><blockquote>"O Bootstrap é uma biblioteca de front-end gratuita e de código aberto para criação de sites e aplicações para a web. Contém modelos de design criados em HTML e CSS para tudo, desde tipografia, formulários, botões, navegação e outros componentes de UI, bem como extensões de JavaScript. Ao contrário de muitos outros frameworks para a web, o Bootstrap tem como foco apenas o desenvolvimento front-end." — <a href="https://pt.wikipedia.org/wiki/Bootstrap_(framework_front-end)">Wikipédia</a></blockquote><p>Olá. Antes de começarmos, confere o meu <a href="https://skl.sh/2NbSAYj">curso completo</a> para aprender Boostrap 4, onde aprenderás novos recursos do Boostrap e como usá-los, de modo a criares melhores experiências de usuário.</p><p>O Bootstrap tem várias versões, sendo a versão 4 a mais recente. Neste artigo, vamos construir o nosso website usando o Bootstrap 4.</p><blockquote>Nota da tradução: no momento da escrita deste artigo, a versão mais recente era a versão 4. No momento da tradução, já estamos na versão 5.3.0.</blockquote><h3 id="pr-requisitos">Pré-requisitos</h3><p>Antes de começar, é importante que tenhas os seguintes conhecimentos, para melhor compreenderes e aprenderes a usar o framework Boostrap: </p><ul><li>HTML</li><li>conhecimento base de CSS</li><li>conhecimento base de jQuery</li></ul><h3 id="-ndice"><strong>Índice</strong></h3><p>Para o nosso website, vamos cobrir os seguintes tópicos:</p><ul><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-bootstrap-4-em-30-minutos-ao-criar-uma-pagina/#baixar-e-instalar-o-bootstrap-4">Baixar e instalar o Bootstrap 4</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-bootstrap-4-em-30-minutos-ao-criar-uma-pagina/#o-que-h-de-novo-no-bootstrap-4">O que há de novo no Bootstrap 4</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-bootstrap-4-em-30-minutos-ao-criar-uma-pagina/#o-sistema-de-grid-do-bootstrap">O sistema de grid no Boostrap</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-bootstrap-4-em-30-minutos-ao-criar-uma-pagina/#barra-de-navega-o">Barra de navegação</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-bootstrap-4-em-30-minutos-ao-criar-uma-pagina/#header">Header</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-bootstrap-4-em-30-minutos-ao-criar-uma-pagina/#bot-es">Botões</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-bootstrap-4-em-30-minutos-ao-criar-uma-pagina/#sec-o-sobre-mim">Secção Sobre mim</a> </li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-bootstrap-4-em-30-minutos-ao-criar-uma-pagina/#sec-o-portfolio">Secção Portfolio</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-bootstrap-4-em-30-minutos-ao-criar-uma-pagina/#sec-o-blog">Secção Blog</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-bootstrap-4-em-30-minutos-ao-criar-uma-pagina/#cart-es-cards-">Cartões (cards</a>)</li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-bootstrap-4-em-30-minutos-ao-criar-uma-pagina/#sec-o-a-equipa">Secção A equipa</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-bootstrap-4-em-30-minutos-ao-criar-uma-pagina/#formul-rio-de-contacto">Formulário de contacto</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-bootstrap-4-em-30-minutos-ao-criar-uma-pagina/#fonts">Fonts</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-bootstrap-4-em-30-minutos-ao-criar-uma-pagina/#efeito-scroll">Efeito scroll</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/aprenda-bootstrap-4-em-30-minutos-ao-criar-uma-pagina/#-ltimos-retoques-e-conclus-o">Últimos retoques e conclusão</a></li></ul><h3 id="baixar-e-instalar-o-bootstrap-4">Baixar e instalar o Bootstrap <strong><strong>4</strong></strong></h3><p>Há três formas de instalar ou incluir o Bootstrap nos nossos projectos:</p><ol><li>Usando o npm</li></ol><p>Podemos instalar Bootstrap 4 usando este comando no nosso Terminal <code>npm install bootstrap</code></p><blockquote>Nota de tradução: é possível instalar a versão do Bootstrap 4 indicada, nos dias de hoje, usando <code>npm install bootstrap@4.0.0</code></blockquote><p>2. Usando Content Delivery Network (CDN)</p><p>Para usar CDN, basta incluir o link abaixo no nosso projecto, dentro das &nbsp;tags &lt;head&gt;:</p><pre><code class="language-html">&lt;link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"&gt;</code></pre><blockquote>Nota de tradução: recomendamos realizar a instalação por meio do CDN para aqueles que preferem ter instaladas as versões mais recentes dos pacotes.</blockquote><p>3. Baixar o <a href="http://getbootstrap.com/" rel="noopener">Bootstrap</a> e usá-lo localmente (no nosso pc).</p><blockquote>Nota de tradução: este link, de fato, levará ao site do Bootstrap para baixar a versão mais recente do framework, não a versão 4.</blockquote><p>A estrutura (pasta) do nosso projecto deverá estar assim:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_cyhB-vVWlIwbNpDH_JNZYg.png" class="kg-image" alt="1_cyhB-vVWlIwbNpDH_JNZYg" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/03/1_cyhB-vVWlIwbNpDH_JNZYg.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_cyhB-vVWlIwbNpDH_JNZYg.png 800w" sizes="(min-width: 720px) 720px" width="800" height="507" loading="lazy"></figure><h3 id="o-que-h-de-novo-no-bootstrap-4"><strong>O que há de novo no<strong> Bootstrap 4</strong></strong></h3><p>O que há de novo no Boostrap 4? Quais as diferenças entre Bootstrap 3 e 4?</p><p>O Bootstrap 4 traz as seguintes funcionalidades que não existiam na versão anterior:</p><ul><li>Bootstrap 4 foi criado com Flexbox e Grid, enquanto o Bootstrap 3 foi criado usando float.<br>Se o termo Flexbox é novo para ti, vê este <a href="https://scrimba.com/p/pL65cJ/canLGCw" rel="noopener">tutorial</a> (em inglês).</li><li>Bootstrap 4 faz uso da unidade/medida <code>rem</code> em CSS, enquanto o Bootstrap 3 usa a unidade/medida <code>px</code>.<br><a href="https://zellwk.com/blog/media-query-units/" rel="noopener">Entende neste artigo como as duas se diferenciam</a> (texto em inglês).</li><li>Painéis, miniaturas e wells foram retirados na sua totalidade.<br>Podes ler mais sobre as alterações gerais e as funcionalidades removidas no Boostrap 4 <a href="http://getbootstrap.com/docs/4.0/migration/#global-changes" rel="noopener">aqui</a> (documentação oficial em inglês).</li></ul><p>Sem entrar em grande detalhe, vamos concentrar-nos nas partes mais importantes.</p><h3 id="o-sistema-de-grid-do-bootstrap"><strong>O sistema de grid do <strong>Bootstrap </strong></strong></h3><p>O sistema de Grid no Bootstrap ajuda-te a criar o layout do site de modo fácil e responsivo. &nbsp;Não houve alterações nos nomes das classes usadas, com excepção para a <code>.xs</code> classe, que deixou de existir na versão do Bootstrap 4.</p><p>A grid foi dividida em 12 colunas, nas quais se baseará o layout do teu site.</p><p>Para usar o sistema de grid, terás de incluir a class <code>.row</code> na tua <em><em>div</em> </em>principal e depois nas <em>divs internas </em>aplicar uma das seguintes.</p><pre><code class="language-html">col-lg-2 // classe usada para dispositivos grandes, como portáteis
col-md-2 // class usada para dispositivos médios, como tablets
col-sm-2// class usada para dispositivos pequenos, como telemóveis</code></pre><h3 id="barra-de-navega-o">Barra de navegação</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_VbIQyNsPrZ143nV8LaHLAg.png" class="kg-image" alt="1_VbIQyNsPrZ143nV8LaHLAg" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/03/1_VbIQyNsPrZ143nV8LaHLAg.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_VbIQyNsPrZ143nV8LaHLAg.png 800w" sizes="(min-width: 720px) 720px" width="800" height="164" loading="lazy"></figure><p>A funcionalidade do elemento/tag que envolve a barra de navegação no Bootstrap 4 é fantástica e muito útil quando se trata de criar uma barra de navegação responsiva.</p><p>Para isso, vamos adicionar a classe <code>navbar</code> ao nosso ficheiro <code><strong><strong>index.html</strong></strong></code>:</p><pre><code class="language-html">&lt;!-- navbar --&gt;  
 &lt;nav class="navbar navbar-expand-lg fixed-top "&gt;  
 &lt;a class="navbar-brand" href="#"&gt;Home&lt;/a&gt;
&lt;button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"&gt;  
 &lt;span class="navbar-toggler-icon"&gt;&lt;/span&gt;
&lt;/button&gt;
&lt;div class="collapse navbar-collapse " id="navbarSupportedContent"&gt;     &lt;ul class="navbar-nav mr-4"&gt;
 &lt;li class="nav-item"&gt;
     &lt;a class="nav-link" data-value="about" href="#"&gt;About&lt;/a&gt;        &lt;/li&gt;  
&lt;li class="nav-item"&gt;
    &lt;a class="nav-link " data-value="portfolio"href="#"&gt;Portfolio&lt;/a&gt;    
 &lt;/li&gt;
 &lt;li class="nav-item"&gt; 
    &lt;a class="nav-link " data-value="blog" href="#"&gt;Blog&lt;/a&gt;         &lt;/li&gt;   
&lt;li class="nav-item"&gt;  
   &lt;a class="nav-link " data-value="team" href="#"&gt;         Team&lt;/a&gt;       &lt;/li&gt;  
&lt;li class="nav-item"&gt; 
 &lt;a class="nav-link " data-value="contact" href="#"&gt;Contact&lt;/a&gt;       &lt;/li&gt; 
&lt;/ul&gt; 
&lt;/div&gt;&lt;/nav&gt;</code></pre><figure class="kg-card kg-embed-card"><iframe width="1280" height="500" src="https://codesandbox.io/embed/38nnqwl8n6?from-embed" style="width:1280px; height:500px; border:0; border-radius: 4px; overflow:hidden;" sandbox="allow-modals allow-forms allow-popups allow-scripts allow-same-origin" title="Conteúdo incorporado" loading="lazy"></iframe></figure><p>A seguir, cria e inclui o ficheiro <code><strong><strong>main.css</strong></strong></code> para que possas criar e editar os teus elementos com CSS.</p><p>Coloca a seguinte linha de código entre as tags <code>head</code> do teu ficheiro <code><strong><strong>index.html</strong></strong></code>:</p><pre><code class="language-html">&lt;link rel="stylesheet" type="text/css" href="css/main.css"&gt;</code></pre><p>Vamos agora adicionar cor à barra de navegação:</p><pre><code class="language-css">.navbar{ background:#F97300;}

.nav-link , .navbar-brand{ color: #f4f4f4; cursor: pointer;}

.nav-link{ margin-right: 1em !important;}

.nav-link:hover{ background: #f4f4f4; color: #f97300; }

.navbar-collapse{ justify-content: flex-end;}

.navbar-toggler{  background:#fff !important;}</code></pre><p>Uma vez que o sistema de Grid na nova versão do Bootstrap foi criado usando o sistema Flexbox, terás de usar as propriedades do Flexbox para o alinhamento dos elementos. Por exemplo, para colocar o menu da barra de navegação do lado direito, temos de adicionar a propriedade <code>justify-content</code> e definir o seu valor para <code>flex-end</code>.</p><pre><code class="language-css">.navbar-collapse{
 justify-content: flex-end;
}</code></pre><p>Adiciona a classe <code>.fixed-top</code> à tua barra de navegação, de forma a fixar a sua posição no topo da página.</p><p>Para mudar a cor de fundo da barra de navegação para uma cor clara, usa a classe <code>.bg-light</code>. Para uma cor de fundo escura, podes usar a classe <code>.bg-dark</code>. Se preferires a cor azul clara, tens disponível classe<code>.bg-primary</code>.</p><p>Eis como parte do teu CSS deverá estar:</p><pre><code class="language-css">.bg-dark{
background-color:#343a40!important
}
.bg-primary{
background-color:#007bff!important
}</code></pre><h3 id="header"><strong><strong>Header</strong></strong></h3><pre><code class="language-html">&lt;header class="header"&gt;
  
&lt;/header&gt;</code></pre><p>Vamos agora criar um layout para a nossa header.</p><p>Neste caso, queremos que a header ocupe a totalidade da altura da janela do dispositivo, portanto vamos usar um pouco de <code>JQuery</code>.</p><p>Primeiro, cria um ficheiro chamado <code><strong><strong>main.js</strong></strong></code> e inclui-o no teu ficheiro <code><strong><strong>index.html</strong></strong></code><strong><strong><em><em> </em></em></strong></strong>exactamente antes da tag de fechamento do <code>body</code>:</p><pre><code class="language-html">&lt;script type="text/javascript" src='js/main.js'&gt;&lt;/script&gt;</code></pre><p>No ficheiro <code>main.js</code>,<em><em> </em></em>coloca o seguinte código JQuery<em><em>:</em></em></p><pre><code class="language-js">$(document).ready(function(){
 $('.header').height($(window).height());
 
})</code></pre><p>A header ficaria bem melhor se adicionarmos uma imagem de fundo:</p><pre><code class="language-css">/*header style*/
.header{
 background-image: url('../images/headerback.jpg');
 background-attachment: fixed;
 background-size: cover;
 background-position: center;
}</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_LmLTI-enV2RSKjsO9hzPxQ.png" class="kg-image" alt="1_LmLTI-enV2RSKjsO9hzPxQ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/03/1_LmLTI-enV2RSKjsO9hzPxQ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_LmLTI-enV2RSKjsO9hzPxQ.png 800w" sizes="(min-width: 720px) 720px" width="800" height="395" loading="lazy"></figure><p>Agora vamos adicionar uma <em>div </em>com a class de <em>overlay</em>, para dar um toque mais profissional à header:</p><p>Adiciona isto ao teu ficheiro <code><strong><strong>index.html</strong></strong></code>:</p><pre><code class="language-html">&lt;header class="header"&gt;
  &lt;div class="overlay"&gt;&lt;/div&gt;
&lt;/header&gt;</code></pre><p>Depois, adiciona o seguinte ao teu ficheiro <code><strong><strong>main.css</strong></strong></code>:</p><pre><code class="language-css">.overlay{
 position: absolute;
 min-height: 100%;
 min-width: 100%;
 left: 0;
 top: 0;
 background: rgba(244, 244, 244, 0.79);
}</code></pre><p>De seguida, vamos adicionar uma descrição dentro da header.</p><p>Para tal, vamos criar uma <code>div</code> e atribuir-lhe uma classe de <code>.container</code>.</p><p><code>.container</code> é uma classe do Bootstrap que auxilia a "conter" todo o conteúdo e a fazer com que o layout se torne responsivo:</p><pre><code class="language-html">&lt;header class="header"&gt;
  &lt;div class="overlay"&gt;&lt;/div&gt;
   &lt;div class="container"&gt;
    
   &lt;/div&gt;
  
&lt;/header&gt;</code></pre><p>Cria agora outra <code>div</code> que conterá a descrição.</p><pre><code class="language-html">&lt;div class="description text-center"&gt;
   &lt;h1&gt;    Hello ,Welcome To My official Website
    &lt;p&gt;    cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non    proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
&lt;/p&gt;   
 &lt;button class="btn btn-outline-secondary btn-lg"&gt;See more&lt;/button&gt;   &lt;/h1&gt;  
&lt;/div&gt;</code></pre><p>Vamos atribuir-lhe a classe de <code>.description</code> e adicionar também a classe <code>.text-center</code> para garantir que o texto é centrado na página.</p><h4 id="bot-es"><strong>Botões</strong></h4><p>Cria o elemento <code>button</code> e atribui-lhe as classes <code>.btn btn-outline-secondary</code>. </p><p>Existem outras classes para estilizar os botões via Bootstrap.<br>Alguns exemplos disponíveis no link abaixo:</p><figure class="kg-card kg-embed-card"><iframe id="cp_embed_oEWgbw" src="https://codepen.io/Saidalmaghribi/embed/preview/oEWgbw?default-tabs=html%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=oEWgbw" title="buttons in bootstrap 4" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;" loading="lazy"></iframe></figure><p>No teu ficheiro CSS <code><strong><strong>main.css</strong></strong></code><strong>,</strong> a classe <code>.description</code> deve ter então os seguintes atributos:</p><pre><code class="language-css">.description{
    position: absolute;
    top: 30%;
    margin: auto;
    padding: 2em;
    
}
.description h1{
 color:#F97300 ;
}
.description p{
 color:#666;
 font-size: 20px;
 width: 50%;
 line-height: 1.5;
}
.description button{
 border:1px  solid #F97300;
 background:#F97300;
 color:#fff;
}</code></pre><p>A header deve estar assim agora:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_kV7umhOF5QPveMmADXUCSw.png" class="kg-image" alt="1_kV7umhOF5QPveMmADXUCSw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/03/1_kV7umhOF5QPveMmADXUCSw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_kV7umhOF5QPveMmADXUCSw.png 800w" sizes="(min-width: 720px) 720px" width="800" height="402" loading="lazy"></figure><p>Porreiro, não?! 🙂</p><h3 id="sec-o-sobre-mim"><strong>Secção Sobre mim</strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_VWnyo3Jg4brsW5YRZToCiQ.png" class="kg-image" alt="1_VWnyo3Jg4brsW5YRZToCiQ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/03/1_VWnyo3Jg4brsW5YRZToCiQ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_VWnyo3Jg4brsW5YRZToCiQ.png 800w" sizes="(min-width: 720px) 720px" width="800" height="354" loading="lazy"></figure><p>Vamos dividir esta secção em duas partes usando Bootstrap Grid.</p><p>Para inicializar a nossa Grid, vamos atribuir a classe <code>.row</code><strong><strong> </strong></strong>à nossa <code>div</code> mãe.</p><pre><code class="language-html">&lt;div class="row"&gt;&lt;/div&gt;</code></pre><p>Metade da secção ficará posicionada à esquerda e conterá uma imagem, sendo que a outra metade ficará posicionada à direita e conterá uma descrição.</p><p>Atribuiremos a cada metade da nossa secção uma <code>div</code> e cada uma ocupará um total de 6 colunas — o que significa, metade da secção. Lembra-te que a Grid é composta por 12 colunas.</p><p>Na <code>div</code> que ocupará o lado esquerdo da secção:</p><pre><code class="language-html">&lt;div class="row"&gt; 
 // lado esquerdo
&lt;div class="col-lg-4 col-md-4 col-sm-12"&gt;
    &lt;img src="images/team-3.jpg" class="img-fluid"&gt;
    &lt;span class="text-justify"&gt;S.Web Developer&lt;/span&gt;
 &lt;/div&gt;
 
&lt;/div&gt;</code></pre><p>De seguida, vamos adicionar os elementos HTML para a nossa outra metade (lado direito da secção) e a estrutura do nosso código deverá assemelhar-se a isto:</p><pre><code class="language-html">&lt;div class="row"&gt;
   &lt;div class="col-lg-4 col-md-4 col-sm-12"&gt;
    &lt;img src="images/team-3.jpg" class="img-fluid"&gt;
    &lt;span class="text-justify"&gt;S.Web Developer&lt;/span&gt;
   &lt;/div&gt;
   &lt;div class="col-lg-8 col-md-8 col-sm-12 desc"&gt;
     
    &lt;h3&gt;D.John&lt;/h3&gt;
    &lt;p&gt;
       ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
     tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
     quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
     consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
     cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
     proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    &lt;/p&gt;
   &lt;/div&gt;
  &lt;/div&gt;</code></pre><p>Agora, vamos estilizar as classes usadas acima:</p><pre><code class="language-css">.about{
 margin: 4em 0;
 padding: 1em;
 position: relative;
}
.about h1{
 color:#F97300;
 margin: 2em;
}
.about img{
 height: 100%;
    width: 100%;
    border-radius: 50%
}
.about span{
 display: block;
 color: #888;
 position: absolute;
 left: 115px;
}
.about .desc{
 padding: 2em;
 border-left:4px solid #10828C;
}
.about .desc h3{
 color: #10828C;
}
.about .desc p{
 line-height:2;
 color:#888;
}</code></pre><h3 id="sec-o-portfolio"><strong>Secção Portfolio</strong></h3><p>Nesta secção, vamos criar um Portfolio, que conterá uma galeria.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_fNaqxcagCvh8Ue3lZvK6Vw.png" class="kg-image" alt="1_fNaqxcagCvh8Ue3lZvK6Vw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/03/1_fNaqxcagCvh8Ue3lZvK6Vw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_fNaqxcagCvh8Ue3lZvK6Vw.png 800w" sizes="(min-width: 720px) 720px" width="800" height="365" loading="lazy"></figure><p>Abaixo, podes ver como a estrutura do nosso código HTML ficará:</p><pre><code class="language-html">&lt;!-- portfolio --&gt;
&lt;div class="portfolio"&gt;
     &lt;h1 class="text-center"&gt;Portfolio&lt;/h1&gt;
 &lt;div class="container"&gt;
  &lt;div class="row"&gt;
   &lt;div class="col-lg-4 col-md-4 col-sm-12"&gt;
    &lt;img src="images/portfolio/port13.png" class="img-fluid"&gt;
   &lt;/div&gt;
   &lt;div class="col-lg-4 col-md-4 col-sm-12"&gt;
    &lt;img src="images/portfolio/port1.png" class="img-fluid"&gt;
   &lt;/div&gt;
   &lt;div class="col-lg-4 col-md-4 col-sm-12"&gt;
    &lt;img src="images/portfolio/port6.png" class="img-fluid"&gt;
   &lt;/div&gt;
      
&lt;div class="col-lg-4 col-md-4 col-sm-12"&gt;
    &lt;img src="images/portfolio/port3.png" class="img-fluid"&gt;
   &lt;/div&gt;
   &lt;div class="col-lg-4 col-md-4 col-sm-12"&gt;
    &lt;img src="images/portfolio/port11.png" class="img-fluid"&gt;
   &lt;/div&gt;
   &lt;div class="col-lg-4 col-md-4 col-sm-12"&gt;
    &lt;img src="images/portfolio/electric.png" class="img-fluid"&gt;
   &lt;/div&gt;
      
&lt;div class="col-lg-4 col-md-4 col-sm-12"&gt;
    &lt;img src="images/portfolio/Classic.jpg" class="img-fluid"&gt;
   &lt;/div&gt;
   &lt;div class="col-lg-4 col-md-4 col-sm-12"&gt;
    &lt;img src="images/portfolio/port1.png" class="img-fluid"&gt;
   &lt;/div&gt;
   &lt;div class="col-lg-4 col-md-4 col-sm-12"&gt;
    &lt;img src="images/portfolio/port8.png" class="img-fluid"&gt;
   &lt;/div&gt;
  &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;</code></pre><p>É importante adicionar a classe <code>.img-fluid</code> a cada imagem, de modo a torná-las responsivas.</p><p>Cada item da nossa galeria ocupará 4 colunas (lembra-te, <code>col-md-4</code> para dispositivos médios, <code>col-lg-4</code> para dispositivos grandes), o que equivale a 33.33333%<strong><strong> </strong></strong>em dispositivos com ecrãs grandes, tais como computadores e 12 colunas em dispositivos pequenos (como iPhone e outros dispositivos móveis) o que fará com que as colunas ocupem 100% do contêiner.</p><p>De seguida, vamos estilizar a nossa galeria:</p><pre><code class="language-css">/*Portfolio*/
.portfolio{
 margin: 4em 0;
    position: relative; 
}
.portfolio h1{
 color:#F97300;
 margin: 2em; 
}
.portfolio img{
  height: 15rem;
  width: 100%;
  margin: 1em;
  
}</code></pre><h3 id="sec-o-blog"><strong>Secção Blog</strong></h3><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*3y9bIjRwf2RtGRzMIXwZIQ.png" class="kg-image" alt="1*3y9bIjRwf2RtGRzMIXwZIQ" width="800" height="357" loading="lazy"></figure><h4 id="cart-es-cards-"><strong>Cartões (cards)</strong></h4><p>Cartões (ou cards) no Bootstrap 4 são a classe mais adequada para artigos e posts e fazem com que seja fácil criar um design de um blog.</p><p>Para criá-los, vamos adicionar a classe <code>.card</code><strong><strong> </strong></strong>a uma <em><em>div</em>.</em></p><p>A classe card contém várias funcionalidades:</p><ul><li><code>.card-header</code>: define a header do cartão</li><li><code>.card-body</code>:<strong><strong> </strong></strong>define o corpo do cartão</li><li><code>.card-title</code>: define o título do cartão</li><li><code>.card-footer</code>:<strong><strong> </strong></strong>define o footer do cartão.</li><li><code>.card-image</code>: usada para imagens dentro do cartão</li></ul><p>A estrutura do nosso HTML para esta secção deverá ficar assim:</p><pre><code class="language-html">&lt;!-- Posts section --&gt;
&lt;div class="blog"&gt;
 &lt;div class="container"&gt;
 &lt;h1 class="text-center"&gt;Blog&lt;/h1&gt;
  &lt;div class="row"&gt;
   &lt;div class="col-md-4 col-lg-4 col-sm-12"&gt;
    &lt;div class="card"&gt;
     &lt;div class="card-img"&gt;
      &lt;img src="images/posts/polit.jpg" class="img-fluid"&gt;
     &lt;/div&gt;
     
     &lt;div class="card-body"&gt;
     &lt;h4 class="card-title"&gt;Post Title&lt;/h4&gt;
      &lt;p class="card-text"&gt;
       
       proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
      &lt;/p&gt;
     &lt;/div&gt;
     &lt;div class="card-footer"&gt;
      &lt;a href="" class="card-link"&gt;Read more&lt;/a&gt;
     &lt;/div&gt;
    &lt;/div&gt;
   &lt;/div&gt;
   &lt;div class="col-md-4 col-lg-4 col-sm-12"&gt;
    &lt;div class="card"&gt;
     &lt;div class="card-img"&gt;
      &lt;img src="images/posts/images.jpg" class="img-fluid"&gt;
     &lt;/div&gt;
     
     &lt;div class="card-body"&gt;
        &lt;h4 class="card-title"&gt;Post Title&lt;/h4&gt;
      &lt;p class="card-text"&gt;
       
       proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
      &lt;/p&gt;
     &lt;/div&gt;
     &lt;div class="card-footer"&gt;
      &lt;a href="" class="card-link"&gt;Read more&lt;/a&gt;
     &lt;/div&gt;
    &lt;/div&gt;
   &lt;/div&gt;
   &lt;div class="col-md-4 col-lg-4 col-sm-12"&gt;
    &lt;div class="card"&gt;
     &lt;div class="card-img"&gt;
      &lt;img src="images/posts/imag2.jpg" class="img-fluid"&gt;
     &lt;/div&gt;
     
     &lt;div class="card-body"&gt;
     &lt;h4 class="card-title"&gt;Post Title&lt;/h4&gt;
      &lt;p class="card-text"&gt;
       
       proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
      &lt;/p&gt;
     &lt;/div&gt;
     &lt;div class="card-footer"&gt;
      &lt;a href="" class="card-link"&gt;Read more&lt;/a&gt;
     &lt;/div&gt;
    &lt;/div&gt;
   &lt;/div&gt;
  &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;</code></pre><p>Precisamos agora de estilizar os nossos cartões:</p><pre><code class="language-css">.blog{
 margin: 4em 0;
 position: relative; 
}
.blog h1{
 color:#F97300;
 margin: 2em; 
}
.blog .card{
 box-shadow: 0 0 20px #ccc;
}
.blog .card img{
 width: 100%;
 height: 12em;
}
.blog .card-title{
 color:#F97300;
  
}
.blog .card-body{
 padding: 1em;
}</code></pre><p>Após completarmos a secção Blog do nosso website, o design deverá estar conforme a imagem abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_mHMPSea2jWdZ2dc_b658eA.png" class="kg-image" alt="1_mHMPSea2jWdZ2dc_b658eA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/03/1_mHMPSea2jWdZ2dc_b658eA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_mHMPSea2jWdZ2dc_b658eA.png 800w" sizes="(min-width: 720px) 720px" width="800" height="1799" loading="lazy"></figure><p>Fixe, certo?</p><h3 id="sec-o-a-equipa"><strong>Secção A equipa</strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_1PaKtdHChKl534aExUfjCQ.png" class="kg-image" alt="1_1PaKtdHChKl534aExUfjCQ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/03/1_1PaKtdHChKl534aExUfjCQ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_1PaKtdHChKl534aExUfjCQ.png 800w" sizes="(min-width: 720px) 720px" width="800" height="322" loading="lazy"></figure><p>Nesta secção, vamos utilizar o sistema Grid para distribuir as imagens pelo espaço disponível, de modo igual. Cada imagem ocupará 3 colunas (<code><strong><strong>.col-md-3</strong></strong></code>), o que equivale a 25% do espaço total.</p><p>O nosso HTML:</p><pre><code class="language-html">&lt;!-- Team section --&gt;
&lt;div class="team"&gt;
 &lt;div class="container"&gt;
    &lt;h1 class="text-center"&gt;Our Team&lt;/h1&gt;
  &lt;div class="row"&gt;
   &lt;div class="col-lg-3 col-md-3 col-sm-12 item"&gt;
    &lt;img src="images/team-2.jpg" class="img-fluid" alt="team"&gt;
    &lt;div class="des"&gt;
      Sara
     &lt;/div&gt;
    &lt;span class="text-muted"&gt;Manager&lt;/span&gt;
   &lt;/div&gt;
   &lt;div class="col-lg-3 col-md-3 col-sm-12 item"&gt;
    &lt;img src="images/team-3.jpg" class="img-fluid" alt="team"&gt;
    &lt;div class="des"&gt;
       Chris
     &lt;/div&gt;
    &lt;span class="text-muted"&gt;S.enginner&lt;/span&gt;
   &lt;/div&gt;
   &lt;div class="col-lg-3 col-md-3 col-sm-12 item"&gt;
    &lt;img src="images/team-2.jpg" class="img-fluid" alt="team"&gt;
    &lt;div class="des"&gt;
      Layla 
     &lt;/div&gt;
    &lt;span class="text-muted"&gt;Front End Developer&lt;/span&gt;
   &lt;/div&gt;
   &lt;div class="col-lg-3 col-md-3 col-sm-12 item"&gt;
    &lt;img src="images/team-3.jpg" class="img-fluid" alt="team"&gt;
     &lt;div class="des"&gt;
      J.Jirard
     &lt;/div&gt;
    &lt;span class="text-muted"&gt;Team Manger&lt;/span&gt;
   &lt;/div&gt;
  &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;</code></pre><p>Vamos complementar o nosso CSS:</p><pre><code class="language-css">.team{
 margin: 4em 0;
 position: relative;  
}
.team h1{
 color:#F97300;
 margin: 2em; 
}
.team .item{
 position: relative;
}
.team .des{
 background: #F97300;
 color: #fff;
 text-align: center;
 border-bottom-left-radius: 93%;
 transition:.3s ease-in-out;
 
}</code></pre><p>Um toque extra que podemos adicionar, um efeito <em>overlay </em>nas imagens sempre que o cursor do rato passar por cima da imagem (on-hover).</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_SxGguj9S8JMncs-D3uNcsA.gif" class="kg-image" alt="1_SxGguj9S8JMncs-D3uNcsA" width="531" height="252" loading="lazy"></figure><p>Para criar este efeito, adiciona o seguinte ao teu ficheiro <code><strong><strong>main.css</strong></strong></code>:</p><pre><code class="language-css">.team .item:hover .des{
 height: 100%;
 background:#f973007d;
 position: absolute;
 width: 89%;
 padding: 5em;
 top: 0;
 border-bottom-left-radius: 0;
}</code></pre><p>Brutal!</p><h3 id="formul-rio-de-contacto"><strong>Formulário de contacto</strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_vaI3jh3TFwSKBn6BcsBedw.png" class="kg-image" alt="1_vaI3jh3TFwSKBn6BcsBedw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/03/1_vaI3jh3TFwSKBn6BcsBedw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_vaI3jh3TFwSKBn6BcsBedw.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>O formulário de Contacto será a última secção que adicionaremos.</p><p>Esta secção conterá um um formulário através do qual os visitantes do site poderão enviar uma mensagens de feedback. Com algumas classes do Bootstrap, tornaremos o design mais apelativo e responsivo.</p><p>Tal como no Bootstrap 3, o Bootstrap 4 também permite usar a classe <code>.form-control</code> para os campos de preenchimento. No entanto, existem novas funcionalidades que foram implementadas nessa versão – como a mudança da classe <code>.input-group-addon</code><strong><strong> </strong></strong>(descontinuada) para a nova classe <code><strong><strong>.input-group-prepend</strong></strong></code><strong><strong> </strong></strong>(que permite usar ícones como labels).</p><p>Acede a este link do <a href="https://getbootstrap.com/docs/4.0/migration/#input-groups" rel="noopener">Bootstrap 4</a> para mais informação (em inglês). No nosso formulário, vamos "conter" cada campo de preenchimento com uma <code>div</code> que terá a classe<strong><strong> </strong></strong><code>.form-group</code>.</p><p>O ficheiro<code><strong><strong>index.html</strong></strong></code> deverá ter o seguinte HTML para o formulário:</p><pre><code class="language-html">&lt;!-- Contact form --&gt;
&lt;div class="contact-form"&gt;
 &lt;div class="container"&gt;
  &lt;form&gt;
   &lt;div class="row"&gt;
    &lt;div class="col-lg-4 col-md-4 col-sm-12"&gt;
      &lt;h1&gt;Get in Touch&lt;/h1&gt; 
    &lt;/div&gt;
    &lt;div class="col-lg-8 col-md-8 col-sm-12 right"&gt;
       &lt;div class="form-group"&gt;
         &lt;input type="text" class="form-control form-control-lg" placeholder="Your Name" name=""&gt;
       &lt;/div&gt;
       &lt;div class="form-group"&gt;
         &lt;input type="email" class="form-control form-control-lg" placeholder="YourEmail@email.com" name="email"&gt;
       &lt;/div&gt;
       &lt;div class="form-group"&gt;
         &lt;textarea class="form-control form-control-lg"&gt;
          
         &lt;/textarea&gt;
       &lt;/div&gt;
       &lt;input type="submit" class="btn btn-secondary btn-block" value="Send" name=""&gt;
    &lt;/div&gt;
   &lt;/div&gt;
  &lt;/form&gt;
 &lt;/div&gt;
&lt;/div&gt;</code></pre><p>Agora, vamos aos estilos:</p><p><strong><strong>main.css</strong></strong></p><pre><code class="language-css">.contact-form{
 margin: 6em 0;
 position: relative;  
}

.contact-form h1{
 padding:2em 1px;
 color: #F97300; 
}
.contact-form .right{
 max-width: 600px;
}
.contact-form .right .btn-secondary{
 background:  #F97300;
 color: #fff;
 border:0;
}
.contact-form .right .form-control::placeholder{
 color: #888;
 font-size: 16px;
}</code></pre><h4 id="fonts"><strong><strong>Fonts</strong></strong></h4><p>Para este projecto, usaremos a font <strong>Raleway</strong>, disponível através da Google Font Api.</p><p>Para isso, basta adicionarmos o seguinte link ao nosso ficheiro <code><strong><strong>main.css</strong></strong></code>:</p><pre><code class="language-css">@import url('https://fonts.googleapis.com/css?family=Raleway');</code></pre><p>Vamos aplicar a nossa font usando o seguinte estilo global, que aplicará a font ao HTML e às tags de título:</p><pre><code class="language-css">html,h1,h2,h3,h4,h5,h6,a{
 font-family: "Raleway";
}</code></pre><h4 id="efeito-scroll"><strong>Efeito scroll</strong></h4><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/1_a9OoxPsn-hrbjYpbNV6DzA-1.gif" class="kg-image" alt="1_a9OoxPsn-hrbjYpbNV6DzA-1" width="600" height="400" loading="lazy"></figure><p>O último detalhe a acrescentar é o efeito de <em>scrolling</em>. Para tal, neste caso, vamos usar o JQuery. Não te preocupes se não estás familiarizado com o JQuery. Basta adicionares o seguinte código ao teu ficheiro<em><em> </em></em><code><strong><strong>main.js</strong></strong></code>:</p><pre><code class="language-js">$(".navbar a").click(function(){
  $("body,html").animate({
   scrollTop:$("#" + $(this).data('value')).offset().top
  },1000)
  
 })</code></pre><p>Acrescenta, então, um atributo <code>data-value</code> a cada link da barra de navegação:</p><pre><code class="language-html">&lt;li class="nav-item"&gt;
         &lt;a class="nav-link" data-value="about" href="#"&gt;About&lt;/a&gt;
       &lt;/li&gt;
       &lt;li class="nav-item"&gt;
         &lt;a class="nav-link " data-value="portfolio" href="#"&gt;Portfolio&lt;/a&gt;
       &lt;/li&gt;
       &lt;li class="nav-item"&gt;
         &lt;a class="nav-link " data-value="blog" href="#"&gt;Blog&lt;/a&gt;
       &lt;/li&gt;
       &lt;li class="nav-item"&gt;
         &lt;a class="nav-link " data-value="team" href="#"&gt;
         Team&lt;/a&gt;
       &lt;/li&gt;
       &lt;li class="nav-item"&gt;
         &lt;a class="nav-link " data-value="contact" href="#"&gt;Contact&lt;/a&gt;
       &lt;/li&gt;</code></pre><p>De seguida, atribui a cada secção um atributo de id.</p><p><strong><strong>Not</strong>a</strong>: o atributo <code>id</code> terá de ser idêntico a cada atributo de <code>data-value</code> da barra de navegação:</p><pre><code class="language-html">&lt;div class="about" id="about"&gt;&lt;/div&gt;</code></pre><h3 id="-ltimos-retoques-e-conclus-o"><strong>Últimos retoques e conclusão</strong></h3><p>O Bootstrap 4 é uma excelente opção para construir aplicações web. Oferece excelente qualidade nos seus elementos de interface de usuário e é fácil de personalizar, integrar e usar. Ele também facilitará a inclusão de responsividade e, deste modo, melhorará a experiência de usuário dos visitantes do site.</p><p>Os ficheiros usados para este projecto podem ser encontrados neste repositório <a href="https://github.com/hayanisaid/bootstrap4-website" rel="noopener">GitHub</a>.</p><blockquote>Se necessitarem de temas ou templates para Bootstrap, vejam este link, <a href="https://bootstrapbay.sjv.io/DV1q2" rel="noopener">BootstrapBay</a>, pois eles têm excelentes produtos</blockquote><p>Confira o meu curso para aprender mais sobre Bootstrap 4:</p><p><a href="https://skl.sh/2LaD1ym" rel="noopener"><strong><strong>Bootstrap 4 crash course: basic to advance | Said Hayani | Skillshare</strong></strong></a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como passar na entrevista de programação – Dicas que me ajudaram a obter ofertas de emprego no Google, Airbnb e na Dropbox ]]>
                </title>
                <description>
                    <![CDATA[ Em 2017, passei por algumas entrevistas de programação e recebi ofertas de várias grandes empresas de tecnologia. Foi naquele momento que decidi compartilhar o que tinha aprendido neste artigo. Acabo de atualizá-lo para este ano para que seja superútil e relevante se você estiver procurando emprego agora. Apesar de ter ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-passar-na-entrevista-de-programacao-dicas-que-me-ajudaram-a-obter-ofertas-de-emprego-no-google-airbnb-e-na-dropbox/</link>
                <guid isPermaLink="false">63870e25d7295905e93497cf</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento para a Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Elizabete Nakamura ]]>
                </dc:creator>
                <pubDate>Wed, 11 Jan 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/01/1_Qf9fEs5XdOEQiWX3R6R6ww.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/coding-interviews-for-dummies-5e048933b82b/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Rock the Coding Interview – Tips That Helped Me Land Job Offers from Google, Airbnb, and Dropbox</a>
      </p><p>Em 2017, passei por algumas entrevistas de programação e recebi ofertas de várias grandes empresas de tecnologia. Foi naquele momento que decidi compartilhar o que tinha aprendido neste artigo.</p><p>Acabo de atualizá-lo para este ano para que seja superútil e relevante se você estiver procurando emprego agora.</p><p>Apesar de ter notas decentes tanto na minha disciplina básica de algoritmos, quanto na minha disciplina de estruturas de dados no curso de Ciência da Computação na universidade, estremeço ao pensar em passar por uma entrevista de programação que se concentre em algoritmos.</p><p>Assim, passei os últimos três meses descobrindo como melhorar minhas habilidades em programação para entrevistas e, no fim, recebi ofertas de grandes empresas de tecnologia, como <strong>Google</strong>, <strong>Facebook</strong>, <strong>Airbnb</strong>, <strong>Lyft</strong>, <strong>Dropbox</strong> e muitas outras.</p><p>Neste artigo, compartilharei as ideias e dicas que recebi ao longo do caminho. Candidatos experientes também podem esperar perguntas sobre design de sistemas, mas isso está fora do escopo deste artigo.</p><p>Muitos dos conceitos algorítmicos testados em entrevistas de programação não são aquilo que costumo usar no trabalho, onde sou um engenheiro de <em>front-end</em> (web). Naturalmente, me esqueci um pouco desses algoritmos e estruturas de dados, que aprendi principalmente durante o primeiro e o segundo anos da minha faculdade.</p><p>É estressante ter que produzir código (funcional) em uma entrevista enquanto alguém examina cada toque no teclado que você faz. O pior é que, como entrevistado, você é encorajado a comunicar seu processo de pensamento em voz alta ao entrevistador.</p><p>Eu costumava pensar que ser capaz de pensar, programar e comunicar simultaneamente era um feito impossível, até que percebi que a maioria das pessoas simplesmente não é boa em entrevistas de programação quando começam. Ser entrevistado é uma habilidade em que se pode melhorar estudando, preparando-se e praticando para isso.</p><p>Minha busca de emprego recente me levou a uma jornada para melhorar minhas habilidades para as entrevistas de programação. Os engenheiros de <em>front-end</em> gostam de se queixar de como o atual processo de contratação é ruim, pois as entrevistas técnicas podem incluir habilidades não relacionadas ao desenvolvimento de <em>front-end</em>. Por exemplo, escrever um algoritmo de resolução de labirintos e mesclar duas listas ordenadas de números. Como engenheiro de <em>front-end</em>, eu entendo bem o motivo da reclamação.</p><p>O <em>front-end</em> é um domínio especializado, onde os engenheiros têm que se preocupar com muitas questões relacionadas às compatibilidades do navegador, o Modelo de Objeto do Documento (DOM - Document Object Model), desempenho do JavaScript, layouts do CSS e assim por diante. É incomum para os engenheiros de <em>front-end </em>implementar alguns dos complexos algoritmos testados em entrevistas.</p><blockquote><strong>Em empresas como Facebook e Google, as pessoas são engenheiras de software em primeiro lugar, especialistas de domínio em segundo.</strong></blockquote><p>Infelizmente, as regras são estabelecidas pelas empresas, não pelos candidatos. Há uma grande ênfase nos conceitos gerais da informática, como algoritmos, padrões de design e estruturas de dados – habilidades essenciais que um bom engenheiro de software deve possuir. Se você quer o trabalho, você tem que jogar de acordo com as regras estabelecidas pelos mestres do jogo – e melhorar suas habilidades para as entrevistas de programação!</p><p>Este artigo está estruturado nas duas seções seguintes. Sinta-se à vontade para pular para a seção que interessa a você.</p><ul><li>O formato das entrevistas de programação e como se preparar para elas.</li><li>Dicas úteis para cada tópico de algoritmos (arrays, árvores, programação dinâmica etc.), juntamente com perguntas práticas recomendadas pelo LeetCode para rever os conceitos centrais e melhorar nesses tópicos.</li></ul><p>O conteúdo deste artigo <a href="https://www.techinterviewhandbook.org/">pode ser encontrado aqui</a> (em inglês). Lá, farei atualizações quando necessário.</p><p>Se você está interessado no conteúdo de <em>front-end</em>, confira meu manual de entrevistas para <em>front-end</em> <a href="https://www.frontendinterviewhandbook.com/">aqui</a> (em inglês).</p><h2 id="escolhendo-uma-linguagem-de-programa-o"><strong>Escolhendo uma linguagem de programação</strong></h2><p>Antes de mais nada, você precisa escolher uma linguagem de programação para sua entrevista de programação algorítmica.</p><p>A maioria das empresas permitirá que você programe na linguagem de sua escolha. A única exceção que eu conheço é o Google. Lá, é permitido que seus candidatos escolham apenas entre Java, C++, Python, Go ou JavaScript.</p><p>Na maioria das vezes, recomendo o uso de uma linguagem com a qual você esteja extremamente familiarizado, em vez de uma linguagem que é nova para você, mas que a empresa utiliza amplamente.</p><p>Há algumas linguagens que são mais adequadas do que outras para as entrevistas de programação. Também há algumas outras que você vai querer evitar, com certeza.</p><p>A partir da minha experiência como entrevistador, a maioria dos candidatos escolhe Python ou Java. Outras linguagens comumente selecionadas incluem JavaScript, Ruby e C++. Eu evitaria absolutamente linguagens de mais baixo nível, como o C ou o Go, simplesmente porque elas não possuem funções de biblioteca padrão e estruturas de dados.</p><p>Pessoalmente, o Python é normalmente a minha escolha para os algoritmos de programação durante as entrevistas. Ele é sucinto e tem uma enorme biblioteca de funções e estruturas de dados.</p><p>Uma das principais razões que me faz recomendar o Python é o fato de ele usar APIs consistentes, que operam em diferentes estruturas de dados, tais como <code>len()</code>, <code>for ... in ...</code> e notação de corte (do inglês, <em>slicing</em>) em sequências (strings, listas e tuplas). Obter o último elemento em uma sequência é <code>arr[-1]</code> e revertê-lo é simplesmente <code>arr[::-1]</code>. Você pode conseguir muito com pouca sintaxe em Python.</p><p>O Java também é uma escolha decente. Como, no entanto, você terá que declarar constantemente os tipos em seu código, isso significa digitar mais. Isso diminuirá a velocidade na qual você programa e digita. Essa questão fica mais aparente quando você tiver que escrever em um quadro branco durante entrevistas no local.</p><p>As razões para escolher ou não escolher C++ são similares às de Java. No fim, Python, Java, e C++ são escolhas decentes. Se você está usando Java há algum tempo e não tem tempo para se familiarizar com outra linguagem, recomendo que se mantenha fiel ao Java em vez de pegar o Python do zero. Isto o ajudará a evitar de ter que usar uma linguagem para o trabalho e outra para entrevistas. A maior parte do tempo, o que trava é o pensamento, não a escrita.</p><p>Uma exceção à convenção de permitir que o candidato "escolha a linguagem de programação que quiser" é quando a entrevista é para um cargo específico de domínio, como funções de engenheiro de <em>front-end</em>, iOS ou Android. Você precisa estar familiarizado com algoritmos de programação em JavaScript, Objective-C, Swift e Java, respectivamente.</p><p>Se você precisar usar uma estrutura de dados que a linguagem não suporte, como uma fila ou pilha em JavaScript, pergunte ao entrevistador se você pode assumir que tem uma estrutura de dados que implementa certos métodos com complexidades de tempo especificadas. Se a implementação dessa estrutura de dados não for crucial para a solução do problema, o entrevistador normalmente a permitirá.</p><p>Na realidade, estar ciente das estruturas de dados existentes e selecionar as estruturas apropriadas para resolver o problema em questão é mais importante do que conhecer os intrincados detalhes de implementação.</p><h2 id="revise-sua-ci-ncia-da-computa-o-b-sica">Revise sua Ciência da Computação básica</h2><p>Se você estiver fora da faculdade há algum tempo, é altamente aconselhável rever os fundamentos de computação. Eu prefiro revisar enquanto pratico. Eu revejo minhas anotações da faculdade e reviso os vários algoritmos enquanto trabalho nos problemas de algoritmos do LeetCode e do Cracking the Coding Interview.</p><p>Se você estiver interessado em como as estruturas de dados são implementadas, confira <a href="https://github.com/yangshun/lago">Lago</a>, um repositório do GitHub contendo estruturas de dados e exemplos de Algoritmos em JavaScript.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/01/lago.png" class="kg-image" alt="lago" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/01/lago.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/01/lago.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/01/lago.png 1200w" sizes="(min-width: 720px) 720px" width="1200" height="600" loading="lazy"><figcaption><a href="https://github.com/yangshun/lago">GitHub - yangshun/lago: 📕 Biblioteca de Algoritmos e Estruturas de Dados em TypeScript</a></figcaption></figure><h2 id="dom-nio-atrav-s-da-pr-tica"><strong>Domínio através da prática</strong></h2><p>Em seguida, adquira familiaridade e domínio dos algoritmos e estruturas de dados em sua linguagem de programação escolhida.</p><p>Pratique e resolva questões de algoritmos na linguagem de sua escolha. Embora o Cracking the Coding Interview seja um bom recurso, prefiro resolver problemas digitando o código, deixando-o rodar e obtendo feedback instantâneo.</p><p>Há vários juízes on-line, tais como o <a href="https://leetcode.com/">LeetCode</a>, o <a href="https://www.hackerrank.com/">HackerRank</a> e o <a href="http://codeforces.com/">CodeForces</a> para você praticar perguntas on-line e se acostumar a linguagem. Pela minha experiência, as perguntas do LeetCode são mais parecidas com as perguntas feitas em entrevistas. As perguntas do HackerRank e do CodeForces são mais parecidas com as perguntas da programação competitiva.</p><p>Se você praticar perguntas suficientes do LeetCode, há uma boa chance de que você veja ou complete uma das suas perguntas reais de entrevista (ou alguma variante dela).</p><p>Aprenda e compreenda as complexidades de tempo e de espaço das operações comuns na sua linguagem escolhida. Para Python, esta <a href="https://wiki.python.org/moin/TimeComplexity">página</a> virá a calhar. Aprenda também sobre o algoritmo de ordenação subjacente a ser usado na função <code>sort()</code> da linguagem e as suas complexidades de tempo e de espaço (em Python é o <a href="https://pt.wikipedia.org/wiki/Timsort">TimSort</a>, que é um híbrido).</p><p>Depois de completar uma pergunta do LeetCode, normalmente acrescento as complexidades de tempo e espaço do código escrito como comentários acima do corpo da função. Utilizo os comentários para me lembrar de comunicar a análise do algoritmo após ter completado a implementação.</p><p>Leia sobre o estilo de programação recomendado para a sua linguagem e mantenha-se fiel a ele. Se escolher Python, consulte o <a href="https://pep8.org/">Guia de Estilo PEP 8</a> (em inglês). Se escolher Java, consulte o <a href="https://google.github.io/styleguide/javaguide.html">Guia de Estilo de Java do Google</a> (em inglês).</p><p>Aprenda e esteja familiarizado com as armadilhas e problemas comuns da linguagem. Se os apontar durante a entrevista e se evitar cair neles, ganhará pontos a mais e impressionará o entrevistador, independentemente de o entrevistador estar familiarizado com a linguagem ou não.</p><p>Obtenha uma ampla exposição a questões de vários tópicos. Na segunda metade do artigo, menciono tópicos de algoritmos e as questões úteis para a prática de cada tópico. Faça cerca de 100 a 200 perguntas do LeetCode e você deverá se sair bem.</p><p>Se preferir cursos onde a aprendizagem seja mais estruturada, aqui ficam algumas recomendações. <strong>De modo algum é obrigatório fazer cursos on-line para passar em entrevistas.</strong></p><ul><li>O <a href="https://algo.monster/">AlgoMonster</a> visa ajudá-lo a passar na entrevista técnica no <strong>mais curto espaço de tempo possível</strong>. Criado por engenheiros do Google, o AlgoMonster utiliza uma abordagem baseada em dados para ensinar os padrões de perguntas-chave mais úteis e tem conteúdos para ajudar a rever rapidamente algoritmos e estruturas de dados básicos. O melhor de tudo é que o AlgoMonster não é baseado em assinaturas – pague uma taxa única e obtenha <strong>acesso vitalício</strong>.</li><li><a href="https://www.educative.io/courses/grokking-the-coding-interview">Grokking the Coding Interview: Patterns for Coding Questions</a>, da Educative, expande as questões práticas recomendadas neste artigo, mas aborda a prática a partir de uma perspectiva de padrão de perguntas, que é uma abordagem com a qual também concordo para a aprendizagem e com a qual me habituei pessoalmente a melhorar na programação de entrevistas. O curso permite praticar perguntas selecionadas em Java, Python, C++, JavaScript e também fornece exemplos de soluções nessas linguagens. Aprenda e compreenda os padrões em vez de memorizar as respostas.</li></ul><p>Logicamente, pratique, pratique e pratique um pouco mais!</p><h2 id="fases-de-uma-entrevista-de-programa-o"><strong>Fases de uma entrevista de </strong>program<strong>ação</strong></h2><p>Parabéns! Você está pronto para pôr as suas capacidades em prática! Em uma entrevista de programação, será feita uma pergunta técnica pelo entrevistador. Você escreverá o código em tempo real, em um editor colaborativo (tela do telefone) ou em um quadro branco (no local) e terá 30 a 45 minutos para resolver o problema. É aqui que a verdadeira diversão começa!</p><p>O seu entrevistador procurará ver se você preenche os requisitos para o cargo. Cabe a você mostrar para ele que possui as competências necessárias. Inicialmente, pode parecer estranho falar enquanto programa, já que a maioria dos programadores não tem o hábito de explicar em voz alta os seus pensamentos enquanto escrevem o código.</p><p>No entanto, é difícil para o entrevistador saber o que você está pensando simplesmente olhando para o seu código. Se comunicar a sua abordagem ao entrevistador mesmo antes de começar a programar, pode validar a sua abordagem com eles. Dessa forma, os dois podem chegar a acordo sobre uma abordagem aceitável.</p><h2 id="prepara-o-para-uma-entrevista-remota"><strong>Preparação para uma entrevista remota</strong></h2><p>Para telas de telefones e entrevistas remotas, tenha à disposição um papel e uma caneta ou lápis para fazer anotações ou diagramas. Se for feita uma pergunta sobre árvores e gráficos, geralmente ajuda desenhar exemplos da estrutura de dados.</p><p>Use fones de ouvido. Certifique-se de que se encontra em um ambiente calmo. Não queira segurar o telefone com uma mão e escrever com a outra. Tente evitar o uso de alto-falantes. Se o feedback for ruim, a comunicação fica mais difícil. Ter que repetir apenas resultará em perda de tempo valioso.</p><h2 id="o-que-fazer-quando-voc-receber-a-pergunta"><strong>O que fazer quando você receber a pergunta</strong></h2><p>Muitos candidatos começam a programar assim que ouvem a pergunta. Isso geralmente é um grande erro. Primeiro, reserve um momento e repita a pergunta para o entrevistador para ter certeza de que você entendeu a pergunta. Se você tiver entendido mal a pergunta, o entrevistador poderá esclarecê-la.</p><p>Sempre busque esclarecimento sobre a questão ao ouvi-la, mesmo que você ache que é clara. Você pode descobrir que escapou alguma coisa. Isso também permite ao entrevistador saber que você está atento aos detalhes.</p><p>Considere fazer as seguintes perguntas:</p><ul><li>Qual é o tamanho da entrada?</li><li>Qual é o tamanho do intervalo de valores?</li><li>Que tipo de valores existem? Existem números negativos? Pontos flutuantes? Haverá entradas vazias?</li><li>Há duplicatas dentro da entrada?</li><li>Quais são alguns casos extremos da entrada?</li><li>Como a entrada é armazenada? Se você receber um dicionário de palavras, é uma lista de strings ou um <em><a href="https://pt.wikipedia.org/wiki/Trie">trie</a></em>?</li></ul><p>Depois de ter esclarecido suficientemente o escopo e a intenção do problema, explique ao entrevistador sua abordagem de alto nível, mesmo que seja uma solução ingênua. Se você estiver preso, considere várias abordagens e explique em voz alta porque elas podem ou não funcionar. Às vezes, seu entrevistador pode deixar passar dicas que o levarão no caminho certo.</p><p>Comece com uma abordagem de força bruta. Comunique-a ao entrevistador. Explique as complexidades de tempo e espaço e esclareça o motivo de tentar a força bruta é ruim. É improvável que a abordagem de força bruta seja aquela que você utilizará em programação. Neste ponto, o entrevistador normalmente fará a temida pergunta "Podemos fazer melhor?". Isso significa que estão procurando por uma abordagem mais otimizada.</p><p>Essa é geralmente a parte mais difícil da entrevista. Em geral, procure por trabalhos repetidos e tente otimizá-los, potencialmente armazenando o resultado calculado em algum lugar. Consulte-o mais tarde, em vez de calculá-lo novamente. A seguir, forneço algumas dicas para abordar detalhadamente questões específicas do tópico.</p><p>Só comece a programar depois que você e seu entrevistador tiverem concordado em uma abordagem e que você tenha recebido um sinal positivo para seguir em frente.</p><h2 id="come-ando-a-programar"><strong>Começando a </strong>program<strong>ar</strong></h2><p>Use um bom estilo para escrever seu código. Ler código escrito por outros geralmente não é uma tarefa agradável. Ler código horrivelmente formatado escrito por outros é ainda pior. Seu objetivo é fazer seu entrevistador entender seu código para que possa avaliar rapidamente se seu código faz o que se supõe que faça e se resolve um determinado problema.</p><p>Use nomes de variáveis claros e evite nomes que sejam letras únicas, a menos que sejam para a iteração. Entretanto, se você estiver programando em um quadro branco, evite usar nomes extensos de variáveis. Isso reduz a quantidade de escrita que você terá que fazer.</p><p>Sempre explique ao entrevistador o que você está escrevendo ou digitando. Não se trata de ler, textualmente, para o entrevistador o código que você está produzindo. Fale sobre a seção do código que você está implementando atualmente em nível superior. Explique por que ele é escrito assim e o que está tentando alcançar.</p><p>Ao copiar e colar em código, considere se é necessário. Às vezes, é; às vezes, não é. Se você se encontrar copiando e colando um grande pedaço de código abrangendo várias linhas, provavelmente é um indicador de que você pode reestruturar o código, extraindo essas linhas em uma função. Se for apenas uma única linha que você copiou, geralmente está bem.</p><p>Entretanto, lembre-se de alterar as respectivas variáveis em sua linha de código copiada, onde for relevante. Erros de cópia e colagem são uma fonte comum de <em>bugs</em>, mesmo na programação do dia a dia!</p><h2 id="ap-s-a-programa-o"><strong>Após a </strong>program<strong>ação</strong></h2><p>Depois de terminar de programar, não anuncie imediatamente ao entrevistador que você está pronto. Na maioria dos casos, seu código geralmente não está perfeito. Ele pode conter <em>bugs </em>ou erros de sintaxe. O que você precisa fazer é revisar seu código.</p><p>Primeiro, olhe seu código do início ao fim. Olhe para ele como se fosse escrito por outra pessoa, como se você o estivesse vendo pela primeira vez e tentando detectar erros nele. Isso é exatamente o que seu entrevistador estará fazendo. Revise e corrija quaisquer problemas que você possa encontrar.</p><p>Em seguida, apresente pequenos casos de teste e execute o código passo a passo (não seu algoritmo) com essas amostras de entrada.</p><p>Os entrevistadores gostam quando você lê suas mentes. O que eles costumam fazer depois que você termina de programar é fazer você escrever testes. É uma grande vantagem se você escrever testes para seu código antes mesmo que eles o peçam para fazer isso. Você deve estar emulando um depurador ao passar por seu código. Anote ou diga a eles os valores de certas variáveis enquanto você percorre com o entrevistador as linhas de código.</p><p>Se houver grandes pedaços duplicados de código na sua solução, reestruture o código para mostrar ao entrevistador que você valoriza a programação de qualidade. Além disso, procure lugares onde você possa fazer uma <a href="https://pt.wikipedia.org/wiki/Avalia%C3%A7%C3%A3o_de_curto-circuito">avaliação de curto-circuito</a>.</p><p>Por fim, forneça as complexidades de tempo e espaço de seu código e explique por que ele é assim. Você pode fazer anotações em partes do seu código com suas várias complexidades de tempo e espaço para demonstrar sua compreensão do código. Você pode até mesmo fornecer as APIs de sua linguagem de programação escolhida. Explique quaisquer <em>trade-offs</em> na sua abordagem atual em comparação com abordagens alternativas, possivelmente em termos de tempo e espaço.</p><p>Se seu entrevistador estiver satisfeito com a solução, a entrevista geralmente termina aqui. Também é comum que o entrevistador faça perguntas de extensão, como, por exemplo, sobre como você lidaria com o problema se toda a entrada for muito grande para caber na memória, ou se a entrada chegar como uma <em>stream</em>. Essa é uma pergunta posterior comum no Google, onde eles se preocupam muito com a escala.</p><p>A resposta é geralmente uma abordagem de dividir e conquistar – realizar o processamento distribuído dos dados e somente ler certas partes da entrada do disco para a memória, gravar a saída de volta para o disco e combiná-los mais tarde.</p><h2 id="pr-tica-com-entrevistas-simuladas"><strong>Prática com entrevistas simuladas</strong></h2><p>Os passos mencionados acima podem ser repetidamente ensaiados até que você os tenha interiorizado completamente e eles se tornem normais para você. Uma boa maneira de praticar é fazer uma parceria com um amigo e revezar nas entrevistas um com o outro.</p><p>Um grande recurso para a preparação de entrevistas de programação é o <a href="https://iio.sh/r/DMCa">interview</a><a href="https://iio.sh/r/DMCa">.io</a>. Essa plataforma oferece entrevistas práticas gratuitas e anônimas com engenheiros do Google e do Facebook, que podem levar a empregos e estágios reais.</p><p>Em virtude de ser anônimo durante a entrevista, o processo de entrevista inclusiva é imparcial e de baixo risco. No final da entrevista, tanto o entrevistador quanto o entrevistado podem dar feedback um ao outro com o objetivo de ajudar um ao outro a melhorar.</p><p>Sair-se bem nas entrevistas simuladas desbloqueará a página de empregos para os candidatos e permitirá que eles marquem entrevistas (também anônimas) com empresas de ponta, como Uber, Lyft, Quora, Asana, entre outras. Para aqueles que são novatos nas entrevistas de programação, uma entrevista demonstrativa pode ser visualizada <a href="https://start.interviewing.io/interview/9hV9r4HEONf9/replay">neste site</a>. Observe que o site exige que os usuários façam o registro.</p><p>Já usei a interviewing.io, tanto como entrevistador quanto como entrevistado. A experiência foi ótima. <a href="https://www.freecodecamp.org/news/coding-interviews-for-dummies-5e048933b82b/undefined">Aline Lerner</a>, a CEO e cofundadora do interviewing.io, e sua equipe são apaixonados por revolucionar o processo de entrevistas de programação e por ajudar os candidatos a melhorar suas habilidades de entrevista.</p><p>Ela também publicou uma série de artigos relacionados às entrevistas de programação no <a href="http://blog.interviewing.io/">blog interviewing.io</a>. Recomendo inscrever-se o mais cedo possível no interviewing.io, mesmo que ele esteja em estágio beta, para aumentar a probabilidade de receber um convite.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/01/image-58.png" class="kg-image" alt="image-58" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/01/image-58.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/01/image-58.png 800w" width="800" height="495" loading="lazy"></figure><p>Outra plataforma que permite praticar entrevistas de programação é a <a href="https://pramp.com/">Pramp</a>. Enquanto a interview.io combina potenciais candidatos a empregos com entrevistadores experientes em programação, a Pramp adota uma abordagem diferente. A Pramp combina você com outro colega que também é um candidato a emprego. Os dois se revezam assumindo as funções de entrevistador e entrevistado. A Pramp também prepara perguntas e fornece soluções e dicas para orientar o entrevistado.</p><h2 id="v-em-frente-e-conquiste"><strong>Vá em frente e conquiste</strong></h2><p>Depois de fazer uma quantidade razoável de perguntas no LeetCode e de ter prática suficiente em entrevistas simuladas, vá em frente e ponha à prova suas novas habilidades de entrevista.</p><p>Inscreva-se em suas empresas favoritas ou, melhor ainda, obtenha indicações de seus amigos que trabalham para essas empresas. As indicações tendem a ser notadas mais cedo e a ter uma taxa de resposta mais rápida do que se você se candidatar sem uma indicação. Boa sorte!</p><h2 id="dicas-pr-ticas-para-quest-es-de-programa-o"><strong>Dicas práticas para questões de </strong>program<strong>ação</strong></h2><p>Esta seção mergulha profundamente em dicas práticas para tópicos específicos de algoritmos e estruturas de dados que aparecem frequentemente em questões de programação. Muitas questões de algoritmos envolvem técnicas que podem ser aplicadas a questões de natureza similar.</p><p>Quanto mais técnicas você tiver em seu arsenal, maiores serão suas chances de passar na entrevista. Para cada tópico, há também uma lista de perguntas recomendadas, que é valiosa para dominar os conceitos centrais. Algumas das perguntas só estão disponíveis com uma assinatura paga do LeetCode, que, na minha opinião, vale o dinheiro se você conseguir um emprego.</p><h2 id="dicas-gerais"><strong>Dicas gerais</strong></h2><p>Valide sempre a entrada em primeiro lugar. Verifique se as entradas são inválidas, vazias, negativas ou diferentes. Nunca assuma que são dados parâmetros válidos. Como alternativa, esclareça com o entrevistador se você pode assumir que a entrada é válida (geralmente, sim), o que pode poupar seu tempo de escrever o código que faz a validação da entrada.</p><p>Há algum requerimento de complexidade de tempo e espaço ou restrições?</p><p>Verificar a existência de <a href="https://en.wikipedia.org/wiki/Off-by-one_error">erros </a><a href="https://en.wikipedia.org/wiki/Off-by-one_error"><em>off-by-one</em></a> (texto em inglês).</p><p>Em linguagens onde não há coerção automática de tipo, verifique se a concatenação de valores é do mesmo tipo: <code>int</code>, <code>str</code> e <code>list</code>.</p><p>Depois de terminar seu código, use alguns exemplos de entradas para testar sua solução.</p><p>O algoritmo deve ser executado várias vezes, talvez em um servidor da web? Em caso positivo, a entrada pode provavelmente ser pré-processada para melhorar a eficiência em cada chamada à API.</p><p>Use uma mistura dos paradigmas de programação funcional e imperativa:</p><ul><li>Escreva funções puras com a maior frequência possível.</li><li>Use funções puras porque são mais fáceis de pensar a respeito e podem ajudar a reduzir erros em sua implementação.</li><li>Evite a alteração dos parâmetros passados para sua função, especialmente se eles forem passados por referência, a menos que você esteja seguro do que está fazendo.</li><li>Atinja um equilíbrio entre precisão e eficiência. Use a quantidade certa de código funcional e imperativo, quando apropriado. A programação funcional é normalmente cara em termos de complexidade espacial devido à não mutação e à alocação repetida de novos objetos. Por outro lado, o código imperativo é mais rápido porque você opera com objetos existentes.</li><li>Evite confiar em variáveis globais mutáveis. As variáveis globais introduzem o estado.</li><li>Certifique-se de que você não mudará acidentalmente as variáveis globais, especialmente se você tiver que confiar nelas.</li></ul><p>Geralmente, para melhorar a velocidade de um programa, podemos escolher entre usar uma estrutura de dados ou um algoritmo apropriado ou usar mais memória. É uma troca clássica de espaço e tempo.</p><p>As estruturas de dados são suas armas. Escolher a arma certa para a batalha certa é a chave para a vitória. Conheça os pontos fortes de cada estrutura de dados e a complexidade de tempo para suas várias operações.</p><p>As estruturas de dados podem ser aumentadas para alcançar uma complexidade de tempo eficiente através de diferentes operações. Por exemplo, um HashMap pode ser usado juntamente com uma lista duplamente vinculada para alcançar a complexidade de tempo O(1) tanto para a operação de <code>get</code> como para a de <code>put</code> em um <a href="https://leetcode.com/problems/lru-cache/">cache LRU</a> (em inglês, onde LRU significa "menos recentemente usado").</p><p>Os HashMaps são provavelmente a estrutura de dados mais comumente usada para questões de algoritmos. Se você estiver preso a uma pergunta, seu último recurso pode ser enumerar através das possíveis estruturas de dados (felizmente não existem tantas) e considerar se cada uma delas pode ser aplicada ao problema. Isto tem funcionado para mim às vezes.</p><p>Se você estiver fazendo coisas apressadamente em seu código, declare isso em voz alta ao seu entrevistador e explique a ele o que você faria fora de um ambiente de entrevista (sem restrições de tempo). Por exemplo, explique que você escreveria uma <em>regex </em>para fazer o <em>parsing </em>de uma string em vez de usar <code>split</code>, que não cobre todos os casos.</p><h2 id="sequ-ncia"><strong>Sequência</strong></h2><h3 id="observa-es"><strong>Observações</strong></h3><p>Arrays e strings são considerados sequenciais (uma string é uma sequência de caracteres). Há dicas para lidar tanto com arrays quanto com strings que serão abordadas aqui.</p><p>Há valores duplicados na sequência? Eles afetariam a resposta?</p><p>Verifique a sequência fora dos limites.</p><p>Esteja atento ao fatiamento (do inglês, <em>slicing</em>) ou à concatenação de sequências em seu código. Tipicamente, o fatiamento e as sequências concatenadas requerem tempo O(n). Use índices de início e fim para demarcar um subarray ou uma substring sempre que possível.</p><p>Às vezes, você percorre a sequência a partir do lado direito em vez do lado esquerdo.</p><p>Dominar a <a href="https://discuss.leetcode.com/topic/30941/here-is-a-10-line-template-that-can-solve-most-substring-problems">técnica de janela deslizante</a> (texto em inglês) que se aplica a muitos problemas de substring ou subarray.</p><p>Quando são dadas duas sequências para processar, é comum ter um índice por sequência a ser percorrida. Por exemplo, usamos a mesma abordagem para unir dois arrays ordenados.</p><h3 id="casos-lim-trofes"><strong>Casos limítrofes</strong></h3><ul><li>Sequência vazia</li><li>Sequência com 1 ou 2 elementos</li><li>Sequência com elementos repetidos</li></ul><h2 id="array"><strong>Array</strong></h2><h3 id="observa-es-1"><strong>Observações</strong></h3><p>O array é ordenado ou parcialmente ordenado? Se for, alguma forma de busca binária deve ser possível. Isto geralmente significa que o entrevistador está procurando uma solução que seja mais rápida do que o O(n).</p><p>Você pode ordenar o array? Às vezes, ordenar o array primeiro pode simplificar significativamente o problema. Certifique-se de que a ordem dos elementos do array não precisa ser preservada antes de tentar ordená-lo.</p><p>Para perguntas onde a soma ou a multiplicação de um subarray está envolvida, a pré-computação usando hashing ou um prefixo, soma de sufixos ou produto pode ser útil.</p><p>Se você receber uma sequência e o entrevistador pedir espaço O(1), talvez seja possível usar o próprio array como uma tabela de hash. Por exemplo, se o array tiver valores apenas de 1 a N, onde N é o comprimento do array, deixe negativo o valor naquele índice (menos um) para indicar a presença daquele número.</p><h3 id="perguntas-pr-ticas-exemplos-em-ingl-s-do-leetcode-"><strong>Perguntas práticas (exemplos em inglês do LeetCode)</strong></h3><ul><li><a href="https://leetcode.com/problems/two-sum/">Duas somas</a></li><li><a href="https://leetcode.com/problems/best-time-to-buy-and-sell-stock/">Melhor hora para comprar e vender ações</a></li><li><a href="https://leetcode.com/problems/contains-duplicate/">Contém duplicata</a></li><li><a href="https://leetcode.com/problems/product-of-array-except-self/">Produto do Array Exceto Self</a></li><li><a href="https://leetcode.com/problems/maximum-subarray/">Subarray máximo</a></li><li><a href="https://leetcode.com/problems/maximum-product-subarray/">Subarray máximo do produto</a></li><li><a href="https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/">Encontrar o mínimo em um array ordenado e girado</a></li><li><a href="https://leetcode.com/problems/search-in-rotated-sorted-array/">Busca em um array ordenado e girado</a></li><li><a href="https://leetcode.com/problems/3sum/">Soma3</a></li><li><a href="https://leetcode.com/problems/container-with-most-water/">Contêiner com mais água</a></li></ul><h2 id="bin-rio"><strong>Binário</strong></h2><h3 id="links-de-estudo"><strong>Links de estudo</strong></h3><ul><li><a href="https://medium.com/basecs/bits-bytes-building-with-binary-13cb4289aafa">Bits, bytes, construindo com binário</a> (em inglês)</li></ul><h3 id="observa-es-2"><strong>Observações</strong></h3><p>Às vezes, são feitas perguntas que envolvem representações binárias e operações <em>bitwise</em>. Você deve saber como converter um número de decimal para binário e vice-versa em sua linguagem de programação escolhida.</p><p>Alguns trechos úteis:</p><ul><li>O teste do k-ésimo bit está definido: num &amp; (1 &lt;&lt; k) != 0</li><li>Defina o k-ésimo bit: num |= (1 &lt; &lt;&lt; k)</li><li>Desligue o k-ésimo bit: num &amp;= ~(1 &lt;&lt;&lt; k)</li><li>Alterne o k-ésimo bit: num ^= (1 &lt; &lt;&lt; k)</li><li>Para verificar se um número é uma potência de 2: num &amp; num - 1 == 0.</li></ul><h3 id="casos-lim-trofes-1"><strong>Casos limítrofes</strong></h3><ul><li>Verificação de sobrefluxo/baixo fluxo</li><li>Números negativos</li></ul><h3 id="perguntas-pr-ticas-exemplos-em-ingl-s-do-leetcode--1"><strong>Perguntas práticas (exemplos em inglês do LeetCode)</strong></h3><ul><li><a href="https://leetcode.com/problems/sum-of-two-integers/">Soma de dois inteiros</a></li><li><a href="https://leetcode.com/problems/number-of-1-bits/">Número de 1 Bits</a></li><li><a href="https://leetcode.com/problems/counting-bits/">Contagem de Bits</a></li><li><a href="https://leetcode.com/problems/missing-number/">Número em falta</a></li><li><a href="https://leetcode.com/problems/reverse-bits/">Bits Reversos</a></li></ul><h2 id="programa-o-din-mica"><strong>Programação dinâmica</strong></h2><h3 id="links-de-estudo-1"><strong>Links de estudo</strong></h3><ul><li><a href="https://www.freecodecamp.org/news/demystifying-dynamic-programming-3efafb8d4296">Desmistificando a programação dinâmica</a> (texto em inglês)</li></ul><h3 id="observa-es-3"><strong>Observações</strong></h3><p>A Programação Dinâmica (DP) é normalmente usada para resolver problemas de otimização. Alaina Kafkes escreveu um <a href="https://www.freecodecamp.org/news/demystifying-dynamic-programming-3efafb8d4296">artigo fantástico</a> sobre a solução de problemas de DP. Você deve lê-lo.</p><p>A única maneira de melhorar no DP é com a prática. É preciso muita prática para reconhecer que um problema pode ser resolvido pela PD.</p><p>Para otimizar o espaço, às vezes não é necessário armazenar a tabela de DP inteira na memória. Os dois últimos valores ou as duas últimas filas da matriz serão suficientes.</p><h3 id="perguntas-pr-ticas-exemplos-em-ingl-s-do-leetcode--2"><strong>Perguntas práticas (exemplos em inglês do LeetCode)</strong></h3><ul><li><a href="http://www.geeksforgeeks.org/knapsack-problem/">0/1 Mochila</a></li><li><a href="https://leetcode.com/problems/climbing-stairs/">Escada</a></li><li><a href="https://leetcode.com/problems/coin-change/">Mudança de moeda</a></li><li><a href="https://leetcode.com/problems/longest-increasing-subsequence/">O maior aumento subsequente</a></li><li><a href="https://github.com/yangshun/tech-interview-handbook/blob/master/algorithms">Subsequências mais longas comuns</a></li><li><a href="https://leetcode.com/problems/word-break/">Problema de quebra de palavras</a></li><li><a href="https://leetcode.com/problems/combination-sum-iv/">Soma combinada</a></li><li><a href="https://leetcode.com/problems/house-robber/">Assalto à casa</a> e <a href="https://leetcode.com/problems/house-robber-ii/">Assalto à casa II</a></li><li><a href="https://leetcode.com/problems/decode-ways/">Formas de decodificação</a></li><li><a href="https://leetcode.com/problems/unique-paths/">Caminhos únicos</a></li><li><a href="https://leetcode.com/problems/jump-game/">Jogo de pular</a></li></ul><h2 id="geometria"><strong>Geometria</strong></h2><h3 id="observa-es-4"><strong>Observações</strong></h3><p>Ao comparar a distância euclidiana entre dois pares de pontos, o uso de dx² + dy² é suficiente. É desnecessário estabelecer a raiz quadrada do valor.</p><p>Para descobrir se dois círculos se sobrepõem, verifique se a distância entre os dois centros dos círculos é menor do que a soma de seus raios.</p><h2 id="grafos"><strong>Grafos</strong></h2><h3 id="links-de-estudo-textos-em-ingl-s-"><strong>Links de estudo (textos em inglês)</strong></h3><ul><li><a href="https://medium.com/basecs/from-theory-to-practice-representing-graphs-cfd782c5be38">Da teoria à prática: representando grafos</a></li><li><a href="https://medium.com/basecs/deep-dive-through-a-graph-dfs-traversal-8177df5d0f13">Mergulhar fundo através de um grafo: travessia DFS</a></li><li><a href="https://medium.com/basecs/going-broad-in-a-graph-bfs-traversal-959bd1a09255">Tornando o grafo mais amplo: travessia BFS</a></li></ul><h3 id="observa-es-5">Observações</h3><p>Esteja familiarizado com as várias representações de grafos e algoritmos de pesquisa de grafos, bem como com suas complexidades de tempo e espaço.</p><p>Você pode receber uma lista de arestas e ser encarregado de construir seu próprio grafo a partir das arestas para realizar uma travessia. As representações de grafos comuns são:</p><ul><li>Matriz adjacente</li><li>Lista adjacente</li><li>HashMap dos HashMaps</li></ul><p>Algumas entradas parecem ser árvores, mas, na verdade, são grafos. Esclareça isto com seu entrevistador. Nesse caso, você terá que lidar com ciclos e manter um conjunto de nós visitados quando estiver percorrendo os grafos.</p><h3 id="algoritmos-de-busca-de-grafos"><strong>Algoritmos de busca de grafos</strong></h3><ul><li>Comum: busca primeiramente em largura (BFS), busca primeiramente em profundidade (DFS)</li><li>Incomum: ordenação topológica, o algoritmo de Dijkstra</li><li>Raro: algoritmo Bellman-Ford, algoritmo Floyd-Warshall, algoritmo Prim e algoritmo Kruskal</li></ul><p>Nas entrevistas de programação, os grafos são comumente representados como matrizes 2D, onde as células são os nós e cada célula pode percorrer até suas células adjacentes (para cima, para baixo, para a esquerda e para a direita). Portanto, é importante estar familiarizado com a travessia de uma matriz 2-D.</p><p>Ao atravessar recursivamente a matriz, certifique-se sempre de que sua próxima posição esteja dentro dos limites da matriz. Mais dicas para fazer a DFS em uma matriz podem ser encontradas <a href="https://discuss.leetcode.com/topic/66065/python-dfs-bests-85-tips-for-all-dfs-in-matrix-question/">aqui</a> (em inglês). Um modelo simples para fazer a DFS em uma matriz é algo parecido com isto:</p><pre><code class="language-py">def traverse(matrix):
  rows, cols = len(matrix), len(matrix[0])
  visited = set()
  directions = ((0, 1), (0, -1), (1, 0), (-1, 0))
  def dfs(i, j):
    if (i, j) in visited:
      return
    visited.add((i, j))
    # Traverse neighbors
    for direction in directions:
      next_i, next_j = i + direction[0], j + direction[1]
      if 0 &lt;= next_i &lt; rows and 0 &lt;= next_j &lt; cols: # Check boundary
        # Add any other checking here ^
        dfs(next_i, next_j)
  for i in range(rows):
    for j in range(cols):
      dfs(i, j)</code></pre><h3 id="casos-lim-trofes-2"><strong>Casos limítrofes</strong></h3><ul><li>Grafo vazio</li><li>Grafo com um ou dois nós</li><li>Grafos desconjuntados</li><li>Grafos com ciclos</li></ul><h3 id="perguntas-pr-ticas-exemplos-em-ingl-s-do-leetcode--3"><strong>Perguntas práticas (exemplos em inglês do LeetCode)</strong></h3><ul><li><a href="https://leetcode.com/problems/clone-graph/">Clonar grafo</a></li><li><a href="https://leetcode.com/problems/course-schedule/">Cronograma do curso</a></li><li><a href="https://leetcode.com/problems/alien-dictionary/">Dicionário de alienígenas</a></li><li><a href="https://leetcode.com/problems/pacific-atlantic-water-flow/">Fluxo de água do Atlântico Pacífico</a></li><li><a href="https://leetcode.com/problems/number-of-islands/">Número de ilhas</a></li><li><a href="https://leetcode.com/problems/graph-valid-tree/">Árvore válida de grafo</a></li><li><a href="https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/">Número de componentes conectados em um grafo indireto</a></li><li><a href="https://leetcode.com/problems/longest-consecutive-sequence/">Sequência consecutiva mais longa</a></li></ul><h2 id="intervalo"><strong>Intervalo</strong></h2><h3 id="observa-es-6"><strong>Observações</strong></h3><p>Perguntas de intervalo são perguntas que dão uma série de arrays de dois elementos (um intervalo). Os dois valores representam um valor inicial e um valor final. As perguntas de intervalo são consideradas parte da família de arrays, mas envolvem algumas técnicas comuns. Portanto, elas têm sua própria seção especial.</p><p>Um exemplo de intervalo de arrays: <code>[[1, 2], [4, 7]]</code>.</p><p>As perguntas de intervalo podem ser complicadas para aqueles que não têm experiência com elas. Isto se deve ao grande número de casos a serem considerados quando os arrays de intervalo se sobrepõem.</p><p>Esclareça com o entrevistador se <code>[1, 2]</code> e <code>[2, 3]</code> são considerados intervalos sobrepostos, pois isso afeta a forma como você vai escrever suas verificações de igualdade.</p><p>Uma rotina comum para perguntas de intervalo é ordenar o conjunto de intervalos pelo valor inicial de cada intervalo.</p><p>Esteja familiarizado com escrever código para verificar se dois intervalos se sobrepõem e para unir dois intervalos sobrepostos:</p><pre><code class="language-js">def is_overlap(a, b):
  return a[0] &lt; b[1] and b[0] &lt; a[1]
  
def merge_overlapping_intervals(a, b):
  return [min(a[0], b[0]), max(a[1], b[1])]</code></pre><h3 id="casos-lim-trofes-3"><strong>Casos limítrofes</strong></h3><ul><li>Intervalo único</li><li>Intervalos não sobrepostos</li><li>Um intervalo totalmente consumido dentro de outro intervalo</li><li>Intervalos em duplicata</li></ul><h3 id="perguntas-pr-ticas-exemplos-em-ingl-s-do-leetcode--4"><strong>Perguntas práticas (exemplos em inglês do LeetCode)</strong></h3><ul><li><a href="https://leetcode.com/problems/insert-interval/">Intervalo de inserção</a></li><li><a href="https://leetcode.com/problems/merge-intervals/">Intervalos de <em>merging</em></a></li><li><a href="https://leetcode.com/problems/meeting-rooms/">Salas de reunião</a> e <a href="https://leetcode.com/problems/meeting-rooms-ii/">Salas de reunião II</a></li><li><a href="https://leetcode.com/problems/non-overlapping-intervals/">Intervalos não sobrepostos</a></li></ul><h2 id="lista-vinculada"><strong>Lista vinculada</strong></h2><h3 id="observa-es-7"><strong>Observações</strong></h3><p>Como os arrays, listas vinculadas são usadas para representar dados sequenciais. O benefício das listas vinculadas é que a inserção e exclusão de código de qualquer parte da lista é O(1), enquanto, nos arrays, os elementos têm que ser mudados.</p><p>Adicionar um nó fictício na cabeça e/ou na cauda pode ajudar a lidar com muitos casos limítrofes onde as operações têm que ser realizadas na cabeça ou na cauda. A presença de nós fictícios garante que as operações nunca terão sido executadas na cabeça ou na cauda. Os nós fictícios removem a dor de cabeça de escrever verificações condicionais para lidar com indicações nulas. Certifique-se de removê-los ao final da operação.</p><p>Às vezes, os problemas de listas vinculadas podem ser resolvidos sem armazenamento adicional. Tente pegar ideias emprestadas para reverter um problema de lista vinculada.</p><p>Para exclusão em listas vinculadas, você pode modificar os valores dos nós ou alterar os ponteiros dos nós. Você pode precisar manter uma referência ao elemento anterior.</p><p>Para particionar as listas vinculadas, crie duas listas vinculadas separadas e junte-as novamente.</p><p>Os problemas de listas vinculadas compartilham semelhanças com problemas de array. Pense em como você resolveria um problema de array e o aplicaria a uma lista vinculada.</p><p>Duas abordagens de ponteiro também são comuns para listas vinculadas:</p><ul><li>Obtendo o k-ésimo nó a partir do último nó: use dois ponteiros, onde um está k nós à frente do outro. Quando o nó à frente chega ao fim, o outro nó está k nós atrás.</li><li>Detectando ciclos: use dois ponteiros, onde um ponteiro aumenta duas vezes mais do que o outro. Se os dois ponteiros se encontrarem, significa que há um ciclo.</li><li>Obtendo o nó do meio: use dois ponteiros. Um ponteiro incrementa duas vezes mais que o outro. Quando o nó mais rápido chegar ao final da lista, o mais lento estará no meio.</li></ul><p>Esteja familiarizado com as seguintes rotinas, pois muitas perguntas da lista vinculada fazem uso de uma ou mais destas rotinas em sua solução.</p><ul><li>Contar o número de nós na lista vinculada</li><li>Reverter uma lista vinculada no local</li><li>Encontre o nó central da lista vinculada usando ponteiros rápidos ou lentos</li><li>Fazer a fusão (do inglês, <em>merge</em>) de duas listas juntas</li></ul><h3 id="casos-lim-trofes-4"><strong>Casos limítrofes</strong></h3><ul><li>Nó único</li><li>Dois nós</li><li>A lista vinculada tem um ciclo. Esclareça com o entrevistador se pode haver um ciclo na lista. Normalmente, a resposta é não.</li></ul><h3 id="perguntas-pr-ticas-exemplos-em-ingl-s-do-leetcode--5"><strong>Perguntas práticas (exemplos em inglês do LeetCode)</strong></h3><ul><li><a href="https://leetcode.com/problems/reverse-linked-list/">Reverter uma lista vinculada</a></li><li><a href="https://leetcode.com/problems/linked-list-cycle/">Detectar ciclo em uma lista vinculada</a></li><li><a href="https://leetcode.com/problems/merge-two-sorted-lists/">Fusão de duas listas ordenadas</a></li><li><a href="https://leetcode.com/problems/merge-k-sorted-lists/">Fusão de listas K ordenadas</a></li><li><a href="https://leetcode.com/problems/remove-nth-node-from-end-of-list/">Remover o nó do fim da lista</a></li><li><a href="https://leetcode.com/problems/reorder-list/">Reordenar a lista</a></li></ul><h2 id="matem-tica"><strong>Matemática</strong></h2><h4 id="observa-es-8"><strong>Observações</strong></h4><p>Se o código envolver divisão ou módulo, lembre-se de verificar a divisão ou o módulo em função do caso com 0 (zero).</p><p>Quando uma pergunta envolve "um múltiplo de um número", o módulo pode ser útil.</p><p>Verifique e administre overflow e underflow se estiver usando uma linguagem tipada como Java e C++. No mínimo, mencione que o <em>overflow </em>ou que o <em>underflow </em>é possível e pergunte se você precisa lidar com ele.</p><p>Considere números negativos e números de ponto flutuante. Isso pode parecer óbvio, mas quando você está sob pressão em uma entrevista, muitos pontos óbvios passam despercebidos.</p><p>Se a pergunta for para implementar um operador como potência, raiz quadrada ou divisão, e se for para ser mais rápido que O(n), a busca binária é geralmente a abordagem.</p><h3 id="algumas-f-rmulas-comuns"><strong>Algumas fórmulas comuns</strong></h3><ul><li>Soma de 1 para N = (n+1) * n/2</li><li>Soma de progressões geométricas = 2⁰ + 2¹ + 2² + 2³ + … 2^n = 2^(n+1)-1</li><li>Permutações de N = N! / (N-K)!</li><li>Combinações de N = N! / (K! * (N-K)!)</li></ul><h3 id="casos-lim-trofes-5"><strong>Casos limítrofes</strong></h3><ul><li>Divisão por 0</li><li><em>Overflow </em>e <em>underflow</em> de números inteiros</li></ul><h3 id="perguntas-pr-ticas-exemplos-em-ingl-s-do-leetcode--6"><strong>Perguntas práticas (exemplos em inglês do LeetCode)</strong></h3><ul><li><a href="https://leetcode.com/problems/powx-n/">Potência</a><a href="https://leetcode.com/problems/powx-n/" rel="noopener">(x, n)</a></li><li><a href="https://leetcode.com/problems/sqrtx/">Raiz quadrada(x)</a></li><li><a href="https://leetcode.com/problems/integer-to-english-words/">Inteiro para palavras em inglês</a></li></ul><h2 id="matriz"><strong>Matriz</strong></h2><h3 id="notas"><strong>Notas</strong></h3><p>Uma matriz é um array bidimensional. As questões envolvendo matrizes estão geralmente relacionadas à programação dinâmica ou à travessia do grafo.</p><p>Para perguntas que envolvam travessia ou programação dinâmica, faça uma cópia da matriz com as mesmas dimensões e inicializada com valores vazios. Utilize esses valores para armazenar o estado visitado ou a tabela de programação dinâmica. Esteja familiarizado com esta rotina:</p><pre><code class="language-py">rows, cols = len(matrix), len(matrix[0])
copy = [[0 for _ in range(cols)] for _ in range(rows)</code></pre><ul><li>Muitos jogos baseados em grade podem ser modelados como uma matriz, como, por exemplo, o Jogo da Velha, Sudoku, palavras cruzadas, Ligue 4 e Batalha Naval. Não é raro ser solicitada a verificação da condição de vencedor do jogo. Para jogos como o Jogo da Velha, o Ligue 4 e as Palavras Cruzadas, a verificação tem que ser feita vertical e horizontalmente. Um truque é escrever o código para verificar a matriz para as células horizontais. Em seguida, transpor a matriz, reutilizando a lógica usada para verificação horizontal para verificar as células originalmente verticais (que agora são horizontais).</li><li>A transposição de uma matriz em Python é simples:</li></ul><pre><code class="language-py">transposed_matrix = zip(*matrix)</code></pre><h3 id="casos-lim-trofes-6"><strong>Casos limítrofes</strong></h3><ul><li>Matriz vazia. Verifique se nenhuma das matrizes tem comprimento 0.</li><li>Matriz 1 x 1.</li><li>Matriz com apenas uma linha ou coluna.</li></ul><h3 id="perguntas-pr-ticas-exemplos-em-ingl-s-do-leetcode--7"><strong>Perguntas práticas (exemplos em inglês do LeetCode)</strong></h3><ul><li><a href="https://leetcode.com/problems/set-matrix-zeroes/">Definir a matriz zero</a> </li><li><a href="https://leetcode.com/problems/spiral-matrix/">Matriz espiral</a></li><li><a href="https://leetcode.com/problems/rotate-image/">Rotacionar imagem</a></li><li><a href="https://leetcode.com/problems/word-search/">Caça-palavras</a></li></ul><h2 id="recurs-o"><strong>Recursão</strong></h2><h3 id="observa-es-9"><strong>Observações</strong></h3><p>A recursividade é útil para a permutação, pois gera todas as combinações e perguntas baseadas em árvores. Você deve saber como gerar todas as permutações de uma sequência, bem como lidar com as duplicatas.</p><p>Lembre-se sempre de definir um caso base para que sua recorrência termine.</p><p>A recorrência utiliza implicitamente uma pilha. Assim, todas as abordagens recursivas podem ser reescritas iterativamente usando uma pilha.</p><p>Cuidado com os casos em que o nível de recorrência vai muito fundo e causa um transbordamento de pilha (o limite padrão em Python é 1000). Você pode receber pontos de bônus por apontar isso para o entrevistador.</p><p>A recursividade nunca terá complexidade espacial O(1) porque uma pilha está envolvida, a menos que haja uma <a href="https://stackoverflow.com/questions/310974/what-is-tail-call-optimization">otimização da chamada de cauda</a> (TCO). Descubra se a linguagem escolhida dá suporte à TCO.</p><h3 id="perguntas-pr-ticas-exemplos-em-ingl-s-do-leetcode--8"><strong>Perguntas práticas (exemplos em inglês do LeetCode)</strong></h3><ul><li><a href="https://leetcode.com/problems/subsets/">Subconjuntos</a> e <a href="https://leetcode.com/problems/subsets-ii/">Subconjuntos II</a></li><li><a href="https://leetcode.com/problems/strobogrammatic-number-ii/">Número II </a><a href="https://leetcode.com/problems/strobogrammatic-number-ii/" rel="noopener">Strobogrammatic</a></li></ul><h2 id="string"><strong>String</strong></h2><h3 id="observa-es-10"><strong>Observações</strong></h3><p>Leia as dicas acima sobre <a href="https://www.techinterviewhandbook.org/">sequências</a>. Elas também se aplicam às strings.</p><p>Pergunte sobre o conjunto de caracteres de entrada e a distinção entre maiúsculas e minúsculas. Normalmente, os caracteres são limitados a caracteres latinos em letras minúsculas – por exemplo, de a até z.</p><p>Quando você precisa comparar strings onde a ordem não é importante (como o anagrama), você pode considerar o uso de um HashMap como um contador. Se sua linguagem tiver uma classe de contador embutida como no Python, peça para usar isso em seu lugar.</p><p>Se você precisa manter um contador de caracteres, um erro comum é dizer que a complexidade de espaço necessária para o contador é O(n). O espaço necessário para um contador é O(1) e não O(n). Isto porque o limite superior é o intervalo de caracteres, que, normalmente, é uma constante fixa de 26. O conjunto de entrada é apenas de caracteres latinos em letras minúsculas.</p><p>As estruturas de dados comuns para a busca eficiente de strings são:</p><ul><li><a href="https://www.wikiwand.com/en/Trie">Árvore de Trie/Prefixos</a></li><li><a href="https://www.wikiwand.com/en/Suffix_tree">Árvore de Sufixos</a></li></ul><p>Algoritmos de strings comuns são:</p><ul><li><a href="https://www.wikiwand.com/en/Rabin%E2%80%93Karp_algorithm" rel="noopener">Rabin Karp</a>, que realiza buscas eficientes de substrings, utilizando um hash "rolante"</li><li><a href="https://www.wikiwand.com/en/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm" rel="noopener">KMP</a>, que realiza buscas eficientes de substrings</li></ul><h3 id="caracteres-n-o-repetentes"><strong>Caracteres não repetentes</strong></h3><p>Use uma máscara de 26 bits para indicar quais caracteres latinos em letras minúsculas estão dentro da string.</p><pre><code class="language-py">mask = 0
for c in set(word):
  mask |= (1 &lt;&lt; (ord(c) - ord('a')))</code></pre><p>Para determinar se duas strings têm caracteres em comum, execute &amp; nas duas máscaras de bits. Se o resultado não for zero, <code>mascara_a &amp; mascara_b &gt; 0</code> , então as duas strings têm caracteres em comum.</p><h3 id="anagrama"><strong>Anagrama</strong></h3><p>Um anagrama é um trocador de palavras ou jogo de palavras. É o resultado de reorganizar as letras de uma palavra ou frase para produzir uma nova palavra ou frase, enquanto usa todas as letras originais apenas uma vez. Em entrevistas, normalmente só nos preocupamos com palavras sem espaços nelas.</p><p>Para determinar se duas strings são anagramas, existem algumas abordagens plausíveis:</p><ul><li>A ordenação de ambas as strings deve produzir a mesma string resultante. Isso leva tempo O(nlgn) e espaço O(lgn).</li><li>Se mapearmos cada caractere para um número primo e multiplicarmos cada número mapeado juntos, os anagramas devem ter o mesmo múltiplo (decomposição do fator primo). Isto leva tempo O(n) e espaço O(1).</li><li>A contagem da frequência dos caracteres ajudará a determinar se duas strings são anagramas. Isso também leva tempo O(n) e espaço O(1)</li></ul><h3 id="pal-ndromo"><strong>Palíndromo</strong></h3><p>Um <strong>palíndromo</strong> é uma palavra, frase, <a href="https://en.wikipedia.org/wiki/Palindromic_number">número</a> ou outra sequência de <a href="https://en.wikipedia.org/wiki/Character_(symbol)">caracteres</a> que é lido do mesmo modo para trás e para frente, tais como "<em>madam"</em> ou "<em>racecar</em>".</p><p>Aqui estão maneiras de determinar se uma string é um palíndromo:</p><ul><li>Reverta a string e ela deve ser igual a si mesma.</li><li>Ter dois ponteiros no início e no final da string. Mova os ponteiros para dentro até que eles se encontrem. Em qualquer momento, os caracteres em ambos os ponteiros devem coincidir.</li></ul><p>A ordem dos caracteres dentro da string importa, portanto, os HashMaps geralmente não são úteis.</p><p>Quando se trata de contar o número de palíndromos, um truque comum é ter dois ponteiros que se movem para fora e para longe do meio. Note que os palíndromos podem ter um comprimento par ou ímpar. Para cada posição de pivô central, é necessário verificá-la duas vezes: uma vez que inclua o caractere e outra sem o caractere.</p><ul><li>Para as substrings, você pode terminar antecipadamente uma vez que não haja correspondência.</li><li>Para as subsequentes, use programação dinâmica, pois existem subproblemas sobrepostos. Confira <a href="https://leetcode.com/problems/longest-palindromic-subsequence/">esta pergunta</a> (em inglês, no LeetCode).</li></ul><h3 id="casos-lim-trofes-7"><strong>Casos limítrofes</strong></h3><ul><li>String vazia</li><li>String de um único caractere</li><li>Strings com apenas um caractere distinto</li></ul><h3 id="perguntas-pr-ticas-exemplos-em-ingl-s-do-leetcode--9"><strong>Perguntas práticas (exemplos em inglês do LeetCode)</strong></h3><ul><li><a href="https://leetcode.com/problems/longest-substring-without-repeating-characters/">A substring mais longa sem repetição de caracteres</a></li><li><a href="https://leetcode.com/problems/longest-repeating-character-replacement/">Substituição mais longa de caracteres repetitivos</a></li><li><a href="https://leetcode.com/problems/minimum-window-substring/description/">Substring mínimaqde janela</a></li><li><a href="https://leetcode.com/problems/encode-and-decode-strings/">Codificação e decodificação de strings</a></li><li><a href="https://leetcode.com/problems/valid-anagram">Anagrama válido</a></li><li><a href="https://leetcode.com/problems/group-anagrams/">Anagramas de grupo</a></li><li><a href="https://leetcode.com/problems/valid-parentheses">Parênteses válidos</a></li><li><a href="https://leetcode.com/problems/valid-palindrome/">Palíndromo válido</a></li><li><a href="https://leetcode.com/problems/longest-palindromic-substring/">Substring palindrômica mais longa</a></li><li><a href="https://leetcode.com/problems/palindromic-substrings/">Substrings palindrômicas</a></li></ul><h3 id="-rvore"><strong>Árvore</strong></h3><h3 id="links-de-estudo-em-ingl-s-"><strong>Links de estudo (em inglês)</strong></h3><h4></h4><ul><li><a href="https://medium.com/basecs/leaf-it-up-to-binary-trees-11001aaf746d">Folheie até as árvores binárias</a></li></ul><h3 id="observa-es-11"><strong>Observações</strong></h3><p>Uma árvore é um grafo acíclico, não direcionado e conectado.</p><p>A recursividade é uma abordagem comum para as árvores. Quando você perceber que o problema da subárvore pode ser usado para resolver o problema inteiro, tente usar a recursividade.</p><p>Ao utilizar a recorrência, lembre-se sempre de verificar o caso base, geralmente onde o nó é nulo.</p><p>Quando você for solicitado a atravessar uma árvore por nível, use a busca em profundidade.</p><p>Às vezes, é possível que sua função recursiva precise retornar dois valores.</p><p>Se a questão envolver a soma dos nós ao longo do caminho, certifique-se de verificar se os nós podem ser negativos.</p><p>Você deve estar muito familiarizado com a escrita de travessias de pré-ordem, dentro da ordem e pós-ordem recursivamente. Como extensão, desafie-se escrevendo-as iterativamente. Às vezes, os entrevistadores pedem aos candidatos a abordagem iterativa, especialmente se o candidato terminar de escrever a abordagem recursiva muito rapidamente.</p><h3 id="-rvore-bin-ria"><strong>Árvore binária</strong></h3><p>A travessia em ordem de uma árvore binária é insuficiente para serializar uma árvore de maneira única. Também é necessária a travessia pré-ordem ou pós-ordem.</p><h2 id="-rvore-de-busca-bin-ria-binary-search-tree-bst-">Árvore de busca binária - Binary search tree (BST)</h2><p>A travessia em ordem de uma BST dará a você todos os elementos em ordem.</p><p>Esteja muito familiarizado com as propriedades de uma BST. Valide se uma árvore binária é uma BST. Isso aparece com mais frequência do que o esperado.</p><p>Quando uma pergunta envolve uma BST, o entrevistador geralmente está procurando uma solução que funcione mais rápido que a O(n).</p><h3 id="casos-lim-trofes-8"><strong>Casos limítrofes</strong></h3><ul><li>Árvore vazia</li><li>Nó único</li><li>Dois nós</li><li>Árvore muito desbalanceada (como uma lista vinculada)</li></ul><h3 id="perguntas-pr-ticas-exemplos-em-ingl-s-do-leetcode--10"><strong>Perguntas práticas (exemplos em inglês do LeetCode)</strong></h3><ul><li><a href="https://leetcode.com/problems/maximum-depth-of-binary-tree/">Profundidade máxima da árvore binária</a></li><li><a href="https://leetcode.com/problems/same-tree/">A mesma árvore</a></li><li><a href="https://leetcode.com/problems/invert-binary-tree/">Árvore binária invertida ou virada</a></li><li><a href="https://leetcode.com/problems/binary-tree-maximum-path-sum/">Soma máxima do caminho da árvore binária</a></li><li><a href="https://leetcode.com/problems/binary-tree-level-order-traversal/">Travessia de ordem de nível de árvore binária</a></li><li><a href="https://leetcode.com/problems/serialize-and-deserialize-binary-tree/">Serializar e desserializar a árvore binária</a></li><li><a href="https://leetcode.com/problems/subtree-of-another-tree/">Subárvore de outra árvore</a></li><li><a href="https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/">Construir a árvore binária a partir da travessia de pré-ordem e em ordem</a></li><li><a href="https://leetcode.com/problems/validate-binary-search-tree/">Validar árvore de busca binária</a></li><li><a href="https://leetcode.com/problems/kth-smallest-element-in-a-bst/">K-ésimo menor elemento de uma BST</a></li><li><a href="https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/">O menor ancestral comum da BST</a></li></ul><h2 id="tries"><strong>Tries</strong></h2><h3 id="links-de-estudo-em-ingl-s--1"><strong>Links de estudo (em inglês)</strong></h3><ul><li><a href="https://medium.com/basecs/trying-to-understand-tries-3ec6bede0014">Tentando entender as tries</a></li><li><a href="https://leetcode.com/articles/implement-trie-prefix-tree/">Implemente a Trie (Árvore de prefixos)</a></li></ul><h3 id="observa-es-12"><strong>Observações</strong></h3><p>Tries são árvores especiais (árvores de prefixos) que tornam mais eficiente a busca e o armazenamento de strings. As <em>tries</em> têm muitas aplicações práticas, tais como a realização de buscas e o fornecimento de autocompletar. É útil conhecer essas aplicações comuns para que você possa identificar facilmente quando um problema pode ser resolvido de modo eficiente usando uma <em>trie</em>.</p><p>Às vezes, o pré-processamento de um dicionário de palavras (dado em uma lista) em uma <em>trie</em> melhorará a eficiência da busca por uma palavra de comprimento k, entre n palavras. A busca torna-se O(k) em vez de O(n).</p><p>Esteja familiarizado com a implementação, a partir do zero, de uma classe <code>Trie</code> e seus métodos <code>add</code>, <code>remove</code> e <code>search</code>.</p><h3 id="perguntas-pr-ticas-exemplos-em-ingl-s-do-leetcode--11"><strong>Perguntas práticas (exemplos em inglês do LeetCode)</strong></h3><ul><li><a href="https://leetcode.com/problems/implement-trie-prefix-tree">Implemente Trie (Prefixo Árvore)</a></li><li><a href="https://leetcode.com/problems/add-and-search-word-data-structure-design">Adicionar e pesquisar palavra</a></li><li><a href="https://leetcode.com/problems/word-search-ii/">Caça-palavras II</a></li></ul><h2 id="heap"><strong>Heap</strong></h2><h3 id="links-de-estudo-em-ingl-s--2"><strong>Links de estudo (em inglês)</strong></h3><ul><li><a href="https://medium.com/basecs/learning-to-love-heaps-cef2b273a238">Aprendendo a amar os Heaps</a></li></ul><h3 id="observa-es-13"><strong>Observações</strong></h3><p>Se você vir um k superior ou inferior mencionado na pergunta, geralmente, é um sinal de que uma <em>heap</em> pode ser usada para resolver o problema, como em <a href="https://leetcode.com/problems/top-k-frequent-elements/">K elementos mais frequentes</a>.</p><p>Se você precisar dos k elementos superiores, use uma <em>heap </em>de tamanho k. Faça a iteração através de cada elemento, inserindo-o na <em>heap</em>. Sempre que o tamanho da <em>heap </em>exceder k, remova o elemento menor. Isso garantirá que você tenha os k elementos maiores.</p><h3 id="perguntas-pr-ticas-exemplos-em-ingl-s-do-leetcode--12"><strong>Perguntas práticas (exemplos em inglês do LeetCode)</strong></h3><ul><li><a href="https://leetcode.com/problems/merge-k-sorted-lists/">Fusão de listas K ordenadas</a></li><li><a href="https://leetcode.com/problems/top-k-frequent-elements/">K elementos mais frequentes</a></li><li><a href="https://leetcode.com/problems/find-median-from-data-stream/">Encontre a mediana do fluxo de dados</a></li></ul><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>As entrevistas de programação são difíceis. Felizmente, no entanto, você pode melhorar para elas, estudando e praticando para elas e fazendo entrevistas simuladas.</p><p>Recapitulando: para se sair bem nas entrevistas de programação:</p><ol><li>Decida sobre uma linguagem de programação</li><li>Estude fundamentos da Ciência da Computação</li><li>Pratique a solução de questões de algoritmos</li><li>Internalize <a href="https://github.com/yangshun/tech-interview-handbook/blob/master/preparing/cheatsheet.md"></a><a href="https://www.techinterviewhandbook.org/">o que se faz e o que não se faz nas entrevistas</a></li><li>Pratique através de entrevistas técnicas simuladas</li><li>Faça a entrevista com sucesso e consiga o emprego</li></ol><p>Seguindo essas etapas, você melhorará suas habilidades em entrevistas de programação e estará um passo mais próximo (ou provavelmente mais) de conseguir o emprego dos seus sonhos.</p><p>Sucesso para você!</p><p>O conteúdo deste artigo também <a href="https://www.techinterviewhandbook.org/">pode ser encontrado aqui</a>. Atualizações futuras serão publicadas lá. Pedidos de sugestões e correções são bem-vindos.</p><p>Se você gostou deste artigo, compartilhe-o com seus amigos!</p><p>Você pode seguir o autor no <a href="https://github.com/yangshun" rel="noopener">GitHub</a> e no <a href="https://twitter.com/yangshunz" rel="noopener">Twitter</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como fazer o deploy de um site da web estático, gratuitamente em apenas 3 minutos, diretamente do Google Drive usando o Fast.io ]]>
                </title>
                <description>
                    <![CDATA[ Neste artigo, eu mostrarei como implementar um site da web estático, gratuitamente em apenas 3 minutos, utilizando serviços de armazenamento na nuvem como o Google Drive ou o Dropbox. Não – não fui pago nem pelo fast.io, nem pelo freeCodeCamp para fazer este artigo. Não tenho nenhum tipo de relação ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-fazer-o-deploy-de-um-site-da-web-estatico-gratuitamente-em-apenas-3-minutos-diretamente-do-google-drive-usando-o-fast-io/</link>
                <guid isPermaLink="false">633786c3ffecac05daeb5aba</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento para a Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Dairenkon Majime Rezende de Souza ]]>
                </dc:creator>
                <pubDate>Wed, 28 Dec 2022 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/how-to-deploy-a-static-website-for-free-in-only-3-minutes-with-google-drive-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-deploy-a-static-website-for-free-in-only-3-minutes-with-google-drive/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to deploy a static website for free in just 3 minutes straight from your Google Drive, using Fast.io</a>
      </p><p>Neste artigo, eu mostrarei como implementar um site da web estático, gratuitamente em apenas 3 minutos, utilizando serviços de armazenamento na nuvem como o Google Drive ou o Dropbox.</p><p>Não – não fui pago nem pelo fast.io, nem pelo freeCodeCamp para fazer este artigo. Não tenho nenhum tipo de relação com eles. Só estou escrevendo este artigo porque achei a ferramenta deles incrível e útil para hospedar sites da web estáticos e de graça.</p><p>Observação: as informações deste tutorial estão desatualizadas, mas o artigo fica aqui para a posterioridade. <a href="https://www.freecodecamp.org/portuguese/news/search?query=sites">Veja alguns artigos dos quais que você talvez goste</a> com tópicos similares.</p><h2 id="o-que-o-fast-io"><strong>O que é o Fast.io?</strong></h2><p>O fast.io é uma solução criada pela Mediafire para simplificar o modo como a web funciona. Em poucas palavras, o objetivo deles é deixar sua vida mais fácil, tornando a web mais acessível e gerenciável.</p><p>Ele foi lançado ao final de 2019. Estou compartilhando com você agora.</p><h2 id="como-funciona"><strong>Como funciona</strong></h2><p>Ao usar o Fast.io, você poderá se conectar com a nuvem (pelo Google Drive, Dropbox, entre outros), escolher o nome do seu site da web e fazer o deploy do seu conteúdo, tudo isso em apenas alguns cliques.</p><p>Se o conteúdo estiver pronto, são precisos apenas 3 minutos para colocar seu conteúdo on-line e torná-lo acessível para qualquer pessoa.</p><p>Uma vez que seu site da web estiver on-line, você pode configurá-lo, adicionar um domínio customizado e se conectar com o Google Analytics. Assim, você poderá saber quantas pessoas você está atingindo.</p><p>Eu não tinha mencionado isso antes, mas o serviço atualiza automaticamente seu site quando você modifica os arquivos fontes. Por exemplo, se você estiver usando o Google Drive para compartilhar seu conteúdo, seu site será atualizado quando você modificar algo na sua página HTML.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-how-it-works.png" class="kg-image" alt="fast-io-how-it-works" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/fast-io-how-it-works.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-how-it-works.png 664w" width="664" height="503" loading="lazy"><figcaption>Fast.io - <a href="https://fast.io/">Como funciona</a></figcaption></figure><h3 id="provedores-de-armazenamento-dispon-veis">Provedores de armazenamento disponíveis</h3><p>Aqui está uma lista de provedores de armazenamento que eu usaria se eu fosse publicar meu site hoje:</p><ul><li>GitHub</li><li>Dropbox</li><li>Google Drive</li><li>Box</li><li>Mediafire</li><li>OneDrive</li></ul><p>Como você pode imaginar, essa lista crescerá à medida que novos serviços forem aparecendo. Porém, mesmo hoje, você tem uma variedade de possibilidades para hospedar seu site da web estático.</p><h2 id="concorr-ncia"><strong>Concorrência</strong></h2><p>Já existem algumas empresas que permitem que você coloque rapidamente um site da web estático on-line. As soluções mais famosas são o GitHub Pages, o Heroku e o Netlify.</p><p>Não estou dizendo que o Fast.io é necessariamente o melhor, mas eu gosto da simplicidade do processo de fazer o deploy de um site básico.</p><p>Recado rápido: se você quer fazer o deploy de algo mais complexo – como um site em Python Flask – não poderá utilizar o Fast.io. Nesse caso, eu recomendo fortemente usar o Heroku.</p><p>Como eu disse anteriormente, serei sincero com você. O fast.io é um excelente serviço para determinadas tarefas.</p><h2 id="o-que-um-site-da-web-est-tico"><strong>O que é um site da web estático?</strong></h2><p>Antes de mostrar como fazer o deploy de seu site, acho que seja essencial definir o que é um site da web estático e o que o diferencia de um site dinâmico.</p><p>Um site da web estático contém conteúdos fixos em páginas da web. O conteúdo da sua página está em HTML e todos os usuários vêm a mesma coisa.</p><p>Por exemplo, você pode utilizar esse tipo de site para construir uma landing page (uma página básica com informações do seu produto).</p><p>A principal diferença entre um site da web estático e um dinâmico é, obviamente, a parte dinâmica!</p><p>Um site dinâmico utiliza uma tecnologia de servidores para construir a página quando o usuário faz uma requisição.</p><p>Por exemplo, você pode utilizar esse tipo para seu blog. Toda vez que você adicionar um novo artigo em seu banco de dados, o site da web vai mostrá-lo.</p><h2 id="chegou-o-momento-de-fazer-o-deploy-do-seu-site"><strong>Chegou o momento de fazer o deploy do seu site</strong></h2><p>Você está pronto para compartilhar sua página com todo mundo? Vamos lá!</p><p>Nesta parte, eu mostrarei como colocar seu site da web on-line em poucos cliques. Eu utilizarei uma página de HTML básica, mas, uma vez que você entender como o fast.io funciona, você poderá modificar o que quiser.</p><h3 id="1-criando-um-arquivo-index-html"><strong>1) Criando um arquivo index.html</strong></h3><p>Você precisa criar um arquivo index.html com seu código HTML dentro. Eu recomendo que você comece com algo simples, porque você sempre pode atualizar depois.</p><p>Salve o arquivo no seu computador.</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;My Static Website&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;My Static Website&lt;/h1&gt;
    &lt;p&gt;
      Hello, I'm online, and everyone can see me!
    &lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre><figcaption>Exemplo de um arquivo index.html - mantivemos os textos em inglês porque, mais tarde, uma imagem mostrará o conteúdo do site</figcaption></figure><h3 id="2-abra-a-p-gina-inicial-do-fast-io"><strong>2) Abra a página inicial do fast.io</strong></h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-homepage.png" class="kg-image" alt="fast-io-homepage" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/fast-io-homepage.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/11/fast-io-homepage.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-homepage.png 1153w" sizes="(min-width: 720px) 720px" width="1153" height="877" loading="lazy"><figcaption>Página inicial do <a href="https://fast.io/">fast.io</a></figcaption></figure><p>Tudo que você precisa para começar com o Fast.io é abrir o site. Quando tiver feito isso, clique em <strong><strong>"Sign up now - it's free!"</strong></strong> (Inscreva-se agora – é de graça!).</p><h3 id="3-configure-seu-google-drive"><strong>3) Configure seu Google Drive</strong></h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-storage-provider.png" class="kg-image" alt="fast-io-storage-provider" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/fast-io-storage-provider.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-storage-provider.png 822w" sizes="(min-width: 720px) 720px" width="822" height="770" loading="lazy"><figcaption>Fast.io - Provedor de armazenamento</figcaption></figure><p>Essa página aparecerá após o segundo passo, permitindo que você selecione um provedor de armazenamento. Selecione <strong>"Google Drive"</strong>.</p><p>Se você quiser criar um site com outro provedor, você pode fazer isso depois adicionando o provedor na página da sua conta.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-connect-google-drive.png" class="kg-image" alt="fast-io-connect-google-drive" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/fast-io-connect-google-drive.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-connect-google-drive.png 807w" sizes="(min-width: 720px) 720px" width="807" height="790" loading="lazy"><figcaption>Fast.io - Conecte-se com o Google Drive</figcaption></figure><p>O fast.io precisará acessar a sua conta do Google Drive para funcionar. Ele criará uma pasta chamada "Fast.io", que conterá seus sites. Clique em <strong><strong>"Connect Google Drive Now"</strong> </strong>(Conectar-se ao Google Drive agora).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-select-google-account.png" class="kg-image" alt="fast-io-select-google-account" width="474" height="586" loading="lazy"><figcaption>Fast.io - Selecione sua conta do Google</figcaption></figure><p>Você precisará <strong>selecionar sua conta do Google</strong> para se conectar ao Fast.io.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-allow-google.png" class="kg-image" alt="fast-io-allow-google" width="474" height="742" loading="lazy"><figcaption>Fast.io - Permita que o Fast.io acesse seu Google Drive</figcaption></figure><p><strong>Autorize o Fast.io a acessar sua conta do Google</strong>, para se conectar corretamente.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-create-account.png" class="kg-image" alt="fast-io-create-account" width="599" height="648" loading="lazy"><figcaption>Fast.io - Crie sua conta</figcaption></figure><p>Sua conta está pronta. Portanto, escolha uma senha e <strong>clique em "Create Account" </strong>(Criar conta). </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-welcome.png" class="kg-image" alt="fast-io-welcome" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/fast-io-welcome.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-welcome.png 684w" width="684" height="536" loading="lazy"><figcaption>Fast.io - Página de boas-vindas</figcaption></figure><p>Depois de seguir os últimos passos, uma página dizendo "Welcome to Fast!" &nbsp;(Boas-vindas ao Fast!) aparecerá.<strong> Clique em "Let's Begin!" </strong>(Vamos começar).</p><h3 id="4-crie-seu-site-da-web"><strong>4) Crie seu site da web</strong></h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-add-new-website.png" class="kg-image" alt="fast-io-add-new-website" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/fast-io-add-new-website.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-add-new-website.png 764w" sizes="(min-width: 720px) 720px" width="764" height="585" loading="lazy"><figcaption>Fast.io - Painel</figcaption></figure><p>Agora, tudo pronto para criar seu site e compartilhar com todo mundo! <strong>Clique em "Add New Site" </strong>(Adicionar um site novo).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-website-name.png" class="kg-image" alt="fast-io-website-name" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/fast-io-website-name.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-website-name.png 764w" sizes="(min-width: 720px) 720px" width="764" height="336" loading="lazy"><figcaption>Fast.io - Selecione um nome para o site</figcaption></figure><p><strong>Escolha o nome do seu site e coloque-o</strong> na barra de entrada. Quando tiver terminado, <strong>clique em "Next" </strong>(Avançar).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-select-website-type.png" class="kg-image" alt="fast-io-select-website-type" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/fast-io-select-website-type.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-select-website-type.png 756w" sizes="(min-width: 720px) 720px" width="756" height="669" loading="lazy"><figcaption>Fast.io - Selecione um tipo de site</figcaption></figure><p>O fast.io permite que você crie três tipos de sites: um site para o compartilhamento de arquivos, uma página da web ou um buscador de arquivos.</p><p>No nosso caso, selecionaremos "<strong>Web Pages</strong>" (páginas da web), pois queremos hospedar uma página da web em HTML.</p><p>Se, posteriormente, você quiser criar um site da web para compartilhar documentos, terá de voltar ao seu painel, criar outro site e selecionar <strong>File Downloads</strong> (download de arquivos).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-select-google-drive.png" class="kg-image" alt="fast-io-select-google-drive" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/fast-io-select-google-drive.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-select-google-drive.png 737w" sizes="(min-width: 720px) 720px" width="737" height="682" loading="lazy"><figcaption>Fast.io - Selecione um provedor de armazenamento para seu site</figcaption></figure><p>Uma vez selecionada a opção "Web Pages", você precisará selecionar seu provedor de armazenamento. <strong>Clique em "Google Drive"</strong>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-select-url.png" class="kg-image" alt="fast-io-select-url" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/fast-io-select-url.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-select-url.png 765w" sizes="(min-width: 720px) 720px" width="765" height="318" loading="lazy"><figcaption>Fast.io - Selecione o URL do seu site</figcaption></figure><p><strong>Escolha o URL do seu site e escreva-o </strong>no local indicado. Quando tiver finalizado, <strong>clique em "Create Site" </strong>(Criar site).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-success.png" class="kg-image" alt="fast-io-success" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/fast-io-success.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-success.png 763w" sizes="(min-width: 720px) 720px" width="763" height="451" loading="lazy"><figcaption>Fast.io - site da web criado com sucesso!</figcaption></figure><p>Você conseguiu! Seu site está on-line e disponível no URL que você escolheu! No meu caso, você pode encontrar meu site em <a href="https://mygoogledrivewebsite.imfast.io/">mygoogledrivewebsite.imfast.io</a>.</p><blockquote>Nota do tradutor: o site com o link acima já não está mais disponível on-line.</blockquote><h3 id="5-carregue-seu-index-html"><strong>5) Carregue seu index.html</strong></h3><p>Se você abrir seu site, poderá notar um erro, pois você não carregou seu arquivo index.html no seu Google Drive.</p><p>Aqui estão duas maneiras de se fazer isso:</p><ul><li><strong>Abra seu Google Drive e pesquise pela pasta Fast.io</strong>. Depois, busque a pasta do seu site (no meu caso, "mygoogledrivewebsite.imfast.io").</li><li>Na página de sucesso da etapa 4, <strong>clique em "See your Google Drive" </strong>(Ver o seu Google Drive).</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-google-drive-upload.png" class="kg-image" alt="fast-io-google-drive-upload" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/fast-io-google-drive-upload.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-google-drive-upload.png 827w" sizes="(min-width: 720px) 720px" width="827" height="394" loading="lazy"><figcaption>Fast.io - Google Drive antes do upload</figcaption></figure><p>Quando tiver feito isso, <strong>clique com o botão direito do seu mouse e selecione "Upload files" </strong>(Upload de arquivos). Uma nova janela vai se abrir. Então, <strong>encontre seu arquivo "index.html" e selecione-o</strong>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-google-drive.png" class="kg-image" alt="fast-io-google-drive" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/fast-io-google-drive.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-google-drive.png 827w" sizes="(min-width: 720px) 720px" width="827" height="160" loading="lazy"><figcaption>Fast.io - Google Drive após o upload</figcaption></figure><p>Aguarde um pouco para as alterações aparecerem no seu site.</p><h3 id="6-comemore-"><strong>6) Comemore!</strong></h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-website-demo.png" class="kg-image" alt="fast-io-website-demo" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/fast-io-website-demo.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/fast-io-website-demo.png 788w" sizes="(min-width: 720px) 720px" width="788" height="154" loading="lazy"><figcaption>Fast.io - Site da web de demonstração</figcaption></figure><p>Compartilhe com seus amigos! Seu site da web está ativo e todo mundo pode acessá-lo!</p><p><a href="https://ctt.ac/Me7Uk">Compartilhe no Twitter clicando aqui</a>!</p><h3 id="b-nus">Bônus</h3><p><br>Se você estiver curioso e se quiser mexer nas configurações, poderá voltar no seu painel e clicar em seu site. Você poderá vincular seu site ao Google Analytics (estatísticas de visitantes), mudar o nome de domínio (por exemplo, para meusitenaweb.com) e muito mais!</p><h2 id="conclus-o"><br>Conclusão</h2><p><br>O que você acha desse novo serviço? Achou rápido e fácil? </p><p>Sinta-se à vontade para compartilhar este artigo, caso tenha gostado. </p><p>Se quiser mais conteúdos como este, <a href="https://twitter.com/gaelgthomas/">você pode seguir o autor no Twitter</a>, onde ele fala sobre desenvolvimento para web, autoaperfeiçoamento e sua jornada como desenvolvedor full-stack!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como fazer uma aplicação incrível de gerenciamento de estoque em PHP e MySQL ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Richard [https://medium.com/@chensformers] Você não precisa de software corporativo inchado para rastrear seu estoque com eficiência. Este tutorial ajudará você a desenvolver sua própria aplicação de rastreamento de estoque personalizada para que você possa tomar decisões de inventário inteligentes com base em dados de estoque precisos e oportunos. Requisitos ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-fazer-uma-aplicacao-incrivel-de-gerenciamento-de-estoque-em-php-e-mysql/</link>
                <guid isPermaLink="false">63018b7b714c9406b66275a9</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento para a Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Tue, 06 Dec 2022 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/1_D8DAUz3T2nustjr2Pnn6QQ.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/making-an-awesome-inventory-management-application-in-php-and-mysql-from-start-to-finish-90bc5996680a/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Make an Awesome Inventory Management Application in PHP and MySQL</a>
      </p><p>Escrito por: <a href="https://medium.com/@chensformers">Richard</a></p><p>Você não precisa de software corporativo inchado para rastrear seu estoque com eficiência. Este tutorial ajudará você a desenvolver sua própria aplicação de rastreamento de estoque personalizada para que você possa tomar decisões de inventário inteligentes com base em dados de estoque precisos e oportunos.</p><h3 id="requisitos-do-sistema">Requisitos do sistema</h3><p>Nosso sistema de estoque requer a licença comercial padrão do phpGrid e do phpChart. Ele precisa de alguns recursos avançados de ambos os componentes.</p><ul><li>PHP 5.6+(<strong>PHP 7.x é agora altamente recomendado!</strong>)</li><li>MySQL / MariaDB</li><li>phpGrid Lite (subgrid) -ou- phpGrid Enterprise (Master detail, Grouping)</li><li>phpChart (para relatórios)</li></ul><h3 id="o-que-um-sistema-de-gerenciamento-de-estoque">O que é um sistema de gerenciamento de estoque</h3><p>Também conhecido como sistema de gerenciamento de inventário, esse sistema tem vários componentes críticos. Em sua essência, o controle de estoque funciona rastreando as duas principais funções de um armazém: recebimento (entrada) e expedição (saída). Outras atividades, como a movimentação ou a realocação de estoque, também ocorrem. As matérias-primas são decrementadas e os produtos acabados são incrementados.</p><ul><li>Remessas recebidas</li><li>Pedidos enviados</li><li>Estoque</li><li>Fornecedores</li><li><a href="https://medium.com/@chensformers/inventory-management-system-with-barcode-scanner-in-php-a-definitive-guide-d18fdc165511" rel="noopener">Leitor de código de barras</a> (atualização de janeiro de 2019)</li></ul><h3 id="projeto-de-banco-de-dados-do-sistema-de-estoque">Projeto de banco de dados do sistema de estoque</h3><p>Normalmente, um sistema de estoque tem quatro elementos básicos: produtos, compras, pedidos e fornecedores. Cada elemento deve ser rastreado com base em sua localização, <em>SKU</em> (sigla de <em>Stock Keeping Unit</em> – unidade de manutenção de estoque, em português) e quantidade. O estoque atual (os produtos disponíveis) é atualizado rastreando as remessas recebidas e os pedidos enviados. Os alertas de pedidos podem ser configurados para serem acionados quando os níveis de estoque ficarem abaixo dos níveis mínimos definidos pelo cliente.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/ZH5FJWHyUxVNeNFNMqOKPwde7lqBS5Lwvtkp.png" class="kg-image" alt="ZH5FJWHyUxVNeNFNMqOKPwde7lqBS5Lwvtkp" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/10/ZH5FJWHyUxVNeNFNMqOKPwde7lqBS5Lwvtkp.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/10/ZH5FJWHyUxVNeNFNMqOKPwde7lqBS5Lwvtkp.png 800w" sizes="(min-width: 720px) 720px" width="800" height="503" loading="lazy"></figure><h3 id="configurando-o-banco-de-dados-do-gerenciador-de-estoque">Configurando o banco de dados do gerenciador de estoque</h3><p>Baixe o script de SQL <code><strong>InventoryManager.sql</strong></code> do <a href="https://github.com/phpcontrols/inventory-manager">repositório do GitHub</a> deste tutorial e execute o script usando uma ferramenta de MySQL, como o <a href="https://www.mysql.com/products/workbench/">MySQL Workbench</a>. Isso criará um banco de dados chamado <code><strong>InventoryManager</strong></code>, bem como as tabelas necessárias para este tutorial.</p><h3 id="uma-nota-sobre-o-zenbase">Uma nota sobre o ZenBase</h3><pre><code>O sistema de gerenciamento de estoque é um dos muitos modelos de aplicações disponíveis no ZenBase (construído sobre o phpGrid) para qualquer pessoa – com ou sem habilidades em programação – usar e personalizar para suas próprias necessidades.</code></pre><h3 id="configurar-phpgrid">Configurar phpGrid</h3><p>Vamos continuar.</p><p>Usaremos um componente de <em>datagrid</em> (em português, grade de dados) do <a href="https://phpgrid.com/">phpGrid</a> para lidar com todas as operações <strong>CRUD (Criar, Remover, Atualizar e Excluir)</strong> do banco de dados interno.</p><p>Não se esqueça de <a href="https://phpgrid.com/download/">baixar uma cópia do phpGrid</a> antes de continuar.</p><p>Para instalar o phpGrid, siga estes passos:</p><ol><li>Descompacte o arquivo de download do phpGrid.</li><li>Carregue a pasta <code><strong>phpGrid</strong></code> para a pasta do phpGrid.</li><li>Conclua a instalação configurando o arquivo <strong><code>conf.php</code></strong>.</li></ol><p>Antes de começarmos, devemos incluir as seguintes informações no arquivo <code><strong>conf.php</strong></code> de configuração do phpGrid.</p><pre><code class="language-php">define('PHPGRID_DB_HOSTNAME', 'localhost'); //  nome do host
define('PHPGRID_DB_USERNAME', 'root'); // nome de usuário do banco de dados
define('PHPGRID_DB_PASSWORD', ''); // senha do banco de dados
define('PHPGRID_DB_NAME', 'InventoryManager'); // nome do banco de dados do gerenciador de estoque
define('PHPGRID_DB_TYPE', 'mysql'); // tipo de banco de dados
define('PHPGRID_DB_CHARSET','utf8'); // sempre 'utf8' no MySQL</code></pre><h3 id="criando-a-interface-de-usu-rio-ui-">Criando a interface de usuário (UI)</h3><p>Nosso sistema de inventário é composto por quatro páginas (nomes em inglês, seguidos pela respectiva tradução):</p><ul><li>Current Inventory (Estoque atual)</li><li>Incoming Purchases (Compras recebidas)</li><li>Outgoing Orders (Encomendas a enviar)</li><li>Reports (Relatórios)</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/5AWVXClN4dV5xDNjuSOuNyHn2iJWDJ3Xu4PL.png" class="kg-image" alt="5AWVXClN4dV5xDNjuSOuNyHn2iJWDJ3Xu4PL" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/10/5AWVXClN4dV5xDNjuSOuNyHn2iJWDJ3Xu4PL.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/10/5AWVXClN4dV5xDNjuSOuNyHn2iJWDJ3Xu4PL.png 800w" sizes="(min-width: 720px) 720px" width="800" height="574" loading="lazy"></figure><h3 id="menus">Menus</h3><p>O arquivo de inclusão do menu é armazenado em uma pasta <code><strong>inc</strong></code> com o nome &nbsp;de <code><strong>menu.php</strong></code>. O código para o menu é simples. Por uma questão de foco, não entraremos em grandes detalhes. Sinta-se à vontade para olhar o código dentro da pasta <code><strong><a href="https://github.com/phpcontrols/inventory-manager/tree/master/inc">inc</a></strong></code>.</p><p>Também adicionamos um item de menu chamado <code>Reports</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/nL2WOBl0IY3-KmkHLxyWenxsQ5CmYZcKTC-k.png" class="kg-image" alt="nL2WOBl0IY3-KmkHLxyWenxsQ5CmYZcKTC-k" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/10/nL2WOBl0IY3-KmkHLxyWenxsQ5CmYZcKTC-k.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/10/nL2WOBl0IY3-KmkHLxyWenxsQ5CmYZcKTC-k.png 800w" sizes="(min-width: 720px) 720px" width="800" height="61" loading="lazy"></figure><h3 id="p-ginas">Páginas</h3><p>Usaremos o mesmo modelo de página que usamos para os tutoriais de <a href="https://phpgrid.com/example/build-first-simple-crm-scratch/">CRM</a> e <a href="https://phpgrid.com/example/build-project-management-application-scratch/">gerenciamento de projetos</a>.</p><h4 id="current-inventory-estoque-atual-">Current Inventory (Estoque atual)</h4><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/AVz5Mdch-aEydKuRqCNgKCUz24E7XCreeaIM.jpg" class="kg-image" alt="AVz5Mdch-aEydKuRqCNgKCUz24E7XCreeaIM" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/10/AVz5Mdch-aEydKuRqCNgKCUz24E7XCreeaIM.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/10/AVz5Mdch-aEydKuRqCNgKCUz24E7XCreeaIM.jpg 800w" sizes="(min-width: 720px) 720px" width="800" height="533" loading="lazy"></figure><p>Vamos começar com a página do estoque atual, <em>Current Inventory</em>.</p><p>As compras recebidas aumentam o estoque, enquanto os pedidos de saída o diminuem. De uma perspectiva mestre-detalhe, o Current Inventory não tem uma, mas duas grades de dados (<em>datagrids</em>, em inglês) de detalhes – <strong>Purchases</strong> (compras recebidas) e <strong>Orders</strong> (pedidos de saída).</p><p>Assim, a página <em>Current Inventory</em> é composta por uma grade mestre (o estoque atual) e duas grades de detalhes (<em>Incoming Purchases</em> e <em>Outgoing Orders</em>). Podemos apresentar facilmente esses relacionamentos usando o recurso &nbsp;do phpGrid de uma grade de dados mestre com várias grades de dados de detalhes.</p><h3 id="phpgrid-lite-professional-e-enterprise">phpGrid Lite Professional e Enterprise</h3><blockquote><strong>Os recursos de agrupamento e detalhes mestre requerem a versão Professional ou Enterprise do phpGrid. Se você está na versão gratuita Lite, ainda pode usar o <a href="https://phpgrid.com/documentation/set_subgrid/" rel="noopener"><em>subgrid</em></a> no lugar dos detalhes mestre, apesar de o <em>subgrid</em> ser menos avançado. As versões Professional ou Enterprise são altamente recomendadas.</strong></blockquote><p>Se você já leu o tutorial <a href="https://medium.com/@chensformers/a-step-by-step-guide-to-building-a-donation-manager-from-scratch-in-php-part-i-514a7d34ee82" rel="noopener">Building a Donation Manager from Scratch</a> (em inglês), não terá problemas em seguir o código abaixo.</p><p>Observe o uso da função <a href="https://phpgrid.com/documentation/set_col_format/" rel="noopener">set_col_format()</a> (em inglês) para formatar os números inteiros.</p><pre><code class="language-php">$dgProd = new C_DataGrid('SELECT * FROM products', 'id', 'products');
$dgProd-&gt;set_col_hidden('id', false);
$dgProd-&gt;enable_autowidth(true)-&gt;set_dimension('auto', '200px')-&gt;set_pagesize(100);

$dgProd-&gt;set_col_title('ProductName', 'Name');
$dgProd-&gt;set_col_title('PartNumber', 'Part Number');
$dgProd-&gt;set_col_title('ProductLabel', 'Label');
$dgProd-&gt;set_col_title('StartingInventory', 'Starting Inventory');
$dgProd-&gt;set_col_title('InventoryReceived', 'Inventory Received');
$dgProd-&gt;set_col_title('InventoryShipped', 'Inventory Shipped');
$dgProd-&gt;set_col_title('InventoryOnHand', 'Inventory On Hand');
$dgProd-&gt;set_col_title('MinimumRequired', 'Minimum Required');

$dgProd-&gt;set_col_format('StartingInventory', 'integer', array('thousandsSeparator'=&gt;',', 'defaultValue'=&gt;'0'));
$dgProd-&gt;set_col_format('InventoryReceived', 'integer', array('thousandsSeparator'=&gt;',', 'defaultValue'=&gt;'0'));
$dgProd-&gt;set_col_format('InventoryShipped', 'integer', array('thousandsSeparator'=&gt;',', 'defaultValue'=&gt;'0'));
$dgProd-&gt;set_col_format('InventoryOnHand', 'integer', array('thousandsSeparator'=&gt;',', 'defaultValue'=&gt;'0'));
$dgProd-&gt;set_col_format('MinimumRequired', 'integer', array('thousandsSeparator'=&gt;',', 'defaultValue'=&gt;'0'));
$dgProd-&gt;enable_edit('FORM');</code></pre><p>Isso é tudo para a grade de dados de Current Inventory. Aqui está a aparência até agora:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/z4aLzzcqepAfvKzy8SgY-hpYfAkRjh6NAbDE.png" class="kg-image" alt="z4aLzzcqepAfvKzy8SgY-hpYfAkRjh6NAbDE" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/10/z4aLzzcqepAfvKzy8SgY-hpYfAkRjh6NAbDE.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/10/z4aLzzcqepAfvKzy8SgY-hpYfAkRjh6NAbDE.png 800w" sizes="(min-width: 720px) 720px" width="800" height="217" loading="lazy"></figure><p>Agora, vamos fazer algumas alterações para melhorar nossa grade de dados de produtos, <strong>Products</strong>.</p><p>Em primeiro lugar, adicionaremos uma formatação condicional: sempre que o estoque disponível, <strong><strong>InventoryOnHand</strong></strong>, for definido como zero ou um valor negativo, ele será exibido usando uma cor de fundo diferente. Usaremos a função <a href="https://phpgrid.com/documentation/set_conditional_format/">set_conditional_format()</a> para esse propósito.</p><pre><code class="language-php"> $dgProd-&gt;set_conditional_format(
    'InventoryOnHand', 'CELL',
        array("condition"=&gt;"lt",
          "value"=&gt;"1",
          "css"=&gt; array("color"=&gt;"red","background-color"=&gt;"#DCDCDC")));</code></pre><p>O código acima adiciona uma condição de exibição para que, sempre que o campo <code>InventoryOnHand</code> tiver um valor menor que (<code>lt</code>) um, a cor do texto mude para <code>red</code> e a cor de fundo para cinza escuro (<code>#DCDCDC</code>).</p><p>Em segundo lugar, sempre que <code>InventoryOnHand</code> for menor que o valor mostrado em <code>MinimumRequired</code>, gostaríamos de alertar o usuário com uma cor de fundo proeminente, como ouro. Para comparar valores entre dois campos, devemos mudar para Javascript porque a função <a href="https://phpgrid.com/documentation/set_conditional_format/">set_conditional_format()</a> só funciona com um único campo.</p><p>O código abaixo usa um laço <code>for</code> para iterar em cada linha na grade de dados <strong><strong>Products</strong></strong>.<strong><strong> </strong></strong>Ele compara o <code>inventoryOnHand</code> com o <code>minimumRequired</code> e, quando a condição for atendida, usará a função <code>setCell</code> para alterar a cor do plano de fundo.</p><pre><code>$onGridLoadComplete = &lt;&lt;&lt;ONGRIDLOADCOMPLETE
function(status, rowid)
{
    var ids = jQuery("#products").jqGrid('getDataIDs');
    for (var i = 0; i &lt; ids.length; i++)
    {
        var rowId = ids[i];
        var rowData = jQuery('#products').jqGrid ('getRowData', rowId);

        var inventoryOnHand = $("#products").jqGrid("getCell", rowId, "InventoryOnHand");
        var minimumRequired = $("#products").jqGrid("getCell", rowId, "MinimumRequired");

        // compare two dates and set custom display in another field "status"
        console.log(inventoryOnHand + " | " + minimumRequired);
        if(parseInt(inventoryOnHand) &lt; parseInt(minimumRequired)){

            $("#products").jqGrid("setCell", rowId, "PartNumber", '', {'background-color':'gold'});

        }
    }

}
ONGRIDLOADCOMPLETE;
$dgProd-&gt;add_event("jqGridLoadComplete", $onGridLoadComplete);</code></pre><p>Você pode aprender mais sobre como <a href="https://phpgrid.uservoice.com/knowledgebase/articles/909546-conditional-format-compare-two-cells">comparar vários valores de células</a> no site de suporte do phpGrid (em inglês).</p><p>Em seguida, na mesma página, precisamos ver as compras recebidas (<strong><strong>Incoming</strong></strong>) e os pedidos de saída (<strong><strong>Outgoing</strong></strong>) para um produto específico.</p><h4 id="grade-de-detalhes-de-compras-incoming-">Grade de detalhes de compras (Incoming)</h4><pre><code class="language-php">// Grade de detalhes de compras
$dgPur = new C_DataGrid('SELECT id, PurchaseDate, ProductId, NumberReceived, SupplierId FROM purchases', 'id', 'purchases');
$dgPur-&gt;set_col_hidden('id', false)-&gt;set_caption('Incoming Purchases');
$dgPur-&gt;set_col_edittype('ProductId', 'select', "select id, ProductLabel from products");
$dgPur-&gt;set_col_edittype('SupplierId', 'select', "select id, supplier from suppliers");
$dgPur-&gt;set_dimension('800px');</code></pre><h4 id="grade-de-detalhes-de-pedidos-outgoing-">Grade de detalhes de pedidos (Outgoing)</h4><pre><code class="language-php">// Grade de detalhes dos pedidos
$dgOrd = new C_DataGrid('SELECT id, OrderDate, ProductId, NumberShipped, First, Last FROM orders', 'id', 'orders');
$dgOrd-&gt;set_sortname('OrderDate', 'DESC')-&gt;set_caption('Outgoing Orders');
$dgOrd-&gt;set_col_hidden('id', false);
$dgOrd-&gt;set_col_edittype('ProductId', 'select', "select id, ProductLabel from products");
$dgOrd-&gt;set_dimension('800px');</code></pre><p>As duas grades de detalhes usam a mesma chave estrangeira <code>ProductId</code> para vincular à grade de dados mestre (<strong>Products</strong>).</p><pre><code class="language-php">$dgProd-&gt;set_masterdetail($dgPur, 'ProductId', 'id');
$dgProd-&gt;set_masterdetail($dgOrd, 'ProductId', 'id');</code></pre><p>Finalmente, nosso código completo para gerenciar a página <strong>Current Inventory</strong> é:</p><pre><code class="language-php">$dgProd = new C_DataGrid('SELECT * FROM products', 'id', 'products');
$dgProd-&gt;set_col_hidden('id', false);
$dgProd-&gt;enable_autowidth(true)-&gt;set_dimension('auto', '200px')-&gt;set_pagesize(100);

$dgProd-&gt;set_col_title('ProductName', 'Name');
$dgProd-&gt;set_col_title('PartNumber', 'Part Number');
$dgProd-&gt;set_col_title('ProductLabel', 'Label');
$dgProd-&gt;set_col_title('StartingInventory', 'Starting Inventory');
$dgProd-&gt;set_col_title('InventoryReceived', 'Inventory Received');
$dgProd-&gt;set_col_title('InventoryShipped', 'Inventory Shipped');
$dgProd-&gt;set_col_title('InventoryOnHand', 'Inventory On Hand');
$dgProd-&gt;set_col_title('MinimumRequired', 'Minimum Required');

$dgProd-&gt;set_col_format('StartingInventory', 'integer', array('thousandsSeparator'=&gt;',', 'defaultValue'=&gt;'0'));
$dgProd-&gt;set_col_format('InventoryReceived', 'integer', array('thousandsSeparator'=&gt;',', 'defaultValue'=&gt;'0'));
$dgProd-&gt;set_col_format('InventoryShipped', 'integer', array('thousandsSeparator'=&gt;',', 'defaultValue'=&gt;'0'));
$dgProd-&gt;set_col_format('InventoryOnHand', 'integer', array('thousandsSeparator'=&gt;',', 'defaultValue'=&gt;'0'));
$dgProd-&gt;set_col_format('MinimumRequired', 'integer', array('thousandsSeparator'=&gt;',', 'defaultValue'=&gt;'0'));

$dgProd-&gt;set_conditional_format('InventoryOnHand', 'CELL', array("condition"=&gt;"lt",
                                                  "value"=&gt;"1",
                                                  "css"=&gt; array("color"=&gt;"red","background-color"=&gt;"#DCDCDC")));

$onGridLoadComplete = &lt;&lt;&lt;ONGRIDLOADCOMPLETE
function(status, rowid)
{
    var ids = jQuery("#products").jqGrid('getDataIDs');
    for (var i = 0; i &lt; ids.length; i++)
    {
        var rowId = ids[i];
        var rowData = jQuery('#products').jqGrid ('getRowData', rowId);

        var inventoryOnHand = $("#products").jqGrid("getCell", rowId, "InventoryOnHand");
        var minimumRequired = $("#products").jqGrid("getCell", rowId, "MinimumRequired");

        // compare two dates and set custom display in another field "status"
        console.log(inventoryOnHand + " | " + minimumRequired);
        if(parseInt(inventoryOnHand) &lt; parseInt(minimumRequired)){

            $("#products").jqGrid("setCell", rowId, "PartNumber", '', {'background-color':'gold'});

        }
    }

}
ONGRIDLOADCOMPLETE;

$dgProd-&gt;add_event("jqGridLoadComplete", $onGridLoadComplete);
$dgProd-&gt;enable_edit('FORM');

// Purchases detail grid
$dgPur = new C_DataGrid('SELECT id, PurchaseDate, ProductId, NumberReceived, SupplierId FROM purchases', 'id', 'purchases');
$dgPur-&gt;set_col_hidden('id', false)-&gt;set_caption('Incoming Purchases');
$dgPur-&gt;set_col_edittype('ProductId', 'select', "select id, ProductLabel from products");
$dgPur-&gt;set_col_edittype('SupplierId', 'select', "select id, supplier from suppliers");
$dgPur-&gt;set_dimension('800px');

// Orders detail grid
$dgOrd = new C_DataGrid('SELECT id, OrderDate, ProductId, NumberShipped, First, Last FROM orders', 'id', 'orders');
$dgOrd-&gt;set_sortname('OrderDate', 'DESC')-&gt;set_caption('Outgoing Orders');
$dgOrd-&gt;set_col_hidden('id', false);
$dgOrd-&gt;set_col_edittype('ProductId', 'select', "select id, ProductLabel from products");
$dgOrd-&gt;set_dimension('800px');

$dgProd-&gt;set_masterdetail($dgPur, 'ProductId', 'id');
$dgProd-&gt;set_masterdetail($dgOrd, 'ProductId', 'id');
$dgProd-&gt;display();</code></pre><p>Aqui, vemos uma captura de tela da página de estoque:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/Spe5wb7oEkaVAikkKBEJrPzQExFzFj70EZTf.png" class="kg-image" alt="Spe5wb7oEkaVAikkKBEJrPzQExFzFj70EZTf" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/10/Spe5wb7oEkaVAikkKBEJrPzQExFzFj70EZTf.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/10/Spe5wb7oEkaVAikkKBEJrPzQExFzFj70EZTf.png 800w" sizes="(min-width: 720px) 720px" width="800" height="354" loading="lazy"></figure><h3 id="compras-recebidas-incoming-purchases-">Compras recebidas (Incoming Purchases)</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/luyVRlrvSLQ10tITWdwYUHJ4A5flLdxEtuaZ.jpg" class="kg-image" alt="luyVRlrvSLQ10tITWdwYUHJ4A5flLdxEtuaZ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/10/luyVRlrvSLQ10tITWdwYUHJ4A5flLdxEtuaZ.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/10/luyVRlrvSLQ10tITWdwYUHJ4A5flLdxEtuaZ.jpg 800w" sizes="(min-width: 720px) 720px" width="800" height="600" loading="lazy"></figure><p>A próxima página é a de compras recebidas, ou <strong>Incoming Purchases</strong>. É similar à grade de detalhes de compras, <strong>Purchase Detail Grid,</strong> que nós vimos ao configurar a página de estoque atual, <strong>Current Inventory</strong>. Agrupamos as compras por <code>ProductId</code> e exibimos a soma em <code>NumberReceived</code>. Quaisquer compras recebidas vão aumentar o estoque.</p><pre><code class="language-php">$dgPur -&gt; set_group_properties('ProductId', false, true, true, false);
$dgPur -&gt; set_group_summary('NumberReceived','sum');</code></pre><blockquote><strong>Observação: o recurso de agrupamento está disponível apenas no phpGrid em suas versões Professional e Enterprise. Para filtrar sem o agrupamento, use a <a href="https://phpgrid.com/example/integrated-search/" rel="noopener">pesquisa por integração</a>.</strong></blockquote><p>O código completo:</p><pre><code class="language-php">$dgPur = new C_DataGrid('SELECT id, PurchaseDate, ProductId, NumberReceived, SupplierId FROM purchases', 'id', 'purchases');
$dgPur-&gt;set_col_hidden('id', false);

$dgPur-&gt;set_col_title('PurchaseDate', 'Date of Purchase');
$dgPur-&gt;set_col_title('ProductId', 'Product');
$dgPur-&gt;set_col_title('NumberReceived', 'Number Received');
$dgPur-&gt;set_col_title('SupplierId', 'Supplier');

$dgPur-&gt;set_col_edittype('ProductId', 'select', "select id, ProductLabel from products");
$dgPur-&gt;set_col_edittype('SupplierId', 'select', "select id, supplier from suppliers");

// $dgPur-&gt;enable_edit('FORM');
$dgPur-&gt;set_pagesize(100);

$dgPur-&gt;set_col_width('PurchaseDate', '50px');
$dgPur-&gt;set_col_width('NumberReceived', '35px');

$dgPur -&gt; set_group_properties('ProductId', false, true, true, false);
$dgPur -&gt; set_group_summary('NumberReceived','sum');

$dgPur-&gt;enable_autowidth(true);
$dgPur-&gt;display();</code></pre><p>Aqui está uma captura de tela de nossa página <strong>Incoming Purchases</strong> com o agrupamento habilitado:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/8sDg-Tnhm0s1ZH5td-xdCWokJ3oO3ulAzf-T.png" class="kg-image" alt="8sDg-Tnhm0s1ZH5td-xdCWokJ3oO3ulAzf-T" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/10/8sDg-Tnhm0s1ZH5td-xdCWokJ3oO3ulAzf-T.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/10/8sDg-Tnhm0s1ZH5td-xdCWokJ3oO3ulAzf-T.png 800w" sizes="(min-width: 720px) 720px" width="800" height="300" loading="lazy"></figure><h3 id="pedidos-enviados-outgoing-orders-">Pedidos enviados (Outgoing Orders)</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/9ymBPuuoXXvfEoCntXG-WPBxpUqIiGOpUACw.jpg" class="kg-image" alt="9ymBPuuoXXvfEoCntXG-WPBxpUqIiGOpUACw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/10/9ymBPuuoXXvfEoCntXG-WPBxpUqIiGOpUACw.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/10/9ymBPuuoXXvfEoCntXG-WPBxpUqIiGOpUACw.jpg 800w" sizes="(min-width: 720px) 720px" width="800" height="449" loading="lazy"></figure><p>A próxima página é a de pedidos enviados, <strong>Outgoing Orders</strong>. É semelhante à grade de detalhes dos pedidos, <strong>Orders Detail Grid</strong>, da página do estoque atual, <strong>Current Inventory</strong>. Aqui, apresentaremos uma função avançada chamada <a href="https://phpgrid.com/documentation/set_grid_method/" rel="noopener">set_grid_method()</a>.</p><pre><code class="language-php">$dgOrd = new C_DataGrid('SELECT id, OrderDate, ProductId, NumberShipped, First, Last FROM orders', 'id', 'orders');
$dgOrd-&gt;set_sortname('OrderDate', 'DESC');
$dgOrd-&gt;set_col_hidden('id', false);

$dgOrd-&gt;set_col_title('OrderDate', 'Order Date');
$dgOrd-&gt;set_col_title('ProductId', 'Product');
$dgOrd-&gt;set_col_title('NumberShipped', 'Number Shipped');

$dgOrd-&gt;set_col_edittype('ProductId', 'select', "select id, ProductLabel from products");

// $dgOrd-&gt;enable_edit('FORM');
$dgOrd-&gt;set_pagesize(100);

$dgOrd-&gt;set_col_width('OrderDate', '30px');
$dgOrd-&gt;set_col_width('NumberShipped', '35px');
$dgOrd-&gt;set_col_width('First', '20px');
$dgOrd-&gt;set_col_width('Last', '20px');

$dgOrd-&gt;set_grid_method('setGroupHeaders', array(
                                array('useColSpanStyle'=&gt;true),
                                'groupHeaders'=&gt;array(
                                        array('startColumnName'=&gt;'First',
                                              'numberOfColumns'=&gt;2,
                                              'titleText'=&gt;'Customer Name') )));

$dgOrd-&gt;enable_autowidth(true);
$dgOrd-&gt;display();</code></pre><h3 id="resumo">Resumo</h3><p>Este tutorial cria um sistema de estoque, simples e extensível em pouco menos de 50 linhas de código. O estilo progressivo desses tutoriais também ajuda o leitor a ficar, no fim das contas, mais familiarizado e tranquilo com o phpGrid ao apresentar um número limitado de recursos novos do phpGrid em cada um.</p><h3 id="o-que-vem-a-seguir">O que vem a seguir</h3><p>Esse é o final do código necessário para criar as grades de dados necessárias para o tutorial. Porém, ainda não terminamos. Ainda temos mais uma página que precisamos criar — a página dos relatórios, ou <em>Reports</em>. Trataremos dela em instantes.</p><p>Qual é a finalidade de um sistema de estoque sem algum tipo de relatório? Nesta seção, você aprenderá a usar o <a href="http://phpchart.com/" rel="noopener">phpChart</a> — que se integra de modo perfeito com o phpGrid — para criar relatórios que sejam visualmente agradáveis e úteis para sua aplicação de gerenciamento de estoque.</p><p>Esta será a aparência da página ao concluirmos:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/rLTmQ3BPx8zS1nbHXhPPaTDHB81SDxBrWqDE.png" class="kg-image" alt="rLTmQ3BPx8zS1nbHXhPPaTDHB81SDxBrWqDE" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/10/rLTmQ3BPx8zS1nbHXhPPaTDHB81SDxBrWqDE.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/10/rLTmQ3BPx8zS1nbHXhPPaTDHB81SDxBrWqDE.png 800w" sizes="(min-width: 720px) 720px" width="800" height="450" loading="lazy"></figure><p>Antes de iniciarmos, precisaremos instalar o phpChart. É recomendado que você obtenha a <a href="https://phpchart.com/download/" rel="noopener">versão completa do phpChart</a>, pois a versão gratuita (phpChart Lite) dá suporte apenas aos gráficos de linhas.</p><h3 id="configura-o-do-phpchart">Configuração do phpChart</h3><p>É importante que tenhamos o phpGrid e o phpChart em pastas separadas. Abaixo, vemos a hierarquia de pastas <strong>recomendada</strong>.</p><pre><code>www
+-- Donation_Manager
|   |-- phpGrid
|   |   +-- conf.php
|   |-- phpChart
|   |   +-- conf.php
|   +-- ...</code></pre><h3 id="design-do-relat-rio">Design do relatório</h3><p>Colocaremos o gráfico de pizza próximo à grade de resumo do estoque. A grade de dados fornece os dados em série para que o gráfico de pizza seja produzido.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/oBEgm5-eYi2TXN1Ay5YQ-wgwGZveIgLFZpAp.png" class="kg-image" alt="oBEgm5-eYi2TXN1Ay5YQ-wgwGZveIgLFZpAp" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/10/oBEgm5-eYi2TXN1Ay5YQ-wgwGZveIgLFZpAp.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/10/oBEgm5-eYi2TXN1Ay5YQ-wgwGZveIgLFZpAp.png 800w" sizes="(min-width: 720px) 720px" width="800" height="475" loading="lazy"></figure><h3 id="integra-o-do-phpgrid-e-do-phpchart">Integração do phpGrid e do phpChart</h3><p>Primeiro, inclua chamadas aos dois arquivos <code><strong>conf.php</strong></code> no início do código.</p><pre><code class="language-php">require_once("phpGrid/conf.php");
require_once("phpChart/conf.php");</code></pre><p>Abaixo, vemos o código completo para a criação de nosso gráfico de pizza:</p><pre><code class="language-php">$pc = new C_PhpChartX(array(array(null)), 'PieChart');
$pc-&gt;set_title(array('text'=&gt;'Current Inventory Summary'));
$pc-&gt;set_series_default(array( 'shadow'=&gt; false,
    'renderer'=&gt; 'plugin::PieRenderer',
    'rendererOptions'=&gt; array(
      'showDataLabels' =&gt; true,
      'highlightMouseOver' =&gt; true,
      'startAngle'=&gt; 180,
      'sliceMargin'=&gt; 4,
      'showDataLabels'=&gt; true )
  ));
$pc-&gt;set_legend(array('show'=&gt;true,'location'=&gt; 'w'));
// remove background
$pc-&gt;set_grid(array(
    'background'=&gt;'white',
    'borderWidth'=&gt;0,
    'borderColor'=&gt;'#000000',
    'shadow'=&gt;false));
$pc-&gt;add_custom_js("
        $('#PieChart').bind('jqplotDataHighlight',
            function (ev, seriesIndex, pointIndex, data) {
               $('#label_info').text(data);      
            }
        );
    ");
$pc-&gt;draw(660,400);</code></pre><p>Vamos ver o passo a passo do código.</p><p>A primeira linha é o construtor. Passamos <code>array(null)</code> como os dados em série, pois não queremos que os dados sejam exibidos no gráfico de pizza inicialmente. Os dados do estoque usados para fazer o gráfico ainda não estão disponíveis quando ele é inicializado pela primeira vez. Os dados serão recebidos da grade de dados mais tarde, em formato JSON.</p><p>Damos ao nosso gráfico um nome exclusivo, <code>PieChart</code>.</p><pre><code class="language-php">$pc = new C_PhpChartX(array(array(null)), 'PieChart');</code></pre><p>Em seguida, damos a ele um título. Nada muito complicado.</p><pre><code class="language-php">$pc-&gt;set_title(array('text'=&gt;'Current Inventory Summary'));</code></pre><p>Ao termos o título, chamamos a função <a href="https://phpchart.com/phpChart/docs/output/C_PhpChartX_set_series_default@.html" rel="noopener">set_series_default</a> para definir o <code>renderer</code> para <code>PieRenderer</code>. Diferente de um gráfico de barras, um gráfico de pizza não tem um eixo Y.</p><p>Também podemos definir a propriedade <code>rendererOptions</code>. Não entraremos em detalhes em cada uma das opções aqui, mas você poderá encontrar mais informações sobre elas na <a href="https://phpchart.com/documentation/" rel="noopener">documentação on-line</a>.</p><pre><code class="language-php">$pc-&gt;set_series_default(array( 'shadow'=&gt; false,
    'renderer'=&gt; 'plugin::PieRenderer',
    'rendererOptions'=&gt; array(
      'highlightMouseOver' =&gt; true,
      'startAngle'=&gt; 180,
      'sliceMargin'=&gt; 4,
      'showDataLabels'=&gt; true )
  ));</code></pre><p>Também queremos dar uma legenda ao gráfico. O comando <code>set_legend</code> abaixo mostra a legenda a oeste (o que sabemos em função do <code>w</code>) ou à esquerda do gráfico de pizza.</p><pre><code class="language-php">$pc-&gt;set_legend(array('show'=&gt;true,'location'=&gt; 'w'));</code></pre><p>Também removeremos a borda e o segundo plano.</p><pre><code class="language-php">$pc-&gt;set_grid(array(
    'background'=&gt;'white',
    'borderWidth'=&gt;0,
    'borderColor'=&gt;'#000000',
    'shadow'=&gt;false));</code></pre><p>Por fim, criaremos nosso gráfico dando a ele uma altura (<code>height</code>) e uma largura (<code>width</code>) em pixels.</p><pre><code class="language-php">$pc-&gt;draw(660,400);</code></pre><p>No entanto, se você executar o código agora, não verá o gráfico, pois os dados usados para rendererizá-lo ainda não estão disponíveis.</p><h3 id="grade-de-dados-do-resumo-do-estoque-inventory-summary-datagrid-">Grade de dados do resumo do estoque (Inventory Summary Datagrid)</h3><p>Aqui, usaremos a mesma grade de dados de estoque que usamos na página <strong>Products</strong>. Apenas adicionaremos uma questão — um manipulador de eventos.</p><p>No phpGrid, podemos adicionar um manipulador de eventos com a função <a href="https://phpgrid.com/documentation/add_event/" rel="noopener">add_event()</a>. add_event() vincula um manipulador de eventos, que é, essencialmente, uma função do JavaScript, a um evento específico do phpGrid. Uma lista de eventos possíveis pode ser encontrada <a href="https://phpgrid.com/documentation/add_event/" rel="noopener">aqui</a>.</p><p>Como devemos aguardar até que a grade de dados termine de carregar <strong>antes</strong> que ela possa enviar os dados para criar o gráfico, usaremos o evento <code>jqGridLoadComplete</code>.</p><p><strong>Introdução ao phpGrid — o evento jqGridLoadComplete</strong></p><p>O evento jqGridLoadComplete é o último evento que ocorre quando todo o corpo da grade de dados terminou de carregar. Observe que o corpo da grade será recarregado se o usuário alterar a ordem de classificação de uma coluna ou se definir um filtro.</p><h4 id="enviando-dados-com-o-javascript">Enviando dados com o Javascript</h4><p>A seguir vemos o manipulador de eventos em Javascript para <code>jqGridLoadComplete</code>.</p><pre><code>&lt;span class="hljs-function"&gt;function(status, rowid)
{&lt;/span&gt;
    var dataX = [];
    var dataY = [];

    d1 = $('#products').jqGrid('getCol', 'ProductLabel', false);
    d2 = $('#products').jqGrid('getCol', 'InventoryReceived', false);

    npoints = d1.length;
    for(var i=0; i &lt; npoints; i++){
        dataX[i] = [i+1, d1[i]];
        dataY[i] = [i+1, parseInt(d2[i])];
    }

    var pieData = [];
    for(var j=0; j &lt; dataX.length; j++)
    {
        pieData.push([dataX[j][1], dataY[j][1]]);
    }
    console.log(pieData);
    _PieChart.series[0].data = pieData;
    _PieChart.replot({resetAxes:true});
}</code></pre><p>O código completo:</p><pre><code class="language-php">$dgProd = new C_DataGrid('SELECT id, ProductLabel, InventoryReceived FROM products', 'id', 'products');
$dgProd-&gt;set_col_hidden('id', false);
$dgProd-&gt;set_dimension('auto', 'auto')-&gt;set_pagesize(100);
$onGridLoadComplete = &lt;&lt;&lt;ONGRIDLOADCOMPLETE
function(status, rowid)
{
    var dataX = [];
    var dataY = [];

    d1 = $('#products').jqGrid('getCol', 'ProductLabel', false);
    d2 = $('#products').jqGrid('getCol', 'InventoryReceived', false);
    d3 = $('#products').jqGrid('getCol', 'InventoryShipped', false);
    d4 = $('#products').jqGrid('getCol', 'InventoryOnHand', false);


    npoints = d1.length;
    for(var i=0; i &lt; npoints; i++){
        dataX[i] = [i+1, d1[i]];
        dataY[i] = [i+1, parseInt(d2[i])];
    }

    var pieData = [];
    for(var j=0; j &lt; dataX.length; j++)
    {
        pieData.push([dataX[j][1], dataY[j][1]]);
    }
    console.log(pieData);
    _PieChart.series[0].data = pieData;
    _PieChart.replot({resetAxes:true});
}
ONGRIDLOADCOMPLETE;
$dgProd-&gt;add_event("jqGridLoadComplete", $onGridLoadComplete);
$dgProd-&gt;display();</code></pre><p>Aí está. Você acaba de criar seu primeiro sistema de gerenciamento de estoque do zero usando o PHP e o MySQL!</p><h3 id="-novo-na-programa-o-sem-problemas-">É novo na programação? Sem problemas!</h3><p>Se você é novo na programação e ainda não se sente confortável com ela, confira o <a href="https://getzenbase.com/" rel="noopener">ZenBase</a>, que foi criado sobre o phpGrid. O sistema de gerenciamento de estoque é apenas um dos <a href="https://getzenbase.com/templates/" rel="noopener">vários templates de aplicação</a> disponíveis no ZenBase para quem quiser — <em>com ou sem</em> habilidade em programação — para usar e personalizar às suas próprias necessidades.</p><h3 id="demonstra-o-on-line">Demonstração on-line</h3><ul><li><a href="https://phpdatagrid.com/apps/inventory-manager/products.php" rel="noopener">Current Inventory</a></li><li><a href="https://phpdatagrid.com/apps/inventory-manager/incoming-purchases.php" rel="noopener">Incoming Purchases</a></li><li><a href="https://phpdatagrid.com/apps/inventory-manager/outgoing-order.php" rel="noopener">Outgoing orders</a></li><li><a href="https://phpdatagrid.com/apps/inventory-manager/reports.php" rel="noopener">Reports</a> (com a grade de dados lado a lado)</li></ul><h3 id="a-seguir-adicionar-um-leitor-de-c-digo-de-barras">A seguir: adicionar um leitor de código de barras</h3><p><a href="https://medium.com/@chensformers/inventory-management-system-with-barcode-scanner-in-php-a-definitive-guide-d18fdc165511" rel="noopener">Adicione um leitor de código de barras ao nosso sistema de gerenciamento de estoque</a> (texto em inglês)</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/VqWE2ltTZhdjoJld8PcEnfrTL4g645hyQJTv.png" class="kg-image" alt="VqWE2ltTZhdjoJld8PcEnfrTL4g645hyQJTv" width="400" height="373" loading="lazy"></figure><h3 id="fa-a-o-download-do-c-digo-fonte-no-github">Faça o download do código-fonte no <a href="https://github.com/phpcontrols/inventory-manager">GitHub</a></h3><p></p><h3 id="problema-comum-">Problema comum:</h3><p><code><strong>Fatal error</strong>: Uncaught Error: Class ‘phpGrid\C_DataGrid’ not found</code></p><p><strong>Como resolver:</strong><br>Se estiver usando a versão Lite gratuita, você pode comentar a primeira linha de código</p><pre><code class="language-php">// use phpGrid\C_DataGrid;</code></pre><p>— OU —</p><p>Adicionar um símbolo de <em>namespace </em>global — backslash/barra invertida (\) única — ANTES do construtor</p><pre><code class="language-php">$dg = new \C_DataGrid("SELECT * FROM orders", "orderNumber", "orders");</code></pre><h3 id="-poss-vel-que-voc-se-interesse-tamb-m-pelos-tutoriais-a-seguir-textos-em-ingl-s-">É possível que você se interesse também pelos tutoriais a seguir (textos em inglês):</h3><ul><li><a href="https://phpgrid.com/example/build-project-management-application-scratch/" rel="noopener"><strong>Build a Project Management Application From Scratch</strong></a></li><li><a href="https://phpgrid.com/example/build-first-simple-crm-scratch/" rel="noopener"><strong>Build a Simple CRM from Start to Finish</strong></a></li><li><a href="https://medium.com/@chensformers/a-step-by-step-guide-to-building-a-donation-manager-from-scratch-in-php-part-i-514a7d34ee82" rel="noopener"><strong>Building a Donation Manager from Scratch in PHP</strong></a></li></ul><h3 id="obrigado-pela-leitura-se-gostou-deste-artigo-compartilhe-0-para-que-mais-pessoas-possam-ter-acesso-a-ele-">Obrigado pela leitura! Se gostou deste artigo, compartilhe-0 para que mais pessoas possam ter acesso a ele.</h3> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como aprender desenvolvimento para a web - um roteiro para desenvolvedores e desenvolvedoras ]]>
                </title>
                <description>
                    <![CDATA[  Há excelentes roteiros para desenvolvedores para a web por aí. Alguns, no entanto, exigem que se resolva um "quebra-cabeças" antes mesmo de começar, já que você precisa fazer várias escolhas.  Quando comecei a aprender desenvolvimento para a web, quis muito encontrar um/a desenvolvedor/a experiente que me contasse o ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-aprender-desenvolvimento-para-a-web-um-roteiro-para-desenvolvedores/</link>
                <guid isPermaLink="false">632c48675c046e06ec878b56</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento para a Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Marcelle Martins ]]>
                </dc:creator>
                <pubDate>Sun, 04 Dec 2022 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/maxresdefault--3-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-learn-web-dev-in-2021-roadmap/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Learn Web Development in 2021 - a Web Developer Roadmap</a>
      </p><p><br>Há excelentes roteiros para desenvolvedores para a web por aí. Alguns, no entanto, exigem que se resolva um "quebra-cabeças" antes mesmo de começar, já que você precisa fazer várias escolhas. </p><p>Quando comecei a aprender desenvolvimento para a web, quis muito encontrar um/a desenvolvedor/a experiente que me contasse o que tinha feito para se tornar um/a desenvolvedor/a para a web. Infelizmente, não encontrei ninguém.</p><p>Agora que já trabalho no setor há 4 anos, quero compartilhar como eu começaria a aprender desenvolvimento para a web neste ano. Neste artigo, vou mostrar para você todos os passos que você precisa tomar, desde quando iniciar até se tornar um/a desenvolvedor/a.</p><p>Começarei com algumas <strong>ferramentas essenciais</strong> que você precisa conhecer e, depois, vou tratar de <strong>linguagens de programação</strong> e de <strong>bibliotecas/frameworks</strong> que você precisa aprender para se tornar um/a desenvolvedor/a <em>front-end</em> ou <em>full-stack</em>.</p><p>Também falarei de alguns <strong>projetos </strong>que você pode desenvolver para praticar as suas habilidades.</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.17977528089888%;" class="fluid-width-video-wrapper">
            <iframe width="356" height="200" src="https://www.youtube.com/embed/GAkZfIYWsO4?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" title="Web Developer Roadmap 2021 ✨ in 10 minutes" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><p>Você também encontrará <a href="https://learn.devchallenges.io/tutorial/web-developer-roadmap-2021">um roteiro atualizado</a> no meu site da web.</p><h2 id="ferramentas-que-voc-precisa-conhecer-para-se-tornar-um-a-desenvolvedor-a-para-a-web">Ferramentas que você precisa conhecer para se tornar um/a desenvolvedor/a para a web</h2><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/Screenshot-2020-12-07-at-15.02.06.png" class="kg-image" alt="Screenshot-2020-12-07-at-15.02.06" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/Screenshot-2020-12-07-at-15.02.06.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/11/Screenshot-2020-12-07-at-15.02.06.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/Screenshot-2020-12-07-at-15.02.06.png 1487w" sizes="(min-width: 1200px) 1200px" width="1487" height="838" loading="lazy"></figure><p>Vou presumir que você é um/a iniciante. Nesse caso, há algumas ferramentas que você precisa conhecer antes de iniciar na programação.</p><h3 id="vs-code-ou-outro-editor-de-c-digo-">VS Code (ou outro editor de código)</h3><p>Primeiro, você precisará aprender a usar o <a href="https://code.visualstudio.com/"><strong>Visual Studio Code</strong></a>, que é um editor de código fonte. É uma ferramenta gratuita e poderosa.</p><p>No início, recomendo que você aprenda alguns dos atalhos básicos e instale algumas das extensões como ESlint, Prettier, ou Live Server.</p><p>No canal do freeCodeCamp, no YouTube, você encontrará um <a href="https://www.freecodecamp.org/news/learn-visual-studio-code-to-increase-productivity/">curso gratuito e completo</a> &nbsp;para ajudar você a começar.</p><h3 id="a-linha-de-comando">A linha de comando</h3><p>Em seguida, você precisará saber sobre a <a href="https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Understanding_client-side_tools/Command_line"><strong>linha de comando</strong></a> (texto em inglês). Você deve aprender o que é e alguns dos comandos básicos, por exemplo, como mexer em diretórios, como criar um diretório ou como criar um arquivo.</p><p>Aqui está um excelente artigo sobre <a href="https://www.freecodecamp.org/news/linux-command-line-bash-tutorial/">como usar o Bash</a> (texto em inglês), a linha de comando do Linux. Aqui temos outro artigo que ajudará você a <a href="https://www.freecodecamp.org/news/basic-linux-commands-bash-tips-you-should-know/">usar a linha de comando de modo mais eficaz</a> (texto em inglês).</p><h3 id="controle-de-vers-o-git-e-github">Controle de versão - Git e GitHub</h3><p>Independentemente do que você faça como desenvolvedor/a, precisará saber sobre <a href="https://git-scm.com/"><strong>Git</strong></a>. O Git é um sistema de controle de versão utilizado para monitorar as alterações. É normalmente utilizado com <strong>GitHub</strong>, que é uma plataforma de hospedagem de código.</p><p>No início, aprender Git pode ser desgastante. Por isso, basta que você tenha algumas noções básicas de, por exemplo, como criar um <em>repositório</em>, como <em>clonar </em>um projeto, como fazer um novo <em>commit</em> e como <em>lidar </em>com as novas mudanças.</p><p>Uma das melhores formas de praticar Git é trabalhando em uma equipe: você precisará saber como criar uma nova <em>branch</em>, como fazer <em>pull request</em>s e como resolver <em>conflitos</em>.</p><p>No canal do freeCodeCamp, no YouTube, você encontrará um excelente <a href="https://www.freecodecamp.org/news/git-and-github-crash-course/">curso intensivo de Git e GitHub</a> (em inglês), para ajudá-lo a praticar o controle de versão.</p><h3 id="ferramentas-de-design-figma">Ferramentas de design - Figma</h3><p>A última ferramenta é o <strong><a href="https://www.figma.com/">Figma</a></strong>. O Figma é uma ferramenta de design gratuita para uso particular. Aqui, contudo, quero falar sobre como utilizar o Figma como um/a desenvolvedor/a.</p><p>Como desenvolvedor/a, pode ser que você receba designs da sua equipe. Com o Figma, você poderá &nbsp;conferir o código dos elementos e medir o layout. Portanto, precisará saber como ler o design do Figma, por exemplo, como conseguir a cor, a tipografia ou espaçamento corretos.</p><p>Aqui está um artigo sobre <a href="https://www.freecodecamp.org/news/adobe-xd-vs-sketch-vs-figma-vs-invision/">várias ferramentas de design, incluindo o Figma</a> (texto em inglês). Aqui está um tutorial divertido sobre a <a href="https://www.freecodecamp.org/news/creating-realistic-3d-objects-in-figma-carton-box-example-f674c21c3452/">criação de esboços 3D no Figma</a> (texto em inglês).</p><p>Muito bem. Então, estas são as ferramentas de que você precisará conhecer quando for começar. <strong>Você não precisará saber tudo</strong>, mas certifique-se de entender o básico para que possa melhorar enquanto aprende a programar.</p><h2 id="linguagens-de-programa-o-que-desenvolvedores-e-desenvolvedoras-para-a-web-precisam-conhecer">Linguagens de programação que desenvolvedores e desenvolvedoras para a Web precisam conhecer</h2><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/Screenshot-2020-12-07-at-15.02.27.png" class="kg-image" alt="Screenshot-2020-12-07-at-15.02.27" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/Screenshot-2020-12-07-at-15.02.27.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/11/Screenshot-2020-12-07-at-15.02.27.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/Screenshot-2020-12-07-at-15.02.27.png 1491w" sizes="(min-width: 1200px) 1200px" width="1491" height="839" loading="lazy"></figure><h3 id="html-e-css">HTML e CSS</h3><p>A seguir, vamos tratar das linguagens de programação. Comecemos falando de <strong>sites da web responsivos</strong>.</p><p>Sites da web responsivos são sites com uma boa aparência e que podem ser utilizados em todos os dispositivos ou tamanhos de telas. Você, provavelmente, sabe como é importante desenvolver um site responsivo, uma vez que, hoje em dia, as pessoas utilizam diversos dispositivos diferentes.</p><p>Então, vamos avançar para as duas primeiras linguagens que você precisará saber para desenvolver um site: <strong>HTML </strong>e <strong>CSS</strong>.</p><p><strong>HTML </strong>significa <em>Hypertext Markup Language</em> (linguagem de marcação de hipertexto). Ela é utilizada para desenvolver o esqueleto do seu site. O HTML não é uma linguagem difícil de aprender, mas você talvez queira prestar mais atenção aos formulários HTML, uma vez que eles serão fundamentais no futuro.</p><p><strong>CSS </strong>significa <em>Cascading Style Sheets</em> (folhas de estilo em cascata). Esta é uma linguagem de marcação, mas eu também a considero como uma linguagem de programação. O CSS não é, necessariamente, uma linguagem difícil de aprender, mas é difícil de se dominar.</p><p>Há poucos tópicos aos quais você deverá prestar mais atenção, como:</p><ul><li><strong>Modelo de caixa</strong> – como as margens, <em>padding</em> e bordas funcionam em conjunto.</li><li><strong>Unidades CSS </strong>– utilizado para expressar comprimentos (por exemplo: rem, vh, e vw).</li><li><strong>Posição </strong>– especifica o tipo de método de posicionamento. Também confunde muitas pessoas. Por isso, certifique-se de investir tempo aprendendo-a.</li><li><strong>Variáveis </strong>– ou <strong>propriedades personalizadas</strong> são entidades que podem ser reutilizadas ao longo de um documento. Esta é a minha característica favorita no CSS. Elas tornam o trabalho com CSS muito agradável e é possível criar temas com apenas algumas linhas de código.</li><li><strong>Consulta dos meios de comunicação </strong>– permite decidir o que mostrar em diferentes tamanhos de telas. Trata-se de um componente chave do <a href="https://developer.mozilla.org/pt-BR/docs/Web/Progressive_web_apps">design responsivo</a>.</li><li><strong>Animação </strong>– permite que um elemento mude de um estilo para outro. Se você souber usar a animação corretamente, ela fará com que o seu site se destaque. Caso contrário, fará com que o seu site pareça pouco profissional. Por isso, tenha cuidado.</li><li><strong>Flexbox, CSS Grid</strong> – usados para construir layouts responsivos (eu esqueci de mencioná-los no vídeo).</li></ul><p>Aqui está <a href="https://www.freecodecamp.org/news/the-html-handbook/">um manual completo</a> (texto em inglês) que ensinará a você todas as noções básicas de HTML. Aqui temos um curso <a href="https://www.freecodecamp.org/news/learn-css-in-this-free-6-hour-video-course/">completo sobre CSS</a> (em inglês), no canal do freeCodeCamp, no YouTube, que ajudará você a tornar os seus sites mais bonitos. </p><p>Quando souber as noções básicas de HTML e CSS, o próximo passo é desenvolver alguns sites da web básicos. Você pode, por exemplo, tentar desenvolver uma <em>página inicial;</em> um <em>formulário, </em>como uma página de login, ou uma página de checkout. Você pode, até mesmo, desenvolver um <em>portfólio</em>. Em <a href="https://devchallenges.io/paths/responsiveWebPaths">DevChallenges.io</a>, você encontrará exemplos de projetos. </p><h3 id="implementa-o-de-sites-da-web">Implementação de sites da web</h3><p>Quando já tiver o seu site da web, você precisará colocá-lo na internet, para que as pessoas possam vê-lo. A implementação é o processo de enviar seu código para uma plataforma de hospedagem.</p><p>Antigamente, era muito mais difícil de se fazer. Agora, porém, é superfácil. Você pode usar ferramentas como <a href="https://pages.github.com/">GitHub Pages</a>, <a href="https://www.netlify.com/">Netlify</a> ou <a href="https://vercel.com/">Vercel</a>.</p><p>Aqui está um <a href="https://www.freecodecamp.org/news/how-to-put-a-website-online-guide-to-website-creation-custom-domain-and-hosting/">curso completo no YouTube</a> sobre como colocar o seu site da web on-line (texto em inglês), que contempla o processo inteiro, do início ao fim.</p><h3 id="javascript-fundamentos">JavaScript – Fundamentos</h3><p>Muito bem, o <a href="https://www.freecodecamp.org/portuguese/learn/javascript-algorithms-and-data-structures/basic-javascript/">próximo tópico é o JavaScript</a>. O JavaScript é uma linguagem de programação popular e amplamente utilizada no desenvolvimento para a web, entre outros.</p><p>Você precisará aprender algumas das características básicas da linguagem, como <a href="https://www.freecodecamp.org/news/javascript-data-types-typeof-explained/">tipos de dados</a>, <a href="https://www.freecodecamp.org/news/javascript-loops-explained-for-loop-for/">loops</a>, e <a href="https://www.freecodecamp.org/news/what-in-the-world-is-a-javascript-conditional-for/">condicionais</a> (textos em inglês).</p><p>Em seguida, há assuntos nos quais você deverá se aprofundar. </p><p>Em primeiro lugar, temos a <strong>depuração</strong> (em inglês, <em>debugging</em>). Este é o processo de encontrar e corrigir erros. Aqui temos um <a href="https://www.freecodecamp.org/news/the-beginner-bug-squashing-guide/">ótimo guia aprofundado de depuração de bugs</a> (texto em inglês) para te ajudar a começar.</p><p>Depois, há outros tópicos como <strong>objetos</strong>, <strong>primitivos</strong> e <strong>arrays</strong>. Especialmente quando se trabalha com arrays, é necessário conhecer também os <a href="https://www.freecodecamp.org/news/javascript-map-reduce-and-filter-explained-with-examples/"><strong>métodos de array</strong></a><strong> </strong>(textos em inglês).</p><p><strong>Funções </strong>são os principais blocos de construção do seu programa. Por isso, certifique-se de que não vai deixar de estudá-los.</p><p>Uma das minhas características favoritas em JavaScript é a <a href="https://www.freecodecamp.org/news/array-and-object-destructuring-in-javascript/">desestruturação</a> (texto em inglês) – é fácil de escrever e torna a linguagem super poderosa.</p><p>Como C#, Java e outras linguagens de programação, no JavaScript moderno, também temos <strong>classes</strong>. Elas são úteis quando se trata de <a href="https://www.freecodecamp.org/portuguese/news/os-principios-solid-da-programacao-orientada-a-objetos-explicados-em-bom-portugues/">Programação Orientada a Objetos e os princípios SOLID</a>.</p><p>Por melhor que você seja em programação, haverá erros nos seus scripts. Isso significa que você também precisará <a href="https://www.freecodecamp.org/news/how-to-write-error-messages-that-dont-suck-f31c53b64c3e/">saber sobre como <strong>lidar com os erros</strong></a> (texto em inglês).</p><p>Programação assíncrona é importante, especialmente quando é necessário comunicar com o servidor. Por isso, passe algum tempo aprendendo sobre <a href="https://www.freecodecamp.org/news/learn-promise-async-await-in-20-minutes/"><strong>Promises </strong>e <strong>Async/Await</strong></a> (texto em inglês).</p><h3 id="javascript-navegador">JavaScript - Navegador</h3><p>Passemos à forma como o JavaScript é utilizado no navegador.</p><p>Primeiro, é preciso saber o que é um <em>Document Object Model</em> (Modelo de Objeto de Documento) ou <strong>DOM</strong>. Depois, é preciso saber como obter elementos, como mudar as classes e como mudar o estilo com JavaScript.</p><p>Aqui está uma boa <a href="https://www.freecodecamp.org/news/an-introduction-to-the-javascript-dom-512463dd62ec/">introdução ao DOM no JS</a> (texto em inglês), e aqui está um guia sobre <a href="https://www.freecodecamp.org/news/learn-how-to-manipulate-the-dom-by-building-a-simple-javascript-color-game-1a3aec1d109a/">como manipular o DOM</a> (texto em inglês, mas aqui você aprenderá construindo um projeto).</p><p>Você também precisará aprender sobre diferentes eventos de interface de usuário, como clicar, passar o cursor para cima, para baixo e assim por diante.</p><p>Você ainda terá que prestar mais atenção aos <a href="https://www.freecodecamp.org/news/build-and-validate-beautiful-forms-with-vanilla-html-css-js/"><strong>formulários </strong>em JavaScript</a> (texto em inglês), uma vez que eles têm muitos eventos e propriedades.</p><h3 id="javascript-outras-caracter-sticas">JavaScript - outras características</h3><p>A <a href="https://www.freecodecamp.org/portuguese/news/tutorial-de-fetch-api-em-javascript-exemplos-de-post-e-cabecalho/"><strong>Fetch API</strong> é um tópico importante</a>. Ela permite que você envie solicitações de rede para servidores. Isso é útil, por exemplo, quando precisamos enviar um formulário ou obter informações de um usuário.</p><p>Outro tópico importante é o <a href="https://www.freecodecamp.org/news/how-to-store-data-in-web-browser-storage-localstorage-and-session-storage-explained/"><strong>armazenamento de dados</strong> no navegador</a> (texto em inglês). Em relação a isso, é necessário saber quais são as diferenças entre cookies, armazenamento local (ou <em>local storage</em>, em inglês) e armazenamento de sessão (ou <em>session storage</em>, em inglês).</p><p>Outros tópicos menos importantes quando se está apenas começando são expressões regulares (<em>regular expressions</em>, em inglês), componentes da web (<em>web components</em>, em inglês) e websockets.</p><p><a href="https://www.freecodecamp.org/news/regular-expressions-demystified-regex-isnt-as-hard-as-it-looks-617b55cf787/"><strong>Expressões regulares</strong></a> (texto em inglês) são utilizadas para pesquisar e substituir texto. <strong>Componentes da web</strong>, são uma novidade, mas que valem a pena você conferir.</p><p>Por último, temos os <strong><a href="https://www.freecodecamp.org/news/beginners-guide-to-websockets/">Websockets</a> </strong>(texto em inglês). Eles são úteis quando precisamos de trocas contínuas de dados, como em aplicações de bate-papo.</p><p>Depois de aprender Javascript, você deveria <a href="https://www.freecodecamp.org/news/learn-typescript-data-types-from-zero-to-hero/">aprender sobre o <strong>TypeScript</strong></a><strong> </strong>(texto em inglês). Eu amo o TypeScript, pois ele me passa segurança quando estou escrevendo o código.</p><p>O TypeScript fornece uma digitação estática, que permite que você detecte erros mais cedo no processo de depuração. Isso permite economizar tempo, uma vez que identifica erros antes de o código ser executado.</p><p>Aqui está um artigo útil sobre os <a href="https://www.freecodecamp.org/news/a-mental-model-to-think-in-typescript-2/">tipos de TypeScript</a> (texto em inglês) para ajudar você a ter maior clareza sobre eles.</p><p>Você poderia parar por aqui e começar a trabalhar em alguns projetos. Pessoalmente, no entanto, eu ainda aprenderia, pelo menos, um <em>framework</em>. Isso já permite a você praticar o JavaScript ao mesmo tempo.</p><p>Muito bem. Então, vamos continuar.</p><h2 id="bibliotecas-e-frameworks-para-se-conhecer">Bibliotecas e frameworks para se conhecer </h2><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/Screenshot-2020-12-07-at-15.02.35.png" class="kg-image" alt="Screenshot-2020-12-07-at-15.02.35" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/Screenshot-2020-12-07-at-15.02.35.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/11/Screenshot-2020-12-07-at-15.02.35.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/Screenshot-2020-12-07-at-15.02.35.png 1491w" sizes="(min-width: 1200px) 1200px" width="1491" height="838" loading="lazy"></figure><p>Para se tornar um/a desenvolvedor/a front-end ou um/a desenvolvedor/a full-stack, é necessário conhecer algumas das bibliotecas e frameworks que existem por aí.</p><h3 id="bibliotecas-e-frameworks-para-desenvolvedores-e-desenvolvedoras-de-front-end">Bibliotecas e frameworks para desenvolvedores e desenvolvedoras de front-end</h3><p>Comecemos pelo <strong>Sass</strong>, que é uma linguagem de criação de scripts de pré-processador. Eu uso o Sass em quase todos os meus projetos. Ele faz o CSS parecer mais limpo e torna-o mais rápido de desenvolver.</p><p>Aqui está um <a href="https://www.freecodecamp.org/news/give-your-css-superpowers-by-learning-sass/">curso completo sobre Sass</a> (texto em inglês) que ensinará você a dar superpoderes ao seu CSS.</p><p>Em seguida, temos o <strong>NPM </strong>que é um gestor de pacotes para programação em JavaScript. Ele permite instalar rapidamente diferentes pacotes na sua máquina.</p><p>Aqui, você encontrará um bom <a href="https://www.freecodecamp.org/news/what-is-npm-a-node-package-manager-tutorial-for-beginners/">guia do NPM para iniciantes</a> (texto em inglês), que ajudará você a começar a baixar pacotes de imediato.</p><p>Um dos meus arrependimentos é não ter conhecido o <strong><a href="https://www.freecodecamp.org/news/learn-react-contentful-and-netlify-by-building-a-beach-resort-website/">contentful </a></strong>antes. Contentful é um sistema de gestão de conteúdos, ou CMS, <em>headless</em> (<em>Headless Content Management System</em>). Os sistemas headless são diferentes dos CMS tradicionais, pois você pode armazenar dados no Contentful e utilizá-los para o seu front-end.</p><p>Para obter um trabalho de front-end, você precisa conhecer, pelo menos, um framework de front-end. Eu, pessoalmente, escolheria o <strong>React</strong>. Falaremos sobre outros frameworks mais adiante.</p><p>Além de <a href="https://www.freecodecamp.org/news/the-react-handbook-b71c27b0a795/">aprender as noções básicas de React</a> (texto em inglês), você também deverá se atentar à forma como o <strong>estado </strong>(em inglês, <em>state</em>) é gerenciado nas aplicações de React e a como os <strong>formulários</strong> funcionam em React.</p><p>Depois de aprender o básico, você pode solidificar as suas habilidades trabalhando em vários projetos com React <a href="https://www.freecodecamp.org/news/solidify-your-react-skills-by-building-15-projects/">neste curso do YouTube</a> (em inglês).</p><p>Outro arrependimento que tenho é não ter conhecido o <a href="https://nextjs.org/"><strong>Next.js</strong></a> antes. O Next.js é utilizado para a <em>renderização do lado do servidor</em> ou para <em>gerar websites estáticos</em>. Sim, o Next.js ainda é bastante novo, mas eu acredito que esta é uma habilidade que <em>precisamos </em>desenvolver como programadores do React.</p><p>Você poderá aprender todos os conceitos básicos do Next.js <a href="https://www.freecodecamp.org/news/the-next-js-handbook/">neste manual aprofundado</a> (texto em inglês).</p><p>Depois de aprender estas ferramentas, talvez você queira conferir a <a href="https://material-ui.com/">Material UI</a> que é uma biblioteca de componentes do React, ou a <a href="https://tailwindcss.com/">Tailwind CSS</a>, que é um framework do CSS que ajudará você a acelerar o seu trabalho quando estiver fazendo protótipos ou trabalhando como freelancer, por exemplo.</p><p>Com isso, depois de aprender JavaScript e um framework, você precisará <strong>praticar </strong>construindo projetos.</p><p>Você poderá começar construindo alguns componentes simples e reutilizáveis, para compreender como funciona o React. Depois, poderá construir aplicações mais complexas, como uma <em>aplicação de Quiz</em> ou uma <em>aplicação de lista de tarefas</em>.</p><p>Depois disso, você deverá criar aplicações ainda mais difíceis, como uma <em>ferramenta de procura de emprego</em>, um <em>blog</em> ou uma <em>página de documentos</em>. Mais uma vez, você encontrará exemplos de projetos na <a href="https://devchallenges.io/paths/frontEndPaths">DevChallenges.io</a>.</p><h3 id="desenvolvedor-a-full-stack">Desenvolvedor/a Full-stack</h3><p>Agora, você está pronto/a para se candidatar a uma vaga de desenvolvedor/a front-end. Se quiser continuar para se tornar um/a desenvolvedor/a full-stack, você poderá começar <a href="https://www.freecodecamp.org/news/nodejs-course/">aprendendo Node.js</a> e <a href="https://www.freecodecamp.org/news/learn-express-js-in-this-complete-course/">Express</a> (textos em inglês).</p><p>Neste ponto, você precisará saber como construir uma<em> API</em> <em>RESTful </em>e deverá conseguir usar o <a href="https://www.freecodecamp.org/news/mongodb-crud-app/">MongoDB</a> para trabalhar com bancos de dados. Isso é bastante simples de aprender quando já se sabe JavaScript.</p><p>Em seguida, se desejar aprender mais, você poderá <a href="https://www.freecodecamp.org/news/learn-how-to-use-react-and-graphql-to-make-a-full-stack-social-network/">conferir o GraphQL</a> (texto em inglês), que é uma linguagem de consulta e manipulação de dados para APIs. Pessoalmente, eu também investiria algum tempo aprendendo PostgreSQL. Comparado com MongoDB, é uma linguagem um pouco mais difícil de se aprender, uma vez que você também precisará <a href="https://www.freecodecamp.org/news/sql-recipes/">aprender sobre SQL</a> (texto em inglês).</p><p>Depois de aprender essas ferramentas, você poderá praticar construindo aplicações como um <em>uploader de imagens, uma aplicação de autenticação</em> ou <em>uma sala de bate-papo</em>. Você também pode encontrar estes projetos no <a href="https://devchallenges.io/paths/fullStackPaths">Devchallenges.io</a>.</p><p>Agora, sim, você está pronto/a para se candidatar a uma vaga de full-stack. Se o seu trabalho exigir que você conheça <strong><a href="https://www.freecodecamp.org/news/vue-js-full-course/">Vue.js</a></strong>, <a href="https://www.freecodecamp.org/news/angular-tutorial-course/"><strong>Angular</strong> </a>ou até mesmo <strong><a href="https://www.freecodecamp.org/news/the-svelte-handbook/">Svelte</a></strong> (textos em inglês), você também poderá dedicar algum tempo a aprender essas ferramentas. Não deve ser muito difícil, uma vez que você já saberá React.</p><p>Isto conclui o roteiro. Espero que você o considere útil. Um dos objetivos do autor para o ano passado foi o de fazer vídeos sobre todos os tópicos dos quais acabamos de falar. Portanto, não se esqueça de consultar o <a href="https://www.youtube.com/c/thunghiem"><strong>canal do autor no Youtube</strong></a> e <a href="https://learn.devchallenges.io/"><strong>DevChallenges Learn</strong></a>, o site do autor.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ O que é Open Graph e como posso utilizá-lo no meu site da web? ]]>
                </title>
                <description>
                    <![CDATA[ Pode levar muito tempo para criar o conteúdo e manter um site da web. Como podemos garantir que o nosso conteúdo se destaque ao ser compartilhado em feeds sociais por toda a internet?  * O que é Open Graph?    [/portuguese/news/o-que-e-open-graph-e-como-posso-utiliza-lo-no-meu-site-da-web/#o-que-open-graph]  * Por que eu preciso ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/o-que-e-open-graph-e-como-posso-utiliza-lo-no-meu-site-da-web/</link>
                <guid isPermaLink="false">6357f1d3191d0905ea419a53</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento para a Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Elizabete Nakamura ]]>
                </dc:creator>
                <pubDate>Tue, 29 Nov 2022 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/open-graph.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/what-is-open-graph-and-how-can-i-use-it-for-my-website/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is Open Graph and how can I use it for my website?</a>
      </p><p>Pode levar muito tempo para criar o conteúdo e manter um site da web. Como podemos garantir que o nosso conteúdo se destaque ao ser compartilhado em feeds sociais por toda a internet?</p><ul><li><a href="https://www.freecodecamp.org/portuguese/news/o-que-e-open-graph-e-como-posso-utiliza-lo-no-meu-site-da-web/#o-que-open-graph">O que é Open Graph?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-que-e-open-graph-e-como-posso-utiliza-lo-no-meu-site-da-web/#por-que-eu-preciso-dele">Por que eu preciso dele?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-que-e-open-graph-e-como-posso-utiliza-lo-no-meu-site-da-web/#o-que-acontece-se-eu-n-o-o-tiver">O que acontece se eu não o tiver?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-que-e-open-graph-e-como-posso-utiliza-lo-no-meu-site-da-web/#come-ando-pelo-b-sico-de-open-graph">Começando pelo básico de open graph</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-que-e-open-graph-e-como-posso-utiliza-lo-no-meu-site-da-web/#site-da-web-com-open-graph">Site da web com open graph</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-que-e-open-graph-e-como-posso-utiliza-lo-no-meu-site-da-web/#algumas-outras-tags-open-graph-que-valem-a-pena-adicionar">Algumas outras tags open graph que valem a pena adicionar</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-que-e-open-graph-e-como-posso-utiliza-lo-no-meu-site-da-web/#twitter-e-outras-redes-de-m-dia-social-usando-open-graph">Twitter e outras redes de mídia social usando open graph</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-que-e-open-graph-e-como-posso-utiliza-lo-no-meu-site-da-web/#imagens-em-open-graph">Imagens em open graph</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-que-e-open-graph-e-como-posso-utiliza-lo-no-meu-site-da-web/#testando-as-suas-tags-open-graph">Testando as suas tags open graph</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/o-que-e-open-graph-e-como-posso-utiliza-lo-no-meu-site-da-web/#que-tal-um-exemplo">Que tal um exemplo?</a></li></ul><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.17977528089888%;" class="fluid-width-video-wrapper">
            <iframe width="356" height="200" src="https://www.youtube.com/embed/QwEQKM4YRnU?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" title="What is Open Graph and how can it help my website with social media?" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><h2 id="o-que-open-graph"><strong>O que é Open Graph?</strong></h2><p>O <a href="https://ogp.me/">Open Graph</a> é um protocolo de internet que foi originalmente criado pelo <a href="http://fbdevwiki.com/wiki/Open_Graph_protocol">Facebook</a> para padronizar o uso de metadados dentro de uma página da web para representar o conteúdo de uma página.</p><p>Dentro dele, você pode fornecer detalhes tão simples quanto o título de uma página ou tão específicos quanto a duração de um vídeo. Todas essas peças se encaixam para formar uma representação de cada página individual da internet.</p><h2 id="por-que-eu-preciso-dele"><strong>Por que eu preciso dele?</strong></h2><p>O conteúdo na internet é tipicamente criado com pelo menos um objetivo em mente – compartilhá-lo com outros. Isso pode não necessariamente importar se você estiver enviando o conteúdo apenas para um amigo, mas, se você quiser compartilhá-lo ou se quiser que ele seja compartilhado em qualquer rede social ou aplicação que utilize visualizações ricas, você vai querer que essa visualização seja a mais eficaz possível.</p><figure class="kg-card kg-embed-card"><blockquote class="twitter-tweet" data-width="550"><p lang="en" dir="ltr">How to Become a Full Stack Web Developer in 2020 <a href="https://twitter.com/hashtag/javascript?src=hash&amp;ref_src=twsrc%5Etfw">#javascript</a> <a href="https://twitter.com/hashtag/fullstack?src=hash&amp;ref_src=twsrc%5Etfw">#fullstack</a> <a href="https://t.co/A1TsFaDguD">https://t.co/A1TsFaDguD</a></p>— Colby Fayock @ spacejelly.dev (@colbyfayock) <a href="https://twitter.com/colbyfayock/status/1237455806230077441?ref_src=twsrc%5Etfw">March 10, 2020</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</figure><p>Isso ajudará a encorajar as pessoas a verificar o seu conteúdo e, inevitavelmente, a clicar nele.</p><h2 id="o-que-acontece-se-eu-n-o-o-tiver"><strong>O que acontece se eu não o tiver?</strong></h2><p>A maioria das redes sociais, por padrão, tentará se esforçar ao máximo para criar uma prévia do seu conteúdo. Isso, na maioria das vezes, não resulta bem.</p><p>Veja, por exemplo, meu site na web, <a href="https://colbyfayock.com">colbyfayock.com</a>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/simple-twitter-card.jpg" class="kg-image" alt="simple-twitter-card" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/simple-twitter-card.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/11/simple-twitter-card.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/simple-twitter-card.jpg 1044w" sizes="(min-width: 720px) 720px" width="1044" height="486" loading="lazy"></figure><p>Ele pega corretamente o título da minha página e a descrição, mas não é o tweet mais atraente em um feed.</p><p>Contrastando com a visualização de um único post, vemos uma história diferente.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/large-image-twitter-card.jpg" class="kg-image" alt="large-image-twitter-card" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/large-image-twitter-card.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/11/large-image-twitter-card.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/large-image-twitter-card.jpg 1044w" sizes="(min-width: 720px) 720px" width="1044" height="884" loading="lazy"><figcaption>Exemplo de um cartão do Twitter com uma imagem grande</figcaption></figure><p>Então, o que acontece se você não tiver as tags open graph? Nada de ruim acontecerá, mas você não estará aproveitando algumas das funcionalidades que ajudam a destacar o seu conteúdo ao lado da carga de outros conteúdos que são publicados na internet.</p><h2 id="come-ando-pelo-b-sico-de-open-graph">Começando pelo básico de open graph</h2><p>As quatro tags open graph que são necessárias para cada página são og:title, og:type, og:image e og:url. Essas tags devem ser únicas para cada página que você serve, ou seja, as tags de sua página inicial devem ser todas diferentes da página do seu blog de publicação de artigos.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/11/open-graph-twitter-card.jpg" class="kg-image" alt="open-graph-twitter-card" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/11/open-graph-twitter-card.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/11/open-graph-twitter-card.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2022/11/open-graph-twitter-card.jpg 1442w" sizes="(min-width: 720px) 720px" width="1442" height="797" loading="lazy"><figcaption>Anatomia de um cartão do Twitter usando tags Open Graph</figcaption></figure><p>Embora deva ser bastante direto, aqui está uma descrição do significado de cada uma das tags:</p><ul><li><code>og:title</code>: o título da sua página. Esse é tipicamente o mesmo que está na tag &lt;title&gt; de sua página web, a menos que você queira apresentá-lo de forma diferente.</li><li><code>og:type</code>: o "tipo" de site da web que você tem. Explicarei mais na próxima seção, embora um "tipo" genérico seja "website".</li><li><code>og:image</code>: este deve ser um link para uma imagem que você gostaria de ver representando o seu conteúdo. Deve ser uma imagem de alta resolução que as redes sociais utilizarão em seus feeds.</li><li><code>og:url</code>: este deve ser o URL da página atual.</li></ul><p>Ao colocar uma tag em seu site, você deve colocá-la na &lt;head&gt;, junto de quaisquer outros metadados. A tag usada será uma tag &lt;meta&gt; e deve ser semelhante a este padrão:</p><pre><code>&lt;meta property="[NOME]" content="[VALOR]" /&gt;
</code></pre><p>Portanto, se eu fosse criar um conjunto de quatro tags open graph para o meu site, <a href="https://colbyfayock.com">colbyfayock.com</a>, poderia ser assim:</p><pre><code class="language-html">&lt;meta property="og:title" content="Colby Fayock - A UX Designer &amp;amp; Front-end Developer Blog" /&gt;
&lt;meta property="og:type" content="website" /&gt;
&lt;meta property="og:image" content="/static/website-social-card-44070c4a901df708aa1563ac4bbe595a.jpg" /&gt;
&lt;meta property="og:url" content="https://www.colbyfayock.com" /&gt;
</code></pre><h2 id="site-da-web-com-open-graph"><strong>Site da web com open graph</strong></h2><p>O protocolo open graph tem algumas variações quanto ao "tipo" de site da web que ele suporta. Isto inclui tipos como 'website', 'article' ou 'video'.</p><p>Ao configurar as suas tags open graph, você vai querer ter uma ideia de qual tipo fará mais sentido para o seu site. Se sua página estiver focada em um único vídeo, provavelmente faz sentido usar o tipo "video". Se for um site geral sem finalidade específica, você provavelmente vai querer usar apenas o tipo "website".</p><p>Semelhante às outras, isso é único para cada página. Portanto, se a sua página inicial for "website", você sempre poderá ter outra página do tipo "video".</p><p>Portanto, se eu fosse criar um tipo de open graph para o meu site, ele poderia ter a seguinte aparência na minha página inicial:</p><pre><code class="language-html">&lt;!-- colbyfayock.com --&gt;
&lt;meta property="og:type" content="profile" /&gt;
</code></pre><p>Quando se navega para uma publicação em um blog, você teria algo como:</p><pre><code class="language-html">&lt;!-- https://www.colbyfayock.com/2020/03/anyone-can-map-inspiration-and-an-introduction-to-the-world-of-mapping/ --&gt;
&lt;meta property="og:type" content="article" /&gt;
</code></pre><p>Você pode encontrar os tipos mais comuns de sites da web open graph na página da web do open graph: <a href="https://ogp.me/#types">https://ogp.me/#types</a></p><h2 id="algumas-outras-tags-open-graph-que-valem-a-pena-adicionar"><strong>Algumas outras tags open graph que valem a pena adicionar</strong></h2><p>Embora você geralmente esteja de acordo com o básico, aqui estão mais algumas tags que valeriam a pena acrescentar:</p><ul><li><code>og:description</code>: uma descrição da sua página. Similar a og:title, essa pode ser a mesma que a tag <code>&lt;meta type="description"&gt;</code>, a menos que você queira apresentá-la de forma diferente.</li><li><code>og:locale</code>: se você quiser localizar as suas tags, provavelmente faria sentido incluir o locale (localização). O formato é idioma_PAÍS, onde o padrão é en_US (english_UnitedStates – no Brasil, teríamos pt_BR, ou portuguese_Brazil).</li><li><code>og:site_name</code>: o nome de todo o site da web em que seu conteúdo está. Se você estiver em uma página de publicações em blog, você pode ter um título usando o título dessa publicação no blog, onde o <code>nome_do_site</code> seria o nome de seu blog.</li><li><code>og:video</code>: tem um vídeo que dá suporte ao seu conteúdo? Aqui está uma chance de incluí-lo. Adicione um link ao seu vídeo usando esta tag.</li></ul><p>Essas tags serão adicionadas no mesmo padrão de antes:</p><pre><code class="language-html">&lt;meta property="[NOME]" content="[VALOR]" /&gt;
</code></pre><h2 id="twitter-e-outras-redes-de-m-dia-social-usando-open-graph"><strong>Twitter e outras redes de mídia social usando open graph</strong></h2><p>A maioria das redes sociais adere aos princípios básicos dos padrões open graph, mas algumas delas também incluem a sua própria extensão para ajudar a personalizar o visual e a sensação dentro de seu ecossistema.</p><p>Twitter, por exemplo, permite que você especifique twitter:card, que é o tipo de "cartão" que você pode usar quando eles mostram seu site da web. Neste momento, os tipos de cartão deles incluem:</p><ul><li>summary (resumo)</li><li>summary_large_image (resumo com imagem grande)</li><li>app (aplicação)</li><li>player (reprodutor de mídia)</li></ul><p>Isso ajudará você a escolher como seus links são usados na feed deles. Se você escolher summary_large_image, por exemplo, o Twitter mostrará os seus links com grandes imagens em alta resolução, desde que você forneça o link na tag og:image.</p><p>Aqui estão algumas referências rápidas para a documentação de como usar tags open graph com alguns dos sites de mídia social (textos em inglês):</p><ul><li>Twitter: <a href="https://developer.twitter.com/en/docs/tweets/optimize-with-cards/guides/getting-started">https://developer.twitter.com/en/docs/tweets/optimize-with-cards/guides/getting-started</a></li><li>Facebook: <a href="https://developers.facebook.com/docs/sharing/webmasters/">https://developers.facebook.com/docs/sharing/webmasters/</a></li><li>Pinterest: <a href="https://developers.pinterest.com/docs/rich-pins/overview/">https://developers.pinterest.com/docs/rich-pins/overview/</a>?</li><li>LinkedIn: <a href="https://www.linkedin.com/help/linkedin/answer/46687/making-your-website-shareable-on-linkedin?lang=en">https://www.linkedin.com/help/linkedin/answer/46687/making-your-website-shareable-on-linkedin?lang=en</a></li></ul><h2 id="imagens-em-open-graph"><strong>Imagens em open graph</strong></h2><p>Enquanto acrescentar sua imagem como og:image deva ser frequentemente o suficiente, às vezes, pode ser um desafio conseguir que a sua imagem apareça corretamente. Se você parece estar tendo problemas, o padrão open graph inclui algumas tags de imagem como og:image:url x og:image:secure_url, assim como og:image:width e og:image:height.</p><p>Tente ter certeza de estar seguindo todas as <a href="https://ogp.me/#structured">notas e exemplos na documentação do open graph</a> (em inglês). Além disso, algumas das redes sociais têm requisitos de imagem. <a href="https://developer.twitter.com/en/docs/tweets/optimize-with-cards/overview/summary-card-with-large-image">O Twitter, por exemplo, requer</a> (texto em inglês) uma proporção de 2:1 com um tamanho mínimo de 300x157 e um tamanho máximo de 4096x4096, inferior a 5MB e no formato JPG, PNG, WEBP ou GIF.</p><p>Se você não souber o que fazer, teste as suas tags usando as ferramentas de rede de mídia social para ver se consegue encontrar o problema.</p><h2 id="testando-as-suas-tags-open-graph"><strong>Testando as suas tags open graph</strong></h2><p>Felizmente, as nossas redes sociais favoritas também fornecem ferramentas para nos ajudar a testar as nossas tags. Uma vez que você tenha certeza de que suas tags estão realmente aparecendo no código-fonte do seu site, você poderá visualizar como ele ficará no feed.</p><ul><li>Twitter: <a href="https://cards-dev.twitter.com/validator">https://cards-dev.twitter.com/validator</a></li><li>Facebook: <a href="https://developers.facebook.com/tools/debug/">https://developers.facebook.com/tools/debug/</a></li><li>Pinterest: <a href="https://developers.pinterest.com/tools/url-debugger/">https://developers.pinterest.com/tools/url-debugger/</a></li></ul><h2 id="indo-mais-fundo-em-tags-open-graph"><strong>Indo mais fundo em tags open graph </strong></h2><p>Enquanto a maioria das tags deva cobrir um site básico, há mais algumas tags que podem ajudar você e a sua empresa a serem descobertos nas redes sociais.</p><p>Se você estiver interessado em mergulhar em mais, <a href="https://ogp.me/"></a><a href="https://ogp.me/">a</a> <a href="https://ogp.me/">documentação</a> (em inglês) faz um ótimo trabalho ao fornecer uma lista de todas as tags disponíveis para você usar.</p><h2 id="que-tal-um-exemplo"><strong>Que tal um exemplo?</strong></h2><p>Se você está simplesmente procurando um exemplo para começar, aqui está o que você deve fazer ao criar as suas tags para <a href="https://www.colbyfayock.com/2020/03/anyone-can-map-inspiration-and-an-introduction-to-the-world-of-mapping/">um post de blog</a>:</p><pre><code>&lt;meta property="og:site_name" content="Colby Fayock" /&gt;
&lt;meta property=“og:title” content=“Anyone Can Map! Inspiration and an introduction to the world of mapping - Colby Fayock" /&gt;
&lt;meta property="og:description" content="Chef Gusteau was a visionary who created food experiences for the world to enjoy. How can we take his lessons and apply them to the world of…" /&gt;
&lt;meta property="og:url" content="https://www.colbyfayock.com/2020/03/anyone-can-map-inspiration-and-an-introduction-to-the-world-of-mapping/" /&gt;
&lt;meta property="og:type" content="article" /&gt;
&lt;meta property="article:publisher" content="https://www.colbyfayock.com" /&gt;
&lt;meta property="article:section" content="Coding" /&gt;
&lt;meta property="article:tag" content="Coding" /&gt;
&lt;meta property="og:image" content="https://res.cloudinary.com/fay/image/upload/w_1280,h_640,c_fill,q_auto,f_auto/w_860,c_fit,co_rgb:232129,g_west,x_80,y_-60,l_text:Source%20Sans%20Pro_70_line_spacing_-10_semibold:Anyone%20Can%20Map!%20Inspiration%20and%20an%20introduction%20to%20the%20world%20of%20mapping/blog-social-card-1.1" /&gt;
&lt;meta property="og:image:secure_url" content="https://res.cloudinary.com/fay/image/upload/w_1280,h_640,c_fill,q_auto,f_auto/w_860,c_fit,co_rgb:232129,g_west,x_80,y_-60,l_text:Source%20Sans%20Pro_70_line_spacing_-10_semibold:Anyone%20Can%20Map!%20Inspiration%20and%20an%20introduction%20to%20the%20world%20of%20mapping/blog-social-card-1.1" /&gt;
&lt;meta property="og:image:width" content="1280" /&gt;
&lt;meta property="og:image:height" content="640" /&gt;
&lt;meta property="twitter:card" content="summary_large_image" /&gt;
&lt;meta property="twitter:image" content="https://res.cloudinary.com/fay/image/upload/w_1280,h_640,c_fill,q_auto,f_auto/w_860,c_fit,co_rgb:232129,g_west,x_80,y_-60,l_text:Source%20Sans%20Pro_70_line_spacing_-10_semibold:Anyone%20Can%20Map!%20Inspiration%20and%20an%20introduction%20to%20the%20world%20of%20mapping/blog-social-card-1.1" /&gt;
&lt;meta property="twitter:site" content="@colbyfayock" /&gt;</code></pre><h2 id="procurando-outras-maneiras-de-otimizar-e-analisar-o-seu-conte-do-textos-do-autor-ainda-em-ingl-s-no-freecodecamp-">Procurando outras maneiras de otimizar e analisar o seu conteúdo? (textos do autor ainda em inglês no freeCodeCamp)</h2><ul><li><a href="https://www.freecodecamp.org/news/how-to-add-a-social-media-image-to-your-github-project/">How to Add a Social Media Image to Your Github Project Repository</a></li><li><a href="https://www.freecodecamp.org/news/making-sense-of-google-analytics-and-the-traffic-to-your-website/">How to Make Sense of Google Analytics and the Traffic to Your Website</a></li><li><a href="https://www.freecodecamp.org/news/how-to-set-up-and-track-youtube-channel-performance-with-google-analytics/">How to set up and track YouTube Channel performance with Google Analytics</a></li></ul><figure class="kg-card kg-image-card"><img src="https://res.cloudinary.com/fay/image/upload/w_2000,h_400,c_fill,q_auto,f_auto/w_1020,c_fit,co_rgb:007079,g_north_west,x_635,y_70,l_text:Source%20Sans%20Pro_64_line_spacing_-10_bold:Colby%20Fayock/w_1020,c_fit,co_rgb:383f43,g_west,x_635,y_6,l_text:Source%20Sans%20Pro_44_line_spacing_0_normal:Follow%20me%20for%20more%20JavaScript%252c%20UX%252c%20and%20other%20interesting%20things!/w_1020,c_fit,co_rgb:007079,g_south_west,x_635,y_70,l_text:Source%20Sans%20Pro_40_line_spacing_-10_semibold:colbyfayock.com/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_68,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_145,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_222,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_295,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/v1/social-footer-card" class="kg-image" alt="Follow me for more Javascript, UX, and other interesting things!" width="2000" height="400" loading="lazy"></figure><p><a href="https://twitter.com/colbyfayock">Siga o autor no Twitter</a><br><a href="https://youtube.com/colbyfayock">Inscreva-se no canal do autor no YouTube</a><br><a href="https://www.colbyfayock.com/newsletter/">Assine a newsletter do autor</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como carregar web fonts para evitar problemas de desempenho e acelerar o carregamento da página ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Mattia Astorino Web fonts personalizadas são usados em todos os lugares e no mundo inteiro, mas muitos (e são muitos!) sites carregam essas fontes de modo inadequado. Isso causa vários problemas para o carregamento da página, como questões de desempenho, tempo de carregamento maior, renderização bloqueada e fontes ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-carregar-web-fonts-para-evitar-problemas-de-desempenho-e-acelerar-o-carregamento-da-pagina/</link>
                <guid isPermaLink="false">62724232e15e0b050ea33bd8</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento para a Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Wed, 04 May 2022 10:25:25 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/1_ZPpEmhu_L3ndWMaMnwoJUg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/web-fonts-in-2018-f191a48367e8/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to load web fonts to avoid performance issues and speed up page loading</a>
      </p><p>Escrito por: Mattia Astorino</p><p>Web fonts personalizadas são usados em todos os lugares e no mundo inteiro, mas muitos (e são muitos!) sites carregam essas fontes de modo inadequado. Isso causa vários problemas para o carregamento da página, como questões de desempenho, tempo de carregamento maior, renderização bloqueada e fontes trocadas durante a navegação.</p><p>Vejo muitos desenvolvedores ignorando essas questões - ou, talvez, cometendo os mesmos erros repetidamente somente porque "foi o jeito que sempre fizeram", mas, por sermos desenvolvedores para a web, precisamos ser capazes de nos adaptarmos em um ambiente de constante mudança.</p><p>É a hora de interromper esse ciclo e começar a fazer o que é certo. Aqui temos quatro passos a considerar ao carregar uma fonte personalizada da web font:</p><ul><li>Uso do formato de fonte correto</li><li>Fontes pré-carregadas</li><li>Uso da declaração correta de <em>font-face</em></li><li>Evitar texto invisível durante o carregamento da fonte.</li></ul><p>Vamos tratar desses pontos, um de cada vez.</p><h3 id="uso-do-formato-de-fonte-correto"><strong><strong>Us</strong>o do formato de fon<strong>t</strong>e correto</strong></h3><p>Existem muitos formatos de fonte que podem ser usados na web, mas apenas dois formatos são realmente necessários se você não precisar dar suporte a versão 8 do Internet Explorer (IE) ou anteriores: a <a href="https://caniuse.com/#search=woff" rel="noopener"><strong><strong>woff</strong></strong></a> e a <a href="https://caniuse.com/#search=woff2" rel="noopener"><strong><strong>woff2</strong></strong></a>. Esses são os dois únicos tipos de arquivo que você deve usar, pois eles são comprimidos no formato gzip por padrão (sendo, portanto, muito pequenos), são otimizados para a web e são totalmente suportados pelo IE 9 e versões posteriores, assim como por todos os outros navegadores <em>evergreen </em>(navegadores com atualização automática).</p><h3 id="fontes-pr-carregadas"><strong>Fontes pré-carregadas</strong></h3><p>Ao usar fontes personalizadas, você deve informar ao navegador que ele deve pré-carregar as fontes usando a definição adequada com <code>rel=""</code> e seus atributos:</p><pre><code>&lt;link rel="preload" as="font" href="/fonts/custom-font.woff2" type="font/woff2" crossorigin="anonymous"&gt;</code></pre><pre><code>&lt;link rel="preload" as="font" href="/fonts/custom-font.woff" type="font/woff2" crossorigin="anonymous"&gt;</code></pre><p><em>Observe que o uso de <em>crossorigin </em>aqui é importante<em>; </em>sem esse atributo<em>, </em>a fonte pré-carregada é ignorada pelo navegador<em> </em>e um novo<em> fetch </em>acaba ocorrendo<em>. </em>Isso se dá porque espera-se que as <em>font</em>e<em>s </em>sejam obtidas (em inglês, "<em>fetched</em>") de maneira anônima pelo navegador. A solicitação de pré-carregamento só pode ser tornada anônima usando esse atributo<em>.</em></em></p><p>No exemplo acima, os atributos <code>rel="preload" as="font"</code> solicitarão ao navegador que inicie o download dos recursos <em>solicitados</em> assim que for possível. Eles também informarão ao navegador que essa é uma fonte. Assim, o navegador pode priorizá-la na fila de recursos. Usar as <a href="https://developers.google.com/web/fundamentals/performance/resource-prioritization?hl=en#preload" rel="noopener">dicas de pré-carregamento</a> causará um impacto significativo no desempenho da fonte da web e no pré-carregamento inicial. Os navegadores que dão suporte às dicas de pré-carregamento e prefetch começarão a fazer o download das web fonts assim que tiverem visto a dica no arquivo de HTML e não aguardarão mais pelo CSS.</p><p>Em vez delas, você pode usar o atributo <code>rel="prefetch"</code> para informar ao navegador que ele deve preparar o download dos recursos que poderão ser exigidos durante o carregamento da página ou ações do usuário, de modo que ele possa atribuir uma prioridade baixa a esses recursos.</p><p><strong>CUIDADO<strong>:</strong></strong><br>Ao usar uma CDN, como o Google Fonts, certifique-se de que os arquivos de fonte que você está pré-carregando correspondem àqueles que estão no CSS. As fontes podem ser atualizadas regularmente e, se você estiver pré-carregando uma versão anterior usando o CSS no lugar de uma nova, pode acabar baixando duas versões da mesma fonte e desperdiçando a largura de banda do usuário. Considere o uso de <code><a href="https://web.dev/uses-rel-preconnect/">&lt;link rel="preconnect"&gt;</a></code> para facilitar a manutenção.</p><h3 id="uso-da-declara-o-correta-de-font-face"><strong>Uso da declaração correta de <strong>font-face</strong></strong></h3><p>Declarar uma família de font-face é muito simples e devemos ter cuidado com certas coisas na hora de fazê-lo. Aqui temos um exemplo correto de declaração de uma <em>font-family</em> personalizada:</p><pre><code>@font-face {  font-family: 'Custom Font';  font-weight: 400;  font-style: normal;  font-display: swap; /* Ler o próximo ponto */  unicode-range: U+000-5FF; /* Fazer apenas o download dos glifos latinos */  src: local('Custom Font'),       url('/fonts/custom-font.woff2') format('woff2'),        url('/fonts/custom-font.woff') format('woff');}</code></pre><p>Aqui temos o intervalo Unicode em <a href="https://web.dev/optimize-webfont-loading/">Google Web Fundamentals</a>.</p><p>Como você pode ver, usamos somente fontes otimizadas (<strong><strong>woff</strong></strong> e <strong><strong>woff2</strong></strong>) e informamos ao navegador para <strong>carregar</strong> somente o intervalo de glifos necessário (de <code>U+000</code> a <code>U+5FF</code>), <em>mas essa propriedade não evita que os navegadores façam o <em>download </em>da fonte inteira</em>. Também temos outras duas coisas que precisamos observar: a função <code>local()</code> e a ordem de declaração da fonte.</p><p>A função <code>local()</code> permite que os usuários utilizem sua cópia local da fonte se ela estiver presente (imagine as fontes Roboto que já vem pré-instaladas no Android) em vez de fazer o download delas a todo momento.</p><p>A ordem de declaração das fontes também é importante, pois o navegador iniciará a busca dos recursos seguindo a ordem da declaração. Se ele der suporte ao formato woff2, ele fará o download da fonte. Se não reconhecer o formato do recurso, buscará o próximo e assim por diante.</p><p><em>Se quiser realmente usar fontes <em><code>eot</code> </em>e<em> <code>ttf</code></em>, certifique-se de adicioná-las ao final da declaração do<em> <code>src</code>.</em></em></p><h4 id="recursos"><strong><strong>Re</strong>cursos</strong></h4><ul><li><a href="https://codepen.io/elifitch/pen/Ljqway" rel="noopener">Gerador de intervalo de glifos</a>, de Eli Fitch</li><li><a href="https://transfonter.org/" rel="noopener">Gerador de font-faces modernas</a></li></ul><h3 id="evitar-texto-invis-vel-durante-o-pr-carregamento-da-fonte"><strong>Evitar texto invisível durante o pré-carregamento da<strong> font</strong>e</strong></h3><p>As fontes geralmente são arquivos grandes, que demoram a carregar, mesmo quando compactadas no formato gzip. Para lidar com isso, alguns navegadores ocultam o texto até que a fonte seja carregada (o "flash do texto invisível"). Você pode evitar o "flash" e exibir o conteúdo para os usuários imediatamente usando inicialmente uma fonte do sistema e substituindo-a após o carregamento.</p><p>No exemplo de <code>@font-face</code> anterior, você deve ter percebido a declaração de <code><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display" rel="noopener">font-display</a></code> (texto em inglês). O valor <code>swap</code> informa ao navegador que o texto usando essa fonte deve ser exibido imediatamente usando uma fonte do sistema. Quando a fonte personalizada estiver pronta, a fonte do sistema será substituída.</p><p>Se o <a href="https://caniuse.com/#search=font-display" rel="noopener">navegador não der suporte</a> a <code>font-display</code>, ele continuará a seguir seu comportamento padrão para o carregamento das fontes.</p><h4 id="comportamentos-padr-o-do-navegador-quando-uma-fonte-n-o-est-pronta-para-uso-"><strong>Comportamentos padrão do navegador quando uma fonte não está pronta para uso<strong>:</strong></strong></h4><p>O <strong><strong>Edge </strong></strong>usa uma fonte do sistema até que a fonte personalizada esteja pronta para uso, substituindo a fonte do sistema quando ela estiver.</p><p>O <strong><strong>Chrome </strong></strong>ocultará o texto por até 3 segundos. Se o texto ainda não estiver pronto, ele usará uma fonte do sistema até que a fonte personalizada esteja pronta.</p><p>O <strong><strong>Firefox </strong></strong>ocultará o texto por até 3 segundos. Se o texto ainda não estiver pronto, ele usará uma fonte do sistema até que a fonte personalizada esteja pronta.</p><p>O <strong><strong>Safari </strong></strong>ocultará o texto até que a fonte esteja pronta.</p><h3 id="testes"><strong><strong>Test</strong>es</strong></h3><p>Os links abaixo testam a "versão padrão" e a contrastam com a versão otimizada:</p><ul><li><a href="https://fontface-test.glitch.me/" rel="noopener">Padrão</a></li><li><a href="https://fontface-test.glitch.me/index-cool.html" rel="noopener">Otimizada</a></li></ul><h4 id="resultados"><strong><strong>Result</strong>ado<strong>s</strong></strong></h4><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/05/kJGcfnbRkXKJc5M350DpjuegmAuQxdIKHkly.png" class="kg-image" alt="kJGcfnbRkXKJc5M350DpjuegmAuQxdIKHkly" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/05/kJGcfnbRkXKJc5M350DpjuegmAuQxdIKHkly.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/05/kJGcfnbRkXKJc5M350DpjuegmAuQxdIKHkly.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Comportamento otimizado</figcaption></figure><h3 id="conclus-o"><strong><strong>Conclus</strong>ão</strong></h3><p>Levar em consideração essas otimizações básicas melhorará a UX em geral de seu produto digital. Devemos levar em conta situações nas quais a velocidade de conexão não é a ideal ou quando as pessoas não têm tempo de esperar por vários segundos enquanto sua aplicação/site está sendo completamente carregado até se tornar navegável.</p><p>Esses avanços, especialmente em projetos grandes, são obrigatórios para melhorar a experiência geral do usuário, não necessitando de muito esforço para colocá-los em prática.</p><p>Devemos trabalhar juntos para <a href="https://www.oreilly.com/ideas/the-web-is-broken-lets-fix-it" rel="noopener">tentar consertar</a> a web.</p><h4 id="confira-o-blog-do-autor-"><strong>Confira o blog do autor<strong>:</strong></strong></h4><p><a href="https://equinusocio.dev/"><strong><strong>Mattia Astorino</strong></strong><br><em>Desenvolvedor para a w<em>eb, </em>ninja do <em>CSS/HTML </em>de<em> Monza</em>, Itália<em>. Memb</em>ro da equinsuocha.io de design para código aberto</em></a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
