<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bruno Federowski, Autor em Blog da Alice Tech</title>
	<atom:link href="https://alice.com.br/tech/author/bruno-federowski/feed/" rel="self" type="application/rss+xml" />
	<link>https://alice.com.br/tech/author/bruno-federowski/</link>
	<description>Acompanhe conteúdos sobre tecnologia, IA e inovação na saúde e descubra como a Alice transforma o cuidado diário em uma rotina mais humanizada.</description>
	<lastBuildDate>Thu, 19 Feb 2026 18:43:50 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
		<item>
		<title>Cultura de IA: como a Alice inova no dia a dia</title>
		<link>https://alice.com.br/tech/como-a-alice-esta-construindo-uma-cultura-de-ia-no-seu-dia-a-dia/</link>
		
		<dc:creator><![CDATA[Bruno Federowski]]></dc:creator>
		<pubDate>Tue, 30 Jul 2024 19:45:54 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<guid isPermaLink="false">https://alice.com.br/tech/?p=194</guid>

					<description><![CDATA[<p>Todo time em uma empresa de tecnologia deveria usar AI cotidianamente. Como fazemos isso acontecer?</p>
<p>O post <a href="https://alice.com.br/tech/como-a-alice-esta-construindo-uma-cultura-de-ia-no-seu-dia-a-dia/">Cultura de IA: como a Alice inova no dia a dia</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>A Alice acredita que inteligência artificial (IA) deve  permear tudo que fazemos. Como garantimos que isso acontece? Essa é a parte complexa.</p>
<p>Com avanços em IA surgindo diariamente, fica cada vez mais evidente o seu impacto disruptivo. A IA vai transformar indústrias, gerar novas oportunidades, impulsionar a produtividade ao longo de todos os setores e abrir as portas para uma nova era das empresas de tecnologia.</p>
<p>Enquanto startups que têm IA em seu DNA nascem todo dia, companhias de setores tradicionais precisam se adaptar rapidamente a esse novo contexto. É um desafio análogo ao nascimento dos primeiros computadores, e realizar uma mudança cultural tão importante exige um esforço imenso.</p>
<h2><b>A Alice e IA</b></h2>
<p>A Alice é um plano de saúde para empresas que permite que os seus membros (clientes) naveguem pelo sistema de saúde de forma coordenada entre os três diferentes níveis de atenção: primária, secundária e terciária. Fazemos isso direcionando os nossos membros aos agentes mais custo-efetivos do sistema de saúde – membros com condições simples podem ser tratados por enfermeiras e médicos de família, enquanto aqueles com sintomas graves deveriam rapidamente se consultar com os especialistas.</p>
<p>Abordagens baseadas em machine learning e dados sempre foram centrais para essa missão. Quando a Alice foi fundada, isso significava modelos proprietários construídos por nosso time interno de cientistas de dados, e um grande foco em análise de dados.</p>
<p>Mas a ascensão da IA generativa mudou isso. Em vez de depender de um time específico, a nova geração de produtos permite que todo funcionário da Alice faça uso de modelos no estado da arte. Seja incorporando modelos de terceiros diretamente em nossos produtos – para, por exemplo, resumir dados médicos baseados em transcrições de consultas em áudio – ou por aplicações de dia-a-dia que nos permitem reduzir burocracia, a IA deveria ter uma presença constante em como trabalhamos.</p>
<p>Um <a href="https://static1.squarespace.com/static/5d35e72fcff15f0001b48fc2/t/668d08608a0d4574b039bdea/1720518756159/chatgpt-full.pdf">estudo recente</a> mostrou que a adoção do ChatGPT foi ampla, mas desigual. Muitos funcionários precisam de treinamento e direcionamento para aproveitar completamente os aumentos de produtividade, e muitos são prejudicados por restrições das empresas em que trabalham.</p>
<p>Não cair nessas armadilhas exige uma mudança cultural importante. Product managers (PMs) e times operacionais deveriam enxergar a IA como a primeira solução para todo problema com que se deparam. Isso também significa que o uso de IA deveria ser tão simples quanto possível e não exigir expertise técnica.</p>
<h2><b>Transformação cultural</b></h2>
<p>Para fortalecer a ideia de que recorrer à IA é simples e esperado, organizamos eventos que chamamos de &#8220;AI Day&#8221;, envolvendo toda a empresa.</p>
<p>Durante todo um dia de trabalho, times de todas as áreas se reuniram em nosso escritório e trabalharam em implementar vários protótipos de aplicações de IA. Esses protótipos poderiam ser lançados no mesmo dia, ou poderiam ser um ponto de partida para um ciclo normal de desenvolvimento. Os times contaram com o apoio de membros de nossas equipes de engenharia e dados, assim como outros funcionários da Alice que já haviam adotado IA como uma ferramenta de trabalho cotidiano.</p>
<p>Antes desses eventos, os participantes levantaram ideias para vários protótipos em uma planilha comum, a serem validados por aqueles que lideraram a iniciativa. Esses projetos variavam dos mais simples, como classificar dados de exames com base em texto não estruturado, aos mais complexos, como gerar um banco de dados com uma ferramenta de busca usando todo o histórico médico de membros.</p>
<p>Fornecemos uma conta no ChatGPT aos participantes com acesso a assistants. No fim de cada dia, eles apresentaram seus projetos a todo mundo presente no evento.</p>
<p>Tivemos três objetivos com essa iniciativa: ensinar a todos como usar IA numa base cotidiana e incorporar essa possibilidade em seu raciocínio; aumentar o ritmo de geração de novas aplicações de IA; e identificar que ferramentas nosso time de engenharia deveria desenvolver para incentivar a adoção de IA.</p>
<p>Esses esforços foram em grande parte bem-sucedidos. Vários dos protótipos desenvolvidos em nosso primeiro AI Day se tornaram projetos completos, e muitos outros foram implementados imediatamente. Temos visto times que não são tradicionalmente de tech usando IA em seu dia a dia, e geramos um novo roadmap para o time de Foundation em engenharia com entregáveis claros que vão impulsionar a produtividade daqueles que trabalham com IA.</p>
<p>Com isso, vieram aprendizados importantes:</p>
<ul>
<li>Depois que a porteira está aberta, é difícil segurar a boiada. Um dos principais fatores que levam times fora de tecnologia a relutarem em usar IA é que eles precisam adaptar seu pensamento a uma nova ferramenta. Quebrar essa barreira rapidamente leva a um uso acelerado;</li>
<li>Transicionar para um modelo em que IA é uma parte central de como trabalhamos exige quebrar dependências. Se funcionários da Alice precisam contatar os times de dado ou engenharias para usar IA, isso significa que estamos fazendo algo errado;</li>
<li>IA pode ser transformador com produtos de larga escala, sim, mas uma parte importante do valor vem da soma de muitas aplicações pequenas. Aumentar eficiência em todos os lados da companhia pode ser tão impactante quanto desenvolver um novo produto de IA.</li>
</ul>
<h2><b>IA como plataforma</b></h2>
<p>Nossa experiência com os AI Days nos fez dividir nossos esforços para facilitar o uso de IA em duas frentes: primeiro, precisávamos simplificar o teste de novas aplicações; segundo, precisávamos fazer com que lançar novos produtos de IA fosse tão fácil quanto possível, sem abrir mão de qualidade, controle de custo ou privacidade.</p>
<p>Na primeira frente, nosso time de Foundation em engenharia começou a desenvolver uma plataforma de testes que permitirá que nossos usuários cumpram várias tarefas que hoje são difíceis em um ambiente no-code:</p>
<ul>
<li>Rodar prompts de IA que são dinamicamente atrelados a dados de teste em batch. Por exemplo, um usuário pode subir um arquivo com comentários do NPS e pedir que a plataforma rode um prompt, atribuindo a cada um deles uma classificação;</li>
<li>Otimizar prompts em escala comparando o resultado de diferentes prompts sobre um conjunto de arquivos; diferentes contextos sobre um único prompt; etc.</li>
<li>Conectar diretamente a nossa camada analítica pelo Metabase, garantindo que usuários não precisam inserir manualmente dados de teste;</li>
<li>Gerar workflows de diferentes modelos de IA. Por exemplo, transcrever um áudio e em seguida enviar essa transcrição a um modelo de texto;</li>
<li>Controles de custo e acesso por meio de uma estrutura de times que atribui orçamentos específicos para cada unidade;</li>
<li>Salvar e comentar em experimentos passados, permitindo que usuários mantenham um histórico dos últimos testes de seu time;</li>
<li>Fazer uso de nossa infraestrutura de anonimização e privacidade para garantir que respeitemos nossas regras de governança.</li>
</ul>
<p>Adotamos a estratégia de lançar iterações da plataforma rapidamente e testar com usuários. Representantes de produto, operações e até nossa equipe médica foram os clientes e tiveram a responsabilidade de validar nossos planos e evangelizar seus times.</p>
<p>Enquanto isso, também precisávamos facilitar o deploy de aplicações que se conectassem diretamente a nossos produtos. Por sorte, trabalhar com a nova geração de LLMs é simples, e nos concentramos em garantir que os dados inseridos e gerados por esses modelos passem pelos mesmos processos que nossos dados em produção.</p>
<h2><b>O futuro</b></h2>
<p>A Alice acredita que IA é o futuro, e que ocupamos uma posição única que nos permite nos beneficiar de novos desenvolvimentos. Como um payvidor que atua em toda a jornada de saúde e tem acesso a dados de fontes muito diversas, produtos de dados deveriam ser tão centrais para nós quanto nossa operação médica.</p>
<p>Em uma publicação futura, vamos explorar os detalhes da arquitetura descrita nas últimas sessões. Mas já demos passos largos em adotar uma cultura que coloca IA no centro com nossos esforços institucionais para educar os times e com o desenvolvimento rápido de ferramentas para incentivar a adoção. O futuro é animador e há muito mais a ser feito, tanto em termos dos planos da própria Alice quanto do desenvolvimento de LLMs como um todo.</p>
<hr>
<h2>How Alice is building a culture of &#8216;AI as a go-to solution&#8217;</h2>
<p>Alice believes that AI should permeate every aspect of what we do. How do we make sure that this is the case? That&#8217;s the hard part.</p>
<p>As advances in AI technology pop up daily, claims of its transformative impact pile up. AI is set to disrupt established industries, foster new opportunities, drive up productivity across the board and usher in a new era for tech companies.</p>
<p>While startups that make AI as part of their DNA are born everyday, incumbents in traditional sectors have to quickly adapt to the new environment. That is a challenge analogous to the advent of the first computers, and bringing about such a major culture change requires major effort.</p>
<h3><b>Alice and AI</b></h3>
<p>Alice is a healthcare company that provides direct access to our own primary care physicians as well as third-party secondary and tertiary care. We do this by directing members to the most cost-effective agent in the healthcare chain – members with simple conditions can be treated by nurses and family doctors, while those with aggravated symptoms should be rapidly attended on by specialists.</p>
<p>Machine learning and data-based approaches have always been core to how we accomplish that mission. Back when we were founded, this meant proprietary models built by our in-house data scientists and a strong reliance on analytics.</p>
<p>But the ascent of generative AI has changed this. Instead of relying on a specific team, the new generation of products allows every single Alice employee to make use of state-of-the-art models. Whether it is by embedding third-party models directly into our products, such as by summarizing medical data based on consultation audio transcripts, or by day-to-day applications that allow us to reduce bureaucratic work, AI should play a constant role in how we work.</p>
<p>A <a href="https://static1.squarespace.com/static/5d35e72fcff15f0001b48fc2/t/668d08608a0d4574b039bdea/1720518756159/chatgpt-full.pdf">recent paper</a> showed that adoption of ChatGPT has been widespread, but has been unequal. Many workers require training and guidance to fully benefit from productivity increases, and many are hindered by company restrictions.</p>
<p>Not falling into those traps requires a major culture change. Product managers and operational teams should see AI as the number one go-to solution for every problem that arises. It also means that the use of AI should be as hassle-free as possible and does not require much technical expertise.</p>
<h3>Culture change</h3>
<p>In order to establish the idea that tapping into AI is easy and expected, we ran company-wide events known as &#8220;AI Days&#8221;.</p>
<p>For a whole working day, teams from across the company would gather in our office and work on implementing several POCs of AI applications that could either be rolled out on the same day or would kickstart a regular development cycle. They would be supported by members of the engineering and data teams, as well as other Alice employees who had already adopted AI as a day-to-day working tool.</p>
<p>Before those events, participants would brainstorm possible POCs in a common spreadsheet to be validated by those leading the initiative. These would range from the simplest, such as tagging exam data based on unstructured text, to the more complex, like generating a searchable database based on members&#8217; full medical history.</p>
<p>Participants would be provided with a ChatGPT account that granted them access to assistants. At the end of each day, they would present their accomplishments to the whole event.</p>
<p>Our objectives with this initiative were threefold: teaching employees how to work with AI on a daily basis and ingraining that possibility into their thinking; increasing the pace of generation of new AI applications; and identifying what tools our engineering team should develop to ensure that AI adoption soars.</p>
<p>Those efforts were largely successful. Several of the POCs developed on our first AI Day event went on to become full-fledged projects, and many others were implemented from the get-go. We&#8217;ve seen teams that are not traditionally tech-savvy increasingly rely on AI in their day-to-day work. They also led to a new roadmap for our Engineering Foundation team with clear deliverables that will greatly boost the productivity of those working with AI applications.</p>
<p>All in all, the AI Day events led to significant learnings:</p>
<ul>
<li>Once the floodgates are open, the water is hard to stop. One of the main issues that prevent non-tech teams from using AI is that they have to adapt their thinking to a new tool. Breaching that barrier quickly leads to accelerated use;</li>
<li>Successfully transitioning to a model where AI is a core part of how we work means breaking down dependencies. If Alice employees need to contact data or engineering to make use of AI, that means that there&#8217;s something wrong;</li>
<li>AI can be transformative through large-scale products, yes, but a large swath of its value comes from the sum of a lot of tiny, day-to-day applications. Increasing efficiency across all levels of the company can be as impactful as developing one major new AI product.</li>
</ul>
<h3><b>AI as a platform</b></h3>
<p>Our experience with AI Days led us to divide our efforts to ease use of AI in two fronts: first, we needed to facilitate testing of new applications throughout the company; second, we should make deploying new AI products as easy as possible while maintaining a high level of quality in our infrastructure, cost control and privacy policies.</p>
<p>In the first front, our Engineering Foundation team began development of a testing platform that will allow users to undertake several different tasks that are as of now hard to achieve in a no-code environment:</p>
<ul>
<li>Running AI prompts that are dynamically attached to testing data in batches. For instance, a user can upload a file with NPS comments and then request the platform run a prompt on them, asking it to classify each of the entries between a few different tags;</li>
<li>Optimizing prompts at scale by comparing the results of different prompts over a single batch of files; different contexts over a single prompt; etc.</li>
<li>Connecting directly to our analytical layer through Metabase, ensuring that users do not need to manually input testing data;</li>
<li>Setting up workflows of different AI models. For example, by transcribing an audio, then sending that transcription to a text-based model;</li>
<li>Access and cost controls through a team-based structure that carries specific budgets for each unit;</li>
<li>Saving and commenting on past experiments and allowing users to keep a history of their team&#8217;s previous attempts;</li>
<li>Using our own anonymization and privacy infrastructure to ensure that we are not breaching our rules of governance.</li>
</ul>
<p>We adopted a strategy of rolling out quick iterations of the platform and testing it with users. With representatives of product, operations and even our medical staff as stakeholders, tasked with validating our roadmap and evangelizing their teams, development is running smoothly.</p>
<p>Meanwhile, we also needed to facilitate deployment for those applications that would connect directly with our products. Fortunately, the new generation of LLMs are easy to deal with and we were able to focus on ensuring that data inputted and outputted by those models go through the same processes as those of our production data.</p>
<h3><b>The future</b></h3>
<p>Alice believes that AI is the future, and that it is uniquely positioned to take advantage of new developments. Being a payvidor that acts on the whole healthcare journey and has access to data from a wide range of sources, data products should be as core to us as our medical operations.</p>
<p>In an upcoming post, we will explore the details of the architecture described in the previous sections. But we have taken long strides already in adopting an AI-centric culture by pursuing institutional efforts to educate our teams as well as quick development of tools that boost adoption. The future is bright and there is much more to be done both in terms of Alice&#8217;s efforts and the development of LLMs as a whole.</p>
<p>O post <a href="https://alice.com.br/tech/como-a-alice-esta-construindo-uma-cultura-de-ia-no-seu-dia-a-dia/">Cultura de IA: como a Alice inova no dia a dia</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Privacidade em healthtechs: como a Alice garante segurança</title>
		<link>https://alice.com.br/tech/construindo-uma-healthtech-que-coloca-a-privacidade-de-seus-usuarios-em-primeiro-lugar/</link>
		
		<dc:creator><![CDATA[Bruno Federowski]]></dc:creator>
		<pubDate>Sat, 20 Jul 2024 20:23:39 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<guid isPermaLink="false">https://alice.com.br/tech/sem-categoria/construindo-uma-healthtech-que-coloca-a-privacidade-de-seus-usuarios-em-primeiro-lugar/</guid>

					<description><![CDATA[<p>Quando entrei na Alice para ajudar a desenhar o programa de Data Privacy da empresa, eu mal sabia o que dizia a LGPD e como ela iria impactar praticamente todas as empresas do Bras</p>
<p>O post <a href="https://alice.com.br/tech/construindo-uma-healthtech-que-coloca-a-privacidade-de-seus-usuarios-em-primeiro-lugar/">Privacidade em healthtechs: como a Alice garante segurança</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Quando entrei na Alice para ajudar a desenhar o programa de Data Privacy da empresa, 5 meses atrás, eu mal sabia o que dizia a <a href="http://www.planalto.gov.br/ccivil_03/_ato2015-2018/2018/lei/L13709compilado.htm">Lei Geral de Proteção de Dados</a> e como ela iria impactar praticamente todas as empresas do Brasil quando entrasse em vigor.</p>
<p>Pode até não parecer, mas eu fiz questão de deixar isso claro durante todo o meu processo de contratação, e o fato da Alice ter me dado esse voto de confiança já diz muito sobre a empresa: aqui, estamos mais interessados no brilho nos olhos e na vontade de aprender de cada um do que nas qualificações técnicas ou o conhecimento de ferramentas específicas.</p>
<p>Logo no começo da minha jornada por aqui, entrei para o <em>squad</em> de Privacidade que temos, que envolve pessoas das mais diversas áreas dentro da empresa <em>{como Produto, Engenharia, Jurídico, TI, Financeiro…}</em> e marquei conversas individuais com cada um como forma de entender um pouco sobre o que já tínhamos feito até o momento e qual a nossa visão para o futuro. Foi assim que tive dimensão do desafio e de sua importância para a Alice.</p>
<h2>A importância da privacidade para a Alice</h2>
<p>Aqui na Alice, a gente lida com dados muito sensíveis sobre a saúde dos nossos membros, o que inclui nossos funcionários e o que chamamos de membros “externos”, que são as pessoas que compraram nosso produto <em>{e são apaixonadas por ele}</em>.</p>
<p>Para uma empresa como a nossa, não preciso nem dizer o quão importante é conseguirmos garantir a segurança e a privacidade dos dados que coletamos.</p>
<p>Um possível ataque ou vazamento de dados, como vimos recentemente acontecer com o STJ <em>{que </em><a href="https://thehack.com.br/stj-e-vitima-de-ransomware-e-tem-seus-dados-e-os-backups-criptografados/"><em>teve seus sistemas criptografados por um ransomware</em></a><em>} </em>ou com o Ministério da Saúde <em>{que acabou tendo a </em><a href="https://saude.estadao.com.br/noticias/geral,nova-falha-do-ministerio-da-saude-expoe-dados-pessoais-de-mais-de-200-milhoes,70003536340"><em>chave para acesso a dados de mais de 200 milhões de brasileiros divulgada</em></a><em>}</em> pode prejudicar não só a reputação e marca da Alice, como acarretar em multas e, pior, na perda da confiança dos nossos membros.</p>
<p>Para aumentar o tamanho do desafio <em>{ainda bem, porque se fosse fácil eu nem estaria aqui pra contar essa história}</em>, o produto oferecido pela Alice é um produto que depende do compartilhamento de dados de saúde entre diferentes profissionais e instituições.</p>
<p>Esse compartilhamento existe para que possamos fazer o que chamamos de “coordenação de cuidados”, que nada mais é que um termo bonito para dizer que, aqui, queremos que nossos membros tenham experiências mágicas, do tipo:</p>
<ul>
<li>Chegar numa consulta com um especialista que já te recebe pelo nome, sabe todo o seu histórico e o motivo do atendimento</li>
<li>Depois da consulta, conversar com o seu Time de Saúde <em>{o time de médicos, enfermeiros, preparadores físicos e nutricionistas que cuida de cada membro Alice}</em> e perceber que eles já sabem o que foi discutido e quais foram as recomendações do especialista</li>
<li>Ir ao laboratório fazer um exame e, ao se identificar <em>{só com o CPF, nada de códigos e carteirinhas}</em>, já ser atendido por alguém que tem todo o seu encaminhamento e contexto dos pedidos</li>
</ul>
<p>Por esse motivo, desde a sua concepção, a Alice tem a privacidade dos membros como um dos seus pilares. Mas como fazemos isso quando dependemos tanto justamente do compartilhamento de informações sensíveis para entregarmos mais saúde aos nossos membros?</p>
<h2>Cultura e tecnologia como ferramentas para entregar privacidade</h2>
<p>A resposta para essa pergunta <em>{como garantir privacidade em uma empresa cujo business model parte da premissa do compartilhamento de dados sensíveis?}</em> passa por duas principais alavancas: a criação de uma forte cultura de segurança de dados e respeito à privacidade dos membros e a utilização da tecnologia como ferramenta viabilizadora para a execução de melhorias nos produtos e processos da empresa.</p>
<h3>Cultura</h3>
<figure class="wp-attachment-165" ><img fetchpriority="high" decoding="async" class="wp-image-165 size-large" src="https://alice.com.br/tech/wp-content/uploads/2024/07/construindo-uma-healthtech-que-coloca-a-privacidade-de-seus-usuarios-em-primeiro-lugar-2-1024x768.jpg" alt="" width="1024" height="768" srcset="https://alice.com.br/tech/wp-content/uploads/2024/07/construindo-uma-healthtech-que-coloca-a-privacidade-de-seus-usuarios-em-primeiro-lugar-2-1024x768.jpg 1024w, https://alice.com.br/tech/wp-content/uploads/2024/07/construindo-uma-healthtech-que-coloca-a-privacidade-de-seus-usuarios-em-primeiro-lugar-2-300x225.jpg 300w, https://alice.com.br/tech/wp-content/uploads/2024/07/construindo-uma-healthtech-que-coloca-a-privacidade-de-seus-usuarios-em-primeiro-lugar-2-768x576.jpg 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p>Um dos conceitos mais importantes que temos como mantra aqui na Alice é o de <em>Privacy by Design</em>. De forma bem simplificada, <em>Privacy by Design</em> é uma forma de abordar e resolver desafios de privacidade logo na concepção de um produto, e não após o produto ser lançado e o risco ser identificado.</p>
<p>Isso significa, por exemplo, que os PMs <em>{Product Managers}</em> e desenvolvedores da Alice têm uma atuação proativa para entender a melhor forma de criar uma nova ferramenta que já nasça adequada à proteção da privacidade dos nossos membros. Não preciso nem dizer que essa forma de desenvolver produtos é muito mais eficiente e segura do que se, no futuro, tivéssemos que adaptar ferramentas já existentes para adequá-las do ponto de vista de privacidade.</p>
<p>Inclusive, para uma empresa que cresce de forma tão acelerada, como é o caso da Alice, lançando novos produtos e funcionalidades semanalmente, ter os conceitos de <em>Privacy by Design</em> embutidos na cultura dos times é essencial para garantir que não estejamos sempre correndo atrás do prejuízo e fazendo remendos em nossas ferramentas e produtos, e consigamos manter a agilidade necessária e esperada de uma startup com ambições tão grandes quanto as nossas.</p>
<p>Além dos princípios do <em>Privacy by Design</em>, uma forte cultura de privacidade ajuda a garantir que os funcionários da Alice sigam outras boas práticas de privacidade, como por exemplo:</p>
<ul>
<li>A não exposição de dados pessoais de membros em canais de comunicação internos com muitos colaboradores <em>{por aqui, usamos o Slack}</em></li>
<li>A utilização da mínima quantidade de dados pessoais possível em determinado processo ou fluxo de informações</li>
<li>A garantia de que softwares utilizados para o tratamento de dados pessoais possuam determinados requisitos de segurança e proteção à privacidade <em>{no caso de dados de saúde, temos também a exigência de que todos os softwares sejam </em><a href="https://en.wikipedia.org/wiki/Health_Insurance_Portability_and_Accountability_Act"><em>HIPAA</em></a><em>-compliant}</em></li>
</ul>
<p>Ainda falando sobre a importância da cultura nesse processo, uma das principais virtudes que temos na Alice é a <em>transparência</em> com nossos membros, parceiros e também entre nossos times. A união da transparência com a cultura de privacidade da Alice resultou na <a href="https://www.alice.com.br/footer/politica-de-privacidade">Política de Privacidade</a> mais incrível desse Brasilzão — nela, nossos membros podem tirar todas as suas dúvidas a respeito do que fazemos com seus dados e quais são seus direitos sobre eles.</p>
<p>Para se manter e fortalecer essa cultura de proteção à privacidade de dados, não existe atalho ou segredo: é muito importante que existam sessões de treinamento recorrentes, com o suporte das lideranças da empresa, e que o assunto seja sempre abordado em fóruns públicos em que todos poderão se educar e tirar suas dúvidas sobre o tema.</p>
<h3>Tecnologia</h3>
<figure class="wp-attachment-167" ><img decoding="async" class="size-large wp-image-167" src="https://alice.com.br/tech/wp-content/uploads/2024/07/construindo-uma-healthtech-que-coloca-a-privacidade-de-seus-usuarios-em-primeiro-lugar-3-1024x684.jpg" alt="" width="1024" height="684" srcset="https://alice.com.br/tech/wp-content/uploads/2024/07/construindo-uma-healthtech-que-coloca-a-privacidade-de-seus-usuarios-em-primeiro-lugar-3-1024x684.jpg 1024w, https://alice.com.br/tech/wp-content/uploads/2024/07/construindo-uma-healthtech-que-coloca-a-privacidade-de-seus-usuarios-em-primeiro-lugar-3-300x200.jpg 300w, https://alice.com.br/tech/wp-content/uploads/2024/07/construindo-uma-healthtech-que-coloca-a-privacidade-de-seus-usuarios-em-primeiro-lugar-3-768x513.jpg 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
<p>A Alice é, antes de mais nada, uma <em>healthtech</em>. Aqui, acreditamos que a tecnologia é fundamental para conseguirmos entregar mais saúde aos nossos membros.</p>
<p>É graças a ela que conseguimos escalar soluções de coordenação de cuidados <em>{como eu expliquei lá atrás}</em>, realizar o contato proativo com os nossos membros exatamente nos momentos adequados ou garantir que estejamos sempre a um clique de distância através do Alice Agora <em>{nossa ferramenta de chat instantâneo entre o membro e nossos Times de Saúde}.</em></p>
<p>Além de acreditarmos na tecnologia para a entrega de saúde, entendemos que ela é também peça essencial para a promoção da privacidade dos membros. Através dela, nós implementamos medidas como:</p>
<ul>
<li>A separação entre os dados de saúde <em>{não identificados}</em> e os dados pessoais dos nossos membros em duas estruturas de bases de dados separadas, com uma terceira base <em>{guardada a sete chaves}</em> funcionando como a chave para identificar os dados de saúde. Assim, protegemos a identidade dos nossos membros caso ocorra um possível vazamento <em>{toc, toc, toc}</em> da base com dados sensíveis</li>
<li>A de-identificação dos dados dos nossos membros <em>{o uso de um código interno nas nossas rotinas operacionais, ao invés de usarmos nomes ou CPFs}</em></li>
<li>A automatização do envio e recebimento de dados de saúde para/dos nossos especialistas <em>{lembra que, ao realizarem um atendimento, eles já têm todo o contexto e histórico médico de quem estão atendendo?}</em></li>
<li>A disponibilização dos resultados de exames diretamente no nosso app <em>{assim, os membros não precisam ficar enviando PDFs por e-mail para o seu Time de Saúde, que consegue acessar os resultados de forma automática}</em></li>
<li>A restrição do acesso às nossas bases e sistemas apenas às pessoas essenciais</li>
</ul>
<h2>E agora? O que vem a seguir?</h2>
<p><figure class="wp-attachment-168" ><img decoding="async" class="aligncenter size-large wp-image-168" src="https://alice.com.br/tech/wp-content/uploads/2024/07/construindo-uma-healthtech-que-coloca-a-privacidade-de-seus-usuarios-em-primeiro-lugar-4-1024x683.jpg" alt="" width="1024" height="683" srcset="https://alice.com.br/tech/wp-content/uploads/2024/07/construindo-uma-healthtech-que-coloca-a-privacidade-de-seus-usuarios-em-primeiro-lugar-4-1024x683.jpg 1024w, https://alice.com.br/tech/wp-content/uploads/2024/07/construindo-uma-healthtech-que-coloca-a-privacidade-de-seus-usuarios-em-primeiro-lugar-4-300x200.jpg 300w, https://alice.com.br/tech/wp-content/uploads/2024/07/construindo-uma-healthtech-que-coloca-a-privacidade-de-seus-usuarios-em-primeiro-lugar-4-768x512.jpg 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure></p>
<p>Apesar de já termos percorrido um bom caminho para chegarmos até aqui, sabemos que o trabalho de promoção da segurança e privacidade dos dados na Alice <em>{e em qualquer empresa}</em> é um que nunca acabará: sempre teremos novos fluxos de dados para serem mapeados <em>{já contei que é muito importante termos um mapa de tudo o que acontece com os dados pessoais na empresa? só assim podemos priorizar o desenvolvimento de melhorias nos diferentes fluxos}</em>, novos colaboradores com quem compartilharmos nossa visão de como executar privacidade <em>{e aprendermos no processo!}</em> e novas demandas de funcionalidades para quebrarmos a cabeça durante seu desenho <em>{lembra do Privacy by Design?}</em>.</p>
<p>Dito isso, tenho confiança de que a Alice já é, e será cada vez mais, referência na forma como pensamos em privacidade em saúde. E fico muito feliz de fazer parte de tudo isso.</p>
<h2>Que tal fazer parte desse time?</h2>
<p>Estamos buscando pessoas que topem o desafio de transformar a saúde no Brasil através da tecnologia. <a href="https://www.alice.com.br/carreiras">Clica aqui</a> para saber mais das vagas que temos em aberto!</p>
<p>O post <a href="https://alice.com.br/tech/construindo-uma-healthtech-que-coloca-a-privacidade-de-seus-usuarios-em-primeiro-lugar/">Privacidade em healthtechs: como a Alice garante segurança</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Melhor forma de escrever CSS no Vue</title>
		<link>https://alice.com.br/tech/qual-a-melhor-forma-de-escrever-css-no-vue/</link>
		
		<dc:creator><![CDATA[Bruno Federowski]]></dc:creator>
		<pubDate>Sat, 20 Jul 2024 20:23:39 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<guid isPermaLink="false">https://alice.com.br/tech/sem-categoria/qual-a-melhor-forma-de-escrever-css-no-vue/</guid>

					<description><![CDATA[<p>Vamos lá, CSS não é a coisa mais fácil do mundo.</p>
<p>O post <a href="https://alice.com.br/tech/qual-a-melhor-forma-de-escrever-css-no-vue/">Melhor forma de escrever CSS no Vue</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Vamos lá, CSS não é a coisa mais fácil do mundo. Existem diversas formas de resolver o mesmo problema, os browsers nem sempre possuem o mesmo comportamento, já chegamos num nível onde é impossível saber todas as regras que existem, etc. Na expectativa de ajudar o desenvolvimento, temos pré-processadores, pós-processadores, variáveis e metodologias para organização das classes, para citar alguns exemplos das ferramentas que temos para facilitar o uso do CSS.</p>
<p>Mas é claro, como quase tudo no mundo do frontend, as opções não param por ai. Dependendo do framework que você usa, também existem algumas alternativas diferentes para escrever CSS <em>{como se já não fosse complexo o suficiente haha, mas vamos falar disso depois}</em>.</p>
<p>Aqui na Alice, <a href="https://medium.com/alice-tech/h%C3%A1-1-ano-escolhemos-o-vue-js-419cf6c82c1d">nós usamos o Vue</a> e durante algumas semanas no nosso chapter de frontend, discutimos qual seria o padrão que iríamos adotar. Antes de tomar uma decisão, nós testamos as opções mais comuns e algumas obscuras que a comunidade ainda não está usando tanto. Como o nosso chapter de frontends não é muito grande, é importante para nós termos um padrão bem definido <em>{já que cada pessoa está em um time diferente}</em> e que seja fácil para quem não trabalha com frontend <em>{já que nem todo time tem alguém com esse foco}</em>.</p>
<p>No decorrer desse artigo, junto com os pontos que levantamos, tem algumas implementações básicas de um componente de botão <em>{que chamei ele de base-button}</em> que tem algumas propriedades: <em>tamanho</em>, <em>ícone</em> e <em>loading </em>que são as responsáveis por mudar o comportamento/CSS.</p>
<p>Então aperte o cinto que vamos seguir numa jornada do que nós encontramos em cada uma das possibilidades ✨</p>
<h2>Mas antes, uma leve introdução ao vue file</h2>
<p>Para quem nunca trabalhou com o Vue antes, é possível criar componentes usando arquivos <em>.vue</em>, que possuem o HTML dentro do &lt;template&gt;, o JS dentro de &lt;script&gt; e o CSS dentro de &lt;style&gt;.</p>
<p>Focando no assunto desse post, na parte de CSS nós temos algumas alternativas: escrever o CSS puro <em>{assim como vemos da linha 16 a 18}</em>, ou escrever com algum pré-processador.</p>
<p>Escolhendo a segunda o opção, tudo que nós precisamos fazer é adicionar um atributo <em>lang</em> na linha 15 com o nome da <em>&#8220;linguagem&#8221;</em> que queremos <em>{Aqui na Alice nós usamos o </em><a href="https://sass-lang.com/"><em>SASS</em></a><em> com a sintaxe scss, então a maioria dos exemplos daqui pra frente terão o CSS escrito dessa forma}</em>.</p>
<p>Sabendo disso vamos começar falando de uma das nossas opções de escrever CSS, que não depende de estar usando ou não um pré-processador:</p>
<h3>BEM</h3>
<p>Acredito que essa seja uma das formas mais comum de escrever CSS. Por ser uma metodologia, não tem grandes segredos, mas não significa que seja fácil. Pensar no nome das coisas provavelmente é a parte mais difícil do desenvolvimento de software <em>{risos}</em>, e com o <a href="http://getbem.com/introduction/">BEM</a> é preciso pensar com carinho no nome das classes para que a estrutura faça sentido.</p>
<p>Para quem nunca trabalhou com a metodologia antes, vamos a uma explicação rápida:</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/670/1*2obrsDtnpAfExJALr3ROpQ.png" alt="" /><figcaption><a href="https://keepinguptodate.com/pages/2020/05/bem-visually-explained/">BEM Visually Explained</a> — By Jon Keeping</figcaption></figure>
<p>Nós basicamente dividimos uma classe em três pedaços:</p>
<ul>
<li>O <em>Block</em> representa o bloco que vai ser estilizado <em>{normalmente algum elemento que esteja envolvendo outros elementos/outras tags}.</em></li>
<li>O <em>Element</em> é algum elemento ou tag que esteja dentro desse bloco, e para identificarmos ele facilmente, é separado por dois <em>underscores</em>.</li>
<li>O <em>Modifier</em> significa que o estado daquele elemento mudou, o que significa que o nosso layout vai mudar graças; a separação dele é por dois <em>dashes</em>.</li>
</ul>
<p>Isso significa que em uma classe eu posso ter dois <em>elements</em>? Ou dois <em>modifiers</em>? Não. A estrutura do BEM espera que você tenha um de cada, por isso para pessoas que não estão familiarizadas com a metologia, pode ser bem confuso como criar uma classe nova. <em>{</em><a href="https://keepinguptodate.com/pages/2020/05/bem-visually-explained/"><em>Nesse artigo</em></a><em> tem uma explicação detalhada do uso do BEM e erros comuns, vale a leitura!}</em></p>
<p>De qualquer forma, se usado corretamente vários problemas de CSS são resolvidos, além de termos uma boa organização.</p>

<p>Agora vamos para a aplicação dessa metologia no Vue.</p>
<p>Começando pelas linhas 4, 5, 6, 7 — aqui nós temos classes condicionais baseadas em alguns atributos <em>{que no nosso exemplo são props declaradas nas linhas 28 e 29}</em>, uma coisa que podemos ver é que por serem condicionais, usamos o <em>modifier</em> para alterar visualmente o layout de cada uma delas <em>{já que elas representam um estado do nosso botão}</em>.</p>
<p>Na linha 12, temos uma classe com um <em>element</em>, pois esse componente de icone representa um elemento no nosso bloco <em>{que nesse exemplo é o botão}</em>.</p>
<p>Por fim, na linha 34 temos a declaração da lang, que como é importante dizer que só vai funcionar se o projeto está preparado para o pré-processador declarado. Se você começar um projeto usando o <a href="https://cli.vuejs.org/">Vue CLI</a> é uma das coisas que você pode ou não escolher. Se você quiser mudar o lang, na <a href="https://vue-loader.vuejs.org/guide/pre-processors.html">documentação do Vue</a> tem um passo-a-passo.</p>
<h3>Scoped CSS</h3>
<p>Você pode se perguntar: por quê exatamente eu preciso do BEM? Não é só sair espalhando minhas classes por ai e tudo bem?</p>
<p>Conforme você vai escrevendo o seu CSS, no final das contas o Vue vai pegar o CSS de todos os componentes sendo usados naquela página e jogar ele no &lt;head&gt;. O que significa que qualquer componente vai ser afetado por qualquer regra definida em um componente. O BEM tenta resolver isso tendo classes especificas que não vão afetar outro componente tão facilmente.</p>
<p>É ai que entra o <a href="https://vue-loader.vuejs.org/guide/scoped-css.html">scoped CSS</a>. Ele nos ajuda a resolver esse problema de escopo adicionando um atributo a mais nas nossas tags HTML para deixar as classes específicas para aquele componente.</p>
<p>Tudo o que precisamos para isso funcione é adicionar o atributo <em>scoped</em> à declaração de &lt;style&gt;, assim como na linha 34 do exemplo.</p>
<p><iframe loading="lazy" src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/4c1cc874afea1ff0fbbb82cd2134220d/href">https://medium.com/media/4c1cc874afea1ff0fbbb82cd2134220d/href</a></iframe></p>
<p>Para entender melhor vamos pegar a classe na linha 5.</p>
<p>O Vue vai transformar ela em algo como: .<em>loading[data-v-763db97b]</em>. Esse atributo novo sempre vai começar com <em>data-v </em>e vai terminar com uma <em>hash </em>aleatória, o que ajuda caso tenhamos classes iguais <em>{elas não vão colidir graças ao hash} </em>e impede que um componente distante seja afetado.</p>
<p>O problema dessa solução é que mesmo com esse atributo a mais na tag HTML, as regras afetam os componentes filhos. Olhando no exemplo ao lado, se o &lt;base-icon&gt; tivesse a classe<em> &#8220;icon&#8221;</em> e removêssemos a linha 12, as regras de CSS dessa classe afetariam o componente filho mesmo assim.</p>
<p>Podemos resolver isso facilmente evitando seletores iguais <em>{até mesmo usando uma metologia como o BEM que vimos anteriomente}</em>, para não correr o risco de herdar regras que não gostaríamos.</p>
<h3>CSS Modules</h3>
<p>Assim como a solução anterior, o <a href="https://vue-loader.vuejs.org/guide/css-modules.html#usage">CSS Modules</a> tenta nos ajudar com esse problema de conflitar regras de CSS ou herdar regras que não gostariamos.</p>
<p>A diferença dele para o <em>scoped</em>, é que não teremos um atributo novo no HTML e sim uma classe gerada pelo Vue, composta pelo nome do componente + o nome da classe que nós colocamos no CSS + uma hash aleatória.</p>
<p>Para que essa solução funcione, precisamos adicionar o atributo <em>module</em> à declaração de &lt;style&gt;, assim como na linha 35 do exemplo.</p>
<p><iframe loading="lazy" src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/835a20022087c3a3aa6756877efde63d/href">https://medium.com/media/835a20022087c3a3aa6756877efde63d/href</a></iframe></p>
<p>Uma das coisas mais importantes aqui é que a sintaxe de declarar uma classe sempre vai ser <em>:class=&#8221;$style.xpto&#8221; </em>e com o nome da classe sempre em <em>camelCase</em>. E no caso de classes condicionais como na linha 5, 6 e 7, precisamos usar a classe dentro de colchetes.</p>
<p>Para entender melhor, vamos pegar a linha 5 de exemplo. No fim das contas o Vue vai gerar uma classe parecida com <em>BaseButton_loading_1VuSe</em>. Isso vai resolver o nosso problema de conflito de regras e não é algo que interfere nos filhos.</p>
<p>Mas <em>e se</em> você quisesse que isso acontecesse? Até agora pontuei que um componente filho herdar as regras do pai era uma coisa ruim, mas dependendo da situação é exatamente isso que nós queremos para não repetir código.</p>
<p>Nesse caso, você pode passar as classes como <em>prop</em> para o componente filho, ou usar <a href="https://sass-lang.com/documentation/at-rules/mixin">mixins</a> de um pré-processador e importar nos dois componentes.</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/1024/0*zmhmFWohYMyOXc0X" alt="" /><figcaption>Photo by <a href="https://unsplash.com/@alistairmacrobert?utm_source=medium&amp;utm_medium=referral">Alistair MacRobert</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure>
<h3>Achou que tinha acabado?</h3>
<p>Achou errado!</p>
<p>As três soluções que vimos até agora, são as formas oficiais do Vue de definir CSS, mas a partir daqui vamos entrar no mundo obscuro das formas alternativas.</p>
<p>Nós separamos duas para testar e ambas são frameworks <a href="https://cssinjs.org/?v=v10.5.1">CSS-in-JS</a>, o que significa que nós escrevemos o CSS no JS e não precisamos mais da tag &lt;style&gt; nos nossos componentes.</p>
<h3>Aphrodite</h3>
<p>Começando pelo <a href="https://github.com/Khan/aphrodite">Aphrodite</a> <em>{que não tem muita coisa sobre o uso dele com o Vue na internet e eu usei </em><a href="https://medium.com/@nicholasbaroni/styling-vue-components-with-aphrodite-dd53bc2fa9d8"><em>esse artigo</em></a><em> como referência para a minha implementação}</em>.</p>
<p><iframe loading="lazy" src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/15e50f0ad53bdfef0f348b7478f076a7/href">https://medium.com/media/15e50f0ad53bdfef0f348b7478f076a7/href</a></iframe></p>
<p>Inicialmente, nós precisamos importar duas coisas do framework: o <em>StyleSheet</em> e o <em>css {como vemos na linha 8}</em>.</p>
<p>O <em>StyleSheet </em>vai ser o responsável por gerar as nossas regras de CSS baseado na estrutura de objeto com o nome da classe sendo a chave, e o valor sendo os atributos de CSS <em>{linha 10 à 19}</em>.</p>
<p>E para que nós possamos usar essas classes no HTML, primeiro precisamos expor elas no JS <em>{como vemos da linha 22 à 24} </em>e usamos o <em>css </em>na linha 2 <em>{separando os nomes das classes por vírgula se necessário}</em>.</p>
<p>Agora vamos voltar o mesmo componente de botão dos exemplos anteriores, mas dessa vez usando Aphrodite:</p>
<p><iframe loading="lazy" src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c19aebfbe771d7f29025293b5708c073/href">https://medium.com/media/c19aebfbe771d7f29025293b5708c073/href</a></iframe></p>
<p>Temos algumas limitações com essa solução, e de cara o que mais me incomodou foi que por padrão todas as regras são geradas com<em> !important</em>. A linha 18 poderia estar importando só de <em>&#8216;aphoridite&#8217;</em>, mas para não ter o comportamento de <em>!important</em>, eu acabei importando as dependências necessárias de outro pacote.</p>
<p>Também não existe um jeito oficial de definir classes aninhados <em>{ou seja, uma classe dentro de outra classe}</em>, com isso precisamos ter classes diferentes para um estado específico de um elemento, como por exemplo na linha 27 e 28, onde o componente de ícone que nos exemplos anteriores só tinha uma classe, aqui nós precisamos de duas.</p>
<p>Com essa implementação, as classes geradas são completamente aleatórias <em>{algo parecido com _w3twfb}</em>, o que dificulta um pouco encontrar onde que essas regras foram definidas, mas tem a vantagem de serem nomes curtos.</p>
<p>Por fim, a implementação de exemplo não é a mais otimizada possível, dá para criar um plugin que importe o Aphrodite em todos os nossos componentes.</p>
<h3>Styled Components</h3>
<p>Por fim chegamos na última opção da nossa lista, o <a href="https://github.com/styled-components/vue-styled-components">Styled Components</a>, que nos permite criar componentes estilizados.</p>
<p><iframe loading="lazy" src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ec9dd6c8f4bca0bdc59cb46af4576e02/href">https://medium.com/media/ec9dd6c8f4bca0bdc59cb46af4576e02/href</a></iframe></p>
<p>Na linha 22 e 33 temos dois componentes sendo definidos usando o <em>styled</em> importado do framework. O primeiro parâmetro é a tag HTML que vai ser renderizada, o segundo são as <em>props</em> daquele componente. A partir dai é possível retornar todas as regras de CSS necessárias<em> {e condicionar elas dependendo de uma propriedade, o que nos dá muita liberdade}</em>.</p>
<p>Por mais diferente que essa implementação seja, esses dois componentes são iguais a qualquer outro definido por um arquivo vue <em>{claro, com as suas limitações, ele é um componente puramente visual, então não vamos ter métodos ou outros tipos de atributos nele} </em>e precisa ser declarado como na linha 42 para ser usado pelo HTML.</p>
<p>Eles também não precisavam estar dentro do <em>vue file</em> <em>{só coloquei aqui para facilitar o exemplo rs}.</em> Por serem componentes normais, poderiam estar em arquivos separados para serem importados pelo base-button.</p>
<p>É uma solução simples para componentes básicos.</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/1024/0*U_Hpbae9C1fL-0mi" alt="" /><figcaption>Photo by <a href="https://unsplash.com/@sagarapher?utm_source=medium&amp;utm_medium=referral">Sagar Rana</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure>
<h2>Conclusão</h2>
<p>Depois de muita discussão e uni-duni-tê, nós escolhemos usar o <strong>CSS Modules</strong> como padrão aqui na Alice <em>{pessoalmente, eu ainda prefiro usar o BEM, mas vamos manter isso entre eu e vc, blz? haha}</em>.</p>
<p>Pelas nossas conversas, foi a opção que mais fez sentido para o nosso momento e para os nossos produtos, onde muitas pessoas precisam mexer. Mesmo sendo uma sintaxe <em>diferente do normal</em>, é algo rápido de aprender/entender e ganhamos uma certa liberdade com qual nome de classes vamos colocar <em>{além de impedir certos problemas de herdar regras desnecessárias/ter seletores de tag HTML}</em>.</p>
<p>Mas por que fizemos essa escolha? As outras opções são ruins?</p>
<p>Particularmente as soluções não oficiais não me agradam, pois é uma dependência a mais que precisamos colocar no projeto, temos uma curva de aprendizado para escrever o CSS dentro do JS, e do meu ponto de vista não é mais vantajoso do que usar uma solução oficial do Vue.</p>
<p>Porém, não existe solução perfeita, não tem uma forma melhor do que a outra, no fim das contas é necessário considerar o que mais faz sentido para o projeto e para as pessoas que vão dar manutenção no código.</p>
<p>Hoje o <em>CSS Modules</em> faz sentido pra gente, mas quem sabe daqui um tempo não faça mais. É importante ter a mente aberta para qualquer solução, e do meu ponto de vista, manter o mais simples possível. 🙂</p>
<h3>Que tal fazer parte desse time?</h3>
<p>Estamos buscando pessoas que topem o desafio de transformar a saúde no Brasil através da tecnologia. <a href="https://www.alice.com.br/carreiras">Clica aqui</a> para saber mais das vagas que temos em aberto! 🙂</p>
<p>O post <a href="https://alice.com.br/tech/qual-a-melhor-forma-de-escrever-css-no-vue/">Melhor forma de escrever CSS no Vue</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>JSON: integrando Back-end e Front-end na prática</title>
		<link>https://alice.com.br/tech/json-como-integrar-back-end-e-front-end-com-padroes-diferentes/</link>
		
		<dc:creator><![CDATA[Bruno Federowski]]></dc:creator>
		<pubDate>Sat, 20 Jul 2024 20:23:39 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<guid isPermaLink="false">https://alice.com.br/tech/sem-categoria/json-como-integrar-back-end-e-front-end-com-padroes-diferentes/</guid>

					<description><![CDATA[<p>Como padrão, no Javascript utilizamos o camelCase para nomenclatura de variáveis ​​e funções. E aqui na Alice, nós também seguimos esse padrão para os projetos de Front-end.</p>
<p>O post <a href="https://alice.com.br/tech/json-como-integrar-back-end-e-front-end-com-padroes-diferentes/">JSON: integrando Back-end e Front-end na prática</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>O Problema</h3>
<p>Como padrão, no Javascript utilizamos o <strong>camelCase </strong>para nomenclatura de variáveis ​​e funções, e é possível encontrar essa definição nos principais guias de estilo de JS, como o <a href="https://standardjs.com/rules.html">standardjs</a> ou o <a href="https://github.com/airbnb/javascript#naming--camelCase">airbnb</a>. E aqui na <a href="https://alice.com.br/carreiras">Alice</a>, nós também seguimos esse padrão para os projetos de Front-end.</p>
<p>Uma das <a href="https://medium.com/alice-tech/como-tomamos-decis%C3%B5es-860121def07f">decisões que tomamos</a> ao definir o padrão para nossas APIs é que usaríamos JSON com <strong>snake_case </strong>pois consideramos que para a leitura de logs por humanos, esse formato é mais legível do que <strong>camelCase</strong>. No nosso Back-end, feito em <a href="https://kotlinlang.org/">Kotlin</a>, utilizamos a biblioteca em java, <a href="https://github.com/google/gson">GSON</a>. Ela transforma os objetos JAVA em uma representação em JSON e vice-versa. Para que a serialização/deserialização funcionasse com <strong>snake_case</strong> foi necessário passar o parâmetro <em>FieldNamingPolicy</em> com o valor <em>LOWER_CASE_WITH_UNDERSCORES </em>na configuração do client do GSON. (Imagem abaixo)</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/840/1*8xkzcdPXNLHMqnJOgwI2dw.png" alt="" /></figure>
<p>Dessa forma ficamos com o padrão <strong>snake_case</strong> no Back-end em todas as nossas APIs e <strong>camelCase</strong> em todos os projetos de Front-end, ou seja, o corpo de nossas requisições e respostas HTTP são formados por um <strong>JSON com padrão snake_case</strong>.</p>
<p>Com isso temos o seguinte problema: Como utilizar <strong>camelCase</strong> no Front-end, sendo que todas as solicitação para as nossas APIs HTTP teriam que ser feitas com <strong>snake_case</strong>?</p>
<h3>A Solução</h3>
<p>Para realizar nossas chamadas HTTP no Front-end, utilizamos a <a href="https://github.com/sindresorhus/ky">biblioteca ky</a> ( ), que adiciona algumas funcionalidades da <a href="https://developer.mozilla.org/pt-BR/docs/Web/API/Fetch_API">fetch API</a>, entre elas, os <a href="https://github.com/sindresorhus/ky#hooks">hooks</a> que permitem modificações da requisição e de seu <em>payload</em> durante o ciclo de vida dessa chamada.</p>
<p>Conseguimos então, resolver esse problema criando um conversor, antes das requisições e após as respostas, utilizando os hooks <strong>beforeRequest</strong> (que permite modificar a requisição antes dela ser enviada) e <strong>afterResponse </strong>(que permite alterar a resposta da requisição):</p>
<ul>
<li><strong>beforeRequest: </strong>Vamos converter o corpo da nossa requisição de <strong>camelCase</strong> para <strong>snake_case</strong><em>.</em></li>
<li><strong>afterResponse: </strong>Vamos converter o corpo da nossa resposta de <strong>snake_case</strong> para <strong>camelCase</strong><em>.</em></li>
</ul>
<p>O código JS ficaria da seguinte forma:</p>
<p><iframe loading="lazy" src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c6890799daa387f4bc862d605eae4e86/href">https://medium.com/media/c6890799daa387f4bc862d605eae4e86/href</a></iframe></p>
<h3>Esse código é open source</h3>
<p>Criamos um pacote para permitir essa e outras alterações de <em>case </em>em nossas requisições, e decidimos abrir o código dessa solução:</p>
<p><a href="https://github.com/alice-health/ky-hooks-change-case">alice-health/ky-hooks-change-case</a></p>
<p>Inclusive, esse pacote foi adicionado como biblioteca relacionada no <a href="https://github.com/sindresorhus/ky#related">repositório oficial do KY</a>. Sinta-se a vontade para abrir <em>pull requests</em> com melhorias, correções ou mandar qualquer comentário. Já utilizou o <em>ky </em>e/ou<em> hooks</em> para outros casos de uso? Compartilhe com a gente aqui nos comentários quais  .</p>
<p>Kudos e agradecimentos à <a href="https://medium.com/u/da63b77d6dcb">Diego Leme</a> pela contribuição na biblioteca e início desse post.</p>
<h3>Que tal fazer parte desse time?</h3>
<p>Estamos buscando pessoas que topem o desafio de transformar a saúde no Brasil através da tecnologia. <a href="https://www.alice.com.br/carreiras">Clica aqui</a> para saber mais das vagas que temos em aberto!</p>
<p>O post <a href="https://alice.com.br/tech/json-como-integrar-back-end-e-front-end-com-padroes-diferentes/">JSON: integrando Back-end e Front-end na prática</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Descomplicando o Apache Kafka</title>
		<link>https://alice.com.br/tech/descomplicando-o-apache-kafka/</link>
		
		<dc:creator><![CDATA[Bruno Federowski]]></dc:creator>
		<pubDate>Sat, 20 Jul 2024 20:23:39 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<guid isPermaLink="false">https://alice.com.br/tech/sem-categoria/descomplicando-o-apache-kafka/</guid>

					<description><![CDATA[<p>Na Alice, temos a cultura de tomada de decisões em conjunto para assuntos que impactem a engenharia como um todo.</p>
<p>O post <a href="https://alice.com.br/tech/descomplicando-o-apache-kafka/">Descomplicando o Apache Kafka</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Introdução</h2>
<p>Na Alice, temos a <a href="https://medium.com/alice-tech/como-tomamos-decis%C3%B5es-860121def07f">cultura de tomada de decisões em conjunto</a> para assuntos que impactem a engenharia como um todo. Isso sendo desde a definição da <a href="https://medium.com/alice-tech/flutter-eu-escolho-voc%C3%AA-83ef5ee5c4a3?source=---------5-----------------------">tecnologia a ser usada para desenvolvimento mobile</a>, até a arquitetura de processamento assíncrono dos serviços (spoiler: ela é baseada em Kafka).</p>
<p>Mas antes de contar como e porque escolhemos o Kafka, vale uma n̶ã̶o̶ ̶t̶ã̶o̶ breve introdução sobre ele.</p>
<h2><strong>O que é o Apache Kafka?</strong></h2>
<p>Resumidamente, o Kafka pode ser definido como um sistema de processamento de stream de dados em tempo real / um sistema de mensageria (messaging system) publish-subscribe distribuído.</p>
<p>Ele possui como principais características — se comparado com outros sistemas de mensageria — um alto throughput, clusterização no DNA (permitindo escalabilidade horizontal), ordenamento e persistência de mensagens com estrutura de disco O(1) (entraremos em mais detalhes sobre o que isto representa).</p>
<h2><strong>O que é um sistema de mensageria?</strong></h2>
<p>Um sistema de mensageria nada mais é do que uma forma de comunicação assíncrona entre duas (ou mais) aplicações. Neste conceito, as aplicações se comunicam através de uma fila (message queue), de forma totalmente desacoplada, onde o produtor da mensagem (producer) não tem conhecimento de quem a processará, assim como o consumidor (consumer) também não possui ciência de quem a produziu. Ambas as pontas apenas se preocupam com o conteúdo da mensagem.</p>
<p>Existem dois tipos de padrões de mensageria: ponta à ponta (point to point) e publish-subscribe (pub-sub).</p>
<h3><strong>Sistema de mensageria ponta à ponta</strong></h3>
<p>Um sistema de mensageria ponta à ponta é caracterizado pelo fato de que cada mensagem apenas poder ser consumida uma única vez. Neste sistema, a mensagem é persistida na fila e, a partir do momento que um consumidor lê esta mensagem, ela é automaticamente removida da fila. Exemplos de sistemas neste modelo temos o Amazon Simple Queue Service (SQS) e o Microsoft Message Queuing (MSMQ).</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/454/0*jdcRsgpQHczaw322" alt="(Fig. 1: Ilustração de fila ponta à ponta. https://docs.oracle.com/cd/E19340-01/820-6424/aerbj/index.html)" /><figcaption>(Fig. 1: Ilustração de fila ponta à ponta. <a href="https://docs.oracle.com/cd/E19340-01/820-6424/aerbj/index.html">https://docs.oracle.com/cd/E19340-01/820-6424/aerbj/index.html</a>)</figcaption></figure>
<h3><strong>Sistema de mensageria publish-subscribe</strong></h3>
<p>No sistema de mensageria publish-subscribe assim como no de ponta à ponta, as mensagens são persistidas em uma fila através de um produtor (publisher). Porém, diferentemente do modelo anterior, os consumidores podem se inscrever/assinar (subscribe) à uma ou mais filas e consumir todas as mensagens destas filas. Neste modelo, todos os consumidores (subscribers) processam todas as mensagens de todas as filas no qual eles se inscreveram. Exemplos de sistemas neste modelo temos o RabbitMQ e o Apache Kafka.</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/395/0*KxH9m3CA5A9EHi2Q" alt="" /><figcaption>(Fig. 2: Ilustração de fila pub-sub. <a href="https://docs.oracle.com/cd/E19340-01/820-6424/aerbk/index.html">https://docs.oracle.com/cd/E19340-01/820-6424/aerbk/index.html</a>)</figcaption></figure>
<h2><strong>Background</strong></h2>
<h3><strong>História</strong></h3>
<p>Tudo começou em meados de 2010, com uma necessidade do LinkedIn: integração massiva de dados. Um volume enorme de dados era gerado a todo tempo, porém, com as ferramentas existentes na época, não era possível integrar e centralizar estes dados da forma que gostariam e com a escala que precisavam.</p>
<p>Foi então que <a href="https://twitter.com/jaykreps">Jay Kreps</a> e sua equipe surgiram com o conceito do Kafka.</p>
<h3><strong>Timeline</strong></h3>
<p>Em 2011 tornou-se um projeto open-source, sendo absolvido pela Apache Foundation em 2012.</p>
<p>Em 2014, os engenheiros do LinkedIn responsáveis pelo desenvolvimento do Kafka fundaram a <a href="https://www.confluent.io/">Confluent</a>, empresa com foco em Kafka.</p>
<h3><strong>Fun fact</strong></h3>
<p>Kafka é desenvolvido em Scala e Java, e seu nome é uma referência ao escritor alemão <a href="https://pt.wikipedia.org/wiki/Franz_Kafka">Franz Kafka</a>. Jay diz que a escolha do nome se deu ao fato de que, devido o Kafka ser um sistema otimizado para escrita, faria sentido ter o nome de um escritor. Além de achar que <a href="https://www.quora.com/What-is-the-relation-between-Kafka-the-writer-and-Apache-Kafka-the-distributed-messaging-system">soava bem para um projeto open source</a>.</p>
<h2><strong>Mas por que utilizar Kafka?</strong></h2>
<p>Dentre as principais vantagens do Kafka, podemos destacar:</p>
<ul>
<li><strong>Sistema de registros:</strong> após persistido, um registro (mensagem) nunca mais é mais removido do log (por padrão). Desta forma, é possível “voltar no tempo” e reprocessar todas as mensagens a partir de uma data específica.</li>
<li><strong>Ordenamento garantido</strong>: ao ser publicada a mensagem A (POST) e então a B (PUT), sempre serão retornadas e lidas nesta mesma ordem (FIFO).</li>
<li><strong>Centralização</strong>: uma mesma mensagem pode servir de input para uma operação SQL e para um registro em um Data Lake.</li>
<li><strong>Escalabilidade</strong>: Kafka é totalmente pensado em clusterização e escalabilidade horizontal.</li>
<li><strong>Pull over Push</strong>: diferentemente de outros sistemas de mensageria (e.g. RabbitMQ) e/ou sistemas de service bus, o Kafka trabalha com um modelo de pulling ao invés de pushing, no qual o consumidor tem de solicitar ativamente a leitura de novas mensagens. Isto possibilita a existência de consumers com velocidades de processamento distintas entre si.</li>
<li><strong>Performance</strong>: possui um alto throughput, comportando centenas de milhares de mensagens/seg até em hardwares mais modestos. Como citado anteriormente, possui persistência de mensagens com estrutura de disco <a href="https://pt.wikipedia.org/wiki/Grande-O">O(1)</a>, ou seja, não importa a quantidade de mensagens existentes, a velocidade de escrita sempre se mantém a mesma.</li>
</ul>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/600/0*Z4U-ueC2dpCSdLIh" alt="" /><figcaption>(Fig 3: Ilustração de representação do Kafka)</figcaption></figure>
<h3><strong>Performance linear</strong></h3>
<p>Devido a arquitetura de distribuição que o Kafka implementa, é possível obtermos escalabilidade linear em nosso sistema. Desta forma, para cada nó (broker) adicionado ao cluster, teremos um aumento linear de throughput suportado pelo Kafka.</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/600/0*4htqnFHKombtAbFr" alt="" /><figcaption>(Fig. 4: Gráfico de aumento do throughput do Kafka para cada nó adicionado no Cluster. <a href="https://www.slideshare.net/r39132/linkedin-data-infrastructure-qcon-london-2012/38-Kafka_Performance_Linear_Incremental_Scalability">https://www.slideshare.net/r39132/linkedin-data-infrastructure-qcon-london-2012/38-Kafka_Performance_Linear_Incremental_Scalability</a>)</figcaption></figure>
<h3><strong>Use cases</strong></h3>
<p>Mesmo o Kafka sendo extremamente versátil, existem alguns casos de uso no qual acaba se destacando. Tais como:</p>
<ul>
<li><strong>Hub de eventos</strong>: Kafka pode servir de um hub centralizador dos eventos da sua aplicação, permitindo que inputs de diversas fontes de dados sejam concentrados em um único ponto, para então serem potencialmente filtrados, transformados e processados de formas distintas.</li>
<li><strong>Data pipeline</strong>: um dado pode ser persistido no Kafka para então ser replicado para outros repositórios, tais como banco de dados.</li>
<li><strong>Entry point de Big Data</strong>: em casos de utilização de data lakes baseados em storages na nuvem (e.g. AWS S3), Kafka costuma servir como um “buffer” dos dados devido ao seu throughput, armazenando-os até serem transferidos para o storage final.</li>
</ul>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/851/0*4LdPngQKdZbeRF1L" alt="" /><figcaption>(Fig. 5: Ilustração Kafka operando como um hub de eventos. <a href="https://www.confluent.io/">https://www.confluent.io/</a>)</figcaption></figure>
<h2><strong>Semânticas</strong></h2>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/481/0*TfavmQXnGDlvnvva" alt="" /><figcaption>(Fig. 6: Representação visual dos fundamentos do Kafka. <a href="https://www.confluent.io/">https://www.confluent.io/</a>)</figcaption></figure>
<h3><strong>Registros</strong></h3>
<p>Os registros (records) são as mensagens persistidas em uma fila (tópico). Um registro é composto de três componentes: chave, valor e timestamp.</p>
<p>A chave (key) é o que define em qual partição este registro será armazenado (mais detalhes sobre particionamento abaixo). A chave não é obrigatória e, caso não seja fornecida, o Kafka se encarregará de definir a partição correta para este registro.</p>
<p>O valor (value) é o conteúdo do registro, o equivalente ao corpo de uma mensagem. O valor pode conter qualquer dado, desde uma simples string até um objeto serializado em JSON.</p>
<p>O timestamp é a data e hora no qual o registro foi persistido, sendo atribuído automaticamente pelo Kafka no momento da criação do registro.</p>
<p>O registro é sempre imutável e append-only, ou seja, somente é possível incluir novos registros. Uma vez incluído não pode mais ser modificado ou removido.</p>
<p>Os registros são sempre persistidos em disco, não havendo nenhum cache em memória, tanto para escrita quanto para leitura.</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/600/0*r1v6MYiYKT5H23IY" alt="" /><figcaption>(Fig. 7: Registros do Kafka em um log (partição de um tópico). <a href="https://www.confluent.io/">https://www.confluent.io/</a>)</figcaption></figure>
<h3><strong>Producer e Consumer</strong></h3>
<p>O producer é quem será responsável por gerar registros em um tópico e o consumer por ler estes registros. Em ambos os casos, a comunicação é sempre feita com o broker (nó) líder do cluster.</p>
<p>Ao ler um registro, o consumer pode tanto solicitar o último não lido, quanto a partir de uma posição específica.</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/528/0*qfGkKK_Yx2rlZ16K" alt="" /><figcaption>(Fig. 8: Diagrama producer/consumer de um cluster Kafka. <a href="https://www.confluent.io/">https://www.confluent.io/</a>)</figcaption></figure>
<h3><strong>Tópicos</strong></h3>
<p>O tópico é a nomenclatura lógica para uma ou mais partições. Basicamente é onde os registros ficam armazenados, sendo equivalente à uma fila, porém considerando todas as partições do cluster.</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/416/0*4XODBKLqrQpMNOPx" alt="" /><figcaption>(Fig. 9: Representação de um tópico do Kafka e suas partições. <a href="https://www.confluent.io/">https://www.confluent.io/</a>)</figcaption></figure>
<h3><strong>Partições</strong></h3>
<p>As partições são as divisões “físicas” de um tópico. Cada partição representará o conjunto de registros de um tópico, em um broker (nó) no cluster.</p>
<p>As partições seguem o modelo de líder/seguidor (leader/follower), onde sempre há ao menos um broker com uma partição principal que recebe todas as operações de leitura e escrita, sendo replicado posteriormente para os demais brokers seguidores em forma de réplica.</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/600/0*LaNpvKl7mb0oUwEA" alt="" /><figcaption>(Fig. 10: Representação de um cluster Kafka. <a href="https://www.confluent.io/">https://www.confluent.io/</a>)</figcaption></figure>
<p>No exemplo acima, temos quatro partições com duas réplicas cada. Cada partição ficará responsável por um conjunto de dados daquele tópico, onde estes mesmos dados serão replicados em cada um dos outros dois brokers seguidores.</p>
<p>O particionamento pode ser feito manualmente ou baseado em uma chave. No primeiro cenário, quem estiver produzindo e/ou consumindo as mensagens, fica responsável por indicar com qual partição deseja interfacear. Já no segundo caso, deve-se definir previamente qual o range de valores de uma chave que cada partição será responsável. Desta forma, ao publicar ou ler um registro, o Kafka ficará encarregado por atribuir a partição correspondente, baseado nas configurações previamente estabelecidas.</p>
<h3><strong>Grupos de consumo</strong></h3>
<p>Grupo de consumo (consumer group) é o nome lógico para um ou mais consumers. É através dele que se dá a escalabilidade do lado dos consumidores.</p>
<p>Cada grupo lê todas as mensagens de um tópico, dividindo as partições deste tópico por entre os integrantes do grupo.</p>
<p>Cada grupo vai representar um processamento específico (e distinto) dos registros de um tópico em relação ao outro grupo. Já cada integrante de um mesmo grupo representará uma instância de processamento (um processo, uma thread, um container, etc.) idêntica em relação aos consumers deste mesmo grupo.</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/474/0*RScgni6rLtyU_kF4" alt="" /><figcaption>(Fig. 11: Representação de um grupo de consumo. <a href="https://www.confluent.io/">https://www.confluent.io/</a>)</figcaption></figure>
<p>No exemplo acima, temos um tópico dividido em quatro partições, e dois grupos de consumo: grupo A com dois integrantes e B com quatro.</p>
<p>Desta forma, tanto o grupo A quanto o grupo B processarão todas as mensagens de um determinado tópico. Devido ao grupo A possuir dois integrantes, cada integrante ficará responsável pelos registros de duas partições cada. Já no grupo B por possuir quatro integrantes, cada integrante ficará responsável pelas mensagens provenientes de uma única partição cada.</p>
<p>Com isto, é possível ter N processos distintos para um mesmo dado e paralelizar cada um destes processamentos em N instâncias conforme a necessidade, sem gerar concorrência entre si.</p>
<h3><strong>Offsets</strong></h3>
<p>Ao inserir um registro em um tópico, o Kafka automaticamente atribui um identificador único sequencial para ele, que consiste basicamente de um índice deste registro na partição daquele tópico.</p>
<p>O offset por sua vez, representa a posição de leitura de um grupo de consumo, em relação à uma partição de um tópico.</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/753/0*ArApyHIsCDJkXF3C" alt="" /><figcaption>(Fig. 12: Demonstração de um tópico com suas partições e respectivos offsets. <a href="https://www.confluent.io/">https://www.confluent.io/</a>)</figcaption></figure>
<p>No exemplo acima, temos um tópico com três partições. As setas representando um grupo de consumo e os números destacados os offsets daquele grupo nas respectivos partições.</p>
<p>O objetivo do offset é definir qual foi o último registro lido por aquele grupo de consumo naquela partição, para que assim possa prosseguir com a leitura de onde parou.</p>
<p>O Kafka mantém o tracking dos offsets para que apenas retorne os registros ainda não lidos. Porém, como citado anteriormente, um consumer pode solicitar um registro em uma posição específica.</p>
<h2><strong>Conclusão</strong></h2>
<p>Conforme pudemos ver, o Kafka é uma excelente ferramenta para criação de sistemas distribuídos, mas assim como qualquer tecnologia, nasceu para resolver problemas específicos e não para ser uma “bala de prata” da persistência de dados.</p>
<h2>Que tal fazer parte desse time?</h2>
<p>Estamos buscando pessoas que topem o desafio de transformar a saúde no Brasil através da tecnologia. <a href="https://www.alice.com.br/carreiras">Clica aqui</a> para saber mais das vagas que temos em aberto!</p>
<p>O post <a href="https://alice.com.br/tech/descomplicando-o-apache-kafka/">Descomplicando o Apache Kafka</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Como fazemos microbenchmarks em Kotlin</title>
		<link>https://alice.com.br/tech/como-fazemos-microbenchmarks-em-kotlin/</link>
		
		<dc:creator><![CDATA[Bruno Federowski]]></dc:creator>
		<pubDate>Sat, 20 Jul 2024 20:23:39 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<guid isPermaLink="false">https://alice.com.br/tech/sem-categoria/como-fazemos-microbenchmarks-em-kotlin/</guid>

					<description><![CDATA[<p>As vezes precisamos fazer alguns testes de performance ou de benchmark, a fim de ter um melhor embasamento na hora de tomar nossas decisões.</p>
<p>O post <a href="https://alice.com.br/tech/como-fazemos-microbenchmarks-em-kotlin/">Como fazemos microbenchmarks em Kotlin</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>As vezes precisamos fazer alguns testes de performance ou de benchmark, a fim de ter um melhor embasamento na hora de <a href="https://medium.com/alice-tech/como-tomamos-decis%C3%B5es-860121def07f">tomar nossas decisões</a>. Dado que não existe muito material sobre o assunto com essa stack específica, pensamos em descrever aqui como fizemos nossa aplicação simples para benchmarks.</p>
<h3>Afinal, o que é um microbenchmark?</h3>
<p>Um microbenchmark é um teste projetado para medir o desempenho de uma unidade muito pequena: o tempo para chamar um método sincronizado versus um método não sincronizado; a sobrecarga na criação de um encadeamento versus o uso de um conjunto de encadeamentos; o tempo para executar um algoritmo aritmético versus uma implementação alternativa; e assim por diante.</p>
<p>É uma forma bem interessante de verificar se algum fluxo que estamos fazemos está consumindo muito ou pouco tempo ou recursos (CPU, memória, rede, disco, etc). Porém deve ser feito com cautela.</p>
<p>Muitos fatores podem interferir na execução e aferição de um benchmark, como capacidade de processamento do computador, memória disponível, versão do framework, entre outros. Por conta disso, deve ser feito para testes isolados de unidades bem específicas.</p>
<h3>Testando uso de reflections para nossos logs</h3>
<p>Há alguns meses atrás, o time <a href="https://alice.com.br/blog/conheca-a-alice/alice-e-a-empresa-mais-inovadora-da-america-latina-segundo-fast-company/">Alice</a> estudou a necessidade do uso de <em>Reflection</em> para identificar a função e a classe exata de onde o log foi gerado.</p>
<p>Nossa hipótese era que a utilização de <em>Reflection</em> poderia aumentar o consumo de recursos da função, mas não sabíamos o quanto aumentaria e se isso impactaria de verdade nossas aplicações.</p>
<h4>Importação de dependências</h4>
<p>Usamos a biblioteca JMH (the Java Microbenchmark Harness) para fazer a comparação. Utilizamos tanto o <a href="https://search.maven.org/classic/#artifactdetails%7Corg.openjdk.jmh%7Cjmh-core%7C1.19%7Cjar">JMH Core</a> quanto <a href="https://search.maven.org/classic/#artifactdetails%7Corg.openjdk.jmh%7Cjmh-generator-annprocess%7C1.19%7Cjar">JMH Annotation Processor</a>.</p>
<pre>plugins <strong>{
    </strong><em>kotlin</em>("jvm") <em>version </em>"1.4.32"
    <em>kotlin</em>("kapt") <em>version </em>"1.4.32"
    id("me.champeau.gradle.jmh") <em>version </em>"0.5.2"
    id("io.morethan.jmhreport") <em>version </em>"0.9.0"
    <em>application
</em><strong>}</strong></pre>
<p>No build.gradle.kts do projeto nós declaramos a task para rodar os testes de benchmark</p>
<pre><em>task</em>("benchmarks", type = JavaExec::class) <strong>{
  </strong><em>classpath </em>= <em>sourceSets</em>.getByName("test").<em>runtimeClasspath
  main </em>= "br.com.alice.benchmarks.BenchmarksRunnerKt"
<strong>}</strong></pre>
<p>Além disso importamos a biblioteca orgs.slf4j.Logger para criar nossos logs. A lista de dependências ficou:</p>
<pre><em>dependencies </em><strong>{
    </strong><em>kapt</em>("org.openjdk.jmh:jmh-generator-annprocess:1.25")

    <em>implementation</em>("org.openjdk.jmh:jmh-core:1.25")
    <em>implementation</em>("org.openjdk.jmh:jmh-generator-annprocess:1.25")

    <em>api</em>("ch.qos.logback:logback-classic:1.2.3")
    <em>implementation</em>("net.logstash.logback:logstash-logback-encoder:6.4")

    <em>annotationProcessor</em>("org.openjdk.jmh:jmh-generator-annprocess:1.25")

    <em>testImplementation</em>(<em>kotlin</em>("test-junit"))
<strong>}</strong></pre>
<h4>Criação da função de log</h4>
<p>Para realizar o teste, criamos uma abstração para a biblioteca orgs.slf4j.Logger . Só possui uma simples função de logar info, simulando nossa biblioteca interna para logs.</p>
<p><iframe loading="lazy" src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e613b3205a2f958257f256880d60dc51/href">https://medium.com/media/e613b3205a2f958257f256880d60dc51/href</a></iframe></p>
<h4>Criando os casos de teste</h4>
<p>JMH suporta diferentes tipos de benchmarks: <em>Throughput,</em> <em>AverageTime,</em> <em>SampleTime</em>, and <em>SingleShotTime</em>. São configurados via annotation @BenchmarkMode .</p>
<ul>
<li><em>Throughput</em>: nesse modo, o teste é executado em um período pre determinado e é avaliado o número de vezes que o método em teste foi executado</li>
<li><em>AverageTime</em>: inverso ao <em>Throughput</em>, esse método é usado para se ter o tempo médio de cada chamada do método em teste.</li>
<li><em>SampleTime</em>: esse método também utiliza um tempo pré determinado, porém aqui algumas chamadas são selecionadas randomicamente e seu tempo avaliado.</li>
<li><em>SingleShotTime</em>: mede o tempo de uma única chamada.</li>
</ul>
<p>Para o nosso caso, utilizamos <em>AverageTime</em>, dessa forma a gente simular os nossos micro-serviços utilizando os métodos de log diversas vezes e ver o quanto isso impactaria o tempo e os recursos dos mesmos.</p>
<p>Configuramos também a unidade de medida temporal para microsegundos, também via annotation @OutputTimeUnit .</p>
<p>Usamos a annotation @Benchmark para definir uma função como <em>test case</em> do benchmarking. Criamos 3 tipos de testes:</p>
<ul>
<li>Log sem nenhuma reflection</li>
<li>Log utilizando reflection através do Throwable para receber os nomes de classe e método.</li>
<li>Log utilizando reflection através da Thread para receber os nomes de classe e método.</li>
</ul>
<p><iframe loading="lazy" src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/d4d08cafb3722fed8a0ab3599682a6db/href">https://medium.com/media/d4d08cafb3722fed8a0ab3599682a6db/href</a></iframe></p>
<h4>Configuração final do benchmark</h4>
<p>Para agrupar todos os testes, configurar saída do resultado e definir últimas configurações, nós criamos o arquivo <strong>BenchmarksRunner.kt</strong>, assim declarado no gradle.build.kts , mostrado no início do artigo.</p>
<p><iframe loading="lazy" src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/cf5835559cc5bcb2f4e16b799c9127f2/href">https://medium.com/media/cf5835559cc5bcb2f4e16b799c9127f2/href</a></iframe></p>
<p>As configurações utilizadas no OptionsBuilder:</p>
<ul>
<li>include adiciona o teste que vamos realizar. Nele indicamos qual a classe a ser executada, nesse caso o LogReflectionBenchmark .</li>
<li>forks é o número de testes paralelos que vão ser executados em cada iteração. Utilizamos 2 forks.</li>
<li>threads é o número de threads a ser utilizada para cada teste. Escolhemos duas threads. Dependendo do número de threads disponíveis na máquina, esse valor pode aumentar.</li>
<li>warmupBatchSize é o tamanho o grupo de aquecimento. Utilizamos 2 <em>batches</em>.</li>
<li>warmupIterations é o número de iterações a serem executadas antes de começar a contabilizar o tempo. Esse número é importante pois ajuda a contabilizar depois que a máquina já estiver rodando os testes. Um número muito alto pode impactar negativamente o teste, se o processo já tiver consumido bastante recurso da máquina.</li>
<li>measurementIterations é o número de iterações, agora contabilizando o tempo de cada teste. O resultado final é montado a partir a média entre as diferentes iterações.</li>
</ul>
<p>Além disso, definimos como arquivos output benchmark_output.log e benchmark_result.json . Eles vão conter as informações dos testes.</p>
<h4>Hora de rodar os testes</h4>
<p>Depois de toda a configuração, podemos rodar o BenchmarksRunner.main e aguardar os resultados. Após alguns minutos, o resultado foi mostrado no arquivo benchmark_output.log .</p>
<pre>LogReflectionBenchmark.logWithReflectionThreadGetStackTrace     avgt    4  28.860 ± 7.172  us/op
LogReflectionBenchmark.logWithReflectionThrowableGetStackTrace  avgt    4  42.075 ± 11.087  us/op
LogReflectionBenchmark.logWithoutReflection                     avgt    4  0.36028 ±  0.00035  us/op</pre>
<p>Como vocês podem ver, a utilização do log sem nenhum tipo de <em>reflection</em> foi cerca de 100x mais rápida do que com uso de qualquer <em>reflection</em>. Isso já foi necessário para que o nosso time decidisse não precisar logar o nome da função e nem da classe.</p>
<h3>Teste você mesmo</h3>
<p>Caso queira validar também em sua máquina, o código de exemplo está aberto. Você pode fazer o mesmo teste que nós fizemos, ou usar o exemplo para criar seus próprios microbenchmarks em Kotlin.</p>
<p><a href="https://github.com/alice-health/kotlin-benchmark-example">alice-health/kotlin-benchmark-example</a></p>
<p>No repositório tem a descrição de como executar os testes. E se você conseguiu testar outros <em>use cases</em>, compartilha aqui com a gente!</p>
<h3>Que tal fazer parte desse time?</h3>
<p>Estamos buscando pessoas que topem o desafio de transformar a saúde no Brasil através da tecnologia. <a href="https://www.alice.com.br/carreiras">Clica aqui</a> para saber mais das vagas que temos em aberto!</p>
<p>O post <a href="https://alice.com.br/tech/como-fazemos-microbenchmarks-em-kotlin/">Como fazemos microbenchmarks em Kotlin</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How we extract data for our DW</title>
		<link>https://alice.com.br/tech/how-we-extract-data-for-our-dw/</link>
		
		<dc:creator><![CDATA[Bruno Federowski]]></dc:creator>
		<pubDate>Sat, 20 Jul 2024 20:23:39 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<guid isPermaLink="false">https://alice.com.br/tech/sem-categoria/how-we-extract-data-for-our-dw/</guid>

					<description><![CDATA[<p>About a year ago I arrived at Alice with the compromise to make the world healthier. We had less than 100 employees and living from series A, which means short money. A big challen</p>
<p>O post <a href="https://alice.com.br/tech/how-we-extract-data-for-our-dw/">How we extract data for our DW</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h4>A long long time ago…</h4>
<p>About a year ago I arrived at Alice with the compromise to make the world healthier. We had less than 100 employees and living from series A, which means short money. A big challenge and a lot of work to do!</p>
<h4>The first challenges</h4>
<p>As a data engineer, my responsibility was to provide data for everybody. The team was very small (actually just me and half the time of my boss) and the systems were changing very fast.</p>
<p>Facing the situation, the plan needed to be as simple and direct as possible:</p>
<ul>
<li>Use a relational database as the data warehouse. We choose PostgreSQL hosted in AWS RDS. Easy to configure and maintain.</li>
<li>Use a simple tool to schedule the ETL pipelines. The choice was Airflow since it&#8217;s a very stable, well know tool and we had experience with it (and we love Python).</li>
<li>A visualization interface. Metabase was the winner for many motives: Free, previous experience with it, easy to install and configure, self-service, very stable and users usually like it.</li>
</ul>
<p>OK…. That&#8217;s something we can make happen! I reused some previous code I wrote in the past to copy data from one place to another and data started to flow! Great! Mission accomplished!</p>
<h4>Problems always happen!</h4>
<p>BUT…. almost every day I had dags broken and had to add a table, fix some table structure, re-run dags, and deploy emergency PRs. The problem was for every new column, every modification in size or type, even the order of some selects could break something. How to solve it?</p>
<h4>For every problem, a solution!</h4>
<p>At that point, I started to work on an Airflow plugin for a smarter extractor which was baptized, given my total lack of imagination, &#8220;SmartTransfer&#8221;. The main idea was to check the existence and structure of the table in the destination stage area and automatically create or re-create as needed.</p>
<p>The intention was to be really easy to be called, with minimal parameters. Below is a real example of a very simple dag with it:</p>
<p><iframe loading="lazy" src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/7faf4916b61074e1a251a48b55577003/href">https://medium.com/media/7faf4916b61074e1a251a48b55577003/href</a></iframe></p>
<p><em>(all code is available at </em><a href="https://github.com/alice-health/airflow_plugins">https://github.com/alice-health/airflow_plugins</a> <em>)</em></p>
<p>So, how does it work? No big secret, but there are some steps in the process.</p>
<p>First, we need to check the structure of the source table. We run a query and get one row from the source table and analyze the columns.</p>
<p><iframe loading="lazy" src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/aa1ad187358be8b92f52a8ba5fd8d6c5/href">https://medium.com/media/aa1ad187358be8b92f52a8ba5fd8d6c5/href</a></iframe></p>
<p>From the table, we can create build the &#8216;create table&#8217; statement.</p>
<p><iframe loading="lazy" src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/612364fbe3b882fca211d453c0fa7964/href">https://medium.com/media/612364fbe3b882fca211d453c0fa7964/href</a></iframe></p>
<p>We used the &#8216;unlogged table&#8217; PostgreSQL feature because it should be, in principle, faster. Unlogged tables are faster but not crash-free, so be careful! Since staging is just a copy of production, it&#8217;s not a problem to lose data. <a href="https://www.postgresql.org/docs/11/sql-createtable.html">You can learn more about PostgreSQL here</a>. We didn&#8217;t notice much difference but we have only a few gigabytes. We will benchmark again in the future as our database grows.</p>
<p>Everything set, the logic is quite straightforward:</p>
<ul>
<li>If the destination table doesn&#8217;t exist, create it</li>
<li>If the destination table exists but the structure is different, drop it and recreate it</li>
<li>If tables have the same structure, same primary keys, just keep the table</li>
</ul>
<p>It&#8217;s important to remember in the case of (re)creating the destination table we need to do a full import, so we set the flag &#8220;need_full_import&#8221; to True</p>
<p><iframe loading="lazy" src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2bfb41b76b83a85411afcbaf739329d5/href">https://medium.com/media/2bfb41b76b83a85411afcbaf739329d5/href</a></iframe></p>
<p>Finally, transfer the data. The first step is to know if we are going to do a full import or an incremental import:</p>
<p><iframe loading="lazy" src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/aaa4f0613d2923850568eed527c52622/href">https://medium.com/media/aaa4f0613d2923850568eed527c52622/href</a></iframe></p>
<p>and prepare the insert statements. The syntax is PostgreSQL specific, with &#8220;<em>ON CONFLICT DO UPDATE&#8221;</em> to create a mixed insert/update statement:</p>
<p><iframe loading="lazy" src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/538289ba2b8b9bcd3fb07634be08bca1/href">https://medium.com/media/538289ba2b8b9bcd3fb07634be08bca1/href</a></iframe></p>
<p>The main loop makes the data transfer. The most important part here is the grouper function: It lazily consumes the source_cursor, keeping in memory only the data will be sent in the current block</p>
<p><iframe loading="lazy" src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/aca4c1f9af8fe1c23f37b2fd81b3a271/href">https://medium.com/media/aca4c1f9af8fe1c23f37b2fd81b3a271/href</a></iframe><iframe loading="lazy" src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e52079bf806612b757bf4497fb89a7b4/href">https://medium.com/media/e52079bf806612b757bf4497fb89a7b4/href</a></iframe></p>
<p>More details of installing, using, and testing SmartTransfer are in the README file in the official repository at <a href="https://github.com/alice-health/airflow_plugins">https://github.com/alice-health/airflow_plugins</a>.</p>
<h4>Conclusion</h4>
<p>I tried to cover the most important (and interesting) parts of the code and show how we solved the problem of moving, not hundred of terabytes with 100 people, but a couple of gigabytes with two people, in a way to automatize all table synchronization and copying process to minimize the data engineer manual work.</p>
<p>O post <a href="https://alice.com.br/tech/how-we-extract-data-for-our-dw/">How we extract data for our DW</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Discovery: a forma de descobrir da Alice</title>
		<link>https://alice.com.br/tech/discovery-a-forma-de-descobrir-da-alice/</link>
		
		<dc:creator><![CDATA[Bruno Federowski]]></dc:creator>
		<pubDate>Sat, 20 Jul 2024 20:23:39 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<guid isPermaLink="false">https://alice.com.br/tech/sem-categoria/discovery-a-forma-de-descobrir-da-alice/</guid>

					<description><![CDATA[<p>E então perguntei: vocês sabem o que é discovery?</p>
<p>O post <a href="https://alice.com.br/tech/discovery-a-forma-de-descobrir-da-alice/">Discovery: a forma de descobrir da Alice</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2><strong>Café Legal</strong></h2>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/400/1*t0_9EPYSGJhHhXC0Z0Fh6w.png" alt="" /></figure>
<p>Certo dia fui surpreendida por um evento na minha agenda: “Café Legal.”</p>
<p>Era um convite de duas pessoas do Time de <em>Legal</em> da Alice para um café. Dentre outras coisas, elas queriam entender mais sobre a Área de Produto e como elas poderiam contribuir de forma ativa com as nossas tomadas de decisão.</p>
<p>Falamos sobre amenidades, eu expliquei um pouco sobre as Áreas de Produto e Tecnologia e quando me questionaram sobre como poderiam ser mais participativas nos nossos processos, eu inconscientemente respondi: “precisamos inserir vocês nos nossos <em>discoveries</em>.”</p>
<p>Falei isso com certa naturalidade e fiz uma pausa. Elas me olharam com cara de “quê?”. E então perguntei: <strong>vocês sabem o que é <em>discovery</em>?</strong></p>
<p>Elas não sabiam. E isso, de forma alguma, é um demérito. Nós, que trabalhamos com produtos digitais, estamos muito acostumados com determinados termos, que acabamos utilizando com pessoas que não lidam diretamente com o nosso universo.</p>
<p>Expliquei para elas o que vou resumir aqui:</p>
<p><em>Discovery</em>, como o nome já indica<em>, </em>é um <strong>processo de <em>descoberta</em>: </strong>existe um problema, existem hipóteses de como resolver esse problema e, baseado nessas hipóteses, existem as possíveis soluções.</p>
<p>No <em>discovery</em>, buscamos encontrar a melhor solução para um problema sob três pilares: <strong>usuário</strong> (UX), <strong>tecnologia</strong> (viabilidade) e <strong>negócios</strong> (alinhamento estratégico).</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/1024/1*EohLLpe-GqmPLa9TKeV2wg.png" alt="" /></figure>
<p>E, embora o <em>discovery</em> seja, muitas vezes, liderado por uma pessoa de produto (PM), ele é executado em conjunto com Product Designers e pessoas de desenvolvimento (tech), que têm papel fundamental para se obter um bom resultado.</p>
<h2><strong>Como estamos descobrindo a melhor forma de “descobrir” na Alice</strong></h2>
<p>Somos uma empresa <em>early stage</em> e sempre estamos descobrindo a melhor forma de fazer alguma coisa.</p>
<p>Uma das nossas virtudes é: <strong>“Subimos a barra, evoluímos todos os dias”</strong>. E para o processo de <em>discovery</em> não é diferente.</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/250/1*lMWGPx6QJKPoCzPPv05dDw.gif" alt="" /></figure>
<p>Iniciamos no melhor modelo <em>free style</em>.</p>
<p>Cada PM, com sua experiência e bagagem de aprendizados, iniciou e concluiu diversos processos de <em>discovery</em>. E os resultados, naturalmente, tiveram méritos, falhas e novos aprendizados.</p>
<p>Decidimos nos reunir para unificar esse processo, juntar nossas forças para preencher as lacunas de cada processo individualizado.</p>
<p>E chegamos a um <em>framework</em> que vou detalhar a seguir.</p>
<h2><strong><em>Framework</em> de <em>Discovery</em> da Alice</strong></h2>
<p>Para apresentar o <em>framework</em>, vamos usar um suposto problema como exemplo:</p>
<p>Muitas pessoas do Time de Saúde estão reportando baixa adesão dos membros ao plano de ação.</p>
<blockquote><p>Plano de ação é uma lista de tarefas que o Time de Saúde estabelece com o membro com o objetivo de tornar sua vida mais saudável. As tarefas podem variar entre: iniciar uma atividade física, realizar um exame, se consultar com um especialista, tomar um medicamento, fazer acompanhamento com Nutricionista, entre outras coisas.</p></blockquote>
<p>Esse <em>framework</em> está dividido em <strong>2 grandes etapas</strong>:</p>
<ol>
<li>Entendimento do <strong>problema</strong> e levantamento de <strong>hipóteses</strong>;</li>
<li><strong>Validação</strong> ou redução do grau de incerteza das hipóteses e proposta de <strong>solução</strong>;</li>
</ol>
<p>Cada uma dessas etapas é marcada por um evento que reúne as pessoas envolvidas com o tema central do <em>discovery</em>.</p>
<h3><strong>1ª Etapa: entendimento do problema e levantamento de hipóteses</strong></h3>
<p>Ser PM é fazer escolhas, sempre —<strong> </strong>ser humano é fazer escolhas<strong>, </strong>sempre!</p>
<p>Como PM precisamos escolher <strong>qual problema resolver primeiro</strong>. Isso porque existem recursos limitados para desenvolver soluções. Essa etapa tem dois objetivos principais:</p>
<ol>
<li>Responder se o problema é relevante (qual é o impacto dele) e se existe alinhamento estratégico para priorizar a solução desse problema;</li>
<li>Levantar hipóteses para solucionar esse problema;</li>
</ol>
<p>É sempre importante frisar que <strong>hipóteses não são soluções</strong>. As hipóteses estão mais relacionadas a “o que deve ser feito” para se obter determinado resultado, enquanto as soluções estão relacionadas a <strong>“como isso deve ser feito”</strong>.</p>
<p>Eu sugiro escrever as hipóteses utilizando esse modelo<strong>: se [<em>variável</em>], então [<em>resultado</em>], porque [<em>racional</em>]</strong>.</p>
<p><strong>Utilizando o problema de exemplo:</strong> se [<em>as pessoas tivessem uma maneira mais fácil de agendar seus exames</em>], então [<em>o engajamento delas com o plano iria aumentar</em>], porque [<em>verificamos que + de 45% das pessoas demoram mais de 15 dias para agendar seus exames e aproximadamente 25% das pessoas não realizam o agendamento</em>].</p>
<p>A hipótese aqui: as pessoas têm dificuldades para agendar exames.</p>
<p>A solução a gente deixa para a segunda etapa.</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/304/1*tKDCtUduKpDtO4QM0d3KTQ.gif" alt="" /></figure>
<p>Nessa primeira etapa vamos a fundo no <strong>entendimento do problema</strong>. Entre outras coisas, fazemos entrevistas com as pessoas envolvidas, <em>shadowings</em> (passar um tempo acompanhando a rotina dessas pessoas ou, até mesmo, assumir esses papéis), análise de dados, análise da evolução do produto, etc…</p>
<p>Como resultado dessas ações, temos um documento contendo:</p>
<p>[x] Descrição do problema<br />
[x] Descrição do impacto do problema<br />
[x] Evidências (quali/quanti) do problema a ser resolvido<br />
[x] Impacto no OKR<br />
[x] Proposta de hipóteses</p>
<p>Essa etapa é marcada pelo evento <em>Discovery</em> <em>Kick-off</em>, onde reunimos os principais <em>stakeholders</em> para <strong>apresentar o problema e as hipóteses de solução</strong>. Nesse evento buscamos o <em>buy-in</em> dos envolvidos para seguir para próxima etapa.</p>
<p>Ou seja<strong>,</strong> baseado no que sabemos até aqui: podemos afirmar que o problema é relevante, e o desenvolvimento de uma solução — agora — está alinhado estrategicamente com a empresa?</p>
<p><strong>Se sim, <em>next </em></strong>(se não, re-prioriza)</p>
<h3><strong>2ª Etapa: validação das hipóteses e proposta de solução</strong></h3>
<p>Ótimo. Já conhecemos a fundo o problema e já temos em mãos algumas hipóteses de como solucioná-lo. Mas como saber se essas são hipóteses válidas? Existem algumas formas.</p>
<p><strong>Vamos usar como exemplo a hipótese descrita na primeira etapa:</strong> se [<em>as pessoas tivessem uma maneira mais fácil de agendar seus exames</em>], então [<em>o engajamento delas com o plano iria aumentar</em>], porque [<em>verificamos que + de 45% das pessoas demoram mais de 15 dias para agendar seus exames, e aproximadamente 25% das pessoas não realizam o agendamento</em>].</p>
<p>Aqui o problema é o baixo engajamento ao plano e a hipótese é que isso se deve à dificuldade de agendamento de exames.</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/320/1*G6SdMHqkJYdhw5P46ynq6A.gif" alt="" /></figure>
<p>Uma das formas de validar as hipóteses é <strong>entrevistar as pessoas</strong> que possuem baixa adesão ao plano. Nessas entrevistas, perguntamos a elas se aumentaria a probabilidade de adesão ao plano se houvesse uma forma mais fácil de agendar os exames.</p>
<p>Perguntamos também sobre outras hipóteses de solução a fim de entender quais são mais aderentes.</p>
<p>Outra forma complementar a essa, é <strong>simular um cenário</strong> onde enviamos um formulário para o membro para coletar informações sobre o melhor dia/horário de realização de exames e fazemos o agendamento pela pessoa.</p>
<p>Ao final desta simulação, comparamos se o engajamento ao plano dessas pessoas aumentou em comparação às demais.</p>
<p><strong>Sim? Sinal de que estamos no caminho certo!<br />
</strong>Entrevistas, cenários simulados e <em>benchmarks</em> são algumas formas de reduzir incertezas em relação às hipóteses.</p>
<p>Nesse momento algumas hipóteses serão validadas, outras terão seu grau de incerteza reduzido, e outras cairão.</p>
<p>Com base nas hipóteses validadas, partimos para o desenho da solução.</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/1024/1*33khN9zpFCMWnF8pLqeVTQ.png" alt="" /></figure>
<p>Utilizando o mesmo exemplo, o que fazemos aqui é propor qual é a melhor forma de facilitar o agendamento de exames.</p>
<p>Podemos ter como solução, uma funcionalidade de agendamento de exames no app da Alice. Sendo assim, criamos um protótipo dessa funcionalidade e selecionamos pessoas para testarem a solução.</p>
<p>Minha sugestão é, se possível, desenvolver <strong>protótipos navegáveis de alta fidelidade</strong>.</p>
<p>Isso ajuda muito a ter resultados de testes mais assertivos, e, não menos importante, é uma documentação bastante robusta para posterior alinhamento com todos os envolvidos.</p>
<p>Com o protótipo em mãos, partimos para os testes, e inicia-se o famoso ciclo — teste &gt; feedback &gt; iteração — até chegarmos à solução final.</p>
<p>Aqui na Alice usamos e abusamos do <a href="https://maze.co/"><strong>Maze</strong></a> para testes de usabilidade. É uma ferramenta incrível, que nos ajuda a ter mais alcance, e resultados mais estruturados.</p>
<p>Ah, e sabe o Time de <em>Legal</em>?</p>
<p>Então, esse é um ótimo momento para envolvê-lo se você entender que a solução proposta pode ter algum <strong>impacto jurídico</strong>.</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/200/1*f59vUogpdf9FA8MVIPb49g.gif" alt="" /></figure>
<p>Ou apenas para pegar a opinião deles, porque eles são “legal” — (<em>tudumtss</em>).</p>
<p>Ao final dessa etapa complementamos nosso documento de <em>discovery</em> com mais esse checklist preenchido.</p>
<p><strong>[x]</strong> Descrição da solução (fluxograma, protótipo, casos de uso, etc.)<br />
<strong>[x]</strong> Evidências de validação / invalidação das hipóteses<br />
<strong>[x]</strong> Validação da solução com <em>users<br />
</em><strong>[x]</strong> <em>Roadmap<br />
</em><strong>[x]</strong> Métricas de sucesso<br />
<strong>[ ]</strong> Alinhamento com <em>stakeholders</em></p>
<p>Para coroar, convidamos os <em>stakeholders</em> envolvidos para um evento que chamamos de <em>Discovery Sign-off</em>, apresentamos a <strong>solução final</strong> e nos alinhamos sobre os <strong>próximos passos</strong>.</p>
<p><strong>[x]</strong> Alinhamento com <em>stakeholders</em></p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/400/1*fkpeTX3xgb25idItqUh20A.png" alt="" /></figure>
<h2><strong>Para finalizar…</strong></h2>
<p>Todo esse <em>framework</em> pode dar, à primeira vista, a impressão de excesso de burocracia. Mas ele é só uma trilha, e não um trilho — parafraseando o Time de Saúde da Alice em relação aos protocolos de saúde. Cumprir todas essas etapas, ou apenas parte delas, depende da complexidade e impacto do problema e do grau de incerteza em relação às hipóteses.</p>
<p>O <em>discovery</em> ajuda a validar hipóteses, mas dificilmente será possível reduzir a zero o grau de incerteza em relação a elas.</p>
<p><strong>Muitas vezes é importante arriscar</strong>. A verdade é que uma hipótese somente será 100% validada quando a solução derivada dela estiver em uso.</p>
<p>Muito embora o <em>discovery</em> seja uma importante ferramenta para <strong>evitar custos que são evitáveis</strong> com a implementação de uma solução que tem grandes chances de não funcionar, ele é, também, um processo que custa caro. <strong>É preciso escolher quais batalhas lutar!</strong></p>
<p>O post <a href="https://alice.com.br/tech/discovery-a-forma-de-descobrir-da-alice/">Discovery: a forma de descobrir da Alice</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Braze: como o CRM melhora a saúde dos membros</title>
		<link>https://alice.com.br/tech/braze-como-uma-ferramenta-de-crm-ajuda-na-saude-dos-membros-da-alice/</link>
		
		<dc:creator><![CDATA[Bruno Federowski]]></dc:creator>
		<pubDate>Sat, 20 Jul 2024 20:23:39 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<guid isPermaLink="false">https://alice.com.br/tech/sem-categoria/braze-como-uma-ferramenta-de-crm-ajuda-na-saude-dos-membros-da-alice/</guid>

					<description><![CDATA[<p>Na Alice, além de construir nossas próprias ferramentas, utilizamos parceiros de mercado mega qualificados (e HIPAA compliant, claro) para nossa entrega de saúde.</p>
<p>O post <a href="https://alice.com.br/tech/braze-como-uma-ferramenta-de-crm-ajuda-na-saude-dos-membros-da-alice/">Braze: como o CRM melhora a saúde dos membros</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong>A missão da Alice é tornar o mundo mais saudável.</strong> Esse é o desafio diário centenas de pitayas (<a href="https://www.alice.com.br/artigo/quem-trabalha-na-alice-e-pitaya">como chamamos quem trabalha na Alice</a>), que pensam criativamente em protocolos, processos e ferramentas para melhorar a qualidade de vida dos nossos membros. Tornar o MUNDO mais saudável implica em conseguir escalar nossas soluções, e pra isso a tecnologia é nossa melhor aliada. Mas construir tecnologia do zero em uma startup também é um desafio.</p>
<p>Por isso, na Alice, além de construir nossas próprias ferramentas, utilizamos parceiros de mercado mega qualificados (e <a href="https://en.wikipedia.org/wiki/Health_Insurance_Portability_and_Accountability_Act">HIPAA compliant</a>, claro) para nossa entrega de saúde. Um desses é o <a href="https://www.braze.com/">Braze</a>, um CRM (customer relationship manager) focado em engajamento, que nos possibilita diversas oportunidades de contato com nossos membros, promovendo o cuidado e a saúde.</p>
<p>Nesse artigo, traremos alguns cases sobre como utilizamos o Braze para promover o engajamento dos nossos users com sua saúde.</p>
<h2><strong>Como a Alice funciona e qual o papel do aplicativo?</strong></h2>
<p>Antes de detalhar como usamos o Braze por aqui, um rápido recap do que é a Alice e como nosso app funciona: A Alice é uma gestora de saúde, ou seja, estamos com nossos membros não só quando eles estão doentes, mas também ajudando com que eles se tornem cada vez mais saudáveis.</p>
<p>Todo membro tem acesso ao app da Alice (já disponível em uma versão gratuita para qualquer pessoa na <a href="https://apps.apple.com/br/app/alice-sa%C3%BAde-como-deve-ser/id1502142535">Apple Store</a> ou <a href="https://play.google.com/store/apps/details?id=com.alicesaude&amp;hl=en&amp;gl=US">Google Play</a>), que é por onde ele se comunica com seu Time de Saúde, acessa o atendimento digital 24h, faz agendamentos de consulta, vê resultados de exames, entre várias outras coisas.</p>
<p>No entanto, nós não queremos que o nosso membro fique restrito a cuidar da sua saúde só em momentos em que ele esteja em consultas ou fazendo exame. Isso é apenas uma parte do cuidado. Nós queremos empoderar o membro para que ele realmente seja um agente ativo em melhorar sua qualidade de vida e possa fazer isso sozinho. E queremos que nosso app seja um verdadeiro parceiro nessa jornada. É aí que o Braze entra.</p>
<h2><strong>O que é o Braze e como nós usamos essa ferramenta no dia a dia?</strong></h2>
<p>O Braze é uma ferramenta de CRM focada em aumentar o engajamento dos usuários. Por meio do Braze é possível enviar campanhas de push, pop ups, cards no app e e-mail, utilizando-se de dados de interação do usuário — no nosso caso, usamos dados como agendamentos, cancelamentos, interação com campanhas enviadas, entre outros. Nosso objetivo é <strong>ajudar o membro a cuidar da sua saúde</strong>, assim nossas comunicações são sempre guiadas por isso (nada de cupons ou promoções, aqui o foco é em saúde mesmo).</p>
<p>Para garantir isso, restringimos o acesso ao Braze para algumas pessoas do time de produto e operações de saúde, e temos uma governança para garantir que não “floodamos” nossos usuários com excesso de notificações. Integramos o Braze com nosso app e construímos uma série de features que são “powered by Braze”. Dessa forma, temos uma máquina autônoma de comunicações com nossos membros, algo que hoje é normal e tem alto valor mas nem sempre foi assim.</p>
<h2><strong>Evolução do uso Braze dentro da Alice</strong></h2>
<p>Quando entrei na Alice, em janeiro de 2021, ainda usávamos o Braze de forma incipiente. Enviávamos campanhas esporádicas e manuais, como férias da médica do Time de Saúde ou campanhas de setembro amarelo. Nós não tínhamos réguas estruturadas e automatizadas para o envio de comunicações. Isso se devia, em parte, por que o Braze necessita de <em>inputs</em> de dados que dependem do time de Engenharia para estruturar e, também, por que nós ainda estávamos nos familiarizando com a ferramenta.</p>
<p>Ao longo do tempo, fomos explorando melhor o Braze e vimos um potencial muito grande na estruturação das campanhas automáticas, <em>triggadas</em> por eventos enviados diretamente à ferramenta pelo nosso back-end. Além de não pararmos alguém para enviar essas campanhas, poderíamos estruturar réguas de comunicação que fossem <em>tailor made</em> para o usuário, acompanhando de pertinho sua jornada na Alice. Assim, fizemos uma força tarefa para trazer esses dados de interação e status para o Braze.</p>
<p>Hoje conseguimos acompanhar de perto cada usuário e enviar comunicações como questionários de saúde pré consulta (onde as nutris e preparadores físicos conseguem conhecer o membro melhor e se preparar antes), CSAT e NPS, lembretes para realização de tarefas do Plano de Ação (ex: marcar consultas atrasadas) entre outros. <strong>Enxergamos essas comunicações como aliadas importantes na missão de tornar nossos membros mais saudáveis</strong>, já que gerir a própria saúde é algo complexo e que nem sempre lembramos no dia a dia.</p>
<p>Feita essa breve introdução, vamos <strong>detalhar três <em>use cases</em> do Braze que fizemos aqui na Alice</strong>: a criação do Notification Center, customização do envio das matérias das Pílulas de Saúde e os desafios de saúde promovidos.</p>
<h2>Casos de uso do Braze aqui na Alice</h2>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/1024/1*8EJgyZBwtOKxd_6PpLQ8mg.png" alt="" /></figure>
<h3><strong>1. Notification Center e comunicações rotineiras</strong></h3>
<p>O Notification Center foi a primeira grande entrega que fizemos usando o Braze. Mesmo depois de termos estruturado algumas réguas e comunicações automáticas, percebemos que o engajamento não havia aumentado substancialmente. Isso nos pareceu estranho já que estávamos garantindo que a comunicação fosse feita muito próxima ao evento (ex: um lembrete para uma consulta).</p>
<p>Nesse momento, tentamos modificar os textos das notificações e fazer testes A/B com horários distintos de envio, mas nada parecia aumentar o engajamento. Nesse meio tempo, era muito comum recebermos relatos de membros que perdiam as notificações. Não demorou muito para conectarmos os dois pontos.</p>
<p>A causa-raiz era que parte das comunicações eram enviadas por push notifications. E, apesar de ela ser boa por aparecer instantaneamente no celular do membro, é um tipo de comunicação perdida facilmente, dado que basta o usuário limpar as notificações do celular ou simplesmente não olhá-las. Vimos aí um grande gargalo na nossa estratégia: provavelmente nossos membros não estavam nem vendo as notificações, muito menos engajando com elas.</p>
<p>Dessa hipótese, surgiu a solução de criamos um Notification Center no app. Um repositório de todas as comunicações enviadas, que armazenasse isso para que o usuário consultasse a qualquer momento, evitando que o desengajamento fosse por perda da notificação. Mas como implementar isso? Como “guardar” as notificações por push enviadas?</p>
<p>Ao investigar opções, encontramos os <a href="https://www.braze.com/product/content-cards">Content Cards</a> do Braze, um produto com cards customizáveis que ficam no aplicativo por até 30 dias. Uma das grandes vantagens é que os cards são entregues silenciosamente, ou seja, não há pop up ou push atrelados, evitando que se atrapalhe a experiência do usuário no app. Os<a href="https://www.braze.com/resources/articles/adding-content-cards-to-your-cross-channel-strategy"> principais usos</a>, de acordo com o próprio Braze, são feed de notícias para aplicativos de jornais, repositório de notificações e central de descontos e promoções. Além disso, o processo de implementação seria simples, dado que já tínhamos o SDK do Braze integrado.</p>
<p>Em duas semanas, criamos um Notification Center no app operado via Content Cards. Cerca de um mês depois, comprovamos a nossa hipótese: Vimos nosso <strong>engajamento e taxa de conversão das campanhas dobrar</strong>, e o número de pedidos de reenvio de notificações cair substancialmente.</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/564/1*jHHiwbrpx1fUeCXKWvzcFQ.gif" alt="" /><figcaption>Exemplo de notificações que armazenamos no Notification Center</figcaption></figure>
<p>Hoje nosso Notification Center armazena todas as notificações que enviamos e <strong>se mostrou uma ótima ferramenta para ajudar na gestão de saúde do membro</strong>, já que reúne as pesquisas de NPS, CSAT de consulta, lembretes de tarefas de saúde em atraso, convite para rodas de conversa sobre temas de nutrição, e outros.</p>
<p>O Notification Center foi nossa primeira implementação dos cards. Em seguida, aproveitamos o recurso e passamos a utilizar os cards para mandar as pílulas de saúde aos nossos membros, como veremos a seguir.</p>
<h3><strong>2. Customização das Pílulas de Saúde com base nos interesses dos membros</strong></h3>
<p>Aqui na Alice a gente ama falar sobre saúde. Dessa vontade de contar pro mundo mais do que estudamos sobre bem estar e qualidade de vida, criamos o<a href="https://www.timedesaude.com.br/"> Portal Time de Saúde</a>, com matérias bem legais e interessantes sobre corpo, mente, comportamento, sono e alimentação.</p>
<p>Além de informativas, as matérias geralmente trazem dicas práticas sobre o tema tratado, tendo um alto potencial de ajudar as pessoas a mudarem hábitos. Assim, fazia muito sentido introduzirmos esse conteúdo no app, visando principalmente fornecer materiais de qualidade e informativos aos nossos membros e, dessa forma, empoderá-los cada vez mais para cuidarem da sua saúde.</p>
<p>Para isso, utilizamos os <a href="https://www.braze.com/product/content-cards">Content Cards</a> do Braze (o mesmo que utilizamos para o Notification Center) e passamos a fazer um envio semanal das novas matérias publicadas no blog. Geralmente enviávamos uma matéria de cada vertical do Portal, tentando contemplar todos os interesses.</p>
<p>Após cerca de 2 meses dessa rotina, paramos para analisar o engajamento e estava mais baixo do que esperávamos. Não tínhamos um benchmark específico para nos basear mas acreditávamos que havia um potencial de melhoria.</p>
<p>Nesse momento, em um fórum com o time de Design, levantou-se a hipótese que um <strong>maior engajamento estaria atrelado a uma possibilidade de customização dos conteúdos a serem recebidos</strong>. Se o membro pudesse escolher exatamente quais assuntos receber no app, possivelmente isso geraria um maior engajamento com as matérias e o aplicativo.</p>
<blockquote><p>E como perguntar ao membro o que ele gostaria de ler?</p></blockquote>
<p>Recentemente o Braze lançou uma feature de <a href="https://www.braze.com/docs/user_guide/message_building_by_channel/in-app_messages/templates/simple_survey/">s<em>urvey in app</em></a>, que possibilita enviar questionários com uma pergunta de múltipla escolha e salvar as respostas do usuário como um atributo do mesmo. Posteriormente, é possível utilizar essas informações de atributos do usuário para triggar campanhas.</p>
<p>O que fizemos no caso das Pílulas de Saúde foi exatamente isso. Enviamos a campanha abaixo para <strong>perguntar para os nossos membros o que eles gostariam de ler sobre saúde</strong> e, ao responder, essas informações eram salvas como atributos deles</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/480/1*g8GKuJ8tL-yViS25YwSAWg.gif" alt="" /></figure>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/540/1*dmaE7p1WecmFkXpmUrr_rQ.gif" alt="" /><figcaption>Campanha que enviamos aos nossos membros perguntando o que gostariam de ler no app</figcaption></figure>
<p>Depois da seleção dos interesses, os membros conseguem visualizar somente matérias dos assuntos que eles curtem. Enviamos os conteúdos semanalmente e, depois de 7 dias, paramos para analisar o resultado. E sabe qual foi?</p>
<p>Depois da customização, <strong>triplicamos o engajamento</strong> (medido pela taxa de clique) dos nossos membros com as Pílulas de Saúde. Ficamos muito felizes com o resultado, porque além de trazer uma melhor experiência aos usuários do app da Alice, também damos mais visibilidade a conteúdos de qualidade sobre saúde, gerando informação e conhecimento.</p>
<h3><strong>3. Desafios de Saúde</strong></h3>
<p>Aqui na Alice sabemos que mudar hábitos não é algo fácil. Seja introduzir água no seu dia a dia ou adotar estratégias para dormir melhor,<a href="https://www.timedesaude.com.br/artigo/estagios-motivacao-mudanca-comportamento"> a mudança de comportamento não é linear</a> e requer muito foco.</p>
<p>Por isso, sempre queremos ajudar ao máximo os membros que estão passando por essa jornada. Mas como ficar perto do membro e criar um programa de incentivo à mudança de hábito?</p>
<p>Desse problema surgiu uma iniciativa de engajamento de realizar esse programa via <a href="https://www.braze.com/docs/user_guide/message_building_by_channel/in-app_messages/templates/simple_survey/"><em>surveys in app</em></a>,<em> push, pop ups</em> e cards no Notification Center. Criamos dois desafios: beber mais água e dormir melhor, e fizemos o convite aos membros que quisessem participar. Com a ferramenta <a href="https://www.braze.com/product/braze-canvas">Canvas</a> do Braze, que permite criar trilhas e réguas de envio de notificações, estruturamos caminhos altamente customizados que o membro poderia percorrer durante o desafio, a depender das respostas dele.</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/540/1*1NgWX4dsEKXzErVJHmrHIQ.gif" alt="" /></figure>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/750/1*sQeyEuWQJaoD-EKfm0FtHw.png" alt="" /></figure>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/750/1*MZY1US2bDYbWXq8CrKrRfQ.png" alt="" /><figcaption>Na primeira imagem temos o convite feito do desafio feito aos membros. Na segunda e terceira imagem temos as notificações do desafio de beber água</figcaption></figure>
<p>Durante o desafio, que dura cerca de 4–6 dias após o <em>opt in</em> do usuário, o membro recebe várias comunicações com dicas, conteúdo e lembretes. Um dos exemplos legais é uma notificação de push programada para às 17h, um horário comum para um cafezinho, explicando que a cafeína demora cerca de 7h para sair do corpo, o que pode prejudicar o sono. Outro exemplo é uma notificação enviada perto das 20h, explicando que não há problema em fazer atividades físicas antes de dormir, desde que haja um intervalo de 2h, para permitir o corpo voltar à temperatura normal.</p>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/540/1*yrj1nvQPZXkH7O40kY5Gxg.gif" alt="" /></figure>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/750/1*Pxmwh0rQf9nyzxO-hH50XQ.png" alt="" /></figure>
<figure><img decoding="async" src="https://cdn-images-1.medium.com/max/750/1*_DhVIDXcDB7PaiZz-YamUw.png" alt="" /><figcaption>Notificações enviadas no desafio de dormir melhor</figcaption></figure>
<p>Já no desafio de beber água, as comunicações centraram-se em dicas de como introduzir o hábito no dia a dia, seja criando “regras” (ex: toda vez que for à cozinha) ou misturando água com frutas para dar sabor. Ao final dos dois primeiros dias de desafio, 67% dos membros disseram estar conseguindo beber mais água do que de costume.</p>
<p>A implementação dos desafios foi 100% via Braze por parte do time de Produto, sem precisar de nenhum <em>input</em> por parte Engenharia. A criação do conteúdo foi feita em conjunto com o Time de Saúde, pensando em como trazer a melhor experiência ao membro. E, bom, podemos dizer que os resultados foram bem animadores.</p>
<p>De todos que participaram do desafio de dormir melhor, <strong>37% afirmaram que a qualidade do sono melhorou depois do programa</strong>. Já no desafio de beber mais água, <strong>58% disseram que a ingestão de fluídos está melhor que antes</strong>. Ficamos bem felizes com estes números, já que o bem estar está diretamente ligado com esses hábitos, e mesmo pequenas mudanças já podem ter grandes impactos.</p>
<h2>Conclusão</h2>
<p>Aqui na Alice continuamos sempre expandindo o uso do Braze para cada vez mais ser uma ferramenta que efetivamente ajude nossos membros a cuidarem da sua saúde. Trabalhamos conjuntamente — Produto, Engenharia, Operações e Time de Saúde — para sempre criar e entregar conteúdos relevantes ao usuário com a melhor experiência possível via aplicativo. Ficamos felizes de olhar para trás e ver nossa evolução utilizando o Braze, e esperamos que seu papel aqui na Alice só cresça.</p>
<p>Em tempo: Esse post apresenta a nossa opinião sobre a ferramenta e suas utilidades. Gostamos muito dela e acreditamos que boas ideias merecem ser compartilhadas 😉</p>
<p><em>Curtiu o conteúdo e também quer tornar o mundo mais saudável? Veja nossas vagas em aberto </em><a href="https://www.alice.com.br/vagas"><em>aqui</em></a><em>.</em></p>
<p>O post <a href="https://alice.com.br/tech/braze-como-uma-ferramenta-de-crm-ajuda-na-saude-dos-membros-da-alice/">Braze: como o CRM melhora a saúde dos membros</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Plataforma: como escalar qualidade em Tech</title>
		<link>https://alice.com.br/tech/plataforma-como-escalar-qualidade-em-tech/</link>
		
		<dc:creator><![CDATA[Bruno Federowski]]></dc:creator>
		<pubDate>Sat, 20 Jul 2024 20:23:39 +0000</pubDate>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[SRE]]></category>
		<guid isPermaLink="false">https://alice.com.br/tech/sem-categoria/plataforma-como-escalar-qualidade-em-tech/</guid>

					<description><![CDATA[<p>Alice é uma empresa de Tecnologia cujo o propósito é tornar o mundo mais saudável. E como tal, resolve seus principais problemas pensando primariamente em soluções baseadas em Tecn</p>
<p>O post <a href="https://alice.com.br/tech/plataforma-como-escalar-qualidade-em-tech/">Plataforma: como escalar qualidade em Tech</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Dores de Escala</h3>
<p>Alice é uma empresa de Tecnologia cujo o propósito é tornar o mundo mais saudável. E como tal, resolve seus principais problemas pensando primariamente em soluções baseadas em Tecnologia. Desde o início, além dos sistemas que alimentam diretamente nossos produtos, construímos ferramentas que poderiam ajudar o trabalho de pessoas engenheiras no geral.</p>
<p>Por exemplo, lá nos tempos primórdios da Alice, construímos o que chamamos de <strong>Data Layer</strong>, uma camada de abstração de acesso a dados que garante privacidade e segurança para todas as aplicações. Iniciamos a resolução de questões super importantes pro nosso contexto de saúde: <a href="https://medium.com/alice-tech/construindo-uma-healthtech-que-coloca-a-privacidade-de-seus-usu%C3%A1rios-em-primeiro-lugar-84bf1ac93afb">privacidade</a> e segurança. Esse e outros projetos foram criados de forma orgânica. Nós identificávamos um problema na Engenharia, e então pessoas se juntavam organicamente pra pensar numa solução, projetavam, implementavam e colocavam no ar.</p>
<p>Entretanto, com o <strong>crescimento acelerado</strong> da empresa e com a necessidade de <a href="https://blog.alice.com.br/nossa-voz/virtudes-da-alice/">subir a barra</a> de qualidade de Engenharia no mesmo ritmo, essa estratégia começou a apresentar problemas.</p>
<ol>
<li>Percebemos que nesse modelo não havia um time para dar manutenção a esses projetos ou iterarem de acordo com novos requisitos. As iniciativas eram interpretadas na perspectiva de projetos pontuais e não de produtos internos e suas complexidades (clientes, necessidades de evolução e de negócio).</li>
<li>Além disso, alterações macro eram difíceis de serem priorizadas, já que a cada dia ficavam mais complexas e necessitavam de grande esforço de pessoas que, dentro do contexto de seus times, precisavam negociar algum tempo extra para desenvolver novos projetos <em>cross</em>.</li>
<li>Com nossa nova escala, também aumentamos a complexidade dos sistemas e o número de novas pessoas engenheiras, tornando <a href="https://en.wikipedia.org/wiki/Tribal_knowledge">“conhecimento tribal”</a> e qualidade mais difícil de se reproduzir.</li>
</ol>
<p>Diante deste cenário de crescimento rápido <a href="https://blog.alice.com.br/imprensa/rodada-investimento-series-c-alice/">pós Series C</a>, percebemos que precisávamos dar o próximo passo na nossa organização de Engenharia para atacar nossos desafios: os times de Plataforma.</p>
<h3>Como é Plataforma na Alice?</h3>
<h4>O que é um time de Plataforma?</h4>
<p>Times de Plataforma são geralmente voltados para uma missão técnica de empoderar o time de Engenharia a ser consistentemente eficaz, construindo produtos que abstraem os detalhes técnicos (<a href="https://en.wikipedia.org/wiki/Non-functional_requirement">requisitos não funcionais</a>) e que permitem o foco no negócio. Exemplos desses produtos aqui na Alice são:</p>
<ol>
<li>Data Layer: como comentado anteriormente, uma aplicação que abstrai quesitos de privacidade e segurança na persistência de dados;</li>
<li>Design Systems: um ecossistema de repositórios de estilos, componentes e padrões predefinidos e reutilizáveis que ajuda os times a criarem experiências consistentes e escaláveis com mais velocidade e fica acessível por meio de código e ferramentas de design.</li>
</ol>
<h4>Mas como Plataforma resolve o nosso problema?</h4>
<p>Com um time focado nas iniciativas <em>cross</em> Engenharia, conseguimos ter a especialização e tempo necessários para construir e evoluir produtos que potencializam os outros times de Tecnologia.</p>
<ol>
<li><strong>Somos essenciais para escalar rapidamente:</strong> sabemos que <strong>padrões</strong> e <em>frameworks</em> estabelecidos facilitam a escala de conhecimento e qualidade na Engenharia. Além disso, com um dono claro para requisitos não funcionais, que são críticas para o funcionamento de qualquer produto, conseguimos garantir que todas as equipes cumpram os mesmos requisitos consistentemente.</li>
<li><strong>Melhoramos a eficiência organizacional:</strong> reduzimos a duplicação de trabalho e ajudamos na <strong>padronização</strong> de abordagens (nos casos onde a padronização é um benefício para a organização). Além disso, como donos dos produtos, construímos software mais manutenível e escalável.</li>
<li><strong>Agilizamos a entrega de novos produtos:</strong> além de remover conflitos entre squads e fornecer serviços que agilizam o desenvolvimento, podemos ajudar quando as equipes de produto estão introduzindo uma nova tecnologia. A equipe da plataforma pode incubar essa nova tecnologia e, em seguida, ajudá-la a ser adotada por outros squads. {plataformização}</li>
</ol>
<h4>Um pouco mais sobre nós</h4>
<p>Na Alice, a visão do nosso time é <strong>ser o alicerce para a construção de soluções de Tecnologia que aceleram a entrega de saúde no mundo.</strong> Para chegarmos a esse objetivo, temos quatro pilares estratégicos:</p>
<ol>
<li><strong>Construção de soluções de forma colaborativa com os times:</strong> entendemos que só conseguimos ser pertinentes construindo as ferramentas certas se estivermos muito próximos dos times de Tecnologia entendendo suas dores. Ao mesmo tempo, somos o alicerce para construção de Tecnologia com qualidade, então estamos sempre perto dos times para ajudá-los em suas demandas e entendermos como podemos subir a barra de Engenharia. Em um caso recente, por exemplo, de construção da nova arquitetura Mobile, entendemos junto a todos os times impactados quais casos de uso tinham dificuldades na arquitetura antiga e construímos em conjunto um diagnóstico dos problemas correntes.</li>
<li><strong>Antecipação de problemas e pensamento de longo prazo:</strong> como um alicerce sólido, desenvolvemos soluções que são robustas no longo prazo. Para chegar a esse objetivo consistentemente, utilizamos um <a href="https://medium.com/alice-tech/como-tomamos-decis%C3%B5es-860121def07f">processo diligente</a> de entendimento dos problemas futuros e tomada de decisão. Por exemplo, no caso da nova arquitetura Mobile, além do diagnóstico, projetamos prováveis casos de uso futuros (funcionalidades mais complexas, interações entre diferentes módulos ou até suporte a funções nativas mais recentes), dando insumos para decisões fundamentadas.</li>
<li><strong>Abrangência na resolução de problemas priorizando padronização e plataformização:</strong> um problema só deve ser prioridade para o time de Plataforma se impactar o alicerce de Tecnologia. Portanto, focamos em soluções abrangentes que podem ser padronizadas ou plataformizadas para a utilização em diferentes contextos. Nosso backend, por exemplo, é bastante padronizado: a quase totalidade das aplicações segue a mesma arquitetura e tecnologia (Kotlin) num mesmo repositório (monorepo). Num caso onde precisamos melhorar a utilização de recursos de uma aplicação, conseguimos com pouco esforço estender essa melhoria para todas as outras as aplicações da empresa.</li>
<li><strong>Inovação</strong>: para construir um alicerce que acelera a entrega de saúde no mundo precisamos buscar novas soluções, dado que queremos obter resultados diferentes do que já foi feito no passado. A inovação é o único caminho para chegar no nosso objetivo e temos trilhado essa estrada desde a criação do nosso <strong>Data Layer,</strong> que, diferente de outras soluções de mercado, torna controle de acesso a dados e identificação e de-identificação de dados, padrões em todos os sistemas da Alice.</li>
</ol>
<p>Nosso time tem menos de 6 meses, mas já atuamos nas nossas três frentes principais: Development Experience, Shared Systems e Quality. Algumas de nossas iniciativas recentes:</p>
<ul>
<li>Design System: pensando em DevEx e na padronização de comportamentos, construímos o core do produto, desenvolvemos e aplicamos nossos primeiros componentes Mobile</li>
<li>Ferramentas de Desenvolvimento local: pensando em DevEx, construímos uma nova forma muito fácil de desenvolver localmente na nossa arquitetura de microsserviços utilizando um ambiente remoto</li>
<li>Sherlock: pensando em escalar Privacidade, construímos um sistema interno que permite, em casos específicos, acesso a <a href="https://en.wikipedia.org/wiki/Personal_data">dados PII</a> com rastreabilidade</li>
<li>Observabilidade no frontend: pensando em escalar estabilidade, integramos nossa plataforma de observabilidade (tracing, alertas, etc) com a ferramenta de monitoramento do <a href="https://www.datadoghq.com/">Datadog</a></li>
<li>Data Layer: estamos desenvolvendo novas funcionalidades no nosso sistema compartilhado (que não tínhamos tempo de evoluir no passado) com foco em estabilidade, performance e escala da aplicação</li>
<li>Arquitetura Mobile: como foco em qualidade, estamos construindo uma nova arquitetura de software que prepare o nosso aplicativo Mobile para os próximos anos de Alice</li>
</ul>
<p>E este é só o começo… temos planos ambiciosos de sermos este <strong>alicerce</strong> de Tecnologia em saúde mundial e ainda temos diversas áreas inexploradas (DevTools, Testes de alta complexidade, Microfrontends, etc.)</p>
<h3>Que tal fazer parte desse time?</h3>
<p>Estamos buscando pessoas que topem o desafio de transformar a saúde no Brasil através da tecnologia. <a href="https://www.alice.com.br/carreiras">Clica aqui</a> para saber mais das vagas que temos em aberto!</p>
<p>O post <a href="https://alice.com.br/tech/plataforma-como-escalar-qualidade-em-tech/">Plataforma: como escalar qualidade em Tech</a> apareceu primeiro em <a href="https://alice.com.br/tech">Blog da Alice Tech</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
