<?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: Tino Tech | Blog de tecnologia do Tino</title>
    <description>The latest articles on DEV Community by Tino Tech | Blog de tecnologia do Tino (@tino-tech).</description>
    <link>https://dev.to/tino-tech</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%2Forganization%2Fprofile_image%2F8283%2Fffdffb85-efa2-4263-8cfd-1b44958b3a0e.jpeg</url>
      <title>DEV Community: Tino Tech | Blog de tecnologia do Tino</title>
      <link>https://dev.to/tino-tech</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tino-tech"/>
    <language>en</language>
    <item>
      <title>Do clique à estratégia: como usamos o Snowplow Analytics para emitir e capturar eventos de clique</title>
      <dc:creator>Diana Regina</dc:creator>
      <pubDate>Thu, 05 Sep 2024 04:06:12 +0000</pubDate>
      <link>https://dev.to/tino-tech/do-clique-a-estrategia-como-usamos-o-snowplow-analytics-para-emitir-e-capturar-eventos-de-clique-pjl</link>
      <guid>https://dev.to/tino-tech/do-clique-a-estrategia-como-usamos-o-snowplow-analytics-para-emitir-e-capturar-eventos-de-clique-pjl</guid>
      <description>&lt;p&gt;Descubra como utilizamos o Snowplow, uma ferramenta de rastreamento de sites e aplicações para tomar melhores decisões de negocio e produto aqui no Tino. &lt;/p&gt;




&lt;p&gt;O &lt;a href="https://snowplow.io/" rel="noopener noreferrer"&gt;Snowplow Analytics&lt;/a&gt; é uma ferramenta open source destinada a coleta, armazenamento e analise de dados em sites e aplicativos, disponível tanto para linguagens do frontend como backend. &lt;/p&gt;

&lt;p&gt;Conseguimos gerar uma série de eventos para monitoramento de click, acesso a página, envio de formulário, entre outros. O snowplow faz um enriquecimento desses eventos disponibilizando dados como data e hora de coleta, tipo do dispositivo, cookies, IP e geolocalização. &lt;/p&gt;

&lt;p&gt;Esses dados podem ser enviados para uma data warehouse como a Amazon Redshift ou Google BigQuery para uma analise mais detalhada, sendo possível realizar integrações com outras ferramentas como o Excel ou Looker Studio para divulgar esses dados em forma de relatório ou dashboard e gerar insights sobre o negocio.&lt;/p&gt;




&lt;h3&gt;
  
  
  Porque o Snowplow Analytics impulsiona nosso business
&lt;/h3&gt;

&lt;p&gt;O Tino é um meio de pagamento pro B2B que está buscando seu &lt;em&gt;product marketing fit&lt;/em&gt;, ou seja, está buscando desenvolver um produto que atenda às necessidades e desejos dos clientes-alvo, e ter dados para entender o comportamento, otimizar fluxos, melhorar o produto e identificar oportunidades de mercado é essencial nesse processo.&lt;/p&gt;

&lt;p&gt;Um exemplo de como usamos o snowplow foi na edição de notas fiscais dos pedidos feitos pelos lojistas para fornecedores pagos via Tino. Foi desenvolvido um &lt;em&gt;fake door&lt;/em&gt;, uma técnica utilizada para entender o interesse dos usuários por uma determinada feature, e utilizamos os eventos de click do snowplow para metrificar esse interesse.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpr305lj4hw6rhx4ng8w9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpr305lj4hw6rhx4ng8w9.png" alt="Demonstração de como usamos o fake door para medir o interesse dos clientes pela funcionalidade de baixar NF" width="800" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após a coleta e analise dos eventos, foi possível validar a hipótese de que os clientes tinham interesse em ter essa funcionalidade e por tanto, foi implementada no produto.&lt;/p&gt;




&lt;h3&gt;
  
  
  Configuração e emissão dos eventos (quick tutorial)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Instalação das dependências
&lt;/h4&gt;

&lt;p&gt;O primeiro passo é instalar a dependência do snowplow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add @snowplow/browser-tracker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois, instale o plugin para emissão de eventos de clique:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add @snowplow/browser-plugin-button-click-tracking
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Configuração do evento
&lt;/h4&gt;

&lt;p&gt;Nessa etapa chamamos o tracker do snowplow com &lt;code&gt;newTracker()&lt;/code&gt; chamando 3 parâmetros correspondentes ao id do tracker, a URL do site que será monitorado e as configurações. Dentre elas o id da aplicação e um array de plugins, que levará o plugin para trackear todos os botões da aplicaçã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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;newTracker&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="s2"&gt;@snowplow/browser-tracker&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&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;enableButtonClickTracking&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;enableButtonClickTracking&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;@snowplow/browser-plugin-button-click-tracking&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;newTracker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sp1&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;{{collector_url}}&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="na"&gt;appId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-app-id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="nc"&gt;ButtonClickTrackingPlugin&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;enableButtonClickTracking&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por padrão, o snowplow vai considerar o texto do elemento como identificador do evento. Essa prática é ruim porque o monitoramento se torna muito sensível a uma mudança de UI. Se mudarmos o texto para “Baixar Nota Fiscal” por exemplo, o identificador do evento será alterado. &lt;/p&gt;

&lt;p&gt;Uma prática interessante para evitar essa problema de mudança é usar o parâmetro &lt;code&gt;data-sp-button-label&lt;/code&gt;, que funciona como uma especie de id para o snowplow nomear os eventos de clique a partir dele e não do texto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;data-sp-button-label=&lt;/span&gt;&lt;span class="s"&gt;"download-nf"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Baixar NF&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Parceria entre produto, engenharia e analytics
&lt;/h3&gt;

&lt;p&gt;A preocupação com o monitoramento do produto é algo que temos como premissa aqui no Tino, por tanto, é um trabalho feito a várias mãos entre o time de produto, engenharia e dados. Partimos da nossa principal métrica para avaliar o crescimento da empresa, o TPV, que corresponde ao valor total das transações processadas, isto é, quanto mais se paga com o Tino, maior é esse valor. &lt;/p&gt;

&lt;p&gt;Temos metas de TPV a serem batidas todos os semestres e o papel de produto é pensar em quais alavancas podem aumentá-lo. Um exemplo de alavanca seria aumentar a quantidade de compras pagas usando Tino, porém existem casos onde as pessoas abrem o &lt;em&gt;checkout&lt;/em&gt; mas fecham sem finalizar. &lt;/p&gt;

&lt;p&gt;A partir dessa dor precisamos entender, são pessoas que precisaram passar por um cadastro antes? A forma de pagamento oferecida não é adequada? Ela não tem limite suficiente? Para responder essas perguntas, precisamos de dados. &lt;/p&gt;

&lt;p&gt;Cabe a engenharia ajudar o time de produto a entender quais métricas/eventos já temos para responder essas perguntas e se não, o que precisamos fazer para responde-las. Dado que temos o monitoramento funcionado, o time de dados faz a extração dos dados, que junto do time de produto poderá gerar dashboards e relatórios para gerar insights para responder aquelas perguntas.&lt;/p&gt;




&lt;p&gt;Obrigada por chegar ao final da leitura! Espero que esse artigo tenha contribuído para o seu conhecimento sobre Snowplow. Caso tenha algum feedback ou queria contar como sua empresa monitora seus produtos, por favor coloque nos comentários :)&lt;/p&gt;

&lt;p&gt;Se você deseja fazer parte do time que busca fazer com que empreender seja uma missão menos impossível, vem pro Tino!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Referências:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/afya/desvendando-o-comportamento-dos-usu%C3%A1rios-como-construimos-produtos-de-maneira-data-driven-6cb0a0b2ed9" rel="noopener noreferrer"&gt;&lt;strong&gt;Desvendando o comportamento dos usuários: Como construimos produtos de maneira Data-Driven&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.snowplow.io/docs/collecting-data/collecting-from-own-applications/javascript-trackers/web-tracker/quick-start-guide/?platform=browser" rel="noopener noreferrer"&gt;&lt;strong&gt;Quick Start Guide - Snowplow&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.snowplow.io/docs/collecting-data/collecting-from-own-applications/javascript-trackers/web-tracker/tracking-events/button-click/" rel="noopener noreferrer"&gt;&lt;strong&gt;Button Click Tracking - Snowplow&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>frontend</category>
      <category>dados</category>
      <category>snowplow</category>
      <category>analytics</category>
    </item>
    <item>
      <title>O impacto das PWAs no desenvolvimento de apps</title>
      <dc:creator>Gabriel Teodoro</dc:creator>
      <pubDate>Wed, 31 Jul 2024 14:51:09 +0000</pubDate>
      <link>https://dev.to/tino-tech/o-impacto-das-pwas-no-desenvolvimento-de-apps-46gl</link>
      <guid>https://dev.to/tino-tech/o-impacto-das-pwas-no-desenvolvimento-de-apps-46gl</guid>
      <description>&lt;p&gt;Progressive Web Apps (PWAs) têm se destacado como uma abordagem poderosa para combinar as melhores características das aplicações web e das aplicações móveis nativas. Com a capacidade de oferecer uma experiência de usuário rápida, confiável e engajadora, as PWAs são uma escolha popular para muitos desenvolvedores que buscam alcançar um público amplo, independentemente do dispositivo ou plataforma.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que são PWAs?
&lt;/h3&gt;

&lt;p&gt;Progressive Web Apps são aplicações web que utilizam tecnologias modernas para proporcionar uma experiência nativa aos usuários. Elas são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Progressivas&lt;/strong&gt;: Funcionam para todos os usuários, independentemente do navegador escolhido, pois são construídas com aprimoramento progressivo como princípio fundamental.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsivas&lt;/strong&gt;: Adaptam-se a diferentes tamanhos de tela e dispositivos, oferecendo uma experiência consistente e otimizada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conectadas&lt;/strong&gt;: Utilizam Service Workers para funcionar offline ou em conexões de rede instáveis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seguras&lt;/strong&gt;: Servidas via HTTPS para garantir que o conteúdo não seja interceptado e manipulado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engajadoras&lt;/strong&gt;: Podem ser instaladas diretamente no dispositivo do usuário, permitindo acesso rápido e direto, sem necessidade de passar pela loja de aplicativos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Benefícios das PWAs
&lt;/h3&gt;

&lt;p&gt;Desenvolver PWAs oferece diversas vantagens, incluindo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Acessibilidade&lt;/strong&gt;: Ampliam o alcance da aplicação para uma base de usuários mais ampla, incluindo dispositivos com conexões de internet mais lentas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Economia de espaço&lt;/strong&gt;: Não ocupam espaço significativo no dispositivo do usuário, como as aplicações nativas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atualizações automáticas&lt;/strong&gt;: As atualizações são aplicadas automaticamente, proporcionando uma experiência sempre atualizada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO amigável&lt;/strong&gt;: São facilmente indexáveis por mecanismos de busca, melhorando a visibilidade online da aplicação.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tecnologias e Práticas Recomendadas
&lt;/h3&gt;

&lt;p&gt;Para desenvolver uma PWA eficaz, é importante considerar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Manifesto Web&lt;/strong&gt;: Criação de um manifesto web (manifest.json) para descrever a aplicação, incluindo nome, ícone, cores temáticas e outras informações relevantes para a instalação na tela inicial dos dispositivos móveis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service Workers&lt;/strong&gt;: Implementação de Service Workers para gerenciar o cache e oferecer funcionalidade offline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsividade&lt;/strong&gt;: Garantia de que a aplicação seja totalmente responsiva, utilizando media queries e técnicas de design responsivo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Segurança&lt;/strong&gt;: Garantia de que a aplicação seja servida via HTTPS para proteger os dados dos usuários e garantir a integridade das informações.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Como usamos no Tino esse recurso?
&lt;/h3&gt;

&lt;p&gt;Tinhamos aqui no Tino uma dúvida sobre o interesse do usuário a baixar ou utilizar algum aplicativo, utilizamos o PWA como um recurso rápido e barato para experimentar essa hipótese.&lt;/p&gt;

&lt;p&gt;Primeiro implementamos as configurações mínimas para o PWA funcionar e com uma boa experiência para instalação, infelizmente somente para android é possível criar uma experiência mais fluida onde um botão na tela permite executar o processo de instalar o App.&lt;/p&gt;

&lt;p&gt;Algumas semanas depois mais de 30% dos nossos acessos já eram através do PWA instalado no celular dos nossos usuários, comprovando assim um forte interesse a adoção e uso de um App, guiando nossas escolhas de produto por impacto e valor gerado.&lt;/p&gt;

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

&lt;p&gt;Desenvolver aplicações PWA permite aos desenvolvedores oferecer uma experiência de usuário de alta qualidade que combina o melhor das aplicações web e nativas. Ao adotar as melhores práticas e tecnologias modernas, é possível criar PWAs que não apenas atendem, mas superam as expectativas dos usuários em termos de desempenho, confiabilidade e usabilidade.&lt;/p&gt;

&lt;p&gt;Este caminho de desenvolvimento não apenas melhora a acessibilidade e a experiência do usuário, mas também simplifica o processo de distribuição e manutenção da aplicação em diferentes plataformas e dispositivos.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>pwa</category>
      <category>mobile</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Design System e Tokens no Tino</title>
      <dc:creator>Robson Mathias</dc:creator>
      <pubDate>Wed, 17 Jul 2024 19:07:42 +0000</pubDate>
      <link>https://dev.to/tino-tech/design-system-e-tokens-no-tino-3njm</link>
      <guid>https://dev.to/tino-tech/design-system-e-tokens-no-tino-3njm</guid>
      <description>&lt;p&gt;Imagine a seguinte situação: uma engenheira e um designer estão construindo uma aplicação juntos. A desenvolvedora pergunta:&lt;/p&gt;

&lt;p&gt;— Qual vai ser a cor e fonte do botão?&lt;/p&gt;

&lt;p&gt;Em resposta o Designer diz:&lt;/p&gt;

&lt;p&gt;— É a mesma da Brand, &lt;strong&gt;#FF7A00&lt;/strong&gt; e a fonte pode ser a &lt;strong&gt;Inter&lt;/strong&gt;…&lt;/p&gt;

&lt;p&gt;Basicamente é isso que vai acontecer se não utilizarem algum nome que sirva de referência para as duas pessoas. Essas referências chamam-se &lt;strong&gt;Design Tokens.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é um Design Token?
&lt;/h3&gt;

&lt;p&gt;É uma &lt;strong&gt;Variável semântica de estilo&lt;/strong&gt;, um termo atribuído pela &lt;a href="https://medium.com/u/6afd5f8e05c1" rel="noopener noreferrer"&gt;Meiuca Design&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Variável —&lt;/strong&gt; Que pode ser variado ou mudado; mudável — Definição por &lt;a href="https://michaelis.uol.com.br/busca?id=V4mPA" rel="noopener noreferrer"&gt;Michaelis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semântica —&lt;/strong&gt; O significado dos vocábulos, por oposição à sua forma — Definição por &lt;a href="https://michaelis.uol.com.br/busca?r=0&amp;amp;f=0&amp;amp;t=0&amp;amp;palavra=Sem%C3%A2ntica" rel="noopener noreferrer"&gt;Michaelis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkv7dn920ihym1n9z7x4y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkv7dn920ihym1n9z7x4y.png" alt="Image description" width="707" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora imagine novamente a situação proposta anterior:&lt;/p&gt;

&lt;p&gt;A desenvolvedora pergunta:&lt;/p&gt;

&lt;p&gt;— Qual vai ser a cor e fonte do botão?&lt;/p&gt;

&lt;p&gt;Em resposta o Designer diz:&lt;/p&gt;

&lt;p&gt;É a mesma da Brand, &lt;strong&gt;PalettePrimaryMain&lt;/strong&gt; e a fonte pode ser a &lt;strong&gt;FontFamilyDefault.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agora até mesmo para quem não é uma pessoa desenvolvedora, as definições fazem sentido, basta um conhecimento básico de inglês.&lt;/p&gt;

&lt;h3&gt;
  
  
  No que isso ajuda exatamente?
&lt;/h3&gt;

&lt;p&gt;Basicamente na organização e escalabilidade de times. Aqui no Tino, queremos facilitar a vida dos Designers e Desenvolvedores. Quanto maior o nosso time fica, mais componentes criamos. Os Design Tokens permitem que alteremos propriedades dos nossos elementos de uma forma mais rápida, além de facilitar a comunicação entre as pessoas.&lt;/p&gt;

&lt;p&gt;Os Design Tokens podem ser declarados de várias formas: JSON, folha de estilos, XML e etc. Nós optamos por utilizar um recurso de composição dinâmica que nos permite exportar para qualquer formato que nosso produto precisa — só esse processo já vale um post a parte sobre como funciona e como construímos esse ecossistema!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo361c98bqh4ov9c0b0zz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo361c98bqh4ov9c0b0zz.png" alt="Image description" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Regras e composições de Design Tokens
&lt;/h3&gt;

&lt;p&gt;Para ajudar com a semântica, criamos uma estrutura que ajuda a compor melhor os nomes dos nossos tokens. Essa estrutura segue uma hierarquia e ordem que deve ser respeitada. Ela é composta por seis definições:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grupo&lt;/strong&gt; — &lt;strong&gt;Componente&lt;/strong&gt; — &lt;strong&gt;Categoria&lt;/strong&gt; — &lt;strong&gt;Variante&lt;/strong&gt; — &lt;strong&gt;Propriedade&lt;/strong&gt; — &lt;strong&gt;Estado&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Essas definições são colocadas como um guia para ajudar a compor os nomes. Não é preciso preencher todos esses requisitos, somente &lt;strong&gt;Grupo&lt;/strong&gt; e &lt;strong&gt;Variante&lt;/strong&gt; são obrigatórios.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkkyfrzkrezbq0ow2r26n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkkyfrzkrezbq0ow2r26n.png" alt="Image description" width="800" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos entender melhor cada item dessa estrutura:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grupo —&lt;/strong&gt; Identificador principal que agrupa um conjunto de elementos da mesma família, exemplo: (&lt;strong&gt;Button, Typography, Label&lt;/strong&gt; etc.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Componente&lt;/strong&gt; — Elemento que possui um ecossistema complexo, que possui comportamento e filhos, como (&lt;em&gt;Button&lt;/em&gt;&lt;strong&gt;Outline&lt;/strong&gt;, &lt;em&gt;Label&lt;/em&gt;&lt;strong&gt;Outline&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Categoria&lt;/strong&gt; — Modelo de um componente. Um componente pode possuir mais de um modo de exibir comportamento, como (&lt;em&gt;ButtonOutline&lt;/em&gt;&lt;strong&gt;Primary&lt;/strong&gt;, &lt;em&gt;LabelOutline&lt;/em&gt;&lt;strong&gt;Secondary&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Variante&lt;/strong&gt; — Ao pensar em variante, pensamos em uma interação direta aplicada ao componente que faz variar seu estilo, como (&lt;strong&gt;Hovered&lt;/strong&gt;, &lt;strong&gt;Pressed&lt;/strong&gt;, &lt;strong&gt;Disabled&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Propriedade&lt;/strong&gt; — Um componente pode possuir propriedades relacionadas, como (&lt;strong&gt;Icon, Label, Text, Item&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Estado&lt;/strong&gt; — É a parte mais baixa da definição, muitas vezes relacionada ao valor ou situação do elemento naquele momento, (&lt;strong&gt;Color, Size, LetterSpace, Margin&lt;/strong&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Acordos e definições
&lt;/h3&gt;

&lt;p&gt;Como garantir que os designers e desenvolvedores criem novos Design Tokens sem fugir de nomes e estruturas similares aos demais? A solução para isso foi adotarmos acordos para garantir que criaremos no mesmo formato. Vamos listar alguns exemplos:&lt;/p&gt;

&lt;h3&gt;
  
  
  Valores de escalas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Breakpoints (T-shirt format alias): &lt;strong&gt;xl, lg, md, sm, xs.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Size (T-shirt format): &lt;strong&gt;XSmall, Small, Large, XLarge, 2XLarge, etc… .&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Colors (Bounded Scale): &lt;strong&gt;50 ,100, 150, …900, A100, A200, A400, A700.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Main colors (Terms): &lt;strong&gt;Light, Main, Dark, ContrastText.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Elevations, Shadows(Intervals): 0, 1, 2, 3…&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Escrita
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Escrever verbos no passado.&lt;/li&gt;
&lt;li&gt;Evitar nomes compostos.&lt;/li&gt;
&lt;li&gt;Não utilizar valores numéricos em &lt;strong&gt;Grupo.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Construindo componentes com Design Tokens
&lt;/h3&gt;

&lt;p&gt;Um componente é composto por &lt;strong&gt;design tokens.&lt;/strong&gt; Para facilitar a leitura chamaremos apenas de &lt;strong&gt;tokens&lt;/strong&gt;. Durante a composição do Design System identificamos que muitos componentes possuem tokens similares. Para garantir a consistência desses tokens, decidimos aplicar um padrão de herança, onde permitimos que cada componente possua tokens customizados, mas qualquer outro token que seja igual, precisa fazer referência de uma mesma fonte que chamamos de &lt;strong&gt;Foundation&lt;/strong&gt;. Exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdmohvrrvoex7t07zuxu9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdmohvrrvoex7t07zuxu9.png" alt="Image description" width="800" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa separação entre &lt;strong&gt;Foundation&lt;/strong&gt; e &lt;strong&gt;Components&lt;/strong&gt; garante na nossa estrutura centralizar os pontos de mudanças, sem perer o poder de customizar cenários específicos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Documentando componentes
&lt;/h3&gt;

&lt;p&gt;Utilizamos Storybook, tanto para documentar componentes quanto para documentar os tokens dos componentes. É o que parece mesmo, separamos em pacotes diferentes, um pacote de apenas tokens sem elementos visuais, somente variáveis e valores, e cada outro componente ou família de componentes possui um pacote isolado, mas todos fazem referência ao pacote de Tokens, assim gerenciar versões isoladamente dos elementos.&lt;/p&gt;

&lt;p&gt;Cada pacote possui um storybook para si (falaremos melhor sobre esse ecossistema em uma publicação futura). No caso do pacote de tokens, tivemos que criar um storybook addon, para exibir e registrar a descrição dos valores, exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzddbog4lsm5roxlyz4i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzddbog4lsm5roxlyz4i.png" alt="Image description" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  E como funciona entre o Figma e o Código?
&lt;/h3&gt;

&lt;p&gt;Nosso objetivo como fundação do Design System é estabelecer um acordo que tanto desenvolvedores quanto designers evitem quebrar. Não poderia ser apenas um documento escrito, pois isso não se sustentaria a longo prazo. Por isso, criamos algo que ofereça vantagens reais para ambos os lados ao seguir e adotar o sistema.&lt;/p&gt;

&lt;p&gt;Desenvolvemos uma biblioteca com um algoritmo que extrai informações de estilo de um documento do Figma através de suas APIs. Isso permite acessar todas as informações de estilos, nomes e vetores disponíveis em um documento.&lt;/p&gt;

&lt;p&gt;Com os valores dos estilos e as regras semânticas mencionadas no início desta publicação, conseguimos criar um elo que se estende do Figma ao código front-end. Em outras palavras, a mudança ou adição de um token publicada no Figma gera uma PR (pull request) em um repositório com os novos valores em código CSS, SASS, Typescript, Dart, ou qualquer outra linguagem. Os front-ends podem então aprovar e publicar esses valores como pacotes privados para nossa organização. Isso mesmo, não precisamos que um desenvolvedor seja acionado para adicionar um novo token ou ícone; conseguimos extrair tudo automaticamente por API e Webhook do Figma.&lt;/p&gt;

&lt;p&gt;Se quiser saber mais sobre como isso funciona, siga a página do Tino. Em breve, explicaremos essa biblioteca e os fluxos com mais detalhes.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>designsystem</category>
      <category>figma</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Cebolas e camadas para padrões de projetos no Front-end — Parte I</title>
      <dc:creator>Robson Mathias</dc:creator>
      <pubDate>Wed, 19 Jun 2024 12:35:40 +0000</pubDate>
      <link>https://dev.to/tino-tech/cebolas-e-camadas-para-padroes-de-projetos-no-front-end-parte-i-55af</link>
      <guid>https://dev.to/tino-tech/cebolas-e-camadas-para-padroes-de-projetos-no-front-end-parte-i-55af</guid>
      <description>&lt;p&gt;Nesse texto, tenho como objetivo trazer uma alternativa de padrões de projetos front-ends, esse padrão funciona independente do framework ou biblioteca.&lt;/p&gt;

&lt;p&gt;A estrutura proposta neste artigo utiliza alguns recursos e nomenclaturas conhecidas pela comunidade do ReactJS, mas outras são uma inspiração de outros ecossistemas como Angular e similares, a ideia é compartilhar um padrão que já adotei em alguns projetos e que serve muito bem para um monolito escalável, e com uma ótima fórmula para modelar um ecossistema que poderá evoluir para um micro-frontend em um futuro próximo.&lt;/p&gt;

&lt;h1&gt;
  
  
  O que vamos encontrar aqui?
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Um projeto To-Do List com ReactJs e arquitetura onion.&lt;/li&gt;
&lt;li&gt;Referências a outras publicações que irá descrever melhor alguns contextos e implementações.&lt;/li&gt;
&lt;li&gt;Uma simples comparação entre uma arquitetura layered e uma onion.&lt;/li&gt;
&lt;li&gt;Um relato dos projetos em que implementei essa composição com pontos positivos e negativos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Mas antes de começar:
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;O projeto de exemplo não possui uma API para gerenciar acessos e salvar dados, ou seja, os dados são salvos localmente no navegador.&lt;/li&gt;
&lt;li&gt;Essa arquitetura não é uma bala de prata, é complexa e robusta para escalar grandes projetos, para algo menor considere recursos mais objetivos como um MVC por exemplo.&lt;/li&gt;
&lt;li&gt;Os nomes podem ser modificados e adaptados para cada organização e contexto.&lt;/li&gt;
&lt;li&gt;É uma arquitetura conhecida no mundo back-end então, possuímos muitos posts e referência sobre ela, mas são sobre aplicações back-end.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Porque eu preciso adotar padrões de projetos?
&lt;/h1&gt;

&lt;p&gt;O conceito de padrões foi primeiramente descrito por Christopher Alexander em &lt;a href="https://www.amazon.com.br/Uma-Linguagem-Padr%C3%B5es-Christopher-Alexander/dp/8565837173/"&gt;Uma Linguagem de Padrões&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Padrões de projeto são soluções comuns para alguns problemas típicos, mas acredito que não deva ser algo que seja uma organização de arquivos que fica mais bonita ou que agrade a preferência do programador que está construindo, porque tudo isso é sempre do ponto de vista de quem implementa. Para, ser imparcial durante a definição de um bom padrão de projeto eu levo alguns pontos em consideração de que ele precisa cumprir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Testabilidade&lt;/strong&gt; — Que seja possível implementar diferentes testes (unitário, integrado, E2E, mutação, regressão e etc…), precisa ser fácil testar, a porcentagem de coverage não significa qualidade de teste e muito menos de software, porém quanto mais difícil de testar mais cenários os desenvolvedores irá deixar de testar ao longo do caminho.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manutenabilidade&lt;/strong&gt; — A alteração de algo em funcionamento, não deveria afetar muitos lugares do organismos. Abstrações e camadas podem parecer burocráticas e verbosa, mas elas garantem a manutenção, isolamento do contexto e sua sanidade no futuro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalabilidade&lt;/strong&gt; — Uma aplicação assim como uma cidade precisa ser preparada para abrigar muitos cidadãos (usuários) e os engenheiros que irão mantê-la (devs). Não é só escalar apenas código, é escalar a capacidade de muitas pessoas atuarem no mesmo projeto, um projeto grande com muitas pessoas, irá enfrentar problemas como: CI/CD, Ambiente de deploy, PRs e merges, rollback, estratégias de deploy e etc. Para todas as nossas decisões temos que levar isso em consideração.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separação de responsabilidades (SoC — separation of concerns)&lt;/strong&gt; — Isolar domínios e responsabilidades, permite um compartilhamento melhor de recursos sem afetar a performance e complexidade da sua aplicação.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observabilidade —&lt;/strong&gt; Se algo quebrou, eu preciso saber o que e em qual momento isso aconteceu, preciso atuar e reverter o problema de maneira rápida e eficiente, garantindo que o erro não volte mais a acontecer. Como podemos saber qual é a parte da sua aplicação que mais consome performance? Será que só usar a URL é o suficiente para entender quantos elementos e domínios temos ali e o que eles realmente fazem?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evitar pastas genéricas e sem propósito, shared e utils —&lt;/strong&gt; Quando não conseguimos separar bem nossas entidades e camadas, começamos a criar acoplamento entre os recursos, gerando a necessidade de criar pastas para shared ou utils. Funciona para o primeiro elemento, mas depois de um tempo, os desenvolvedores não irão gastar muito tempo pensando sobre o domínio das coisas, e tudo será útil ou shared.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Entre camas e cebolas.
&lt;/h1&gt;

&lt;p&gt;Uma padrão de projeto de camadas tradicional (layered pattern), o fluxo de dependências entre as camadas segue de cima para baixo. Na camada superior encontramos a área de interface do usuário (User Interface), no meio o processamento das informações (Business), e na base a saída ou entrada de dados para um serviço externo (Data).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6y1fylglht19fyl9ts8z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6y1fylglht19fyl9ts8z.png" alt="Layered architecture — Arquitetura em Camadas" width="400" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fazendo uma sim analogia com uma estrutura em React:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F105c5eln3qbbngxsyshn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F105c5eln3qbbngxsyshn.png" alt="Exemplo de composição de componentes com React." width="800" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O grande ponto sobre esse padrão é o forte acoplamento entre as camadas, uma vez que é preciso substituir qualquer uma delas, as outras camadas relacionadas sofrem uma grande alteração ou conflito de comportamento. Ou seja, imagina que precisamos mudar a camada de Data de um Rest API para um GraphQL, a camada de business sofreria diretamente com essa mudança, além da baixa reutilização dos mesmos recursos em lugares diferentes.&lt;/p&gt;

&lt;p&gt;Agora invertemos a ordem das dependências, colocando como centro a nossa camada de Business e as camadas de Data e User Interface como referências ao business. Temos uma forma de garantir que, o que é importante para nossa aplicação, fique segura de mudanças garantindo que as camadas externas fiquem responsáveis por lidar com o mundo exterior.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6ei297nipe81b07q7vm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6ei297nipe81b07q7vm.png" alt="Inversão das camadas levando o business como principal referência." width="400" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos mudar um pouco mais o formato do desenho:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frzvs5904uqp4z1ovypx6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frzvs5904uqp4z1ovypx6.png" alt="Convertendo o desenho da camada para um primeiro formato da nossa cebola." width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dessa forma, o que temos de evidência?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O Foco é a parte central da nossa aplicação &lt;strong&gt;o business&lt;/strong&gt;, é onde a nossa mudança de negócio e evolução irá acontecer ao longo do tempo. Em alguns casos é possível manter uma linguagem mais pura, sem muitos recursos atrelado a um framework.&lt;/li&gt;
&lt;li&gt;User Interface e Data são camadas periféricas, onde os recursos são substituíveis e podem ser atrelados a um recurso ou tecnologia.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Evoluindo nossa cebola
&lt;/h1&gt;

&lt;p&gt;Podemos quebrar ainda mais as camadas dividindo responsabilidades:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foauzk06rrn1ws7lnoplt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foauzk06rrn1ws7lnoplt.png" alt="Onion Architecture — Arquitetura Onion" width="400" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A camada de user Interface se torna:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Presentation&lt;/strong&gt; — Essa é a camada relacionada ao dispositivo do usuário, seja para web, navegador ou mobile. Os controles de rotas, parâmetros de urls, diagramação visual da página e composição de múltiplos domínios, devem ser tratados aqui. No caso de uma aplicação de front-end os componentes de UI também se encontram aqui, ou seja tome cuidado ao utilizar contextos de domínios em componentes que são apenas UI como Button por exemplo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Business é composta de:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Application&lt;/strong&gt; — Essa camada do Business é considerada como operador do domínio, conhecido por alguns como os “Use Cases (Caso de usos)”, são métodos ou componentes que cumprem uma função de controlar o estado do domínio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain&lt;/strong&gt; — Já na camada de domínio, encontramos o controle das nossas principais entidades. “Todos os objetos de uma aplicação deveriam ser uma entidade?” A resposta é não necessariamente, quando você se encontra em uma situação que precisa compartilhar a mesma informação entre dois organismos distintos e vizinhos, você se esbarra no problema da Mutabilidade, logo conseguimos resolver isso com uma entidade Imutável que é parte do domínio. Se o seu domínio for um método de composição de objeto ao invés de um objeto em si também funciona, é um comportamento muito comum em uma estrutura de Functional Programing.&lt;/p&gt;

&lt;h2&gt;
  
  
  A camada de Data é separada em:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Persistence&lt;/strong&gt; — Nem todas as aplicações que trabalhei precisou dessa camada, mas cada vez mais tempos aplicações front-ends que permitem o usuário utilizar recursos offline. Logo precisamos persistir um dado primeiramente no dispositivo do usuário, antes de enviar para o back-end. Essa camada abstrai a forma que persistimos essa informação, seja através de um Index DB, Local storage ou memória volátil. Novamente o nosso domínio não deveria se importar quem e como essas informações chegam ou saem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt; — Aqui configuramos a camada de serviço e adaptadores, uma forma de criar métodos e clientes para controlar nossas chamadas com o back-end, seja ela através de Rest API, Web Assembly, GRPC ou qualquer outro recurso, novamente nosso domínio poderia apenas esperar uma promessa de dados seja como for, a camada de infraestrutura deve se resolver para passar esse acordo. Outra coisa bacana, podemos adicionar aqui transformadores e compositores, ou seja nossa entidade do domínio pode ser um objeto que para existir, precisa ser composto por uma ou mais APIs e modificações em dados, na falta de um BFF, a camada de service trabalha muito bem removendo essa composição do seu domínio e entregando um dado mais puro para as camadas de dentro da cebola.&lt;/p&gt;

&lt;h1&gt;
  
  
  As pastas e arquivos precisam respeitar esses nomes?
&lt;/h1&gt;

&lt;p&gt;Não necessariamente, é claro que se estiver com esses nomes facilita a identificação dos contextos por aqueles que já conhecem esse padrão. Porém a adoção dos padrões é um acordo entre os desenvolvedores, e para todos os projetos que implementei, a nomenclatura dos organismos ainda foram o ponto de resistência à mudança pelos desenvolvedores Front-ends. Então minha escolha foi manter os organismos com nomes já conhecido pela comunidade, e criar um dicionário explicando onde se encaixa cada um deles e seus respectivos papéis para o projeto.&lt;/p&gt;

&lt;p&gt;Para entender melhor como cada camada ou elemento disso se comporta e funciona, leia a parte 2 dessa publicação.&lt;/p&gt;

&lt;h1&gt;
  
  
  Pontos positivos
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Essa estrutura permite tomar decisões mais tarde, ou seja, podemos desenvolver uma feature ou módulo, sem precisar esperar a API ficar pronta, conseguimos criar um mock dos dados e mudar isso no futuro sem afetar o domínio.&lt;/li&gt;
&lt;li&gt;Facilita muito para testar e conseguir garantir uma boa cobertura e qualidade de test.&lt;/li&gt;
&lt;li&gt;É fácil identificar a quebra de um módulo e features em pequenas atividades e PRs.&lt;/li&gt;
&lt;li&gt;Exclui a necessidade de pastas como shared, utils e recursos que são uma gaveta de quinquilharias, no começo do projeto faz sentido, depois de um ano não sabemos se tudo que tem lá é realmente para ser compartilhado ou útil.&lt;/li&gt;
&lt;li&gt;Essa estrutura funciona para qualquer tipo de linguagem ou tecnologia, já usei com projetos Angular, React + NextJS, React, React + Gatsby, VUE e etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Pontos negativos
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;A curva de aprendizado é um pouco mais demorada, é uma estrutura robusta e complexa que exige um entendimento do porquê das coisas.&lt;/li&gt;
&lt;li&gt;Antes de desenvolver um domínio é preciso gastar tempo pensando como ele será, o que é relacionado ao seu contexto e o que não é.&lt;/li&gt;
&lt;li&gt;Possui camadas de abstração mesmo que pareça redundante.&lt;/li&gt;
&lt;li&gt;Diferente do Java que é uma linguagem que possui recursos como “Protected”, que consegue bloquear o uso indevido de algumas funcionalidades, o javascript é modo “Freestyle” onde tudo é possível, mas nem tudo deveria ser permitido. Então criar bons padrões de alias, ajuda a identificar quando alguém está usando algo de forma errada.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Código de exemplo:&lt;br&gt;
&lt;a href="https://github.com/RobsonMathias/frontend-onion-architecture"&gt;https://github.com/RobsonMathias/frontend-onion-architecture&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fontes de estudos:&lt;br&gt;
&lt;a href="https://refactoring.guru/pt-br/design-patterns"&gt;https://refactoring.guru/pt-br/design-patterns&lt;/a&gt;&lt;br&gt;
&lt;a href="https://code-maze.com/onion-architecture-in-aspnetcore"&gt;https://code-maze.com/onion-architecture-in-aspnetcore&lt;/a&gt;&lt;br&gt;
&lt;a href="https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1"&gt;https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1&lt;/a&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>architecture</category>
      <category>react</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Reduzindo o tempo da pipeline em x3 vezes</title>
      <dc:creator>Gabriel Teodoro</dc:creator>
      <pubDate>Tue, 18 Jun 2024 17:56:29 +0000</pubDate>
      <link>https://dev.to/tino-tech/reduzindo-o-tempo-da-pipeline-em-x3-vezes-1pd8</link>
      <guid>https://dev.to/tino-tech/reduzindo-o-tempo-da-pipeline-em-x3-vezes-1pd8</guid>
      <description>&lt;p&gt;Nesse texto, tenho como objetivo compartilhar a nossa estratégia para diminuir o tempo que nossa pipeline de CI/CD demorava para ser executada, essa estratégia pode ser aplicada independente do framework ou biblioteca.&lt;/p&gt;

&lt;p&gt;Esse artigo usará um projeto de front-end que demorava 15 minutos para ter sua pipeline concluída. Iremos considerar a pipeline com: Autenticação no NPM, Instalação de bibliotecas, Lint de arquivos e tipagem, Build, Deploy, Testes (E2E, Unitários e Integrados).&lt;/p&gt;

&lt;h2&gt;
  
  
  O que você encontrará nesse artigo?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Importância de reduzirmos o tempo de nossas pipelines&lt;/li&gt;
&lt;li&gt;Estratégia para redução de tempo de execução&lt;/li&gt;
&lt;li&gt;Referências a documentação de ferramentas que estamos utilizando&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Antes de começar
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O projeto front-end que vamos usar roda com React e Webpack inicialmente&lt;/li&gt;
&lt;li&gt;Essa estratégia não é uma bala de prata, só aplicamos ela depois de 3 anos no nosso monolito front-end, evite fazer otimizações prematuras em seu projeto&lt;/li&gt;
&lt;li&gt;Pode ser aplicado para projetos de diferentes contextos, porém é necessário analisar se a etapa de build faz sentido ser modificada&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Por que eu preciso me preocupar com o tempo da pipeline?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Impacto na entrega de valor&lt;/strong&gt; - Uma pipeline demorada afeta de maneira significativa a entrega de valor para o usuário, causando falta de eficiência em disponibilizar recursos ou correções para o usuário.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalabilidade&lt;/strong&gt; - Quanto mais o projeto cresce, mais a sua pipeline vai demorar para ser concluída. Em algum momento será mais custoso esperar a pipeline ser concluída do que desenvolver a solução.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Colaboração&lt;/strong&gt; - Em um time com muitos engenheiros, uma pipeline demorada vai causar um grande gargalo de entregas. Onde um engenheiro irá fazer o merge de uma Pull Request e os outros precisaram rodar a pipeline novamente por conta da mudança. Com a pipeline demorada, isso vai gerar um grande gargalo e vai ficar quase que impossível de se entregar novas soluções.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Otimização de custos&lt;/strong&gt; - A maioria das ferramentas cobram por tempo de execução da pipeline, quanto mais a sua pipeline demorar maior será o custo final.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Encontrando os gargalos dentro da nossa pipeline
&lt;/h2&gt;

&lt;p&gt;Com a imagem abaixo, podemos analisar o tempo que cada etapa leva para completar a execução de nossa pipeline.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs4elxeph8dcstffe52in.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs4elxeph8dcstffe52in.png" alt="Image description" width="374" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Paralelizando nossa pipeline
&lt;/h2&gt;

&lt;p&gt;Nesse projeto estamos usando o Cloud Build da GCP, com isso não conseguimos ter etapas paralelas dentro de um único trigger. Para isso vamos criar dois novos triggers, um para os testes unitários e outro para os testes integrados, dessa forma eles vão rodar de forma paralela e já irá causar uma redução considerável em nossa pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reduzindo o tempo de 15 minutos para 7 minutos.
&lt;/h3&gt;

&lt;p&gt;É importante notar que não vamos conseguir paralelizar os testes E2E, por que eles dependem da etapa de deploy, que depende da etapa de build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aprimorando os resultados
&lt;/h2&gt;

&lt;p&gt;Uma forma de aprimorarmos o nosso resultado é melhorando o tempo de build, nesse projeto estávamos usando React com Webpack, com isso o tempo de build levava 3 minutos. Para solucionarmos isso, analisamos algumas ferramentas do mercado e optamos por usar o Vite. Você pode encontrar mais informações sobre o &lt;a href="https://medium.com/r/?url=https%3A%2F%2Fvitejs.dev%2Fguide%2Fwhy.html" rel="noopener noreferrer"&gt;Vite aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Aplicando o Vite em nosso projeto, conseguimos obter esse resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1st2bbs8gazxtrdefnv6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1st2bbs8gazxtrdefnv6.png" alt="Image description" width="742" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://cloud.google.com/build?hl=en" rel="noopener noreferrer"&gt;https://cloud.google.com/build?hl=en&lt;/a&gt;&lt;br&gt;
&lt;a href="https://vitejs.dev/guide/why.html" rel="noopener noreferrer"&gt;https://vitejs.dev/guide/why.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>cicd</category>
      <category>webpack</category>
      <category>vite</category>
    </item>
  </channel>
</rss>
