<?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: Lucas Ribeiro</title>
    <description>The latest articles on DEV Community by Lucas Ribeiro (@lucasnsantos).</description>
    <link>https://dev.to/lucasnsantos</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F148959%2F7620f117-bca9-4f3d-82c4-b2361446c8f4.png</url>
      <title>DEV Community: Lucas Ribeiro</title>
      <link>https://dev.to/lucasnsantos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lucasnsantos"/>
    <language>en</language>
    <item>
      <title>Minha jornada para criar um SaaS que resolvesse minha dor de criação de conteúdo. part 2</title>
      <dc:creator>Lucas Ribeiro</dc:creator>
      <pubDate>Mon, 13 Jul 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/lucasnsantos/minha-jornada-para-criar-um-saas-que-resolvesse-minha-dor-de-criacao-de-conteudo-part-2-1fd1</link>
      <guid>https://dev.to/lucasnsantos/minha-jornada-para-criar-um-saas-que-resolvesse-minha-dor-de-criacao-de-conteudo-part-2-1fd1</guid>
      <description>&lt;p&gt;&lt;strong&gt;~US$ 15 por mês em modelos, uma VPS e um iPad. Como estruturei meus projetos para agentic coding, por que modelos menores resolvem a execução e o que aprendi sobre o custo oculto de revisar código de agentes&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Da arquitetura de contexto para o projeto funcional
&lt;/h2&gt;

&lt;p&gt;No final de 2025, um levantamento com 700 engenheiros mostrou que a maioria esmagadora dos líderes relatou aumento no tempo de revisão de código após adoção de IA. Cerca de um terço do dia do desenvolvedor passou a ser consumido revisando código de agente, corrigindo bugs sutis e trocando contexto entre tarefas. Foi esse número que me fez parar e repensar como estava estruturando meus projetos com agentes.&lt;/p&gt;

&lt;p&gt;Na Parte 1, mostrei a estrutura de harness engineering que montei: agentes, skills e rules organizados para transbordar meu contexto para qualquer LLM. A pergunta seguinte era inevitável: como transformar essa base em um projeto real, sem que o custo cognitivo de revisar código de agente anulasse a produtividade que ele prometia? A resposta veio com uma estrutura fixa de documentação e um fluxo de desenvolvimento que venho aplicando na prática.&lt;/p&gt;

&lt;h2&gt;
  
  
  A estrutura fixa de projetos
&lt;/h2&gt;

&lt;p&gt;Para todos os meus projetos, uso a mesma estrutura de arquivos. O motivo é simples: ficar criando prompts brilhantes do zero custa tempo. Tempo que não tenho. Estudos recentes mostram que prompts excessivamente complexos ou com instruções genéricas demais podem, inclusive, piorar o resultado do modelo em tarefas de raciocínio e extração de dados.&lt;sup&gt;1&lt;/sup&gt; Nada melhor do que uma estrutura fixa que me permite reaproveitar o que já funcionou.&lt;/p&gt;

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

&lt;p&gt;A estrutura:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;description.md&lt;/code&gt;&lt;/strong&gt;: guia qualquer consulta de contexto que agentes ou skills possam precisar conforme o projeto avança. É o ponto de entrada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ui-ux.md&lt;/code&gt;&lt;/strong&gt;: quando o projeto tem frontend, descrevo páginas, fluxos de navegação, interações do usuário, alertas de erro. Sem isso, agentes de frontend entregam qualquer coisa.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;architecture.md&lt;/code&gt;&lt;/strong&gt;: complemento técnico do &lt;code&gt;description.md&lt;/code&gt;. Contém peças de infraestrutura, tecnologias, linguagens, frameworks e como funcionam as integrações entre componentes. Com esse arquivo, posso ter agentes e skills mais genéricos, porque as especificações suprem o contexto que faltaria.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diagrama de alto nível da arquitetura&lt;/strong&gt;: tem coisas que só se representam bem visualmente. Desenho uma arquitetura simples e mantenho a imagem no repositório.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fifzjhp0itf1hv3fl8sex.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fifzjhp0itf1hv3fl8sex.png" alt=" " width="800" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alguém pode argumentar que isso trava o projeto, porque cada escopo pede uma estrutura diferente. Mas pense pelo outro lado: ter sempre a mesma estrutura acelera a organização das ideias, porque você tem referências passadas. É otimização de tempo. Sem isso, não chego ao final de nenhum projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do Spec ao código: planejar com modelo grande, executar com modelo barato
&lt;/h2&gt;

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

&lt;p&gt;Com a documentação inicial pronta, aplico um fluxo baseado em Spec-Driven Development, uma abordagem que trata a especificação como artefato principal e o código como derivado dela. O termo não tem uma definição única na indústria, e a implementação varia conforme o contexto do time e do projeto.&lt;sup&gt;2&lt;/sup&gt; No meu caso, derivo três arquivos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;spec.md&lt;/code&gt;&lt;/strong&gt;: condensa e adiciona informações técnicas. É o documento-base para tudo que vem depois.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;plan.md&lt;/code&gt;&lt;/strong&gt;: estrutura como vou executar e quebrar as atividades. É a ponte entre a especificação e a execução.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;task.md&lt;/code&gt;&lt;/strong&gt;: todas as atividades necessárias, quebradas em epics e tasks.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq9d2z8c96frxs1ry9aek.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq9d2z8c96frxs1ry9aek.png" alt=" " width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O projeto do Hub de Conteúdo gerou aproximadamente 20 epics e pouco mais de 100 tasks. Cada epic agrupa um conjunto de tasks relacionadas. As atividades são cadastradas no GitHub como issues e sub-issues, organizadas em um project no estilo kanban. Consigo acompanhar o andamento visualmente, mesmo acessando do iPad.&lt;/p&gt;

&lt;p&gt;Aqui está o pulo do gato: agrupando tasks dentro de um epic, posso usar o modo de planejamento que a maioria dos agentes e modelos oferece hoje. Na fase de planejamento, uso modelos maiores e melhores, com alto nível de effort. O resultado é um plano de execução bem estruturado. Na fase de execução, mudo para modelos menores e mais baratos.&lt;/p&gt;

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

&lt;p&gt;Isso só funciona porque, em 2026, a diferença entre modelos frontier para programação está na casa dos pontos percentuais, enquanto a diferença de preço está na casa das vezes. Modelos abertos como DeepSeek V4 entregam performance comparável aos modelos fechados mais caros por uma fração do custo.&lt;sup&gt;3&lt;/sup&gt; Já que o planejamento foi feito com o modelo mais capaz, não há motivo para continuar usando o mais caro para gerar código. Existem inúmeras maneiras de implementar a mesma coisa, mas com fluxos extras de qualidade e segurança rodando depois, a variação na implementação se torna irrelevante.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modelos chineses, VPS e um iPad
&lt;/h2&gt;

&lt;p&gt;A maior parte do meu uso de LLM é com modelos chineses. Desde a chegada do DeepSeek, fiquei interessado nesses modelos porque eles liberaram informações que as Big Techs ocidentais tratam como caixa preta. Boa parte é open source, permitindo reuso, destilação e fine tuning. É um nível de transparência que não vejo sendo praticado por quem vende soluções fechadas.&lt;/p&gt;

&lt;p&gt;Também uso bastante um modelo brasileiro, da Maritaca AI, principalmente quando trabalho com conteúdo 100% nacional. Um modelo treinado nas nuances brasileiras faz diferença, e a empresa mantém contato próximo com a comunidade.&lt;/p&gt;

&lt;p&gt;Na prática, meu ambiente de desenvolvimento é uma VPS com vscode-server, opencode, Claude Code e Pi Agent. Isso me permite programar do iPad em horários alternativos. À noite, depois do trabalho, nem sempre tenho cabeça para mais horas na frente do computador. Também quero estar com minha família. A VPS virou a ponte entre o tempo que tenho e os projetos que quero tirar do papel.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que o código dos agentes cobra de você
&lt;/h2&gt;

&lt;p&gt;Esse não é o único projeto que estou construindo, mas foi o que mais me trouxe maturidade no uso de agentes para programação. Minha função atual é mais estratégica, e a programação deixou de ser minha entrega principal. Uso GenAI para programar, mas também para documentação, análise de dados e validação de hipóteses com deep research.&lt;sup&gt;4&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;A maior lição veio de um desconforto específico: em determinados pontos de implementação ou refatoração, dependendo do tamanho do epic, é muito complicado revisar tudo com 100% de segurança. Senti que não tinha certeza absoluta do que havia sido desenvolvido e gastei boas horas revisando.&lt;/p&gt;

&lt;p&gt;Estudos recentes confirmam que essa não é uma experiência isolada. Um levantamento com 700 profissionais publicado em 2026 mostrou que 81% dos líderes de engenharia relataram aumento no tempo de revisão de código após adoção de IA. Cerca de 31% do dia do desenvolvedor é consumido revisando código de IA, corrigindo bugs sutis e trocando contexto entre tarefas.&lt;sup&gt;5&lt;/sup&gt; Outro estudo, com rastreamento ocular, revelou que cada sugestão de código de IA introduz uma microinterrupção no fluxo do desenvolvedor. Cerca de 50% das sugestões nem são olhadas, e das que são, mais de 75% são descartadas. O custo cognitivo está na interrupção, não no resultado.&lt;sup&gt;6&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;É um projeto pessoal. Por isso trabalho com nível de confiança de 70% a 80%. Em ambiente corporativo, não faria dessa maneira. Precisamos equilibrar o uso da tecnologia. Estamos vendo brechas abertas por uma promessa de produtividade que, olhando os números, não se sustenta.&lt;/p&gt;

&lt;h2&gt;
  
  
  O saldo até agora
&lt;/h2&gt;

&lt;p&gt;Tem sido enriquecedor construir um projeto do zero com aplicação real para uma dor que eu tenho. O fluxo que encontrei está fazendo sentido, não porque seja perfeito, mas porque aceita o custo cognitivo da revisão como parte do processo, e não como falha.&lt;/p&gt;

&lt;p&gt;Consumo entre 10 e 15 dólares por mês com modelos chineses para programação, e cerca de 30 reais com modelos da Maritaca AI para revisões de conteúdo. O custo em dinheiro é baixo. O custo em atenção é real, mas administrável, desde que você saiba que ele existe. Esse é o ponto que a maioria dos posts sobre agentic coding omite.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Na Parte 3, vou detalhar os fluxos de qualidade e segurança que rodam depois da implementação, e como estou fechando o ciclo de publicação automatizada.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Commey, D. &lt;em&gt;When "Better" Prompts Hurt: Evaluation-Driven Iteration for LLM Applications.&lt;/em&gt; arXiv, jan. 2026. Mostra que prompts genéricos com regras explícitas reduziram a acurácia de extração de 100% para 90% e a conformidade RAG de 93% para 80% em testes com Llama 3. &lt;a href="https://arxiv.org/abs/2601.22025" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2601.22025&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Piskala, V. &lt;em&gt;Spec-Driven Development: From Code to Contract in the Age of AI Coding Assistants.&lt;/em&gt; arXiv, jan. 2026. Define níveis de maturidade de SDD e demonstra que a implementação varia conforme o contexto do time, não havendo estratégia fixa. &lt;a href="https://arxiv.org/abs/2602.00180" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2602.00180&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; Hexaware Technologies. &lt;em&gt;The Closing Window: Open vs Closed AI Models.&lt;/em&gt; abr. 2026. Análise comparativa mostra quatro modelos frontier com diferença de até 0.6 pontos percentuais no SWE-Bench Verified, mas com custo de 5 a 18 vezes maior nos modelos fechados. &lt;a href="https://hexaware.com/blogs/the-closing-window/" rel="noopener noreferrer"&gt;https://hexaware.com/blogs/the-closing-window/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; Google Research. &lt;em&gt;Accelerating Scientific Discovery with AI-Powered Empirical Research Assistance.&lt;/em&gt; set. 2025. Sistema baseado em Gemini que testa milhares de variantes de código para validação de hipóteses científicas, reduzindo exploração de meses para horas. &lt;a href="https://research.google/blog/accelerating-scientific-discovery-with-ai-powered-empirical-software/" rel="noopener noreferrer"&gt;https://research.google/blog/accelerating-scientific-discovery-with-ai-powered-empirical-software/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt; Harness. &lt;em&gt;2026 State of Engineering Excellence Report.&lt;/em&gt; 2026. Apud SD Times: "The Invisible Burden: How AI is Redefining Developer Productivity in 2026." &lt;a href="https://sdtimes.com/softwaredev/the-invisible-burden-how-ai-is-redefining-developer-productivity-in-2026/" rel="noopener noreferrer"&gt;https://sdtimes.com/softwaredev/the-invisible-burden-how-ai-is-redefining-developer-productivity-in-2026/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6.&lt;/strong&gt; ICSE 2026. &lt;em&gt;An Eye for AI: Eye-Tracking the Micro-Interruptions of GenAI Code Suggestions.&lt;/em&gt; Artifact Award Winner. Estudo com 35 profissionais usando rastreamento ocular para medir interrupções cognitivas causadas por sugestões de código de IA. &lt;a href="https://conf.researchr.org/details/icse-2026/icse-2026-research-track/90/An-Eye-for-AI-Eye-Tracking-the-Micro-Interruptions-of-GenAI-Code-Suggestions" rel="noopener noreferrer"&gt;https://conf.researchr.org/details/icse-2026/icse-2026-research-track/90/An-Eye-for-AI-Eye-Tracking-the-Micro-Interruptions-of-GenAI-Code-Suggestions&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Generalista ou especialista? Nenhum dos dois.</title>
      <dc:creator>Lucas Ribeiro</dc:creator>
      <pubDate>Fri, 10 Jul 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/lucasnsantos/generalista-ou-especialista-nenhum-dos-dois-5dj</link>
      <guid>https://dev.to/lucasnsantos/generalista-ou-especialista-nenhum-dos-dois-5dj</guid>
      <description>&lt;p&gt;&lt;em&gt;Como desenvolver uma visão periférica pode transformar sua carreira em tecnologia&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Por algumas das empresas pelas quais passei, sempre que tive oportunidade de mentorar pessoas, tanto no mesmo momento de carreira que eu quanto pessoas que buscavam evoluir para um nível acima, sempre tinha um questionamento que rondava essas mentorias: devo focar em ser generalista ou me especializar em algum tema?&lt;/p&gt;

&lt;p&gt;É um questionamento muito válido. Mas acredito que pode ser bem limitante para a carreira de qualquer pessoa. As justificativas para seguir um caminho mais generalista envolvem poder atuar em várias áreas dentro da tecnologia ou até mesmo alcançar um leque maior de possibilidades.&lt;sup&gt;1&lt;/sup&gt; Ao mesmo tempo, ser especialista, dependendo da área, pode trazer muitos benefícios: algumas empresas possuem sistemas tão críticos que é necessário contar com profissionais bem especializados em tais tecnologias, profissionais que frequentemente precisam de certificações e pós-graduações.&lt;sup&gt;2&lt;/sup&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Os limites da falsa dicotomia
&lt;/h2&gt;

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

&lt;p&gt;Antes de apresentar o terceiro caminho, preciso mostrar por que os dois primeiros são mais limitados do que parecem. É aí que a visão periférica começa a fazer sentido.&lt;/p&gt;

&lt;p&gt;Ainda assim, na minha opinião, continua sendo uma visão limitante em relação a todas as oportunidades que uma pessoa pode ter, principalmente dentro da área de tecnologia e da longevidade que as carreiras possuem hoje em dia.&lt;/p&gt;

&lt;p&gt;Poderíamos expandir para outras profissões, mas como não tenho tanto conhecimento do que seria um especialista ou generalista dentro da advocacia ou da medicina, vou me limitar a falar de tecnologia.&lt;/p&gt;

&lt;p&gt;Outro ponto que pode limitar ainda mais essa perspectiva: muitas pessoas acreditam que ser generalista significa estudar várias tecnologias de maneira isolada, aprender 10 linguagens de programação e encher o GitHub com projetos de skills técnicas diferentes. Por outro lado, muitos pensam que ser especialista é estudar uma tecnologia e suas stacks periféricas por anos, tirar todas as certificações e se especializar em frameworks. Dentro do mundo Java, por exemplo, é comum as pessoas tirarem certificações e se tornarem especialistas em frameworks como Spring, Hibernate e por aí vai.&lt;/p&gt;

&lt;p&gt;Perceba que, de uma maneira ou de outra, as duas direções te limitam a olhar para dentro. Quando digo "olhar para dentro", quero dizer que você continua restrito ao campo de visão da área de tecnologia. E, definitivamente, não foi isso que me ajudou a evoluir na minha carreira.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visão periférica: um terceiro caminho
&lt;/h2&gt;

&lt;p&gt;Proponho um conceito que particularmente nunca vi ninguém falando por aí: desenvolva uma carreira com visão periférica.&lt;/p&gt;

&lt;p&gt;Não estou falando de ser generalista, que pode ser o que as pessoas interpretem ao ler "visão periférica". O generalista acumula conhecimento em múltiplas áreas técnicas. A visão periférica que proponho é diferente: é se interessar pelo que está além da tecnologia, principalmente por pontos mais estratégicos do negócio.&lt;/p&gt;

&lt;p&gt;Existe um limiar que todos, independente do caminho que sigam, vão enfrentar com o mesmo questionamento: o que fazer agora que cheguei nesse ponto da carreira? Tenho um nível técnico bom. Já tirei certificações. Participei de projetos relevantes. Como posso evoluir além disso? Respondo da maneira mais simples possível: agora é a hora de ser estratégico.&lt;sup&gt;3&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Mas como uma pessoa de tecnologia pode começar a gerar impacto estratégico dentro das empresas? Só tem um caminho: precisa começar a ter mais visão de negócio, desenvolver uma boa comunicação,&lt;sup&gt;4&lt;/sup&gt; puxar iniciativas que impactam a empresa em diversas áreas, gerenciar pessoas (nesse ponto não estou falando em se tornar um gerente, até porque hoje existem muitas possibilidades de evolução em um caminho altamente técnico) e, por fim, mentorar outros profissionais.&lt;sup&gt;5&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;O caminho mais simples para iniciar essa jornada é começar a se interessar por outras áreas dentro da própria empresa onde você atua. E aqui não estou falando de outras frentes de tecnologia, mas de áreas como produto, negócio, design e suporte ao cliente. Esse último é um caminho excelente para evoluir: ter contato com o cliente fará você desenvolver uma visão da percepção do cliente sobre o negócio e, ao mesmo tempo, desenvolver a comunicação.&lt;/p&gt;

&lt;p&gt;Não basta apenas prestar atenção em como esses profissionais agem. O ponto central é entender como eles tomam decisões. Profissionais ligados diretamente ao negócio muitas vezes utilizam dados do cliente ou do projeto para tomada de decisão. Pessoas de design utilizam percepções de psicologia e comportamento do cliente. Pessoas que trabalham com customer success precisam de boa comunicação para lidar com as necessidades mais urgentes dos clientes, além de muitas vezes coordenar diferentes núcleos de atuação para resolver problemas.&lt;/p&gt;

&lt;p&gt;A partir do momento em que você começa a entender mais a fundo o motivo de algumas decisões,&lt;sup&gt;6&lt;/sup&gt; tudo muda. Quando estamos iniciando na área, ficamos muito focados em programar, eliminar tasks do backlog, resolver bugs e refatorar ou migrar projetos. Essa é a diversão para nós, pessoas técnicas. Até certo ponto faz sentido criar uma casca técnica, porque o nosso tempo é limitado e, quando somos iniciantes, pode ser difícil lidar com tudo ao mesmo tempo: evoluir tecnicamente e ainda desenvolver essa visão periférica.&lt;/p&gt;

&lt;p&gt;Só que chegará um ponto em que desenvolver essa visão periférica será a sua prioridade. Depois que você consegue consolidar seus conhecimentos técnicos e desenvolver uma boa base teórica, fica mais simples evoluir ainda mais tecnicamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que mudou na prática
&lt;/h2&gt;

&lt;p&gt;Viu como focar em ser generalista ou especialista não te fará dar o próximo passo?&lt;/p&gt;

&lt;p&gt;O que virou a minha chavinha foi começar a me interessar por outros perfis dentro, principalmente, das próprias squads pelas quais passei. Até certo ponto, comecei a ler livros, acessar comunidades específicas e, quando disponíveis, até mesmo cursos. Não com o objetivo de migrar de área, mas sim de expandir a minha visão sobre negócio.&lt;/p&gt;

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

&lt;p&gt;Com isso, minha comunicação melhorou bastante. Quando digo comunicação, não é simplesmente perder o medo de se comunicar. É também saber o que não precisa ser comunicado, ser direto e entender que a maneira como você apresenta determinados assuntos exige estratégias diferentes. Com um time técnico, posso fazer um deep dive maior ao apresentar uma solução. Mas com perfis do nível de gerência para cima, preciso decidir o que não é relevante naquele momento e ainda assim conseguir passar uma mensagem relevante para aquela pessoa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Para onde olhar agora
&lt;/h2&gt;

&lt;p&gt;Deixo essa reflexão para todos que estão em dúvida sobre essas definições. Uma carreira pode ser extremamente impactante e, ao mesmo tempo, você dedicará um tempo importante da sua vida a ela. Não faz sentido ficar preso a terminologias que limitam sua visão sobre o que é possível.&lt;/p&gt;

&lt;p&gt;Finalizo com a seguinte pergunta: o que você poderia estar fazendo agora que geraria um impacto maior do ponto de vista estratégico? Você tem se colocado na pele de outros profissionais? Tem procurado entender quais são os pontos importantes para que eles tomem suas decisões?&lt;/p&gt;

&lt;p&gt;Compartilhe nos comentários se você já tinha essa perspectiva sobre carreira e se a minha experiência pode ter ajudado de alguma maneira.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; &lt;a href="https://techguide.sh/" rel="noopener noreferrer"&gt;Tech Guide&lt;/a&gt; — Alura. Projeto open-source de mapeamento de carreiras em tecnologia no modelo T-shaped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; &lt;a href="https://www.linkedin.com/pulse/especialista-vs-generalista-rodrigo-de-oliveira/" rel="noopener noreferrer"&gt;Especialista vs Generalista&lt;/a&gt; — Oliveira, R. &lt;em&gt;LinkedIn&lt;/em&gt;, 8 set. 2023.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; &lt;a href="https://www.linkedin.com/advice/3/how-can-you-create-impact-your-career-skills-career-path-planning?lang=pt" rel="noopener noreferrer"&gt;Como você pode criar impacto em sua carreira?&lt;/a&gt; — Comunidade LinkedIn. &lt;em&gt;LinkedIn&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; &lt;a href="https://exame.com/carreira/guia-de-carreira/como-desenvolver-e-comunicar-uma-visao-estrategica-para-sua-area-ou-equipe/" rel="noopener noreferrer"&gt;Como desenvolver e comunicar uma visão estratégica para sua área ou equipe&lt;/a&gt; — Bot, nIA; Moraes, L. &lt;em&gt;Exame&lt;/em&gt;, 22 abr. 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt; &lt;a href="https://online.pucrs.br/blog/papel-do-mentor-crescimento-autonomia" rel="noopener noreferrer"&gt;O Papel do Mentor: Inspirando o Crescimento e a Autonomia&lt;/a&gt; — PUCRS. &lt;em&gt;Blog PUCRS Online&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6.&lt;/strong&gt; &lt;a href="https://gptw.com.br/conteudo/artigos/tomada-de-decisoes/" rel="noopener noreferrer"&gt;Como tomar decisões estratégicas para a sua empresa?&lt;/a&gt; — Great Place To Work®. &lt;em&gt;GPTW&lt;/em&gt;, 2 jun. 2026.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Minha jornada para criar um SaaS que resolvesse minha dor de criação de conteúdo: Parte 1</title>
      <dc:creator>Lucas Ribeiro</dc:creator>
      <pubDate>Fri, 10 Jul 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/lucasnsantos/minha-jornada-para-criar-um-saas-que-resolvesse-minha-dor-de-criacao-de-conteudo-parte-1-5d95</link>
      <guid>https://dev.to/lucasnsantos/minha-jornada-para-criar-um-saas-que-resolvesse-minha-dor-de-criacao-de-conteudo-parte-1-5d95</guid>
      <description>&lt;p&gt;&lt;strong&gt;Mapeei US$ 300 em assinaturas que posso substituir com agentic coding. O segredo está na estrutura de contexto que você dá para os modelos.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O ponto de partida
&lt;/h2&gt;

&lt;p&gt;Voltei a criar conteúdo e as dúvidas de sempre ressurgiram: posto em uma plataforma fixa? Compartilho em múltiplas redes? Hospedo um blog em VPS própria? Decidi focar no Substack. Ouço muita gente falar da capacidade de distribuição da plataforma e, de fato, tem uma comunidade interessante. Além disso, não preciso me limitar a conteúdo técnico.&lt;/p&gt;

&lt;p&gt;No LinkedIn, por exemplo, acabei restringindo os temas ao meu dia a dia de Staff Software Engineer / Solution Architect. A plataforma tem uma aversão conhecida a qualquer politização de conteúdo, como se fosse possível descolar política, filosofia, sociologia e economia do ambiente de trabalho. Na verdade, é o lugar onde esses assuntos mais caberiam. Mas enfim, desisti de dar murro em ponta de faca.&lt;/p&gt;

&lt;p&gt;Meu objetivo era claro: criar uma aplicação para gerenciar meus conteúdos, centralizar meus agentes de revisão e automatizar a postagem em múltiplas plataformas. O que não imaginava é que a parte técnica seria o menor dos problemas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Construir o próprio SaaS: menos é mais
&lt;/h2&gt;

&lt;p&gt;Teve uma fala do Fiasco, um Tech Creator que acompanho, que mudou minha perspectiva. Ele comentou em um dos stories que, com o avanço da IA generativa, virou corrida do ouro: todo mundo tentando construir um SaaS para ficar milionário. Só que ele trouxe um ângulo diferente, que já vi outras pessoas mencionarem, mas sem o recorte técnico (e financeiro) que ele deu.&lt;/p&gt;

&lt;p&gt;Pare e analise quantos softwares, SaaS e aplicativos você usa no dia a dia. Quantos deles poderiam ser reconstruídos sob medida para o que você realmente precisa? No meu post anterior&lt;sup&gt;1&lt;/sup&gt;, citei uma métrica do CHAOS Report: cerca de 45% das funcionalidades de uma aplicação nunca são usadas pelos usuários e 19% raramente são tocadas. Você paga por um software inteiro para usar duas ou três funções. Em muitos casos, o problema se resolveria com uma planilha. A diferença é que agora, com &lt;em&gt;agentic coding&lt;/em&gt;, você pode construir uma mini aplicação própria e cortar custos de assinatura.&lt;/p&gt;

&lt;p&gt;Mapeei cerca de 300 dólares mensais em assinaturas que pretendo reduzir. Algumas não vou conseguir substituir, claro. Este projeto que vou dissecar aqui é justamente sobre isso: a jornada para construir meu ambiente de contexto, como organizo e documento os projetos, os resultados alcançados e os próximos passos.&lt;/p&gt;

&lt;h2&gt;
  
  
  O gargalo não é código, é tempo
&lt;/h2&gt;

&lt;p&gt;O maior desafio para construir uma solução como essa não é técnico. O técnico deixou de ser limitação muito tempo atrás na minha carreira e, com a GenAI, virou commodity. Meu complicador real é o tempo e não falo isso por drama.&lt;/p&gt;

&lt;p&gt;Tenho quase 17 anos de carreira, apesar dos meus 33. Comecei a programar aos 10 anos (quem faz parte da tropa dos que começaram com blog no WordPress deixa o like, rsss). Com família, destino a maior parte possível do meu tempo para minha esposa e minha filha. Além delas, meus pais, minha irmã e minha avó.&lt;/p&gt;

&lt;p&gt;O que sobra dedico a interesses fora da tecnologia: ilustração, leitura e, principalmente, o ócio de pensar em vários nadas. Não me refiro ao ócio criativo do Domenico De Masi, mas ao ócio puro, sem finalidade produtiva.&lt;sup&gt;2&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Com essa rotina, ficou claro que para levar o objetivo até o fim e sair do outro lado com um projeto funcional precisava ser o mais objetivo possível. Objetivo nas especificações, na arquitetura, no &lt;em&gt;harness engineering&lt;/em&gt;&lt;sup&gt;3&lt;/sup&gt; e, principalmente, no tempo disponível para cada tarefa. Ao longo desta minissérie de artigos, vou destrinchar essa jornada, os desafios que existem e podem ser potencializados pelo uso massivo de GenAI e, por fim, o que interessa: o resultado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Content/Harness Engineering: a arquitetura do contexto
&lt;/h2&gt;

&lt;p&gt;Antes de começar, precisava decidir como usar a IA generativa de forma eficiente. Tenho um mantra pessoal alinhado ao propósito original da área de tecnologia: eficiência e redução de custos. Com a chegada da GenAI e, agora, do &lt;em&gt;tokenmaxxing&lt;/em&gt;&lt;sup&gt;4&lt;/sup&gt;, esse princípio meio que se perdeu. Mas estando no Brasil, com o dólar sempre desproporcional aos nossos ganhos, presto muita atenção nesses pontos.&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;content engineering&lt;/em&gt; (ou &lt;em&gt;harness engineering&lt;/em&gt;) foi a base de tudo, desde a criação da documentação até a implementação. Montei a seguinte estrutura:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agentes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Arquitetura de soluções&lt;/strong&gt; — Construção de especificações técnicas e decomposição em atividades&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt; — Implementação de funcionalidades baseada em SOLID&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt; — Desenvolvimento visual com Tailwind para ganhar velocidade&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;QA&lt;/strong&gt; — Testes de backend e frontend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dados&lt;/strong&gt; — Demandas de Data Scientist ou DBA, orientadas por skills&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Engineer&lt;/strong&gt; — Integração com modelos de LLM (na prática, um backend com experiência em APIs de IA)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Skills&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Criação de issue&lt;/strong&gt; — Padronização de tarefas, usada em conjunto com o agente de arquitetura&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementação de tarefas&lt;/strong&gt; — Instruções para execução de epics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Padrão de commit&lt;/strong&gt; — Rastreabilidade do fluxo agentivo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Descrição de PR&lt;/strong&gt; — Padronização de pull requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revisão de PR&lt;/strong&gt; — Verificação de completude, qualidade, testes e segurança&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Padrão SOLID&lt;/strong&gt; — Garantia de boas práticas de código&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rules&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Arquivos de configuração&lt;/strong&gt; — Regras para Claude Code (CLAUDE.md), OpenCode (AGENTS.md) e Pi Agent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revisão de conteúdo&lt;/strong&gt; — Padrões de público-alvo e manipulação de conteúdo&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9xy18d0xd3dl00n0m6h2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9xy18d0xd3dl00n0m6h2.png" alt="Estrutura de Harness Engineering" width="800" height="993"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sobre o agente de AI Engineer: não gosto muito dessa nomenclatura porque, na maior parte das vezes, a função é simplesmente um backend que já teve experiência com integrações de LLMs. Poderia ser uma skill do agente de backend tranquilamente.&lt;/p&gt;

&lt;p&gt;Estou utilizando &lt;code&gt;git&lt;/code&gt; (com &lt;code&gt;github cli&lt;/code&gt;), &lt;code&gt;docker&lt;/code&gt; e &lt;code&gt;make&lt;/code&gt; com skills simples que informam as instruções de uso de cada ferramenta. Isso agiliza a implementação e a depuração das funcionalidades.&lt;/p&gt;

&lt;p&gt;Meu intuito foi construir uma estrutura portátil. Trabalho na linha de &lt;em&gt;submodules&lt;/em&gt; para reaproveitar em vários projetos diferentes, podendo modificar e distribuir em todos os repositórios. Nos momentos em que precisei de código, usei pseudocódigo. A ideia foi abstrair ao máximo qualquer dependência de linguagem ou framework. E vem funcionando.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que funcionou e o que ainda precisa melhorar
&lt;/h2&gt;

&lt;p&gt;Depois de estressar várias estruturas diferentes, cheguei a esse conjunto que ficou flexível o suficiente para usar em projetos variados. Não prendi nada a exemplos específicos de código, linguagem ou framework.&lt;/p&gt;

&lt;p&gt;Dito isso, essa estrutura é viva. Temos que estar preparados para admitir que algo que julgamos bem planejado ainda tem espaço para melhorar. Se montar uma nova estrutura daqui a seis meses e ela for completamente diferente, azar: o que importa é se está funcionando agora.&lt;/p&gt;

&lt;p&gt;Outro ponto que trago como alerta: os modelos avançaram muito, mas me arrisco a dizer que a maior parte dos avanços até o final do ano passado foi incremental. Muita ação especializada, muita capacidade nova, mas nada que causasse ruptura. Por isso, não existe a possibilidade de criar algo usando agentes como auxiliares sem uma estrutura que consiga transbordar seu contexto para os modelos. Sem &lt;em&gt;harness engineering&lt;/em&gt;, os agentes patinam.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por onde começar
&lt;/h2&gt;

&lt;p&gt;Neste primeiro relato, meu objetivo foi desmistificar o &lt;em&gt;harness engineering&lt;/em&gt;. Vejo muita gente falando sobre o tema, quase sempre usando fluxogramas genéricos para exemplificar como deveria ser uma estrutura de contexto. Mas, no fim, só você, sua equipe ou sua empresa podem construir esses dados da melhor maneira possível.&lt;/p&gt;

&lt;p&gt;Dois conselhos que posso deixar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Antes de decidir sobre modelo ou ferramenta, mapeie o que você já tem de contexto reaproveitável e o que seria necessário para direcionar o melhor resultado do modelo.&lt;/li&gt;
&lt;li&gt;Existem vários lugares onde você pode compartilhar e baixar skills e agentes prontos. Para aprendizado, funciona. Mas acreditar que contexto criado por outras pessoas e para cenários específicos vai funcionar no seu caso é arriscado. Sempre prefira criar os seus.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nas próximas partes, vou detalhar como dividi as atividades em epics e como foi a implementação prática dessa estrutura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; The Standish Group International. &lt;em&gt;CHAOS Report&lt;/em&gt; (2002). Dados indicam que 45% das funcionalidades nunca são utilizadas e 19% raramente. &lt;a href="https://standishgroup.com" rel="noopener noreferrer"&gt;https://standishgroup.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; &lt;a href="https://pt.wikipedia.org/wiki/O_%C3%93cio_Criativo" rel="noopener noreferrer"&gt;O Ócio Criativo&lt;/a&gt; — De Masi, D. &lt;em&gt;Sextante&lt;/em&gt;, 2000. Publicado originalmente como &lt;em&gt;L'Ozio Creativo&lt;/em&gt; em 1995.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; &lt;a href="https://tiinside.com.br/19/05/2026/harness-engineering-conheca-o-termo-que-esta-cada-vez-mais-em-alta/" rel="noopener noreferrer"&gt;Harness engineering: conheça o termo que está cada vez mais em alta&lt;/a&gt; — Bonas, M. &lt;em&gt;TI Inside Online&lt;/em&gt;, 19 mai. 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; Taurion, C. Tokenmaxxing e o custo oculto de medir produtividade da IA por tokens. &lt;em&gt;Coletivo Tech&lt;/em&gt;, 3 jun. 2026. &lt;a href="https://coletivo.tech/artigos/cezar-taurion-tokenmaxxing-metrica-produtividade-ia/" rel="noopener noreferrer"&gt;https://coletivo.tech/artigos/cezar-taurion-tokenmaxxing-metrica-produtividade-ia/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Aumente o Desempenho das suas Aplicações Web com o Poder do Code Splitting!</title>
      <dc:creator>Lucas Ribeiro</dc:creator>
      <pubDate>Wed, 24 May 2023 17:33:39 +0000</pubDate>
      <link>https://dev.to/lucasnsantos/aumente-o-desempenho-das-suas-aplicacoes-web-com-o-poder-do-code-splitting-38lo</link>
      <guid>https://dev.to/lucasnsantos/aumente-o-desempenho-das-suas-aplicacoes-web-com-o-poder-do-code-splitting-38lo</guid>
      <description>&lt;h3&gt;
  
  
  Introdução
&lt;/h3&gt;

&lt;p&gt;Nos últimos anos, a criação de aplicações web cada vez mais complexas se tornou comum. Com essa complexidade crescente, é importante garantir aplicações cada vez mais otimizadas e uma experiência de usuário fluida.&lt;/p&gt;

&lt;p&gt;Uma abordagem eficaz para alcançar esses objetivos é o code splitting (divisão de código), uma técnica que permite carregar partes específicas do código de forma assíncrona sob demanda.&lt;/p&gt;

&lt;p&gt;Neste artigo, exploraremos o code splitting, discutindo suas dificuldades de implementação e os benefícios de desempenho que essa abordagem oferece.&lt;/p&gt;




&lt;h3&gt;
  
  
  O que é “Code Splitting”?
&lt;/h3&gt;

&lt;p&gt;O code splitting é uma técnica que divide o código de uma aplicação em pacotes menores, permitindo que sejam carregados apenas quando necessários. Em vez de carregar todo o código da aplicação de uma vez só, o code splitting permite que os pacotes sejam carregados de forma assíncrona, conforme o usuário navega pela aplicação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dificuldades de Implementação
&lt;/h3&gt;

&lt;p&gt;Embora o code splitting traga benefícios significativos para o desempenho de uma aplicação, a sua implementação pode apresentar alguns desafios. Abaixo, destacamos algumas dificuldades comuns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identificação de pontos de divisão: Identificar os pontos no código em que a divisão pode ocorrer é um desafio inicial. É necessário analisar e entender a estrutura da aplicação para determinar quais componentes ou rotas podem ser separados em pacotes distintos.&lt;/li&gt;
&lt;li&gt;Gerenciamento de estado compartilhado: Ao dividir o código, é fundamental garantir que o estado compartilhado entre os pacotes seja gerenciado corretamente. O uso de gerenciadores de estado, pode ajudar a lidar com esse desafio, permitindo que o estado seja compartilhado de maneira eficiente entre os diferentes pacotes.&lt;/li&gt;
&lt;li&gt;Manutenção da estrutura de rotas: É necessário garantir que a estrutura de rotas seja preservada. É importante que cada rota corresponda ao pacote de código apropriado, garantindo que apenas os componentes necessários sejam carregados em cada página.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Resultados
&lt;/h3&gt;

&lt;p&gt;Para os meus primeiros testes, decidi seguir duas estratégias, por ROTAS e pelos COMPONENTES maiores e com maior número de dependências, assim poderia diminuir o “Circular Dependencies” para itens que não precisariam serem carregados, essa simples estratégia quase me rendeu 1 segundo de carregamento.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Resultados adquiridos sem Spliting&lt;/em&gt;&lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj8i8ucvsclzc9ghhx3k0.jpeg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj8i8ucvsclzc9ghhx3k0.jpeg" alt="Sem Code Spliting" width="750" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Resultados adquiridos com Code Spliting&lt;/em&gt;&lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzi0nvmq1bqgtitwa52gb.jpeg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzi0nvmq1bqgtitwa52gb.jpeg" alt="Com Code Spliting" width="786" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aqui vocês podem notar a diferença de um “build” feito com e sem “Code-Splitting”.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Build sem Code Spliting&lt;/em&gt;&lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Femhwp5r8h0yyc1zpk6tn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Femhwp5r8h0yyc1zpk6tn.png" alt="Sem Code Spliting" width="750" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Build com Code Spliting&lt;/em&gt;&lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwwq7olnb2pjq97kpikrj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwwq7olnb2pjq97kpikrj.png" alt="Com Code Spliting" width="786" height="599"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;No mundo web sabemos que sistemas que demoram mais 5 segundos para seu primeiro carregamento, são drasticamente penalizados pelos indexadores de conteúdos, fiquei muito feliz com resultado, outras estratégias devem ser aliadas para melhorar esses resultados.&lt;/p&gt;

&lt;p&gt;Fica minha dica para as pessoas que não estudaram essa técnica, pode ser um bom ponto de partida para melhorias de desempenhos dos seus sistemas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefícios alcançados
&lt;/h3&gt;

&lt;p&gt;A adoção do code splitting traz diversos benefícios de desempenho.&lt;/p&gt;

&lt;p&gt;Vejamos alguns deles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Carregamento mais rápido: Ao dividir o código em pacotes menores, é possível reduzir o tamanho do pacote inicial que precisa ser carregado pelo navegador. Isso resulta em tempos de carregamento mais curtos, o que é especialmente crucial para usuários em conexões de internet mais lentas ou dispositivos com recursos limitados.&lt;/li&gt;
&lt;li&gt;Melhor experiência do usuário: Ao carregar apenas o código necessário para cada rota, a experiência do usuário melhora significativamente. As transições entre páginas se tornam mais rápidas e suaves, aumentando a satisfação do usuário e diminuindo a taxa de rejeição.&lt;/li&gt;
&lt;li&gt;Otimização de recursos: Com o code splitting, apenas o código necessário é carregado, evitando o carregamento desnecessário de componentes ou bibliotecas em páginas que não os utilizam. Isso resulta em uma utilização mais eficiente dos recursos do navegador, como memória e CPU.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;O code splitting é uma abordagem poderosa para otimizar o desempenho de aplicações. Embora a implementação possa apresentar desafios, os benefícios obtidos são significativos. Ao dividir o código em pacotes menores e carregá-los de forma assíncrona sob demanda, podemos melhorar o tempo de carregamento das aplicações, proporcionar uma experiência do usuário mais fluida e otimizar o uso dos recursos do navegador. Ao considerar o code splitting em seus projetos, é importante entender os benefícios em relação às dificuldades de implementação, buscando alcançar um equilíbrio ideal entre desempenho e complexidade.&lt;/p&gt;




&lt;h3&gt;
  
  
  Referências
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://legacy.reactjs.org/docs/code-splitting.html" rel="noopener noreferrer"&gt;Code-Splitting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pt-br.legacy.reactjs.org/docs/code-splitting.html" rel="noopener noreferrer"&gt;Dividindo o Código (Code-Splitting)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.logrocket.com/react-dynamic-imports-route-centric-code-splitting-guide/" rel="noopener noreferrer"&gt;React dynamic imports and route-centric code splitting guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v5.reactrouter.com/web/guides/code-splitting" rel="noopener noreferrer"&gt;React Router: Declarative Routing for React.js&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>development</category>
      <category>frontend</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Transforme seus componentes Angular com variáveis CSS</title>
      <dc:creator>Lucas Ribeiro</dc:creator>
      <pubDate>Sat, 20 May 2023 03:41:14 +0000</pubDate>
      <link>https://dev.to/lucasnsantos/usando-variaveis-de-css-de-maneira-dinamica-com-angular-5hfh</link>
      <guid>https://dev.to/lucasnsantos/usando-variaveis-de-css-de-maneira-dinamica-com-angular-5hfh</guid>
      <description>&lt;h3&gt;
  
  
  Introdução
&lt;/h3&gt;

&lt;p&gt;Como engenheiros de software sabemos que existem inúmeras maneiras de resolvermos um problema. Sabemos também que existem boas ou não tão boas soluções e que elas podem ser impactadas por diversos fatores como falta de tempo, baixo conhecimento da tecnologia utilizada no projeto, falta de documentação técnica e de negócio.&lt;/p&gt;

&lt;p&gt;Compartilho com vocês uma solução que pode não ser a melhor, mas foi, a solução que atendeu bem a demanda impactada pela perda de conhecimento técnico e de negócio da jornada que precisava do desenvolvimento de uma funcionalidade bem pontual.&lt;/p&gt;




&lt;h3&gt;
  
  
  Funcionalidade
&lt;/h3&gt;

&lt;p&gt;A funcionalidade em si era bem tranquila, precisávamos alterar algumas cores dos componentes de uma jornada do nosso sistema, com base em uma informação do usuário.&lt;/p&gt;

&lt;p&gt;Após efetuarmos uma análise mais aprofundada nos projetos, identificamos que seria muito complicado implementarmos uma lógica que permitisse alterar de forma dinâmica os componentes.&lt;/p&gt;

&lt;p&gt;Escolhemos trazer a responsabilidade da mudança dos componentes para o projeto principal. Começamos a desenhar algumas soluções, como a jornada foi desenvolvida em Angular, inicialmente consideramos criar vários arquivos de SCSS específicos para serem carregados, sempre que o usuário, com a informação necessária para troca dos componentes, efetuasse login em nosso sistema.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Uma pequena observação sobre essa jornada: ela faz parte de um projeto em uma arquitetura de “&lt;a href="https://micro-frontends.org/" rel="noopener noreferrer"&gt;micro-frontend&lt;/a&gt;”, logo, essa abordagem foi desenvolvimento levando essa ponto em consideração.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Implementando Service
&lt;/h3&gt;

&lt;p&gt;O dado que precisamos é disponibilizado via um BFF (&lt;a href="https://medium.com/jeitosanar/backend-for-frontend-uma-estrat%C3%A9gia-sob-demanda-para-a-entrega-de-microsservi%C3%A7os-2f12d4cb9e3f" rel="noopener noreferrer"&gt;Backend for Frontend&lt;/a&gt;) desenvolvido para essa jornada, implementamos um novo endpoint, que retorna se o cliente contém ou não a informação que precisamos para efetuarmos as alterações no componente.&lt;/p&gt;

&lt;p&gt;Com endpoint implementado, o próximo passo foi desenvolver o &lt;a href="https://angular.io/tutorial/tour-of-heroes/toh-pt4" rel="noopener noreferrer"&gt;service&lt;/a&gt;, que tem a responsabilidade de chamar o serviço sempre que fosse necessário.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;ComponentService&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="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;http&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;getComponentInfo&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;ComponentModel&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;http&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;ComponentModel&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;url do BFF&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Implementando Guard
&lt;/h3&gt;

&lt;p&gt;No nosso “micro-forntend” implementamos um &lt;a href="https://angular.io/api/router/CanActivate" rel="noopener noreferrer"&gt;guard&lt;/a&gt;, que fica responsável por solicitar ao BFF a informação do cliente, sempre que o usuário acessa uma rota específica em nosso sistema.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ComponentGuard&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;CanActive&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="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;componentService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ComponentService&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="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;canActive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ActivatedRouteSnapshot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;RouterStateSnapshot&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;UrlTree&lt;/span&gt; &lt;span class="o"&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;boolean&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;UrlTree&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;UrlTree&lt;/span&gt;&lt;span class="o"&gt;&amp;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;keyName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keyName&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;keyName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&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;componentService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="na"&gt;componentType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keyName&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;componentType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;keyName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;styleProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;IStyleProperties&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="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s2"&gt;`--&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nameProperty&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;componentType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;newValueProperty&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defaultValueProperty&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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="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;styleProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;IStyleProperties&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="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="s2"&gt;`--&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nameProperty&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;keyName&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;newValueProperty&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defaultValueProperty&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&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;&lt;em&gt;Agora entraremos um pouco mais em detalhes da implementação.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Detalhes do Guard
&lt;/h3&gt;

&lt;p&gt;Verificamos que o dado não está armazenado no &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Storage" rel="noopener noreferrer"&gt;localStorage&lt;/a&gt;, efetuamos uma nova chamada para BFF, para saber se o usuário possui ou não a informação que precisamos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;componentService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;componentType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois, adicionamos novamente no localStorage.&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="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keyName&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;componentType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;keyName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criamos um arquivo de type bem simples, que contém informações de tipagem dos objetos que usamos para criação das variáveis de forma dinâmica.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;IStyleProperties&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;nameProperty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;newValueProperty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;defaultValueProperty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&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 um arquivo que contém todos os dados que precisamos para efetuar a customização na nossa jornada.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;IStyleProperties&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;IStyleProperties&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;const&lt;/span&gt; &lt;span class="nx"&gt;styleProperties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;IStyleProperties&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;nameProperty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;component-class&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;componentMain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;componentDefault&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#fff&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Partimos agora para o trecho código do nosso guard, responsável por adicionar as variáveis de CSS. Usando a função &lt;code&gt;[map](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/map)&lt;/code&gt;, pegamos todos os dados do arquivo de propriedades e criamos todas as variáveis necessárias para customização dos componentes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;styleProperties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;IStyleProperties&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="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;`--&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nameProperty&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;componentType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;newValueProperty&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defaultValueProperty&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;blockquote&gt;
&lt;p&gt;O &lt;code&gt;document.documentElement&lt;/code&gt; retorna o &lt;code&gt;[Elemento](https://developer.mozilla.org/pt-BR/docs/Web/API/Element)&lt;/code&gt; que é o elemento raiz do &lt;code&gt;[documento](https://developer.mozilla.org/pt-BR/docs/Web/API/Document)&lt;/code&gt; (por exemplo, o elemento &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; para documentos HTML).&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;[setProperty()](https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleDeclaration/setProperty)&lt;/code&gt; define um novo valor para uma propriedade em um objeto de declaração de estilo CSS.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No arquivo &lt;code&gt;app.component.scss&lt;/code&gt; recuperamos os valores das variáveis e alteramos o que precisamos dos componentes, para esse exemplo alteramos as fontes, background e algumas cores.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:host&lt;/span&gt; &lt;span class="nd"&gt;::ng-deep&lt;/span&gt; &lt;span class="nt"&gt;component-selector&lt;/span&gt; &lt;span class="nc"&gt;.component-class&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&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;--component-class-background-color&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;color&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;--component-class-color&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&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;--component-class-font-size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;:host&lt;/span&gt; &lt;span class="nd"&gt;::ng-deep&lt;/span&gt; &lt;span class="nt"&gt;other-component-selector&lt;/span&gt; &lt;span class="nc"&gt;.other-component-class&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&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;--other-component-class-border-radius&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;blockquote&gt;
&lt;p&gt;O seletor &lt;code&gt;[:host](https://developer.mozilla.org/en-US/docs/Web/CSS/:host_function)&lt;/code&gt;, seleciona o nódulo raiz do shadow DOM, que no caso pode ser representado por &lt;code&gt;&amp;lt;gui-lher-me&amp;gt;&lt;/code&gt;`. No exemplo ele é responsável por mudar a cor do fundo.&lt;/p&gt;

&lt;p&gt;A aplicação da pseudoclasse &lt;code&gt;[::dg-deep](https://angular.io/guide/component-styles)&lt;/code&gt; a qualquer regra CSS desativa completamente o encapsulamento de exibição dessa regra. Qualquer estilo com ::dg-deep aplicado torna-se um estilo global.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Por fim, implementamos o método &lt;code&gt;localStorage.removeItem('keyName');&lt;/code&gt; para limparmos o localStorage sempre que o usuário desloga do sistema.&lt;/p&gt;




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

&lt;p&gt;Meu objetivo em trazer esse case é mostrar que muitas vezes pensamos sempre em entregar a melhor solução possível, para área de negócio e os usuários finais, porém, algumas dessas vezes por questões tecnológicas e por falta de conhecimento do projeto, precisamos entregar a melhor solução naquele contexto que estamos inseridos.&lt;/p&gt;

&lt;p&gt;Espero que gostem do conteúdo, deixem o seu like, comentem e compartilhem a opinião de vocês, com dicas e sugestões de melhorias.&lt;/p&gt;

&lt;p&gt;~&amp;gt; &lt;a href="https://www.linkedin.com/in/lucasnsantos/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Referências
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://angular.io/tutorial/tour-of-heroes/toh-pt4" rel="noopener noreferrer"&gt;Add services&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.telerik.com/blogs/angular-basics-canactivate-introduction-routing-guards#:~:text=Angular%20route%20guards%20are%20interfaces,%2C%20CanLoad%2C%20CanDeactivate%20and%20Resolve." rel="noopener noreferrer"&gt;Angular Basics: CanActivate — Introduction to Routing Guards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Storage/setItem" rel="noopener noreferrer"&gt;Storage: setItem() method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Storage/getItem" rel="noopener noreferrer"&gt;Storage: getItem() method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Storage/removeItem" rel="noopener noreferrer"&gt;Storage: removeItem() method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties" rel="noopener noreferrer"&gt;Using CSS custom properties (variables)&lt;/a&gt;
&lt;a href="https://pt.stackoverflow.com/questions/309109/qual-%C3%A9-a-utilidade-do-host-host-e-host-context" rel="noopener noreferrer"&gt;Qual é a utilidade do :host, :host() e :host-context()&lt;/a&gt;
&lt;a href="https://angular.io/guide/component-styles" rel="noopener noreferrer"&gt;Component styles&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>frontend</category>
      <category>angular</category>
      <category>css</category>
      <category>bff</category>
    </item>
  </channel>
</rss>
