<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Raphael Ramos</title>
    <description>The latest articles on DEV Community by Raphael Ramos (@raphaelramos).</description>
    <link>https://dev.to/raphaelramos</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1065199%2Fec393c75-5f6b-4f53-b065-9854f0a71433.png</url>
      <title>DEV Community: Raphael Ramos</title>
      <link>https://dev.to/raphaelramos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/raphaelramos"/>
    <language>en</language>
    <item>
      <title>Meet MobiFit: My Fitness App and How It Works</title>
      <dc:creator>Raphael Ramos</dc:creator>
      <pubDate>Wed, 22 Oct 2025 15:57:54 +0000</pubDate>
      <link>https://dev.to/raphaelramos/meet-mobifit-my-fitness-app-and-how-it-works-39g4</link>
      <guid>https://dev.to/raphaelramos/meet-mobifit-my-fitness-app-and-how-it-works-39g4</guid>
      <description>&lt;p&gt;MobiFit is a fitness app that combines AI with multi-agent, local-first functionality, thoughtfully designed UX, groups with an internal social network, and Instagram integration—all so you can train anywhere.&lt;/p&gt;

&lt;p&gt;Created by an independent developer, the project was born from the realization that many gym apps are bureaucratic: too many forms, confusing interfaces, and little focus on what matters—getting started with training. A discovery process with students and fitness professionals guided the feature decisions.&lt;/p&gt;

&lt;p&gt;The available ready-made workouts were created by human professionals, specifically for the app and for various levels.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Available on:&lt;/strong&gt; &lt;a href="https://play.google.com/store/apps/details?id=app.mobifit" rel="noopener noreferrer"&gt;Google Play&lt;/a&gt; and &lt;a href="https://apps.apple.com/us/app/mobifit-start/id6737747199" rel="noopener noreferrer"&gt;App Store&lt;/a&gt; | Free&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Languages:&lt;/strong&gt; English, Portuguese, and Spanish&lt;/p&gt;

&lt;h2&gt;
  
  
  The Experience, Powered by AI
&lt;/h2&gt;

&lt;p&gt;AI isn't an add-on: it's a central part of the architecture and can execute actions within the app, create dynamic content, and use user data to personalize recommendations.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the AI Does
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Personalized workout plans from natural language.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Answers to questions&lt;/strong&gt; (execution, adaptations by level, goal, or equipment).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assisted prompt ("Create Workout"):&lt;/strong&gt; a guided flow that collects preferences and generates the ideal prompt for those who don't know where to start or how to create a good workout prompt. Part of the planning for better user experience.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Original content:&lt;/strong&gt; exercise instructions and videos are human-made (not AI-generated), produced by the author with support from professionals. All execution videos were recorded exclusively for this app.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faczlyrpe7ajlk096f3fx.jpg" alt="Page AI MobiFit" width="500" height="1082"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcxu4501tcn3qpo4dti5p.jpg" alt="Prompt Form" width="500" height="1082"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Febqnfoqe96j2d5g3wwi7.jpg" alt="Exercise Block" width="500" height="1082"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Page AI MobiFit&lt;/td&gt;
&lt;td&gt;AI MobiFit Prompt Form&lt;/td&gt;
&lt;td&gt;Exercise Block&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Agent Architecture
&lt;/h3&gt;

&lt;p&gt;The received message mixes text and structured data in blocks (e.g., exercises, diet, actions). These blocks feed dynamic cards and app actions. Each request is routed to a specific agent.&lt;/p&gt;

&lt;p&gt;A request is received by an Edge Function, which executes an AI agent integrated with an LLM model, streaming the response.&lt;/p&gt;

&lt;p&gt;For workouts, exercises are grouped by day, with options to save to "My Workouts," where you can create sessions, share with other users, or generate a custom photo for Instagram.&lt;/p&gt;

&lt;p&gt;The agent is context-aware: in addition to chat history, it retrieves the user's progress and preferences (when authenticated).&lt;/p&gt;

&lt;h2&gt;
  
  
  Product Design and UX: Unblocked Journey
&lt;/h2&gt;

&lt;p&gt;The proposition is simple: start training before signing up.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unblocked journey:&lt;/strong&gt; no login, no forms, and no permissions for most initial features.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content by level:&lt;/strong&gt; library for beginner, intermediate, and advanced, with video, image, and text instructions—all material is human-made and copyrighted by the author.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meaningful gamification:&lt;/strong&gt; coins, medals, and rankings that reward consistency.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social:&lt;/strong&gt; groups with internal feed for posts, workouts, and materials; useful space for anamnesis with students/clients.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three languages from first access.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design principle:&lt;/strong&gt; reduce effort in the first minutes after installing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gamification and Group Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Goals and Challenges
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Goals:&lt;/strong&gt; Individual with an end date; users check in daily by marking a workout as completed or in the goals menu.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Challenges:&lt;/strong&gt; Group-based. Check-in is a post in the group (can include physical activity data and photo); the challenge period can be defined or continuous.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsk6nfwxfsigfx9ihnmeu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsk6nfwxfsigfx9ihnmeu.jpg" alt="MobiFit Medals" width="500" height="1082"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Coins, Medals, and Rankings
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Coins:&lt;/strong&gt; practically every relevant action earns coins.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medals:&lt;/strong&gt; mark specific achievements.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ranking:&lt;/strong&gt; in challenges, classification uses members' check-ins.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Groups
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Highly configurable with administrators.
&lt;/li&gt;
&lt;li&gt;Allow making workouts available to everyone (each member can add to their personal list).
&lt;/li&gt;
&lt;li&gt;Members have "profiles."
&lt;/li&gt;
&lt;li&gt;Anamnesis sent by members is visible only to administrators (ideal for personal trainers and coaches).
&lt;/li&gt;
&lt;li&gt;Currently the only feature that requires authentication.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7qgzw4kklsgz2hz8pxeo.jpg" alt="MobiFit Group" width="500" height="1082"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11n5aj41ouo0lawuz7ff.jpg" alt="Group Post Feed" width="500" height="1082"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MobiFit Group&lt;/td&gt;
&lt;td&gt;Group Post Feed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Local-First
&lt;/h2&gt;

&lt;p&gt;Data is persisted locally and, when there's internet, synchronized with the cloud (if the user is authenticated). Otherwise, it remains only on the device.&lt;/p&gt;

&lt;p&gt;Synchronization uses a simple last-sync strategy: the app stores local date/time and compares with cloud data to decide what prevails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; exercise library and workouts fully usable offline, including edits, progress, and gamification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workouts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Hierarchy:&lt;/strong&gt; Plan → Workouts → Exercises&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plans contain multiple workouts.
&lt;/li&gt;
&lt;li&gt;Workouts contain exercises and can be:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MobiFit Workouts:&lt;/strong&gt; ready-made, created by professionals for the app.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My Workouts:&lt;/strong&gt; User-exclusive, created by them, by AI, or received from someone else (like friends or professionals).
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;When opening a plan, the date of the last day on which training sessions were performed in the same week is displayed.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqufak5mmwhaf4h492h1f.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqufak5mmwhaf4h492h1f.jpg" alt="MobiFit Workouts" width="500" height="1082"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Social and Sharing (Groups + Instagram Stories)
&lt;/h2&gt;

&lt;p&gt;Upon completing a workout or logging an individual activity, a sharing modal appears.&lt;/p&gt;

&lt;p&gt;You can publish to the internal group and/or Instagram Stories—with sticker options.&lt;/p&gt;

&lt;p&gt;Photos taken vertically are cropped internally to 4:5 for the group feed; on Stories, they go without cropping. The crop marking is displayed at the moment of capture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Main Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Expo React Native
&lt;/li&gt;
&lt;li&gt;Supabase (with Edge Functions)
&lt;/li&gt;
&lt;li&gt;Cloudflare R2&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About MobiFit
&lt;/h2&gt;

&lt;p&gt;MobiFit is born from a design goal: enabling the first step without friction.&lt;/p&gt;

&lt;p&gt;AI acts as a contextual copilot, local-first architecture ensures fluidity in the real world, and the social layer sustains motivation.&lt;/p&gt;

&lt;p&gt;All of this in an app with curated original content, multilingual, designed for beginners and experienced trainers alike—in a human, creative, and accessible way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;In development:&lt;br&gt;
wearable integration, such as watches, the Diet page, and new AI agents.&lt;br&gt;&lt;br&gt;
Expanding original media content.&lt;/p&gt;

</description>
      <category>sideprojects</category>
      <category>showdev</category>
      <category>ai</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Bun. Será o fim do node?</title>
      <dc:creator>Raphael Ramos</dc:creator>
      <pubDate>Mon, 25 Sep 2023 22:31:47 +0000</pubDate>
      <link>https://dev.to/raphaelramos/bun-sera-o-fim-do-node-k12</link>
      <guid>https://dev.to/raphaelramos/bun-sera-o-fim-do-node-k12</guid>
      <description>&lt;p&gt;Lembrando para os mais novos na área que o Node não é uma linguagem, e sim o runtime que executa o JavaScript.&lt;/p&gt;

&lt;p&gt;E é apenas um deles, temos outros, mas nenhum conseguiu chegar perto de tirar o reinado do Node.&lt;/p&gt;

&lt;p&gt;E o assunto recente é o &lt;a href="https://bun.sh/" rel="noopener noreferrer"&gt;Bun&lt;/a&gt;, que veio com a intensão mudar isso e ser um substituto superior.&lt;br&gt;
Também é o primeiro que tem um emoji como logo…&lt;/p&gt;

&lt;p&gt;Inclusive a Vercel já disponibilizou suporte para o gerenciador de pacotes dele, que promete ser 25x mais rápido que o npm.&lt;/p&gt;

&lt;p&gt;A Vercel utiliza outro runtime baseado em edge (que são aplicações serverless que rodam na região do cloud mais perto do usuário e com isso menor latência), e esse runtime usa menos recursos, tem o cold start, o tempo de inicialização, instantâneo, mas não suporta todas APIs do Node.&lt;/p&gt;

&lt;p&gt;É essa busca por desempenho se torna maior até pelo recente crescimento das aplicações Server Side, aonde parte do código do front é executado no servidor e o cliente recebe menos JavaScript, já que muita já vem renderizada. Diferente das aplicações SPA, onde o cliente baixa e executa todo JavaScript. Então o Runtime passa a ser também importante para o front-end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ecossistema JavaScript&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Antes de falar se haverá o fim do Node, quero fazer alguns comentários como anda a comunidade JavaScript.&lt;/p&gt;

&lt;p&gt;Não há muito padrões, principalmente no front.&lt;br&gt;
Quem nunca viu memes de que todo dia nasce uma biblioteca nova e de milhões de pacotes vindo ao executar npm install.&lt;/p&gt;

&lt;p&gt;Isso é ruim porque traz uma fragmentação do ecossistema e é a maior crítica a linguagem, mas que não é um problema da linguagem e sim da comunidade.&lt;br&gt;
Apesar disso, o JavaScript continua sendo uma boa linguagem e com nível de performance até melhor que outras grandes para algumas tarefas e com ótimas bibliotecas.&lt;br&gt;
Segundo ranking do GitHub em 2022 tivemos o JavaScript como linguagem mais usada e TypeScript como quarta.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typescript&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;É por falar de Typescript, vira e mexe alguém vem o criticar e defender o JavaScript puro. O DHH, criado do Ruby on Rails removeu o TypeScript do Turbo 8, mesmo a maioria da comunidade tendo votado contra, incluindo o segundo maior contribuidor, mas ele fez o merge e pronto.&lt;/p&gt;

&lt;p&gt;Mais ou menos no estilo “não querem aprovar meu PR? Eu mesmo aprovo”.&lt;/p&gt;

&lt;p&gt;Alguns ainda defendem seguir o caminho que o Svelte teve e substituir o TypeScript pelo JSDoc para tipagem, que é uma anotação, mas não tem o bloqueio de compilação.&lt;/p&gt;

&lt;p&gt;Eu lembro quando o Angular 2 chegou forçando o TypeScript, pessoal falou que era loucura, mas no fim virou padrão de mercado. A maioria dos grandes projetos que eu tenho conhecimento hoje são nele.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O fim do Node chegou?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O bun não chega apenas querendo substituir o Node, mas traz uma DX (Experiência do desenvolvedor) melhor, vindo embutido várias ferramentas. Sendo não apenas um runtime, mas um toolkit de ferramentas, ajudando a eliminar um dos problemas que citei acima do ecossistema do JavaScript, que é a grande quantidade de bibliotecas necessárias para executar um projeto.&lt;/p&gt;

&lt;p&gt;Além disso a Oven, empresa por trás do desenvolvimento do bun, recebeu um aporte de 7 milhões de dólares e está contratando desenvolvedores em Zig e C++ para trabalhar full time no Bun.&lt;/p&gt;

&lt;p&gt;Apesar disso tudo, quando uma empresa vai escolher a stack de um novo projeto, ela não diz apenas, “vamos ver o que está no hype ou qual é a mais rápida?”. É também levado em consideração estabilidade e tamanho da comunidade.&lt;br&gt;
Node tem mais de 12 anos e está na versão 20, o que passa confiança no mercado. Tem projetos que começam com tudo, mas acabam com pouca adoção e ficando sem suporte depois.&lt;/p&gt;

&lt;p&gt;O Bun acabou de receber a sua primeira versão estável. Isso não quer dizer que ninguém vai usar, mas que não haverá, por agora, uma adoção em massa e nem matará o Node, que continua firme e forte, pelo menos por um tempo.&lt;/p&gt;

&lt;p&gt;Inclusive foi questionado pelo Trev Norris, importante colaborador do Node, se o Bun irá conseguir manter toda essa performance ao implementar ferramentas de monitoramento.&lt;/p&gt;

&lt;p&gt;Mas já podemos esperar vagas pedindo 5 anos de experiência em Bun. (Aviso de ironia)&lt;/p&gt;

&lt;p&gt;Me siga para mais conteúdo desse tipo.&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/raphaelramosbr" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/@raphaelramosbr?sub_confirmation=1" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.instagram.com/raphaelramos.br" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt;&lt;br&gt;
&lt;a href="https://twitter.com/raphaelramosbr" rel="noopener noreferrer"&gt;X&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Clean Code - O básico a se fazer</title>
      <dc:creator>Raphael Ramos</dc:creator>
      <pubDate>Thu, 22 Jun 2023 02:38:55 +0000</pubDate>
      <link>https://dev.to/raphaelramos/clean-code-o-basico-a-se-fazer-3kec</link>
      <guid>https://dev.to/raphaelramos/clean-code-o-basico-a-se-fazer-3kec</guid>
      <description>&lt;p&gt;Vamos falar sobre uma boa prática da programação, o Clean Code. &lt;br&gt;
Eu não gosto de complicar muito o assunto e acho que alguns exageram (over-engineering). Claro que com o tempo e maior senioridade você vai muito além, mas quero demonstrar algumas coisas mínimas que eu acredito que todo Dev deve fazer.&lt;/p&gt;

&lt;p&gt;Prática difundida devido ao livro do Robert C. Martin (Conhecido na comunidade como Uncle Bob). Ele percebeu que maior parte do tempo gasto em programação é para dar manutenção em código.&lt;/p&gt;

&lt;p&gt;O objetivo do clean Code, ou código limpo, é ter o código simples, com uma leitura clara e objetiva.&lt;/p&gt;

&lt;p&gt;Um código sujo pode ser um dos grandes problemas que causam todo esse tempo, considerando a dificuldade em entender o que foi feito por outro dev ou ter funções com várias responsabilidades, o que dificulta alterações.&lt;/p&gt;

&lt;p&gt;Mas se você está começando na área agora, nem está procurando vagas, esquece isso. Foca em aprender o básico da programação, depois você vê sobre boas práticas.&lt;/p&gt;

&lt;p&gt;Vou demostrar alguns exemplos em JavaScript, mas o conceito é aplicável em todas as linguagens.&lt;/p&gt;

&lt;p&gt;Além desses que vou chamar de "Padrões de Mercado", há também os padrões definidos por times.&lt;/p&gt;

&lt;p&gt;Disclaimer: Você não precisa fazer exatamente como eu demonstro, diferente pode não ser errado, se considerar os princípios de código limpo.&lt;/p&gt;
&lt;h2&gt;
  
  
  Nomes
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Bad&lt;/span&gt;
&lt;span class="c1"&gt;// Use explanatory variables&lt;/span&gt;

&lt;span class="nx"&gt;complete&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nx"&gt;elapsedTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="nx"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;moment&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YYYY/MM/DD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Raphael&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;addToDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;days&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;days&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nf"&gt;addToDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;No exemplo acima vemos que os nomes das variáveis e da função não deixa muito claro qual o valor. Aqui tem apenas um trecho de código então é fácil identificar, mas imagina em um projeto grande.&lt;/p&gt;

&lt;p&gt;No Clean Code comentários no código devem ser usados exclusivamente para documentar e não explicar a função do código, o nome dele deve ser claro o suficiente.&lt;/p&gt;

&lt;p&gt;Um bom exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Good&lt;/span&gt;

&lt;span class="nx"&gt;isComplete&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nx"&gt;elapsedTimeinDays&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="nx"&gt;currentDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;moment&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YYYY/MM/DD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;userName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Raphael&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;addDaysToDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todayDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;days&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todayDate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;days&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;todayDate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nf"&gt;addToDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todayDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Funções
&lt;/h2&gt;

&lt;p&gt;O ideal seria que uma função não tivesse mais de 3 parâmetros. Para quem não a criou saber exatamente como os valores são esperados, quando há muitas, pode ser trabalhoso e também de gerar testes.&lt;/p&gt;

&lt;p&gt;Uma função que tem mais de uma responsabilidade também não é considerada uma boa prática.&lt;/p&gt;

&lt;p&gt;Primeiro princípio do &lt;code&gt;SOLID&lt;/code&gt;, Single Responsability Principle, ou Princípio da Responsabilidade Única, diz que “uma classe deve ter apenas um motivo para mudar”, ou seja, deve ter uma única responsabilidade. No Código abaixo a função tem duas responsabilidades, criar usuário e enviar email.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Bad&lt;/span&gt;
&lt;span class="c1"&gt;// Use 2 or fewer ideally arguments&lt;/span&gt;
&lt;span class="c1"&gt;// The function must have single responsibility&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createUserAndSendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;jobId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email sent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;createUserAndSendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Raphael&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Uberlândia&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao invés de vários parâmetros, você pode passar um objeto.&lt;br&gt;
Também pode separar as responsabilidades, tornando a função com &lt;br&gt;
responsabilidade única.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Good&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;jobId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;active&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email sent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Raphael&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Uberlândia&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;jobId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Condicionais
&lt;/h2&gt;

&lt;p&gt;Podemos evitar If Else aninhados usando a prática de &lt;code&gt;early return&lt;/code&gt;, que consiste em você verificar o oposto do que deseja e retornar o mais rápido possível para encerrar a função.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Bad&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;checkShipping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;totalToFreeShipping&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;isNaN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;totalToFreeShipping&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;totalPrice&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;totalToFreeShipping&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;setFreeShipping&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;calculateShipping&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Value is not valid!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;checkShipping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora com early return.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;checkShipping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;totalToFreeShipping&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Early return. Validate possible problems before the “happy path”&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isNaN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;totalToFreeShipping&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Value is not valid!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;totalPrice&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;totalToFreeShipping&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;setFreeShipping&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;calculateShipping&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;checkShippin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um exemplo com &lt;code&gt;Object Literals&lt;/code&gt;, evitando um switch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Bad&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Subscriber&lt;/span&gt;

&lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nx"&gt;ADMINISTRATOR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AdministratorUser&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nx"&gt;EDITOR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;EditorUser&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nx"&gt;Subscriber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SubscriberUser&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Good&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Subscriber&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;components&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;ADMINISTRATOR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AdministratorUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;EDITOR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EditorUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;Subscriber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SubscriberUser&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;components&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Componenent&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Componentização no Front-end
&lt;/h2&gt;

&lt;p&gt;Com componentes menores temos a reutilização de trechos de código, o isolamento de contexto e a melhor legibilidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;Repositório com os exemplos: &lt;a href="https://github.com/raphaelramos/cleancode-examples/" rel="noopener noreferrer"&gt;https://github.com/raphaelramos/cleancode-examples/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você também pode conferir em vídeo onde demostro em live coding:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=UohXe6ceqeQ" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F225w51nng73x5eiu1x1v.png" alt="Vídeo Clean Code Exemplos" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Você deve usar tailwindcss!</title>
      <dc:creator>Raphael Ramos</dc:creator>
      <pubDate>Tue, 16 May 2023 13:33:42 +0000</pubDate>
      <link>https://dev.to/raphaelramos/voce-deve-usar-tailwindcss-3b3f</link>
      <guid>https://dev.to/raphaelramos/voce-deve-usar-tailwindcss-3b3f</guid>
      <description>&lt;p&gt;Claro, o uso é relativo, já que uma ferramenta que se encaixe em um projeto não significa ser a ideal em todos os outros. Mas agora que consegui sua atenção com o título, veja alguns motivos para considerar usar o tailwind no seu projeto.&lt;/p&gt;

&lt;p&gt;Podemos dividir frameworks CSS nas categorias Components e Utility como veremos a seguir.&lt;/p&gt;

&lt;p&gt;Diferente de outros populares frameworks de CSS, como o bootstrap, que traz o design pronto com estilização (components), o tailwind traz classes para você criar seu próprio design (utility).&lt;/p&gt;

&lt;p&gt;Seu código vai ficar cheio de classes e parecer feio, o que mais incomoda alguns devs, porém isso vem com ganhos de velocidade no desenvolvimento após o domínio da ferramenta.&lt;/p&gt;

&lt;p&gt;Lembre-se da letra S (Single Responsability Principle) do SOLID para que seu código não fique sujo. Então não crie componentes complexos e grandes, do contrário, use outra solução de CSS para seu HTML não ficar enorme.&lt;/p&gt;

&lt;p&gt;Pontos que me fizeram optar pelo tailwind em meus projetos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maior controle na linguagem visual, mais leve por usar apenas as classes necessárias e vai melhorar seu conhecimento de estilos CSS em comparação a um framework de componentes.&lt;/li&gt;
&lt;li&gt;Curva de aprendizagem não muito alta. As classes utilitárias de tamanho são abreviações de estilos CSS. Por exemplo, &lt;code&gt;padding-bottom: 10px&lt;/code&gt; é a classe &lt;code&gt;pb-10&lt;/code&gt; e definir a classe apenas para um tamanho de tela também é simples com um prefixo. Para dispositivos de tamanho médio seria &lt;code&gt;md:pb-10&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Tudo pode ser personalizado. Use o arquivo tailwind.config.js para criar seu próprio Design System. Você pode levar seus tokens de UI para lá;&lt;/li&gt;
&lt;li&gt;Traz padronização desde o início do seu projeto, como múltiplos de 8 e unidade rem;&lt;/li&gt;
&lt;li&gt;Adotado por grandes empresas;&lt;/li&gt;
&lt;li&gt;Exibido na documentação do Next.js;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dica: Extensão Tailwind CSS IntelliSense para VS Code.&lt;/p&gt;

&lt;p&gt;Crie um tema no &lt;a href="https://tailwindcss.com/docs/configuration" rel="noopener noreferrer"&gt;arquivo de configurações&lt;/a&gt; para definir as cores, fontes e espaços, os design tokens. Se houver uma modificação, você não vai precisar trocar todas as classes do código.&lt;/p&gt;

&lt;p&gt;Além do já citado bootstrap, temos outras atraentes, como o styled components, Chakra UI e Material Design.&lt;br&gt;
É necessário analisar qual se enquadra melhor no seu projeto. Eu defendo mais CSS puro ou tailwind pelos motivos já listados.&lt;/p&gt;

&lt;p&gt;Esse artigo é sobre frameworks e não Tailwind vs CSS. Há quem prefira o CSS puro e ter menos classes no HTML, o que também é válido.&lt;/p&gt;

&lt;p&gt;Único caso que não recomendaria qualquer tipo de framework é na criação de libs. Aliás, quando menos dependências em libs melhor.&lt;/p&gt;

&lt;p&gt;Se você é iniciante recomendo estudar bootstrap, que possui curva de aprendizagem baixa e é usada também no mercado e depois partir para estudar uma solução de utilitários como o tailwind e aprender CSS. Todos Devs front-end tem que saber no mínimo o básico de CSS!&lt;/p&gt;

&lt;p&gt;Bootstrap venceria em um cenário &lt;br&gt;
em que você precise desenvolver um produto rápido e já estilizado, já o tailwind onde você já tem um Design System próprio.&lt;/p&gt;

&lt;p&gt;Confira o ranking dos frameworks CSS em 2022&lt;/p&gt;

&lt;p&gt;&lt;a href="https://2022.stateofcss.com/en-US/css-frameworks/" rel="noopener noreferrer"&gt;https://2022.stateofcss.com/en-US/css-frameworks/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>css</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Melhorias de performance recentes no ecossistema JavaScript</title>
      <dc:creator>Raphael Ramos</dc:creator>
      <pubDate>Mon, 24 Apr 2023 19:39:04 +0000</pubDate>
      <link>https://dev.to/raphaelramos/melhorias-de-performance-recentes-no-ecossistema-javascript-10ej</link>
      <guid>https://dev.to/raphaelramos/melhorias-de-performance-recentes-no-ecossistema-javascript-10ej</guid>
      <description>&lt;p&gt;Houve muitas melhorias recentes nas principais ferramentas JS.&lt;br&gt;
Vamos focar aqui apenas nas voltadas a performance nas versões recentes do Angular 16, Next.js 13 e Node.js 20.&lt;/p&gt;
&lt;h2&gt;
  
  
  Angular 16
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Servidor de desenvolvimento baseado no vite&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Com a performance muito superior ao Webpack, a ferramenta aproveita duas melhorias feitas recentemente no ecossistema JavaScript: a disponibilidade de ES Modules no navegador e as ferramentas de empacotamento de compilação para nativo, como esbuild.&lt;br&gt;
Teremos uma execução e atualização mais rápida no ng serve ao usar a configuração abaixo ou no angular 16.1 &lt;code&gt;ng serve --force-esbuild&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"serve"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"builder"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@angular-devkit/build-angular:dev-server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"forceEsbuild"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Hidratação não destrutiva&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Já disponível há algum tempo no Next.js, a hidratação no desenvolvimento da Web refere-se ao processo de conversão de conteúdo HTML renderizado do lado do servidor em uma página da Web totalmente interativa e funcional no lado do cliente, anexando comportamento JavaScript e ouvintes de evento. Isso reduz o tempo de interação. &lt;a href="https://angular.io/guide/hydration" rel="noopener noreferrer"&gt;Documentação para implementação.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signals&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;São uma nova maneira de gerenciar mudanças de estado em aplicativos Angular, inspirados no Solid.js.&lt;/p&gt;

&lt;p&gt;É poderoso como o RxJS, mas com uma sintaxe mais simples. As assinaturas são criadas e destruídas automaticamente, então ao contrário do RxJS, não precisamos inscrever e cancelar a inscrição.&lt;/p&gt;

&lt;p&gt;Graças ao Signals, podemos usar o Angular sem zone.js, que não possui uma boa performance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Testes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Por padrão o Angular sempre utilizou o framework de testes Jasmine com o executor Karma, que utiliza um navegador real. Agora há o suporte experimental para o Jest, que possui execução direta no Node sem usar um navegador real e por isso tem um desempenho melhor. É necessário uma modificação do arquivo &lt;code&gt;angular.json&lt;/code&gt; para substituir o framework de testes para Jest.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="nl"&gt;"projects"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="nl"&gt;"my-app"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; 
      &lt;/span&gt;&lt;span class="nl"&gt;"architect"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; 
        &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; 
          &lt;/span&gt;&lt;span class="nl"&gt;"builder"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"@angular-devkit/build-angular:jest"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
          &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; 
            &lt;/span&gt;&lt;span class="nl"&gt;"tsConfig"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;" tsconfig.spec.json "&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
            &lt;/span&gt;&lt;span class="nl"&gt;"polyfills"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"zone.js"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"zone.js/testing"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; 
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; 
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A equipe do Angular ainda vê valor em testes baseados em navegador (como o Jasmine). Foi adicionado o Web Test Runner para substituir o executor de testes Karma, integrado com o Jasmine. Você pode executar &lt;code&gt;ng update&lt;/code&gt; para migrar os testes Karma existentes para o Web Test Runner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NgOptimizedImage&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Do Angular 15, mas inclui por ainda não ser tão conhecido.&lt;br&gt;
Essa diretiva é responsável por implementar as melhores práticas de desempenho ao carregar imagens.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NgOptimizedImage&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt; &lt;span class="nx"&gt;ngSrc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cat.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Observação&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Temos visto nas últimas versões do Angular uma buscar em diminuir a curva de aprendizagem e grandes melhorias de performance. Pontos que eram muito mais fortes no React.&lt;/p&gt;

&lt;p&gt;Confira também meu artigo sobre &lt;a href="https://raphaelramos.dev/blog/angular-standalone-components/" rel="noopener noreferrer"&gt;componentes autônomos.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Next 13
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;React Server Components&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O Next 13 possui a pasta /app, que diferente da /pages, os componentes dentro dela são React Server Components por padrão.&lt;br&gt;
Combinando a interatividade dos aplicativos do lado do cliente com o desempenho aprimorado da renderização tradicional do servidor.&lt;br&gt;
Os layouts nessa pasta permanecem interativos e não são renderizados novamente ao navegar entre várias páginas. Estável a partir da versão 13.4.&lt;br&gt;
&lt;a href="https://nextjs.org/docs/app/building-your-application/upgrading/app-router-migration#migrating-from-pages-to-app" rel="noopener noreferrer"&gt;Doc migração pages para app&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Turbopack&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A Vercel, mantenedora do Next.js, afirmou que, em aplicativos de grande escala, o Turbopack, escrito em Rust, atualiza 10 vezes mais rápido que o Vite e 700 vezes mais rápido que o Webpack.&lt;br&gt;
Ainda na versão beta, é necessário iniciar o servidor com a flag &lt;code&gt;next dev --turbo&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Componente de imagem&lt;/strong&gt;&lt;br&gt;
Agora o componente usa carregamento lento em vez de hidratação, tornando os tempos de carregamento mais rápidos e envia menos JavaScript do lado do cliente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Image&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/image&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Example&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;grid-element&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Image&lt;/span&gt;
      &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/example.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="nx"&gt;fill&lt;/span&gt;
    &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Otimização de fontes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Otimizará automaticamente suas fontes (incluindo fontes personalizadas) e removerá solicitações de rede externa para melhorar a privacidade e o desempenho.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// pages/index.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Inter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/font/google&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../styles/component.module.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Inter&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;variable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--inter-font&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* styles/component.module.css */&lt;/span&gt;
&lt;span class="nc"&gt;.text&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--inter-font&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;italic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Node 20
&lt;/h2&gt;

&lt;p&gt;Atualização da engine V8 para 11.3, parte do Chromium 113, trazendo melhor desempenho e novos recursos de linguagem.&lt;br&gt;
Melhorias no tempo de tempo de execução em &lt;code&gt;URL&lt;/code&gt;, &lt;code&gt;fetch()&lt;/code&gt;e &lt;code&gt;EventTarget&lt;/code&gt;. Além disso, o pacote inclui o lançamento de um analisador de URL de alto desempenho: Ada 2.0, escrito em C++.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>frontend</category>
      <category>node</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Angular standalone components</title>
      <dc:creator>Raphael Ramos</dc:creator>
      <pubDate>Fri, 14 Apr 2023 21:15:57 +0000</pubDate>
      <link>https://dev.to/raphaelramos/angular-standalone-components-67i</link>
      <guid>https://dev.to/raphaelramos/angular-standalone-components-67i</guid>
      <description>&lt;p&gt;Vídeo desenvolvendo na prática:&lt;br&gt;
&lt;a href="http://www.youtube.com/watch?v=CB88oX_eI-g" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpyet1i2na6x6iz7klg0t.png" alt="Vídeo sobre Angular standalone components" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A estrutura do Angular é baseada em componentes.&lt;br&gt;
Os Componentes são partes de interface. Blocos compostos por um template, um estilo e uma classe.&lt;/p&gt;

&lt;p&gt;Antes do Angular 14 era necessário um módulo, que é um mecanismo para agrupar components, directives, pipes e services relacionados.&lt;/p&gt;

&lt;p&gt;Mas agora com as APIs do standalone components, pode ser totalmente independente, deixando NgModule opcional, o que torna a criação de aplicativos Angular mais simplificada.&lt;/p&gt;

&lt;p&gt;Os módulos não foram descontinuados e ainda podem ser usados. Inclusive é possível usar componentes com módulos e sem na mesma aplicação.&lt;br&gt;
Eu tenho criados novos componentes das aplicações com essa API, mas ainda não migrei as anteriores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Etapas executas no vídeo:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Criamos o projeto&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng new angular-standalone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criamos o componente verses passando a flag --standalone&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng generate component verses &lt;span class="nt"&gt;--standalone&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao usar a flag, foi criado nosso componente sem o arquivo de módulos e com o sinalizador standalone: true e imports dentro do arquivo de componente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-verses&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;CommonModule&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./verses.component.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;styleUrls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./verses.component.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também criamos o serviço chamado verses na mesma pasta para consumo da API&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng generate service verses/verses
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;providedIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;VersesService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;httpClient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;HttpClient&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;getVerse&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Verse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;httpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Verse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www.abibliadigital.com.br/api/verses/nvi/sl/23&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos adicionar o serviço e modulo HttpClientModule no nosso componente&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-verses&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;CommonModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;HttpClientModule&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;VersesService&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./verses.component.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;styleUrls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./verses.component.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para carregar a rota desse componente em lazy loading, o que faz carregar apenas ao acessar a rota, usamos o loadComponent;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Verses&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;loadComponent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./verses/verses.component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VersesComponent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você está em uma versão do Angular anterior a 13, recomendo o upgrade devido a ganhos de performance que essa versão traz.&lt;br&gt;
Na versão 14 foi introduzido principalmente o standalone components, e se tornou estável na versão 15.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/raphaelramos/angular-standalone-components" rel="noopener noreferrer"&gt;GitHub Projeto&lt;/a&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Como se tornar um desenvolvedor</title>
      <dc:creator>Raphael Ramos</dc:creator>
      <pubDate>Fri, 14 Apr 2023 19:55:39 +0000</pubDate>
      <link>https://dev.to/raphaelramos/como-se-tornar-um-desenvolvedor-59m5</link>
      <guid>https://dev.to/raphaelramos/como-se-tornar-um-desenvolvedor-59m5</guid>
      <description>&lt;p&gt;O desenvolvedor é um profissional programador, que escreve softwares, envolvido com o projeto do início ao fim.&lt;/p&gt;

&lt;p&gt;Confira algumas dicas para você que está iniciando na área.&lt;/p&gt;

&lt;p&gt;Estudos - Vagas - Dúvidas Frequentes&lt;/p&gt;

&lt;h2&gt;
  
  
  Estudos
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Aprenda a diferença entre as carreiras&lt;/strong&gt;&lt;br&gt;
Qual a diferença entre Front-end e Back-end? E o que são DevOps e Cientista de dados?&lt;/p&gt;

&lt;p&gt;Você precisa, antes de tudo, saber responder essas perguntas e é possível encontrar artigos na internet e vídeos no YouTube sobre isso.&lt;/p&gt;

&lt;p&gt;Há também os profissionais de UI/UX e QA, que não estão tão ligados à programação e não iremos falar sobre eles, mas podem fazer parte dos projetos e você precisa conhecer suas funções.&lt;/p&gt;

&lt;p&gt;Links:&lt;br&gt;
&lt;a href="https://blog.geekhunter.com.br/back-end-front-end/" rel="noopener noreferrer"&gt;Diferença Front-end e Back-end&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.devmedia.com.br/devops-conheca-os-papeis-do-desenvolvedor/34103" rel="noopener noreferrer"&gt;DevOps&lt;/a&gt;&lt;br&gt;
&lt;a href="https://programathor.com.br/blog/voce-sabe-o-que-e-cientista-de-dados-conheca-essa-profissao-do-futuro/" rel="noopener noreferrer"&gt;Cientista de dados&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escolha uma carreira&lt;/strong&gt;&lt;br&gt;
Agora que você sabe as diferenças, deve escolher em qual vai começar a sua carreira.&lt;br&gt;
Dica: Confira se você se empolga mais com a parte visual, com a parte funcional ou como tudo isso consegue ficar na nuvem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aprenda lógica de programação&lt;/strong&gt;&lt;br&gt;
Mais uma vez, há muito conteúdo na internet sobre isso. Sem entender a lógica, você não vai conseguir codificar.&lt;/p&gt;

&lt;p&gt;Links:&lt;br&gt;
&lt;a href="https://www.linkedin.com/learning/paths/fundamentos-para-desenvolvimento-de-software-por-microsoft-e-linkedin?src=re-other&amp;amp;veh=raphaelramos.dev" rel="noopener noreferrer"&gt;Fundamentos para Desenvolvimento de Software&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=Ol8KcAc7N2c" rel="noopener noreferrer"&gt;Como Funcionam as linguagens&lt;/a&gt;&lt;br&gt;
&lt;a href="https://youtube.com/watch?v=LA2L4OsYrY0" rel="noopener noreferrer"&gt;Como melhorar minha lógica de programação?&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.alura.com.br/artigos/algoritmos-e-logica-de-programacao" rel="noopener noreferrer"&gt;Algoritmos e lógica de programação&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Defina sua stack principal baseado na carreira que vai seguir&lt;/strong&gt;&lt;br&gt;
Agora que você entende sobre as carreiras e também tem noção de lógica de programação, vamos para as linguagens.&lt;/p&gt;

&lt;p&gt;É importante essa definição para saber onde começar seus estudos, já que há várias linguagens. Dentro da sua Stack, escolha quais linguagens que irá aprender primeiro, que serão suas hard skills.&lt;/p&gt;

&lt;p&gt;Desenvolvedores não são todos iguais e não sabem tudo. Há várias stacks. Assim como, por exemplo, temos médicos ortopedistas, cardiologistas, pediátricos...&lt;/p&gt;

&lt;p&gt;Para front-end, você deve saber a linguaguem JavaScript / Typescript.&lt;br&gt;
No caso do front-end é necessário aprender também HTML e CSS para fazer a parte visual (HTML e CSS não são linguagens de programação).&lt;/p&gt;

&lt;p&gt;Obs: JavaScript e Java são linguagens diferentes e não tem ligação.&lt;/p&gt;

&lt;p&gt;Mobile, você pode escolher entre Java/Kotlin (Android), Swift (iOS) e as multi-plataforma ou híbridas como Flutter/Dart, React Native e Ionic.&lt;/p&gt;

&lt;p&gt;Back-end pode ser entre JavaScript, Java, C#, PHP, Go, Rust (e várias outras existentes). Também inclui bancos de dados como MySQL, postgreSQL, Oracle...&lt;/p&gt;

&lt;p&gt;Vou deixar o link para o ranking das principais usadas em 2022 segundo o GitHub. Dê preferência às que são mais usadas ou as que estão em crescimento.&lt;/p&gt;

&lt;p&gt;Listei alguns exemplos aqui, mas pesquise, passe tempo no Google, Youtube e converse com conhecidos da área.&lt;/p&gt;

&lt;p&gt;Obs: Posições somente front-end tem se tornado menores, devido uma buscar maior para full-stack, mas no começo foque em aprender apenas um e depois você amplia seu escopo de estudos.&lt;/p&gt;

&lt;p&gt;Mais importante que a linguagem é a implementação. Em certas coisas não há grande diferença de performance, depende mais do que o projeto precisa.&lt;/p&gt;

&lt;p&gt;Links:&lt;br&gt;
&lt;a href="https://octoverse.github.com/2022/top-programming-languages" rel="noopener noreferrer"&gt;Ranking GitHub linguagens&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.betrybe.com/tecnologia/stack-tecnologico/" rel="noopener noreferrer"&gt;Stack Tecnológico&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ainda não sei com o que começar&lt;/strong&gt;&lt;br&gt;
Se você chegou nessa parte sem saber com qual Stack começar, eu sempre digo, apenas comece e não demore.&lt;br&gt;
Depois que você aprendeu o mínimo de lógica e uma linguagem, é mais fácil mudar para outra.&lt;/p&gt;

&lt;p&gt;As escolha da sua linguagem principal depende muito da área que você deseja trabalhar, como front-end, back-end, mobile, devops, dados.&lt;br&gt;
Você pode começar com JavaScript, se ainda não sabe o que quer e migrar depois.&lt;/p&gt;

&lt;p&gt;Links:&lt;br&gt;
&lt;a href="https://www.rocketseat.com.br/discover" rel="noopener noreferrer"&gt;Comece do 0 com JavaScript - Rocketseat discovery gratuito&lt;/a&gt;&lt;br&gt;
&lt;a href="//htts://www.udemy.com/course/html5-css3-e-javascript-na-pratica-3-projetos"&gt;Curso gratuito HTML5, CSS3 e JavaScript&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.udemy.com/courses/development/?price=price-free&amp;amp;sort=popularity" rel="noopener noreferrer"&gt;Outros cursos gratuitos na Udemy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Procure um roadmap de estudos ou um curso completo do básico ao avançado&lt;/strong&gt;&lt;br&gt;
Não saia estudando aleatoriamente, tenha um plano de estudos. Não adianta você ter apenas um pouco de conhecimento de várias coisas, você precisa ser bom em algo. Tenha em mente que se você não está disposto a estudar algumas horas por dia, entrar na área a curto prazo não é para você.&lt;/p&gt;

&lt;p&gt;Exemplos de plataformas de cursos: rocketseat, alura, dio e udemy.&lt;br&gt;
Exemplos de faculdades EAD: descomplica, fiap.&lt;/p&gt;

&lt;p&gt;Crie projetos com o que você aprendeu e coloque-os no GitHub&lt;br&gt;
O GitHub será o seu portfólio, principalmente para você que está começando e não tem experiência em empresas para contar. Além disso, é requisito saber git para trabalhar como desenvolvedor.&lt;/p&gt;

&lt;p&gt;Crie um bom README para eles, pois isso é muito importante e é a primeira coisa que vemos assim que abrimos o repositório. Informe o que o projeto faz, as stacks usadas e como executar.&lt;/p&gt;

&lt;p&gt;Obs: Faculdade sozinha não te prepara para o mercado atual.&lt;br&gt;
Você precisa estudar além.&lt;/p&gt;

&lt;p&gt;Links:&lt;br&gt;
&lt;a href="https://github.com/arthurspk/guiadevbrasil" rel="noopener noreferrer"&gt;Guia extenso de informações&lt;/a&gt;&lt;br&gt;
&lt;a href="https://youtu.be/Yp0RRTdtkqY" rel="noopener noreferrer"&gt;Curso de Git &amp;amp; GitHub para completos iniciantes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Procure saber sobre o Scrum&lt;/strong&gt;&lt;br&gt;
Scrum é uma metodologia de trabalho ágil muito utilizada. Conhecer dará a você vantagem na entrevista e não deixará você perdido nas cerimônias quando começar a trabalhar.&lt;/p&gt;

&lt;p&gt;Links:&lt;br&gt;
&lt;a href="https://linkedin.com/pulse/um-resumo-de-tudo-que-voc%C3%AA-precisa-saber-sobre-o-scrum-netto" rel="noopener noreferrer"&gt;Resumo sobre Scrum&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.xpeducacao.com.br/processo-desenvolvimento-software/" rel="noopener noreferrer"&gt;Processo desenvolvimento de software&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Vagas
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Crie seu perfil no LinkedIn&lt;/strong&gt;&lt;br&gt;
O LinkedIn é uma rede social profissional onde as pessoas compartilham informações profissionais e relacionadas ao seu trabalho, permitindo também que você siga colegas de trabalho e pessoas influentes em sua área.&lt;/p&gt;

&lt;p&gt;O perfil do LinkedIn funciona como um currículo, onde você pode indicar a empresa em que trabalha, suas experiências anteriores, sua formação, seus certificados e suas habilidades.&lt;/p&gt;

&lt;p&gt;Dicas para o seu perfil:&lt;br&gt;
Crie sua URL personalizada com algo próximo ao seu nome.&lt;/p&gt;

&lt;p&gt;Evite selfies e escolha uma foto com boa iluminação e fundo clean.&lt;/p&gt;

&lt;p&gt;Em Sobre, coloque suas habilidades e quanto tempo trabalha com elas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Currículo&lt;/strong&gt;&lt;br&gt;
Atualmente o LinkedIn é a ferramenta mais importante para currículo de Devs, mas algumas empresas podem solicitar um PDF, então é importante tê-lo também.&lt;/p&gt;

&lt;p&gt;Descreva detalhado as tecnologias em que já atuou, por exemplo, ao invés de colocar apenas Javascript, insira se foi com Angular, React ou outro. E nas experiências profissionais também descreva o setor do produto em que trabalhou, como logística, finanças, varejo...&lt;/p&gt;

&lt;p&gt;Na seção pessoal do seu PDF, as únicas informações necessárias são seu nome completo, e-mail, telefone, cidade e os links para seu perfil do LinkedIn e GitHub.&lt;/p&gt;

&lt;p&gt;Links:&lt;br&gt;
&lt;a href="https://www.linkedin.com/help/linkedin/answer/a540994/salvar-um-perfil-como-pdf?lang=pt" rel="noopener noreferrer"&gt;Como exportar o LinkedIn em PDF&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Candidate-se a vagas&lt;/strong&gt;&lt;br&gt;
Há alguns sites para procurar vagas, como o LinkedIn, portal de vagas do Gupy e o próprio da empresa.&lt;/p&gt;

&lt;p&gt;Pesquise as vagas por sua principal stack, por exemplo, Java. Confirme a senioridade no título da vaga se é compatível com a sua: JR, PL, SR e confirme também se possui os requisitos obrigatórios.&lt;/p&gt;

&lt;p&gt;Porém &lt;strong&gt;sites de candidatura rápida&lt;/strong&gt;, como LinkedIn e Gupy você concorre com muitas candidaturas e seu curriculo pode nem ser visualizado. Conseguindo uma indicação interna de um funcionário ou contato direto com o recrutador, suas chances são muito maiores.&lt;/p&gt;

&lt;p&gt;É esperado que o júnior já tenha um bom conhecimento, mesmo que precise de ajuda em algumas coisas. Quem não tem é estagiário.&lt;/p&gt;

&lt;p&gt;Dica extra: Glassdoor é um site onde você encontra avaliações de empresas informadas de forma anônima por funcionários e seus salários.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Processo de entrevistas&lt;/strong&gt;&lt;br&gt;
O processo varia entre empresas, mas geralmente são 3 etapas.&lt;/p&gt;

&lt;p&gt;O recrutador entrará em contato para uma entrevista para verificar se você realmente possui todos os requisitos e falar sobre a vaga e a empresa. Nessa etapa, você pode tirar dúvidas sobre a empresa e a faixa salarial.&lt;/p&gt;

&lt;p&gt;Se continuar, agora é o momento da entrevista técnica ou teste. Na entrevista técnica um profissional da área fará perguntas técnicas dentro da vaga. Você não precisa saber tudo o que ele perguntar, pois será avaliado no geral. Vá sem medo, mesmo que você não passe, terá mais noção do que estudar.&lt;/p&gt;

&lt;p&gt;Quando há um teste técnico, pode ser por desafio, onde você desenvolve e envia depois o repositório no github ou o menos comum que é live coding, onde sua tela é compartilhada e vai desenvolvendo ao vivo o que é proposto.&lt;/p&gt;

&lt;p&gt;Se der continuidade, agora é o momento de entrevista com o gestor do time. O gestor irá te fazer perguntas sobre sua experiência e como lida com algumas situações.&lt;/p&gt;

&lt;p&gt;Em empresas como consultorias, você não vai trabalhar em um produto dela e sim no de um cliente que é outra empresa. Você será um consultor de uma empresa dentro de outra.&lt;/p&gt;

&lt;p&gt;Para cada etapa o recrutador irá te mandar um invite por email, onde haverá a data/horário e um link para você participar. O atraso pode acabar com a sua chance, por isso, entre antes.&lt;/p&gt;

&lt;p&gt;Use uma ferramenta de anotações para te ajudar a estudar e decorar os conceitos das linguagens e ferramentas.&lt;br&gt;
&lt;a href="https://youtu.be/E1_rSp0VdaY" rel="noopener noreferrer"&gt;Como usar o Notion.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dicas Extras:&lt;/strong&gt;&lt;br&gt;
Digas na entrevista os cursos que você está fazendo e os projetos que já desenvolveu, mesmo que em estudos.&lt;/p&gt;

&lt;p&gt;Saiba se virar e pesquisar! Você não precisa saber tudo, nem os sênior sabem tudo. Mas não conte com a empresa para te treinar, no máximo te oferecem acesso a uma plataforma de cursos. Apesar de poder contar com a ajuda dos seus colegas, eles têm as tarefas deles e não podem ser chamados a todo instante.&lt;/p&gt;

&lt;p&gt;Candidate no máximo de vagas que conseguir da sua senioridade e skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  Informações do Mercado
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=dMDjMkFkoHk" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzvy0aibazi91zsx6zmxb.png" alt="Mercado programação de sistemas para iniciantes" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dúvidas Frequentes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Todos pedem experiencia&lt;/strong&gt;&lt;br&gt;
Se você não tem experiência ou portfólio, dificilmente vai conseguir o primeiro emprego.&lt;br&gt;
Gestores técnicos não estão muito interessados na sua faculdade e cursos, mas no que você já desenvolveu.&lt;br&gt;
Algumas empresas podem considerar o portfólio para quem não tem experiencia.&lt;/p&gt;

&lt;p&gt;Em 2023 o mercado passou ser mais exigente e ter menos vagas para Júnior.&lt;/p&gt;

&lt;p&gt;Pare de apenas estudar e crie algo! &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como vou saber se já estou preparado para procurar uma vaga como júnior?&lt;/strong&gt;&lt;br&gt;
Uma maneira de você saber é se já conseguiu criar algo, mesmo que simples, mas funcional e publicou em um repositório git.&lt;br&gt;
Também saber os conceitos básicos da linguagem da vaga, já que vão te perguntar na entrevista técnica. É possível encontrar exemplos dessas perguntas de entrevistas na internet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qual o salário de um Júnior?&lt;/strong&gt;&lt;br&gt;
Salários variam levando em consideração stacks (tecnologias), empresas, cidade, experiência.&lt;/p&gt;

&lt;p&gt;Encontramos a média salarial de um júnior entre R$3.000 a R$4.000 e pleno entre R$6.500 a R$8.000. Sênior R$10.000 a R$12.000, porém o sênior pode ter um salário maior ainda, se tiver muitos anos de experiência comprovada, trabalhar com linguagens mais complexas, conhecimento em devops, inglês avançado, liderança, etc.&lt;/p&gt;

&lt;p&gt;Cada empresa possui sua política salarial, podendo esses valores serem menores.&lt;br&gt;
&lt;a href="https://pesquisa.codigofonte.com.br/" rel="noopener noreferrer"&gt;Pesquisa de salários do canal Código Fonte&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consigo entrar no mercado em 6 meses?&lt;/strong&gt;&lt;br&gt;
Eu diria que para o que o mercado atual espera, não. Se você tiver um plano de estudos organizado e dispor de tempo considerável diariamente, deve ser possível em menos de um ano. Mas é necessário disciplina, pois é muito conteúdo em pouco tempo e você precisa ter colocado em prática, mesmo que em projetos pessoais para estudos.&lt;/p&gt;

&lt;p&gt;Hoje as empresas exigem mais conhecimento do que há alguns anos, sendo necessário mais estudo inicial.&lt;/p&gt;

&lt;p&gt;Disclaimer: É uma área geralmente com bons salários, mas alto salário no primeiro emprego, sem experiência e com poucos meses de estudos, não existe atualmente. Há uma falsa divulgação sobre isso, colocando salário de pleno como sendo para júnior iniciante.&lt;/p&gt;

&lt;p&gt;Altos salários para Júnior seria em vagas internacionais, mas mesmo já possuindo um bom inglês, eles procuram um Júnior que já tenha experiência.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Preciso de faculdade?&lt;/strong&gt;&lt;br&gt;
Resumindo: Depende.&lt;/p&gt;

&lt;p&gt;Para ser desenvolvedor não é necessário graduação na área, então depende de a empresa exigir ou não. Há vagas que não exigem, apenas conhecimento equivalente, mas há empresas que colocam como requisito obrigatório completo ou cursando.&lt;br&gt;
Conheço excelentes desenvolvedores que nunca estiveram em uma faculdade, então é mais pelo requisito da vaga e seu plano de carreira. Já para cargos de gestão vai ser mais difícil fugir da faculdade.&lt;/p&gt;

&lt;p&gt;A faculdade não é algo supervalorizado, até porque diploma não comprova conhecimento, mas isso não torna ela desnecessária. Você vai aprender fundamentos da computação que não verá em cursos de linguagens. Para quem me pede meu conselho eu respondo: faça. Mas também escolha uma tecnologia e aprenda simultâneo. Você não vai sair da faculdade codando bem somente com ela. E também não espere a faculdade concluir para procurar sua primeira vaga.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que são as certificações?&lt;/strong&gt;&lt;br&gt;
Há também as certificações que você obtém realizando uma prova elaborada pela empresa desenvolvedora da tecnologia.&lt;/p&gt;

&lt;p&gt;Você não precisa ter feito faculdade para realizar essas provas, que são na maioria pagas e avançadas, e é um incremento muito alto para seu currículo.&lt;/p&gt;

&lt;p&gt;Essas certificações demonstram que a pessoa tem conhecimento avançado naquela Stack.&lt;br&gt;
Ex: AWS Certified Solutions Architect – Professional&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Preciso saber inglês?&lt;/strong&gt;&lt;br&gt;
Para ser um desenvolvedor você precisa de inglês básico, já que as linguagens de programação e suas documentações são em inglês.&lt;/p&gt;

&lt;p&gt;Já para vagas em que parte do time ou o cliente está no exterior, o inglês avançado será necessário, já que há conversação.&lt;/p&gt;

&lt;p&gt;Mas claro, há relatos de vagas que pediram inglês e o profissional nunca usou. Há empresas que enchem muito os requisitos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Posso ser Full Stack?&lt;/strong&gt;&lt;br&gt;
O desenvolvedor full Stack é o profissional que cobre várias áreas por trabalhar com mais tecnologias, desenvolvendo a aplicação de ponta a ponta, podendo ser front-end e back-end ao mesmo tempo.&lt;/p&gt;

&lt;p&gt;O full stack é um dos cargos mais procurados por empresas no Brasil.&lt;/p&gt;

&lt;p&gt;Porém, não indico no começo, por ter um escopo muito maior para estudos e experiências.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Um canal para você&lt;/strong&gt;&lt;br&gt;
Estou começando um canal no Youtube sobre a área e mercado. &lt;a href="https://www.youtube.com/@raphaelramosbr?sub_confirmation=1" rel="noopener noreferrer"&gt;Inscrever&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Diferença entre PJ e Cooperado&lt;/strong&gt;&lt;br&gt;
Como PJ você vai precisar ter um CPNJ ME para emitir uma nota fiscal para os pagamentos e pagar os impostos (depende do faturamento, mas cerca de 10%).&lt;br&gt;
Sem emitir nota fiscal, não te pagam.&lt;/p&gt;

&lt;p&gt;Como cooperado você não tem essa responsabilidade, a empresa faz todo tramite e cobra de você uma porcentagem para isso. Fora isso é como ser um PJ.&lt;/p&gt;

&lt;p&gt;Obs: A atividade de desenvolvedor não se enquadra como MEI e a empresa pode não aceitar. Nesse caso pode ser que você precise de um contador para abrir um ME.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PJ ganha mais que CLT?&lt;/strong&gt;&lt;br&gt;
A remuneração das vagas, mesmo que tenha os mesmos requisitos, tem variação entre empresas e o PJ de uma pode ficar próximo ao CLT de outra, em alguns casos.&lt;br&gt;
Deveria ser maior, mas não vemos muito isso.&lt;/p&gt;

&lt;p&gt;Vale destacar que em muitas é pago por hora, ao invés de valor fechado. Quando é por hora, há meses que você irá receber menos, por haver menos dias e feriados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como me preparar para um layoff?&lt;/strong&gt;&lt;br&gt;
As demissões em massa têm sido comuns em empresas de tecnologias e apesar da recolocação não ser muito demorada, pode acontecer. É importante que você tenha uma reserva em dinheiro para sobreviver um tempo, principalmente se for PJ ou cooperado, onde você recebe apenas as horas que já trabalhou. Pode ser um erro gastar totalmente o que ganha sem uma reserva.&lt;/p&gt;

&lt;p&gt;Trabalhe também na sua marca pessoal, estudando coisas novas, criando projetos pessoais, escrevendo artigos e participando de comunidades.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qualidades de um Dev&lt;/strong&gt;&lt;br&gt;
Você não precisa saber tudo, mas precisa saber se virar!&lt;br&gt;
Além do conhecimento técnico precisamos falar das soft skills. Ter uma boa comunicação e ir atrás de conhecimento quando não souber, ao invés de ficar parado ou esperar que alguém com senioridade maior resolva.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Se manter na área&lt;/strong&gt;&lt;br&gt;
Na área de programação não é só complicado entrar, também é se manter.&lt;/p&gt;

&lt;p&gt;Novas tecnologias surgem sempre e você vai pegar projetos em que há ferramentas que não conhece, mesmo com anos de experiência.&lt;br&gt;
Ou seja, terá que estudar para sempre para se manter.&lt;/p&gt;

&lt;p&gt;Siga pessoas da área que falem sobre o assunto nas suas redes sociais, é uma maneira de ficar conectado também. Comece me acompanhando.&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/raphaelramosbr" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/@raphaelramosbr?sub_confirmation=1" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.instagram.com/raphaelramos.br" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt;&lt;br&gt;
&lt;a href="https://twitter.com/raphaelramosbr" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/raphaelramos" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>career</category>
    </item>
  </channel>
</rss>
