<?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 Gustavo S. Rodrigues on Medium]]></title>
        <description><![CDATA[Stories by Gustavo S. Rodrigues on Medium]]></description>
        <link>https://medium.com/@gustavosrodrigues?source=rss-42b609e02817------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*6rKaZ55zhaXwwe1ZotbUlQ@2x.jpeg</url>
            <title>Stories by Gustavo S. Rodrigues on Medium</title>
            <link>https://medium.com/@gustavosrodrigues?source=rss-42b609e02817------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 14:56:20 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@gustavosrodrigues/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[Vamos falar sobre a paralisia da análise e como isso afeta seu negócio]]></title>
            <link>https://gustavosrodrigues.medium.com/vamos-falar-sobre-a-paralisia-da-an%C3%A1lise-e-como-isso-afeta-seu-neg%C3%B3cio-96b17eee9605?source=rss-42b609e02817------2</link>
            <guid isPermaLink="false">https://medium.com/p/96b17eee9605</guid>
            <category><![CDATA[innovation]]></category>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[engineering]]></category>
            <dc:creator><![CDATA[Gustavo S. Rodrigues]]></dc:creator>
            <pubDate>Thu, 30 Dec 2021 14:25:40 GMT</pubDate>
            <atom:updated>2021-12-30T14:25:40.968Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fg8jvpEoqjTIvdAD-1o2DA.png" /><figcaption>credit: <a href="https://www.freeimages.com/pt/photographer/andrewatla-57677">https://www.freeimages.com/pt/photographer/andrewatla-57677</a></figcaption></figure><p>Tenho observado um fenômeno que tem consumido muitas empresas e pessoas, que simplesmente estão parando de dar resultado, e infelizmente isso é só a ponta do iceberg.</p><blockquote>“Todas as estradas levam a Roma”, mas nem por isso todos conseguem chegar lá.</blockquote><p>A fase acima é uma provocação, pois, quantas vezes deixamos de fazer algo simplesmente porque paramos no meio e mudamos de ideia, e vamos de galho em galho sem chegar no objetivo final.</p><p>Um dos fatores chave desse cenário é o excesso de opções, mas também, não podemos negligenciar ego de fazer o perfeito, e isso não se restringe apenas aos indivíduos, isso pode se espalhar pela empresa como ervas daninhas que prejudicam uma plantação.</p><p>Na prática, <strong><em>analysis paralysis</em></strong> no seu time é um sintoma de <strong>falta de agilidade</strong> e propósito, seja porquê seu time compete para estar sempre na hype, ou simplesmente porquê o “como” passa a ser mais importante que o “porquê”.</p><p>Nesse exato momento existe alguém fazendo uma solução melhor que a sua, e não há nada a ser feito a respeito, do mesmo modo que estão lançando uma tecnologia melhor do que a que você está usando, enquanto você corre o risco de ficar para trás, ao lançar aquele serviço que planejou no início do quarter…</p><p>Bom, a boa notícia é que <strong>você não precisa se cobrar para estar na hype o tempo todo</strong>, e o <strong>negócio não vai entregar menos</strong> em termos de produto <strong>porquê você usou uma versão menos atualizada daquele framework</strong> que você decidiu usar no início do ano.</p><p>Porém, existe um lado que é o da empresa e da liderança que precisa aceitar a senoide de ter um software em produção, que você lança, corrige bugs, normaliza, depois lança novas features, e casualmente pode ao longo do tempo até descontinuar o software, seja por ter ficado ultrapassado ou simplesmente não ter mais sentido funcional para o negócio, pois ele mudou ao longo do tempo.</p><h4>Mas afinal, como é possível vencer a paralisia, visto que ela afeta indivíduos e grupos?</h4><p>Basta seguir a primeira lei de Newton<strong>.</strong> Ou seja, a única forma de vencer a paralisia é continuar em movimento, continuar entregando produto em produção.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/320/0*wo2yFLGs1pjJM6Xe.png" /></figure><h4>“<strong>Todo corpo continua em seu estado de repouso ou de movimento uniforme em uma linha reta a menos que seja forçado a mudar aquele estado por forças aplicadas sobre ele</strong>” Issac Newton.</h4><p>Outra chave do sucesso é criar uma cultura forte de tecnologia, e fazer com que a linha entre tecnologia e outras áreas fiquem opacas, de modo que os times se preocupem com problemas reais, que em resumo é atender o cliente. Diga-se de passagem, o cliente não quer saber se você está usando Kafka com uma série de regras de mensageria, ou se está em um monólito. O cliente só quer ser atendido com eficiência e eficácia. que em engenharia se traduz em software funcionando, e é basicamente o que o Manifesto ágil já pregava, que é software funcionando mais do que uma documentação abrangente, indivíduos e interações mais que processos e ferramentas.</p><p>É preciso de mais profundidade, mais cultura, mais envolvimento e interações do que a maioria dos cursos, certificados, e consultorias em agilidade entregam, e talvez só assim seja possível tornar o processo de inovação mais eficiente e seguro do ponto de vista emocional do time, e que gere um impacto real para o seu cliente.</p><h3>Referências</h3><ul><li><a href="https://www.ted.com/talks/teagan_adams_stop_the_analysis_paralysis_start_massive_momentum"><strong>Stop the Analysis Paralysis, Start Massive Momentum</strong>:</a></li><li><a href="https://www.youtube.com/watch?v=NuIOO5VWmXc"><strong>RANT: Empreendendo com Software do JEITO ERRADO</strong>!</a></li><li><a href="https://gustavosrodrigues.medium.com/uma-abordagem-financeira-para-tratar-engenharia-de-software-e-d%C3%A9bito-t%C3%A9cnico-2fb16cd3f67c"><strong>Uma abordagem financeira para tratar engenharia de software e débito técnico</strong></a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=96b17eee9605" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Como reduzimos em 2/3 nossos custos apenas mudando nossa estratégia de uso do S3]]></title>
            <link>https://gustavosrodrigues.medium.com/como-reduzimos-em-2-3-nossos-custos-apenas-mudando-nossa-estrat%C3%A9gia-de-uso-do-s3-d67b77a02dbb?source=rss-42b609e02817------2</link>
            <guid isPermaLink="false">https://medium.com/p/d67b77a02dbb</guid>
            <category><![CDATA[cost-optimization]]></category>
            <category><![CDATA[refactoring]]></category>
            <category><![CDATA[s3]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[engeneering]]></category>
            <dc:creator><![CDATA[Gustavo S. Rodrigues]]></dc:creator>
            <pubDate>Fri, 24 Sep 2021 15:33:09 GMT</pubDate>
            <atom:updated>2021-09-25T00:32:33.257Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*7tt-fYGJal3vpEIC.jpg" /></figure><p>Há dois anos aproximadamente, lançava-mos nossa primeira versão do nosso motor de busca da <a href="https://www.maxmilhas.com.br/"><strong>Maxmilhas</strong></a> usando <a href="https://grpc.io/"><strong>gRPC</strong></a> ( ficou curioso, fizemos um relato nesse artigo <a href="https://www.linkedin.com/pulse/porqu%25C3%25AA-maxmilhas-utiliza-grpc-gustavo-da-silva-rodrigues/?trackingId=GiSa215QQAa8m2T3P8pf4g%3D%3D">aqui</a>). Com esse buscador, superamos algumas metas, entre elas não tivemos mais problemas com persistência de dados pois optamos usar o AWS <strong>S3</strong> como <strong>storage</strong>, isso fez que superássemos nossos limites em relação a <strong>IOPS</strong> e disponibilidade. Entretanto, essa decisão de arquitetura <strong>nos deixou em média uns 10% mais caros</strong> em relação ao modelo anterior que era uma modelagem orientada a documentos, com o adicional de não termos mais restrições em relação a escrita e leitura.</p><p>Antes de prosseguir, acho importante entender o porquê decidimos usar o S3.</p><p>Quando entrei na Maxmilhas já estávamos esbarrando nos limites de <strong>IOPs</strong> de nosso banco Mongo do <strong>antigo motor de buscas</strong> e estávamos em estudos com outras soluções, mas sempre entrávamos em um impasse, podíamos ter elasticidade mas com um custo pouco maior, ou teríamos que gerenciar esse banco de dados mas lidaríamos com os riscos dessa decisão, que envolvia o famoso <a href="https://pt.wikipedia.org/wiki/Teorema_CAP"><strong><em>teorema de CAP</em></strong></a>, não apenas na perspectiva de custos. Com isso decidimos usar o <strong>S3</strong>, pois melhor se encaixava em nosso cenário e me garantia a maior disponibilidade em relação a qualquer outro modelo, mas isso tinha um custo.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/467/0*bM-eXFd7ZVtyKENY.png" /><figcaption>Matriz CAP</figcaption></figure><p>Depois da decisão tomada, revisamos ela algumas vezes ao longo desses 2 anos, porém esbarrávamos sempre em Storage ou IOPS. E <strong>era algo até então insolúvel</strong>. Ao menos era até que começamos a estudar <strong>onde e como estávamos gastando</strong> com S3. E a partir disso, enxergamos que poderíamos economizar 2/3 do nosso custo apenas mudando a estratégia de persistência da aplicação.</p><p>Para efeito comparativo, nosso maior custo em <strong>S3</strong>, estava em <em>Request Tier 1</em>:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cOIFwM7xWpROoMBwbaUsgg.png" /><figcaption><a href="https://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/aws-usage-report-understand.html">https://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/aws-usage-report-understand.html</a></figcaption></figure><p>Isso queria dizer que, nosso maior custo não era storage como imaginávamos, ou leitura, e sim o como escrevíamos no S3.</p><p>Para entender a precificação do S3, resumidamente o quadrante <strong>Tier1</strong>, refere-se a escrita, <strong>Tier2</strong>, refere-se a leitura, <strong>DataTransfer-In/Out</strong> refere-se a custo de transferência pra internet e o <strong>TimedStorage-ByteHrs</strong> que refere-se a custo GB armazenado por hora. Para mais detalhes dessa classificação, recomendo explorar a <a href="https://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/aws-usage-report-understand.html">documentação</a>.</p><p>E essa informação borbulhou na minha cabeça, pois apenas mudando nosso modelo poderíamos gerar uma <strong>economia de 2/3</strong>, bastaria reduzir nossa escrita de novos arquivos sem mexer no volume de escrita. Ou seja revisando a modelagem que gerava mais de um arquivo, mudamos a modelagem pra usar um arquivo apenas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ftDHZzAIV1VHaZcGK1ynCg.png" /><figcaption>Antes e depois da mudança</figcaption></figure><p>Mas a tese de que era possível foi posta em prova, e não fosse o <strong>apoio e confiança do time</strong>, certamente não teríamos revisitado ou ao menos testado esse cenário que se confirmou. Hoje podemos dizer que não temos mais limites de IOPS e também em termos de eficiência de custos, estamos melhores que a versão anterior da nossa busca.</p><p><strong>Lições aprendida:</strong></p><ul><li>Revise sua arquitetura se algo te incomoda, seja por custo ou por performance;</li><li>Tente entender como é precificado os serviços que você usa, isso pode influenciar em algumas decisões técnicas;</li><li>Não desista, as vezes é preciso bater a cabeça algumas vezes até acertar, faz parte do jogo;</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d67b77a02dbb" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Uma abordagem financeira para tratar engenharia de software e débito técnico]]></title>
            <link>https://gustavosrodrigues.medium.com/uma-abordagem-financeira-para-tratar-engenharia-de-software-e-d%C3%A9bito-t%C3%A9cnico-2fb16cd3f67c?source=rss-42b609e02817------2</link>
            <guid isPermaLink="false">https://medium.com/p/2fb16cd3f67c</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[innovation]]></category>
            <category><![CDATA[product]]></category>
            <category><![CDATA[digital-transformation]]></category>
            <dc:creator><![CDATA[Gustavo S. Rodrigues]]></dc:creator>
            <pubDate>Wed, 25 Aug 2021 13:05:48 GMT</pubDate>
            <atom:updated>2021-08-25T13:05:48.116Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Nbw__NdOsFStC82Z.jpeg" /></figure><p>O Débito técnico é um mecanismo de<strong> alavancagem de negócio</strong>, assim como a<strong> alavancagem financeira mediante crédito</strong>. Pois em ambos os cenários, essa manobra aumenta o potencial de lucro ou prejuízo mediante crédito, trazendo o resultado no tempo presente com o compromisso de quita-la no futuro.</p><p>Pessoas de tecnologia, em especial com foco em arquitetura tem uma <strong>aversão</strong> natural a decisões <strong>deficitárias tecnicamente</strong>, pois sabe o <strong>custo</strong> sob o tempo dessas escolhas.</p><p><strong>Essa visão é limitada</strong>, pois, o problema não é contrair dividas, e sim <strong>a capacidade de paga-las em dia</strong>, e mais do que isso, <strong>contrair as dividas certas</strong> em favor de alavancagem do negócio, ou seja que gerem o maior valor sem comprometer o caixa operacional da empresa, que no caso de software é o tempo e esforço gasto para manter a operação funcionando.<br>Por outro lado pessoas não técnicas tendem a minimizar a complexidade de algumas decisões e acabam assumindo riscos e pagando uma taxa de juros muito alta por essas decisões.</p><p>Vamos pensar em <strong>engenharia como um mecanismo de geração de valor</strong> onde o <strong>seu capital é o tempo/esforço/experiência</strong>. Ou seja, você tem um caixa limitado de capacidade para distribuir esse esforço, que na melhor das hipóteses estará gerando mais valor. Portanto se você gasta 75% de sua capacidade produtiva resolvendo problemas de débitos, seu potencial real de gerar valor é de apenas 25%, que na verdade pode ser ainda menor, se considerar o desgaste emocional do time.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*fvhxfZ8GvIpH08sg.jpg" /></figure><p>O cenário acima é realidade em muitas empresas e times no Brasil e no mundo que em algum momento optaram criar alguns débitos em favor da alavancagem, porém negligenciaram os riscos ou o caixa.</p><p>O efeito colateral disso é que a capacidade de pagar esse débito no longo prazo <strong>pode se tornar impraticável </strong>pois existe uma <strong>tendencia a gerar novas dividas para continuar operando</strong>, como<strong> juros do rotativo do cartão de crédito</strong>, e quando se dão conta, já estão super endividados.</p><p>Empresas com muito capital, costumam compensar essa ineficiência com uma operação de engenharia cada vez maior, escalando o negócio com pessoas.</p><p>Nesse aspecto o advento da transformação digital e a velocidade que ela demanda de gerar novos negócios e oportunidades, causou uma <strong>nova crise do software,</strong> diferente da vivida na década de 70, mas com muitas semelhanças.</p><p>Uma das grandes diferenças é que <strong>hoje temos muito mais acesso a informação que há 50 anos</strong>, porém temos <strong>ciclos de inovação e crises em ciclos mais curtos</strong>, bolhas nascendo e estourando em 4 anos, tecnologias e <strong>arquiteturas ficando obsoletas em menos de 10 anos</strong>, um mundo mais conectado e uma concorrência cada vez maior, além de uma escassez de profissionais, que colabora com o <strong>aumento da demanda reprimida</strong>.</p><p>Talvez o somatório de todos os fatores acima traduzam o momento da engenharia de software hoje, mas não deveríamos esperar uma grande crise para reagirmos, seja como negócio ou como engenharia. Bastaria que tivéssemos uma r<strong>eeducação de produto e engenharia, algo parecido com uma reeducação financeira</strong>.</p><h3>Mas qual a solução</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*-8W5EkdUOvvE99s1.jpg" /></figure><p><strong>De forma resumida, com um bom planejamento, estruturando negociando suas dividas, e reorganizando seu caixa.</strong></p><p><strong>Devemos projetar software com base no seu e seu ciclo de vida de negócio</strong>, nesse caso, se a proposta é um MVP para explorar uma demanda inexplorada, sabe de antemão que não faz sentido construir um software extremamente resiliente e modular. <strong>Uma forma de medir isso é negociar o SLA e SLO que tolere mais indisponibilidade</strong>, afinal, soluções rápidas, riscos altos, portanto a melhor medida são os indicadores de disponibilidade e de erros que são toleráveis.</p><p>Vale lembrar que <strong>reduzir o prazo de um projeto necessariamente consiste em reduzir escopo, seja ele funcional ou não</strong>, portanto, ao optar pela alavancagem por débito, tenha em mente que a taxa de juros que seus indicadores de disponibilidade gerarão para sua operação diária, sobretudo os não funcionais.</p><p>Já do ponto de vista de negócio, <strong>contraia dividas sem comprometer todo o caixa</strong>, e assuma riscos de disponibilidade aceitáveis que não comprometa muito a experiência do cliente e nem sobrecarregue sua operação e atendimento.</p><h3>Referências</h3><p><strong>Engenharia de Confiabilidade do Google (SRE)<br></strong><a href="https://www.amazon.com.br/Engenharia-Confiabilidade-Google-Administra-Sistemas/dp/8575225170/ref=asc_df_8575225170/?tag=googleshopp00-20&amp;linkCode=df0&amp;hvadid=379787347388&amp;hvpos=&amp;hvnetw=g&amp;hvrand=16517087642200465451&amp;hvpone=&amp;hvptwo=&amp;hvqmt=&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=1001754&amp;hvtargid=pla-809202560056&amp;psc=1">https://www.amazon.com.br/Engenharia-Confiabilidade-Google-Administra-Sistemas/dp/8575225170/ref=asc_df_8575225170/?tag=googleshopp00-20&amp;linkCode=df0&amp;hvadid=379787347388&amp;hvpos=&amp;hvnetw=g&amp;hvrand=16517087642200465451&amp;hvpone=&amp;hvptwo=&amp;hvqmt=&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=1001754&amp;hvtargid=pla-809202560056&amp;psc=1</a></p><p><strong>Software Engineering at Google</strong>: <br><a href="https://www.amazon.com.br/Software-Engineering-Google-Titus-Winters/dp/1492082791/ref=asc_df_1492082791/?tag=googleshopp00-20&amp;linkCode=df0&amp;hvadid=379795170134&amp;hvpos=&amp;hvnetw=g&amp;hvrand=9274810583993729118&amp;hvpone=&amp;hvptwo=&amp;hvqmt=&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=1001754&amp;hvtargid=pla-893850003581&amp;psc=1">https://www.amazon.com.br/Software-Engineering-Google-Titus-Winters/dp/1492082791/ref=asc_df_1492082791/?tag=googleshopp00-20&amp;linkCode=df0&amp;hvadid=379795170134&amp;hvpos=&amp;hvnetw=g&amp;hvrand=9274810583993729118&amp;hvpone=&amp;hvptwo=&amp;hvqmt=&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=1001754&amp;hvtargid=pla-893850003581&amp;psc=1</a></p><p><strong>Lean Software Systems Engineering for Developers<br></strong> <a href="https://www.amazon.com/Lean-Software-Systems-Engineering-Developers/dp/1484269322">https://www.amazon.com/Lean-Software-Systems-Engineering-Developers/dp/1484269322</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2fb16cd3f67c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Vamos falar sobre cultura de qualidade de software e Code Review?]]></title>
            <link>https://gustavosrodrigues.medium.com/vamos-falar-sobre-cultura-de-qualidade-de-software-e-code-review-22a9449d5b7d?source=rss-42b609e02817------2</link>
            <guid isPermaLink="false">https://medium.com/p/22a9449d5b7d</guid>
            <category><![CDATA[dev]]></category>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[qa]]></category>
            <category><![CDATA[agile]]></category>
            <category><![CDATA[productivity]]></category>
            <dc:creator><![CDATA[Gustavo S. Rodrigues]]></dc:creator>
            <pubDate>Thu, 11 Jun 2020 14:32:11 GMT</pubDate>
            <atom:updated>2020-06-11T14:36:06.363Z</atom:updated>
            <content:encoded><![CDATA[<p>Afinal é possível implantar uma cultura de code review horizontal? É possível ter entregas com qualidade e agilidade? É possível fazer o time de QA e Devs se respeitarem e se ajudarem?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5yVFQmynOzqxXG8GBL1QLw.png" /></figure><p>Sim é possível, e mais do que isso, funciona, a pedra angular desse relacionamento está diretamente relacionada a cultura do time, e não é tão complicado mudar, desde que todos assumam que são vulneráveis, ou seja, todos sem exceção podem e vão falhar, e essas falhas não podem ter identidade, ou seja, não precisamos perseguir culpados, precisamos perseguir a solução e como não cometer os mesmos erros.</p><p>Assim como em postmortem, uma análise de código ou funcionalidade deve ser impessoal, sugiro inclusive não se atentar a quem fez e sim o que foi feito, porquê foi feito e como foi feito. Isso é fundamental para uma cultura saudável de qualidade, seja no code review ou na correção de um bug da feature que foi criada.</p><h3><strong>Estabeleça acordos!</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wfstTj8Qrt1JiIWZAH3jIg.png" /></figure><blockquote>“Tudo é negociável. Se é ou não uma negociação fácil, é outra coisa.”, Carrie Fisher</blockquote><p>Fiz uma lista de <strong>acordos e recomendações que vivenciei e que fizeram a diferença</strong> aos longos desses anos para estabelecer uma cultura de qualidade. Veja abaixo processos e acordos que podem ajuda-los a construir essa cultura:</p><h4><strong>Em sequência alguns dos acordos mais importantes que adotamos:</strong></h4><ol><li>Todos passam pelos mesmos crivos de validação e isso é irrevogável;</li><li>Todo Code review tem que explicar o que, porquê e como;</li><li>Um Pull Request deve ter apenas uma correção ou melhoria;</li><li>Não tente avaliar algo que uma máquina avaliaria melhor que você;</li><li>Faça testes unitários, isso pode ser mais barato do que você imagina;</li><li>De autoridade e espaço para os QAs.</li></ol><h4><strong>Todos passam pelos mesmos crivos</strong></h4><p>Não tão óbvio mas extremamente importante para estabelecer uma cultura de confiança e qualidade em primeiro lugar.</p><p>Isso reforça o senso de que todos são donos do projeto, e que todos são guardiões desse código, afinal, nem o mais sênior, arquiteto ou o papa do time tem o direito de violar essa regra.</p><p>Essa abordagem em primeira análise evita decisões prematuras ou problemas estruturais nos projetos, digo isso pois a maioria dos problemas que vivenciei se deram justamente por pessoas que se julgavam superiores às outras e entregava o seu sem avaliação do time, e o preço disso a longo prazo é alto d+, além disso, um bom processo de análise de código ou entrega tende a reduzir o esforço de repasse, visto que todos veem e colaboram com a evolução desse projeto, e em último análise isso economiza um tempo valioso na hora de redistribuir os projetos, além de reforçar uma tendência de padronização natural dos códigos e bibliotecas, ou seja, menor tempo também na criação de novos projetos, pois naturalmente o time se preocupa com o reuso do que faz.</p><h4><strong>Todo Code review tem que explicar o que, porquê e como</strong></h4><p>Sempre digo que um bom PR deve ser auto explicativo, deve contar uma história com 3 atos, onde descrevo inclusive minhas motivações e pontos relevantes para quem vai analisar. Por aqui adotamos o modelo abaixo.</p><h4><strong>Esse modelo deve responder 3 coisas:</strong></h4><ol><li>Qual problema estou resolvendo?</li><li>Por que decidi seguir com o caminho X sendo que o Y também seria possível?</li><li>O que é importante ressaltar?</li></ol><p><strong>Qual problema estou resolvendo?</strong></p><p>Descrição do problema que pode ser de negócio, de falta de indicador ou ainda por critérios técnico como performance, falhas etc.</p><p>Essa descrição não pode deixar dúvida sobre o que você está resolvendo e mais do que isso, induz naturalmente a ter PRs incrementais, pois fica muito difícil justificar um ajuste muito grande em um único PR.</p><p><strong>Por que decidi seguir com o caminho X sendo que o Y também seria possível?</strong></p><p>Essa pergunta é muito difícil de ser respondida se quem fez o PR não analisou todas as opções antes de tar uma decisão, ou ainda se a pessoa compreendeu o problema que está resolvendo.</p><p>Claro que você não vai discorrer num PR de atualização de versão de segurança de um pacote, mas é importante que se esforce em analisar e por as justificativas da decisão técnica, isso ajuda a avaliar muitos pontos, antes mesmo de revisar o código em si.</p><p><strong>O que é importante ressaltar?</strong></p><p>Esse trecho deixo para colocar alguma restrição, risco ou ainda urgência desse código, e isso ajuda a negociarmos a entrega.</p><p>Afinal o fato de termos regras e guardiões do código, temos que negociar, mas isso de forma democrática e com acordos de próximos passos, caso seja uma violação das regras previamente definidas, como por exemplo cobertura de teste vs pressão do solicitar para entrega, nesse caso não deixamos de entregar, mas damos o risco na mão de quem solicitou, e obviamente se torna um acordo consensual e transparente.</p><h4><strong>Um pull request deve ter apenas uma única correção ou implementação</strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ds37H6_BKmVS9WkmkY64Xg.png" /></figure><p>Uma regra importante que temos é sobre um PR deve resolver apenas um problema, ainda que pra resolver um problema maior exija um conjunto de mais ajustes e consequentemente mais PRs, e isso é possível releases maiores ou feature branches âncoras.</p><p>Esse acordo nos ajudou a fazermos entregas menores e mais fáceis de validar, pois restringimos um PR por problema, reduzindo o acoplamento da solução, e ajudando o time em toda trajetória de uma entrega maior, e isso de modo geral nos ajudou a nos tornarmos mais ágeis, expondo mais o quanto cada um contribuiu numa sprint, coisa que antes disso era muito subjetivo, quando não, impedia a gestão de saber ao certo em que passo esse projeto está, ou o quão complexo esse ajuste foi.</p><h4><strong>Não tente avaliar algo que uma máquina avaliaria melhor que você</strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*crOFjzF72H400ISz2FfiSA.png" /></figure><p>Automatize o que você pode automatizar, isso economiza um tempo considerável, pois nada será tão justo quanto uma análise automatizada, seja para indicar code smells ou cobertura de testes, e hoje existem dezenas de integrações com serviços de análise estática como o code climate ou o Sonar, que já cobrem boa parte desse tipo validação, isso te dá mais tempo e foco na revisão da implementação e na regra em sí.</p><h4><strong>Faça testes unitários, isso é mais barato que você imagina</strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/0*YJRlQtvay8ZgVJep" /></figure><p>Esse é sem dúvida onde você ganha qualidade na implementação e segurança, embora seja também o ponto de maior atrito cultural, pois se o time não está habituado, haverá resistência das mais diversas formas, a primeira é sobre urgência e cobrança, que nem sempre é inegociável, isso ocorre pois o time tende a por empecilhos em algo que vai num primeiro momento aumentar o tempo de análise e desenvolvimento e é natural nesse momento surgirem atritos.</p><p>Recomendo fazer muitas rodadas de treinamento, definir um padrão de teste e uma cobertura mínima é um bom ponto de partida, por exemplo, hoje em código legado, exigimos que ao menos a implementação da feature ou bug tenha cenário de teste e cobertura, ainda que originalmente o projeto não tenha teste unitários, e isso reduz problemas de mais inclusive em projetos mais legados, pois naturalmente o código ficará menos acoplado, pois força o desenvolvimento a fugir de armadilhas de classes com muitas responsabilidades, ainda que em um projeto legado. Esse foi um dos segredos que nos fez ter sucesso nas mudanças que adotamos no time.</p><p>Há práticas por exemplo de PR onde o avaliador faz um commit de um cenário de teste que quebraria, melhorando a contribuição e colaboração nesse momento. E com o tempo algumas das discussões técnicas começarão com revisão dos cenários mapeados, antes mesmo da implementação, mas isso não é do dia pra noite, mas insista pois do ponto de vista de código, isso gera menor acoplamento, que por sua vez facilita a manutenibilidade do código, outro ponto relevante é que terá menos riscos nas entregas, visto que força a compreensão e revisão dos cenários de negócio, que por sua vez reduz o risco de falhas em produção.</p><h4><strong>De autoridade e espaço para os QAs</strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FNS5suDUnCgjQT7D47ytRw.png" /></figure><p>Sobre o papel do QA no time, esse papel é muitas vezes subestimado, e se não tratado com o devido protagonismo e tempo pra fazer as coisas, sempre fará testes manuais.</p><p>No nosso time, passamos a ter na sprint projetos de automação correndo em paralelo com as entregas, e aos poucos foi tomando forma até que tivemos uma cobertura funcional que nos fez gastar menos tempo com testes e cenários massivos, além disso hoje podemos nos orgulhar de ter 80% dos bugs descobertos e tratados ainda em homologação. Isso por si só é uma entrega de valor inestimável, em última análise evita um desgaste com nosso cliente final.</p><p>Outro ponto relevante é que optamos por testes integrados usando a mesma linguagem que usamos nos projetos no caso JS e TS, então é algo que os devs também fazem code review, e podem contribuir, além de aprenderem com a implementação.</p><h4><strong>Considerações finais</strong></h4><p>Implantar uma cultura de qualidade não é fácil, é um processo longo, que vai passar muitas resistências, por vezes do negócio, dos gestores, até mesmo dos devs. Por isso recomendo por mudanças estratégicas e progressivas, igual, a primeira mudança que fizemos foi ter um guia de avaliação de código é um template, depois nos projetos novos passamos a exigir testes unitários mas sem um padrão definido, para que todos pudessem fazer, e depois adotamos um padrão, fizemos treinamentos é mais treinamentos, trocas e pairs a perder de vista até se tornar algo maduro, o mesmo pra automação de testes integrados, onde foi preciso abrir mão de testes manuais em alguns momentos, de ter a automação como projeto, e agora colhemos os frutos disso, e queremos ir além, já vemos algumas oportunidades antes imperceptíveis de melhorias significativas no processo.</p><h4><strong>Dicas de leitura:</strong></h4><ul><li>Engenharia de Confiabilidade do Google — Livro (<a href="https://www.amazon.com.br/Engenharia-Confiabilidade-Google-Administra-Sistemas/dp/8575225170/ref=asc_df_8575225170/?tag=googleshopp00-20&amp;linkCode=df0&amp;hvadid=379787347388&amp;hvpos=&amp;hvnetw=g&amp;hvrand=349625280668673966&amp;hvpone=&amp;hvptwo=&amp;hvqmt=&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=1031984&amp;hvtargid=pla-809202560056&amp;psc=1">https://www.amazon.com.br/Engenharia-Confiabilidade-Google-Administra-Sistemas/dp/8575225170/ref=asc_df_8575225170/?tag=googleshopp00-20&amp;linkCode=df0&amp;hvadid=379787347388&amp;hvpos=&amp;hvnetw=g&amp;hvrand=349625280668673966&amp;hvpone=&amp;hvptwo=&amp;hvqmt=&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=1031984&amp;hvtargid=pla-809202560056&amp;psc=1</a>)</li><li>SRE — Página (<a href="https://landing.google.com/sre/books/">https://landing.google.com/sre</a>)</li><li>As Leis Fundamentais do Projeto de Software: a Ciência do Desenvolvimento de Software (<a href="https://www.amazon.com.br/As-Leis-Fundamentais-Projeto-Software/dp/857522302X">https://www.amazon.com.br/As-Leis-Fundamentais-Projeto-Software/dp/857522302X</a>)</li><li>Refatoração: Aperfeiçoando o Projeto de Código Existente (<a href="https://www.amazon.com.br/Refatora%C3%A7%C3%A3o-Aperfei%C3%A7oando-Projeto-C%C3%B3digo-Existente-ebook/dp/B019IZK89A">https://www.amazon.com.br/Refatora%C3%A7%C3%A3o-Aperfei%C3%A7oando-Projeto-C%C3%B3digo-Existente-ebook/dp/B019IZK89A</a>)</li><li>Microsserviços Prontos Para a Produção: Construindo Sistemas Padronizados em uma Organização de Engenharia de Software (<a href="https://www.amazon.com.br/Microsservi%C3%A7os-Prontos-Para-Produ%C3%A7%C3%A3o-Padronizados/dp/8575226215">https://www.amazon.com.br/Microsservi%C3%A7os-Prontos-Para-Produ%C3%A7%C3%A3o-Padronizados/dp/8575226215</a>)</li><li>Reinvente Sua empresa — ReWork (<a href="https://www.amazon.com.br/Reinvente-empresa-David-Heinemeier-Hansson/dp/8575427636">https://www.amazon.com.br/Reinvente-empresa-David-Heinemeier-Hansson/dp/8575427636</a>)</li><li>ReWork — Discussão sobre o livro (<a href="https://www.grokpodcast.com.br/series/rework/">https://www.grokpodcast.com.br/series/rework/</a>)</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=22a9449d5b7d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Vamos falar sobre arquitetura ágil]]></title>
            <link>https://gustavosrodrigues.medium.com/vamos-falar-sobre-arquitetura-%C3%A1gil-956b52f9b30f?source=rss-42b609e02817------2</link>
            <guid isPermaLink="false">https://medium.com/p/956b52f9b30f</guid>
            <category><![CDATA[clean-code]]></category>
            <category><![CDATA[clean-architecture]]></category>
            <category><![CDATA[arquitectura-de-software]]></category>
            <category><![CDATA[cto]]></category>
            <category><![CDATA[agile]]></category>
            <dc:creator><![CDATA[Gustavo S. Rodrigues]]></dc:creator>
            <pubDate>Tue, 09 Jun 2020 13:36:39 GMT</pubDate>
            <atom:updated>2020-06-09T13:48:49.397Z</atom:updated>
            <content:encoded><![CDATA[<p>Afinal é possível criar arquiteturas de negócio e sistemas robustos com agilidade? É possível entregar o dobro na metade do tempo também em arquitetura?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6DAHLWnCagvcrgZYXET7_g.jpeg" /><figcaption>planejamento</figcaption></figure><p>Bom, primeiro vamos lembrar que agilidade é a conjunção entre eficiência, eficácia e qualidade. Então sendo assim, ser ágil não é ser rápido, afinal da pra entregar bugs em velocidades recordes, ou ainda entregar rápido e não entregar o que foi pedido, ou não menos importante, entregar o que a área pediu, sem bug, mas devagar.</p><p>É importante lembrar que não importa se você segue Kanban, Scrum, XP ou Lean, o que importa no fim é o bom e velho PDCA, e que um indicador de performance sozinho não tem valor algum.</p><h3><strong>Agora voltando sobre arquitetura de solução/tecnologia ágil:</strong></h3><p>Existem diversos frameworks de arquitetura, e há um grande esforço de empresas sérias tentando tornar algo que por natureza não é ágil, visto que é a área que tem um dos maiores potenciais de botar tudo a ganhar ou a perder na empresa, apenas com algumas decisões.</p><p>Mas fugindo um pouco do By The Book, não pretendo discorrer sobre metodologias, e sim sobre boas práticas, sobre tudo, de como decisões são valiosas nessa posição, e por serem valiosas não devem ser tomadas por critérios exclusivamente técnicos.</p><p><strong>Primeiro vamos relembrar do<em> livro Arquitetura Limpa </em>, quando se trata de decisão de arquitetura:</strong></p><blockquote><strong><em>“</em></strong><em>Resumindo, estabelecer limites nos ajudou a adiar decisões e, em última análise, nos fez economizar uma enorme quantidade de tempo e um monte de dores de cabeça. É isso que uma boa arquitetura deve fazer.</em><strong><em>” Martin, Robert C.. Arquitetura Limpa (Robert C. Martin).</em></strong></blockquote><p>Para mim é talvez a maior contribuição do <strong>Uncle Bob</strong> nesse livro<strong> </strong>sobre arquitetura ágil, quando ele sugere adiar decisões a partir do capitulo 17, onde fala sobre limites. Pois tomar decisões despende muito tempo de análise em geral, além disso, tomar decisões com muitas incertezas é antes de mais nada desperdício de tempo, além de gerar um custo muito alto no futuro, pois depois de tomada, voltar atrás pode até inviabilizar um projeto como um todo.</p><p>Digo isso pois vi grandes projetos fracassarem (nem irem pra produção) ou não pararem de pé, exigindo um alto custo de operação (correções e melhorias) justamente por que em algum momento tomaram uma decisão prematura.</p><blockquote><strong>E como diz o ditado: </strong><em>Cada decisão, uma renúncia.</em></blockquote><p>Decisões sobre tecnologia, topologia, framework, banco de dados, nível de abstração, regra de negócio, etc., devem ser tomadas com base em dados, se falta dado falta maturidade e se falta maturidade até uma simples modelagem de banco de dados pode ser equivocada como decisão técnica.</p><p>Então voltando um pouco sobre arquitetura ágil. <strong><em>Arquitetura ágil é sobre saber quando tomar uma decisão</em></strong>, e sobre como essas decisões são tomadas.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/626/1*RqGmrr6KdQNDP2yuFtBE7Q.jpeg" /></figure><p>Não adianta montar uma grande estrutura de CQRS, com uma nível alto de sofisticação com Kafka, é uma infra robusta, se estamos nas fase de validação ou reconhecimento do negócio ou conceito.</p><p>Quando se toma uma decisão de arquitetura leve em conta <strong>3 grandes princípios orientadores</strong>:</p><ul><li>Nível de maturidade do processo de negócio a ser resolvido</li><li>Nível de maturidade técnica da empresa e área</li><li>Custo da solução</li></ul><p><strong>Nível de maturidade do processo de negócio a ser resolvido<br></strong>O primeiro princípio é sobre o quanto você sabe e a área solicitante sabe sobre o negócio ou problema a ser resolvido.</p><p>Lembre-se sempre que nesse momento não basta experiência, é preciso ter clara a visão de passado, presente e futuro, pois as vezes o que você sabe sobre, pode não se aplicar nos próximos anos dada uma visão estratégica, ou ainda, pode ser uma experiência de inovação dentro de uma área conhecida, então nem tudo que você sabia, será crucial para esse novo projeto.</p><p><strong>Nível de maturidade técnica da empresa e área<br></strong>O segundo princípio é sobre conhecer sua engenharia, pois não adianta sair do monólito (nada contra e em breve devo escrever um artigo sobre) pro CQRS em uma empresa ou equipe que sempre deram manutenção a um monólito, essa mesma analogia serve para linguagem de programação ou tecnologia .</p><p>Pense em estratégias de evolução contínua, um bom exemplo é o trabalho que realizamos no time que trabalho, onde saímos de um monólito para diversos micro serviços que no fim otimizaram processos e reduziram custo, e tudo isso em 4 meses.</p><p>mas para isso ser possível levou um ano, onde no monólito quebramos os repositórios de dados, depois entendemos as unidades de negócio e domínio, e por fim comandos e executores, e por último pub/sub. (Quem ficou curioso fiz um relato sobre: <a href="https://www.linkedin.com/pulse/porqu%C3%AA-maxmilhas-utiliza-grpc-gustavo-da-silva-rodrigues/">https://www.linkedin.com/pulse/porqu%C3%AA-maxmilhas-utiliza-grpc-gustavo-da-silva-rodrigues/</a>)</p><p>Nesse período focamos em entregar valor e nos preparar tecnicamente. Eu sabia que essa revolução não se daria do dia pra noite, e que se começasse com uma visão fechada sobre alguns pontos, tomaria decisões equivocadas e nunca chegaríamos lá.</p><p><strong>Custo da solução<br></strong>O último princípio orientador é sobre o custo da solução, e nessa hora, não é só projeção de custo de cloud vs tráfego. É também saber projetar o custo de manutenção dessa solução, seja pelo nível técnico exigido, como também da complexidade, e não menos óbvio o custo de tomar uma decisão ou adiá-la, e esse indicador é possível validando o Rói das entregas anteriores para justificar ou não a evolução dessa solução.</p><h3><strong>Agora para finalizar vamos refletir um pouco sobre sua visão de entrega ágil!</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oxIUhujM3CFnduTSZR9dRQ.jpeg" /></figure><p><strong>Você faz pequenas entregas e de forma recorrente?</strong></p><p>Conseguir entregar valor de forma recorrente e com melhoria contínua, ou seja de forma faseada, e quando digo faseada não é sobre POC -&gt; parte 1 -&gt; parte 2 -&gt; correção de bugs e produção, pois isso é uma cascata ainda que seja feito em forma de sprint.</p><p>Quando digo faseado é sobre PDCA, onde temos ciclos contínuos de entrega de valor, como por exemplo fazer uma experiência de processo de ponta a ponta primeiro, talvez até um monólito se for algo onde o grau de incerteza é muito grande. Depois coletar dados, sejam eles indicadores de receita, sistêmicos ou ainda de satisfação, e aí sim siga para próxima fase, talvez na próxima rodada você opte por um banco de dados X, que seja mais performático e mais barato, ou ainda, pense em quebrar a sua solução em mais uma aplicação especializada em um dos problemas que você resolveu, pois tem requisitos de performance e disponibilidade diferenciados, ou ainda encontre uma necessidade dê assincronismo entre esses sistemas, para reduzir o acoplamento e também o tempo médio de resolução de um dos problemas de negócio. É possível também que o projeto não gere receita, ou não seja exatamente o que pensaram na concepção da ideia inicial.</p><p>A principal contribuição que quero deixar é para você refletir se está ou não tomando boas decisões, afinal, como arquiteto sou responsável pelo que decido e também pelo que não decido, bem como sou responsável pelo sucesso ou fracasso da solução, portanto acho importante não apenas desenhar e especificar, mas também acompanhar os indicadores do projeto e também colaborar com o desenvolvimento do time envolvido no projeto, para tomar as decisões em conjunto no momento mais adequado.</p><h3><strong>Referências</strong></h3><ul><li><a href="https://www.amazon.com.br/Clean-Architecture-Craftsmans-Software-Structure/dp/0134494164">https://www.amazon.com.br/Clean-Architecture-Craftsmans-Software-Structure/dp/0134494164</a></li><li><a href="https://www.devmedia.com.br/como-conciliar-agilidade-e-arquitetura-de-software/33281">https://www.devmedia.com.br/como-conciliar-agilidade-e-arquitetura-de-software/33281</a></li><li><a href="http://www.metodoagil.com/metricas-ageis/#:~:text=M%C3%A9tricas%20%C3%81geis%20existem%20para%20gerar,mesmo%20que%20j%C3%A1%20esteja%20bom.">http://www.metodoagil.com/metricas-ageis/#:~:text=M%C3%A9tricas%20%C3%81geis%20existem%20para%20gerar,mesmo%20que%20j%C3%A1%20esteja%20bom.</a></li><li><a href="https://www.linkedin.com/pulse/porqu%C3%AA-maxmilhas-utiliza-grpc-gustavo-da-silva-rodrigues/">https://www.linkedin.com/pulse/porqu%C3%AA-maxmilhas-utiliza-grpc-gustavo-da-silva-rodrigues/</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=956b52f9b30f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Lições que aprendi no desenvolvimento de produtos, sistemas e campanhas]]></title>
            <link>https://gustavosrodrigues.medium.com/li%C3%A7%C3%B5es-que-aprendi-no-desenvolvimento-de-produtos-sistemas-e-campanhas-6a804e91d5ca?source=rss-42b609e02817------2</link>
            <guid isPermaLink="false">https://medium.com/p/6a804e91d5ca</guid>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[it]]></category>
            <category><![CDATA[projects]]></category>
            <category><![CDATA[product-development]]></category>
            <dc:creator><![CDATA[Gustavo S. Rodrigues]]></dc:creator>
            <pubDate>Thu, 21 Jun 2018 12:44:04 GMT</pubDate>
            <atom:updated>2018-06-21T13:37:40.901Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GS0xBsZRpwQVuqDHsCLXvQ.jpeg" /></figure><p>Há aproximadamente 15 anos eu comecei a trabalhar, desses 15 anos, 9 foram especialmente na área de tecnologia. Pude acompanhar de pequenos a grandes projetos sendo orçados, planejados, desenvolvidos, implantados e sustentados, além de ter passado por diversas áreas do desenvolvimento de um produto digital.</p><p>Já atuei dês da sua análise inicial de um projeto, fazendo propostas comerciais, acompanhando follow-up, fechando negócios, depois como analista de requisitos, ajudando a traduzir necessidades em especificações, pude nessa época também colaborar no plano de reestruturação de processos da empresa, identificando processos falhos ou criando rotinas estruturadas para melhor entrega de demandas, após esse período, durante um período também atuei diretamente com o processo de atendimento publicitário digital, coletando briefings e pondo no fluxo de desenvolvimento, no entanto, em um dado momento identificamos um sério problema relacionado a processos de qualidade, e assim me tornei analista de testes, estudei fluxos e mais fluxos de teste, linguagens de programação, etc. para melhor desempenhar esse processo, e em um dado momento eu já estava codificando e corrigindo erros simples do projeto, ou ao menos apontando onde tecnicamente deveria ser ajustado, até que um belo dia eu me tornei programador e pude desenvolver projetos, tudo com o amparo da equipe.</p><p>Dês de então sigo me desenvolvendo e galgando posições, passando por empresas onde pude aprender de tudo um pouco, dês do que se fazer até o que não se fazer em um projeto, seja tecnicamente ou na forma de gestão. Posso dizer que já fiz muitas coisas, trabalhei em agência, empresa com seu próprio portfólio de produtos digitais, empresas de outras áreas porém com ativos digitais próprios, consultorias e startup.</p><h3><strong>As lições que aprendi</strong></h3><p>Acredito que a maior lição que aprendi foi que não existe projeto bem sucedido sem comunicação, acredito que o maior fator de sucesso e insucesso de um projeto está diretamente ligado a comunicação, seja ela interna ou externa, portanto, sempre que você identificar divergências de entendimento, busque sempre ser o embaixador da paz e boa convivência, busque unir essas pessoas e não separa-las ainda mais, para que todos estejam sempre alinhados.</p><p>Outra grande lição que aprendi, seja substituível, faça o seu melhor, mas faça de um jeito que todos entendam, ensine e dissemine o que você sabe. Talvez isso vá de encontro com a famosa frase do Bill Gates, mas seja insubstituível enquanto pessoa, nunca enquanto técnica.</p><blockquote>“Quer saber como sobrevive? Faça com que precisem de você. Você sobrevive porque os faz precisar do que você tem . E então eles não têm mais para onde ir.” Bill Gates</blockquote><p>Seja honesto, talvez o mais básico seja o mais difícil, mas saiba assumir erros, pois é lamentável ver outras pessoas pagando o pato por algo que você fez ou omitiu, seja por insegurança, medo ou rivalidade. Jogue limpo acima de tudo.</p><p>Você nunca saberá tudo, e isso é bom. Já tive a experiência de liderança técnica cujo todos faziam code review, a regra era só ter dois aprovadores independente do nível. O mais interessante é que mesmo um Jr pode fazer questionamentos e sugestões pertinentes e mais, ver coisas que um Sr não pensou. Acho que aprendi muito com isso, e acredito que independente de posição, todos sendo uma equipe, todos ganham, basta botar o ego de lado e fazer acontecer.</p><p>Não leve pro pessoal, mas sempre saiba que no fim, fazer projeto é sobre pessoas e relações. Sabendo disso, pessoas tem problemas, pessoas tem aspirações e inseguranças e entende-las é uma arte. Eu particularmente tenho duas regras, que são:</p><p>Eu sou seu espelho, se você nunca me ofender eu nunca te ofenderei, se você me ajudar eu o ajudarei.</p><p>Cada tema seu tom, ou o bom e velho da porta pra fora tá tudo certo, continua a amizade. Digo isso pois aprendi com o tempo que não vale a pena levar pra outras esferas e projetos problemas com uma pessoa em específico, é saber separar as coisas e não levar para o pessoal.</p><p>Tudo posso mas nem tudo me convém, e isso é sobre liberdade de expressão, é sobre lidar com opiniões divergentes das suas e respeitar a dos outros, seja ela por uma preferência por tecnologia ou religião.</p><p>Seja claro, sempre seja claro, ainda que você seja o chato questionador, pois o entendimento só é atingido após o amadurecimento e perguntas chaves, e quanto mais perguntas você tiver, mais perto de resolver você está.</p><p>Não jogue war com outros setores, não é sobre ilhas um projeto, é sobre um projeto, todos tem responsabilidades, todos temos contas pra pagar e problemas, e vejo que em um ambiente produtivo não podemos ter fronteiras, não podemos falar isso não é de minha responsabilidade, quando você é um dos afetados caso não saia como o planejado.</p><p>Assuma responsabilidade, assuma riscos. Isso é sobre trazer pra si as coisas, é sobre fazer o que precisa ser feito, não apenas aquilo que você assinou ao entrar na empresa.</p><p>Não santifiquem pessoas nem crie heróis, pois todos falham, sem exceção. E saber disso é importante, ainda que você a tenha como referência, saiba que a sua diferença entre ela é que talvez os erros que você comete, são os erros que ela já cometeu, e ela ainda cometerá erros, e é normal, não se frustrem por isso.</p><p>Saiba perder uma discussão. Saiba que por mais que você goste de uma coisa, ela pode estar errada ou não se aplicar ao caso posto. Dito isso, no fim é sobre ser humilde e por os projetos a frente do seu ego.</p><p>Seja flexível e resiliente. O mundo muda, a tecnologia muda, as pessoas mudam, e você deve aceitar isso de algum modo, pois na lei da sobrevivência só quem se adapta sobrevive, e é normal ter medo de sair da zona de conforto, mas numa guerra sobrevive quem mais se move, movimento é vida, então estude, e não tenha medo de recomeçar, e saiba que conhecimentos anteriores o influenciarão em decisões chaves no futuro com outra tecnologia, quando você tiver maturidade o suficiente em não tratar uma determinada tecnologia como religião.</p><p>Tenha um mentor e seja um mentor. Ainda que sua empresa não tenha um processo formalizado, faça esse exercício. Sou muito grato pelas pessoas que me conduziram até aqui, pois sem elas eu não saberia o que sei, sem suas orientações, reviews, sem seus livros que me emprestaram, sem seus desafios. E eu faço o mesmo hoje, pois tudo passa, mas o conhecimento fica.</p><p>Escreva artigos, faça ou contribua com projetos open-surce. Se você além de fazer, souber explicar, está a um passo de ser um dev melhor, e mais legal que isso, você está ensinando outras pessoas e aprendendo 2x. Sobre open-surce, talvez não seja fácil contribuir, mas é o lugar que mais você vai aprender na sua vida, pois terá reviewers do mundo todo criticando coisas que você fez, e melhor, colaborando com algo que de fato muda o mundo e a forma que você trabalha, seja traduzindo, documentando, testando, codificando, abrindo issues, ou respndendo-as, faça isso. Outra coisa importante, faça pocs, faça boilerplates, faça libs e projetos abertos, pois você estará ajudando pessoas e buscando fazer o seu melhor, pois sabe que alguém estará vendo, e ter isso é bom, ter um amigo comentando sua pr no projeto ou abrindo issues, por mais que vc sinta vergonha, é assim que se aprende, botando a cara pra bater. Além do plus de ter um portfólio aberto quando for procurar novas oportunidades.</p><p>Não seja o Neymar do time. Um time saudável é mais eficiente e produtivo do que um time com um herói, porque no fim o dev mais talentoso, deve ser aquele que decide tocar a bola quando vê alguém bem posicionado, pois mais vale o resultado do que a glória.</p><h3>Disclaimer</h3><p>Não sou o exemplo a ser seguido, mas com base no que vivi até agora no mercado de tecnologia, tudo isso que pontuei fizeram a diferença.</p><p>Até a próxima!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6a804e91d5ca" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Como fiz para corrigir dados na casa dos 20000k de forma assíncrona com JS]]></title>
            <link>https://gustavosrodrigues.medium.com/como-fiz-para-corrigir-dados-na-casa-dos-20000k-de-forma-ass%C3%ADncrona-com-js-f9cf567c9ea9?source=rss-42b609e02817------2</link>
            <guid isPermaLink="false">https://medium.com/p/f9cf567c9ea9</guid>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[async]]></category>
            <category><![CDATA[sql]]></category>
            <dc:creator><![CDATA[Gustavo S. Rodrigues]]></dc:creator>
            <pubDate>Fri, 09 Feb 2018 09:37:56 GMT</pubDate>
            <atom:updated>2018-02-09T13:37:46.599Z</atom:updated>
            <content:encoded><![CDATA[<p>Nesse artigo abordarei a forma que eu resolvi um problema de correção de massa de dados num volume estratosférico durante o voo.</p><p>É importante lembrar que não é recomendável fazer operações desse tipo sem uma interrupção ainda que parcial da aplicação, mas, nem sempre temos uma janela para isso, então temos que por a mão na massa e cruzar os dedos.</p><p>Antes de chegar nessa solução, houveram duas tentativas de scripts de banco para resolver tamanho volume de dados, mas em ambas eu cai no problema de memória do banco ou em um script muito complexo que não podia ser paralelizado ou que se tivesse algum deadlock e pra piorar, ele não era capaz de reexecutar automaticamente, então pensei, já que o banco tem limite de alocação de memória para processar cada processo, por que não fazer com que ele trabalhe em um fluxo keep alive com processamento assíncrono, e assim eu fiz</p><p>Antes de qualquer mistificação, essa rotina não foi finalizada em 10 min, ou segundos, mas foi muito mais rápida do que qualquer outra tentada por mim e pela equipe (cerca de 3h).</p><h3>O Problema</h3><p>Temos 5 tabelas relacionais que possuem registros que se relacionam, e mais, temos alguns parâmetros extras de índices, que nem sempre eram respeitados, tornando a consulta cada vez mais custosa, o que me obrigou a fazer uma correção top down usando a tabela pai para replicar dados para as filhas, e assim corrigir a relação. Então, eu tinha uma tabela com cerca de mais de dois milhões de registros com filhas que chegavam a 20 milhões cada.</p><h3><strong>A Solução</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/720/1*c8xAyhQHORMuHkt2M28caA.gif" /></figure><p>Sabendo que eu tenho <strong>x = 4*(x*2)</strong>, onde num processo tradicional eu só poderia rodar uma tabela por vez sem estourar a memória do banco ou ter <strong>deadLock</strong>, o que me levou a uma conta rápida, que era: quantos registros eu consigo fazer por transação e quantas transações eu consigo fazer em paralelo, e isso me levou de volta a um calculo onde seria possível fazer lotes de até <strong>10.000 registros por transação </strong>e até <strong>4 transações em simultâneo</strong> para tabelas distintas. Mas ainda assim, eu tinha um problema, e se travar?, como eu posso fazer o banco continuar executando de onde parou, então cheguei a conclusão, isso pode ser feito com js via bash e de quebra com um script simplista mas extremamente eficaz.</p><p><strong>Requisitos:</strong></p><ol><li>Preciso saber quantos registros eu quero rodar por transação</li><li>Quantos dados eu tenho a registrar</li><li>Quantos registros já foram corrigidos</li><li>Em caso de falha, preciso retomar a execução do script de onde ele parou</li><li>cada rotina deve ser isolado por seu próprio domínio</li></ol><p><strong>Então, chegamos a esse domain de base:</strong></p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/fea01a26e6f4ad7f098fb1dcf8c0ba5c/href">https://medium.com/media/fea01a26e6f4ad7f098fb1dcf8c0ba5c/href</a></iframe><p><strong>Então para cada correção eu tenho um mini modulo que resolve uma única rotina, onde eu convencionei seguindo a seguinte estrutura:</strong></p><p>app/</p><p>— /domain/</p><p>— — /database/</p><p>— — — /routineDescription.js</p><p>— /controllers</p><p>— — /DomainControllerScript.js</p><p>— config.js</p><p>— datasource.js</p><p>— index.js</p><p>Com essa estrutura eu poderia chama-la por http ou usar um processo de chamada por bash, como optei por bash usando o <a href="https://github.com/tj/commander.js?files=1">Commander</a> e então fiz o controller usando o Commander e cada controller tinha seus de comandos ao invés de rotas, e a index eu fazia apenas as chamadas dos módulos e controllers.</p><p>Desse modo cada comando era uma espécie de rota, e bastava eu executar cada rota em janelas diferentes acompanhando o trafego do banco.</p><h3><strong>Nota final</strong></h3><p>Acredito que independente de ser uma rotina de banco, ou uma rotina de correção de arquivos, ou dados em geral, essa estrutura para bash, com controladores com camadas de domínios pode te ajudar a montar soluções cada vez mais modularizadas. Assim como definir um processo com limites de execução paralelizável.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f9cf567c9ea9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[O bom e velho conceito assíncrono do Javascript]]></title>
            <link>https://gustavosrodrigues.medium.com/o-bom-e-velho-conceito-ass%C3%ADncrono-do-javascript-634ed9bc10fc?source=rss-42b609e02817------2</link>
            <guid isPermaLink="false">https://medium.com/p/634ed9bc10fc</guid>
            <category><![CDATA[js]]></category>
            <category><![CDATA[asynchronous]]></category>
            <category><![CDATA[patterns]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[javascrip]]></category>
            <dc:creator><![CDATA[Gustavo S. Rodrigues]]></dc:creator>
            <pubDate>Thu, 16 Mar 2017 20:27:12 GMT</pubDate>
            <atom:updated>2017-03-17T14:53:39.542Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FWIgKrZxOeMix0oiMO0sdQ.png" /></figure><p>Nesta série de posts abordarei um velho problema entendimento no comportamento do processamento assíncrono em Javascript, na verdade, esse já é um assunto recorrente no <strong>stackoverflow</strong> e em <strong>comunidades</strong> para desenvolvedores novatos (ou não tão novatos assim) que não estão tão familiarizados com Javascrip por conta do sub-entendimento da natureza assíncrona da linguagem, no qual demanda uma forma um pouco diferente de se pensar e construir um sistema.</p><p>Para entender o problema, primeiramente devemos entender como o javascript interpreta suas instruções e o que são valores futuros, ou seja, dados que dependem de um processo assíncrono, no qual você não tem controle do tempo de resposta.</p><h3><strong>Comportamento do Javascript sobre a ordem das coisas</strong></h3><p>O Javascript, ao contrario do <strong>PHP</strong>, <strong>Ruby</strong>, <strong>C#</strong>, etc. não é preemptivo, traduzindo, ele não espera um determinado processo ou retorno de uma função pra dar continuidade ao bloco, e em termos de performance isso é bom, pois, ele é capaz de continuar a execução de outras tarefas, mesmo que ele não termine de executar uma determinada função anterior, e isso torna o javascript ainda mais atraente, embora traga com sigo uma outra forma de pensar no seu código.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/d3aff21acc8bbd880bc2bde1a1bae478/href">https://medium.com/media/d3aff21acc8bbd880bc2bde1a1bae478/href</a></iframe><p>Em PHP se você observar, a execução do trecho acima, o carregamento ocorrerá em ordem, mesmo com a função <em>sleep()</em> que adia o processo do próximo bloco. Esse comportamento vale também pra comunicação com o banco de dados e outras coisas, nas quais não se tem o controle de tempo de resposta. Embora seja um processo que não temos o controle do tempo de resposta, o PHP interpreta como um processo síncrono, ou seja, não precisamos nos preocupar com o que vem depois, pois uma pilha só é executada após a execução do método anterior. Porém esse cenário é um pouco diferente em Javascript, pois exceto que você use alguma estratégia pra lidar com dados assíncronos, seu comportamento não será top down linear quanto aos retornos, com exceção as novas especificações de de Sync mode no Node Js, que gerou uma grande polêmica.</p><p><strong>Em javascript pra você ter esse resultado não basta fazer isso:</strong></p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/b3ec90eb022977e11059d9bd44152992/href">https://medium.com/media/b3ec90eb022977e11059d9bd44152992/href</a></iframe><p><strong>Porque o javascript não espera a chamada assíncrona pra te dar o retorno de uma função</strong>, ou seja, mesmo que você tenha uma ação assíncrona, o sistema tenta interpretar o que ele já tem, em resumo, embora seja uma leitura top down também, ao contrario do PHP e outras linguagens, ele não espera o termino de uma operação pra continuar a outra.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/240/1*Ow_sz7ABgGCweJxIS18P0g.gif" /></figure><h3><strong>O Problema do setTimeout pra adiar o processamento assíncrono:</strong></h3><p>Toda vez que você usa um setTimeout para esse tipo de coisa, você está jogando na loteria, pois, está usando uma suposição para adivinhar o tempo que a máquina do seu cliente vai demorar para trazer o resultado da operação ou requisição. Com isso, você não ganha apenas um problema, você leva logo dois problemas para casa, que são os clientes que vão demorar mais do que você tinha previsto, e adiamento da interação ou navegação de um usuário que processou a operação antes da sua estimativa.</p><blockquote>“Toda vez que você usa um timeout pra adiar um processo assíncrono, um programador se mata!”</blockquote><p>Como computação é uma ciência exata e não esotérica, você deve assumir que não é um adivinho. Deixa as previsões para o João Bidu e comece a usar os recursos da linguagem, diga-se de passagem, ela te proporciona muitas alternativas para lidar com esse tipo de cenário.</p><h3><strong>Uma luz no fim do túnel</strong></h3><p>Para lidar com esses problemas, basicamente existem duas saídas, que são trabalhar com eventos ou com callbacks, ambos possuem caraterísticas muito diferentes entre si, mas, ambas resolvem algo em comum que é prover o controle sobre a execução das suas operações assíncronas. <br>No caso do callback, esse controle se dará pela passagem de funções como parâmetro para controlar a ordem de execução do seu script, já os eventos, funcionam como uma estação de rádio que emite um sinal onde outras funções podem escutar e acompanhar as suas atividades e mudanças de estado. Extrapolando um pouco o conceito, e ainda nessa linha de raciocínio, temos o conceito de observer, que é um pattern, onde temos objetos emissores e observadores de estado, ou seja, um listener, no caso de evento, um listener é um observer por definição, mas, para se trabalhar com observers, você não precisa necessariamente da interface de eventos, assim como você pode utilizar outros conceitos pra lidar com comportamento assíncrono como os paterns Chain of Responsibility para encadeamento de ações ordenadas; O patern pub/sub para lidar com emissores e receptores de ações, onde você quer ter agentes que reagem as mudanças que o emissor emite; os signals pra lidar com comunicação bidirecional entre objetos, onde um emissor é também um receptor e vice versa; E as conhecidas Promises que são objetos com valores conhecidos mas não no momento que são criadas, ou seja, ele representará a promessa. que em algum momento trará uma resposta de sucesso ou falha. Mas calma, irei explicar cada um dos conceitos individualmente acima, suas vantagens e desvantagens, quando e como usar.</p><p>No meu próximo post abordarei tudo sobre Callbacks, e depois darei continuidade na explicação dos demais conceitos para que você entenda de uma vez por todas como trabalhar com comportamento assíncrono!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=634ed9bc10fc" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Chain of Responsibility e o JS]]></title>
            <link>https://gustavosrodrigues.medium.com/chain-of-responsibility-e-o-js-a33ec220160a?source=rss-42b609e02817------2</link>
            <guid isPermaLink="false">https://medium.com/p/a33ec220160a</guid>
            <dc:creator><![CDATA[Gustavo S. Rodrigues]]></dc:creator>
            <pubDate>Fri, 03 Mar 2017 22:15:30 GMT</pubDate>
            <atom:updated>2017-03-03T22:15:30.826Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/544/1*NyHmgK_5snFUGyCsQaSqrg.jpeg" /></figure><p>Chain of Responsibility é um patern cuja principal função é evitar a dependência entre um objeto receptor e um objeto solicitante. Consiste em uma série de objetos receptores e solicitantes, onde cada objeto de solicitação possui uma lógica interna que separa quais são tipos de objetos receptores que podem ser manipulados. O restante é passado para o próximo objeto de solicitação da cadeia. Ou seja, assim que instanciado o objeto, os métodos ou conjunto de métodos após sua operação têm como retorno a própria instância this, permitindo assim o encadeamento de métodos de forma sequencial e com baixo acoplamento por permitir que outros objetos da cadeia tenham a oportunidade de tratar uma solicitação.</p><h3><strong>Show me the code</strong></h3><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/11b04e97e748ff7b0bee99e72a25a1b8/href">https://medium.com/media/11b04e97e748ff7b0bee99e72a25a1b8/href</a></iframe><h3><strong>Resumo</strong></h3><p>Chain of Responsibility nada mais é do que um método que retorna a própria instancia da classe, ou seja, ele sempre retorna ele mesmo de modo que você possa encadear as chamadas, pois você estará sempre lidando com um objeto “conhecido”.</p><h3><strong>Mas onde eu vejo isso?</strong></h3><p>É importante destacar esse patern, pois você o encontrará em diversos locais, inclusive no jQuery e em outra bibliotecas e frameworks, onde existe o conceito de cadeia de ações.</p><p><strong>Ex</strong>:</p><p>$(‘.list’).addClass(‘active’).append(‘&lt;li&gt;test&lt;/li&gt;’).show(200).hide(400);</p><h3><strong>Referências</strong></h3><ul><li><a href="http://www.dofactory.com/javascript/chain-of-responsibility-design-pattern">http://www.dofactory.com/javascript/chain-of-responsibility-design-pattern</a></li><li><a href="https://imasters.com.br/artigo/24337/javascript/padrao-de-projeto-de-software-javascript-chain-of-responsibility?trace=1519021197&amp;source=archive">https://imasters.com.br/artigo/24337/javascript/padrao-de-projeto-de-software-javascript-chain-of-responsibility?trace=1519021197&amp;source=archive</a></li><li><a href="https://books.google.com.br/books/about/Secrets_of_the_JavaScript_Ninja.html?id=vxbUjwEACAAJ&amp;source=kp_cover&amp;redir_esc=y&amp;hl=pt-BR">https://books.google.com.br/books/about/Secrets_of_the_JavaScript_Ninja.html?id=vxbUjwEACAAJ&amp;source=kp_cover&amp;redir_esc=y&amp;hl=pt-BR</a></li></ul><h3><strong>Notas finais</strong></h3><p>Esse é o meu primeiro artigo no medium, pretendo começar uma serie sobre boas praticas e formas de se lidar com problemas de projeto em javascript, sobretudo sobre como lidar com a natureza assíncrona do javascript. Estou retomando meu projeto de compartilhar conhecimento, que comecei a alguns anos no meu blog <a href="http://gustavobeavis.github.io/">http://gustavobeavis.github.io/</a> .</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a33ec220160a" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>