<?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>Forem: Pablo Jonatan</title>
    <description>The latest articles on Forem by Pablo Jonatan (@pjonatansr).</description>
    <link>https://forem.com/pjonatansr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F779552%2Fd84240c0-78ba-4a4d-9238-40b87d799f73.jpg</url>
      <title>Forem: Pablo Jonatan</title>
      <link>https://forem.com/pjonatansr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/pjonatansr"/>
    <language>en</language>
    <item>
      <title>Garantindo a idempotência de eventos com Redis</title>
      <dc:creator>Pablo Jonatan</dc:creator>
      <pubDate>Tue, 27 Sep 2022 11:31:32 +0000</pubDate>
      <link>https://forem.com/pjonatansr/garantindo-a-idempotencia-de-eventos-com-redis-1opa</link>
      <guid>https://forem.com/pjonatansr/garantindo-a-idempotencia-de-eventos-com-redis-1opa</guid>
      <description>&lt;p&gt;&lt;strong&gt;Importante:&lt;/strong&gt; Esse artigo assume que o público alvo tem algum conhecimento prévio relacionado a: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Eventos&lt;/li&gt;
&lt;li&gt;Processamento assíncrono&lt;/li&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;Redis &lt;/li&gt;
&lt;li&gt;Kafka.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Quando se fala em processamento assíncrono, é comum que se fale em eventos. Eventos são ações que ocorrem em um determinado momento e que podem ser disparados por uma ação ou por um evento externo e o processamento dele pode ser feito em um momento posterior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mas o que é &lt;strong&gt;Idempotência&lt;/strong&gt;?
&lt;/h3&gt;

&lt;p&gt;Conceito de idempotência, segundo a &lt;a href="https://pt.wikipedia.org/wiki/Idempot%C3%AAncia" rel="noopener noreferrer"&gt;Wikipédia&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Idempotência é a propriedade que algumas operações têm de poderem ser aplicadas várias vezes sem que o valor do resultado se altere após a aplicação inicial.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No contexto deste artigo, iremos utilizar o conceito de idempotência como parte de uma estratégia para evitar o processamento repetido de notificações.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contextualização
&lt;/h2&gt;

&lt;p&gt;Faço parte de um time que, entre outras aplicações, é dono de uma API responsável por receber notificações via webhook com o intuito de publicá-las em tópicos do Kafka, consumidos por outras aplicações, como, por exemplo, um worker responsável por tratar e enviá-las para vários destinos, como o Open Search do time, um Data Lake compartilhado com a companhia e alguns webhooks de outros squads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problema
&lt;/h2&gt;

&lt;p&gt;Uma das premissas é que nenhuma notificação pode ser perdida, por isso, temos, em nossos workers, estratégias como &lt;em&gt;Retries&lt;/em&gt; e &lt;a href="https://en.wikipedia.org/wiki/Dead_letter_queue" rel="noopener noreferrer"&gt;&lt;em&gt;DLQs&lt;/em&gt;&lt;/a&gt; para garantir que, mesmo que qualquer parte do processo falhe, a notificação será enviada para o destino. Além disso, por lidarmos com fontes externas que enviam dados via webhook, há a possibilidade de que falhas na comunicação entre os softwares façam com que esses dados, vez ou outra, sejam processados mais de uma vez. Assim, chegamos na seguinte pergunta:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Como garantir que uma notificação será processada apenas uma vez?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Solução
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Para garantir que uma notificação não será enviada duas vezes para o mesmo destino, utilizamos o Redis para armazenar informações sobre as notificações que já foram enviadas. Quando uma notificação é enviada, ela é armazenada no Redis. Quando uma notificação é reprocessada, verificamos se ela já foi enviada para o Redis. Se ela já foi enviada, não precisamos enviá-la novamente. Se ela ainda não foi enviada, precisamos enviá-la.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Exemplo fictício
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zu3f7lpspqpmuodzhhf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zu3f7lpspqpmuodzhhf.png" alt="Desenho inicial da solução"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nome da API: &lt;code&gt;payment-api&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;Tipo da Notificação: &lt;code&gt;paymentNotification&lt;/code&gt;, &lt;/li&gt;
&lt;li&gt;Descrição: API que recebe informações de pagamentos realizados por todas as lojas de uma companhia via webhook.&lt;/li&gt;
&lt;li&gt;Schema:
```JSON
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;{&lt;br&gt;
  "id": "number",&lt;br&gt;
  "date": "string",&lt;br&gt;
  "method": "string",&lt;br&gt;
  "installments": "number",&lt;br&gt;
  "store_id": "number",&lt;br&gt;
}&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Importante:** Nesse exemplo, assumimos uma **premissa** que `id` é único apenas para o contexto da loja que o gerou, representada por `store_id`, e durante a data que foi gerado, `date`. 

### Geração da chave do Redis
Para as notificações do tipo paymentNotification, recebidas via webhook por payment-api, foi gerada uma lista com o número mínimo de suas propriedades que, juntas, formam uma chave idempotente.

Considerando a **premissa** que assumimos, as propriedades eleitas para formar uma chave idempotente seriam:
- `id`
- `store_id`
- `date`

Isolando às três propriedades em um novo objeto, teríamos algo como:
```JSON


{
  "id": 123,
  "store_id": 123456789,
  "date": "2022-01-01T00:00:00.000Z"
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;E essa seria a chave:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

123-123456789-2022-01-01T00:00:00.000Z


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Nesse exemplo temos apenas a &lt;code&gt;payment-api&lt;/code&gt;, porém, em um cenário real, poderíamos ter uma instância do Redis compartilhada por várias APIs, cada uma com suas próprias entidades de domínio, portanto, com suas próprias listas de propriedades que formariam uma chave idempotente. &lt;/p&gt;

&lt;p&gt;Dado esse cenário onde pode-se ter várias APIs utilizando um Redis compartilhado, para evitar conflitos podemos adicionar, por exemplo, o nome da API e o tipo da notificação como prefixo da chave idempotente, ficando assim: &lt;code&gt;:nome_api-:tipo_notificacao-:id-:store_id-:date&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Com a nova adição a chave ficou assim:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

payment-api-paymentNotification-123-123456789-2022-01-01T00:00:00.000Z


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Porém, tendo em vista que &lt;code&gt;date&lt;/code&gt; não será lida por humanos, podemos simplificar a chave e utilizar seu valor em milissegundos. &lt;br&gt;
Agora essa é a nova chave:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;payment-api-paymentNotification-123-123456789-1640995200000&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Mas qual parte do dado usar como valor?&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;Agora que já temos a chave, precisamos definir o valor que será armazenado nela, para isso, precisamos entender o que queremos que aconteça quando uma determinada notificação for reenviada. Entre as opções, temos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Armazenar o valor da resposta retornada quando a notificação foi enviada pela primeira vez.&lt;/li&gt;
&lt;li&gt;Armazenar o valor &lt;code&gt;true&lt;/code&gt; ou &lt;code&gt;1&lt;/code&gt; para indicar que a notificação já foi enviada.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Analisando as opções
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A primeira opção é interessante, pois, caso uma notificação seja recebida mais de uma vez, poderemos retornar o mesmo valor sem processá-la novamente, tendo em vista que, pode ser que o remetente esteja reenviando a notificação porque não recebeu a primeira resposta ou algo do tipo. Porém, essa opção tem um problema: o valor pode ser muito grande, o que pode gerar um problema relacionado a espaço, por exemplo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A segunda opção é mais simples, porém, do ponto de vista do espaço, é bastante eficiente, se tornando tão interessante quanto a primeira opção em alguns contextos, por exemplo, num caso em que o remetente não aguarda uma resposta ou aguarda uma resposta padrão, como &lt;code&gt;200 OK&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Opção escolhida
&lt;/h4&gt;

&lt;p&gt;No ponto de vista da &lt;code&gt;payment-api&lt;/code&gt; que foi citada como exemplo, a segunda opção foi escolhida, pois não há um remetente aguardando uma resposta específica, portanto, não há necessidade de armazenar o valor da resposta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Desenho da solução
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqzm0mwxis8d87xrxo76v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqzm0mwxis8d87xrxo76v.png" alt="Desenho final da solução"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Armazenando referências de notificações no Redis
&lt;/h3&gt;

&lt;p&gt;A ideia principal é que quando uma requisição via webhook chegar para &lt;code&gt;payment-api&lt;/code&gt;, a API irá gerar a chave idempotente e, caso ela não exista no Redis, irá processar a requisição e armazenar suas referências nele, caso contrário, irá retornar a resposta default, que será &lt;code&gt;200 OK&lt;/code&gt; e adicionar um log que a requisição foi ignorada, pois já foi processada. No momento que já temos a chave, o valor e a certeza de precisamos armazená-los, utilizamos o comando &lt;code&gt;SET&lt;/code&gt; do Redis, que recebe como parâmetros a chave e o valor.&lt;/p&gt;

&lt;h4&gt;
  
  
  Expirando a chave
&lt;/h4&gt;

&lt;p&gt;Agora que já temos chave e valor armazenados no Redis, precisamos definir o tempo de expiração da chave. Para isso, utilizamos o comando &lt;code&gt;EXPIRE&lt;/code&gt; do Redis, que recebe como parâmetros a chave e o tempo de expiração em segundos. No caso do exemplo, iremos definir uma expiração de um dia, ou seja, 86400 segundos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resumindo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gerar a chave idempotente&lt;/li&gt;
&lt;li&gt;Verificar se a chave existe no Redis&lt;/li&gt;
&lt;li&gt;Caso não exista, processar a requisição e armazenar a chave no Redis com um tempo de expiração de um dia&lt;/li&gt;
&lt;li&gt;Caso exista, retornar a resposta default e adicionar um log que a requisição foi ignorada, pois já está no Redis&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Esse é um exemplo de como utilizar o Redis para evitar que requisições via webhook sejam processadas mais de uma vez, porém, esse não é o único cenário em que o Redis pode ser utilizado, ele pode ser utilizado para muitas outras coisas, como, por exemplo, para armazenar dados de sessão, dados de autenticação, dados de cache, etc. &lt;/p&gt;

&lt;p&gt;Espero que tenham gostado do artigo, qualquer dúvida ou sugestão, podem deixar nos comentários.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>architecture</category>
      <category>cache</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Como a comunidade brasileira utiliza o twitter para aprender em público</title>
      <dc:creator>Pablo Jonatan</dc:creator>
      <pubDate>Thu, 24 Feb 2022 03:52:05 +0000</pubDate>
      <link>https://forem.com/pjonatansr/como-a-comunidade-brasileira-utiliza-o-twitter-para-aprender-em-publico-345b</link>
      <guid>https://forem.com/pjonatansr/como-a-comunidade-brasileira-utiliza-o-twitter-para-aprender-em-publico-345b</guid>
      <description>&lt;h2&gt;
  
  
  Contextualização
&lt;/h2&gt;

&lt;p&gt;Durante os últimos anos puderam-se ver a popularização das profissões relacionadas ao desenvolvimento de &lt;em&gt;software&lt;/em&gt; devido a tópicos quentes, como, &lt;em&gt;blockchain&lt;/em&gt;, serviços em nuvem, o crescente aumento das oportunidades (e salários) para desenvolvedores e a possibilidade de carreira global.&lt;/p&gt;

&lt;p&gt;O contexto abordado fez com que muitas pessoas, de diversas idades, optassem por realizar transição de carreira ou iniciar nas carreiras relacionadas a Tecnologia da Informação. Contudo, ensino superior ainda é um tema delicado, tendo em vista que muitas pessoas não têm acesso à universidade, seguindo um caminho menos tradicional.&lt;/p&gt;

&lt;p&gt;Felizmente, desde os primórdios da computação, existe a &lt;a href="https://pt.wikipedia.org/wiki/%C3%89tica_hacker" rel="noopener noreferrer"&gt;forte ideia&lt;/a&gt; de disseminar o conhecimento e o incentivo ao aprendizado autodidata, que juntos a conceitos como &lt;strong&gt;&lt;a href="https://meleu.github.io/artigos-traduzidos/aprenda-em-publico.html" rel="noopener noreferrer"&gt;aprender em público&lt;/a&gt;&lt;/strong&gt;, estão facilitando a entrada dos brasileiros na área, além de projetos como a &lt;a href="https://github.com/Universidade-Livre/ciencia-da-computacao" rel="noopener noreferrer"&gt;Universidade Brasileira Livre&lt;/a&gt;, que “organiza o conteúdo &lt;em&gt;online&lt;/em&gt; em pt-BR para aumentar o acesso de brasileiros a educação”.&lt;/p&gt;

&lt;p&gt;O intuito deste artigo é explicar o que é o &lt;strong&gt;&lt;a href="http://sseraphini.cc/" rel="noopener noreferrer"&gt;cc @sseraphini&lt;/a&gt;&lt;/strong&gt; do twitter, qual sua proposta e como isso tem funcionado para alguns brasileiros.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o &lt;strong&gt;cc @sseraphini&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As pessoas que utilizaram o twitter nos últimos meses podem ter se deparado com &lt;em&gt;tweets&lt;/em&gt; de conteúdos relacionados a tecnologia da informação carregando o sufixo &lt;strong&gt;cc @sseraphini&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1486119328063926272-954" src="https://platform.twitter.com/embed/Tweet.html?id=1486119328063926272"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1486119328063926272-954');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1486119328063926272&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;O “cc” é a já conhecida abreviação de “com cópia” geralmente utilizada em &lt;em&gt;emails&lt;/em&gt;, agora aplicada no Twitter. Explicando de maneira simples, atribuir tal sufixo a um &lt;em&gt;tweet&lt;/em&gt; é uma forma do autor alcançar as dezenas de milhares de pessoas que seguem o &lt;a href="https://twitter.com/sseraphini" rel="noopener noreferrer"&gt;Sibelius&lt;/a&gt; (criador do cc @sseraphini) já que ele impulsiona essas publicações através de &lt;em&gt;like&lt;/em&gt; e &lt;em&gt;retweet&lt;/em&gt;, com a finalidade de mostrar o conteúdo para mais pessoas que possam ajudar a sanar dúvidas, debater sobre o tema e/ou se beneficiar das informações publicadas.&lt;/p&gt;

&lt;p&gt;O processo do &lt;em&gt;retweet&lt;/em&gt; é manual, portanto, o próprio Sibelius lê os &lt;em&gt;tweets&lt;/em&gt;, repassa para que a comunidade contribua e muitas vezes participa junto à comunidade. &lt;/p&gt;

&lt;p&gt;É uma relação onde todos saem ganhando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aqueles com dúvidas conseguem avançar ou encontrar um ponto de partida para analisar melhor o problema;&lt;/li&gt;
&lt;li&gt;Aqueles que respondem conseguem disseminar e fortalecer seus conhecimentos;&lt;/li&gt;
&lt;li&gt;Aqueles que esbarram com os &lt;em&gt;tweets&lt;/em&gt; na sua linha do tempo podem adquirir algum conhecimento;&lt;/li&gt;
&lt;li&gt;Todos os envolvidos aprendem algo;&lt;/li&gt;
&lt;li&gt;Possibilidade de &lt;em&gt;networking&lt;/em&gt; e engajamento;&lt;/li&gt;
&lt;li&gt;Escrever sobre um problema pode fazer com que o entenda melhor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Colaboração no sseraphini.cc
&lt;/h2&gt;

&lt;p&gt;Conforme relatado por seu criador no fio “&lt;a href="https://twitter.com/sseraphini/status/1488482763548332041" rel="noopener noreferrer"&gt;cc @sseraphini 1 month project&lt;/a&gt;”, o &lt;a href="//sseraphini.cc"&gt;site &lt;/a&gt;foi lançado tendo apenas um botão com o intuito de tornar mais simples a ação de tuitar usando o supracitado sufixo e algumas &lt;em&gt;issues&lt;/em&gt; em seu repositório do GitHub.&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%2F2wa881krp107mdefndgk.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%2F2wa881krp107mdefndgk.png" alt="Figura — Versão inicial — https://sseraphini.cc" width="304" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após o lançamento da versão, rapidamente a comunidade começou a contribuir, os desenvolvedores assumiram o controle das &lt;em&gt;issues&lt;/em&gt; e com os &lt;em&gt;pull requests&lt;/em&gt; o site recebeu novas funcionalidades logo nos primeiros dias. Atualmente, com quase dois meses de existência, o repositório tem 15 &lt;em&gt;issues&lt;/em&gt; abertas e 29 já fechadas, contando com a contribuição de desenvolvedores de diferentes níveis de experiência. &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%2Fq2jmfsa5bqwbptq8fgmr.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%2Fq2jmfsa5bqwbptq8fgmr.png" alt="Figura — Versão disponível em 23 de fevereiro de 2022 — https://sseraphini.cc" width="800" height="394"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Uma dessas funcionalidades permite filtrar os &lt;em&gt;tweets&lt;/em&gt; recentes por palavras-chave, conforme a figura:&lt;br&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%2Fi9dux141yztndk2e0ttf.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%2Fi9dux141yztndk2e0ttf.png" alt="Figura — Search **cc @sseraphini**" width="800" height="819"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O projeto também conta com uma &lt;a href="https://chrome.google.com/webstore/detail/ccsseraphini/jbdolkjfpfgpbdeeebkhnmfnbkplgalm" rel="noopener noreferrer"&gt;extensão&lt;/a&gt; para navegadores baseados em &lt;em&gt;chromium&lt;/em&gt;, sendo uma versão simplificada do site.&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%2Fiu1z9vnjtcmo15ij41s4.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%2Fiu1z9vnjtcmo15ij41s4.png" alt="Figura — Extensão **cc @sseraphini**" width="645" height="647"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Como a comunidade vem utilizando o recurso
&lt;/h2&gt;

&lt;p&gt;A recepção positiva que o sseraphini.cc obteve ao ser lançado é um reflexo da popularidade do &lt;strong&gt;cc @sseraphini&lt;/strong&gt; na comunidade do Twitter, conhecida como &lt;strong&gt;bolha dev&lt;/strong&gt;. Dessa forma, muitas pessoas aderiram ao sufixo e estão utilizando-o para, principalmente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Perguntar sobre dúvidas técnicas;&lt;/li&gt;
&lt;li&gt;Debater conceitos;&lt;/li&gt;
&lt;li&gt;Compartilhar artigos e dicas;&lt;/li&gt;
&lt;li&gt;Oferecer e procurar mentoria; &lt;/li&gt;
&lt;li&gt;Divulgar vagas de emprego.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basicamente, as pessoas utilizam o Google e demais serviços de busca, Stack Overflow, GitHub, YouTube, livros e outros meios para obter informação, porém, perceberam que podem utilizar o &lt;strong&gt;cc @sseraphini&lt;/strong&gt; para ter uma visão mais dinâmica sobre os conteúdos, permitindo até comparar as experiências relatadas e suas pesquisas, para assim conseguir alcançar melhores resultados e qualidade nos estudos.&lt;/p&gt;

&lt;p&gt;É importante ressaltar que o espaço não é restrito ao idioma português do Brasil, diversos membros da comunidade costumam perguntar e responder em inglês, para incentivar o entendimento da língua e para os &lt;em&gt;tweets&lt;/em&gt; alcançarem pessoas de todo o mundo, aumentando a possibilidade de obterem respostas.&lt;/p&gt;

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

&lt;p&gt;Tendo em vista que o mercado de desenvolvimento de &lt;em&gt;software&lt;/em&gt; está bastante aquecido e há uma evasão de talentos do Brasil para suprir a demanda global, projetos que visam engajar a comunidade e construir conhecimento são bastante úteis, dessa forma, o &lt;strong&gt;cc @sseraphini&lt;/strong&gt; vem incentivando o aprender em público e o aprendizado contínuo para os seus usuários, mesmo enquanto no Twitter. &lt;/p&gt;

&lt;p&gt;Além disso, o sseraphini.cc permite que os desenvolvedores que contribuem com o site adquiram experiência em um projeto real e de código aberto, construindo funcionalidades ao lado de profissionais experientes, aprendendo com eles e construindo diariamente sua prova de esforço para, por exemplo, lutar pela primeira vaga de emprego.&lt;/p&gt;

&lt;p&gt;No entanto, é necessário haver uma autocrítica de cada usuário em relação aos &lt;em&gt;tweets&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Se for perguntar, dê o máximo de detalhes possível. Por exemplo, em um &lt;em&gt;tweet&lt;/em&gt; sobre erros no código:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compartilhar informações necessárias para análise do problema;&lt;/li&gt;
&lt;li&gt;Mostrar partes relevantes do código;&lt;/li&gt;
&lt;li&gt;Explicar o que está tentando fazer;&lt;/li&gt;
&lt;li&gt;Explicar quais soluções já tentou e o resultado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Entre os que respondem também há espaço para autocrítica, podendo-se focar em:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evitar ser agressivo (ou passivo-agressivo);&lt;/li&gt;
&lt;li&gt;Entender que as pessoas podem discordar de você e aprender com isso;&lt;/li&gt;
&lt;li&gt;Quando a pergunta incomodar, deixe-a para outro responder.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pt.wikipedia.org/wiki/%C3%89tica_hacker" rel="noopener noreferrer"&gt;https://pt.wikipedia.org/wiki/%C3%89tica_hacker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://meleu.github.io/artigos-traduzidos/aprenda-em-publico.html" rel="noopener noreferrer"&gt;https://meleu.github.io/artigos-traduzidos/aprenda-em-publico.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sibelius.substack.com/p/cc-sseraphini" rel="noopener noreferrer"&gt;https://sibelius.substack.com/p/cc-sseraphini&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://devnaestrada.com.br/2022/02/04/qual-e-a-treta-1.html" rel="noopener noreferrer"&gt;https://devnaestrada.com.br/2022/02/04/qual-e-a-treta-1.html&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://twitter.com/sseraphini/status/1488482763548332041" rel="noopener noreferrer"&gt;https://twitter.com/sseraphini/status/1488482763548332041&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>learninpublic</category>
      <category>opensource</category>
      <category>programming</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
