<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Inside SumUp Brazil </title>
    <description>The latest articles on DEV Community by Inside SumUp Brazil  (@insidesumupbr).</description>
    <link>https://dev.to/insidesumupbr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F647220%2Ffbe762e3-4410-42e9-8eb7-5fcab470beac.jpg</url>
      <title>DEV Community: Inside SumUp Brazil </title>
      <link>https://dev.to/insidesumupbr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/insidesumupbr"/>
    <language>en</language>
    <item>
      <title>GANHANDO OLHOS DE ÁGUIA</title>
      <dc:creator>Inside SumUp Brazil </dc:creator>
      <pubDate>Mon, 03 Jan 2022 14:36:34 +0000</pubDate>
      <link>https://dev.to/insidesumupbr/ganhando-olhos-de-aguia-i8e</link>
      <guid>https://dev.to/insidesumupbr/ganhando-olhos-de-aguia-i8e</guid>
      <description>&lt;p&gt;Ampliemos nossa visão, como águias, para conseguirmos enxergar as barreiras e as oportunidades que nos conduzirão ao sucesso.&lt;/p&gt;

&lt;p&gt;A nossa trajetória profissional, passa por diversas fases, a mais comum é quando iniciamos nossas carreiras através do ingresso no mercado de trabalho. Mas também há momentos que "viramos a mesa" e definimos um novo rumo para nossas vidas, quando surgem novas oportunidades de desenvolvimento clamando por novas competências, novas habilidades. Nesses momentos, várias preocupações surgem em nossa mente. Onde e como adquirir esses novos conhecimentos? O que devemos fazer para que o nosso desempenho continue no mesmo nível de excelência, seja no cargo atual ou em uma nova posição?&lt;/p&gt;

&lt;p&gt;Pensarmos em nosso desenvolvimento, imaginando "qual será o nosso lugar" em um futuro é algo muito importante. Com essa projeção estamos fazendo o exercício sobre o que estamos pensando para nossas carreiras.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Jamais chegaremos a outra margem do rio sem os equipamentos necessários para nos levarem até lá&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ter objetivos de carreira é ótimo para nos impulsionar para novos estágios de nossas vidas. Mas não podemos nos esquecer que estes novos desafios exigem esforço e dedicação e precisamos tomar cuidado pois "jamais chegaremos a outra margem do rio" sem os equipamentos necessários para nos levar até lá. Isso significa que precisamos nos desenvolver nesta trajetória.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Quebrarmos grandes metas em pequenas vitórias.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Atingir grandes objetivos é algo muito desafiador e dificilmente acontece de uma vez. É preciso planejar, planejar e planejar… Aprendi muito nesta minha jornada pela busca de me tornar um líder, que são inúmeras as competências a serem desenvolvidas e a melhor forma é de "quebrarmos grandes metas em pequenas vitórias" para que elas nos motivem sempre. Assim chegaremos lá. Importante lembrar que traçar um plano para atingir a nossa meta é tão importante quanto a meta em si. Cada aprendizado, cada vivência contribui para nos tornarmos o profissional que queremos ser.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Onde estou e onde quero estar lá na frente.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A escolha de ser um líder, para mim, não aconteceu de forma natural. Não acredito que nascemos com nosso futuro traçado, definido. Esta reflexão sobre o futuro, se inicia com o desenvolvimento do nosso autoconhecimento, nossas potencialidades e onde queremos chegar. Observar atentamente por alguns anos me ajudou. Apesar de parecer óbvia essa decisão, não é tão simples assim.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Como me vejo no papel de liderança?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Eu fiz algumas perguntas do tipo: Eu me vejo no papel do meu líder? Parece ser algo que gostaria de fazer? No começo da carreira a resposta era: "Não tenho a menor ideia". Depois de algum tempo passou para: "ahh acho que sim, talvez" …. "até que virou hummm… é isso"!&lt;/p&gt;

&lt;p&gt;Esteja perto das pessoas que admira, observe como elas agem, tomam decisões, se relacionam, se comunicam. O que elas fazem de especial que as tornam pessoas bem-sucedidas. Tem uma frase de Isaac Newton, que eu gosto muito que diz: &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Se eu vi mais longe, foi por estar de pé sobre ombros de gigantes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Materiais sobre liderança podem ajudar, mas nada como desenvolver o aprendizado no dia a dia do trabalho, ou seja, procure escolher lugares que nos proporcionem trabalhar com pessoas boas. Você admira seu Líder? Seus colegas? E as pessoas de outras equipes? Então se pergunte, o que posso aprender com eles?&lt;/p&gt;

&lt;p&gt;E a cultura da empresa? Faz sentido em relação aos seus valores pessoais? Onde preciso me adequar, flexibilizar para aprender mais sobre ela.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Conhecimentos e tecnologias também se obsoletam e precisam mudar.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;No Início eu precisava de conhecimentos mínimos para atuar na área, hoje com as novas exigências preciso ficar muito atento com o aprendizado. Pois conhecimentos e tecnologias também se obsoletam e precisam mudar. Um grande aprendizado, ao longo de minha carreira, está relacionado às mudanças de emprego.&lt;/p&gt;

&lt;p&gt;Além das novas tecnologias, novas culturas o que me chamou mais a atenção foram os relacionamentos com as pessoas que trabalhei, que representaram muito mais do que os ganhos financeiros. Um bom ambiente de trabalho representa muito e se você tem isso como eu tenho significa um bom trabalho da liderança.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Converse com elas, faça perguntas, se aconselhem…&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Com certeza as pessoas em posição de liderança não nasceram sabendo tudo o que sabem. Entender estes processos de desenvolvimento é fundamental para nós. E como saber disso? É simples, converse com elas, faça perguntas, se aconselhem…&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Quais insights ou dicas nos ajudaram a conseguir os nossos propósitos"?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A ideia aqui não é copiar o jeito das pessoas, mas entender o que as levaram a fazer o que precisava ser feito. Quanto mais conversas mais interessante fica. Cada uma vai nos abrir um leque de possibilidades para formar o futuro profissional que desejamos. Essas conversas serão importantes se tiverem elementos não só de sucesso, mas também de experiencias não tão bem sucedidas, pois aprendemos muito com as situações de dificuldades também. Quais insights ou dicas conseguiremos a partir de uma boa conversa com elas e que muito nos ajudarão a conseguir os nossos propósitos?&lt;/p&gt;

&lt;p&gt;As experiências das pessoas são ferramentas incríveis para o nosso desenvolvimento. Nos dias de hoje é super simples o cultivo dos nossos alimentos porque em algum momento há 10 mil anos atrás o ser humano teve que aprender como fazer isso. A experiência é que nos impulsionou como sociedade até aqui.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Olhar mais profundamente para um cargo futuro me ofereceu várias ideias de como melhorar.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Algo que comecei a fazer depois de um certo tempo foi analisar todas as atribuições e valores dos meus líderes ou pessoas que admiro (algumas organizações têm essas competências bem definidas) e dentro de uma escala de 1 a 5 me avaliei em cada comportamento espelhado. Como você pode imaginar, na maior parte da minha análise me posicionei no nível 1 ou seja, uma forma muito clara de identificar as áreas e níveis de competência que eu precisaria buscar. É claro que eu também fiz isso também em relação ao meu cargo atual, mas "olhar mais profundamente para um cargo futuro me ofereceu várias ideias de como melhorar "e ainda crescer mais rapidamente para chegar aos meus objetivos.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ao atingir o topo de uma montanha, é possível observar a existência de outra ainda mais alta&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Esperava algum final feliz? Essa jornada só está no início. Eu apenas aprendi algumas dicas de como chegar lá. O caminho é longo. Podemos até usar uma metáfora que diz que "Ao atingir o topo de uma montanha, é possível observar a existência de outra ainda mais alta". É um processo contínuo, quanto mais experientes…maiores serão os desafios.&lt;/p&gt;

&lt;p&gt;Você pode ter chegado até aqui e estar se perguntando…. Mas o que isso tem a ver com o título desse artigo? o que isso tem a ver com olhos de águia? Pegando os exemplos dos animais que têm a melhor visão na natureza entendemos duas coisas importantes.&lt;/p&gt;

&lt;p&gt;A primeira é que os seres humanos não têm uma visão muito boa :) e que não existe o conceito de melhor visão. A melhor visão depende do objetivo. Para se movimentar a noite, a visão noturna é muito melhor do que visão a longo alcance.&lt;/p&gt;

&lt;p&gt;Para a águia capturar o seu alimento, a visão de longo alcance é super importante. Quanto maior a altitude melhor ela consegue ter uma visão panorâmica de como achar a presa.&lt;/p&gt;

&lt;p&gt;Toda a minha jornada profissional me mostrou que não basta termos uma boa visão no nosso cargo atual. Claro que isso é de suma importância para nos tornarmos um bom profissional, mas talvez não seja suficiente para nos levar ao local onde realmente desejamos estar. Para tanto é vital que ampliemos nossa visão, como águias, para conseguirmos enxergar as barreiras e as oportunidades que nos conduzirão ao sucesso.&lt;/p&gt;

&lt;p&gt;Pensem nisso…&lt;/p&gt;




&lt;p&gt;Quer uma nova oportunidade de carreira com desafios globais? Confira nossas vagas em &lt;a href="https://go.sumup.com.br/eb-dev-to-vagas"&gt;Engenharia e Produto&lt;/a&gt; e conheça mais sobre a SumUp.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Elixir and NIF: A Case Study</title>
      <dc:creator>Inside SumUp Brazil </dc:creator>
      <pubDate>Wed, 15 Dec 2021 20:38:05 +0000</pubDate>
      <link>https://dev.to/insidesumupbr/elixir-and-nif-a-case-study-528c</link>
      <guid>https://dev.to/insidesumupbr/elixir-and-nif-a-case-study-528c</guid>
      <description>&lt;p&gt;Hello, devs! I'm Rodrigo Caldeira, Software Engineer at SumUp in São Paulo and I'll be sharing some thoughts about Elixir and NIF with a real story. This is my first contribution here, so I welcome any feedback.!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;A little bit of context&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I've been working at SumUp since Jan 2020 and after some reshuffles, I'm now in the Business Bank unit working directly with PIX features.&lt;br&gt;
long with others events and meetings, there are two main events that the EP&amp;amp;D (Engineering, Product and Design) departments attend:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lunch and Learn:&lt;/strong&gt; In some places this is known as brown bag, the goal here is to have the opportunity to share knowledge during lunch time every Friday –anyone in EP&amp;amp;D can present about any related subject.&lt;br&gt;
&lt;strong&gt;HackDay:&lt;/strong&gt; Every two weeksan entire Friday is reserved to work with any non-SumUp related project. We can do work onliterally anything on this day.&lt;/p&gt;

&lt;p&gt;With that said, this post details a bit more about my experience with theseevents.&lt;/p&gt;

&lt;p&gt;During one HackDay, I was studying a way to do Slack integrations (without success =( ), when suddenly a QA Engineer called me.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;QA Engineer:&lt;/strong&gt; Hi, Caldeira! How are you? Could you help me with my HackDay project, please? I was trying to do something here, but now I'm stuck =/&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Me:&lt;/strong&gt; Sure! How can I help you? (at this point I had already given up on my project)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;QA Engineer:&lt;/strong&gt; Awesome! So, I'm trying to use a software to automate some tests here, but this software doesn't have an Elixir plugin (we use Elixir here in the Bank). Looking in the docs I found out that it is possible to create a plugin with their C library. Do you know how to do that?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Me:&lt;/strong&gt; Whoa! That's a tough one! I never did that, but I know that's possible with NIF. Let's create a simple project to study a little bit, and then we come back with that library. What do you think?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;QA Engineer:&lt;/strong&gt; Great! Let's do it!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Spoiler: We didn't came back with that library.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So, that's the whole scenario here. The QA Engineer and I started a study case about Elixir and NIF on HackDay. The outcome of that HackDay was a Lunch and Learn that I presented two weeks after, and that's what I'm sharing with you right now.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The case&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Elixir systems run over the Erlang BEAM virtual machine, and NIFs &lt;a href="https://www.erlang.org/doc/tutorial/nif.html"&gt;(Native Implemented Functions)&lt;/a&gt; are the way to extend Erlang software through loading and executing native pieces of software. Here, those software can be written in any language that compiles to native components, like Rust or C, and in this example I'll create and use a library in C and use it in a simple Elixir module.&lt;/p&gt;

&lt;p&gt;So, let's start with our native library. It's a simple calculator that exposes four functions that receives two integer parameters and returns one integer:&lt;/p&gt;

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

&lt;p&gt;For non-ortuguese speakers, my guess is that the functions' names should be straightforward, but here is the translation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;somar -&amp;gt; sum&lt;/li&gt;
&lt;li&gt;subtrair -&amp;gt; subtract&lt;/li&gt;
&lt;li&gt;multiplicar -&amp;gt; multiply&lt;/li&gt;
&lt;li&gt;dividir -&amp;gt; divide&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Great! Now that we have our library defined, let's compile it:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ gcc -o lib_calc.so -c lib_calc.c&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;No errors, no warnings. Click noice!&lt;/p&gt;

&lt;p&gt;BTW, I'm using Ubuntu on WSL2 for our example, but you should not face any problems with other distros.&lt;/p&gt;

&lt;p&gt;Now it's time to test our library. To do that, I'll create another C program that will receive three parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An integer number&lt;/li&gt;
&lt;li&gt;The operator&lt;/li&gt;
&lt;li&gt;An integer number&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--58c4TZo2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/95zbbe8h59hhaamrkjw7.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--58c4TZo2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/95zbbe8h59hhaamrkjw7.PNG" alt="Image description" width="880" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And compiling it:&lt;br&gt;
&lt;code&gt;$ gcc -o calc calc.c lib_calc.so&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Once again, no errors.&lt;br&gt;
Now, let's run our calculator:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ ./calc 1 + 1&lt;br&gt;
1 + 1 = 2&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Awesome! It works!&lt;/p&gt;

&lt;p&gt;Now, notice that in our calculator program I didn't do any kind of checking about the parameters sent to it. So, if we run it with an unexpected input, this is the result:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ ./calc 1&lt;br&gt;
[1]    388 segmentation fault  ./calc 1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That's OK for us, for we are not interested in the C calculator.&lt;br&gt;
So, with all that ready, how can we use our library inside an Elixir program?&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The solution&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To achieve that, we need to write another C program that will represent our NIF to Erlang and expose our calculator library to our Elixir module.&lt;/p&gt;

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

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

&lt;p&gt;Holy moly! That's a lot of code for a simple library! Let's dig in.&lt;br&gt;
The first line:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;#include &amp;lt;erl_nif.h&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;is the baseline of our NIF. It is the header of all basic NIF libraries with the functions and macros needed to create the NIF. It is located in the erlang-dev package.&lt;/p&gt;

&lt;p&gt;After that, we have four more functions, each one representing the functions in our C library from a vertical point of view, so I will focus on only one of them, as the rest is basically the same.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;static ERL_NIF_TERM somar_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])&lt;br&gt;
{&lt;br&gt;
  int a, b, result;&lt;br&gt;
  enif_get_int(env, argv[0], &amp;amp;a);&lt;br&gt;
  enif_get_int(env, argv[1], &amp;amp;b);&lt;br&gt;
  result = somar(a, b);&lt;br&gt;
  return enif_make_int(env, result);&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;These lines declare a new static function called somar_nif that returns an ERL_NIF_TERM (a type that represent any Erlang term), and expects three arguments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ErlNifEnv* env&lt;/code&gt; is a pointer that represents an environment that can host Erlang terms. Let's consider it as the environment that is running our NIF.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;int argc&lt;/code&gt; contains the number of arguments that was passed to the function.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;const ERL_NIF_TERM argv[]&lt;/code&gt; are the arguments passed to the function.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This resembles a lot like a regular main function in any C program.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;int main(int argc, char ** argv)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;When you have to read argv to get the values passed to your function, based on the number or arguments contained in argc.&lt;br&gt;
And that's exactly what is happening inside the function:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;// Our C variables&lt;br&gt;
int a, b, result;&lt;br&gt;
// Reads the first value and stores it in a&lt;br&gt;
enif_get_int(env, argv[0], &amp;amp;a);&lt;br&gt;
// Reads the second value and stores it in b&lt;br&gt;
enif_get_int(env, argv[1], &amp;amp;b);&lt;br&gt;
// Our lib_calc function been called!&lt;br&gt;
result = somar(a, b);&lt;br&gt;
// Transforms the result into an ERL_NIF_TERM and returns it&lt;br&gt;
return enif_make_int(env, result);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Here the argc is being totally ignored, as we already know that exactly 2 values are being passed as arguments.&lt;/p&gt;

&lt;p&gt;After defining all our NIF functions, we have to inform the Erlang NIF API how to call them.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;static ErlNifFunc nif_funcs[] = {&lt;br&gt;
  {"somar", 2, somar_nif},&lt;br&gt;
  {"subtrair", 2, subtrair_nif},&lt;br&gt;
  {"multiplicar", 2, multiplicar_nif},&lt;br&gt;
  {"dividir", 2, dividir_nif},&lt;br&gt;
};&lt;br&gt;
ERL_NIF_INIT(Elixir.Calc, nif_funcs, NULL, NULL, NULL, NULL)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The static ErlNifFunc nif_funcs[] is an array of ErlNifFunc struct. This struct is defined as having the following variables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;name:&lt;/em&gt; The NIF function's name, that will be exposed in our NIF&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;arity:&lt;/em&gt; The NIF function's arity&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;function:&lt;/em&gt; The pointer to the function that will be called when the Erlang/Elixir module calls the NIF&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is a fourth variable in ErlNifFunc struct that is the flags, but for our example it can be omitted.&lt;/p&gt;

&lt;p&gt;The last piece of code in our NIF is the ERL_NIF_INIT macro call, passing the module name, the functions that will be exposed in our NIF and points to functions dedicated to treat load, reload, upgrade and unload events (ignored here in our example).&lt;/p&gt;

&lt;p&gt;Notice that the module name is Elixir.Calc, and not just Calc. That's necessary because our goal is to use this NIF in an Elixir module, and all Elixir modules from the Erlang perspective start with Elixir.&lt;/p&gt;

&lt;p&gt;Phew! A lot of work here! Let's compile it and see what happens.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ gcc -shared -o lib_calc_nif.so -fPIC lib_calc_nif.c lib_calc.so&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Great! Again, no errors or warnings.&lt;/p&gt;

&lt;p&gt;Notice the -fPIC flag passed to gcc. This is to inform gcc to create a Position Independent Code, which will generate an assembly code with relative address references.&lt;/p&gt;

&lt;p&gt;And now, the moment of the truth! Let's create an Elixir module!&lt;/p&gt;

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

&lt;p&gt;This, dear devs, is our Elixir module that will call our NIF! Taking a look you will notice this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@on_load :load_nifs&lt;br&gt;
def load_nifs do&lt;br&gt;
  :erlang.load_nif('./lib_calc_nif', 0)&lt;br&gt;
end&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This defines a callback that will be executed when the module is loaded (@on_load :load_nifs), and the callback will load our NIF (:erlang.load_nif('./lib_calc_nif', 0)). Let's see it in action!&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ iex&lt;br&gt;
Erlang/OTP 22 [erts-10.6.4] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1]&lt;br&gt;
Interactive Elixir (1.12.0) - press Ctrl+C to exit (type h() ENTER for help)&lt;br&gt;
iex(1)&amp;gt; c("Calc.ex")&lt;br&gt;
[Calc]&lt;br&gt;
iex(2)&amp;gt; Calc.somar(1, 2)&lt;br&gt;
3&lt;br&gt;
iex(3)&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Hooray! It works!&lt;/p&gt;

&lt;p&gt;Now, notice all the other functions defined in our module. They're just fallback functions, just in case the NIF was not loaded for whatever reason.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;That's really great! But…&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Not so fast! There are a lot of things to be considered here before we move on with our excitement.&lt;/p&gt;

&lt;p&gt;First, remember how the arguments are declared in our C library?&lt;/p&gt;

&lt;p&gt;&lt;code&gt;int somar(int a, int b);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This function expects integer values. This behavior was passed all along with our journey here.&lt;/p&gt;

&lt;p&gt;In fact, our NIF tries to convert the first argument to an integer.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;enif_get_int(env, argv[0], &amp;amp;a);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;What happens if we try to pass a value from another type?&lt;br&gt;
Like a string, for example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;iex(3)&amp;gt; Calc.somar("test", 1)&lt;br&gt;
32753&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;What?&lt;br&gt;
Let's try with a float:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;iex(7)&amp;gt; Calc.somar(1.0,1)&lt;br&gt;
32753&lt;br&gt;
iex(8)&amp;gt; Calc.somar(1,1.0)&lt;br&gt;
1251267553&lt;br&gt;
iex(9)&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;oO???&lt;br&gt;
What is happening here?!&lt;/p&gt;

&lt;p&gt;Worse than that, if we keep calling the function with exactly the same value:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;iex(8)&amp;gt; Calc.somar(1,1.0)&lt;br&gt;
1251267553&lt;br&gt;
iex(9)&amp;gt; Calc.somar(1,1.0)&lt;br&gt;
1251267553&lt;br&gt;
iex(10)&amp;gt; Calc.somar(1,1.0)&lt;br&gt;
1251531297&lt;br&gt;
iex(11)&amp;gt; Calc.somar(1,1.0)&lt;br&gt;
1251531297&lt;br&gt;
iex(12)&amp;gt; Calc.somar(1,1.0)&lt;br&gt;
1251288249&lt;br&gt;
iex(13)&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The return value changes!&lt;/p&gt;

&lt;p&gt;This is because we didn't check inside our NIF to see whether the conversion was successfully done or not. So basically here we are getting junk values from the conversion.&lt;/p&gt;

&lt;p&gt;Just trying to convert and sum (subtract, multiply or divide) and ignore the variable itself. So this can do no harm to our module. But remember, we are dealing with C here. Not Elixir, not Erlang. C. Pointers, memory… Can you imagine the scenario?&lt;/p&gt;

&lt;p&gt;Besides that, what if we try to divide by zero?&lt;br&gt;
&lt;code&gt;iex(13)&amp;gt; Calc.dividir(1,0)&lt;br&gt;
[1]    501 floating point exception  iex&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The BEAM crashed! That's a huge problem with using NIFs: if the NIF crashes during the execution, the entire BEAM crashes.&lt;/p&gt;

&lt;p&gt;So this is a feature that must be used very, very, very carefully.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Final considerations&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I really love to study these kinds of topics. Understanding how things work under the hood is a powerful method to discover new possibilities and explore and extend my knowledge about a subject.&lt;/p&gt;

&lt;p&gt;I don't intend to put any of these things in production, unless it's totally necessary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If there is no time to develop an entire feature that is already implemented in a native library.&lt;/li&gt;
&lt;li&gt;If there is a bug in Erlang modules that prevents you to deploy your feature.&lt;/li&gt;
&lt;li&gt;If that native lib is so exclusive, so unique, and solves a huge problem, and there is no alternative to it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think you get the point here.&lt;/p&gt;

&lt;p&gt;The source code of this project can be found at &lt;a href="https://github.com/rodrigocaldeira/nif_cgo"&gt;https://github.com/rodrigocaldeira/nif_cgo&lt;/a&gt; and there is a bonus there!&lt;br&gt;
Thank you so much for following along!&lt;/p&gt;




&lt;p&gt;Ready for a new career opportunity? Explore our open roles and learn more about our culture at SumUp: &lt;a href="https://go.sumup.com.br/eb-dev-to-vagas"&gt;https://go.sumup.com.br/eb-dev-to-vagas&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Por: Rodrigo Caldeira&lt;/p&gt;

</description>
    </item>
    <item>
      <title>O Poder do Módulo Task do Elixir - O Início</title>
      <dc:creator>Inside SumUp Brazil </dc:creator>
      <pubDate>Tue, 30 Nov 2021 13:25:32 +0000</pubDate>
      <link>https://dev.to/insidesumupbr/o-poder-do-modulo-task-do-elixir-o-inicio-351c</link>
      <guid>https://dev.to/insidesumupbr/o-poder-do-modulo-task-do-elixir-o-inicio-351c</guid>
      <description>&lt;p&gt;Caso prefira em inglês você pode encontrar &lt;a href="https://dev.to/felipearaujos/the-power-of-elixir-task-module-54np"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Recentemente eu estava estudando mais profundamente como o módulo Task funciona e para consolidar meus estudos decidi escrever esse post.&lt;/p&gt;

&lt;p&gt;Antes de começar, vamos ver a documentação do módulo &lt;a href="https://hexdocs.pm/elixir/Task.html"&gt;task&lt;/a&gt;. O melhor lugar para fazer isso é a documentação oficial do elixir. Aqui nós temos:&lt;/p&gt;

&lt;p&gt;Conveniences for spawning and awaiting tasks.&lt;/p&gt;

&lt;p&gt;Tasks are &lt;strong&gt;processes&lt;/strong&gt; meant to execute one particular action throughout their lifetime, often with little or no communication with other processes. The most common use case for tasks is to convert sequential code into &lt;strong&gt;concurrent&lt;/strong&gt; code by computing a value &lt;strong&gt;asynchronously&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ótima definição mas me mostre o código!!!!&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Iniciando uma operação async&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Nós temos duas maneiras básicas para executar uma operação async usando Task. É possível usar Task.start e Task.async. Vamos ver como isso funciona na prática.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task.start&lt;/strong&gt;&lt;br&gt;
Task.start(fn -&amp;gt; IO.inspect("Hello") end)&lt;br&gt;
{:ok, #PID&amp;lt;0.114.0&amp;gt;}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task.async&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Task.async(fn -&amp;gt; IO.inspect("Hello") end)&lt;br&gt;
%Task{&lt;br&gt;
  owner: #PID&amp;lt;0.110.0&amp;gt;,&lt;br&gt;
  pid: #PID&amp;lt;0.118.0&amp;gt;,&lt;br&gt;
  ref: #Reference&amp;lt;0.626386777.2138832899.106529&amp;gt;&lt;br&gt;
  }&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;É possível ver que Task.start retorna uma tupla com :ok e PID, enquanto Task.async retorna uma struct Task. Ambas funções funcionam da mesma forma.&lt;/p&gt;

&lt;p&gt;Geralmente precisamos esperar o resultado de algumas funções async para assim, poder executar a próxima ação. Vamos lá!&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Esperando resultados&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;O exemplo anterior foi meio básico, vamos primeiro adicionar alguma um delay na execução para torna-lo mais complexo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Task.async(fn -&amp;gt;&lt;br&gt;
    :timer.sleep(5000)&lt;br&gt;
    IO.inspect("Hello")&lt;br&gt;
    :ok&lt;br&gt;
  end)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Como vimos o resultado será uma %Task{}. Para esperar a response temos duas opções Task.await e Task.yield. Vamos ver as diferenças:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task.await&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O tempo de timeout padrão é 5 segundos;&lt;/li&gt;
&lt;li&gt;Dado um timeout, ele lança uma exceção;&lt;/li&gt;
&lt;li&gt;Após o tempo limite ser atingido, a task é interrompida;&lt;/li&gt;
&lt;li&gt;Você pode definir um tempo limite personalizado ou usar o atom:infinity.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Task.await(task)&lt;br&gt;
Task.await(task, :infinity)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Exemplo de timeout&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;task = Task.async(fn -&amp;gt; IO.inspect("Hello") ; :timer.sleep(10000); :ok end)&lt;/p&gt;

&lt;p&gt;Task.await(task)&lt;br&gt;
"Hello"&lt;br&gt;
** (exit) exited in: Task.await(%Task{owner: #PID&amp;lt;0.110.0&amp;gt;, pid: #PID&amp;lt;0.124.0&amp;gt;, ref: #Reference&amp;lt;0.3761442499.262406148.76432&amp;gt;}, 5000)&lt;br&gt;
    ** (EXIT) time out&lt;br&gt;
    (elixir 1.11.3) lib/task.ex:643: Task.await/2&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Como podemos ver, um tempo limite é um pouco explosivo ao usar Task.await. Uma maneira de lidar melhor com isso é são &lt;a href="https://hexdocs.pm/elixir/Task.html#module-supervised-tasks"&gt;Supervised Tasks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task.yield&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O tempo de timeout padrão é 5 segundos;&lt;/li&gt;
&lt;li&gt;Dado um timeout, ele retorna nil;&lt;/li&gt;
&lt;li&gt;Usar o atom :infinity não é permitido como em Task.await;&lt;/li&gt;
&lt;li&gt;Depois de um timeout atingido, mantém a task em execução;&lt;/li&gt;
&lt;li&gt;É possível terminar uma task em execução usando Task.shutdown (task, shutdown \ 5000).&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;task = Task.async(fn -&amp;gt; IO.inspect("Hello") ; :timer.sleep(10000); :ok end)&lt;br&gt;
Task.yield(task)&lt;br&gt;
nil&lt;br&gt;
 # Let's check again&lt;br&gt;
Task.yield(task)&lt;br&gt;
{:ok, :ok}&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dado um resultado :timeout, a resposta será nil. Depois disso, podemos executar Task.yield novamente. Para evitar task de longa execução sem nenhum resultado, você pode usar Task.shutdown (task, shutdown \ 5000).&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Um exemplo mais completo&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Temos uma lista de itens e é necessário executar algum processamento em todos itens da lista.&lt;/p&gt;

&lt;p&gt;items = ["alpha", "beta", "gama"]&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Enum.map(items, fn item -&amp;gt;
  Task.async(fn -&amp;gt;
    :timer.sleep(4000)
    IO.inspect("Hello #{item}")
    :ok
  end)
end)
|&amp;gt; Enum.map(&amp;amp;Task.await/1)
|&amp;gt; function_to_handle_results()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Com essa abordagem, ainda temos a exceção quando acontece o timeout. No entanto, é possível lidar com isso de uma maneira melhor com Supervised Tasks, mas esse assunto será abordado na próxima publicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conteúdo adicional&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dinojoaocosta.medium.com/elixir-findings-asynchronous-task-streams-7f6336227ea"&gt;Elixir Findings: Asynchronous Task Streams&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://angelika.me/2021/03/13/the-problem-with-task-await-and-timeouts/"&gt;The problem with Task.await/2 and timeouts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originalmente publicado em &lt;a href="https://dev.to"&gt;https://dev.to&lt;/a&gt; on May 14, 2021.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Quer uma nova oportunidade de carreira com desafios globais? Confira nossas vagas em &lt;a href="https://go.sumup.com.br/eb-dev-to-vagas"&gt;Engenharia e Produto&lt;/a&gt; e conheça mais sobre a SumUp.&lt;/p&gt;

&lt;p&gt;Por: Felipe Araujo, Software Engineer&lt;/p&gt;

</description>
      <category>elixir</category>
    </item>
    <item>
      <title>Manual de Liderança Técnica Ágil Parte 2/2: Práticas Efetivas de Comunicação para Guiar, Inspirar e Influenciar</title>
      <dc:creator>Inside SumUp Brazil </dc:creator>
      <pubDate>Tue, 23 Nov 2021 15:27:49 +0000</pubDate>
      <link>https://dev.to/insidesumupbr/manual-de-lideranca-tecnica-agil-parte-22-praticas-efetivas-de-comunicacao-para-guiar-inspirar-e-influenciar-27ec</link>
      <guid>https://dev.to/insidesumupbr/manual-de-lideranca-tecnica-agil-parte-22-praticas-efetivas-de-comunicacao-para-guiar-inspirar-e-influenciar-27ec</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introdução&lt;/strong&gt;&lt;br&gt;
Em mais de uma situação, a pessoa que se tornou formalmente a líder técnica do time não é a que tinha mais tempo de casa ou a mais experiente tecnicamente: era a que mais sabia se comunicar com pessoas do time e fora dele. Mas esse é um tema bastante abrangente. Por isso, nesta segunda parte deste manual, vamos listar algumas práticas mais concretas que devem ser levadas em consideração. Mas todas são baseadas muito mais nas suas habilidades pessoais do que técnicas.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. Fale no Idioma do Negócio&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Uma das principais expectativas de qualquer liderança técnica ou pessoa com mais experiência é que elas consigam explicar qualquer coisa, por mais baixo nível que seja, de forma idiomática. É preciso utilizar termos que todos consigam entender, principalmente as pessoas menos técnicas e mais voltadas para a área de negócio.&lt;/p&gt;

&lt;p&gt;Isso se torna ainda mais importante quando você precisa argumentar ou convencer pessoas que não são da área de desenvolvimento a aplicar alguma boa prática de código ou arquitetura que, quando explicadas de forma superficial, parecem não agregar tanto valor ao seu produto quanto uma nova funcionalidade agregaria.&lt;/p&gt;

&lt;p&gt;Um bom e comum exemplo é quando queremos quebrar um monolito numa arquitetura de microsserviços. Se você precisa apresentar este grande e trabalhoso processo para um grupo, ou convencê-los de que isso precisa ser feito, não seja tão literal. Quanto mais poder de decisão uma pessoa tem, menos ela vai entender profundamente o que significam esses termos. E será ainda mais difícil fazer elas compreenderem ou serem convencidas, principalmente quando acompanhados de argumentos rasos como dizer que isso deve ser feito simplesmente porque todos estão fazendo, por ser uma boa prática ou porque foi publicado em algum artigo.&lt;/p&gt;

&lt;p&gt;É preciso falar o idioma profissional deles que, com certeza, não envolvem as palavras monolito, arquitetura ou microsserviços. Por exemplo: "Hoje, todo nosso sistema está concentrado em um único lugar, isso dificulta a criação e o experimento de novas ideias, além de demorar bem mais que nossos competidores para entregar novas funcionalidades (traga dados contextuais e experiências suas aqui). Para resolver isso, existe uma boa prática chamada arquitetura de microsserviços, onde de forma gradual e estruturada, conseguimos dividir este grande sistema em sistemas menores. Assim temos mais liberdade e podemos escolher tecnologias mais apropriadas para uma dada necessidade de negócio. Além disso, ter sistemas desacoplados e bem definidos também ajuda na performance e diminui o custo de manutenção do nosso produto pois podemos prover mais recursos físicos somente para um serviço, e não para toda a aplicação que é o que temos que fazer hoje".&lt;/p&gt;

&lt;p&gt;Sempre tente trazer termos mais próximos de um idioma comum ou explicar sucintamente (cuidado com a prolixidade) algo técnico que tenha surgido no seu discurso. Foque no que realmente importa: o valor que aquela alteração vai agregar ao negócio do seu produto. Inclusive, para qualquer decisão técnica que for tomada, questione sempre sua prioridade e se ela realmente agregará, mesmo que indiretamente, melhorias para seus clientes. É muito comum cair na armadilha de tomar uma decisão por puro preciosismo profissional ou pela imensa vontade de usar uma tecnologia mais moderna, por isso, tenha bastante cuidado.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2. Dê Feedbacks Positivos e Construtivos de Forma Estruturada&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Não existe agilidade sem feedback. E isso não serve só para os feedbacks das pessoas que utilizam seu produto. Serve também para nós, pessoas do time e da organização, que queremos evoluir pessoalmente e profissionalmente. Quando melhoramos nossas habilidades, sejam elas comportamentais ou técnicas, o time trabalha com menos atrito, de forma mais fluida e ainda constrói um software melhor pois ele nada mais é do que um reflexo de seus responsáveis. Se nós melhorarmos, ele também vai melhorar.&lt;/p&gt;

&lt;p&gt;Infelizmente, nem toda organização fomenta uma cultura de feedback e essa responsabilidade acaba sendo atribuída para um gestor. Na minha opinião, essa abordagem acaba sendo cômoda, mas impede uma evolução orgânica e inclusiva da própria organização. Além disso, é uma ferramenta muito poderosa para a vida pessoal de cada um pois fortalece, através de uma comunicação não violenta e genuína, nossos relacionamentos.&lt;/p&gt;

&lt;p&gt;Outro ponto é que, geralmente, gestores não são técnicos ou estão há muito tempo afastados dos ofícios de desenvolvimento. Além disso, um gestor não está no dia a dia das pessoas técnicas do time: não fazem revisões de código, não pareiam, não estão presentes quando decisões técnicas são tomadas, etc. São só através dessas práticas que é possível entender o momento técnico de cada um e, assim, direcionar determinada pessoa para um caminho técnico que você julga importante dada sua experiência na área.&lt;/p&gt;

&lt;p&gt;A forma de dar e receber feedbacks que mais funcionaram em todos os projetos que participei foram cara a cara, nas reuniões chamadas de 1:1. Elas aconteciam com determinada frequência dependendo do contexto (a cada uma ou duas semanas). Mas, para que isso seja possível, é necessário saber aplicar o ferramental de feedback. Caso contrário, podem ser gerados atritos entre as pessoas do time que vão resultar no oposto do nosso objetivo. Um bom livro sobre este tema é o "Comunicação Não-Violenta", de Marshall Bertram Rosenberg. Se precisar de algo mais rápido, existe este artigo que ensina o básico que deve ser seguido para realizar esses tipos de conversas.&lt;/p&gt;

&lt;p&gt;Lembre-se que receber feedbacks também requer conhecimento. Por isso, certifique-se de que esse estudo esteja disseminado no seu time de alguma forma: dê uma apresentação com o que você aprendeu, assegure-se de que todas as pessoas leram sobre feedback ou pergunte se já adquiriram esse conhecimento em algum lugar.&lt;/p&gt;

&lt;p&gt;Dito tudo isso, agora é a sua vez de atuar. Com sua experiência na área de desenvolvimento, comece a observar códigos e argumentos técnicos com a vontade genuína de não só destacar pontos positivos, mas também pontos de melhoria baseados em seus conhecimentos teóricos. Tome nota de todos eles, priorize os mais críticos caso tenha encontrado muitos e os organize de forma que se torne fácil entender o conhecimento que falta por trás dos pontos que você encontrou. Exemplo: Se, constantemente, uma pessoa desenvolvedora tem o costume de criar variáveis com nomes "a", "b" e "c", talvez seria uma boa ela entender mais sobre código limpo e suas vantagens.&lt;/p&gt;

&lt;p&gt;E para fechar esta prática com chave de ouro, não esqueça de acompanhar a evolução das pessoas que receberam seu feedback e não hesite em trazer isso para elas, até mesmo de maneira informal. Por outro lado, lembre-se que feedbacks são presentes e que as pessoas podem fazer o que bem entenderem com eles: muitas vezes, por uma questão de contexto ou de prioridade, os pontos de melhoria que você trouxe podem ter sido deixados para um outro momento. E está tudo bem!&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3. Compartilhe Conhecimento através de Mentorias ou Apresentações&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Conhecimento bom é conhecimento compartilhado, principalmente nos times de desenvolvimento ágil. Deixar que se formem "silos" de determinados assuntos dentro do time é extremamente prejudicial: E se aquela pessoa faltar ou tirar férias? E se ela sair da empresa? E se isso tudo acontecer em meio a um bug crítico relacionado àquele assunto?&lt;/p&gt;

&lt;p&gt;Mas além de evitar esses problemas, conhecimento compartilhado também gera aprendizado para todas as pessoas e ajuda a alcançar um dos principais objetivos de uma liderança: &lt;strong&gt;o alinhamento técnico&lt;/strong&gt; para que o time tenha mais autonomia para não só proporcionar segurança para a tomada de decisão, mas também essa decisão ser baseada em padrões de código e arquitetura definidos pelo time.&lt;/p&gt;

&lt;p&gt;Existem muitas formas de se compartilhar conhecimento. Escolha ou adapte uma delas de acordo com seu perfil e o contexto do seu time naquele momento. Se você se considera uma pessoa mais extrovertida e comunicativa, ou quer melhorar sua habilidade de falar em público, prepare apresentações mesmo pequenas e sem layout profissional. Nelas, fale sobre conhecimentos que você já estudou ou até mesmo alguma prática ou padrão que utilizou para resolver alguma tarefa do backlog. Outra ideia que já funcionou bem em uma equipe que fiz parte foi organizar coding dojos para refatorar trechos do código ou aprender alguma nova linguagem. Nesse tópico, você pode usar sua criatividade, o que importa é o conhecimento chegar da melhor forma para a maior parte de pessoas do seu time.&lt;/p&gt;

&lt;p&gt;Em casos de pessoas que preferem não falar em público, existem práticas extremamente eficientes como a mentoria e o pareamento. A primeira trata-se de, através de reuniões frequentes, ensinar de forma teórica e prática um determinado tema para uma pessoa que busca aquele conhecimento. A segunda, o pareamento, é uma prática famosa no desenvolvimento ágil que, além de melhorar a qualidade da sua aplicação, permite que duas pessoas tenham mais domínio sobre o código e sobre o conhecimento de negócio relacionado à tarefa que está sendo feita.&lt;/p&gt;

&lt;p&gt;A ideia neste tópico não é centralizar e se sobrecarregar com essa responsabilidade. Tome a iniciativa e, liderando pelo exemplo, certifique-se de que compartilhar conhecimento tornou-se algo cultural e orgânico no seu time. Encoraje, usando até mesmo feedbacks, todas as pessoas da equipe a realizarem estas práticas. Perceba quem na sua equipe tem bastante conhecimento em algum assunto, seja ele geral ou relacionado ao código ou produto, e incentive essa pessoa a compartilhar esses conhecimentos de alguma forma. Pelas minhas experiências, um time que compartilha conhecimento de forma natural tende a resolver problemas mais assertivamente e desenvolver tarefas com mais velocidade porque mais pessoas vão ter a capacidade de navegar sobre diversos contextos de negócio da aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4. Gerencie seu Tempo e Delegue Responsabilidades&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Um dia eu ouvi uma frase que fez muito sentido: a função da liderança técnica é fazer com que o time não precise de uma liderança técnica. E, para isso, é necessário que você tenha uma boa gestão de tempo e saiba delegar as atribuições que lhe foram dadas para as pessoas à medida que elas evoluem tecnicamente.&lt;/p&gt;

&lt;p&gt;Quando você é uma liderança técnica, mesmo sem esse rótulo formal, todas as pessoas de toda a organização buscam a você para resolver problemas ou discutir assuntos de maior calibre. E é natural, principalmente para quem está começando, a aceitar todos esses convites e se perder em um mar de reuniões.&lt;/p&gt;

&lt;p&gt;Para resolver este problema e tornar a vida mais fácil, é necessário saber quando dizer não. Pergunte sobre o teor daquela reunião, avalie o contexto atual do seu time e o quanto ele precisa de você naquele momento, priorize esse encontro entre seus afazeres naquele dia. Feito essa análise, existem três opções: delegar aquela reunião para alguém do seu time que tenha contexto sobre aquele assunto, adiar esse encontro para um outro dia ou simplesmente aceitá-lo.&lt;/p&gt;

&lt;p&gt;Para delegar uma atribuição é essencial que se pratique os tópicos anteriores: feedback e conhecimento compartilhado. Só assim você vai conhecer as forças e fraquezas das outras pessoas e ter segurança para convidá-los a resolver novos problemas. Isso também contribui muito para a evolução profissional daquela pessoa, tanto dentro quanto fora da organização, além de liberar mais espaço na sua agenda para você fazer tarefas mais prioritárias e urgentes (ou quem sabe codar?).&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;5. Resolução de Conflitos e Facilitação&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Por mais alinhado tecnicamente que seja um time, sempre existirão divergências na hora de tomar decisões de forma colaborativa. A saída fácil e cômoda para esse problema é centralizar esse tipo de decisão nas pessoas mais experientes do time mas, por diversas razões, esse é um caminho a ser escolhido somente em cenários extremos.&lt;/p&gt;

&lt;p&gt;Dois fatores são essenciais para nossa motivação profissional: sentir-nos co-autores do que estamos fazendo e quando alcançamos um propósito maior do que simplesmente desenvolver tarefas totalmente pré-definidas por alguém. E esses dois fatores são alcançados quando tomamos decisões de forma colaborativa, sejam elas técnicas, de negócio, ou relacionadas aos processos do time.&lt;/p&gt;

&lt;p&gt;É claro que, dependendo da demanda do seu projeto, isso significaria encher o seu time de reuniões. Se for esse o caso, priorize as de maior impacto e aquelas onde o time tem mais contexto para argumentar e agregar à decisão final. Veja quais dessas reuniões de tomada de decisão podem ser opcionais ou, para alguns casos, chame somente as pessoas que tem conhecimento sobre o assunto relacionado à decisão.&lt;/p&gt;

&lt;p&gt;Com o time reunido, seja a pessoa facilitadora daquela reunião. Introduza o assunto com a ajuda de desenhos e diagramas, lembrando sempre de &lt;strong&gt;mostrar o valor de negócio envolvido&lt;/strong&gt;, e certifique-se que todos entenderam. Se já tiver pensado em caminhos a seguir, fica a seu critério apresentá-los ou não, pois se assim o fizer pode enviesar a decisão das pessoas do time e acabar perdendo ideias que poderiam ser mais interessantes que as suas.&lt;/p&gt;

&lt;p&gt;Deixe a discussão rolar e vá anotando de uma forma que todos consigam ver os possíveis que estão aparecendo. Tome nota de seus pontos positivos, negativos e tente medir suas complexidades. Interfira na discussão sempre que necessário, como nos casos de alguém começar uma conversa baseada em uma premissa falsa ou perceber que se está perdendo muito tempo em um certo ponto que não está convergindo para lugar nenhum. Embora o ideal seja o consenso, tem horas que ele pode demorar muito e é preciso seguir em frente. Nesses casos, que devem ser exceções, pode-se abrir uma votação desde que o time entenda que a decisão tomada será de todo mundo, independente do seu voto. Seja sempre fiel ao tempo estipulado para aquela discussão.&lt;/p&gt;

&lt;p&gt;Caso seu time esteja com bastante dificuldade em chegar a consensos, faça uma análise mais profunda de outros aspectos pois é um forte indicativo de um alinhamento técnico fraco. Será que precisamos compartilhar mais o que estamos fazendo no dia a dia? Será que precisamos parear mais? Será que existe algum conceito ou prática de mercado que nosso time precisa se aprofundar?&lt;/p&gt;

&lt;p&gt;E é papel da pessoa facilitadora ajudar o time a chegar a um consenso. Quando existe um conflito, tente analisar as reais motivações por trás das opiniões contrárias. Faça perguntas para as pessoas envolvidas até chegar no real objetivo ou motivação de aquela pessoa preferir fazer daquele jeito. Essa tática é quase infalível para escolher um dos caminhos ou até mesmo construir um novo que contemple ambos. Além disso, muitas das vezes, percebe-se que as pessoas estão falando a mesma coisa mas de formas diferentes, o que causaria uma discussão longa e desnecessária que foi evitada pela sua habilidade de facilitação e resolução de conflitos.&lt;/p&gt;

&lt;p&gt;Ao chegar perto do final, separe um tempo para sumarizar as decisões que foram tomadas e ter certeza que todo o time está alinhado. Também é aconselhável documentar essas decisões e a motivação delas (lembra do &lt;a href="https://github.com/joelparkerhenderson/architecture-decision-record"&gt;ADR&lt;/a&gt;?)&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Encerramento&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Não existe nada escrito em pedra ou balas de prata para problemas complexos. Não chegue amanhã no seu trabalho e simplesmente tente transportar tudo que foi exposto aqui achando que em pouco tempo será reconhecido como uma liderança técnica. A chave para esse processo está em entender a motivação e a essência por trás de cada um destes tópicos e, como toda boa pessoa agilista, adaptá-los para o contexto da sua organização, produto e equipe. Às vezes algumas práticas já estão sendo feitas de forma satisfatória ou sequer fazem sentido para seu contexto. Lembre-se que &lt;strong&gt;o objetivo nunca deve ser fazer as coisas para se tornar liderança e sim agregar valor de negócio ao seu produto, de forma direta ou indireta.&lt;/strong&gt; Tudo que acontecer depois disso é consequência.&lt;/p&gt;

&lt;p&gt;A verdadeira lição desse artigo não são os tópicos em si mas sim mostrar que uma das formas de evoluir tecnicamente é pensar fora da caixa e atuar em frentes que vão além das tarefas do seu backlog. Existe um universo de práticas possíveis que podem ser idealizadas e aplicadas quando você une sua criatividade e sua experiência. Não tenha medo de errar. Assim como no desenvolvimento ágil é comum testarmos hipóteses e falharmos o quanto antes, o mesmo serve experimentar ideias dentro do seu próprio time e de seus processos.&lt;/p&gt;

&lt;p&gt;Espero ter contribuído de alguma forma para o seu momento de carreira ao compartilhar essas experiências e, por fim, te encorajo a compartilhar comentários, feedbacks, sugestões e experiências sobre os diversos temas que discutimos. Obrigado e até a próxima!&lt;/p&gt;

&lt;p&gt;Confira a parte 1 do artigo &lt;a href="https://dev.to/insidesumupbr/manual-de-lideranca-tecnica-agil-parte-12-praticas-essenciais-ao-criar-e-evoluir-um-produto-com-qualidade-43oh"&gt;aqui&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Quer uma nova oportunidade de carreira com desafios globais? Confira nossas vagas em &lt;a href="https://go.sumup.com.br/eb-dev-to-vagas"&gt;Engenharia e Produto&lt;/a&gt; e conheça mais sobre a SumUp.&lt;/p&gt;

&lt;p&gt;Por: Luiz Dias, Backend Software Engineer&lt;/p&gt;

</description>
    </item>
    <item>
      <title>O desafio dos e-mails não lidos: como criamos uma solução para melhorar a comunicação com consultores</title>
      <dc:creator>Inside SumUp Brazil </dc:creator>
      <pubDate>Wed, 17 Nov 2021 12:37:19 +0000</pubDate>
      <link>https://dev.to/insidesumupbr/o-desafio-dos-e-mails-nao-lidos-como-criamos-uma-solucao-para-melhorar-a-comunicacao-com-consultores-4ae8</link>
      <guid>https://dev.to/insidesumupbr/o-desafio-dos-e-mails-nao-lidos-como-criamos-uma-solucao-para-melhorar-a-comunicacao-com-consultores-4ae8</guid>
      <description>&lt;p&gt;Você tem muitos e-mails não lidos na sua caixa de entrada? E quanto às mensagens SMS, você abre aquelas que recebe? Melhor nem mencionar os grupos de WhatsApp cheios de "bom dia" então!&lt;/p&gt;

&lt;p&gt;Vamos ser sinceros, sem medo de julgamento... Diariamente cada um de nós recebe tanta comunicação que fica difícil acompanhar tudo. Em meio às promoções de eletrodomésticos, lembretes para eventos online e boletos a serem pagos, alguma coisa sempre acaba se perdendo por ali. Acontece, não é mesmo?&lt;/p&gt;

&lt;p&gt;E foi diante desse "caos da comunicação" que, aqui na SumUp, nos vimos com um desafio bastante complexo de resolver: &lt;strong&gt;como fazer os consultores de vendas lerem as nossas comunicações&lt;/strong&gt; e ficarem a par das novas regras, campanhas e novidades?&lt;/p&gt;

&lt;p&gt;Unimos esforços dos times de Comunicação em Vendas e Engenharia &amp;amp; Produto para criar do zero uma solução interna, customizada para atender às necessidades do programa e 100% dedicada a esse público.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;O programa de consultores da SumUp&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Embora hoje a SumUp seja uma empresa que oferece diversos produtos financeiros, entre eles a conta digital, o cartão de crédito e o link de pagamentos, no passado nosso único produto era a maquininha de cartão sem aluguel.&lt;/p&gt;

&lt;p&gt;Além de vender maquininhas por meio do seu &lt;strong&gt;&lt;a href="https://sumup.com.br/"&gt;site oficial&lt;/a&gt;&lt;/strong&gt;, já havia também uma iniciativa de "referrals" — no qual os atuais clientes da SumUp podem recomendar o produto para amigos e receber um bônus por cada indicação convertida em compra.&lt;/p&gt;

&lt;p&gt;Ainda assim, havia uma grande oportunidade para crescer a força de vendas de forma presencial por meio de representantes de vendas espalhados por todo o país. Foi assim que o &lt;strong&gt;programa de consultores da SumUp teve início em 2017&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Quase quatro anos depois, nosso programa hoje conta com mais de 16 mil consultores atuando na maior parte dos estados brasileiros, sendo responsável por trazer quase um terço dos novos clientes da SumUp. Conforme o programa ia crescendo e se consolidando ao longo dos anos, percebemos a importância de &lt;strong&gt;construir e oferecer uma plataforma online&lt;/strong&gt; que concentrasse todos os relatórios e ferramentas úteis para o dia a dia desse consultor ou consultora.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;O Portal dos Consultores é oficialmente lançado&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Com o objetivo de centralizar dados sobre as vendas mensais dos consultores em tempo real, além de oferecer uma lojinha interna para que todos pudessem repor seu estoque de maquininhas, o &lt;strong&gt;&lt;a href="https://parceiros.sumup.com.br/pt-br/create-account/"&gt;Portal dos Consultores&lt;/a&gt;&lt;/strong&gt; foi ao ar no final de 2018.&lt;/p&gt;

&lt;p&gt;Ele começou como uma aplicação dedicada somente aos representantes de venda do Brasil, mas hoje já pode ser utilizado também por parceiros localizados em países como França, Alemanha, Itália e Reino Unido.&lt;/p&gt;

&lt;p&gt;De lá para cá, diversas outras ferramentas, relatórios e recursos foram adicionados ao Portal — desde o fluxo de signup (criação de conta) para novos consultores, relatórios de gerenciamento de estoque e de clientes, e até mesmo uma central de notificações.&lt;/p&gt;

&lt;p&gt;E é sobre essa &lt;strong&gt;ferramenta de comunicação&lt;/strong&gt; que eu quero abordar e compartilhar nossos esforços e aprendizados! Da ideação e design de interface ao desenvolvimento do código no front-end no back-end, cada decisão de produto foi pensada em conjunto por profissionais de comunicação, produto e engenharia de software para chegarmos à solução ideal para os nossos consultores.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sDeIXs3A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vtvw53gg4um60dafew7w.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sDeIXs3A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vtvw53gg4um60dafew7w.PNG" alt="Image description" width="880" height="536"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Essa é a carinha do Portal dos Consultores hoje, depois de diversas atualizações e melhorias&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Uma Central de Notificações para o Portal&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Em meados de abril do ano passado, o squad de Partners Engagement — do qual faço parte e é responsável por criar estratégias e ferramentas para ajudar os consultores a aumentarem sua produtividade em termos de vendas — e o time de Comunicação deram início a uma força-tarefa para, juntos, atingirem um objetivo em comum: &lt;strong&gt;entender quais as dores dos consultores em termos de comunicação e desenvolver uma solução capaz de resolver esse problema.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nosso primeiro passo diante do desafio foi, de fato, mapear quais dores e incômodos seriam esses. Optamos por rodar uma sessão inspirada no &lt;strong&gt;design sprint&lt;/strong&gt;, uma metodologia voltada à prototipagem de produtos e soluções. Em geral, a prática sugere que sejam percorridas as cinco etapas de (1) entendimento/definição, (2) divergência, (3) decisão, (4) prototipagem e (5) validação de uma solução.&lt;/p&gt;

&lt;p&gt;Nosso time, no entanto, permitiu-se uma "licença poética". Inicialmente, iríamos focar a task force nas três primeiras etapas dela, sem necessariamente já rascunhar protótipos ou soluções.&lt;/p&gt;

&lt;p&gt;O objetivo era, portanto, &lt;strong&gt;definir muito bem o nosso problema&lt;/strong&gt;. Isso porque, a depender do desfecho da nossa conversa, poderíamos então pesquisar ferramentas já existentes no mercado e adicioná-las à lista de alternativas para atacar o desafio de comunicação com consultores, quem sabe até mesmo integrando uma delas ao Portal dos Consultores.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Definindo o problema a ser resolvido&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Uma vez que estávamos todos trabalhando remotamente na época, decidimos usar como ferramenta o &lt;strong&gt;Miro&lt;/strong&gt; — um whiteboard online (literalmente, uma grande tela em branco, como uma lousa) onde times podem colaborar na construção de diagramas e até mesmo realizar brainstormings de ideias com post-its coloridos. Foi nesse segundo ponto em que focamos, aliás.&lt;/p&gt;

&lt;p&gt;Em conjunto, levantamos uma série de dificuldades vividas pelo time de Comunicação ao tentar transmitir mensagens aos consultores de vendas. Vale lembrar que, até o lançamento da nossa Central de Notificações, ferramentas mais comuns já vinham sendo utilizadas para fornecer conteúdo a esse público: e-mails, newsletters, grupos de WhatsApp, mensagens de SMS, etc.&lt;/p&gt;

&lt;p&gt;Basicamente, as comunicações se encontravam "esparramadas" em diversos canais diferentes e era complicado trackear quem visualizou ou não cada uma delas. Isso sem contar a dificuldade que o consultor tinha de recuperar um comunicado mais antigo — o e-mail se perdia, o SMS era apagado, o histórico do WhatsApp era muito extenso e complexo de se acessar.&lt;/p&gt;

&lt;p&gt;De forma bastante resumida, listamos as seguintes dores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Como centralizar os muitos tipos de comunicação num único lugar? &lt;/li&gt;
&lt;li&gt;Como medir a efetividade da comunicação?&lt;/li&gt;
&lt;li&gt;Como armazenar o histórico de comunicações enviadas?&lt;/li&gt;
&lt;li&gt;Como compartilhar e reunir materiais de trade marketing?&lt;/li&gt;
&lt;li&gt;Como segmentar/personalizar os comunicados para cada consultor conforme seu nível no programa?&lt;/li&gt;
&lt;li&gt;Como automatizar nossos envios e ter uma régua de comunicação?&lt;/li&gt;
&lt;li&gt;Como engajar o consultor a querer vender mais e subir de nível para receber um bônus maior?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uma vez que o nosso design sprint tinha como objetivo convergir em um problema com escopo um pouco mais específico e fechado, filtramos entre as dores os seguintes focos: &lt;strong&gt;centralizar comunicações, mensurar acessos e armazenar histórico.&lt;/strong&gt; O que já é bastante coisa para se resolver a partir de um único MVP — do inglês, um produto viável mínimo, ou seja, uma versão inicial, mas que já entrega valor ao usuário.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;A solução que implementamos no Portal&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Quando tivemos de decidir que tipo de solução poderia ser implementada, começamos a pensar se valeria a pena ter uma ferramenta desenvolvida de ponta a ponta pelo nosso squad de Partners Engagement (do front-end ao back-end), se poderíamos encontrar uma solução pronta (dentro ou fora da SumUp) a ser integrada ao Portal dos Consultores, ou mesmo se queríamos contratar um serviço externo, já existente e consolidado no mercado.&lt;/p&gt;

&lt;p&gt;Depois de analisar diversos prós e contras, nosso time optou por criar do zero uma Central de Notificações dentro do Portal, desde o design até o código front-end e back-end que seriam voltados para a solução.&lt;/p&gt;

&lt;p&gt;Não optamos por utilizar uma ferramenta externa e pronta porque, uma vez que esse era um MVP ainda a ser testado com os consultores, poderíamos nos comprometer com a contratação de uma empresa terceirizada e investir dinheiro em uma ideia que não traria retorno. Este seria um risco que optamos por não correr naquela época, pois seria melhor ter certeza da adesão dos usuários e da eficácia da plataforma em termos de resolver o nosso problema. Além disso, significaria &lt;strong&gt;mais uma&lt;/strong&gt; ferramenta que o consultor precisaria acessar em adição às demais — e-mail, SMS, WhatsApp e o próprio Portal dos Consultores.&lt;/p&gt;

&lt;p&gt;Também descartamos a ideia de integrar o Portal a outra solução como, por exemplo, o Salesforce (sistema de gestão de relacionamento com o cliente) ou Contentful (sistema de gestão de conteúdo). Embora ambas já sejam utilizadas em outras situações pela SumUp, a integração com o portal levaria mais tempo do que o desejado por nós.&lt;/p&gt;

&lt;p&gt;Então, quando chegou a hora de colocar a mão na massa para criar nossa própria Central de Notificações, o que usamos? &lt;/p&gt;

&lt;p&gt;No back-end, utilizamos a &lt;strong&gt;&lt;a href="https://golang.org/"&gt;linguagem Go&lt;/a&gt;&lt;/strong&gt; para criar um microsserviço voltado à Central. Foram desenvolvidos quatro endpoints, dedicados às seguintes requisições:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[GET] Devolver a lista completa de mensagens disponíveis ao consultor;&lt;/li&gt;
&lt;li&gt;[GET] Devolver uma mensagem específica para leitura — o que ajudaria em performance, já que cada comunicado é um grande arquivo HTML/CSS e seria pesado já trazer todos eles de uma única vez no carregamento inicial da página;&lt;/li&gt;
&lt;li&gt;[PUT] Atualizar o status de uma mensagem específica para &lt;strong&gt;is_read: true&lt;/strong&gt; no banco de dados quando ela é clicada na listagem;&lt;/li&gt;
&lt;li&gt;[POST] Permitir o upload de novos arquivos HTML/CSS diretamente no banco de dados, assim o time de Comunicação passaria a ter autonomia para subir novas mensagens sempre que quisesse.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No front-end, o Portal já vinha sendo desenvolvido em &lt;strong&gt;&lt;a href="https://www.typescriptlang.org/"&gt;JavaScript/TypeScript&lt;/a&gt;&lt;/strong&gt; e &lt;strong&gt;&lt;a href="https://pt-br.reactjs.org/"&gt;React&lt;/a&gt;&lt;/strong&gt;, além de utilizar &lt;strong&gt;&lt;a href="https://graphql.org/"&gt;GraphQL&lt;/a&gt;&lt;/strong&gt; e &lt;strong&gt;&lt;a href="https://www.apollographql.com/docs/react/"&gt;Apollo Client&lt;/a&gt;&lt;/strong&gt; para conectar interface e APIs. Vale destacar algumas especificidades da Central durante o seu desenvolvimento:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O conteúdo das mensagens mostradas na tela chegam sempre em formato HTML com base em um template de e-mail marketing já utilizado/reaproveitado pelo time de Comunicação — se fazendo necessário importar todo o estilo CSS padrão para garantirmos que nada quebrasse visualmente;&lt;/li&gt;
&lt;li&gt;Queríamos uma notificação vermelhinha que sempre aparecesse ao lado do item de menu "Notificações" quando uma mensagem nova chegasse até que ela fosse lida. Antes de finalmente decidir estilizar, colorindo-a de vermelho, arredondando com &lt;strong&gt;border-radius: 50%&lt;/strong&gt; e definindo sua localização na tela com &lt;strong&gt;position: absolute&lt;/strong&gt;, quase cogitamos usar um emoji de cereja! (🍒);&lt;/li&gt;
&lt;li&gt;Quando implementamos a diferenciação de estilos para mensagens lidas e não lidas, o estilo só mudava após um refresh na página — o que seria péssimo, pois queríamos a mudança acontecendo no exato milissegundo do clique. Descobrimos que, se o endpoint do [PUT] devolvesse na sua resposta também o id da mensagem, o &lt;strong&gt;&lt;a href="https://www.apollographql.com/docs/react/v2/data/mutations/#updating-a-single-existing-entity"&gt;Apollo Client atualizaria os dados em cache&lt;/a&gt;&lt;/strong&gt; e o React se encarregaria de resolver o restante 🙏 (no caso, passando tudo para um tom mais acinzentado).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vale mencionar que a Central de Notificações foi lançada em duas grandes ondas, como todo bom MVP que vai sendo iterado com o objetivo de permitir entregas de valor mais rápidas e melhorias constantes.&lt;/p&gt;

&lt;p&gt;A primeira entrega liberada para os consultores ainda não contava com a possibilidade de chamar o endpoint de [PUT] para diferenciar visualmente mensagens lidas de não lidas, nem enviava eventos de cliques ao Google Analytics. Ela estava focada na visualização da lista de mensagens, na possibilidade de clicar em cada uma para ler o conteúdo HTML completo e na "cerejinha" visível no menu do Portal chamando a atenção do usuário sempre que houvesse uma ou mais mensagens não lidas.&lt;/p&gt;

&lt;p&gt;Por fim, o endpoint de [POST] também foi liberado — porém disponível somente ao nosso time interno, por meio de uma VPN — para que a adição de novos conteúdos fosse algo simples, rápido e sem qualquer burocracia ou dependência.&lt;/p&gt;

&lt;p&gt;Já na segunda entrega, conseguimos implementar estilos diferentes para que ficasse mais fácil de o usuário perceber o que já havia sido lido ou não. Também passamos a trackear acessos à página da Central e também os cliques por  mensagem, comparando o desempenho da nova ferramenta em relação a outras anteriormente usadas pelo time de Comunicação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--W8SHAax3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f72vct5086nvc9z3sg73.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--W8SHAax3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f72vct5086nvc9z3sg73.PNG" alt="Image description" width="880" height="516"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Esboço da Central de Notificações adicionada ao Portal dos Consultores&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Após um mês no ar, as mensagens publicadas já atingiam uma taxa de abertura de 51% para novos consultores — o maior open rate que uma ferramenta dedicada ao público já chegou aqui na SumUp, uma vez que o recorde era de cerca de 32% antes da Central de Notificações.&lt;/p&gt;

&lt;p&gt;Além disso, no acumulado de junho de 2020 a setembro deste ano, os eventos de clique do Google Analytics relacionados à Central de Notificações figuram entre os 10 mais frequentes de todo o Portal. Também, convenhamos, ninguém resiste a uma "cerejinha" vermelha chamando a atenção no menu!&lt;/p&gt;

&lt;p&gt;Por: Ceci Sousa&lt;/p&gt;




&lt;p&gt;Quer uma nova oportunidade de carreira com desafios globais? Confira nossas vagas em Engenharia e Produto e conheça mais sobre a SumUp: &lt;a href="https://go.sumup.com.br/eb-dev-to-vagas"&gt;https://go.sumup.com.br/eb-dev-to-vagas&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Manual de Liderança Técnica Ágil Parte 1/2: Práticas Essenciais ao Criar e Evoluir um Produto com Qualidade</title>
      <dc:creator>Inside SumUp Brazil </dc:creator>
      <pubDate>Tue, 26 Oct 2021 19:47:43 +0000</pubDate>
      <link>https://dev.to/insidesumupbr/manual-de-lideranca-tecnica-agil-parte-12-praticas-essenciais-ao-criar-e-evoluir-um-produto-com-qualidade-43oh</link>
      <guid>https://dev.to/insidesumupbr/manual-de-lideranca-tecnica-agil-parte-12-praticas-essenciais-ao-criar-e-evoluir-um-produto-com-qualidade-43oh</guid>
      <description>&lt;p&gt;As expectativas sobre lideranças técnicas, ou qualquer pessoa que ocupe um cargo técnico mais alto, tendem a ser bastante implícitas e variadas de acordo com o contexto do time ou da organização. Mesmo as formalizando em documentos ou conversas, sempre vão haver necessidades essenciais a qualquer produto que não necessariamente serão ditas de forma explícita. E nestes dois artigos tento trazer algumas dessas práticas que são quase sempre esperadas, mas nem sempre ditas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A liderança técnica deve ser uma consequência e não um objetivo&lt;/strong&gt;, e é ideal que surja de forma natural. Considerar e adaptar as práticas listadas neste artigo nada mais é que uma forma proativa de amadurecer profissionalmente. O que acontecer depois disso é, como mencionado, consequência.&lt;/p&gt;

&lt;p&gt;Outro ponto importante é que você &lt;strong&gt;não precisa ser a pessoa responsável por tudo isso.&lt;/strong&gt; Mas precisa sim, como alguém que almeja amadurecimento técnico, priorizar e aplicar essas práticas tendo em vista sempre o momento e a natureza do seu negócio. Não tente trazer todas de uma vez e, depois de iniciadas, não esqueça de garantir que estão sendo revisadas constantemente (não necessariamente por você).&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Antes de começar…&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Primeiro de tudo, assegure-se de que você já está fazendo o esperado pela sua equipe e líderes diretos. Você está demorando muito para entregar tarefas consideradas medianas pela sua equipe? Está tendo, com certa frequência, dificuldade para realizá-las mesmo em linguagens e tecnologias a qual considera que tem conhecimento?&lt;/p&gt;

&lt;p&gt;Se a resposta for sim, não tente adquirir novas responsabilidades. Use esse catálogo para cobrar atitudes das suas lideranças ou das pessoas mais experientes do seu time e, por enquanto, busque proativamente formas de ganhar conhecimento e segurança: pratique pareamento com pessoas da equipe, peça feedbacks técnicos sobre seu código, procure um mentor para te ajudar com as tecnologias envolvidas, etc. É necessário que tanto você quanto às pessoas ao seu redor tenham muita segurança na sua entrega do dia-a-dia antes de arranjar novas atribuições. E se conscientizar disso já é uma grande vitória.&lt;/p&gt;

&lt;p&gt;Caso contrário, se você acha que já existe uma confiança na qualidade e velocidade da sua entrega, ainda não siga em frente: certifique-se desse fato. Busque feedbacks técnicos de forma proativa. Além de demonstrar maturidade profissional, você também garante que é uma pessoa pronta para ser responsável por atividades mais desafiadoras.&lt;/p&gt;

&lt;p&gt;Agora, é hora de listar algumas atribuições, que nem sempre são explícitas ou formais, esperadas de lideranças técnicas ou pessoas que almejam mais maturidade na área de desenvolvimento. São práticas essenciais que, por quase todas as equipes que participei, tornaram o desenvolvimento do software mais sustentável e fluido, com bem menos atritos, imprevistos e falhas.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. Priorize e Acompanhe os Requisitos Transversais (ou Não-Funcionais) do seu Produto&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Requisitos transversais são aqueles fatores que vão além de tarefas ou histórias de usuário, mas são igualmente importantes para o funcionamento da sua aplicação: performance (tempo de resposta), disponibilidade, acessibilidade, escalabilidade, efetividade, etc. Uma longa lista deles pode ser encontrada nesse &lt;a href="https://en.wikipedia.org/wiki/Non-functional_requirement"&gt;link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Estes requisitos são considerados imprescindíveis, mas se costuma olhar para eles somente em momentos extremos quando já é tarde demais. Exemplo: um longo tempo de resposta, multas governamentais por não respeitar leis de acessibilidade, erros inesperados da aplicação quando sujeita a uma maior quantidade de requisições, etc.&lt;/p&gt;

&lt;p&gt;A ideia aqui é priorizar cerca de três destes requisitos dentre os existentes e coletar métricas relevantes relacionadas a eles. Esta é uma quantidade razoável, mas pode variar segundo o momento e a cultura da sua equipe. E sim, &lt;strong&gt;todos eles são importantíssimos, mas uns merecem mais atenção que outros dada a natureza do seu negócio.&lt;/strong&gt; Deixe isso claro para todas as pessoas: despriorizar segurança não quer dizer que não vamos considerá-la em nossas tarefas, mas, dependendo do produto, ter 100% de disponibilidade é mais crítico para o negócio do que criar &lt;a href="https://pt.wikipedia.org/wiki/Teste_de_intrus%C3%A3o"&gt;testes de intrusão (pen tests)&lt;/a&gt; ou rodar dinâmicas de &lt;a href="https://pt.wikipedia.org/wiki/Modelagem_de_amea%C3%A7as"&gt;modelagem de ameaça (threat modeling)&lt;/a&gt; toda semana. Depois de priorizados, mantenha viva no time a cultura de preocupar-se com eles a cada passo dado: adicione novos passos em sua pipeline de entrega contínua, adicione outros tipos de testes automatizados, adicione critérios de aceite às suas tarefas de negócio e até mesmo crie alertas em seu sistema de monitoramento baseados nas métricas coletadas daqueles requisitos.&lt;/p&gt;

&lt;p&gt;Precipitar esses problemas e evitar que eles aconteçam vai não só gerar aprendizados para toda a equipe, mas também o avanço de algumas casas na sua trajetória como pessoa desenvolvedora.&lt;/p&gt;

&lt;p&gt;Por último, é necessário garantir que estes requisitos estejam sempre sob controle e, para isso, vamos coletar e acompanhar métricas relacionadas. No entanto, pela abrangência e importância dessa prática, é ideal que ela tenha um tópico exclusivo e aprofundado…&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2. Colete e Acompanhe as Principais Métricas da sua Aplicação&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Todo time ágil deve saber ou ter fácil acesso a certas métricas técnicas de seu produto. Elas podem variar dependendo da sua natureza, mas existem algumas consideradas básicas que precisam de monitoramento contínuo e em tempo real: qual o tempo médio de resposta da sua aplicação e de seus casos de uso? Qual a porcentagem de falhas inesperadas que chegam até o usuário final? Qual a quantidade de requisições ou utilizações do seu sistema e suas funcionalidades?&lt;/p&gt;

&lt;p&gt;Uma lista mais completa dessas métricas pode ser encontrada neste &lt;a href="https://stackify.com/track-software-metrics/"&gt;link&lt;/a&gt;. Mas não se prenda a elas. Algumas que gosto de acompanhar e não estão nessa lista são as coberturas de testes unitários e de testes de mutação: juntas, ambas dão maior garantia de que seu software está sendo construído de forma sustentável e expansível.&lt;/p&gt;

&lt;p&gt;Com isso em mente, junte seu time ou faça você mesmo uma priorização do que precisa ser medido dado o contexto da sua aplicação. Analise se possui as ferramentas necessárias para essas medições e, caso negativo, converse com o time para priorizar atividades que tornem essas medições viáveis como, por exemplo, adicionar mais logs no seu código.&lt;/p&gt;

&lt;p&gt;Feito isso, crie painéis organizados com elas (geralmente com alguma ferramenta de monitoramento como o &lt;a href="https://www.splunk.com/"&gt;Splunk&lt;/a&gt; ou &lt;a href="https://www.datadoghq.com/"&gt;Datadog&lt;/a&gt;) e, se possível, deixe-os em um lugar visível para todo o time. Dessa forma, qualquer alteração suspeita no valor dessas métricas será mais perceptível e terá sua causa encontrada e corrigida mais rapidamente.&lt;/p&gt;

&lt;p&gt;Por último, crie alertas na mesma ferramenta de monitoramento baseado nelas. Não é garantido que vai ter sempre alguém olhando para esses painéis e atento às variações de valores, então os alertas são importantíssimos para garantir ainda mais uma resposta mais rápida a falhas.&lt;/p&gt;

&lt;p&gt;Não se esqueça que esses painéis e alertas agora &lt;strong&gt;fazem parte do seu produto.&lt;/strong&gt; E, como uma espécie de documentação, devem ser constantemente atualizados à medida que o time faz novas entregas. Uma boa ideia é considerar essas métricas e alertas durante a criação das histórias de usuário e adicionar, como critério de aceite, a criação de novos ou atualização dos existentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3. Mantenha sua Documentação, seus Diagramas de Arquitetura e Desenhos de Casos de Uso Organizados e Atualizados&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;É de senso comum que todo software precisa de uma documentação clara e sempre atualizada. Mas, quando estamos começando na nossa carreira de desenvolvimento ou trabalhando sob pressão de entregas e prazos, é comum entrarmos num ciclo vicioso de entregar tarefas preocupando-se apenas com seu funcionamento e deixando de lado outras partes tão importantes quanto a própria entrega. Em muitos times que participei, uma dessas partes esquecidas eram as documentações.&lt;/p&gt;

&lt;p&gt;Ter suas documentações sempre atualizadas é essencial não só para as pessoas que utilizam seus serviços, mas também para o seu próprio time e organização. É com elas que conseguimos manter uma cadência na velocidade de entrega pois, quando bem construídas e organizadas, temos fácil acesso a diversas informações que servem de base para nossas próximas funcionalidades e para novas pessoas integrantes da equipe. Por isso, quando falo de documentação, não estou falando somente daquele catálogo de endpoints dos seus serviços, &lt;strong&gt;mas também dos READMEs dos seus projetos e os diagramas de arquitetura e de casos de uso (ou de fluxo) da sua aplicação.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Não estou querendo dizer que é papel das lideranças técnicas manter esses artefatos atualizados. Sua responsabilidade (como deveria ser a de qualquer outra pessoa do time) é garantir que isso está acontecendo de forma natural e que todo o time entende a importância dessa prática. Caso isso não esteja acontecendo, sugira novos processos ou cerimônias para sua equipe até que, organicamente, todos considerem atualizar as documentações como parte das tarefas de desenvolvimento. Algumas ideias: pontuar nas histórias de usuário qual artefato deve ser criado ou atualizado, criar cerimônias com certa frequência para o time revisar junto as documentações, dar feedbacks para as pessoas que não o fizerem junto com suas tarefas, etc.&lt;/p&gt;

&lt;p&gt;E não se esqueça que parte fundamental dessas documentações são os diagramas de arquitetura do seu sistema e dos casos de uso (ou de fluxo) das suas funcionalidades. Elas devem ser capazes de responder a perguntas como: Com quais outros sistemas o meu produto se comunica? Quem são as pessoas, equipe ou empresa responsável por esses sistemas? Qual é a tecnologia desses sistemas? Por quais sistemas uma requisição passa para fazer uma dada operação? E quais informações são trafegadas entre eles?&lt;/p&gt;

&lt;p&gt;Ter a resposta para essas perguntas em boas documentações torna-se cada vez mais essencial a medida que seu produto evolui e poupa bastante tempo em diversas situações. Uma sugestão para desenhar seus diagramas de arquitetura é utilizar o &lt;a href="https://c4model.com/"&gt;modelo C4&lt;/a&gt; com as ferramentas &lt;a href="https://app.diagrams.net/"&gt;Draw.io&lt;/a&gt; ou &lt;a href="https://miro.com/signup/"&gt;Miro&lt;/a&gt;. Também existe uma prática bastante reconhecida no mercado chamada &lt;a href="https://github.com/joelparkerhenderson/architecture-decision-record"&gt;ADR (Architecture Decision Record)&lt;/a&gt;: ela serve para documentar as decisões arquiteturais do seu time e responder, sem depender da nossa falha memória, dúvidas do porquê determinada implementação foi feita daquela forma (quem nunca passou por isso?).&lt;/p&gt;

&lt;p&gt;Caso sua equipe seja responsável por "APIs" ou qualquer serviço de backend, existem uma série de ferramentas que não só criam e atualizam uma documentação de endpoints de forma automatizada, mas também a torna usável para que pessoas consumidoras possam fazer testes e requisições. Uma dessas ferramentas é o famoso &lt;a href="https://swagger.io/"&gt;Swagger&lt;/a&gt;. Ele é capaz de gerar uma documentação bastante intuitiva e possui plugins, para quase todas as linguagens de mercado, para gerar a documentação dos seus endpoints através do próprio código, sendo possível versioná-la e publicá-la para toda a organização a cada entrega feita pelo time.&lt;/p&gt;

&lt;p&gt;Para diagramas de casos de uso, eu gosto muito do &lt;a href="https://plantuml.com/"&gt;PlantUML&lt;/a&gt;, um plugin para desenhar diagramas UML utilizando uma linguagem própria de fácil entendimento. Dessa forma, é possível versionar estes diagramas ou até mesmo colocá-los juntos no mesmo repositório da sua aplicação (mais aconselhado).&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;4. Lide com Dívidas Técnicas (ou Débitos Técnicos)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Dívidas técnicas são consequências de escolher um caminho mais fácil e rápido para alcançar um objetivo, mesmo sabendo que existe um outro melhor e mais aderente aos bons padrões de código e arquitetura. É uma escolha consciente que pode ser feita por falta de tempo, conhecimento ou ferramentas naquele contexto. E não tem nada de errado com isso! O erro está em você não ter uma estrutura na sua metodologia para documentá-lo e nem um processo para priorizar essas dívidas e garantir que, um dia, ela será paga.&lt;/p&gt;

&lt;p&gt;Quando se trabalha em times onde sequer existe o conceito de dívida técnica, as consequências são trágicas (por experiência própria): em uma questão de meses, toda a performance do sistema foi comprometida, além do aumento da taxa de falhas e demora crescente para o time entregar novas funcionalidades pela complexidade do código. Não digo que essas dívidas foram as únicas culpadas, mas certamente contribuíram de forma majoritária para chegar nesse caótico cenário. Tudo era deixado pra depois: a refatoração de classes e métodos enormes, a criação testes automatizados básicos, a melhoria no design de alguns componentes do projeto, etc.&lt;/p&gt;

&lt;p&gt;Existem algumas formas de lidar com dívidas técnicas que funcionaram comigo quando percebi que esse cenário poderia voltar a acontecer. Uma delas foi primeiramente marcar um encontro com toda a equipe para alinharmos o conceito de dívida técnica. No mesmo encontro, por não termos muitas dívidas mapeadas, fizemos um brainstorm dos débitos técnicos que havíamos acumulado em alguns meses de projeto. Validamos cada um deles e, depois de ter certeza que eram realmente dívidas e que todos entenderam seu contexto, priorizamos cada uma delas em uma matriz de dor (baixa, média e alta) e esforço (alto, médio e baixo). Em nosso backlog, criamos esses débitos dando prioridade aos de esforço mais baixo e dor mais alta e combinamos com as pessoas responsáveis que, a cada iteração, iríamos pagar pelo menos duas dívidas técnicas por ordem de prioridade.&lt;/p&gt;

&lt;p&gt;No final da dinâmica, também combinamos um processo para mapear essas dívidas no nosso backlog: sempre que uma pessoa desenvolvedora gerar um débito técnico, ela mesmo o criava e o priorizava dentre os existentes. Além disso, mensalmente, todo o time se reunia para todos terem conhecimento das novas dívidas geradas naquele período e, se necessário, repriorizá-las.&lt;/p&gt;

&lt;p&gt;Por último, mas longe de ser o menos importante: assegure-se que todo seu time entende a importância deste tema e, com isso, mantenha viva a cultura de mapear e pagar dívidas técnicas. Adapte o exemplo dado ou crie novas abordagens que você acha que vão funcionar para o contexto e cultura da sua organização e do seu time e que, mesmo em tempos difíceis e de prazos apertados, elas não cairão no esquecimento.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;5. Codar&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Isso mesmo, codar, nem que algumas horinhas na semana! É muito comum as lideranças técnicas não terem tempo para programar. Porém, desenvolver tarefas é a melhor forma de ficar mais próximo da realidade das pessoas lideradas e conseguir tomar ações mais precisas. Ações essas que não estarão em artigos ou livros pois são extremamente relacionadas com o contexto que seu time está passando naquele momento.&lt;/p&gt;

&lt;p&gt;Então, se você é uma liderança técnica ou uma pessoa desenvolvedora e está sem tempo para programar, reveja suas atuais responsabilidades e atividades. Pense no que pode ser delegado ou adiado e assim o faça.&lt;/p&gt;

&lt;p&gt;Quando for programar, se possível, tente parear com pessoas do seu time para conhecê-las ainda mais e conseguir até mesmo dar feedbacks mais assertivos. Parear também, como já mencionado, é uma ótima oportunidade para compartilhar conhecimentos adquiridos com o seu provável muito tempo de projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Ainda não acabou…&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;No segundo e próximo artigo, vamos falar sobre tópicos menos técnicos e mais relacionados à comunicação dentro e fora do seu time. Como qualquer liderança, a forma de se comunicar cativa, influencia e evolui as pessoas ao seu redor e vou listar alguns tópicos a serem considerados para quem quer alcançar esse tipo de papel em uma organização. &lt;/p&gt;

&lt;p&gt;Fica de olho que dia 15/11 temos a parte 2!&lt;/p&gt;

&lt;p&gt;Quer uma nova oportunidade de carreira com desafios globais? Confira nossas vagas em &lt;a href="https://go.sumup.com.br/eb-dev-to-vagas"&gt;Engenharia e Produto&lt;/a&gt; e conheça mais sobre a SumUp.&lt;/p&gt;

</description>
      <category>agile</category>
    </item>
    <item>
      <title>Transações com Ecto</title>
      <dc:creator>Inside SumUp Brazil </dc:creator>
      <pubDate>Mon, 18 Oct 2021 20:48:50 +0000</pubDate>
      <link>https://dev.to/insidesumupbr/transacoes-com-ecto-374o</link>
      <guid>https://dev.to/insidesumupbr/transacoes-com-ecto-374o</guid>
      <description>&lt;p&gt;Transações em bancos de dados são um tema recorrente no dia a dia de pessoas desenvolvedoras de software. Em bancos de dados SQL, muitas vezes enfrentamos situações onde alterações em múltiplas tabelas são necessárias para completar uma transação de negócio. Para garantirmos a integridade da operação, transações são necessárias de forma que, em caso de alguma das operações falhar, independente de em qual momento a falha ocorrer, todas as anteriores sejam revertidas e as pendentes não sejam executadas.&lt;/p&gt;

&lt;p&gt;Imaginando agora um exemplo em uma arquitetura de microsserviços que trocam mensagens através de um broker (como o Apache Kafka, ou RabbitMQ), tanto a persistência de uma operação no banco de dados local de cada serviço, quanto o envio de uma mensagem relacionada para um broker precisam ter as mesmas garantias em casos de falha. Alguns patterns para lidar com esse problema já são bem conhecidos e utilizados em casos mais complexos, como Two-phase commit, Sagas e Transactional Outbox.&lt;/p&gt;

&lt;p&gt;Para casos mais simples, porém, uma forma de lidar com ele é incluir como parte do código que vai executar em um contexto de transação, a publicação dos eventos para seus destinos. Nos casos de uma aplicação escrita em Elixir, com um banco de dados SQL, temos algumas alternativas de escrever essa transação. Vamos ver duas delas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Utilizando transações com Ecto&lt;/strong&gt;&lt;br&gt;
Utilizando uma simples transação do Ecto, basta invocarmos a função Ecto.Repo.transaction/2 e, dentro da função que é passada como parâmetro, programarmos as expressões na ordem em que queremos que elas sejam executadas. O trecho de código abaixo exibe um exemplo. Nele estamos realizando uma inserção e em seguida publicando uma mensagem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def update_and_publish(%Settlement{} = settlement, %{} = updated_params) do
  Repo.transaction(fn -&amp;gt;
    with {:ok, changed_settlement} &amp;lt;-
           Repo.update(Settlement.update_changeset(settlement, updated_params)),
         {:ok, _} &amp;lt;- SettlementPublisher.publish(:settlement_changed, changed_settlement) do
      {:ok, changed_settlement}
    else
      {:error, reason} = err -&amp;gt;
        Repo.rollback(reason)
        err
    end
  end)
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O problema com esse código é que ele tende a ser verboso e requer explicitamente que façamos tratamento das operações para garantirmos que elas finalizaram com sucesso e decidirmos pelo commit ou rollback da transação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Introduzindo o Ecto.Multi&lt;/strong&gt;&lt;br&gt;
O módulo Ecto.Multi permite que se construa operações em cima de um Ecto.Repo utilizando de composição de funções para indicar a sequência em que elas devem ser executadas. A vantagem dessa estratégia é que não há necessidade de se controlar os resultados das operações e o commit ou rollback da transação explicitamente. O Ecto.Multi garante que todas as funções compostas são executadas dentro de um contexto de transação e que o commit dela só aconteça caso todas finalizem com sucesso. Em caso de qualquer uma falhar, o rollback será executado implicitamente.&lt;/p&gt;

&lt;p&gt;Além dessa facilidade, o Ecto.Multi também permite dar nomes a cada uma das operações, de modo que as subsequentes recebam uma redução do estado da operação que está sendo composto a cada execução de uma expressão. Isso se mostra muito útil em casos onde, para executar uma expressão, é necessário utilizar dados que foram gerados em instruções anteriores. Desse modo, o código Elixir tende a apresentar um aspecto muito mais declarativo e de composição de funções.&lt;/p&gt;

&lt;p&gt;A maioria das operações que geram mudanças no banco de dados presentes no módulo Ecto.Repo, também são encontradas no Ecto.Multi, como por exemplo insert, update e delete.&lt;/p&gt;

&lt;p&gt;Além delas, o módulo também fornece a função run que pode ser executada com qualquer operação arbitrária, não necessariamente gerando mudança no database, mas como por exemplo, realizando uma publicação de uma mensagem de evento. Essa função deve retornar ou uma tupla {:ok, value}, ou uma tupla {:error, value}. No primeiro caso, o Multi vai considerar a operação com sucesso e vai continuar com a transação. No segundo, o Multi considera a transação como falha e vai parar a sua continuidade, executando o rollback para as operações que finalizaram com sucesso anteriormente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Utilizando o Ecto.Multi&lt;/strong&gt;&lt;br&gt;
É hora de refatorar o exemplo anterior para agora utilizar o Ecto.Multi. No trecho de código abaixo é possível notar um código usando a tão amada composição com o pipe operator que Elixir oferece.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def update_and_publish(%Settlement{} = settlement, %{} = updated_params) do
  transaction =
    Multi.new()
    |&amp;gt; Multi.update(:update, Settlement.update_changeset(settlement, updated_params))
    |&amp;gt; Multi.run(:publish_message, fn _repo, %{update: changed_settlement} -&amp;gt;
      SettlementPublisher.publish(:settlement_changed, changed_settlement)
    end)
    |&amp;gt; Repo.transaction()

  case transaction do
    {:ok, result} -&amp;gt; {:ok, result.update}
    {:error, _, failed_value, _} -&amp;gt; {:error, failed_value}
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe que na chamada para Multi.run, recebemos na função anônima que estamos enviando como argumento um map em que estamos fazendo pattern match na chave update. Esse mapa contém as mudanças que foram executadas anteriormente, nomeadas de acordo com o atom que passamos como argumento para cada chamada de função dentro de um contexto do Multi. Nesse caso, a chave update contém o resultado da função Multi.update, que chamamos anteriormente.&lt;/p&gt;

&lt;p&gt;Para formatar um retorno agradável a quem está chamando a nossa função, em caso de sucesso, procuramos o resultado da chamada de update, conforme nomeamos na composição do Multi. Em caso de falha, o Multi nos retorna uma tupla de 4 valores, contendo o atom :error, o nome da operação que falhou, o valor retornado e as mudanças que haviam terminado com sucesso, mas que sofreram o rollback junto com a transação. No nosso caso, estamos apenas interessados no valor de falha, que pode ou ser relacionado ao update no database, ou à publicação da mensagem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusões&lt;/strong&gt;&lt;br&gt;
A lib Ecto se destaca em meio à outras que também lidam com acesso e manipulação de dados através de código. A simplicidade e a elegância que oferece à pessoa desenvolvedora é fora de série. Como vimos nesse artigo, não é diferente com transações, principalmente quando trabalhamos com o Ecto.Multi, que oferece uma forma idiomática e simplificada de lidar com elas.&lt;/p&gt;

&lt;p&gt;É importante perceber que com essa estratégia de encapsular na transação tanto a alteração no banco de dados e a publicação da mensagem, apenas garantimos que será tudo ou nada em nosso database local. No caso da publicação da mensagem, ela pode completar com sucesso, mas no momento de fazer o commit da transação, termos uma falha no database.&lt;/p&gt;

&lt;p&gt;Quando esse tipo de problema ocorre, se for executada uma retentativa nessa função e desta vez a transação completar com sucesso, teremos a mesma mensagem sendo publicada duas vezes. Por isso, é muito importante considerar em uma arquitetura de microsserviços que as operações sejam idempotentes, ou seja, que se ocorrerem repetidamente, não afetarão o resultado esperado.&lt;/p&gt;

&lt;p&gt;Também é importante perceber que estamos fazendo uma transação composta de funções simples e que devem durar poucos milisegundos. Em casos onde há expectativa de operações mais onerosas em termos de tempo de execução, não é recomendável manter uma transação do banco de dados aberta, pois há riscos envolvidos, como timeouts. Nesses casos, o pattern de Transactional Outbox citado anteriormente seria mais adequado.&lt;/p&gt;

&lt;p&gt;Por: Daniel Pilon, Engineering Manager&lt;/p&gt;

&lt;p&gt;Quer uma nova oportunidade de carreira com desafios globais? Confira nossas vagas em Engenharia e Produto e conheça mais sobre a SumUp: &lt;a href="https://go.sumup.com.br/eb-dev-to-vagas"&gt;https://go.sumup.com.br/eb-dev-to-vagas&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Product design — Estrutura na SumUp</title>
      <dc:creator>Inside SumUp Brazil </dc:creator>
      <pubDate>Wed, 13 Oct 2021 21:56:15 +0000</pubDate>
      <link>https://dev.to/insidesumupbrazil/product-design-estrutura-na-sumup-5bn4</link>
      <guid>https://dev.to/insidesumupbrazil/product-design-estrutura-na-sumup-5bn4</guid>
      <description>&lt;p&gt;Irei compartilhar neste artigo um pouco da minha experiência nesse um ano de SumUp, principalmente sobre o time de design, desenvolvimento de carreira, cultura, estrutura e rituais atuando como Product Design em uma squad global na SumUp.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ser Product Designer&lt;/strong&gt;&lt;br&gt;
Vamos ao início… atuando dentro de uma squad sendo Product Designer você é a responsável, end-to-end daquele produto, seja ele nacional ou global. Além disso, existem inúmeras cross iniciativas às quais você pode fazer parte ou até mesmo liderar. Mas a tua responsabilidade principal está sob aquele produto da tua squad.&lt;/p&gt;

&lt;p&gt;Dentro da squad temos total autonomia para trabalharmos com o mínimo de dependências dos demais. Sempre há algo em comum para trabalharmos, pois temos em vista o objetivo comum, que é desenvolver produtos e serviços que auxiliem o pequeno empreendedor e gerar valor para o negócio. A cultura da SumUp defende muito a questão da autonomia (e não é só na teoria, isso é vivido na prática).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como é a estruturação do time de Product Designers?&lt;/strong&gt;&lt;br&gt;
Temos o nosso chapter de Product Designer e uma VP Global de Design. Mas, mais precisamente sobre Product Designers, cada tribo tem um designer manager, o qual tem sua equipe composta por pessoas de todos os níveis, incluindo lead e principal.&lt;/p&gt;

&lt;p&gt;Além de Products Designers na tribo, temos outros designers que atuam em disciplinas cross company, como Design Ops, Researchers e Design System, mas que nos apoiam para executarmos as nossas demandas ou facilitam processos em comum. (ex, recrutamento e operações de design).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Representatividade e diversidade no chapter&lt;/strong&gt;&lt;br&gt;
Como mencionei acima, temos uma VP de designer, e é possível ver lideranças femininas em outras posições e times além de design. O mesmo vale para outros grupos geralmente não representados. Atualmente, o time de tecnologia da SumUp possui 32% mulheres, é algo que vem sendo trabalhado para melhor, pois vai além da questão de representatividade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desenvolvimento e plano de carreira&lt;/strong&gt;&lt;br&gt;
Na SumUp existe uma iniciativa que se chama Seeds &amp;amp; Steps que compartilha um pouco da visão do que é esperado de cada pessoa que ocupa uma posição, e da visibilidade do que é esperado nos próximos passos da carreira. Um plano é traçado junto ao manager para construir um plano de ação para cada objetivo.&lt;/p&gt;

&lt;p&gt;Além do suporte do manager, podemos contar também com um suporte financeiro de R$10.000,00 anual, e individual, para fazermos cursos, participar de eventos, comprar livros e etc.&lt;/p&gt;

&lt;p&gt;Um dos highlights que eu tenho da minha experiência aqui, foi ter tido uma conversa desde a primeira semana com meu manager para entender sobre o meu momento de carreira, o que eu almejava para os próximos passos, e também, dando visibilidade ao Seeds &amp;amp; Steps. Foi neste momento que eu entendi que teria alguém além de mim me auxiliando no meu desenvolvimento profissional, e que o objetivo do meu manager era olhar para a minha carreira e me ajudar a atingir os meus objetivos. Estava de olho também em como eu poderia desempenhar o meu melhor papel para também atingir os objetivos da empresa. O sucesso do designer manager, é o seu sucesso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como nos mantemos atualizados em um time de 70+ Product Designers?&lt;/strong&gt;&lt;br&gt;
Além dos famosos grupos de slack, temos alguns rituais para fomentar a troca entre os designers e também compartilhar o que estamos fazendo. Aqui são alguns dos rituais que nós temos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tribe design sync&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Quem participa?&lt;/strong&gt; Apenas os designers da sua tribo.&lt;br&gt;
&lt;strong&gt;Como é?&lt;/strong&gt; Comentamos sobre as iniciativas que estamos atuando, com o principal objetivo dar visibilidade aos demais.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Co-design section&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Quem participa?&lt;/strong&gt; Apenas os designers da sua tribo.&lt;br&gt;
&lt;strong&gt;Como é?&lt;/strong&gt; Apresentamos os projetos, desde aqueles que estão na fase inicial, até mesmo aqueles que estão já em fase de desenvolvimento ou interação para coletar feedback do time. Este formato é bem conhecido como ‘’Design Critic Section’’ no mercado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quarterly PD Deep dive&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Quem participa?&lt;/strong&gt; Os designers de todas as tribos participam.&lt;br&gt;
&lt;strong&gt;Como é?&lt;/strong&gt; No formato de apresentação (small talks), de projetos, iniciativas, ou pontos importantes da prática de Design, Research e Produto. No final temos um momento de interação e Q&amp;amp;A.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coffee design match&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Quem participa?&lt;/strong&gt; Qualquer designer da companhia que tenha se inscrito no canal previamente..&lt;br&gt;
&lt;strong&gt;Como é?&lt;/strong&gt; Conversas informais para conhecer designers que atuam em outras tribos ou times que seria pouco provável a interação devido escopo e tribo distinto. Este também acaba sendo um momento que você conhece mais a pessoa, além do profissional. A conversa no geral fica bem aquém dos participantes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hackday&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Quem participa?&lt;/strong&gt; Qualquer pessoa de Engenharia e Produto.&lt;br&gt;
&lt;strong&gt;Como é?&lt;/strong&gt; A cada 15 dias a SumUp disponibiliza uma sexta-feira para você se dedicar a alguma iniciativa desassociada/fora do escopo do seu time. Este tipo de iniciativa fomenta a troca com profissionais de outros times, além de claro, promover uma visão holística da empresa e de iniciativas que podem estar acontecendo além do teu squad e tribo.&lt;/p&gt;

&lt;p&gt;Nós também temos rituais globais da empresa como All hands, Town Hall, Lunch &amp;amp; Learning, entre outros, que também proporcionam momentos para compartilhamos conteúdos de design, produto e dores e oportunidades relacionadas às pessoas usuárias.&lt;/p&gt;

&lt;p&gt;Além de que no dia a dia não somos limitados apenas aos rituais para interagir e colaborar com outros designers, sempre surgem conversas individuais ou iniciativas em comum além dessas que eu mencionei acima.&lt;/p&gt;

&lt;p&gt;E claro, se os rituais mencionados acima não forem o suficiente para atender a necessidade de comunicação e visibilidade, ou se acreditamos que algo poderia ser feito diferente, há abertura para sugerirmos e colaborarmos, afinal, melhorar a experiência nunca é demais.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mas toda estrutura segue essa organização? É sempre assim?&lt;/strong&gt;&lt;br&gt;
Não. Esses rituais que estou compartilhando são do meu ponto de vista como uma integrante da tribo de aquisição. No geral, esses rituais são flexíveis de acordo com as necessidade de cada tribo, vamos sempre analisando se faz sentido manter, cancelar, ajustar, alterar ou complementar.&lt;/p&gt;

&lt;p&gt;Compartilho aqui um pouco da estrutura, cultura e desafios da SumUp. Espero que essa visão possa ter despertado o interesse em saber mais sobre a nossa empresa e os nossos desafios, e quem sabe, também de fazer parte. ;)&lt;/p&gt;

&lt;p&gt;E aí, curtiu entender como funciona o nosso time? Aproveite para conferir nossas vagas abertas e venha ser um SumUpper como eu!&lt;/p&gt;

&lt;p&gt;Por: Carol Pestitschek, Product Design Specialist&lt;/p&gt;




&lt;p&gt;Para quem não está familiarizado com os títulos de tribo, chapter e squad, recomendo ler este material do Spotify que conta um pouco sobre esse tipo de estruturação: &lt;a href="https://blog.crisp.se/2012/11/14/henrikkniberg/scaling-agile-at-spotify"&gt;https://blog.crisp.se/2012/11/14/henrikkniberg/scaling-agile-at-spotify&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Quer uma nova oportunidade de carreira com desafios globais? Confira nossas vagas em Engenharia e Produto e conheça mais sobre a SumUp: &lt;a href="https://go.sumup.com.br/eb-dev-to-vagas"&gt;https://go.sumup.com.br/eb-dev-to-vagas&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>5 dicas de como aprender a automatizar testes!</title>
      <dc:creator>Inside SumUp Brazil </dc:creator>
      <pubDate>Thu, 30 Sep 2021 18:31:22 +0000</pubDate>
      <link>https://dev.to/insidesumupbrazil/5-dicas-de-como-aprender-a-automatizar-testes-2134</link>
      <guid>https://dev.to/insidesumupbrazil/5-dicas-de-como-aprender-a-automatizar-testes-2134</guid>
      <description>&lt;p&gt;Muitas pessoas AINDA acreditam que automatizar testes é mágica!&lt;/p&gt;

&lt;p&gt;Mas &lt;strong&gt;NÃO&lt;/strong&gt; é!&lt;/p&gt;

&lt;p&gt;Assim como qualquer atividade/tarefa, a prática leva a perfeição. Muitas pessoas que conheço me perguntam como eu comecei, já que também fui uma testadora manual, e quando digo que foi uma série de práticas que me fizeram ter o conhecimento que tenho, e que ainda quero ter… (diga-se de passagem, porque eu ainda estudo) algumas pessoas pensam que é simplesmente porque tive a oportunidade de exercitar automação no trabalho, mas acredite: isso é apenas 1 dos motivos que me ajudaram.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dica 1: busque um curso&lt;/strong&gt;&lt;br&gt;
É bem clichê, eu sei, mas busque primeiro um curso, dentre as várias linguagens de programação que você tenha certeza que vai poder aprender com maior facilidade, separe um tempo pra codar junto com o instrutor e repetir os seus passos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dica 2: migas(os) que automatizam&lt;/strong&gt;&lt;br&gt;
Assim como eu, você deve conhecer mais de uma pessoa que automatiza, pois bem, cola nela! Se você puder casar o curso que vai fazer com a linguagem que seus amigos próximos já automatizam, ótimo! Faça a eles perguntas mais assertivas, como: “Fulano, como eu sei qual elemento usar ao inspecionar uma tela?”. Entenda que a pergunta muda e fica mais assertiva, desse jeito o seu amigo consegue te ajudar bem melhor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dica 3: vá em meetups&lt;/strong&gt;&lt;br&gt;
Siiiiim!! Claro que essa dica não ia faltar! Gente, vocês não tem ideia de como os meetups fizeram e ainda fazem diferença na minha vida, além de conhecer novas pessoas e empresas legais, fazer networking e ainda descolar aquela entrevista que tanto se quer, tem a troca de conhecimento. E o legal é que você nem precisa perguntar mais de uma vez pro seu amigo que já te explicou alguma coisa, você pode perguntar pra outra pessoa que vai te explicar de forma diferente e te ajudar a ter mais entendimento do assunto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dica 4: faça entrevistas e testes&lt;/strong&gt;&lt;br&gt;
Mesmo que você não queira sair do seu emprego, é legal saber como está se saindo e quem vai te dar esse feedback são os recrutadores. Eles que irão te ajudar sobre o seu teste e o que você poderia ter feito pra torná-lo melhor, como: incluir melhores práticas no código, porque fazer algo de modo diferente e qual o ganho fazendo as alterações propostas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dica 5: leia livros&lt;/strong&gt;&lt;br&gt;
Ler livros pode consolidar o conhecimento que você tem sobre determinado assunto, mesmo que não entenda o que está lendo, seguindo as dicas acima e ler livros, é mais uma maneira de aumentar o seu conhecimento por meio do pensamento de outras pessoas. Se possível, é bacana comprar um e-book, como o Kindle por exemplo, que pagando R$19,90 por mês você consegue ler vários livros técnicos que, nem se quer foram publicados em papel, e ainda, ajuda o autor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dica bônus:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;“Mas Nath, como você conseguiu incluir a automação no seu dia-a-dia do trabalho?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Por mais que o seu trabalho esteja puxado, entenda que o seu chefe quer a versão entregue, independente se levar 3 dias pra fazer todos os testes regressivos manualmente para aprovar a versão. O que você tem que fazer é advertí-lo de que quanto menos tempo tiver pra se aperfeiçoar e automatizar, mais tempo vai demorar pra entregar algo que poderia ser testado rapidamente. Você pode, por exemplo, dividir o seu tempo, deixando uma ou duas horas pra estudar e fazer automação. Faça isso e mostre pro seu chefe, se ele não gostar… TROQUE DE EMPRESA! Eles definitivamente não merecem o potencial que vai alcançar com os seus estudos. Entenda que existem empresas se estapeando pra ter um QA que saiba automatizar, e esse QA pode ser você!&lt;/p&gt;

&lt;p&gt;Por: Nathalia Freire, QA Engineer&lt;/p&gt;




&lt;p&gt;Quer uma nova oportunidade de carreira com desafios globais? Confira nossas vagas em Engenharia e Produto e conheça mais sobre a SumUp: &lt;a href="https://go.sumup.com.br/eb-devto-lp-engenharia"&gt;https://go.sumup.com.br/eb-devto-lp-engenharia&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Do marketing ao front-end: como a SumUp me apoiou na carreira de desenvolvedora</title>
      <dc:creator>Inside SumUp Brazil </dc:creator>
      <pubDate>Mon, 27 Sep 2021 17:57:42 +0000</pubDate>
      <link>https://dev.to/insidesumupbrazil/do-marketing-ao-front-end-como-a-sumup-me-apoiou-na-carreira-de-desenvolvedora-3l0</link>
      <guid>https://dev.to/insidesumupbrazil/do-marketing-ao-front-end-como-a-sumup-me-apoiou-na-carreira-de-desenvolvedora-3l0</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xlKdY1lz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9hurg0iyntq751groph7.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xlKdY1lz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9hurg0iyntq751groph7.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Cecília Sousa, Frontend Engineer na SumUp&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Era 2 de março de 2020 quando pisei pela primeira vez em uma empresa sob o cargo de &lt;strong&gt;Frontend Engineer.&lt;/strong&gt; ''Elegante'', você talvez esteja dizendo. Mas eu confesso que só conseguia pensar nas borboletas no meu estômago, pois minha formação acadêmica nada tem a ver com engenharia ou TI. Estudei jornalismo e &lt;strong&gt;trabalhei por quase dez anos na área de marketing e comunicação.&lt;/strong&gt; Isso quer dizer que minhas semanas iniciais na SumUp com certeza podem ser definidas como um misto de empolgação e frio na barriga.&lt;/p&gt;

&lt;p&gt;Dando alguns passos para trás, a verdade é que aquele não era bem o meu primeiro dia de trabalho na fintech: na época em que decidi “largar tudo” para &lt;strong&gt;estudar desenvolvimento front-end&lt;/strong&gt;, eu já trabalhava lá — mais especificamente, com relações públicas e conteúdo. Eu vinha me interessando pelo setor de tecnologia quando, em 2019, ouvi falar sobre uma ONG chamada &lt;strong&gt;Reprograma&lt;/strong&gt; que faz um trabalho maravilhoso para &lt;strong&gt;apoiar mulheres cis e trans em seus primeiros passos na programação.&lt;/strong&gt; Participei do processo seletivo para uma das turmas daquele ano e, poucas semanas depois, lá estava eu entre as 30 selecionadas (abençoadas!) para o bootcamp gratuito e em período integral. Foi quando deixei o marketing e a SumUp.&lt;/p&gt;

&lt;p&gt;Depois de cinco meses de estudo, dezenas de projetos pessoais, centenas de commits e milhares de bugs, lá estava eu formada e ansiosa para finalmente trabalhar como programadora. Mas quem foi que disse que seria fácil encontrar uma empresa interessada em &lt;strong&gt;contratar uma desenvolvedora front-end com um total de zero horas de experiência&lt;/strong&gt; profissional na área?&lt;/p&gt;

&lt;p&gt;Coincidência ou não, a &lt;strong&gt;SumUp&lt;/strong&gt; estava justamente interessada em recrutar e &lt;strong&gt;contratar mais profissionais em início de carreira&lt;/strong&gt; para a sua equipe de Engenharia e Produto. Foi assim que eu vim parar aqui, agora pela segunda vez. “E como as coisas estão por aí?”, você deve estar se perguntando…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Na SumUp, não falta espaço para aprender e crescer&lt;/strong&gt;&lt;br&gt;
Assim que conheci o meu time, logo de cara fui surpreendida com um desafio. O Product Manager do squad tinha separado uma &lt;strong&gt;tarefa de front-end especialmente para mim.&lt;/strong&gt; Ninguém ali no squad duvidou das minhas habilidades, pelo contrário; todo mundo já contava comigo colocando a mão na massa desde o meu primeiro dia.&lt;/p&gt;

&lt;p&gt;Para alguém com pouca ou nenhuma experiência, isso pode até assustar um pouco, mas a verdade é que não existe satisfação melhor do que ser bem recebida em uma empresa que te trata como alguém que é plenamente capaz de entregar valor para os usuários assim como qualquer outro profissional com mais tempo de casa ou de carreira.&lt;/p&gt;

&lt;p&gt;Obviamente, não me faltou ajuda para colocar essa e outras tarefas no ar: participei de &lt;strong&gt;ótimas sessões de pair programming&lt;/strong&gt; com cada um no time de desenvolvedores. Me explicaram como o projeto funciona, quais os patterns de desenvolvimento e o processo de deploy. Isso sem contar as grandes aulas sobre bibliotecas e frameworks que eu nunca sequer tinha ouvido falar. Eu, que conhecia um pouquinho sobre &lt;strong&gt;HTML e JavaScript&lt;/strong&gt; quando cheguei, me deparei com um mundo de possibilidades (e desafios) quando vi que o nosso projeto usava &lt;strong&gt;React, GraphQL, Apollo, Testing Library, Jest, Cypress, Styled Components, Node.js e TypeScript.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Aqui na SumUp, tive a sorte e o privilégio de participar de incontáveis &lt;strong&gt;sessões de mentoria técnica e de programação em dupla&lt;/strong&gt; para ir descobrindo como usar cada tecnologia a meu favor à medida que uma nova tarefa surgia. Com tanta gente disposta a me ajudar, tanto dentro quanto fora do meu squad, em poucos meses me senti confiante para não só entregar o que estava no nosso roadmap de produto, mas também para &lt;strong&gt;propor melhorias e novas features.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Não bastasse todo esse cuidado com o meu aprendizado técnico, ainda recebi um acompanhamento de carreira quinzenal para encontrar oportunidades de me desafiar e me destacar, com foco em crescer e dar o &lt;strong&gt;próximo passo na minha carreira de Frontend Engineer.&lt;/strong&gt; Spoiler: deu certo! (Fui promovida alguns meses depois de completar um ano como desenvolvedora na SumUp.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Na SumUp, diversidade é assunto sério&lt;/strong&gt;&lt;br&gt;
Você já deve ter ouvido falar que mulheres são minorias na área de tecnologia, mas preciso avisar que os dados oficiais não são bons. De acordo com uma pesquisa da ONU Mulheres publicada há três anos, &lt;strong&gt;somente 17% das pessoas programadoras no Brasil eram do sexo feminino&lt;/strong&gt; em 2018.&lt;/p&gt;

&lt;p&gt;Esse provavelmente deve ser o calcanhar de aquiles de toda empresa de tecnologia e, quando decidi mudar de carreira, muita gente me alertou para o problema dizendo que eu deveria me preparar para situações em que não seria ouvida e para me acostumar a trabalhar em equipes majoritariamente formadas por homens.&lt;/p&gt;

&lt;p&gt;Por outro lado, não por acaso, a SumUp é conhecida por se preocupar genuinamente com &lt;strong&gt;diversidade e inclusão&lt;/strong&gt;. No escritório do Brasil, segundo uma pesquisa feita em 2020, o time é composto por 60% mulheres e 31% LGBTQIAP+, por exemplo. Embora os números não sejam os mesmos para o time de Engenharia e Produto, eu tenho à minha volta diversas mulheres desenvolvedoras que, além de mandarem muito bem no que fazem, são &lt;strong&gt;ouvidas e respeitadas por todo mundo.&lt;/strong&gt; (Esse é o mínimo, é verdade, mas anda bem difícil de se encontrar esse ambiente saudável por aí, infelizmente…)&lt;/p&gt;

&lt;p&gt;Falando por mim, aqui eu nunca senti que minha opinião tinha menos importância por eu ser mulher ou que alguém não estava interessado em ouvir o que eu tinha a dizer. Pelo contrário, &lt;strong&gt;me sinto num espaço seguro para falar o que penso&lt;/strong&gt; e para perguntar o que eu quiser, sem qualquer sentimento de inferioridade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Na SumUp, front-end conversa com todas as áreas&lt;/strong&gt;&lt;br&gt;
Um dos grandes receios que eu tinha ao trabalhar com front-end é que eu acabaria somente recebendo “demandas” que já viriam na forma de solução pronta, fechada e inegociável. Eu certamente me sentiria sem liberdade para ser criativa e sem espaço para participar da concepção de um produto.&lt;/p&gt;

&lt;p&gt;Eis que, aqui na SumUp, eu tenho o prazer de &lt;strong&gt;fazer parte de um squad multidisciplinar&lt;/strong&gt;, onde os responsáveis por produto e design fazem questão de ouvir o que os desenvolvedores front-end e back-end tem a dizer. Juntos, nós propomos novas ideias e planejamos os próximos releases. Também participamos de entrevistas com os usuários finais para entender o que gostariam de ver no ar e ouvimos os stakeholders internos para criar soluções que facilitem seu dia a dia.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nunca falta espaço para sair da “zona de conforto”&lt;/strong&gt;, estar perto das demais áreas e conhecer um pouco mais sobre como o nosso produto funciona, de ponta a ponta.&lt;/p&gt;




&lt;p&gt;Quer uma nova oportunidade de carreira com desafios globais? Confira nossas vagas em Engenharia e Produto e conheça mais sobre a SumUp: &lt;a href="https://sumup.com.br/carreiras/engenharia?utm_source=dev_to&amp;amp;utm_medium=article"&gt;https://sumup.com.br/carreiras/engenharia?utm_source=dev_to&amp;amp;utm_medium=article&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>career</category>
    </item>
    <item>
      <title>Venha ser uma pessoa Data Engineer na SumUp!</title>
      <dc:creator>Inside SumUp Brazil </dc:creator>
      <pubDate>Tue, 06 Jul 2021 14:25:31 +0000</pubDate>
      <link>https://dev.to/insidesumupbr/venha-ser-uma-pessoa-data-engineer-na-sumup-han</link>
      <guid>https://dev.to/insidesumupbr/venha-ser-uma-pessoa-data-engineer-na-sumup-han</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1QR0nVCQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mjuc6s7sqqanabyurfmg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1QR0nVCQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mjuc6s7sqqanabyurfmg.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;• VAGA DESTAQUE DO DIA •&lt;/p&gt;

&lt;p&gt;Estamos buscando uma pessoa Data Engineering Specialist para a tribo de Lending!&lt;/p&gt;

&lt;p&gt;O que a gente precisa:&lt;/p&gt;

&lt;p&gt;➡️Experiência mínima de 3 anos como Data Engineer;&lt;br&gt;
➡️Experiência com solução de messageria Kafka;&lt;br&gt;
➡️Sólida experiência em conceitos de gestão de dados;&lt;br&gt;
➡️Experiência com sistemas escaléveis;&lt;br&gt;
➡️Fera no inglês;&lt;/p&gt;

&lt;p&gt;Já trabalhou ou conhece alguém que traz esse conhecimento? Inscreva-se neste link &lt;a href="https://bit.ly/2UanSGZ"&gt;https://bit.ly/2UanSGZ&lt;/a&gt; ou compartilhe essa oportunidade na sua rede.&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>fintech</category>
      <category>techdevelopment</category>
    </item>
    <item>
      <title>Venha ser uma pessoa Product Manager na SumUp!</title>
      <dc:creator>Inside SumUp Brazil </dc:creator>
      <pubDate>Thu, 01 Jul 2021 17:09:22 +0000</pubDate>
      <link>https://dev.to/insidesumupbr/venha-ser-uma-pessoa-product-manager-na-sumup-45m9</link>
      <guid>https://dev.to/insidesumupbr/venha-ser-uma-pessoa-product-manager-na-sumup-45m9</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g57JPS3q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7x4qkynxb2zlra0utjnl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g57JPS3q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7x4qkynxb2zlra0utjnl.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;• VAGA DESTAQUE DO DIA •&lt;/p&gt;

&lt;p&gt;Estamos buscando Product Managers para as tribos de Acquisition e Consumer Mission! 🕵️‍♀️&lt;/p&gt;

&lt;p&gt;O que a gente precisa:&lt;/p&gt;

&lt;p&gt;➡️Experiência mínima de 2 anos como Product Manager;&lt;br&gt;
➡️Experiência atuando em times multifuncionais em ambientes ágeis;&lt;br&gt;
➡️Domínio no inglês;&lt;/p&gt;

&lt;p&gt;Já trabalhou ou conhece alguém que tem esse conhecimento? Inscreva-se nesse link &lt;a href="https://bit.ly/2UgOSEK"&gt;https://bit.ly/2UgOSEK&lt;/a&gt; ou compartilhe essa oportunidade na sua rede.&lt;/p&gt;

</description>
      <category>productmanager</category>
      <category>fintech</category>
      <category>techdevelopment</category>
    </item>
  </channel>
</rss>
