<?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: Pode me chamar de Juscélio Reis</title>
    <description>The latest articles on Forem by Pode me chamar de Juscélio Reis (@juscelior).</description>
    <link>https://forem.com/juscelior</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%2F426430%2Fab8d100e-70ca-42c4-a5f8-52fc203e22bf.jpg</url>
      <title>Forem: Pode me chamar de Juscélio Reis</title>
      <link>https://forem.com/juscelior</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/juscelior"/>
    <language>en</language>
    <item>
      <title>Integrações como estratégia para acelerar a colaboração no Open Insurance</title>
      <dc:creator>Pode me chamar de Juscélio Reis</dc:creator>
      <pubDate>Mon, 26 Dec 2022 13:51:34 +0000</pubDate>
      <link>https://forem.com/juscelior/integracoes-como-estrategia-para-acelerar-a-colaboracao-no-open-insurance-5d1d</link>
      <guid>https://forem.com/juscelior/integracoes-como-estrategia-para-acelerar-a-colaboracao-no-open-insurance-5d1d</guid>
      <description>&lt;p&gt;Preciso defender o potencial comercial que as APIs desbloqueiam. Construir uma estratégia de compartilhamento de dados utilizando como fundação "as APIs", pode apresentar grandes benefícios para o negócio, assim como para outros domínios. Isto é ainda mais verdadeiro quando discutimos Open Insurance ou Sistema de Seguros Aberto - o ponto de venda desta abordagem é muitas vezes um foco no eventual valor comercial que é desbloqueado. Embora este potencial seja importante, o Open Insurance tem impactos ainda mais dramáticos e de longo prazo em diversas áreas de trabalho.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que queremos dizer com integração?
&lt;/h2&gt;

&lt;p&gt;Em um nível básico, integração é o processo de unir diferentes coisas. Uma das frustrações que ouvimos frequentemente dos usuários é que sua tecnologia não se conecta completamente: ainda há muito retrabalho "manual" para correlacionar as informações de um sistema com o outro e muitas vezes você, ou o cliente, tem que acessar múltiplos sistemas para completar a jornada do cliente, sem mencionar na quantidade de erros encontrados nesse processo.&lt;/p&gt;

&lt;p&gt;Em um mundo ideal, você quer que os sistemas compartilhem informações automaticamente para não ter que reinscrever nenhum dado do cliente. Ao mesmo tempo, você quer ser capaz de se mover sem problemas entre diferentes ferramentas de aconselhamento sem o inconveniente de sair de uma e entrar em outra. Você precisa que seus sistemas falem uns com os outros, compartilhem dados e continuem os processos com o mínimo de intervenção manual, racionalizando a experiência do usuário para criar uma jornada única e direta para o colaborador da empresa ou para o cliente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Insurance e a mentalidade de colaboração
&lt;/h2&gt;

&lt;p&gt;O que este mandato está expressando, e o que Open Insurance está baseado, é o conceito de que todos os dados, comunicação e funcionalidade devem acontecer em um conjunto comum de interfaces, independentemente da empresa (Seguradora ou outra entidade) ou da intenção. As equipes de vendas devem se comunicar através deste conjunto de interfaces, e as APIs padrão devem servir como entidades unificadoras entre todas elas.&lt;/p&gt;

&lt;p&gt;Então, com esse entendimento, o que o Open Insurance pode realmente desbloquear no sentido de acelerar a colaboração entre as entidades?&lt;/p&gt;

&lt;h2&gt;
  
  
  Fluxos de trabalho unificados
&lt;/h2&gt;

&lt;p&gt;O Open Insurance cria fluxos de trabalho comuns e unificados. Como os APIs em questão são negociados como a principal modalidade de comunicação, os caminhos são formalizados. Isto leva a canais de comunicação claros para as equipes existentes, permitindo um maior nível de sincronicidade e comunicação. Para novas entidades, este benefício proporciona uma integração mais rápida e fácil dos fluxos existentes em novos sistemas, pois o resultado desejado (caminhos comuns) já está fundamentalmente embutido no dia a dia da organização.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aprimorar a descoberta dos serviços
&lt;/h2&gt;

&lt;p&gt;Da mesma forma, adotar um conjunto comum de comunicação leva a uma melhor descoberta, unifica o conjunto de informações para cada tipo de seguro e facilita o entendimento do fluxo de dados que cada entidade utiliza. Isto acaba por reduzir o atrito na busca de informações e de dados, criando uma fonte única da verdade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reusabilidade
&lt;/h2&gt;

&lt;p&gt;Um dos benefícios mais fortes do Open Insurance é que ele força as organizações a considerar a realidade das tecnologias que elas utilizam. E como seu processo será utilizado por outras organizações. Quando APIs comuns constituem o núcleo de todas as interações comerciais, tanto os dados quanto a funcionalidade do Open Insurance estão abertos para aqueles que podem querer usá-los. Esta superfície permite a reusabilidade do valor comercial central na organização, liberando um enorme potencial e capacidade iterativa para colaboração entre as entidades.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Santo Graal da integração
&lt;/h2&gt;

&lt;p&gt;Enquanto alguns sistemas só precisam transferir dados para uma direção, o Open Insurance muda essa logica pois quanto mais dados forem compartilhados, melhor, por exemplo, a transferência de dados entre seu sistema de back office e seu portal do cliente, plataforma ou ferramenta de planejamento de fluxo de caixa e vice-versa. As integrações bidirecionais permitem uma jornada direta de ponta a ponta, com maior automação das tarefas, eliminando os aspectos mais desafiadores do processo de corretagem e dando a você mais tempo para se concentrar em seus clientes.&lt;/p&gt;

&lt;p&gt;Este compartilhamento bidirecional de dados é o Santo Graal na racionalização do processo de corretagem e o modelo do Open Insurance nos dá uma base sólida para construir estas integrações mais profundas. No entanto, ainda requer que todos os participantes trabalhem juntos para aproveitar ao máximo a tecnologia.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Medir o desempenho dos produtos e serviços de software</title>
      <dc:creator>Pode me chamar de Juscélio Reis</dc:creator>
      <pubDate>Wed, 30 Nov 2022 21:25:27 +0000</pubDate>
      <link>https://forem.com/juscelior/medir-o-desempenho-dos-produtos-e-servicos-de-software-pdn</link>
      <guid>https://forem.com/juscelior/medir-o-desempenho-dos-produtos-e-servicos-de-software-pdn</guid>
      <description>&lt;p&gt;Há muitas &lt;em&gt;frameworks&lt;/em&gt; e metodologias que visam melhorar a forma como construímos produtos e serviços de software. Com tanto material é necessário entender o que funciona e o que não funciona para &lt;del&gt;nossa&lt;/del&gt; sua realidade. E existem métricas que são famosas, mas que estudos mostra como essas métricas &lt;del&gt;famosas&lt;/del&gt; são ineficientes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google DORA
&lt;/h2&gt;

&lt;p&gt;Vou iniciar explicado as mais famosas no momento, Google DORA (acrônimo para "&lt;strong&gt;D&lt;/strong&gt;ev*&lt;em&gt;O&lt;/em&gt;&lt;em&gt;ps and **R&lt;/em&gt;&lt;em&gt;esearch and **A&lt;/em&gt;*ssessment") são um conjunto de métricas que o famoso Google utiliza para realizar um benchmarking com equipes reais desde 2018, mas informação &lt;a href="https://www.devops-research.com/research.html"&gt;aqui&lt;/a&gt;. Dessa forma é fácil para aqueles gestores que desejam comparar a desempenho da sua equipe em relação a outras empresas.&lt;/p&gt;

&lt;h4&gt;
  
  
  Lead Time (Deploy Cycle Time)
&lt;/h4&gt;

&lt;p&gt;A definição do Lead Time é o tempo entre a "promessa do time" até o "código funcionando com &lt;strong&gt;sucesso&lt;/strong&gt; na produção". Essa métrica é utilizada para saber quanto tempo leva para implantar uma funcionalidade em um ambiente de desenvolvimento, teste ou produção. Tem o objetivo de melhorar os métodos, processos e ferramentas utilizado pela organização.&lt;/p&gt;

&lt;h4&gt;
  
  
  Deployment Frequency
&lt;/h4&gt;

&lt;p&gt;A segunda métrica a ser considerada é o tamanho das entregas. A redução do tamanho da entrega é outro elemento central do paradigma Lean. A redução do tamanho das entregas reduz o tempo e a variação da cadência, acelera o feedback, reduz os riscos e as despesas gerais, melhora a eficiência, aumenta a motivação e a urgência e reduz os custos e o crescimento do cronograma.&lt;/p&gt;

&lt;h4&gt;
  
  
  Mean Time to Restore
&lt;/h4&gt;

&lt;p&gt;Uma constante no desenvolvimento de software é que as falhas vão existir (Esse &lt;a href="https://dev.to/juscelior/divida-tecnica-o-bureau-de-credito-da-ti-8hc"&gt;artigo&lt;/a&gt; comenta sobre como é inevitável existir software sem falhas). Um gestor de excelência precisa saber dessa verdade e se perguntar: Com que rapidez o meu time consegue restaurar o serviço?&lt;/p&gt;

&lt;h4&gt;
  
  
  Change Fail Rate
&lt;/h4&gt;

&lt;p&gt;Essa métrica observa qual o impacto das mudanças no ambiente de produção, ou se preferir, qual a quantidade de falhas as novas funcionalidades estão entregando para os usuários. O quanto o serviço é degradado pelas novas funcionalidades?&lt;/p&gt;

&lt;h4&gt;
  
  
  Desempenho operacional (confiabilidade)
&lt;/h4&gt;

&lt;p&gt;O relatório de 2022 foi apresentado uma quinta métrica, desempenho operacional ou se preferir a confiabilidade. A confiabilidade é a medida que busca entender como suas entregas atende a expectativa do dos usuários, tais como disponibilidade e desempenho. Engenharia de confiabilidade é um assunto bem vasto e cabe um artigo somente para esse assunto. O estudo expandiu seu conceito em 2021 para medir a confiabilidade, visando assim representar a disponibilidade, latência, desempenho e escalabilidade de forma mais ampla.&lt;/p&gt;

&lt;h4&gt;
  
  
  Relatório de 2022
&lt;/h4&gt;

&lt;p&gt;O Google disponibilizou os resultados para o ano de 2022. Esta interessando de saber se sua equipe é de alto, médio ou baixo desempenho?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hqnfb073--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6uqsisyxz31xp36q7ywm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hqnfb073--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6uqsisyxz31xp36q7ywm.png" alt="Image description" width="682" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Métricas depreciadas (tente não usar essas métricas)
&lt;/h2&gt;

&lt;p&gt;Agora apresento duas métricas para não utilizar. Essas métricas podem ser consideradas frágeis, e por essa razão não é uma boa indicação confiar decisões estratégicas com base em uma métrica que "depende" muito do contexto ou que possui um grau de confiança muito baixo.&lt;/p&gt;

&lt;h4&gt;
  
  
  Code Churn
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Code Churn&lt;/em&gt;, é a medida que calcula a taxa de reescrita de um software ou a quantidade de linhas excluídas logo após ser escrito, é uma parte normal do processo de desenvolvimento.&lt;/p&gt;

&lt;p&gt;Tem como premissa calcular se o desenvolvedor está tendo muito retrabalho ou se as solicitações não são claras o suficiente e está sobrecarregando o desenvolvedor e este esta gastando tempo com algo que não vai mais ser necessário.&lt;/p&gt;

&lt;p&gt;Mas o é possível que os desenvolvedores apenas estão testando hipóteses e exploram várias soluções para um problema - especialmente para o início de um projeto, quando o problema ainda não tem uma solução clara.&lt;/p&gt;

&lt;p&gt;Agora o problema pode estar relacionado com outros fatores que fogem do controle do desenvolvedor. Tais como requisitos que não estão claros, &lt;em&gt;stakeholder&lt;/em&gt; indecisos, um problema realmente complicado, o desenvolvedor esta apenas criando um protótipo, o desenvolvedor está polindo (apenas uma mudança, pois essa pessoa tem um TOC), ou o código não tem um bom direcionamento e fica alternando o seu proposito com certa frequência.&lt;/p&gt;

&lt;p&gt;De todo o modo, é complicado compreender o comportamento de uma pessoa ou equipe.&lt;/p&gt;

&lt;h4&gt;
  
  
  Lines of Code
&lt;/h4&gt;

&lt;p&gt;Essa métrica apresenta um grande problema para as linguagens de programação atuais. Pois para ter um grau satisfatório existem várias variáveis que o desenvolvedor (alvo da métrica) pode manipular conforme desejar. Antigamente existiam &lt;del&gt;ainda existem&lt;/del&gt; linguagens de programação que obrigava o desenvolvedor seguir um padrão de ideação (forma como escrevemos um código). Assim era possível medir a produtividade do desenvolvedor com base na quantidade de linhas que ele escrevia.&lt;/p&gt;

&lt;p&gt;Mas atualmente as linguagens permitem mudar essa tal de indentação, ou seja, posso escrever todo um sistema em apenas uma linha ou escrever usando 1000 linhas.&lt;/p&gt;

&lt;p&gt;Se um desenvolvedor sabe que sua produtividade está com base na quantidade de linhas, é possível que essa pessoa inclua linhas sem sentido ou faça da maneira mais complicada somente com o objetivo de inflar sua avaliação.&lt;/p&gt;

&lt;p&gt;Olha esse exemplo, é possível escrever um simples programa que mostra a mensagem "Olá mundo". &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qi8KqjWI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cmkwna5pvgqgcsf53o60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qi8KqjWI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cmkwna5pvgqgcsf53o60.png" alt="Image description" width="720" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YA-RRK-X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pbzyctm4chpqjci9o1kv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YA-RRK-X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pbzyctm4chpqjci9o1kv.png" alt="Image description" width="638" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Não tem como inferir que o com mais linha tem mais funcionalidade ou mais qualidade.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Divida técnica: O bureau de crédito da TI</title>
      <dc:creator>Pode me chamar de Juscélio Reis</dc:creator>
      <pubDate>Mon, 31 Oct 2022 15:39:14 +0000</pubDate>
      <link>https://forem.com/juscelior/divida-tecnica-o-bureau-de-credito-da-ti-8hc</link>
      <guid>https://forem.com/juscelior/divida-tecnica-o-bureau-de-credito-da-ti-8hc</guid>
      <description>&lt;p&gt;É comum falar que qualidade do código gerado pelo time de desenvolvimento pode gerar perdas financeiras, afinal qual o impacto financeiro em deixar de corrigir um bug no software da empresa? Vou gastar mais dinheiro para corrigir esse bug?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/WPtzThAErhBG5oXLeS/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/WPtzThAErhBG5oXLeS/giphy.gif" width="460" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conseguir mensurar todas as possibilidades é uma tarefa complexa e ouso afirmar que não existe um método para garantir com exatidão (exceto para o Doutor Estranho), precisamos sempre trabalhar com possibilidades. Porem é possível olhar para trás e perceber que algumas decisões foram ruins e provocaram algum prejuízo financeiro. O caso mais ilustre é o erro de 1 bilhão de dólares:&lt;/p&gt;

&lt;h2&gt;
  
  
  O erro de 1 bilhão de dólares
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Tony_Hoare"&gt;Tony Hoare&lt;/a&gt;: O criador do algoritmo &lt;a href="https://pt.wikipedia.org/wiki/Quicksort"&gt;&lt;em&gt;QuickSort&lt;/em&gt;&lt;/a&gt; e também vencedor do &lt;a href="https://pt.wikipedia.org/wiki/Pr%C3%AAmio_Turing"&gt;Prêmio Turing&lt;/a&gt; (o Prêmio Nobel de Computação) acrescentou uma funcionalidade simples na linguagem &lt;a href="https://pt.wikipedia.org/wiki/ALGOL"&gt;Algol&lt;/a&gt; com o intuito de melhorar a performance das aplicações escritas nessa linguagem, o motivo fazia total sentido na época porque parecia prático e fácil de fazer. Várias décadas depois, ele mostrou seu arrependimento em uma conferencia:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Eu o chamo de meu erro de um bilhão de dólares... Naquela época, eu estava projetando o primeiro sistema de tipo abrangente para referências em uma linguagem orientada a objetos. Meu objetivo era garantir que todo o uso de referências fosse absolutamente seguro, com verificação realizada automaticamente pelo compilador.&lt;br&gt;
Mas não consegui resistir à tentação de colocar uma referência nula, simplesmente porque era muito fácil de implementar. Isto levou a inúmeros erros, vulnerabilidades e falhas de sistema, que provavelmente causaram um bilhão de dólares de dor e danos nos últimos quarenta anos.&lt;br&gt;
– &lt;a href="https://en.wikipedia.org/wiki/Tony_Hoare"&gt;Tony Hoare&lt;/a&gt;, inventor of ALGOL W.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Versão original:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I call it my billion-dollar mistake…At that time, I was designing the first comprehensive type system for references in an object-oriented language. My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler.&lt;br&gt;
But I couldn’t resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years.&lt;br&gt;
– &lt;a href="https://en.wikipedia.org/wiki/Tony_Hoare"&gt;Tony Hoare&lt;/a&gt;, inventor of ALGOL W.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pode encontrar nesse &lt;a href="https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare/"&gt;link&lt;/a&gt; o vídeo completo dessa conferencia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impactos da divida técnica
&lt;/h2&gt;

&lt;p&gt;Você acredita que uma dívida técnica possui impacto que vai além do desperdício financeiro? &lt;/p&gt;

&lt;p&gt;Vamos imaginar essa divida técnica como sendo uma operação de crédito financeiro, e o nome Divida técnica como sendo a medida que o bureau de crédito da TI utiliza para controlar seu cadastro. Se não pagamos essa divida em dia, podemos ter nosso nome inscrito em um cadastro e como consequência sofrer limitações futuras.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O serviço de proteção ao crédito, ou bureau de crédito, é um serviço de informações de crédito, que utiliza informações de adimplência e inadimplência de pessoas físicas ou jurídicas para fins de decisão sobre crédito.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Se você já teve nome sujo, bancos podem negar crédito para o resto da vida. Agora o mesmo pode acontecer com o não gerenciamento da dívida técnica. Como consequência, a velocidade de entrega do time é limitada. É possível contratar mais profissionais para fazer o mesmo trabalho. Em resumo, gastamos mais recursos financeiros para entregar menos funcionalidades. Duvida?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YNRL9UKI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mlf9tgvdgw0k9w2kziyu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YNRL9UKI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mlf9tgvdgw0k9w2kziyu.png" alt="Image description" width="574" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A lei de Brooks é uma observação sobre gerenciamento de projetos de software, segundo a qual adicionar mão de obra ao projeto de software que está atrasado o atrasa ainda mais. Foi cunhado por &lt;a href="https://en.wikipedia.org/wiki/Fred_Brooks"&gt;Fred Brooks&lt;/a&gt; em seu livro de 1975 &lt;a href="https://www.amazon.com.br/m%C3%ADtico-homem-m%C3%AAs-ensaios-engenharia-software/dp/8550802530/"&gt;O mítico homem-mês: ensaios sobre engenharia de software&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_MgyeLz1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hqx0ljdukyzteidhfq7m.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_MgyeLz1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hqx0ljdukyzteidhfq7m.jpg" alt="Image description" width="350" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se não é simples correlacionar o impacto financeiro com o bug, podemos analisar o impacto da dívida técnica na produtividade desses times. Pesquisas recentes sugerem que a empresa média perde 23-42% do tempo dos desenvolvedores devido a dívidas técnicas e código ruim em geral &lt;a href="https://dl.acm.org/doi/abs/10.1145/3524843.3528091"&gt;1&lt;/a&gt;. Outro dado interessante é que os desenvolvedores de software são frequentemente "forçados" a introduzir novas dividas técnicas à medida que as empresas mantêm a qualidade do código comercial para ganhos a curto prazo, como novas funcionalidades &lt;a href="https://research.chalmers.se/publication/511450/file/511450_Fulltext.pdf"&gt;2&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;A dívida técnica afeta tanto a felicidade dos desenvolvedores quanto a sua satisfação no trabalho &lt;a href="https://arxiv.org/abs/1904.08239"&gt;3&lt;/a&gt;. Nem sempre um profissional larga a empresa por motivos financeiros, existem outros fatores que precisam ser considerados. Além de perder um recurso, perde o conhecimento desse profissional, como mensurar o impacto financeiro dessa perda?&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que isso acontece?
&lt;/h2&gt;

&lt;p&gt;Em mais de 13 anos de experiencia consigo listar essas desculpas como sendo as mais comuns:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Não temos tempo para testar essa alteração, vamos colocar em produção e assim vamos monitorar o ambiente para saber o que vai acontecer.&lt;/p&gt;

&lt;p&gt;Existe um processo de gestão de mudança (GMUD), mas ele é tão complicado que se for seguido a próxima janela de implementação é só daqui 2 meses, e o cliente precisa dessa funcionalidade agora.&lt;/p&gt;

&lt;p&gt;O nosso ambiente de teste não esta atualizado ou não esta pronto. Isso quando não existe a resposta: o ambiente de teste é em produção (junto com nossos clientes).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Recomendo a leitura do livro  &lt;a href="https://www.amazon.com.br/projeto-f%C3%AAnix-Gene-Kim/dp/8550801895"&gt;O projeto fênix: um romance sobre TI, DevOps e sobre ajudar o seu negócio a vencer&lt;/a&gt;, esse livro não possui uma linguagem excludente, vulgo &lt;em&gt;techniques&lt;/em&gt;, se trata de uma novela da área de TI. Um pouco da historia: O time de Operações de TI é olhado por todos como causadores de problemas, além de estarem sempre atrapalhando o andamento do Projeto Fênix, cujo objetivo é salvar a empresa. Como consequência não é possível alocar as pessoas certas da empresa em projetos estratégicos pois precisam apagar focos de incêndio, soa familiar?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r_Luyian--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fbofesx7cxmdp5xzvup3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r_Luyian--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fbofesx7cxmdp5xzvup3.jpg" alt="Image description" width="350" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O papel da governança
&lt;/h2&gt;

&lt;p&gt;Um estudo do &lt;a href="https://www.idc.com/research/viewtoc.jsp?containerId=US44640719"&gt;IDC&lt;/a&gt; previu em 2019 que em 2022, 90% dos Novos Serviços Digitais serão construídos como aplicações compostas usando serviços públicos e internos fornecidos por API; Metade desses serviços irá alavancar a IA e o aprendizado de máquinas.&lt;/p&gt;

&lt;p&gt;Se um desses serviços está com uma dívida muito alta pode criar um efeito cascata e prejudicar outros serviços. Seria algo assim...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/URqZ9jDNRfunXPvVhE/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/URqZ9jDNRfunXPvVhE/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bem, importância de uma base de código saudável é amplamente subvalorizada no nível empresarial: mais de 90% dos gerentes de TI carecem de processos e estratégias para o gerenciamento da dívida técnica &lt;a href="https://www.infoq.com/articles/business-impact-code-quality/"&gt;4&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Agora para ter uma organização de alto desempenho, precisamos ser sensíveis às necessidades dos clientes, agir com base em feedback e continuar a inovar se quisermos permanecer relevantes no mercado. E precisamos fazer isso durante ciclos de produtos cada vez mais curtos. E para gerenciar essa dívida técnica é necessário uma área especializada e dedicada para fomentar estratégia focando nos processos, programa e pessoas capacitadas.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>TIC: por onde começar</title>
      <dc:creator>Pode me chamar de Juscélio Reis</dc:creator>
      <pubDate>Mon, 24 Oct 2022 18:44:57 +0000</pubDate>
      <link>https://forem.com/juscelior/tic-por-onde-comecar-4eg5</link>
      <guid>https://forem.com/juscelior/tic-por-onde-comecar-4eg5</guid>
      <description>&lt;h2&gt;
  
  
  O mercado de TIC
&lt;/h2&gt;

&lt;p&gt;Não sabe o que é Tecnologia da Informação (TI) ou Tecnologia da Informação e Comunicação (TIC)? E não conhece o potencial desse mercado, segue alguns números do relatório da Brasscom de 2021:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A remuneração média de TI in House* é de R$ 5.805 sendo 2,9 vezes maior que o salário médio nacional (dados referente a agosto de 2021).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Para os próximos 4 anos existe uma demanda de 673.502 profissionais.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O crescimento do Setor TIC em 2021 foi de 36.4%.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A Brasscom, Associação das Empresas de Tecnologia da Informação e Comunicação (TIC) realiza um &lt;a href="https://brasscom.org.br/pdfs/relatorio-setorial-de-tic/"&gt;estudo anual&lt;/a&gt; sobre a distribuição das oportunidades de emprego para o setor de tecnologia.&lt;/p&gt;

&lt;p&gt;E se esta pensando que isso é uma tendência isolada para o mercado de São Paulo, melhor repensar sobre o assunto, a tendência está em todo o Brasil, olha aqui esse gráfico:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ilpy50PX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ev8hibgx3cl9ht84d5r0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ilpy50PX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ev8hibgx3cl9ht84d5r0.png" alt="Distribuição dos empregos de TIC e Telecom no Brasil em 2021" width="635" height="399"&gt;&lt;/a&gt;&lt;em&gt;Distribuição dos empregos de TIC e Telecom no Brasil em 2021 (Fonte: &lt;a href="https://brasscom.org.br/wp-content/uploads/2021/10/BRI2-2022-006-Relatorio-Setorial-v35.pdf"&gt;Brasscom&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A área de TIC tem oportunidadeS para você, caro leitor! Se começar agora uma faculdade e estudar por 2 ou 4 anos (depende do curso) ainda vai existir muita oportunidade sobrando para iniciar sua carreira.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xT5LMwlfd7jHilyWsg/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xT5LMwlfd7jHilyWsg/giphy.gif" width="480" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para quem deseja começar agora na área, existem alguns atalhos (pelo menos no momento). Mas entenda que esses atalhos não significam que o caminho será fácil, e que vai precisar continuar a estudar por 2, 4, 6 ou 20 anos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/d3yxg15kJppJilnW/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/d3yxg15kJppJilnW/giphy.gif" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A área de tecnologia é exigente com os seus profissionais, estudar muito é obrigatório. Aceita os termos?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/8b0h4mwDzg0aZON22w/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/8b0h4mwDzg0aZON22w/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Opções para começar
&lt;/h2&gt;

&lt;p&gt;Agora vou apresentar algumas opções para começar na área de TI, o melhor caminho será decisão sua. Abaixo segue uma lista, e vou incluir alguns sites para cada uma dessa opções:&lt;/p&gt;

&lt;h3&gt;
  
  
  Cursos rápidos
&lt;/h3&gt;

&lt;p&gt;Os cursos rápidos servem vários objetivos para pessoas diferentes podem ser utilizados para conectar as diferentes etapas do estudo académico, ou para obter formação profissional e melhorar suas qualificações.&lt;/p&gt;

&lt;p&gt;Cursos livres seriam plataformas de educação ou escolas que ofertam cursos presenciais, vou focar nos cursos online. Essas são as plataformas que eu recomendo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.alura.com.br/"&gt;Alura&lt;/a&gt; (pago).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.coursera.org/"&gt;Coursera&lt;/a&gt; (gratuito ou pago).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.edx.org/"&gt;edX&lt;/a&gt; (gratuito ou pago).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.linuxtips.io/"&gt;LINUXtips&lt;/a&gt; (pago, existem campanhas gratuitas).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://learn.microsoft.com/pt-br/training/"&gt;Microsoft Learn&lt;/a&gt; (gratuito).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.pluralsight.com/"&gt;Pluralsight&lt;/a&gt; (pago, com um período gratuito).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.rocketseat.com.br/discover"&gt;Rocketseat&lt;/a&gt; (gratuito).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.udemy.com/"&gt;Udemy&lt;/a&gt; (pago, com alguns cursos gratuitos).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/Universidade-Livre/ciencia-da-computacao"&gt;Universidade Brasileira Livre&lt;/a&gt; (gratuito).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como podem perceber, algumas opções são gratuitas, mas estão disponíveis apenas no idioma inglês. Outras plataformas em português em sua grande parte estão cobrando um valor para acessar o seu catalogo. &lt;/p&gt;

&lt;p&gt;Vale ressaltar que a &lt;a href="https://www.linuxtips.io/"&gt;LINUXtips&lt;/a&gt; tem uma peculiaridade bem interessante. É uma plataforma paga, mas eles costumam fazer campanhas para oferecer cursos gratuitos para um público bem diversificado. Vale a pena procurar a &lt;a href="https://www.linuxtips.io/"&gt;LINUXtips&lt;/a&gt; para saber mais.&lt;/p&gt;

&lt;p&gt;Particularmente eu recomendo esses cursos aqui:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.coursera.org/professional-certificates/meta-back-end-developer"&gt;Certificado Profissional Desenvolvedor Back-End da Meta&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.rocketseat.com.br/discover"&gt;Introdução à programação&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.coursera.org/specializations/google-golang"&gt;Programa de cursos integrados Programming with Google Go&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.coursera.org/specializations/python"&gt;Programa de cursos integrados Python para todosPython para todos&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cursos técnicos
&lt;/h3&gt;

&lt;p&gt;Cursos técnicos recomendo muito para o adolescente que ainda está no ensino médio e já sabe que quer seguir o caminho da tecnologia. &lt;/p&gt;

&lt;p&gt;O Senai possui cursos na modalidade presencial espalhado pelo Brasil e também possui a opção por curso a distância.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.portaldaindustria.com.br/senai/"&gt;Senai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Faculdade
&lt;/h3&gt;

&lt;p&gt;Mesmo sabendo que não é obrigatório para muitas vagas de emprego, procurem concluir um curso de nível superior. Mesmo que demore, todo esforço em educação é recompensado.&lt;/p&gt;

&lt;p&gt;Para o dia a dia, não faz diferença se o curso é Ciência de Computação, Sistemas de Informação, Analise e Desenvolvimento de Sistemas ou Engenharia da Computação. A escolha é toda sua, a diferença será na duração do curso e na grade de disciplina de cada um desse curso.&lt;/p&gt;

&lt;p&gt;Algumas vagas exigem que o profissional tenha formação de nível superior. Dessa forma você terá mais oportunidades.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/loLwXSIVPV9bGEF3GG/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/loLwXSIVPV9bGEF3GG/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Programas de bootcamp
&lt;/h3&gt;

&lt;p&gt;Um bootcamp é um tipo de treinamento imersivo feito para o desenvolver habilidades técnicas onde o futuro profissional de tecnologia absorva o conhecimento teórico de maneira conjunta com a prática. No universo de TIC, essa modalidade está ganhando cada vez mais força no mercado. Essa é a opção mas vantajosa na minha humilde opinião, e sendo honesto iniciei minha carreira realizando um bootcamp, na época tinha outro nome &lt;a href="https://www.sistemafibra.org.br/senai/noticias/39-do-dia/245-senai-df-e-microsoft-encerram-primeira-fase-do-s2b"&gt;Student to Business (S2B)&lt;/a&gt; uma parceria entre a Microsoft e o Senai-DF.&lt;/p&gt;

&lt;p&gt;Em um bootcamp, os alunos vivenciam um treinamento imersivo com profissionais com experiência de mercado, que vão ajudá-los a começar seus primeiros projetos num curto espaço de tempo. Inclusive, o tempo é um fator determinante neste tipo de curso, geralmente com algumas semanas de duração.&lt;/p&gt;

&lt;p&gt;Um bom bootcamp oferece uma parceria com alguma empresa que esta buscando por profissionais qualificados. Por esse experiencia posso recomendar a &lt;a href="https://www.xpeducacao.com.br/bootcamp/programador-software-iniciante"&gt;XP Educacao&lt;/a&gt; e a &lt;a href="https://www.betrybe.com/"&gt;Trybe&lt;/a&gt;. Eu já tive o prazer de trabalhar com as duas plataformas, dentro da Wiz Soluções.&lt;/p&gt;

&lt;p&gt;Nesse momento, Wiz esta realizando a 3ª edição do programa Speed Wiz Dev, tive a oportunidade de acompanhar as 2 edições anteriores e conheci vários profissionais super hiper mega qualificados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jobs.kenoby.com/SpeedWizDev/"&gt;Vagas para o 3ª edição do Speed Wiz Dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Algumas matérias sobre versões passadas do Speed Dev Wiz:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wizsolucoes.com.br/wiz-e-igti-atraem-45-mil-pessoas-em-programa-de-desenvolvedores-de-software/"&gt;Wiz e IGTI atraem 4,5 mil pessoas em programa de desenvolvedores de software&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/hbascqeOSto"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Cuidado! Os programas de bootcamp é um meio para começar, e lembre que ao terminar um bootcamp não é o fim do treinamento, é apenas o início da sua carreira. Esse início pode ser bastante assustador, nesse momento é muito importante ter um padrinho que o acolha durante os primeiros meses, esse padrinho terá um papel fundamental para te ajudar com os problemas do dia a dia.&lt;/p&gt;

&lt;p&gt;E lembre que errar faz parte, e não saber nada é normal e que o aprendizado é um processo lento e demorado. Dessa forma só posso aconselhar a não desistir e continue estudando, que o resultado virá.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/8dYmJ6Buo3lYY/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/8dYmJ6Buo3lYY/giphy.gif" width="282" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>braziliandevs</category>
      <category>br</category>
    </item>
    <item>
      <title>GC: Otimizando para o ambiente do Azure</title>
      <dc:creator>Pode me chamar de Juscélio Reis</dc:creator>
      <pubDate>Sun, 07 Feb 2021 15:24:40 +0000</pubDate>
      <link>https://forem.com/devzwiz/gc-otimizando-para-o-ambiente-do-azure-4mkp</link>
      <guid>https://forem.com/devzwiz/gc-otimizando-para-o-ambiente-do-azure-4mkp</guid>
      <description>&lt;p&gt;Neste artigo, pretendo abordar um assunto complicado e que pode ser usado para melhorar nossas aplicações hospedados na nuvem da Microsoft Azure. Vou abordar o que exatamente acontece durante a coleta de lixo (GC) e como diferentes modos de GC podem afetar significativamente o desempenho do aplicativo. Mas antes vamos entender qual o ambiente que estamos executando nossas aplicações.&lt;/p&gt;

&lt;h2&gt;
  
  
  Azure
&lt;/h2&gt;

&lt;p&gt;O que mais consumimos do Azure aqui na Wiz é o serviço de Aplicativo, ou se preferir chamar App Service. Esse serviço quando criado é composto de alguns nomes ou outros serviços. Sendo eles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;App Service Plan (Plano de Serviço de Aplicativo)&lt;/strong&gt;: Um Plano de Serviço de Aplicativo consiste nas máquinas virtuais alocadas que hospedarão os Serviços de Aplicativo do Azure. Possui vários níveis, do Gratuito ao Premium, seu orçamento é o limite. O Plano de Serviço de Aplicativo define a região do servidor físico onde seu aplicativo será hospedado e a quantidade de armazenamento, &lt;strong&gt;RAM&lt;/strong&gt; e &lt;strong&gt;CPU&lt;/strong&gt; que os servidores físicos terão.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;App Service (Serviço de Aplicativo)&lt;/strong&gt;: O Serviço de Aplicativo do Azure é um serviço baseado em HTTP para hospedar aplicativos da web, APIs REST e back-ends móveis.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resource Group (grupo de recursos)&lt;/strong&gt;: Um grupo de recursos é um conjunto que contém recursos relacionados para uma solução do Azure. O grupo de recursos pode incluir todos os recursos da solução ou apenas os recursos que você deseja gerenciar como um grupo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora que temos a nomenclatura do Azure para os serviços de APIs, vamos observas os planos de serviço, ou como aprendemos, vamos olhar nas opções do &lt;em&gt;App Service Plan&lt;/em&gt;. Podemos dividir esse plano de serviço em três categorias:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Computação compartilhada&lt;/em&gt;: &lt;em&gt;Free&lt;/em&gt; ou &lt;em&gt;F1&lt;/em&gt; e &lt;em&gt;Shared&lt;/em&gt;, as duas camadas de base, executa um aplicativo na mesma VM do Azure que outros aplicativos de serviço de aplicativo, incluindo aplicativos de outros clientes. Essas camadas alocam cotas de CPU para cada aplicativo executado nos recursos compartilhados, e os recursos não podem ser escalonados. Esse plano possui um limite de tempo e não permite a opção de configurar as apis em dotnet como 64 bits. &lt;strong&gt;Esse plano é um grande problema para nossas apis, pois a combinação do dotnet core 3.1 com uma configuração de 32 bits vai resultar em erro de estouro de memória, em outras palavras não usem em ambiente de homologação ou produção&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Computação dedicada&lt;/em&gt;: as camadas Basic, Standard, Premium, PremiumV2 e PremiumV3 executam aplicativos em VMs do Azure dedicadas. Somente aplicativos no mesmo &lt;em&gt;App Service Plan&lt;/em&gt; &lt;strong&gt;compartilham os mesmos recursos de computação&lt;/strong&gt;. Quanto mais alto o nível, mais instâncias de VM estão disponíveis para você escalar horizontalmente. Essa é a opção que usamos em homologação e produção, em sua grande maioria usamos o plano &lt;em&gt;S1&lt;/em&gt; ou &lt;em&gt;Standard 1&lt;/em&gt;, em alguns casos usamos o plano &lt;em&gt;B1&lt;/em&gt; ou &lt;em&gt;Basic&lt;/em&gt;, &lt;strong&gt;lembrando que não é recomendado pela Microsoft a utilização do plano Basic para produção&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Isolado&lt;/em&gt;: esta camada executa VMs do Azure dedicadas em Redes Virtuais do Azure dedicadas. Ele fornece isolamento de rede além do isolamento de computação para seus aplicativos. Ele fornece os recursos de expansão máxima. No momento vamos ignorar esse modo aqui.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Preste atenção aqui&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O plano B1 possui 1 núcleo de CPU e 1.75 GB de ram, pode receber até 3 instancias de aplicativos, além de outras limitações do plano &lt;em&gt;Basic&lt;/em&gt;. &lt;a href="https://azure.microsoft.com/pt-br/pricing/details/app-service/windows/"&gt;Mais informação aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O plano S1 possui 1 núcleo de CPU e 1.75 GB de ram, mas pode receber até 10 instancias de aplicativos, além de outras limitações do plano &lt;em&gt;Standard&lt;/em&gt;. &lt;a href="https://azure.microsoft.com/pt-br/pricing/details/app-service/windows/"&gt;Mais informação aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Bom agora podemos voltar ao tema principal desse artigo &lt;em&gt;garbage collection&lt;/em&gt; ou GC pros íntimos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Garbage Collection
&lt;/h2&gt;

&lt;p&gt;Vou colocar um pequeno resumo do GC aqui, só para entender qual o seu papel no nosso ambiente computacional. Mas será um breve resumo, mais informação ler esse &lt;a href="https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals#ephemeral-generations-and-segments"&gt;artigo aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O garbage collection (GC) atua como um &lt;em&gt;gerenciador de memória automático&lt;/em&gt;. O garbage collection gerencia a alocação e liberação de memória para um aplicativo. O gerenciamento automático de memória pode eliminar problemas comuns, como esquecer de liberar um objeto e causar um vazamento de memória ou tentar acessar a memória de um objeto que já foi liberado.&lt;/p&gt;

&lt;p&gt;A coleta de lixo ocorre quando uma das seguintes condições é verdadeira:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;O sistema está com pouca memória física. Isso é detectado pela notificação de memória insuficiente do sistema operacional ou memória insuficiente, conforme indicado pelo host.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A memória usada por objetos alocados no heap gerenciado ultrapassa um limite aceitável. Este limite é continuamente ajustado conforme o processo é executado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O método GC.Collect é chamado. Em quase todos os casos, &lt;strong&gt;você não precisa chamar esse método&lt;/strong&gt;, porque o coletor de lixo é executado continuamente. &lt;strong&gt;Este método é usado principalmente para situações e testes únicos&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O algoritmo GC é baseado em várias premissas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;É mais rápido compactar a memória para uma parte do heap gerenciado do que para todo o heap gerenciado.&lt;/li&gt;
&lt;li&gt;Objetos mais novos têm vida útil mais curta e objetos mais antigos têm vida útil mais longa.&lt;/li&gt;
&lt;li&gt;Objetos mais novos tendem a estar relacionados entre si e acessados pelo aplicativo ao mesmo tempo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como vemos a estratégia do GC é dividir o heap em partes considerando a idade dos objetos para otimizar o desempenho, o heap gerenciado é dividido em três gerações, 0, 1 e 2.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Geração 0: Esta é a geração mais jovem e contém objetos de curta duração. Um exemplo de objeto de vida curta é uma variável temporária. A coleta de lixo ocorre com mais frequência nesta geração.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Geração 1: Esta geração contém objetos de vida curta e serve como um buffer entre objetos de vida curta e objetos de vida longa.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Geração 2: Esta geração contém objetos de vida longa. Um exemplo de objeto de longa duração é um objeto em um aplicativo de servidor que contém dados estáticos que estão ativos durante o processo. &lt;strong&gt;Mais um motivo para nunca encher nossa aplicação com objetos estáticos&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Objetos que não são recuperados em uma coleta de lixo são conhecidos como sobreviventes e são promovidos para a próxima geração:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Os objetos que sobrevivem a uma coleta de lixo da geração 0 são promovidos para a geração 1.&lt;/li&gt;
&lt;li&gt;Os objetos que sobrevivem a uma coleta de lixo da geração 1 são promovidos para a geração 2.&lt;/li&gt;
&lt;li&gt;Os objetos que sobrevivem a uma coleta de lixo da geração 2 permanecem na geração 2.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Até aqui podemos entender que os objetos da geração 0 e 1 são os mais voláteis ou como está na documentação são objetos efêmeros. Já os objetos da geração 2 são mais permanentes então não faz tanto sentido fazer uma coleta de lixo completa, podemos focar mais nas gerações 0 e 1 que vamos obter mais sucesso. &lt;strong&gt;Mais um motivo para evitar a utilização de objetos estáticos e de tentar chamar o GC.Collect manualmente&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Estamos chegando na parte de otimização, até aqui foi um grande resumo do resumo para começar o processo de otimização. *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O tamanho do segmento efêmero varia dependendo se um sistema é de 32 ou 64 bits e do tipo de coletor de lixo que está executando (Workstation ou Server GC). A tabela a seguir mostra os tamanhos padrão do segmento efêmero.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workstation/server GC&lt;/th&gt;
&lt;th&gt;32-bit&lt;/th&gt;
&lt;th&gt;64-bit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Workstation GC&lt;/td&gt;
&lt;td&gt;16 MB&lt;/td&gt;
&lt;td&gt;256 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server GC&lt;/td&gt;
&lt;td&gt;64 MB&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server GC with &amp;gt; 4 logical CPUs&lt;/td&gt;
&lt;td&gt;32 MB&lt;/td&gt;
&lt;td&gt;2 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server GC with &amp;gt; 8 logical CPUs&lt;/td&gt;
&lt;td&gt;16 MB&lt;/td&gt;
&lt;td&gt;1 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Acabamos de saber que o existem dois tipos de GC, um chamado Workstation GC e outro chamado Server GC. Bora entender esses caras, pois aqui está a chave para a otimização das nossas APIs que estão executando no Azure. Se não entendeu olha o tamanho que elas possuem no ambiente de 64 bits e compara com o tamanho do &lt;em&gt;App Service Plan&lt;/em&gt; B1 e S1, vai perceber que a matemática não vai bater.&lt;/p&gt;

&lt;p&gt;O GC é inteligente e pode funcionar em uma ampla variedade de cenários. No entanto, podemos definir o tipo de GC com base nas características da carga de trabalho, em outras palavras de acordo com o &lt;em&gt;App Service Plan&lt;/em&gt;. O dotnet fornece os seguintes tipos de GC:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Workstation: GC da estação de trabalho, que é projetada para aplicativos cliente. É o padrão do GC para aplicativos independentes. Para aplicativos hospedados, por exemplo, aqueles hospedados pelo ASP.NET, o host determina o padrão do GC. Vai um &lt;em&gt;spoiler&lt;/em&gt; vai ser o tipo Server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Server: GC que se destina a aplicativos de servidor que precisam de alto rendimento e escalabilidade.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Aqui é onde vou citar o blog da microsoft, a visão que eles possuíam do ambiente de hospedagem das aplicações dotnet:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Keep in mind that it’s very common to run only one server process on a dedicated machine so you don’t get into this situation. &lt;br&gt;
-- Maoni, &lt;a href="https://devblogs.microsoft.com/dotnet/workstation-gc-for-server-applications/"&gt;Workstation GC for server applications?&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Não é o que estamos utilizando no contexto atual, usamos servidores com 1 núcleo e 1.75GB de ram para hospedar de 3 a 10 aplicações. Essa é a questão!!! Precisamos mudar o padrão e utilizar como uma aplicação que vai funcionar na máquina do cliente em outras palavras precisamos sair do Server GC para o Workstation GC. Mas ao começar essa otimização precisamos alterar uma tag no &lt;em&gt;.Api.csproj, vamos colocar a tag *ServerGarbageCollection&lt;/em&gt; como &lt;em&gt;false&lt;/em&gt;. &lt;a href="https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/workstation-server-gc"&gt;Mais informação aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Porem ao alterar essa tag precisamos alterar outra &lt;em&gt;ConcurrentGarbageCollection&lt;/em&gt; para &lt;em&gt;false&lt;/em&gt;, se você está executando várias instâncias de aplicativo, considere o uso do Workstation GC com a coleta de lixo simultânea desabilitada, &lt;em&gt;ConcurrentGarbageCollection false&lt;/em&gt;. Isso resultará em menos troca de contexto, o que pode melhorar o desempenho.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;Project&lt;/span&gt; &lt;span class="na"&gt;Sdk=&lt;/span&gt;&lt;span class="s"&gt;"Microsoft.NET.Sdk.Web"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;TargetFramework&amp;gt;&lt;/span&gt;netcoreapp3.1&lt;span class="nt"&gt;&amp;lt;/TargetFramework&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;AspNetCoreHostingModel&amp;gt;&lt;/span&gt;InProcess&lt;span class="nt"&gt;&amp;lt;/AspNetCoreHostingModel&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;GenerateDocumentationFile&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/GenerateDocumentationFile&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;IncludeOpenAPIAnalyzers&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/IncludeOpenAPIAnalyzers&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ServerGarbageCollection&amp;gt;&lt;/span&gt;false&lt;span class="nt"&gt;&amp;lt;/ServerGarbageCollection&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ConcurrentGarbageCollection&amp;gt;&lt;/span&gt;false&lt;span class="nt"&gt;&amp;lt;/ConcurrentGarbageCollection&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Fiz um teste e você pode ver como a combinação de &lt;em&gt;ServerGarbageCollection false&lt;/em&gt; com &lt;em&gt;ConcurrentGarbageCollection true&lt;/em&gt; aumenta o tempo de processamento.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;
&lt;span class="py"&gt;BenchmarkDotNet&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;v0.12.1, OS=ubuntu 20.04&lt;/span&gt;
&lt;span class="err"&gt;Intel&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="err"&gt;i7-7500U&lt;/span&gt; &lt;span class="err"&gt;CPU&lt;/span&gt; &lt;span class="err"&gt;2.70GHz&lt;/span&gt; &lt;span class="err"&gt;(Kaby&lt;/span&gt; &lt;span class="err"&gt;Lake),&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt; &lt;span class="err"&gt;CPU,&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt; &lt;span class="err"&gt;logical&lt;/span&gt; &lt;span class="err"&gt;cores&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt; &lt;span class="err"&gt;physical&lt;/span&gt; &lt;span class="err"&gt;core&lt;/span&gt;
&lt;span class="err"&gt;.NET&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="py"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;3.1.405&lt;/span&gt;
  &lt;span class="nn"&gt;[Host]&lt;/span&gt;                &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;.NET&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="err"&gt;3.1.11&lt;/span&gt; &lt;span class="err"&gt;(CoreCLR&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56602,&lt;/span&gt; &lt;span class="err"&gt;CoreFX&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56604),&lt;/span&gt; &lt;span class="err"&gt;X64&lt;/span&gt; &lt;span class="err"&gt;RyuJIT&lt;/span&gt;
  &lt;span class="err"&gt;Server&lt;/span&gt;                &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;.NET&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="err"&gt;3.1.11&lt;/span&gt; &lt;span class="err"&gt;(CoreCLR&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56602,&lt;/span&gt; &lt;span class="err"&gt;CoreFX&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56604),&lt;/span&gt; &lt;span class="err"&gt;X64&lt;/span&gt; &lt;span class="err"&gt;RyuJIT&lt;/span&gt;
  &lt;span class="err"&gt;ServerConcurrent&lt;/span&gt;      &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;.NET&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="err"&gt;3.1.11&lt;/span&gt; &lt;span class="err"&gt;(CoreCLR&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56602,&lt;/span&gt; &lt;span class="err"&gt;CoreFX&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56604),&lt;/span&gt; &lt;span class="err"&gt;X64&lt;/span&gt; &lt;span class="err"&gt;RyuJIT&lt;/span&gt;
  &lt;span class="err"&gt;Workstation&lt;/span&gt;           &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;.NET&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="err"&gt;3.1.11&lt;/span&gt; &lt;span class="err"&gt;(CoreCLR&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56602,&lt;/span&gt; &lt;span class="err"&gt;CoreFX&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56604),&lt;/span&gt; &lt;span class="err"&gt;X64&lt;/span&gt; &lt;span class="err"&gt;RyuJIT&lt;/span&gt;
  &lt;span class="err"&gt;WorkstationConcurrent&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;.NET&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="err"&gt;3.1.11&lt;/span&gt; &lt;span class="err"&gt;(CoreCLR&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56602,&lt;/span&gt; &lt;span class="err"&gt;CoreFX&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56604),&lt;/span&gt; &lt;span class="err"&gt;X64&lt;/span&gt; &lt;span class="err"&gt;RyuJIT&lt;/span&gt;

&lt;span class="py"&gt;IterationCount&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;15  LaunchCount=2  WarmupCount=10  &lt;/span&gt;

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

&lt;/div&gt;


&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Concurrent&lt;/th&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;Mean&lt;/th&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;StdDev&lt;/th&gt;
&lt;th&gt;Median&lt;/th&gt;
&lt;th&gt;Gen 0&lt;/th&gt;
&lt;th&gt;Gen 1&lt;/th&gt;
&lt;th&gt;Gen 2&lt;/th&gt;
&lt;th&gt;Allocated&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WithoutHttpCompletionOption&lt;/td&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;428.7 ms&lt;/td&gt;
&lt;td&gt;72.57 ms&lt;/td&gt;
&lt;td&gt;108.62 ms&lt;/td&gt;
&lt;td&gt;428.8 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;389.94 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithHttpCompletionOption&lt;/td&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;483.2 ms&lt;/td&gt;
&lt;td&gt;54.60 ms&lt;/td&gt;
&lt;td&gt;81.72 ms&lt;/td&gt;
&lt;td&gt;516.0 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;146.13 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithGetStreamAsync&lt;/td&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;458.3 ms&lt;/td&gt;
&lt;td&gt;63.28 ms&lt;/td&gt;
&lt;td&gt;94.72 ms&lt;/td&gt;
&lt;td&gt;514.9 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;146.64 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithoutHttpCompletionOption&lt;/td&gt;
&lt;td&gt;ServerConcurrent&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;519.6 ms&lt;/td&gt;
&lt;td&gt;12.83 ms&lt;/td&gt;
&lt;td&gt;17.98 ms&lt;/td&gt;
&lt;td&gt;515.4 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;381.52 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithHttpCompletionOption&lt;/td&gt;
&lt;td&gt;ServerConcurrent&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;354.8 ms&lt;/td&gt;
&lt;td&gt;50.80 ms&lt;/td&gt;
&lt;td&gt;72.85 ms&lt;/td&gt;
&lt;td&gt;327.6 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;145.77 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithGetStreamAsync&lt;/td&gt;
&lt;td&gt;ServerConcurrent&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;490.3 ms&lt;/td&gt;
&lt;td&gt;75.63 ms&lt;/td&gt;
&lt;td&gt;110.86 ms&lt;/td&gt;
&lt;td&gt;516.2 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;148.85 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithoutHttpCompletionOption&lt;/td&gt;
&lt;td&gt;Workstation&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;484.2 ms&lt;/td&gt;
&lt;td&gt;57.89 ms&lt;/td&gt;
&lt;td&gt;83.03 ms&lt;/td&gt;
&lt;td&gt;513.9 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;307.69 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithHttpCompletionOption&lt;/td&gt;
&lt;td&gt;Workstation&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;432.8 ms&lt;/td&gt;
&lt;td&gt;75.27 ms&lt;/td&gt;
&lt;td&gt;105.52 ms&lt;/td&gt;
&lt;td&gt;508.2 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;146.98 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithGetStreamAsync&lt;/td&gt;
&lt;td&gt;Workstation&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;580.9 ms&lt;/td&gt;
&lt;td&gt;60.71 ms&lt;/td&gt;
&lt;td&gt;87.07 ms&lt;/td&gt;
&lt;td&gt;534.8 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;148.18 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithoutHttpCompletionOption&lt;/td&gt;
&lt;td&gt;WorkstationConcurrent&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;544.1 ms&lt;/td&gt;
&lt;td&gt;61.84 ms&lt;/td&gt;
&lt;td&gt;90.64 ms&lt;/td&gt;
&lt;td&gt;530.3 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;307.95 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithHttpCompletionOption&lt;/td&gt;
&lt;td&gt;WorkstationConcurrent&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;661.8 ms&lt;/td&gt;
&lt;td&gt;94.76 ms&lt;/td&gt;
&lt;td&gt;132.85 ms&lt;/td&gt;
&lt;td&gt;710.2 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;151.16 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithGetStreamAsync&lt;/td&gt;
&lt;td&gt;WorkstationConcurrent&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;565.5 ms&lt;/td&gt;
&lt;td&gt;129.98 ms&lt;/td&gt;
&lt;td&gt;182.21 ms&lt;/td&gt;
&lt;td&gt;541.9 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;143.86 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Exemplo
&lt;/h2&gt;

&lt;p&gt;No mês de janeiro uma API começou a ter muitos problemas de estouro de memória, lembrando que essa aplicação está utilizando o plano B1 e não está sozinha no &lt;em&gt;Service Plan&lt;/em&gt;. Olha como estava o consumo de memória na época:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--szWB6E-f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/to9ocawvnv4rnt6jow8i.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--szWB6E-f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/to9ocawvnv4rnt6jow8i.PNG" alt="Consumo de memória na epoca"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos notar que essa api consumia uns 280mb em média, mas teve um pico de 800mb. Depois de aplica essa otimização observe como está o consumo de memória um mês depois:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TyRKFQ0n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/puxuxvjyybkp0y7rn3qh.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TyRKFQ0n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/puxuxvjyybkp0y7rn3qh.PNG" alt="Consumo de memória um mês depois"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O consumo de memória não passa de 200mb. Já está rodando a alguns dias e não voltamos a ter problemas com essa API.&lt;/p&gt;

&lt;p&gt;O que foi possível observar é uma considerável redução do consumo de memoria e uma aplicação mais estável no Service Plan B1.&lt;/p&gt;
&lt;h2&gt;
  
  
  Estudos futuros
&lt;/h2&gt;

&lt;p&gt;Existem outras opções que posso alterar, mas como é um assunto bem complicado fica para uma publicação futura. Nem comentei quando estamos trabalhando em um ambiente de container (ex: docker), podemos definir um limite para a heap sem precisar altera o tipo de GC. Caso queriam saber mais, curte esse material:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://devblogs.microsoft.com/dotnet/running-with-server-gc-in-a-small-container-scenario-part-0/"&gt;Running with Server GC in a Small Container Scenario Part 0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devblogs.microsoft.com/dotnet/running-with-server-gc-in-a-small-container-scenario-part-1-hard-limit-for-the-gc-heap/"&gt;Running with Server GC in a Small Container Scenario Part 1 – Hard Limit for the GC Heap
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/m4fddMZDceQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;
&lt;h2&gt;
  
  
  Referencia
&lt;/h2&gt;

&lt;p&gt;Vou deixar uma lista de conteúdo para você conhecer mais sobre o assunto.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://devblogs.microsoft.com/dotnet/workstation-gc-for-server-applications/"&gt;Workstation GC for server applications?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devblogs.microsoft.com/dotnet/garbage-collection-at-food-courts/"&gt;Garbage Collection at Food Courts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/pt-br/dotnet/core/run-time-config/garbage-collector"&gt;Run-time configuration options for garbage collection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devblogs.microsoft.com/premier-developer/understanding-different-gc-modes-with-concurrency-visualizer/"&gt;Understanding different GC modes with Concurrency Visualizer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devblogs.microsoft.com/dotnet/middle-ground-between-server-and-workstation-gc/"&gt;Middle Ground between Server and Workstation GC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/workstation-server-gc"&gt;Workstation and server garbage collection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals#ephemeral-generations-and-segments"&gt;Fundamentals of garbage collection&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;div class="ltag__user ltag__user__id__426430"&gt;
  
    .ltag__user__id__426430 .follow-action-button {
      background-color: #008000 !important;
      color: #dce9f3 !important;
      border-color: #008000 !important;
    }
  
    &lt;a href="/juscelior" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4xok3liq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--nZjGgy2R--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/426430/ab8d100e-70ca-42c4-a5f8-52fc203e22bf.jpg" alt="juscelior image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/juscelior"&gt;Pode me chamar de Juscélio Reis&lt;/a&gt;
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/juscelior"&gt; Professional in constant learning, software developer with almost 10 years of career, researcher on distributed systems and information security. Strong experience in software development with C #&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>azure</category>
      <category>csharp</category>
      <category>devz</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>HttpClient: melhoria de performance ao otimizar o uso de memória</title>
      <dc:creator>Pode me chamar de Juscélio Reis</dc:creator>
      <pubDate>Thu, 04 Feb 2021 21:37:42 +0000</pubDate>
      <link>https://forem.com/devzwiz/httpclient-melhoria-de-performance-ao-otimizar-o-uso-de-memoria-4nj3</link>
      <guid>https://forem.com/devzwiz/httpclient-melhoria-de-performance-ao-otimizar-o-uso-de-memoria-4nj3</guid>
      <description>&lt;p&gt;Neste último mês fiquei investigando incidentes relacionados a alto consumo de memória por parte das nossas aplicações. Consegui encontrar alguns problemas e quero compartilhar com vocês, vamos começar com a utilização do HttpClient, esse cara pode ser um vilão se não for bem utilizado. As APIs da Wiz têm uma característica de chamar outras APIs e me atrevo a dizer que é mais consumo de API do que utilização de banco de dados. Nesse artigo quero explicar como você pode otimizar o desempenho do HttpClient ao lidar com dados como cargas úteis JSON no HttpResponseMessage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Teoria
&lt;/h2&gt;

&lt;p&gt;O que eu não sabia era que por padrão, na maioria dos casos, ao usar HttpClient e seus metodos (GetAsync, PostAsync e SendAsync), todo o corpo da resposta é lido em um buffer de memória antes que o método seja concluído. Nesse ponto, a conexão TCP, usada para a solicitação fica inativa e estará disponível para reutilização para outra solicitação, um ponto aqui é que estou falando do &lt;strong&gt;dotnet core 3.1&lt;/strong&gt;, se for falar do dotnet 5, existem opções melhores como é o caso da utilização do protocolo http2, aí a história é outra.&lt;/p&gt;

&lt;p&gt;Na maioria dos casos esse comportamento é aceitável, já que evita o uso da conexão tcp pelo período mínimo de tempo necessário. Mas... em casos que não temos memória sobressalente, aí entramos no caminho infeliz da história pois essa abordagem padrão introduz alguma sobrecarga de memória. Já que a resposta da API, vou generalizar aqui, o JSON é armazenado em buffer usando um MemoryStream, podemos acessar esse buffer pela classe HttpResponseMessage. Dependendo do tamanho da carga de resposta, isso pode significar que armazenamos em buffer uma grande quantidade de dados na memória.&lt;/p&gt;

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

&lt;p&gt;O que eu não sabia era que existe uma sobrecarga desses métodos esperando um &lt;em&gt;enum&lt;/em&gt; HttpCompletionOption, esse &lt;em&gt;enum&lt;/em&gt; possui 2 valores o padrão é o ResponseContentRead, esse aí informa para o HttpClient que é para ler o corpo do JSON e colocar em memória mesmo que a nossa aplicação não vai usar esse objeto, sim isso é possível. O segundo valor é o que iremos começar a utilizar aqui na Wiz chamado ResponseHeadersRead, esse cara indica para o HttpClient quando os cabeçalhos de resposta forem totalmente lidos. O corpo da resposta pode não ser totalmente recebido neste momento.&lt;/p&gt;

&lt;p&gt;O principal benefício é o desempenho. Ao usar esta opção, evitamos o buffer MemoryStream intermediário, em vez de obter o conteúdo diretamente do fluxo exposto no Socket. Isso evita alocações desnecessárias, o que é uma meta em situações altamente otimizadas.&lt;/p&gt;

&lt;p&gt;Aqui vai um exemplo, quero serializar uma lista de livros apenas quando receber um status code 200. Se eu receber um 500 vou lançar uma exception e não preciso do conteúdo da API que estou consumindo.&lt;/p&gt;

&lt;p&gt;A forma de utilizar esse enum é bem simples, olha como fica:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;_httpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://openlibrary.org/search.json?q=tdd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HttpCompletionOption&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseHeadersRead&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;O normal é analisar o conteúdo de alguma forma. Vou mostrar um código de como podemos escrever nossa chamada para isso.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_httpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://openlibrary.org/search.json?q=tdd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HttpCompletionOption&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseHeadersRead&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EnsureSuccessStatusCode&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="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Content&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadAsStreamAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

      &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DeserializeAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Search&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="c1"&gt;// do something with the data or return it&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Usamos o EnsureSuccessStatusCode para garantir que o status code recebido é um 2xx. Em caso afirmativo, verificamos se há conteúdo disponível na resposta. Agora podemos acessar o fluxo do conteúdo de resposta usando ReadAsStreamAsync.&lt;/p&gt;

&lt;p&gt;O problema dessa abordagem é que assumimos mais responsabilidade em relação aos recursos do sistema, uma vez que a conexão com o servidor remoto fica presa até decidirmos que terminaremos com o conteúdo. A maneira como sinalizamos isso é descartando o HttpResponseMessage, que então libera a conexão para ser usada para outras solicitações. Por isso não esquecer do &lt;em&gt;using&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_httpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetAsync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Outra forma de garantir isso é usar o try/finaly, veja um exemplo:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_httpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://openlibrary.org/search.json?q=tdd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HttpCompletionOption&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseHeadersRead&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EnsureSuccessStatusCode&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;Search&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;try&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="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Content&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadAsStreamAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DeserializeAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Search&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;stream&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;finally&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Dispose&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// intensive and slow processing of books list. We don't want this to delay releasing the connection.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Estudo de caso
&lt;/h2&gt;

&lt;p&gt;Fiz um programa de teste para ter um benchmark da performance do que citei nesse artigo. Essa analise é feita tanto no Windows como no Linux, usando o dotnet core 3.1. Vocês podem &lt;a href="https://github.com/juscelior/benchmarkhttp" rel="noopener noreferrer"&gt;acessar aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Observe a coluna Allocated, usando um sistema Windows com o método WithHttpCompletionOption chegamos a uma performance de 26,87% em comparação com WithoutHttpCompletionOption que representa 73,13% do consumo de memória.&lt;/p&gt;

&lt;p&gt;Agora usando um sistema Linux com o método WithHttpCompletionOption chegamos a uma performance de 28,62% em comparação com o método WithoutHttpCompletionOption que representa 71,38% do consumo de memória.&lt;/p&gt;
&lt;h3&gt;
  
  
  Windows
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;
&lt;span class="py"&gt;BenchmarkDotNet&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;v0.12.1, OS=Windows 10.0.19042&lt;/span&gt;
&lt;span class="err"&gt;Intel&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="err"&gt;i7-7500U&lt;/span&gt; &lt;span class="err"&gt;CPU&lt;/span&gt; &lt;span class="err"&gt;2.70GHz&lt;/span&gt; &lt;span class="err"&gt;(Kaby&lt;/span&gt; &lt;span class="err"&gt;Lake),&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt; &lt;span class="err"&gt;CPU,&lt;/span&gt; &lt;span class="err"&gt;4&lt;/span&gt; &lt;span class="err"&gt;logical&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt; &lt;span class="err"&gt;physical&lt;/span&gt; &lt;span class="err"&gt;cores&lt;/span&gt;
&lt;span class="err"&gt;.NET&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="py"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;3.1.404&lt;/span&gt;
  &lt;span class="nn"&gt;[Host]&lt;/span&gt;           &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;.NET&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="err"&gt;3.1.10&lt;/span&gt; &lt;span class="err"&gt;(CoreCLR&lt;/span&gt; &lt;span class="err"&gt;4.700.20.51601,&lt;/span&gt; &lt;span class="err"&gt;CoreFX&lt;/span&gt; &lt;span class="err"&gt;4.700.20.51901),&lt;/span&gt; &lt;span class="err"&gt;X64&lt;/span&gt; &lt;span class="err"&gt;RyuJIT&lt;/span&gt;
  &lt;span class="err"&gt;Server&lt;/span&gt;           &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;.NET&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="err"&gt;3.1.10&lt;/span&gt; &lt;span class="err"&gt;(CoreCLR&lt;/span&gt; &lt;span class="err"&gt;4.700.20.51601,&lt;/span&gt; &lt;span class="err"&gt;CoreFX&lt;/span&gt; &lt;span class="err"&gt;4.700.20.51901),&lt;/span&gt; &lt;span class="err"&gt;X64&lt;/span&gt; &lt;span class="err"&gt;RyuJIT&lt;/span&gt;
  &lt;span class="err"&gt;ServerForce&lt;/span&gt;      &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;.NET&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="err"&gt;3.1.10&lt;/span&gt; &lt;span class="err"&gt;(CoreCLR&lt;/span&gt; &lt;span class="err"&gt;4.700.20.51601,&lt;/span&gt; &lt;span class="err"&gt;CoreFX&lt;/span&gt; &lt;span class="err"&gt;4.700.20.51901),&lt;/span&gt; &lt;span class="err"&gt;X64&lt;/span&gt; &lt;span class="err"&gt;RyuJIT&lt;/span&gt;
  &lt;span class="err"&gt;Workstation&lt;/span&gt;      &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;.NET&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="err"&gt;3.1.10&lt;/span&gt; &lt;span class="err"&gt;(CoreCLR&lt;/span&gt; &lt;span class="err"&gt;4.700.20.51601,&lt;/span&gt; &lt;span class="err"&gt;CoreFX&lt;/span&gt; &lt;span class="err"&gt;4.700.20.51901),&lt;/span&gt; &lt;span class="err"&gt;X64&lt;/span&gt; &lt;span class="err"&gt;RyuJIT&lt;/span&gt;
  &lt;span class="err"&gt;WorkstationForce&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;.NET&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="err"&gt;3.1.10&lt;/span&gt; &lt;span class="err"&gt;(CoreCLR&lt;/span&gt; &lt;span class="err"&gt;4.700.20.51601,&lt;/span&gt; &lt;span class="err"&gt;CoreFX&lt;/span&gt; &lt;span class="err"&gt;4.700.20.51901),&lt;/span&gt; &lt;span class="err"&gt;X64&lt;/span&gt; &lt;span class="err"&gt;RyuJIT&lt;/span&gt;

&lt;span class="py"&gt;IterationCount&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;15  LaunchCount=2  WarmupCount=10  &lt;/span&gt;

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

&lt;/div&gt;


&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Force&lt;/th&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;Mean&lt;/th&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;StdDev&lt;/th&gt;
&lt;th&gt;Median&lt;/th&gt;
&lt;th&gt;Gen 0&lt;/th&gt;
&lt;th&gt;Gen 1&lt;/th&gt;
&lt;th&gt;Gen 2&lt;/th&gt;
&lt;th&gt;Allocated&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WithoutHttpCompletionOption&lt;/td&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;477.6 ms&lt;/td&gt;
&lt;td&gt;65.79 ms&lt;/td&gt;
&lt;td&gt;96.43 ms&lt;/td&gt;
&lt;td&gt;515.4 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;404.48 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithHttpCompletionOption&lt;/td&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;673.4 ms&lt;/td&gt;
&lt;td&gt;73.56 ms&lt;/td&gt;
&lt;td&gt;103.12 ms&lt;/td&gt;
&lt;td&gt;723.6 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;162.16 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithGetStreamAsync&lt;/td&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;703.2 ms&lt;/td&gt;
&lt;td&gt;149.15 ms&lt;/td&gt;
&lt;td&gt;213.91 ms&lt;/td&gt;
&lt;td&gt;662.3 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;162.66 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithoutHttpCompletionOption&lt;/td&gt;
&lt;td&gt;ServerForce&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;414.7 ms&lt;/td&gt;
&lt;td&gt;65.04 ms&lt;/td&gt;
&lt;td&gt;93.27 ms&lt;/td&gt;
&lt;td&gt;363.7 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;394.98 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithHttpCompletionOption&lt;/td&gt;
&lt;td&gt;ServerForce&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;642.0 ms&lt;/td&gt;
&lt;td&gt;81.61 ms&lt;/td&gt;
&lt;td&gt;106.12 ms&lt;/td&gt;
&lt;td&gt;642.8 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;163.63 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithGetStreamAsync&lt;/td&gt;
&lt;td&gt;ServerForce&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;707.8 ms&lt;/td&gt;
&lt;td&gt;97.39 ms&lt;/td&gt;
&lt;td&gt;139.68 ms&lt;/td&gt;
&lt;td&gt;727.4 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;162.81 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithoutHttpCompletionOption&lt;/td&gt;
&lt;td&gt;Workstation&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;659.7 ms&lt;/td&gt;
&lt;td&gt;96.77 ms&lt;/td&gt;
&lt;td&gt;132.46 ms&lt;/td&gt;
&lt;td&gt;643.2 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;394.62 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithHttpCompletionOption&lt;/td&gt;
&lt;td&gt;Workstation&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;530.2 ms&lt;/td&gt;
&lt;td&gt;9.43 ms&lt;/td&gt;
&lt;td&gt;12.59 ms&lt;/td&gt;
&lt;td&gt;528.1 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;162.35 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithGetStreamAsync&lt;/td&gt;
&lt;td&gt;Workstation&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;439.2 ms&lt;/td&gt;
&lt;td&gt;65.54 ms&lt;/td&gt;
&lt;td&gt;98.10 ms&lt;/td&gt;
&lt;td&gt;452.9 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;161.59 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithoutHttpCompletionOption&lt;/td&gt;
&lt;td&gt;WorkstationForce&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;499.3 ms&lt;/td&gt;
&lt;td&gt;52.65 ms&lt;/td&gt;
&lt;td&gt;77.17 ms&lt;/td&gt;
&lt;td&gt;517.6 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;394.89 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithHttpCompletionOption&lt;/td&gt;
&lt;td&gt;WorkstationForce&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;626.4 ms&lt;/td&gt;
&lt;td&gt;69.05 ms&lt;/td&gt;
&lt;td&gt;94.52 ms&lt;/td&gt;
&lt;td&gt;600.1 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;162.98 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithGetStreamAsync&lt;/td&gt;
&lt;td&gt;WorkstationForce&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;508.5 ms&lt;/td&gt;
&lt;td&gt;57.64 ms&lt;/td&gt;
&lt;td&gt;82.67 ms&lt;/td&gt;
&lt;td&gt;524.8 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;162.39 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Linux
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;
&lt;span class="py"&gt;BenchmarkDotNet&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;v0.12.1, OS=ubuntu 20.04&lt;/span&gt;
&lt;span class="err"&gt;Intel&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="err"&gt;i7-7500U&lt;/span&gt; &lt;span class="err"&gt;CPU&lt;/span&gt; &lt;span class="err"&gt;2.70GHz&lt;/span&gt; &lt;span class="err"&gt;(Kaby&lt;/span&gt; &lt;span class="err"&gt;Lake),&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt; &lt;span class="err"&gt;CPU,&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt; &lt;span class="err"&gt;logical&lt;/span&gt; &lt;span class="err"&gt;cores&lt;/span&gt; &lt;span class="err"&gt;and&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt; &lt;span class="err"&gt;physical&lt;/span&gt; &lt;span class="err"&gt;core&lt;/span&gt;
&lt;span class="err"&gt;.NET&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="py"&gt;SDK&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;3.1.405&lt;/span&gt;
  &lt;span class="nn"&gt;[Host]&lt;/span&gt;           &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;.NET&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="err"&gt;3.1.11&lt;/span&gt; &lt;span class="err"&gt;(CoreCLR&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56602,&lt;/span&gt; &lt;span class="err"&gt;CoreFX&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56604),&lt;/span&gt; &lt;span class="err"&gt;X64&lt;/span&gt; &lt;span class="err"&gt;RyuJIT&lt;/span&gt;
  &lt;span class="err"&gt;Server&lt;/span&gt;           &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;.NET&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="err"&gt;3.1.11&lt;/span&gt; &lt;span class="err"&gt;(CoreCLR&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56602,&lt;/span&gt; &lt;span class="err"&gt;CoreFX&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56604),&lt;/span&gt; &lt;span class="err"&gt;X64&lt;/span&gt; &lt;span class="err"&gt;RyuJIT&lt;/span&gt;
  &lt;span class="err"&gt;ServerForce&lt;/span&gt;      &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;.NET&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="err"&gt;3.1.11&lt;/span&gt; &lt;span class="err"&gt;(CoreCLR&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56602,&lt;/span&gt; &lt;span class="err"&gt;CoreFX&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56604),&lt;/span&gt; &lt;span class="err"&gt;X64&lt;/span&gt; &lt;span class="err"&gt;RyuJIT&lt;/span&gt;
  &lt;span class="err"&gt;Workstation&lt;/span&gt;      &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;.NET&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="err"&gt;3.1.11&lt;/span&gt; &lt;span class="err"&gt;(CoreCLR&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56602,&lt;/span&gt; &lt;span class="err"&gt;CoreFX&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56604),&lt;/span&gt; &lt;span class="err"&gt;X64&lt;/span&gt; &lt;span class="err"&gt;RyuJIT&lt;/span&gt;
  &lt;span class="err"&gt;WorkstationForce&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="err"&gt;.NET&lt;/span&gt; &lt;span class="err"&gt;Core&lt;/span&gt; &lt;span class="err"&gt;3.1.11&lt;/span&gt; &lt;span class="err"&gt;(CoreCLR&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56602,&lt;/span&gt; &lt;span class="err"&gt;CoreFX&lt;/span&gt; &lt;span class="err"&gt;4.700.20.56604),&lt;/span&gt; &lt;span class="err"&gt;X64&lt;/span&gt; &lt;span class="err"&gt;RyuJIT&lt;/span&gt;

&lt;span class="py"&gt;IterationCount&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;15  LaunchCount=2  WarmupCount=10  &lt;/span&gt;

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

&lt;/div&gt;


&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Force&lt;/th&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;Mean&lt;/th&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;StdDev&lt;/th&gt;
&lt;th&gt;Median&lt;/th&gt;
&lt;th&gt;Gen 0&lt;/th&gt;
&lt;th&gt;Gen 1&lt;/th&gt;
&lt;th&gt;Gen 2&lt;/th&gt;
&lt;th&gt;Allocated&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WithoutHttpCompletionOption&lt;/td&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;426.4 ms&lt;/td&gt;
&lt;td&gt;73.53 ms&lt;/td&gt;
&lt;td&gt;100.64 ms&lt;/td&gt;
&lt;td&gt;409.1 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;389120 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithHttpCompletionOption&lt;/td&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;360.1 ms&lt;/td&gt;
&lt;td&gt;53.91 ms&lt;/td&gt;
&lt;td&gt;77.31 ms&lt;/td&gt;
&lt;td&gt;331.1 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;152472 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithGetStreamAsync&lt;/td&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;328.8 ms&lt;/td&gt;
&lt;td&gt;12.37 ms&lt;/td&gt;
&lt;td&gt;17.74 ms&lt;/td&gt;
&lt;td&gt;323.7 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;149624 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithoutHttpCompletionOption&lt;/td&gt;
&lt;td&gt;ServerForce&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;421.0 ms&lt;/td&gt;
&lt;td&gt;71.88 ms&lt;/td&gt;
&lt;td&gt;103.09 ms&lt;/td&gt;
&lt;td&gt;426.8 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;406960 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithHttpCompletionOption&lt;/td&gt;
&lt;td&gt;ServerForce&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;515.3 ms&lt;/td&gt;
&lt;td&gt;71.17 ms&lt;/td&gt;
&lt;td&gt;104.32 ms&lt;/td&gt;
&lt;td&gt;520.8 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;149936 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithGetStreamAsync&lt;/td&gt;
&lt;td&gt;ServerForce&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;525.4 ms&lt;/td&gt;
&lt;td&gt;142.11 ms&lt;/td&gt;
&lt;td&gt;203.81 ms&lt;/td&gt;
&lt;td&gt;515.6 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;150136 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithoutHttpCompletionOption&lt;/td&gt;
&lt;td&gt;Workstation&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;NA&lt;/td&gt;
&lt;td&gt;NA&lt;/td&gt;
&lt;td&gt;NA&lt;/td&gt;
&lt;td&gt;NA&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithHttpCompletionOption&lt;/td&gt;
&lt;td&gt;Workstation&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;523.6 ms&lt;/td&gt;
&lt;td&gt;94.41 ms&lt;/td&gt;
&lt;td&gt;138.38 ms&lt;/td&gt;
&lt;td&gt;515.3 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;149520 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithGetStreamAsync&lt;/td&gt;
&lt;td&gt;Workstation&lt;/td&gt;
&lt;td&gt;True&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;582.9 ms&lt;/td&gt;
&lt;td&gt;288.63 ms&lt;/td&gt;
&lt;td&gt;404.62 ms&lt;/td&gt;
&lt;td&gt;354.0 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;150072 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithoutHttpCompletionOption&lt;/td&gt;
&lt;td&gt;WorkstationForce&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;523.4 ms&lt;/td&gt;
&lt;td&gt;44.34 ms&lt;/td&gt;
&lt;td&gt;62.16 ms&lt;/td&gt;
&lt;td&gt;527.0 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;389112 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithHttpCompletionOption&lt;/td&gt;
&lt;td&gt;WorkstationForce&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;523.0 ms&lt;/td&gt;
&lt;td&gt;11.63 ms&lt;/td&gt;
&lt;td&gt;16.68 ms&lt;/td&gt;
&lt;td&gt;518.3 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;150680 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WithGetStreamAsync&lt;/td&gt;
&lt;td&gt;WorkstationForce&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;427.7 ms&lt;/td&gt;
&lt;td&gt;78.15 ms&lt;/td&gt;
&lt;td&gt;104.33 ms&lt;/td&gt;
&lt;td&gt;497.9 ms&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;151472 B&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;div class="ltag__user ltag__user__id__426430"&gt;
    &lt;a href="/juscelior" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&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%2Fuser%2Fprofile_image%2F426430%2Fab8d100e-70ca-42c4-a5f8-52fc203e22bf.jpg" alt="juscelior image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/juscelior"&gt;Pode me chamar de Juscélio Reis&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/juscelior"&gt; Professional in constant learning, software developer with almost 10 years of career, researcher on distributed systems and information security. Strong experience in software development with C #&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>wiz</category>
      <category>devz</category>
    </item>
    <item>
      <title>[Série] Governança de API: Contrato da API</title>
      <dc:creator>Pode me chamar de Juscélio Reis</dc:creator>
      <pubDate>Wed, 05 Aug 2020 19:35:57 +0000</pubDate>
      <link>https://forem.com/devzwiz/serie-governanca-de-api-contrato-da-api-2dd0</link>
      <guid>https://forem.com/devzwiz/serie-governanca-de-api-contrato-da-api-2dd0</guid>
      <description>&lt;h3&gt;
  
  
  Recapitulando:
&lt;/h3&gt;

&lt;p&gt;A área de governança precisa cruzar o anseio e desejos dos outros setores da empresa, com o objetivo de construir uma ponte entre o momento atual da empresa com o que pode acabar sendo uma futura estratégia de governança de API. &lt;/p&gt;

&lt;p&gt;É clichê, mas resumindo fica assim: a área de governança busca alinhar a estratégia com a execução.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;😒: Todo novo framework da moda tem essa frase. Como é possível esse alinhamento com a governança?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O monitoramento do desempenho &lt;strong&gt;passado&lt;/strong&gt; é útil na avaliação de opções no momento &lt;strong&gt;presente&lt;/strong&gt;, para determinar metas, políticas e ações &lt;strong&gt;futuras&lt;/strong&gt; (direção). 😎&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Aqueles que não conhecem a história estão fadados a repeti-la.&lt;br&gt;
-- Edmund Burke&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Como vai conseguir monitorar o passado se não sabe o que monitorar? No catalogo de API precisa existir no mínimo 4 informações, sendo elas o recurso, a estrutura, a capacidade e a sensibilidade. Logo ter um catalogo de API é o primeiro passo para o sucesso!&lt;/p&gt;

&lt;p&gt;Para recapitular pode ir direto na fonte:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/devzwiz" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&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%2Forganization%2Fprofile_image%2F2646%2F4054ca95-31a5-4499-87e5-9d01726c16c2.png" alt="DEVz Wiz"&gt;
      &lt;div class="ltag__link__user__pic"&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%2Fuser%2Fprofile_image%2F426430%2Fab8d100e-70ca-42c4-a5f8-52fc203e22bf.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/devzwiz/serie-governanca-de-api-ab2" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;[Série] Governança de API&lt;/h2&gt;
      &lt;h3&gt;Pode me chamar de Juscélio Reis for DEVz Wiz ・ Jul 21 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#api&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#governance&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#development&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#devops&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
 &lt;br&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/devzwiz" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&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%2Forganization%2Fprofile_image%2F2646%2F4054ca95-31a5-4499-87e5-9d01726c16c2.png" alt="DEVz Wiz"&gt;
      &lt;div class="ltag__link__user__pic"&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%2Fuser%2Fprofile_image%2F426430%2Fab8d100e-70ca-42c4-a5f8-52fc203e22bf.jpg" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/devzwiz/serie-governanca-de-api-centralizacao-2ebm" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt; [Série] Governança de API: Centralização&lt;/h2&gt;
      &lt;h3&gt;Pode me chamar de Juscélio Reis for DEVz Wiz ・ Jul 28 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#api&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#governance&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#development&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#devops&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
 
&lt;h3&gt;
  
  
  O contrato da API: o primeiro e mais importante passo
&lt;/h3&gt;

&lt;p&gt;Sem duvidas aqui é o ponto mais importante e mais complicado de ser feito, mas quando bem feito só temos ganhos. Para entender mais o motivo de começar com o contrato leia esse artigo:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/juscelior" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F426430%2Fab8d100e-70ca-42c4-a5f8-52fc203e22bf.jpg" alt="juscelior"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/juscelior/por-que-devemos-comecar-nossas-apis-pelo-contrato-4i4h" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Por que devemos começar nossas APIs pelo contrato?&lt;/h2&gt;
      &lt;h3&gt;Pode me chamar de Juscélio Reis ・ Jul 13 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#apidevelopment&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#openapi&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#apigovernance&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
 

&lt;p&gt;Em um programa de desenvolvimento de API a primeira etapa é justamente a construção de um contrato. Com um contrato bem feito conseguimos automatizar rotinas, melhorar a experiência do desenvolvedor, permitir a independência dos times, acelerar a entrega das APIs para o mercado, melhora o entendimento das suas APIs, facilitar a rotina de testes 👻, gerar SDKs tanto para o cliente quanto para o servidor (ação automatizada é claro), possibilidade de ativar e desativar suas APIs e como não podia deixar de ser, monitorar o passado!&lt;/p&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%2Fi%2F9jpv8ljlgvfz4ld4pmot.jpg" 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%2Fi%2F9jpv8ljlgvfz4ld4pmot.jpg" alt="Ciclo de vida da API"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;😒: o mundo real não é assim, ninguém para para criar contratos. O que o gestor quer é código em produção. Contrato, só se for contrato com um cliente pagante.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;É uma visão bem comum, se você for direto para a criação de sua API, não haverá retorno ao design. É como construir uma casa e depois procurar um arquiteto para elaborar planos. Isso não faz nenhum sentido. 😎&lt;/p&gt;

&lt;p&gt;No entanto, as equipes de software frequentemente fazem escolhas semelhantes. Eles podem gerar uma especificação de API a partir do código, o que parece eficiente. Infelizmente, quando você criou uma API no código, perdeu muitas das vantagens da abordagem do design primeiro. Quando o design da sua API existe antes da implementação, você pode obter feedback antecipado, conectar sua API às ferramentas desde o início e colaborar entre departamentos e funções. 😎&lt;/p&gt;

&lt;p&gt;Colocar ordem no caos é uma tarefa árdua, ou exigir que desenvolvedores sigam um método que não seja o &lt;a href="https://gohorseprocess.com.br/extreme-go-horse-xgh/" rel="noopener noreferrer"&gt;eXtreme Go Horse (XGH)&lt;/a&gt;. Mas é necessário dar o primeiro passo. Assim também é implantar um programa de API, tenha em mente qual resultado deseja obter, e não foque no tamanho do percurso.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Suba o primeiro degrau com fé. Não é necessário que você veja toda a escada. Apenas dê o primeiro passo.&lt;br&gt;
-- Martin Luther King&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Você sabe quem usará sua API? Mesmo para um projeto interno, é provável que você tenha vários consumidores. Uma especificação de API permite que você compartilhe detalhes sobre como a API funcionará. Você pode enviar o documento de especificação em si ou usar ferramentas para criar um protótipo de sua API ou documentação. Você pode gerar servidores simulados com base em suas especificações, conforme descrito em outra seção, e fazer com que seus consumidores façam chamadas ao vivo.&lt;/p&gt;

&lt;p&gt;Sua colaboração também pode ir além das equipes técnicas. Você pode obter ótimas informações sobre produtos, marketing, parcerias e &lt;strong&gt;muitas outras áreas da sua organização&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🙋‍♂️: Eu ouvi um amém irmãos?! 🙌🙌&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O software raramente é construído inteiramente por desenvolvedores. Existem partes interessadas em toda a organização. E embora muitos desenvolvedores possam ter muita atenção ao produto, eles nem sempre têm a visibilidade da imagem completa. Se sua organização possui um grupo de produtos, é nesse ponto que a voz do cliente é mais ouvida. &lt;strong&gt;Envolva qualquer pessoa que entenda como uma API será usada nas discussões ao criar a API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Quando você entender como o software será usado, poderá projetá-lo melhor. O maior erro no design da API é tomar decisões com base em como o sistema funciona, e não no que os consumidores precisam oferecer suporte. Para projetar casos de uso, você precisa conversar com os consumidores ou, pelo menos, incluir aqueles que os conhecem melhor.&lt;/p&gt;

&lt;p&gt;Uma sugestão de ferramenta que faz muito bem esse papel e para melhorar seu dia é gratuita &lt;a href="https://github.com/stoplightio/studio" rel="noopener noreferrer"&gt;Stoplight Studio&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/stoplightio" rel="noopener noreferrer"&gt;
        stoplightio
      &lt;/a&gt; / &lt;a href="https://github.com/stoplightio/studio" rel="noopener noreferrer"&gt;
        studio
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The modern editor for API Design and Technical Writing.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Stoplight Studio&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Studio is Stoplight's next generation application for API design, modeling, and technical writing. A primary goal of Studio is to enrich, not replace, your existing workflows. When running locally it works fully offline, with folders and files on your computer just like your favorite IDE. When running in the browser, the web-native Git support allows you to effortlessly work with your existing repositories safely and efficiently.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Documentation&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;To learn more about Studio and the Stoplight platform, see our &lt;a href="https://meta.stoplight.io/" rel="nofollow noopener noreferrer"&gt;Platform Documentation&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Full Support for OpenAPI v2 and v3&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Studio comes with full support for the OpenAPI versions 2 and 3 specification formats for all functionality. That means full validation, mocking, and modeling support for both versions of the OpenAPI specification.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/stoplightio/studioassets/images/openapi_swagger_equal_heart.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fstoplightio%2Fstudioassets%2Fimages%2Fopenapi_swagger_equal_heart.png" alt="Studio loves Swagger + OpenAPI"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Graphical API Design&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Form-based designing means you don't need to be an OpenAPI expert to get started. Studio has a "write" (code) mode with full OpenAPI autocomplete…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/stoplightio/studio" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
 

&lt;p&gt;Para gerar um mock desse contrato criado pelo &lt;a href="https://github.com/stoplightio/studio" rel="noopener noreferrer"&gt;Stoplight Studio&lt;/a&gt; é possível usar &lt;a href="https://github.com/stoplightio/prism" rel="noopener noreferrer"&gt;Prism&lt;/a&gt; na linha de comando e entregar esse mock para o dev front-end.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/stoplightio" rel="noopener noreferrer"&gt;
        stoplightio
      &lt;/a&gt; / &lt;a href="https://github.com/stoplightio/prism" rel="noopener noreferrer"&gt;
        prism
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Turn any OpenAPI2/3 and Postman Collection file into an API server with mocking, transformations and validations.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://stoplight.io/api-mocking?utm_source=github.com&amp;amp;utm_medium=referral&amp;amp;utm_campaign=github_repo_prism" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fstoplightio%2Fprismexamples%2Freadme-header.svg" alt="Prism - API Mock Servers and Contract Testing"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://circleci.com/gh/stoplightio/prism" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b767c4d4c11f90bbb796b42d70d0e021526aff1ad78b88ab45a1ab1b5fe61053/68747470733a2f2f696d672e736869656c64732e696f2f636972636c6563692f6275696c642f6769746875622f73746f706c69676874696f2f707269736d2f6d6173746572" alt="CircleCI"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@stoplight/prism-cli" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a9168759e6636aa1f0530a720fa61e9e03ef232c16ca7b7b5b93ef285488e294/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f4073746f706c696768742f707269736d2d687474703f636f6c6f723d626c7565" alt="NPM Downloads"&gt;&lt;/a&gt;
&lt;a href="https://ecologi.com/stoplightinc" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e299fd92f5edda540adc59dfd62382f48d2bfb8798e7f7be5849ef8404e94ac8/68747470733a2f2f696d672e736869656c64732e696f2f65636f6c6f67692f74726565732f73746f706c69676874696e63" alt="Stoplight Forest"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Prism Overview&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Prism is a set of packages for API mocking and contract testing with &lt;strong&gt;OpenAPI v2&lt;/strong&gt; (formerly known as Swagger) and &lt;strong&gt;OpenAPI v3.x&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Prism provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mock Servers&lt;/strong&gt;: Life-like mock servers from any API specification document.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation Proxy&lt;/strong&gt;: Contract Testing for API consumers and developers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive API Specification Support&lt;/strong&gt;: OpenAPI v3.1, OpenAPI v3.0, OpenAPI v2.0 (formerly Swagger) and Postman Collections.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Ways to Use Prism&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Hosted Prism&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;Stoplight provides hosted mock servers for convenience so that API consumers can experiment with an API without the need for backend code.&lt;/p&gt;
&lt;p&gt;Use one of these options for instant, hosted mock servers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://stoplight.io/?utm_source=github.com&amp;amp;utm_medium=referral&amp;amp;utm_campaign=github_repo_prism" rel="nofollow noopener noreferrer"&gt;Stoplight Platform&lt;/a&gt;: Collaborative API Design Platform for designing, developing and documenting APIs with hosted mocking powered by Prism.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://stoplight.io/studio/?utm_source=github.com&amp;amp;utm_medium=referral&amp;amp;utm_campaign=github_repo_prism" rel="nofollow noopener noreferrer"&gt;Stoplight Studio&lt;/a&gt;: Free visual OpenAPI designer that comes integrated with mocking powered by Prism.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Learn more in the &lt;a href="https://docs.stoplight.io/docs/platform/336b74db38c50-work-with-mock-servers" rel="nofollow noopener noreferrer"&gt;hosted Prism documentation&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Self-hosted Prism&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Prism is an open-source…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/stoplightio/prism" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;🧙: Já temos o contrato e o mock da API, que tal criar um código de API para rodar no servidor usando 1 linha de comando? Te apresento meu amigo, &lt;a href="https://openapi-generator.tech/" rel="noopener noreferrer"&gt;Openapi Generator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;😒: Da onde ele veio?&lt;/p&gt;

&lt;p&gt;🧙: Do &lt;a href="https://github.com/openapitools/openapi-generator" rel="noopener noreferrer"&gt;github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;😒: O que ele faz?&lt;/p&gt;

&lt;p&gt;🧙: Gera SDK, código do desenvolvedor e documenta tudo. O melhor amigo do Dev SAGAZ.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&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%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/OpenAPITools" rel="noopener noreferrer"&gt;
        OpenAPITools
      &lt;/a&gt; / &lt;a href="https://github.com/OpenAPITools/openapi-generator" rel="noopener noreferrer"&gt;
        openapi-generator
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      OpenAPI Generator allows generation of API client libraries (SDK generation), server stubs, documentation and configuration automatically given an OpenAPI Spec (v2, v3)
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;OpenAPI Generator&lt;/h1&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href="http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.openapitools%22%20AND%20a%3A%22openapi-generator%22" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/880e2dac7ff1b6687978ab40f2689456241a924ee6e28236607b21d2c8f729d3/68747470733a2f2f696d672e736869656c64732e696f2f6d6176656e2d6d657461646174612f762f68747470732f7265706f312e6d6176656e2e6f72672f6d6176656e322f6f72672f6f70656e617069746f6f6c732f6f70656e6170692d67656e657261746f722f6d6176656e2d6d657461646174612e786d6c2e737667" alt="Stable releases in Maven Central"&gt;&lt;/a&gt;
&lt;a href="https://github.com/OpenAPITools/openapi-generator./LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f4f128b18025b723ece3173ca70af4d5ae9346469b2237eeaebbb30bb4963cf7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d417061636865253230322e302d6f72616e6765" alt="Apache 2.0 License"&gt;&lt;/a&gt;
&lt;a href="https://opencollective.com/openapi_generator" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7ef64ef537ef5a47a026972fc955aa83b8c8abb2ffdc627f0de12372de7ea135/68747470733a2f2f696d672e736869656c64732e696f2f6f70656e636f6c6c6563746976652f6261636b6572732f6f70656e6170695f67656e657261746f723f636f6c6f723d6f72616e6765266c6162656c3d4f70656e436f6c6c6563746976652532304261636b657273" alt="Open Collective backers"&gt;&lt;/a&gt;
&lt;a href="https://join.slack.com/t/openapi-generator/shared_invite/zt-12jxxd7p2-XUeQM~4pzsU9x~eGLQqX2g" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/adb2f0048984e2980c6d841e13de72c02fb1d68335997773f4c71c0b22584062/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f536c61636b2d4a6f696e25323074686525323063686174253230726f6f6d2d6f72616e6765" alt="Join the Slack chat room"&gt;&lt;/a&gt;
&lt;a href="https://twitter.com/oas_generator" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0bd5d3834c55e86fbd7dacdd03f093bbe59792536c59e61a302ac7aaf630fef1/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f666f6c6c6f772f6f61735f67656e657261746f722e7376673f7374796c653d736f6369616c266c6162656c3d466f6c6c6f77" alt="Follow OpenAPI Generator Twitter account to get the latest update"&gt;&lt;/a&gt;
&lt;a href="https://gitpod.io/#https://github.com/OpenAPITools/openapi-generator" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0d7732e52b61dbd3b8c3e8957089071d3806b2094e698ac3d7505dc628ac69b7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6e74726962757465253230776974682d476974706f642d3930386138353f6c6f676f3d676974706f64" alt="Contribute with Gitpod"&gt;&lt;/a&gt;
&lt;a href="https://conan.io/center/recipes/openapi-generator" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/46cc5e0e6f32a3cb9af8a592306d56ab9027f92166e3148a687beb7cb3d2ad7c/68747470733a2f2f736869656c64732e696f2f636f6e616e2f762f6f70656e6170692d67656e657261746f72" alt="Conan Center"&gt;&lt;/a&gt;
&lt;a href="https://ge.openapi-generator.tech/scans" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/966556624b480f57f0a5fe332b1d0089a2abe01d42af03c46af08f73f9244801/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f526576766564253230757025323062792d446576656c6f636974792d3036413043453f6c6f676f3d477261646c65266c6162656c436f6c6f723d303233303341" alt="Revved up by Develocity"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href="https://github.com/OpenAPITools/openapi-generator/tree/master" rel="noopener noreferrer"&gt;Master&lt;/a&gt; (&lt;code&gt;7.10.0&lt;/code&gt;)
&lt;a href="https://app.travis-ci.com/github/OpenAPITools/openapi-generator/builds" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8963897ee7cfae7e2e3ca4014b3a4cacfccf1c1c0309259a9276505a26466acf/68747470733a2f2f6170692e7472617669732d63692e636f6d2f4f70656e415049546f6f6c732f6f70656e6170692d67656e657261746f722e7376673f6272616e63683d6d6173746572267374617475733d706173736564" alt="Build Status"&gt;&lt;/a&gt;
&lt;a href="https://circleci.com/gh/OpenAPITools/openapi-generator" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6e6213e1280db92c4e55d97d69b0e54d1576baeebc1459ad4cf617f5fe194535/68747470733a2f2f636972636c6563692e636f6d2f67682f4f70656e415049546f6f6c732f6f70656e6170692d67656e657261746f722e7376673f7374796c653d736869656c64" alt="Integration Test2"&gt;&lt;/a&gt;
&lt;a href="https://ci.appveyor.com/project/WilliamCheng/openapi-generator" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a404d4dbc45c8c1c9b5ab6e87e069572936c9edcafd6e0e24ce21d160d35a0ee/68747470733a2f2f63692e6170707665796f722e636f6d2f6170692f70726f6a656374732f7374617475732f6769746875622f6f70656e617069746f6f6c732f6f70656e6170692d67656e657261746f723f6272616e63683d6d6173746572267376673d747275652670617373696e67546578743d57696e646f7773253230546573742532302d2532304f4b266661696c696e67546578743d57696e646f7773253230546573742532302d2532304661696c73" alt="Windows Test"&gt;&lt;/a&gt;
&lt;a href="https://app.bitrise.io/app/4a2b10a819d12b67" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a81b7a4ff8f1232a33b3a6a5afd6c43645160adfde5f743929a8c5241b977580/68747470733a2f2f696d672e736869656c64732e696f2f626974726973652f346132623130613831396431326236372f6d61737465723f6c6162656c3d6269747269736525334125323053776966742b342c3526746f6b656e3d383539464d4452385148776162437a77765a4b367651" alt="Bitrise"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;⭐⭐⭐ If you would like to contribute, please refer to &lt;a href="https://github.com/OpenAPITools/openapi-generatorCONTRIBUTING.md" rel="noopener noreferrer"&gt;guidelines&lt;/a&gt; and a list of &lt;a href="https://github.com/openapitools/openapi-generator/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22" rel="noopener noreferrer"&gt;open tasks&lt;/a&gt;. ⭐⭐⭐&lt;/p&gt;
&lt;p&gt;‼️ To migrate from Swagger Codegen to OpenAPI Generator, please refer to the &lt;a href="https://github.com/OpenAPITools/openapi-generatordocs/migration-from-swagger-codegen.md" rel="noopener noreferrer"&gt;migration guide&lt;/a&gt; ‼️&lt;/p&gt;
&lt;p&gt;📔 For more information, please refer to the &lt;a href="https://github.com/openapitools/openapi-generator/wiki" rel="noopener noreferrer"&gt;Wiki page&lt;/a&gt; and &lt;a href="https://github.com/openapitools/openapi-generator/wiki/FAQ" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt; 📔&lt;/p&gt;
&lt;p&gt;📔 The eBook &lt;a href="https://gum.co/openapi_generator_ebook" rel="nofollow noopener noreferrer"&gt;A Beginner's Guide to Code Generation for REST APIs&lt;/a&gt; is a good starting point for beginners 📔&lt;/p&gt;
&lt;p&gt;⚠️ If the OpenAPI spec, templates or any input (e.g. options, environment variables) is obtained from an untrusted source or environment, please make sure you've reviewed these inputs before using OpenAPI Generator to generate the API client, server stub or documentation to avoid potential security issues (e.g. &lt;a href="https://en.wikipedia.org/wiki/Code_injection" rel="nofollow noopener noreferrer"&gt;code injection&lt;/a&gt;). For security vulnerabilities, please contact &lt;a href="https://github.com/OpenAPITools/openapi-generatormailto:team@openapitools.org" rel="noopener noreferrer"&gt;team@openapitools.org&lt;/a&gt;. ⚠️&lt;/p&gt;
&lt;p&gt;‼️ Both "OpenAPI Tools" (&lt;a href="https://OpenAPITools.org" rel="nofollow noopener noreferrer"&gt;https://OpenAPITools.org&lt;/a&gt; - the parent organization of OpenAPI Generator) and "OpenAPI Generator" are not…&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/OpenAPITools/openapi-generator" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h5&gt;
  
  
  CLIENT generators
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;ada&lt;/li&gt;
&lt;li&gt;android&lt;/li&gt;
&lt;li&gt;apex&lt;/li&gt;
&lt;li&gt;bash&lt;/li&gt;
&lt;li&gt;c&lt;/li&gt;
&lt;li&gt;clojure&lt;/li&gt;
&lt;li&gt;cpp-qt5-client&lt;/li&gt;
&lt;li&gt;cpp-restsdk&lt;/li&gt;
&lt;li&gt;cpp-tizen&lt;/li&gt;
&lt;li&gt;cpp-ue4 (beta)&lt;/li&gt;
&lt;li&gt;csharp&lt;/li&gt;
&lt;li&gt;csharp-dotnet2 (deprecated)&lt;/li&gt;
&lt;li&gt;csharp-netcore&lt;/li&gt;
&lt;li&gt;dart&lt;/li&gt;
&lt;li&gt;dart-dio&lt;/li&gt;
&lt;li&gt;dart-jaguar&lt;/li&gt;
&lt;li&gt;eiffel&lt;/li&gt;
&lt;li&gt;elixir&lt;/li&gt;
&lt;li&gt;elm&lt;/li&gt;
&lt;li&gt;erlang-client&lt;/li&gt;
&lt;li&gt;erlang-proper&lt;/li&gt;
&lt;li&gt;flash&lt;/li&gt;
&lt;li&gt;go&lt;/li&gt;
&lt;li&gt;go-experimental (experimental)&lt;/li&gt;
&lt;li&gt;groovy&lt;/li&gt;
&lt;li&gt;haskell-http-client&lt;/li&gt;
&lt;li&gt;java&lt;/li&gt;
&lt;li&gt;javascript&lt;/li&gt;
&lt;li&gt;javascript-apollo (beta)&lt;/li&gt;
&lt;li&gt;javascript-closure-angular&lt;/li&gt;
&lt;li&gt;javascript-flowtyped&lt;/li&gt;
&lt;li&gt;jaxrs-cxf-client&lt;/li&gt;
&lt;li&gt;jmeter&lt;/li&gt;
&lt;li&gt;k6 (beta)&lt;/li&gt;
&lt;li&gt;kotlin&lt;/li&gt;
&lt;li&gt;lua (beta)&lt;/li&gt;
&lt;li&gt;nim (beta)&lt;/li&gt;
&lt;li&gt;objc&lt;/li&gt;
&lt;li&gt;ocaml&lt;/li&gt;
&lt;li&gt;perl&lt;/li&gt;
&lt;li&gt;php&lt;/li&gt;
&lt;li&gt;powershell (beta)&lt;/li&gt;
&lt;li&gt;python&lt;/li&gt;
&lt;li&gt;python-experimental (experimental)&lt;/li&gt;
&lt;li&gt;r&lt;/li&gt;
&lt;li&gt;ruby&lt;/li&gt;
&lt;li&gt;rust&lt;/li&gt;
&lt;li&gt;scala-akka&lt;/li&gt;
&lt;li&gt;scala-gatling&lt;/li&gt;
&lt;li&gt;scala-httpclient-deprecated (deprecated)&lt;/li&gt;
&lt;li&gt;scala-sttp (beta)&lt;/li&gt;
&lt;li&gt;scalaz&lt;/li&gt;
&lt;li&gt;swift4-deprecated (deprecated)&lt;/li&gt;
&lt;li&gt;swift5 (beta)&lt;/li&gt;
&lt;li&gt;typescript (experimental)&lt;/li&gt;
&lt;li&gt;typescript-angular&lt;/li&gt;
&lt;li&gt;typescript-angularjs-deprecated (deprecated)&lt;/li&gt;
&lt;li&gt;typescript-aurelia&lt;/li&gt;
&lt;li&gt;typescript-axios&lt;/li&gt;
&lt;li&gt;typescript-fetch&lt;/li&gt;
&lt;li&gt;typescript-inversify&lt;/li&gt;
&lt;li&gt;typescript-jquery&lt;/li&gt;
&lt;li&gt;typescript-node&lt;/li&gt;
&lt;li&gt;typescript-redux-query&lt;/li&gt;
&lt;li&gt;typescript-rxjs &lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  SERVER generators
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;ada-server&lt;/li&gt;
&lt;li&gt;aspnetcore&lt;/li&gt;
&lt;li&gt;cpp-pistache-server&lt;/li&gt;
&lt;li&gt;cpp-qt5-qhttpengine-server&lt;/li&gt;
&lt;li&gt;cpp-restbed-server&lt;/li&gt;
&lt;li&gt;csharp-nancyfx&lt;/li&gt;
&lt;li&gt;erlang-server&lt;/li&gt;
&lt;li&gt;fsharp-functions (beta)&lt;/li&gt;
&lt;li&gt;fsharp-giraffe-server (beta)&lt;/li&gt;
&lt;li&gt;go-gin-server&lt;/li&gt;
&lt;li&gt;go-server&lt;/li&gt;
&lt;li&gt;graphql-nodejs-express-server&lt;/li&gt;
&lt;li&gt;haskell&lt;/li&gt;
&lt;li&gt;java-inflector&lt;/li&gt;
&lt;li&gt;java-msf4j&lt;/li&gt;
&lt;li&gt;java-pkmst&lt;/li&gt;
&lt;li&gt;java-play-framework&lt;/li&gt;
&lt;li&gt;java-undertow-server&lt;/li&gt;
&lt;li&gt;java-vertx&lt;/li&gt;
&lt;li&gt;java-vertx-web (beta)&lt;/li&gt;
&lt;li&gt;jaxrs-cxf&lt;/li&gt;
&lt;li&gt;jaxrs-cxf-cdi&lt;/li&gt;
&lt;li&gt;jaxrs-cxf-extended&lt;/li&gt;
&lt;li&gt;jaxrs-jersey&lt;/li&gt;
&lt;li&gt;jaxrs-resteasy&lt;/li&gt;
&lt;li&gt;jaxrs-resteasy-eap&lt;/li&gt;
&lt;li&gt;jaxrs-spec&lt;/li&gt;
&lt;li&gt;kotlin-server&lt;/li&gt;
&lt;li&gt;kotlin-spring&lt;/li&gt;
&lt;li&gt;kotlin-vertx (beta)&lt;/li&gt;
&lt;li&gt;nodejs-express-server (beta)&lt;/li&gt;
&lt;li&gt;php-laravel&lt;/li&gt;
&lt;li&gt;php-lumen&lt;/li&gt;
&lt;li&gt;php-silex-deprecated (deprecated)&lt;/li&gt;
&lt;li&gt;php-slim-deprecated (deprecated)&lt;/li&gt;
&lt;li&gt;php-slim4&lt;/li&gt;
&lt;li&gt;php-symfony&lt;/li&gt;
&lt;li&gt;php-ze-ph&lt;/li&gt;
&lt;li&gt;python-aiohttp&lt;/li&gt;
&lt;li&gt;python-blueplanet&lt;/li&gt;
&lt;li&gt;python-flask&lt;/li&gt;
&lt;li&gt;ruby-on-rails&lt;/li&gt;
&lt;li&gt;ruby-sinatra&lt;/li&gt;
&lt;li&gt;rust-server&lt;/li&gt;
&lt;li&gt;scala-akka-http-server (beta)&lt;/li&gt;
&lt;li&gt;scala-finch&lt;/li&gt;
&lt;li&gt;scala-lagom-server&lt;/li&gt;
&lt;li&gt;scala-play-server&lt;/li&gt;
&lt;li&gt;scalatra&lt;/li&gt;
&lt;li&gt;spring &lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  DOCUMENTATION generators
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;asciidoc&lt;/li&gt;
&lt;li&gt;cwiki&lt;/li&gt;
&lt;li&gt;dynamic-html&lt;/li&gt;
&lt;li&gt;html&lt;/li&gt;
&lt;li&gt;html2&lt;/li&gt;
&lt;li&gt;markdown (beta)&lt;/li&gt;
&lt;li&gt;openapi&lt;/li&gt;
&lt;li&gt;openapi-yaml&lt;/li&gt;
&lt;li&gt;plantuml (beta) &lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  SCHEMA generators
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;avro-schema (beta)&lt;/li&gt;
&lt;li&gt;mysql-schema &lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  CONFIG generators
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;apache2&lt;/li&gt;
&lt;li&gt;graphql-schema&lt;/li&gt;
&lt;li&gt;protobuf-schema (beta) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Que tal dar o primeiro passo? Se esta na duvida olha essa musica que fizeram para quem não quis arriscar:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/ZO7GhicZgrg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://dev.to/devzwiz/serie-governanca-de-api-ab2"&gt;Introduçao&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devzwiz/serie-governanca-de-api-centralizacao-2ebm/edit"&gt;Centralização&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Contrato da API&lt;/li&gt;
&lt;li&gt;Diretrizes de estilo&lt;/li&gt;
&lt;li&gt;Reutilização&lt;/li&gt;
&lt;li&gt;Automação&lt;/li&gt;
&lt;li&gt;Versionamento&lt;/li&gt;
&lt;li&gt;Política de descontinuação&lt;/li&gt;
&lt;li&gt;Rastreamento / Observabilidade&lt;/li&gt;
&lt;li&gt;Descoberta de API&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Referencial
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://polgovpro.blog/2020/07/27/adaptive-strategy/" rel="noopener noreferrer"&gt;Adaptive Strategy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://swagger.io/resources/articles/api-development-with-openapi-swagger/" rel="noopener noreferrer"&gt;Launching a Scalable API Program with OpenAPI: Optimize Your API Workflow with OpenAPI &amp;amp; Swagger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stoplight.io/api-design-guide/basics/" rel="noopener noreferrer"&gt;What is API Design?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gohorseprocess.com.br/extreme-go-horse-xgh/" rel="noopener noreferrer"&gt;eXtreme Go Horse (XGH)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;





&lt;div class="ltag__user ltag__user__id__426430"&gt;
    &lt;a href="/juscelior" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&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%2Fuser%2Fprofile_image%2F426430%2Fab8d100e-70ca-42c4-a5f8-52fc203e22bf.jpg" alt="juscelior image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/juscelior"&gt;Pode me chamar de Juscélio Reis&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/juscelior"&gt; Professional in constant learning, software developer with almost 10 years of career, researcher on distributed systems and information security. Strong experience in software development with C #&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>api</category>
      <category>governance</category>
      <category>development</category>
      <category>devops</category>
    </item>
    <item>
      <title> [Série] Governança de API: Centralização</title>
      <dc:creator>Pode me chamar de Juscélio Reis</dc:creator>
      <pubDate>Tue, 28 Jul 2020 02:19:30 +0000</pubDate>
      <link>https://forem.com/devzwiz/serie-governanca-de-api-centralizacao-2ebm</link>
      <guid>https://forem.com/devzwiz/serie-governanca-de-api-centralizacao-2ebm</guid>
      <description>&lt;p&gt;Dando continuidade a nossa serie sobre Governança de API, vamos falar de Centralização. Quando queremos organizar a bagunça sempre lembro dessa fala do &lt;em&gt;Deming&lt;/em&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Não se gerencia o que não se mede,&lt;br&gt;
não se mede o que não se define,&lt;br&gt;
não se define &lt;strong&gt;o que não se entende&lt;/strong&gt;,&lt;br&gt;
e não há sucesso no que não se gerencia&lt;br&gt;
-- William Edwards Deming&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Olhando atentamente essa fala, é possível inferir que para alcançar o sucesso é de extrema importância entender o contexto do problema e sua nuances. Não será diferente com o assunto desse artigo, afinal vivemos em um tempo complexo. A cada minuto que passa surge uma nova tecnologia, um novo serviço e uma nova forma de pensar, antigamente era mais simples, os sistemas eram todos construido para atender todas as necessidades, vulgo monolito, e todas as regras de negócios podiam ser extraídas de um único local. Atualmente estamos implementando microserviços, mesmo que não seja preciso &lt;a href="https://www.infoq.com/br/news/2020/06/monolith-decomposition-newman/"&gt;leia mais sobre aqui&lt;/a&gt;. A quantidade de API ou serviços no meio corporativo só tem aumentado. Imagina quando começar a ser tudo (&lt;em&gt;serverless&lt;/em&gt;)[&lt;a href="https://aws.amazon.com/pt/serverless/"&gt;https://aws.amazon.com/pt/serverless/&lt;/a&gt;] 🤪.&lt;/p&gt;

&lt;p&gt;Sem levantar as nuances de certos contextos bem específicos do seu sistema. A forma mais simples pra iniciar o processo de entendimento do seu ambiente é criar uma lista com todas as APIs internas e externas. Informando uma breve descrição sobre características chaves para que qualquer ser humano consiga entender qual a utilidade e quando precisa consumir sua API. Essa descrição deve conter pelo menos os campos abaixo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Recurso&lt;/strong&gt;: descreve o motivo dessa API ter sido projetada, e o que ela consegue entregar, usando uma linguagem que os seres humanos, leigos, possam digerir;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estrutura&lt;/strong&gt;: uma descrição esquemática das APIs, incluindo URIs, estruturas de dados, segurança, etc. Podemos citar como exemplo aqui o &lt;a href="https://www.openapis.org/"&gt;OpenAPI&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capacidade&lt;/strong&gt;: qual a quantidade de requisições que essa api deve suportar, quantas requisições seu cliente já consumiu;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sensibilidade&lt;/strong&gt;: a API consome ou expõe dados que possam estar sujeitos a restrições regulatórias ou de privacidade, como dados de cartão de pagamento, dados de identificação pessoal e assim por diante.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para tal inventario é dado o nome de &lt;em&gt;Catalogo de API&lt;/em&gt; (vou usar esse termo daqui pra frente) ou &lt;em&gt;Registro de API&lt;/em&gt;. Como exemplo de catalogo de API bem feito cito o &lt;a href="https://www.programmableweb.com/"&gt;ProgrammableWeb&lt;/a&gt; e o &lt;a href="https://rapidapi.com/"&gt;RapidAPI&lt;/a&gt; como exemplo a ser copiado.&lt;/p&gt;

&lt;p&gt;O catalogo de API também ajuda a equipe de governança a criar e aplicar políticas. Existem alguns modelos para a construção dessa equipe, todos com o intuito de chegar no estado da arte em Governança de API.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Centralizado&lt;/strong&gt;: Toda alteração arquitetural, desde a implementação de novos recursos até a aplicação ou introdução de novos elementos no cenário arquitetônico, sempre são revisadas e aprovadas por uma equipe centralizada. Esse modelo tem um grande problema de escalabilidade, já que isso pode fazer com que a equipe se torne um gargalo devido ao alto nível de demandas impostas a elas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Descentralizado&lt;/strong&gt;: Similar ao modelo anterior, mas formado por mais de uma equipe, menor, e essa possuindo autonomia para avaliar e validar certos aspectos da arquitetura, seja para um aplicativo específico ou para um conjunto de aplicativos relacionados. Agora o problema desse modelo é coordenar essas equipes, evitando que mudanças de uma equipe afete a outra equipe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distribuído&lt;/strong&gt;: Formado por equipes especialistas em um conjunto de produtos e, portanto, responsáveis ​​por eles. O conhecimento comercial e os aspectos de governança são cruciais para garantir que os controles corretos estejam em vigor.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Aqui eu indico o vídeo da Sensedia com o tema &lt;strong&gt;Repensando a Governança de APIs&lt;/strong&gt; &lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Pviw622zd0E"&gt;
&lt;/iframe&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tenha um certo cuidado ao escolher o melhor modelo para sua organização. Como foi falado no &lt;a href="https://dev.to/devzwiz/serie-governanca-de-api-ab2"&gt;post anterior&lt;/a&gt;, comece devagar e vai adaptando a sua realidade, reforçando as boas práticas e mudando o que não deu certo para o seu contexto.&lt;/p&gt;

&lt;p&gt;Tome cuidado para não confundir catalogo de API com o portal do desenvolvedor, sob a ótica da governança todas as APIs são importantes, se é interna ou externa, ela deve estar no inventario. E o acesso a esse inventario deve ser divulgado para toda a empresa, principalmente para a área de negócio. Eles podem visualizar o que já existem e definir uma estratégia para consumir essas APIs de acordo com suas necessidades.&lt;/p&gt;

&lt;p&gt;Mas um portal do desenvolvedor pode ser um produto, e como produto precisamos entender qual o seu publico alvo. Aqui é possível distinguir 3 tipos de publico alvo que uma organização geralmente possui:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Equipes internas&lt;/strong&gt;: O objetivo inicial é permitir que suas equipes internas criem novas funcionalidades e aplicativos sobre suas APIs. Ao pensar no catalogo de API para equipes internas é importante pensar como que essas equipes vão consumir suas APIs, a experiência do desenvolvedor aqui é muito importante para ganhar escala. &lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/rokam" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vGaSZYCg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--_0Lo68io--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/426431/6a724e76-cc55-4973-906b-3163ea60cd7a.jpeg" alt="rokam image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/devzwiz/the-wiz-way-to-build-technological-solutions-4b8b" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The Wiz way to build technological solutions&lt;/h2&gt;
      &lt;h3&gt;Lucas Mindêllo ・ Jul  7 '20 ・ 3 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#microservices&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#governance&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#agile&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#devops&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Parceiros e/ou Clientes&lt;/strong&gt;: Seus parceiros de negócios e clientes são as próximas partes interessadas que podem fornecer mais valor agregado a sua organização por meio de APIs. A API do seu parceiro pode integrar-se ao aplicativo de RH de um cliente para otimizar as informações dos funcionários ou fornecer um benefício diferenciado para o seu cliente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Desenvolvedores de terceiros&lt;/strong&gt;: A etapa final é disponibilizar suas APIs para o público em geral e monetizar com isso 🤑. Se ainda não parou para pensar em ganhar dinheiro. Gaste um tempo e o explore esses sites aqui &lt;a href="https://www.programmableweb.com/"&gt;ProgrammableWeb&lt;/a&gt; e o &lt;a href="https://rapidapi.com/"&gt;RapidAPI&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mantendo a inovação constante
&lt;/h3&gt;

&lt;p&gt;É possível manter um fluxo de inovação constante, e apoiar a estratégia da sua organização? Para chegar nesse nível de maturidade é fundamental oferecer sustentação para tipo de público alvo, e manter uma alta taxa de inovação nesses portais, talvez até uma equipe dedicada exclusivamente na entrega dessas inovações. &lt;/p&gt;

&lt;p&gt;Construir esses portais ajudam a entregar diferencial para os desenvolvedores que procuram APIs com o intuito de agregar valor no seu produto. A inovação e o diferencial desse produto aparece em como você pensa na forma que seu publico vai solicitar acesso, gerar suas chaves de API ou tokens OAuth. Como o desenvolvedor vai consumir sua API se será através de um contrato como Swagger ou usando um SDK feito por você.&lt;/p&gt;

&lt;p&gt;Não fique preso apenas no inventario para o catalogo de APIs. Pense em como será a experiência do desenvolvedor, como esse produto vai ajudar nas entregas do dia a dia desse desenvolvedor. Só uma sugestão, é possível disponibilizar SDKs para qualquer tipo de linguagem de programação, um canal de ajuda, suporte, informações dos logs de alterações, mudança de contrato ou quando essa API vai deixar de ser suportada pela organização.&lt;/p&gt;

&lt;p&gt;Agora que possui essas informações centralizadas é possível realizar uma analise do impacto de uma determina alteração, visualizar as dependências de cada API e conseguir enxergar a como estão sendo expostos os campos mais sensíveis. Existem ferramentas como o &lt;a href="https://stoplight.io/api-visibility/"&gt;Stoplight&lt;/a&gt;, que entrega de uma forma visual essas visualizações. Para conseguir extrair o máximo dessas ferramentas será preciso entender o conceito de &lt;strong&gt;Contrato da API&lt;/strong&gt;, e este é o assunto do próximo artigo dessa serie.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://dev.to/devzwiz/serie-governanca-de-api-ab2"&gt;Introduçao&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Centralização&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devzwiz/serie-governanca-de-api-contrato-da-api-2dd0"&gt;Contrato da API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Diretrizes de estilo&lt;/li&gt;
&lt;li&gt;Reutilização&lt;/li&gt;
&lt;li&gt;Automação&lt;/li&gt;
&lt;li&gt;Versionamento&lt;/li&gt;
&lt;li&gt;Política de descontinuação&lt;/li&gt;
&lt;li&gt;Rastreamento / Observabilidade&lt;/li&gt;
&lt;li&gt;Descoberta de API&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Referencial
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nordicapis.com/api-governance-how-important-is-it-for-api-strategy/"&gt;API Governance: How Important Is It for API Strategy?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://swagger.io/resources/articles/best-practices-in-api-governance/"&gt;Best Practices in API Governance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devzwiz/serie-governanca-de-api-ab2"&gt;[Série] Governança de API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nordicapis.com/ebooks/the-api-economy/"&gt;The API Economy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nordicapis.com/what-to-consider-when-building-your-api-strategy/"&gt;What to Consider When Building Your API Strategy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;





&lt;div class="ltag__user ltag__user__id__426430"&gt;
  
    .ltag__user__id__426430 .follow-action-button {
      background-color: #008000 !important;
      color: #dce9f3 !important;
      border-color: #008000 !important;
    }
  
    &lt;a href="/juscelior" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4xok3liq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--nZjGgy2R--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/426430/ab8d100e-70ca-42c4-a5f8-52fc203e22bf.jpg" alt="juscelior image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/juscelior"&gt;Pode me chamar de Juscélio Reis&lt;/a&gt;
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/juscelior"&gt; Professional in constant learning, software developer with almost 10 years of career, researcher on distributed systems and information security. Strong experience in software development with C #&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>api</category>
      <category>governance</category>
      <category>development</category>
      <category>devops</category>
    </item>
    <item>
      <title>[Série] Governança de API</title>
      <dc:creator>Pode me chamar de Juscélio Reis</dc:creator>
      <pubDate>Tue, 21 Jul 2020 01:30:42 +0000</pubDate>
      <link>https://forem.com/devzwiz/serie-governanca-de-api-ab2</link>
      <guid>https://forem.com/devzwiz/serie-governanca-de-api-ab2</guid>
      <description>&lt;p&gt;Nos últimos meses tenho notado um aumento substancial da utilização do termo API. Empresas estão cada dia mais criando e consumindo APIs e a procura por desenvolvedores que sabem construir APIs também tem crescido. Existem inúmeras maneiras de construir e fornecer uma API, para isso podemos citar grandes empresas que possuem soluções prontas e de alto custo visando entregar uma API no menor tempo possível, ou podemos construir do zero a um baixo custo nossas próprias soluções e entregar uma API gastando um tempo razoável.&lt;/p&gt;

&lt;p&gt;Mas a maioria dessas soluções não são capazes de entregar um recurso fundamental: Gerenciamento do Ciclo de vida do desenvolvimento. Um desenvolvedor passa algum tempo criando APIs úteis e robustas, mas acaba lutando com a evolução orgânica do seu código e com as mudanças que o meio negocial pode impor no desenvolvimento, como a famosa frase: precisamos dessa alteração para amanhã. Será se esse desenvolvedor é capaz de informa qual o verdadeiro impacto que uma simples mudança de parâmetro pode trazer para todos os clientes?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👾🎤 Isso não faz sentido, o que mais existe por ai são ferramentas de ALM, DevOps ou acompanhamento de projeto.&lt;br&gt;
-- Leitor ansioso&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para esses leitores, só posso responder que continuem lendo. E que o foco desse artigo é &lt;strong&gt;Governança de APIs&lt;/strong&gt;. E por ser um tema bem especifico, precisamos de ferramentas bem especificas. É diferente do que construir um software que vai rodar apenas no navegador ou no desktop. Deixa apresentar como é a construção de uma API sem o gerenciamento do ciclo de vida do desenvolvimento.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bjjo0zw4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/02yf0qxepz7zywx090sp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bjjo0zw4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/02yf0qxepz7zywx090sp.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para as empresas cuja a estratégia de negócio tem como objetivo entregar API para um mercado em potencial, a governança é uma necessidade. Não sabe do que estou falando sugiro que naveguem no site &lt;a href="https://www.programmableweb.com/"&gt;ProgrammableWeb&lt;/a&gt; ou procure pelos temas &lt;a href="https://www.infomoney.com.br/consumo/open-banking-o-que-e-e-como-funciona/"&gt;Open Banking&lt;/a&gt; ou &lt;a href="https://www.revistaapolice.com.br/2019/10/open-insurance-entenda-o-conceito-e-sua-aplicacao/"&gt;Open Insurance&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Atividades da governança de API
&lt;/h2&gt;

&lt;p&gt;Foi falado um monte sobre governança de API e gerenciamento do ciclo de vida do desenvolvimento focando na entra de API. Mas afinal o que seria isso, quais são as atividades que diferenciam de uma construção de software para &lt;em&gt;web&lt;/em&gt; ou &lt;em&gt;desktop&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Primeiro preciso fazer uma pergunta a você; você sabe onde estão todas as APIs da sua empresa? Nesse exato momento consegue informar quais clientes estão consumindo suas APIs?&lt;/p&gt;

&lt;p&gt;Nesse momento consigo definir a Governança de API como a disciplina que vai desenvolver um trabalho para entender onde as pessoas estão, ferramentas, serviços, habilidades, melhores e piores práticas. E cruzar com o anseio e desejos dos outros setores da empresa, com o objetivo de construir uma ponte entre o momento atual da empresa com o que pode acabar sendo uma futura estratégia de governança de API.&lt;/p&gt;

&lt;p&gt;De nada adianta implantar uma solução completa e robusta que já foi validada em outros times, se não trabalhar pessoas, ferramentas, processos e cultura dos envolvidos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A cultura come a estratégia no café da manhã&lt;br&gt;
-- Peter Drucker &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A governança é especialmente benéfica para organizações que possuem um trabalho de construção de API ou arquiteturas de microsserviços, entregando consistência dos seus serviços para toda a organização. Além de ajudar a evitar problemas como código duplicado, acoplamento rígido entre componentes, falta de confiabilidade e economia.&lt;/p&gt;

&lt;p&gt;Afinal o desejo de quem trabalha no time de governança é que as pessoas se importem com o design da API e estejam abertas a aprender como outras pessoas estão projetando suas APIs. E que os próprio time consiga defender o valor que um bom projeto pode agregar ao negocio em vez de simplesmente responder um ticket do JIRA. Pois o ticket não diz nada sobre a API ser bem projetada e consistente com outras equipes, a governança entre aqui.&lt;/p&gt;

&lt;p&gt;Esse foi apenas o primeiro artigo da serie sobre Governança de API. Para os próximos episódios vamos abordar os seguintes temas com a visão da governança.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Introdução&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devzwiz/serie-governanca-de-api-centralizacao-2ebm"&gt;Centralização&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devzwiz/serie-governanca-de-api-contrato-da-api-2dd0"&gt;Contrato da API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Diretrizes de estilo&lt;/li&gt;
&lt;li&gt;Reutilização&lt;/li&gt;
&lt;li&gt;Automação&lt;/li&gt;
&lt;li&gt;Versionamento&lt;/li&gt;
&lt;li&gt;Política de descontinuação&lt;/li&gt;
&lt;li&gt;Rastreamento / Observabilidade&lt;/li&gt;
&lt;li&gt;Descoberta de API&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Referencial
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nordicapis.com/ebooks/the-api-economy/"&gt;Basic API Design Guidelines Are Your First Step Towards API Governance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://swagger.io/resources/articles/best-practices-in-api-governance/"&gt;Best Practices in API Governance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apievangelist.com/2020/01/21/i-think-we-will-have-to-embrace-chaos-with-the-future-of-apis/"&gt;I Think We Will Have To Embrace Chaos With the Future of APIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@juscelioreis/por-que-devemos-come%C3%A7ar-nossas-apis-pelo-contrato-ee1de70af8b3"&gt;Por que devemos começar nossas APIs pelo contrato?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://swagger.io/resources/articles/adopting-an-api-first-approach/"&gt;Understanding  the API-First Approach to Building Products&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apievangelist.com/2018/02/06/you-have-to-know-where-all-your-apis-are-before-you-can-deliver-on-api/"&gt;You Have to Know Where All Your APIs Are Before You Can Deliver On API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;





&lt;div class="ltag__user ltag__user__id__426430"&gt;
  
    .ltag__user__id__426430 .follow-action-button {
      background-color: #008000 !important;
      color: #dce9f3 !important;
      border-color: #008000 !important;
    }
  
    &lt;a href="/juscelior" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4xok3liq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--nZjGgy2R--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/426430/ab8d100e-70ca-42c4-a5f8-52fc203e22bf.jpg" alt="juscelior image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/juscelior"&gt;Pode me chamar de Juscélio Reis&lt;/a&gt;
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/juscelior"&gt; Professional in constant learning, software developer with almost 10 years of career, researcher on distributed systems and information security. Strong experience in software development with C #&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>api</category>
      <category>governance</category>
      <category>development</category>
      <category>devops</category>
    </item>
    <item>
      <title>App Configuration: um mundo entre configurações de ambiente e feature flags</title>
      <dc:creator>Pode me chamar de Juscélio Reis</dc:creator>
      <pubDate>Thu, 23 Apr 2020 01:28:38 +0000</pubDate>
      <link>https://forem.com/juscelior/app-configuration-um-mundo-entre-configuracoes-de-ambiente-e-feature-flags-290j</link>
      <guid>https://forem.com/juscelior/app-configuration-um-mundo-entre-configuracoes-de-ambiente-e-feature-flags-290j</guid>
      <description>&lt;p&gt;Feature Flags, ou Feature toggles, é uma técnica de desenvolvimento de software em que consiste na modificação de comportamento do sistema sem alterar o código fonte da mesma.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Qual o preço para usar essa maravilhosa técnica?&lt;br&gt;&lt;br&gt;
Simples, aumento na complexidade do desenvolvimento da aplicação.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Mas calma, podemos usar esse recurso maneira inteligente com o auxílio de ferramenta especializada, e essa ferramenta é o tema desse artigo &lt;a href="https://docs.microsoft.com/en-us/azure/azure-app-configuration/"&gt;Azure App Configuration&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;App Configuration prover uma forma simples para que os desenvolvedores possam armazenar as configurações de suas aplicações, gerenciar as funcionalidades de sua aplicação. Sabe qual a parte mais incrível dessa ferramenta? É compatível com qualquer linguagem, existe bibliotecas para o &lt;a href="https://docs.microsoft.com/en-us/azure/azure-app-configuration/quickstart-aspnet-core-app"&gt;.net core&lt;/a&gt;, &lt;a href="https://docs.microsoft.com/en-us/azure/azure-app-configuration/quickstart-dotnet-app"&gt;.Net (Fullframework)&lt;/a&gt;, &lt;a href="https://docs.microsoft.com/en-us/azure/azure-app-configuration/quickstart-azure-function-csharp"&gt;Azure Function&lt;/a&gt;, &lt;a href="https://docs.microsoft.com/en-us/azure/azure-app-configuration/quickstart-java-spring-app"&gt;Java Spring&lt;/a&gt; e outras através da &lt;a href="https://github.com/Azure/AppConfiguration#rest-api-reference"&gt;api Rest&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Creio que para os desenvolvedores que não cansam de estudar, já ouviu falar em microserviço, e quem foi além nesse conteúdo deve ter em algum momento da vida esbarrado no termo &lt;a href="https://12factor.net/pt_br/"&gt;Twelve-Factor App&lt;/a&gt;. Bom para quem não sabe o que é, segue uma breve descrição e qual a sua relação com o tema desse artigo:&lt;/p&gt;

&lt;p&gt;Twelve-Factor App (aplicação doze-fatores) é uma metodologia para construir software como serviço. Indo mais além, para utilizar essa metodologia é necessário que a aplicação possua algumas características e sendo bem literal segue eles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utilizar de formatos &lt;strong&gt;declarativos&lt;/strong&gt; para automatizar a configuração inicial, minimizar tempo e custo para novos desenvolvedores participarem do projeto;&lt;/li&gt;
&lt;li&gt;Ter um &lt;strong&gt;contrato claro&lt;/strong&gt; com o sistema operacional que o suporta, oferecendo &lt;strong&gt;portabilidade máxima&lt;/strong&gt; entre ambientes que o executem;&lt;/li&gt;
&lt;li&gt;São adequados para &lt;strong&gt;implantação&lt;/strong&gt; em modernas &lt;strong&gt;plataformas em nuvem&lt;/strong&gt; , evitando a necessidade por servidores e administração do sistema;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimizam a divergência&lt;/strong&gt; entre desenvolvimento e produção, permitindo a &lt;strong&gt;implantação contínua&lt;/strong&gt; para máxima agilidade;&lt;/li&gt;
&lt;li&gt;E podem &lt;strong&gt;escalar&lt;/strong&gt; sem significativas mudanças em ferramentas, arquiteturas, ou práticas de desenvolvimento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bom, não sou eu quem inventou essas características, é sério! Está escrito assim no site da metodologia. E como o nome da metodologia sugere existem 12 fatores para serem cuidadosamente elaborada nas suas aplicações. Somente se quiser ter um software como serviço, é claro 😜!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🗣 Até agora o autor desse artigo esta me fazendo de trouxa, pois fala, fala e não tem nada de App Configuration.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leitor revoltado 😡&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sim, vou chegar lá! Só mais um pouco, preciso introduzir esse tema para. E somente aí, consigo explicar o real potencial do App Configuration e qual problema ela chegou para resolver! Vamos olhar os 12 Fatores.&lt;/p&gt;

&lt;h3&gt;
  
  
  Os Doze Fatores
&lt;/h3&gt;

&lt;h4&gt;
  
  
  I. Base de Código
&lt;/h4&gt;

&lt;p&gt;Uma base de código com rastreamento utilizando controle de revisão, muitos deploys&lt;/p&gt;

&lt;h4&gt;
  
  
  II. Dependências
&lt;/h4&gt;

&lt;p&gt;Declare e isole as dependências&lt;/p&gt;

&lt;h4&gt;
  
  
  III. Configurações 👈👈👈👈👈👈
&lt;/h4&gt;

&lt;p&gt;Armazene as configurações no ambiente&lt;/p&gt;

&lt;h4&gt;
  
  
  IV. Serviços de Apoio
&lt;/h4&gt;

&lt;p&gt;Trate os serviços de apoio, como recursos ligados&lt;/p&gt;

&lt;h4&gt;
  
  
  V. Construa, lance, execute 👈
&lt;/h4&gt;

&lt;p&gt;Separe estritamente os builds e execute em estágios&lt;/p&gt;

&lt;h4&gt;
  
  
  VI. Processos
&lt;/h4&gt;

&lt;p&gt;Execute a aplicação como um ou mais processos que não armazenam estado&lt;/p&gt;

&lt;h4&gt;
  
  
  VII. Vínculo de porta
&lt;/h4&gt;

&lt;p&gt;Exporte serviços por ligação de porta&lt;/p&gt;

&lt;h4&gt;
  
  
  VIII. Concorrência
&lt;/h4&gt;

&lt;p&gt;Dimensione por um modelo de processo&lt;/p&gt;

&lt;h4&gt;
  
  
  IX. Descartabilidade 👈
&lt;/h4&gt;

&lt;p&gt;Maximizar a robustez com inicialização e desligamento rápido&lt;/p&gt;

&lt;h4&gt;
  
  
  X. Dev/prod semelhantes 👈
&lt;/h4&gt;

&lt;p&gt;Mantenha o desenvolvimento, teste, produção o mais semelhante possível&lt;/p&gt;

&lt;h4&gt;
  
  
  XI. Logs
&lt;/h4&gt;

&lt;p&gt;Trate logs como fluxo de eventos&lt;/p&gt;

&lt;h4&gt;
  
  
  XII. Processos de Admin
&lt;/h4&gt;

&lt;p&gt;Executar tarefas de administração/gerenciamento como processos pontuais&lt;/p&gt;

&lt;p&gt;Indiquei quais dos fatores esse serviço ajuda!!!! Se não concorda, comenta ai! A configuração de uma aplicação é algo bem comum e rotineiro no desenvolvimento, saber onde guardar o usuário e senha do banco de dados, configuração do servidor SMTP para envio de e-mail, ou até mesmo configuração do ClientId e ClientSecret dessa aplicação. Com isso, podemos dizer que existem de 2 a 3 ambientes com configurações distintas: Configuração de desenvolvimento, configuração de homologação e configuração de produção.&lt;/p&gt;

&lt;p&gt;Existem várias formas de fazer isso, desde chapando essa configuração no código 🤦‍♀️🤦‍♂, criando 3 arquivos um para cada ambiente ou usando um serviço que centralize essas configurações, mas sendo remoto e com controle de acesso 👮‍♀️ 👮‍♂️! As duas primeiras tem o problema de versionar essas configurações em alguma ferramenta de controle de versão, podendo até mesmo informando certas credencias para pessoas que você não queria. A terceira forma, se você contou, e a última é o próprio App Configuration!!! 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uUNL6siQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A4YgLquiqCmasVP-jR646Jw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uUNL6siQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A4YgLquiqCmasVP-jR646Jw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tenho uma configuração para cada ambiente, e na minha aplicação tem apenas uma referência para esse serviço! Podemos chamar essa referência de ConnectionString, um modo de somente leitura! Vejam um exemplo de configuração, outra relação bem interessante com a metodologia Twelve-Factor App é que eu consigo alterar uma determinada configuração e que essa alteração será refletida na aplicação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DzSTo93s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/947/1%2AhIspo56L94AJgLGgTVGPMA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DzSTo93s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/947/1%2AhIspo56L94AJgLGgTVGPMA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🗣 Sem precisar reiniciar a aplicação?  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leitor curioso 🤓&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Exatamente meu caro, não é necessário reiniciar sua aplicação para mudar valores como usuário e senha do banco de dados (quem nunca precisou fazer isso). Alterar a URL de um serviço. Posso até ter um serviço de configuração centralizado para várias aplicações, exemplo: Manter a URL do sistema de autenticação centralizada, evitando ter que alterar dezenas de serviço. Afinal, API em microserviço tende aos gremlins.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z7jSheyq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AO87SaUe7WfeanJa75xTa9g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z7jSheyq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AO87SaUe7WfeanJa75xTa9g.png" alt=""&gt;&lt;/a&gt;Cada bola verde é uma API&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🗣 E qual a relação do App Configuration com o fator V. Construa, lance, execute? Não consigo ver nenhuma ligação.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leitor revoltado 😡, ele continua lendo o artigo&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QOPDPTT7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ABhofpzXvyplyxEVtKzmAyg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QOPDPTT7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ABhofpzXvyplyxEVtKzmAyg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uUsY2Qhf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ajf5nkBvZu6IGdhfG6ZzJFg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uUsY2Qhf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ajf5nkBvZu6IGdhfG6ZzJFg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então, além de gerenciar as configurações existe outra funcionalidade bem interessante &lt;em&gt;Feature Manager&lt;/em&gt; (em inglês pra ser chique 💁‍♀️ 💁‍♂️), consigo implementar uma forma de liberar novas versões do meu código para meus usuários/clientes apenas habilitando ou desabilitando um botão.&lt;/p&gt;

&lt;p&gt;👈👈👈👈&lt;/p&gt;

&lt;p&gt;Dessa forma posso implementar uma lógica, muito bem elaborada no meu software para caso eu habilite a feature beta, chama a parte X do meu software e caso essa feature está desligada chamo a parte Y do meu software.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z_gdZKts--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/774/1%2Ab0Fayzp38ODBil4btfbWYg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z_gdZKts--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/774/1%2Ab0Fayzp38ODBil4btfbWYg.png" alt=""&gt;&lt;/a&gt;De acordo com os meus cálculos1, quando a feature beta esta ligada o serviço GetAsync retorna a flag = Beta. E se a feature estiver desligada o retorno é a flag Não Beta.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🗣 Olhando as ilustrações vi que esta utilizando Microsoft.Percentage, pra que serve isso?  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leitor curioso 🤓&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Boa!!!! Gostei de você caro leitor! Então, o Azure App Configuration consegue ter filtros, alguns já prontos como é o caso do Microsoft.Percentage. Esses filtros podem interferir na execução do seu código! Esse em especifico faz com que X% das minhas requisições executem o código com a feature beta habilitada e outros Y% executem sem a feature beta habilitada. E isso é ótimo!!!!&lt;/p&gt;

&lt;p&gt;Podemos liberar nosso código para 10% dos nossos usuários, avaliar os erros e ir aumentando a porcentagem, limitado a 100% das requisições.&lt;/p&gt;

&lt;p&gt;Vou compartilhar aqui o projeto onde eu configurei o Azure App Configuration, podemos conversar sobre. Olhem lá, podem copiar ou até mesmo criticar. 😝👻&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/juscelior/multitenant-core"&gt;https://github.com/juscelior/multitenant-core&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🤑 E por hoje é isso galera!!! Não esqueçam de curtir (caso tenham gostado do artigo), clica em seguir para fortalecer a comunidade. Comente com o que achou. E não esqueça de compartilhar com seus coleguinhas do trabalho, bar, whatsapp, grupo da família…. 🤭&lt;/p&gt;

&lt;p&gt;Podem ver outros artigos que escrevi aqui -&amp;gt; 🤞 &lt;a href="https://medium.com/@juscelioreis"&gt;https://medium.com/@juscelioreis&lt;/a&gt; 🤞&lt;/p&gt;

&lt;p&gt;🤓😵 Referência desse artigo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://12factor.net/pt_br/"&gt;The Twelve-Factor App&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://docs.microsoft.com/en-us/azure/azure-app-configuration/howto-best-practices"&gt;Azure App Configuration best practices&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://docs.microsoft.com/en-us/azure/azure-app-configuration/concept-feature-management"&gt;Feature management overview&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://docs.microsoft.com/en-us/azure/azure-app-configuration/"&gt;Azure App Configuration documentation&lt;/a&gt;&lt;/p&gt;




&lt;div class="ltag__user ltag__user__id__426430"&gt;
  
    .ltag__user__id__426430 .follow-action-button {
      background-color: #008000 !important;
      color: #dce9f3 !important;
      border-color: #008000 !important;
    }
  
    &lt;a href="/juscelior" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4xok3liq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--nZjGgy2R--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/426430/ab8d100e-70ca-42c4-a5f8-52fc203e22bf.jpg" alt="juscelior image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/juscelior"&gt;Pode me chamar de Juscélio Reis&lt;/a&gt;
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/juscelior"&gt; Professional in constant learning, software developer with almost 10 years of career, researcher on distributed systems and information security. Strong experience in software development with C #&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>devops</category>
      <category>featureflags</category>
      <category>twelvefactor</category>
      <category>featuretoggles</category>
    </item>
    <item>
      <title>Por que devemos começar nossas APIs pelo contrato?</title>
      <dc:creator>Pode me chamar de Juscélio Reis</dc:creator>
      <pubDate>Tue, 24 Mar 2020 01:56:24 +0000</pubDate>
      <link>https://forem.com/juscelior/por-que-devemos-comecar-nossas-apis-pelo-contrato-4i4h</link>
      <guid>https://forem.com/juscelior/por-que-devemos-comecar-nossas-apis-pelo-contrato-4i4h</guid>
      <description>&lt;p&gt;Após uma década desenvolvendo software consigo afirmar o quanto é mais rápido construir código orientado a contrato (&lt;em&gt;schema&lt;/em&gt; se preferir chamar assim). Porem nem sempre concordei com essa afirmação, na verdade faz pouco tempo que entendi qual o real ganho em trabalhar com essa abordagem.&lt;/p&gt;

&lt;p&gt;Lembro de ter estudado no mestrado (como aluno especial) SOA (faz uns anos isso). Durante esse tempo o professor que seguia muito a metodologia que está nos livros do Thomas Erl, falava que para construir um serviço devemos começar pelo contrato. Nessa época eu discordava muito pois já trabalhava desenvolvendo serviços a muito tempo, entendia bem o WSDL e Web Services e suas especificações como WS-Basisc, WS-Trust, WS-* e REST, além de dominar uma tecnologia para construir serviços da Microsoft o famoso WCF (Adorava esse framework).&lt;/p&gt;

&lt;p&gt;O que eu não entendia na época, mas entendo hoje, era que minha falta de bagagem, minha pouca experiência profissional e ficar isolado no mundo idealizado por um fornecedor de tecnologia, ignorando outros fornecedores além de não focar meus estudos ao conceito de serviços. Eu entendia que essa abordagem era pouco produtiva, provavelmente você caro leitor também ache isso.&lt;/p&gt;

&lt;p&gt;O que eu não entendia na época era que para seguir uma abordagem orientada ao desenvolvimento ou melhor primeiro o código (code-first) é que corremos o risco de fazer um serviço especialista demais, dificultando o seu reaproveitamento ou no pior cenário imaginável uma alteração nesse serviço como uma mudança de um nome, exemplo: mudar &lt;strong&gt;Nmoe&lt;/strong&gt; para &lt;strong&gt;Nome&lt;/strong&gt; (afinal foi um erro de digitação), pode causar com que serviços consumidores quebrem, chegando ao ponto de sair do ar (serio, já vi isso acontecer com mais frequência que gostaria de confessar).&lt;/p&gt;

&lt;p&gt;O que me fez mudar de ideia não foram somente os erros que pude presenciar, mas estudar o ser humano. É muito complicado para que desenvolvedores pensem de forma abstrata, evitando transpor as regras internas do serviço para a sua interface, pois tendemos a pensar de forma intuitiva e automática nesse contexto, levando a simplificações e replicações implícitas de padrões.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Podemos estar cegos para o óbvio e cegos também para a nossa cegueira&lt;/em&gt;&lt;br&gt;&lt;br&gt;
― &lt;strong&gt;Daniel Kahneman&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O sistema intuitivo e automático em nossos cérebros é uma ferramenta poderosa e eficaz, mas às vezes é bom olhar para as coisas de outra perspectiva (&lt;em&gt;Vuja De&lt;/em&gt;). Em vez de olhar o serviço sobre a perspectiva de código, vamos olhar primeiro para o seu contrato, sua interface e a partir dela abstrair o problema.&lt;/p&gt;

&lt;p&gt;Para construir APIs precisamos de um ativo muito mais importante e complicado, pessoas!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Programação é uma atividade social.&lt;br&gt;&lt;br&gt;
― &lt;strong&gt;Robert C. Martin&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lembro das discussões da época, que programar usando SOAP (&lt;a href="https://www.w3.org/TR/soap/"&gt;&lt;em&gt;Simple Object Access Protocol&lt;/em&gt;&lt;/a&gt;) era obsoleto e muito pesado (não reflete minha opinião) e que o futuro era REST (&lt;a href="https://www.w3.org/2001/sw/wiki/REST"&gt;&lt;em&gt;Representational State Transfer&lt;/em&gt;&lt;/a&gt;). Esse último teve um crescimento incrível na comunidade de desenvolvimento de software. Porem nem tudo que vira padrão é o melhor, rs. Em REST não temos a cultura de pensar no contrato primeiro, para falar a verdade não existe uma especificação de contrato padrão. O mercado acabou adotando a especificação OpenAPI (&lt;a href="https://www.openapis.org/"&gt;&lt;em&gt;OpenAPI Specification&lt;/em&gt;&lt;/a&gt;&lt;em&gt; — OAS&lt;/em&gt;) como padrão é um dos mais adotados, mas saiba que existem outras especificações como &lt;em&gt;RAML (&lt;/em&gt;&lt;a href="https://raml.org/"&gt;&lt;em&gt;RESTful API Modeling Language&lt;/em&gt;&lt;/a&gt;), WADL (&lt;a href="https://www.w3.org/Submission/wadl/"&gt;&lt;em&gt;Web Application Description Language&lt;/em&gt;&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Padrões como esses que citei acima, como o OpenAPI, ajudam a facilitar uma estratégia de desenvolvimento ‘design first’ ou ‘driven-definition’. Essa abordagem permite que as partes interessadas planejem uma API e sua funcionalidade antes de pensar em implementar o código. As próximas alterações e os requisitos de teste podem ser comunicados mais cedo, pois existe um plano para que todos possam trabalhar. Isso sim! É ganho de tempo, e acelera o desenvolvimento de fato. Existem outros benefícios, segue a lista abaixo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trabalhar orientando ao contrato é uma forma de manter o conhecimento, e olha que a cada dia fica mais complexo do desenvolvimento de software.&lt;/li&gt;
&lt;li&gt;Ocultar a estrutura do banco de dados, além de diminuir a probabilidade de ter campos do banco expostos diretamente na interface do serviço. Melhorando e muito a segurança, e evitando problemas como alterar nome de um campo no banco ser obrigado a alterar o serviço.&lt;/li&gt;
&lt;li&gt;Ao pensar nas entidades de domino, facilita a abstração, permite manobras internas do serviço o que pode contribuir com a resiliência de seu serviço.&lt;/li&gt;
&lt;li&gt;É uma abordagem bem integrada com o TDD (Test Driven Design), melhorando o controle de qualidade da sua aplicação, pois ao alterar o contrato (&lt;em&gt;Schema&lt;/em&gt;) e aplicar o teste de aceitação poderá pegar erros mais cedo no desenvolvimento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O interessante é que essa abordagem ajuda na construção de uma governança em cima das APIs. Governança da API fornece uma abordagem orientada a políticas, impondo padrões e pontos de verificação ao longo do ciclo de vida da API ( &lt;strong&gt;olha que lindo isso aqui&lt;/strong&gt; ).&lt;/p&gt;

&lt;p&gt;A sua fronteira não fica isolada apenas no tempo de execução da API, mas também no design através de processos de desenvolvimento. Inclui as diretrizes, padrões e processos a serem seguidos para identificação da API, &lt;strong&gt;documentação da interface&lt;/strong&gt; , desenvolvimento, &lt;strong&gt;teste&lt;/strong&gt; , implantação, execução e operação. Os padrões e princípios definidos pela governança da API fornecem garantia de qualidade da API, como segurança, disponibilidade, escalabilidade e confiabilidade.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MP173aS9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AdkCww0dGQ5Nk7G3tlAkmHg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MP173aS9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AdkCww0dGQ5Nk7G3tlAkmHg.png" alt=""&gt;&lt;/a&gt;Governança&lt;/p&gt;





&lt;div class="ltag__user ltag__user__id__426430"&gt;
  
    .ltag__user__id__426430 .follow-action-button {
      background-color: #008000 !important;
      color: #dce9f3 !important;
      border-color: #008000 !important;
    }
  
    &lt;a href="/juscelior" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4xok3liq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--nZjGgy2R--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/426430/ab8d100e-70ca-42c4-a5f8-52fc203e22bf.jpg" alt="juscelior image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/juscelior"&gt;Pode me chamar de Juscélio Reis&lt;/a&gt;
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/juscelior"&gt; Professional in constant learning, software developer with almost 10 years of career, researcher on distributed systems and information security. Strong experience in software development with C #&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>apidevelopment</category>
      <category>openapi</category>
      <category>apigovernance</category>
    </item>
    <item>
      <title>Framework para desenvolvimento de Bots: Computação cognitiva</title>
      <dc:creator>Pode me chamar de Juscélio Reis</dc:creator>
      <pubDate>Fri, 27 Dec 2019 18:30:00 +0000</pubDate>
      <link>https://forem.com/juscelior/framework-para-desenvolvimento-de-bots-computacao-cognitiva-3ndg</link>
      <guid>https://forem.com/juscelior/framework-para-desenvolvimento-de-bots-computacao-cognitiva-3ndg</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;A computação cognitiva integra uma nova classe de problemas. Basicamente lida com situações complexas, ambíguas e incertas; em em outras palavras problemas humanos!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esse artigo integra a série &lt;strong&gt;Framework para desenvolvimento de Bots&lt;/strong&gt;. Mas agora vamos conversar sobre o que seria computação cognitiva, a parte inteligente que vai estar no seu software.&lt;/p&gt;

&lt;h4&gt;
  
  
  Framework para desenvolvimento de Bots:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/juscelior/framework-para-desenvolvimento-de-bots-contexto-4a06-temp-slug-5624969"&gt;Contexto&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Computação cognitiva.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Teoria
&lt;/h4&gt;

&lt;p&gt;Antes de começar com exemplos e aplicações, precisamos definir um conceito comum sobre o que é computação cognitiva, o que mais observo são combinação de letras e siglas que está associada a inteligência artificial, mas nem todas estão ligadas a computação cognitiva. O conceito que vou apresentar não foi de minha autoria, foi de um consorcio de pessoas muito mais inteligentes e capaz para definir algo tão complexo e ao mesmo tempo maravilhoso! Então, senta que lá vem história:&lt;/p&gt;

&lt;p&gt;Em meados de 2014 um grupo de especialistas, com formações bem eclética, de diversas instituições de ensino, além de grandes empresas de tecnologia resolveram sentar e tentar definir o que seria computação cognitiva e qual seria a sua diferença para outros tipos de inteligência artificial, porem era importante que esse termo não fosse proprietária, podendo ser utilizada como referência pela indústria de tecnologia da informação (TI), pesquisadores, mídias e seus usuários. Para mais informações podem acessar o site &lt;a href="https://cognitivecomputingconsortium.com/"&gt;&lt;em&gt;Cognitive Computing Consortium&lt;/em&gt;&lt;/a&gt;. Ou se preferir segue um resumo sobre inteligencia artificial feito para ajudar a entender o seu conceito, mais informação podem ler o artigo &lt;a href="http://nirvacana.com/thoughts/2017/12/27/demystifying-artificial-intelligence/"&gt;&lt;em&gt;Demystifying Artificial Intelligence. What is Artificial Intelligence &amp;amp; explaining it from different dimensions&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OG_SLq5y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ABoXTlSNMiiySwlX_Suk3fw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OG_SLq5y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ABoXTlSNMiiySwlX_Suk3fw.png" alt=""&gt;&lt;/a&gt;&lt;a href="http://nirvacana.com/thoughts/2017/12/27/demystifying-artificial-intelligence/"&gt;Desmitificando a inteligencia artificial&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mas qual é a definição de cognitivo? &lt;em&gt;Até agora só está me enrolando&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://michaelis.uol.com.br/busca?id=oWlY"&gt;&lt;strong&gt;&lt;em&gt;Cognitivo&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Cog·ni·ti·vo&lt;/em&gt; &lt;strong&gt;&lt;em&gt;1.&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;Que se refere à cognição ou ao conhecimento.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;2.&lt;/em&gt;&lt;/strong&gt; psicol &lt;em&gt;Diz-se de estados ou processos que se relacionam à identificação de um conhecimento dedutível e à solução de tarefas e problemas específicos.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;3.&lt;/em&gt;&lt;/strong&gt; ling &lt;em&gt;Que se refere ao processo mental de percepção, juízo, memória e raciocínio.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Definido computação cognitiva
&lt;/h4&gt;

&lt;p&gt;Basicamente a computação cognitiva é caracterizada pela confusão; ops! Pelas situações complexas que são incertas e ambíguas. Meu exemplo favorito é a forma que mineiro fala, olha só:&lt;/p&gt;

&lt;p&gt;Mineiro A pergunta ao mineiro B: Pó pô pó?&lt;br&gt;&lt;br&gt;
Mineiro B responde ao mineiro A: Pó pô.&lt;/p&gt;

&lt;a href="https://medium.com/media/9e40d50d476983ee70391aa9337ca921/href"&gt;https://medium.com/media/9e40d50d476983ee70391aa9337ca921/href&lt;/a&gt;

&lt;p&gt;Como eu posso explicar a uma máquina que o primeiro &lt;strong&gt;Pó&lt;/strong&gt; significa &lt;strong&gt;Pode&lt;/strong&gt; e o segundo &lt;strong&gt;pó&lt;/strong&gt; significa &lt;strong&gt;pó&lt;/strong&gt; mesmo. Se até mesmo para alguns brasileiros, principalmente de outras regiões, não consegue entender esse exemplo, justamente por não conhecer o contexto por trás dessa expressão. Ou melhor, tenho outro exemplo formidável, a forma que minha esposa se expressa quando quer pedir para eu pegar alguma coisa.&lt;/p&gt;

&lt;p&gt;Esposa: Pegue o trem do lado da coisa lá?&lt;br&gt;&lt;br&gt;
Eu: Pegar o que?&lt;br&gt;&lt;br&gt;
Esposa: Aquela coisa lá, com o trocinho coisado.&lt;/p&gt;

&lt;p&gt;É um exemplo real. E sim faz sentido! Se não acredita veja esse vídeo aqui:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/6-9nWt04oSI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Agora como explicar a uma máquina, que no português temos várias formas de dizer a mesma coisa. Viu como esse tipo de situação é complexa, ambígua e incerta. Depende do contexto dos interlocutores envolvidos na conversa, e pode ainda sofrer mudanças, já que somos seres inteligentes e estamos sempre aprendendo novas habilidades.&lt;/p&gt;

&lt;p&gt;Para responder à natureza fluida da compreensão dos problemas dos usuários, o sistema de computação cognitiva oferece uma síntese não apenas de fontes de informação, mas também de influências, contextos e ideias. Sendo assim esse sistema inteligente (cognitivo) deve responder com o que considera ser o melhor naquele momento, não o que seria o correto. Podemos afirmar aqui que não existe certo e errado, existe apenas eu acho! E sim, muitas pessoas estão aí se gabando que estão utilizando as tecnologias mais revolucionarias, mas que na raiz da solução estão pagando, ou construindo, sistemas para dizer o que acha com um grau de certeza!&lt;/p&gt;

&lt;p&gt;A inteligência por trás dessa tecnologia está na forma que conseguimos organizar o caos, percorrendo coleções maciças de informações diversas para encontrar padrões e, em seguida, aplicam esses padrões para responder às necessidades do momento.&lt;/p&gt;

&lt;p&gt;Um mundo globalizado como o nosso e que está cada vez mais conectado e ubíquo como o nosso. Precisamos rever a natureza dos relacionamentos entre pessoas e ambiente virtual, cada dia mais difuso onde tecnologias podem agir como um assistente, um treinador para o usuário ou podem atuar virtualmente autonomamente em muitas situações de solução de problemas, resultando em respostas indicativas, sugestiva, instrutiva ou simplesmente divertidas.&lt;/p&gt;

&lt;p&gt;Para definir um sistema como cognitivo precisamos observar quatro características, sendo elas adaptativo, interativo, interativo e com estado e contextual.&lt;/p&gt;

&lt;h4&gt;
  
  
  Adaptativo
&lt;/h4&gt;

&lt;p&gt;Sistemas cognitivos devem ser capaz de aprender com as mudanças, que os requisitos evoluem. Devem ser projetados para serem alimentados com dados dinâmicos e em tempo “quase” real.&lt;/p&gt;

&lt;h4&gt;
  
  
  Interativo
&lt;/h4&gt;

&lt;p&gt;Devem ser simples para o usuário, deixando esses usuários confortáveis para dizer qual a sua necessidade. Os sistemas podem interagir com outros processadores, dispositivos e serviços em nuvem, bem como com pessoas.&lt;/p&gt;

&lt;h4&gt;
  
  
  Iterativo e com estado
&lt;/h4&gt;

&lt;p&gt;Devem ajudar na solução de um problema, fazendo perguntas ou encontrando informações adicionais diretamente na fonte de dados. Eles precisam “lembrar” as interações anteriores e retornar informações adequadas para a aplicação específica naquele momento.&lt;/p&gt;

&lt;h4&gt;
  
  
  Contextual
&lt;/h4&gt;

&lt;p&gt;Eles devem entender, identificar e extrair elementos contextuais, como significado, entidade, sintaxe, hora, local, domínio apropriado, regulamentos, perfil do usuário, processo, tarefa e objetivo. Eles podem recorrer a várias fontes de informação, incluindo informações digitais estruturadas e não estruturadas, bem como entradas sensoriais (visual, gestual, auditiva ou fornecida pelo sensor).&lt;/p&gt;

&lt;p&gt;Os sistemas cognitivos coexistirão com os sistemas legados. Muitos sistemas cognitivos se basearão nos recursos de TI atuais. Mas a ambição e o alcance da computação cognitiva são fundamentalmente diferentes. Abandonando o modelo de computador como dispositivo, ele busca levar a computação a uma parceria fundamental mais próxima nos esforços humanos.&lt;/p&gt;

&lt;p&gt;Os sistemas cognitivos diferem dos aplicativos de computação atuais, pois vão além da tabulação e cálculo com base em regras e programas pré-configurados. Embora sejam capazes de realizar tarefas da computação básica, eles também podem inferir e até raciocinar com base em objetivos mais amplos.&lt;/p&gt;

&lt;p&gt;Para quem leu o &lt;a href="https://dev.to/juscelior/framework-para-desenvolvimento-de-bots-contexto-4a06-temp-slug-5624969"&gt;primeiro artigo da serie&lt;/a&gt; um dos requisitos, não negociáveis, da nossa consultoria é implementar um bot conversacional utilizando o serviço da IBM o &lt;a href="https://www.ibm.com/cloud/watson-assistant/"&gt;IBM Watson Assistant&lt;/a&gt;. Vamos entender o que seria esse tal de assistente vulgo bot. Seria um serviço de inteligencia com a finalidade ajudar sua marca a estar presente em qualquer dispositivo, aplicativo ou canal. Dessa forma o assistente pode se conectar aos recursos de engajamento do cliente que você já usa para entregar uma experiência de resolução de problemas unificada e envolvente para seus clientes, exemplo muito popular no Brasil seria o Whatsapp e Facebook.&lt;/p&gt;

&lt;p&gt;Basicamente o assistente atual como um programa que interpreta a entrada do usuário, qualifica essa entrada para saber onde redirecionar o usuário e o que responder.&lt;/p&gt;

&lt;h3&gt;
  
  
  Teoria aplicada à prática
&lt;/h3&gt;

&lt;p&gt;Agora vamos para a parte divertida, ou seja, vamos construir nosso assistente. Lembrando o nosso objetivo com essa parte pratica&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Planejar um diálogo&lt;/li&gt;
&lt;li&gt;Criando um assistente&lt;/li&gt;
&lt;li&gt;Criando uma habilidade de dialogo (Dialog Skill)&lt;/li&gt;
&lt;li&gt;Definir &lt;em&gt;intents&lt;/em&gt; (intenções) customizados&lt;/li&gt;
&lt;li&gt;Incluir uma entidade padrão e usá-la no diálogo para localizar padrões na entrada do usuário&lt;/li&gt;
&lt;li&gt;Incluir entidades para tornar suas respostas mais específicas&lt;/li&gt;
&lt;li&gt;Incluir nós de diálogo que podem manipular suas intenções&lt;/li&gt;
&lt;li&gt;Juntando tudo em um diálogo&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Planejar um diálogo
&lt;/h4&gt;

&lt;p&gt;Antes de sair fazendo um bot conversacional é necessário ter mapeado o que deseja fazer. Em outras palavras precisamos de um serviço que ajude a criar um fluxo de conversa com início, meio e fim (é desejável que seja feito por um especialista, comumente chamado de &lt;em&gt;UX Writer&lt;/em&gt;, já que é a parte mais complexa do desenvolvimento de um bot).&lt;/p&gt;

&lt;p&gt;Particularmente gosto da ferramenta &lt;a href="https://botsociety.io/"&gt;botsociety&lt;/a&gt;, pois possui uma camada de serviço gratuita. É excelente para demonstrar o bot antes de sair fazendo o fluxo na ferramenta da IBM. Uma das features que mais gosto é poder exportar um vídeo da a conversa:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rw5K9-uY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/400/1%2AHgX-WeLVnrsMWchmcUGd8A.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rw5K9-uY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/400/1%2AHgX-WeLVnrsMWchmcUGd8A.gif" alt=""&gt;&lt;/a&gt;Exemplo de um vídeo demonstrando como seria a conversa no whatsapp&lt;/p&gt;

&lt;p&gt;Além de conseguir mapear fluxos alternativos e construir um fluxograma automaticamente de acordo com o que você for criando seu mockup, e possui ainda uma funcionalidade para realizar pesquisa e teste de usabilidade.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nxTZqFxm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2ArL5NRUad5cMAyhl7YzWoxA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nxTZqFxm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/600/1%2ArL5NRUad5cMAyhl7YzWoxA.png" alt=""&gt;&lt;/a&gt;Fluxograma criado automaticamente&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---UMgCSfv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ABr50eaW1XpZyJYBWIlCMKQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---UMgCSfv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ABr50eaW1XpZyJYBWIlCMKQ.png" alt=""&gt;&lt;/a&gt;Exemplo da pesquisa de usabilidade&lt;/p&gt;

&lt;h4&gt;
  
  
  Criando um assistente
&lt;/h4&gt;

&lt;p&gt;Uma vez que temos o fluxo mapeado vamos iniciar na o nosso assistente na plataforma da IBM. Se não possui uma conta é preciso criar uma conta:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O Watson Assistant (antigo Watson Conversation) é a API do Watson para a criação e desenvolvimento de interfaces conversacionais, ou chatbots. Este serviço possui uma interface simples e intuitiva para que profissionais não-técnicos possam usufruir de todos os recursos disponíveis, de forma simples e rápida.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/victorshinya/watson-assistant-como-criar-o-seu-chatbot-usando-skills-e-assistants-5bfg-temp-slug-9827853"&gt;IBM Developer Brasil&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Crie sua conta da &lt;a href="https://cloud.ibm.com/registration?locale=pt-br"&gt;IBM Cloud&lt;/a&gt;. Feito isso vamos precisar criar nosso primeiro assistente, segue um vídeo para ajudar no processo de criação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hVn8APUV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A6Z7hfu77qYxRhe8iZ57Vhw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hVn8APUV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A6Z7hfu77qYxRhe8iZ57Vhw.gif" alt=""&gt;&lt;/a&gt;Criando um serviço Watson Assistant&lt;/p&gt;

&lt;p&gt;Para criar um assistente precisamos procurar os serviços do watson, depois basta procurar pelo serviço Watson Assistant. Existe uma camada gratuita, com 10.000 mensagens recebidas de forma gratuita por mês. Este número somente é descontado através das chamadas de API. Além disso, é possível criar até 5 &lt;em&gt;skills&lt;/em&gt; diferentes, com 100 intenções, 200 entidades e 100 nós de diálogo cada. No final da pagina é possível editar o nome do serviço. É possível utilizar o tutorial oficial da IBM (&lt;a href="https://cloud.ibm.com/docs/services/assistant?topic=assistant-assistant-add&amp;amp;locale=pt-br"&gt;Criando um assistente&lt;/a&gt;).&lt;/p&gt;

&lt;h4&gt;
  
  
  Criando uma habilidade de dialogo (Dialog Skill)
&lt;/h4&gt;

&lt;p&gt;Uma habilidade seria um conjunto de conhecimento em uma lógica treinada (baseada no cenário do seu negócio). É possível ter mais de uma habilidade para um assistente.&lt;/p&gt;

&lt;p&gt;Um assistente é um conjunto de habilidades que podem ser agrupados em um único serviço para poder lidar com diversos cenários. No nosso caso é onde vamos criar o atendimento da secretaria da Escola do Futuro. E a habilidade que vamos construir seria a de um secretário.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EnfoBpUA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A9Jbp9yepdo1iGeWTQVQPrQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EnfoBpUA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A9Jbp9yepdo1iGeWTQVQPrQ.gif" alt=""&gt;&lt;/a&gt;Criando um assistente e uma habilidade&lt;/p&gt;

&lt;p&gt;É possível utilizar o tutorial oficial da IBM (&lt;a href="https://cloud.ibm.com/docs/services/assistant?topic=assistant-skill-dialog-add&amp;amp;locale=pt-br"&gt;Criando uma habilidade de diálogo&lt;/a&gt;) também.&lt;/p&gt;

&lt;h4&gt;
  
  
  Definir &lt;em&gt;intents&lt;/em&gt; (intençoes) customizados
&lt;/h4&gt;

&lt;p&gt;Uma &lt;em&gt;intent&lt;/em&gt; ou intenção representa o desejo do usuário, o que o usuário deseja quando está enviando uma mensagem. No caso do Watson Assistent existe um padrão de nomenclatura para intenções iniciando com #.&lt;/p&gt;

&lt;p&gt;E para conseguir treinar essa intenção e indicar para o bot como faz para identificar a intenção do usuário, precisamos dar alguns exemplos. Exemplo:&lt;/p&gt;

&lt;p&gt;Intenção: &lt;em&gt;#sim&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Exemplos:&lt;br&gt;&lt;br&gt;
&lt;em&gt;sim&lt;br&gt;&lt;br&gt;
s&lt;br&gt;&lt;br&gt;
yeap&lt;br&gt;&lt;br&gt;
positivo&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Como o exemplo acima é possível notar que existem diversas formas de dizer a mesma coisa (intenção), por isso é preciso treinar com exemplos, e com o tempo precisamos voltar nos exemplos e atualizar os mesmos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XRVfszxl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AYMDssWSS56hOX3XvbmO64w.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XRVfszxl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AYMDssWSS56hOX3XvbmO64w.gif" alt=""&gt;&lt;/a&gt;Criando intenções customizadas&lt;/p&gt;

&lt;p&gt;É possível utilizar o tutorial oficial da IBM (&lt;a href="https://cloud.ibm.com/docs/services/assistant?topic=assistant-intents&amp;amp;locale=pt-br"&gt;Definindo intenções&lt;/a&gt;) também.&lt;/p&gt;
&lt;h4&gt;
  
  
  Incluir uma entidade padrão e usá-la no diálogo para localizar padrões na entrada do usuário
&lt;/h4&gt;

&lt;p&gt;Essas são entidades comuns criadas pela IBM que podem ser usadas em qualquer caso de uso. Eles estão prontos para uso assim que você os adicionar. É importante ressaltar que não é possível editar essas entidades.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A5LBlxbF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AaZI4zODcbARYUfmE49K5zg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A5LBlxbF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AaZI4zODcbARYUfmE49K5zg.gif" alt=""&gt;&lt;/a&gt;Habilitando uma entidade pré definida&lt;/p&gt;

&lt;p&gt;É possível utilizar o tutorial oficial da IBM (&lt;a href="https://cloud.ibm.com/docs/services/assistant?topic=assistant-entities&amp;amp;locale=pt-br"&gt;Criando entidades&lt;/a&gt;) também.&lt;/p&gt;
&lt;h4&gt;
  
  
  Incluir entidades para tornar suas respostas mais específicas
&lt;/h4&gt;

&lt;p&gt;Entidades representam objetos da intenção, seria um valor que queremos retirar do meio da oração, ops mensagem que o usuário enviou.&lt;/p&gt;

&lt;p&gt;Uma entidade possui um tipo, um valor e pode possuir um sinônimo ou um padrão. No caso abaixo estamos criando uma entidade &lt;em&gt;contato&lt;/em&gt; com um valor &lt;em&gt;CpfCnpj&lt;/em&gt; cujo padrão é um regex para identificar CPF (sim, sim, o cnpj ainda não está no exemplo abaixo).&lt;/p&gt;

&lt;p&gt;Também é possível criar uma entidade cujo valor pode possuir sinônimos, como é o exemplo do menu. Nome da entidade &lt;em&gt;menuUra&lt;/em&gt;, valor &lt;em&gt;conhecerEscola&lt;/em&gt;, sinônimos: &lt;em&gt;conhecer mais sobre a escola, conhecer escola&lt;/em&gt;, &lt;em&gt;informação da escola.&lt;/em&gt; Qualquer um desses termos que o usuário escrever irá corresponder a entidade &lt;em&gt;menuUra&lt;/em&gt; com o valor &lt;em&gt;conhecerEscola&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9WA43MJA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AGZwirba69-FnK-fIIIMEYQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9WA43MJA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AGZwirba69-FnK-fIIIMEYQ.gif" alt=""&gt;&lt;/a&gt;Criando uma entidade personalizada&lt;/p&gt;

&lt;p&gt;É possível utilizar o tutorial oficial da IBM (&lt;a href="https://cloud.ibm.com/docs/services/assistant?topic=assistant-entities&amp;amp;locale=pt-br"&gt;Criando entidades&lt;/a&gt;) também.&lt;/p&gt;
&lt;h4&gt;
  
  
  Juntando tudo em um diálogo
&lt;/h4&gt;

&lt;p&gt;Agora que já foi criado as entidades e as intenções vamos juntar com o diálogo. Observe que um diálogo em branco sempre vai ter 2 caixas uma chamada &lt;em&gt;Bem-vindo&lt;/em&gt; e outra &lt;em&gt;Em outros casos,&lt;/em&gt; conforme imagem abaixo_._&lt;/p&gt;

&lt;p&gt;Vamos começar criando um &lt;em&gt;folder&lt;/em&gt; e dar o nome de Acolhimento, nesse exemplo esse &lt;em&gt;folder&lt;/em&gt; serve para organizar tarefas relacionadas a etapa de acolhimento (receber o contato e identificar sua pessoa)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4nih1jJf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/992/1%2Az9VQLTys3ueXx3-reOUkBA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4nih1jJf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/992/1%2Az9VQLTys3ueXx3-reOUkBA.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RxOEq47j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/772/1%2A_JL5GaRe0PTPwc6xMIZUDw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RxOEq47j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/772/1%2A_JL5GaRe0PTPwc6xMIZUDw.jpeg" alt=""&gt;&lt;/a&gt;Criando o primeiro node&lt;/p&gt;

&lt;p&gt;Dentro da pastar &lt;em&gt;folder&lt;/em&gt; vamos criar nosso primeiro &lt;em&gt;node&lt;/em&gt; (nó), esses 3 pontos na vertical tem a opção de criar o &lt;em&gt;node&lt;/em&gt;. Esse node que estamos trabalhando vamos dar o nome de &lt;em&gt;Boas-vindas&lt;/em&gt;, e vamos configurar para quando for identificado uma intenção de saudação vai ser direcionado para esse node. E como o watson vai saber disso? Simples basta configurar a caixa de diálogo logo abaixo da frase &lt;em&gt;If assistant recognizes&lt;/em&gt; (se o assistente reconhecer) #saudacao (# lembra sempre intenções).&lt;/p&gt;

&lt;p&gt;Agora podemos ter variáveis de contexto, criada para armazenar valores extraído da mensagem enviada pelo nosso usuário ou uma variável de controle interna. A sua sintaxe começa com $ como podemos ver abaixo criado no segundo node chamado Primeiro Contato !$contato (! representa negação $contato uma variável de contexto, e tudo junto indica que queremos entrar nesse node quando a variável $contato for nula ou não existir)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o-YVGFE5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/976/1%2AAMnx9aKzJoDjaCA3FEPvJg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o-YVGFE5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/976/1%2AAMnx9aKzJoDjaCA3FEPvJg.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tIixswCC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1021/1%2A55UUP3lQOiGavRQ3SplF2Q.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tIixswCC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1021/1%2A55UUP3lQOiGavRQ3SplF2Q.jpeg" alt=""&gt;&lt;/a&gt;Logica para entrar no node.&lt;/p&gt;

&lt;p&gt;Outro ponto não menos importante de um node é a forma que ele vai tratar no final da sua execução, podemos esperar que nosso usuário responda algo, ou podemos redirecionar para outro node. Para nosso exemplo o node Boas vindas, após imprimir a sua mensagem vai redirecionar para o node Primeiro contato, e caso sua condição seja verdadeira irá imprimir a sua mensagem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qS3eEs4m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/947/1%2AAmg9_vxEDDWpzwGYZ-3sNw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qS3eEs4m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/947/1%2AAmg9_vxEDDWpzwGYZ-3sNw.jpeg" alt=""&gt;&lt;/a&gt;Redirecionando para outro node.&lt;/p&gt;

&lt;p&gt;Além de variáveis de contexto ou intenções podemos utilizar as nossas entidades para validar uma condição. Vamos olhar o exemplo de perguntar qual o CPF do nosso usuário, criamos um node para perguntar o CPF e esperamos que o usuário responda, em seguida criamos um node filho para validar se na mensagem enviada pelo usuário contém um CPF, se existir vamos armazenar esse valor em uma variável de contexto chamada $cpfContato.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EC-VnI7_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A31-Mhj0nQQVmSQbK18KcaQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EC-VnI7_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A31-Mhj0nQQVmSQbK18KcaQ.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lvLBzlia--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Afk7Q_-c3Ptvbqu30PaCQgg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lvLBzlia--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Afk7Q_-c3Ptvbqu30PaCQgg.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fB3H8Wb9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ax5qEmKG0QmM-gWxX6Zqaqg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fB3H8Wb9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ax5qEmKG0QmM-gWxX6Zqaqg.jpeg" alt=""&gt;&lt;/a&gt;Extrair valores de mensagem do usuário e salvando em variável de contexto.&lt;/p&gt;

&lt;p&gt;Uma boa prática é perguntar se o que nosso usuário escreve está certo (não que isso aconteça com muita frequência!!), sendo assim vamos utilizar a variável que criamos $cpfContato e vamos utilizar como um valor para concatenar em uma mensagem que vamos enviar para esse usuário. E para saber se estamos no caminho certo vamos criar 3 nodes filhos da pergunta sendo um para tratar da intenção #sim, outro para a intenção #nao e uma para tratar qualquer mensagem que não foi reconhecida como #sim ou #nao.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iszxUbBa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AGX1lWyJtMcU1f-KjfVIdAA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iszxUbBa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AGX1lWyJtMcU1f-KjfVIdAA.jpeg" alt=""&gt;&lt;/a&gt;Estrutura para confirmar uma informação&lt;/p&gt;

&lt;p&gt;O interessante dessa abordagem é que não ficamos presos a valores literais, temos uma intenção logo tanto um valor &lt;em&gt;sim&lt;/em&gt; como um &lt;em&gt;yeap&lt;/em&gt; significa a mesma intenção. O mesmo vale para uma intenção negativa, serve tanto um &lt;em&gt;não&lt;/em&gt; como um &lt;em&gt;nops&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Após a etapa de acolhimento vamos mostrar nossa ura, ou se preferir chamar de menu com as opções que nosso usuário poderá solicitar um atendimento, é uma boa prática mostrar quais assuntos o seu bot consegue responder para seu usuário. Não deixe seu usuário perdido ou traumatizado em um bot sem um guia.&lt;/p&gt;

&lt;p&gt;A nossa ura é inteligente o suficiente para entender expressões ou frases como reconhece um número. Lembra que criamos uma entidade chamada &lt;em&gt;menuUra&lt;/em&gt; e para cada item dentro dessa entidade tínhamos um sinônimo vinculado a esse item. Então mesmo que o usuário escolha &lt;em&gt;finalizar&lt;/em&gt; ou digite o número &lt;em&gt;4&lt;/em&gt; vai cair no nó de finalização.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NJ8p6k9M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A6cf-B0F4GTyWWWiI9z_uXw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NJ8p6k9M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A6cf-B0F4GTyWWWiI9z_uXw.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NjTkYYJ9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Aq8J0DKiCGipaa2dCH7gfiQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NjTkYYJ9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Aq8J0DKiCGipaa2dCH7gfiQ.jpeg" alt=""&gt;&lt;/a&gt;Exemplo de menu com múltiplas opções.&lt;/p&gt;

&lt;p&gt;Esse artigo ficou maior do que o imaginado, deixo aqui o &lt;a href="https://github.com/juscelior/bot-template-community/blob/master/watson/skill-Secret%C3%A1rio.json"&gt;&lt;em&gt;link&lt;/em&gt;&lt;/a&gt; para poder baixar a habilidade que criei nesse artigo e com isso ajudar você na sua jornada para a construção de um assistente virtual. Deixo também o link para o projeto que estou construindo durante o desenvolvimento dessa série de artigos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/juscelior/bot-template-community"&gt;juscelior/bot-template-community&lt;/a&gt;&lt;/p&gt;




&lt;div class="ltag__user ltag__user__id__426430"&gt;
  
    .ltag__user__id__426430 .follow-action-button {
      background-color: #008000 !important;
      color: #dce9f3 !important;
      border-color: #008000 !important;
    }
  
    &lt;a href="/juscelior" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4xok3liq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--nZjGgy2R--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/426430/ab8d100e-70ca-42c4-a5f8-52fc203e22bf.jpg" alt="juscelior image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/juscelior"&gt;Pode me chamar de Juscélio Reis&lt;/a&gt;
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/juscelior"&gt; Professional in constant learning, software developer with almost 10 years of career, researcher on distributed systems and information security. Strong experience in software development with C #&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>developer</category>
      <category>ibmwatson</category>
      <category>bots</category>
    </item>
  </channel>
</rss>
