
<?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"><channel><title><![CDATA[devGo]]></title><description><![CDATA[devGo]]></description><link>https://devgo.com.br</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1656001761441/dBm4fu2Uo.png</url><title>devGo</title><link>https://devgo.com.br</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 14 Sep 2026 04:32:00 GMT</lastBuildDate><atom:link href="https://devgo.com.br/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Vale a pena utilizar Flutter Web?]]></title><description><![CDATA[Desenvolver uma aplicação web no Flutter já não é mais novidade, está presente dentro do Flutter desde 2021. Tivemos até uma certa desconfiança e uma real necessidade de evolução da plataforma. Mas como está o Flutter Web hoje, em 2023? Vale a pena u...]]></description><link>https://devgo.com.br/vale-a-pena-utilizar-flutter-web</link><guid isPermaLink="true">https://devgo.com.br/vale-a-pena-utilizar-flutter-web</guid><category><![CDATA[Flutter]]></category><category><![CDATA[FlutterWeb]]></category><dc:creator><![CDATA[Paulo Vitor Cruz]]></dc:creator><pubDate>Mon, 07 Aug 2023 13:01:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1691412874251/65fa57e4-a7b5-4364-97e6-376d04791189.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Desenvolver uma aplicação web no Flutter já não é mais novidade, está presente dentro do Flutter desde 2021. Tivemos até uma certa desconfiança e uma real necessidade de evolução da plataforma. Mas como está o Flutter Web hoje, em 2023? Vale a pena utilizar o Flutter?</p>
<p>Já falamos sobre como o Flutter pode ser interessante e <a target="_blank" href="https://devgo.com.br/porque-voce-deve-estudar-flutter">porque você deve aprender Flutter</a> por aqui na devGo. Um dos pontos que chamamos a atenção foi você poder desenvolver um aplicativo mobile e web com o mesmo código, mudando apenas a forma como você irá realizar o build de cada um. Se você precisa, além do web, de uma aplicação mobile deveria estar considerando Flutter sem nem titubear.</p>
<p>No texto de hoje, com a experiência que tivemos aplicando Flutter na Devnology, vamos analisar cada aspecto do Flutter Web e analisar, se realmente seria uma boa escolha para a sua aplicação:</p>
<h2 id="heading-em-termos-de-desenvolvimento">Em termos de desenvolvimento</h2>
<p>Sim, vale a pena.</p>
<p>Os desenvolvedores web costumam, em um primeiro momento, estranhar muito o Flutter. Como assim vou desenvolver uma aplicação web sem nenhum HTML?</p>
<p>Mas o Flutter realmente tem uma adaptabilidade e curva de aprendizado muito boa. A estrutura em Dart é fácil de entender e bem fácil de aplicar. Apesar do estranhamento, em pouco tempo os desenvolvedores estarão bem familiarizados e conseguirão desenvolver bem.</p>
<h2 id="heading-falando-de-performance">Falando de performance</h2>
<p>O Flutter é conhecido por ter uma boa perfomance e isso vale também para web, mas há algumas observações bem importantes para isso:</p>
<p>Há também um preço a se pagar por essa perfomance. O Flutter possui uma renderização um pouco diferente de outros frameworks web, e costuma ser um pouco mais pesado. Justamente por ser mais pesado, demora algum tempo a mais para ser carregado —até porque, não há um suporte para aplicações estáticas no Flutter, como o Next ou Gatsby no React, por exemplo. Mas uma vez carregado, é bem agradável e fluído.</p>
<p>O Flutter é bem sensível a perfomance no Web. No web, estamos falando de diferentes navegadores, diferentes sistemas operacionais e diferentes computadores —não é algo tão “padronizado” quanto um celular, por exemplo. Por isso, qualquer desvio no código, qualquer componente a mais, qualquer estrutura mal realizada pode ter um efeito bem grande na perfomance. Desde que você siga com cuidado, terá uma boa perfomance.</p>
<h2 id="heading-flutter-web-e-realmente-para-web">Flutter Web é realmente para Web?</h2>
<p>O primeiro estranhamento é o Flutter não ter HTML, uma tecnologia presente desde sempre em qualquer aplicação web. E não são só os desenvolvedores que estranham a falta do HTML, mas também quaisquer outras ferramentas de aplicações web: algumas bibliotecas, comuns em outros frameworks não serão possiveis de trazer para o Flutter; ferramentas de SEO costumam sofrer para mapear o site, afinal, o mapeamento é feito em HTML e com Flutter não HTML.</p>
<p>Algo que considero bem importante e aguardo ansiosamente no Flutter é suporte a aplicações estáticas. Boa parte da web é estática e realmente não há necessidade de buildar a aplicação a cada acesso. Outros frameworks, como o React mesmo também sofreram com o mesmo em seus primeiros anos, e hoje, contam com ótimas ferramentas para construir aplicações estáticas.</p>
<p>Todos estes pontos tem suas soluções, ou ao menos terão suas soluções. A comunidade do Flutter tem crescido bastante e há pessoas dedicadas em resolver estes problemas. Já existem muitas outras bibliotecas e alternativas para estes casos, como, por exemplo, o <a target="_blank" href="https://pub.dev/packages/seo_renderer">SEO Renderer</a> para resolver qualquer problema com SEO no Flutter.</p>
<h2 id="heading-e-qual-o-veredito">E qual o veredito?</h2>
<p>De fato, o Flutter Web ainda tem muito a evoluir. O Flutter ainda é um framework em evolução, e isso é bom. A cada nova versão, novas features e melhorias vem surgindo, deixando o Flutter cada vez mais interessante.</p>
<p>Mas apesar de falar que ainda tem muito a evoluir, o que temos presente hoje, no Flutter Web, vale muito a pena! Tudo tem funcionado muito bem e cumpre com as expectativas. É uma ótima alternativa para você que quer expandir um pouco mais os seus conhecimentos.</p>
<p>Ainda repito, se você quer que o seu projeto escale, que tenha aplicações em diferentes plataformas, do Web ao Mobile, do Smart Watchs ao ainda nem lançado Apple Vision, o Flutter é a solução ideal.</p>
<p>E você, o que acha de Flutter? Participe do nosso canal do Discord e conte pra gente!</p>
]]></content:encoded></item><item><title><![CDATA[Ainda vale a pena virar desenvolvedor?]]></title><description><![CDATA[Tivemos um boom de pessoas migrando de carreira e sonhando em virar desenvolvedor. Existia uma promessa de que com alguns poucos meses de estudo, você já estaria empregado e até com um salário muito bom. Por algum tempo, podemos dizer que essa promes...]]></description><link>https://devgo.com.br/ainda-vale-a-pena-virar-desenvolvedor</link><guid isPermaLink="true">https://devgo.com.br/ainda-vale-a-pena-virar-desenvolvedor</guid><category><![CDATA[Developer]]></category><dc:creator><![CDATA[Paulo Vitor Cruz]]></dc:creator><pubDate>Mon, 24 Jul 2023 20:00:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1690220649572/7cf026a7-8df3-475e-b021-bb28457c464b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Tivemos um boom de pessoas migrando de carreira e sonhando em virar desenvolvedor. Existia uma promessa de que com alguns poucos meses de estudo, você já estaria empregado e até com um salário muito bom. Por algum tempo, podemos dizer que essa promessa se cumpriu. Mas ainda continua assim?</p>
<p>Vamos primeiro entender, o que de fato aconteceu. Realmente tivemos uma época que o mercado de TI estava extremamente acontecido, e precisando de muitos desenvolvedores. Era pandemia, o mundo estava em lockdown. Para sobreviverem, muitas empresas precisaram passar por um processo de transformação digital e assim surgiu a necessidade de contratarem desenvolvedores para criarem seus sites e aplicativos. Ao mesmo tempo, muitas pessoas haviam perdido o emprego por não conseguirem mais trabalhar presencialmente e trabalho de desenvolvedor era muito atrativo, até porque, durante a pandemia, foi uma das poucas profissões que não entraram em crise por não conseguir trabalhar presencialmente e você poderia trabalhar tranquilamente de casa, ganhando consideravelmente bem ao comparar com outras profissões.</p>
<p>Foi a partir deste cenário que surgiram as promessas: “em 6 meses você estará ganhando R$5.000”. Você está precisando de um emprego e com 6 meses de curso já começar ganhando mais que a maioria dos brasileiros, sem precisar passar por uma faculdade, e ainda trabalhando confortavelmente de casa? É claro que isso vai chamar a atenção, e milhares de pessoas vão querer virar desenvolvedor. E foi isso que muitos fizeram: largaram todos seus anos de carreira, mudaram todo seu planejamento, pagaram por alguns cursos e esperavam serem contratados. Felizmente, as empresas também precisavam de programadores para construírem seus sites e aplicativos e enfim entrarem no mundo digital. Então por muito tempo houve uma demanda muito grande, uma oferta muito grande, e a promessa até se cumpria —claro que, com menos exagero de um marketing irresponsável, mas que ainda era muito vantajoso.</p>
<p>Hoje a situação mudou bastante. Não há mais pandemia e lockdown, a transformação digital consegue seguir sem tanta urgência, em um ritmo bom, mas já menos acelerado do que a alguns anos atrás, e os investimentos em TI são menores. Tivemos uma série de layoffs, em grandes empresas de TI, e várias pessoas acabaram por ficar sem conseguir mais nenhuma vaga de desenvolvimento. A demanda diminuiu, mas a oferta de desenvolvedores ainda continua grande. E ainda assim, o marketing dos cursos, e as promessas da carreira de desenvolvedor continuam. Então a pergunta, ainda vale a pena virar desenvolvedor?</p>
<p>Para responder, primeiro temos que desmistificar a carreira de desenvolvedor. Independente do mercado não estar mais tão aquecido, ainda há boas oportunidades? Sim. É uma carreira de fácil acesso? Sim. Consigo virar um desenvolvedor em 6 meses? Não.</p>
<p>A verdade sobre ser desenvolvedor é que não, não é para todo mundo. Diversos cursos se apresentaram assim, de forma bastante desonesta, como se qualquer pessoa pudesse se tornar um desenvolvedor, mas não é bem assim na realidade. Para ser um desenvolvedor precisa de muita dedicação, muito estudo e muita insistência, e isso qualquer um pode ter, mas o principal para se tornar desenvolvedor é gostar de ser desenvolvedor.</p>
<p>Desenvolver não é um trabalho fácil. São problemas extremamente complexos e cansativos de serem resolvidos, pressão para entregas rápidas, mas com qualidade, e uma constante necessidade de estudos não só para se destacar no mercado, mas até para se manter vivo no mercado. E não é um curso de 6 meses que vai te preparar isso. São anos de estudo e prática com código, é a sua afinidade com tecnologias, é sua curiosidade em não só descobrir o que há por trás de um aplicativo, mas de realmente aprender a construir outro até melhor.</p>
<p>O que aconteceu é que entraram muitas pessoas no mercado ao ver uma oportunidade tão boa quanto essa, mas que não conseguiram se adaptar ao que o mercado realmente precisa. Hoje, as vagas estão realmente diminuíram, mas o mercado ainda precisa de desenvolvedores. Há um enorme buraco nas empresas de TI onde ainda há muito o que ser feito, mas que faltam pessoas com a vontade de cair de cabeça na área. As empresas não querem mais se encher de desenvolvedores em números, mas com pouca qualidade em solução de problemas. Hoje, a real dificuldade é encontrar desenvolvedores que realmente gostam do que fazem e que estão preparados para encarar os desafios de trabalhar com desenvolvimento de software.</p>
<p>Entender que ser desenvolvedor não é um conto de fadas é o primeiro passo. E se você tiver disposto a seguir neste caminho, então, sim, ainda vale a pena ser desenvolvedor.</p>
]]></content:encoded></item><item><title><![CDATA[Os caminhos que você pode seguir na TI]]></title><description><![CDATA[São diferentes tipos de desenvolvimento e diferentes áreas que você pode atuar. Já conhece quais caminhos você pode seguir nas áreas de TI?
Desenvolvedor
Este é o caminho mais comum, e geralmente, pode onde todos nós começamos.
Um desenvolvedor é aqu...]]></description><link>https://devgo.com.br/os-caminhos-que-voce-pode-seguir-na-ti</link><guid isPermaLink="true">https://devgo.com.br/os-caminhos-que-voce-pode-seguir-na-ti</guid><category><![CDATA[Developer]]></category><category><![CDATA[Devops]]></category><category><![CDATA[productowner]]></category><category><![CDATA[QA]]></category><dc:creator><![CDATA[Paulo Vitor Cruz]]></dc:creator><pubDate>Mon, 10 Jul 2023 20:06:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1689019551337/c4c4d47a-6dfc-4b2d-af0e-84f3d389b23b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>São diferentes tipos de desenvolvimento e diferentes áreas que você pode atuar. Já conhece quais caminhos você pode seguir nas áreas de TI?</p>
<h2 id="heading-desenvolvedor">Desenvolvedor</h2>
<p>Este é o caminho mais comum, e geralmente, pode onde todos nós começamos.</p>
<p>Um desenvolvedor é aquele que trabalha diretamente escrevendo os códigos e projetando as aplicações que irão para o consumidor final, seja essa aplicação uma API, um sistema interno, ou até mesmo um aplicativo, ou página na web. E é a partir dessas diferentes aplicações que surgem diferentes caminhos para alguém que quer ser desenvolvedor:</p>
<h3 id="heading-desenvolvedor-backend">Desenvolvedor Backend</h3>
<p>Este é o clássico desenvolvedor. Um trabalho que envolve muito código e muita lógica de programação.</p>
<p>No backend fica tudo o que “não é visto” no sistema. Você desenvolve tudo que está por trás do que acontece.</p>
<p>Um desenvolvedor backend trabalha com o próprio sistema, desenvolvendo funcionalidades e integrando serviços para a aplicação.</p>
<h3 id="heading-desenvolvedor-frontend">Desenvolvedor Frontend</h3>
<p>É assim que é chamado os desenvolvedores especializados em trabalhar na interface de uma aplicação.</p>
<p>Trabalhar com frontend é bem diferente de trabalhar com backend, por exemplo. Muitas vezes, por mais que se trate até da mesma linguagem de programação, a sintaxe e o método de desenvolvimento podem ser bastante diferentes de um desenvolvimento backend.</p>
<p>É um trabalho que exige bastante atenção e cuidado com os detalhes e a experiência do usuário afinal, você estará cuidando da principal forma de contato do cliente com sua aplicação!</p>
<h3 id="heading-desenvolvedor-mobile">Desenvolvedor mobile</h3>
<p>Da mesma forma que um desenvolvedor frontend, um desenvolvedor mobile também é especialista em criar a interface da aplicação. Mas neste caso, é com foco na interface para aplicativos no celular.</p>
<p>Desenvolver para mobile é tão diferente, utilizando até mesmo nas linguagens de programação ou na experiência que se deseja repassar ao usuário que é necessário uma área especial para desenvolvedores focados em desenvolvimento de aplicativos.</p>
<h3 id="heading-desenvolvedor-fullstack">Desenvolvedor Fullstack</h3>
<p>Ser um desenvolvedor fullstack é para quem gosta de estar envolvido em todas as etapas de um projeto. Backend, frontend, e até mobile um fullstack consegue dar conta de tudo.</p>
<p>Geralmente se trabalha dessa forma quando se há mais experiência e mais tempo de mercado, afinal, você vai precisar do conhecimento de diversas áreas diferentes</p>
<h3 id="heading-devops-e-infraestutura">Devops e Infraestutura</h3>
<p>Existe outro caminho para quem quer ser bastante técnico, mas trabalhar com algo um pouco diferente do código: devops e infraestutura.</p>
<p>São estes os profissionais que cuidam de manter toda a operação de pé, gerenciando os servidores e criando rotinas de desenvolvimento para facilitar a integração do código com a máquina propriamente dita.</p>
<p>São os responsáveis por toda a base de um projeto, afinal, sem um bom devops, sua aplicação pode ficar completamente fora do ar.</p>
<h2 id="heading-qas">QAs</h2>
<p>Conhece o trabalho de um QA? Sem eles, o seu projeto pode estar em total risco. Os QAs são os Qualitys Assurence, responsáveis pelo teste e pela garantia de qualidade da sua aplicação.</p>
<p>Eles geralmente tem conhecimento sobre código e sobre sistemas, afinal, precisa conhecer como tudo funciona para explorar as vulnerabilidades do sistema. E não só sobre código, também é importante conhecerem sobre experiência do usuário e desenvolvimento de interfaces para poderem avaliar se o produto final, o aplicativo que estará na mão do cliente, irá se portar bem, não só longe de bugs, mas que funcione de uma forma agradável e intuitiva para o cliente</p>
<h2 id="heading-product-owners">Product Owners</h2>
<p>Apesar de estar longe do código, ser PO é um ótimo caminho para quem quer entrar na TI. Os products owners são os responsáveis por cuidar e gerenciar o projeto.</p>
<p>Para ser um PO você precisa ser bastante organizado, saber lidar com pessoas, e ter sangue-frio para tomar decisões importantes para o projeto. São pessoas que também tem um conhecimento técnico, apesar de como disse, estarem longe do código, afinal, estão em constante contato com o time de desenvolvimento.</p>
<h2 id="heading-lideres">Lideres</h2>
<p>Este é um caminho bem interessante para quem quer estar na TI. Trata-se até de uma evolução de todos os outros caminhos.</p>
<p>Um líder precisa de um pouco de conhecimento de cada etapa, mas até porque, cada área do desenvolvimento de um projeto precisa de um líder. E muito mais do que ter esse conhecimento, o líder deve conseguir espalhar este conhecimento e gerenciar e organizar cada etapa junto aos times específico para que se tenha um bom projeto entregue.</p>
<p>Estes são alguns dos caminhos que você pode seguir entrando na área de TI. Por onde você deseja entrar ou por qual caminho já está atuando? Participe do nosso canal do Discord e conte para gente!</p>
]]></content:encoded></item><item><title><![CDATA[5 Softskills para desenvolvedores]]></title><description><![CDATA[Código não é tudo para um desenvolvedor. Se você quer se destacar na sua carreira precisa ter outras habilidades que vão muito além do técnico. Hoje vamos falar de algumas softskills bem importantes para os desenvolvedores.
Comunicação
Como desenvolv...]]></description><link>https://devgo.com.br/5-softskills-para-desenvolvedores</link><guid isPermaLink="true">https://devgo.com.br/5-softskills-para-desenvolvedores</guid><category><![CDATA[Developer]]></category><category><![CDATA[softskills]]></category><dc:creator><![CDATA[Paulo Vitor Cruz]]></dc:creator><pubDate>Mon, 26 Jun 2023 13:07:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1687784846115/d22190e3-1cfc-433f-8f71-82b8bcb7282c.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Código não é tudo para um desenvolvedor. Se você quer se destacar na sua carreira precisa ter outras habilidades que vão muito além do técnico. Hoje vamos falar de algumas softskills bem importantes para os desenvolvedores.</p>
<h2 id="heading-comunicacao">Comunicação</h2>
<p>Como desenvolvedor, você precisa conseguir expressar as suas ideias e soluções de forma compreensível e didática, até mesmo para seus colegas e principalmente para seus clientes e também entender bem a necessidade do seu cliente.</p>
<p>A comunicação é forma em que você apresenta o seu trabalho. Do que adianta ser bom em um trabalho se não conseguir se comunicar?</p>
<h2 id="heading-organizacao">Organização</h2>
<p>No dia a dia como desenvolvedor de software recebemos diversas demandas, de projetos ou serviços diferentes, e as informações seja sobre o código ou a regra de negócio são diversas, e isso, quando não há mais de uma demanda.</p>
<p>Aquele que consegue não só entender o que deve ser feito, mas documenta bem a sua entrega e organiza bem o seu tempo e entende seus prazos com certeza tem destaque no mercado.</p>
<p>Um bom desenvolvedor consegue gerenciar bem as suas demandas, saber definir suas metas e objetivos, e principalmente suas prioridades.</p>
<h2 id="heading-trabalho-em-equipe">Trabalho em equipe</h2>
<p>Você dificilmente irá trabalhar sozinho em um código. A colaboração em um projeto, a contribuição em discussões técnicas principalmente o ouvir e escutar um colega são habilidades essenciais para um desenvolvedor.</p>
<p>Um bom trabalho em equipe também fornece troca de experiências e agrega em conhecimento para você mesmo. É o famoso networking tão importante na construção de uma carreira.</p>
<p>Pense também que essa é sua equipe e você estará sempre em contato com eles. Nada melhor do que construir uma boa relação, não acha?</p>
<h2 id="heading-resolucao-de-problemas">Resolução de problemas</h2>
<p>Este é o seu verdadeiro trabalho. No dia a dia de um desenvolvedor diversos problemas irão surgir e você precisará resolvê-los.</p>
<p>Identificar um problema, analisá-lo de forma precisa e propor uma solução realmente eficiente é uma habilidade extremamente importante para qualquer desenvolvedor.</p>
<p>Saiba também como lidar com estes problemas. Evitar frustrações, saber quando pedir ajuda, e trabalhar mantendo sempre uma boa autoestima é fundamental até mesmo para conseguir resolver os problemas de fato.</p>
<h2 id="heading-adaptacao">Adaptação</h2>
<p>Em desenvolvimento tudo está sempre mudando, e precisamos estar preparados para essas mudanças. Tecnologias estão sempre mudando, frameworks estão trazendo novos recursos. O que é bom hoje, amanhã, pode não mais ser.</p>
<p>É essencial para um desenvolvedor conseguir se adaptar bem a essas mudanças, e encará-las como novas oportunidades de crescimento. Um desenvolvedor nunca pode ficar parado.</p>
<p>Essas são algumas das softskills mais importantes para um desenvolvedor, mas com certeza, há diversas outras habilidades que você pode trabalhar para se destacar na sua carreira. O que mais você trabalha, além do técnico, para conseguir evoluir como desenvolvedor? Participe do nosso canal do Discord e conte pra gente.</p>
]]></content:encoded></item><item><title><![CDATA[Tenha um boilerplate para seus projetos]]></title><description><![CDATA[Sempre é bom ter um boilerplate pronto para o seu novo projeto. Mas você sabe o que é um boilerplate?
O que é um boilerplate?
Sempre que você começa um novo projeto, você repete o mesmo processo, certo? Por exemplo: instala o React, configura o NextJ...]]></description><link>https://devgo.com.br/tenha-um-boilerplate-para-seus-projetos</link><guid isPermaLink="true">https://devgo.com.br/tenha-um-boilerplate-para-seus-projetos</guid><category><![CDATA[Developer]]></category><category><![CDATA[boilerplate]]></category><dc:creator><![CDATA[Paulo Vitor Cruz]]></dc:creator><pubDate>Mon, 12 Jun 2023 19:50:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1686599384587/58ebfb76-63a2-473d-9556-03b745a9f370.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Sempre é bom ter um boilerplate pronto para o seu novo projeto. Mas você sabe o que é um boilerplate?</p>
<h2 id="heading-o-que-e-um-boilerplate">O que é um boilerplate?</h2>
<p>Sempre que você começa um novo projeto, você repete o mesmo processo, certo? Por exemplo: instala o React, configura o NextJS, adiciona alguma biblioteca UI, prepara o gerenciador de estados, prepara aqueles mesmos componentes que você sempre usa em todo o projeto. Você não precisa ficar sempre fazendo isso, basta ter um boilerplate.</p>
<p>Um boilerplate é um “pré-projeto”, um conjunto de código que você já deixa pronto para ser reutilizado em algum novo projeto. É como se fosse um template, que já está ali todo configurado para que você possa começar uma nova aplicação se preocupando apenas com as funcionalidades daquela nova aplicação.</p>
<h2 id="heading-por-que-ter-um-boilerplate">Por que ter um boilerplate?</h2>
<p>Pense na economia de tempo. Não precisa sempre reconstruir aquela mesma estrutura. Se você tem um novo projeto, recebeu uma nova demanda, basta utilizar o boilerplate e rapidamente o seu projeto estará de pé e pronto para desenvolvimento.</p>
<p>Para atualizar seus projetos, seja na correção de um bug ou na atualização de um pacote, é ótimo ter um boilerplate presente. Basta atualizar o próprio boilerplate, e os projetos seguirão na mesma linha.</p>
<p>Além disso, é ótimo para ter projetos bem padronizados. Em seu time, é importante que todos os projetos passem por um mesmo caminho, facilitando até mesmo a adaptação de um projeto para outro, afinal, a base do código é praticamente a mesma devido ao uso do boillerplate.</p>
<p>Mas o verdadeiro motivo, é porque você precisa aprender a construir um boilerplate.</p>
<h2 id="heading-o-que-posso-aprender-construindo-um-boilerplate">O que posso aprender construindo um boilerplate?</h2>
<p>Construir um boilerplate é um ótimo estudo. É literalmente, um exercício para trabalhar diferentes habilidades de desenvolvimento.</p>
<p>Pense bem: um boilerplate precisa ser consistente, ter um certo padrão de código que te acompanhe durante diferentes projetos. Para desenvolver algo assim, você precisa estar preparado para prever e planejar um código que consiga transitar em diferentes projetos e serviços, trabalhando bastante com reutilização de código e melhores práticas de programação com arquiteturas flexíveis para que o seu boilerplate seja realmente dinâmico. E claro, isso não é tão simples quanto parece.</p>
<p>Se você tem um bom boilerplate, já é um bom sinal de que é um bom programador.</p>
<p>E você? Já tem um boilerplate no seu portifólio? Utiliza nos seus projetos? Compartilhe com a gente em nosso canal do Discord!</p>
]]></content:encoded></item><item><title><![CDATA[Como escalar o seu código]]></title><description><![CDATA[Você já trabalhou a escalabilidade do seu projeto? Esse é um ponto de extrema importância para ter uma grande aplicação no mercado. Vamos te explicar o que é escalabilidade, e como você pode trabalhar com este conceito no seu sistema.
O que é escalab...]]></description><link>https://devgo.com.br/como-escalar-o-seu-codigo</link><guid isPermaLink="true">https://devgo.com.br/como-escalar-o-seu-codigo</guid><category><![CDATA[scalability]]></category><category><![CDATA[development]]></category><dc:creator><![CDATA[Paulo Vitor Cruz]]></dc:creator><pubDate>Mon, 29 May 2023 13:04:41 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1685365310012/786c7a2f-12ae-4f07-9de5-b8dc32e90179.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Você já trabalhou a escalabilidade do seu projeto? Esse é um ponto de extrema importância para ter uma grande aplicação no mercado. Vamos te explicar o que é escalabilidade, e como você pode trabalhar com este conceito no seu sistema.</p>
<h2 id="heading-o-que-e-escalabilidade">O que é escalabilidade?</h2>
<p>Sua aplicação consegue se adaptar conforme a demanda, quantidade de acesso, volume de dados que recebe? Pois isso que é escalabilidade.</p>
<p>Durante o desenvolvimento, pouco nos preocupamos com escalabilidade, afinal, no seu computador o código está rodando bem, estável, sem travamentos e tudo parece funcionar muito bem. Isso pode até funcionar quando estiver em produção, com 10 ou 100 pessoas acessando sua aplicação, mas de acordo com a evolução do seu produto e o crescimento de volume isso pode mudar bastante.</p>
<p>É sempre importante que seu projeto consiga suportar a um grande trafego de usuários na sua aplicação ou a uma operação complexa que exija mais do sistema, sem prejudicar o desempenho da aplicação ou até mesmo causar uma queda no serviço.</p>
<h2 id="heading-como-escalar-uma-aplicacao">Como escalar uma aplicação?</h2>
<p>Imagine o seu próprio computador, com várias abas do Chrome abertas. O seu PC vai ficar extremamente lento, isso se não causar uma tela azul, certo? O que você faz nessa situação? Fecha abas desnecessárias que você não está usando, ou até mesmo, trocar para um navegador que performa melhor. Podemos aplicar este mesmo exemplo na sua aplicação: se está lento demais, melhore os processos do seu sistema, optimize o seu código e use tecnologias mais leves e rápidas para sua aplicação.</p>
<p>Mas você é um usuário que precisa mesmo de várias abas abertas no Chrome. Qual a solução? Aumentar a memória do seu computador. Isso também é válido para desenvolvimento de software, e se chama escalabilidade vertical. Você pode melhorar sua aplicação com um servidor mais potente, que consiga processar melhor o seu código e que consiga lidar com uma demanda maior.</p>
<p>Ainda assim, existe um limite certo? Não importa o quanto você melhore seus processos, ou tenha um servidor poderoso, se o trafego da sua aplicação ainda for alto você pode sofrer com os mesmos problemas de instabilidade e performance. Bom, nesta solução, você não conseguiria aplicar para resolver suas abas do Chrome, mas existe algo bem interessante em desenvolvimento de software chamado de escalabilidade horizontal: se um computador, por melhor que seja, está sofrendo com o número de demandas, que tal usar 2, 3 ou 10 computadores e distribuir essa carga? Com tecnologias em nuvem, isso não só é extremamente possível como é bastante popular.</p>
<h2 id="heading-o-que-grandes-apps-fazem">O que grandes apps fazem?</h2>
<p>Na prática, as grandes aplicações já usam e já são desenvolvidas pensando escalabilidade e por padrão já usam algumas técnicas e soluções bastante comuns para resolverem seus problemas:</p>
<ul>
<li><p>Uma arquitetura distribuída em <a target="_blank" href="https://devgo.com.br/monolitos-e-microsservicos">microserviços</a>, em que diversas aplicações dividem suas responsabilidades de forma independente, equilibrando os processos, conforme a demanda de cada específico serviço.</p>
</li>
<li><p>Uso de cache em diversas pontas da aplicação. Porque reprocessar os dados, se já sabemos que o resultado será o mesmo de alguns minutos atrás? Utilizar o cache em situações como essa diminui bastante o processamento de seu servidor, diminuindo o custo, e abrindo mais espaço para um tráfego maior.</p>
</li>
<li><p>Dimensionamento de servidores de forma horizontal, acrescentando máquinas e instâncias e balanceando o trafego em diferentes serviços para equilibrar as demandas e processamento do sistema.</p>
</li>
<li><p>Infraestrutura voltada a nuvem, como AWS, Google Cloud ou Azure que já trazem serviços de escalonamento automático, de acordo com a demanda recebida na aplicação.</p>
</li>
<li><p>Implementação de técnicas de observabilidade e monitoramento para justamente saber onde, e o que melhorar no seu sistema.</p>
</li>
</ul>
<p>Essas são algumas das soluções mais comuns aplicadas em grandes apps. Assim como o próprio conceito de escalabilidade, que preza pela adaptação, as estratégias de escalabilidade devem também ser adaptadas segundo a necessidade do seu sistema.</p>
<p>Com estes conceitos, esteja sempre atento, e já construa sua aplicação pensando na escalabilidade do seu projeto. Um bom código é aquele que sempre funciona, não importa a quantidade de pessoas acessando, não importa a complexidade do processo, não importa o trafego de dados. E se você quer ter um bom código e principalmente um bom produto, escalabilidade é fundamental.</p>
]]></content:encoded></item><item><title><![CDATA[NextJS Server Actions e monorepositórios]]></title><description><![CDATA[Com a última versão no NextJS e a possibilidade de criar funções do lado do servidor, a comunidade de desenvolvedores ficou bastante animada com a possibilidade de manter todo o projeto dentro de um mesmo código —inclusive, uma conexão com o banco de...]]></description><link>https://devgo.com.br/nextjs-server-actions-e-monorepositorios</link><guid isPermaLink="true">https://devgo.com.br/nextjs-server-actions-e-monorepositorios</guid><category><![CDATA[Next.js]]></category><category><![CDATA[server actions]]></category><category><![CDATA[monorepository]]></category><dc:creator><![CDATA[Paulo Vitor Cruz]]></dc:creator><pubDate>Mon, 15 May 2023 17:00:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1684160461263/eab383f3-b96c-4208-956f-8d54553659ee.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Com a última versão no NextJS e a possibilidade de criar funções do lado do servidor, a comunidade de desenvolvedores ficou bastante animada com a possibilidade de manter todo o projeto dentro de um mesmo código —inclusive, uma conexão com o banco de dados. Mas calma lá, isso não é nem tão inovador assim. E será que é bom mesmo?</p>
<h2 id="heading-o-que-e-um-monorepositorio">O que é um monorepositório?</h2>
<p>Hoje em dia estamos acostumados a desenvolver uma API, e desenvolver uma interface em projetos e repositórios separados —backend e frontend. Mas, a depender do projeto, ou da tecnologia, existe a possibilidade de desenvolver tudo em um único projeto, sem essa divisão de backend e frontend. Isso é tal do “monorepositório”.</p>
<p>Com apenas um repositório você terá uma facilidade maior de manuntenção e o código fica mais visível e acessível durante o desenvolvimento. É interessante para quem está começando com programação e fica bem legal quando é um pequeno projeto, ou algum estudo ou experimentação de tecnologia que você está fazendo.</p>
<h2 id="heading-usar-monorepositorio-e-uma-boa-pratica">Usar monorepositório é uma boa prática?</h2>
<p>Sendo bastante sincero, existe um motivo para monorepositórios não serem mais tão populares.</p>
<p>Dividir seu projeto, em diferentes repositórios e códigos, não só pode adicionar uma boa camada de segurança, como também melhora a divisão de responsabilidades em uma aplicação, e isso sim é uma boa prática de programação.</p>
<p>Ter tudo em um único lugar torna seu projeto um “monstro”. Por mais que até certo nível seja até amigável quanto mais o seu projeto cresce, essa junção de responsabilidades torna o seu código extremamente complexo, e até dificulta a manutenção —que deveria ser um dos pontos positivos de um projeto com monorepositório.</p>
<p>Hoje em dia, quando discutimos bastante <a target="_blank" href="https://devgo.com.br/monolitos-e-microsservicos">monolitos e microserviços</a>, digo que utilizar um monorepositório é até contra intuitivo.</p>
<h2 id="heading-como-esta-voltando-aos-holofotes">Como está voltando aos holofotes?</h2>
<p>A algum tempo atrás eram assim que sites e aplicações funcionavam, backend e frontend todos em um mesmo código. Projetos em monorepositórios chegaram ser bastante populares, principalmente no “boom” do PHP.</p>
<p>Hoje, o monorepositório volta a discussão pois tecnologias mais recentes, como o React e o framework NextJS, estão trazendo um novo recurso de <a target="_blank" href="https://nextjs.org/blog/next-13-4#server-actions-alpha">“Server Actions”</a> que permite trazer funções hoje já bastante comuns ao backend, como uma conexão ao banco de dados, para o mesmo repositório que estão seus componentes em React.</p>
<p>Olha só um componente React chamando uma função que insere um dado em um banco de dados:</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">import</span> db <span class="hljs-keyword">from</span> <span class="hljs-string">'./db'</span>;
<span class="hljs-keyword">import</span> { redirect } <span class="hljs-keyword">from</span> <span class="hljs-string">'next/navigation'</span>;

<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">create</span>(<span class="hljs-params">formData: FormData</span>) </span>{
  <span class="hljs-string">'use server'</span>;
  <span class="hljs-keyword">const</span> post = <span class="hljs-keyword">await</span> db.post.insert({
    title: formData.get(<span class="hljs-string">'title'</span>),
    content: formData.get(<span class="hljs-string">'content'</span>),
  });
  redirect(<span class="hljs-string">`/blog/<span class="hljs-subst">${post.slug}</span>`</span>);
}

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Page</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">return</span> (
    &lt;form action={create}&gt;
      &lt;input <span class="hljs-keyword">type</span>=<span class="hljs-string">"text"</span> name=<span class="hljs-string">"title"</span> /&gt;
      &lt;textarea name=<span class="hljs-string">"content"</span> /&gt;
      &lt;button <span class="hljs-keyword">type</span>=<span class="hljs-string">"submit"</span>&gt;Submit&lt;/button&gt;
    &lt;/form&gt;
  );
}
</code></pre>
<h2 id="heading-todo-recurso-e-util">Todo recurso é útil</h2>
<p>Por mais que eu pessoalmente ainda ache estranho, todo recurso é realmente útil. Os benefícios ainda existem, basta sabermos usá-los. Além disso, ainda é um recurso bastante novo em fase Alpha no NextJS, o que mais ainda pode estar por vir até a versão final?</p>
<p>E você? O que acha de Server Actions e de monorepositorios? <a target="_blank" href="https://discord.gg/H5wPNCTRwq">Participe de nosso canal no Discord</a> e conte pra gente!</p>
]]></content:encoded></item><item><title><![CDATA[Não existem desenvolvedores de framework]]></title><description><![CDATA[Ou pelo menos, não deveria existir. Se você é desenvolvedor e foca em trabalhar somente com um framework específico, para tudo que está fazendo! Tá tudo errado! Vem que eu vou te explicar porque isso é o pior que você pode fazer para sua carreira.
Eu...]]></description><link>https://devgo.com.br/nao-existem-desenvolvedores-de-framework</link><guid isPermaLink="true">https://devgo.com.br/nao-existem-desenvolvedores-de-framework</guid><category><![CDATA[Developer]]></category><category><![CDATA[framework]]></category><category><![CDATA[Programming Tips]]></category><category><![CDATA[programming languages]]></category><dc:creator><![CDATA[Paulo Vitor Cruz]]></dc:creator><pubDate>Tue, 02 May 2023 12:00:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1682983272028/f543a1db-3334-4e66-a575-20a4f35034fc.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ou pelo menos, não deveria existir. Se você é desenvolvedor e foca em trabalhar somente com um framework específico, para tudo que está fazendo! Tá tudo errado! Vem que eu vou te explicar porque isso é o pior que você pode fazer para sua carreira.</p>
<h2 id="heading-eu-te-entendo">Eu te entendo…</h2>
<p>São milhares de coisas para você estudar. O mercado de trabalho te pede um framework específico. É claro que você, que está apenas começando neste mundo, iria focar em um framework. É mesmo o jeito mais rápido de conseguir um trabalho. Mas também é o pior jeito. Você vai mesmo ficar refém de um único framework?</p>
<h2 id="heading-frameworks-vem-e-vao">Frameworks vem e vão</h2>
<p>Houve o tempo em que nem frameworks existiam. Houve o tempo em que uma página na internet era toda feita de tabelas. Houve o tempo em que desenvolvimento frontend era praticamente só CSS, o Bootstrap era bem famoso. O jQuery também tinha o seu espaço garantido. AngularJS surgiu e foi completamente substituído por uma nova versão. No mobile, os frameworks nativas eram até a única solução disponível para criar um aplicativo. Hoje o mundo já é bem diferente. E o que será do React, Vue, Flutter, Nest e Laravel no futuro?</p>
<p>Frameworks vem e vão, mas o conhecimento que você tem na linguagem de programação fica.</p>
<h2 id="heading-se-voce-sabe-bem-uma-linguagem-vai-conseguir-trabalhar-bem-em-um-framework">Se você sabe bem uma linguagem, vai conseguir trabalhar bem em um framework</h2>
<p>Nós já te explicamos o que é um framework, mas nada custa lembrar: framework é um conjunto de funções e ferramentas de uma linguagem de programação estruturadas de uma forma que facilite o seu desenvolvimento. E é isso mesmo, é apenas uma biblioteca de funções que utiliza a mesma linguagem de programação que você tem negligenciado seus estudos.</p>
<p>A lógica é muito simples: se um framework tem como base uma linguagem de programação, basta conhecer bem essa linguagem de programação e você conseguirá utilizar o framework —com uma capacidade até maior do aqueles que se limitam a estudar somente o framework.</p>
<p>O framework ficou decadente, ou surgiu uma opção melhor no mercado? Tudo bem, você ainda terá o conhecimento da linguagem de programação. Por isso, os desenvolvedores que passado desenvolviam bastante com jQuery e foram para os novos frameworks de Javascript, como o próprio React, Vue e Angular. O mesmo vale para os desenvolvedores PHP que se adaptaram extremamente bem do Zend para o Laravel. E se acha que isso é válido somente quando um framework é depreciado pela comunidade, que tal tentar migrar do React para Vue? Como ambos tem a mesma base em Javascript será muito mais fácil!</p>
<h2 id="heading-estude-certo">Estude certo</h2>
<p>Você precisa saber onde investir os seus estudos. E a resposta certa, é estudar a linguagem de programação, entender os conceitos, aprender a lógica. Use o framework apenas como um facilitador, afinal, é até esse o objetivo proposto pelos frameworks.</p>
<p>Por aqui na devGo, essa é a nossa metodologia e é assim que trataremos em nossos próximos artigos. Se você quer continuar bem nos estudos, participe de nosso canal no Discord e acompanhe em nossos próximos artigos.</p>
]]></content:encoded></item><item><title><![CDATA[Como cuidar de um projeto em produção]]></title><description><![CDATA[Desenvolver um projeto é uma coisa, colocar em produção é outra completamente diferente. Você sabe cuidar de um projeto em produção?
Se você entendeu bem o nosso último texto e está se preparando para ser um bom desenvolvedor, sabe que a entrega é a ...]]></description><link>https://devgo.com.br/como-cuidar-de-um-projeto-em-producao</link><guid isPermaLink="true">https://devgo.com.br/como-cuidar-de-um-projeto-em-producao</guid><category><![CDATA[development]]></category><category><![CDATA[production]]></category><dc:creator><![CDATA[Paulo Vitor Cruz]]></dc:creator><pubDate>Mon, 17 Apr 2023 13:54:47 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1681739415899/ee038b9e-a208-4ba4-8988-b53d7c16edc2.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Desenvolver um projeto é uma coisa, colocar em produção é outra completamente diferente. Você sabe cuidar de um projeto em produção?</p>
<p>Se você entendeu bem o nosso último texto e está se preparando para ser <a target="_blank" href="https://devgo.com.br/o-que-te-faz-um-bom-desenvolvedor">um bom desenvolvedor</a>, sabe que a entrega é a parte mais importante do seu trabalho, e uma entrega, de fato, é seu projeto estar em produção. E é aqui que de fato o seu projeto começa.</p>
<p>Uma coisa é desenvolver o seu projeto localmente, ou até em um ambiente controlado de teste. Outra coisa é quando usuários começam a usar. Agora, problemas inesperados podem surgir, soluções rápidas precisarão acontecer, e melhorias precisarão serem feitas.</p>
<p>Ter um projeto em produção significa ter responsabilidade constante sobre o produto. É ter uma infraestrutura potente o suficiente para aguentar a demanda de seus usuários; estar atento a bugs e resolver o que for preciso o mais rápido possível e da melhor forma possível; trabalhar em melhorias, e principalmente saber como trabalhar com essas melhorias para o seu projeto.</p>
<h2 id="heading-confira-a-infraestrutura-de-seu-projeto">Confira a infraestrutura de seu projeto</h2>
<p>Quando milhares de pessoas acessam seu projeto, tudo pode acontecer: a aplicação ficar lenta, apresentar algum comportamento não esperado e até mesmo ficar completamente fora do ar. Pouco importa se você tem um código bem feito, limpo de bugs e problemas se a infraestrutura não suportar a demanda.</p>
<p>Sua aplicação está disponível na nuvem? Os serviços desenvolvidos são escaláveis? Existem políticas de balanceamento de carga? Existe uma solução para cache? A estrutura é elástica o suficiente para suportar a demanda? Foram feitos testes de sobrecarga para entender até onde a aplicação suporta tudo isso? São essas as perguntas que sempre devemos fazer quando um projeto está entrando em produção.</p>
<p>Não basta até que seu projeto esteja “funcionando”. Em produção o seu projeto funcionar “sempre”.</p>
<h2 id="heading-monitore-o-que-acontece-na-aplicacao">Monitore o que acontece na aplicação</h2>
<p>Acabo de dizer que é importante que seu projeto funcione “sempre”. Mas como saber que está, realmente, sempre funcionando?</p>
<p>Você precisa ter ferramentas de monitoramento e métricas para ser possível identificar possíveis gargalos e problemas com o seu projeto. É importante que você veja se sua aplicação realmente está no ar, se há algum log de erro desconhecido e não tratado acontecendo, se está lento demais e até mesmo se o comportamento do cliente, como vendas, buscas por um produto e taxa de conversão estão de acordo com a proposta de negócio da sua aplicação.</p>
<p>Serviços como Sentry, New Relic, ou até dashboards do Grafana, ou Prometheus podem te ajudar com isso. Com eles é possível monitorar em tempo real, conferir logs, e até ter alertas, relacionados a certas métricas para te chamar atenção a cada possível problema.</p>
<h2 id="heading-tenha-protocolos-de-deployment">Tenha protocolos de deployment</h2>
<p>Quem nunca teve medo de subir um código em produção? Errado é quem não tem.</p>
<p>Subir um código em produção significa ter uma mudança imediata no seu produto que pode afetar milhares de clientes ao mesmo tempo. Pode ser uma ótima melhoria para seu projeto, mas também pode ser um comportamento não esperado, um bug, um erro no código que irá acabar com o seu produto.</p>
<p>Versionamento da aplicação, um bom fluxo no Git, testes bem feitos e até automatizados, e até um monitoramento mais preciso pós uma nova versão em produção irão te ajudar. Combine com o seu time estes protocolos, valide bem qualquer alteração no código e principalmente esteja atento.</p>
<h2 id="heading-e-agora-que-o-trabalho-comeca">É agora que o trabalho começa</h2>
<p>É somente em produção que entendemos melhor o nosso produto.</p>
<p>É agora que começamos a ver como realmente é o nosso produto, se os usuários se comportam como o esperado, se os usuários sentem falta de algum recurso importante e até se o produto foi mesmo bem desenvolvido.</p>
<p>Uma aplicação nunca deixa de ser desenvolvida, sempre precisa de melhorias, de refinamento, de novos recursos. O produto sempre precisa evoluir. E é aí que o seu trabalho realmente começa.</p>
<p>Em produção, você terá um mundo de oportunidades para mostrar o seu trabalho.</p>
]]></content:encoded></item><item><title><![CDATA[O que te faz um bom desenvolvedor?]]></title><description><![CDATA[Sem dúvidas esse é o objetivo de todo desenvolvedor. Mas o que te faz realmente bom?
Participar de um grande projeto, ser especialista em uma linguagem de programação ou framework, liderar outros desenvolvedores, formar novos programadores. Há divers...]]></description><link>https://devgo.com.br/o-que-te-faz-um-bom-desenvolvedor</link><guid isPermaLink="true">https://devgo.com.br/o-que-te-faz-um-bom-desenvolvedor</guid><category><![CDATA[Developer]]></category><dc:creator><![CDATA[Paulo Vitor Cruz]]></dc:creator><pubDate>Mon, 03 Apr 2023 12:36:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1680525386281/4c9d3b0b-feee-41c0-abc5-25fc4c1ecea5.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Sem dúvidas esse é o objetivo de todo desenvolvedor. Mas o que te faz realmente bom?</p>
<p>Participar de um grande projeto, ser especialista em uma linguagem de programação ou framework, liderar outros desenvolvedores, formar novos programadores. Há diversos caminhos para se considerar um bom desenvolvedor, mas no geral, existem importantes pontos que te valorizam e te destacam entre tantos outros desenvolvedores, aumentando de forma considerável o seu valor no mercado.</p>
<p>Hoje vamos discutir o que você deve trabalhar para ser um ótimo desenvolvedor.</p>
<h2 id="heading-alem-de-ser-um-tecnico">Além de ser um técnico</h2>
<p>Já comentamos por aqui diversas vezes: ser um bom desenvolvedor, vai muito além do técnico. Não tiro a importância de você conhecer bem uma linguagem, saber trabalhar bem em um framework e ser especialista em determinada ferramenta. É claro que estes são pontos indispensáveis para que você se torne um bom desenvolvedor.</p>
<p>Mas para ser um bom desenvolvedor, você precisa de um diferencial, e este diferencial vai muito além do técnico. Trata-se muito mais do valor que você consegue agregar, e da forma que você trabalha para atingir o seu valor.</p>
<p>É importante que você, como desenvolvedor, consiga ir além do ser um bom técnico, e é justamente nestes pontos que iremos focar.</p>
<h2 id="heading-ser-desenvolvedor-e-resolver-problemas">Ser desenvolvedor é resolver problemas</h2>
<p>Vamos primeiro entender o verdadeiro objetivo do trabalho de um desenvolvedor: resolver problemas. Um desenvolvedor é aquele que cria um código, desenvolve uma aplicação, constrói um programa a fim de resolver o problema de alguém ou de alguma empresa. E é por isso que este deve ser o seu foco.</p>
<p>No mercado, desenvolvedores são contratados, pois empresas estão com um determinado desafio que precisa ser resolvido.</p>
<p>Um ótimo exemplo de um caso como este foi durante a pandemia: empresas que funcionavam apenas ficaram fisicamente limitadas com o lockdown, precisando então recorrer a algum outro recurso para atingir as metas de seus produtos. Essa solução foi uma grande transformação digital nas empresas, com sites, ecommerces e aplicativos e para isso, desenvolvedores precisaram ser contratados.</p>
<p>Pois bem, se você foi contratado para resolver um determinado problema, tenha como foco desenvolver este determinado problema. E lembre que por muitas vezes, isso exigirá que você pense muito além do seu desenvolvimento, pense nas suas entregas!</p>
<h2 id="heading-pense-no-valor-de-suas-entregas">Pense no valor de suas entregas</h2>
<p>Com o mesmo exemplo de que durante a pandemia, empresas passaram por uma grande mudança e produtos digitais precisaram ser desenvolvidos, vamos pensar em como este momento poderia ter afetado o seu trabalho.</p>
<p>Pense que durante este tempo, não só o seu cliente ou a sua empresa precisavam desta transformação. Pense também, que este foi um tempo limitado e que, por exemplo, hoje, as empresas já podem atuar fisicamente como sempre atuaram.</p>
<p>Naquele momento, o que as empresas precisavam era de uma solução rápida, uma transformação “imediata”, que as tirassem da crise o mais rápido possível, e até mesmo antes de seus concorrentes, para que assim dominassem o vazio do mercado criado pela pandemia. Se você foi um desenvolvedor que entendeu este recado e conseguiu desenvolver um produto rápido o suficiente para isso, tenho certeza que está colhendo os frutos desta entrega hoje.</p>
<p>Para uma empresa não basta apenas ter um produto desenvolvido, até porque, o problema para a empresa não é “não ter um produto digital”, e sim “vender mais” e “dominar o mercado”. A grande questão é: o que você irá fazer para que o seu desenvolvimento resolva este problema? Qual vai ser o seu diferencial?</p>
<p>Sair do lado técnico para entender o mercado e suas necessidades é justamente o que pode aumentar o valor de suas entregas. E lembre-se, o valor de suas entregas é o seu valor como desenvolvedor.</p>
<h2 id="heading-seja-um-lider">Seja um líder</h2>
<p>Se você além de ter qualidade técnica, entende o seu objetivo como desenvolvedor e principalmente entende o valor de suas entregas, porque não passar isso adiante?</p>
<p>Para uma empresa, melhor do que ter uma única pessoa que entende o que faz um bom desenvolvedor é ter 5 pessoas que entendem o que faz um bom desenvolvedor. E se você, é alguém que consegue passar o conhecimento e experiência que você adquiriu para outros desenvolvedores, tenha a certeza de que será bem valorizado.</p>
<p>Não se trata de uma concorrência, em que você precisa competir para ser um bom desenvolvedor, muito pelo contrário. Se trata de um crescimento exponencial. Se você consegue formar outros bons desenvolvedores, você expande todo o seu alcance: as entregas de seus liderados passam a ser a sua entrega, o valor de seus liderados para a ser somados ao seu valor.</p>
<p>Seja a referência do seu projeto, trabalhe de forma para compartilhar o seu conhecimento e experiência entre seus desenvolvedores. É sendo um líder que você aumenta o seu valor.</p>
<h2 id="heading-compartilhe-suas-experiencias">Compartilhe suas experiências</h2>
<p>Importante neste processo é o compartilhamento de experiências. Por mais que você esteja começando agora, ou já seja um desenvolvedor experiente, um líder e já realmente considerado um “bom desenvolvedor” esteja sempre disposto a compartilhar e principalmente a ouvir outras experiências.</p>
<p>E é até mesmo com este intuito que a devGo foi criada. Estamos em nosso canal no Discord, abertos para novos temas e novas discussões, sempre pensando em nossa evolução pessoal.</p>
<p>Você já participa de nosso canal do Discord? Apareça por lá e nos conte mais sobre sua trajetória.</p>
]]></content:encoded></item><item><title><![CDATA[Você já usa o ChatGPT para te ajudar a desenvolver?]]></title><description><![CDATA[Calma, o ChatGPT não vai roubar o seu emprego, muito pelo contrário, vai é te ajudar! No texto de hoje, vou te mostrar como usar o ChatGPT para te ajudar a desenvolver.
ChatGPT é uma inteligência artificial criada pela OpenAI que está bem famosa por ...]]></description><link>https://devgo.com.br/voce-ja-usa-o-chatgpt-para-te-ajudar-a-desenvolver</link><guid isPermaLink="true">https://devgo.com.br/voce-ja-usa-o-chatgpt-para-te-ajudar-a-desenvolver</guid><category><![CDATA[chatgpt]]></category><category><![CDATA[Artificial Intelligence]]></category><category><![CDATA[Developer]]></category><dc:creator><![CDATA[Paulo Vitor Cruz]]></dc:creator><pubDate>Mon, 20 Mar 2023 14:51:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1679323491578/83607a41-8c84-4096-8138-c1cda8ff0397.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Calma, o ChatGPT não vai roubar o seu emprego, muito pelo contrário, vai é te ajudar! No texto de hoje, vou te mostrar como usar o ChatGPT para te ajudar a desenvolver.</p>
<p><a target="_blank" href="https://openai.com/blog/chatgpt">ChatGPT</a> é uma inteligência artificial criada pela OpenAI que está bem famosa por responder tão bem as perguntas de forma objetiva e direta. Muitos já dizem que é uma nova geração para ferramentas de pesquisa e que pode substituir até mesmo o Google.</p>
<p>Nós sabemos bem: que programador vive sem o Google? E não tem problema nenhum com isso. As vezes precisamos mesmo procurar uma resposta, descobrir como funciona uma biblioteca, procurar o que é aquele maldito bug que você não consegue resolver.</p>
<p>Com uma evolução pra o ChatGPT tudo fica mais fácil. Podemos ter a resposta diretamente em código, com uma solução pronta para nossos problemas.</p>
<h2 id="heading-peca-para-te-introduzir-a-um-tema">Peça para te introduzir a um tema</h2>
<p>Que tal ter um resumo, bastante completo até, do que é o novo tema que você está estudando? O ChatGPT é ótimo para te introduzir a um assunto, trazendo o funcionamento de forma bem detalhada. Olha só o retorno quando pergunto sobre Test Driven Design:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1679323295780/d48108ce-0a86-4d29-960b-9d74b3ba8f1e.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-peca-guias-de-estudo">Peça guias de estudo</h2>
<p>Além de um resumo sobre o tema, o ChatGPT pode te dar um guia bem completo para você estudar o assunto, com recomendações de onde você pode estudar:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1679323342055/df9bace7-1819-4d9c-a313-3bef4f90dad8.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-peca-solucao-para-um-erro-de-codigo">Peça solução para um erro de código</h2>
<p>Quem nunca passou horas e horas procurando a solução de erro? Pois o ChatGPT consegue te dar uma explicação exata do motivo desse erro, e como você pode resolver</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1679323382706/8824f8a7-0552-4212-b91d-ba82f3e94231.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-peca-ajuda-para-desenvolver-uma-pequena-funcao">Peça ajuda para desenvolver uma pequena função</h2>
<p>Faz parte, as vezes precisamos de alguma ajudinha para desenvolver uma pequena função, e o ChatGPT consegue te entregar isso</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1679323391412/bb7977c0-603c-4031-aff0-b9623d6f75cb.png" alt class="image--center mx-auto" /></p>
<p>Bem interessante não? E você, já usa alguma ferramenta com inteligência artificial para te ajudar no código? Conta pra gente em nosso canal do Discord!</p>
]]></content:encoded></item><item><title><![CDATA[Junior, Pleno e Sênior]]></title><description><![CDATA[Vamos começar a discutir por aqui: o que é um desenvolvedor júnior, um pleno e um sênior?
Nossa profissão como desenvolvedor naturalmente traz algumas particularidades em comparação com outras atividades: é “rápido” se tornar um desenvolvedor. Muitos...]]></description><link>https://devgo.com.br/junior-pleno-e-senior</link><guid isPermaLink="true">https://devgo.com.br/junior-pleno-e-senior</guid><category><![CDATA[Junior developer ]]></category><category><![CDATA[senior-software-engineer]]></category><category><![CDATA[Developer]]></category><dc:creator><![CDATA[Paulo Vitor Cruz]]></dc:creator><pubDate>Mon, 06 Mar 2023 13:00:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1678103546812/e4cd6c17-9347-4ca8-ae36-4780361b3d72.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Vamos começar a discutir por aqui: o que é um desenvolvedor júnior, um pleno e um sênior?</p>
<p>Nossa profissão como desenvolvedor naturalmente traz algumas particularidades em comparação com outras atividades: é “rápido” se tornar um desenvolvedor. Muitos já dizem que não precisa de graduação para atuar com desenvolvimento e vemos muitos cursos e bootcamps que prometem te preparar para toda jornada de desenvolvimento com pouquíssimo tempo de estudo. Enquanto isso, temos desenvolvedores de longa data que precisam se readaptar completamente a uma tecnologia que acabou de surgir no mercado. No meio dessa confusão, como definir o que é um desenvolvedor júnior, um pleno e um sênior?</p>
<h2 id="heading-junior-pleno-e-senior">Júnior, Pleno e Sênior</h2>
<p>Primeiramente vamos entender, em um conceito geral, o que é um júnior, um pleno e um sênior.</p>
<p>O senso comum diz que essa definição vêm conforme o tempo em que você está no mercado de trabalho: júnior até 5 anos no mercado, pleno até 10 anos, e sênior de 10 em diante. Outra forma de definir o que é júnior, pleno e sênior é comparando a produtividade: o júnior é alguém iniciante, que está começando agora com desenvolvimento e ainda precisa de bastante ajuda; o pleno é alguém que consegue entregar demandas de forma independente, e dá conta de resolver sozinho; o sênior é aquele que não só consegue resolver as demandas, mas sabe o que está fazendo e consegue repassar este conhecimento ao júnior e ao pleno.</p>
<p>Na prática, essas duas definições podem se contradizer bastante. Vemos desenvolvedores sêniores com 3-4 anos de experiência e, enquanto vemos desenvolvedores com anos no mercado de trabalho para que não conseguem entregar uma simples demanda porque está trabalhando com uma nova tecnologia.</p>
<p>Temos que considerar que ser desenvolvedor difere de qualquer outra profissão. Temos uma profissão que é relativamente fácil entrar no mercado, quando comparada as outras; ao mesmo tempo, tudo está mudando a todo tempo, daqui a 5 anos a tecnologia que você trabalha não ser mais relevante para o mercado. Pode ser bem capaz alguém com pouquíssimo tempo de experiência conhecer bem mais de uma tecnologia do que alguém com anos de experiência. E pensando assim, é realmente difícil definir o que é ser um Júnior, um pleno ou um sênior.</p>
<h2 id="heading-a-experiencia-e-sim-importante">A experiência é, sim, importante</h2>
<p>Mas calma, é claro que a experiência é importante. Alguém com 10 anos no mercado indiscutivelmente vai ter mais conhecimento do que alguém com 2 anos de trabalho como desenvolvedor.</p>
<p>As situações, os diferentes problemas encarados durante os anos que se passam trabalhando como desenvolvedor sempre terão muito valor, independente da tecnologia.</p>
<p>Como já disse em alguns outros textos aqui na devGo, desenvolver e programar é muito mais do que código. Trata-se de conceitos, de lógica e de entendimento do que há por trás do código. Uma nova linguagem de programação ou um novo framework jamais irá te tirar do mercado, e seus conhecimentos e experiência sempre serão úteis.</p>
<h2 id="heading-por-que-se-limitar-a-um-nivel">Por que se limitar a um nível?</h2>
<p>Precisamos entender que é, sim, possível que alguém com anos de experiência, que conheça todos os conceitos e tenha toda a lógica trabalhada por anos simplesmente não se adapte a nova tecnologia ou novo método de trabalho. Alguém, iniciante e bastante dedicado, poderia muito bem superar as habilidades e conseguir entregar tão bem quanto um desenvolvedor de anos atrás.</p>
<p>Ao contratar alguém, por exemplo, o meu grande ponto de importância é o comprometimento e autoconfiança. É claro que vou analisar o código, buscar qualidades diferentes a depender do nível proposto na vaga, mas ao ser uma pessoa comprometida e esforçada poderia muito bem abandonar estes conceitos pré-definidos de Júnior, pleno e sênior.</p>
<p>A grande questão, por aqui, é porque limitar pessoas a uma “etiqueta”. Não que devemos desconsiderar conhecimento, estudo e experiência, mas sim estarmos abertos a novas possibilidades, afinal podemos sempre ser surpreendidos.</p>
<p>E você, como você vê os juniores, os plenos e os sêniores em desenvolvimento? Participe do nosso canal do Discord e conte para gente!</p>
]]></content:encoded></item><item><title><![CDATA[Eu deveria usar uma Web View no meu app?]]></title><description><![CDATA[Essa é uma pergunta que sempre surge quando você já tem uma aplicação web, e pretende construir um app. Eu deveria usar uma Web View? No texto de hoje, vamos discutir essa solução.
O que é uma Web View?
Um Web View é como se você abrisse um navegador...]]></description><link>https://devgo.com.br/eu-deveria-usar-uma-web-view-no-meu-app</link><guid isPermaLink="true">https://devgo.com.br/eu-deveria-usar-uma-web-view-no-meu-app</guid><category><![CDATA[webview]]></category><category><![CDATA[app development]]></category><dc:creator><![CDATA[Paulo Vitor Cruz]]></dc:creator><pubDate>Fri, 03 Feb 2023 14:38:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1675435032473/36f426f6-145d-4e60-b9e4-e2e8576f1664.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Essa é uma pergunta que sempre surge quando você já tem uma aplicação web, e pretende construir um app. Eu deveria usar uma Web View? No texto de hoje, vamos discutir essa solução.</p>
<h2 id="heading-o-que-e-uma-web-view">O que é uma Web View?</h2>
<p>Um Web View é como se você abrisse um navegador dentro do seu aplicativo, e utilizasse a página por ali mesmo. Parece muito com um <code>&lt;iframe&gt;</code>, que temos no HTML, mas para aplicações nativas de um celular.</p>
<p>O usuário se mantém no aplicativo, mas, na verdade, acessa uma aplicação web, completamente independente desta aplicação móbile.</p>
<h2 id="heading-quais-sao-minhas-opcoes-de-desenvolvimento">Quais são minhas opções de desenvolvimento?</h2>
<p>Não sendo um Web View podemos usar a opção mais padrão e natural de construir um novo aplicativo.</p>
<p>A partir daí temos várias opções: <a target="_blank" href="https://devgo.com.br/porque-voce-deve-estudar-flutter">Flutter</a>, Swift, Kotlin, React Native e tantas outras, que devem ser analisadas individualmente da forma que melhor te agrade, ou seja, boa para o seu negócio, tal qual uma escolha de linguagem de programação ou framework a ser utilizado no projeto.</p>
<h2 id="heading-vale-a-pena">Vale a pena?</h2>
<p>“Tenho minha página web, responsiva, e funciona muito bem no celular. Porque então desenvolver um aplicativo e manter esse aplicativo, para fazer a mesma coisa?”.</p>
<p>Este é um argumento que de início faz bastante sentido. Você realmente pode economizar tempo de desenvolvimento e recursos de uma equipe para desenvolver um aplicativo. A manutenção do aplicativo é mais fácil, visto que é preciso trabalhar somente na versão web.</p>
<p>Mas existe um motivo pelo qual grandes empresas não usam Web View em seus aplicativos:</p>
<h3 id="heading-as-lojas-google-play-e-appstore-nao-recomendam">As lojas Google Play e AppStore não recomendam</h3>
<p>As duas maiores lojas de aplicativo, para Android e iOS, respectivamente, não recomendam aplicativos feitos somente com WebView.</p>
<p>Por não poderem garantir a segurança de aplicativos feitos a partir de Web View a seus usuários, as lojas tendem a até mesmo não aceitar a publicação dos aplicativos, e deixam isso bastante em claro nas documentações:</p>
<p><a target="_blank" href="https://support.google.com/googleplay/android-developer/answer/10446026?hl=en">O Google Play diz</a>:</p>
<blockquote>
<p>“Your app must not merely provide a webview of a website or have a primary purpose of driving affiliate traffic to a website, regardless of ownership of the website.”</p>
</blockquote>
<p><a target="_blank" href="https://developer.apple.com/app-store/review/guidelines/#minimum-functionality">A Apple Store também</a>:</p>
<blockquote>
<p>“Your app should include features, content, and UI that elevate it beyond a repackaged website. If your app is not particularly useful, unique, or “app-like,” it doesn’t belong on the App Store”</p>
</blockquote>
<p>Construir então um aplicativo com base em uma Web View pode ser bastante perigoso, afinal, ninguém quer correr o risco de seu aplicativo sair da loja de uma hora para outra.</p>
<h3 id="heading-bugs-acontecem">Bugs acontecem</h3>
<p>Um Web View não é o mesmo que o navegador do seu celular.</p>
<p>Lembram do finado Internet Explorer? Programávamos o site, estava tudo certo, funcionando 100%, mas era abrir a página no Explorer e estava toda quebrada. Acontece bem parecido em um Web View.</p>
<p>Por mais que seja mais rápido simplesmente trazer sua página para dentro do app em um web view, bugs inesperados podem acontecer, e quebras imprevisiveis na sua página podem estar presentes. Tratar esses bugs podem ser uma experiência bastante descontrolada, pois perdemos referência do que acontece na página justamente por se tratar de um Web View.</p>
<h3 id="heading-experiencia-do-usuario">Experiência do usuário</h3>
<p>Um Web View ainda não é um aplicativo.</p>
<p>Desenvolver para web e desenvolver para aplicativo são coisas bem diferentes, justamente por se tratarem de ambientes completamente diferentes. Deve ser visto que um Web View é apenas uma “simulação” de uma página na web. Da mesma forma que bugs podem acontecer, a experiência do usuário também não é a mesma.</p>
<p>Quando se constrói um aplicativo, as próprias ferramentas e frameworks utilizados são optimizados para funcionamento dentro de um ambiente mobile. É muito mais fluído, a perfomance é muito melhor, e trazem ao usuário a mesma experiência que ele tem ao utilizar seu dispositivo naturalmente.</p>
<p>Este é até o grande diferencial de um aplicativo: a experiência do usuário. Por mais que pareçam pequenos detalhes, na prática, isso é uma grande diferença para o usuário. Uma boa experiência do usuário: trás mais confiança no seu produto, mantém o usuário por mais tempo na aplicação, e consequentemente gera uma conversão melhor.</p>
<h2 id="heading-entao-quando-usar-uma-web-view">Então, quando usar uma Web View?</h2>
<p>Geralmente utilizamos Web View em conteúdos “estáticos” que trazem informação importante ao usuário e deve ser mantida sempre atualizada, como, por exemplo, uma página de política de privacidade. Este, sim, é um exemplo seguro de uso para uma Web View.</p>
<p>Mas, é claro que construir um app é custoso. Se trata mesmo de uma aplicação completamente nova, portanto, assim como tudo em desenvolvimento de software, deve-se sempre pensar no custo benefício. Seu projeto está disposto a aceitar os riscos? O quão importante é atrair o cliente para o seu produto? São essas as reais perguntas que devem ser feitas durante a escolha de desenvolvimento com Web View ou um App Nativo.</p>
<p>Quer discutir um pouco mais esse caso com a gente? Participe do nosso canal do Discord e acompanhe nossos conteúdos!</p>
]]></content:encoded></item><item><title><![CDATA[Introdução à validação de schema JSON utilizando o Postman]]></title><description><![CDATA[Este artigo tem por objetivo orientar sobre o processo de validação das respostas de uma API utilizando o Postman. Através de tal processo é possível comparar, de forma automatizada, as respostas recebidas com as regras de um schema previamente defin...]]></description><link>https://devgo.com.br/introducao-a-validacao-de-schema-json-utilizando-o-postman</link><guid isPermaLink="true">https://devgo.com.br/introducao-a-validacao-de-schema-json-utilizando-o-postman</guid><category><![CDATA[Postman]]></category><category><![CDATA[json-schema]]></category><category><![CDATA[Testing]]></category><dc:creator><![CDATA[Alexandre Guimarães Braga]]></dc:creator><pubDate>Fri, 20 Jan 2023 15:10:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1674227255281/b7482802-48dd-4ec3-a4dd-9c39ce63cb76.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Este artigo tem por objetivo orientar sobre o processo de validação das respostas de uma API utilizando o Postman. Através de tal processo é possível comparar, de forma automatizada, as respostas recebidas com as regras de um <em>schema</em> previamente definido, validando a estrutura do JSON, bem como a tipagem, dentre outras especificações. Isso garante que o retorno esteja totalmente de acordo com o que se espera, padronizando os dados e minimizando a chance de erros ao fazer a integração com o front-end ou em outras utilizações da API.</p>
<h3 id="heading-consideracoes-iniciais">Considerações iniciais</h3>
<ul>
<li><p>Os passos necessários para a execução dos testes de validação, bem como a preparação do ambiente para tal, serão descritos da maneira mais clara possível para que mesmo um iniciante consiga acompanhar e reproduzir os resultados sem dificuldades, mas é esperado o mínimo de familiaridade com o Postman, pois este texto foi escrito partindo da suposição de que algumas funcionalidades básicas e uma visão geral do software já são conhecidos.</p>
</li>
<li><p>O Postman possui duas bibliotecas integradas para a realização das validações: <a target="_blank" href="https://github.com/geraintluff/tv4">tv4</a> (<em>Tiny Validator for v4 JSON Schema</em>) e <a target="_blank" href="https://github.com/ajv-validator/ajv">Ajv</a> (<em>Another JSON Schema Validator</em>). Apesar de a documentação oficial do Postman utilizar a tv4 nos exemplos, esta não é mais mantida desde 2017, e seu uso, portanto, não é recomendado.</p>
</li>
<li><p>É importante se orientar de modo a sempre buscar <strong>testar para as falhas</strong> primeiro para ter certeza de que a validação funciona da maneira correta (para cada cenário a ser testado, garante-se que o teste irá falhar propositalmente em um primeiro momento para, então, seguir com a validação). Isso garante a <em>confiabilidade</em> do teste, afinal, se este não falha em nenhum cenário, como se pode ter certeza se o que passa é realmente válido?</p>
</li>
<li><p>Pratique um pouco com schemas gerados manualmente, pelo menos no começo. Deixe para utilizar geradores automáticos, como o <a target="_blank" href="https://jsonschema.net">https://jsonschema.net</a>, quando já possuir um melhor entendimento da estrutura típica de um schema e suas regras, e precisar lidar com schemas longos e complexos. Dessa forma, o arquivo gerado não vai lhe parecer confuso e você será capaz de fazer intervenções quando necessário, garantindo a qualidade dos testes, pois saberá exatamente o que cada coisa faz.</p>
</li>
</ul>
<h3 id="heading-preparacao-do-ambiente">Preparação do ambiente</h3>
<p>Antes de mais nada, vamos criar uma <em>coleção</em>, definir as <em>variáveis de ambiente</em>, gerar um <em>exemplo</em> e criar um <em>mock</em> de servidor para realizar os testes iniciais.</p>
<p><strong>Coleção (collection)</strong></p>
<p><em>Coleções</em> são “pastas” que possibilitam o armazenamento de requisições, facilitando a organização dos endpoints para agilizar utilizações futuras. No menu lateral do Postman clique em <em>Collections</em> e, em seguida, no botão “+” para adicionar uma nova coleção:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1674226428587/28055019-e4cd-4196-837f-0cc9f197c0f9.png" alt class="image--center mx-auto" /></p>
<p>Defina um nome, clique sobre a coleção com o botão direito (ou no menu de 3 pontos), e adicione uma nova requisição do tipo GET em <strong><em>Add request</em></strong>. O endpoint que será será utilizado é:</p>
<p><a target="_blank" href="https://postman-echo.com/get?foo1=bar1&amp;foo2=bar2"><code>https://postman-echo.com/get?foo1=bar1&amp;foo2=bar2</code></a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1674226457114/4f925c27-8a12-42ae-b824-cc085744c956.png" alt class="image--center mx-auto" /></p>
<p><strong>Variáveis de ambiente (environment variables)</strong></p>
<p>As variáveis de ambiente, apesar de não serem estritamente necessárias, ajudam no controle dos endpoints a serem testados e agilizam requisições futuras por meio da reutilização de valores. Após configurado, a URL acima pode ser substituída por <code>{{url_API}}</code>, por exemplo. Se a coleção já possuir variáveis definidas, pule esta etapa e prossiga com a criação de <em>exemplos</em>.</p>
<p>Para não estender demais o texto e desviar da sua finalidade principal, acesse mais informações sobre a criação e utilização de variáveis dentro do Postman <a target="_blank" href="https://learning.postman.com/docs/sending-requests/variables/">clicando aqui</a>.</p>
<p><strong>Criando <em>exemplos</em></strong></p>
<p>No contexto do Postman, <em>exemplos</em> são cenários pré-definidos de requisições e respostas que podem ser editados e utilizados nas simulações de servidor, como veremos mais adiante. A maneira mais fácil de se criar um <em>exemplo</em> é a partir de uma requisição para a API que será testada.</p>
<p>Vamos criar um <em>exemplo</em> para uma requisição do tipo GET. Para isso, basta abrir a coleção, escolher a requisição desejada (no caso, a que foi criada anteriormente) e clicar em <strong><em>Send</em></strong>. Feito isso, clique em <strong><em>Save Response</em></strong> e, em seguida, <strong><em>Save as example</em></strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1674226486680/4b606e31-b232-45b2-bf5c-4ecee07b9075.png" alt class="image--center mx-auto" /></p>
<p>Automaticamente será aberta uma nova aba com o <em>exemplo</em> recém criado. Note que a tela é bem parecida com a de uma requisição comum, e que as informações apresentadas inicialmente são idênticas àquelas da requisição feita anteriormente:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1674226499638/9a252d98-b7ab-4aeb-baaf-4c8b972adb29.png" alt class="image--center mx-auto" /></p>
<p>É possível editar parâmetros, headers e o body, assim como em uma requisição normal. Porém, diferentemente do que ocorre nesta, um <em>exemplo</em> permite que a resposta também seja editada, bem como o código de status da mesma. Com isso, é possível criar cenários controlados - perfeito para a execução de testes - a partir do uso de <em>mocks</em>. Para mais detalhes sobre os <em>exemplos</em>, outras formas de criação e utilizações, <a target="_blank" href="https://learning.postman.com/docs/sending-requests/examples/">clique aqui</a>.</p>
<p><strong>Mock de servidor</strong></p>
<p>A ideia por trás do mock é criar um endpoint para um servidor falso que irá simular o comportamento de uma API real, enviando retornos para as requisições feitas, e é aqui que entram os <em>exemplos</em> citados anteriormente: com base no tipo de requisição feita para o mock, o Postman encontrará um <em>exemplo</em> correspondente e responderá com os dados contidos neste. Desta forma, será possível, quando necessário, modificar tais respostas para forçar situações de erros propositais, por exemplo, garantindo que o teste falhe nos cenários em que espera-se que isso ocorra e seu teste seja confiável. Portanto, para que o mock funcione adequadamente, é necessário que <strong>ao menos</strong> um <em>exemplo</em> do mesmo tipo da requisição que se deseja fazer tenha sido criado na coleção.</p>
<p>Para criar o mock, selecione <strong><em>Collections</em></strong>, clique no menu de 3 pontos da coleção que deseja simular e, em seguida, selecione <strong><em>Mock collection</em></strong>. É preciso estar logado em uma conta do Postman para criar mocks.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1674226513541/bf0e75d7-60fd-4f18-95b2-6b4cd1a3dc67.png" alt class="image--center mx-auto" /></p>
<p>Na tela seguinte, escolha um nome para o mock e confira se a coleção a ser simulada está correta (caso exista mais de uma no seu workspace). Você pode selecionar um ambiente para que o mock use as variáveis ali definidas, onde, posteriormente, poderá incluir a URL do mock. Também é possível optar por salvar automaticamente a URL em uma variável, que será criada em um novo ambiente. Aqui seguirei com a segunda opção, mas sinta-se livre para fazer o que achar melhor. Por fim, clique em <strong><em>Create Mock Server</em>.</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1674226530357/bf39b39c-641b-4df9-9bc5-bcc1d58961ac.png" alt class="image--center mx-auto" /></p>
<p>Tendo criado o mock, já é possível testá-lo. Abra uma nova aba no Postman. No canto superior direito, selecione o ambiente nomeado tal qual o mock criado e monte a URL para a requisição, substituindo a <strong>primeira parte</strong> da URL original do endpoint, da seguinte forma:</p>
<p><code>{{url}}/get?foo1=bar1&amp;foo2=bar2</code></p>
<p>Onde <code>{{url}}</code> é a variável de ambiente correspondente à URL do mock, gerada automaticamente na etapa de criação deste, e <code>/get?foo1=bar1&amp;foo2=bar2</code> é o caminho do endpoint original e seus parâmetros. Caso não queira fazer uso da variável de ambiente, ao invés de <code>{{url}}</code> basta inserir a URL do mock diretamente.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1674226555171/d4131500-ec75-4fd6-83ca-72650d871fd0.png" alt class="image--center mx-auto" /></p>
<p>Ao enviar a requisição, se tudo tiver sido feito corretamente, será apresentado um retorno. Pode-se notar que a resposta recebida é idêntica àquela enviada pelo endpoint original da API, mas isso é porque este retorno é exatamente aquele criado junto ao <em>exemplo</em>, que ainda não foi alterado. Ou seja, quaisquer modificações feitas (e salvas) lá irão se refletir no mock.</p>
<h3 id="heading-validacao-do-schema">Validação do schema</h3>
<p>A primeira coisa a ser feita na validação de um schema JSON é estabelecer a estrutura que o compõe. O ideal aqui é ter acesso à documentação provida, por exemplo, através do Swagger, e copiar o schema disponibilizado. Mas, para fins didáticos, aqui será utilizada como base a própria resposta enviada pela API, de onde ele será extraído manualmente.</p>
<pre><code class="lang-json">{
    <span class="hljs-attr">"args"</span>: {
        <span class="hljs-attr">"foo1"</span>: <span class="hljs-string">"bar1"</span>,
        <span class="hljs-attr">"foo2"</span>: <span class="hljs-string">"bar2"</span>
    },
    <span class="hljs-attr">"headers"</span>: {
        <span class="hljs-attr">"x-forwarded-proto"</span>: <span class="hljs-string">"https"</span>,
        <span class="hljs-attr">"x-forwarded-port"</span>: <span class="hljs-string">"443"</span>,
        <span class="hljs-attr">"host"</span>: <span class="hljs-string">"postman-echo.com"</span>,
        <span class="hljs-attr">"x-amzn-trace-id"</span>: <span class="hljs-string">"Root=1-63addcc9-5ab135d701ba98d92efac901"</span>,
        <span class="hljs-attr">"user-agent"</span>: <span class="hljs-string">"PostmanRuntime/7.30.0"</span>,
        <span class="hljs-attr">"accept"</span>: <span class="hljs-string">"*/*"</span>,
        <span class="hljs-attr">"postman-token"</span>: <span class="hljs-string">"8bff98e4-237c-4940-bef8-067b3998dd58"</span>,
        <span class="hljs-attr">"accept-encoding"</span>: <span class="hljs-string">"gzip, deflate, br"</span>,
        <span class="hljs-attr">"cookie"</span>: <span class="hljs-string">"sails.sid=s%3AmyxFsngmsAqbFM1FofXwBn3M-TlpbIOf.NjXpy0b07Qp08dIDDeOAy9iK7oh5w6Y%2FhyBpbzM9Z1c"</span>
    },
    <span class="hljs-attr">"url"</span>: <span class="hljs-string">"&lt;https://postman-echo.com/get?foo1=bar1&amp;foo2=bar2&gt;"</span>
}
</code></pre>
<p>Logo de cara é possível perceber que a resposta é composta de um objeto contendo 3 propriedades, sendo duas delas também do tipo objeto e uma do tipo <em>string</em>. Traduzindo para uma estrutura esquemática, inicialmente temos o seguinte:</p>
<pre><code class="lang-jsx"><span class="hljs-keyword">const</span> schema = {
    <span class="hljs-string">"type"</span>: <span class="hljs-string">"object"</span>,
    <span class="hljs-string">"properties"</span>: {
        <span class="hljs-string">"args"</span>: {
            <span class="hljs-string">"type"</span>: <span class="hljs-string">"object"</span>
        },
        <span class="hljs-string">"headers"</span>: {
            <span class="hljs-string">"type"</span>: <span class="hljs-string">"object"</span>
        },
        <span class="hljs-string">"url"</span>: {
            <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>
        }
    }
}
</code></pre>
<p>No primeiro nível, a raiz, temos a definição da tipagem geral do schema: <code>"type": "object"</code>. Em seguida, <code>properties</code> enumera as propriedades contidas no objeto principal e, para cada uma, é declarada sua tipagem, assim como foi feito no nível anterior. Essa é a base inicial do schema, ainda bem simples, mas já é possível realizar os primeiros testes.</p>
<p>Dentro da aba do mock, localize a aba <strong><em>Tests</em></strong>, abaixo da barra de endereços, e declare a variável <code>schema</code>, como feito no exemplo acima. Em seguida, declare a função de teste:</p>
<pre><code class="lang-jsx">pm.test(<span class="hljs-string">"Validate schema"</span>, <span class="hljs-function">() =&gt;</span> {
    pm.response.to.have.jsonSchema(schema);
});
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1674226572648/d5cfb7e3-a1b5-4e55-8e65-b09999bd7b9a.png" alt class="image--center mx-auto" /></p>
<p>Aqui vale abrir um pequeno parêntese para destrinchar a função e entender o que está sendo feito.</p>
<p>De acordo com a documentação do Postman:</p>
<blockquote>
<p>O objeto <code>pm</code> contém todas as informações pertencentes ao script que está sendo executado e permite o acesso a uma cópia da requisição que está sendo enviada ou da resposta recebida. Também permite obter e definir variáveis de ambiente e globais.</p>
</blockquote>
<p>Portanto, o objeto <code>pm</code> é fundamental na construção de testes, sejam de que tipo for. Dentre as propriedades e métodos associados a este objeto, o primeiro a ser utilizado aqui é o método <code>test</code>, que recebe dois argumentos. O primeiro é uma string, que será usada para identificar o teste em questão. É recomendável escolher um nome claro e autoexplicativo, que facilite o entendimento do que se propõe tal teste (neste exemplo foi usado o nome “Validate schema”). O segundo argumento é uma função onde o teste em si será especificado. No caso do nosso exemplo, uma função anônima contendo a seguinte linha: <a target="_blank" href="http://pm.response.to"><code>pm.response.to</code></a><code>.have.jsonSchema(schema)</code>, onde <code>pm.response</code> acessa a resposta recebida do servidor e, em seguida, é feita a asserção <code>to.have.jsonSchema(schema)</code> para garantir que a resposta satisfaça o schema definido anteriormente. Até o momento o schema ainda é bem simples, mas qualquer resposta recebida com tipagem diferente <strong>para as propriedades listadas</strong> não deverá passar no teste.</p>
<p>Se for enviada uma requisição agora o teste irá passar, mas para ter certeza que funciona corretamente devemos modificar a especificação do schema ou a resposta para forçar uma situação de erro. A fim de evitar confusões mais adiante e você não acabe com um schema - e, consequentemente, um teste - incorreto, o ideal é fazer alterações apenas na resposta, pois é justamente pra isso que criamos o <em>exemplo</em>. Volte na aba do <em>exemplo</em> e altere o tipo de alguma das propriedades. No caso, irei alterar a propriedade <code>url</code> de string para um valor numérico qualquer:</p>
<pre><code class="lang-jsx">{
    <span class="hljs-string">"args"</span>: {
        <span class="hljs-string">"foo1"</span>: <span class="hljs-string">"bar1"</span>,
        <span class="hljs-string">"foo2"</span>: <span class="hljs-string">"bar2"</span>
    },
    <span class="hljs-string">"headers"</span>: {
        <span class="hljs-string">"x-forwarded-proto"</span>: <span class="hljs-string">"https"</span>,
        <span class="hljs-string">"x-forwarded-port"</span>: <span class="hljs-string">"443"</span>,
        <span class="hljs-string">"host"</span>: <span class="hljs-string">"postman-echo.com"</span>,
        <span class="hljs-string">"x-amzn-trace-id"</span>: <span class="hljs-string">"Root=1-63addcc9-5ab135d701ba98d92efac901"</span>,
        <span class="hljs-string">"user-agent"</span>: <span class="hljs-string">"PostmanRuntime/7.30.0"</span>,
        <span class="hljs-string">"accept"</span>: <span class="hljs-string">"*/*"</span>,
        <span class="hljs-string">"postman-token"</span>: <span class="hljs-string">"8bff98e4-237c-4940-bef8-067b3998dd58"</span>,
        <span class="hljs-string">"accept-encoding"</span>: <span class="hljs-string">"gzip, deflate, br"</span>,
        <span class="hljs-string">"cookie"</span>: <span class="hljs-string">"sails.sid=s%3AmyxFsngmsAqbFM1FofXwBn3M-TlpbIOf.NjXpy0b07Qp08dIDDeOAy9iK7oh5w6Y%2FhyBpbzM9Z1c"</span>
    },
    <span class="hljs-string">"url"</span>: <span class="hljs-number">123</span>
}
</code></pre>
<p>Salve a alteração, volte na aba do mock e envie novamente a requisição. Se tudo tiver sido feito corretamente, o teste deverá <strong>falhar:</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1674226599257/506a838b-568e-4e0a-b7bd-32ade65b9d58.png" alt class="image--center mx-auto" /></p>
<p>Note que a mensagem de erro nos dá uma pista do que houve: era esperado que <code>data.url</code> fosse do tipo string, conforme definimos no schema. Ótimo! Sinal de que o teste funciona corretamente - por enquanto. Contudo, sua eficiência ainda está limitada pelo nível de especificidade definido no schema. Perceba que se formos até o <em>exemplo</em> e alterarmos o nome de alguma dessas propriedades, adicionarmos propriedades não especificadas, excluirmos da resposta alguma das existentes ou alterarmos o tipo de uma das propriedades aninhadas, o teste passará da mesma forma, pois a especificação, até o momento, é:</p>
<blockquote>
<p>A resposta deve vir como um objeto, e sempre que as propriedades <code>args</code>, <code>headers</code> e <code>url</code> estiverem presentes, seus tipos devem ser <code>object</code>, <code>object</code> e <code>string</code>, respectivamente.</p>
</blockquote>
<p>Qualquer cenário diferente desse <em>ainda</em> não é coberto pelo teste, permitindo a validação equivocada de vários erros em potencial, então é hora de aumentar o grau de especificidade para termos um teste mais rigoroso. Vale atentar também para erros de digitação ao definir o schema, pois se <code>args</code> for escrito como <code>arg</code>, por exemplo, o Ajv (a biblioteca de testes que usamos) irá entender que se trata de uma outra propriedade (e não há nada ainda que impeça a presença de propriedades não especificadas), ignorando possíveis problemas em <code>args</code>.</p>
<p>Voltando ao schema, a primeira alteração que já pode ser feita é “descrever” melhor as propriedades <code>args</code> e <code>headers</code>, definindo <code>"type"</code> e <code>"properties"</code> como fizemos anteriormente, garantindo que a tipagem de <em>todas</em> propriedades não sejam violadas:</p>
<pre><code class="lang-jsx"><span class="hljs-keyword">const</span> schema = {
    <span class="hljs-string">"type"</span>: <span class="hljs-string">"object"</span>,
    <span class="hljs-string">"properties"</span>: {
        <span class="hljs-string">"args"</span>: {
            <span class="hljs-string">"type"</span>: <span class="hljs-string">"object"</span>,
            <span class="hljs-string">"properties"</span>: {
                <span class="hljs-string">"foo1"</span>: {
                    <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>
                },
                <span class="hljs-string">"foo2"</span>: {
                    <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>
                }
            }
        },
        <span class="hljs-string">"headers"</span>: {
            <span class="hljs-string">"type"</span>: <span class="hljs-string">"object"</span>,
            <span class="hljs-string">"properties"</span>: {
                <span class="hljs-string">"x-forwarded-proto"</span>: {
                    <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>
                },
                <span class="hljs-string">"x-forwarded-port"</span>: {
                    <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>
                },
                <span class="hljs-string">"host"</span>: {
                    <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>
                },
                <span class="hljs-string">"x-amzn-trace-id"</span>: {
                    <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>
                },
                <span class="hljs-string">"user-agent"</span>: {
                    <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>
                },
                <span class="hljs-string">"accept"</span>: {
                    <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>
                },
                <span class="hljs-string">"postman-token"</span>: {
                    <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>
                },
                <span class="hljs-string">"accept-encoding"</span>: {
                    <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>
                },
                <span class="hljs-string">"cookie"</span>: {
                    <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>
                }
            }
        },
        <span class="hljs-string">"url"</span>: {
            <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>
        }
    }
}
</code></pre>
<p>Até agora apenas listamos as propriedades e suas tipagens, mas não especificamos se existem propriedades obrigatórias e quais seriam estas. Podemos fazer isso através de <code>required</code>, que se constitui como um array de strings. Para fins de demonstração, <code>required</code> será adicionado apenas para a raiz do schema, mas pode ser incluído para os objetos <code>args</code> e/ou <code>headers</code> também, claro. O importante é entender seu uso:</p>
<pre><code class="lang-jsx"><span class="hljs-keyword">const</span> schema = {
    <span class="hljs-string">"type"</span>: <span class="hljs-string">"object"</span>,
    <span class="hljs-string">"properties"</span>: {
                <span class="hljs-string">"args"</span>: {...},
        <span class="hljs-string">"headers"</span>: {...},
        <span class="hljs-string">"url"</span>: {
            <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>
        }
    },
    <span class="hljs-string">"required"</span>: [<span class="hljs-string">"args"</span>, <span class="hljs-string">"headers"</span>, <span class="hljs-string">"url"</span>]
}

<span class="hljs-comment">// Detalhes de "args" e "headers" omitidos apenas para abreviar o exemplo</span>
</code></pre>
<p>A partir de agora, a ausência de <code>args</code>, <code>headers</code> e/ou <code>url</code> na resposta deve resultar em erro. Como sempre, é importante testar para o erro antes de prosseguir, então irei remover <code>url</code> e reenviar a requisição:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1674226648094/910b1c89-3c69-4649-be07-07b2bd6a0db1.png" alt class="image--center mx-auto" /></p>
<p>Porém, a presença de propriedades <strong>adicionais</strong> ainda não é tratada corretamente, de modo que o schema, cumpridos os demais requisitos, continua sendo válido ainda que contenha outras propriedades além das 3 já conhecidas. Neste exemplo específico, não queremos isso. Para lidar com esse problema, utilizaremos <code>additionalProperties</code>:</p>
<pre><code class="lang-jsx"><span class="hljs-keyword">const</span> schema = {
    <span class="hljs-string">"type"</span>: <span class="hljs-string">"object"</span>,
    <span class="hljs-string">"properties"</span>: {
        <span class="hljs-string">"args"</span>: {...},
        <span class="hljs-string">"headers"</span>: {...},
        <span class="hljs-string">"url"</span>: {
            <span class="hljs-string">"type"</span>: <span class="hljs-string">"string"</span>
        }
    },
    <span class="hljs-string">"required"</span>: [<span class="hljs-string">"args"</span>, <span class="hljs-string">"headers"</span>, <span class="hljs-string">"url"</span>],
    <span class="hljs-string">"additionalProperties"</span>: <span class="hljs-literal">false</span>
}

<span class="hljs-comment">// Detalhes de "args" e "headers" omitidos apenas para abreviar o exemplo</span>
</code></pre>
<p>Ao enviar uma requisição contendo propriedades adicionais no retorno, a validação deverá falhar:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1674226685763/51fd6bac-ea15-447a-960b-03896b1a98a1.png" alt class="image--center mx-auto" /></p>
<p>Aqui cabe uma diferenciação importante entre <code>required</code> e <code>additionalProperties</code>: na primeira estão listadas as propriedades que devem, <strong>obrigatoriamente</strong>, existir na resposta do servidor, mas não diz nada sobre propriedades extras; já na segunda podemos ou não permitir que a resposta contenha propriedades das quais não temos conhecimento prévio. Sendo assim, um schema contendo as propriedades X, Y e Z que não as liste como obrigatórias, mas onde <code>additionalProperties</code> receba o valor <code>false</code>, não exigirá que X, Y ou Z estejam presentes na resposta, mas invalidará o teste se esta contiver a propriedade N (não prevista) ou no caso de uma das 3 anteriores estar com o nome incorreto (já que seria tratada como desconhecida pelo schema).</p>
<h3 id="heading-conclusao">Conclusão</h3>
<p>Com isso, nosso schema agora é capaz de definir as propriedades, suas tipagens, lista eventuais propriedades obrigatórias e permite ou não a presença de outras, estando pronto para ser usado na validação dos retornos da API verdadeira, bastando copiar o conteúdo da aba <strong><em>Tests</em></strong> do mock. São regras relativamente simples perto do grau de especificidade que é possível atingir, mas já é o suficiente para realizar testes que irão cobrir boa parte dos cenários menos exigentes, garantindo a qualidade dos dados transmitidos. Na maioria dos casos, quando se atua com outras equipes, o schema já estará definido na documentação, poupando parte do trabalho aqui descrito de identificar as regras manualmente. De toda forma, é sempre uma boa utilizar os mocks para executar alguns testes rápidos pra ter certeza de que está tudo ok com as definições. Recomendo uma lida nas regras específicas para propriedades do tipo <em>array</em>, visto que é um tipo bem comum e que não foi abordado neste texto. Para saber mais sobre as regras e o que pode ser definido além do que foi apresentado aqui, a documentação está sempre disponível: <a target="_blank" href="https://json-schema.org/">https://json-schema.org/</a>. Bons testes!</p>
<h3 id="heading-links-uteis">Links úteis</h3>
<ul>
<li><p>Documentação: <a target="_blank" href="https://json-schema.org/">https://json-schema.org/</a></p>
</li>
<li><p>Validadores, geradores, utilitários, etc: <a target="_blank" href="https://json-schema.org/implementations.html">https://json-schema.org/implementations.html</a></p>
</li>
<li><p>Ajv: <a target="_blank" href="https://github.com/ajv-validator/ajv">https://github.com/ajv-validator/ajv</a></p>
</li>
<li><p>JSON Schema (gerador online): <a target="_blank" href="https://www.jsonschema.net/">https://www.jsonschema.net/</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Uma API eficiente e simples]]></title><description><![CDATA[Já falamos sobre APIs por aqui, e temos até um artigo recomendando boas práticas de desenvolvimento de uma aplicação RESTful, mas uma dúvida sempre constante é como construir nossas aplicações. Qual arquitetura utilizo? Como posso montar a estrutura ...]]></description><link>https://devgo.com.br/uma-api-eficiente-e-simples</link><guid isPermaLink="true">https://devgo.com.br/uma-api-eficiente-e-simples</guid><category><![CDATA[APIs]]></category><category><![CDATA[Developer]]></category><category><![CDATA[nestjs]]></category><category><![CDATA[Laravel]]></category><dc:creator><![CDATA[Paulo Vitor Cruz]]></dc:creator><pubDate>Fri, 06 Jan 2023 13:55:04 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1673013278010/e0d633c8-5484-4fa0-9ba7-d120cb80442f.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Já falamos <a target="_blank" href="https://devgo.com.br/o-que-e-uma-api">sobre APIs</a> por aqui, e temos até um artigo recomendando <a target="_blank" href="https://devgo.com.br/boas-praticas-para-desenvolvimento-de-uma-api-rest">boas práticas de desenvolvimento de uma aplicação RESTful</a>, mas uma dúvida sempre constante é como construir nossas aplicações. Qual arquitetura utilizo? Como posso montar a estrutura do código? Como organizar meus arquivos? No texto de hoje, vou apresentar uma estrutura simples, porém bem eficiente para você construir a sua API.</p>
<p>Tento aqui construir uma aplicação sem muita complexidade ou impeditivos, realmente da forma mais simples. Temos algumas alternativas como o Clean Architecture, que vem se tornando bastante popular, mas a ideia é mesmo ser bastante direto, sem nos esquecer de conceitos importantes de desenvolvimento e <a target="_blank" href="https://devgo.com.br/codigo-limpo-e-boas-praticas-de-programacao">boas práticas de programação</a>.</p>
<h2 id="heading-o-que-nao-pode-faltar-em-uma-api">O que não pode faltar em uma API?</h2>
<p>Precisamos definir nossas rotas; para gerenciar essas rotas, precisaremos dos controllers; e por fim, para trazer funcionalidade a nossa aplicação, precisaremos dos services.</p>
<p>Este é um modelo bastante simples, padrão até mesmo do NestJS, Laravel e outros frameworks de API. É a partir deste modelo que vamos nos aprofundar um pouco, explorar recursos e tentar definir uma API simples e eficiente.</p>
<h2 id="heading-montando-a-estrutura">Montando a estrutura</h2>
<p>Veja bem que por aqui, definirei muito bem a responsabilidade de cada estrutura necessária para a API. É importante que siga muito bem a sua função, não fazendo nada mais, além disso. Gosto também de organizar os arquivos de acordo com essa estrutura, cada qual em sua pasta, cada arquivo de acordo com a sua funcionalidade —por ex: na pasta rotas, os arquivos <code>products.route.ts</code> e <code>payment.route.ts</code></p>
<h3 id="heading-rotas">Rotas</h3>
<p>Toda API começa pela definição de rotas: os caminhos, ou endpoints, que nossas aplicações clientes irão utilizar para solicitar e receber informações da nossa API.</p>
<p>As rotas devem ser sempre bem escritas, de forma clara e intuitiva a quem vá utilizar. É bastante importante seguir bem os padrões de servidores HTTP, que irão até te ajudar bastante na legibilidade de rotas.</p>
<p>As rotas devem ser responsáveis por definir os caminhos, e enviar aos controllers. Apenas isso.</p>
<p>Se você usa o NestJS será bem interessante, pois rotas e controllers trabalham juntos, <a target="_blank" href="https://devgo.com.br/voce-ja-usa-o-nestjs">como explicamos em nosso texto sobre o NestJS</a>.</p>
<h3 id="heading-controllers">Controllers</h3>
<p>Os controllers são responsáveis por gerenciar as respostas exibidas ao cliente em uma API. Cliente solicitou a informação de um produto? Exibir o produto. O produto não existe? Retornar um erro 404, com uma mensagem de que este produto não está disponível.</p>
<p>Gosto de limitar os controllers somente a isso. Não é função de um controller procurar um produto em um banco de dados, alterar uma informação, ou qualquer coisa do tipo. O controller é responsável somente por tratar as respostas. Dessa forma, conseguimos deixar nosso código bastante organizado.</p>
<p>Outra função do controller, é de processar as funcionalidades recebidas de o “service” —este, sim, responsável por trazer funcionalidade a API.</p>
<h3 id="heading-services">Services</h3>
<p>Um service tem como responsabilidade centralizar todas as funcionalidades de uma API. Assim como no exemplo que dei de controller: quer buscar um produto? É uma função no service que será responsável por isso. Quer adicionar um novo registro no seu banco de dados? É novamente uma função no service que será responsável por isso.</p>
<p>Em uma aplicação, podemos ter vários services. É importante que eles sejam divididos conforme a funcionalidade: um service para funções dos produtos, um service para funções de pagamento, um service para funções de compra de produtos, e por aí seguimos. Não é um problema, muito pelo contrário, ter uma variedade de services como no exemplo que dei, é justamente isso que ajudará a manter o seu código bem organizado.</p>
<p>Mas claro que, nem tudo precisa estar em um service —é importante apenas que o service centralize as funções. Por exemplo, para cuidar de ações diretamente no banco de dados, podemos ter “repositórios”, para cuidar de uma integração com outro serviço ou API podemos ter um “provider”. A depender de seu projeto, pode ser importante dividir responsabilidades para evitar poluição de código.</p>
<h2 id="heading-e-so-isso">É só isso?</h2>
<p>Sim, é só isso. Seguindo essa estrutura você consegue montar da mais básica até a mais complexa de uma API, com um código limpo, legível, bem organizado e escalável. A depender da aplicação, realmente não precisamos de muito mais.</p>
<p>É importante ainda que você esteja atento a alguns conceitos importantes por aqui: divisão de responsabilidades, dinamicidade e desacoplamento de funções.</p>
<ul>
<li><p>Devemos dividir bem a responsabilidade de nossas classes e funções de forma que elas não façam nada além do que lhe é proposto. Isso faz com que nosso código esteja melhor organizado, e consequentemente facilita o nosso trabalho de desenvolvimento</p>
</li>
<li><p>Todas as funções e classes devem ser bastante dinâmicas e estarem preparadas para qualquer possível objetivo, evitando, por exemplo, repetição de código.</p>
</li>
<li><p>Tenha quantas rotas, controllers, e principalmente services forem necessários. Quando falamos de desacoplamento de funções queremos justamente diminuir a dependência de uma determinada ferramenta. Por que usar um repositório, por exemplo? Se você trocar de banco de dados, ajuste apenas as funções do seu repositório. Os services, que utilizam o repositório, não vão nem mesmo perceber a diferença de troca de banco de dados. Esse conceito pode ser aplicado em qualquer ponta da sua aplicação.</p>
</li>
</ul>
<p>Perceba também que nem mesmo cito linguagens ou frameworks. Não faz diferença. Programação vai muito além da ferramenta, e é mesmo sobre o conceito por trás de sua estrutura.</p>
<p>Podemos ainda mais explorar esses conceitos, melhorando a nossa estrutura e sempre adaptando a realidade do nosso projeto.</p>
<p>Como você monta a sua API? Qual estrutura utiliza? Participe de nosso canal no Discord e conte para gente!</p>
]]></content:encoded></item><item><title><![CDATA[Trabalhando com arrays em Javascript]]></title><description><![CDATA[Esse é um tema constante e que sempre gera dúvidas. Com Javascript temos várias funções que nos possibilitam trabalhar com Arrays mas você sabe o que cada uma delas faz?
O que é um Array?
Array é uma lista de valores.
Em Javascript, definimos um arra...]]></description><link>https://devgo.com.br/trabalhando-com-arrays-em-javascript</link><guid isPermaLink="true">https://devgo.com.br/trabalhando-com-arrays-em-javascript</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[array]]></category><dc:creator><![CDATA[Paulo Vitor Cruz]]></dc:creator><pubDate>Fri, 23 Dec 2022 14:00:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1671713467464/aCbazFoG4.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Esse é um tema constante e que sempre gera dúvidas. Com Javascript temos várias funções que nos possibilitam trabalhar com Arrays mas você sabe o que cada uma delas faz?</p>
<h2 id="heading-o-que-e-um-array">O que é um Array?</h2>
<p>Array é uma lista de valores.</p>
<p>Em Javascript, definimos um array como itens dentro de colchetes [“item1”, “item2”], simples assim.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> novoArray = [<span class="hljs-string">'item1'</span>, <span class="hljs-string">'item2'</span>, <span class="hljs-string">'item3'</span>];
</code></pre>
<p>Agora o grande mistério é como trabalhar com estes arrays: adicionar um valor, buscar um valor, filtrar um valor, conferir se existe um valor na lista, e diversas outras funções. Existem diversas funções assim e vamos tratar as principais:</p>
<h3 id="heading-push-adicionando-um-item-no-array">push() — Adicionando um item no Array</h3>
<p>Para adicionar um novo item na sua lista, basta utilizar a função <code>push()</code>. Um push irá adicionar um novo item na última posição da lista, como você pode conferir no exemplo:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> novoArray = [];
novoArray.push(<span class="hljs-string">'item1'</span>);
novoArray.push(<span class="hljs-string">'item2'</span>);

<span class="hljs-built_in">console</span>.log(novoArray);
<span class="hljs-comment">//['item1', 'item2']</span>
</code></pre>
<h3 id="heading-pop-e-shift-excluindo-um-item-do-array">pop() e shift() —Excluindo um item do Array</h3>
<p>Você pode excluir um item do seu array de duas formas: excluindo o primeiro, ou excluindo o último da lista, com as funções <code>pop()</code> ou <code>shift()</code></p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> novoArray = [<span class="hljs-string">'item1'</span>, <span class="hljs-string">'item2'</span>, <span class="hljs-string">'item3'</span>];
<span class="hljs-keyword">const</span> ultimoItemExcluido = novoArray.pop();
<span class="hljs-keyword">const</span> primeiroItemExcluido = novoArray.shift();

<span class="hljs-built_in">console</span>.log(novoArray)
<span class="hljs-comment">//['item2']</span>
</code></pre>
<h3 id="heading-indexof-buscando-a-posicao-de-um-item">indexOf() —Buscando a posição de um item</h3>
<p>Com essa função, você passa um valor como parâmetro a ser buscado na lista. Se existir, retornará em que posição está este valor:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> novoArray = [<span class="hljs-string">'item1'</span>, <span class="hljs-string">'item2'</span>, <span class="hljs-string">'item3'</span>];
<span class="hljs-keyword">const</span> indexDoItem2 = novoArray.indexOf(<span class="hljs-string">'item2'</span>);
</code></pre>
<h3 id="heading-includes-some-e-every-conferindo-se-item-existe">includes(), some() e every() —Conferindo se item existe</h3>
<p>Você pode conferir se um item existe na sua lista com a função <code>includes()</code>, que retornará um valor booleano indicando se existe ou não.</p>
<p>Existem também as funções <code>some()</code> ou <code>every()</code>, bem interessantes para uma analise geral da lista: “existe algum item que cumpre a condição Y na lista?”, “todos os itens da lista cumprem a condição Z?”)</p>
<p>Segue o exemplo:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> novoArray = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>, <span class="hljs-number">7</span>, <span class="hljs-number">8</span>, <span class="hljs-string">'umaStringQualquer'</span>];
<span class="hljs-keyword">const</span> listaPossuiNumero4 = novoArray.includes(<span class="hljs-number">4</span>);
<span class="hljs-keyword">const</span> listaPossuiNumero10 = novoArray.includes(<span class="hljs-number">10</span>);
<span class="hljs-keyword">const</span> existeAlgumaStringNaLista = novoArray.some(<span class="hljs-function">(<span class="hljs-params">item</span>) =&gt;</span> <span class="hljs-keyword">typeof</span> item == <span class="hljs-string">'string'</span>);
<span class="hljs-keyword">const</span> todosItemsSaoNumeros = novoArray.every(<span class="hljs-function">(<span class="hljs-params">item</span>) =&gt;</span> <span class="hljs-keyword">typeof</span> item == <span class="hljs-string">'number'</span>);

<span class="hljs-built_in">console</span>.log(listaPossuiNumero4, listaPossuiNumero10, existeAlgumaStringNaLista, todosItemsSaoNumeros)
<span class="hljs-comment">//true false true false</span>
</code></pre>
<h3 id="heading-filter-filtrando-items-de-um-array">filter() —Filtrando items de um array</h3>
<p>Uma outra função bastante interessante, e bastante utilizada em diversas situações. Um <code>filter()</code> permite que você gere uma nova lista, filtrando os resultados desejados, seguindo uma determinada condição.</p>
<p>No exemplo abaixo, filtrei de uma lista os resultados pares e impares:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> novoArray = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>, <span class="hljs-number">7</span>, <span class="hljs-number">8</span>];
<span class="hljs-keyword">const</span> numerosPares = novoArray.filter(<span class="hljs-function">(<span class="hljs-params">item</span>) =&gt;</span> item % <span class="hljs-number">2</span> == <span class="hljs-number">0</span>);
<span class="hljs-keyword">const</span> numerosImpares = novoArray.filter(<span class="hljs-function">(<span class="hljs-params">item</span>) =&gt;</span> item % <span class="hljs-number">2</span> == <span class="hljs-number">1</span>);

<span class="hljs-built_in">console</span>.log(numerosPares)
<span class="hljs-comment">//[2, 4, 8]</span>
<span class="hljs-built_in">console</span>.log(numerosImpares)
<span class="hljs-comment">// [1, 3, 5, 7]</span>
</code></pre>
<h3 id="heading-map-e-foreach-passando-por-todos-os-items-de-um-array">map() e forEach() —Passando por todos os items de um array</h3>
<p>São duas funções parecidas e que geram uma certa confusão. Tanto o <code>map()</code> quanto o <code>forEach()</code> passam por todos os itens da lista.</p>
<p>A diferença, é que o <code>forEach</code> apenas passa pela lista, e o <code>map()</code> pode “remapear” os valores, criando uma nova lista com valores completamente diferentes.</p>
<p>No exemplo abaixo, usei o <code>map()</code> para transformar todos os itens da lista em strings, e usei o <code>forEach</code> para chamar uma ação para todos os itens da lista.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> novoArray = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>, <span class="hljs-number">7</span>, <span class="hljs-number">8</span>];
<span class="hljs-keyword">const</span> novoArrayComoString = novoArray.map(<span class="hljs-function">(<span class="hljs-params">item</span>) =&gt;</span> item.toString());

<span class="hljs-built_in">console</span>.log(novoArrayComoString)
<span class="hljs-comment">//['1', '2', '3', '4', '5', '7', '8']</span>
</code></pre>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> novoArray = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>, <span class="hljs-number">7</span>, <span class="hljs-number">8</span>];
novoArray.forEach(<span class="hljs-function">(<span class="hljs-params">item</span>) =&gt;</span> realizaAlgumaAcao(item));
</code></pre>
<p>Tratamento de listas no Javascript podem parecer complexos, mas é mesmo uma questão de prática? Ainda tem alguma dúvida? Participe de nosso canal no Discord e nos chame por lá que podemos te ajudar!</p>
]]></content:encoded></item><item><title><![CDATA[Você já usa o NestJS?]]></title><description><![CDATA[Já falamos sobre frameworks por aqui, e já até mencionamos o NestJS. Mas hoje vamos explorar um pouco mais e reforçar a importância desse framework durante o desenvolvimento de nossas aplicações.
O NestJS:
NestJS é um framework em Javascript para des...]]></description><link>https://devgo.com.br/voce-ja-usa-o-nestjs</link><guid isPermaLink="true">https://devgo.com.br/voce-ja-usa-o-nestjs</guid><category><![CDATA[Next.js]]></category><category><![CDATA[APIs]]></category><category><![CDATA[Developer]]></category><dc:creator><![CDATA[Paulo Vitor Cruz]]></dc:creator><pubDate>Fri, 09 Dec 2022 14:00:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1670583641546/AGw1Upyc_.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Já falamos sobre frameworks por aqui, e já até mencionamos o NestJS. Mas hoje vamos explorar um pouco mais e reforçar a importância desse framework durante o desenvolvimento de nossas aplicações.</p>
<h2 id="heading-o-nestjs">O NestJS:</h2>
<p><a target="_blank" href="https://nestjs.com/">NestJS</a> é um framework em Javascript para desenvolver APIs. Simples assim.</p>
<p>Sendo um framework, o NestJS ajuda bastante o processo de desenvolvimento de uma aplicação, trazendo ótimas ferramentas como <a target="_blank" href="https://docs.nestjs.com/openapi/types-and-parameters#types-and-parameters">Swagger</a>, <a target="_blank" href="https://docs.nestjs.com/techniques/database">ORMs</a>, <a target="_blank" href="https://docs.nestjs.com/techniques/caching">Gerenciador de Cache</a>, <a target="_blank" href="https://docs.nestjs.com/techniques/validation">validações com DTOs</a>, <a target="_blank" href="https://docs.nestjs.com/graphql/quick-start#getting-started-with-graphql--typescript">GraphQL</a> e até mesmo um <a target="_blank" href="https://docs.nestjs.com/microservices/basics">grande suporte a microsserviços</a>, de um jeito bastante fácil e simplificado.</p>
<p>Se você está acostumado a desenvolver APIs puramente com Express ou Fastify, pode até achar um pouco estranho, pois o NestJS conta com uma estrutura bastante particular, com uso de módulos e decorators como base de toda a aplicação, mas é mesmo uma questão de adaptação, toda essa diferença é mesmo uma grande ajuda.</p>
<p>Vamos explorar um pouco mais:</p>
<h3 id="heading-controllers">Controllers</h3>
<p>Toda API começa na definição de rotas e controllers. Geralmente, fazemos criamos nossas rotas, apontando para um controller que irá fazer todo o gerenciamento de funcionalidade.</p>
<p>No NestJS, é diferente e um pouco mais fácil. Com o uso de decorators, agrupamos nossa definição de rotas diretamente no controller e em suas funções, já de cara definindo o endpoint das rotas e método a ser utilizado, em uma estrutura como essa:</p>
<pre><code class="lang-tsx">import { Controller, Get, Body } from '@nestjs/common';
import { RequestDto } from '../requestDto.dto';

@Controller('nome_da_rota_aqui')
export class ExampleController {
  @Get('nome_endpoint_aqui')
  getExample(): string {
    return 'Retorno qualquer de um GET';
  }

  @Post()
  postExample(@Body() request: RequestDto) {
    return 'Retorno qualquer de um POST';
  }
}
</code></pre>
<p>Ainda nos controllers, algo bem interessante é a criação de DTOs e validação dos payloads enviados. Podemos criar uma classe, em que nossas propriedades recebem um decorator indicando a validação a ser usada. Basta usar essa classe como tipagem de uma variável no controller, e a partir desta definição, automaticamente o NestJS irá validar a sua rota. Um exemplo de um DTO é como:</p>
<pre><code class="lang-tsx">import { IsNotEmpty, IsEmail } from "class-validator";

export class RequestDto {
    @IsNotEmpty()
    nome: string;

    @IsEmail()
    email: string;
}
</code></pre>
<h3 id="heading-entities">Entities</h3>
<p>As entities são responsáveis por cuidar do gerenciamento de banco de dados. Em nosso exemplo, vamos utilizar o TypeORM, mas você poderia também trazer o Prisma ou até o Moongose para o NestJS.</p>
<p>O uso de entities segue o padrão da ORM que você irá utilizar, mas a lógica é sempre a mesma: definir os campos e as colunas de sua tabela no banco de dados a partir dos decorators:</p>
<pre><code class="lang-tsx">import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity('nome_da_tabela')
export class App {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column()
  name: string;

  @Column({ nullable: true })
  lastName: string;

  @Column()
  email: string;
}
</code></pre>
<h3 id="heading-services">Services</h3>
<p>Os services são bastante importantes no desenvolvimento de uma API, afinal, é em um service que acontece todo o gerenciamento de funcionalidades da aplicação.</p>
<p>No NestJS, um service nada mais é do que uma classe, que contém as nossas funções. O interessante é que o Nest trabalha com uma injeção de dependencias, mantendo um baixo nível de acoplamento entre nossas funções. Por isso, é bastante fácil trazer outras ferramentas, como um repositório do TypeORM, ou uma ferramenta de requisições HTTP para dentro do nosso service, assim como é bastante tranquilo exportar este mesmo service e usar em outro contexto da aplicação.</p>
<p>Um service no NestJS segue a seguinte estrutura:</p>
<pre><code class="lang-tsx">import { NewAppData } from './../dto/app.dto';
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { App } from '../entities/app.entity';
import { Repository } from 'typeorm';
import { HttpService } from '@nestjs/axios';

@Injectable()
export class AppService {
  constructor(
    private httpService: HttpService,
    @InjectRepository(App)
    private appRepository: Repository&lt;App&gt;,
  ) {}

  getHello(): string {
    return 'Hello World!';
  }

  addNewAppData(data: NewAppData): Promise&lt;App&gt; {
    const app = {
      name: data.name,
    };

    return this.appRepository.save(app);
  }

  findAppDataById(dataId): Promise&lt;App&gt; {
    return this.appRepository.findOne({ where: { id: dataId } });
  }
}
</code></pre>
<h3 id="heading-modulos">Módulos</h3>
<p>Tudo no NestJS acaba em um módulo. Um módulo é responsável por inicializar os nossos controllers, services, entities e outras ferramentas dentro de nossa aplicação.</p>
<p>Se você está familiarizado com o Angular, é a mesmo padrão: tudo que criamos dentro do NestJS deve ser inicializado num módulo.</p>
<p>Você pode ter a quantidade de módulos que quiser e organizar da melhor forma que puder imaginar, o que pode trazer ao NestJS uma ótima funcionalidade de gerenciamento de módulos. Por exemplo, você pode centralizar toda uma funcionalidade de “Usuários” dentro de um “UserModule” que irá conter todos os controllers, services e entities utilizados neste contexto, e então, aplicar este módulo no “AppModule”, módulo base do NestJS.</p>
<p>Um módulo no NestJS é como o exemplo abaixo:</p>
<pre><code class="lang-tsx">import { App } from './entities/app.entity';
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { Database } from './helpers/database';
import { AppService } from './services/app.service';
import { AppController } from './controllers/app.controller';
import { ExampleModule } from '../example.module';

@Module({
  imports: [
    ExampleModule,
    ConfigModule.forRoot(),
    Database.build(),
    Database.registerEntities([App]),
  ],
  controllers: [AppController],
  providers: [AppService],
  exports: [AppService],
})
export class AppModule {}
</code></pre>
<p>De forma bastante simplificada, este é o NestJS. </p>
<p>Ainda há muito a ser explorado e traremos estes pontos em nossos próximos textos da devGo, mas que esteja claro os benefícios: as ferramentas disponíveis, a estrutura simplificada, a agilidade no desenvolvimento e a facilidade de adaptação ao framework.</p>
<p>E você? Já usa o NestJS ou algum outro framework? Participe do nosso canal no Discord e conte para gente!</p>
]]></content:encoded></item><item><title><![CDATA[Como organizar suas demandas]]></title><description><![CDATA[Se você acha que programação é apenas sobre código, tem algo errado aí. Até mesmo nós, desenvolvedores, precisamos organizar as nossas demandas. No texto de hoje, vou mostrar um pouco do que eu costumo fazer e das ferramentas que costumo usar:
Trello...]]></description><link>https://devgo.com.br/como-organizar-suas-demandas</link><guid isPermaLink="true">https://devgo.com.br/como-organizar-suas-demandas</guid><category><![CDATA[Trello]]></category><category><![CDATA[JIRA]]></category><category><![CDATA[Todoist]]></category><category><![CDATA[get things done]]></category><dc:creator><![CDATA[Paulo Vitor Cruz]]></dc:creator><pubDate>Fri, 02 Dec 2022 14:19:16 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1669990721340/d7e7e763-3934-4f87-a06f-11a1e47c618b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Se você acha que programação é apenas sobre código, tem algo errado aí. Até mesmo nós, desenvolvedores, precisamos organizar as nossas demandas. No texto de hoje, vou mostrar um pouco do que eu costumo fazer e das ferramentas que costumo usar:</p>
<h2 id="heading-trellohttpstrellocom-jirahttpswwwatlassiancombrsoftwarejira-asanahttpsasanacom-clickuphttpsclickupcom"><a target="_blank" href="https://trello.com/">Trello</a>, <a target="_blank" href="https://www.atlassian.com/br/software/jira">Jira</a>, <a target="_blank" href="https://asana.com/">Asana</a>, <a target="_blank" href="https://clickup.com/">Clickup</a></h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1669990604576/c189af5a-ba77-4aa8-92fc-5a3e1f7d80cf.png" alt="Boards_2x.png" class="image--center mx-auto" /></p>
<p>A maioria dos desenvolvedores já deve estar mais do que acostumados com essas ferramentas. Metodologias como Agile, Scrum ou Kanban usam como base aplicações neste formato para organização e planejamento das demandas.</p>
<p>Gosto de usar essas aplicações para grandes demandas: “desenvolver página da home”, “criar endpoint para usuários”, “criar recurso de recuperação de senhas” ou qualquer outra coisa que demande bastante atenção e tempo.</p>
<p>O legal é mesmo usar em trabalhos em equipe, até porque várias pessoas trabalhando em um projeto requer uma boa organização e fácil acompanhamento. Aqui utilizamos bastante o recurso de “arrastar para a próxima coluna” ao atualizar o status da nossa tarefa, e temos todos os detalhes e planejamento da tarefa por aqui!</p>
<p>Combine como usar com a sua equipe e traga seu planejamento para dentro da aplicação. Importante é sempre estar usando!</p>
<h2 id="heading-todoisthttpstodoistcom-ticktickhttpsticktickcom"><a target="_blank" href="https://todoist.com/">Todoist</a>, <a target="_blank" href="https://ticktick.com/">Ticktick</a></h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1669990631709/75b3e131-b01f-4100-8fd3-d181c09b4e1b.avif" alt="illustration_w_2026.avif" class="image--center mx-auto" /></p>
<p>Estes são ferramentas de “Listas a fazer”. Diferente do Jira ou ClickUp, mais usados em equipe, gosto de usar essas aplicações para uso pessoal e individual mesmo: apenas eu uso, vejo e gerencio.</p>
<p>Anoto pequenas demandas, rápidas de serem feitas, e organizadas das diariamente: “falar com fulano”, “conferir status da demanda X”, “mapear banco de dados”.</p>
<p>Uma organização dessa forma faz parte do método <a target="_blank" href="https://blog.trello.com/br/metodo-gtd">Get Things Done</a>, que tem me ajudado bastante e recomendo a todos: literalmente tudo que tenho para fazer, deixo registrado. Se está feito, apenas concluo a tarefa e está fora da minha lista. Organizo por prioridades e se for o caso até deixo alguns alarmes. O foco é finalizar tudo o que deve ser feito naquele dia.</p>
<p>Importante aqui é: anotar tudo!</p>
<h2 id="heading-o-bom-e-velho-calendario">O bom e velho calendário</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1669990659469/47e2488e-32ec-4a8d-a5c1-4759948187b9.png" alt="unnamed.png" class="image--center mx-auto" /></p>
<p>Nada substitui o calendário. Se você faz muitas reuniões, tem sempre algumas chamadas aqui e ali, não pode deixar de usar o calendário.</p>
<p>Por mais simples que pareça, nos ajuda a não perder os planejamentos e ter tudo mapeado para o dia. Deixo tudo registrado e com alarmes para não esquecer de nada!</p>
<h2 id="heading-nao-subestime">Não subestime!</h2>
<p>São pequenas ações como essas comentadas aqui que nos ajudam a não perder o rumo. Durante um momento de muita agitação, muita correria ou muita urgência, você quer ter certeza de que não está esquecendo de nada, certo?</p>
<p>Ter esses hábitos incorporados no dia a dia, independente do momento, é o que faz a diferença.</p>
<p>E você? Como organiza as suas demandas? <a target="_blank" href="https://discord.gg/H5wPNCTRwq">Participe do nosso canal do Discord</a>, e conte para gente!</p>
]]></content:encoded></item><item><title><![CDATA[Como dar bons prazos]]></title><description><![CDATA[Seja você desenvolvedor, seja você um líder, em algum momento precisará entregar o prazo de algum projeto. Dar bons prazos é sempre um grande desafio. No texto de hoje, vou compartilhar um pouco da minha experiência e discutir como trabalho com prazo...]]></description><link>https://devgo.com.br/como-dar-bons-prazos</link><guid isPermaLink="true">https://devgo.com.br/como-dar-bons-prazos</guid><category><![CDATA[software development]]></category><category><![CDATA[leadership]]></category><dc:creator><![CDATA[Paulo Vitor Cruz]]></dc:creator><pubDate>Fri, 18 Nov 2022 14:00:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1668767825052/yI-inGSls.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Seja você desenvolvedor, seja você um líder, em algum momento precisará entregar o prazo de algum projeto. Dar bons prazos é sempre um grande desafio. No texto de hoje, vou compartilhar um pouco da minha experiência e discutir como trabalho com prazos.</p>
<h2 id="heading-e-impossivel-prever-o-futuro">É impossível prever o futuro</h2>
<p>Este é o ponto mais importante: você não sabe o que vai acontecer amanhã. Passar um prazo tentando imaginar o futuro é apenas “chutar” uma data, e isso é a pior coisa que você pode fazer enquanto está dando um prazo.</p>
<p>O seu “Waze” ou “Google Maps”, por exemplo, só sabem que você leva 15 minutos do ponto X ao ponto Y porque você irá passar por um caminho bastante específico. Em um projeto é a mesma coisa, você precisa construir uma rota.</p>
<h2 id="heading-planejamento">Planejamento</h2>
<p>O que é preciso ser feito no projeto? Tenho conhecimento suficiente para isso? Precisarei de alguma ajuda ou suporte? Há algum ponto de atenção durante o projeto?</p>
<p>São perguntas que sempre devem ser feitas antes de dar um prazo. E o planejamento começa a partir do momento que você responde essas perguntas.</p>
<p>Entenda o que precisa ser feito e mapeie as demandas; estude tudo que for necessário para que você desenvolva o projeto; vá atrás de alguém que te dará o suporte e já resolva todas as pendências, ou ao menos já deixe marcado; dê atenção as maiores dificuldades do projeto, e se possível até as faça primeiro.</p>
<h2 id="heading-de-pequenos-passos">Dê pequenos passos</h2>
<p>Se você tem um projeto fullstack para desenvolver, você não pode pensar “10 dias para o backend, 10 dias para o frontend”. O que vai ser feito no backend? O que precisa ser desenvolvido no frontend? É mesmo tão simples a ponto de ser definido de forma tão macro?</p>
<p>A dica é trabalhar com pequenas tarefas: no backend, preciso construir a rota X e isso levará 2 dias, no frontend preciso construir o componente Y e isso levará 1 dia. Isso te dá uma perspectiva mais realista sobre o projeto e permite que você seja mais preciso com os prazos.</p>
<p>A questão por aqui é que é mais difícil dar um bom prazo para um projeto grande, do que para uma tarefa pequena.</p>
<h2 id="heading-a-lei-de-murphy">A Lei de Murphy</h2>
<p>Se algo tem chance de dar errado, vai dar errado. E vai mesmo. Esteja sempre preparado para algum possível problema: atraso em alguma tarefa, desenvolvimento não previsto, uma dificuldade maior do que você espera.</p>
<p>Por isso, volto em alguns pontos: planejamento e tarefas pequenas: com um bom planejamento você evita e se prepara para maior parte dos problemas; com pequenas tarefas você vê o erro acontecendo mais cedo e tem mais tempo hábil para solucionar.</p>
<p>Se um erro irá acontecer, você precisa estar preparado e ser ágil para resolver.</p>
<h2 id="heading-experiencia">Experiência</h2>
<p>O seu primeiro prazo vai ser horrível, o segundo só vai ser ruim, o terceiro foi quase lá e no quarto você finalmente acertou.</p>
<p>A experiência vai te permitir planejar melhor, se preparar para os problemas melhor e até descobrir novos caminhos. É o que você mais precisa para dar um bom prazo.</p>
<p>Ao final de um projeto, sempre tente entender onde você errou, o que poderia ter feito melhor e como fazer melhor. Desta forma, a experiência vai surgindo gradualmente.</p>
<h2 id="heading-ainda-assim-voce-vai-errar">Ainda assim você vai errar</h2>
<p>Não importa o nível de planejamento, se demandas foram bem colocadas, se você viu um erro acontecendo e até conseguiu resolver, no fim, o seu prazo pode ir completamente errado, independente até da experiência que você tenha.</p>
<p>Por isso, gosto sempre de usar uma “margem de erro”. É bem simples até: Se é 10 dias, digo 15. Se é 20 dias, digo 30. Essa pequena diferença me dá mais espaço para resolver qualquer eventual problema sem quebrar a expectativa do cliente. E se tudo ocorrer bem, acabo entregando até mesmo antes da data que eu disse.</p>
<h2 id="heading-prazos-sao-uma-negociacao">Prazos são uma negociação</h2>
<p>Se mesmo com todas as dicas as coisas podem dar errado, o que fazer então? Bom, veja que estamos tentando trabalhar de forma exata, com algo que não é exato, e é por isso que erramos tanto.</p>
<p>Um bom prazo não é acertar em quantos dias você consegue entregar algo, até porque prazos não são sobre datas, são sobre expectativas, e expectativas estão bem longe do campo de exatas. Um bom prazo depende da forma em que isso é apresentado, em como é trabalhado durante toda a etapa de desenvolvimento, e principalmente em como é entregue ao final.</p>
<p>Tenha isso em mente, independente dos problemas, trabalhe com a expectativa do cliente.</p>
<p>Termino dizendo que prazo realmente não é nada tão exato quanto nós pensamos, e por isso, é um ótimo assunto a ainda ser discutido várias e várias vezes. Você já conhece o nosso <a target="_blank" href="https://discord.gg/H5wPNCTRwq">canal do Discord</a>? Estaremos por lá debatendo ainda debatendo este assunto. Participe conosco, e compartilhe como você trabalha com prazos também</p>
]]></content:encoded></item><item><title><![CDATA[10 extensões do Visual Studio Code para facilitar o seu dia a dia.]]></title><description><![CDATA[Atualmente o VSCode é um dos editores de textos mais usados por programadores por conta da sua alta e fácil customização, abaixo segue uma lista de 10 extensões que poderão facilitar o seu dia a dia de trabalho e nos estudos dentro do VsCode essas ex...]]></description><link>https://devgo.com.br/10-extensoes-do-visual-studio-code-para-facilitar-o-seu-dia-a-dia</link><guid isPermaLink="true">https://devgo.com.br/10-extensoes-do-visual-studio-code-para-facilitar-o-seu-dia-a-dia</guid><category><![CDATA[vscode extensions]]></category><category><![CDATA[vscode]]></category><dc:creator><![CDATA[Matheus Filho]]></dc:creator><pubDate>Fri, 11 Nov 2022 14:09:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1668175703636/kXMbAqMlZ.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Atualmente o VSCode é um dos editores de textos mais usados por programadores por conta da sua alta e fácil customização, abaixo segue uma lista de 10 extensões que poderão facilitar o seu dia a dia de trabalho e nos estudos dentro do VsCode essas extensões vão desde deixar o código mais limpo a iniciar rodas um servidor online para arquivos html.</p>
<h1 id="heading-icons">Icons</h1>
<p>Atualmente no vscode existem várias extensões de arquivos que ajudam a gente a não precisar olhar somente a extensão do arquivo e deixam o ícone da extensão do arquivo e das pastas para uma melhor visualização, logo abaixo recomendarei algumas extensões que fazem esse papel:</p>
<h2 id="heading-material-icon-theme">Material Icon Theme:</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1668173686548/wnswvADly.png" alt="materialicontheme2.png" class="image--center mx-auto" />
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1668173705756/avfrx8-xF.png" alt="folderIcons (1).png" class="image--center mx-auto" />
Link para download: https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme</p>
<h2 id="heading-vscode-icons">VsCode Icons</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1668173926133/pRmB3gH_F.gif" alt="screenshot.gif" class="image--center mx-auto" />
Link para download: https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons</p>
<h2 id="heading-material-theme-icon">Material Theme Icon</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1668174043067/3JyDhu93j.jpg" alt="Frame.jpg" class="image--center mx-auto" />
Link para download: https://marketplace.visualstudio.com/items?itemName=Equinusocio.vsc-material-theme-icons</p>
<h1 id="heading-snipets">Snipets</h1>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1668174186535/yh9EMZqhW.png" alt="Sem título.png" class="image--center mx-auto" />
Os snipets estão aí para além de facilitar nossa vida adicionando certas estruturas previamente prontas, como, por exemplo, um switch case ou um laço for, pequenas estruturas que escrevemos várias e várias vezes durante o dia com uma simples palavra, ele já digita toda a estrutura básica e fica faltando você somente adicionar os dados necessários.</p>
<h1 id="heading-gitlens">GitLens</h1>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1668174328583/RoTd3FxO4.png" alt="gitlens-logo-anybg.png align=&quot;center&quot;" />
O git lens está aí para melhorar a usualidade do git dentro do vscode, podendo mostrar quem editou ou escreveu tal linha de código, mostrar uma worktree simplificada, poder ver de uma forma melhor os últimos commits feitos em determinado arquivo, além de muito mais.</p>
<p>Link para download: https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens</p>
<h1 id="heading-live-share">Live Share</h1>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1668174474086/w3ilg7FVZ.png" alt="47791951-1cdb9780-dcd8-11e8-9fee-4b059322e552.png" class="image--center mx-auto" />
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1668174476927/T_DW1Uziz.png" alt="47793782-4d253500-dcdc-11e8-9c76-3d9d5b474d9d.png" class="image--center mx-auto" />
Para você que trabalha em equipe e precisa desenvolver com outro desenvolvedor simultaneamente, para auxiliar ou fazer um pair code. O live share permite exatamente isso. Com ele basta uma conta da microsoft ou do github você consegue "entrar" dentro do código na máquina do seu parceiro, assim podendo editar com ele o mesmo arquivo em simultâneo.</p>
<p>Link para downlod: https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare</p>
<h1 id="heading-bracket-pair-colorizer">Bracket pair colorizer</h1>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1668174687313/EIZPDUNbG.png" alt="example.png" class="image--center mx-auto" />
Para você que utiliza uma linguagem com muitas chaves, colchetes e parênteses, essa extensão colore os fechamentos, assim deixando mais fácil localizar o início e o fim. Com isso você consegue se localizar melhor no seu código, além de ficar visualmente mais estético.</p>
<p>Link para download: https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer-2</p>
<h1 id="heading-prettier-e-beutify">Prettier e Beutify</h1>
<p>São extensões que irá realizar a  indentação do código para você, deixando mais limpo e bonito para que outras pessoas vejam. Além de que bem configurado você não terá problemas em ter que ficar arrumando o seu código a todo instante.</p>
<h2 id="heading-prettier">Prettier</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1668174891711/rxzGVMB1D.png" alt="prettier.png" class="image--center mx-auto" />
Link para download: https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode</p>
<h2 id="heading-beautify">beautify</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1668174901199/ALAjecQD9.png" alt="beautify.png" class="image--center mx-auto" />
Link para download: https://marketplace.visualstudio.com/items?itemName=HookyQR.beautify</p>
<h1 id="heading-polacode">Polacode</h1>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1668175331310/7kewZQ218.png" alt="1.png" class="image--center mx-auto" />
Polacode é uma extensão para que você possa printar determinada parte do código, assim ficando melhor para enviar para alguém. Essa extensão permite você também redimensionar o tamanho das linhas no próprio print.</p>
<p>Link para download: https://marketplace.visualstudio.com/items?itemName=pnp.polacode</p>
<h1 id="heading-todo-highlight">TODO Highlight</h1>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1668175374751/rVXqQBt7W.png" alt="material-night.png align=&quot;center&quot;" />
Essa é uma extensão para que os TODO e FIXME no código fiquem mais fáceis de se verem, dando assim mais oportunidades para desenvolvedores resolverem problemas no código. Pois se algo está brilhando e chamando a atenção, o desenvolvedor não terá a desculpa que não enxergou o comentário.</p>
<p>Link para download: https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight</p>
<h1 id="heading-color-hightlight">Color Hightlight</h1>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1668175555770/GRIvJH6sR.gif" alt="2bc3fcb6eb3044a0f7689c3143c057b83f80dc83.gif" class="image--center mx-auto" />
Essa extensão coloca um contorno da cor do código hexadecimal de cor em volta dos códigos hexadecimais de cores. Isso da mais liberdade pro desenvolvedor testar novas combinações de cores, já que não será necessário olhar na tela para ver qual cor é a daquele código hexadecimal.</p>
<p>Link para download: https://marketplace.visualstudio.com/items?itemName=naumovs.color-highlight</p>
<h1 id="heading-live-server">Live Server</h1>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1668175648111/ZZF1M-4MW.gif" alt="vscode-live-server-animated-demo.gif" class="image--center mx-auto" /></p>
<p>Essa extensão permite você criar um micro servidor http para códigos html deixando assim mais fácil a edição desses arquivos. Já que com esse micro servidor qualquer mudança feita no arquivo será modificada em tempo real na página.</p>
<p>Link para download: https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer</p>
]]></content:encoded></item></channel></rss>