<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Accenture Digital Product Dev - Medium]]></title>
        <description><![CDATA[Nós desenvolvemos produtos digitais com inovação, agilidade e excelentes práticas, para que o mercado brasileiro e latino-americano acompanhe a velocidade do mercado digital mundial. - Medium]]></description>
        <link>https://medium.com/digitalproductsdev?source=rss----4dea97c2fcfb---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Accenture Digital Product Dev - Medium</title>
            <link>https://medium.com/digitalproductsdev?source=rss----4dea97c2fcfb---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 13 Nov 2026 21:59:01 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/digitalproductsdev" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Convergência estratégica em produtos digitais]]></title>
            <link>https://medium.com/digitalproductsdev/converg%C3%AAncia-estrat%C3%A9gica-em-produtos-digitais-c0eb572c1994?source=rss----4dea97c2fcfb---4</link>
            <guid isPermaLink="false">https://medium.com/p/c0eb572c1994</guid>
            <category><![CDATA[product-management]]></category>
            <category><![CDATA[estratégia]]></category>
            <category><![CDATA[produtos-digitais]]></category>
            <category><![CDATA[artigos]]></category>
            <category><![CDATA[produtos]]></category>
            <dc:creator><![CDATA[Victor Lima]]></dc:creator>
            <pubDate>Wed, 22 Jun 2022 12:18:04 GMT</pubDate>
            <atom:updated>2022-06-22T12:18:04.762Z</atom:updated>
            <content:encoded><![CDATA[<h4>Ou como empresas acabam imitando umas às outras após uma inovação</h4><blockquote>Este post foi originalmente publicado em: <a href="https://vctrlima.substack.com/">https://vctrlima.substack.com/</a></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*byQjRyjRa4RJxj6f" /><figcaption>Photo by <a href="https://unsplash.com/@georgelebu?utm_source=medium&amp;utm_medium=referral">George Lebu</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>A figura abaixo é de um estudo sobre convergência estratégica e exemplifica como uma indústria constituída de um conjunto de empresas, após alguma inovação, tende a imitar, copiar ou mimicar os avanços entre si ao longo do tempo e acaba inevitavelmente por convergir, eliminando, mesmo que parcialmente, não apenas a vantagem competitiva introduzida mas também a rentabilidade média nessa mesma indústria.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/942/0*-byRIVJ9rYMqaB6H.png" /></figure><p>Essa modelagem e simulação foram feitas em “Strategy Convergence Creates Opportunities for Strategic Innovators”, por Constantinos C. Markides (London Business School), Erik Larsen e Michael Gary. A ideia foi analisar o movimento convergente de uma indústria em direção a estratégias similares, sejam elas de modelo de negócio, posicionamento, desenvolvimento de produto, inovação tecnológica, eficiência operacional ou qualquer outra. O modelo mostra como com o passar do tempo a distância estratégica entre as empresas tende a diminuir e convergir em pontos próximos entre si, ou seja, pouco diferenciada.</p><p>A relevância de difusões e convergências como a descrita acima é algo que costuma ocorrer continuamente e, em velocidades diferentes, dependendo da indústria. São diversos os mecanismos pelos quais isso acontece, e aqui vou listar alguns dos mais comuns:</p><ul><li><em>observação dos competidores diretos e indiretos, </em>seja por engenharia reversa do seu posicionamento estratégico, modelo de negócios, produtos ou aspectos operacionais;</li><li><em>acompanhamento e compartilhamento de tendências do mercado:</em> com “feiras da indústria”, congressos, eventos, business schools, think tanks ou venture capitalists que replicam modelos de sucesso em novas regiões e mídia especializada;</li><li><em>a competição por talentos e perda de talentos</em> para competidores que acabam levando também o know-how</li></ul><p>Do ponto de vista de estratégia para produtos digitais, vemos o mesmo acontecendo em diversos produtos e empresas. O modelo de negócios da Netflix e da Amazon Prime Video, por exemplo, é bastante similar, apesar de se posicionarem de formas diferentes e para segmentos de mercados diferentes. O Instagram também possui diversos aspectos relacionáveis ao Twitter ou ao Snapchat, assim como as empresas de varejo online possuem abordagens fundamentalmente similares de experiência, atendimento ao cliente, centro de distribuição e logística de entrega.</p><p>A convergência também pode acontecer por diversos quesitos, como:</p><ul><li><em>modelo de receita</em>: a infinidade de empresas com modelo “as-a-service”, ou subscription based, ou freemium, ou capturando um “take rate” em uma transação, por exemplo;</li><li><em>modelo de aquisição de usuários/clientes</em>: estratégia de member-get-member/invitation-only ou aquisição por anúncios programáticos, entre diversos outros;</li><li><em>experiência do cliente</em> e/ou interface/<em>usabilidade de alguma funcionalidade</em>: one click check-out, padrão “busca-lista-detalhe” em catálogos de produtos, signup e onboarding em um produto com selfie ou foto de um documento, por exemplo;</li><li><em>tecnologia aplicada no produto</em>: desenvolvimento nativo para aplicativos mobile ou escalabilidade horizontal da arquitetura utilizando provedores cloud;</li><li><em>modelo operacional, processos e métodos</em>: utilização de algum sabor de agilidade — scrum ou kanban, product discovery, OKR e equipe multidisciplinares na concepção ou desenvolvimento de produtos digitais;</li></ul><p>São muitos os casos relacionados com os quesitos acima. O Instagram e o Snapchat na <a href="https://techcrunch.com/2017/05/16/to-clone-or-not-to-clone/?guccounter=1&amp;guce_referrer=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8&amp;guce_referrer_sig=AQAAAA0GKjm9UumuH8L0JiYV3D7U5sJU_dreZHZ4VE6BtooF7W_0nqwS_VxBMrgsPDELgf5JarCWokUmlO6aQ4J6NRyuaHfLdMkLZYliMrhNsrWVSnOsiSMNPMMcf3XePkLVUfUbpb4Q3Cp2FRQo0sdoYKWftgWXEJh304uRI0DG1ACa">competição por stories</a> serve como um exemplo recente, assim como a disputa que vai começar entre o Clubhouse e o Twitter Spaces que provavelmente vai ser caso do mesmo experimento.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*7tQv-P7tNgS8teGiHfKVaQ.png" /></figure><p>Na época da controvérsia em relação ao Snapchat Stories e o Instagram Stories, o VP de produto do Instagram disse o seguinte em um entrevista:</p><blockquote><em>“Se formos honestos com nós mesmos, essa é a forma como a indústria de tecnologia funciona, e francamente é assim que todas as indústrias funcionam. Boas ideias começam em um lugar e se espalham ao longo de uma indústria. ‘Kudos’ para o Snapchat por ser o primeiro a conceber o Stories, mas ele é um formato e que vai ser adotado amplamente em diferentes plataformas.”</em></blockquote><p>Muito consciente do fenômeno de convergência e difusão de “boas ideias”, a frase do Kevin Weil pede pelas próximas perguntas:</p><p><em>Quando é melhor você ser o primeiro a se movimentar em um mercado e indústria trazendo uma inovação ou buscando um novo posicionamento estratégico</em>?</p><p><em>Ou quando é melhor que você apenas monitore e siga os seus competidores construindo em cima do que já foi desbravado e se beneficiando de mais informação?</em></p><p>Vamos tentar trazer alguns aspectos de cada uma das estratégias para tentar responder a elas.</p><h4>A vantagem do first-mover e o papel do follower</h4><p>Na essência do movimento convergente em uma indústria estão dois papéis: o da empresa que faz um primeiro movimento em direção a algo novo e a(s) empresa(s) que acompanha(m) esse movimento, potencialmente, executando-o da mesma forma.</p><p>Entre os mecanismos que determinam as vantagens de ser um first-mover, os dois mais importantes são: o <em>controle de recursos</em> <em>escassos</em> e a <em>relação com o custo de mudança (switching costs) do comprador</em>.</p><p>O <em>controle de recursos</em> <em>escassos </em>tem ligação com a capacidade de se estabelecer como o primeiro a explorar recursos que só estarão disponíveis para a empresa que for a primeira a se movimentar para aquele espaço, por exemplo, a garantia de direitos de <em>streaming</em> de eventos esportivos quando concedidos exclusivamente para um player que foi o primeiro a se posicionar naquele segmento. Movimentos como esse fazem com que os ‘<em>followers</em>’ encontrem dificuldade em se posicionar pois tais recursos já estão sob posse exclusiva do ‘<em>first-mover</em>’.</p><p>O segundo mecanismo mais importante está ligado ao <em>custo de mudança do comprador</em>, em outras palavras, o quão difícil é para um comprador mudar de produto ou serviço para um competidor depois de ter adquirido a solução do <em>first-mover</em>? Se for custoso para o comprador mudar para outro serviço e produto, a vantagem em ser um <em>first-mover</em> é claríssima.</p><p>No entanto também existem aspectos negativos em ser um first-mover. Um deles é o fardo de lidar com toda a incerteza do mercado relacionado ao seu movimento. Por exemplo: esse movimento será aceito pelos clientes e pelo mercado? Quais impactos isso pode ter na sua marca e posicionamento?</p><p>Além disso, assim como falamos anteriormente, existem os efeitos de “<em>free riding</em>” e “<em>copy cat</em>”, nos quais os seus competidores se aproveitam do aprendizado obtido no mercado e com os consumidores para se beneficiar, introduzindo potencialmente produtos e serviços melhores, com menos incerteza e cujo o público-alvo já tenha superado parte da curva de aprendizado relacionada ao movimento para um posicionamento diferenciado.</p><p>Para os “<em>followers</em>”, ou empresas que se movimentam tardiamente, abordagens como estudo criterioso do seu competidor e engenharia reversa dos seus movimentos, assim como no outro extremo uma posição mais agressiva de aquisição e fusão de empresas, como foi o caso do Facebook com o Whatsapp e Instagram, por exemplo, podem ser alternativas viáveis para se defender de ‘<em>first-movers</em>’.</p><p>O ponto central dessa discussão é que a convergência em uma indústria, seja ela em geral ou em âmbitos mais restritos, como o de produtos digitais, é um fenômeno conhecido. Portanto, é essencial ter a habilidade de sistematicamente mapear o mercado, escolher os competidores pertinentes para o seu posicionamento e saber quando o primeiro movimento deve ser seu e da sua empresa ou quando o melhor movimento é esperar e seguir de acordo com o feedback do mercado.</p><h4>Conclusões</h4><ul><li>É natural acontecer um <em>movimento de convergência dentro de uma indústria.</em> Esteja consciente disso.</li><li>As formas como a difusão de uma inovação acontece em uma indústria são diversas, no entanto atente-se à <em>transferência de conhecimento ao perder talentos para competidores</em>, <em>acompanhamento e compartilhamento de tendências da indústria</em>, e faça a <em>observação direta dos seus competidores em diversos quesitos.</em></li><li>Avalie sistematicamente os seus competidores em quesitos como: <em>modelo de negócio, modelo de receita, modelo operacional, funcionalidade e usabilidade dos seus produtos, tecnologia adotada e outros.</em></li><li>As vantagens em ser um <em>first-mover</em> ou <em>follower</em> dependem da circunstância, porém aspectos como <em>acesso a recursos escassos e custo de mudança alto para o comprador</em> podem indicar uma vantagem para o first-mover, assim como <em>custo alto para introduzir uma inovação e os seus impactos na marca, curva de aprendizado do cliente, aceitação do mercado e P&amp;D para desenvolvimento da mesma</em> podem indicar uma vantagem para os followers</li></ul><h4>Escute também =)</h4><p>A <a href="https://produtopelomundo.captivate.fm/">Produto pelo Mundo</a> entrevistou a alguns meses atrás o <a href="https://svpg.com/">Marty Cagan</a>, que dispensa apresentações obviamente, mas eu sempre gosto de referenciá-lo quando o tema é produto. Vale a pena ouvir de novo para quem já ouviu, e para quem ainda não ouviu, recomendo. O conteúdo é muito bom!</p><p><a href="https://produtopelomundo.captivate.fm/episode/martycagan">https://produtopelomundo.captivate.fm/episode/martycagan</a></p><p>Em tempo, saiu recentemente uma <a href="https://www.amazon.com.br/Inspirado-criar-produtos-tecnologia-clientes/dp/8550813826">versão em português do Inspired</a>, que tive o prazer de participar, junto com uma equipe fantástica do time de produtos digitais da Accenture, na revisão técnica do conteúdo. Foi trabalhoso, mas o resultado foi gratificante porque ajuda a avançar um pouco mais a agenda de produtos no Brasil.</p><ul><li>Agradecimentos pela revisão técnica junto comigo: <a href="https://www.linkedin.com/in/guzgontijo/">Gustavo Gontijo</a>, <a href="https://www.linkedin.com/in/jessicapanhoca/">Jessica Panhoca</a>, <a href="https://www.linkedin.com/in/lucianashinohara/">Luciana Shinohara</a>, <a href="https://www.linkedin.com/in/mohamadjameh/">Mohamad Jameh</a>, <a href="https://www.linkedin.com/in/renata-dias-dos-anjos-2b542619/">Renata Dias</a>, <a href="https://www.linkedin.com/in/monteirorenato/">Renato Monteiro</a>, <a href="https://www.linkedin.com/in/theofranca/">Theo França</a>.</li></ul><p>É isso! Ficou alguma dúvida ou tem algo a dizer? Aproveite os campos de comentários. Até a próxima!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c0eb572c1994" width="1" height="1" alt=""><hr><p><a href="https://medium.com/digitalproductsdev/converg%C3%AAncia-estrat%C3%A9gica-em-produtos-digitais-c0eb572c1994">Convergência estratégica em produtos digitais</a> was originally published in <a href="https://medium.com/digitalproductsdev">Accenture Digital Product Dev</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[[NextStack] Por que Flutter?]]></title>
            <link>https://medium.com/digitalproductsdev/haiaku-porque-flutter-18609d38a80c?source=rss----4dea97c2fcfb---4</link>
            <guid isPermaLink="false">https://medium.com/p/18609d38a80c</guid>
            <category><![CDATA[nextstack]]></category>
            <category><![CDATA[artigos]]></category>
            <category><![CDATA[flutter]]></category>
            <dc:creator><![CDATA[Pedro Correa]]></dc:creator>
            <pubDate>Wed, 08 Jun 2022 12:26:11 GMT</pubDate>
            <atom:updated>2022-06-08T12:26:11.717Z</atom:updated>
            <content:encoded><![CDATA[<h4>Já escolhemos a linguagem para API, agora é hora de olhar para o framework</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*3erzYa8jpHrOjDZy" /><figcaption>Photo by <a href="https://unsplash.com/@f12r?utm_source=medium&amp;utm_medium=referral">Fahim Muntashir</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Nossa intenção criando o NextStack é criar uma stack de desenvolvimento rápido, que consiga não só prototipar projetos, mas também entregá-los com ótimo desempenho e excelente qualidade de código.</p><p>Exatamente para reduzir custo e tempo, estamos deixando de lado o desenvolvimento nativo. Não por ser pior ou melhor, mas por não contribuir com a agilidade de desenvolvimento mantendo o custo baixo.</p><p>Neste post, vamos fazer algumas reflexões rápidas para a escolha desse framework (Flutter) em comparação com os demais.</p><h4>Popularidade</h4><p>Existe uma série de frameworks que atendem esse paradigma multiplataforma, porém os mais populares são o ReactNative e o Flutter.</p><p>Flutter está em um crescimento acelerado ano a ano e canibalizando parte do mercado do ReactNative exatamente por resolver problemas que o ReactNative não estava conseguindo resolver em tempo hábil.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3mRgt_kKc4_ncVlTYdHeyA.png" /><figcaption>Image Source: <a href="https://www.statista.com/statistics/869224/worldwide-software-developer-working-hours/">Statista</a></figcaption></figure><p>O grande problema com ReactNative é a forma com que os pacotes finais são criados. Esse resultado é realmente compilado e otimizado com componentes nativos, mas esse processo é uma transpilação que resulta em um código final diferente do que foi criado.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zYMjdZqVRmlhDm4Zx4VhzA.png" /></figure><p>Com isso, temos o problema que de fato não temos uma base de código única e sim uma base de código que é transpilada para múltiplas plataformas. Por isso, a manutenção do ReactNative é algo a se analisar relato a relato. A performance também é algo que varia bastante com o dispositivo e o OS nos quais você está executando. Além disso, até mesmo os componentes gráficos variam, pois eles utilizam os componentes nativos do OS e não os que foram usados no desenvolvimento.</p><h4>Por que Flutter?</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*H2z2VGAQ3jR0DFPr6Csczg.png" /></figure><p>Flutter tem o funcionamento diferente. Ele é parecido com uma engine de jogos que te dá um motor base (SKIA) e nele você realmente executa o mesmo código em todas as plataformas. O Flutter garante a consistência do motor em todas as plataformas e você apenas se preocupa com o código.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*32V1fermwgaOaSaE.png" /></figure><h4>Supporte e Ferramentas</h4><p>Flutter também vem com uma gama de ferramentas para desenvolvimento. Um recurso que parece simples e bobo e vejo poucos comentários é seu suporte web integrado.</p><p>Com isso, apenas com o Flutter e o Chrome você consegue começar a desenvolver um aplicativo que depois pode ser compilado para iOS ou Android. Ou seja, para começar uma prototipagem e fazer experimentos não é necessário baixar grandes SDKs do XCode ou do Android Studio com emuladores pesados e lentos. Apenas um VSCode, Chrome e o SDK do Flutter. Leve, simples e direto.</p><ul><li>Hot Reload</li><li>Ambiente replicável, consistente e leve para desenvolvimento</li><li>Linguagem 100% tipada, o que evita erros de runtime</li><li>Auto Complete como Intelisense em vários IDEs</li></ul><h4>REALMENTE multiplataforma</h4><p>Diferente do ReactNative, que tem o foco em aplicativos mobile, o Flutter foi criado para rodar em qualquer ambiente, seja celular, desktop e até mesmo um navegador.</p><p>Com isso, temos a flexibilidade absoluta de criar uma aplicação móvel otimizada para iOS ou Android e disponibilizar a mesma aplicação em um formato web móvel (sem precisar baixar o app, via navegador) ou desktop!</p><p>Imagine uma aplicação de planilha muito pesada que você pode compilar para desktop e ter toda a vantagem de execução nativa no seu computador?</p><h4>WASM</h4><p>Uma última cartada do Flutter é o seu suporte prévio ao WASM. Devido a sua arquitetura, com um motor por debaixo do framework, é possível que esse motor seja otimizado para novas tecnologias como WASM que executa o codigo arbitrário com performance similar à nativa no navegador.</p><p>As possibilidades disso são infinitas. Como no exemplo da aplicação que carrega planilhas e tem grande processamento, com WASM nem sequer precisaríamos que o usuário baixasse o aplicativo, ele rodaria nativamente no navegador com performance máxima!</p><h4>Dart</h4><p>Um dos grandes trunfos ocultos do Flutter é sua linguagem praticamente dedicada chamada Dart. Sua vantagem sobre um ReactNative que utiliza Javascript é a orientação a objetos e ser fortemente tipada em simultâneo, flexível.</p><p>Como tudo no Flutter são objetos passados para frente, é possível em tempo de código descobrir problemas bobos de tipagem e de implementação de interfaces além, é claro, de evitar esses problemas em runtime, coisas que Javascript tem evoluído com Typescript mas ainda é pouco adotado em aplicações mobile.</p><p>Além disso, Javascript já se consolidou como uma solução não performática para aplicativos em ReactNative em celulares pouco potentes devido ao seu grande <em>overhead</em> de execução. A comunidade se esforça muito criando novas formas de otimização estendendo o Javascript com novas funcionalidades como o <em>ahead-of-time</em> para diminuir o tempo de loading, mas mesmo assim essas ações podem ser consideradas paleativas e não uma escolha de arquitetura robusta.</p><h4>Performance e Otimização</h4><p>Atualmente, o Flutter usa SKIA como seu motor base. Porém, no futuro, é possível que esse motor evolua para tecnologias mais modernas, permitindo ainda mais performance sem a necessidade de mudança da base de código das aplicações. Esse processo é bem usual no mundo dos jogos, no qual novas engines mais otimizadas sempre são lançadas. Apenas atualizando o motor, são grandes os ganhos de performance.</p><p>Outro ponto importante é que devido à arquitetura do motor do Flutter podemos receber atualizações que melhorem a performance, tamanho final do pacote APK/APP e etc. apenas atualizando a versão.</p><p>O Flutter tem como foco oferecer aplicativos que rodem em 60fps e até mesmo 120fps para novos celulares com telas de mais <em>refresh rate</em>.</p><p>Novamente todas essas preocupações de performance são centralizadas e unificadas no motor que recebe melhorias não só do Google como da comunidade <em>opensource</em>.</p><h4>Bala de Prata?</h4><p>Todos os argumentos que levantamos nos convenceram que o Flutter pode ainda não ser uma bala de prata devido a ser uma tecnologia tecnicamente ainda emergente.</p><p>Porém, acreditamos que tenha o potencial de resolver uma grande quantidade de problemas em desenvolvimento de aplicativos de vários tipos. Uma prova disso é o uso do Flutter por parte da Canonical no instalador do seu sistema operacional Ubuntu.</p><h4>Conclusão</h4><p>O Flutter atende todas as nossas expectativas de uma tecnologia REALMENTE cross-plataform permitindo criarmos até aplicações nativas desktop com performances incríveis além de possuir toda uma comunidade de ferramentas para desenvolvimento e um futuro não só ao nível de comunidade e novas bibliotecas, mas também ao nível tecnológico. Incrível!</p><p>ReactNative pode ser considerada uma plataforma mais antiga e consolidada, porém quando paramos para analisar seu funcionamento vemos falhas grandes na arquitetura que limitam o crescimento (ReactNative pouco mudou nos últimos anos).</p><p>Temos certeza que ainda faremos grandes descobertas sobre esse framework e vamos compartilhá-las no futuro.</p><h3>Referências</h3><ul><li><a href="https://medium.com/neoxia/pwa-vs-flutter-vs-react-native-vs-native-dc06a17ebf1a">PWA vs. Flutter vs. React Native vs. Native</a></li><li><a href="https://medium.com/flutter-community/top-10-reasons-flutter-is-better-for-your-app-development-30d50e345b29">Top 10 Reasons Flutter Is Better For Your App Development</a></li><li><a href="https://medium.com/pinch-nl/why-im-choosing-flutter-in-2022-9c5093c1231f">Why I’m choosing Flutter in 2022</a></li><li><a href="https://www.cleveroad.com/blog/why-use-flutter">Why Use Flutter for Building Cross-Platform Apps?</a></li><li><a href="https://blog.codemagic.io/flutter-vs-electron/">Flutter desktop vs Electron: Why to choose Flutter for your next desktop app | Codemagic Blog</a></li><li><a href="https://www.thedroidsonroids.com/blog/flutter-vs-react-native-what-to-choose-in-2021">Flutter vs React Native - What to Choose in 2022?</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=18609d38a80c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/digitalproductsdev/haiaku-porque-flutter-18609d38a80c">[NextStack] Por que Flutter?</a> was originally published in <a href="https://medium.com/digitalproductsdev">Accenture Digital Product Dev</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[[NextStack] Por que Golang?]]></title>
            <link>https://medium.com/digitalproductsdev/haiaku-porque-golang-d6711d841a33?source=rss----4dea97c2fcfb---4</link>
            <guid isPermaLink="false">https://medium.com/p/d6711d841a33</guid>
            <category><![CDATA[linguagens-de-programação]]></category>
            <category><![CDATA[golang]]></category>
            <category><![CDATA[artigos]]></category>
            <dc:creator><![CDATA[Pedro Correa]]></dc:creator>
            <pubDate>Thu, 02 Jun 2022 12:41:17 GMT</pubDate>
            <atom:updated>2022-06-02T12:41:17.655Z</atom:updated>
            <content:encoded><![CDATA[<h4>Uma série de artigos sobre a iniciativa NextStack, que pretende gerar conhecimento de tecnologias de forma empírica</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*-e7-2YDxfa6GpuTG" /><figcaption>Photo by <a href="https://unsplash.com/@bruno_nascimento?utm_source=medium&amp;utm_medium=referral">Bruno Nascimento</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Começamos hoe uma série de posts para ilustrar e defender uma iniciativa chamada de NextStack, que tem por objetivo gerar conhecimento de forma empírica. Como esses posts são preliminares, também vamos usar outras referências na literatura para validar nossos preconceitos.</p><h4>Haiaku</h4><p>Haiaku é o nome do <em>pet project</em> que vamos criar para adquirir capacidade técnicas nas tecnologias escolhidas. O projeto é uma aplicação web/mobile que consome uma API com ferramentas para desenvolvimento ágil.</p><p>A intenção desse é criar cenários reais de desenvolvimento de software para que consigamos gerar conhecimento das tecnologias de forma empírica. Esse conjunto de tecnologias que vamos utilizar estamos chamando de <em>NextStack</em>.</p><h4>NextStack</h4><p>Para desenvolver o Haiaku precisamos de uma stack sólida de tecnologias para criar tanto o back-end quando front-end. No back-end precisamos criar uma API para dar suporte ao aplicativo web/mobile, e, para isso, precisamos, por sua vez, de uma linguagem de programação robusta.</p><p>O termo robusto é muito vago e por isso criamos a seguinte lista de itens que precisamos avaliar:</p><ul><li>[ ] Comunidade</li><li>[ ] Aprendizado Rápido</li><li>[ ] Desenvolvimento Rápido</li><li>[ ] Escalável</li><li>[ ] Baixo uso de RAM</li><li>[ ] Tempo de Processamento</li><li>[ ] Ferramentas</li></ul><p>A seguir, vamos discutir cada um desses itens:</p><h4>Suporte e Comunidade</h4><p>De nada adianta escolhermos uma linguagem com uma comunidade morta. Sem uma comunidade, a resolução de problemas se torna mais difícil e a evolução do ecossistema e manutenção da linguagem é lenta ou inexistente.</p><p>Na lista abaixo temos as linguagens mais populares do <a href="https://insights.stackoverflow.com/survey/2021">StackOverflow em 2021</a>. Vamos usá-la como ponto de partida para selecionar linguagens populares, que é um bom indicativo de uma comunidade ativa.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*5a17ONA0_wNiKV0H" /></figure><p>Se fizermos uma limpeza das linguagens que não servem para criar backends (html, CSS, etc) e agruparmos algumas linguagens temos a seguinte lista:</p><ul><li>JS/Node/Typescript</li><li>Python</li><li>Java</li><li>C#/C++/C</li><li>Go</li><li>Rust</li></ul><p>Javascript pode ser considerado parte do “Current Stack” dos projetos que mais tenho visto sair aqui nos times de produtos digitais da Accenture. Ela é uma linguagem fácil de aprender, popular e funciona tanto para back quanto front-end.</p><p>Apesar disso, Javascript não é uma linguagem <em>bala de prata</em> e possui seus problemas, como grande consumo de memória e baixa performace comparada a outras linguagens mais “modernas”.</p><p>Outro problema é a tendência natural dos projetos Javascript ficarem “caóticos”. Apesar do JS ter amadurecido para projetos grandes, principalmente com a criação do Typescript, no fim do dia o Typescript nada mais é que arquivo JS e ele vai sofrer dos mesmos problemas fundamentais.</p><p>Por ser considerado parte do “Current Stack”, vamos usar JS como referência para as comparações a seguir.</p><h4>Uso de recursos e Performance</h4><p>Nesse projeto queremos utilizar uma arquitetura <em>Serverless</em> afim de simplificar nossa infraestrutura cloud ao mesmo tempo em que reduzimos custo e delegamos (boa parte) a responsabilidade de disponibilidade para o <em>cloud provider.</em></p><p>Uma arquitetura <em>Serverless</em> se beneficia grandemente de execuções rápidas e pouco uso de memória RAM, que influenciam diretamente no custo da aplicação. Por isso precisamos de uma linguagem rápida, leve e performática. Dito isso, mesmo que não fôssemos usar <em>Serverless</em> a escolha da linguagem se mantém válida pelos mesmos motivos.</p><p>Para comparar esses valores usamos o site <a href="https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/go-node.html">Benchmark Game</a> que compara múltiplos algoritmos rodando em múltiplas linguagens dizendo dentre outras coisas o tempo de execução e de memória. Não consideramos isso uma forma ideal de comparação de linguagens mas é um excelente ponto de partida.</p><p>Pelos dados do site conseguimos eliminar algumas linguagens que ficam consideravelmente atrás de um segundo grupo mais performático. Com isso temos a seguinte lista filtrada:</p><ul><li>C#/C++/C</li><li>Go</li><li>Rust</li></ul><p>A eliminação de certa forma é meio óbvia: removemos JavaScript, Python e Java. Linguagens compiladas (quase) sempre são mais performáticas que linguagens interpretadas. Java em especial é infamemente conhecida por comer mais RAM do que o Chrome e conseguimos ver isso nas execuções do <a href="https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/javascript.html">Benchmark Game.</a></p><p>Algumas comparações que merecem destaque são <a href="https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/go-node.html">Go vs JavaScript</a>, na qual podemos ver que em alguns casos Go mostra até 30x menos uso de RAM e até 2x menos tempo de execução em alguns casos. O resultado comparado a Python e Java se mantém na mesma magnitude.</p><p>Comparando <a href="https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/go-rust.html">Go com Rust</a> vemos que Rust tem ainda menos uso de RAM com execução até 3x mais rápida. Esse pulo incremental de performance vem com o custo de uma linguagem mais complexa e com maior curva de aprendizado. Por sua vez, <a href="https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/rust-gpp.html">Rust comparado com C</a> se mantém próximo da família C.</p><h4>Aprendizado e Desenvolvimento Rápidos</h4><p>A família de linguagens C são globalmente consideradas difíceis de aprender e mais ainda de ter maestria. Por isso, vamos removê-la logo de cara e, assim, restam apenas Rust e Go.</p><p>Confesso que gostaria de uma oportunidade para aprender mais Rust, porém, como consultoria, precisamos entender o cenário econômico-social em que as linguagens se encontram.</p><p>Em resumo: faltam profissionais de TI, logo precisamos de uma linguagem de fácil acesso que permita que novos desenvolvedores aprendam de forma rápida. Além disso, <em>time-to-market</em> é uma variável cada vez mais crítica, então precisamos de uma linguagem que permita desenvolvimento rápido.</p><p>Considerando as duas linguagens restantes, Go ganha no quesito de velocidade de aprendizado e desenvolvimento. Na verdade esse é um ponto de grande divergência entre as linguagens. Go preza pela <a href="https://bitfieldconsulting.com/golang/tao-of-go">simplicidade e quase minimalismo</a>, enquanto que Rust possui uma quantidade de ferramentas que muitos desenvolvedores se sentem até <em>overwhelmed.</em></p><h4>Escabilidade</h4><p>Por se tratar de uma linguagem que será usada para criar uma API precisamos que ela seja capaz de escalar, ou seja, de atender uma crescente quantidade de pedidos em um tempo determinado.</p><p><a href="https://stressgrid.com/blog/benchmarking_go_vs_node_vs_elixir/">Neste link</a> temos um comparativo entre Elixir, Go e Nodejs na visão de escalabilidade e quantidade de chamadas de API e Rede. Nele, vemos que Elixir e Go se comportam de forma muito parecida, mas Nodejs fica a desejar em alguns pontos, como o tempo de latência.</p><p>Uma das comparações mais interessantes para este tópico é o gráfico abaixo:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*lSTqyytI_B3oW3lY" /></figure><p>Nele podemos ver que Go e Elixir se mantêm extremamente próximos ao tempo de resposta de 100ms de <em>timeout</em> imposto na aplicação. Isso é mais que 75% menor que a do Nodejs. Também é importante vermos que não só a média é menor como também se mantém super estável ao longo da execução, ou seja, o tempo de resposta do Go é mais consistente, o que indica que o processo roda com mais “folga” que o do Nodejs.</p><h4>Ferramentas</h4><p>Um último ponto vital é o ecossistema e ferramentas disponíveis para as linguagens. Comparado com JavaScript, o Go e o Rust possuem bem menos ferramentas disponíveis, porém as que existem já garantem um ecossistema robusto.</p><p>Dentre elas temos ferramentas nativas de gestão de pacotes, formatação de código e bibliotecas nativas para uma vasta quantidade de problemas.</p><h4>Conclusões iniciais</h4><p>Não foi nossa intenção comparar à exaustão as linguagens disponíveis para o projeto. Neste post apenas tentamos levantar os pontos que consideramos mais importantes para nosso cenário, que apesar de específico engloba boa parte das soluções que trabalhamos. Se quiser saber mais detalhes, recomendo os links de referência no final do post.</p><p>No final, Go atende todos os nossos requisitos previamente listados e vamos é por isso que vamos usá-la para criação da API. Fiquem ligados que logo tem mais posts sobre nossa experiência prática no uso da linguagem para criação de APIs. Até lá!</p><h3>Referências</h3><ul><li><a href="https://insights.stackoverflow.com/survey/2021">Stack Overflow Developer Survey 2021</a></li><li><a href="https://bitfieldconsulting.com/golang/rust-vs-go">Rust vs Go in 2024 - Bitfield Consulting</a></li><li><a href="https://bitfieldconsulting.com/golang/tao-of-go">The Tao of Go - Bitfield Consulting</a></li><li><a href="https://hackernoon.com/aws-lambda-go-vs-node-js-performance-benchmark-1c8898341982">AWS Lambda Go vs. Node.js performance benchmark: updated 🔥 | HackerNoon</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d6711d841a33" width="1" height="1" alt=""><hr><p><a href="https://medium.com/digitalproductsdev/haiaku-porque-golang-d6711d841a33">[NextStack] Por que Golang?</a> was originally published in <a href="https://medium.com/digitalproductsdev">Accenture Digital Product Dev</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introdução ao Terraform]]></title>
            <link>https://medium.com/digitalproductsdev/introdu%C3%A7%C3%A3o-ao-terraform-pt-1-d9c5d3f46894?source=rss----4dea97c2fcfb---4</link>
            <guid isPermaLink="false">https://medium.com/p/d9c5d3f46894</guid>
            <category><![CDATA[terraform]]></category>
            <category><![CDATA[nginx]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[begginer]]></category>
            <category><![CDATA[artigos]]></category>
            <dc:creator><![CDATA[Alexandre Ponte]]></dc:creator>
            <pubDate>Wed, 01 Jun 2022 12:15:56 GMT</pubDate>
            <atom:updated>2022-06-01T12:15:56.536Z</atom:updated>
            <content:encoded><![CDATA[<h4>Começando do início</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-QQ47RAUZuS_7HAHl8yZnw.png" /></figure><h4>O que é o Terraform?</h4><p>O <a href="https://www.terraform.io/">Terraform</a> é uma ferramenta para construir, alterar e configurar uma infraestrutura. Isso pode ser feito tanto localmente quanto remoto, e hoje o Terraform trabalha com os principais Cloud Providers do mercado. Se você quiser conferir essa lista,<strong> </strong><a href="https://registry.terraform.io/browse/providers">é só clicar aqui</a>.</p><p>Neste post, além de apresentar o Terraform, vamos fazer também um pequeno hands-on para você que está tendo o primeiro contato com a ferramenta. Para isso, vamos utilizar a AWS como Cloud Provider, que possui um nível gratuito (<a href="https://aws.amazon.com/pt/free/?all-free-tier.sort-by=item.additionalFields.SortRank&amp;all-free-tier.sort-order=asc&amp;awsf.Free%20Tier%20Types=*all&amp;awsf.Free%20Tier%20Categories=*all"><strong>free tier</strong></a>) para até 12 meses de uso de alguns de seus recursos com limites pré-estabelecidos, mas o suficiente para o que vamos ensinar hoje. Então vamos?</p><p>Para nos comunicarmos com a AWS, vamos precisar de duas chaves: <em>aws_access_key</em> e <em>aws_secret_key. </em>Essas chaves são criadas por você durante a configuração de sua conta (<a href="https://docs.aws.amazon.com/pt_br/rekognition/latest/dg/setting-up.html">link</a>) e elas devem ser configuradas em seu computador utilizando o <a href="https://docs.aws.amazon.com/pt_br/cli/latest/userguide/install-cliv2.html"><strong>aws-cli</strong></a><strong>.</strong></p><h4>Mãos à obra!</h4><p>Crie um diretório para trabalhar e, dentro dele, crie os seguintes arquivos:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/aa116ed7e8fafeb1f6073a2e8cc94c3a/href">https://medium.com/media/aa116ed7e8fafeb1f6073a2e8cc94c3a/href</a></iframe><p>No arquivo <em>main.tf </em>, vamos incluir o nosso provider <a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs"><em>AWS</em></a><em>.<br></em>Estamos declarando também onde nossa infraestrutura será provisionada:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f461fa20d781aba9bb4e9cfd683d6810/href">https://medium.com/media/f461fa20d781aba9bb4e9cfd683d6810/href</a></iframe><p>Para saber mais sobre Regiões e zonas de disponibilidade, <a href="https://aws.amazon.com/pt/about-aws/global-infrastructure/regions_az/">clique aqui</a>.<br>E aqui tem um exemplo de como o provider é declarado:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/1dff9ff8b50fa834a341a9ba8f7a31b2/href">https://medium.com/media/1dff9ff8b50fa834a341a9ba8f7a31b2/href</a></iframe><h4>Agora vamos falar um pouco sobre cada arquivo</h4><p>No arquivo <strong><em>ec2.tf</em></strong> vamos declarar a nossa instância (instance_type). A t2.micro está dentro do <a href="https://aws.amazon.com/pt/free/?all-free-tier.sort-by=item.additionalFields.SortRank&amp;all-free-tier.sort-order=asc&amp;awsf.Free%20Tier%20Types=*all&amp;awsf.Free%20Tier%20Categories=*all"><em>free tier</em></a>, e estamos citando o script.sh que vai instalar o nginx.</p><p>Aqui também citamos o security group, que vai se comportar como um firewall para a nossa instância, liberando apenas as portas necessárias.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e1188ded7c59694ba93d9bfde6cf4e34/href">https://medium.com/media/e1188ded7c59694ba93d9bfde6cf4e34/href</a></iframe><p>Abaixo, o conteúdo do arquivo script.sh</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/5e1166fe175126953e0b28fa080ec1b7/href">https://medium.com/media/5e1166fe175126953e0b28fa080ec1b7/href</a></iframe><p>O <strong><em>output.tf </em></strong>utilizamos para que no final da execução do nosso código nos seja apresentada alguma informação desejada.</p><p>No caso, aqui será uma url para acessarmos a instância via browser.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c834290bfd260f638546e837c112c5c7/href">https://medium.com/media/c834290bfd260f638546e837c112c5c7/href</a></iframe><p>Por meio do <strong><em>security-group.tf,</em></strong> declaramos as portas abertas de entrada e saída. Também podemos limitar esses acessos via ip.</p><p>Estamos utilizando variável, e caso precise alterar o ip de acesso, alteramos em apenas um lugar.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/43b200f72a84f61239cdcb8d5599ea64/href">https://medium.com/media/43b200f72a84f61239cdcb8d5599ea64/href</a></iframe><p>As variáveis citadas acima serão declaras no arquivo <strong><em>vars.tf</em></strong>.<br>Não se esqueça de incluir o seu <em>ip </em>para poder acessar.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/053a95ee44872360b399572ae6e92a1c/href">https://medium.com/media/053a95ee44872360b399572ae6e92a1c/href</a></iframe><h4><strong>Sobre os comandos que vão ser executados</strong></h4><p><a href="https://www.terraform.io/docs/cli/commands/fmt.html"><strong><em>terraform fmt</em></strong></a> vai verificar a sintaxe do seu código de acordo com a versão do Terraform que você esta utilizando.</p><p><a href="https://www.terraform.io/docs/cli/commands/init.html"><strong><em>terraform init</em></strong></a><strong><em> </em></strong>vai realizar diversas tarefas dentro do nosso diretório. Uma delas é baixar as informações necessárias para nos comunicarmos com a AWS. Ex:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/5014365bd4ccf468d22e373d13315a8f/href">https://medium.com/media/5014365bd4ccf468d22e373d13315a8f/href</a></iframe><p><a href="https://www.terraform.io/docs/cli/commands/plan.html"><strong><em>terraform plan</em></strong></a> aqui criamos um plano de execução e podemos ver o que o terraform vai criar. No final do plano apresentado será exibida a seguinte informação:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f36d6272563fb6d300ca7aeaeb043e28/href">https://medium.com/media/f36d6272563fb6d300ca7aeaeb043e28/href</a></iframe><p><a href="https://www.terraform.io/docs/cli/commands/apply.html"><strong><em>terraform apply</em></strong></a> executamos o plano proposto no terraform apply. Digite <em>yes</em> quando a confirmação for solicitada.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/69abfe252528feb247b7b1c40c429427/href">https://medium.com/media/69abfe252528feb247b7b1c40c429427/href</a></iframe><p>Após a execução, receberemos o que foi proposto no arquivo <strong>output.tf</strong>.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/484200e61afb0b2a82da1e839a2c488f/href">https://medium.com/media/484200e61afb0b2a82da1e839a2c488f/href</a></iframe><p>Para testar, basta executar o comando:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/750ad116b7860f1af54b0d3b085dd4f1/href">https://medium.com/media/750ad116b7860f1af54b0d3b085dd4f1/href</a></iframe><p>Pronto! Agora vamos logar no console da AWS e verificar o que foi provisionado:</p><h4>Nossa EC2</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xHda7HdeBDe2wECuQD8ZVA.png" /></figure><h4>Nosso grupo de segurança</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bcwgg0bOyRIbnhVjxxPWGg.png" /></figure><p><a href="https://www.terraform.io/docs/cli/commands/destroy.html"><strong><em>terraform destroy</em></strong></a><strong><em> </em></strong>como o nome já diz, destruímos o que foi provisionado. O Terraform vai lhe informar o que será destruído e você precisa confirmar:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/650d7bae38986352af20e32236a476f9/href">https://medium.com/media/650d7bae38986352af20e32236a476f9/href</a></iframe><p>E é isso! <br>Se você quiser ver o código completo, o repositório está no <a href="https://github.com/alexandreponte2/terraform-ec2-nginx">Github</a>. E se você tiver alguma dúvida ou comentário, é só aproveitar os campos abaixo. Para trabalhar com um time que está se aprimorando a cada dia, <a href="https://www.linkedin.com/company/accenturebrasil/jobs/">é só dar uma olhada aqui</a> e se candidatar a uma de nossas vagas. Vamos aprender juntos!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d9c5d3f46894" width="1" height="1" alt=""><hr><p><a href="https://medium.com/digitalproductsdev/introdu%C3%A7%C3%A3o-ao-terraform-pt-1-d9c5d3f46894">Introdução ao Terraform</a> was originally published in <a href="https://medium.com/digitalproductsdev">Accenture Digital Product Dev</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[SwiftUI Property Wrappers Simplificado]]></title>
            <link>https://medium.com/digitalproductsdev/swiftui-property-wrappers-simplificado-531f7f50bcc1?source=rss----4dea97c2fcfb---4</link>
            <guid isPermaLink="false">https://medium.com/p/531f7f50bcc1</guid>
            <category><![CDATA[artigos]]></category>
            <category><![CDATA[property-wrapper]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[swiftui]]></category>
            <dc:creator><![CDATA[João Gabriel]]></dc:creator>
            <pubDate>Fri, 08 Apr 2022 18:37:51 GMT</pubDate>
            <atom:updated>2022-04-08T18:40:02.458Z</atom:updated>
            <content:encoded><![CDATA[<h4>Que tal entender de forma simplificada o significado e casos de uso dos Property Wrappers?</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sYrwfk6mmV9UShX15nF_Fg.jpeg" /></figure><p>Existem vários <strong><em>Property Wrappers</em></strong> usados para facilitar o desenvolvimento com SwiftUI. Neste tutorial vamos entender de forma simplificada o significado e o caso de uso do <a href="https://developer.apple.com/documentation/swiftui/state"><em>@State</em></a>, <a href="https://developer.apple.com/documentation/swiftui/stateobject"><em>@StateObject</em></a>, <a href="https://developer.apple.com/documentation/swiftui/environmentobject"><em>@EnvironmentObjec</em></a><em>t</em>, <a href="https://developer.apple.com/documentation/swiftui/observedobject"><em>@ObservedObject</em></a>, <a href="https://developer.apple.com/documentation/swiftui/binding"><em>@Binding</em></a>, e <a href="https://developer.apple.com/documentation/combine/published"><em>@Published</em></a><em> </em>(esse último do <em>Combine</em>).</p><h3>Fluxo de Estados e Informações</h3><p>O fluxo de informações dentro do App com SwiftUI influencia diretamente no comportamento da interface, pois a mesma sempre se adapta ao estado que estiver.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QRt1T0uQM3pJ_EqoEo4pBg.png" /><figcaption>Fluxo de estados dentro de um SwiftUI App.</figcaption></figure><p>Como podemos observar a <strong>View</strong> reage ao estado que possui. O <strong>estado</strong> por sua vez é alterado por uma ação. A <strong>ação</strong> pode ser gerada por um <strong>usuário</strong> que interage com a aplicação ou um <strong>evento externo</strong> que publica alterações (podendo ser algo assíncrono).</p><p>Abaixo vamos entender como podemos utilizar os property wrappers para lidar com os estados dentro de nossas aplicações:</p><h3>@State &amp; @Binding</h3><p>Podemos entender de uma forma prática que ambos <em>@State</em> &amp; <em>@Binding</em>, são dedicados a armazenar e referenciar valores respectivamente. A diferença entre esses tipos se dá na forma como referenciam a informação:</p><ul><li><strong><em>@State</em></strong> = Propriedade que contem (é dona) do valor em si. Possui um valor atribuído diretamente a ela.</li><li><strong><em>@Binding</em></strong> = Referência (e assiste) uma instância atribuída. Esse tipo de variável, por ser uma referência, possui o comportamento de retornar o valor da variável original atribuída e ao mesmo tempo propagar alterações para a variável original.</li></ul><p>Ambas variáveis declaradas como <em>@State</em> &amp; <em>@Binding</em>, <strong>podem influenciar no comportamento da <em>View</em> em que estiverem declaradas</strong>.</p><p>Vamos verificar alguns exemplos:</p><h4>Exemplo prático: Comunicação entre 2 <em>Views na mesma tela</em></h4><p>Vamos verificar na prática, utilizando 2 <em>Views</em> que representam um sistema contador de números inteiros. Essas 2 <em>Views</em> vão representar:</p><ul><li><strong>View Status do Contador:</strong> Mostra o número total atual e possui uma outra View (<strong>View Ação do Contador</strong>).</li><li><strong>View Ação do Contador:</strong> Possui um botão para aumentar o número inteiro. Possui um fundo azul (apenas com objetivo didático, para deixar visível a área dessa <em>View</em>).</li></ul><p>Abaixo podemos ver o exemplo funcionando na prática:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/298/1*-yyeK4Z7j7ItVzkYFzjyjA.gif" /><figcaption>Exemplo de contador.</figcaption></figure><p>Como podemos ver, nessa <strong><em>View</em></strong> principal temos um texto com o total, seguido de uma outra <strong><em>View</em></strong> filha (com fundo azul) contendo o botão para incrementar o contador. Visualizando as estruturas das duas Views separadamente temos o seguinte:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/614/1*HB5H1KkbaAaml76IbwswRg.png" /><figcaption>Visualização das 2 <em>Views</em> separadamente.</figcaption></figure><p>O código da primeira <em>View</em> (<strong><em>CounterStatusView</em></strong>) que contem o status é o seguinte:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/b97d94467a7b774f258f7958f5f07393/href">https://medium.com/media/b97d94467a7b774f258f7958f5f07393/href</a></iframe><p>Referente a <strong><em>CounterStatusView</em></strong>, a variável do tipo <em>Int</em> com <em>Property Wrapper @State</em> é declarada na linha 7. Essa variável <strong>recebe um valor</strong> da propriedade de fato (no caso o inteiro 0). Essa <em>View</em> possui em sua estrutura vertical (<em>VStack</em>) os seguintes itens:</p><ul><li>Texto de título &quot;Counter&quot;</li><li>Texto informando o total &quot;Total is counter&quot; (sendo counter uma referencia a variável marcada como <em>@State</em>)</li><li>Uma <em>View</em> filha <strong><em>ConterActionView</em></strong> que recebe um parâmetro para assistir com um @Binding referenciando a variável @State. O binding é passado como parâmetro utilizando o &quot;$&quot; na frente da variável, simbolizando que é apenas uma referencia a variável.</li></ul><p>O código da <em>View</em> filha (<strong><em>CounterActionView</em></strong>) é o seguinte:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e3430840c5756a155d5cda88d24504e0/href">https://medium.com/media/e3430840c5756a155d5cda88d24504e0/href</a></iframe><p>Na <strong><em>struct CounterActionView</em></strong>, podemos observar que a variável <strong><em>counter</em></strong> do tipo <em>Int</em> é declarada na linha 7, possuindo o <em>Property Wrapper @Binding</em>. Dessa forma essa variável passa a ser uma referência, ou seja, um observador da variável passada a essa <em>View</em> em sua inicialização. A referência a variável será obrigatória no momento de inicialização da <em>View</em> (como na linha 27 dentro do <em>preview </em>onde é passado uma constante apenas para visualizar).</p><h4><strong>Exemplo prático: Comunicação entre 2 Views em telas diferentes</strong></h4><p>Vamos verificar na prática, utilizando como exemplo a comunicação entre 2 telas que representam um sistema de ativação:</p><ul><li><strong>Tela de Status: </strong>Mostra se o estado é ativado ou não e um botão para a tela de gerenciamento do status.</li><li><strong>Tela de Gerenciamento do Status:</strong> Mostra uma botão para alterar o status e um outro botão para voltar.</li></ul><p>Abaixo podemos ver o exemplo funcionando na prática:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*PE3g-5uLNlWvDYgbwdXzVw.gif" /><figcaption>Exemplo de um sistema de ativação.</figcaption></figure><p>O código da primeira tela, que mostra o status da ativação é o seguinte:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ad110d04a2523a71072cf9bc2c11b832/href">https://medium.com/media/ad110d04a2523a71072cf9bc2c11b832/href</a></iframe><p>O resultado visual da <strong><em>ActivationStatusView </em></strong>é o segunite:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/550/1*AEBAAnjLJyC24vNfLe2SEw.png" /><figcaption>Preview da <strong><em>ActivationStatusView</em></strong></figcaption></figure><p>O resultado da <strong><em>ActivationStatusView</em></strong> é uma view que varia de acordo com o status da variável booleana <strong><em>isActivated </em></strong>que possui o property wrapper <em>@State</em> (declarada na linha 7) da seguinte forma:</p><ul><li>Quando <strong><em>isActivated</em></strong> é verdadeiro: O texto apresenta &quot;Status: ON&quot; e o circulo fica verde.</li><li>Quando <strong><em>isActivated</em></strong> é falso: O texto apresenta &quot;Status: OFF&quot; e o circulo fica vermelho.</li></ul><p>Além disso ao clicar em <strong><em>Change</em></strong>, o botão altera o valor de <strong><em>isShowingSheet</em></strong>, que por sua vez apresenta a tela <strong><em>ActivationManagerView</em></strong>, que vamos ver em seguida:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c3b663eb9761b77a96cbe56e034f1d5c/href">https://medium.com/media/c3b663eb9761b77a96cbe56e034f1d5c/href</a></iframe><p>O resultado visual da <strong><em>ActivationManagerView </em></strong>é o segunite:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/178/1*Tr8ed8Hx73898Bx4tkzHQA.png" /><figcaption>Preview da <strong><em>ActivationManagerView</em></strong></figcaption></figure><p>O resultado da <strong><em>ActivationManagerView</em></strong> é uma view que varia de acordo com o status da variável booleana <strong><em>isActivated </em></strong>que possui o property wrapper <em>@Binding</em> (declarada na linha 7) que esta observando a variável do tipo @State declarada na tela anterior (<strong><em>ActivationStatusView</em></strong>) da seguinte forma:</p><ul><li>Quando <strong><em>isActivated</em></strong> é verdadeiro: O botão apresenta o texto “Update to OFF”.</li><li>Quando <strong><em>isActivated</em></strong> é falso: O botão apresenta o texto “Update to ON”.</li></ul><p>Ao clicar no botão <strong><em>Update to ON</em></strong>, o botão altera o valor de <strong><em>isActivated</em></strong>, que por sua vez é apenas uma referência a variável @State declarada na tela anterior (<strong><em>ActivationStatusView</em></strong>).</p><h3>@StateObject &amp; @ObservedObject</h3><p>Esses dois Property Wrappers funcionam de forma semelhante aos explicados anteriormente. A diferença é que lidam com objetos customizados. Conforme criamos abstrações para nossa aplicação, podemos fazer que esses objetos sejam &quot;observáveis&quot;, permitindo outras <em>Views</em> referenciarem ele como um estado. Para tornar seu objeto &quot;observável&quot;, é necessário que ele esteja em conformidade com o protocolo <strong><em>ObservableObject</em></strong><em>.</em><strong><em> </em></strong>Dessa forma podemos observar as propriedades marcadas como <strong><em>@Published</em></strong> do nosso objeto. Vamos entender esses dois termos então:</p><ul><li><strong><em>@StateObject</em></strong> = Associado a variável que contem (é dona) da instância do objeto que conforma <strong><em>ObservableObject</em></strong>. Possui uma instância atribuída diretamente.</li><li><strong><em>@ObservedObject</em></strong> = Referência (e assiste) uma instância atribuída.</li></ul><p>Vejamos alguns exemplos abaixo:</p><h4>Exemplo prático: Comunicação entre 2 Views na mesma tela</h4><p>Vamos voltar ao nosso exemplo do sistema contador. Toda interface apresentada anteriormente vai se manter a mesma. Nesse caso para exemplificar o uso do <em>@StateObject </em>e<em> @ObservedObject</em> vamos criar uma nova classe que conforme com o protocolo <em>ObservableObject</em>.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/01541bd708e3421b1ee1279010ae4ed2/href">https://medium.com/media/01541bd708e3421b1ee1279010ae4ed2/href</a></iframe><p>A classe <strong><em>Something</em></strong> conforma com o protocolo <em>ObservableObject</em> e possui uma variável <em>@Published</em>. O funcionamento do @Published pode ser compreendido na documentação da Apple que diz que <strong><em>&quot;quando a propriedade mudar, ocorre uma publicação no block willSet da propriedade, significando que os observadores recebem um novo valor antes de ser de fato setado na propriedade&quot;</em></strong>.</p><blockquote>&quot;When the property changes, publishing occurs in the property’s willSet block, meaning subscribers receive the new value before it’s actually set on the property.&quot;</blockquote><p>Dessa forma podemos adaptar nosso projeto do contador para obter seus valores diretamente a partir do objeto do tipo <strong><em>Something</em></strong>. No caso da View que apresenta o status podemos implementar assim:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/07281a2a1949ce14a90acb87c14f7503/href">https://medium.com/media/07281a2a1949ce14a90acb87c14f7503/href</a></iframe><p>Podemos notar que na linha 3 a variável <strong><em>something</em></strong> possui a notação <em>@StateObject</em> e a instancia do objeto de fato, ou seja, essa variável é a dona da instância. Além disso, na linha 10 temos um acesso a propriedade <strong><em>counter</em></strong> que está dentro de <strong><em>something</em></strong>. Na linha 11 o objeto esta sendo passada como parâmetro da inicialização da <em>View</em> interna de ação que contém o botão.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/663ee6f4f660e4c7aff81acccb4888fd/href">https://medium.com/media/663ee6f4f660e4c7aff81acccb4888fd/href</a></iframe><p>Na classe de ação do sistema contador temos na linha 3 uma variável <em>@ObservedObject</em> que é tipada e sem um valor, pois esta será a variável que vai referenciar o objeto <strong><em>Something</em></strong> que receber por parâmetro em sua inicialização. Podemos observar que na linha 10 a propriedade counter é acessada de dentro da something e na linha 7 é alterado o valor da variável interna <strong>counter</strong> de <strong><em>Something</em></strong>.</p><p>É possível também de forma alternativa utilizar a implementação da linha 8 (que esta comentada) executando o método de dentro do objeto Something, o que faz com que ele mesmo se atualize após um delay de 1 segundo (simulando um intervalo de tempo de uma requisição).</p><h4>Exemplo prático: Comunicação entre 2 Views em telas diferentes</h4><p>Vamos voltar ao nosso exemplo do sistema de ativação. Toda interface apresentada anteriormente vai se manter a mesma. Nesse caso para exemplificar o <em>@StateObject </em>e<em> @ObservedObject</em> vamos adaptar nossas Views para referenciar corretamente o nosso objeto <strong><em>ActiviationModel</em></strong> que conforma com <em>ObservableObject</em>.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/0529d317d5c40183728f4a03a9d32017/href">https://medium.com/media/0529d317d5c40183728f4a03a9d32017/href</a></iframe><p>Podemos observar que a variável <strong><em>isActivated</em></strong> agora esta dentro da classe que conforma com <em>ObservableObject</em> e possui <em>@Published,</em> que vai funcionar para notificar todas referencias dessa instancia quando seu valor for alterado.</p><p>Adaptado nossa <em>View</em> de status para receber esse novo modelo temos o seguinte resultado:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f3284f721c09024487c1d5aac0a9f277/href">https://medium.com/media/f3284f721c09024487c1d5aac0a9f277/href</a></iframe><p>Na linha 3 que utilizamos o Property Wrapper @StateObject pois essa variável esta lidando com um objeto que conforma com o protocolo ObservableObject. Além disso podemos ver que essa variável recebe de fato a instância do objeto.</p><p>A adaptação da <em>View</em> de ação para alterar o status de ativação utilizando objeto que conforma <em>ObservableObject</em> fica assim:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/3ca0960c070664d6539bc80f708a77e0/href">https://medium.com/media/3ca0960c070664d6539bc80f708a77e0/href</a></iframe><p>Nesse caso a variável <strong><em>model</em></strong> na linha 3 esta apenas referenciando um objeto que esta na tela anterior. Essa variável utiliza <em>@ObservedObject </em>por estar referenciando um objeto que conforma com <em>ObservableObject</em>. Dessa forma, sempre que houver alguma alteração na variável original, a variável observadora vai refletir as mudanças e consequentemente as <em>Views</em> vão reagir a esse novo estado.</p><h3>@EnvironmentObject</h3><p>Esse tipo de PropertyWrapper também é utilizado para referenciar uma classe que conforma o protocolo ObservableObject… <strong>Mas qual a diferença?</strong></p><p>A diferença é que ao associar um environment object a uma <em>View</em>, <strong>esse objeto fica disponível dentro da hierarquia de views (da View que foi adicionado) para ser referenciado em qualquer uma das Views filhas, independente do nível</strong> em que a <em>View</em> filha estiver. A view que desejar utilizar o conteúdo, apenas deve criar uma variável utilizando <em>@EnvironmentObject</em> que seja do mesmo tipo do objeto passado para a pilha de Views. Podemos visualizar nesse esquema exatamente essa situação:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/984/1*Ch-gELze6Xop10AanXIDkg.png" /><figcaption>Exemplo didático para entendimento do funcionamento de um @EnvironmentObject.</figcaption></figure><p>Nesse caso vamos entender o que acontece em cada uma das <em>Views</em>:</p><ul><li><em>View </em>cinza possui a referencia para a instancia de um <em>ObservableObject</em>. A <em>View</em> cinza passou esse objeto para sua filha (a <em>View</em> azul) utilizando o método <em>environmentObject()</em>.</li><li><em>View</em> azul por sua vez não fez nada, nem mesmo referenciou o objeto.</li><li><em>View</em> amarela (filha da <em>View</em> azul) por estar na pilha de <em>Views</em>, recebeu também o objeto, mas no caso a <em>View</em> amarela referenciou o mesmo com o<em> @EnvironmentObject</em> e utilizou a instância.</li></ul><p>O código das 3 Views em sequencia é o seguinte:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/9f09dafd92bfa2c645c141d9d275ad6d/href">https://medium.com/media/9f09dafd92bfa2c645c141d9d275ad6d/href</a></iframe><p>Podemos observar que nesse caso a nossa View Azul (IntermidiateView) nem sequer referencia o objeto ObservableObject. Mesmo assim a View Amarela (ChildView) por estar na hierarquia de Views, consegue referenciar utilizando @EnvironmentObject na declaração da variável appModel (linha 30). Dessa forma verificamos que todas as Views que estiverem na pilha da View Azul (que recebeu esse objeto na linha 14) poderão referenciar se necessário o objeto.</p><h3>Boas práticas</h3><p>Observe muito bem os casos para usar de forma conveniente esses tipos de Property Wrappers. Se for referenciar em poucos níveis (2 níveis) de Views, podemos aproveitar bem o @StateObject e @ObservedObject. Mas se for necessário referenciar um objeto a 2 níveis ou mais abaixo da View atual pode ficar cada vez mais difícil lidar com @StateObject e @ObservedObject pois seria necessário ficar passando o objeto de View para View… Nesse caso seria interessante considerar a utilização de @EnvironmentObject, que torna mais pratico lidar com esses objetos em 2 níveis ou mais.</p><h3>Conclusão</h3><p>Podemos aproveitar muito esses métodos de comunicação entre Views, seja na mesma tela ou em telas diferentes. Mas devemos sempre ficar atentos as boas práticas de utilização para aproveitar as ferramentas corretas nos casos de usos corretos e evitar assim trabalhos desnecessários e ter um código cada vez mais limpo.</p><h3>Referências</h3><ul><li><a href="https://developer.apple.com/documentation/swiftui/state-and-data-flow">Apple Documentation State and Data Flow</a></li><li><em>Apple Documentation </em><a href="https://developer.apple.com/documentation/swiftui/state"><em>@State</em></a></li><li><em>Apple Documentation </em><a href="https://developer.apple.com/documentation/swiftui/stateobject"><em>@StateObject</em></a></li><li><em>Apple Documentation</em> <a href="https://developer.apple.com/documentation/swiftui/environmentobject"><em>@EnvironmentObjec</em></a><em>t</em></li><li><em>Apple Documentation </em><a href="https://developer.apple.com/documentation/swiftui/observedobject"><em>@ObservedObject</em></a></li><li><em>Apple Documentation </em><a href="https://developer.apple.com/documentation/swiftui/binding"><em>@Binding</em></a></li><li><em>Apple Documentation </em><a href="https://developer.apple.com/documentation/combine/published"><em>@Published</em></a></li></ul><h3>Contato</h3><ul><li><a href="https://joaogbp.github.io/">João Padilha - Online CV</a></li><li><a href="https://www.linkedin.com/in/jo%C3%A3o-gabriel-borelli-padilha-0b020114a/">João Gabriel Borelli Padilha - Senior iOS Developer - Concrete Solutions | LinkedIn</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=531f7f50bcc1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/digitalproductsdev/swiftui-property-wrappers-simplificado-531f7f50bcc1">SwiftUI Property Wrappers Simplificado</a> was originally published in <a href="https://medium.com/digitalproductsdev">Accenture Digital Product Dev</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Ciclo de vida de um produto e modelos de difusão]]></title>
            <link>https://medium.com/digitalproductsdev/ciclo-de-vida-de-um-produto-e-modelos-de-difus%C3%A3o-c3dbc8f2798a?source=rss----4dea97c2fcfb---4</link>
            <guid isPermaLink="false">https://medium.com/p/c3dbc8f2798a</guid>
            <category><![CDATA[curva-em-s]]></category>
            <category><![CDATA[produtos-digitais]]></category>
            <category><![CDATA[ciclo-de-vida]]></category>
            <category><![CDATA[artigos]]></category>
            <category><![CDATA[product-management]]></category>
            <dc:creator><![CDATA[Victor Lima]]></dc:creator>
            <pubDate>Thu, 03 Mar 2022 14:30:12 GMT</pubDate>
            <atom:updated>2022-03-03T14:30:12.325Z</atom:updated>
            <content:encoded><![CDATA[<h4>O que podemos tirar de aprendizado da curva em S?</h4><blockquote><em>Post originalmente publicado em </em><a href="https://vctrlima.substack.com/"><em>https://vctrlima.substack.com/</em></a></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*90WmrD_G8ftXiudl" /><figcaption>Photo by <a href="https://unsplash.com/@opeleye?utm_source=medium&amp;utm_medium=referral">Jordan Opel</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>A curva S, que representa o comportamento na gestão do ciclo de vida de um produto ou serviço, é um conceito muito poderoso para determinar como entender e abordar a estratégia de lançamento de produtos digitais. O conceito é bastante antigo. Em 1965, por exemplo, um artigo foi publicado na <a href="https://hbr.org/1965/11/exploit-the-product-life-cycle">Harvard Business Review</a> com a descrição das diferentes fases pelas quais um produto passa durante o seu ciclo de vida: <strong><em>market development, growth, maturity, decline</em></strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/585/0*ubhniL_i5rfuyzxb.gif" /><figcaption>Ciclo de vida de um produto ou serviço — curva em S</figcaption></figure><p>Como o próprio autor cita no artigo, muito se fala do ciclo de vida de um produto e do seu comportamento no formato de uma curva em S, mas pouco se discute sobre as aplicações práticas disso para o pensamento estratégico. O objetivo deste post é debater um pouco sobre este conceito. Em primeiro lugar, por que a curva tem comportamento em S?</p><h4>Os motivos do formato em S</h4><p>O comportamento da curva em S é gerado por conta de duas forças que atuam em direções opostas. Nas duas primeiras fases (<em>introduction</em> ou <em>market development</em> e <em>growth)</em>, o que normalmente está agindo é algum tipo de <em>crescimento exponencial</em> descrito por padrões que o <a href="https://vctrlima.substack.com/p/vctrlima-escassez-artificial-e-produtos">modelo de Bass-Diffusion do artigo anterior</a> consegue prever.</p><p>O crescimento exponencial é gerado por conta de boca a boca, atratividade extrema do produto, fit com o mercado, campanhas de marketing ou alguma viralidade inerente. De qualquer forma, o crescimento tende a se comportar como o gráfico abaixo.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/752/1*92q61VI-QxEeQNckrM1_7w.png" /></figure><p>Neste momento, o produto claramente ainda está gozando do potencial de crescimento e dos efeitos cumulativos, ou seja, conforme mais pessoas passam a usar o produto ou serviço e “infectam” mais pessoas, essas também estimulam que mais pessoas utilizem.</p><p>O gráfico acima foi gerado por uma versão do modelo Bass-Diffusion considerando parâmetros bem simples: população que pode aderir ao produto, taxa de contato com possíveis “adopters” do produto e taxa de adoção do produto ao ter contato com o difusor.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/860/1*gwOlC-NFcLuCHlmXipeyHQ.png" /><figcaption>Uma versão do modelo Bass Diffusion, implementada no Stella Architect por Saras Chung</figcaption></figure><p>Ok, já conseguimos entender que o comportamento da curva S no seu início acontece por um crescimento exponencial. Mas por que ela atinge o seu platô e eventualmente para de crescer com esse comportamento?</p><p>Utilizando o modelo acima e considerando os seguintes parâmetros:</p><ul><li>População total: 500 pessoas</li><li>Taxa de contato entre <em>adopters </em>e <em>potential adopters</em>: 8, ou seja, um adopter entra em contato com 8 <em>potential adopters</em></li><li>Taxa de adoção do produto/serviço após o contato: 1,5%</li><li>Efetividade de marketing: 0%, ou seja, não estamos fazendo nenhuma campanha</li></ul><p>Nós experimentamos uma curva de adoção como a ilustrada abaixo:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/838/1*QcnZnJAG1NhIHqxn7IyNug.png" /><figcaption>Curva de adoção</figcaption></figure><p>Um dos principais motivos para esse comportamento é a diminuição do estoque de “<em>potential adopters”, </em>que simula a relação entre o mercado acessível pelo produto ou serviço e uma saturação dele. Por exemplo, se olharmos para os mesmos parâmetros do gráfico anterior mas focarmos no comportamento dos <em>potential adopters, </em>temos o seguinte:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/812/1*PXjCFWryc5InPqhyTevAEA.png" /><figcaption>Potential Adopters</figcaption></figure><p>E se, por outro lado, olharmos a curva de comportamento do <strong><em>fluxo</em></strong> entre <em>potential adopters </em>e <em>adopters, </em>temos o seguinte gráfico:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/768/1*BluI5MjZvph5d0-jpQdIyQ.png" /><figcaption>Fluxo entre potential adopters e adopters</figcaption></figure><p>A junção de todos esses fatores denota, na verdade, as duas forças trabalhando em direções opostas que eu comentei no início do texto. Enquanto existe um ciclo que se reforça em direção ao aumento da adoção do produto ou serviço, depois de um tempo começa um ciclo que se equilibra, denotado principalmente pelo fato de que a base de <em>potential adopters</em> vai diminuindo com o tempo e os efeitos exponenciais, como boca a boca, viralidade inerente ao produto, marketing e etc. chegam ao seu limite superior, fazendo com que a curva tenha outro comportamento e atinja o platô superior da curva S.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/756/1*ranIEXVYHDRWYbGcfsd_1w.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/858/1*4IB76fCG1G0zCW55iGiRiA.png" /></figure><p>Essas duas forças opostas podem ser representadas pelo diagrama abaixo, que descreve a relação entre um loop que se reforça e um loop que se equilibra como um fator limitante do crescimento.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XitC16ItijqdQNjYOs3LiA.png" /></figure><h4>Modelando uma extensão ao ciclo de vida de um produto</h4><p>O que aconteceria se, após saturado o grupo inicial de <em>potential adopters</em>, decidíssemos por levar o produto ou serviço para outro mercado determinado geograficamente como, por exemplo, para um novo país ou região que inicialmente não era atendida?</p><p>Para simular essa situação, adicionamos um fluxo de <em>novos usuários</em> <em>em potencial</em>, que começa a gerar novos usuários em algum ponto no futuro. Ou seja, simulando uma dinâmica na qual após algum tempo levamos o produto ou serviço para ser disponibilizado e ofertado para outro mercado, ficaríamos com o modelo seguinte:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/966/1*HJIOVeRXS5iBoJ4AUUBRRw.png" /></figure><p>Se simularmos as duas execuções do modelo, uma sem levar o produto/serviço até um novo mercado e outra na qual o levamos, temos as seguintes curvas de adoção:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/742/1*IjMwsLk29XHqulFFol0D6A.png" /></figure><p>Reparem que na segunda execução do modelo (linha vermelha), temos aumento na quantidade de pessoas que adotam o produto/serviço ao acessar um mercado com novos usuários em potencial.</p><h4>E como acontece o declínio?</h4><p>Para simular o declínio, adicionamos ao estoque de <em>adopters</em> um fluxo de perda/escoamento de usuários (<em>user churn</em>):</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LWaiaJ748tV44ItuCqHc_g.png" /></figure><p>Podemos simular esse churn, por exemplo, com uma taxa de 5% da base de usuários (<em>adopters). </em>Neste caso, teríamos o comportamento conforme o gráfico abaixo. Repare que a execução 1, que considera o churn de usuários, tem um comportamento diferente da execução 2, o modelo que não considera o churn de usuários.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/782/1*-AY7NAfsg7DJ4ES9RXxx6w.png" /></figure><p>É claro que existem diversas ocasiões em que o comportamento de churn de usuários poderia acontecer. Aqui, optamos por uma simulação que decresce rapidamente, mas outros comportamentos de curva poderiam acontecer.</p><p>Em outras simulações poderíamos esperar uma retenção maior, diminuindo o fluxo de churn, ou uma extensão do ciclo de vida de um produto/serviço utilizando diversas alavancas, como por exemplo:</p><ul><li>entrada em uma nova segmentação do mercado, respeitando os quesitos de variações do produto/serviço que poderiam ser oferecidos, de novos tipos de compradores que poderiam adotar/comprar o produto/serviço, novos canais que permitiriam acessar uma nova gama de potenciais usuários/compradores do produto/serviço ou ainda novos clientes/usuários a partir de uma segmentação geográfica distinta.</li><li>oferta de novos incentivos para que o usuário/cliente continue utilizando o produto/serviço por meio de incentivos utilitários maiores, como comodidade, barreiras para a mudança ou simplesmente uma performance superior ou mais adaptada às necessidades do clientes/usuários do produto/serviço.</li></ul><p>Ficou alguma dúvida ou tem algo a dizer? Aproveite os campos de comentários. E se você quiser trabalhar com um time que está sempre atento à gestão de produtos, <a href="http://bit.ly/vamosaprenderjuntos_">clique aqui</a>, candidate-se a alguma de nossas vagas e vamos aprender juntos. Até a próxima!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c3dbc8f2798a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/digitalproductsdev/ciclo-de-vida-de-um-produto-e-modelos-de-difus%C3%A3o-c3dbc8f2798a">Ciclo de vida de um produto e modelos de difusão</a> was originally published in <a href="https://medium.com/digitalproductsdev">Accenture Digital Product Dev</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Como criar um locátario na Azure AD B2C]]></title>
            <link>https://medium.com/digitalproductsdev/como-criar-um-loc%C3%A1tario-na-azure-ad-b2c-f0b45a108df8?source=rss----4dea97c2fcfb---4</link>
            <guid isPermaLink="false">https://medium.com/p/f0b45a108df8</guid>
            <category><![CDATA[artigos]]></category>
            <category><![CDATA[azure-active-directory]]></category>
            <category><![CDATA[tenants]]></category>
            <category><![CDATA[azure-b2c]]></category>
            <dc:creator><![CDATA[Jhadefernandes]]></dc:creator>
            <pubDate>Thu, 03 Mar 2022 14:28:20 GMT</pubDate>
            <atom:updated>2022-03-03T14:28:20.501Z</atom:updated>
            <content:encoded><![CDATA[<h4>Ou como começar a lidar com a Azure</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*POSkx2c39Na5htP3" /><figcaption>Photo by <a href="https://unsplash.com/@martinadams?utm_source=medium&amp;utm_medium=referral">Martin Adams</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Meu primeiro projeto aqui na Accenture ainda estava em fase de estudos e planejamento. O objetivo era criar um site para administração de projetos, e uma das obrigatoriedades era usar o logon da empresa e a Azure como repositório. O projeto não foi adiante, mas tive que aprender alguns passos para iniciar uma aplicação na Azure e o objetivo deste post é compartilhar com vocês um pouco do que aprendi.</p><p>Antes, porém, vamos entender um pouco mais sobre a Azure AD B2C.</p><h4>O que é Azure Active Directory B2C?</h4><blockquote>O Azure AD B2C é uma solução de gerenciamento de acesso e identidade do cliente. É um serviço global de alta disponibilidade que se expande para milhares de usuários e bilhões de autenticações por dia. Permite que empresas, governos e outras organizações forneçam a seus clientes e consumidores acesso a aplicativos Mobile e Web voltados ao público. A solução usa identificadores que já possuem registros de clientes externos por meio de conta local (e-mail) ou contas sociais como (Facebook, Twitter, Linkedin, etc).<br> <br>O B2C também pode centralizar a coleta de informações de perfil e preferência do usuário e capturar informações analíticas detalhadas sobre comportamento e conversão de inscrição, servindo como uma autoridade de autenticação central para todos os seus aplicativos. O B2C fornece ainda uma maneira de construir uma solução de logon único para qualquer API, Web ou Mobile. A Microsoft atuava como a porta de entrada segura para qualquer um desses aplicativos.</blockquote><blockquote>Além disso, o serviço cuida da segurança da plataforma de autenticação, do monitoramento e do tratamento automático de ameaças. Assim, não precisamos lidar com negação de serviço, difusão de senha e ataques de força bruta.</blockquote><blockquote>O B2C usa protocolos de autenticação espaçadas padrão como OpenID Connect, OAuth2 e Saml. Portanto, pode se integrar com quase qualquer aplicativo moderno ou softwares comerciais off-the-shelf.</blockquote><p>Explicado? Então vamos começar a criar nosso próprio locatário:</p><p>Para configurar um Azure AD B2C, a primeira etapa é ter uma assinatura válida do Azure e, por sua vez, os direitos correspondentes. Para saber mais sobre isso, <a href="https://docs.microsoft.com/pt-br/partner-center/develop/get-a-list-of-azure-entitlements-for-subscription">é só clicar aqui</a>. Feito isso, é só seguir o passo a passo:</p><p>1. Faça login no portal Azure. Quando estiver conectado, você verá essa tela:</p><figure><img alt="Imagem 1" src="https://cdn-images-1.medium.com/max/1024/1*Ti4iHJmsJWmmrHURKolqng.png" /><figcaption>Tela inicial do Portal Azure</figcaption></figure><p>2. Certifique-se de estar usando o diretório da sua assinatura:</p><figure><img alt="Imagem 2" src="https://cdn-images-1.medium.com/max/1024/1*oQqPEDmTnKUKTt9vt2_Ang.png" /><figcaption>Confirmação de diretório da sua assinatura</figcaption></figure><p>3. Adicione <strong>Microsoft.AzureActiveDirectory</strong> como um provedor de recursos para a assinatura do Azure em uso. Para isso:</p><p>a) No portal do Azure, pesquise e selecione <strong>Assinaturas</strong>.</p><p>b) Selecione sua assinatura e no menu esquerdo escolha <strong>Provedores de recursos</strong>. Se você não visualizar o menu à esquerda, selecione o ícone mostrar<strong> o menu para nome da assinatura &gt;</strong> na parte superior esquerda da página para expandi-lo.</p><p>c) Verifique se a linha <strong>Microsoft.AzureActiveDirectory</strong> mostra um status <strong>Registrado</strong>. Se não, selecione a linha e escolha registrar.</p><p>4. Volte para a página inicial e selecione “criar um recurso”. <br><br> 5. Então, procure por Azure Active Directory B2:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EjC5XkLBBw5yqid18d08-Q.png" /><figcaption>Criar um recruso</figcaption></figure><p>6. Depois de selecionado, clique em criar:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*w21oEBlkQDgJB8v-8jotbw.png" /><figcaption>Criar um recurso 2</figcaption></figure><p>7. Selecione um nome de organização e o de domínio inicial, que é usado no nome do locatário, selecione o País (não pode ser alterado posteriormente) e clique em criar:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/832/1*yadeRAfe7oBOH04eHsttMg.jpeg" /><figcaption>Criar um recurso 3</figcaption></figure><p>Após clicar em criar, espere até que se confirme a criação, que deve levar de um a dois minutos.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/832/1*zvlEX3393HWZy-9KKY0AAg.png" /><figcaption>Criação de locatário</figcaption></figure><p>Depois de algum tempo, deve aparecer uma mensagem de locatário criado. <br><strong>Você criou com êxito um novo locatário do Azure AD B2C!</strong><br> <br>Se você clicar neste recurso (imagem abaixo), você vai obter a visualização do link nesta assinatura e NÃO o próprio inquilino. Mas aqui já podemos obter informações importantes:</p><p><strong>Locatário</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/832/1*7nhfTuYG-OMukdhH9Lb2sQ.png" /><figcaption>Locatário</figcaption></figure><p>Você pode descobrir o nome de domínio e ID do locatário B2C na visão geral, bem como a função de exclusão. Mais detalhes sobre o inquilino você pode acessar em “Propriedades”. A propósito, excluir o registro neste ponto levaria apenas à remoção do link entre a assinatura e o locatário B2C, mas não o locatário em si, ok?<br> <br>Caso você tenha deixado passar alguma informação, vou tentar resumir e adicionar alguns pontos.</p><ul><li>Azure B2C é um serviço que permite gerenciar contas de usuário em seu aplicativo cliente.</li><li>O modelo de precificação oferece 50.000 usuários ativos mensais (MAU) de forma gratuita.</li><li>Para criar um serviço Azure B2C, você precisa se lembrar de vincular sua assinatura de faturamento padrão.</li><li>Uma vez que seu serviço B2C esteja configurado, você pode criar seus aplicativos que vão cuidar de todas as suas tarefas de gerenciamento de identidade.</li><li>Você precisa criar os fluxos de usuário para seu aplicativo.</li><li>Os fluxos de usuário determinam a rota que um usuário pode seguir ao navegar em seu aplicativo.</li></ul><p>Com isso, você permite que seus usuários se inscrevam e façam login em suas contas. Esta primeira parte de configuração foi realizada com sucesso! Criamos um Azure AD B2C e o conectamos a uma assinatura existente, um serviço totalmente funcional. Agora estamos prontos para a próxima etapa.</p><p>Ficou alguma dúvida ou tem algo a acrescentar? É só aproveitar os campos de comentários. Até a próxima!</p><p><strong>Referência</strong>: <br> <a href="https://docs.microsoft.com/pt-br/azure/active-directory-b2c/overview">https://docs.microsoft.com/pt-br/azure/active-directory-b2c/overview</a><br> <a href="https://azure.microsoft.com/pt-br/trial/get-started-active-directory-b2c/">https://azure.microsoft.com/pt-br/trial/get-started-active-directory-b2c/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f0b45a108df8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/digitalproductsdev/como-criar-um-loc%C3%A1tario-na-azure-ad-b2c-f0b45a108df8">Como criar um locátario na Azure AD B2C</a> was originally published in <a href="https://medium.com/digitalproductsdev">Accenture Digital Product Dev</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Gestão de “calma aí que tô chegando!”]]></title>
            <link>https://medium.com/digitalproductsdev/gest%C3%A3o-de-calma-a%C3%AD-que-t%C3%B4-chegando-4fbcbdef9e4c?source=rss----4dea97c2fcfb---4</link>
            <guid isPermaLink="false">https://medium.com/p/4fbcbdef9e4c</guid>
            <category><![CDATA[product-management]]></category>
            <category><![CDATA[time-management-tips]]></category>
            <category><![CDATA[skills]]></category>
            <category><![CDATA[artigos]]></category>
            <category><![CDATA[digital-product]]></category>
            <dc:creator><![CDATA[GiBa (Gilberto Nicolav)]]></dc:creator>
            <pubDate>Mon, 29 Nov 2021 20:38:13 GMT</pubDate>
            <atom:updated>2021-11-29T20:38:13.210Z</atom:updated>
            <content:encoded><![CDATA[<h4>Estamos mesmo sem tempo ou só não estamos sabendo gerenciá-lo?</h4><figure><img alt="Ilustração apresenta uma pessoa marcando algo em um calendario, representando a gestão de tempo." src="https://cdn-images-1.medium.com/max/1024/1*DAiPO_5aePMaVTE0x5gGqg.jpeg" /><figcaption>vector created by pch.vector @ freepik</figcaption></figure><p>Você já deve ter tido aquele compromisso que “<em>não deu tempo</em>” de participar, uma reunião que foi “<em>de última hora</em>” ou até mesmo um almoço “<em>correndo, pois estou meio atrasado</em>”, estou certo? Os passos rápidos estão cada vez mais frequentes porque estamos sempre <strong>sem tempo</strong>.</p><p><strong>Falta de tempo</strong> é algo que sinto na pele, como algo crônico, com o qual deveria me acostumar, tomar aquela dose analgésica, seguir em frente e aceitar o fardo… #sóquenão. Com o amadurecimento pessoal e profissional, a interpretação sobre essa <strong>falta de tempo</strong> foi dando voz a um dito popular, tão conhecido por todos, que sempre ouvi dizer:</p><blockquote>“é preciso dar tempo ao tempo”</blockquote><p>E lendo de forma objetiva essa frase, cheguei à conclusão de que realmente, <strong>precisamos dar tempo ao nosso tempo. </strong>Essa correria intensa gera uma sensação de que nunca vamos conseguir realizar tudo o que precisamos, ou gostaríamos de fazer. E essa reflexão me fez concluir que esse sentimento também pode ser traduzido como <strong>falta de conhecimento sobre a utilização desse valioso recurso, que é o nosso tempo.</strong></p><h4><strong>Será que não temos tempo mesmo?</strong></h4><p>O nosso dia é composto por <strong>24 horas</strong>, e são exatamente as mesmas <strong>24 horas para todos</strong>. O quanto sabemos sobre o<strong> uso do nosso tempo? </strong>Acredito que o questionamento correto seria: <strong>estamos utilizando esse recurso de maneira inteligente?</strong></p><p>Interessante que quando falamos sobre <strong>gestão</strong> temos um conceito bem amplo, desde gestão de produtos, stakeholders, pessoas… mas todos são sempre muito bem embasados. Entretanto, pouco buscamos clareza sobre <strong>gestão de tempo e a importância dela para a qualidade de vida, profissional e pessoal</strong>.</p><p>Quando temos uma fotografia mais ampla sobre os resultados que obtivemos ao longo do tempo, quando deixamos de fazer uma boa gestão de tempo, percebemos que a tendência é ter uma baixa qualidade de vida, e isso se reflete de maneira geral, e não somente em ambiente profissional.</p><p>Durante essa jornada, dei de cara com um universo e diferentes formas que podem contribuir para uma melhor gestão de tempo, mas <strong>gostaria de destacar 4 técnicas </strong>que me ajudaram de forma muito eficiente com resultados surpreendentes.</p><h4><strong>Lei de Parkinson</strong></h4><p>A teoria, de autoria do historiador e escritor britânico Cyril Northcote Parkinson, foi publicada pela primeira vez em 1955 em um artigo da revista <em>The Economist</em>.</p><p>A lei formulada por Parkinson foi baseada a partir da experiência no serviço civil britânico e basicamente diz que:</p><blockquote><em>“</em><strong><em>o trabalho se expande de modo a preencher o tempo disponível para sua realização</em></strong>”</blockquote><p>Ou seja, se precisamos realizar uma tarefa, e temos 8 horas para realizá-la, provavelmente vamos utilizar as 8 horas. Se for um período de 3 horas para a mesma tarefa, utilizaremos as mesmas 3 horas. Se tudo deu errado, e temos apenas 30 minutos para concluir a tarefa, ele será concluída. Não é fácil, mas com determinação podemos deixar a procrastinação um pouco de lado e focar naquilo que de fato importa e gera valor.</p><p><strong>Como podemos aplicar:</strong></p><ul><li>Limite o tempo para concluir as atividades do dia a dia;</li><li>Dê prazos agressivos para conclusão das atividades;</li><li>Respeite os prazos que foram determinados.</li></ul><h4><strong>Princípio de Pareto ou Regra dos 80/20</strong></h4><p>O princípio de Pareto ou regra dos 80/20 afirma que, para muitos eventos, aproximadamente 80% dos resultados efetivos vêm de 20% dos esforços.</p><p>O consultor de negócios Joseph Moses Juran sugeriu o princípio e o nomeou em homenagem ao economista italiano Vilfredo Pareto, que notou a conexão 80/20 em sua passagem pela Universidade de Lausanne em 1892. Essencialmente, Pareto mostrou que aproximadamente 80% da terra na Itália pertencia a 20% da população.</p><p>É comum no mundo dos negócios, por exemplo, ter o entendimento que “<em>80% das suas vendas vêm de 20% dos seus clientes</em>”</p><p><strong>Como podemos aplicar:</strong></p><ul><li>Limite os esforços para executar atividades que não exijam perfeição;</li><li>Tenha foco no que é essencial para concluir sua tarefa;</li><li><em>“80% dos resultados são obtidos com 20% dos esforços</em>”</li></ul><h4><strong>Técnica Pomodoro</strong></h4><p>O método é baseado na ideia de que pausas frequentes podem aumentar a agilidade mental. Essa técnica foi desenvolvida por Francesco Cirillo no final dos anos 1980, e basicamente consiste na utilização de um cronômetro para “fatiar” atividades em períodos de concentração, separados por breves intervalos. Esse método é baseado no conceito de que pausas frequentes aumentam a agilidade mental.</p><p>Como sabemos, cada pessoa tem seu ritmo, cada um tem seu tempo. Basicamente, essa ténica promove ciclos de foco total na tarefa desempenhada, com intervalos entre elas.</p><p><strong>Como podemos aplicar</strong></p><ul><li>Inicie um timer e, durante esse tempo, tenha foco total na atividade, com o mínimo de distrações possíveis. Sugiro ciclos de 50 minutos;</li><li>Quando o timer tocar, pare e relaxe por 10 minutos. Ande por aí, faça um carinho no seu pet, prepare um café, mas relaxe a mente por 10 minutos;</li></ul><h4><strong>Plano Semanal</strong></h4><p>Coloque sua agenda em dia! Planejamento é essencial em nossa vida, independente de ser aplicado durante a jornada profissional ou pessoal. Ter uma gestão visual das atividades facilita nosso próprio entendimento, monitora o uso do nosso recurso (tempo) e nos guia sobre os esforços aplicados. Nós nos preparamos melhor quando temos clareza dos nossos compromissos e, sem dúvida, essa clareza contribui para uma melhor gestão de produtos em ambientes complexos.</p><figure><img alt="Imagem que apresenta um calendário de atividades semanais, divididas em blocos de 30 e 60 minutos" src="https://cdn-images-1.medium.com/max/1024/1*O7n4spvN9elys_qfn3jKGg.jpeg" /><figcaption>Sugestão de calendário com atividades semanais divididas em blocos de 30 e 60 minutos</figcaption></figure><p>Estruturando de maneira adequada e aplicando os conceitos apresentados de <strong>forma combinada</strong>, podemos ter uma melhor qualidade de vida, <strong>.</strong></p><p>Acredito que, seguindo a <strong>Lei de Parkinson, que nos ajuda a limitar o tempo para realizar a tarefa, sem distrações e com prazos agressivos</strong>, com atenção ao princípio de <strong>Pareto, que nos diz que podemos limitar esforços, dando foco naquilo que é essencial</strong>, e utilizando a técnica <strong>Pomodoro, que sugere ciclos de 50 minutos focados e intervalos de 10 minutos para descanso mental</strong>, e juntando tudo isso ao <strong>Plano Semanal</strong>, temos um bom leque de informações que podemos utilizar como guia para preservar e melhor utilizar o mais precioso recurso de vida, <strong>o tempo</strong>.</p><p>E você? Tem alguma técnica ou experiência com gestão do tempo para compartilhar? Deixe nos campos de comentários! E se você quiser fazer parte de um time que está sempre em busca de melhoria contínua, <a href="https://bit.ly/vagasConcrete">é só dar uma olhada aqui</a> e se candidatar a alguma de nossas vagas. Vamos aprender juntos!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4fbcbdef9e4c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/digitalproductsdev/gest%C3%A3o-de-calma-a%C3%AD-que-t%C3%B4-chegando-4fbcbdef9e4c">Gestão de “calma aí que tô chegando!”</a> was originally published in <a href="https://medium.com/digitalproductsdev">Accenture Digital Product Dev</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Serverless Saga #3 — Produção]]></title>
            <link>https://medium.com/digitalproductsdev/serverless-saga-3-produ%C3%A7%C3%A3o-82d85cfbe59d?source=rss----4dea97c2fcfb---4</link>
            <guid isPermaLink="false">https://medium.com/p/82d85cfbe59d</guid>
            <category><![CDATA[faa]]></category>
            <category><![CDATA[azure]]></category>
            <category><![CDATA[serverlees]]></category>
            <category><![CDATA[artigos]]></category>
            <category><![CDATA[aws]]></category>
            <dc:creator><![CDATA[Pedro Correa]]></dc:creator>
            <pubDate>Fri, 12 Nov 2021 19:23:32 GMT</pubDate>
            <atom:updated>2021-11-18T19:11:27.110Z</atom:updated>
            <content:encoded><![CDATA[<h3>Serverless Saga #3: Produção</h3><h4>Já diziam: jogo é jogo, treino é treino. Vamos aos resultados?</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*nSKP9ZuOUpg-PlHZ" /><figcaption>Photo by <a href="https://unsplash.com/@alesnesetril?utm_source=medium&amp;utm_medium=referral">Ales Nesetril</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Nesta série de posts, nós já conversamos sobre a <a href="https://medium.com/digitalproductsdev/serverless-saga-1-de-serverness-para-serverless-ddf6b792d138">migração de “servermess” para serverless</a> e mostramos alguns <a href="https://medium.com/digitalproductsdev/serverles-saga-2-benchmarks-custo-24e7063e9cc">resultados de um benchmark</a>, provando que os custos compensam e muito essa migração. Agora, vamos por fim mostrar o resultado em produção de uma infraestrutura em serverless. Vamos lá?</p><h4>Volume de Requests</h4><p>No gráfico abaixo conseguimos observar o volume das chamadas efetuadas na última semana:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/974/0*u7t4MERLu_glWLAq" /></figure><p>Constatamos que o uso da aplicação segue uma tendência senoidal. Esse cenário é excelente para serverless, pois temos diariamente um período com uma quantidade mínima de acessos que seriam anteriormente atendidos por duas máquinas (para garantir a alta disponibilidade), porém potencialmente com elas 100% sem uso.</p><p>Filtrando pelas últimas 48h conseguimos ver essa falta de uso de forma fácil e ela fica em torno de 7h com uso mínimo. Isso são 210h de tempo de máquinas desperdiçadas e pagas sem motivo por mês. Com a hora das máquinas custando 0,20 centavos/hora temos uma economia de 45 dólares sem perder disponibilidade do serviço.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ROiv4VMEWvX4tgna" /></figure><h4>Latência</h4><p>No gráfico abaixo conseguimos observar que a latência se mantém ao longo da semana entre 250–700ms. Há um grande pico de latência, mas foi causado pela indisponibilidade de um serviço terceiro.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ptR0OH_n-xCUpTY1" /></figure><p>Aplicando um Fourier nos pontos de latência temos o seguinte gráfico.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*EwdnOvbop27mOMpA" /></figure><p>Nele conseguimos ver que a frequência com que as latências ocorrem gira em torno de 75ms. Infelizmente não conseguimos dados reais para comparação, mas “de cabeça” a latência ficava próxima de 100ms. Esse é um excelente sinal, que indica que nosso wrapper não adicionou nenhum grande aumento de ciclos de máquina.</p><p>Como a API é parecida com agregação, ou seja, consome outros serviços, ela se torna fortemente acoplada a esse serviço terceiro. Logo, não é uma métrica que devemos interpretar no vácuo da ausência de contexto. Conseguimos, então, mostrar como aplicações serverless conseguem alcançar performance igual e equivalente (talvez maior) do que a aplicação com servidores.</p><h4>Memória</h4><p>Abaixo temos o uso de memória dos últimos 3 dias do aplicativo serverless:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*VWdh0qkT5SFp-NYs" /></figure><p>Nele podemos ver um padrão claro de uso e desuso. Esse valor de uso de memória é apenas uma fração do total de memória RAM alocada nos servidores e processos. Isso evidencia a eficiência de execução do código.</p><p>Porém, o ponto mais interessante desse gráfico é o limite superior do uso de memória. Pelo gráfico podemos afirmar que ele fica em torno dos 300 MB, e isso é 1/3 da memória que usamos nos cálculos de custo.</p><h4>Custo</h4><p>Como observamos nos dois últimos tópicos, os valores que colocamos em nossas estimativas estavam exagerados e portanto o seu resultado também.</p><p>Abaixo temos a contagem de chamadas totais e a média do tempo de respostas calculados pela Azure Insight em um período de 7 dias.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*NCp6B0QxJ-G4yCBG" /></figure><p>Aplicando o mesmo cálculo de previsão de custo com os valores de tempo de respostas e memórias reais temos o seguinte resultado:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*2eOm7y3VyyMnr-MU" /></figure><p>Nosso custo será de 90 dólares, ou seja, 11 vezes mais barato. Incrível, não?</p><p>Ressalto que isso ainda é uma estimativa baseada na última semana e o valor pode ser tanto maior quanto menor.</p><p>Mas acabamos esquecendo de um detalhe: a comparação está correta mas esse volume de chamadas representa o pior pico de uso no Natal, e não um mês usual. Se extrapolarmos o volume do primeiro gráfico da sessão sobre o volume de chamadas, temo que a média semanal é próxima a 1,8 milhões.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*AaMblXeP7Pj3htKY" /></figure><p>Incrível! Uma API com 7,2 milhões de chamadas por mês custando 28 dólares. Bem-vindo ao mundo do serverless!</p><h4>Otimizações valem Ouro</h4><p>É importante frisar a vantagem “oculta” do serverless, que é o alto retorno de investimento nas ações que otimizam o uso de memória e do tempo de respostas. Todas essas otimizações têm efeito direto no custo da API, diferente de aplicações nos servidores que são geralmente tratadas com bastante abundância de recursos para evitar que quebrem.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*IOf0K2BX8w0NahBT" /></figure><p>Nos gráficos acima, fornecidos no dashboard do azure app insights, temos as APIs mais lentas e mais chamadas da aplicação. Com esses dados podemos criar um plano de ação que visa otimizar o código desses grandes ofensores e cortar ainda mais nossos custos.</p><p>Entre outros benefícios não ditos temos a vasta complexidade reduzida migrando de uma arquitetura com Kubernetes para uma em Azure Functions. Essa redução diminui pontos de falha a serem administrados e reduz a necessidade de um time para monitoria da aplicação, já que nós apenas cuidamos do código e todo restro é provido pela Azure.</p><p>Gostaram dos posts? Querem outros cenários serverless? Deixem seus comentários com o feedback. E se quiser trabalhar em um time que preza pela automação, <a href="https://bit.ly/vagasConcrete">é só clicar aqui</a> e se candidatar a alguma de nossas vagas. Obrigado a todos que acompanharam essa pequena saga. Até mais!</p><h4><strong>Leia mais:</strong></h4><ul><li><a href="https://medium.com/@hollentor/serverless-saga-1-de-serverness-para-serverless-ddf6b792d138">Serverless Saga #1 — De Serverness para Serverless</a></li><li><a href="https://medium.com/@hollentor/serverles-saga-2-benchmarks-custo-24e7063e9cc">Serverles Saga #2 — Benchmarks &amp; Custo</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=82d85cfbe59d" width="1" height="1" alt=""><hr><p><a href="https://medium.com/digitalproductsdev/serverless-saga-3-produ%C3%A7%C3%A3o-82d85cfbe59d">Serverless Saga #3 — Produção</a> was originally published in <a href="https://medium.com/digitalproductsdev">Accenture Digital Product Dev</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Serverles Saga #2 — Benchmarks & Custo]]></title>
            <link>https://medium.com/digitalproductsdev/serverles-saga-2-benchmarks-custo-24e7063e9cc?source=rss----4dea97c2fcfb---4</link>
            <guid isPermaLink="false">https://medium.com/p/24e7063e9cc</guid>
            <category><![CDATA[artigos]]></category>
            <category><![CDATA[faa]]></category>
            <category><![CDATA[serverless]]></category>
            <dc:creator><![CDATA[Pedro Correa]]></dc:creator>
            <pubDate>Fri, 12 Nov 2021 19:11:22 GMT</pubDate>
            <atom:updated>2021-11-12T19:11:22.132Z</atom:updated>
            <content:encoded><![CDATA[<h3>Serverless Saga #2: Benchmarks &amp; Custo</h3><h4>Será que vale todo o esforço para transformar ou criar uma aplicação de <em>serverness</em> em uma <em>serverless?</em></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*YEfcbkEkNVNbUMI4" /><figcaption>Photo by <a href="https://unsplash.com/@kelvin1987?utm_source=medium&amp;utm_medium=referral">Kelvin Ang</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p><a href="https://medium.com/digitalproductsdev/serverless-saga-1-de-serverness-para-serverless-ddf6b792d138">No primeiro post desta série</a>, vimos como transformar ou criar uma aplicação <em>serverness</em> em uma <em>serverless</em> de forma muito mais portável para outras nuvens e até mesmo para migrar de volta para uma infraestrutura com servidores. Mas será que vale a pena todo esse esforço? Neste segundo post, vamos explorar alguns dados reais e simulados de benchmarks para validar nossa hipótese antes de levá-la ao cliente.</p><h4>Benchmarks</h4><p>Criamos quatro grupos de chamadas de APIs que simulam o fluxo de uso de um usuário médio no projeto em que atuamos. A ferramenta utilizada foi o <a href="http://artillery.io/">Artillery.io</a>.</p><p>Ajustamos os valores de quantidade de chamadas por segundo para alcançar o limite das infras construídas, mas depois que encontramos os limites usamos para os dois testes.</p><h4>Serverness (com servidores)</h4><p>Na infraestrutura antiga conseguimos apenas 271 chamadas com sucesso num período de 70 segundos e tivemos vários 429, o erro que o Azure API Manager lança quando o serviço esta indisponível.</p><p>Com isso, temos apenas 3,9 req/sec com sucesso.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*hrSx_j74E0UrtEN9" /></figure><h4>Serverless</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*0j6u2xsejUB-hHLa" /></figure><p>Já com o serverless, conseguimos 848 chamadas com sucesso! Isso equivale a 12,11 req/sec com sucesso!</p><h4>Histórico de Uso</h4><p>Bem, esses números por si só não representam grandes coisas. Precisamos compará-los com a quantidade real de chamadas que iríamos receber. Abaixo temos o pico histórico da aplicação. Dela tiramos que o maior pico de uso foi no dia 22, com 335 req/min. Para normalizar esse valor com os valores acima, dividimos por 60 segundos.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*yhCzxgmEMmVCzIY6" /></figure><p>A infra teve um pico de 5,58 por segundo. Logo, a arquitetura serverless conseguiria atender até 2 Natais sem problemas!</p><h4>Custo da Aplicação</h4><p>As duas infraestruturas têm formas muito diferentes de cobrança. Na infraestrutura com servidores nós basicamente pagamos pelo tempo das máquinas usadas, usando o recurso ou não.</p><p>Já no serverless, o pagamento é feito pelo número de execuções, duração da execução e memória alocada. Para comparar cenários iguais e críticos pegamos o mês que mais houve estress na aplicação, ou seja, o mês com a maior quantidade de chamadas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*vDDwCySG86CQRHnh" /></figure><p>Do plot acima tiramos a pior latência histórica: 600ms e o volume total de chamadas: 2.000.000 chamadas</p><h4>Serverness (com servidores)</h4><p>Para achar o custo da aplicação, pegamos o conjunto de máquinas iguais às do cenário de testes e multiplicamos pela quantidade de máquinas. Nesse cenário nós tivemos que levantar dois conjuntos de máquinas com essa config:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*JtzBcf-E4df_7gS7" /></figure><p>Utilizamos dois grupos compostos de 6 máquinas com vCores e 8 GB cada capazes de atender a aplicação.</p><p>Da calculadora acima chegamos à conclusão de que cada máquina custa 140 dólares por mês. Multiplicando esse valor por 6 teríamos 840 dólares!</p><h4>Serverless</h4><p>Para calcular o custo da infraestrutura serverless podemos simplesmente preencher a calculadora de custos da própria Azure com os dados que coletamos de tempo e quantidade de execuções.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*BA7p88FxeZ2qPkaR" /></figure><p>O total é de 190 dólares, ou uma economia prevista de quase 80%!</p><p>Um ponto importante a destacar é que, diferentemente do custo por máquinas, o custo serverless pode variar já que o tempo de execução influencia no custo.</p><h4>Custo, Monitoria e Logs</h4><p>Um “acidente feliz” que tivemos durante a migração da aplicação foi que não conseguimos reutilizar a ferramenta de tracing e monitoramento que usávamos (Dynatrace), pois ela exigia a execução de um binário ao qual o serverless não dá suporte.</p><p>Por isso, precisamos migrar para uma ferramenta de monitoria que não precisasse de binários e, com isso, conhecemos o Azure App Insight, na qual a instrumentação é feita direto no código.</p><p>Mas as vantagens do App Insight são ainda maiores do que apenas viabilizar o serverless. Por ser uma ferramenta que cobra por chamada e volume de dados, conseguimos uma redução de custo na monitoria, pois a modalidade de cobrança do Dynatrace é por instância utilizada.</p><p>Além disso, conseguimos mitigar um grande problema, que era o link entre o tracing e os logs. Na arquitetura antiga os logs ficavam no appinsight e o tracing no dynatrace. Juntando os dois criamos uma super ferramenta de debug.</p><h4>Otimizações</h4><p>Em uma arquitetura clássica não temos tantos incentivos para otimizar o código. Se ele funcionar em 600ms ou 800ms no dia a dia, o impacto pode ser pequeno, ou até nenhum. No entanto, numa arquitetura serverless reduzir de 800ms para 400ms pode cortar o custo da infra pela metade.</p><p>Com serverless temos motivação direta de diminuir o tempo de execução, o uso de memória e a quantidade de chamadas que nossa aplicação realiza, pois teremos um impacto direto e visível no custo da aplicação.</p><p>Outra flexibilidade para reduzir custos é reduzindo a quantidade de logs e de tracing, já que a modalidade de cobrança é baseada no uso e não em um contrato previamente feito.</p><p>Acho que chegamos à conclusão de que uma API serverless é uma excelente ideia e deve ser considerada no início (ou até mesmo no meio) de um projeto, certo? No próximo post, vamos mostrar dados reais da aplicação em produção. Se você tem alguma dúvida ou quer comentar algo, aproveite os campos abaixo. Ou se você quer fazer parte de um time que aprende o tempo todo,<a href="https://bit.ly/vagasConcrete"> é só clicar aqui</a> e se candidatar a alguma de nossas vagas. Até a próxima!</p><p><strong>Leia mais:</strong></p><ul><li><a href="https://medium.com/@hollentor/serverless-saga-1-de-serverness-para-serverless-ddf6b792d138">Serverless Saga #1 — De Serverness para Serverless</a></li><li><a href="https://medium.com/@hollentor/serverless-saga-3-produ%C3%A7%C3%A3o-82d85cfbe59d">Serverless Saga #3 — Produção</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=24e7063e9cc" width="1" height="1" alt=""><hr><p><a href="https://medium.com/digitalproductsdev/serverles-saga-2-benchmarks-custo-24e7063e9cc">Serverles Saga #2 — Benchmarks &amp; Custo</a> was originally published in <a href="https://medium.com/digitalproductsdev">Accenture Digital Product Dev</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>