<?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" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Ruben Marcus on Medium]]></title>
        <description><![CDATA[Stories by Ruben Marcus on Medium]]></description>
        <link>https://medium.com/@rubenmarcus?source=rss-7594c582d3b7------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*FkgSJ-7KXcgnEAcjUnDfXw.jpeg</url>
            <title>Stories by Ruben Marcus on Medium</title>
            <link>https://medium.com/@rubenmarcus?source=rss-7594c582d3b7------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Tue, 23 Jun 2026 10:50:19 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@rubenmarcus/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Como construi Memescan com AI Agents (e ganhei meu primeiro hackathon)]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://rubenmarcus.medium.com/como-construi-memescan-com-ai-agents-e-ganhei-meu-primeiro-hackathon-9ee967513b8e?source=rss-7594c582d3b7------2"><img src="https://cdn-images-1.medium.com/max/800/1*XOddJCFI8Fogu_LIfRPA-w.png" width="800"></a></p><p class="medium-feed-snippet">Relato de como construi uma tool para Memecoins em Solana usando AI Agents</p><p class="medium-feed-link"><a href="https://rubenmarcus.medium.com/como-construi-memescan-com-ai-agents-e-ganhei-meu-primeiro-hackathon-9ee967513b8e?source=rss-7594c582d3b7------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://rubenmarcus.medium.com/como-construi-memescan-com-ai-agents-e-ganhei-meu-primeiro-hackathon-9ee967513b8e?source=rss-7594c582d3b7------2</link>
            <guid isPermaLink="false">https://medium.com/p/9ee967513b8e</guid>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[memecoins]]></category>
            <category><![CDATA[solanas]]></category>
            <category><![CDATA[web3]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Ruben Marcus]]></dc:creator>
            <pubDate>Thu, 21 Aug 2025 02:42:33 GMT</pubDate>
            <atom:updated>2025-08-21T02:46:46.420Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Criando seu marketplace de NFTs com Mintbase.js + Next.js]]></title>
            <link>https://rubenmarcus.medium.com/criando-seu-marketplace-de-nfts-com-mintbase-js-next-js-ac2b3832e37c?source=rss-7594c582d3b7------2</link>
            <guid isPermaLink="false">https://medium.com/p/ac2b3832e37c</guid>
            <category><![CDATA[mintbase]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[web3]]></category>
            <category><![CDATA[nft]]></category>
            <dc:creator><![CDATA[Ruben Marcus]]></dc:creator>
            <pubDate>Wed, 27 Mar 2024 02:29:52 GMT</pubDate>
            <atom:updated>2024-03-27T02:35:46.392Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ynhQwPlQ4rnrsHZ_M-aiLQ.png" /></figure><h4><strong>Nesse artigo você vai:</strong></h4><p>- Aprender sobre NFTs<br>- Aprender sobre Near Protocol<br>- Aprender como criar uma conta Near na Mintbase Wallet<br>- Aprender como criar um Contrato na Near através da Mintbase<br>- Aprender como mintar e listar um NFT<br>- Aprender como criar sua própria Marketplace na Vercel usando Mintbase.js e Next.js</p><p>A idéia desse artigo é trazer uma forma de introduzir os NFTs para entusiastas dos assuntos e abordar as diferentes perspectivas e formas de iniciar no mundo desses ativos digitais.<br>Eu, sou o Ruben, Desenvolvedor Sênior na Mintbase a 1 ano e meio, e atualmente tenho uma <a href="https://www.mintbase.xyz/human/rub3n.near/owned/0">coleção</a> de 2119 tokens, e 449 tokens listados a venda ( muitos de graça ), e mais de 4824 transações.</p><h3><strong>O que são NFTs?</strong></h3><p>NFTs (Non-Fungible Tokens), é uma tecnologia que visa identificar ativos fisicos ou digitais , através de metadados registrados na blockchain. A ideia de tokenizar ativos digitais vem de encontro a possibilitar que artistas, ou colecionadores de itens digitais, não só artes, como skins de games, videos, e diversas diferentes midias, mas também bens fisicos (como roupas, tênis, itens de colecionadores e até casas), sejam autenticados e comercializados através dos NFTs.</p><h3><strong>Para quem são os NFTs?</strong></h3><p>Para todo mundo. Foi construida uma idéia e um pré-conceito de que os NFTs são mais um esquema de piramide, ou de golpes devido a casos famosos, e devido também a desconfiança de muitas pessoas, por generalizar os NFTs apenas como &quot;jpegs de macaco&quot;.<br>Porém os NFTs são muito mais do que isso. Bens digitais e fisicos são transacionados todos os dias através dos NFTs.<br>Para o nosso caso de uso específico, podemos dizer que as chances de você enriquecer vendendo NFTs são bem baixas, porém você pode sim conseguir alguma compensação financeira vendendo artes,fotografias,mídias digitais que você produzir e enviar para a blockchain.<br>Uma das vantagens dos NFTs que após listado, você pode passar a ganhar royalties em cima de cada transação, sendo uma forma de renda contínua e indefinida para o criador ( minter ) do NFT.</p><h3><strong>Porque criar um Marketplace?</strong></h3><p>O marketplace seria basicamente o seu site com a galeria de NFTs disponiveis na sua loja de NFTs ou no seu perfil de usuário. Você pode atrair visitantes para o seu site, customizar o design, adicionar novas features, e caso seja um artista, ou alguém que quer obter financiamento de seus fãs ou fidelizar sua audiência, os NFTs é uma maneira de realizar isso.</p><h3>Near Protocol</h3><p>A Mintbase funciona em cima da <a href="https://near.org">Near Protocol</a>. A Near é a blockchain com <a href="https://dappradar.com/rankings/chains?sort=uawCount&amp;order=desc">mais usuários ativos na web3</a> (com 3.7milhões de usuários ativos todos os dias), e é uma das mais rápidas e com os custos reduzidos. Para você ter uma noção o custo de mintar (subir um NFT) na Ethereum que é a blockchain com maior numero de smart contracts, pode chegar a mais de 20 dolares ou até mais só para custear os custos da transação. Enquanto na Near é comum ser muito menos que 1 dolar.</p><h3>Testnet</h3><p>Dentro da Blockchain existe uma 2 redes principais: Mainnet ( a rede pra valer onde você coloca seu saldo em cripto e faz transações na cripto ), e a &quot;Testnet&quot; que é uma rede com saldo fake, onde qualquer um pode fazer diversas transações sem custo algum. Porém como o próprio nome diz é &quot;testnet&quot;, você não pode depois converter o cripto que você ganhou com vendas e royalties para outras criptos, ou pra moeda comum ( dólar, euros, reais ), o tutorial escrito nesse artigo tem a intenção de introduzir um marketplace em ambiente testnet, porém oferece alternativas para fazer também em Mainnet, com todos os custos agregados.</p><h3>Mintbase.js</h3><p>Mintbase.js é a biblioteca da Mintbase para interagir com os NFTs e o indexador da Mintbase na blockchain da Near. Tem diversos módulos como o @mintbase-js/data, @mintbase-js/sdk e o @mintbase-js/react, que são os packages que vamos utilizar nesse tutorial.</p><p>Fique a vontade para reportar bugs, adicionar sugestões e passar feedbacks no nosso <a href="https://t.me/mintdev">canal do telegram</a> ou no <a href="https://github.com/mintbase/mintbase-js">nosso repositório do Github.</a></p><h3>Passo 1: Criar uma conta Near</h3><h4>- Criando uma conta Near na Mintbase Wallet</h4><p>Caso você esteja usando um dispositivo <strong>Windows</strong> eu recomendo criar sua conta em <a href="https://app.mynearwallet.com">https://app.mynearwallet.com</a></p><p>Acesse <a href="https://testnet.wallet.mintbase.xyz">https://testnet.wallet.mintbase.xyz</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZJKA4sRK0yEBDFdU36A5vg.png" /></figure><p>Clique em Continue, ele vai perguntar a permissão de passkeys, (ainda sem suporte pro Windows, apenas dispositivos IOS e Android )</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/908/1*ff9VSVa523Rrz2ba8Y6Igg.png" /></figure><p>caso seu dispositivo tenha suporte a autenticação por digitais ele vai pedir a autorização:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/530/1*LXDdEEoTYTYdSt8qNds1Qw.png" /></figure><p>ele vai criar sua conta e trazer a tela de sucesso:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kYB0lvOVqXFKrHldp-cT-g.png" /></figure><p>Agora vamos criar sua Store ( Smart Contract ) na Near no site da Mintbase:</p><h4>- Criando seu Contrato na Mintbase:</h4><ul><li>vá a <a href="https://testnet.mintbase.xyz/">https://testnet.mintbase.xyz/</a></li><li>no topo na direita clique em Connect Wallet</li><li>clique em Mintbase Wallet</li><li>ele vai te redirecionar para a Mintbase Wallet:</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EGw5pve_De7TFjBpC8-BTQ.png" /></figure><ul><li>Clique em Continue, ele vai logar e te redirecionar para a Home da Mintbase.</li><li><a href="https://near-printer.vercel.app/">Visite esse site</a> e digite o address da sua conta ( vão te transferir 10 N )</li><li>Dentro do site da Mintbase logado na Home vai ter esse widget:</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/588/1*ATp_Ho7MgEYuHEPpopN4GQ.png" /></figure><ul><li>Clique em Deploy NFT Contract</li><li>Ele vai pedir o nome do contrato ( vai ser o address dele ) e o symbol:</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/924/1*tg-3e28Nw8XqFQHi804m8A.png" /></figure><ul><li>Clique em Deploy, ele vai para a pagina de transação na Wallet, e debitar (3.7 N) :</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oYZ_XQd6FvjUQRpDbIBV9g.png" /></figure><ul><li>Você vai ver a tela de sucesso:</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/816/1*-8mtPkVN3RwlAnrtzkHKlw.png" /></figure><ul><li>Na página de Contract Settings, você consegue customizar toda a sua loja, colocando links, fotos de capa, foto de perfil, entre outras opções.</li><li>Na página de Mint NFT você vai mintar o seu NFT.</li></ul><h4>Mintando seu primeiro NFT</h4><p>Na página de Mint, vou mintar a foto do cachorro caramelo, meu cachorro favorito. Como esse é um contrato testnet, não existe o problema de direitos autorais, pois é só um teste, mas uma vez mintando em Mainnet, saiba que seu NFT e até o contrato pode ser derrubado caso infrinja direitos autorais.</p><ul><li>No N de Tokens, esse é o numero de tokens que esse NFT vai ter. É como se fosse o número de edições. Imagine que você tem um evento de música e o NFT é o ingresso. O Número de tokens é o numero de ingressos. É a mesma lógica aqui.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*c9Wv3pfsAnlqsD2cGot0pA.png" /></figure><ul><li>Adicionando Royalties, na parte de Forever Royalties, você consegue adicionar até 25 contas que podem receber royalties de todas transações que esse NFT vai fazer indefinidamente.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_VvJTild20ggFAIkzs4Fyg.png" /></figure><ul><li>As outras opções dessa página são mais relativas a metadados extras do seu NFT.</li><li>Clique no botão Mint NFT</li><li>Ele vai abrir a página de transação na Wallet, clique Continue</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ds5JKxv2_bBvOjfq0zW9bg.png" /></figure><ul><li>Pronto você Mintou seu primeiro NFT!</li><li>Agora vamos Listar o NFT para venda, clique nesse botão:</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/932/1*NDT0D-fY45HSvOIAS4zC9Q.png" /></figure><ul><li>Preencha os campos e clique em Make Listing</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/984/1*GkemZfqv9UEcsVuOunaOAw.png" /></figure><ul><li>Ele vai redirecionar para a página de transação da Mintbase Wallet.</li><li>Aprove a transação</li><li>pronto seu <a href="https://testnet.mintbase.xyz/meta/minhalojananear.mintspace2.testnet%3A9e11f1ca16908c0c00b0644647601fe6">NFT está listado para venda</a></li></ul><h4>Criando seu Marketplace</h4><ul><li>Vamos primeiro acessar a <a href="https://templates.mintbase.xyz/templates/marketplace">página de Templates da Mintbase</a> , clique em Deploy</li><li>Ele vai abrir a página da Vercel para Deploy, primeiro crie o repositório:</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/854/1*-Z_egXgpd_bDE_di0HtNoQ.png" /></figure><ul><li>Sete as env vars e clique em Deploy:</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fJaBS3u0YO-hdZZ_RO5nvA.png" /></figure><ul><li>Sucesso sua Loja foi criada!</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_n5Q2PHklv2ANkOj8L3Ynw.png" /></figure><ul><li>Essa loja do cachorro caramelo pode ser <a href="https://loja-caramelo.vercel.app/">acessada aqui</a></li><li>Você pode customizar sua aplicação Next.js dentro do repositório que você criou na sua conta do Github. É uma aplicação Next.js 14, fique a vontade para customizar e caso criar mande pra gente para divulgarmos!</li><li>Para fazer o mesmo processo em Mainnet você precisa criar uma conta em <a href="https://wallet.mintbase.xyz">https://wallet.mintbase.xyz</a> e fazer as mesmas etapas em <a href="https://www.mintbase.xyz,">https://www.mintbase.xyz,</a> Porém por ser Mainnet você não consegue usar Near Faucets, você precisa comprar Near na sua exchange de preferencia como Binance, Coinbase etc, e transferir para sua conta Near.</li><li>Quaisquer dúvidas,idéias, sugestões, basta entrar em contato pelo <a href="https://t.me/mintdev">Telegram</a>, <a href="https://linkedin.com/in/rubenmarcus">Linkedin</a>, ou até <a href="mailto:rubenmarcus.dev@gmail.com">e-mail</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ac2b3832e37c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Frustrações que todo Desenvolvedor enfrenta na carreira]]></title>
            <link>https://rubenmarcus.medium.com/frustra%C3%A7%C3%B5es-que-todo-desenvolvedor-enfrenta-na-carreira-2301b8b40c87?source=rss-7594c582d3b7------2</link>
            <guid isPermaLink="false">https://medium.com/p/2301b8b40c87</guid>
            <category><![CDATA[desenvolvedor]]></category>
            <category><![CDATA[carreira]]></category>
            <category><![CDATA[web]]></category>
            <category><![CDATA[desenvolvimento-pessoal]]></category>
            <category><![CDATA[desenvolvimento-software]]></category>
            <dc:creator><![CDATA[Ruben Marcus]]></dc:creator>
            <pubDate>Sun, 11 Jul 2021 03:39:41 GMT</pubDate>
            <atom:updated>2021-07-11T16:17:28.922Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*wxDeAxNX3EjYYxUl" /></figure><p>Ser um desenvolvedor pode ser bem frustrante muitas vezes. <br>Digamos que as frustrações façam parte do dia-dia do trabalho. <br>Algumas dessas frustrações nunca vão mudar e você apenas tem que aprender a lidar com elas.<br>Aqui está uma lista que contém 9 frustrações que programadores passam com frequência com as quais você pode se identificar.</p><h3>1. Requisitos que mudam constantemente</h3><p>Você já esteve nesta situação mais de uma vez. Você está no meio da implementação de um novo recurso, quando recebe uma atualização do cliente. <br>Os requisitos para a tarefa que você está implementando mudaram. <br>Como resultado disso, é provável que você tenha que refazer ou reescrever partes do seu código.<br>Existem muitos motivos pelos quais os requisitos podem mudar inesperadamente. <br>Por exemplo, falta de comunicação, mudanças organizacionais, pressão externa ou mudanças nas leis e regulamentos.</p><p>Embora a razão para essas mudanças de requisitos, pode ser legítima, ainda é uma das maiores possibilidades para qualquer desenvolvedor se sentir desgastado e frustrado, especialmente se é recorrente.</p><h3>2. Toda solução que você tentou não funciona.</h3><p>Você pode estar trabalhando em uma tarefa complexa e tentando encontrar a melhor solução possível para a tarefa. <br>Se você é um desenvolvedor inexperiente, provavelmente se identifica com isso.<br>Você tem algumas soluções para resolver o problema em sua cabeça. <br>Você começa a digitar no teclado para implementar a solução. <br>A primeira solução não está funcionando. Não chega nem perto de uma solução funcional.<br>Ok, vamos para a segunda solução. Você começa alterando algumas linhas de código para tentar fazer o código funcionar. Que droga… sem sucesso também.<br>Você começa a ficar frustrado porque não tem mais muitas opções ou idéias para resolver esse problema. <br>É quando você chega a um ponto que todos os desenvolvedores já passaram. Você começa a olhar para a tela na esperança de uma solução que surja do nada.<br>Isso pode ser especialmente frustrante quando você tem um prazo curto de entrega, e se você passou horas, talvez o dia inteiro buscando uma solução.<br>Geralmente a solução costuma vir de um colega, ou em um momento em que sua cabeça não está quente e obcecada com o problema.</p><h3>3. Reuniões sem sentido</h3><p>Todos nós sabemos daquela reunião que poderia ter sido um e-mail. <br>O problema com as reuniões é que elas são o assassino número um da produtividade. <br>A maioria dos desenvolvedores participa de muitas reuniões.<br>O problema com as reuniões é que a maioria das reuniões é agendada para uma hora por padrão, mesmo que a agenda pudesse ser tratada em menos de meia hora. <br>Além disso, podemos dizer não a muitas reuniões. Ou talvez você deva começar a dizer não às reuniões antes do meio-dia, para que possa ser produtivo pela manhã.<br> E se você realmente tem que dizer sim a uma reunião, pelo menos diga não a reuniões longas.<br>Comparecer a muitas reuniões é um hábito de programadores ineficazes.</p><h3>4. Andando em círculos</h3><p>Você conhece esse sentimento? Acontece quando você começa a digitar um monte de código tentando resolver um problema. Você começa a cavar em busca de informações sobre como resolver o problema que está enfrentando.</p><p>A resposta que você encontrou no Stack Overflow não é à prova de balas, então você começa a procurar mais respostas sobre como fazer a resposta ideal para o seu problema.</p><p>Aquele tutorial com um caso de uso muito parecido com o seu, ajuda mas não funciona 100% como deveria.</p><p>De repente, você está se perguntando qual era o problema inicial ,que você estava tentando consertar ou por que você escolheu esse caminho em primeiro lugar.<br>Antes que você perceba, você está andando em círculos.</p><h3>5. Requisitos mal definidos</h3><p>Outro ponto de frustração para a maioria dos desenvolvedores é quando você se depara com requisitos mal definidos.</p><p>Você e sua equipe acabaram de concluir o planejamento do sprint e cada história de usuário parecia muito bem definida. <br>Não havia espaço para interpretações erradas.</p><p>Você começa escolhendo a história de usuário de maior prioridade e lê a descrição. Então você lê de novo. Um dos critérios de aceitação não é claro.</p><p>Pode ser interpretado de várias maneiras. A primeira coisa que você se pergunta é: como perdemos isso durante o refinamento e o planejamento da sprint?</p><p>Em vez de ser produtivo e trabalhar em uma história de usuário, agora você precisa verificar com o product owner para ter certeza de que vai construir algo que corresponda às expectativas do cliente — demorado e frustrante.</p><h3>6. Problemas Cross-browser</h3><p>Esta é uma frustração com a qual qualquer desenvolvedor front-end pode se identificar.</p><p>Você está trabalhando em um recurso que concluiu. O QA começa a testar a história do usuário e conclui que o recurso não funciona em seu navegador.</p><p>Acontece que sua solução só funciona em alguns dos navegadores que você deveria oferecer suporte. <br>Isso é especialmente frustrante quando você precisa oferecer suporte ao Internet Explorer. Ou como eu gostaria de chamá-lo: o navegador cujo único propósito é fazer o download de um navegador real.</p><p>Ou ao Safari.<br>Às vezes, alguns dos recursos mais recentes ainda não funcionam em todos os navegadores. Isso faz com que você reescreva a solução para que todos os navegadores sejam suportados.<br>Frustrante e demorado!</p><h3>7. Sem documentação</h3><p>A falta de documentação é uma grande frustração para todo desenvolvedor que é novo em uma equipe ou projeto.</p><p>Sem nenhum conhecimento prévio sobre um projeto, é difícil trabalhar nele. Provavelmente, é ainda mais difícil fazer o projeto rodar em sua máquina local.</p><p>Ter algum tipo de documentação que explique como colocar um projeto em execução em sua máquina e que explique alguns dos principais recursos é o mínimo. <br>Idealmente, você deseja ter uma documentação extensa para permitir que você tenha uma boa compreensão de um projeto.</p><p>Se você tiver a documentação do seu projeto, certifique-se de mantê-la atualizada.<br> Porque o que é ainda pior do que falta de documentação é a documentação errada e desatualizada.</p><h3>8. Não ter reconhecimento da equipe ou empresa.</h3><p>Você trabalha até mais tarde. Você entrega os projetos e suas tarefas antes do prazo. Na daily você fala no tempo reservado a você e sempre se mostra disposto a ajudar e ouvir seus colegas, sempre entra em calls pra ajudar quem tem dúvida, e mesmo assim a empresa ou seus colegas não o reconhecem.</p><p>Você muitas vezes trabalha feriado ou final de semana, por alguma exigência urgente do cliente, e depois ele diz que nada do que você fez vai ser usado, e que pode ser jogado fora.</p><p>Você vê outros desenvolvedores que produzem código ruim, mas que puxam o saco do chefe ou da empresa, terem promoções ou mais destaque na equipe, do que quem realmente entrega as tarefas. Pior ainda, eles (outros desenvolvedores, ou chefe) fica com todo crédito pelo seu trabalho, quando na verdade quem arrumou o código ruim dele foi você. <br>Quem palestra nas dailys ou reuniões e apresentações da empresa são eles e não você.</p><p>Isso frustra qualquer desenvolvedor motivado.</p><h3>9. Nunca ser bom o suficiente ou síndrome do impostor</h3><p>Por último, mas não menos importante, temos uma frustração que provavelmente nunca irá embora. Como desenvolvedor, uma coisa é certa, você nunca irá parar de estudar. A sensação de nunca ter domínio suficiente pode ser muito frustrante.<br>Se você tem alguma experiência como desenvolvedor, saberá que, depois de concluir um projeto, você passará para o próximo. <br>Você pode sentir que não há tempo para respirar. Você sempre se encontrará indo de um prazo para outro.</p><p>Você chegou ao final da lista. Você já passou por alguma frustração dessa lista? Ou não coloquei alguma coisa pelo qual você já passou? Fique à vontade para escrever nos comentários! 👇</p><h3>Créditos</h3><p><a href="https://levelup.gitconnected.com/frustrations-that-every-developer-can-relate-to-91d11953cdfb">Frustrations That Every Developer Can Relate To</a> escrito por <a href="https://medium.com/@daaaan?source=post_page-----91d11953cdfb--------------------------------">Daan</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2301b8b40c87" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React e gRPC com ReactRPC]]></title>
            <link>https://rubenmarcus.medium.com/react-e-grpc-com-reactrpc-3bcaebceab5c?source=rss-7594c582d3b7------2</link>
            <guid isPermaLink="false">https://medium.com/p/3bcaebceab5c</guid>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[grpc]]></category>
            <dc:creator><![CDATA[Ruben Marcus]]></dc:creator>
            <pubDate>Sun, 30 May 2021 14:03:42 GMT</pubDate>
            <atom:updated>2021-05-30T14:03:42.738Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9EBx3WxrAuudHP8bIHXeYQ.png" /></figure><p>Neste post, iremos explorar ReactRPC, uma biblioteca de integração do lado do cliente para React e gRPC-web para ajudar os desenvolvedores a ter mais facilidade na criação de uma arquitetura de serviço gRPC completa de ponta a ponta.</p><h3>O que é gRPC-web?</h3><p>Nos últimos anos, o gRPC tem sido o padrão ouro de estruturas escalonáveis ​​e de desempenho para interatividade de microsserviços.</p><p>Ao converter todos os dados em binários, o gRPC é capaz de enviar informações pela Internet em um ritmo muito mais rápido e ser facilmente compreensível por qualquer linguagem de programação popular.</p><p>Empresas como Google, Netflix e Spotify se uniram a ele, anunciando a migração total das atuais estruturas de comunicação interna para adotar totalmente o gRPC em sua arquitetura de servidor.</p><p>Para aproveitar o poder do gRPC no navegador, o Google e o Improbable desenvolveram duas implementações diferentes de uma biblioteca do lado do cliente chamada gRPC-web.</p><p>Embora seja um marco incrível, a criação de uma integração mais perfeita para back-ends escritos em qualquer linguagem popular para interagir diretamente com os clientes, o gRPC-web ainda tem alguns detalhes a serem resolvidos antes de encontrar um lugar confortável na maioria dos kits de ferramentas de desenvolvedores front-end.</p><p>Em particular, um ponto problemático foi adotar o gRPC-web em estruturas da web modernas que todos os desenvolvedores usam para construir aplicativos em grande escala.</p><h3>Conheça o ReactRPC!</h3><p>Antes do ReactRPC, os desenvolvedores de front-end que buscavam usar o gRPC-web teriam que configurar muitos bolerplates antes de cada solicitação ser enviada.</p><p>Felizmente, o gRPC-web abstrai todos esses problemas, reduzindo a curva de aprendizado da implementação, melhorando a implementação rápida e mantendo o código legível.</p><p>Em primeiro lugar, para que o gRPC possa criar canais de comunicação entre servidores de diferentes linguagens, ele cria um acordo sobre o que pode ser enviado e recebido entre o cliente e o servidor na forma de um arquivo .proto.</p><p>Para que o navegador entenda este contrato, ele deve converter o arquivo .proto em dois arquivos Javascript, exigindo que os desenvolvedores se aprofundem no código gerado automaticamente para descobrir quais chamadas gRPC-web foram nomeadas e, em seguida, nos documentos gRPC para determinar como usá-las .</p><p>Isso abre possíveis erros nas configurações iniciais e análises profundas e demoradas nas duas especificações diferentes do gRPC-web, o que pode superar quaisquer benefícios potenciais de abandonar sua arquitetura RESTful.</p><p>O ReactRPC tira todo o esforço das mãos do desenvolvedor, pegando os dois arquivos como argumentos (bem como o URL ao qual você está se conectando) e analisando esses arquivos para você no estilo do Google ou do Improbable. <br>É simples:</p><pre>const messages = require(&quot;../../helloworld_pb.js&quot;);<br>const clients = require(&quot;../../helloworld_grpc_web_pb.js&quot;);<br>const {improbRPC,googleRPC} = require(&quot;reactRPC&quot;);</pre><pre>reactRPC = googleRPC  // ou reactRPC = improbRPC</pre><pre>reactRPC.build(<br>messages,<br>clients,<br>&quot;http://&quot; + window.location.hostname + &quot;:8080&quot;<br>);</pre><p>A segunda abstração que o ReactRPC faz é manipular mensagens gRPC para você. <br>Por meio do gRPC-web, você só pode enviar mensagens predefinidas fornecidas pelo arquivo proto. <br>Cada dado que você deseja anexar a esta mensagem deve ser adicionado manualmente por métodos setter na classe da mensagem, o que torna difícil de manejar para mensagens grandes e complexas e resulta em código repetitivo ao enviar várias mensagens. <br>Com ReactRPC você pode usar objetos para representar suas mensagens. <br>Para permitir que o ReactRPC saiba que esta é uma mensagem, você define os pedaços de dados que precisam ser enviados usando pares de valores-chave correspondentes ao seu arquivo proto e, em seguida, define um campo msgType com o nome da mensagem.</p><pre>//proto file</pre><pre>message fullName{<br>string firstName = 1;<br>string lastName = 2;}</pre><pre>//index.js</pre><pre>const msg = {<br> firstName: &quot;John&quot;, <br> lastName: &quot;Doe&quot;, <br> msgType: &quot;fullName&quot; <br>}</pre><p>Por último, as chamadas da função estão disponíveis em todos os seus componentes, tornando tão fácil enviar um unário gRPC-web e chamadas de streaming quanto uma solicitação POST.</p><p>Ele modela seu arquivo proto de perto, portanto, enviar qualquer chamada é tão simples quanto ler o arquivo proto para o serviço e o nome da chamada e, em seguida, chamá-los em seus adereços com sua mensagem, headers e callbacks *.</p><p>*Callback não são necessários para chamada de streaming</p><pre>//proto file</pre><pre>service Greeter {<br>  rpc SayHello (HelloRequest) returns (HelloReply);<br>}<br>//index.js</pre><pre>this.props.Greeter.sayHello(<br>  message,<br>      {},<br>      (err, response) =&gt; {<br>        console.log(response)<br>      }<br>    );</pre><p>E você está pronto! ReactRPC fez todo o trabalho pesado para você na configuração de seu front-end. Esperamos que esta postagem tenha encorajado você a começar a implementar gRPC-web em seu aplicativo React.</p><h3>Links</h3><p><a href="https://github.com/oslabs-beta/ReactRPC">oslabs-beta/ReactRPC</a></p><h3>Créditos</h3><ul><li><a href="https://medium.com/@karandeepahluwalia/grpc-web-and-react-a-match-made-in-heaven-51a7a8ec86e6">gRPC-web and React: A match made in Heaven</a> por <a href="https://medium.com/@karandeepahluwalia?source=post_page-----51a7a8ec86e6--------------------------------">Karandeep Ahluwalia</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3bcaebceab5c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[36 conceitos para se tornar um Expert em JavaScript]]></title>
            <link>https://rubenmarcus.medium.com/36-conceitos-para-se-tornar-um-expert-em-javascript-98c4598ba316?source=rss-7594c582d3b7------2</link>
            <guid isPermaLink="false">https://medium.com/p/98c4598ba316</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Ruben Marcus]]></dc:creator>
            <pubDate>Sun, 16 May 2021 19:11:51 GMT</pubDate>
            <atom:updated>2021-06-01T19:54:55.518Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*P6R4iUeUpdc2zW7Pjr03dg.jpeg" /><figcaption>Foto por <a href="https://unsplash.com/@nesabymakers">NESA by Makers</a> no <a href="https://unsplash.com/photos/kwzWjTnDPLk">Unsplash</a></figcaption></figure><p>Você vai ouvir muitas pessoas reclamando que JavaScript é estranho e às vezes inútil. As pessoas reclamam assim porque não entendem como as coisas funcionam nos bastidores. Embora eu concorde que alguns cenários em JavaScript sejam tratados de maneira diferente, isso não o torna estranho, mas bonito à sua própria maneira.</p><p>Para começar a amar uma linguagem de programação, você deve começar examinando profundamente e dominando seus conceitos um por um.</p><p>Aqui está uma lista de 36 conceitos de JavaScript que você precisa dominar para se tornar um especialista em JavaScript completo.</p><p><strong>Observação:</strong> A maioria dos títulos não foram traduzidos, para o leitor se familiarizar com os termos originais.</p><p><a href="https://github.com/tiagoboeing/33-js-concepts">Aqui temos um repositório</a> do Tiago Boeing explicando 33 conceitos de JavaScript</p><h3>1. Execução de Call Stack.</h3><p>Todo mundo já ouviu falar do site <a href="https://stackoverflow.com/">Stack Overflow</a>.<br>Mas você sabe o que significa o verdadeiro stack overflow? Stack overflow ( ou Estouro de Pilha em português literal ) é um erro associado as operações de call stack.</p><p>Entendendo a Call stack, você vai entender como uma linguaguem de alto-nivel como JavaScript é executado.</p><p>Recomendo <a href="https://developer.mozilla.org/pt-BR/docs/Glossario/Call_stack">esse artigo</a> do MDN , para entender melhor sobre Call Stack. <br>Esse <a href="https://medium.com/luizalabs/voc%C3%AA-j%C3%A1-se-perguntou-como-o-javascript-funciona-call-stack-e-vis%C3%A3o-geral-do-mecanismo-a713d3d03856">artigo</a> da Thais Ribeiro é ótimo para entender o assunto</p><h3>2. Tipos de dados Primitivos</h3><pre>const foo = &quot;bar&quot;;<br>foo.length; // 3<br>foo === &quot;bar&quot;; // true</pre><p>Espere!</p><p>Quando você declara o valor de bar na constante foo, ela é do tipo primitivostring. Isso está ok para todo mundo. Mas como você consegue acessar a proprieadade length de uma string primitiva?</p><p>Estranho? Não.</p><p>Essa feature se chama autoboxing. No exemplo acima, o JavaScript envolve a constante em um objeto temporário e, em seguida, acessa a propriedade length desse objeto. Depois que essa etapa for concluída, o objeto é descartado com segurança.</p><p>Tendo conhecimento profundo dos tipos de dados primitivos, você saberá como eles são armazenados na memória até o ponto de sua representação binária. Você também saberá como essas situações “estranhas” ocorrem e a razão lógica por trás delas.</p><p><a href="https://developer.mozilla.org/pt-BR/docs/Glossario/Primitivo">Leia aqui</a> mais sobre Tipos de Dados Primitivos no MDN ou esse <a href="https://medium.com/@alves.guilherme1357/tipos-de-dados-primitivos-em-javascript-d7380564933c">ótimo artigo</a> do <a href="https://medium.com/@alves.guilherme1357?source=post_page-----d7380564933c--------------------------------">Guilherme Alves</a></p><h3>3. Tipos de Valor e Valores por Referência (Value Types e Reference Types)</h3><p>Recentemente, tive alguma confusão sobre como o conceito de “passagem por referência” (pass by reference) funciona no JavaScript. <br>Embora eu estivesse soubesse dos conceitos de “passagem por referência” e “passagem por valor” em linguagens como C e Java, não tinha certeza de como isso funcionava no JavaScript.</p><p>Você sabia que variáveis atribuídas a valores não primitivos em JavaScript recebem uma referência a esse valor? <br>A referência aponta para o local da memória onde o valor está armazenado.</p><pre>var arr1 = [1,2,3];<br>var arr2 = arr1;<br>arr2.push(10);</pre><pre>console.log(arr2);<br>//[1, 2, 3, 10]</pre><pre>console.log(arr1);<br>//[1, 2, 3, 10]</pre><p>No exemplo acima, qualquer mudança em arr2, vai refletir em arr1também. Isso porquê ele só atribui a referência ao valor, não o valor atual.</p><p>Ao compreender este conceito de tipos de valor e tipos de referência, você terá um melhor entendimento de como as variáveis são atribuídas com valores e referências de memória.</p><p><strong>Leia mais Aqui:</strong><br><a href="https://braziljs.org/artigos/diferencas-entre-valor-e-referencia-em-javascript/">Diferença entre valor e referência em JavaScript — Brazil JS</a><br><a href="https://blog.da2k.com.br/2017/01/25/objetos-referencias-de-valores-em-javascript/">Objetos — Referências de valores em JavaScript — Blog DA2K</a></p><h3>4. Coerção de Tipos</h3><p>Esse conceito explica principalmente a diferença entre coerção de tipo implícita e explícita. Esta é uma das poucas áreas em JavaScript em que as pessoas erram. <br>Isso é especialmente verdadeiro com o conceito de coerção de tipo implícita, porque ele se comporta de maneiras diferentes com tipos de dados diferentes.</p><p>Esta é uma das áreas de JavaScript mais testadas em entrevistas.</p><pre>Number(&#39;789&#39;)   // explicito<br>+&#39;789&#39;          // implicito<br>789 != &#39;456&#39;    // implicito<br>9 &gt; &#39;5&#39;         // implicito<br>10/null          // implicito<br>true | 0        // implicito</pre><p>Ao compreender a coerção de tipo de forma clara, você pode ficar feliz por ter um ótimo entendimento de um dos conceitos mais complicados do JavaScript.</p><p><strong>Leia mais Aqui:</strong></p><p><a href="https://medium.com/devzera/explicando-a-coer%C3%A7%C3%A3o-de-tipos-em-javascript-d6c9203c4e5#:~:text=Coer%C3%A7%C3%A3o%20de%20tipos%20(type%20coercion,v%C3%A1lido%20para%20coer%C3%A7%C3%A3o%20de%20tipo.">Explicando a coerção de tipos em Javascript por Allan Ramos</a><br><a href="https://snowdream.github.io/javascript-style-guide/javascript-style-guide/br/type-coercion.html">Air BNB JS Style Guide — Casting e Coerção de Tipos</a><br><a href="https://crisgon.github.io/posts/Coercao-de-tipos-javascript/">Coerção de tipos em Javascript — por Cristiano Gonçalves</a></p><h3>5. Comparação de Igualdades e o operador ‘typeof’</h3><p>Este conceito explica basicamente o uso de duplos iguais e triplos iguais, e quando e por que você deve usá-los. Embora pareçam iguais na superfície e forneçam os mesmos resultados na maioria das vezes, eles podem gerar bugs inesperados se você usá-los sem saber.<br>Você também deve ser capaz de usar o operador typeof e conhecer as possibilidades das saídas. Pode ficar confuso quando os objetos entram em jogo.</p><pre>typeof 3 // &quot;number&quot;<br>typeof &quot;abc&quot; // &quot;string&quot;<br>typeof {} // &quot;object&quot;<br>typeof true // &quot;boolean&quot;<br>typeof undefined // &quot;undefined&quot;<br>typeof function(){} // &quot;function&quot;typeof [] // &quot;object&quot;<br>typeof null // &quot;object&quot;</pre><h3>6. Escopo do JavaScript</h3><p>Os escopos são um dos conceitos, acredito, que deve ser aperfeiçoado no início de sua jornada JS. De acordo com Wissam, a definição simples de escopo é que é onde o compilador procura variáveis e funções quando precisa delas.</p><p>Compreender os escopos permitirá que você use o JavaScript de forma mais eficiente e eficaz.<br> Você deve aprender sobre o escopo global e o escopo do bloco e da função, também conhecido como escopo léxico.<br>O escopo JS pode parecer um tanto confuso no início, mas depois que você entender como as coisas funcionam nos bastidores, será muito emocionante trabalhar com ele.</p><h3>7. Declarações e Expressões</h3><p>Essas são as duas principais categorias sintáticas em JavaScript. Você deve saber a diferença entre esses dois e como as declarações são avaliadas. <br>Isso permitirá que você obtenha uma compreensão geral de como seu código é estruturado como expressões e instruções. <br>Você notará que a maior parte do seu código é composta por expressões, embora tenha um número menor de instruções, comparativamente. <br>Você também poderá evitar bugs resultantes do uso indevido desses dois.</p><h3>8. Immediately Invoked Function Expressions e Módulos</h3><p>As Expressões de Função Imediatamente Invocadas (IIFEs) são funções executadas assim que são definidas. <br>Eles são usados principalmente para evitar poluir o escopo global. <br>Mais tarde, os módulos ES6 foram introduzidos, fornecendo uma maneira padrão de evitar a poluição de escopo global — embora algumas pessoas acreditem que não seja uma substituição direta dos IIFEs. <br>Ao compreender os IIFEs e os módulos, você pode criar aplicativos com menos bugs devido ao manuseio incorreto do espaço global. <br>Com os módulos, no entanto, você pode fazer várias coisas.</p><h3>9. Message Queues e Loops de Eventos</h3><p>Como diz o documento MDN, o JavaScript tem um modelo de simultaneidade baseado em um loop de eventos, que é responsável por executar o código, coletar e processar eventos e executar subtarefas enfileiradas.<br> Este modelo é bastante diferente dos modelos em outras linguagens, como C e Java.<br> As messages queues são usadas no modelo de simultaneidade acima para lidar com mensagens que começam pela mais antiga. <br>As mensagens são adicionadas sempre que ocorre um evento e há um ouvinte de evento anexado a ele. <br>Ao compreender esses conceitos, você obtém um melhor entendimento de como JS funciona nos bastidores e consegue interpretar seu código.</p><h3>10. Intervalos de Tempo</h3><p>Para agendar uma chamada ou função em JavaScript, você usa dois métodos.</p><ul><li>setTimeout nos permite executar uma função uma vez após um intervalo de tempo específico.</li><li>setIntervalnos permite executar uma função repetidamente, começando após um intervalo de tempo específico e, em seguida, repetindo continuamente nesse intervalo.</li></ul><p>De certa forma, eles estão relacionados ao conceito anterior de filas de mensagens e manipuladores de eventos. Portanto, ao compreender os métodos de intervalo de tempo, podemos entender como eles funcionam e como usá-los com eficiência em nossos casos de uso.</p><h3>11.Engines de JavaScript</h3><p>Estamos nos aprofundando no JavaScript agora. Um motor JavaScript é um programa de computador ou um interpretador que executa o código JavaScript. Um mecanismo JavaScript pode ser escrito em uma ampla variedade de linguagens. Por exemplo, o mecanismo V8 que aciona o navegador Chrome foi escrito em C ++, enquanto o mecanismo SpiderMonkey que aciona o navegador Firefox foi escrito em C e C ++. É essencial que você entenda em qual mecanismo JavaScript está trabalhando para escrever um código eficiente. Os desenvolvedores móveis que usam um webview devem estar especialmente cientes disso.</p><h3>12. Operações Bitwise</h3><p>Essas operações tratam os valores como bits (0s e 1s), em vez de números decimais, hexadecimais ou octais. <br>Operadores bit a bit realizam suas operações em tais representações binárias, mas eles retornam valores numéricos JavaScript padrão. <br>Geralmente, você não usaria essas operações em seu código, mas elas têm alguns casos de uso. <br>Você pode usá-los para encontrar valores pares e ímpares, conversões de cores, extração de cores e sinalizadores de configuração. <br>Conhecendo essas operações bit a bit completamente, você pode trabalhar com tecnologias como WebGL muito bem, pois inclui muita manipulação de pixels.</p><p>Leia mais: <a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/Bitwise_XOR">Operador Bitwise XOR</a></p><h3>13. DOM e a Árvore de Layout</h3><p>A maioria de nós já ouviu falar sobre o Document Object Model (DOM), mas apenas alguns de nós o conhecem em profundidade. Você sabia que o que você vê no navegador não é o DOM? <br>É mais a árvore de renderização, que na verdade é uma combinação de DOM e CSSOM. <br>Ao entender como o DOM funciona, como é estruturado e como uma página é renderizada, somos capazes de manipular nossa página da web dinamicamente com a ajuda de JavaScript. <br>Isso é especialmente necessário para garantir que o desempenho de nosso aplicativo seja de alto padrão.</p><h3>14. Classes e Factories</h3><p>JavaScript não é uma linguagem orientada a objetos. <br>No entanto, a fim de imitar as propriedades OOP, funções construtoras foram usadas. <br>De acordo com Tania, “Classes em JavaScript não oferecem realmente funcionalidade adicional e são frequentemente descritas como fornecendo açúcar sintático sobre protótipos e herança, pois oferecem uma sintaxe mais limpa e elegante. Como outras linguagens de programação usam classes, a sintaxe de classe em JavaScript torna mais fácil para os desenvolvedores se moverem entre os idiomas. <br>“ Uma factory function é uma função que não é uma classe ou um construtor que retorna um objeto. ”<br>De acordo com o guru do JS Eric Elliot, <br>“Em JavaScript, qualquer função pode retornar um novo objeto. Quando não é uma função construtora ou classe, é chamada de factory function.”</p><p>Você deve ter um bom entendimento desses dois conceitos, especialmente quando começar a desenvolver aplicativos que são maiores em tamanho e escala.</p><h3>15. ’this’ e os métodos ‘apply’, ‘call’, e ‘bind’.</h3><p>Pessoalmente, acho que é crucial para um desenvolvedor JS entender a palavra-chave ‘this’. Se você não entender corretamente, encontrará vários problemas com seu aplicativo mais tarde.</p><p>Se você tiver um bom conhecimento da palavra-chave this, poderá se compreender os métodos apply , call, ebind .</p><p>Esses métodos são necessários para invocar funções com o contexto apropriado. Você precisará especialmente do método bind ao passar um retorno de chamada que usa this.</p><h3>16. Funções Construtoras e o operador ‘instanceOf’</h3><p>As funções construtoras são como funções comuns. <br>Mas elas têm algumas diferenças. <br>Por convenção, o nome da função começa com uma letra maiúscula e só deve ser executada com o operador new. <br>A palavra-chave new será familiar para programadores com experiência em OOP.<br> Para identificar corretamente o tipo de um objeto, usamos o operador instanceof. <br>Em termos simples, ele verifica se um objeto é uma instância de outro. Isso ajudará você a entender como os objetos são herdados uns dos outros. <br>A herança é obtida por <em>prototypes</em>.</p><p><a href="https://developer.mozilla.org/pt-BR/docs/Learn/JavaScript/Objects/Object-oriented_JS#construtores_e_inst%C3%A2ncias_de_objeto">MDN: Construtores e instâncias de objeto</a></p><h3>17. Prototypes</h3><p>Este é um dos conceitos mais confusos em JavaScript, mesmo para alguém com dez anos de experiência.</p><p>Prototypes em JavaScript são o mecanismo para compartilhar funcionalidades comuns entre objetos. Quase todos os objetos em JavaScript são instâncias de Object. Um objeto típico herda todas as propriedades e métodos de Object.prototype. Em termos simples, um prototype é um objeto do qual os objetos JavaScript herdam métodos e propriedades. Ao compreender melhor os prototypes, você pode construir aplicativos que sejam eficientes e rápidos.</p><p><a href="https://tableless.com.br/dominando-o-uso-de-prototype-em-javascript/"><strong>Dominando o uso de protype com Javascript</strong></a></p><h3>18. Criando objetos com ‘new’, ‘Object.create’, e ‘Object.assign’</h3><p>Existem muitas maneiras de criar um objeto em JavaScript. Mas há um motivo pelo qual alguém escolheria o método Object.create em vez da palavra-chave new. Ao usar o método Object.create, você pode usar um objeto existente como protótipo do objeto recém-criado. Isso permitirá que você reutilize propriedades e funções de um objeto existente, de forma semelhante ao conceito de herança em OOP.</p><p>Ao usar o método Object.assign, você pode copiar propriedades próprias enumeráveis de um ou mais objetos de origem para um objeto de destino. Nessa situação, o protótipo do objeto de destino não contém as propriedades do objeto de origem. Essa é a principal diferença entre esses dois métodos.<br>Ao compreender essas três formas de criação de objeto, você pode usá-las apropriadamente em seus aplicativos, de acordo com seus casos de uso, para criar programas com uso eficiente de memória.</p><h3>19. Os métodos ‘map’, ‘filter’, ‘forEach, e ‘reduce’</h3><p>Esses quatro métodos são muito úteis quando se trata de manipulação de array. Eles são encontrados no protótipo do Array.</p><p>Se você precisa alterar os valores de cada elemento de um Array, sem gerar um novo array, apenas alterando o array original, utilize o método forEach.</p><p>Se você tem um array e quer fazer algo para / com cada elemento e retornar um novo array, então você deve usar o método map.</p><p>O métodoreduce executa uma função redutora em todos os elementos de uma array e, finalmente, retorna um valor no final. Um exemplo perfeito seria encontrar a soma de todos os elementos em um array.</p><p>Se você tiver uma array e quiser executar uma condição em cada elemento e obter os valores que passam na condição, você deve usar o métodofilter.</p><p>Observe que os três métodos acima não modificam / alteram os valores da Array original.</p><p><strong>Leia mais:</strong> <a href="https://programadriano.medium.com/javascript-entendendo-a-diferen%C3%A7a-entre-map-x-foreach-366a77fc7e82">JavaScript: Entendendo a diferença entre map x forEach — por Thiago S.Adriano</a></p><p><a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array">Array — MDN</a></p><h3>20. Funções Puras, Side Effects, e State Mutations</h3><p>Esses três conceitos são muito importantes para um desenvolvedor JavaScript. <br>A mutação de estado é especialmente importante para desenvolvedores que trabalham com React.</p><p>Uma função pura é uma função que sempre retorna um valor consistente com a entrada fornecida, sem acessar / alterar nenhuma variável fora de seu escopo. Esse tipo de função é mais fácil de ler, depurar e testar.</p><p>Os Side Effects são um trecho de código por meio do qual uma variável é criada e disponibilizada em todo o escopo quando não é necessário. Se sua função estiver acessando uma variável que está fora do escopo, há um side effect.</p><p>A mutação de estado é onde você altera o valor de uma variável. Se você alterar uma variável, existe a possibilidade de que ela afete outras funções, dependendo do valor anterior à mutação. Em um ambiente React, é recomendável não alterar seu estado.</p><p>Leia mais: <a href="https://desenvolvedor.expert/por-que-imutabilidade-eh-importante-fd0ba22f103e?gi=b8ed535b7406">Porque Imutabilidade é tão importante?</a></p><h3>21. Closures</h3><p>As Closures são difíceis de entender. Mas, uma vez compreendido, você começará a ver a beleza do JavaScript.</p><p>Uma closure forneceria acesso ao escopo de uma função externa dentro do escopo interno. Closures JavaScript são criados sempre que uma função é criada, no momento da criação da função.</p><p>Descubra por que você deve usar closures para obter uma compreensão mais profunda deles.</p><p><a href="https://medium.com/@stephanowallace/javascript-mas-afinal-o-que-s%C3%A3o-closures-4d67863ca9fc">Mais afinal o que são closures?</a> por Stephano Wallace</p><h3>22. Higher-Order Functions</h3><p>Higher-Order Functions são funções que recebem outras funções como argumentos ou retornam funções como resultado.</p><p>Você pode criar funções menores que cuidam de apenas uma tarefa e, em seguida, construir funções complexas com a ajuda dessas funções menores. Isso também resultará em um aumento na capacidade de reutilização do código.</p><p>Isso também reduz bugs e torna nosso código mais fácil de ler e entender.</p><pre>const double = n =&gt; n * 2<br><br>[1, 2, 3, 4].map(double) // [ 2, 4, 6, 8 ]</pre><p>Exemplo: A função map do Array é uma High Order Function.</p><h3>23. Recursão</h3><p>Recursão, é um conceito comum em todas as linguagens de programação. Em termos simples, recursão é o conceito de dividir um problema maior em partes menores e depois resolver os problemas menores.</p><p>Colocado em prática, isso geralmente significa escrever uma função que chama a si mesma. Embora a recursão possa ser um conceito confuso para entender, você pode entendê-lo melhor com muita prática, começando com pequenos problemas.</p><p>Mas cuidado, você pode encontrar um erro de (Estouro de pilha) stack overflow se não for cuidadoso com sua recursão. Como exercício, faça pesquisas sobre esse erro.<br> Você precisará revisar seu conhecimento sobre o primeiro tópico, Callback stack, para compreender totalmente o contexto desse erro.</p><h3>24. Collections e Generators</h3><p>Collections e generators foram introduzidos recentemente no ES6. As collections recém-introduzidas foram Map, Set, WeakSet, eWeakMap.. Essas collectionsfornecem alguns casos de uso realmente bons para você trabalhar. É essencial que você os conheça, especialmente com o JavaScript moderno.</p><p>Generators, por outro lado, às vezes são um pouco difíceis de entender, especialmente para iniciantes. <br>Os generators permitem que você escreva funções de código que fornecem a capacidade de pausar e reiniciar uma função sem bloquear a execução de outro código, o que é algo incomum em JavaScript.</p><h3>25. Promises</h3><p><a href="https://scotch.io/@jecelyn">Jecelyn </a>explica Promises da seguinte forma: “Imagine que você é uma criança. Sua mãe promete que ela vai lhe dar um novo telefone na próxima semana.”<br>Você não saberá se receberá esse telefone até a próxima semana. Sua mãe realmente compra um telefone novo para você — ou ela não compra porque ela não está feliz.</p><p>Isso é uma promise. Uma promise tem três estados. Eles são:<br>Pending: você não sabe se vai conseguir esse telefone.<br>Fulffiled: mamãe está feliz e ela compra um telefone novo para você.<br>Rejected: mamãe está infeliz e não compra um telefone para você.</p><p>Esta é de longe a explicação mais simples e clara que encontrei para Promises.</p><h3>26. Programação Assíncrona</h3><p>Para entender o que é programação assíncrona, devemos primeiro atualizar nosso conhecimento de programação síncrona. A programação síncrona bloqueia threads e, como o JavaScript é de thread único, seu código será executado linha por linha.</p><p>Mas, com o código assíncrono, você pode realizar longas solicitações de rede sem bloquear o thread principal. Isso é especialmente útil quando você precisa realizar várias tarefas que demoram muito para serem concluídas. Mas pode haver casos em que você precise bloquear o thread, mesmo para uma tarefa longa.</p><p>Você usaria o conceito de async/awaitnaquele momento.<br>Aprender bem esses conceitos permitirá que você escreva programas com desempenho eficiente, mesmo com muitas tarefas em execução.</p><h3>27. Arrow Functions</h3><p>As arrow functions foram adicionadas ao ES6 e são uma substituição sintática das funções regulares. A diferença é que as arrow functions não se vinculam às palavras-chave <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this">this</a>, <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments">arguments</a>, <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/super">super</a>, ou <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new.target">new.target</a>. Isso torna as arrow functions uma ótima escolha em alguns cenários, mas muito ruim em outros.<br>Portanto, você nunca deve criar o hábito de usar as arrow functions o tempo todo. Implemente-os de acordo com seu caso de uso.</p><p>Vale a leitura: <a href="https://udgwebdev.github.io/quando-nao-usar-arrow-functions/#:~:text=Jamais%20use%20arrow%20function%20em,%3D%20idade%3B%20%7D%20%7D%20Cliente.">Quando não usar Arrow Functions</a></p><h3>28. Estrutura de Dados</h3><p>As estruturas de dados são uma das peças essenciais do conhecimento que um desenvolvedor deve ter, independentemente da linguagem de programação.<br>“Os programadores ruins se preocupam com o código. Os bons programadores se preocupam com as estruturas de dados e seus relacionamentos.”<br>-Linus Torvalds, criador do Linux e Git</p><p>Por ter um conhecimento profundo de diferentes estruturas de dados, você pode criar programas eficientes que funcionam bem em diferentes circunstâncias. Você deve saber sobre linked lists, queues, stacks, árvores, grafos e hash tables.</p><h3>29. Complexidade de Tempo</h3><p>A análise da complexidade do tempo também é outro fundamento da programação de computadores, independentemente da linguagem de programação. Para construir melhores aplicativos, você deve escrever melhores soluções. Para fazer isso, você deve entender o conceito de complexidade do tempo. Às vezes é chamado de Big O.<br>A notação Big O descreve o tempo de execução necessário ou o espaço usado por um algoritmo. <br>A notação Big O descreve especificamente o pior cenário.<br>Isso permitirá que você selecione e implemente o algoritmo que terá o melhor desempenho, mesmo no pior cenário.</p><h3>30. Algoritmos</h3><p>Esta é uma das primeiras coisas que você aprenderá em um curso de ciência da computação. Em palavras simples, um algoritmo é um processo passo a passo de como você consegue algo.<br> Um programador deve ser capaz de olhar para qualquer problema de uma perspectiva algorítmica. Eles devem ser capazes de estruturar o problema e sua solução em um processo passo a passo. Este algoritmo é o que você escreverá como um programa mais tarde.<br>Embora existam vários algoritmos por aí para milhares de casos de uso, dois dos casos de uso são bastante comuns:</p><ul><li>Search</li><li>Sort</li></ul><p>Esses dois casos de uso são muito comuns aos programadores e você deve ter pelo menos um conhecimento completo dos algoritmos conhecidos disponíveis para eles. Não existe uma regra fixa afirmando que você deve usar um desses algoritmos, mas esses algoritmos são bem conhecidos e bem documentados em termos de desempenho.</p><p>Você pode até criar seu próprio algoritmo e apresentá-lo ao mundo. <br>Se for melhor do que os algoritmos atualmente conhecidos, você pode se tornar a próxima estrela da programação!</p><h3>31. Herança, Polimorfismo e Re-uso de código</h3><p>A herança em JavaScript funciona com protótipos. Isso ocorre porque o JavaScript é uma linguagem não OOP. <br>Ainda assim, o JavaScript fornece alguns recursos de OOP ao fornecer herança prototípica.<br>O polimorfismo, por outro lado, é um conceito em que um objeto, variável ou função pode assumir várias formas. <br>Em JavaScript, é um pouco mais difícil ver os efeitos do polimorfismo porque os tipos mais clássicos de polimorfismo são mais evidentes em sistemas estaticamente tipados.<br>Os dois conceitos acima nos ajudam com a reutilização de código em JavaScript. Ter um entendimento sólido dos dois conceitos acima, especialmente com JavaScript, permitirá que você escreva um código de alta qualidade e praticidade.</p><h3>32. Design Patterns</h3><p>Na engenharia de software, um padrão de projeto é uma solução bem conhecida e replicavel para um problema comum. <br>Existem vários padrões de design por aí, cada um com seu próprio caso de uso.<br> <a href="https://djesusnet.medium.com/design-patterns-gof-o-que-s%C3%A3o-e-quais-os-benef%C3%ADcios-9cd0cfdd6ebf">Os 23 padrões da Gang of Four (GoF) </a>são geralmente considerados a base para todos os outros padrões. É muito difícil conhecê-los todos, mas você pode pelo menos tentar entender seus casos de uso.</p><p>Aqui está um <a href="https://github.com/fbeline/Design-Patterns-JS">ótimo repositório de Felipe</a> que tem implementações dos 23 padrões GoF em JavaScript. Percorra os recursos mencionados no final deste artigo para se familiarizar com alguns recursos fantásticos de Leonardo, uma inspiração para este artigo.</p><h3>33. Programação Funcional</h3><p>De acordo com o Wiki, “a programação funcional é um paradigma de programação — um estilo de construção da estrutura e elementos de programas de computador — que trata a computação como a avaliação de funções matemáticas e evita a mudança de estado e dados mutáveis.”<br>Existem vários conceitos de programação funcional que você precisará dominar:</p><ul><li>Funções puras</li><li>Imutabilidade</li><li>Transparência referencial</li><li>Higher-order functions</li></ul><p>Compreender esses conceitos de programação funcional certamente dará a você uma vantagem.</p><p><strong>Leia Mais:</strong> <a href="https://medium.com/tableless/entendendo-programa%C3%A7%C3%A3o-funcional-em-javascript-de-uma-vez-c676489be08b">Entendendo Programação Funcional em JavaScript de uma vez</a></p><h3>34. Clean Code</h3><p>Esta é uma habilidade essencial que todo desenvolvedor deve dominar, independentemente da linguagem de programação. <br>Cada linguagem de programação possui um conjunto separado de boas práticas. <br>Embora essas “boas” práticas sejam subjetivas e difiram de local de trabalho para local de trabalho, há algumas práticas consideradas “boas”.</p><p>Seguindo esses princípios de código, você pode garantir que seu código possa ser lido e mantido por todos. <br>Isso ajudará você e sua equipe a trabalhar juntos sem problemas durante o desenvolvimento do aplicativo.</p><p><strong>Leia Mais:</strong> <a href="https://github.com/felipe-augusto/clean-code-javascript">Clean Code JavaScript em Português</a></p><h3>35. Spread Operator</h3><p>O operador de atribuição de desestruturação foi introduzido no ES6. <br>Ele tem vários casos de uso com os quais você definitivamente deve estar familiarizado. <br>Eles são mais fáceis e eficientes do que as implementações anteriores para os mesmos casos de uso. <br>Isso também é conhecido como o operador de propagação.</p><p><strong>Leia Mais:</strong> <a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment">MDN: Atribuição via desestruturação</a></p><h3>36. Novas features do ES2020 e ES2021</h3><p>A beleza da programação é que você nunca pode ser um especialista em uma linguagem de programação sem aprendizado contínuo. As linguagens de programação evoluem continuamente com o tempo, à medida que recursos adicionais são introduzidos em cada versão principal.</p><p>Isso significa que seu conhecimento especializado de um conceito ficará desatualizado ou obsoleto em outros dez anos, pois haveria uma alternativa melhor lançada com uma atualização de versão. Este é um cenário muito comum com qualquer linguagem de programação.</p><p>Dominar um idioma exigirá anos de experiência e tempo, mas saber o que dominar tornará as coisas mais fáceis para você.</p><p>Este <a href="https://github.com/tiagoboeing/33-js-concepts">repositório Github</a> é um bom lugar para começar.</p><p>Obrigado por ler e ótima programação</p><h3>Créditos</h3><p><a href="https://betterprogramming.pub/36-javascript-concepts-you-need-to-master-to-become-an-expert-c6630ac41bf4">36 Concepts to become an JavaScript Expert </a>por <a href="https://medium.com/@mahdhirezvi?source=post_page-----c6630ac41bf4--------------------------------">Mahdi Rezvi</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=98c4598ba316" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Um guia de React Server Components]]></title>
            <link>https://rubenmarcus.medium.com/um-guia-de-react-server-components-6ff8105e9052?source=rss-7594c582d3b7------2</link>
            <guid isPermaLink="false">https://medium.com/p/6ff8105e9052</guid>
            <category><![CDATA[servers]]></category>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[react]]></category>
            <dc:creator><![CDATA[Ruben Marcus]]></dc:creator>
            <pubDate>Thu, 25 Feb 2021 22:53:37 GMT</pubDate>
            <atom:updated>2021-02-25T23:00:44.868Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eaWpXwiWHA5Dz60ca-H44Q.jpeg" /></figure><h3>O que é React Server Components?</h3><p>React Server Components é uma feature experimental do React, <a href="https://reactjs.org/blog/2020/12/21/data-fetching-with-react-server-components.html">anunciada</a> no blog do React.js em 21 de Dezembro de 2020.<br>No momento (25/02/2021) ainda não está pronto para produção.</p><p>O maior apelo do React Server Components, é mover componentes que não tem interação com o usuário do client para o server.</p><p>Outro problema encontrado é o número alto de requests feitos, enquanto os usuários esperam para a página ou os dados, estarem prontos, quando eles abrem a página.</p><p>Por exemplo uma forma de fazer fetch de dados hoje, é chamar uma API usando o hook useEffect :</p><pre>useEffect(() =&gt; {<br>  <strong>axios.get(&quot;ENDEREÇO AQUI&quot;)</strong><br>  .then((response) =&gt; {<br>    // set data into state    <br>setData(response.data);<br>  })<br>  .catch((error) =&gt; {<br>    console.log(error);<br>  });<br>}, []);</pre><p>Apesar de não ter nada de errado com isso, essa forma de pegar os dados sempre vai ter um custo de tempo para renderizar algo útil para o usuário.</p><p>O outro problema claro é sempre o tamanho do <strong>bundle</strong>. Minificação, code splitting, eliminação de código morto, são algumas técnicas utilizadas para reduzir o tamanho do bundle de uma aplicação React. Porque? Porque impacta diretamente na experiência do usuário, com carregamentos lentos.</p><h3><strong>Como funciona?</strong></h3><p>Como essa feature do React ainda está em fase de experimentação, recomendo assistir a live explicando o conceito do React Server Components, pois a implementação pode mudar com o tempo.</p><p>Pode também<a href="http://github.com/reactjs/server-components-demo"> <strong>clonar o repositório demo</strong></a> para entender como funciona a feature</p><p>A primeira coisa que notamos são vários packages com versão experimental no arquivo package.json :</p><pre>&quot;react&quot;: &quot;0.0.0-experimental-3310209d0&quot;,<br>&quot;react-dom&quot;: &quot;0.0.0-experimental-3310209d0&quot;,<br>&quot;react-fetch&quot;: &quot;0.0.0-experimental-3310209d0&quot;,<br>&quot;react-fs&quot;: &quot;0.0.0-experimental-3310209d0&quot;,<br>&quot;react-pg&quot;: &quot;0.0.0-experimental-3310209d0&quot;,<br>&quot;react-server-dom-webpack&quot;: &quot;0.0.0-experimental-3310209d0&quot;,</pre><p>Os pacotes react , react-dom e, react-server-dom-webpack estão usando uma versão experimental que funcionam com o React Server Component, enquanto oreact-fetch , react-fs e react-pg é um grupo de packages usado pela interação com o sistema de input/output ( chamado de libs do React IO)</p><p>Outro ponto importante é que o demo funciona em cima do Express.js, o que faz sentido, porque você precisa de um servidor para renderizar os componentes.Mas isso levanta a questão, Server Components apenas em ambientes Java Script? Nada de Go, Java, C# .NET, PHP?</p><p>Dentro da pasta src/ você tem três tipos de extensões nos arquivos:</p><ul><li>.server.js indica um Server Components</li><li>.client.js indica um React Client Components</li><li>O habitual .js , pode ser rodado no client ou no server. Dependendo de quem o importa. Também serve para Shared Components. Por exemplo se você importa um Shared Component no server, ele atuará como Server Component, se você importa ele no Client, Será um Client Component.</li></ul><p>Quando você inicia sua aplicação com o comando npm start, duas tarefas vão ser executadas simultaneamente:</p><ul><li>O servidor Node, rodando o scriptserver/api.server.js</li><li>O build do Webpack rodando o bundle client-side do React, usando o script scripts/build.js</li></ul><p>Olhando o script do server podemos ver que o app.server.js está sendo importado para o arquivo:</p><pre>const ReactApp = require(&#39;../src/App.server&#39;).default;</pre><p>e depois é processado com um <a href="https://github.com/reactjs/server-components-demo/blob/main/server/api.server.js#L76">Node Writable stream</a>:</p><pre>const {<strong>pipeToNodeWritable</strong>} = <br>require(&#39;react-server-dom-webpack/writer&#39;);</pre><pre>async function renderReactTree(res, props) {<br>  await waitForWebpack();<br>  const manifest = readFileSync(<br>    path.resolve(__dirname, &#39;../build/react-client-manifest.json&#39;),<br>    &#39;utf8&#39;<br>  );</pre><pre>  const moduleMap = JSON.parse(manifest);<br>  <strong>pipeToNodeWritable(React.createElement(ReactApp, props), res, moduleMap);</strong><br>}</pre><h3>Bundle de tamanho Zero</h3><p>O código dentro da extensão .server.js incluindo suas dependências , não é incluindo no bundle do client. Isso significa que tem zero efeito no tamanho do bundle.</p><p>As bibliotecas que importamos no código atualmente, serão lidas do lado do servidor, economizando no tamanho do bundle do client.</p><p><strong>Client Component:</strong></p><pre>//markdown.js</pre><pre>import marked from &#39;marked&#39;; // 37.38KB</pre><pre>import sanitizeHtml from &#39;sanitize-html&#39;; // 208 KB</pre><pre>export default function TextwithMarkdown({Text}) {<br> return(<br> &lt;div className=&quot;text-markdown&quot;<br>      dangerousSetInnerHTML={{<br>      __html: sanitizeHtml(marked(text)),<br>      }}<br>         /&gt;<br> );<br>}</pre><p>Server Component:</p><pre>// markdown.server.js</pre><pre>import marked from &#39;marked&#39;; // 0KB</pre><pre>import sanitizeHtml from &#39;sanitize-html&#39;; // 0KB</pre><pre>export default function TextwithMarkdown({Text}) {<br> return(<br> &lt;div className=&quot;text-markdown&quot;<br>      dangerousSetInnerHTML={{<br>      __html: sanitizeHtml(marked(text)),<br>      }}<br>         /&gt;<br> );<br>}</pre><h3>Acesso do backend ao banco de dados:</h3><p>Server Components tem acesso direto ao banco de dados ou ao filesystem no servidor. Você pode pegar qualquer dado que você quiser e mandar para o client, no primeiro render:</p><p>como você pode ver no exemplo do arquivo <a href="https://github.com/reactjs/server-components-demo/blob/main/src/NoteList.server.js">NoteList.server.js </a>:</p><pre>export default function NoteList({searchText}) {<br><strong>const notes = db.query(<br>    `select * from notes where title ilike $1 order by id desc`,<br>    [&#39;%&#39; + searchText + &#39;%&#39;]<br>  ).rows;</strong><br>  <br>  return notes.length &gt; 0 ? (<br>    &lt;ul className=&quot;notes-list&quot;&gt;<br>      {notes.map((note) =&gt; (<br>        &lt;li key={note.id}&gt;<br>          &lt;SidebarNote note={note} /&gt;<br>        &lt;/li&gt;<br>      ))}<br>    &lt;/ul&gt;<br>  ) : (<br>    &lt;div className=&quot;notes-empty&quot;&gt;<br>      {searchText<br>        ? `Couldn&#39;t find any notes titled &quot;${searchText}&quot;.`<br>        : &#39;No notes created yet!&#39;}{&#39; &#39;}<br>    &lt;/div&gt;<br>  );<br>}</pre><h3>Restrições</h3><p>Assim como os Server Components são estáticos e renderizados no backend, eles tem algumas restrições de como podem ser usados.</p><ul><li>Primeiro, um Server Component não tem nenhuma interatividade (sem useState(),nem useEffect()). <br>Uma resolução para esse problema, seria importar Client Components, ( que podem ser interativos) , dentro de um Server Component, por exemplo você pode ter o melhor dos dois mundos:</li></ul><pre>//Page.server.js</pre><pre>// import de componente interativo do client<br>import Button from &#39;.Button.client.js&#39;;</pre><pre>export default Page() {<br> // data fetch, processamento, outras coisas..</pre><pre>return(<br>  // use o &lt;Button /&gt; e outros componentes interativos aqui<br>  );</pre><pre>}</pre><ul><li>Segundo,props de um Server Component para um Client Component tem que ser serializada na rede ( ex: passar dados como strings, JSON e JSX mas não podem passar em funções JavaScript) . Isso é porque os Server Components renderizados tem que ser enviados pela rede.</li></ul><h3>Rotas</h3><p>Analizando o projeto no demo no github, as rotas são setadas direto no arquivo<a href="https://github.com/reactjs/server-components-demo/blob/main/server/api.server.js"> api.server.js</a>, onde literalmente, você constroi uma api como quiser, algo que o Next.js também tem como feature, seja fazendo sua própria Api server-side, ou refletindo na pasta /api</p><h3>Quais as vantagens?</h3><p>No começo parece muito com Server-Side Rendering (SSR). Na verdade oferece vantagens muito similares:</p><ul><li>Desenvolvimento mais fácil, por ter acesso a recursos de servidor como : banco de dados,filesystem, micro serviços, etc.).</li><li>Melhor performance, pois evitamos a latência de rede entre servidor e cliente.</li><li>Menor tamanho do bundle. Libs que forem usados só no servidor não precisam ser usados no client : (como loadash, rambda, moment,e etc.), além dos Server Components nunca serem incluidos no bundle, e lidos pelo client.</li><li>Segurança: Fazer queries no lado do servidor sempre é mais seguro que no client. Além de não expor as requisições</li><li>Pode fazer queries GraphQL</li><li>Pode acessar diretamente bancos de dados PostgreSQL com o package react-pg</li></ul><p>Também oferece algumas vantagens para desenvolvedores React:</p><ul><li>Code splitting automático. (A técnica de dividir o código em bundles menores, para o cliente ler apenas o que é necessário) Atualmente, Desenvolvedores React tem que fazer um esforço para poder implementar o code splitting algo como:</li></ul><pre>const MyComponent = React.lazy(() =&gt; import(&#39;./MyComponent.js&#39;));</pre><p>no futuro os Server Components vai lidar com isso automaticamente. Isso significa que poderemos importar diretamente como já fazemos:</p><pre>import MyComponent from &#39;./MyComponent.client.js&#39;;</pre><h3>Como os Server Components são diferentes de SSR (ex: Next.js)?</h3><p>Utilizamos SSR hoje no React, apenas para que os componentes sejam renderizados como HTML no client, para que sua aplicação pareça ter uma resposta muito rápida. Seu usuário não consegue fazer nada na sua aplicação até que o JavaScript seja baixado.</p><p>React Server Components é diferente.Como <a href="https://youtu.be/TQQPAU21ZUw?t=1500">mostrado no demo</a>, Server Components não é renderizado como HTML mas como um stream de formato especial enviado ao client. O stream não tem um padrão de protocolo, mas se parece muito com json. Aqui um exemplo:</p><pre>M1:{&quot;id&quot;:&quot;./src/SearchField.client.js&quot;,&quot;chunks&quot;:[&quot;client5&quot;],&quot;name&quot;:&quot;&quot;}</pre><p>No SSR , usamos apenas para o render inicial, Server Components podem puxar os dados multiplas vezes para fazer re-render ( no exemplo do demo, os posts de markdown)</p><h3>Server Component x Client Components</h3><p>Vamos considerar o exemplo de uma aplicação que tem uma barra de busca para filmes, linkada a um banco de dados do seu backend. Vamos considerar que os resultados são um React Server Component, não um component comum (client), no caso do client component isso iria ocorrer:</p><ol><li>Assim que você ,uma requisição fetch é feita para uma API para um payload JSON.</li><li>Assim que você recebe a resposta, você parseia o JSON, e manda pro React.</li><li>O React renderiza os dados, e mostra as informações do filme na tela.</li></ol><p>Simples , não? Com React Server Components acontece o seguinte:</p><ol><li>Uma requisição é feita para um backend que você é dono e é capaz de fazer um render RSC ( React Server Component)</li><li>O componente é renderizado no próprio servidor, e você recebe um build do markup estático, sem ser JSON ou HTML , como abaixo: M1:{“id”:”./src/SearchField.client.js”,”chunks”:[“client5”],”name”:””}</li><li>O frontend (client), renderiza esse markup, como um UI estático ( importante: não um componente React), isso salva processamento adicional do componente no front-end.</li></ol><h3>Conclusão</h3><p>React Server Components é uma nova abordagem de como construímos nossas aplicações React.<br>Pode mudar toda forma como o mercado utiliza o framework, e abre um leque de possibilidades em questão de performance, segurança e organização de código.<br>Por enquanto, podemos apenas brincar e testar, não sendo recomendado usar em produção.<br>A thread oficial no github tem a discussão da feature e do conceito, e muitas pessoas estão participando dando sugestões, críticas e idéias, e você também pode participar. Sugiro caso conheça inglês também ler os artigos linkados abaixo.</p><h3>Com conteúdo traduzido de:</h3><p><a href="https://blog.bitsrc.io/react-server-components-1ca621ac2519">Bits and Pieces — React Server Components</a> por <a href="https://nathansebhastian.medium.com/?source=post_page-----1ca621ac2519--------------------------------">Nathan Sebhastian</a><br><a href="https://dev.to/nilanth/an-introduction-to-react-server-components-fk4">An Introduction to React Server Components</a> por Nilanth<br><a href="https://www.freecodecamp.org/news/react-server-components/">React Server Components Explained</a> por Mehul Mohan</p><h3>Links Úteis:</h3><p><a href="https://addyosmani.com/blog/react-server-components/">React Server Components </a>— Addy Osmani<br><a href="https://github.com/reactjs/server-components-demo">React Server Components Github Demo</a><br><a href="https://www.youtube.com/watch?v=TQQPAU21ZUw">React Server Components Video Explicação</a><br><a href="https://reactjs.org/blog/2020/12/21/data-fetching-with-react-server-components.html">Post no Blog do React sobre React Server Components</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6ff8105e9052" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React: Evitando Anti-patterns]]></title>
            <link>https://rubenmarcus.medium.com/react-evitando-anti-patterns-66798a17f4a0?source=rss-7594c582d3b7------2</link>
            <guid isPermaLink="false">https://medium.com/p/66798a17f4a0</guid>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[react]]></category>
            <dc:creator><![CDATA[Ruben Marcus]]></dc:creator>
            <pubDate>Thu, 15 Oct 2020 18:37:54 GMT</pubDate>
            <atom:updated>2020-10-15T19:35:59.311Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/829/1*MBJKXvzMTnJAXFZgDIz3cA.jpeg" /></figure><h3>bind() e Funções em Componentes</h3><p>Quando chamamos bind nos componentes de classe React, não devemos chamá-los repetidamente em nossos adereços.</p><p>Em vez disso, devemos chamar bind no construtor para que não tenhamos que chamar bind imediatamente quando passarmos em nossos métodos de componente de classe como adereços.</p><p>Por exemplo, podemos escrever o seguinte código para fazer isso:</p><pre>import React from &quot;react&quot;;</pre><pre>export default class App extends React.Component {<br>  constructor(props) {<br>    super(props);<br>    this.state = {<br>      name: &quot;&quot;<br>    };<br>    this.updateValue = this.updateValue.bind(this);<br>  }<br>  updateValue(e) {<br>    this.setState({<br>      name: e.target.value<br>    });<br>  }<br>  render() {<br>    return (<br>      &lt;&gt;<br>        &lt;form&gt;<br>          &lt;input onChange={this.updateValue} value={this.state.name} /&gt;<br>        &lt;/form&gt;<br>        &lt;p&gt;{this.state.name}&lt;/p&gt;<br>      &lt;/&gt;<br>    );<br>  }<br>}</pre><p>No código abaixo, temos um input que chama o método updateValue , quando o valor do input muda.</p><p>Temos:</p><pre>this.updateValue = this.updateValue.bind(this);</pre><p>com o construtor, pois então sempre vai dar bind no componente com o valor de this</p><p>Agora não precisamos criar repetidamente em todos os lugares. Também não precisaremos criar uma nova função todas as vezes que o evento onChange for emitido porque não chamamos o bind, que retorna uma nova função.</p><p>O impacto no desempenho da criação de métodos em tempo real quando nosso aplicativo ficar grande será perceptível em algumas situações.</p><p>Ao invés de escrever:</p><pre>&lt;input onChange={this.updateValue.bind(this)} value={this.state.name} /&gt;</pre><p>nós escrevemos como está acima, no primeiro exemplo.</p><h3>Extra: bind em Arrow Functions x bind no construtor</h3><p>Um colega de trabalho, <a href="https://www.linkedin.com/in/rodrigo-mello-5a875564/">Rodrigo Mello</a>, Tech Lead da Zup, levantou uma questão importante, qual a melhor forma de darmos bind, via arrow function dentro da classe, ou dar bind dentro do construtor, qual seria a forma mais correta ?</p><p>Segundo uma <a href="https://github.com/facebook/react/issues/9851">discussão</a> no repositório oficial do React, fazer o bind dentro do construtor é a forma como o time do Facebook, por razões de performance e porque em um exemplo com Arrow Functions, recriamos a função a cada renderização , e via construtor vinculamos ela apenas uma vez.</p><p>Exemplo Construtor:</p><pre>Class Click extends react.Component {<br>  constructor(props) {<br>   super(props)<br>   this.clickEvent = this.clickEvent.bind(this);<br>  }<br><br>  render = () =&gt; (<br>    &lt;button onClick={this.clickEvent}&gt;Click Me&lt;/button&gt;<br>  )<br><br>  clickEvent() {console.log(this)} // &#39;this&#39; refers to the class<br>}</pre><p>Exemplo Arrow Function:</p><pre>import React from &#39;react&#39;;<br>class MyComponent extends React.Component {<br>  constructor(props) {<br>    super(props)<br>  }<br><br>  clickHandler = () =&gt; {<br>    console.log( this )<br>  }<br><br>  render() {<br>    return &lt;button onClick={this.clickHandler}&gt;Click Me&lt;/button&gt;<br>  }<br>}</pre><p>Tem também o problema dos testes unitários, com o construtor, conseguimos chamar nosso bind, através do prototype da classe, o que não ocorre com a Arrow Function:</p><pre>const spy = jest.spyOn(MyComponent.prototype, &#39;clickHandler&#39;);<br>// ...<br>expect(spy).toHaveBeenCalled();</pre><h3>Esquecendo a prop key ou usando indexes na prop key</h3><p>A propkey é importante quando renderizamos listas, mesmo que às pareça que não tem nenhuma função.</p><p>O valor único da prop key permite que o React identifique os itens da lista corretamente.</p><p>os valores da prop key são usados para combinar os filhos na árvore original com os filhos na árvore subsequente</p><p>Portanto, usar o index do array também é ruim porque pode levar o React a renderizar os dados errados.</p><p>É melhor usar IDs exclusivos como o valor da prop key. Podemos criar um array com IDs exclusivos que podemos usar como keys da seguinte maneira:</p><pre>import React from &quot;react&quot;;<br>import { v4 as uuidv4 } from &quot;uuid&quot;;</pre><pre>const arr = [<br>  {<br>    fruit: &quot;apple&quot;,<br>    id: uuidv4()<br>  },<br>  {<br>    fruit: &quot;orange&quot;,<br>    id: uuidv4()<br>  },<br>  {<br>    fruit: &quot;grape&quot;,<br>    id: uuidv4()<br>  }<br>];</pre><pre>export default function App() {<br>  return (<br>    &lt;div className=&quot;App&quot;&gt;<br>      {arr.map(a =&gt; (<br>        &lt;p key={arr.id}&gt;{a.fruit}&lt;/p&gt;<br>      ))}<br>    &lt;/div&gt;<br>  );<br>}</pre><p>No código acima usamos o pacote uuid para criar um valor UUID único para a prop key . Assim não existe chance de colisão entre IDS.</p><p>Dessa forma, os IDs são únicos e previsíveis, e não precisamos pensar em uma maneira de gerar o ID exclusivo para cada item.</p><h3>Nomes de Componentes</h3><p>Os nomes dos componentes devem começar com letra maiúscula. Por exemplo, se escrevermos o código a seguir, obteremos um erro do React:</p><pre>import React from &quot;react&quot;;</pre><pre>const foo = () =&gt; &lt;p&gt;foo&lt;/p&gt;;</pre><pre>export default function App() {<br>  return (<br>    &lt;div className=&quot;App&quot;&gt;<br>      &lt;foo /&gt;<br>    &lt;/div&gt;<br>  );<br>}</pre><p>Se rodarmos o código acima, o React vai mostrar erro para ‘&lt;foo&gt; não é reconhecido pelo browser. Se você quer renderizar um componente React, comece seu nome com uma letra maiúscula .</p><p>Sempre precisamos começar nosso componente com uma letra maiúscula:</p><pre>import React from &quot;react&quot;;</pre><pre>const Foo = () =&gt; &lt;p&gt;foo&lt;/p&gt;;</pre><pre>export default function App() {<br>  return (<br>    &lt;div className=&quot;App&quot;&gt;<br>      &lt;Foo /&gt;<br>    &lt;/div&gt;<br>  );<br>}</pre><p>Então veremos o ‘foo’ renderizado na tela como esperamos.</p><h3>Fechar cada elemento</h3><p>Todas as tags de componentes devem ter uma tag de fechamento ou uma barra no final para componentes de fechamento automático. Por exemplo, se tivermos:</p><pre>import React from &quot;react&quot;;const Foo = () =&gt; &lt;p&gt;foo&lt;/p&gt;</pre><pre>export default function App() {<br>  return (<br>    &lt;div className=&quot;App&quot;&gt;<br>      &lt;Foo&gt;<br>    &lt;/div&gt;<br>  );<br>}</pre><p>Obteremos um erro de sintaxe porque falta uma barra ou tag de fechamento em:</p><pre>&lt;Foo&gt;</pre><p>Para fazermos nosso App rodar escrevemos:</p><pre>import React from &quot;react&quot;;const Foo = () =&gt; &lt;p&gt;foo&lt;/p&gt;;</pre><pre>export default function App() {<br>  return (<br>    &lt;div className=&quot;App&quot;&gt;<br>      &lt;Foo /&gt;<br>    &lt;/div&gt;<br>  );<br>}</pre><p>&lt;Foo&gt;&lt;/Foo&gt; também funciona.</p><h3>Conclusão</h3><p>É fácil cometer erros ao escrever componentes React. Temos que lembrar de começar nossos componentes sempre com letra maiúscula.</p><p>Além disso, temos que fechar as tags do nosso componente, ou usar uma barra para fecha-los.</p><p>Também devemos chamar bind primeiro para que não tenhamos que chamá-lo repetidamente para vincular ao valor correto disso em componentes <br>baseados em classe.</p><h3>Referências</h3><p><a href="https://github.com/facebook/react/issues/9851">Use arrow functions or bind manually in es6 classes? Any performance difference?</a> @ React GitHub<br><a href="https://stackoverflow.com/questions/50375440/binding-vs-arrow-function-for-react-onclick-event">Binding vs arrow-function (for react onClick event)</a> @ StackOverflow</p><h3>Créditos</h3><p><a href="https://levelup.gitconnected.com/react-antipatterns-to-avoid-7134940f4f04">React Antipatterns to Avoid</a> escrito por <a href="https://levelup.gitconnected.com/@hohanga?source=post_page-----7134940f4f04--------------------------------">John Au-Yeung</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=66798a17f4a0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Nature language processing em JavaScript com Natural]]></title>
            <link>https://rubenmarcus.medium.com/nature-language-processing-em-javascript-com-natural-4e62c1c6231e?source=rss-7594c582d3b7------2</link>
            <guid isPermaLink="false">https://medium.com/p/4e62c1c6231e</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[pnl]]></category>
            <category><![CDATA[inteligencia-artificial]]></category>
            <category><![CDATA[machine-learning]]></category>
            <dc:creator><![CDATA[Ruben Marcus]]></dc:creator>
            <pubDate>Wed, 23 Sep 2020 17:58:47 GMT</pubDate>
            <atom:updated>2020-09-23T18:01:12.763Z</atom:updated>
            <content:encoded><![CDATA[<h3>Nature Language Processing em JavaScript com Natural</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*utdGaT56S7JmBP-SkyJfzw.jpeg" /></figure><p>PNL, abreviação de Processamento de Linguagem Natural, é um campo da Inteligência Artificial amplamente usado para interpretar, compreender e processar a linguagem humana / natural. É comumente usado para reconhecimento de fala e NLG (Natural Language Generation).</p><p>Os recursos mais comuns da PNL são os seguintes:<br>1. Categorização de conteúdo<br>2. Extração contextual<br>3. Análise sentimental<br>4. Speech-to-text e text-to-speech<br>5. Sumarização de documentos</p><p>Hoje, nesse post, estou explorando a PNL usando Javascript.<br> Temos muitas libs de PNL disponíveis em JS, onde temos a maioria dos recursos / tarefas de PNL. <br>Neste post, estaremos mais concentrados na lib <strong>natural</strong>, mas você pode verificar com outra biblioteca como compromise, node-npl.</p><p>Aqui, veremos algumas de suas principais funcionalidades, como tokenização, operações de string e classificador.</p><p>Primeiro, temos que instalar a lib do natural:</p><pre>npm install natural</pre><p>e depois importa-la:</p><pre>const natural = require(&#39;natural&#39;)</pre><ol><li>O termo <strong>Tokenização</strong> significa quebrar um string em um array como:</li></ol><pre>tokenizer.tokenize(&quot;Isso é um exemplo de tokenização&quot;)</pre><pre>[&quot;Isso&quot;, &quot;é&quot;, &quot;um&quot;, &quot;exemplo&quot;, &quot;de&quot;, &quot;tokenização&quot;]</pre><p>Podemos conseguir isso usando o método String do JS, mas a diferença está além dessa simples tokenização, ela também nos dá a tokenização baseada em maiúsculas e minúsculas, regex, frase e pontuação para qualquer idioma.</p><p><strong>2. </strong>Uma<strong> distância de string </strong>conta o número de caracteres diferentes.</p><pre>console.log(&#39;Diferença de String entre Amol e Amol: &#39;, natural.HammingDistance(&quot;Amol&quot;,&quot;Amol&quot; , false));</pre><pre>console.log(&#39;Diferença de String entre Amol e Anmol: &#39;, natural.HammingDistance(&quot;Amol&quot;,&quot;Anmol&quot; , false));</pre><pre>console.log(&#39;Diferença de String entre Amol e ABCD: &#39;, natural.HammingDistance(&quot;Amol&quot;,&quot;ABCD&quot; , false));</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/347/1*gYig7oGjJy2UML1H1W19DQ.png" /></figure><p>No exemplo acima, ele simplesmente retorna o número de caracteres não correspondentes.</p><p>Ele está ignorando o case, pois definimos o sinalizador como falso, também retornamos -1 se o comprimento da string não for o mesmo.</p><p>Ele também oferece suporte para correspondência de String.</p><p><strong>3</strong>. Um <strong>Infletor</strong>, para forma de palavra singularizada ou pluralizada,</p><pre>var nounInflector = new.natural.NounInflector();<br>console.log(&#39;Pluralize: &#39;, nounInflector.pluralize(&#39;Programmer&#39;));<br>console.log(&#39;Singular:&#39; , nounInflector.singularize(&#39;Developers&#39;));</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/334/1*xzZEvPjsbDb8ajp_cq_jgg.png" /></figure><p><strong>4.</strong> Agora, veremos a parte mais fascinante, <strong>Classificadores</strong>, treinaremos o classificador com os dados de amostra e obteremos o resultado deles. (Aqui, estamos apenas demonstrando como o classificador funciona em nosso caso, em vez de sua implementação.)</p><pre>const natural = require(&#39;natural&#39;);</pre><pre>var classifier = new natural.BayesClassifier();</pre><pre><strong>// Dados de exemplo</strong><br>classifier.addDocument(&#39;buy stock&#39;, &#39;buy&#39;);<br>classifier.addDocument(&#39;buy more&#39;, &#39;buy&#39;);<br>classifier.addDocument(&#39;short sell&#39;, &#39;sell&#39;);<br>classifier.addDocument(&#39;sell stock&#39;, &#39;sell&#39;);</pre><pre><strong>// Dados para Treino</strong></pre><pre>classifier.train();</pre><pre><strong>// Testando com novos dados</strong><br>console.log(&#39;Result for `Today, I buy my first stock`: &#39;, classifier.classify(&#39;Today, I buy my first stock&#39;));<br>console.log(&#39;Result for `Yesterday, I brought my first stock`: &#39;, classifier.classify(&#39;Today, I brought my first stock&#39;));<br>console.log(&#39;Result for `Tomorrow, I will sell all my stocks`: &#39;, classifier.classify(&#39;Tomorrow, I will sell all my stocks&#39;));</pre><p>E o output:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*0aP4HW7tEAs1782fFkOMPg.png" /></figure><p>No exemplo 1, em palavras simples, treinamos o classificador com dados de amostra, fornecemos entrada e saída, portanto, no futuro, se o classificador obtiver um contexto semelhante, ele retornará a saída desejada.</p><p>No exemplo acima, definimos a compra / venda de saída em alguns dados de amostra de entrada para que, após o treinamento, quando verificamos com dados diferentes, ela produza compra / venda de acordo com os dados do treino.</p><p>A lib <a href="https://www.npmjs.com/package/natural"><strong>natural</strong></a><strong> </strong>nos dá mais muita facilidade para trabalhar com PNL.<br> Da mesma forma, a <a href="https://www.npmjs.com/package/compromise">compromise </a>também é boa, com facilidade quase semelhante, você pode executar o a compromise no NodeJS ou no próprio navegador.</p><h3>Créditos</h3><p><a href="https://medium.com/analytics-vidhya/exploring-nlp-in-javascript-dbbadc9aab3a">Exploring NLP in JavaScript </a>escrito por <a href="https://medium.com/@kedarisamols?source=post_page-----dbbadc9aab3a--------------------------------">Amol Kedari</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4e62c1c6231e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Guia de entrevista para Recrutadores de TI (segundo a visão de um desenvolvedor)]]></title>
            <link>https://rubenmarcus.medium.com/guia-de-entrevista-para-recrutadores-de-ti-segundo-a-vis%C3%A3o-de-um-desenvolvedor-57005de51994?source=rss-7594c582d3b7------2</link>
            <guid isPermaLink="false">https://medium.com/p/57005de51994</guid>
            <category><![CDATA[recrutamento]]></category>
            <category><![CDATA[tecnologia]]></category>
            <category><![CDATA[desenvolvimento]]></category>
            <dc:creator><![CDATA[Ruben Marcus]]></dc:creator>
            <pubDate>Thu, 03 Sep 2020 11:04:54 GMT</pubDate>
            <atom:updated>2020-09-07T01:13:06.013Z</atom:updated>
            <content:encoded><![CDATA[<h3>Guia de entrevista para recrutadores de TI (segundo a visão de um desenvolvedor)</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*li4ikmTpyNg65IZoAtn8Dg.jpeg" /></figure><p>Olá pessoal. Resolvi escrever esse artigo, para contar um pouco da minha visão sobre minha experiência com entrevistas e vagas em TI.<br>Sou Software Engineer com especialidade em desenvolvimento front-end, e já trabalhei em mais de 53 projetos em 8 anos de carreira. <br>Nesses 8 anos, passei por inúmeros processos seletivos, dos mais variados níveis, desde empresas no exterior, até startups unicórnios, o objetivo desse artigo é servir como ferramenta para recrutadores conseguirem ter uma melhor experiência com os candidatos que procuram, e os candidatos conseguirem a tão sonhada vaga, mas tenha a consideração que esse artigo foi construído em cima de relatos e experiências pessoais, que nem sempre podem refletir a sua idéia de processos seletivos de mercado, mas que serve como base para reflexões e aprendizados, vamos direto aos pontos:</p><h3>1.Leia o perfil do candidato</h3><p>Sabemos que existem diversos perfis de empresas e vagas no mercado. Existem as empresas em que tecnologia não é só o core da empresa, como é uma questão de sobrevivência e produto. Essas empresas, geralmente são muito difíceis de um candidato entrar.<br>Analisar a empresa que o candidato está trabalhando é o primeiro ponto.<br>Analisar mesmo, olhar em ferramentas como Glassdoor, ReclameAqui etc.<br>Analisar quanto tempo o candidato está na empresa. Se está a pouco tempo porque iria sair da empresa tão cedo? <br>Se está a muito tempo, não estará trilhando uma carreira dentro da empresa?<br>Quais tecnologias e metodologias o candidato domina, e demonstra isso no seu perfil?<br>Qual a disponibilidade do candidato, ele se mostra disponível, ou coloca que não está interessado em vagas?<br>As atividades do candidato, e opiniões tem fit com a cultura da empresa?<br>O candidato é bom tecnicamente, mas péssimo em trabalhar em equipe?<br>Ter um perfil extenso e explicativo, ou um perfil em que omite informações, demostra o que no candidato?<br>O fato de o candidato ter citado um dos requisitos da vaga em 1 experiência profissional, ou em várias faz alguma diferença? Ele ser referenciado nisso também faz?<br>Como medir a capacidade de aprendizagem e crescimento do candidato: ser ativo na comunidade, participar de eventos, projetos e prêmios publicados, referencias?</p><p>Uma das minhas maiores frustrações depois que me tornei pleno, era receber vagas que eu via na hora que o recrutador não tinha se perguntado pelo menos uma ou duas dessas questões antes de me enviar a vaga.<br>Não vejo problema em receber vagas de posições que não são fit pra mim, em questão técnica ou até cultural, mas a atitude de mandar vagas em formato SPAM, ou como se o candidato estivesse desesperado por um novo emprego, quando muitas vezes a chance de um desenvolvedor pleno, sênior, especialista estar bem no emprego são GRANDES, irrita muitos desenvolvedores.</p><h3>2.Tenha empatia</h3><p>Quantos candidatos deixam de ganhar a oportunidade que tem capacidade para enfrentar e trabalhar, por processos mal feitos? Por julgamentos errados? <br>Quantos candidatos, muitas vezes não tiveram acesso a informação precocemente (Eu sou um privilegiado, meu pai é programador desde o começo da década de 90, e eu tenho contato com Informatica e TI desde meus 6 anos de idade) , muitos mal tinham celular, ou um computador a poucos anos atrás, mas apresentam resultados e um esforço descomunal, diferente de muitas pessoas que tem certificados e até faculdade, que desdenham da oportunidade.</p><p>Assim como você espera que os candidatos não trate você como um número, e que tudo ocorra bem durante o processo, seja para o SIM ou para o NÃO, nenhuma das partes quer ter uma experiência negativa e mal feita, muitas vezes traumática.</p><p>Muitas vezes conhecimentos técnicos não dizem nada. Não dizem nada sobre a história do candidato, do esforço para estar ali. Não precisa ser a babá ou o psicólogo do candidato, mas se esse demonstrou interesse pela vaga, ou se foi você quem foi atrás dele, caso o candidato tenha respondido alguma pergunta, em que a chance dele ser contratado diminuiu muito ou se extinguiu, o mínimo que ele espera é um feedback e alguma consideração (não pensando em candidatos que desrespeitam o profissional de RH, ou que são grosseiros e arrogantes)</p><h3>3.Sua empresa não é o mercado</h3><p>Assim como existem candidatos picaretas, que dizem ser sênior, sem ter o mínimo de experiência e conhecimento técnico ( Ser sênior não é apenas isso, mas saber trabalhar em equipe, ter resiliência, saber lidar com pressão), existem empresas que vendem uma imagem excelente, vídeos bem produzidos, gestores super eficientes, colaboradores sempre contentes, benefícios extraordinários, processos seletivos engrandecedores…</p><p>E aí na prática.. Bem na prática, exigem testes cansativos. Pedem horários absurdos para entrevista. Pedem um, dois ,três projetos para avaliar o candidato, falam que a oportunidade é a oportunidade da vida do candidato, que vai coloca-lo em outro patamar, que ele vai ser mais feliz do que nunca, mas que para atingir esse tão esperado prêmio, a tarefa é árdua e complicada..</p><h4><strong>Bem falando de um relato pessoal:</strong></h4><p>Recentemente, a um ano atrás uma empresa famosa, unicórnio da moda e da mídia me abordou para uma vaga. Sem ideia de salário, apenas benefícios, e falando da cultura da empresa.<br>Como no momento eu queria me avaliar profissionalmente e ver minha régua técnica, e como tinha contatos que falavam bem da empresa, e do seu processo seletivo, eu fui e arrisquei.</p><p>O recrutador na época, ficava me bajulando, falando que eu era o candidato ideal para vaga, que queria me ver na empresa e ia se esforçar ao máximo pra me auxiliar a entrar na empresa.</p><p>Começamos o processo. Virtualmente, primeiro mandaram perguntas sobre minhas expectativas. Mandei tudo, salário, rotinas, ambiente de trabalho, expectativa de plano de carreira e crescimento, expectativas técnicas e fit pessoais e culturais.<br>Até ai não me falaram nada mais, só que estava OK.<br>Me passaram um teste psicológico super chato de 20 minutos, com mais de 300 questões, muitas repetidas, me senti um idiota respondendo, como se eles colocassem a mesma pergunta 5x pra testar se eu respondia a mesma coisa em todas as vezes. Ok, feito.</p><p>Próxima etapa entrevista técnica: Aqui as coisas empacaram.<br>Pediram para fazer um live-coding de uma hora, com um Tech Lead da minha área, um aplicativo simples em algum framework JavaScript, nada demais, mas o Tech Lead nunca tinha horário disponível.</p><p>Após duas semanas tentando marcar a tal da entrevista técnica, me avisaram que não poderia ser feito por questão de agenda, e ai me passaram o projeto.<br>Projeto especificado mais ou menos, mas pedia pra ser feito em 3 dias, um projeto grande até um fluxo de telas de pagamento, com interações, responsividade, qualidade de código.<br>Não é impossível fazer esse teste em 3 dias, se você não tiver empregado. <br>Se você trabalha de 8 a 10 horas num cliente, gasta 2 horas pra se locomover pra casa, tem faculdade, ás vezes freelas, como vai arrumar tempo pra fazer um projeto desses em 3 dias?</p><p>A empresa não tem culpa dos seus problemas, mas poderia ser flexível em alguns casos…<br>Pedi uma semana, e fiz no fim de semana, mas a falta de resposta do recrutador, apenas exigindo que eu fizesse o teste logo e entregasse me desmotivou um pouco, e entreguei como consegui fazer, sabia que dava pra melhorar muita coisa, mas como vi que o esforço pra me recrutar estava mais no falar do que no fazer, também não dei 100%.</p><p>O recrutador sumiu. Aquela empatia e solicitude do começo do processo desapareceram. Após duas semanas que entreguei o projeto enchi o saco do cara por Linkedin. Ele viu e não respondeu.<br>Fiquei puto! Perdi meu fim de semana pra nada.. Promessas e promessas…</p><p>Depois de 1 mês ele me retorna: Ruben desculpa a demora, mas você não foi avaliado como Sênior e sim como pleno. Mas quero você muito aqui na empresa, acredito que o processo foi falho e vamos dar mais uma oportunidade pra você provar sua senioridade. Preciso só alinhar com o time técnico para você fazer outro teste.</p><p>Eu já tinha desistido da vaga. Não tinha interesse em estar na empresa. Não me interessava se ela ia me pagar 5 mil a mais (não ia), se ia me dar benefícios de morar na lua, de pagar plano de saúde pra família inteira, estava nem ai mais. o destrato e a forma como tudo correu só me causaram uma péssima impressão. No final eu não estava desesperado pra trocar de emprego, e na verdade eu até gostava bastante da empresa que estava. Todo esse encantamento no começo e desleixo com o resto, fez eu desistir da empresa, mesmo que eu não fosse fit técnico pra vaga, eu preferia ter o não de cara, do que toda essa enrolação.</p><p>Dois meses depois da entrega do projeto, vem o mesmo recrutador: <br>-Ruben abrimos uma vaga com seu perfil, quer tentar de novo?<br>- Não sei, mas obrigado pelo interesse.</p><p>Uma semana depois o recrutador saiu da empresa maravilhosa e mágica.</p><h4><strong>O que penso disso tudo?</strong></h4><p>1. Eu realmente não tinha fit pra vaga, e não era competente para tal</p><p>2. O processo foi muito mal coordenado, e fui mal avaliado, sem feedback nenhum do código ou de como eu estava indo nos processos da entrevista</p><p>3. A minha vaga não era essencial para a empresa. Sei da politica da empresa de contratar pessoas indicadas internamente muito mais do que pessoas abordadas por recrutadores. Sei disso porque diversas colegas que trabalham com mobile, saíram da empresa que trabalho para trabalhar nessa empresa e em menos de 1 semana estavam contratados, em um processo muito enxuto e rápido. Inclusive desenvolvedores com muito menos experiência do que eu, que dentro da empresa que eu trabalhava eram considerados Juniors, e foram contratados como Pleno e Seniors nessa nova empresa.</p><p>4.Por mais que eu use o produto dessa empresa, e acompanhe suas redes sociais e as atividades de ex colegas de trabalho nessa empresa, inclusive eventos, eu jamais trabalharia nela. Essa primeira experiência já me traumatizou num nível, que nenhum papo mole de recrutador, ou de Tech Lead que venha me falar das tecnologias mais legais, ou da experiência de trabalho mais engrandecedora possível vão me fazer querer passar de novo por um processo desses.</p><p>5.Atualmente estou bem na empresa que estou. Tenho feedbacks constantes, a evolução não só técnica, como pessoal é evidente. Tenho colegas com quem aprendo diariamente e o projeto que trabalho é um projeto bom e de destaque. Porque trocaria isso, por promessas sem comprovação e por complicações que uma “nova empresa mágica” me prometem, mas não entregam? Nem feedback dão? Se vivo num ambiente em que a cada semana, a cada mês, a cada dia descubro novas tecnologias, ferramentas e processos porque vou esperar meses por uma oportunidade que só é real pros outros?</p><h3>4.Saiba o que você quer</h3><p>Não adianta você mandar uma vaga de DBA esperando que um Front-end vá responder ela como candidato.</p><p>Não adianta você pegar o e-mail de um desenvolvedor e jogar no mailing da sua empresa de RH e enche-lo de SPAM.</p><p>Não adianta você não pré-selecionar os candidatos que você vai enviar a oportunidade, e fazer bizarrices: como mandar uma vaga pro candidato , na mesma posição e empresa que ele já está (eu já passei por isso)</p><p>Se você for a pessoa responsável pela vaga e as exigências, tente levantar as necessidades do projeto e empresa com o gerente do projeto, ver quais exigências são cabíveis para a vaga, quais são essenciais, quais são desejáveis, quais podem ser aprendidas com o tempo, qual background e experiência de candidato você quer. Ser assertivo pode poupar muito tempo dos dois lados.</p><p>Seu processo não tem candidaturas? Os candidatos não passam no seu processo? Será que a régua está muito alta? Muito baixa? As especificações e exigências são compatíveis com salários e benefícios?</p><p>Existe mercado de trabalho para a vaga? Como tem sido o feedback e processo da vaga? Como está a avaliação da empresa em ferramentas de opinião?</p><p>Como estão processos e oportunidades parecidas em concorrentes? Qual a abordagem dos concorrentes? Como é o ambiente e situação atual do candidato? Minha empresa e vaga oferecem atrativos que podem atrair a atenção, dedicação e reter esse candidato numa possível contratação?</p><p>Eu estou dando o melhor e sendo empático e dando atenção e feedback ao candidato, ou só estou enchendo a caixa de SPAM do candidato, sendo irônico e menosprezando sua experiência profissional?</p><p>Por menosprezar eu não quero dizer apenas ignorar, mas muitas vezes vir com textos bonitos como “ Parabéns pela sua experiência e trajetória profissional, gostamos do seu perfil” e na menor das questões do candidato, simplesmente abandona-lo.</p><p>Outros recrutadores da mesma empresa já abordaram o candidato? Qual foi a experiência que tiveram?</p><p>Se um candidato já recusou o contato, ou oportunidade da empresa, o que contatá-lo todo mês pode significar pra mim como recrutador e como empresa?</p><p>Essa são algumas questões a se levantar.</p><h3>5.Seja transparente e objetivo, mas não com descaso</h3><p>É muito importante alinhar expectativas logo de começo. Nas primeiras conversas já falar de salário, experiências, rotinas, projeto, expectativas de ambas as partes, valores, cultura, projeção conforme o tempo, casos de sucesso de ambas as partes, momentos profissionais e pessoais.</p><p>Quanto mais rasa a conversa e menor interesse de alguma das partes, menor chance de sucesso do recrutamento.</p><p>Caso nenhuma das partes se entenda em questão de exigências ou expectativas, sempre pode ser educado, e deixar portas abertas para futuras oportunidades. Nunca se sabe o dia de amanhã. O profissional recusado de hoje pode ser a referência de amanhã. A empresa referência hoje pode ser a falência de amanhã, ou a empresa desacreditada hoje pode ser o novo unicórnio amanhã.</p><p>Mas sempre trate com cordialidade. Nunca perca a postura. Não trate ninguém com descaso, seja o nível profissional que a pessoa estiver.</p><p>Claro que tudo dentro de seus limites. Candidatos que assediam recrutadoras, são mal educados e grosseiros, machistas e misóginos, racistas, merecem e devem ser denunciados e colocados em seus lugares.</p><p>Muitas empresas omitem feedbacks, por problemas de gestão ou até de cultura, outras tantas fazem candidatos gastarem recursos que não tem, outras perdem oportunidades de recrutar talentos por processos antiquados, preconceitos antigos e pré-estabelecidos, por exemplo : A<a href="https://epocanegocios.globo.com/Carreira/noticia/2018/10/e-aceitar-ou-ser-demitida-os-desafios-de-quem-esconde-tatuagens-por-medo-de-perder-o-emprego.html"> Localiza que força seus funcionários a esconder tatuagens</a> , eu jamais trabalharia numa empresa assim. Primeiro porque sou todo tatuado. Segundo pela politica da empresa ser draconiana. Terceiro porque essas empresas estão fadadas ao esquecimento e vão ser engolidas por novas gerações e mentalidades.</p><p>Se adapte ou morra.Acredito muito nisso. Falta de empatia, falta de transparência, processos extremamente cansativos, extremamente verticais, hierarquia exagerada, falta de visão, falta de representatividade, falta de solicitude, gestores com mentalidade de aristocracia, gestores que exigem mundos e fundos e não dão exemplos, todas empresas que tem essa cultura estão fadada aos fracasso.</p><p>Empresas, recrutadores, influencers que se baseiam em pessoas com opiniões não-empáticas, vão ser cada vez mais mal vistas pelo mercado.</p><p>Opiniões como essa :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/768/1*oq9DH1Ttea9_Rr8VygHbyQ.png" /><figcaption>Texto retirado de artigo do Linkedin de Influencer e empreendedor, que divulga parceria com empresas e marcas famosas, como ter e trabalhar com um profissional desses?</figcaption></figure><p>ou essa:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/533/1*2geBrMSmwrXE60pFEK44dw.png" /><figcaption>Como trabalhar com um “profissional” e recrutador desses?</figcaption></figure><p>Vão ter um feedback muito ruim, e não só de quem opina, mas quem compartilha da mesma opinião.</p><h3>6.Dê feedbacks!!!</h3><p>Quanto mais atenção, processos e exigências você exige de um candidato, mais ele espera que o retorno, seja em feedback, em contratação ou condições da vaga aconteça.<br>Desprezar o candidato, e fazer perder seu tempo e dinheiro, só vai causar uma péssima impressão sobre a empresa, e sobre o profissional de recrutamento.<br>A chance de um candidato recusar o contato com você e até bloqueá-lo é praticamente certa.</p><p><strong>Vou contar uma experiência pessoal que reflete isso:</strong><br>Em 2015, após trabalhar mais de 3 anos em startups pequenas e agências, eu resolvi que ia entrar numa empresa grande. <br>Vi uma vaga para desenvolvedor front-end na Centauro.<br>Resolvi aplicar. Não lembro a plataforma que encontrei, se foi no Trampos ou Linkedin.<br>Lembro que acabei me candidatando por duas empresas, duas consultorias, uma multinacional de RH e Recrutamento com foco em TI, outra uma consultoria de TI que foi fundada por profissionais de tecnologia.</p><p>Na primeira fui no escritório na Paulista, fiz um processo demorado, escrevi redação, fiz testes psicológicos no papel, escrevi contatos de 3 últimos empregos, fiz bateria de perguntas com o recrutador, fui entrevistado em grupo, esperei por duas horas antes de ser entrevistado, enfim um processo cansativo, mas como na época eu estava em busca de novos ares e formas de trabalho, levei numa boa, apesar de internamente odiar esses processos.</p><p>Na segunda, foi pedido um projeto básico, uma tela simples, tinha que replica-la responsiva, fiz em menos de 2 horas e enviei no mesmo dia, tendo a resposta dois dias depois:<br> — Queriam me entrevistar pessoalmente no cliente final.<br>Marcamos a entrevista pra próxima semana, nessa entrevista fui no horário marcado, conheci o lugar de trabalho, fui recebido pelo entrevistador técnico, junto com mais 3 membros da equipe que iria trabalhar, um deles outro desenvolvedor front-end ( salve Lucas! ), que primeiro me deram as boas vindas, e depois apresentaram a empresa e o projeto, e depois começaram a entrevista:<br>(Lembro da famigerada pergunta que nunca me sai da cabeça até hoje,em pleno 2015):<br>- Mas e o Angular? Como tá o conhecimento de Angular?<br>- Respondi que tinha pouco conhecimento, mas o suficiente para trabalhar com a tecnologia, inclusive tinha feito meu portfolio com a tecnologia, mas ainda era recente esse conhecimento, expliquei como fiz o portfolio e como entendia o funcionamento da tecnologia.</p><p>Depois dessa resposta, e de várias outras, o time compartilhou risadas comigo, falando que muitos candidatos falavam que tinham conhecimento avançado na tecnologia, mas na hora de explicar como trabalhar com ela, se enrolavam e não sabiam como explicar.</p><p>No final me deram um feedback rápido, que eu tinha saído bem na entrevista ( isso é muito importante pro candidato, você dar um feedback mesmo que não seja assertivo em questão de contratação ou não, mas pra ele ter um direcionamento nas próximas etapas, ou até oportunidades que concorrer) e se dispuseram para perguntas sobre a vaga ou projeto ( isso também e muito bom pois mostra que a empresa esta aberta a opiniões e duvidas do candidato e que o processo é horizontal e não debaixo pra cima )</p><p>E dois dias depois me ligaram pedindo pra marcar um papo final sobre a contratação e que eu tinha passado na vaga.<br>Na semana que vem eu estava sentado com o Gerente do Projeto, acertando detalhes como horário, remuneração, ambientação no trabalho. Foi uma experiência muito boa pra mim, e guardo muito carinho e boas lembranças dessa experiência profissional, inclusive de nos primeiros meses, ter almoçado com o CEO da empresa no mesmo restaurante, o cara na mesma fila que eu e meus colegas. Diretores e gerentes serem super acessíveis, e olharem pra você como parceiros e não subordinados. Colegas de trabalho excepcionais, desde os QAS até desenvolvedores, designers, time de marketing todo mundo sempre muito solicito.</p><p>Enfim. Dois meses depois de ser contratado, recebi o feedback por e-mail da outra consultoria:<br>- Nos desculpe, Ruben, mas seu perfil para a vaga na Centauro não foi selecionado e a vaga já foi preenchida por outro candidato.</p><p>O outro candidato: Eu mesmo. Só que por outra empresa.<br>Sei disso porque na época em que fui contratado, só eu tinha sido contratado como front-end. Por essa outra consultoria que demorou dois meses para dar feedback, apesar de ter exigido um monte de coisas no processo, ninguém havia sido contratado.</p><p><strong>Aí fica o questionamento: É mérito do candidato, ou da empresa que recruta e seus processos?</strong></p><h3>7. Exigências são importantes mas nem sempre</h3><p>Li uma vez no Linkedin um post do <a href="https://www.linkedin.com/in/zenorocha/">Zeno Rocha</a>, que na empresa que ele trabalha nos EUA, um candidato sem experiência prévia em programação, sem faculdade, estava trabalhando a poucos meses na empresa, tendo mentoria e todo suporte para trabalhar, e esse mesmo candidato estava produzindo muito em poucos meses e ajudando no crescimento da empresa.</p><p>Achei fantástico. Pensei, será que isso existe no Brasil ? Depende que Brasil estamos falando. Existem sites e páginas como o <a href="https://www.facebook.com/vagasVTNC/">Vagas Arrombadas</a>, ou o <a href="https://tidiota.tumblr.com/">TIdiota</a>, que mostram que uma boa parcela do mercado, se exige conhecimentos muito altos, alguns até impossíveis (como domínio de 5 anos em tecnologias que existem a menos de 2), que exigiriam uma década de experiência, muito dinheiro investido em cursos, para aí pagar algo como 2000 reais PJ. Vagas que pedem senioridade em vagas de estágio. “Estágio FullStack”, “Fullstack Junior”, pra mim soam como uma enganação sem tamanho, uma armadilha.</p><p>Vejo nos grupos de vaga de Facebook, recrutadores e muito candidatos falarem que isso é uma oportunidade, aprender de tudo, ser exigido ao máximo pra em poucos anos ser um profissional super experiente e referência de mercado. <br>Bom o que penso disso, é que empresas querem profissionais faz tudo, multifuncionais, uma equipe inteira que custaria ai por baixo uns 40–50 mil reais no minimo, em um profissional só pagando 2 mil reais. Geralmente a empresa tem pouco capital pra investir ou quer lucrar a todo custo vender um projeto e se aproveitar do profissional.<br> Não tem nada de errado em ter pouco capital pra investir, mas as exigências tem que ser do mesmo nível do investimento.</p><p>Certa vez vi na capa da Veja São Paulo um “empresário” do ramo digital, sendo celebrado, faz muito tempo em 2014 isso, ele tinha uma agência de blogs e sites, basicamente em WordPress, tinha altos contatos na elite paulistana, vendia os blogs por mais de 20 mil reais, manutenção de 15 mil por mês, para socialites, políticos, celebridades, tendo um faturamento ai por baixo de 300 mil por mês. Claro existe o custo de operação da agência. Exige os contatos que são dele. Custos de infra-estrutura.<br>Mas ai vi uma vaga de desenvolvedor WordPress na agência dele.<br>Salário de 2 mil reais. Sem benefícios. Trabalho exaustivo e aos fim de semana, sempre disponível.</p><p>Cara complicado. O desenvolvedor entrega um projeto com valor de venda de 35 mil e recebe apenas 2. Muitas vezes faz mais de um projeto por mês então essa entrega é até maior.</p><h4><strong>Mas o que quero dizer com isso tudo?</strong></h4><p>Ser exigente muitas vezes é bom, e muitas vezes não é. Existe uma diferença entre ser exigente, e ser explorador.</p><p>Existem pessoas como a Aline Bastos que criou uma <a href="https://www.linkedin.com/feed/update/urn:li:activity:6705550690544033792/">lista de vagas</a> para estágio e desenvolvedores júniors.</p><p>Existem fóruns de mentoria e que ajudam candidatos com vagas como o <a href="https://github.com/frontendbr/vagas/issues">Front-end Brasil</a></p><p>Existem programas como o da Zup de capacitação profissional para jovens de periferia como o <a href="https://www.zup.com.br/estrelas-fora-da-caixa">Estrelas fora da Caixa</a></p><p>Mentoria e formação como o<a href="https://www.educafro.org.br/site/20-vagas-mentoria-e-formacao-para-jovens-negros-negras/"> Educafro</a>,</p><p>Programas de formação como o <a href="https://gerandofalcoes.com/coronanoparedao">Gerando Falcões</a></p><p><a href="https://autismotech.com/">Autismo Tech</a>, levantando debates importantes sobre a oportunidade de pessoas com Autismo no mercado de trabalho</p><p>Dentre outros ( cite nos comentários e coloco aqui depois)</p><p>Mas se sua empresa exige mais do que entrega ao colaborador, pode ter certeza que o resultado dela vai ser: Rotatividade grande, possíveis processos trabalhistas, e muitos desafetos no mercado. A empresa antes de ter apenas o foco só em lucro, tem uma função social, e não tem nada de errado você contratar conforme seu orçamento, mas saiba o que esperar conforme o que se tem.</p><h3>8.Compartilhe riscos</h3><p>Se a empresa que você trabalhar quer os melhores colaboradores, quer ter um ambiente saudável e sólido, quer ter um crescimento sustentável, não tem jeito, tem que assumir riscos junto com os funcionários.</p><p>Tem que pensar em plano de carreira, tem que ser claro com os colaboradores, tem que demonstrar os valores, tem que estar presente em momentos importantes, como numa doença, numa gravidez, num eventual problema psicológico.</p><p>Se a empresa quer ser um motor do desenvolvimento pessoal e profissional desse colaborador, onde ele vai conseguir realizar seus sonhos e projetos, ela tem que estar atenta as necessidades desse colaborador.</p><p>Por exemplo, em tempos de pandemia e pós pandemia, oferecer uma vaga para um candidato de TI que não seja remota, e esse candidato já trabalhar remotamente e que provavelmente gosta, não só é um tiro no pé, mas como é praticamente quase 100% chance de sua oportunidade ser recusada.</p><p>Alocar o candidato em tempos normais em um cliente sem dar o devido suporte, é muitas vezes visto por gestores como uma medida, que tanto faz, já que muitas empresas e consultorias tem contratos milionários, e de qualquer jeito vão ser pagos, caso o candidato seja desalocado, seja demitido ou não consiga se adequar a cultura do cliente.</p><p>Nesses dois casos teve falhas de estudo de perfil do candidato, com perfil do cliente, ou perfil de trabalho do candidato. O resultado é o candidato rejeitar a empresa em novas oportunidades, alta rotatividade, péssimas avaliações em ferramentas como Glassdoor, péssima imagem e referências da empresa e seus recrutadores no mercado.</p><p>Investir nas pessoas e no desenvolvimento delas é um legado incrível para uma empresa. É um risco,especialmente em um mercado volátil, incerto e aquecido. Mas é o melhor mecanismo a longo prazo, que mesmo que não retenha alguns talentos, com certeza o marketing boca-boca, as experiências aprendidas e a cultura legada, acabam atraindo novos candidatos com cultura parecida. Afinal se trata de pessoas e os valores entregues por colaboradores e empresas simultaneamente.</p><h3>9.Antes de tudo a cultura</h3><p>Cultura é algo muito difícil de definir, e ainda mais de praticar.<br>Pegando uma definição do google:</p><p>O <strong>conceito de cultura</strong> organizacional é tudo que envolve a rotina de uma <strong>empresa</strong> e funciona como diretriz para guiar o comportamento e mentalidade de seus membros.</p><p>Basicamente os colaboradores de uma empresa, seus gestores e fundadores tem que compartilhar uma cultura semelhante. Posições politicas, pessoais, religiosas podem ser diferentes, dentro do limite do responsável.</p><p>Se a empresa, profissional, seja ele o candidato ou o recrutador, seja ele a gerência ou fundadores, não defendem uma cultura forte e humana, participativa, colaborativa , pró-ativa, existem grandes chances de esse individuo ou empresa se auto-sabotar no mercado.</p><p>Nada adianta videos maravilhosos, processos bem feitos, recepções calorosas, candidatos que sabem todas as respostas, se apresentam a bala de prata da vez, se no dia dia, é tudo ao contrario.</p><p>Já vi muitos juniors com postura de Seniors. Muito senior com postura de junior.</p><p>Muito recrutador que não só te entrevista e defende os interesses dele e da empresa, mas auxilia o profissional em sua trajetória macro.</p><p>Muita gerência que se mostra realmente preocupada com o desempenho pessoal e profissional do colaborador. Com a saúde mental e física. Com a evolução técnica. Que isso não é só papo de marketing de Linkedin isso é pratica.</p><p>A isso tenho que agradecer muitas pessoas que encontrei na minha trajetória. Recentemente seis pessoas em especial. Quando entrei na Zup, um dos motivos foi entrar num projeto grande, de um banco, um desafio novo para mim.<br>O segundo foi os valores e cultura da empresa. Algo que eu avalio muito antes de salário ou benefícios. No meu primeiro projeto na empresa tive alguns problemas em que sempre fui auxiliado pela minha recrutadora Quésia Nogueira, quando já no cliente tive todo o auxilio e confiança do meu DSM, Fernando Queiroz, toda mentoria do meu BP, Eliseu Conz, e quando surgiu a oportunidade de trabalhar em um projeto do zero, tive todo o auxilio da Kenia Moura minha DSM atual para me ambientar e chegar junto no projeto, direcionamento preciso do meu TechLead Bruno Carvalho, e atenção da BP Isabella Fernandes.</p><p>Cara isso faz uma PUTA duma diferença!! Desculpa o palavreado, mas ter essas pessoas cuidando de você,olhando pra sua evolução dentro da empresa, discutindo suas necessidades e apontando caminhos, jogando junto do seu lado, é um diferencial que deveria ser a regra em todas as empresas e eu sei que não é.</p><p>A cultura não é sobre ter mesa de pebolim e chopp nas sextas feiras. Não é sobre artigos na mídia, e cases de sucesso. Não é a marca da empresa e sua impressão no mercado. É os funcionários. Como são tratados? Mero recursos? Pessoas? Como sua empresa tratou os funcionários na pandemia? Como auxilia em caso do funcionário ter algum problema pessoal que interfira em algo do trabalho? Trata o funcionário como uma ficha ou número, ou trata ele como alguém que tem melhorias a serem trabalhadas, mas tem muito valor a ser entregue?</p><p>Isso se trata a cultura!!</p><h3>10.Pesquisa, Perfis e Resultados</h3><p>Pesquisar perfil de candidato é algo chato imagino, algo difícil, lidar com diversos perfis e egos de candidatos também. TI é um ramo onde tem muito cacique pra pouco índio, muita capacidade mal aproveitada, muita gente se achando a ultima bolacha do pacote, muito gênio escondido em oportunidades mal pensadas.</p><p>Lidar tudo isso no dia-dia deve ser bem complicado. Ainda mais complicado o desafio de uma área que acredito ser muito mais instável que a nossa. Ser recrutador não é fácil.</p><p>De TI especialmente, que acredito existirem diversos perfis, Perfis que ignoram, perfis que exigem demais e entregam de menos, perfis que entregam demais e exigem de menos, perfis que se adequam a empresas como agências, outros como freelancers, outros como consultoria, outros como empresa de tecnologia, fintechs, bancos, e-commerces, startups, cada empresa, cada ramo tem seu ritmo, preocupações, cultura, nível de desenvolvimento organizacional, nível de maturidade no trabalho.</p><p>Cada perfil tem valores a agregar, e as vezes ter trabalhado numa empresa famosa não quer dizer muita coisa, ter um cargo de Sênior também não, ter cargo de gestor também não, ter relatórios e números impressionantes também não.</p><p>As pessoas sabem se mascarar. Sabem mentir, existem desenvolvedores que querem escalonar rápido no mercado, o que a anos atrás era impensável acontecer, como salários de mais de 6 mil reais em menos de 3 anos de experiência é uma realidade para muitos profissionais.</p><p>Assim como antes muitas vezes para algumas pessoas, apesar de menos recursos, menos cursos,videos no youtube, faculdades, empresas, startups ,tecnologias, o mercado parecia um pouco mais ‘orgânico’, Hoje parece que temos, um mercado farto para plenos e seniors, e um mercado bem limitado e extremamente concorrido para juniors e estagiários. Grande parte a cultura ou falta de cultura de alta lucratividade e falta de planejamento a médio e longo prazo de muitas empresas.</p><p>Muitos profissionais são mais habilidosos em empresas com um perfil semelhante ao seu. Muitos colegas reclamavam da empresa que trabalho, outros construíram a carreira e eram referência no mercado e na empresa, outros assim como eu estavam satisfeitos e felizes com o trabalho.<br>Se veem mais felizes em outra oportunidade ou cenário. Muitos não tem filho e responsabilidades, Muitos tem, e buscam um lugar mais controlado e sossegado, ou buscam o equilíbrio entre desafios e pressão e também estabilidade.</p><p>Existem empresas pagando duas vezes mais que a média do mercado, mas com exigência psicológica e pesada em questão de rotina de trabalho.</p><p>Existem profissionais ótimos em entrega de projetos e resultados, mas péssimos em entrevistas e processos seletivos. E isso é uma boa parte do mercado, especialmente profissionais tímidos, ou que não tem soft-skills como comunicação bem desenvolvidos. Muitos profissionais só querem programar, não se preocupam com habilidades que muitas vezes acabam sendo decisivas em contratações ou oportunidades.</p><h3>Considerações Finais</h3><p>Eu já estive nas duas pontas. Já assessorei recrutadores técnicos e também com perfil mais de RH e psicologia a encontrar candidatos e também já observei entrevistas de HeadHunters e Gerentes de Projeto. Já entrevistei pra empresa que trabalho atualmente, candidatos para projetos urgentes, de mais variados níveis, desde pessoas que se declaravam CTOS, até juniors recém chegados a menos de 6 meses de mercado.</p><p>O mercado está inflado. É difícil saber o que um candidato fala se é verdade ou não. Algumas coisas nos dão muitas pistas, outras nem tanto.</p><p>Acho que não existe a contratação ou o método perfeito para isso. <br>Existe um corpo de profissionais que se formam com o tempo em volta de valores e experiência, que compartilham visões parecidas apesar de diferentes backgrounds, e que trabalhando em conjunto conseguem trazer gradualmente cada vez mais valor para a empresa.</p><p>Acredito que o mercado de TI vai continuar evoluindo e crescendo cada vez mais, a inclusão de mais e mais pessoas no mundo digital, a extrema digitalização da economia, a chegada de gerações já digitais desde o berço vão gerar uma demanda cada vez maior, junto com tecnologias como 5G,IPV6, Machine Learning, Data Science pelo profissional de TI.</p><p>Já os profissionais de recrutamento, vão sofrer um desafio gigante, em que quem não se adapta e conhece pelo menos o básico da área em que atuam, quem não se atenta algumas questões que coloquei aqui nesse texto, quem não tem o mínimo de empatia, entendimento de mercado e valores de empresa e clientes está fadado ao fracasso. Mas isso não é só na área de recrutamento como em todas as áreas profissionais.</p><p>Especialmente TI por ser uma das áreas mais mentalmente estressantes, com maior número de casos de depressão e burnouts.</p><p>Obrigado, a você que leu todo esse texto, qualquer sugestão ou dúvidas, só comentar abaixo!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=57005de51994" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Iniciando com Next.js + Strapi: Segurança antes de tudo]]></title>
            <link>https://rubenmarcus.medium.com/iniciando-com-next-js-strapi-seguran%C3%A7a-antes-de-tudo-11c06292ce18?source=rss-7594c582d3b7------2</link>
            <guid isPermaLink="false">https://medium.com/p/11c06292ce18</guid>
            <category><![CDATA[react]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[headless-cms]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[strapi]]></category>
            <dc:creator><![CDATA[Ruben Marcus]]></dc:creator>
            <pubDate>Sun, 05 Jul 2020 23:45:15 GMT</pubDate>
            <atom:updated>2020-07-06T13:41:23.296Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rk4uLXHf6IH9S_Y_9FOV3w.jpeg" /></figure><h3>Segurança pra quê?</h3><p>Antes de começar a ver sobre os Content-Types do Strapi, antes de ver a estrutura de arquivos e rotas do Next.js, é bom discutirmos sobre Segurança.<br>Uma preocupação que costuma não ser acompanhada com a devida atenção em certos times, e que pode acarretar um custo bem alto, quando um projeto for colocado em produção.<br>Esse artigo é mais um artigo introdutório a stack Next.js +Strapi , vamos ainda abordar TypeScript, Fetch de Dados, Layouts, CI/CD e Deploy, mas antes de tudo vamos abordar segurança.</p><p>Abaixo vamos discutir, os erros mais comuns de segurança em aplicações web e como mitiga-los ou corrigi-los em nossa aplicação Strapi + Next.js:</p><h4>XSS/CRSF:</h4><p><strong>XSS</strong> ou Cross Site Scripting, é uma técnica maliciosa pra injetar código na nossa aplicação e burlar a segurança para sequestrar dados ou manipular uma sessão do usuário por exemplo. Esse é um<a href="https://medium.com/@rafaelrenovaci/cross-site-scripting-xss-4e3851b906ae"> artigo muito bom</a> para se aprofundar no assunto.</p><p><strong>CRSF </strong>ou Cross-site request forgery, é quando alguém utiliza de uma técnica maliciosa para conseguir através de um request seja via Postman ou browser conseguir atingir nossa base de dados, apagar dados de usuários por exemplo, roubar dados de sessão ( como cartão de crédito, endereços etc) entre outras coisas.</p><h4><strong>Click Jacking:</strong></h4><p>Sabe quando você abre páginas que tendem a enganar o usuário, para digitar dados e no final acabam enviando esses dados para pessoas que querem usar de forma maliciosa? Ou que podem ter malware ou exploits e instalá-los na maquina do usuário?</p><h3>Vulnerabilidades comuns em Rest APIS:</h3><ul><li><strong>DOS &amp; DDOS (Denial of Service) :</strong> Quando um hacker quer derrubar uma API , aplicativo ou site , ele pode disparar requisições em massa para aquele API ou endpoint.</li><li><strong>Exposição de Informações Sensitivas:</strong> Quando expomos dados sensitivos do usuário, especialmente sem criptografia em nossa API. Ids, e-mails, endereços, informações de pagamento etc.</li><li><strong>Ataques MIM (Man in the Middle) :</strong> Quando um hacker tenta interceptar a comunicação de client e servidor , com a intenção de roubar dados.</li><li><strong>SQL Injection:</strong> Injeção de código que altere o comportamento esperado da API e do Banco de Dados. Através de uma injection um hacker consegue roubar informações, quebrar a API, alterar seu funcionamento.</li><li><strong>Insecure Direct Object References:</strong> Quando você expõe uma API com endpoints como /user/id/30, e um usuário tenta acessar um ID que não compete a ele, e consegue, você está expondo Referências diretas de objetos inseguros.</li></ul><h3>Vulnerabilidades comuns em APIS GraphQL:</h3><ul><li><strong>/graphql?query={__schema{types{name,fields{name}}}} </strong>: <br>Se seu API GraphQL estiver público, apenas com uma query dessa, o usuário que a usa-la, consegue ver todo o esquema da sua API</li><li><strong>Queries Maliciosas:</strong> Hackers podem montar queries maliciosas, sejam para roubar dados, corromper seu banco de dados, ou derrubar sua API/servidor</li><li><strong>Brute-Force:</strong> Para evitar problemas com hackers tentando quebrar os dados da sua API GraphQL , você pode usar plugins como o <a href="https://github.com/teamplanes/graphql-rate-limit">GraphQL Rate Limit</a>, que vai limitar quantas vezes os campos vulneráveis da sua query podem ser executados em um intervalo de tempo.</li></ul><h3>Como evitar tudo isso?</h3><p><strong>No Strapi:</strong></p><ul><li><strong>Entendendo o arquivo de Configuração do Strapi &amp; sua segurança:<br></strong> O Strapi possui uma documentação rica que nos mostra <a href="https://strapi.io/documentation/3.0.0-beta.x/concepts/configurations.html#security">como garantir a segurança</a> do CMS :<br>Possui configurações para XSS, P3P, Hsts , X-Frame-Options (Clickjacking), CORS (muito útil para setar que domínios podem acessar sua aplicação, que headers podem ser expostos),<br>IP (Consegue configurar que IPS enxergam ou não sua aplicação)</li><li><strong>Injeção de Credenciais: </strong>Use um arquivo .env, para não ficar injetando credenciais no meio do seu código</li><li><strong>Validação: </strong>Você pode criar um <a href="https://medium.com/@prakash.gangurde/how-to-create-a-middleware-for-strapi-f80a24876fc9">middleware </a>para validar se os dados da sua aplicação já existem e não vão ser duplicados, ou você também pode usar <a href="https://github.com/hapijs/joi">uma lib como o Joi</a> , para fazer validação dos campos da sua API, mas o Strapi já possui <a href="https://strapi.io/documentation/v3.x/concepts/models.html#define-the-attributes">algumas validações nativas</a> que você pode definir nos models da sua API, apenas se você usa MongoDB</li><li><strong>Roles &amp; Permissions: </strong>O ideal é você criar uma documentação pra sua API em quais permissões e quais endpoints você vai habilitar, para não acabar caindo no erro de permitir tudo e oferecendo risco aos dados da sua API</li><li><strong>Policies:</strong> Você <a href="https://strapi.io/documentation/3.0.0-beta.x/concepts/policies.html#usage">pode setar as policies</a> da sua API direto no código do Strapi através do ./config/policies para Policies globais e ./api/**/config/policies para endpoints locais. É uma camada extra de segurança para sua aplicação Strapi. Para setar policies com GraphQL , a <a href="https://strapi.io/documentation/3.0.0-beta.x/plugins/graphql.html#customise-the-graphql-schema">documentação do Strapi tem uma página exclusiva a isso.</a></li><li><strong>Data-Leak: </strong>Você pode passar um paramêtro private:true, dentro do parametro no model da sua API, para tirar o valor de ser acessado por qualquer pessoa. <a href="https://strapi.io/documentation/v3.x/concepts/models.html#define-the-attributes">Clique aqui para saber mais</a></li><li><strong>JWT:</strong> você pode exigir que para o usuário acessar endpoints sensíveis da sua aplicação ele <a href="https://strapi.io/documentation/v3.x/guides/jwt-validation.html#customize-the-jwt-validation-function">esteja logado e utilize JWT.</a></li><li><strong>Exposição de Informações Sensitivas: </strong>O Strapi permite <a href="https://strapi.io/documentation/3.0.0-beta.x/guides/custom-data-response.html">com a edição dos controllers</a>, quais informações podem ser acessadas nas chamadas dos endpoints. Você pode apagar certos campos e paramêtros dos resultados.</li></ul><p><strong>No GraphQL:</strong></p><ul><li><strong>DOS (Denial of Service)</strong>: Você precisa limitar suas queries. Um hacker mal intencionado, se descoberto sua API GraphQL, pode montar uma série de queries que podem sobrecarregar seu servidor. <a href="https://www.apollographql.com/blog/securing-your-graphql-api-from-malicious-queries-16130a324a6b">Esse é um ótimo artigo no blog do Apollo</a> que ensina alguns casos de queries maliciosas e como evitá-las.</li><li><a href="https://strapi.io/documentation/3.0.0-beta.x/plugins/graphql.html#customise-the-graphql-schema"><strong>Setando Policies para as Queries</strong></a>: Você tem que customizar o Schema da sua API GraphQL, setando as policies desejadas para ter controle de quem ou como se acessa o quê na sua API</li><li><strong>Acesso não autorizado: </strong>Você precisa desabilitar o GraphQL Playground, que já vem desabilitado na versão produção do Strapi (você pode desabilitar para outros ambientes aqui) , depois seu endpoint GraphQL não é mantido por uma rota mas por um middleware. <br>É necessario criar um novo <a href="https://strapi.io/documentation/v3.x/concepts/middlewares.html#middlewares">middleware</a>, que vai verificar se o endpoint que queremos é o /graphql e se o usuário autenticado é o que queremos:</li></ul><pre>module.exports = strapi =&gt; {<br>  return {<br>    initialize() {<br>      strapi.app.use(async (ctx, next) =&gt; {<br>        const handleErrors = (ctx, err = undefined, type) =&gt; {<br>          if (ctx.request.graphql === null) {<br>            return (ctx.request.graphql = strapi.errors[type](err));<br>          }<br><br>          return ctx[type](err);<br>        };<br><br>        // check if it&#39;s a graphql request<br>        if (ctx.request.url === &#39;/graphql&#39; &amp;&amp; ctx.request.method === &#39;POST&#39;) {<br>          if (ctx.request &amp;&amp; ctx.request.header &amp;&amp; ctx.request.header.authorization) {<br>            try {<br>              // get token data<br>              const { id } = await strapi.plugins[<br>                &#39;users-permissions&#39;<br>              ].services.jwt.getToken(ctx);<br><br>              if (id === undefined) {<br>                throw new Error(&#39;Invalid token: Token did not contain required fields&#39;);<br>              }<br><br>              // check if the id match to the user you want<br>              if (id !== &#39;my-user-id&#39;) {<br>                return handleErrors(ctx, &#39;You are not authorized to access to the GraphQL API&#39;, &#39;unauthorized&#39;);<br>              }<br>            } catch (err) {<br>              return handleErrors(ctx, err, &#39;unauthorized&#39;);<br>            }<br>          } else {<br>            // if no authenticated, return an error<br>            return handleErrors(ctx, &#39;You need to be authenticated to request GraphQL API&#39;, &#39;unauthorized&#39;);<br>          }<br>        }<br><br>        await next();<br>      });<br>    }<br>  };<br>};</pre><p>Para ser autenticado você precisa mandar um JWT no header. Veja aqui na <a href="https://strapi.io/documentation/v3.x/plugins/users-permissions.html#token-usage">documentação de autenticação</a> do Strapi como fazer.</p><p><strong>No Next.js:</strong></p><ul><li><strong>Validando os campos:</strong> A validação de campos de forms, não serve apenas para guiar seu usuários, mas também garantir a integridade das informações transmitidas do client para o server. Isso evita uma série de códigos maliciosos serem inputados em nossos Serviços. O usuário pode ainda tentar manipular os dados, editando o HTML no DevTools, mas isso é outro problema..</li><li><strong>CRSF:</strong> Passando o paramêtro Content-Type: application/JSON, nas nossas requisições, força nossa aplicação a não usar requisições simples, e protege contra ataques</li><li><strong>XSS: </strong><a href="https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html">Esse guia é muito útil</a> e mostra algumas regras que é bom seguir ao desenvolver nossa aplicação front-end para não ter dor de cabeça depois em questões de segurança e XSS. <a href="https://github.com/jagaapple/next-secure-headers">Esse plugin pro Next.js</a> também ajuda a implementar XSS Protection, ajudando o browser a sanitizar áreas vulneraveis da sua aplicação.</li><li><strong>Security Headers &amp;</strong> <strong>ClickJacking: </strong>Utilizando X-Frame-Options:DENY ou SAMEORIGIN, você evita que terceiros consigam rodar sua aplicação Next.js dentro de um frame. <br>O plugin<strong> </strong><a href="https://github.com/jagaapple/next-secure-headers"><strong>next-secure-headers</strong></a><strong>,</strong> te ajuda com isso. Além de implementar o FrameGuard, ele também implementa XSS Protection, <a href="https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Security-Policy">contentSecurityPolicy</a>,<a href="https://developer.mozilla.org/docs/Web/HTTP/Headers/X-Content-Type-Options">nosniff</a>,<a href="https://developer.mozilla.org/docs/Web/HTTP/Headers/X-Download-Options">noopen</a>,<a href="https://developer.mozilla.org/docs/Web/HTTP/Headers/Strict-Transport-Security">forceHTTPSRedirect</a>, <a href="https://developer.mozilla.org/docs/Web/HTTP/Headers/Referrer-Policy">referrerPolicy</a>, <a href="https://developer.mozilla.org/docs/Web/HTTP/Headers/Expect-CT">expectCT</a>.</li><li><strong>JWT &amp; Tokens Rolantes:</strong> Você pode implementar JWT, para a autenticação do seu App para garantir a integridade da sua API e ao acesso a ela, esse é <a href="https://medium.com/@xfor/apollo-next-js-refresh-token-authentication-flow-15e5f45df5a3">um bom tutorial </a>que ensina isso</li><li><strong>Mais: </strong><br><a href="https://next-auth.js.org/">NextAuth</a>.js : Um plugin para te ajudar com a segurança na autenticação do seu app Next.js</li></ul><h3>SSL:</h3><p>Uma etapa antes de publicarmos nosso site para produção é ambientar nosso domínio e servidor ao protocolo HTTPS. HTTPS, protege nossas requisições de serem alvos de ataques Man In the Middle, e também são <a href="https://www.agenciamestre.com/seo/https-e-resultados-no-google/">cruciais para SEO </a>pois impactam no Ranking do Google.<br>Algumas formas de conseguir certificados SSL gratuitamente para seu site são utilizar o serviço de:</p><ul><li><a href="https://letsencrypt.org/">Lets Encrypt</a></li><li><a href="https://www.sslforfree.com/">SSL For Free</a></li><li><a href="https://aws.amazon.com/certificate-manager/">AWS Certificate Manager</a></li><li><a href="https://zerossl.com/">ZeroSSL</a></li><li><a href="https://www.cloudflare.com/pt-br/ssl/">CloudFlare SSL</a></li></ul><h3>Cacheamento de APIS:</h3><p>Apesar de não ser apenas uma preocupação com segurança mas também com performance, o cacheamento de APIS pode ser recomendado para que seu site consiga funcionar mesmo em ambientes offline, mas quando se trata de dados dinâmicos, acaba sendo não recomendado, apenas para dados que não mudam constantemente. Esse é um tópico que requere um artigo só pra ele, mas caso você sinta interessado em saber mais sobre isso recomendo ler os seguintes artigos:</p><ul><li><a href="https://web.dev/cache-api-quick-guide/">Web.dev : Cache API: Quick Guide</a></li><li><a href="https://docs.aws.amazon.com/pt_br/apigateway/latest/developerguide/api-gateway-caching.html">Amazon Api Gateway: API Caching</a></li><li><a href="https://support.cloudflare.com/hc/en-us/articles/200504045-Using-Cloudflare-with-your-API">Using CloudFlare with your API</a></li><li><a href="https://graphql.org/learn/caching/">GraphQL Caching</a></li></ul><h3>Roadmap de Segurança do Strapi:</h3><p>O time do Strapi, está planejando algumas features que podem ajudar em futuras releases na questão de segurança:</p><p>Esse é o <a href="https://portal.productboard.com/strapi/1-public-roadmap/tabs/2-under-consideration">link do Product Board</a>. Nele vemos que o time do Strapi planeja features como: 2FA( Autenticação de dois fatores) , Token Rolante ( JWT), SSO ( Google, Twitter, Facebook, GitHub), dentre outros que já estão sendo testados: como Permissões e Regras por usuário e Permissões a níveis de campo.</p><h3>Ferramentas de checagem:</h3><p>Existem na web alguns sites e ferramentas que testam quão seguro é nossa aplicação, Seguem abaixo alguns deles:</p><p><a href="https://sentry.io/"><strong>Sentry</strong></a><strong>:</strong> Sentry é uma ferramenta para monitoramento de erros de webapps. Tem suporte a diversas tecnologias e plataformas. É facilmente integrável com <a href="https://github.com/BrunoScheufler/graphql-middleware-sentry">GraphQL</a>, <a href="https://strapi.io/documentation/3.0.0-beta.x/guides/error-catching.html">Strapi </a>ou <a href="https://leerob.io/blog/configuring-sentry-for-nextjs-apps">Next.js</a>. Possui uma versão free para desenvolvedores.</p><p><strong>Sqreen:</strong> Sqreen é uma plataforma de monitoramento de segurança de webapps. Pode trazer dados em tempo real de exploits em potencial, te proteger de ataques e atividades maliciosas.</p><p>O Strapi tem suporte ao Sqreen.</p><ul><li>Primeiro: criar uma <a href="https://my.sqreen.com/signup?&amp;referrer=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8=">conta trial do Sqreen</a></li><li>Segundo: configurar sua organização no painel do Sqreen</li><li>Terceiro<a href="https://strapi.io/documentation/3.0.0-beta.x/guides/secure-your-app.html"> configurar o Sqreen no Strapi</a></li></ul><p>No Next.js você também pode usar o Sqreen, mas a configuração é um pouco mais complicada</p><ul><li>Primeiro: criar uma <a href="https://my.sqreen.com/signup?&amp;referrer=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8=">conta trial do Sqreen</a></li><li>Segundo: configurar sua organização no painel do Sqreen</li><li>Terceiro configurar o <a href="https://nextjs.org/docs/advanced-features/custom-server">Next.js para usar um Custom-Server</a></li><li><a href="https://docs.sqreen.com/nodejs">Configurar o Sqreen</a> para Node.js</li></ul><p><a href="https://lgtm.com/"><strong>LGTM</strong></a>: LGTM é uma ferramenta open-source utilizada por grandes players do mercado, como Google, Microsoft, Nasa e Dell, que verifica vulnerabilidades no seu código através de um repositório no Github ou BitBucket.<br>Tem uma ferramenta de code review automático e é bastante poderoso, possui alertas para te avisar sobre problemas no código e também comparativos e histórico.</p><p><a href="https://sonarcloud.io/"><strong>SonarCloud</strong></a>: SonarQube é uma feramenta muito poderosa, que não só verifica Bugs e Vulnerabilidades no seu código, como alguns parâmetros como Mantenabilidade de código, Coverage de Testes, Codesmells, Duplicações de código, ele analisa seu código e pode barrar um P/R ou M/R no Github, GitLab, Azure DevOps ou BitBucket caso não atinja a qualidade de código esperada. O SonarCloud possui também um plugin para IDES que verifica em real time</p><p><a href="https://observatory.mozilla.org/"><strong>Mozilla Observatory</strong></a>: Ferramenta da Mozilla que vai ajudar a trazer Insights sobre a segurança do seu website.</p><p><a href="https://ssltools.digicert.com/checker/views/checkInstallation.jsp"><strong>DigiCert SSL Tools</strong></a><strong>:</strong> Vai checar dados do seu certificado SSL, mostrar possíveis vulnerabilidades, o Certificate Chain e a Configuração de servidor.</p><p><a href="https://www.ssllabs.com/ssltest"><strong>Qualys SSL Labs</strong></a><strong>:</strong> Ferramenta um pouco mais completa que a da DigiCert.</p><p><a href="https://pentest-tools.com/website-vulnerability-scanning/website-scanner"><strong>Pen-test Tool: Website Vulnerability:</strong></a> Site que possui verificação de SQL Injection, XSS, Inclusão de arquivos, Execução de comandos remotos , porém é pago.</p><p><a href="https://sitecheck.sucuri.net/"><strong>Sucuri SiteChecker</strong></a><strong>:</strong> Sucuri é bem conhecido no mundo de segurança web. Detecta se seu site está blacklisted no Google, se tem links não seguros, entre outros parametros de segurança</p><p>Bom pessoal, obrigado se você chegou aqui e teve paciência, a intenção era ter dado uma idéia geral de como mitigar e solucionar diversos problemas de segurança e vulnerabilidade em aplicações web com Next.js e Strapi, antes de começarmos a usar a Stack, sendo que os conceitos aqui apontados podem ser utilizados e verificados em qualquer aplicação web não só com Node.js e JavaScript/TypeScript mas com outras linguagens e que utilizem Rest APis ou GraphQL Apis. Esse é um assunto muito extenso que poderia render vários artigos,mas tentei resumir nesse aqui.</p><h3>Referências:</h3><ul><li><a href="https://snyk.io/vuln/npm:strapi">Vulnerabilidades no Strapi</a></li><li><a href="https://vulmon.com/searchpage.php?q=next.js&amp;sortby=byrelevance&amp;remote=on&amp;local=on&amp;physical=on&amp;nanalyzed=on">Vulnerabilidades no Next.js</a></li><li><a href="https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html">Cross Site Scripting Prevention Cheat Sheet</a></li><li><a href="https://www.imperva.com/learn/application-security/clickjacking/">Clickjacking</a></li><li><a href="https://www.agenciamestre.com/seo/https-e-resultados-no-google/">HTTPS e Resultados no Google</a></li><li><a href="https://neilpatel.com/br/blog/o-certificado-ssl-afeta-as-classificacoes-de-busca-resposta-baseada-em-dados/">O Certificado SSL , altera os resultados de busca?</a></li><li><a href="https://www.apollographql.com/blog/securing-your-graphql-api-from-malicious-queries-16130a324a6b">Securing your GraphQL API from Malicious Queries</a></li><li><a href="http://www.petecorey.com/blog/2017/06/12/graphql-nosql-injection-through-json-types/">GraphQL NoSQL Injection through JSON Types</a></li><li><a href="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/GraphQL%20Injection">GraphQL Injection</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=11c06292ce18" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>