<?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[tech.revelo - Medium]]></title>
        <description><![CDATA[Os desafios e aprendizados do time de Tech, Growth, Produto e Design da Revelo. - Medium]]></description>
        <link>https://medium.com/revelo-tech?source=rss----9442b857e762---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>tech.revelo - Medium</title>
            <link>https://medium.com/revelo-tech?source=rss----9442b857e762---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 27 May 2026 00:32:48 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/revelo-tech" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Flutter — Caso de uso — Como saber e manter o tamanho de um widget?]]></title>
            <link>https://medium.com/revelo-tech/flutter-caso-de-uso-como-saber-e-manter-o-tamanho-de-um-widget-d807b503dded?source=rss----9442b857e762---4</link>
            <guid isPermaLink="false">https://medium.com/p/d807b503dded</guid>
            <category><![CDATA[flutter]]></category>
            <category><![CDATA[flutter-ui]]></category>
            <category><![CDATA[hybrid-app-development]]></category>
            <category><![CDATA[flutter-app-development]]></category>
            <category><![CDATA[flutter-widget]]></category>
            <dc:creator><![CDATA[Gabriel Araujo]]></dc:creator>
            <pubDate>Fri, 03 Dec 2021 16:49:54 GMT</pubDate>
            <atom:updated>2021-12-03T17:39:31.290Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zIh4g0sCaByZFcfH6O6wDw.png" /></figure><h3>Flutter — Caso de uso — Como saber e manter o tamanho de um widget?</h3><p>Oi pessoal, tudo bem?</p><p>Nos últimos dias passamos por um desafio aqui na Revelo e notei que é uma pergunta comum para desenvolvedores Flutter. O desafio foi como obter o tamanho ou posição de um widget após sua renderização.</p><p>Um widget, por si só, não tem uma posição ou um tamanho pré-determinados. Estes são definidos após sua renderização e ficam “dentro” de um componente chamado RenderBox que é criado na construção da tela. Precisamos, portanto, acessar esse RenderBox após a renderização da tela e, com ele, pegar as dimensões necessárias.</p><h4><strong>O desafio</strong></h4><p>Podemos nos deparar com um desafio como esse em diversas situações e, no nosso caso, precisávamos manter o tamanho de um botão quando trocássemos seu estado (para fazer uma animação de carregamento dentro dele).</p><p>A animação tinha tamanho diferente do texto que recebemos da API e, como esse texto pode mudar, definir dimensões fixas não seria a melhor estratégia para manter o tamanho do botão.</p><p>Para ilustrar melhor:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/362/1*xgpsRHPLh5VZtD2O0zKLoQ.gif" /><figcaption>Objetivo</figcaption></figure><h4><strong>O que já tínhamos</strong></h4><p>Nós já tínhamos um widget de botão feito e utilizado em várias partes do app, o ReveloContainedButton. Ele já era um Stateless Widget com um ElevatedButton e embutia espaçamentos, lógica de ativo/inativo, tema de cores e estilo de texto e elevação.</p><p>Para melhor entendimento, levem em conta que a classe <strong>Dimens</strong> é a nossa classe de dimensões padrão, sendo Dimens.base = 16.0.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/03e0612ab24cf24f089f1d784ec5f5e5/href">https://medium.com/media/03e0612ab24cf24f089f1d784ec5f5e5/href</a></iframe><p>Como podem ver, esse widget tem suas dimensões definidas pelo tamanho do Text recebido. Também não tínhamos a animação de carregamento (daqui para frente vou chamar de loading, belê?).</p><h4><strong>A solução inicial</strong></h4><p>A solução mais simples seria colocar nosso widget de loading, com renderização dependente de um booleano isLoading.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/bd6548476ef1756739d481edf4d7d0d6/href">https://medium.com/media/bd6548476ef1756739d481edf4d7d0d6/href</a></iframe><p>Essa solução, porém, faz o botão mudar suas dimensões para a mesma do widget de loading. Para evitar o pulo, colocamos um AnimatedSize na transição.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/362/1*YKcmNHhgMpil85U35DUclA.gif" /><figcaption>Botão animado, sem manter as dimensões originais</figcaption></figure><p>É claro que não ficamos muito satisfeitos por não seguirmos o design, então continuamos tentando!</p><h4><strong>E então como fazer para que o botão mantenha suas dimensões?</strong></h4><p>A primeira coisa que precisamos fazer é transformar nosso botão em um Stateful Widget. Com isso conseguimos executar funções logo após a renderização e definir variáveis fora do método build do widget.</p><p>Depois, ainda é necessário saber qual é o elemento, naquele contexto, que queremos utilizar.</p><p>O Flutter faz essa identificação utilizando <a href="https://api.flutter.dev/flutter/foundation/Key-class.html">Keys</a>, então vamos criar uma GlobalKey() para o nosso botão.</p><p><strong>Importante: </strong>Nosso ElevatedButton tem padding interno e, por isso, seria um pouquinho mais complicado manter seu tamanho com o widget interno diferente se utilizássemos uma Key nele. Por isso a atribuímos ao widget Text().</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/69cb1ccce445dcfb266e49330f6fd150/href">https://medium.com/media/69cb1ccce445dcfb266e49330f6fd150/href</a></iframe><p>Até agora só identificamos qual é o elemento que precisamos. Vamos então pegar as dimensões dele?</p><ol><li>Começamos criando as variáveis que receberão as dimensões de altura e largura do nosso widget Text(): buttonTextHeight e buttonTextWidth.</li><li>Depois disso, criamos uma função _getButtonTextSize(), que atribui valores a essas variáveis de acordo com o contexto atual. Podemos também criar funções para obter outras informações, como a posição do elemento na tela.</li></ol><p>Então, vamos executar essa função <strong>somente </strong>no initState() do widget! Mas tem um detalhe importante: dependemos da renderização dos widgets estar completa (lembra daquele RenderBox? Ele precisa já estar disponível!).</p><p>Também vamos colocar uma condicional para que a função seja executada depois que isso aconteça, utilizando a instância atual do Mixin <a href="https://api.flutter.dev/flutter/widgets/WidgetsBinding-mixin.html">WidgetsBinding</a> no initState() e o método <a href="https://api.flutter.dev/flutter/scheduler/SchedulerBinding/addPostFrameCallback.html">addPostFrameCallback()</a>, que nos permite executar funções <strong>uma vez </strong>assim que a fila de renderização acabar.</p><p>Ficou assim:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/7da12d0712d65d4e405730ce00eb6b64/href">https://medium.com/media/7da12d0712d65d4e405730ce00eb6b64/href</a></iframe><p>Agora que as variáveis buttonHeight e buttonWidth são atribuídas após a renderização do widget, precisaremos utilizá-las né?</p><h4>Utilizando as dimensões</h4><p>Nosso widget de loading não tem parâmetros de dimensões definidos, então criamos um container que tem buttonTextHeight e buttonTextWidth como height e width, respectivamente.</p><p><strong>Bônus:</strong> no nosso caso, tivemos uma outra pegadinha! Precisamos ajustar o padding desse container de acordo com a buttonTextWidth e o tamanho do ícone para mantê-lo sempre centralizado horizontalmente e com o tamanho ideal.</p><p>Foi uma conta simples: subtraímos o tamanho do ícone da largura total e dividimos por 2!</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a964bd5b77243b2352b7b0c4890df86c/href">https://medium.com/media/a964bd5b77243b2352b7b0c4890df86c/href</a></iframe><p>Finalmente, conseguimos o resultado desejado! :)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/362/1*xgpsRHPLh5VZtD2O0zKLoQ.gif" /><figcaption>Resultado</figcaption></figure><p>E aí, por quais desafios vocês tem passado? Estamos sempre disponíveis para ajudar!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d807b503dded" width="1" height="1" alt=""><hr><p><a href="https://medium.com/revelo-tech/flutter-caso-de-uso-como-saber-e-manter-o-tamanho-de-um-widget-d807b503dded">Flutter — Caso de uso — Como saber e manter o tamanho de um widget?</a> was originally published in <a href="https://medium.com/revelo-tech">tech.revelo</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to migrate your existing app from Flutter 1 to Flutter 2]]></title>
            <link>https://medium.com/revelo-tech/how-to-migrate-your-existing-app-from-flutter-1-to-flutter-2-d48085f974c?source=rss----9442b857e762---4</link>
            <guid isPermaLink="false">https://medium.com/p/d48085f974c</guid>
            <category><![CDATA[migration]]></category>
            <category><![CDATA[flutter]]></category>
            <category><![CDATA[flutter-2]]></category>
            <category><![CDATA[flutter-app-development]]></category>
            <dc:creator><![CDATA[Douglas Iacovelli]]></dc:creator>
            <pubDate>Mon, 11 Oct 2021 18:57:15 GMT</pubDate>
            <atom:updated>2021-10-11T18:57:15.075Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*a63ZcLQc40p4KKK80buyag.png" /></figure><p>This was one of the hardest migrations I&#39;ve ever experienced and I believe these tips will help you in the process.</p><blockquote>We took around 3 months to fully migrate our app without stopping the delivery of new features. And here’s how we did it.</blockquote><h4>A bit of background first</h4><p>The first version of the Revelo App was built natively in Android with Kotlin, so we took advantage of a great language that already had support to null-safety.</p><p><em>This really helped us during the migration because sometimes we referred to this app to check what was nullable and what wasn&#39;t.</em></p><p>However, when we decided to start supporting iOS and had to develop the app all over again in Flutter, the Dart language didn&#39;t support null-safety yet. Back then it felt like a huge step back not having this and other great features such as data classes out of the box.</p><p>Even though this wasn&#39;t available at that time, we found a few <a href="https://github.com/dart-lang/language/issues/110">threads</a> in the Dart&#39;s repository on Github, in which the team was discussing the implementation NNBD (non-nullable by default). After a few months it became available with the release of Dart 2.12.</p><blockquote>Here are the steps and a few tips that we used at Revelo that made the process a bit easier.</blockquote><h3>1. Make sure your dependencies are already migrated</h3><p>As advised by Dart, it&#39;s not recommended to start migrating your app if you have dependencies that are not yet migrated. That&#39;s because without it, it&#39;s not possible to enable &quot;sound null-safety&quot; and therefore it&#39;d be necessary to test and review each part of the app at least twice.</p><p>At this time what we did was create a spreadsheet to keep track of which libs were ready and which weren&#39;t.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Wy8j4-0G29tAvkeipsrAOw.png" /></figure><p>The &quot;Link&quot; column was useful for referring to issues about the migration to check if any progress was made and we checked them sometimes daily and sometimes weekly.</p><h3>2. Map all features of your app</h3><p>This was important to have a sense of what was the size of the migration and also to keep track of which features we&#39;ve had already migrated. We&#39;ve also used a spreadsheet for this purpose and we&#39;ve just used the folder&#39;s names.</p><p>Our project was structured this way:</p><pre>companies<br> └── list/<br>      └── data/<br>      └── domain/<br> └── details/<br>      └── data/<br>      └── domain/<br>core<br> └── app_banner/<br> └── browser/<br> └── database/</pre><p>We weren&#39;t too detailed at this point to include every folder, but it was more like a feeling of what&#39;s a reasonable size (not too huge and not too little code).</p><p>We ended up with something like this, and even though it&#39;s not shown in this print, we&#39;ve also listed the subfolders oftest :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rd67tLicJb8lT1HsDO_3cA.png" /></figure><h3>3. Draw a plan on how to tackle it</h3><p>We knew the company couldn&#39;t afford spending several weeks to do this migration and stop the product delivery, so we <strong>used the previous map to split it into several weeks</strong>. We planned it as a team to check if seemed right for everyone in terms of how much we could deliver each week.</p><p>We agreed with the product team to spend around 20% of our time every sprint to tackle these features. After all of it we had a sense of how much time would be needed.</p><p><strong>Tip: When you make this plan, make sure to save some time for fixing up the tests and for testing the whole app.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cvFnGFhlh1jvfx44vL-9xg.png" /></figure><h3>4. The migration of the code itself</h3><p>I suggest creating a feature branch to receive all code updated and having other branches created after this one so you can review the code chunk by chunk.</p><p><strong>4.0 Settle down your expectations</strong></p><p>Assume this a long process and you won&#39;t see the project compiling for quite some time in this branch. When we first started there were 3K+ errors.</p><p><strong>4.1 Update the libs from </strong><strong>pubspec.yaml</strong></p><p>Firstly set the dart and flutter version on pubspec.yaml and start updating the libs until flutter pub get runs with no error.</p><blockquote><strong>Tip: </strong>Don&#39;t run flutter upgrade on the current version of the Flutter you&#39;re already using. Download the newest version and create an alias such as flutter2 . With VSCode it&#39;s possible to <a href="https://stackoverflow.com/a/60042131/2305802">use different versions of Flutter and Dart</a>.</blockquote><p><strong>4.2 Fix the build runner issues</strong></p><p>This part is important so you can stop worrying about the issues with generated code which will also show to you as compilation errors.</p><p><strong>4.3</strong> <strong>Start migrating the code from the leaf classes</strong></p><p>Just like we did with the app dependencies, the same logic can be applied for the migration of the proprietary code itself. I recommend starting with the most basic components of your app, such as classes with no dependencies. It will be easier to update the features which depend on these classes later on.</p><p><strong>4.4 Open small Pull Requests</strong></p><p>I recommend a PR for each folder migrated and I recommend avoiding going into the habit hole. For example, if you change the leafs, avoid changing all occurrences which depend on it, otherwise you might end up changing a lot of different files that you&#39;re expected to review later on.</p><blockquote><strong>Tip: </strong>if you use Firebase, make sure to read the migration guide, which can be very helpful. There are a lot of breaking changes and it can be very time consuming.</blockquote><p><strong>4.5 Start fixing the runtime issues</strong></p><p>After you fix all compilation errors within the lib folder, you&#39;ll be able to run your app. Hope for the best but be prepared for the worst. Certainly there&#39;ll be a few (or a lot of) runtime errors that you will need to address but don&#39;t focus too much on getting the app perfect at this time. That&#39;s because if you have tests then this will be a great time to fix them so you can stop errors easier.</p><h3>5. Fixing the Tests</h3><p>Now it’s time to fix the tests and run them to make sure nothing was broken. At Revelo we use Mockito for mocking classes and we struggled with it. Mockito returns null when you use any and a lot of methods stopped accepting nullable values. Because of that, we had to change the way we declare our mocks.</p><p>Instead of declaring the interface type we had to declare it as the mock itself, like this:</p><pre>MyDependency dep = MockMyDependency(); //previous way<br>MockMyDependency dep = MockMyDependency(); //new way</pre><p>This works because Mockito overrides the implementation of the methods which don&#39;t accept nullable parameters.</p><p><strong>Tip: </strong>You don’t have to fix all compile errors in the test suite in order to run a single test file. So I recommend fixing each test file starting from the leafs up to the tests with more dependencies and run each one as you progress.</p><h3>6. Tests before release</h3><p>If you have a team responsible for quality it will be very helpful, but if you don&#39;t, be prepared to spend a considerable amount of time to fully test the app. Make sure to stress different scenarios, mainly the ones you know there might be null values.</p><p>One thing I recommend testing is the endpoints which might have null values returned and possibly also mocking their returns with <a href="https://mockoon.com/">Mockoon</a> + <a href="https://ngrok.com/">Ngrok</a>. The first is open source and the second one has a free version.</p><h3>Tips</h3><ul><li>As you develop features in Flutter 1, document what fields are nullable. We left a comment after each property with // nullable . It was <strong>really helpful. </strong>Besides that we could also use the code of the first version of the Android app to check what fields were nullable.</li><li>Keep this branch up-to-date with the branch used for developing the features in Flutter 1 if you won&#39;t have time to do the whole migration at once. <a href="https://medium.com/u/835e2409848a">Cesar Castro</a> suggested this great approach by updating this branch weekly. Since we had just developed it, it was easier to remember what were the decisions.</li><li>Ask for pair review and if possible pair program the core pieces of code you have in your codebase.</li></ul><p>A <strong>huge thanks</strong> <strong>and</strong> <strong>kudos</strong> to <a href="https://medium.com/u/835e2409848a"><strong>Cesar Castro</strong></a> and <a href="https://medium.com/u/46a44289e59a"><strong>Gabriel Araujo</strong></a> who worked really hard on this migration and made it possible.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d48085f974c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/revelo-tech/how-to-migrate-your-existing-app-from-flutter-1-to-flutter-2-d48085f974c">How to migrate your existing app from Flutter 1 to Flutter 2</a> was originally published in <a href="https://medium.com/revelo-tech">tech.revelo</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Experimentação em app: como testar de forma ágil sem precisar lançar uma nova versão na loja …]]></title>
            <link>https://medium.com/revelo-tech/experimenta%C3%A7%C3%A3o-em-app-como-testar-de-forma-%C3%A1gil-sem-precisar-lan%C3%A7ar-uma-nova-vers%C3%A3o-na-loja-3785c1b91912?source=rss----9442b857e762---4</link>
            <guid isPermaLink="false">https://medium.com/p/3785c1b91912</guid>
            <category><![CDATA[produtos]]></category>
            <category><![CDATA[apps]]></category>
            <category><![CDATA[discovery]]></category>
            <category><![CDATA[experimentação]]></category>
            <category><![CDATA[design]]></category>
            <dc:creator><![CDATA[Arthur Braga e Silva]]></dc:creator>
            <pubDate>Thu, 26 Aug 2021 18:27:57 GMT</pubDate>
            <atom:updated>2021-11-04T02:21:36.015Z</atom:updated>
            <content:encoded><![CDATA[<h3>Experimentação em app: como testar sem precisar lançar uma nova versão na loja - Parte 2</h3><p>Na <a href="https://medium.com/revelo-tech/experimenta%C3%A7%C3%A3o-em-app-como-testar-de-forma-%C3%A1gil-sem-precisar-lan%C3%A7ar-uma-nova-vers%C3%A3o-na-loja-parte-4192e2eb181f">parte 1</a>, foi mostrado um guia prático de experimentos que podemos realizar dentro de um ambiente de app. Agora, na parte 2, vou detalhar como experimentamos e criamos uma plataforma de mentoria gratuita para pessoas na área de tecnologia utilizando metodologia de experimentação, contando um pouco do racional para tomar as decisões e dicas de boas práticas durante este processo de experimentação.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xnkhfgQoZadYY60ePyMx0Q.png" /><figcaption>(Arte de <a href="https://www.instagram.com/neuecoldworld/">Rodrigo Maia</a>)</figcaption></figure><h3>Começando pelo começo</h3><p>Na Revelo, temos ciclos trimestrais para tirarmos nossas ideias do papel com todo o time e planejarmos como podemos experimentá-las ao longo dos próximos 3 meses. Levando em conta que a Revelo é uma plataforma de HR Tech, durante este processo de brainstorming e análise das ideias, identificamos que uma iniciativa de mentoria com profissionais seniors poderia ter um impacto muito grande para os usuários de nossa plataforma e também para o negócio mas, ao mesmo tempo, tínhamos poucas evidências da desejabilidade e da viabilidade de uma plataforma como essa dentro do app da Revelo.</p><p>Então, tendo isso em mente, eu e o <a href="https://medium.com/u/9d793d0f8606">Michel</a>, Product manager e minha antiga dupla na equipe do app da Revelo, sabíamos que o maior desafio nesse processo seria levantar e mostrar essas evidências sem envolver ainda o time de tecnologia, já que estavam com o foco em outras tarefas e na construção de outras funcionalidades para o app da Revelo. Então, por onde começar? 🤔</p><h3>Discovery e Definindo primeiros passos</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WynDag6LKywaRGjuZH435g.png" /><figcaption><em>Nesta primeira etapa no projeto, focamos em entender qual era a desejabilidade do nosso público com a funcionalidade</em></figcaption></figure><p>Depois de um processo de benchmarking para conhecermos um pouco mais sobre os nossos possíveis concorrentes, junto a um exercício de matriz CSD para esclarecer nossas certezas, suposições e dúvidas, identificamos que precisávamos entender como funcionava a rotina dos mentores. Como um primeiro passo, uma entrevista com este público poderia nos ajudar no começo da nossa iniciativa pelo baixo custo em realizá-las e poderia nos mostrar outros caminhos que nos auxiliariam no processo de experimentação.</p><h4>🧪 1º “Experimento” (pesquisa): Entrevista com o usuário</h4><p>Para essa entrevista, estabelecemos um roteiro e tivemos alguns pontos claros que surgiram de nossa matriz CSD que queríamos esclarecer:</p><ul><li>Entender como funciona de forma macro a jornada de dar uma mentoria e se os mentores já utilizavam alguma plataforma para auxiliar neste processo.</li><li>Descobrir quais problemas e dores que passam neste processo.</li><li>Qual é a sua motivação em fazer mentorias e o que ganham neste processo</li><li>Identificar se existe algum ponto de risco para o negócio e a iniciativa</li></ul><p>Depois de uma conversa muito rica com mais de 20 mentores, tabulamos os resultados e resumimos os principais insights que tiramos das entrevistas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Uix5Lo4adayTttR2" /><figcaption><em>Depois de realizar o processo de entrevista, tabulamos os resultados e criamos uma pequena apresentação no Miro para facilitar no compartilhamento de informações</em></figcaption></figure><p>Como próximos passos, criamos um canvas ( lean canvas, do livro running lean) para entendermos nosso público, a proposta de valor e viabilidade de modo a facilitar conversas com stakeholders e outras pessoas da empresa para receber feedbacks. Porém, durante este processo, identificamos um ponto crucial e um possível risco para o nosso produto: um número relevante de mentores da área de desenvolvimento relataram a falta de interesse de pessoas da área em querer participar de mentorias com outros profissionais, mesmo sendo gratuitas.</p><p>Como o processo de entrevista entrega uma força baixa de evidência dos fatos e levando em consideração que grande parte do público da Revelo são de desenvolvedores, precisávamos levantar mais dados para entender se de fato poderia ser um risco para a iniciativa. Com isso, depois de quebrar um pouco a cabeça, conversando com stakeholders e outros designers, precisávamos executar um<strong> </strong>experimento que nos ajudasse a coletar evidências mais fortes para entender se este risco era real. Com isso, surgiu a ideia do nosso próximo experimento.</p><h4>🧪 2ª Experimento: Push notification e lista de espera</h4><p>Notificações sendo mal utilizadas podem gerar frustrações e insatisfação em usuários. Mas se bem utilizadas, podem ser uma boa fonte de dados para avaliar o interesse das pessoas por novas funcionalidades de forma rápida e barata. <br>Para coletar mais evidências do problema que identificamos anteriormente, fizemos disparos de pushes com a abordagem de um experimento de lista de espera para 2 públicos com um número controlado de usuários:</p><ul><li>Desenvolvedores Seniors: Identificar se este público cadastrado na Revelo manifestava interesse em ser mentores, sem remuneração.</li><li>Desenvolvedores iniciantes: Identificar se esse público manifestava interesse em marcar uma mentoria gratuita com profissionais seniors do mercado.</li></ul><blockquote><strong>Fica a dica:</strong> Fizemos os mesmos disparos para a carreira de design, pois identificamos em nossa pesquisa que pessoas desta área de atuação já realizavam as mentorias em comunidades e plataformas online. Esse disparo nos ajudou a entender o comportamento deste público em nossa plataforma, além de permitir comparar públicos de áreas distintas.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*yazeVHFDVoFgea4y" /></figure><p>Nesta push, os usuários eram levados para um Typeform onde registravam o seu interesse, respondendo algumas perguntas e colocando algumas informações de contato, para participar da nossa lista de espera da nova funcionalidade. Com isso, conseguimos entender a desejabilidade dos dois públicos: Pessoas que queriam fazer mentoria e que queriam dar a mentoria.</p><p>Registrando os aprendizados deste experimento, identificamos que de fato, o número de pessoas interessadas na área de design era maior, porém, o número de pessoas interessadas na área de desenvolvimento era considerável. Isso nos deu evidências suficientes para continuar a evoluir a iniciativa.</p><h3>Desenvolvendo e colocando na mão do usuário</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qSxCLRhcHHxtjGsJpG85dQ.png" /><figcaption><em>Na segunda etapa no projeto, tínhamos evidências sobre a desejabilidade do público pela funcionalidade. Agora precisávamos entender como torná-la viável</em></figcaption></figure><p>Identificando a desejabilidade do nosso público pela funcionalidade, tínhamos uma lista de pessoas interessadas em mentorar e outras desejando receber ajuda. Partimos então para a próxima etapa de validação:</p><blockquote><em>Como podemos conectar essas duas pontas, de forma a comprovar a viabilidade do negócio?</em></blockquote><p>Pegando os aprendizados adquiridos nos processos anteriores, sabíamos que precisávamos fazer um experimento com um caráter mais de validação e menos de descoberta. Com isso, veio a ideia do nosso próximo experimento.</p><h4>🧪 3ª Experimento: Mágico de Oz e ferramentas low code</h4><p>Como expliquei na 1ª parte do artigo, o experimento de mágico de oz consiste em entregar uma experiência funcional para o consumidor final de forma manual, reduzindo custos, mas ainda assim, coletando evidências fortes do funcionamento do serviço final. Porém, com a evolução de plataformas low code, é possível criar experiências fidedignas a uma final diminuindo várias etapas manuais no processo.</p><p>Existem várias ferramentas no mercado para auxiliar nesta etapa. A que melhor encaixou em nossa realidade foi o webflow, que apesar de ser uma ferramenta para desenvolvimento de websites, queríamos que o experimento fosse flexível, caso precisássemos mostrar o produto final em um app para as pessoas da Revelo e também em um formato desktop para os mentores interessados em ver a iniciativa.</p><p>Com a ferramenta definida, fomos para o escopo desta primeira proposta. Pegando os nossos benchmarks e insights da nossa pesquisa, decidimos que o serviço seria gratuito para ambas as partes e precisávamos que nessa primeira versão contemplasse:</p><p><em>Para pessoas que buscam a mentoria:</em></p><ul><li>Uma lista de mentores</li><li>Uma página com mais detalhes, para a pessoa avaliar se o mentor poderia auxiliar em suas dúvidas</li><li>Conseguir visualizar uma agenda de horários e marcar uma conversa com o mentor via vídeo chamada</li></ul><p><em>Para os mentores:</em></p><ul><li>Pegar as informações para realizar seu cadastro</li><li>Criar uma agenda de horários disponíveis para conversar</li><li>Registrar o evento em sua agenda com a sala da videochama para a conversa</li></ul><p>Identificamos que o calendly já era uma ferramenta muito utilizada para gerar os agendamentos das conversas para os mentores. Aproveitamos então essa tecnologia para facilitar o processo de agendamento e com o typeform, criamos uma primeira versão do nosso signup dos mentores para adicioná-los em nossa lista.</p><p>Depois de 4 dias montando a interface e coletando as informações dos mentores interessados, tínhamos a nossa primeira versão do produto funcionando. Gostaria de deixar um agradecimento para todas as pessoas da Revelo e para todos os mentores que participaram da lista para ajudar a validar a nossa ideia ❤️</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/0*wokpWGQ1_Q3O_7aQ" /></figure><blockquote><strong>Fica a dica:</strong> Nesta etapa inicial de validação, uma dica muito valiosa é colocar uma área de feedback no final da página com um link para um forms para coletar observações e insights dos usuários que estão utilizando. Isso pode acelerar no processo para entender ainda mais se a proposta está funcionando.</blockquote><p>Com a nossa página construída, o próximo passo foi estabelecer um tracking mínimo para entender se o critério de sucesso que estabelecemos no início do experimento foi atingido. Com a ajuda do time de BI e Growth da Revelo, usamos a ferramenta do google analytics para nos auxiliar nesta etapa.</p><p>Agora a parte que mais estávamos esperando: testar e colocar na mão do usuário. Pegamos a nossa lista de pessoas que estavam interessadas em participar da iniciativa, disparamos uma push pelo app com um link para a nossa página no webflow. Depois com uma pequena ajuda de tech, colocamos um card (estrutura que comentei no 1ª parte do artigo) dentro do nosso app com um link para a página via back-end, tirando a necessidade lançar uma nova atualização na loja.</p><blockquote><strong>Fica a dica: </strong>caso seu app tenha um volume de acesso muito grande, deixe essa área disponível para um número controlado de pessoas, evitando assim possíveis problemas que podem ocorrer pelas limitações das ferramenta lowcode.</blockquote><h3>Resultados e observações</h3><p>Depois de alguns dias rodando a página, conseguimos ter dados suficientes para entender e avaliar o nosso critério de sucesso. E os resultados superaram as nossas expectativas: tivemos o dobro de conversas do que era esperado, sendo que dessas conversas, cerca de 60% foram marcadas por pessoas da área de desenvolvimento, mitigando o risco que levantamos no início da pesquisa. Mas o que mais impactou a gente foi o relato de duas pessoas que participaram no processo:</p><blockquote>O Rodolfo que tem o sonho de virar desenvolvedor mas sabia pouco sobre a área e ,em sua cidade, é muito difícil ter o contato com algum profissional que atua no mercado. Pela mentoria, Rodolfo pode conhecer pela primeira vez uma pessoa que atua na área, conseguiu tirar suas dúvidas e conheceu ainda mais sobre a profissão que tanto sonha em atuar.</blockquote><blockquote>E o Lauro que recebeu dicas do que fazer em entrevistas e foi contratado em nossa plataforma com a ajuda dessas dicas!</blockquote><p>Com os resultados, conseguimos validar nossa aposta e junto ao time de tecnologia, vamos escalar a iniciativa para ajudar e impactar ainda mais pessoas no processo.</p><p>…</p><p><em>Gostaria de deixar um agradecimento especial ao </em><a href="https://medium.com/u/9d793d0f8606"><em>Michel</em></a><em>, sendo um dupla e tanto durante esta jornada, ao </em><a href="https://medium.com/u/1952cc3eb9b5"><em>Paulo</em></a><em> e </em><a href="https://medium.com/u/52b6dba2fa5a"><em>Will</em></a><em>, que nos guiou com conselhos em todas as etapas do processo. E por último, mas não menos importante, a todos os mentores que participaram nas pesquisas e em nossos experimentos, sempre muito dispostos a ajudar outras pessoas, não esperando nada em troca e visando na evolução do próximo.</em></p><p>…</p><h3><strong>Referências</strong></h3><p>Michel Nassif, tech revelo. <a href="https://bit.ly/3Ao8XZv"><strong>Nuggets de Experimentos: como tornar acessível os resultados de seu discovery</strong></a></p><p>Will Sertório, UX Collective. <a href="https://bit.ly/3Ao8Ywx"><strong>Batendo o bumbo: boas práticas para empoderar times de produto e design</strong></a></p><p>Douglas Iacovelli, tech revelo. <a href="https://bit.ly/2XaIq3F"><strong>Como lançamos o app iOS da Revelo em 1 mês</strong></a></p><p>Alex Osterwalder, David J. Bland. <a href="https://amzn.to/3iwlPGO"><strong>Testing Bussiness Ideas: Este é um guia de campo de experimentação rápida</strong></a></p><p>Tomer Sharon. <a href="https://amzn.to/3AmPUi9"><strong>Validating Product Ideas</strong></a></p><p>Ash Maurya, <a href="https://amzn.to/3iuOcVR"><strong>Running Lean: Iterate from Plan A to a Plan That Works</strong></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3785c1b91912" width="1" height="1" alt=""><hr><p><a href="https://medium.com/revelo-tech/experimenta%C3%A7%C3%A3o-em-app-como-testar-de-forma-%C3%A1gil-sem-precisar-lan%C3%A7ar-uma-nova-vers%C3%A3o-na-loja-3785c1b91912">Experimentação em app: como testar de forma ágil sem precisar lançar uma nova versão na loja …</a> was originally published in <a href="https://medium.com/revelo-tech">tech.revelo</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Experimentação em app: como testar sem precisar lançar uma nova versão na loja - Parte 1]]></title>
            <link>https://medium.com/revelo-tech/experimenta%C3%A7%C3%A3o-em-app-como-testar-de-forma-%C3%A1gil-sem-precisar-lan%C3%A7ar-uma-nova-vers%C3%A3o-na-loja-parte-4192e2eb181f?source=rss----9442b857e762---4</link>
            <guid isPermaLink="false">https://medium.com/p/4192e2eb181f</guid>
            <category><![CDATA[apps]]></category>
            <category><![CDATA[experimentação]]></category>
            <category><![CDATA[produtos]]></category>
            <category><![CDATA[discovery]]></category>
            <category><![CDATA[design]]></category>
            <dc:creator><![CDATA[Arthur Braga e Silva]]></dc:creator>
            <pubDate>Tue, 17 Aug 2021 19:31:59 GMT</pubDate>
            <atom:updated>2021-11-04T02:22:17.967Z</atom:updated>
            <content:encoded><![CDATA[<p>Apesar dos aplicativos serem um canal que está no bolso do usuário final, um dos seus principais problemas é a complexidade tecnológica envolvida em seu ciclo de atualizações nas lojas, que deixa todo o processo de experimentação e validação de ideias mais demorado. Nesta série de artigos demonstrarei de forma simplificada como lidamos com este problema na Revelo.</p><p>Na 1ª parte apresentarei um manual prático de experimentos e como realizá-los em seu app. Já na <a href="https://medium.com/revelo-tech/experimenta%C3%A7%C3%A3o-em-app-como-testar-de-forma-%C3%A1gil-sem-precisar-lan%C3%A7ar-uma-nova-vers%C3%A3o-na-loja-3785c1b91912">2ª parte</a>, detalharei como validamos a ideia de uma plataforma de mentoria gratuita em nosso app utilizando essa metodologia.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*mg6KqAvWGV9pdY1T" /><figcaption>(Arte de <a href="https://www.instagram.com/neuecoldworld/">Rodrigo Maia</a>)</figcaption></figure><h3>Antes, um pouco de contexto</h3><p>O app da Revelo foi lançado em março de 2020 e teve como principal aposta trazer uma nova forma de interação dos usuários com a plataforma, além da versão web já previamente consolidada. Após alguns meses, começamos a notar uma melhoria no engajamento dos usuários com o produto, que resultou em taxas de respostas 4x mais rápidas se comparado com os candidatos que utilizavam o produto na web.</p><p>Mas este resultado gera um custo. O desenvolvimento de aplicativos tende a ter um tempo de implementação mais elevado se comparado com outras plataformas, devido a:</p><ul><li>Tecnologia — Além das dificuldades técnicas envolvidas no back-end e na construção da interface e deeplinks, o custo da mão de obra envolvida no desenvolvimento é mais elevado considerando que equipes distintas são envolvidas na construção de apps para IOS e Android. É possível ganhar velocidade utilizando tecnologias híbridas, como <a href="https://medium.com/u/9fe9b10a2cfa">Douglas</a> mostrou muito bem em seu artigo sobre como tomamos a decisão de migrar o app da Revelo para o flutter. Mas ainda assim, a velocidade de desenvolvimento de versões mobile e web ainda tem suas diferenças</li><li>Ciclo de atualizações — Todo app tem seu ciclo de atualizações nas lojas (PlayStore ou AppStore) e passam por um processo de validação antes de irem para o ar. Dentro deste processo, temos a variável da loja aceitar a sua versão e esperar que os usuários a baixem para ter acesso à nova funcionalidade. Isso pode levar dias até a entrega do serviço/produto na mão do usuário, o que deixa todo o processo de experimentação e validação de novas ideias mais demorado.</li></ul><p>Na Revelo, temos uma cultura de ‘discovery’ de ter ao menos um aprendizado na semana, seja por experimentos de funcionalidades ou por pesquisas (se quiserem saber mais, o <a href="https://medium.com/u/52b6dba2fa5a">Will</a>, Product Design Manager na Revelo fez um ótimo <a href="https://bit.ly/3Ao8Ywx">artigo sobre</a>). Então, nos deparamos com um desafio:</p><blockquote>Como podemos experimentar uma nova funcionalidade de forma mais ágil dentro do contexto de desenvolvimento de app?</blockquote><h3>Mas calma… o que é um experimento?</h3><blockquote><em>“Os experimentos são o meio de reduzir o risco e a incerteza de sua ideia de negócio” — David J. Bland &amp; Alex Osterwalder</em></blockquote><p>Dentro da Revelo, temos a cultura de realizar experimentos com objetivo de reduzir as incertezas e riscos em nossos projetos. Em nosso <a href="https://revelo.gitbook.io/playbook/introducao/como-trabalhamos">Playbook,</a> detalhamos o que são os experimentos e como fazemos para registrá-los afim de defender as nossas ideias com o time de tecnologia e stakeholders.</p><h3>Priorizando seus experimentos</h3><p>Para conseguir escolher o melhor experimento para o seu momento, existem fatores que ajudam a nos nortear nesta jornada. O primeiro é entender o momento em que você está em seu projeto:</p><p><strong>Descoberta (Desejabilidade)</strong> — esta etapa é considerada a inicial no processo, quando você ainda tem dúvidas sobre a validade de suas hipóteses. Nela, experimentos com evidências fracas são o suficiente para entender se você está indo no caminho certo.</p><p><strong>Validação (Viabilidade)</strong> — esta é uma etapa mais avançada, que requer experimentos com um grau de complexidade maior já que exigem evidências mais fortes para reconhecer se a direção que você tomou no início do processo foi validada ou refutada.</p><p>Entendendo o momento que está em seu projeto, você já consegue visualizar qual experimento faz mais sentido para conseguir coletar evidência/dados necessários, seguir com seus próximos passos e finalmente validar sua ideia. Existem alguns critérios que também o auxiliarão na escolha do melhor experimento para a etapa da sua jornada de experimentação:</p><p>💪 <strong>Força da evidência </strong>— Evidências são aprendizados que te ajudam a dar suporte ou a refutar suas ideias/hipóteses durante sua jornada de experimentação. Quanto menos evidências você tiver de suas ideias, menos custo e tempo você deve perder.</p><p>💰 <strong>Custo — </strong>Neste critério você deve levar em consideração quantas pessoas vão estar envolvidas no processo e quanto tempo você ainda tem para conseguir escolher o experimento certo para mostrar e convencer os stakeholders sobre o andamento do projeto.</p><p>⏱ <strong>Tempo </strong>— Neste critério deve-se levar em consideração dois pontos: o tempo para você construir o experimento e o tempo para você conseguir coletar os resultados. Tente aproveitá-lo da melhor forma para a coleta o máximo de evidências em seu projeto.</p><p>Boas práticas:</p><ul><li><strong>Comece da forma mais barata e rápida.</strong> Quanto menos você sabe, escolher experimentos rápidos ajudam a entender se está em uma direção certa.</li><li><strong>Aumente a força de suas evidências com múltiplos experimentos.</strong>Nunca faça decisões importantes com base em um experimento ou em uma evidência fraca.</li><li><strong>Tente sempre priorizar o experimento que fornecerá uma evidência forte.</strong> Sempre leve em consideração o seu contexto e o tempo que você tem para tomar suas decisões.</li><li><strong>Tente reduzir o máximo de incertezas antes de começar a construir algo grande. </strong>Às vezes achamos que precisamos construir algo para testar uma ideia. Na parte 2 deste artigo, mostrarei como experimentamos uma ideia sem ainda ter o produto funcionando.</li></ul><h3><strong>Tipos de experimentos em ambientes de app</strong></h3><p>Agora vou mostrar como e quais experimentos você pode executar em sua jornada para testar suas ideias. Leve em consideração os critérios acima para escolher o melhor experimento para o seu momento. Logo a seguir, você encontrará as ferramentas que utilizamos e quais experimentos podemos executar com elas.</p><p>Um ponto importante é que essas ferramentas tem o objetivo de minimizar o esforço do time de tecnologia, sem precisar que você tenha que lançar uma nova versão na loja para conseguir experimentar sua ideia. Para isso, o back-end em app acaba sendo um grande aliado no processo de experimentação ágil, fazendo com que você consiga executar seus experimentos sem precisar entrar em ciclos de atualização.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Ku9JkM5PLiL0B9YK" /><figcaption><em>Nesta imagem contém os experimentos listados abaixo, sendo categorizados pelos critérios citados anteriormente: tipo de experimento, força da evidência, tempo e custo.</em></figcaption></figure><h3>Push notifications</h3><p>Notificação é uma das ferramentas mais democráticas para conseguir suas primeiras evidências em um curto período de tempo. Ela possui um custo inicial alto porque primeiramente você precisará construir ou contratar um serviço de disparo de notificações para deixar o processo mais ágil e sem precisar envolver toda vez o time de tecnologia no processo. Mas depois de construído, você consegue realizar experimentos que te darão resultados no mesmo dia em que executá-los. Um boa prática é sempre utilizar as notificações em grupos controlados de usuário para minimizar possíveis riscos para o seu produto</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*wr1LTZIXkqclA0J6" /></figure><h4>Quais experimentos posso executar com ela:</h4><p><strong>Fake door (porta falsa)<br></strong>💪 💪 | 💰 | ⏱ | Descoberta (Desejabilidade)</p><p><em>O que é — </em>Descreva a sua proposta de valor no texto da notificação e quando o usuário tocá-la, você comunicará que a funcionalidade ainda não está pronta e que ainda está em construção. Por isso o nome porta falsa.</p><p><em>Como fazer — </em>Uma boa forma de você executá-lo é criando um link da notificação para um formulário, como o Typeform ou Google forms. Assim você pode dar mais contexto da sua ideia e coletar pessoas que estão interessadas em ajudar, criando um lead rápido para realizar pesquisas futuras. Quando a pessoa acessar o seu formulário, tente escrever um texto que não a frustre, já que a experiência neste experimento não é a das melhores. É de extrema importância coletar o número de clicks na notificação para conseguir avaliar o interesse do seu público por aquela funcionalidade</p><p><strong>Lista de espera<br></strong>💪 💪 | 💰 | ⏱ | Descoberta (Desejabilidade)</p><p><em>O que é </em>— Este experimento é bem parecido com o do Fakedoor, mas ele tem o objetivo de coletar pessoas interessadas em testar seu produto no futuro. Este tipo de pessoa tende a estar disposta a testar sua ideia, mesmo ela não sendo 100% completa. São pessoas muito valiosas para você conseguir experimentar e pegar feedbacks de suas ideias mais tarde</p><p><em>Como fazer </em>— Você pode utilizar a mesma estratégia como foi comentada no experimento de fakedoor. Mas, quando a pessoa acessar seu formulário, mostre uma mensagem que o seu produto ainda está em fase de teste e que para participar, ela deve preencher o formulário para entrar em uma lista de espera. Sempre lembre de medir os acessos para validar o seu critério de sucesso do experimento.</p><p><strong>Teste A/B<br></strong>💪 💪 | 💰 | ⏱ ⏱ | Descoberta (Desejabilidade)</p><p><em>O que é </em>— Testes A/B são testes que realizam comparações entre 2 grupos de variáveis com o objetivo de definir qual delas gera a melhor resposta para a solução.</p><p><em>Como fazer </em>— Neste caso, um exemplo mais prático utilizando notificações seria identificar qual de suas ideias têm um maior interesse por parte do seu público. Basta disparar duas notificações com duas propostas de valores diferentes para dois grupos separados, assim, quando você analisar a taxa de abertura das duas, você consegue identificar qual delas teve uma significância estatística maior de interesse do seu público. Existem calculadoras que ajudam a fazer esta conta, como está <a href="https://ferramentas.resultadosdigitais.com.br/calculadora-teste-ab/resultado">aqui</a>. Este é um exemplo de teste A/B, mas você pode criar as suas próprias alternativas para avaliar a melhor resposta para os seus problemas.</p><h3>Estruturas internas dentro do app</h3><p>Criar estruturas internas dentro do seu app também pode ajudar a entender o engajamento e a desejabilidade do seu público pelas suas funcionalidades. <strong>Os tipos de experimentos que podem ser realizados são iguais aos realizados pela notificação</strong>, mas, com a diferença que você vai estar avaliando o uso da funcionalidade conforme a pessoa estiver utilizando seu app, sem ser um aviso instantâneo como é a notificação.</p><p>Criar estas estruturas acabam tendo um custo maior de implementação, já que você e seu time vão ter que criá-las para conseguir alterar e mandar informações via back-end para não precisar lançar uma nova versão na loja para fazer seus experimentos. Existem alguns serviços, como o appcues, que auxiliam nisso, mas ainda está em versão beta para ambientes de aplicativos. Vou citar dois exemplos de estrutura que você pode construir com seu time:<br> <strong><br>Pop-up Banner — </strong>Neste exemplo, você pode acionar um banner quando um usuário abrir seu app ou ao acessar uma sessão de seu aplicativo. É de extrema importância o banner ter um padrão de informação e que você crie uma estrutura junto ao seu time de tecnologia para fazer o seu envio para o usuário final via back-end quando necessário. Assim, você tira a variável de esperar a autorização da loja para subir um novo banner.</p><p><strong>Card </strong>— O card seria uma abordagem bem parecida com banner, porém, ele constitui de um componente que se encontra dentro de uma sessão em seu app. Ele deve ter a mesma facilidade de acrescentar e tirar informações via backend, como comentado anteriormente.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*TFD1l7FZ-p0f1tAS" /><figcaption><em>Nesta imagem, mostramos as duas estruturas que construímos no app da Revelo para ajudar em nossos experimentos: Pop-up Banner e o Card.</em></figcaption></figure><h3>Ferramentas low-code</h3><p>Hoje, está cada vez mais fácil conseguir experimentar ideias de produto de forma fiel a uma proposta final sem prejudicar a experiência final do usuário. As ferramentas low-code podem auxiliar você neste processo, possibilitando construir experimentos que necessitam de um grau de validação e de amostragem mais real com uma proposta final.</p><p>Existem várias ferramentas low-code para ambientes de app, como Adalo, Bubble, Webflow e elas permitem você criar estes experimentos em uma página web de forma rápida e sem código, sendo fácil linkar com o seu produto no app por meio de uma webview.</p><p>Na segunda parte do artigo, mostro um pouco como construímos um serviço funcional utilizando ferramentas lowcode.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*BCCjW4fETSjRe8pf" /></figure><h4>Quais experimentos posso executar com ela:</h4><p><strong>Landing page<br></strong>💪 💪 | 💰 💰 | ⏱ ⏱ | Descoberta (Desejabilidade) e Validação (Viabilidade)</p><p><em>O que é — </em>A landing page é uma simples página na web que mostra de forma clara a proposta de valor do produto/serviço vendido ali com um ação clara do que o usuário precisa fazer.</p><p><em>Como fazer — </em>Escolha um melhor template de design para a sua estrutura e sempre lembre de otimizar a experiência para ambientes mobile. Uma dica de ouro é utilizar outros serviços, como google analytics, para entender o comportamento do usuário na página e tenha em mente 4 pontos importantes que a sua estrutura deve ter:</p><p>• Uma proposta de valor clara com a ideia de testar sua hipótese e já criar uma conexão com o usuário sobre o que está falado naquela página<br>• Fale nessa página sobre as principais dores de seu usuário para que ele crie uma conexão com a sua proposta de valor.<br>• Mostre qual a solução que você tem para essas dores de forma clara<br>• Sempre lembre do seu CTA (Call to action) e qual o objetivo que você quer extrair quando o usuário tocar neste botão, como pegar algumas informações de contato para utilizá-las no futuro.</p><p><strong>Mágico de Oz<br></strong>💪 💪 💪 | 💰 💰 | ⏱ ⏱ ⏱ | Descoberta (Desejabilidade) e Validação (Viabilidade)</p><p><em>O que é — </em>O mágico de oz consiste em você entregar uma experiência mínima do seu produto de forma a reduzir ao máximo o uso de tecnologia e fazê-lo de forma manual, mas sem que o consumidor saiba que tem uma pessoa fazendo este serviço por trás.</p><p><em>Como fazer — </em>Com as ferramentas low-code, você pode construir uma experiência mínima em uma webpage e linkar com outras tecnologias para facilitar e diminuir o impacto manual no processo. Uma ferramenta que pode ajudar bastante neste processo é o Zapier, que consegue integrar planilhas no google sheets com as estruturas nas ferramentas low-code, como o webflow, deixando todo o processo mais fácil de se gerenciar. <br>No próximo artigo, mostrarei como executei um experimento utilizando Mágico de Oz para validarmos nossa plataforma de mentoria, junto a um guia de boas práticas durante o seu processo de execução.</p><p><strong>Concierge<br></strong>💪 💪 💪 | 💰 💰 💰 | ⏱ ⏱ ⏱ | Descoberta (Desejabilidade) e Validação (Viabilidade)</p><p><em>O que é — </em>O concierge parte do mesmo princípio do mágico de oz, porém, a ideia é que a pessoa que está envolvida no processo manual fica clara e visível para o consumidor final</p><p><em>Como fazer — </em>Você pode utilizar a mesma lógica de webpages comentadas acima para conseguir ter um primeiro contato com seu usuário. Tente executar outros experimentos antes de começar com esse. Tente coletar o contato das pessoas que querem resolver o problema com o seu produto/serviço e converse com elas por email ou whatsapp vendendo uma proposta final para ajudá-las em suas dores. Lembre-se sempre que concierge não é uma solução escalável e sim, uma forma de apenas testar sua ideia na prática. E lembre-se também desses 3 passos para auxiliar no processo:</p><ul><li>Prepare seu plano, tente utilizar planilhas para registrar os seus passos e ordens que você precisa executar com cada pessoa interessada.</li><li>Execute a ordem e registre nessa planilha quanto tempo demorou para realizá-la e tente pegar o feedback dos usuários que você entrou em contato com um forms.</li><li>Analise os resultados junto aos feedbacks que você coletou no forms para melhorar a próxima vez que você entrar em contato com uma nova pessoa.</li></ul><h3>Observações finais</h3><p>Experimentos ao mesmo tempo que podem ser interessantes, se não documentados afim de entender o objetivo final que se quer atingir com eles, podem virar uma bola de neve interminável. Mantenha o registro de seus experimentos e sempre analise com cautela os resultados que atingiu antes de partir para o próximo (<a href="https://bit.ly/3Ao8XZv">neste artigo</a> o <a href="https://medium.com/u/9d793d0f8606">Michel</a>, Product Manager na Revelo, explica bem como fazemos isso na Revelo).</p><p>Tente sempre se guiar pelos dados e aprendizados que você extraiu e nunca se apaixone pela sua ideia/hipótese, e sim, pelo problema que você quer resolver. Lembre-se: experimentos servem para validar ou invalidar sua hipótese.</p><p>E não se limite em realizar apenas os experimentos que mostrei neste artigo. Vou deixar aqui em baixo as referências que utilizei para a construção deste guia e lá você poderá encontrar vários outros tipos de experimentos. As observações acima foram tiradas dessas referências e da minha vivência no mundo de produto. Não tome elas como verdade absoluta, busque suas referências, converse com outros profissionais para ganhar mais contexto e para evoluir ainda mais rápido com seus experimentos.</p><p>Agora, na <a href="https://medium.com/revelo-tech/experimenta%C3%A7%C3%A3o-em-app-como-testar-de-forma-%C3%A1gil-sem-precisar-lan%C3%A7ar-uma-nova-vers%C3%A3o-na-loja-3785c1b91912">2ª parte</a>, mostrarei na prática esta metodologia de experimentação e como utilizamos ela para validar uma ideia de plataforma de mentoria gratuita dentro do app da Revelo. Te espero lá 👋</p><p>…</p><p><em>Mas e ai, como você testa e experimenta suas ídeias no seu dia-a-dia em aplicativos? Compartilhe aqui embaixo sua experiência com a gente! :)</em></p><p>…</p><h3>Referências</h3><p>Michel Nassif, tech revelo. <a href="https://bit.ly/3Ao8XZv"><strong>Nuggets de Experimentos: como tornar acessível os resultados de seu discovery</strong></a></p><p>Will Sertório, UX Collective. <a href="https://bit.ly/3Ao8Ywx"><strong>Batendo o bumbo: boas práticas para empoderar times de produto e design</strong></a></p><p>Douglas Iacovelli, tech revelo. <a href="https://bit.ly/2XaIq3F"><strong>Como lançamos o app iOS da Revelo em 1 mês</strong></a></p><p>Alex Osterwalder, David J. Bland. <a href="https://amzn.to/3iwlPGO"><strong>Testing Bussiness Ideas: Este é um guia de campo de experimentação rápida</strong></a></p><p>Tomer Sharon. <a href="https://amzn.to/3AmPUi9"><strong>Validating Product Ideas</strong></a></p><p>Ash Maurya, <a href="https://amzn.to/3iuOcVR"><strong>Running Lean: Iterate from Plan A to a Plan That Works</strong></a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4192e2eb181f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/revelo-tech/experimenta%C3%A7%C3%A3o-em-app-como-testar-de-forma-%C3%A1gil-sem-precisar-lan%C3%A7ar-uma-nova-vers%C3%A3o-na-loja-parte-4192e2eb181f">Experimentação em app: como testar sem precisar lançar uma nova versão na loja - Parte 1</a> was originally published in <a href="https://medium.com/revelo-tech">tech.revelo</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Criando um grupo de beta testers]]></title>
            <link>https://medium.com/revelo-tech/criando-um-grupo-de-beta-testers-5089d0b06824?source=rss----9442b857e762---4</link>
            <guid isPermaLink="false">https://medium.com/p/5089d0b06824</guid>
            <category><![CDATA[user-testing]]></category>
            <category><![CDATA[research]]></category>
            <category><![CDATA[design]]></category>
            <dc:creator><![CDATA[Will Sertório]]></dc:creator>
            <pubDate>Tue, 03 Aug 2021 13:23:02 GMT</pubDate>
            <atom:updated>2021-08-03T13:21:50.560Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tWkWh9VrkanN8_nyzX4usw.png" /></figure><h3>Um pouco de contexto</h3><p>No começo de 2021, o time de design da Revelo começou a crescer. Até então, cada um era responsável pelo próprio recrutamento para entrevistas, testes de usabilidade, validações e afins.</p><p>O time sentia que poderíamos melhorar esse processo. Nesse texto, vamos contar um pouco sobre o que fizemos.</p><p>Eu comecei a acompanhar quantas entrevistas o time de design e produto faziam por trimestre. No Q4 de 2020, foram 23 entrevistas. Éramos um time de cinco pessoas na época,então decidimos melhorar esses números.</p><h3>Quebrando a cuca juntos</h3><p>A primeira coisa que fizemos foi colocar todo mundo na mesma página.</p><p>Rodamos um workshop com o time de design e produto, que seguiu a seguinte estrutura:</p><figure><img alt="Tela com post-its, ilustrando como foi o workshop com o time." src="https://cdn-images-1.medium.com/max/1024/1*sT4TDBULlf28bJHxH3IBrA.png" /></figure><h4>1. Levantamento</h4><p>Em post-its, cada pessoa colocou quais são os problemas que temos com recrutamento hoje. Quais são os pontos que você perde mais tempo e energia?</p><blockquote><strong>😺 Jump of the cat</strong> — Em atividades assim, prefiro limitar o número de post-its de cada um. Três é um bom número. Assim as pessoas priorizam os problemas que querem levar, fica mais fácil de agrupar e não vira um pity party (o famoso chororô desnecessário).</blockquote><h4>2. Agrupamento</h4><p>Peça aos participantes irem agrupando os problemas parecidos. A pessoa que está puxando o workshop vai orientando, e ajudando a dar um nome a cada grupo de problemas.</p><h4>3. Priorização</h4><p>É pouco prático tentar resolver todos os problemas. Então fizemos um processo onde cada um tinha três votos, e podia votar nos grupos de problemas que achava mais importante de ser resolvido primeiro.</p><h4>4. Criando um ponto de vista</h4><p>Até aí, beleza. Antes de pular na solução, o próximo passo foi criar um “how might we…” (“como podemos”, em português). A partir dos problemas priorizados, a ideia aqui era pensarmos em qual pergunta exatamente queremos responder.</p><p>Comecei dando uma sugestão, e as pessoas foram construindo em cima dela. Isso é super importante. Em exercícios criativos, começar com uma “página em branco” pode intimidar e travar as pessoas.</p><p>Escrevemos umas 4 ou 5 versões diferentes, até sentir que chegamos na frase que melhor representava o problema e seguimos.</p><p>A frase que chegamos foi:</p><blockquote>“Como podemos criar um processo de escuta ativa, para conseguir coletar mais feedbacks do mercado?”</blockquote><blockquote><strong>😺 Jump of the cat</strong> — Pra mim, exercícios de escrever em conjunto são um dos mais difíceis de facilitar. Esse, se você não souber moderar e não dominar o problema, pode demorar demais. Garanta que todos dêem sua opinião, mas não abra demais. Se alguém der uma sugestão muito longe, é seu papel tesourar educadamente e trazer as pessoas pro foco certo. Quando sentir que a frase certa chegou, tente construir consenso e pular pra próxima atividade. Nem tudo precisa de votação.</blockquote><blockquote><strong>😺Jump of the cat 2 </strong>— Muitas pessoas que fazem design tem medo de soarem “agressivas” e usam votação para tudo. Pense bem em qual o momento certo de ser mais democrático, e onde temos que ter pulso mais firme. Design por comitê não funciona.</blockquote><h4>5. Dando ideias</h4><p>Com a pergunta definida, começamos a pensar em ideias para respondê-la. Sem prototipar, apenas escrevendo as ideias em post-it mesmo. Também limitamos o número de ideias por pessoa, pra que cada um faça seu próprio filtro e não tenhamos que todos ficar discutindo ideias “half-baked” em grupo. Isso economiza bastante tempo.</p><h4>6. Pós-workshop</h4><p>Depois do workshop, comecei a agrupar e dar um contorno para as ideias geradas. Depois de algumas iterações e discussões, chegamos na ideia final: criar um “user’s day”. Um dia onde todos do time entrevistariam usuários.</p><p>Isso facilitaria o recrutamento, e daria mais cadência para as conversas que temos com o mercado.</p><p>Pra fazer essa ideia funcionar, precisávamos de duas coisas: uma lista de pessoas interessadas em conversar (usuárias e não-usuárias), e um processo para recrutá-las semanalmente.</p><h3>Setupando</h3><h4>Landing Page</h4><p>Construímos uma landing page pra explicar como o programa funcionaria, respondendo uma série de perguntas que as pessoas poderiam ter.</p><p>A landing é boa até como exercício de alinhamento interno. As pessoas batem o olho e conseguem conversar melhor se é aquilo mesmo que elas tinham imaginado.</p><figure><img alt="Imagem exibindo uma parte da landing page." src="https://cdn-images-1.medium.com/max/1024/1*Fl9EwoAPeDMP1vY9Er4tGA.png" /></figure><p>Você pode conferir a <a href="https://betatesters.revelo.com.br/">LP</a> aqui. A estrutura dela é basicamente a seguinte.</p><ol><li><strong>Proposta de valor</strong><br>Enfatizamos o benefício-chave: nos ajudar a construir o futuro do mercado de recrutamento e seleção.</li><li><strong>Vendendo o peixe</strong><br>Sensibilizamos a pessoa, explicando que a maioria dos apps que ela gosta de usar foi construído com muitos testers.</li><li><strong>Como funciona</strong><br>Um passo-a-passo, pra pessoa ter visibilidade do que a espera.</li><li><strong>FAQ</strong><br>Colocamos perguntas frequentes, que podem remover impedimentos na hora da pessoa se cadastrar.</li></ol><p>No formulário, colocamos algumas perguntas que nos ajudariam a filtrar e agrupar as pessoas, facilitando o recrutamento depois.</p><p>Começamos a gerar tráfego para a landing compartilhando ela organicamente no LinkedIn. Em poucos dias, tínhamos quase cem pessoas cadastradas.</p><p><strong>Ferramentas</strong></p><ol><li>Webflow — construir a página</li><li>Typeform — coletar os dados</li><li>Google Spreadsheets — armazenar os dados</li><li>Calendly — gerar um link automático de calendário</li><li>WhatsApp — recrutar as pessoas</li></ol><h3>Users Day</h3><p>Apesar do nome rocambólico, é apenas um dia onde limpamos a agenda pra falar com quem a gente conseguisse. Escolhemos quinta-feira.</p><p>As pessoas que preenchiam o Typeform caiam automaticamente em uma planilha. Até aí, beleza. Na segunda de manhã, seguimos o seguinte passo-a-passo pra coisa funcionar.</p><h4>Atualizar e classificar novos participantes</h4><p>Pegar a turma nova que entrou, colocar em uma nova aba da planilha e clusterizar em cima dos nossos casos de uso (ex: quer trocar de emprego, quer se qualificar, etc).</p><h4>Escolher público que vamos abordar</h4><p>Isso aqui a gente mudou bastante. Mas no geral é definir que tipo de usuário você vai querer entrevistar essa semana. Pode ser todos os clusters, clusters específicos, and so on.</p><h4>Verificar link do Calendly</h4><p>Antes de sair recrutando, é importante checar se o link do Calendly está funcionando, e limitado apenas aos horários na próxima quinta-feira.</p><h4>Verificando template da mensagem</h4><p>Criamos uma mensagem padrão de recrutamento, onde colocamos o nome da pessoa para ficar mais pessoal e parecer menos um robô falando.</p><p>Nossa mensagem é assim:</p><blockquote><em>Oi &lt;nome&gt; ! Aqui é o &lt;seu nome&gt;, sou &lt;cargo&gt; na Revelo. Muito prazer! Recentemente você se cadastrou pra ser beta tester.</em></blockquote><blockquote><em>Temos uma pesquisa que tem tudo a ver com o seu perfil. Ela acontece nessa quinta-feira, no Google Meet. No link abaixo tem algumas opções de horário, é só escolher o que funcionar melhor.</em></blockquote><blockquote><em>Se não puder esta quinta, sem problema! Te convidaremos para as próximas rodadas.</em></blockquote><blockquote><em>&lt;Link do calendly&gt;</em></blockquote><h4>Mandando no zap</h4><p>Criamos uma fórmula no Google Spreadsheet para facilitar essa etapa. Ela é assim:</p><blockquote><em>=CONCATENATE(“https://api.whatsapp.com/send?phone=“;CÉLULA COM O TELEFONE DA PESSOA;”&amp;text;CÉLULA COM A MENSAGEM)</em></blockquote><p>Instalar o WhatsApp Desktop ajuda bastante nesse processo. Basta clicar no link dinâmico da planilha que o WhatsApp já criar uma janela de conversa com a pessoa. Aí é só revisar a mensagem e um abraço.</p><h4>Colocando a turma nos convites</h4><p>Com os convites chegando, alocamos o time de design para entrevistar essas pessoas. Colocamos no máximo duas pessoas por conversa (uma observadora, uma entrevistadora). Mais do que isso, a pessoa do outro lado pode se sentir em um interrogatório. Take it easy my brother Charles.</p><h3>Resultados e próximos passos</h3><p>Na primeira semana, entramos em contato via WhatsApp com 12 pessoas, e entrevistar 4 delas. Nas semanas seguintes, fomos aumentando esse número aos poucos, e fazendo ajustes no processo.</p><blockquote>No final do quarter, o time havia entrevistado 80 pessoas, um número 3x maior que o quarter anterior.</blockquote><p>Ainda estamos melhorando esse processo. Com a ajuda do time de growth, temos e-mails automáticos convidando essas pessoas em momentos-chave da experiência. Futuramente, queremos levar isso para o produto, oferecendo um opt-in para a pessoa se cadastrar de forma mais fácil.</p><p>Ah, e se você quiser ser beta tester, <a href="https://betatesters.revelo.com.br/">chega mais</a>!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5089d0b06824" width="1" height="1" alt=""><hr><p><a href="https://medium.com/revelo-tech/criando-um-grupo-de-beta-testers-5089d0b06824">Criando um grupo de beta testers</a> was originally published in <a href="https://medium.com/revelo-tech">tech.revelo</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[[Flutter] Melhoramos uma API interna: o processo e aprendizados na visão de um dev junior]]></title>
            <link>https://medium.com/revelo-tech/flutter-melhoramos-uma-api-interna-o-processo-e-aprendizados-na-vis%C3%A3o-de-um-dev-junior-b3a71370fba6?source=rss----9442b857e762---4</link>
            <guid isPermaLink="false">https://medium.com/p/b3a71370fba6</guid>
            <category><![CDATA[design-systems]]></category>
            <category><![CDATA[flutter]]></category>
            <category><![CDATA[career-change]]></category>
            <dc:creator><![CDATA[Gabriel Araujo]]></dc:creator>
            <pubDate>Tue, 08 Jun 2021 16:19:07 GMT</pubDate>
            <atom:updated>2021-06-11T23:28:33.976Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*43UFm_q8imxOb9Pc4Yaf6A.jpeg" /></figure><p>Na última semana passei por uma situação de bastante aprendizado na @<a href="https://www.revelo.com.br/">Revelo</a> e gostaria de compartilhar um pouco mais dela com vocês, minha rede. A intenção aqui é, se der tudo certo, dar uma amostra para pessoas que como eu estão em uma fase de transição de carreira sobre como é pensar em melhorias de código e como foi a nossa discussão durante esse processo.</p><h4>O Problema</h4><p>Na Revelo, como parte do nosso design system, utilizamos Badges (crachás, insígnias ou distintivos) para ressaltar informações relevantes no nosso app. Portanto temos, como vocês já devem imaginar, vários estilos diferentes de Badges em várias partes do app.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/243/0*Foiz9gjW3nhYA2Dq" /></figure><p>Focamos sempre em entregas de altíssima qualidade e queremos evitar erros de design que possam ser inseridos acidentalmente por nós mesmos no momento do desenvolvimento de novas funcionalidades ou até de refatoração de funcionalidades mais antigas.</p><p>Por conta disso, ter uma API interna que nos ajude a evitar tais erros, padronizar o código e facilitar a inserção de novos modelos de design é super importante, certo? Certo! Olhem como estava a nossa Badge antes:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/cbdad1f7815e7df30c157685db49a11b/href">https://medium.com/media/cbdad1f7815e7df30c157685db49a11b/href</a></iframe><p>Na nossa visão, esse modelo de Badge deixaria qualquer desenvolvedor com uma escolha muito aberta em relação a parâmetros importantes como a backgroundColor (cor de fundo da Badge) e a textColor (cor do texto). Além disso, não conseguíamos configurar as bordas caso fosse necessário.</p><p>O mais legal de tudo? Pude pegar esse desafio para mim!</p><h4>Solução 1</h4><p>Meu ponto de partida foi ir mais a fundo no código do Flutter, entender mais sobre como são feitos os Widgets do próprio framework. Minha ideia era que eu já tinha visto algo semelhante no código, então precisaria entender melhor como as coisas são feitas “por trás dos panos” para poder propor uma solução.</p><p>Decidi investigar os botões e acabei chegando no FlatButton, que estende do MaterialButton (isso já me deu uma pequena luz). Acontece que o FlatButton tem exatamente a primeira solução que pensei: um construtor FlatButton.icon que faz o widget principal aceitar um ícone dentro dele, mesmo que o FlatButton não tenha esse paramêtro no seu construtor.</p><p>Long story short: O FlatButton.icon é uma classe com construtor própio, que herda do FlatButton e utiliza um Mixin do MaterialButton para poder utilizar sua própria instância do ButtonTheme.</p><p>Essa parte ficou bem complicada para mim e acabei não entendendo muito bem o uso do Mixin antes de utilizá-lo, mas mesmo assim utilizei e criei classes novas para a nossa Badge como ReveloBagde.transparent, ReveloBadge.red, etc., utilizando essa estratégia.</p><p>Funcionou!</p><p>Mas o nosso código ficou gigante e complexo, por isso fica aqui o primeiro aprendizado: <strong><em>é muito importante entender o que o código faz exatamente antes de adaptá-lo para uma solução própria.</em></strong></p><p>Segundo aprendizado: <strong><em>git commit é muito bom, use sempre! Queria trazer o código dessa versão aqui para vocês mas não commitei e perdi :(</em></strong></p><p>Para pelo menos ilustrar um pouco, deixo o link do Github do Flutter com o código fonte do FlatButton: <a href="https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/material/flat_button.dart">Código fonte FlatButton Widget</a>.</p><h3>Solução 2</h3><p>Trouxe o resultado do meu estudo e implementação para o <a href="https://www.linkedin.com/in/cesaraugustocastro/">Cesar Castro</a> e o <a href="https://www.linkedin.com/in/douglasiacovelli/">Douglas Iacovelli</a>, meus mentores e companheiros de squad na Revelo, para saber o que achavam da minha solução.</p><p>Ela funcionava, de fato, mas não resolvia um dos nossos principais focos: ela nos ajudava em relação a evitar erros na inserção dos parâmetros pois as classes estavam “travadas” mas ela era de difícil manutenção/atualização. Em cada mudança de design, precisaríamos alterar uma classe inteira para poder adaptar a Badge. E se precisássemos de uma Badge com borda E fundo colorido? E se a Badge transparente se tornasse uma com cor de fundo diferente?</p><p>Daí vem uma das maravilhas de poder contar com pessoas incríveis e bastante experientes como o Cesar e o Douglas. Com base nessa solução complexa, chegamos a uma que se tornou muito mais simples e, na minha humilde opinião, bem bonita!</p><p>Aqui fica o terceiro aprendizado: <strong><em>esteja sempre aberto a discutir o seu código, aceitar propostas de melhoria e abraçar todo o aprendizado que vem com isso.</em></strong></p><p>Decidimos então criar uma classe de estilos com construtor privado (não pode ser declarada com construtor fora dela mesma) e utilizá-la com factories para termos todas as opções de estilo das Badges travadas em um só lugar. Isso ajuda muito na manutenção do código, sério.</p><p>Para ilustrar, aqui a classe de estilos que criamos:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a161ff14a47e5cf36ea530bbb68326e0/href">https://medium.com/media/a161ff14a47e5cf36ea530bbb68326e0/href</a></iframe><p>Como vocês podem ver, cada estilo tem as suas cores de fundo e texto já definidas e quando necessário conseguimos definir uma borda também, vide o estilo <em>.outlined</em>.</p><p>Mas só isso também não resolveria o nosso problema, pois ainda teríamos a inserção de um estilo na declaração da Badge, então fomos mais a fundo e utilizamos a mesma estratégia de Factories para termos construtores específicos para cada um deles, como <em>ReveloBadge.blue</em> e<em> ReveloBadge.outlined.</em></p><p>Agora sim, temos um widget que se tornou uma API interna, pode ser utilizado em todo o código com menos risco de fugir do Design System e e maior velocidade de desenvolvimento.</p><p>Para finalizarmos, aqui está o código da nossa classe ReveloBadge refatorada e pronta para uso:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ac7d97a3b92d6a8652d25bcc19725554/href">https://medium.com/media/ac7d97a3b92d6a8652d25bcc19725554/href</a></iframe><p>Obrigado Cesar e Douglas pela oportunidade ❤</p><h4><strong><em>TL;DR</em></strong></h4><p><strong><em>Novos devs:</em></strong><em> não tenham medo de ir fundo no código do framework que estão aprendendo e entender o que eles está fazendo de verdade. Ouçam seus companheiros de equipe que tem mais experiência e não tenham muito apego em relação ao código que fizerem, valorizem cada oportunidade dessas como um intenso aprendizado e internalizem o modo de pensar deles. Isso é </em><strong><em>super importante</em></strong><em> na minha sincera opinião e acredito que vá ajudá-los a se desenvolverem muito mais rapidamente. E usem git commit sem muito dó.</em></p><p><strong><em>Devs experientes:</em></strong><em> dêem desafios e oportunidades como essa para os juniores dos seus times, estejam abertos a ouvir e discutir as soluções propostas e os estimulem a procurar sempre novas e melhores soluções sozinhos, mas sempre os apoiem quando necessário — isso vai ajudá-los a crescer muito mais rápido!</em></p><p>Obrigado pessoal, até a próxima :)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b3a71370fba6" width="1" height="1" alt=""><hr><p><a href="https://medium.com/revelo-tech/flutter-melhoramos-uma-api-interna-o-processo-e-aprendizados-na-vis%C3%A3o-de-um-dev-junior-b3a71370fba6">[Flutter] Melhoramos uma API interna: o processo e aprendizados na visão de um dev junior</a> was originally published in <a href="https://medium.com/revelo-tech">tech.revelo</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Melhores práticas para realizar um kickoff de quarter]]></title>
            <link>https://medium.com/revelo-tech/melhores-pr%C3%A1ticas-para-realizar-um-kickoff-de-quarter-5e411e640bf1?source=rss----9442b857e762---4</link>
            <guid isPermaLink="false">https://medium.com/p/5e411e640bf1</guid>
            <category><![CDATA[squad]]></category>
            <category><![CDATA[kickoff]]></category>
            <category><![CDATA[reunião]]></category>
            <category><![CDATA[product]]></category>
            <category><![CDATA[startup]]></category>
            <dc:creator><![CDATA[Samilla Macedo]]></dc:creator>
            <pubDate>Mon, 31 May 2021 13:09:36 GMT</pubDate>
            <atom:updated>2021-06-02T15:57:09.178Z</atom:updated>
            <content:encoded><![CDATA[<p>Sou a Samilla Macedo, Desenvolvedora Full-stack na Revelo e participei da organização dos últimos cinco eventos de kickoff de Produto e Tecnologia (e recentemente Growth). Nesse período aprendi muito sobre como engajar pessoas e deixar esse dia produtivo sem tirar o foco na importância que esse evento representa para a empresa.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/956/1*rGPje9FsFqAQ6ThYP-tFSw.png" /></figure><p>Na Revelo, nossas métricas e objetivos tem um ciclo de três meses (<em>quarter</em>). No início do <em>quarter</em>, cada área é responsável por fazer um kickoff para alinhar as expectativas de entrega entre gestores e colaboradores, além de (re)conectar as pessoas desses times com a visão estratégica da empresa.</p><p>O time de Produto da Revelo é multidisciplinar, com profissionais de Tecnologia (engenheiros de software e analistas de dados), Produto (product managers e designers) e Growth (growth hackers). Portanto, todas essas pessoas estão inclusas no nosso <strong>Kickoff de TPG</strong>.</p><p>Deixo abaixo um guia de passos que consideramos para organizar o kickoff atualmente na Revelo.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*S3IrBUq0981aIVueNv0hMQ.png" /></figure><h4><strong>Escolha da data e local do Kickoff</strong></h4><p>Na Revelo, a data escolhida para fazer o Kickoff de TPG é sempre a primeira sexta-feira (para evitar quebras no fluxo de entregas semanal) dos meses de Janeiro, Abril, Julho e Outubro. Nesse dia, é recomendado que nenhuma outra reunião seja agendada com integrantes do time, todos devem estão inteiramente focados no conteúdo do Kickoff.</p><p>No cenário anterior à pandemia da COVID19, o Kickoff era realizado presencialmente em um ambiente externo à empresa, justamente para causar o sentimento de reduzir o foco nas ações que fazemos o dia-à-dia e olhar para a empresa do lado de fora.</p><p>Desde o período de quarentena até o momento atual em que a Revelo se tornou Remote First, os eventos de Kickoff vem sendo feitos online através da plataforma de reunião utilizada na empresa.</p><h4><strong>Organize a agenda do evento</strong></h4><p>A agenda do Kickoff tem normalmente início às 9h30 e no período de 15 min fazemos a abertura do evento, apresentando a agenda do dia para que todos se organizem. O evento normalmente conta com blocos de Estratégia da empresa, Retrospectiva, Métricas e Apostas do próximo <em>quarter</em> e Team Building.</p><p><strong>Estratégia da empresa: </strong>Nessa apresentação é importante escutar dos fundadores(as) da empresa ou diretores(as), qual será a estratégia da empresa para o próximo <em>quarter</em>, isto é: qual será o objetivo principal da empresa? Para que público alvo estamos olhando? Quais são nossos principais concorrentes? Porque estamos guiando a empresa para esse objetivo?</p><p><strong>Retrospectiva:</strong> Tão importante quanto sabermos os próximos passos, é olhar para trás e ver o quanto entregamos de valor no trimestre que passou. Nesse momento, cada Squad apresenta suas principais entregas, quais resultados obtiveram, o que deu certo e também os aprendizados.</p><p><strong>Métricas e apostas do próximo quarter: </strong>A cada <em>quarter</em> as métricas mudam e com isso às vezes se faz necessário rearranjar os times. Nesse bloco os integrantes que irão compor os Squads são apresentados juntamente com as métricas de Produto e apostas que serão feitas ao longo do trimestre.</p><p><strong>Team Building: </strong>o termo pode ser traduzido como formação ou <strong>consolidação de equipe</strong>. Esse momento é separado para promover uma série de atividades para criar e fortalecer as relações entre pessoas participantes do Kickoff que não interagem normalmente no dia-à-dia.<br>Para isso, os membros do kickoff são agrupados em times entre 5 e 8 pessoas e realizamos as atividades entre eles. O site <a href="https://www.funretrospectives.com/">FunRetrospectives</a> contém varias atividades de Team Building para você usar ou se inspirar.</p><p><strong>Happy Hour (Bônus): </strong>Ao final do Kickoff deixamos uma chamada aberta para que os participantes continuem à interagir e trocar conversas opcionalmente.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*NS0LOji__YHGDzbSGpVYAw.png" /></figure><h4><strong>Faça pausas</strong></h4><p>Assim como as pausas são necessárias durante um dia normal de trabalho, também são importantes durante o evento, por isso não esqueça de intercalar os blocos de apresentação com pausas de 10 à 15 minutos. Além do cuidado com a saúde, essas pausas curtas ajudam com que as pessoas recuperem o foco.</p><p>Para a pausa do almoço, que é a mais longa, gostamos de deixar com uma folga de 1h30. Antes das pausas, não se esqueça informar o horário da volta às atividades para que nenhum participante perca o conteúdo.</p><h4><strong>Brindes</strong></h4><p>Quem não gosta de um mimo, não é? Fazemos questão de oferecer uma lembrança desse dia para as pessoas através da entrega de um brinde. Entre os brindes que as pessoas mais gostaram de ganhar, estão camisetas e cadernetas personalizadas com artes que remetem à características da equipe e que eles podem usar no dia-à-dia.</p><p>Cuidamos da logística para que cada colaborador(a) receba os brindes utilizando plataformas de entrega ou entregadores autônomos. É importante que a surpresa seja feita um dia antes do evento, evitando que as pessoas fiquem ansiosas durante o dia do Kickoff.</p><h4>Escolha um(a) apresentador(a)</h4><p>Escolha uma pessoa do time para ser a responsável por intermediar os momentos de apresentação durante o dia, essa pessoa também ira mediar as perguntas que os participantes tiverem.</p><p>Durante apresentações online, é comum que alguma ferramenta não funcione corretamente ou que hajam imprevistos. Essa pessoa poderá gerar momentos de descontração enquanto o problema estará sendo resolvido evitando silêncios durante a chamada.</p><p>Por fim, finalize o Kickoff de <em>quarter</em> com um formulário de feedback para entender o que foi muito bom no evento e o que pode ser melhorado. É importante para os colaboradores se sentirem parte e verem suas ideias implementadas.</p><p>Agradeço as pessoas que já estiveram comigo no time de organizadores. Em especial <a href="https://medium.com/u/d78e8ee2756f">Débora Fernandes</a>, Leticia Rodrigues e Paulo Moraes que me ensinaram tanto ❤.</p><p>Espero ter contribuído com a organização do seu próximo Kickoff. Até mais :)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5e411e640bf1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/revelo-tech/melhores-pr%C3%A1ticas-para-realizar-um-kickoff-de-quarter-5e411e640bf1">Melhores práticas para realizar um kickoff de quarter</a> was originally published in <a href="https://medium.com/revelo-tech">tech.revelo</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A construção do Design System da Revelo]]></title>
            <link>https://medium.com/revelo-tech/a-constru%C3%A7%C3%A3o-do-design-system-da-revelo-7e817db1586d?source=rss----9442b857e762---4</link>
            <guid isPermaLink="false">https://medium.com/p/7e817db1586d</guid>
            <category><![CDATA[design-systems]]></category>
            <category><![CDATA[vuejs]]></category>
            <category><![CDATA[storybook]]></category>
            <category><![CDATA[front-end-development]]></category>
            <dc:creator><![CDATA[Lucas Sonsin Lima]]></dc:creator>
            <pubDate>Wed, 19 May 2021 13:55:22 GMT</pubDate>
            <atom:updated>2021-05-19T13:55:22.726Z</atom:updated>
            <content:encoded><![CDATA[<p>Olá, me chamo Lucas Sonsin, sou Desenvolvedor Front End na Revelo há 2 anos. Nesse primeiro artigo da série, vou contar sobre o problema que tivemos inicialmente e quais os primeiros passos que demos em direção à criação do nosso<em> Design System</em> — que vou chamar de DS daqui em diante.</p><figure><img alt="Monte Everest" src="https://cdn-images-1.medium.com/max/1024/0*4TEwDcNqdvK4QPPV.jpg" /><figcaption>O <strong>Monte Everest</strong> é uma montanha onde se encontra o ponto mais alto do mundo, com 8.848 metros de altura em relação ao nível do mar.</figcaption></figure><p>Antes de começarmos a resgatar a história desse projeto, é importante darmos uma breve explicação sobre o que significa esse termo que é muito falado hoje em dia, pois provavelmente você já se deparou em uma situação parecida com essa:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WJ9lJd9FCRbfeAHJOy5nsw.png" /></figure><p>Bom, desmembrando elementos deste componente, podemos tirar um ótimo exemplo da implementação de um DS, vamos lá</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QA2IRf1EItniSd7unO1OsA.png" /></figure><p>E agora, o que isso tudo tem a ver com um DS?</p><p>Para nós é um produto, que evolui constantemente de forma escalável com a finalidade de construirmos aplicações diferentes com uma linguagem visual única e de forma rápida, concentrando cores, tipografia, componentes visuais e todas suas regras de aplicação em uma documentação única para os times, deixando a comunicação fluída.</p><p>Vamos dar início à nossa linha do tempo, afinal já demos muita introdução</p><h4><strong>O problema inicial</strong></h4><p>Inicialmente tínhamos uma única aplicação na Revelo. Vamos apelidar de App1(bem criativo), um sistema monolítico responsável por todos os nossos produtos. Nesse sistema nós chegamos a ter mais de 60 cores diferentes, bastante né? Mas calma, isso foi só uma curiosidade, vamos seguir. Resumidamente nossa arquitetura de aplicações era basicamente assim:</p><figure><img alt="Ilustração de uma caixa com fundo azul escrito App1 (front e backend)" src="https://cdn-images-1.medium.com/max/1024/1*fKz5fNLMXzE4w8nCZ_BjQw.png" /><figcaption>Aplicação monolítica</figcaption></figure><p>Surgiu a necessidade e nossa primeira aplicação Front End em Vue.js foi criada para ser responsável por parte do nosso produto. Nessa aplicação, componentes visuais já foram criados com uma arquitetura bem modular, porém reutilizados apenas dentro dele mesmo. As cores, tipografia e espaçamento se reduziram um pouco em quantidade, porém ainda sem padrão definido e sem regras de implementação</p><p>Nesse cenário nós tínhamos:</p><figure><img alt="Dois quadrados coloridos representando as duas aplicações se conectando, a primeira Aplicação monolítica e a segunda apenas front end" src="https://cdn-images-1.medium.com/max/1024/1*Id0MbEFFUTpX1cYm74lo-w.png" /></figure><p>O primeiro problema aparece neste momento, pois a App 1 ainda é responsável por muitas páginas do nosso sistema, como vamos garantir que as telas de ambas as aplicações resultem em experiências semelhantes para a pessoa usuária? Bom, a oportunidade da criação de uma biblioteca veio juntamente com o nascimento de uma terceira aplicação, resultado de um novo desmembramento da App1, pense como uma grande peça de lego sendo desmontada em pecinhas menores e mais poderosas.</p><p>Linha do tempo até este momento da história</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*u587nz_IweiT1nLr" /></figure><h4><strong>Definição das tecnologias:</strong></h4><p>Algumas opções foram estudadas, desde as mais simplistas até as mais complexas, para sabermos qual caminho tomar na nossa lib inicial:</p><ul><li>Utilizar lib de terceiros já consolidadas, o que resultaria em alto acoplamento e baixíssima liberdade para tomarmos nossas próprias decisões</li><li>Criar uma lib CSS que exportaria para nós todos os estilos necessários (tokens, componentes, etc…)</li><li>Mesclar ambas as soluções</li></ul><h4><strong>Por que não escolhemos alguma dessas opções?</strong></h4><p>Nós tivemos uma experiência muito boa com a stack do VueJS e sabíamos que na próxima aplicação Front End que surgisse, a mesma ferramenta seria usada. Seguimos a seguinte linha de pensamento:</p><p>- Já temos uma ferramenta front-end bem testada e consolidada na empresa</p><p>- Precisamos de componentes dinâmicos e customizáveis que trabalhem bem com nossa experiência visual</p><p>- Em nossa App2, grande parte dos componentes que poderiam ser reutilizados entre as aplicações, já estavam criados em VueJS</p><p><strong>Conclusão</strong>: Vamos criar uma lib própria usando uma stack conhecida, com testes e dando pra área de tech uma experiência boa em desenvolver nas aplicações.</p><h4><strong>Com a estratégia escolhida, vamos preparar o terreno!</strong></h4><p><strong>Passos cruciais antes da criação da nossa App 3:</strong></p><ul><li>Isolamos dentro da App 2, todas as peças que inicialmente fariam sentido serem reutilizadas entre aplicações Front End, sem muita regra, afinal não existia um DS</li><li>Com a App 2 funcionando normalmente com esse isolamento, demos início à criação da nossa primeira biblioteca interna</li></ul><p><em>Essa biblioteca é o conjunto de recursos que podemos consumir nos nossos sistemas, contendo uma fonte única de código.</em></p><p>Podemos ilustrar esse cenário dessa forma:</p><figure><img alt="Caixas coloridas se conectando, representando a App2 Front End consumindo o projeto da biblioteca de componentes" src="https://cdn-images-1.medium.com/max/1024/1*cDc-43Je-Dc0i5QlDIOKCQ.png" /></figure><p>Um exemplo de como os componentes eram utilizados nas aplicações, agora com nossa primeira versão da library em forma de plugin VueJS chamada Everest.</p><p><strong>Exemplo de como exportamos os componentes desse plugin nessa v1</strong></p><p><em>Everest - main.js</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*hZwKxzUYFuCs176q" /></figure><p><strong>Como instalamos o plugin nos projetos Vue</strong></p><p><em>Projeto Consumer — main.js</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6o-X3A38mLSYqrVo2Ytptg.png" /></figure><p><strong>Exemplo de utilização em nossas views</strong></p><p><em>Projeto Consumer — ViewExemplo.vue</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*qhVXLqaWwnvq-9-P" /></figure><p>Prontinho, agora com nosso plugin sendo consumido por nossas aplicações, o primeiro problema de unificar nossa linguagem visual está resolvido! Mas ainda temos muito o que evoluir pois esta foi apenas o primeiro passo para nossa solução. No próximo artigo nós vamos contar em alguns pontos sobre como nós escalamos o Everest até se tornar nosso DS:</p><ul><li>Everest deixa de ser um plugin</li><li>problemas de bundle: como o modo de exportar e consumir esses componentes estava impactando nossas aplicações</li><li>solução para múltiplas “fontes da verdade” surgindo</li><li>documentação e seu processo</li><li>interface com App mobile</li></ul><p>Até logo o/</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7e817db1586d" width="1" height="1" alt=""><hr><p><a href="https://medium.com/revelo-tech/a-constru%C3%A7%C3%A3o-do-design-system-da-revelo-7e817db1586d">A construção do Design System da Revelo</a> was originally published in <a href="https://medium.com/revelo-tech">tech.revelo</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Como integramos o time de Growth em estrutura de squads]]></title>
            <link>https://medium.com/revelo-tech/como-integramos-o-time-de-growth-em-estrutura-de-squads-8717d39ff188?source=rss----9442b857e762---4</link>
            <guid isPermaLink="false">https://medium.com/p/8717d39ff188</guid>
            <category><![CDATA[squad]]></category>
            <category><![CDATA[growth]]></category>
            <category><![CDATA[startup]]></category>
            <category><![CDATA[design]]></category>
            <category><![CDATA[product]]></category>
            <dc:creator><![CDATA[Camila Yamashiro]]></dc:creator>
            <pubDate>Mon, 17 May 2021 12:55:09 GMT</pubDate>
            <atom:updated>2021-05-17T12:55:32.540Z</atom:updated>
            <content:encoded><![CDATA[<h3>Como integramos o time de Growth em squads</h3><p>Desde o último trimestre de 2020, a estrutura organizacional do time de Growth na Revelo passou a ser integrada em squads já existentes, compostos por profissionais de Produto, Tecnologia e Design. Essa estrutura está permitindo uma maior eficiência em atingir nossas metas através do alinhamento e velocidade na definição e execução de projetos e experimentos.</p><p>Neste texto, pretendo compartilhar como foi a integração do time de Growth em squads, apresentando as práticas vivenciadas e detalhando esse processo na Revelo.</p><p><strong><em>TL;DR</em></strong></p><ul><li>Realizamos a alocação das pessoas de Growth nos squads a partir de dois fatores: priorização dos objetivos e eficiência de recursos;</li><li>O processo de adaptação no novo squad foi feito com o alinhamento dos objetivos, apostas e métricas entre Growth e as outras áreas (Produto, Design e Tech), e com a integração em rotinas e ferramentas já utilizadas;</li><li>Realocações são normais e podem vir a acontecer — não tratamos como um tema “tabu”;</li><li>Criamos novas rotinas com o squad: Planejamento de experimentos e análise de métricas;</li><li>Também criamos novas rotinas em Growth: Chapters (CRM e Performance), alinhamento de projetos,<em> health checks</em> e <em>checkpoints</em> com gestores;</li><li>Estamos constantemente aprimorando a estrutura dos squads a partir dos novos desafios e contexto da empresa ao longo do tempo.</li></ul><h3><strong>Alinhamento a partir dos objetivos de negócio</strong></h3><p>Para qualquer estrutura de time, precisamos, antes de tudo, entender a estratégia da empresa em seu momento atual. A partir disso, conseguimos fazer as mudanças necessárias para adequar a estrutura do time aos objetivos da empresa, considerando o seu escopo de atuação. É claro que cada caso é um caso, não existe uma estrutura universal “certa” ou “errada”. Em nosso contexto, estávamos em um momento da empresa com objetivos de negócio a longo prazo bastante claros que faziam muito sentido realizarmos mudanças na estrutura do time de Growth.</p><figure><img alt="Estrutura do time de Growth alinhada aos objetivos de negócio (o número de pessoas é meramente ilustrativo)" src="https://cdn-images-1.medium.com/max/960/1*icqmmOQVw7YqbHPyUCLHWQ.png" /><figcaption>Estrutura do time de Growth alinhada aos objetivos de negócio (o número de pessoas é meramente ilustrativo)</figcaption></figure><p>A figura acima mostra como era a nossa estrutura antes e como ela está agora, com a integração em squads. Antes, éramos organizadas em três focos de atuação:</p><ul><li>B2B (empresas)</li><li>B2C (candidatos)</li><li>CRM (implementação da infraestrutura)</li></ul><p>A partir de um novo contexto multi-produto, nos adaptamos para que os esforços de Growth (aquisição e retenção) fossem alinhados de acordo com o processo de construção dos novos produtos. Na estrutura de squads, trabalhamos em equipes multidisciplinares e o nosso escopo <em>core</em> de atuação nasce alinhado com o desenvolvimento do produto, a partir da criação de experimentos mais relevantes que aceleram o crescimento da empresa. Um exemplo disso seria o lançamento de uma nova ferramenta com um volume mínimo de tráfego, possibilitado a partir da estrutura em squad.</p><p>Temos três principais frentes no nosso escopo <em>core</em>:</p><ul><li><strong>Analytics: </strong>modelagens e análises de dados para tomadas de decisões de negócio e acompanhamento de experimentos;</li><li><strong>CRM: </strong>implementação de infraestrutura, construção e otimização de jornadas do usuário para retenção e reativação;</li><li><strong>Performance:</strong> gestão de canais de mídia paga para aquisição e engajamento, controle de orçamento e otimizações.</li></ul><h3><strong>O que aconteceu para isso mudar?</strong></h3><p>É aqui que eu falo sobre o contexto de cada empresa. Estava muito claro para nós que os objetivos da Revelo eram focados em escalar os novos produtos e segmentos de atuação, portanto, era imprescindível a estrutura em squads multidisciplinares, que trazem muitos benefícios, como:</p><ul><li><strong>Alinhamento das métricas de negócio de acordo com o objetivo</strong> — temos uma padronização dos dados em relatórios e <em>dashboards</em> que são analisados;</li><li><strong>Mensuração de todos os experimentos realizados no Produto</strong> — garantimos o <em>tracking</em> e tráfego em todos os experimentos no Produto;</li><li><strong>Comunicação entre áreas acontece dentro dos squads </strong>— a informação não precisa ser alinhada entre os gerentes (<em>top-down</em>) para ser repassada para os times, viabilizando tomadas de decisão mais eficientes;</li><li><strong>Maior colaboração no trabalho</strong> — evitamos que projetos iguais aconteçam em paralelo em cada área e os tornamos realmente multidisciplinares.</li></ul><h3><strong>Alocação de pessoas na nova estrutura em squads</strong></h3><p>A estrutura em squads é explicada <a href="https://www.youtube.com/watch?v=4GK1NDTWbkY">aqui neste vídeo</a> sobre a cultura do Spotify, que também é utilizada em várias outras empresas que seguem a metodologia ágil. Basicamente, um squad é um time multidisciplinar focado em um segmento de atuação específico (segmento de cliente, <em>feature</em> de produto, unidade de negócio, etc), e suas características principais são a autonomia e velocidade para tomadas de decisões pautadas entre os membros que compõem o próprio squad.</p><p>Para realizar a integração dos membros do time de Growth nos squads da melhor maneira possível, traçamos o seguinte raciocínio:</p><p><strong>Priorização dos objetivos:</strong></p><blockquote><strong>Quais são os principais objetivos de negócio?</strong></blockquote><blockquote>Aqui é muito importante ter a clareza nos focos da empresa em horizontes de tempos definidos, geralmente traçados pela liderança.</blockquote><p><strong>Eficiência de recursos:</strong></p><blockquote><strong>Como é a relação de demanda e impacto da competência de Growth nos squads?</strong></blockquote><blockquote>Sabendo quais são os objetivos de negócio, entendemos especificamente onde Growth pode ter mais alavancas de atuação focadas em resultados.</blockquote><blockquote><strong>Qual é o escopo de atuação e expertise da pessoa?</strong></blockquote><blockquote>É importante que a nova alocação esteja bem alinhada com o desenvolvimento profissional e o escopo de atuação dentro do novo squad.</blockquote><figure><img alt="Time de Growth em squads multidisciplinares (o número de pessoas e a composição de cada squad são meramente ilustrativos)" src="https://cdn-images-1.medium.com/max/960/1*_KS8gYd0EuQ82GcfZmHvTw.png" /><figcaption>Time de Growth em squads multidisciplinares (o número de pessoas e a composição de cada squad são meramente ilustrativos)</figcaption></figure><p>Portanto, de acordo com esse raciocínio, a estrutura de um squad não é uniforme. Ou seja, ser um time multidisciplinar não significa que todos os squads devem conter sempre profissionais de todas as áreas (Produto, Tecnologia, Design e Growth), a estrutura vai depender muito de dois pontos: <strong>priorização dos objetivos</strong> com <strong>eficiência na alocação de recursos</strong>.</p><p>Como na imagem exemplo, temos diferentes composições de squads, algumas com uma ou mais profissionais de Growth (ex. Squad A, C e E), ou até mesmo squads sem nenhuma pessoa de Growth (ex. Squad B, D e F).</p><h3>Processo de adaptação</h3><p>Com a nova estrutura definida, vem o processo de adaptação no squad. É aqui que o novo time vai se conhecer, alinhar o escopo de trabalho, apresentar as rotinas e ferramentas utilizadas. Nesse caso, esse processo foi marcado com o nosso <em>kickoff</em> — evento que encerra um trimestre e dá início ao próximo ciclo, onde cada squad apresenta os objetivos e apostas para o novo trimestre.</p><p><strong>Alinhamento com membros do squad</strong></p><p>Na Revelo, o planejamento do trabalho é organizado em trimestres, e desde esse início, é muito importante que os membros do squad estejam alinhados na definição dos objetivos, apostas e métricas que serão utilizados para guiar o trabalho do time no novo período. Todos foram muito abertos e receptivos na integração de pessoas de Growth, o que facilitou bastante esse alinhamento inicial. Além disso, algumas reuniões mais frequentes no início para entendimento do Produto e esclarecimento de dúvidas que iam surgindo também foram feitas para garantir que todos estavam na mesma página.</p><p><strong>Integração em rotinas e ferramentas</strong></p><p>No squad, existem algumas rotinas e ferramentas do processo ágil para o desenvolvimento do produto, que eram novidade para o time de Growth. No começo, muitas dúvidas foram surgindo, e após algumas participações, o processo se tornava mais natural. Apesar de não serem rotinas específicas de Growth, participamos ativamente levantando opiniões e questionamentos através de uma perspectiva nova para o desenvolvimento do produto.</p><p><strong>Realocações</strong></p><p>Tratando-se de um processo de adaptação, nem tudo funciona 100% no começo, e na Revelo isso não é um tema “tabu”. Após quase um mês com a nova estrutura, percebemos que algumas pessoas deveriam estar alocadas em squads diferentes do que estavam, seguindo o raciocínio de priorização de objetivos e alocação de recursos. Dessa maneira, algumas mudanças foram realizadas durante o processo de adaptação. Mudanças são sempre delicadas, tanto para o squad quanto para a pessoa em questão, mas às vezes são necessárias. Por isso, devemos avaliar com atenção os impactos das mudanças e garantir que elas sejam realizadas somente quando realmente necessárias.</p><h3><strong>Criação de novas rotinas</strong></h3><p>Para garantir a organização funcional do time de Growth, criamos as nossas próprias rotinas: para alinhamentos com o time do squad, e com o próprio time de Growth, que geralmente ocorrem com frequência semanal.</p><h4><strong>Rotinas novas nos squads</strong></h4><ul><li><strong>Planejamento de experimentos:</strong> reunião interna no squad para pensar nos próximos experimentos a serem priorizados e definir os critérios de sucesso que irão medir seus resultados. Essa rotina é importante para alinhar o foco de trabalho do time, onde todos têm participação ativa para decidir o que será priorizado dentre os experimentos e ideias levantadas. Com a definição dos experimentos, outras reuniões ao longo da semana são feitas para alinhar o ciclo de desenvolvimento.</li><li><strong>Análise de métricas:</strong> momento para apresentar a evolução das métricas norte, secundárias, e de saúde a todos do squad, para garantir a visibilidade do trabalho e direcionamento para as alavancas que mais precisam de atenção para trazer os resultados esperados traçados pelas metas definidas no começo do trimestre. Geralmente esse momento ocorre em um dia da semana durante o checkpoint (reunião diária para apresentação do status do que está sendo trabalhado), ou na reunião de Planejamento de Produto &amp; Growth (alinhamento dos experimentos com a liderança).</li></ul><p>Cada squad é totalmente autônomo para criar as rotinas que mais fazem sentido para o time, e estamos em constante avaliação para adotar e ajustar o modo como trabalhamos.</p><h4><strong>Rotinas novas com o time de Growth</strong></h4><figure><img alt="Criação dos Chapters de CRM e de Performance para a área de Growth" src="https://cdn-images-1.medium.com/max/960/1*E1iZ9MUZR2GUXdTzt_0sfQ.png" /><figcaption>Criação dos Chapters de CRM e de Performance para a área de Growth</figcaption></figure><ul><li><strong>Chapters:</strong> rotinas comuns em estruturas de squads, os chapters (“capítulos”) são os grupos de pessoas que possuem o mesmo escopo de atuação. Eles são essenciais para que exista o acompanhamento do escopo de trabalho da área em questão com a gestão de conhecimento entre os membros do time. Na área de Growth, criamos o<strong> Chapter de CRM</strong> e o <strong>Chapter de Performance</strong>, que são disciplinas de nossa <em>expertise</em>. Cada Chapter é liderado por um membro do time de Growth que possui mais conhecimento do escopo, e todos da área se reúnem uma vez por semana para reportar o status do que está sendo realizado em cada squad em relação à disciplina, alocar tarefas submetidas por squads/outras áreas da empresa que não possuem alguém de Growth, e também para colaborar e compartilhar boas práticas para gestão de conhecimento.</li><li><strong>Alinhamento de projetos:</strong> quinzenalmente, é um espaço para apresentarmos os projetos que estão sendo realizados e o que está planejado para acontecer em cada squad, onde podemos compartilhar dificuldades e pedir ajuda/feedback do time, garantindo a visibilidade do que está sendo construído na área de Growth entre todos os membros.</li><li><strong><em>Health check</em></strong>: quinzenalmente, nos reunimos para compartilhar sobre como estamos nos sentindo no trabalho, sendo um momento de união e acolhimento entre o time em relação a alguma dificuldade, problema ou conquista que aconteceu durante as duas últimas semanas. É bem importante para manter o time unido, ainda mais em um ambiente de home office.</li><li><strong>Checkpoints com gestores:</strong> ocorre de uma a duas vezes por semana entre os membros de Growth do squad com seus respectivos líderes, com o propósito de dar visibilidade do trabalho aos gestores, tirar dúvidas de tarefas bloqueadas, e alinhar o direcionamento do que está sendo feito.</li></ul><p>Todas essas rotinas foram sendo criadas ao longo do processo de integração de Growth nos squads, e nos ajudam bastante a entender as responsabilidades do nosso trabalho no dia a dia, garantindo o desenvolvimento da área e das pessoas de Growth na Revelo.</p><h3><strong>Aprimorando a estrutura em squads</strong></h3><p>É claro que toda mudança traz muitos desafios, e estamos constantemente aperfeiçoando o modo como trabalhamos. Conquistamos resultados ótimos no primeiro trimestre com essa nova estrutura, e para cada novo período, buscamos aprimorar ainda mais, com a revisão da organização estrutural para a criação de novos squads, realocações e direcionamentos em torno dos objetivos da Revelo.</p><p>Os principais desafios que surgiram em relação à essa nova estrutura são relacionados à auto-organização dos próprios squads, como a falta de clareza sobre as responsabilidades de cada um, em um ambiente onde todos tomam decisões em conjunto — criando-se certa nebulosidade entre autonomia e alinhamento, a existência de muitas reuniões e rotinas que impactam na organização do tempo para executar as tarefas, e a necessidade de uma comunicação bastante clara e eficiente, tanto entre os membros do próprio squad como com os outros squads, para garantir que ninguém esteja trabalhando no mesmo problema e que a colaboração entre as pessoas esteja sendo realizada sem fricções desnecessárias.</p><p>A nova estrutura organizacional do time de Growth em squads foi implementada devido ao momento específico e aos objetivos que a Revelo possui atualmente, sendo que tal estrutura nos possibilita criar dinâmicas de trabalho multidisciplinares mais eficientes e integradas. Não existe estrutura certa ou errada, e é preciso revisitar a organização de tempos em tempos para certificar um alinhamento claro com os objetivos da empresa.</p><p>Espero que este texto tenha te ajudado de alguma forma a refletir sobre criação de squads com profissionais de Growth.</p><blockquote><strong><em>Ah, e se a sua empresa está com vagas abertas para profissionais de tecnologia ou digital me avisa, ok? Vai ser legal entender se podemos ajudar. Me manda um email: camila.yamashiro@revelo.com.br 😄</em></strong></blockquote><p><em>Agradeço à </em><a href="https://www.linkedin.com/in/juliana-uechi-742838b6/"><em>Juliana Uechi</em></a><em> (Head de Growth na Revelo) que me ajudou na elaboração desse texto.</em></p><p>Que tal acelerar ou começar a sua carreira na área de tecnologia? Conheça o <strong>Revelo UP</strong> — o programa de incentivo aos cursos mais quentes do mercado. Saiba mais <a href="https://up.revelo.com.br/home?utm_source=community&amp;utm_medium=medium&amp;utm_campaign=growth_squads_0421"><strong>aqui</strong></a>!</p><p><strong>Leituras recomendadas </strong>💡</p><p>Henrik Kniberg, Spotify Engineering. <a href="https://labs.spotify.com/2014/03/27/spotify-engineering-culture-part-1/">Spotify engineering culture</a></p><p>Casey Winters, Casey Accidental. <a href="https://caseyaccidental.com/product-organizational-structures/">The types of Product Team Organizational Structures</a></p><p>Will Sertório, UX Collective. <a href="https://brasil.uxdesign.cc/batendo-o-bumbo-boas-pr%C3%A1ticas-para-empoderar-times-de-produto-faee3b530e46">Batendo o bumbo: boas práticas para empoderar times de produto e design</a></p><p>Michel Nassif, Tech Revelo. <a href="https://medium.com/revelo-tech/nuggets-de-experimento-como-tornar-acess%C3%ADvel-os-resultados-de-seu-discovery-1b1226eb79c5">Nuggets de Experimentos: como tornar acessível os resultados de seu discovery</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8717d39ff188" width="1" height="1" alt=""><hr><p><a href="https://medium.com/revelo-tech/como-integramos-o-time-de-growth-em-estrutura-de-squads-8717d39ff188">Como integramos o time de Growth em estrutura de squads</a> was originally published in <a href="https://medium.com/revelo-tech">tech.revelo</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[De dev para dev: como liberei 10GB na minha máquina]]></title>
            <link>https://medium.com/revelo-tech/como-liberar-10gb-na-sua-maquina-2e9525a38edc?source=rss----9442b857e762---4</link>
            <guid isPermaLink="false">https://medium.com/p/2e9525a38edc</guid>
            <category><![CDATA[ruby]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[mac]]></category>
            <category><![CDATA[memória]]></category>
            <category><![CDATA[armazenamento]]></category>
            <dc:creator><![CDATA[Débora Fernandes]]></dc:creator>
            <pubDate>Wed, 12 May 2021 13:28:22 GMT</pubDate>
            <atom:updated>2021-11-30T13:55:39.613Z</atom:updated>
            <content:encoded><![CDATA[<p>Dicas para stacks com Ruby e Docker</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Qz_sz2JKj1i0rm6DjgqRcQ.png" /><figcaption>Uso de memória no Mac</figcaption></figure><p>Desenvolvedores que usam Mac ou máquinas com pouco armazenamento, sabem que é comum perceber que ao usar Docker você está com pouco espaço. <br>Antes de pensar em upgrade de memória, conheça e adote hábitos de limpeza da sua stack podem te mostrar o que você realmente usa e gerar uma economia de recursos consumidos simultaneamente.</p><p>Separei umas dicas dos hábitos que tenho adotado há pelo menos um ano e desde então nunca mais tive problemas por pouca memória.</p><h4>Docker</h4><p>O docker funciona sobre containers e estes sobre suas respectivas imagens.<br>Fazendo um paralelo com orientação à Objetos, você pode ler a frase acima entendendo que:</p><ul><li>uma imagem é &quot;como uma Classe&quot;</li><li>cada container é &quot;como uma instância da classe à qual se refere&quot;</li></ul><h4>Docker x Memória</h4><p>Quando falamos de Docker x uso de memória, é importante lembrar que do mesmo jeito que os objetos e variáveis ocupam memória, assim é com os containers e imagens do Docker: só que estes, por sua natureza, ocupam <strong>muito mais memória.</strong><br>Todo recurso que não está sendo usado pode e deve ser liberado, já que a orquestração do ambiente está nas instruções escritas no Dockerfile e no docker-compose, e liberando recursos, suas instruções de configuração não serão perdidas. Dentre os principais recursos que usamos do Docker, esta é a ordem de maior consumo de memória:</p><ul><li>imagens</li><li>volumes</li><li>containers</li></ul><p>Para limpar esses recursos, você deve começar pelos container, já que as imagens e volumes só podem ser liberados se não estiverem sendo usados por alguma instancia (que é um container).<br>Por costume, eu sempre faço minha limpeza na ordem: containers, imagens e depois volumes.</p><p>Para gerenciamento de <strong>containers,</strong> <a href="https://docs.docker.com/engine/reference/commandline/container_ls/">a doc de containers do Docker</a> nos dá vários insights. Os <strong><em>comandos que eu mais uso são</em></strong>:</p><ul><li>verificar os recursos que estes containers estão consumindo: docker container stats</li><li>ver todos os containers: docker container ls -a , o -a te permite ver até os containers parados</li><li>remover os containers que não estão em uso: docker container prune <br>Esse comando remove todos os containers que <strong>não estão em uso</strong> <strong>no momento</strong>, sempre faço a limpeza após confirmar que todos os containers que uso estão <strong><em>rodando, </em></strong><em>para não remover algo inesperado.<br></em>Você pode fazer dessa forma ou aplicar um<em> </em><a href="https://docs.docker.com/engine/reference/commandline/container_prune/#filtering"><em>--filter=OPTION</em></a><em> </em>para remover apenas o que quiser, dá um check na <a href="https://docs.docker.com/engine/reference/commandline/container_prune/#filtering"><em>Documentação</em></a><em>.</em></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*h2wL3WWh5-FKrcNGBbOMow.png" /><figcaption>Consumo de CPU, memória, banda e processos de cada container</figcaption></figure><p>Após remover os containers, limpo as imagens que não estão instanciadas e os volumes.</p><ul><li>docker image prune , que a <a href="https://docs.docker.com/engine/reference/commandline/image_prune/">doc</a> indica que pode ser personalizado com alguns filtros</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zPI47msRdQ-oIcpriecARg.png" /><figcaption>Espaço liberado após limpar imagens não utilizadas</figcaption></figure><ul><li>docker volume prune , que a <a href="https://docs.docker.com/engine/reference/commandline/volume_prune/">doc</a> indica que pode ser personalizado com alguns filtros</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5JiM_0bTpvAeSgN3tvehHA.png" /></figure><h4>Uso de memória Antes x Depois</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NLghtqySXrpDpBD6YhMCfQ.png" /><figcaption>Antes da limpeza nos recursos do Docker</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Cl9l17wzLJQwE96Mq1pdPw.png" /><figcaption>Depois da limpeza nos recursos do Docker</figcaption></figure><p><strong>PLUS</strong>: se é você a pessoa que cria as imagens que seus projetos usam, além de seguir boas práticas para criar imagens pequenas, você pode verificar o tamanho de <strong>cada camada </strong>usando docker history IMAGE para facilitar a identificação de camadas que podem ter seu tamanho reduzido.</p><h4>Ruby &amp; suas versões</h4><p>Quem trabalha com Ruby, em geral utiliza mais de uma versão de ruby, e a cada versão que você adiciona, são instalados binários, aliases e alguns outros arquivos que consomem espaço local.<br>Sempre que você deixar de usar uma versão de ruby, é interessante remover toda essa bagagem desnecessária.</p><p>Existem alguns gerenciadores de versão do ruby, como gosto de usar o <a href="http://rvm.io">RVM</a>, os comandos abaixo fazem referencia à ele, mas explico o princípio da escolha para que você possa replicar com o gerenciador que você use.</p><p>É possível desinstalar apenas o executável do ruby e deixando outras dependências espalhadas na máquina.<br>É isso que o rvm uninstall ruby-x.x.x remove apenas a instalação do ruby,</p><p>Para remover completamente uma versão de ruby de uma máquina, use um comando que remova a instalação do Ruby e também seus aliases, gemsets e quaisquer binários/demais arquivos associados.<br>No RVM, esse comando é rvm remove ruby-x.x.x</p><p>Após remover 2 versões de Ruby, minha memória foi liberada em mais 5GB:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Cl9l17wzLJQwE96Mq1pdPw.png" /><figcaption>Uso de memória antes de remover versões não usadas de Ruby</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Qz_sz2JKj1i0rm6DjgqRcQ.png" /><figcaption>Uso de memória após de remover versões não usadas de Ruby</figcaption></figure><h4>Ferramentas de análise de armazenamento</h4><p>Pra quem usa VS Code, instalar a extensão <a href="https://github.com/microsoft/vscode-docker">VSCode Docker</a> te ajuda a fazer muito do que fiz na linha de comando dentro do próprio Visual Studio.</p><p>Outra dica para não ter que descobrir manualmente o que está consumindo seu armazenamento, é instalar o ndcu, uma ferramenta gratuita que te ajuda a identificar onde no disco você usa mais espaço e liberá-lo.</p><p><strong>PLUS: </strong>Outros recursos bastante usados em desenvolvimento e que também podem ser limpos de tempos em tempos são versões do node e versões de extensões do Chrome.</p><h4>NVM node version manager</h4><p>No meu caso, além de ruby eu também uso node nos projetos, usando o <a href="https://github.com/nvm-sh/nvm#listing-versions">NVM</a> como gerenciador de versões.<br>Sigo o mesmo principio de limpeza das versões do node, com<br>nvm uninstall vx.x.x<br> Para conferir a limpeza, é só dar um ls em ~/.nvm/versions/node</p><h4>Chrome extensions</h4><p>Ao atualizar as versões das extensões no browser, as antigas não são removidas. Em ~/Library/Caches/Google/Chrome/Default/Storage/ext acesso cada pasta e removo as versões antigas das extensões que uso.</p><p>Essas últimas limpezas não são tão impactantes em liberar memória, mas ajudam um pouco e mantém a saúde em dia.</p><p>E você, tem alguma dica para compartilhar comigo e com a galera da comunidade? Add nos comentários =)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2e9525a38edc" width="1" height="1" alt=""><hr><p><a href="https://medium.com/revelo-tech/como-liberar-10gb-na-sua-maquina-2e9525a38edc">De dev para dev: como liberei 10GB na minha máquina</a> was originally published in <a href="https://medium.com/revelo-tech">tech.revelo</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>