<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Gabriel Muniz on Medium]]></title>
        <description><![CDATA[Stories by Gabriel Muniz on Medium]]></description>
        <link>https://medium.com/@munizgabriel?source=rss-5d03870cd1e0------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*o05lmraLd4pqpNr_pxSmWw.png</url>
            <title>Stories by Gabriel Muniz on Medium</title>
            <link>https://medium.com/@munizgabriel?source=rss-5d03870cd1e0------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 15 May 2026 15:25:51 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@munizgabriel/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Inteligência emocional no caminho da liderança: qual o real impacto?]]></title>
            <link>https://medium.com/grupoolxtech/intelig%C3%AAncia-emocional-no-caminho-da-lideran%C3%A7a-qual-o-real-impacto-d10eb2a1d70b?source=rss-5d03870cd1e0------2</link>
            <guid isPermaLink="false">https://medium.com/p/d10eb2a1d70b</guid>
            <category><![CDATA[carreira-profissional]]></category>
            <category><![CDATA[liderança]]></category>
            <category><![CDATA[inteligencia-emocional]]></category>
            <dc:creator><![CDATA[Gabriel Muniz]]></dc:creator>
            <pubDate>Fri, 05 Jan 2024 14:46:56 GMT</pubDate>
            <atom:updated>2024-01-05T14:46:56.303Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Este artigo traz reflexões baseadas no livro</em><a href="https://www.amazon.com.br/Lideran%C3%A7a-Daniel-Goleman/dp/8539006510/ref=asc_df_8539006510/?tag=googleshopp00-20&amp;linkCode=df0&amp;hvadid=379712907297&amp;hvpos=&amp;hvnetw=g&amp;hvrand=15690284827889258628&amp;hvpone=&amp;hvptwo=&amp;hvqmt=&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=9102320&amp;hvtargid=pla-810578857879&amp;psc=1&amp;mcid=7d0a01c866f93ce999d7bec6e7b2c848"><strong><em> Liderança: A inteligência emocional na formação do líder de sucesso</em></strong></a><em> de Daniel Goleman, positivamente reconhecido nas temáticas que aborda.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6NyteOF2ksUe3_UNKPeX9Q.png" /></figure><h4>Significado</h4><p>Antes de mais nada, é importante taxar o que é a inteligência emocional, dado que há muita confusão em relação a isso para leitores mais superficiais do tema. O termo cunhado pelo próprio autor pode receber a definição resumida abaixo:</p><blockquote>Refere-se à capacidade de compreender, gerenciar e utilizar as emoções de maneira eficaz, tanto em relação a si mesmo quanto aos outros. Essa habilidade envolve o reconhecimento e a compreensão das próprias emoções, a capacidade de lidar com elas de maneira construtiva e a habilidade de perceber e interpretar as emoções dos outros.</blockquote><p>O significado é amplo e a execução é extremamente desafiadora. Mais do que isso, no contexto que iremos destacar neste artigo é importante entender como tal habilidade se combina com habilidades técnicas e QI (quoeficiente de inteligência). O livro destaca muito isso, indicando que, quanto mais alto o cargo da pessoa, mais capacidades de inteligência emocional são chave para um bom desempenho.</p><h4>Características principais da inteligência emocional</h4><ul><li>Autoconsciência</li><li>Autogestão</li><li>Empatia</li><li>Habilidade social</li></ul><p>Esta divisão em principais tópicos é de suma importância, visto que ajuda a isolar pontos fortes e fracos quando se faz uma auto-análise sincera de qual seu nível atual de maturidade no tema discutido. Inclusive, essa análise sincera é um dos pontos de destaque dentro do primeiro tópico acima, a autoconsciência, que se evidencia pela capacidade de entender suas limitações e quais pontos precisam ser mais trabalhados.</p><h4>Inteligência emocional aplicada à liderança</h4><p>Uma das narrativas destacadas na obra de <em>Daniel Goleman</em> é o fato de que o grande objetivo de um líder de sucesso é obter resultados. A questão é que da total inexperiência ao liderar até a entrega de resultados significativos existe um grande dúvida de como isso pode ser alcançado. Os especialistas não raramente dão conselhos baseados na experiência e conhecimento empírico. Estes, entretanto, por vezes não atingem o objetivo de desenvolver outros líderes eficazes.</p><h4>Estilos de liderança e um ponto em comum</h4><p>É importante citar que estilos de liderança diferentes podem alcançar bons resultados. Os estilos identificados pela obra são:</p><ul><li>Visionário</li><li>Treinador</li><li>Afetivo</li><li>Democrático</li><li>Modelador</li><li>Coercitivo</li></ul><p>Os estilos tendem a ser auto-explicativos, mas como a intenção do artigo é trazer reflexões e incentivar a leitura dessa obra de grande valia, vou destacar um estremo: é facilmente compreensível porque, dentro todos os estilos de liderança, o <strong>coercitivo</strong> é o menos eficaz em geral.</p><blockquote><strong>Coercitivo</strong>: uso da opressão ou da coação em determinada situação ou comportamento.</blockquote><p>É bem provável que apenas a definição já seja suficiente para entendermos o poder nocivo que este estilo de liderança pode ter sobre o clima da organização, entre os liderados, e por consequência, para os resultados.</p><p>Ainda mais relevante é entender que os líderes que alcançam os melhores resultados não costumam depender de apenas um estilo de liderança. O que isso indica? Que é possível combinar estilos de acordo com o cenário entre os liderados e também no ambiente corporativo como um todo. O livro ainda traz uma bela comparação com tacos de <em>golfe</em> dentro de uma bolsa, e que o bom jogador costuma escolher o taco certo para cada jogada.</p><p>Entretanto, uma característica se faz presente em todos os jogadores desta partida: <strong>a inteligência emocional</strong>.</p><blockquote>Segundo o estudo publicado pelo psicólogo David McClelland, da Universidade de Harvard, executivos que careciam de inteligência emocional raramente eram classificados como excepcionais em suas avaliações de desempenho e isso impactava diretamente no rendimento de suas divisões, que frequentemente desempenhavam em média 20% abaixo da meta.</blockquote><h4>Conexão</h4><p>Uma atitude latente em líderes eficientes com origem na inteligência emocional é o interesse em criar conexões com seus liderados. A interrupção de uma atividade de grande importância na sua rotina de trabalho para uma boa conversa que cria conexão com um liderado pode ser encarada como inconveniente ou enriquecedora, a segunda opção costuma ser mais importante a longo prazo.</p><p>Quando tal característica é associada ao fato de que o humor das pessoas tem impacto direto no clima organizacional é ainda mais potente. Um líder eficaz procura criar conexões de forma que as oscilações naturais de humor dos seres humanos não sejam um empecilho para uma equipe altamente produtiva. É evidente então, que é muito mais difícil compreender os momentos dos liderados quando não há conexão.</p><h4>Bases de apoio</h4><p>Um passo de suma importância para a ascensão de um líder é criar uma comunidade de apoiadores. Líderes emergentes e consagrados quando sinceramente empenhados em prol da evolução de todos podem ser de grande ajuda. É evidente a que não podemos evoluir nossas habilidades atreladas a inteligência emocional sem o contato direto com as pessoas. Pessoas em quem confiamos removem de um ambiente de laboratório de ideias o constrangimento e a preocupação com os riscos.</p><h4>Conclusão</h4><p>Saber identificar, gerenciar e utilizar a seu favor as emoções é, cada vez mais, a chave para uma liderança de sucesso! Não é nenhuma novidade que a obra usada de alicerce para as colocações deste artigo pode ser de grande ajuda no desenvolvimento de novos líderes. A reflexão crucial para líderes em ascensão e estabelecidos reside na sinceridade autêntica em relação aos seus estilos de liderança e no reconhecimento do espaço para aprimoramento.</p><p>Aqui no grupo OLX a característica da inteligência emocional é muito valorizada e observada, seja em cargos de liderança ou não. Os gestores tomam a frente em identificar pontos de melhoria correlatos e instigar a evolução. Como em todo segmento de carreira, fica ainda mais importante a evolução neste aspecto à medida que almejamos assumir mais responsabilidades, principalmente quando seu objetivo profissional inclui gerir pessoas ou exercer influência técnica sobre uma equipe ou produto. Na minha recente atuação dentro da empresa este atributo tem sido instigado sendo que até mesmo a iniciativa de consultar a obra-base deste artigo saiu de uma conversa com membros do time.</p><p>Questões desafiadoras, como identificar o estilo predominante, avaliar a maturidade em inteligência emocional e explorar maneiras de incorporar diversos estilos conforme as circunstâncias, são trampolins para o crescimento. As respostas podem ser desconfortáveis, porém, a conquista da autoconsciência se revela indispensável para a evolução.</p><p><strong>Eu me chamo Gabriel Muniz e sou Software Engineer no Grupo OLX. Será um prazer me conectar com você em alguma rede social. Adoro falar sobre tecnologia e outras amenidades como esportes </strong>🏈<strong> e doguinhos 🐶.</strong></p><p>Quer saber mais sobre nossas oportunidades? Confira nossa<strong> </strong><a href="https://vemserolxbrasil.gupy.io/"><strong>página de carreiras</strong></a><strong>!</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d10eb2a1d70b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/grupoolxtech/intelig%C3%AAncia-emocional-no-caminho-da-lideran%C3%A7a-qual-o-real-impacto-d10eb2a1d70b">Inteligência emocional no caminho da liderança: qual o real impacto?</a> was originally published in <a href="https://medium.com/grupoolxtech">Grupo OLX Tech</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Produto x Consultoria— 3 diferenças notórias no dia-a-dia de um desenvolvedor]]></title>
            <link>https://medium.com/@munizgabriel/produto-x-consultoria-3-diferen%C3%A7as-not%C3%B3rias-no-dia-a-dia-de-um-desenvolvedor-0e9a92342a57?source=rss-5d03870cd1e0------2</link>
            <guid isPermaLink="false">https://medium.com/p/0e9a92342a57</guid>
            <category><![CDATA[produtos-digitais]]></category>
            <category><![CDATA[consultoria]]></category>
            <category><![CDATA[carreira-profissional]]></category>
            <category><![CDATA[desenvolvedor]]></category>
            <dc:creator><![CDATA[Gabriel Muniz]]></dc:creator>
            <pubDate>Tue, 26 Dec 2023 21:44:59 GMT</pubDate>
            <atom:updated>2023-12-26T21:44:59.609Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*EiucrmEx0PI2ocpr" /><figcaption>Opções profissionais para um dev — consultoria ou produto?</figcaption></figure><blockquote>Para introduzir esse assunto, é importante fazer uma observação: nenhuma das atuações abaixo é mais ou menos importante do que outra, são apenas formas de atuação diferentes e ambas agregam grandes profissionais a nível técnico e organizacional.</blockquote><p>Isto posto, vamos falar um pouco sobre duas das áreas possíveis de atuação de um desenvolvedor. E aqui não estou falando sobre divisões técnicas como: backend, frontend ou mobile. Sobre esse tema até tem alguns posts relacionados no meu <a href="https://www.instagram.com/munizcodevault/">Instagram</a>. Aqui vou falar sobre duas principais formas de atuação de empresas no mercado de tecnologia e apontar as diferenças que notei no decorrer dos anos.</p><h3>Conhecimento de negócio</h3><p>Falando sobre empresas que desenvolvem os próprios produtos e apostam em investimento para que esses produtos tenham um sucesso no mercado e gerem receita, é muito importante que o desenvolvedor conheça as necessidades do negócio onde a empresa atua. Por exemplo, saber quais são os negócios ou os projetos mais importantes pra empresa naquele momento, qual produto gera mais receita e qual o grande investimento no momento para que a empresa dê um grande salto no futuro ou se mantenha estável. Para exemplificar de forma ainda mais específica, Digamos que a empresa que você atua tem produtos no setor de logística. Sendo assim, quase que por osmose você vai adquirir conhecimento no setor de logística. Entretanto, isto não significa que este conhecimento é o suficiente para você se destacar dentro da empresa e procurar um cargo de liderança. Se esse é o seu objetivo talvez seja necessário que você vá além do óbvio e procure entender iniciativas da empresa além dos escopo do seu time.</p><h3>Autonomia técnica</h3><p>Com base em minha experiência, observo que ao trabalhar em uma empresa que desenvolve seus próprios produtos, há uma maior probabilidade de se ter autonomia em decisões técnicas. Em muitos casos, é possível até mesmo participar de discussões que ultrapassam o escopo da equipe, influindo em fóruns de nível organizacional.</p><p>Por outro lado, em contextos de consultoria, vivenciei situações semelhantes, onde a equipe da consultoria é responsável por desenvolver uma feature ou melhoria necessária na aplicação. Contudo, existem equipes isoladas, que podem incluir membros de consultorias, possivelmente até da equipe em questão, mas que são gerenciadas por funcionários internos da empresa. Esses membros internos tendem a se envolver mais profundamente em decisões técnicas, como arquitetura e escolha de tecnologias a serem utilizadas.</p><p>É claro que mesmo um grande estigma de uma organização pode ser quebrado e as decisões podem ficar acessíveis a mais pessoas, o que vejo porém, é que em cenários de consultoria o caminho a ser percorrido até que um desenvolvedor tenha maior influência em grande escopo em geral é mais longo.</p><p>Essas distintas dinâmicas destacam a diferença de autonomia entre ambientes de desenvolvimento interno e de consultoria, evidenciando como a participação em decisões técnicas pode variar significativamente conforme o contexto organizacional.</p><h3>Gestão do tempo</h3><p>Outro aspecto que, com base em minha experiência, difere consideravelmente nas consultorias é a gestão do tempo, que tende a ser menos flexível. Isso significa que você trabalhará mais ou menos horas? Evidentemente que não! Isso varia muito de cenário para cenário. O que eu quero destacar aqui é que, em consultorias, muitas vezes, o seu trabalho é vendido por hora; portanto, o controle tende a ser mais detalhado. Em um cenário de desenvolvimento de produtos, o foco principal é que o software seja entregue dentro do prazo, conforme as especificações e com os objetivos de negócios atendidos como esperado, resultando na receita estimada sendo alcançada. Portanto, é <strong>possível</strong> que a gestão de horas trabalhadas seja mais flexível.</p><p><strong>Isso absolutamente não é uma regra, já atuei em uma empresa de produtos onde era necessário fazer o apontamento de horas em dois softwares diferentes e ambos precisavam ser mantidos rigorosamente iguais.</strong></p><h3>Conclusão</h3><p>As duas vertentes de trabalho são de extrema importância para o mercado de tecnologia e tem em seus meandros algumas diferenças bem interessantes que podem casar com o perfil profissional e objetivos de alguém mais do que com outro. A ideia de apontar as diferenças tem dois objetivos:</p><ul><li>Contar a minha experiência e estimular outros a falar das suas, visto que devem existir cenários que vão completamente na contramão do que eu vivi até hoje;</li><li>Dar uma prévia para desenvolvedores que tiveram experiência apenas em um dos lados da moeda, talvez dando <em>insights</em> legais para o seu futuro.</li></ul><p>Com o intuito de manter o artigo curto e não tedioso listei apenas 3 aspectos, porém tenho alguns outros em mente, então é provável que haja parte 2. Alertas e correções são sempre bem-vindos. Suas experiências mais ainda, obrigado por ler.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0e9a92342a57" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Desenvolvimento Mobile: Duas diferenças que um desenvolvedor de outra área gostaria de conhecer]]></title>
            <link>https://medium.com/@munizgabriel/desenvolvimento-mobile-duas-diferen%C3%A7as-que-um-desenvolvedor-de-outra-%C3%A1rea-gostaria-de-conhecer-2c5a2a28ea36?source=rss-5d03870cd1e0------2</link>
            <guid isPermaLink="false">https://medium.com/p/2c5a2a28ea36</guid>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[mobile-apps]]></category>
            <dc:creator><![CDATA[Gabriel Muniz]]></dc:creator>
            <pubDate>Sun, 08 Oct 2023 05:47:21 GMT</pubDate>
            <atom:updated>2023-10-08T05:47:21.669Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LQtKmVt10K_R644y12jaVg.jpeg" /></figure><p>No cenário de desenvolvimento de software, o mundo mobile é uma jornada desafiadora que atrai cada vez mais desenvolvedores a cada dia que passa. Com a crescente ubiquidade dos dispositivos móveis, criar aplicativos para plataformas como Android e iOS tornou-se uma habilidade altamente valorizada e um campo fértil para inovação tecnológica.</p><p>O foco desse artigo é falar com quem já tem experiência no desenvolvimento de software em alguma outra ponta dos sistemas, seja <em>frontend web</em> ou <em>backend</em>. Portanto, se você está iniciando na área e já pretende engrenar no mobile talvez alguns tópicos não fiquem claros para você.</p><p>Nos anos que atuo no desenvolvimento de software já atuei durante um bom tempo como dev Android e também backend (as vezes nas duas frentes paralelamente). Neste período percebi que há algumas diferenças tecnológicas e de processo muito comuns que talvez um desenvolvedor que esteja pensando em estudar alguma tecnologia mobile não saiba e que são de suma importância. Sem mais delongas, vamos a elas:</p><h3><strong>1. Publicação em produção</strong></h3><p>É o primeiro item aqui justamente porque vejo que é a questão mais recorrente que custa a ser entendida nas integrações entre times mobile e outros que são especializados em backend ou outras coisas.</p><p><strong>De modo muito superficial</strong> o fluxo de publicação em produção de um software moderno é algo como:</p><ul><li>Escreve código -&gt; publica em ambiente de testes -&gt; realiza testes e correções -&gt; publica <em>software</em> em produção -&gt; <em>Finish</em></li></ul><p>Já no caso da publicação de apps móveis seria mais ou menos isso para um app que seja coordenado para lançamentos faseados (prática bem comum).</p><ul><li>Escreve código -&gt; lança versão para testes -&gt; realiza testes e correções -&gt; publica versão em produção para uma parte da bases de usuários -&gt; aguarda aprovação da loja de aplicativos -&gt; verifica se não houve algum novo <em>crash</em> ou problema crítico -&gt; aumenta a porcentagem de usuários que receberão a nova versão -&gt; segue acompanhando -&gt; publica para toda a base de usuários -&gt; <em>Finish</em></li></ul><p>Além desses passos a mais também depende em geral de que os usuários permitam que a nova versão seja instalada no seu <em>device</em>, ou é necessário que o update seja forçado para que todos recebem, ainda assim depende de configurações dos dispositivos. Isso implica em pensar muito bem os lançamentos e repensar muito funcionalidades com informações fixas, porque uma mudança de url pode significar uma nova versão e esse fluxo todo se iniciando por descuido.</p><h3>2. Preocupação do diferentes dispositivos</h3><p>Indiferentemente de plataforma, seu aplicativo móvel vai ser executado em dispositivos com diferentes tamanhos de tela, versões do Sistema Operacional e com diferentes configurações de <em>hardware</em>. Evidentemente que nesse caso se você for para o lado do Android isso é ainda mais abrangente.</p><p>Quando trabalha com <em>backend</em> os clientes acessam seus recursos através de alguma forma de exposição dos seus serviços, seja <em>cloud</em> ou <em>on premise</em>. Uma consequência disso é que fica na sua mão ou do seu time/empresa o controle do ambiente onde o código é executado. Já no desenvolvimento mobile isso não é uma verdade, fazendo com que você precise pensar mais em:</p><ul><li>Compatibilidade de bibliotecas com as versões do S.O;</li><li>Configurações remotas do aplicativo (ex: <em>remote config</em> ou <em>feature flags </em>no próprio <em>backend</em>);</li><li>Compatibilidade das suas interfaces com o usuário com diferentes tamanhos e resoluções de tela.</li></ul><p>É evidente que para todos esses pontos existem ferramentas e bibliotecas que ajudam o desenvolvedor, a questão é que algumas preocupações vem acompanhando a nova ponta do <em>software</em> na qual você atua.</p><p>Esses são apenas dois pontos que vejo nos anos trabalhando com olho nos dois espectros. Existem muitos mais, comenta aqui quais você percebe e me segue no <a href="http://instagram.com/munizcodevault">instagram</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2c5a2a28ea36" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Bem começado, metade feito — recebendo bem um colega de time — parte 2]]></title>
            <link>https://medium.com/@munizgabriel/bem-come%C3%A7ado-metade-feito-recebendo-bem-um-colega-de-time-parte-2-807a91727a16?source=rss-5d03870cd1e0------2</link>
            <guid isPermaLink="false">https://medium.com/p/807a91727a16</guid>
            <category><![CDATA[team-collaboration]]></category>
            <category><![CDATA[teamwork]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Gabriel Muniz]]></dc:creator>
            <pubDate>Fri, 07 Jul 2023 04:13:52 GMT</pubDate>
            <atom:updated>2023-07-07T04:13:52.773Z</atom:updated>
            <content:encoded><![CDATA[<h3>Bem começado, metade feito — recebendo bem um colega de time — parte 2</h3><p>Esta é a parte dois de um artigo que já escrevi há algum tempo. Decidi escrever uma continuação porque recentemente mudei de empresa e de equipe. Nesta nova equipe eu fui muito bem recebido e decidi anotar alguns pontos que achei muito interessantes da parte deles. Muitos desses pontos podem ser naturais ou pensados, mas fizeram muita diferença no meu onboarding.</p><h3><strong>Fale do passado</strong></h3><p>Para quem está começando em um novo time, principalmente quando se trata de um negócio com o qual a pessoa ainda não teve contato, é muito importante saber o que aconteceu no passado da equipe ou do produto no qual se está trabalhando. A ideia não é que você conte todo o histórico dos últimos anos ou décadas (em caso de empresas ou produtos mais antigos). Porém, é importante avaliar quanto de contexto é necessário para que a nova pessoa possa começar a desenvolver o seu trabalho de uma forma consciente. Normalmente na área técnica, grandes decisões ou mudanças de estratégia da empresa vem acompanhadas de impacto no código, na arquitetura ou na organização dos times. Explicar por que certas coisas funcionam de certa maneira pode ser muito útil.</p><p><strong>Importante: não se prenda a cada mínimo detalhe, procure deixar o novo integrante do time a vontade o suficiente para que, se você esquecer de algo, ele mesmo questione.</strong></p><h3><strong>Mantenha um ambiente leve</strong></h3><p>É normal passar por momentos de pressão no trabalho e começar em um novo time pode causar grande apreensão. É por isso que um bom ambiente dentro do time pode ser muito importante para quem está chegando. Normalmente, isso faz com que a pessoa se sinta mais à vontade para dar suas opiniões, tirar dúvidas e com certeza a torna mais engajada e produtiva.</p><h3><strong>Faça elogios</strong></h3><p>Todo novo membro de um time passa por um período de adaptação e é muito natural que neste momento a pessoa esteja mais focada em ouvir do que compartilhar, mais em obter contexto do que dar suas sugestões, mesmo que tenha uma boa bagagem. Por isso, tente observar os pontos positivos do seu novo colega de time e comente isso com ele.</p><p>Um detalhe que considero importante: mesmo em pequenas entregas iniciais que seu novo colega fizer, fale do que gostou e seja positivo, ainda que você saiba que ele tem experiência para entregar muito mais num futuro próximo.</p><p>É claro que feedbacks construtivos serão muito importantes e devem ser dados com clareza, mas notar e falar sobre pontos fortes trará um grande ganho, até mesmo na confiança do seu colega nesse novo contexto.</p><h3>Peça feedbacks</h3><p><strong>Observação: eu gostaria de ter encontrado outra palavra para usar aqui, já que sabemos que a palavra <em>feedback</em> é uma das figurinhas carimbadas do <em>corporativês</em> que é motivo de piada na internet, e que eu particularmente acho bem engraçado. Mas não encontrei, então vamos lá.</strong></p><p>Na parte um deste artigo eu falei sobre como achava bem importante que os colegas mais antigos no time fossem acessíveis. Vejo que parte disso é por deixar muito claro que você tem pontos fortes e fracos e que todos estão no mesmo barco. Não vejo forma melhor de fazer isso do que pedir que seu novo colega fale sobre o que acha da sua atuação assim que se sentir confortável para tal. Não pressione, mas comente que gostaria de saber como ele vê o seu trabalho e se existe algo que você poderia melhorar em qualquer aspecto, inclusive na ajuda a novas pessoas.</p><p>Certamente existem muitas outras coisas a se fazer quando se recebe um novo integrante na equipe, e talvez bem mais importantes do que as que comentei nestes dois artigos. Estes são apenas aspectos que <strong>me</strong> ajudaram e eu gostaria de replicar com outros.</p><p>O que mais você acha importante? Conta pra mim.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=807a91727a16" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Fuja do hype, abrace a inovação]]></title>
            <link>https://medium.com/@munizgabriel/fuja-do-hype-abrace-a-inova%C3%A7%C3%A3o-9a28ca1ca16?source=rss-5d03870cd1e0------2</link>
            <guid isPermaLink="false">https://medium.com/p/9a28ca1ca16</guid>
            <category><![CDATA[inovação]]></category>
            <category><![CDATA[early-adopter]]></category>
            <category><![CDATA[engenharia-de-software]]></category>
            <dc:creator><![CDATA[Gabriel Muniz]]></dc:creator>
            <pubDate>Tue, 28 Mar 2023 16:02:02 GMT</pubDate>
            <atom:updated>2023-03-28T16:02:41.879Z</atom:updated>
            <content:encoded><![CDATA[<p>A Engenharia de Software tem evoluído num passo acelerado há muitos anos. Isso tem trazido rentabilidade, maior qualidade de vida e entretenimento aos seus consumidores-alvo. Nessa linha, é muito comum que quem atua na área de tecnologia tenha um grande apego a tecnologias novas no mercado, em qualquer setor. Essa é sempre uma boa ideia? A resposta é a padrão: depende. É sobre isso que comentarei neste artigo, através de 5 perguntas que entendo serem relevantes.</p><h3>É necessário?</h3><p>Toda nova tecnologia, framework ou biblioteca tem prós e contras. Você vai casar com os prós, mas está pronto para casar com os contras? Está apto a entender como mitiga-los? Por isso é de grande importância saber se é realmente necessária a aplicação de uma nova forma de resolver um problema. Pode ser que um método já conhecido, estável e fácil de implementar seja mais do que suficiente.</p><h3>É confiável?</h3><p>Tecnologias emergentes são realmente empolgantes! Mas é importante frisar que algumas delas não tem uma longa vida. Um exemplo que pode ilustrar isso é o do AngularJS (<em>a Superheroic JavaScript MVW Framework</em>, segundo seu próprio site oficial). A famosa pesquisa anual de tecnologias mantida pelo <a href="https://survey.stackoverflow.co/2022/">StackOverflow</a> traz dados interessantes sobre ele. Note as imagens abaixo.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*D4uSklOq1ZGyAQXCVKTZ1w.png" /><figcaption>Tecnologias mais populares — 2016</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_G6lrLmxTfdvISNNfEUwdA.png" /><figcaption>Web Frameworks mais populares — 2022</figcaption></figure><p>Percebeu? O <em>Angular.js</em> aparece em posições muito diferentes nesse intervalo de seis anos, caindo muito. Além disso, o contexto nos ajuda a perceber que boa parte dessa utilização se deve a manutenção de legados. Um índice complementar pode nos ajudar:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ebhOAGQ0ak7o0hM-66BRRw.png" /><figcaption>Web Framework mais amado vs. mais temido</figcaption></figure><p>Note que este gráfico mostra que 78,99% dos desenvolvedores temem o framework, enquanto apenas 21,01% amam. Não é a toa que a legenda do gráfico aparece logo abaixo dele no screenshot, ele realmente é o pior avaliado na relação amor/medo. Uma possível relação de causa e efeito pode ser estabelecida pelo próprio <em>Google</em> te-lo descontinuado e criado uma nova ferramenta totalmente diferente, mesmo que tenha um nome semelhante (o que lembro de ter causado estranheza na época).</p><p>Em suma, talvez boa parte dos sistemas que adotaram ferrenhamente a tecnologia tem um legado desagradável para manter ou até mesmo já investiram na reescrita deles utilizando outras ferramentas. Será que uma avaliação mais criteriosa poderia ter impedido isso? É interessante refletir no assunto.</p><h3>Qual o custo?</h3><p>Neste ponto não destaco apenas o custo financeiro, que obviamente é um fator quando você pensa em inovar. Mas um custo que não pode ser negligenciado é o tempo para que sua equipe possa tomar posse de maior conhecimento da tecnologia adotada e entender profundamente quais as melhores abordagens e estruturas para certa tecnologia.</p><p><strong>Se esse tempo não for investido, mesmo uma grande ideia pode virar sucata ou algo ainda pior</strong></p><h3>Qual a abordagem?</h3><p>É possível que a nova tecnologia coexista de forma fácil com as ferramentas já existentes dentro da sua empresa? Caso não seja o caso, qual a complexidade de tornar isso possível? É necessário descartar um grande volume de trabalho já feito para que a nova tecnologia seja encaixada no quebra-cabeças? Isso se paga? Há justificativas técnicas para tal?</p><p>Um exemplo que pode ser de ajuda é o do desenvolvimento Android. Há algum tempo os desenvolvedores utilizavam a linguagem Java para desenvolvimento de aplicativos para o Sistema Operacional do <em>Google</em>. Mas em 2017 a Google anunciou o suporte ao <em>Kotlin</em> para as aplicações <em>Android</em>. Infelizmente, muitos devs (por certa má vontade ou desinformação) achavam que precisariam jogar fora aplicações inteiras ou reescrever tudo para que fosse possível aproveitar os benefícios da linguagem. Uma rápida leitura na <a href="https://kotlinlang.org">documentação</a> já seria suficiente para entender que as linguagens poderiam coexistir e interagir entre si de forma simples. Em 2018 foi até mesmo publicado um <a href="https://developer.android.com/kotlin/interop?hl=pt-br">guia de interoperabilidade</a> entre as linguagens na documentação do Android.</p><p>Este é um caso que em geral trouxe muito mais prós do que contras. Caso fosse diferente, uma má estratégia poderia trazer muitos problemas.</p><h3>Seu time compra a ideia?</h3><blockquote>A tecnologia vai reinventar o negócio mas as relações humanas continuarão a ser a chave para o sucesso. — Stephen Covey</blockquote><p>A frase acima, do autor de <strong>Os Sete Hábitos das Pessoas Altamente Eficazes </strong>define bem a importância desse tópico. Toda e qualquer grande decisão, inclusive técnica, vai precisar de apoio do time para que possa ser colocada em prática e ter sucesso. Seu time compra a ideia e entende que os prós são valiosos em relação aos contras? Excelente! Você vai ter apoio deles. Não é o caso? Analise os porquês. Será que não entenderam a fundo a necessidade? Será que eles estão adotando um ponto de vista mais conservador pelo histórico do sistema ou da empresa? Talvez eles apenas estão tendo uma visão mais realista que você do problema a ser resolvido. Responder a essas perguntas de forma sincera é bem importante para chegar ao melhor resultado possível.</p><h3>Conclusão</h3><p>Ser inovador e investir em novas ferramentas é inspirador, mas como toda decisão precisa ser tomada de forma consciente e fria. Isso é importante para não sufocar ideias excelentes e não criar um grande <em>Frankenstein</em> para o seu time ter que cuidar depois.</p><p>Há muito mais pontos que pessoas com ampla experiência podem trazer sobre o assunto e por isso a melhor forma de aprender é estar aberto a isso.</p><p>Fique à vontade para apontar falhas no texto ou questionar opiniões!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9a28ca1ca16" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Kotlin para Javeiros — Extension Methods]]></title>
            <link>https://medium.com/@munizgabriel/kotlin-para-javeiros-extension-methods-16d9ae2b6645?source=rss-5d03870cd1e0------2</link>
            <guid isPermaLink="false">https://medium.com/p/16d9ae2b6645</guid>
            <category><![CDATA[java]]></category>
            <category><![CDATA[c-sharp-programming]]></category>
            <category><![CDATA[kotlin]]></category>
            <category><![CDATA[extension-method]]></category>
            <dc:creator><![CDATA[Gabriel Muniz]]></dc:creator>
            <pubDate>Fri, 20 Jan 2023 22:21:07 GMT</pubDate>
            <atom:updated>2023-01-22T05:16:49.641Z</atom:updated>
            <content:encoded><![CDATA[<h3>Kotlin para Javeiros — Extension Methods</h3><p>Seguindo com mais um recurso de Kotlin para desenvolvedores Java, o primeiro post já tem algum tempo e você pode ler <a href="https://medium.com/@munizgabriel/kotlin-para-javeiros-4-recursos-que-você-vai-gostar-51bbefad2f4a">aqui</a>.</p><h3>Extension Methods</h3><p>Se você já mexeu em algum momento com C#, que como muitas linguagens C-Like não tem grande curva de aprendizagem, já viu isso, então vamos lá.</p><p>Os métodos de extensão são bem auto-explicativos, eles adicionam funções a classes que originalmente não as tem. Considere o cenário onde pegamos as informações de um produto de certa fonte de dados, talvez uma API, e precisamos converter de forma fácil. Aqui o método <em>getProduct</em> da classe <em>ProductDataSource</em> fará o papel de retornar esses dados sem tratamento.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/baa2f78e0249ccfde090b066de381d48/href">https://medium.com/media/baa2f78e0249ccfde090b066de381d48/href</a></iframe><p>Note o código abaixo, nele fazemos a conversão do <em>response</em> para uma entidade e formatamos o campo <em>titleAndDescription</em> da forma esperada.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/41597121cb86a865479dcbcb83194256/href">https://medium.com/media/41597121cb86a865479dcbcb83194256/href</a></iframe><p>O método de extensão toEntity nos ajuda a fazer isso usando o modelo:</p><blockquote>modificador de acesso (opcional) + tipo a ser extendido + . + nome da função</blockquote><p>Dessa forma a chamada para o método na linha 14 acontece como se a classe contivesse essa função em si. Note que a extensão pode receber um modificador de acesso, aqui private, tornando-a acessível apenas no contexto da classe.</p><p>Importante citar que para acessar as propriedades do objeto no qual o <em>extension method</em> foi chamado usamos o <strong><em>this</em>, </strong>o que pode ser mais necessário quando o código do método for mais complexo<em>. </em>Caso não seja, como vimos no exemplo acima, pode ser omitido.</p><p>Abaixo o método de teste validando o formato dos dados:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/d85e96f0979e444a42886f327a9274c8/href">https://medium.com/media/d85e96f0979e444a42886f327a9274c8/href</a></iframe><blockquote><strong>Um ponto de atenção é que trata-se de um exemplo simples pra demonstrar a feature, com um olhar minimamente crítico dá pra ver que essa conversão não seria facilmente testável enquanto unidade já que está privada e é chamada internamente no código do método getProduct</strong></blockquote><p>Algo muito comum em projetos escritos em Kotlin é criar arquivos específicos para extensões de um mesmo tipo.</p><p>Em <em>C#</em>, por exemplo, essa funcionalidade é disponibilizada utilizando a palavra reservada <strong><em>this</em></strong> no último parâmetro do método. A forma da escrita do código é trivial, o que realmente é legal é a flexibilidade que isso pode dar, isolando pequenas tarefas e facilitando a implementação rápida de uma função numa classe pré-existente.</p><p>Se eu dei alguma canelada nesse artigo (o que é bem provável) por favor me corrija, e obrigado por ler.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=16d9ae2b6645" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[E quando parece que não há desafios técnicos? A saga de fazer o óbvio bem feito]]></title>
            <link>https://medium.com/@munizgabriel/e-quando-n%C3%A3o-h%C3%A1-desafios-t%C3%A9cnicos-a-saga-de-fazer-o-%C3%B3bvio-bem-feito-23f8fa9fdeda?source=rss-5d03870cd1e0------2</link>
            <guid isPermaLink="false">https://medium.com/p/23f8fa9fdeda</guid>
            <category><![CDATA[desenvolvimento-pessoal]]></category>
            <category><![CDATA[tech-challenge]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Gabriel Muniz]]></dc:creator>
            <pubDate>Fri, 16 Sep 2022 21:11:56 GMT</pubDate>
            <atom:updated>2022-09-16T21:23:31.464Z</atom:updated>
            <content:encoded><![CDATA[<p>Primeiro <em>disclaimer</em> que eu gostaria de fazer aqui é que estou longe de querer ditar ou influenciar você a agir de forma x ou y em qualquer situação. Vou comentar como tenho lidado nesses anos de trabalho com o contexto destacado no título. Inclusive vejo que outras pessoas em contexto semelhante ao meu se saíram muito melhor e procurei extrair algo de bom delas. Parênteses feitos, vamos lá.</p><p>Algo que vejo com muita frequência na área de tecnologia, sobre tudo entre os desenvolvedores, é que boa parte da motivação em seguir buscando especialização e se aprofundando cada vez mais na área é usar a tecnologia para resolver problemas realmente complexos. Entender coisas profundas de um sistema de larga escala e utilizar novos conceitos para resolver problemas é de fato algo muito empolgante. Tenho certeza que o olho de boa parte dos devs que está lendo brilhou quando lhe foi apresentado AQUELE projeto e a temática principal era como escalar, como desenvolver, como estabilizar e como entregar com qualidade um sistema de forma automatizada e moderna. Eu mesmo já me empolguei mesmo sabendo que é só um exemplo fictício.</p><p>E quando a conversa é outra? Talvez você mesmo já deu aquela dispersada quando o foco do seu projeto ou equipe durante algum tempo era apenas entender uma necessidade de negócio e atende-la de maneira simples, sem muito glamour. Pegar a funcionalidade e expandi-la para permitir o acréscimo de um fluxo alternativo, uma integração a mais ou só para que o usuário no fim tivesse mais detalhes ou mais conforto. A nível técnico você não foi muito exigido, a solução era óbvia. Bastava implementar e aparar arestas. Nessa posição, sua reação vai depender do que você presa mais, é claro. Aqui vou partir da premissa que seu pensamento está alinhado com o parágrafo inicial, você tem sangue no olho quando desafiado tecnicamente. Isto posto, você pode se fazer algumas perguntas cujas respostas vão te ajudar a fazer o melhor trabalho possível naquele contexto.</p><h3>A base é de qualidade?</h3><p>O coração de todo sistema é sua funcionalidade, suas regras, seus comportamentos. E tudo isso é código. Por isso, uma ideia é analisar se essa base de código está executando todo o necessário da melhor forma possível ou existe margem para evolução. É importante ser cauteloso nesta análise. No dia-a-dia você vai perceber pontos de melhoria, o que não significa que você poderá simplesmente começar a trabalhar nesses pontos, mas mantenha eles no radar. Saiba escolher suas batalhas e, sempre que possível, use a regra de escoteiro.</p><h3>As limitações são realmente intransponíveis?</h3><p>Uma ideia é analisar se as limitações técnicas do projeto ou time realmente são realmente linhas que não podem ser movidas. Talvez seja possível entender com pessoas-chave se certa iniciativa para melhorias técnicas já foram tomadas no passado, se foram descartadas por algum motivo específico ou se você pode sugerir novas coisas. Mesmo em cenários onde a necessidade de grandes tarefas técnicas parece não existir, algumas práticas podem ser adotadas para o melhor desenvolvimento do próprio time, tanto na escrita do código, revisão ou entrega.</p><h3>Estou sendo megalomaníaco?</h3><p>Ambientes onde fazer o básico de forma eficiente é todo o esperado podem despertar em você a necessidade de fazer coisas simples de forma mais complexa, mesmo que essa não seja a melhor escolha. Criar grandes estruturas para satisfazer sua necessidade de se desafiar pode se provar um grande erro. Por isso, talvez seja mais interessante analisar a cada acréscimo no seu sistema se esse instinto não está servindo apenas para criar um legado mais complexo que futuramente pode apenas levar a mais tempo de manutenção e menor produtividade. Um exemplo disso é utilizar muitos <em>patterns</em> sem saber qual o grande ganho nisso. Lembre-se: Keep It Simple Stupid!</p><h3>Como andam meus planos de estudo?</h3><p>É evidente que quando você precisa aprender coisas novas e aplica-las diretamente no seu ganha pão, no seu trabalho, seu desenvolvimento provavelmente será mais veloz. E isso é fantástico! Entretanto, no cenário que estamos considerando isso talvez não seja uma grande necessidade. É aí que pode ser ainda mais útil você se manter ativo em buscar novos conhecimentos e tentar aplica-los na prática, mesmo que seja em projetos pessoais, contribuindo com projetos <em>open source</em> ou mesmo aproveitando aquele <em>freela</em> que apareceu do nada.</p><h3>Conclusão</h3><p>Como mencionado no início, essas são algumas coisas que eu passei a fazer com o decorrer do tempo quando me via em contextos semelhantes a este. O que absolutamente não torna nada um mar de rosas, mas me ajudou a me sentir melhor. A frustração de se ver em um cenário que você não gostaria não vai desaparecer magicamente, mas pode ser melhor administrada para que você tome boas decisões e siga fazendo o melhor trabalho possível.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=23f8fa9fdeda" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Coroutines — conceitos base que provavelmente você não deu atenção]]></title>
            <link>https://medium.com/@munizgabriel/coroutines-conceitos-base-que-provavelmente-voc%C3%AA-n%C3%A3o-deu-aten%C3%A7%C3%A3o-98a435299d98?source=rss-5d03870cd1e0------2</link>
            <guid isPermaLink="false">https://medium.com/p/98a435299d98</guid>
            <category><![CDATA[android]]></category>
            <category><![CDATA[kotlin-coroutines]]></category>
            <dc:creator><![CDATA[Gabriel Muniz]]></dc:creator>
            <pubDate>Mon, 08 Aug 2022 18:55:26 GMT</pubDate>
            <atom:updated>2022-08-08T19:24:33.151Z</atom:updated>
            <content:encoded><![CDATA[<h3>Coroutines — conceitos base que provavelmente você não deu atenção</h3><p><a href="https://developer.android.com/kotlin/coroutines">Kotlin Coroutines</a> é, já há algum tempo, um tema bem comum para desenvolvedores Android. Traz uma forma mais simplificada e limpa para lidar com rotinas assíncronas.</p><p>Para dar contexto é importante lembrar que esta é uma temática de suma importância no contexto mobile, visto que não podemos travar completamente a tela do usuário e suas interações quando precisarmos executar uma rotina em segundo plano.</p><p>É evidente que o primeiro contato com um código já escrito ou a criação do seu primeiro fluxo que utilize a biblioteca vai ser com a utilização do método <em>launch</em> ou <em>withContext</em>, uma <em>suspend function</em> e setando algum escopo para executar a função definida. Aqui vamos definir de forma simples alguns conceitos envolvidos.</p><h3><strong>Coroutine Scopes</strong></h3><p>O escopo é um conceito que ajuda a gerenciar a execução das coroutines. Define que ciclo de vida elas devem seguir com base no seu fluxo para o aplicativo. Seguem os dois principais:</p><ul><li>ViewModelScope: pode ser acessado numa <em>viewModel</em> usando a propriedade <em>viewModelScope</em> e é limpa quando a <em>viewModel</em> for limpa;</li><li>LifecycleScope: é cancelado por padrão quando o lifecycle é destruído;</li></ul><h3>Job</h3><p>Nada mais é que um gerenciador de coroutine. Cada coroutine criada retorna uma instância de job para um escopo.</p><h3>Dispatcher</h3><p>Como se pode presumir pelo nome despacha o job para a linha de execução correta, sendo elas:</p><ul><li><em>Dispatchers.Main</em>: usado para execuções rápidas que estejam atreladas a UI;</li><li><em>Dispatchers.IO</em>: feito para tarefas como escrita/leitura em disco ou operação de rede;</li><li><em>Dispatchers.Default</em>: trabalho intensivo de CPU que não permaneça muito tempo em espera (<em>sleep</em>)</li></ul><h3>TestDispatchers</h3><p>Nome bem intuitivo de uma implementação de <em>CoroutineDispatcher</em> para testes. Dá a possibilidade de executar na sua suite de testes as tão honoráveis <em>suspend functions </em>através do método <em>runTest</em>. Mais ou menos como destacado abaixo.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ac801b87b3ee4f43798afe7db62b0e23/href">https://medium.com/media/ac801b87b3ee4f43798afe7db62b0e23/href</a></iframe><p>Mais sobre os tipos de TestDispatchers você pode encontrar na <a href="https://developer.android.com/kotlin/coroutines/test">documentação</a>.</p><h3>Conclusão</h3><p>É claro que aqui apenas arranhamos a superfície. Além disso, você ainda vai encontrar bibliotecas como <em>RxJava</em> sendo utilizadas para operações assíncronas em muitos projetos. Também vai perceber que entender as bases de qualquer tecnologia ajuda muito a perceber <em>gaps</em> e possíveis melhorias em qualquer implementação.</p><p>Sobre <em>RxJava</em> li <a href="https://blog.danlew.net/2021/01/28/rxjava-vs-coroutines/">um artigo</a> bem interessante recentemente com uma comparação simplificada, vale a leitura.</p><p>Eu gosto bastante de <em>coroutines</em>, acho que tem uma cara muito familiar para quem já trabalha com <em>kotlin</em> e mantém seu viés de simplicidade, além de ter uma documentação abrangente. Também acho interessante fugir de uma pilha grande de <em>callbacks</em> que outras bibliotecas costumam trazer.</p><p>Deixo o espaço aberto para opiniões e também correções (sempre acabamos deixando inconsistências e equívocos aqui e ali).</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=98a435299d98" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Design Patterns — Template Method]]></title>
            <link>https://medium.com/@munizgabriel/design-patterns-template-method-e032688d3ef?source=rss-5d03870cd1e0------2</link>
            <guid isPermaLink="false">https://medium.com/p/e032688d3ef</guid>
            <category><![CDATA[design-patterns]]></category>
            <category><![CDATA[template-method-pattern]]></category>
            <dc:creator><![CDATA[Gabriel Muniz]]></dc:creator>
            <pubDate>Fri, 13 May 2022 18:48:18 GMT</pubDate>
            <atom:updated>2022-05-17T17:53:50.422Z</atom:updated>
            <content:encoded><![CDATA[<p>Dando sequência a um <a href="https://medium.com/@munizgabriel/design-patterns-builder-6637a562b6cf">post anterior</a> onde dou uma pincelada no conceito de design patterns e cito um exemplo de utilização do padrão builder, vamos com esse padrão legal e simples.</p><h3>Objetivo</h3><p>Esse padrão busca fornecer uma casca, ou “rascunho” para uma implementação, criando comportamentos na classe template que podem ser aplicáveis a todos os cenários e deixando outros por responsabilidade de quem a implementar.</p><h3>Exemplo</h3><p>Para explicar o funcionamento deste padrão podemos usar um exemplo.</p><p>Digamos que uma num sistema bancário você vai tratar um fluxo que faz pagamentos de diversas formas: pix, boleto, TED e etc.</p><p>Não é bem assim que a banda toca na vida real, mas para exemplificar, digamos que em todos esses meios de pagamento existe uma função que é exatamente igual para todos e outras que dependem muito da forma de pagamento escolhida, como criar um mecanismo legal pra isso?</p><p>Neste exemplo, vamos considerar que o método que pode ser reaproveitado entre os meios de pagamento é o de debitar o saldo de quem está pagando (<em>DecreaseBalance</em>), os demais vão ser com base na forma escolhida.</p><p>Pensando nisso, note o código abaixo:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/add3c52f44930e4bf48ba22a6a749b40/href">https://medium.com/media/add3c52f44930e4bf48ba22a6a749b40/href</a></iframe><p>Veja, no primeiro bloco de código criamos uma classe abstrata que possui dois métodos abstratos, ou seja, precisarão que uma classe concreta extenda deles e crie seu comportamento. Já o método <em>DecreaseBalance</em> não é abstrato e possui uma implementação padrão.</p><p>Note também que o método Execute agrupa as chamadas necessárias neste fluxo.</p><p>No segundo bloco, podemos ver a classe <em>ExecutePixPayment</em> herdando da classe abstrata e implementando o comportamento dos métodos <em>TransferValue</em> e <em>NotifyReceiver</em>.</p><p>No terceiro bloco podemos ver a classe Program executando o método <em>Execute</em>, e abaixo a sequência da execução dos métodos conforme o esperado.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/395/1*NJ-m0LwYCWgoboyhAgx4jA.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e032688d3ef" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Design Patterns — Builder]]></title>
            <link>https://medium.com/@munizgabriel/design-patterns-builder-6637a562b6cf?source=rss-5d03870cd1e0------2</link>
            <guid isPermaLink="false">https://medium.com/p/6637a562b6cf</guid>
            <category><![CDATA[csharp]]></category>
            <category><![CDATA[design-patterns]]></category>
            <dc:creator><![CDATA[Gabriel Muniz]]></dc:creator>
            <pubDate>Fri, 29 Apr 2022 20:05:05 GMT</pubDate>
            <atom:updated>2022-05-14T03:17:32.210Z</atom:updated>
            <content:encoded><![CDATA[<p>Os <strong>padrões de projetos</strong> nada mais são que formas comprovadamente válidas para solucionar problemas recorrentes dentro do universo do desenvolvimento de software.</p><p>Podemos dividir estes padrões em vários escopos, tais como: padrão <strong>criacional, estrutural e comportamental</strong>. Mais detalhes sobre a definição de GoF podem ser encontrados no livro <a href="https://www.amazon.com.br/Padr%C3%B5es-Projetos-Solu%C3%A7%C3%B5es-Reutiliz%C3%A1veis-Orientados/dp/8573076100/ref=asc_df_8573076100/?tag=googleshopp00-20&amp;linkCode=df0&amp;hvadid=379748659420&amp;hvpos=&amp;hvnetw=g&amp;hvrand=15794873810218774625&amp;hvpone=&amp;hvptwo=&amp;hvqmt=&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=1001698&amp;hvtargid=pla-812887614857&amp;psc=1"><em>Padrões de Design: Elementos de Software Orientado a Objetos Reutilizáveis</em></a><em> (Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides)</em>. Entrando primariamente nos padrões criacionais temos um padrão muito útil e que nos auxilia a tornar nosso código facilmente testável. Vamos a um rápido exemplo de aplicação do padrão builder.</p><h3>Builder Pattern</h3><p>O padrão <em>builder</em> auxilia o desenvolvedor (como o próprio nome sugere) na criação de objetos complexos <em>step by step</em>, ou propriedade a propriedade. Vejamos um problema claro que pode ser resolvido através do padrão:</p><pre>public class User<br>    {<br>        private string PASSWORD_PATTERN = &quot;[0-9]+&quot;;</pre><pre>        public Guid Id { get; }<br>        public string UserName { get; set; }<br>        public string FullName { get; set; }<br>        public Profile Profile { get; set; }<br>        public string Password { get; set; }</pre><pre>        public User(string userName, string fullName, string password, Profile profile)<br>        {<br>            if (IsValid(userName, fullName, password, profile))<br>            {<br>                Id = Guid.NewGuid();<br>                UserName = userName;<br>                FullName = fullName;<br>                Password = password.ToMd5();<br>                Profile = profile;<br>            }<br>        }</pre><pre>        private bool IsValid(string userName, string fullName, string password, Profile profile)<br>        {<br>            return ProfileNotNull(profile) &amp;&amp; IsValidUserName(userName) &amp;&amp; IsValidFullName(fullName) &amp;&amp;<br>                   IsValidPassword(password);<br>        }<br>    }</pre><p>Perceba que o construtor chama um método de validação que passa por todas propriedades da entidade.</p><p>Como podemos testar a criação dessa entidade? Veja o exemplo de teste unitário.</p><pre>public class UserTest<br>{<br>  [Fact]<br>  public void DeveCriarUsuarioComNomeDeUsuarioCorreto()<br>  {<br>    var user = new User(&quot;joaoSilva&quot;, &quot;João da Silva&quot;, &quot;1234&quot;, new Profile());<br>    Assert.Equal(&quot;gabrielMuniz&quot;, user.UserName);<br>  }<br>  <br>  [Fact]<br>  public void DeveCriarUsuarioComNomeCompletoCorreto()<br>  {<br>    var user = new User(&quot;joaoSilva&quot;, &quot;João da Silva&quot;, &quot;1234&quot;, new Profile());<br>    Assert.Equal(&quot;João da Silva&quot;, user.FUllName);<br>  }<br>  <br>  [Fact]<br>  public void DeveCriarUsuarioComNomeCompletoCorreto()<br>  {<br>    var user = new User(&quot;joaoSilva&quot;, &quot;João da Silva&quot;, &quot;1234&quot;, new Profile());<br>    Assert.Equal(&quot;905669063311D8A17BD6958CD353EEDD&quot;, user.Password);<br>  }<br>}</pre><p>Podemos executar testes unitários em cima do construtor, porém será que eles fazem sentido?</p><p>Notou? Quando executamos um teste unitário <em>DeveCriarUsuarioComNomeDeUsuarioCorreto</em>, por conter uma validação dentro do construtor da entidade, a criação percorre também validações que em nada tem a ver com o nome de usuário. Ou seja, é um teste unitário que foge o princípio de testar a menor unidade possível de código, certo? Como podemos resolver esse problema através do padrão builder? Vamos refatorar a entidade para propiciar isso.</p><pre>namespace PostsApp.Domain.Factories<br>{<br>    public class UserBuilder<br>    {<br>        private string PASSWORD_PATTERN = &quot;[0-9]+&quot;;</pre><pre>        private User _user;</pre><pre>        public UserBuilder CreateUser()<br>        {<br>            _user = new User();<br>            return this;<br>        }</pre><pre>        public User Generate() =&gt; _user;</pre><pre>        public UserBuilder WithFullName(string fullName)<br>        {<br>            _user.FullName = fullName.Length &lt;= 50<br>                ? fullName<br>                : throw new InvalidUserException(&quot;Nome completo deve ter no máximo 50 caracteres.&quot;);<br>            return this;<br>        }</pre><pre>        public UserBuilder WithUserName(string userName)<br>        {<br>            _user.UserName = userName.Length &gt;= 10<br>                ? userName<br>                : throw new InvalidUserException(&quot;Usuário deve possuir ao menos 10 caracteres.&quot;);<br>            return this;<br>        }</pre><pre>        public UserBuilder WithPassword(string password)<br>        {<br>            _user.Password = Regex.Match(password, PASSWORD_PATTERN).Success<br>                ? password.ToMd5()<br>                : throw new InvalidUserException(&quot;Senha não atende os critérios de segurança.&quot;);<br>            return this;<br>        }</pre><pre>        public UserBuilder WithProfile(Profile profile)<br>        {<br>            _user.Profile = profile ?? throw new InvalidUserException(&quot;Usuário não possui perfil vinculado.&quot;);<br>            return this;<br>        }<br>    }<br>}</pre><p>Melhor, não? Agora temos cada método <em>With</em> construindo pequenas frações da entidade, facilitando os testes de unidade e nos ajudando a validar apenas o necessário em cada teste. Vamos refatorar os testes? Segue:</p><pre>namespace PostsApp.UnitTests<br>{<br>    public class UserTest<br>    {<br>        [Fact]<br>        public void DeveCriarUsuarioComNomeDeUsuarioCorreto()<br>        {<br>            var user = new UserBuilder()<br>                .CreateUser()<br>                .WithUserName(&quot;gabrielMuniz&quot;)<br>                .Generate();<br>            <br>            Assert.Equal(&quot;gabrielMuniz&quot;, user.UserName);<br>        }</pre><pre>        [Fact]<br>        public void DeveCriarUsuarioComNomeCompletoCorreto()<br>        {<br>            var user = new UserBuilder()<br>                .CreateUser()<br>                .WithFullName(&quot;Gabriel Silvano Muniz&quot;)<br>                .Generate();<br>            <br>            Assert.Equal(&quot;Gabriel Silvano Muniz&quot;, user.FullName);<br>        }</pre><pre>        [Fact]<br>        public void DeveCriarUsuarioComSenhaCorreta()<br>        {<br>            var user = new UserBuilder()<br>                .CreateUser()<br>                .WithPassword(&quot;1234&quot;)<br>                .Generate();<br>            <br>            Assert.Equal(&quot;81DC9BDB52D04DC20036DBD8313ED055&quot;, user.Password);<br>        }<br>    }<br>}</pre><p>Veja, agora quando executamos o teste <em>DeveCriarUsuarioComNomeDeUsuarioCorreto</em> validamos apenas a criação do nome de usuário e assim sucessivamente.</p><p>É claro que este não é o único benefício da utilização deste padrão e ele pode/deve ser utilizado em conjunto com outros padrões que soam como música ao resolver determinados problemas. O próximo padrão de criação que vamos abordar será o factory method. Então até lá!</p><p><strong>IMPORTANTE: Tome muito cuidado com a febre do patternite. Nem todo padrão é aplicável ou saudável para seu código em qualquer situação, é importante ter uma análise sincera do que é realmente necessário.</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6637a562b6cf" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>