<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://itsmemario.com.br/blog</id>
    <title>It's Me Mário! Blog</title>
    <updated>2021-05-08T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://itsmemario.com.br/blog"/>
    <subtitle>It's Me Mário! Blog</subtitle>
    <icon>https://itsmemario.com.br/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Trabalhando efetivamente com código legado]]></title>
        <id>https://itsmemario.com.br/blog/trabalhando-com-codigo-legado</id>
        <link href="https://itsmemario.com.br/blog/trabalhando-com-codigo-legado"/>
        <updated>2021-05-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Código ilegível]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" src="https://unsplash.com/photos/cvBBO4PzWPg/download?force=true&amp;w=1920" alt="Código ilegível" class="img_ev3q"></p>
<p>Certamente você já trabalhou ou trabalhará com código legado durante sua carreira, pois nem sempre estaremos em projetos novos com tecnologias novas, certo? Errado.</p>
<p>Um código legado não é somente o código antigo que é mantido porque funciona, segundo Michael Feathers, autor do livro <a href="https://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052" target="_blank" rel="noopener noreferrer">Work Effectively with Legacy Code</a>, a idade do código não é o mais importante nesse caso. O principal sintoma de um código legado é a ausência de testes. Essa é uma perspectiva interessante, pois podemos estar hoje mesmo escrevendo código legado no nosso super novo projeto.</p>
<p>Essa diferença é fundamental, pois os testes nos dão a confiança de modificar, corrigir e melhorar um sistema existente, uma vez que eles garantem que não incluímos bugs ou fazemos modificações erradas/inesperadas no sistema. Logo, trabalhar efetivamente com código legado é garantir que nossas modificações não mudem o comportamento do sistema que já funciona há muito tempo. Mas como conseguimos garantir que fazer uma modificação de cada vez mantendo o comportamento do sistema? A forma de garantir que após uma modificação o sistema continua a se comportar da forma esperada é escrever testes para o comportamento. Ou seja, os testes garantem o comportamento atual do sistema, ou da parte do sistema que queremos realizar modificações.</p>
<p>A estratégia apresentada por Michael Feathers no artigo, se resume da seguinte forma:</p>
<ul>
<li>Identificar os pontos de alteração</li>
<li>Encontrar o ponto de inflexão</li>
<li>Cobrir o ponto de inflexão</li>
<li>Realizar alterações</li>
<li>Refatorar</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="identificando-os-pontos-de-alteração">Identificando os pontos de alteração<a href="https://itsmemario.com.br/blog/trabalhando-com-codigo-legado#identificando-os-pontos-de-altera%C3%A7%C3%A3o" class="hash-link" aria-label="Link direto para Identificando os pontos de alteração" title="Link direto para Identificando os pontos de alteração">​</a></h2>
<p>Em um código legado, dependendo da qualidade do mesmo, uma alteração pode requerer mudanças em várias áreas do sistema. No primeiro passo, devemos identificar todas as modificações necessárias, pois elas nos ajudarão a encontrar o ponto de inflexão.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="encontrando-o-ponto-de-inflexão">Encontrando o ponto de inflexão<a href="https://itsmemario.com.br/blog/trabalhando-com-codigo-legado#encontrando-o-ponto-de-inflex%C3%A3o" class="hash-link" aria-label="Link direto para Encontrando o ponto de inflexão" title="Link direto para Encontrando o ponto de inflexão">​</a></h2>
<p>O ponto de inflexão é a interface para um conjunto de classes. Ou seja, o ponto onde o código a ser alterado interage com o resto do sistema. Qualquer modificação executada no conjunto de classes terá impacto no ponto de inflexão ou consequentemente no sistema.</p>
<p>Imagine que em um sistema que está organizado em camadas, no qual uma classe de serviço usa um repositório, se tivermos que realizar uma alteração em uma entidade e no repositório, o ponto de inflexão seria o service, pois qualquer alteração nelas teria impacto diretamente no service ou no resto do sistema.</p>
<p>Dependendo da complexidade do sistema, é provável que exista mais de um ponto de inflexão. A correta identificação desses pontos é muito importante, pois é preciso garantir que as alterações identificadas não “vazem” para o resto do sistema sem passar pelo ponto de inflexão.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="cobrindo-o-ponto-de-inflexão">Cobrindo o ponto de inflexão<a href="https://itsmemario.com.br/blog/trabalhando-com-codigo-legado#cobrindo-o-ponto-de-inflex%C3%A3o" class="hash-link" aria-label="Link direto para Cobrindo o ponto de inflexão" title="Link direto para Cobrindo o ponto de inflexão">​</a></h2>
<p>Após identificar o(s) ponto(s) de inflexão, é necessário cobri-lo(s) com testes. Geralmente grande parte do esforço é concentrada aqui. Em sistemas legados e com design ruim, o código tende a ser muito acoplado, e colocá-lo sob teste geralmente envolve resolver problemas de dependências que podem ser internas ou externas.</p>
<p>A coisa mais simples que você pode fazer é tentar instanciar uma classe (ponto de inflexão). Em um bom design, as dependências dessa classe são passadas pelo construtor, se forem dependências obrigatórias, ou via setters se forem opcionais. Essas são as dependências externas. Essas dependências podem ser tratadas com mocks ou até mesmo NullObjects. O importante é conseguir testar o ponto de inflexão, logo fazer mocks das dependências não é preocupante, pois não são o foco dos testes.</p>
<p>As dependências internas são mais difíceis de lidar. Aqui entram objetos criados internamente, variáveis estáticas ou globais, ou até mesmo singletons que são invocados dentro dos métodos, o que dificulta muito os testes (motivo pelo qual singleton pode ser considerado um antipattern). Para lidar com dependências internas, muitas vezes é necessário estender a classe que queremos testar e sobrescrever comportamentos e dependências internas.</p>
<p>Após resolver as dependências é hora de escrever testes que cubram o ponto de inflexão. Como mencionado anteriormente, o código atrás dessa interface não pode afetar o sistema sem passar por esse ponto. Dessa forma, começamos a escrever testes que cobrem essa área do código.</p>
<p>Lembre-se que o comportamento correto do sistema é o que ele já faz.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="realizando-alterações">Realizando alterações<a href="https://itsmemario.com.br/blog/trabalhando-com-codigo-legado#realizando-altera%C3%A7%C3%B5es" class="hash-link" aria-label="Link direto para Realizando alterações" title="Link direto para Realizando alterações">​</a></h2>
<p>O ideal é fazer alterações incrementais e executar constantemente os testes. Tente escrever testes antes de fazer suas alterações e procure cobrir alguns corner cases.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="refatorando">Refatorando<a href="https://itsmemario.com.br/blog/trabalhando-com-codigo-legado#refatorando" class="hash-link" aria-label="Link direto para Refatorando" title="Link direto para Refatorando">​</a></h2>
<p>Com o código coberto por testes, temos agora a oportunidade de melhorar o design. Se o código for mal estruturado, geralmente existem classes grandes com métodos grandes e alguns padrões de refactoring podem ser usados como extract method e extract class. Uma boa referência desses padrões é o livro Refactoring de Marting Fowler.</p>
<p>À medida que refatoramos, devemos adicionar mais testes. Lembre-se também que código de teste é tão importante quanto o código de produção. Testes devem ser fáceis de manter, pois caso não sejam, provavelmente serão negligenciados.</p>
<p>Com o passar do tempo, as partes principais do código legado começam a ser cobertas por testes e acabamos com pequenas ilhas de testes que serão muito úteis nas próximas intervenções. Além disso, testes também são uma forma de documentação e podem ser a única fonte no futuro.</p>
<p>A estratégia apresentada aqui foi baseada apenas no artigo Working Effectively With Legacy Code e certamente há muito mais para ser visto sobre isso. Se quiser se aprofundar no assunto, recomendo o episódio do infoq podcast com Michael Feathers ou o livro onde esses temas são detalhados.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="referências">Referências<a href="https://itsmemario.com.br/blog/trabalhando-com-codigo-legado#refer%C3%AAncias" class="hash-link" aria-label="Link direto para Referências" title="Link direto para Referências">​</a></h2>
<ul>
<li><a href="http://debug.to/pdf/Michael%20Feathers%20-%20Working%20Effectively%20With%20Legacy%20Code.pdf" target="_blank" rel="noopener noreferrer">Working effectively with legacy code</a></li>
<li><a href="https://www.infoq.com/podcasts/working-effectively-legacy-code/" target="_blank" rel="noopener noreferrer">InfoQ Podcast</a></li>
</ul>]]></content>
        <author>
            <name>Mário Sousa</name>
            <uri>https://itsmemarioss.com.br</uri>
        </author>
        <category label="Programação" term="Programação"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Java SE 11 Developer Certification: O que mudou]]></title>
        <id>https://itsmemario.com.br/blog/java-se-11-developer-certification-o-que-mudou</id>
        <link href="https://itsmemario.com.br/blog/java-se-11-developer-certification-o-que-mudou"/>
        <updated>2021-04-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Banner de comemoração dos 25 anos java]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Banner de comemoração dos 25 anos java" src="https://itsmemario.com.br/assets/images/image-584a596e74b96ee8e8ca9103f87f1df5.png" width="1000" height="523" class="img_ev3q"></p>
<p>Recentemente, aproveitando a promoção do 25ª aniversário do Java, atualizei a minha certificação Java 8 para a versão 11 e algumas coisas foram diferentes dessa vez. Não só os novos tópicos incluídos na prova, mas também a forma pela qual optei em fazer o teste.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="novos-tópicos">Novos tópicos<a href="https://itsmemario.com.br/blog/java-se-11-developer-certification-o-que-mudou#novos-t%C3%B3picos" class="hash-link" aria-label="Link direto para Novos tópicos" title="Link direto para Novos tópicos">​</a></h2>
<p>Foram removidos da lista de conteúdos, Java SE Date/Time API e o design de classes e padrões de projetos como singleton e classes imutáveis. O primeiro tópico aparece de forma discreta dentro de outros tópicos como Localization. O segundo não aparece. No entanto, para compensar, novos tópicos foram adicionados.</p>
<p>O Java 9 trouxe o mundo modular para a plataforma e essa big feature não estaria de fora de uma certificação Java 11. O exame não cobre todos os aspectos da programação modular e foca apenas em princípios, como definir minimamente um módulo e os comandos necessários para compilar e executar códigos modulares. Essa é uma feature que certamente ditará o rumo do java e você deve focar um tempo nesse assunto de qualquer forma. Um bom material é o capítulo do livro<a href="https://www.amazon.com/Core-Java-II-Advanced-Features-11th/dp/0135166314" target="_blank" rel="noopener noreferrer"> Core Java Volume II</a> que cobre os principais pontos do sistema de módulos.</p>
<p>Outra novidade do exame é a inclusão da inferência de tipo em variáveis locais e o uso apropriado do <code>var</code>. Nesse ponto, o teste espera que você seja capaz de identificar usos incorretos do <code>var</code>.</p>
<p>Nas certificações anteriores, era cobrado basicamente o uso de somente uma annotation, <code>@Override</code>. Agora, esse tópico foi alargado e nele estão incluídos temas como a correta criação, aplicação e processamento de anotações, além do uso de outras annotations como <code>@SafeVarags</code> e <code>@SuppressWarnings</code>.</p>
<p>Além dos tópicos mencionados anteriormente, foi adicionado também uma sessão de codificação segura ou Secure Coding in Java SE Applications. Esse é um tema amplo e importante que merece uma dedicação exclusiva. Você deve esperar pelo menos duas ou três questões sobre segurança. Aqui a certificação foca mais em boas práticas e menos no uso da API. Todo o material necessário para esse tópico pode ser encontrado no Guideline Java. Independentemente, se você pretende se certificar, essa é uma leitura obrigatória e é um tema que ainda aparecerá por aqui. 😀</p>
<div><div class="call-to-action"><h2>Secure Coding Guidelines for Java SE</h2><p>Saiba mais sobre secure coding na página oficial da Oracle.</p><a class="button button--primary" href="https://www.oracle.com/java/technologies/javase/seccodeguide.html">Ver guideline</a></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="a-prova">A prova<a href="https://itsmemario.com.br/blog/java-se-11-developer-certification-o-que-mudou#a-prova" class="hash-link" aria-label="Link direto para A prova" title="Link direto para A prova">​</a></h2>
<p>Dessa vez, devido ao contexto atual, não fiz a prova em um test center e optei por tentar de casa. Certamente foi a melhor opção, primeiro porque não precisei me deslocar e segundo porque me senti muito mais confortável. O teste é feito pela PearsonVue também e é necessário baixar o software do exame. Antes do teste, você precisa validar seu computador, webcam, microfone e conexão com internet, que são os itens principais. Sistemas operacionais Linux não são suportados.</p>
<p>Antes do teste é obrigatório tirar fotos do ambiente e da mesa onde você fará a prova. Sua mesa deve conter somente o computador e não é permitido dois monitores, celulares ou relógios. Minutos antes do início do teste, um “fiscal” entrou em contato por uma chamada através do próprio sistema de certificação e me pediu para ver o ambiente em que eu estava para que pudesse ser novamente validado. Tive que fazer um mini tour pela sala e me comunicar em inglês com o fiscal. Não sei se em outros timezones haverá alguém que fale outras línguas. Mas você deve estar preparado para ao menos entender e atender aos pedidos realizados.</p>
<p>O ponto negativo de não estar em um centro de teste é que nos tornamos responsáveis por coisas importantes que seriam garantidas pelo test center, como um ambiente tranquilo e sem interrupção. Caso opte por esse tipo de teste, escolha um bom lugar e garanta que não será interrompido, pois caso alguém apareça no ambiente enquanto você está realizando a prova, ou vozes sejam ouvidas, é possível que seu teste seja anulado. A webcam fica ligada durante todo o tempo e o teste é gravado.</p>
<p>Eu não tive muito tempo para me preparar para essa certificação, então acabei por focar nos novos tópicos e revisar os anteriores com simulados. Eu treinei para o exame usando o banco de questões da <a href="https://enthuware.com/" target="_blank" rel="noopener noreferrer">Enthuware</a>, ferramenta que usei também para os testes anteriores. Fiz ao todo 12 simulados com cerca de 50 questões, dos quais falhei somente em um. Esses simulados são mais difíceis do que o teste real, o que ajuda muito na preparação. Como resultado, consegui me certificar com <strong>80%</strong> o que não é mau, embora tenha sido abaixo da minha nota anterior.</p>
<p><img decoding="async" loading="lazy" alt="Imagem com report dos simulados realizados" src="https://itsmemario.com.br/assets/images/progress-report-0fa7f7c5886eb59e99aee95b93691a46.png" width="1598" height="455" class="img_ev3q"></p>
<div><div class="call-to-action"><h2>Java SE 11 Developer Exam Number: 1Z0-819</h2><p>Acesse o link abaixo para ver o conteúdo do teste e mais informações sobre a prova.</p><a class="button button--primary" href="https://education.oracle.com/java-se-11-developer/pexam_1Z0-819">Ver conteúdo</a></div></div>]]></content>
        <author>
            <name>Mário Sousa</name>
            <uri>https://itsmemarioss.com.br</uri>
        </author>
        <category label="Java" term="Java"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Java Language Updates – From 9 to 15]]></title>
        <id>https://itsmemario.com.br/blog/java-language-updates–from-9-to-15</id>
        <link href="https://itsmemario.com.br/blog/java-language-updates–from-9-to-15"/>
        <updated>2021-02-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Depois de longos anos e grandes mudanças, a plataforma java vem evoluindo a passos rápidos. Essa agilidade atual se deve ao novo sistema de release da plataforma onde a cada seis é lançada uma nova versão. Dessa forma não temos que esperar anos por novidades. No entanto, precisamos nos atualizar a cada seis meses?]]></summary>
        <content type="html"><![CDATA[<p>Depois de longos anos e grandes mudanças, a plataforma java vem evoluindo a passos rápidos. Essa agilidade atual se deve ao novo sistema de release da plataforma onde a cada seis é lançada uma nova versão. Dessa forma não temos que esperar anos por novidades. No entanto, precisamos nos atualizar a cada seis meses?</p>
<p>Na minha opinião, o ritmo de adoção das versões é mais lento que o ritmo de lançamento, não necessariamente precisamos ficar ansiosos com novas features, uma vez que as empresas adotarão as versões em ritmos diferentes. Um ponto importante a ser notado é o fato de que as versões non-LTS só possuem suporte por seis meses. Sendo assim, talvez seja melhor adotar as versões LTS que são lançadas a cada 3 anos. O Java 11 é a atual versão LTS e será “substituída” pelo Java 17, no entanto é previsto um tempo de suporte de cerca de 8 anos para versões LTS. Ou seja, ainda temos muito tempo para nos adaptarmos ao mundo modular.</p>
<p>Deixo abaixo um webinar onde apresento um resumo das alterações que foram introduzidas na linguagem entre as versões 9 a 15.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/uzcJ8natbNw?si=l0oF8wjf5BfgX1Ou" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>]]></content>
        <author>
            <name>Mário Sousa</name>
            <uri>https://itsmemarioss.com.br</uri>
        </author>
        <category label="Programação" term="Programação"/>
        <category label="Java" term="Java"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[3 coisas que me ajudaram a ser mais produtivo]]></title>
        <id>https://itsmemario.com.br/blog/3-coisas-que-me-ajudaram-a-ser-mais-produtivo</id>
        <link href="https://itsmemario.com.br/blog/3-coisas-que-me-ajudaram-a-ser-mais-produtivo"/>
        <updated>2021-02-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Imagem de um calendário]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" src="https://unsplash.com/photos/FoKO4DpXamQ/download?force=true&amp;w=1920" alt="Imagem de um calendário" class="img_ev3q"></p>
<p>À medida que o tempo passa e seu conhecimento cresce, você será naturalmente mais interrompido por dúvidas, reuniões, mensagens, etc. Interrupções contínuas diminuem a produtividade e certamente será um problema que você terá que lidar cedo ou tarde. Neste artigo, apresento 3 "coisas" que me ajudaram a lidar com essa situação.</p>
<p>Quando alcançamos um certo nível de senioridade, alguns minutos nossos podem salvar horas da equipe. Pense nisso, um membro da equipe pode demorar horas para resolver um problema ou entender parte do projeto ao passo que você pode explicar e/ou dar um direcionamento em questão de minutos, ou seja, te interromper pode literalmente economizar dinheiro.</p>
<p>No entanto, em algum momento você vai perceber que parte significante do seu trabalho é ajudar os outros e que possivelmente você terá menos tempo para resolver suas próprias tarefas. Quando esse dia chegar você precisará ser mais eficiente.</p>
<p>Algo similar aconteceu comigo e depois de ler um artigo enviado por um amigo, consegui pôr em prática algumas coisas que me ajudaram a ser mais produtivo e evitar algumas interrupções. Vamos a isto!</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="documentação">Documentação<a href="https://itsmemario.com.br/blog/3-coisas-que-me-ajudaram-a-ser-mais-produtivo#documenta%C3%A7%C3%A3o" class="hash-link" aria-label="Link direto para Documentação" title="Link direto para Documentação">​</a></h2>
<p>Talvez demore um tempo até percebermos a importância de documentar (apesar que gerir documentação efetivamente é um pesadelo à parte). Não é incomum interrompermos alguém com dúvidas recorrentes, por isso documentar pode nos salvar vários minutos. Então tente tornar a atividade de documentar algo natural. Dúvidas gerais podem ser documentadas a fim de servir como referência, ou um FAQ. Por exemplo:</p>
<ul>
<li>Qual o processo para solicitar uma nova regra de firewall?</li>
<li>Qual o processo de release de uma nova versão?</li>
<li>Já viu esse erro…?</li>
<li>...</li>
</ul>
<p>Percebo que para muitas pessoas a documentação está necessariamente associada a coisas técnicas e requisitos, ao passo que coisas mais rotineiras como processos não são documentadas. Para demonstrar esse ponto vamos a um exemplo.</p>
<p>Recentemente estive envolvido na migração de alguns microserviços para uma nova plataforma. O microserviço no qual estava trabalhando não era o único que deveria passar pelo mesmo processo e existiam outras quantas tarefas similares. Certamente os problemas encontrados por mim seriam encontrados nas próximas tarefas.</p>
<p>Então, ao iniciar a tarefa, aproveitei para criar uma nova página no confluence do time onde coloquei os principais steps da migração, os erros encontrados e as soluções. Feito isso, enviei a documentação para todos do time e pedi que atualizassem conforme fosse necessário. Desta forma, além de compartilhar o conhecimento acabei por otimizar meu tempo, não tendo que responder dúvidas recorrentes.</p>
<p>Experimente da próxima vez que te perguntarem algo, gastar alguns minutos a mais para documentar sua resposta. Quando a mesma dúvida surgir novamente, gaste apenas alguns minutos revisando o que havia escrito e envie o link da documentação. Além de economizar tempo, isso ajuda a educar o time a documentar e procurar por soluções antes de gerar interrupções.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>dica</div><div class="admonitionContent_BuS1"><ul>
<li>Mantenha os readmes dos projetos atualizados, nada de readmes só com título</li>
<li>Utilize uma ferramenta de documentação que permita busca e edições rápidas</li>
<li>Documente processos repetitivos</li>
</ul><p>Com agentes de IA pode ser ainda mais fácil buscar por documentação ou informações específicas. Os agentes podem se integrar com ferramentas como email, sites internos, etc... Além disso, gerar texto é mais rápido, basta alguns linhas e instruções para gerar documentações minimamente decentes.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="timeboxing">Timeboxing<a href="https://itsmemario.com.br/blog/3-coisas-que-me-ajudaram-a-ser-mais-produtivo#timeboxing" class="hash-link" aria-label="Link direto para Timeboxing" title="Link direto para Timeboxing">​</a></h2>
<p>Timeboxing é a estratégia de alocar um período fixo de tempo para tarefas específicas. Experimente alocar um tempo diário para suas tarefas e adicione isto ao seu calendário para que os outros membros da sua organização vejam que durante este período você não estará disponível.</p>
<p>Tente descobrir em qual período do dia você é mais produtivo e aloque tempo para suas próprias tarefas durante esse timebox. É basicamente uma reunião com você mesmo. Bloqueie o calendário se possível. Obviamente, algumas reuniões são mais importantes do que outras e é possível que essa estratégia nem sempre funcione. Por isso é preciso também evitar reuniões desnecessárias.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="evite-reuniões-desnecessárias">Evite reuniões desnecessárias<a href="https://itsmemario.com.br/blog/3-coisas-que-me-ajudaram-a-ser-mais-produtivo#evite-reuni%C3%B5es-desnecess%C3%A1rias" class="hash-link" aria-label="Link direto para Evite reuniões desnecessárias" title="Link direto para Evite reuniões desnecessárias">​</a></h2>
<p>Quando perceber que a sua presença em uma reunião é desnecessária, peça educadamente para sair da reunião. Reuniões são caras e como profissionais devemos gastar nosso tempo da forma mais produtiva possível. De forma similar, caso esteja responsável por alguma reunião, tenha a sensibilidade de liberar as pessoas tão logo elas não sejam mais requeridas. Assim é possível otimizar o trabalho e reduzir interrupções.</p>
<p>Reuniões sem agenda ou pelo menos um título claro explicando do que se trata são ótimas candidatas a serem ignoradas. :)</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>dica</div><div class="admonitionContent_BuS1"><p>Expor um problema o mais rápido possível também nos ajuda a ser mais produtivos, não fique esperando pela próxima reunião para dizer que tem um blocker. Alguns assuntos podem ser resolvidos de forma assíncrona. Peça ajuda ou esclarecimentos sempre que necessário, mas não esqueça de tentar resolver e explorar o tema antes.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="referências">Referências<a href="https://itsmemario.com.br/blog/3-coisas-que-me-ajudaram-a-ser-mais-produtivo#refer%C3%AAncias" class="hash-link" aria-label="Link direto para Referências" title="Link direto para Referências">​</a></h2>
<ul>
<li><a href="https://swizec.com/blog/why-senior-engineers-get-nothing-done/" target="_blank" rel="noopener noreferrer">Why senior engineers get nothing done</a></li>
</ul>]]></content>
        <author>
            <name>Mário Sousa</name>
            <uri>https://itsmemarioss.com.br</uri>
        </author>
        <category label="Carreira" term="Carreira"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Uma breve introdução sobre licenças open source]]></title>
        <id>https://itsmemario.com.br/blog/uma-breve-introducao-sobre-licencas-open-source</id>
        <link href="https://itsmemario.com.br/blog/uma-breve-introducao-sobre-licencas-open-source"/>
        <updated>2020-12-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Palavra open em letras de led com cores diferentes]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Palavra open em letras de led com cores diferentes" src="https://itsmemario.com.br/assets/images/image-2aed84a5b3c22c6fa04c6c9fff1ea468.jpg" width="1920" height="1187" class="img_ev3q">
Photo by <a href="https://unsplash.com/@sonance?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Viktor Forgacs - click ↓↓</a> on <a href="https://unsplash.com/photos/red-and-white-open-neon-signage-LNwIJHUtED4?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
<p>Recentemente precisei escolher uma licença open source para um novo projeto, o <a href="http://ecordel.com.br/" target="_blank" rel="noopener noreferrer">e-cordel</a>. Para atingir meu objetivo, tive que pesquisar, ler, ver conferências, etc até estar minimamente seguro. Percebi que mesmo usando projetos open source durante toda a minha carreira, não tinha um bom entendimento sobre o tema. Por isso, trago hoje um pouco sobre esse tópico. Antes de mais nada, deixo claro que não sou advogado e este artigo é apenas um compilado do meu atual entendimento sobre o assunto.</p>
<p>Para compreender o que é um projeto open source e porque licenças são importantes, precisamos primeiro saber o que são direitos autorais.</p>
<p>O criador de uma obra intelectual possui direitos e prerrogativas que lhe garantem exclusivamente o direito de explorar, copiar, vender e colher qualquer benefício proveniente desse trabalho. O direito autoral é garantido por lei e serve para proteger a propriedade intelectual do indivíduo. Como você pode imaginar, essas regras também se aplicam à produção de software, pois obviamente é trabalho intelectual, como pode ser visto abaixo na <a href="http://www.planalto.gov.br/ccivil_03/leis/l9610.htm" target="_blank" rel="noopener noreferrer">lei 9610/98</a>.</p>
<blockquote>
<p>Art. 7º São obras intelectuais protegidas as criações do espírito, expressas por qualquer meio ou fixadas em qualquer suporte, tangível ou intangível, conhecido ou que se invente no futuro, tais como:</p>
<p>...</p>
<p>XII - os programas de computador;</p>
<p>...</p>
<p>§ 1º Os programas de computador são objeto de legislação específica, observadas as disposições desta Lei que lhes sejam aplicáveis.</p>
<p>Lei 9610/98</p>
</blockquote>
<p>No Brasil, <a href="http://www.planalto.gov.br/ccivil_03/leis/l9610.htm" target="_blank" rel="noopener noreferrer">a lei 9610/98</a> que trata de direitos autorais, divide os direitos do autor em dois tipos, direitos morais e patrimoniais. Os direitos morais são intransferíveis e irrenunciáveis, são eles que garantem a autoria da obra. Os direitos patrimoniais por sua vez podem ser cedidos e tratam do direito exclusivo de utilizar e explorar a obra. Nesse caso, o autor deve autorizar expressamente a modalidade de uso, incluindo, cópia, reprodução parcial ou integral, etc.</p>
<p>Para entender estes conceitos, faremos uma análise de um caso hipotético. Imagine que você criou um algoritmo que produz receitas com rapadura de forma aleatória, chamado de rapadura++, e agora deseja compartilhá-lo com a comunidade. Então você decide imprimir o algoritmo e colar no mural da universidade sem nenhuma autorização explícita de uso. Os alunos então começam a ler o código e comentar como poderiam utilizar o mesmo em outras situações. Devido ao sucesso do seu algoritmo, um dos alunos retira o código do mural, faz uma cópia e devolve o mesmo ao local de origem. Você considera isso um problema?</p>
<p>Uma vez que não foi dada nenhuma autorização explícita de reprodução, a cópia não autorizada pode ser considerada uma violação dos direitos autorais, mais especificamente dos direitos patrimoniais, mesmo que o aluno que realizou a cópia não a explore comercialmente, pois segundo o artigo 29 da lei 9610/98, <strong>a utilização da obra depende de autorização prévia e expressa do autor</strong>.</p>
<p>Logo, se o seu intuito era realmente permitir que as pessoas explorem seu algoritmo, você deveria autorizá-las expressamente, poderia inclusive especificar em quais condições o uso do algoritmo é permitido. Ao dar explicitamente essas permissões, você estaria criando uma licença. No entanto, você não precisa criar a sua própria licença, pois já existem várias conhecidas e aprovadas e que cobrem muitos aspectos. Então, faça sua vida e a vida dos outros mais fácil, escolha uma licença existente, pois certamente há alguma que atende os seus objetivos.</p>
<p>Fazendo uma analogia com o mundo técnico, o mural da universidade é o Github. Quando publicamos código em um projeto público, estamos colando o código no mural da universidade sem explicitamente dizer como ele pode ser utilizado. Logicamente, ao concordarmos com <a href="https://docs.github.com/pt/free-pro-team@latest/github/site-policy/github-terms-of-service#d-conte%C3%BAdo-gerado-pelo-usu%C3%A1rio" target="_blank" rel="noopener noreferrer">os termos de uso</a>, estamos dando autorização para o Github armazenar e disponibilizar nosso código. Por isso, se o seu objetivo é permitir que outras pessoas usem seu projeto, você precisa escolher uma licença, pois é possível que a falta de uma licença impeça um indivíduo ou organização de o utilizar por medo de possíveis problemas judiciais.</p>
<blockquote>
<p>Versão curta: Você possui o conteúdo que você cria, mas nos concede determinados direitos a ele, para que possamos exibir e compartilhar o conteúdo que você publicar. Você ainda tem controle sobre seu conteúdo e responsabilidade por ele, e os direitos que você nos concede são limitados àqueles que precisamos para fornecer o serviço. Temos o direito de remover conteúdo ou fechar Contas se precisarmos.</p>
<p>Termos de serviço do Github</p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="tipos-de-licença">Tipos de licença<a href="https://itsmemario.com.br/blog/uma-breve-introducao-sobre-licencas-open-source#tipos-de-licen%C3%A7a" class="hash-link" aria-label="Link direto para Tipos de licença" title="Link direto para Tipos de licença">​</a></h3>
<p>Como está claro, compartilhar um projeto não significa somente tornar o código público, é necessário tratar da distribuição do software e da autorização de uso, ou seja da licença. Conforme mencionado anteriormente, existem várias licenças open source e não é necessário criar uma do zero. Mas o que é uma licença open source?</p>
<p>Licenças open source são licenças aprovadas pela <a href="https://opensource.org/" target="_blank" rel="noopener noreferrer">Open Source Initiative</a> e que cumprem os 10 princípios da <a href="https://opensource.org/osd" target="_blank" rel="noopener noreferrer">definição open source</a>, como a livre redistribuição e a não discriminação contra pessoas ou grupos.</p>
<div><div class="call-to-action"><h2>Veja as licenças aprovadas aqui</h2><p>Acesse a lista oficial de licenças aprovadas pela Open Source Initiative.</p><a class="button button--primary" href="https://opensource.org/licenses/alphabetical">Ver licenças</a></div></div>
<p>As licenças open source se dividem em dois grandes grupos: copyleft e permissive. Copyleft são licenças que requerem que qualquer modificação no software ou trabalho derivado seja publicado com a mesma licença do trabalho original. A maioria das licenças copyleft são open source, no entanto nem toda licença open source é uma licença copyleft. Uma licença copyleft muito conhecida é a GNU General Public License, usada por projetos como Ansible, Bash e Gimp.</p>
<p>Licenças do tipo permissive são basicamente não copyleft, ou seja, elas permitem a distribuição das modificações e trabalhos derivados em outros termos. Isso significa que um projeto não copyleft pode ser inclusive redistribuído como um software proprietário. As licenças MIT e Apache License 2.0 são exemplos de permissive license e são amplamente utilizadas.</p>
<p>Em geral, empresas preferem projetos licenciados como não copyleft. Existem inclusive empresas que mantém projetos open source, como a Confluent, principal committer do projeto Apache Kafka. Não é raro ver empresas de tecnologia que foram criadas pelos autores do projeto open source e que se dedicam quase que exclusivamente a prestar consultoria e/ou desenvolvem versões enterprise do produto.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="como-escolher">Como escolher<a href="https://itsmemario.com.br/blog/uma-breve-introducao-sobre-licencas-open-source#como-escolher" class="hash-link" aria-label="Link direto para Como escolher" title="Link direto para Como escolher">​</a></h3>
<p>Já sabemos que existem várias licenças e provavelmente você vai encontrar uma que se adeque às suas necessidades. Mas como escolher dentre várias opções?</p>
<p>Sites como <a href="https://choosealicense.com/" target="_blank" rel="noopener noreferrer">choose a license</a> e <a href="https://tldrlegal.com/" target="_blank" rel="noopener noreferrer">tldr legal</a>, te ajudam a escolher uma licença ou pelo menos te dão um caminho. Nesses sites você pode encontrar um resumo da licença, indicando o que ela permite ou não.</p>
<p>Para escolher uma licença open source eu diria que precisamos responder minimamente à seguinte pergunta:</p>
<blockquote>
<p>Você espera que todo trabalho desenvolvido a partir do original seja sempre compartilhado?</p>
</blockquote>
<p>Se você se importa com as contribuições e quer evitar que outras pessoas possam distribuir versões fechadas do seu trabalho, provavelmente você deveria escolher uma licença copyleft, como a GPL.</p>
<p>Se você não se importa com isso, provavelmente deveria escolher uma licença permissiva, como MIT ou Apache License 2.0.</p>
<p>Para o projeto <a href="http://ecordel.com.br/" target="_blank" rel="noopener noreferrer">e-cordel</a> que estou desenvolvendo atualmente, a resposta para a pergunta anterior foi um não. Nós do projeto e-cordel não nos importamos que o projeto possa ser copiado e redistribuído com outra licença. O objetivo do projeto, para além de contribuir com cultura do cordel é ajudar o desenvolvimento tecnológico da região no qual está inserido. Ou seja, se uma empresa ou alguém criar um produto a partir do trabalho desenvolvido, estaremos indiretamente contribuindo com o desenvolvimento da região também.</p>
<p>Dentre as licenças permissivas mais famosas, escolhemos a Apache License 2.0 em detrimento da MIT pois a MIT é demasiadamente simples e não trata de itens como a transmissão dos direitos dos contribuidores, ao passo que a Apache License 2.0 define uma cláusula para isso. Ou seja, ao contribuir com um projeto licenciado como Apache License 2.0, você está automaticamente cedendo seus direitos patrimoniais ao projeto.</p>
<p>Outro ponto a ser notado é que as empresas tendem a utilizar mais projetos com licenças permissivas, pois licenças copyleft podem ter um comportamento viral. Mas isso é tema para um outro post.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="special-thanks">Special Thanks<a href="https://itsmemario.com.br/blog/uma-breve-introducao-sobre-licencas-open-source#special-thanks" class="hash-link" aria-label="Link direto para Special Thanks" title="Link direto para Special Thanks">​</a></h2>
<p>Outras pessoas participaram da construção desse artigo, portanto deixo o meu muito obrigado para…</p>
<ul>
<li><a href="https://www.linkedin.com/in/marcelo-santos-sousa-5a354aa9/" target="_blank" rel="noopener noreferrer">Dr. Marcelo</a>, advogado tributarista e irmão, revisou o conteúdo legal deste post.</li>
<li><a href="https://www.linkedin.com/in/regis-brilhante/" target="_blank" rel="noopener noreferrer">Régis Brilhante</a>, engenheiro de software e amigo, contribuiu na construção e revisão do artigo e é uma das forças motoras do e-cordel.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="fontes-e-referências">Fontes e Referências<a href="https://itsmemario.com.br/blog/uma-breve-introducao-sobre-licencas-open-source#fontes-e-refer%C3%AAncias" class="hash-link" aria-label="Link direto para Fontes e Referências" title="Link direto para Fontes e Referências">​</a></h3>
<ul>
<li><a href="https://choosealicense.com/" target="_blank" rel="noopener noreferrer">Choose a license</a></li>
<li><a href="https://tldrlegal.com/" target="_blank" rel="noopener noreferrer">TL-DR legal</a></li>
<li><a href="https://opensource.org/" target="_blank" rel="noopener noreferrer">opensource.org</a></li>
<li><a href="https://canaltech.com.br/produtos/O-que-e-open-source/" target="_blank" rel="noopener noreferrer">O que é open source</a></li>
<li><a href="http://www.planalto.gov.br/ccivil_03/leis/L9609.htm" target="_blank" rel="noopener noreferrer">Lei 9609/98</a></li>
<li><a href="http://www.planalto.gov.br/ccivil_03/leis/l9610.htm" target="_blank" rel="noopener noreferrer">Lei 9610/98</a></li>
</ul>]]></content>
        <author>
            <name>Mário Sousa</name>
            <uri>https://itsmemarioss.com.br</uri>
        </author>
        <category label="Desenvolvimento de Software" term="Desenvolvimento de Software"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Certificação vale a pena?]]></title>
        <id>https://itsmemario.com.br/blog/certificacao-vale-a-pena</id>
        <link href="https://itsmemario.com.br/blog/certificacao-vale-a-pena"/>
        <updated>2020-08-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Não é raro alguém me perguntar se vale a pena adquirir uma certificação. E de forma resumida, a minha opinião é sim, vale a pena por um motivo específico que vou abordar mais a frente. No entanto, valer a pena não é o mesmo que ser obrigatório e isso pode variar dependendo da área. Em cada área a importância de uma certificação pode ser diferente. Para um programador uma certificação pode não ter o mesmo peso que teria para um gerente de projetos.]]></summary>
        <content type="html"><![CDATA[<p>Não é raro alguém me perguntar se vale a pena adquirir uma certificação. E de forma resumida, a minha opinião é sim, vale a pena por um motivo específico que vou abordar mais a frente. No entanto, valer a pena não é o mesmo que ser obrigatório e isso pode variar dependendo da área. Em cada área a importância de uma certificação pode ser diferente. Para um programador uma certificação pode não ter o mesmo peso que teria para um gerente de projetos.</p>
<p><strong>Por isso, considere que esse texto se refere exclusivamente às certificações para programadores.</strong></p>
<p>Eu adquiri duas certificações java com scores altos e hoje posso dizer que não me arrependo de ter investido tempo e dinheiro nesse objetivo. No entanto, depois de ter passado por esse processo e de ter ganho mais experiência ao longo dos anos, penso que desenvolvi um olhar diferente sobre as certificações.</p>
<p>O grande ponto da certificação na minha opinião não é necessariamente o certificado, mas sim o processo. Durante a minha preparação para adquirir certificações java descobri o quanto eu desconhecia a linguagem com a qual trabalhava. Possuir um conhecimento mais aprofundado nessa linguagem teve um impacto muito positivo na minha carreira e isso se refletiu no meu trabalho diário e também nas avaliações e entrevistas das quais participei.</p>
<p>Aprender bem as tecnologias com as quais você trabalha é fundamental e esse é o ponto principal. Obviamente esse objetivo pode ser alcançado de outras maneiras e não exclusivamente através de uma certificação. Ou seja, é possível comprar o material específico da prova e/ou outros materiais e estudar por conta própria sem ter que se submeter a um teste. Ou talvez você nem precise comprar material algum, você pode somente ler a documentação da sua linguagem, livros, blogs etc. e aprofundar seus conhecimentos.</p>
<p>Algo a ser notado também é que uma certificação não te tornará imediatamente um bom programador. A prática e o auto criticismo sim. Programar é em geral fácil, programar bem é difícil. Por exemplo, ter uma certificação não fará você desenvolver um código limpo e fácil de manter. Na minha opinião, um bom programador é um conjunto de habilidades + conhecimento adequado da linguagem e ferramentas, ou seja, a certificação é apenas uma parte da sua jornada. A maioria dos profissionais com os quais trabalhei não eram certificados e isso de forma alguma diminui a relevância ou capacidade deles. A diferença entre os melhores está nas bases e na experiência adquirida. Não é o título que conta, é a experiência.</p>
<p>No entanto, como discutido no vídeo abaixo, a certificação pode fazer muito sentido para quem deseja entrar no mercado de trabalho. De certa maneira esta era a minha situação quando decidi me certificar, pois eu procurava uma realocação fora do país e vi nas certificações uma forma de adquirir e comprovar meus conhecimentos.</p>
<iframe width="1080" height="608" src="https://www.youtube.com/embed/IkPh53jDnwo?feature=oembed" title="Vale a pena fazer uma certificação?" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>
<p>Como conclusão, acredito que o processo de se certificar te proporcionará mais conhecimento e se assim como eu, você precisar de um incentivo extra para estudar, elas podem ser uma ótima opção. Mas lembre-se, se certificar pode ser um processo difícil e caro que pode não te trazer um retorno imediato. Se você já possui anos de carreira, acredito que ler bons livros te trará um resultado igual ou superior com um custo menor. Além disso, a relevância da certificação está muito atrelada à fase que o profissional se encontra o que não quer dizer que a certificação não vale a pena ou seja desnecessária, significa apenas que no momento atual existem outras coisas que podem fazer mais sentido para você.</p>]]></content>
        <author>
            <name>Mário Sousa</name>
            <uri>https://itsmemarioss.com.br</uri>
        </author>
        <category label="Carreira" term="Carreira"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Primeiros passos com Java Profiler]]></title>
        <id>https://itsmemario.com.br/blog/primeiros-passos-com-java-profiler</id>
        <link href="https://itsmemario.com.br/blog/primeiros-passos-com-java-profiler"/>
        <updated>2020-06-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Cronômetro]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="Cronômetro" src="https://itsmemario.com.br/assets/images/image-57a2b549a1fcb466c5bbace948fff7bd.jpg" width="1920" height="1080" class="img_ev3q">
Photo by <a href="https://unsplash.com/@venmer?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Stanislav</a> on <a href="https://unsplash.com/photos/silver-and-white-round-analog-watch-2Yj6MBvJ0sg?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
<p>Durante a minha (curta) carreira como programador, raramente tive que otimizar trechos de código para extrair o melhor rendimento possível, acredito que isso se deve principalmente por ter trabalhado em projetos simples, sem tantos requisitos de performance. Ainda assim, acredito que raramente você estará escovando bits. Porém, em situações adversas e com infra limitada, será necessário lutar por milissegundos.</p>
<p>Imagine o seguinte cenário: uma aplicação multithread, que processa milhões de registros diariamente e que deve fazer isso de forma eficiente. Imagine também que escalar verticalmente e/ou horizontalmente não é uma opção neste exemplo, por enquanto aceite que não há mais recursos e que depois de code reviews e algumas otimizações lógicas você tem a sensação de não saber mais o que fazer. E ai?</p>
<p>Bom, algo similar aconteceu comigo. Como relatei anteriormente, raras as vezes tive que otimizar aplicações para extrair o melhor rendimento, além disso, o fiz em contextos mais simples, não concorrentes. Então estava em uma situação onde o conhecimento e experiência que eu tinha me levaram o mais longe possível.</p>
<p><img decoding="async" loading="lazy" src="https://media.giphy.com/media/Oj5w7lOaR5ieNpuBhn/giphy.gif" alt="Gif ilustrando reação" class="img_ev3q"></p>
<p>Aumentar o paralelismo da aplicação já não me parecia a melhor ideia, muito provavelmente devido a deadlocks e starvations, clássicos problemas de programação concorrente. Então, em conversa com outros programadores, decidimos analisar a aplicação com um profiler a fim de encontrar hot spots.</p>
<p>Profilers são tools para análise dinâmica de código, eles funcionam basicamente observando a execução do código de forma a extrair informações, como quantas vezes um trecho foi executado e qual o tempo de execução.</p>
<p>Com esse tipo de ferramenta é possível visualizar os famosos hot spots, ou seja, partes do programa que demoram mais a serem executados ou partes executadas mais frequentemente. Também é possível identificar quais partes do código consomem mais memória, se esse for o caso.</p>
<p>No mundo java, um bom profiler é o visualmv, o qual é enviado juntamente com JDK 6, 7 e 8. Esse profiler instrumenta o código java adicionando bytecodes extras a fim de monitorar a execução. Para executá-lo basta utilizar o comando jvisualvm no terminal.</p>
<p>Caso não queira utilizar a versão enviada juntamente com JDK, você pode fazer o download da última versão <a href="https://visualvm.github.io/download.html" target="_blank" rel="noopener noreferrer">aqui</a>.</p>
<p>Para ilustrar o uso do visualvm, criei um exemplo simples que emula um processamento demorado. Uma simples classe que para cada número par, soma 100 e apresenta no console o resultado. No entanto o último step do processamento é propositalmente lento, pois sem isso não haveria artigo 😂.</p>
<p>Ao executar o visualvm, é possível ver na tela inicial todos os processos java que estão sendo executado na máquina local. Para começar a analisá-los o que você precisa fazer é simplesmente um double click. Com o código de exemplo executando, procure no visualvm um processo chamado Main. Abra o processo, selecione a aba Profiler e depois clique no botão CPU. Nesse momento o visualvm deverá instrumentar o código a fim de começar a registrar os dados necessários. Em aplicações grandes esse processo pode demorar algum tempo, por isso, nas configurações podemos especificar quais classes ou pacotes queremos instrumentar.</p>
<p>Na imagem abaixo é possível perceber que o método <code>process</code> é responsável pelo maior tempo de CPU mesmo sendo executado metade das vezes do método <code>evenNumber</code>. O que quero ilustrar aqui é o fato de um profiler poder indicar pontos mais específicos, nos quais podemos focar nossos esforços de otimização.</p>
<p><img decoding="async" loading="lazy" alt="Captura de tela com tempo e cpu utilizado por cada método" src="https://itsmemario.com.br/assets/images/profiling-results-ac6178ce5b703e8c91fd0a0c9a858d1f.png" width="980" height="320" class="img_ev3q"></p>
<p>Esse foi exatamente o resultado no projeto que estive envolvido. Após executar o profiler na aplicação identifiquei alguns hot spots que eventualmente foram reescritos para reduzir o tempo de processamento, seja utilizando cache dos resultados de processamentos externos ou reaproveitando objetos caros.</p>
<p>Pessoalmente, não acredito que devemos sair por aí executando profilers em todas as aplicações e otimizando indiscriminadamente algo que funciona muito bem. Devemos otimizar código somente quando for necessário, pois nem toda otimização tem o mesmo ROI, ou seja, algumas otimizações não serão percebidas pelo seu cliente. No entanto, isso não quer dizer que podemos ser desleixados com o código, otimizar o código de certa forma passa naturalmente por conhecer melhor as ferramentas que usamos, como por exemplo saber quando faz sentido usar LinkedList no lugar de ArrayList. De toda maneira, um bom profiler é uma boa opção para se ter na sua caixa de ferramentas, porém nunca esqueça que em muitos casos a otimização prematura é a raiz de todo mal.</p>]]></content>
        <author>
            <name>Mário Sousa</name>
            <uri>https://itsmemarioss.com.br</uri>
        </author>
        <category label="Java" term="Java"/>
        <category label="Programação" term="Programação"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Como planejar metas anuais]]></title>
        <id>https://itsmemario.com.br/blog/como-planejar-metas-anuais</id>
        <link href="https://itsmemario.com.br/blog/como-planejar-metas-anuais"/>
        <updated>2020-01-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Como foi o ano anterior para você? Conseguiu atingir todos os seus objetivos? Nem sempre consigo atingir os meus, a verdade é que sempre ficam dois ou três pendentes, mas isso não é um problema, o mais importante é termos metas bem definidas, pois sem isso acredito que não temos foco, o que torna mais difícil atingir bons resultados.]]></summary>
        <content type="html"><![CDATA[<p>Como foi o ano anterior para você? Conseguiu atingir todos os seus objetivos? Nem sempre consigo atingir os meus, a verdade é que sempre ficam dois ou três pendentes, mas isso não é um problema, o mais importante é termos metas bem definidas, pois sem isso acredito que não temos foco, o que torna mais difícil atingir bons resultados.</p>
<p>Mas para atingir objetivos precisamos do mínimo de planejamento. Para um planejamento de um ano precisamos principalmente ser realistas com nós mesmos e não nos enganarmos. Muitas vezes, iniciar com objetivos menores nos motiva a buscar objetivos maiores. Além disso, um objetivo muito ambicioso, por parecer muito difícil alcançar, pode nos desencorajar.</p>
<p>Uma técnica que uso para realizar meu planejamento anual é conhecida como smart goals. SMART é um acrônimo que representa 5 caraterísticas de uma boa meta, as quais podem ser úteis para avaliar as suas metas pessoais.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="smart-goals">SMART Goals<a href="https://itsmemario.com.br/blog/como-planejar-metas-anuais#smart-goals" class="hash-link" aria-label="Link direto para SMART Goals" title="Link direto para SMART Goals">​</a></h2>
<p>SMART é um acrônimo que representa 5 caraterísticas de uma boa meta, as quais podem ser úteis para avaliar as suas metas pessoais.</p>
<p><a href="https://en.wikipedia.org/wiki/SMART_criteria" target="_blank" rel="noopener noreferrer">Saiba mais</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="como-smart-goals-funciona">Como SMART Goals funciona<a href="https://itsmemario.com.br/blog/como-planejar-metas-anuais#como-smart-goals-funciona" class="hash-link" aria-label="Link direto para Como SMART Goals funciona" title="Link direto para Como SMART Goals funciona">​</a></h2>
<p>Basicamente cada letra SMART possui um significado, uma característica que nos ajuda a focar e pensar se nossa meta é boa em um determinado aspecto. O segredo é verificar se sua meta possui todas essas qualidades. Abaixo explico de forma resumida o significado de cada letra:</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="s---specific-específico">S - Specific (específico)<a href="https://itsmemario.com.br/blog/como-planejar-metas-anuais#s---specific-espec%C3%ADfico" class="hash-link" aria-label="Link direto para S - Specific (específico)" title="Link direto para S - Specific (específico)">​</a></h4>
<p>Uma meta precisa ser específica, ou seja, precisa ter um resultado claro, não pode ser genérica ao ponto de não sabermos como alcançá-la. Aqui pode ser necessário identificar pontos como: quem, quando, como, onde, etc.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="m---measurable-mensurável">M - Measurable (mensurável)<a href="https://itsmemario.com.br/blog/como-planejar-metas-anuais#m---measurable-mensur%C3%A1vel" class="hash-link" aria-label="Link direto para M - Measurable (mensurável)" title="Link direto para M - Measurable (mensurável)">​</a></h4>
<p>Uma boa meta precisa ser mensurável, precisamos saber quão perto estamos de alcançá-la. Definir o tamanho da meta nos ajuda a monitorá-la e entender se a mesma é realista. Nada de manter a meta aberta.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="a---achievable-alcançável">A - Achievable (alcançável)<a href="https://itsmemario.com.br/blog/como-planejar-metas-anuais#a---achievable-alcan%C3%A7%C3%A1vel" class="hash-link" aria-label="Link direto para A - Achievable (alcançável)" title="Link direto para A - Achievable (alcançável)">​</a></h4>
<p>Logicamente uma meta precisa ser alcançável. Não é raro vermos pessoas que traçam metas absurdamente difíceis de forma que são inatingíveis. Metas realistas nos ajudam a nos mantermos no caminho, metas irreais nos desmotivam.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="r---relevant-relevante">R - Relevant (relevante)<a href="https://itsmemario.com.br/blog/como-planejar-metas-anuais#r---relevant-relevante" class="hash-link" aria-label="Link direto para R - Relevant (relevante)" title="Link direto para R - Relevant (relevante)">​</a></h4>
<p>Ao pensarmos em metas precisamos pensar em objetivos relevantes, algo que faça sentido para nós ou para o projeto. Metas que não são relevantes serão descartadas tão logo surja um impedimento.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="t---time-bound-tempo-limite">T - Time-bound (tempo limite)<a href="https://itsmemario.com.br/blog/como-planejar-metas-anuais#t---time-bound-tempo-limite" class="hash-link" aria-label="Link direto para T - Time-bound (tempo limite)" title="Link direto para T - Time-bound (tempo limite)">​</a></h4>
<p>Por fim, uma meta precisa de um tempo definido, um deadline. Quando precisamos ou desejamos obter os resultados? Saber quando algo termina nos ajuda também a começar.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="um-exemplo-de-uma-meta-smart">Um exemplo de uma meta SMART<a href="https://itsmemario.com.br/blog/como-planejar-metas-anuais#um-exemplo-de-uma-meta-smart" class="hash-link" aria-label="Link direto para Um exemplo de uma meta SMART" title="Link direto para Um exemplo de uma meta SMART">​</a></h2>
<p>Para ilustrar tudo isso de forma mais prática, compartilho uma meta pessoal de 2020, identificando os 5 pontos SMART nela.</p>
<p>Em 2020 eu gostaria de ler mais livros do que li em 2019. No ano passado eu li um total de 6 livros, entre livros técnicos e não técnicos. Considero importante o aprendizado constante e além disso, ler é um ótimo hábito. Para mim, a leitura está associada diretamente ao desenvolvimento profissional, por isso a maioria dos livros que pretendo ler em 2020 me ajudarão a construir um conhecimento para me tornar um profissional melhor. No entanto, ler mais livros que 2019 não é tão específico, por isso, decidi que em 2020 a minha meta de leitura é:</p>
<blockquote>
<p>Ler pelo menos 8 livros em 2020, de forma que a maioria seja sobre engenharia de software e áreas afins.</p>
</blockquote>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="specific-específico">Specific (específico)<a href="https://itsmemario.com.br/blog/como-planejar-metas-anuais#specific-espec%C3%ADfico" class="hash-link" aria-label="Link direto para Specific (específico)" title="Link direto para Specific (específico)">​</a></h4>
<p>Quero ler 8 livros, mais que o ano passado e principalmente livros sobre engenharia de software. Já sei quais os títulos que quero ler, o que certamente me ajuda a priorizar e não ler outros temas não relacionados com o objetivo, como as Crônicas de Gelo e Fogo.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="measurable-mensurável">Measurable (Mensurável)<a href="https://itsmemario.com.br/blog/como-planejar-metas-anuais#measurable-mensur%C3%A1vel" class="hash-link" aria-label="Link direto para Measurable (Mensurável)" title="Link direto para Measurable (Mensurável)">​</a></h4>
<p>Consigo facilmente medir se estou alcançando a meta, assim, se ao chegar ao meio do ano e não tiver ao menos próximo de concluir o 4º livro, estou provavelmente atrás do esperado. Lógico, existem livros mais difíceis de ler, livros maiores e menores, mas no geral sei exatamente onde estarei.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="achievable-alcançável">Achievable (alcançável)<a href="https://itsmemario.com.br/blog/como-planejar-metas-anuais#achievable-alcan%C3%A7%C3%A1vel" class="hash-link" aria-label="Link direto para Achievable (alcançável)" title="Link direto para Achievable (alcançável)">​</a></h4>
<p>Considero essa meta alcançável de acordo com os recursos disponíveis, nesse caso, meu tempo. Eu poderia muito bem definir a meta para 10 livros, mas é provável que eu não consiga alcançá-la. Assim, prefiro definir um mínimo de 8, que é superior ao ano passado, mas que principalmente me sinto capaz de fazê-lo.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="relevant-relevante">Relevant (relevante)<a href="https://itsmemario.com.br/blog/como-planejar-metas-anuais#relevant-relevante" class="hash-link" aria-label="Link direto para Relevant (relevante)" title="Link direto para Relevant (relevante)">​</a></h4>
<p>Essa meta está diretamente ligada a minha carreira e desenvolvimento pessoal, por isso é relevante, faz parte de um objetivo maior.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="time-bound-tempo-limite">Time-bound (tempo limite)<a href="https://itsmemario.com.br/blog/como-planejar-metas-anuais#time-bound-tempo-limite" class="hash-link" aria-label="Link direto para Time-bound (tempo limite)" title="Link direto para Time-bound (tempo limite)">​</a></h4>
<p>Prazo para conclusão dessa meta é o ano de 2020. O importante aqui também é notar que o tempo pode influenciar o tamanho da meta. Se minhas metas fossem traçadas para seis meses, certamente teria que diminuir a quantidade de livros, ou aumentar o recurso (tempo) para alcançá-la.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusão">Conclusão<a href="https://itsmemario.com.br/blog/como-planejar-metas-anuais#conclus%C3%A3o" class="hash-link" aria-label="Link direto para Conclusão" title="Link direto para Conclusão">​</a></h2>
<p>Espero que esse artigo o ajude a definir boas metas, não só para os próximos anos, mas também em seus projetos. Planejamento é algo importante e muitas vezes negligenciado por nós. Não podemos ver o ato de planejar como algo exclusivo do mundo empresarial, planejamento deve ser parte do seu mundo pessoal também.</p>]]></content>
        <author>
            <name>Mário Sousa</name>
            <uri>https://itsmemarioss.com.br</uri>
        </author>
        <category label="Carreira" term="Carreira"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[4 coisas que me ajudaram a conseguir um emprego na Europa]]></title>
        <id>https://itsmemario.com.br/blog/emprego-na-europa</id>
        <link href="https://itsmemario.com.br/blog/emprego-na-europa"/>
        <updated>2019-12-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Imagem de um elétrico em Lisboa]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" src="https://unsplash.com/photos/ljhCEaHYWJ8/download?force=true&amp;w=1920" alt="Imagem de um elétrico em Lisboa" class="img_ev3q"></p>
<p>Depois de alguns anos trabalhando como programador no interior do Ceará, decidi que precisava tentar passos maiores na minha carreira. A região que vivia, o cariri cearense, ainda não se tornou um polo tecnológico, portanto, conseguir um bom emprego na área de TI por lá pode não ser tão fácil, já que a região não absorve todos os profissionais que a mesma forma.</p>
<p>Conseguir um emprego melhor como programador, para mim era igual a abrir mão do meu emprego como funcionário público e migrar para os grandes centros. Então, já que teria que deixar minha cidade e ir pra longe, decidi que o melhor seria fazer uma mudança para o exterior.</p>
<p>Embora tivesse alguns anos de experiência, os quais considero pouco, me sentia despreparado para o mercado internacional e por isso, iniciei algumas ações que me ajudariam a conseguir a tão sonhada realocação. Compartilho aqui de forma resumida, 4 coisas que me ajudaram nesse processo:</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="1-certificações">1. Certificações<a href="https://itsmemario.com.br/blog/emprego-na-europa#1-certifica%C3%A7%C3%B5es" class="hash-link" aria-label="Link direto para 1. Certificações" title="Link direto para 1. Certificações">​</a></h2>
<p>Inicialmente decidi adquirir certificações java, para mim, essa era uma forma de provar que eu possuía conhecimentos suficientes com a linguagem que decidi trabalhar. Estudar para certificações me fez aprender mais profundamente sobre Java e suas principais APIs, e esse é o principal objetivo alcançado. Não quero dizer que certificações são obrigatórias, mas o conhecimento mais aprofundado sobre a linguagem que trabalhamos é sim obrigatório, o qual pode ser adquirido de outras formas logicamente. O importante é dedicarmos um tempo para aprendermos o máximo possível o stack com o qual trabalhamos.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="2-inglês">2. Inglês<a href="https://itsmemario.com.br/blog/emprego-na-europa#2-ingl%C3%AAs" class="hash-link" aria-label="Link direto para 2. Inglês" title="Link direto para 2. Inglês">​</a></h2>
<p>Não é necessário comentar que emigrar para outro país, torna o inglês obrigatório. No meu caso, foi um diferencial, já que vim para Portugal. No entanto, a quantidade de projetos nearshore e de empresas de outros países em Portugal, faz com que a língua inglesa seja considerada obrigatória para vários processos de recrutamento. Por isso, dediquei praticamente dois anos de estudos online e um mini intercâmbio para que me sentisse confortável o suficiente com outro idioma.</p>
<p>Além disso, na área de tecnologia, o fato de não saber inglês nos coloca em posição desfavorável, pois os melhores livros e documentações são lançadas em inglês e depois traduzidas pelas comunidades. Saber inglês, pode te colocar em contato direto com a fonte. Quando estudei para certificações java por exemplo, não havia livros em português e a prova de certificação também não era traduzida. Por isso, considero obrigatório ter ao menos um bom nível de leitura em inglês, mesmo que não esteja nos seus planos morar em outro país.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="3-side-projects-e-voluntariado">3. Side Projects e Voluntariado<a href="https://itsmemario.com.br/blog/emprego-na-europa#3-side-projects-e-voluntariado" class="hash-link" aria-label="Link direto para 3. Side Projects e Voluntariado" title="Link direto para 3. Side Projects e Voluntariado">​</a></h2>
<p>As empresas buscam profissionais com experiência validada, o que chamam de real world experience. Mas como podemos adquirir experiência de forma rápida? Bem, a área de TI é uma das áreas mais democráticas de trabalho. Não é necessário um grande investimento para começar, podemos comprar um bom equipamento para trabalhar, podemos começar de casa, até mesmo podemos criar um novo projeto e usá-lo como meio para adquirir mais experiência.</p>
<p>Com isso em mente, procurei um projeto internacional no qual pudesse me juntar e contribuir como voluntário, assim poderia pôr em prática o inglês e comprovar para os recrutadores que eu já estava habituado a trabalhar com outro idioma e projetos internacionais.</p>
<p>Seguindo a recomendação de um amigo de trabalho, me cadastrei no site <a href="https://www.volunteermatch.org/" target="_blank" rel="noopener noreferrer">Volunteer Match</a>, e encontrei um projeto para contribuir como voluntário, o qual faço parte ainda hoje mesmo já estando em outro país. O projeto em questão é o <a href="https://www.8billionminds.com/" target="_blank" rel="noopener noreferrer">8billionminds</a>, um projeto que promove o compartilhamento de conhecimento gratuito.</p>
<p>Com esse projeto, tenho a oportunidade de discutir temas como arquitetura e evolução do sistema com outros devs de várias partes do mundo, pratico inglês gratuitamente e aumento meu networking. Isso é fantástico, você não precisa sair de casa ou fazer muito para conseguir uma experiência validada. Publique seu código no github, crie projetos open sources, mesmo que não haja contribuições no início. Ter um projeto para se dedicar, também é uma ótima maneira de aprender outras tecnologias.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="4-estudo-contínuo">4. Estudo contínuo<a href="https://itsmemario.com.br/blog/emprego-na-europa#4-estudo-cont%C3%ADnuo" class="hash-link" aria-label="Link direto para 4. Estudo contínuo" title="Link direto para 4. Estudo contínuo">​</a></h2>
<p>Se temos que focar em aprender algo bem, devemos focar em aprender o básico. Ter uma base sólida, traz grandes vantagens ao aprender coisas mais complexas. Na minha opinião, devemos focar um tempo considerável em aprender mais profundamente sobre uma linguagem ao invés de frameworks, pois frameworks nascem e morrem e quando você tiver que mudar para um novo, a sua curva de aprendizado será menor caso domine muito bem os conceitos básicos. Por exemplo, trabalhem certo tempo com Java EE, e quando decidi mudar para Spring não senti dificuldades, principalmente porque tinha acumulado um conhecimento mais sólido por conta das certificações.</p>
<p>Conteúdos como algoritmos, orientação a objetos, clean code, TDD são tópicos que transcendem linguagem de programação. Se você trabalha com uma linguagem orientada a objetos, aprender bem o design OO é fundamental, talvez até mais importante que a própria linguagem.</p>
<p>Temos muito o que aprender e por isso, acredito que esse é o tópico mais importante. Muitos desses conhecimentos, só virão com a experiência e a prática, então não se desespere por não saber tudo, você nunca saberá 😀.</p>
<div><div class="call-to-action"><h2>Roadmaps para Desenvolvimento de Software</h2><p>Acesse o site abaixo e veja quantas tecnologias permeiam o desenvolvimento de software.</p><a class="button button--primary" href="https://roadmap.sh/roadmaps/">Ver roadmaps</a></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>dica</div><div class="admonitionContent_BuS1"><p>Estudar continuamente faz parte do trabalho, por isso, enquanto profissionais de TI, devemos encontrar tempo para reciclar os conhecimentos já adquiridos e adquirir novos. Um bom profissional está sempre a aprender.</p></div></div>]]></content>
        <author>
            <name>Mário Sousa</name>
            <uri>https://itsmemarioss.com.br</uri>
        </author>
        <category label="Carreira" term="Carreira"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Clean code - primeiras impressões]]></title>
        <id>https://itsmemario.com.br/blog/clean-code</id>
        <link href="https://itsmemario.com.br/blog/clean-code"/>
        <updated>2019-11-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Mão com luva de limpeza segurando spray]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" src="https://unsplash.com/photos/__ZMnefoI3k/download?force=true&amp;w=1920" alt="Mão com luva de limpeza segurando spray" class="img_ev3q"></p>
<p>Recentemente comecei a ler o famoso livro Clean Code juntamente com o time do projeto no qual me encontro atualmente. Esse é um livro, que na minha opinião, todo programador deve ler e que certamente lhe fará mudar a forma como você programa. Talvez, assim como eu, você pode se perguntar porque não o leu antes.</p>
<p>Passamos mais tempo lendo código do que realmente escrevendo código, portanto não faz sentido mantermos um código sujo. Em um projeto anterior no qual fiz parte, lidamos por muito tempo com um sistema legado e complexo, onde a legibilidade do código era certamente um fator que atrasava todas as estimativas. Além disso, não tínhamos uma cobertura de testes suficiente para nos proporcionar a confiança de refatorar o sistema.</p>
<div class="text--center"><img decoding="async" src="https://media.giphy.com/media/4BnnmOr00GGsw/giphy.gif" alt="animação de um macaco digitando em um laptop desligado" title="" height="auto" width="auto"></div>
<p>Por várias vezes cogitamos iniciar um novo projeto, que seria melhor e fácil de manter, mas será que conseguiríamos atingir nossos objetivos? Ou acabaríamos por criar outro sistema difícil de manter e que eventualmente seria criticado por outros programadores? Quem garantiria a qualidade do código além do aspecto funcional? Afinal de contas, se funciona ninguém mete a mão. Será se seríamos tão cuidadosos quando os deadlines se aproximassem?</p>
<p>É comum cairmos na armadilha de sermos um pouco mais desleixados porque precisamos ser rápidos. E por que fazemos isso? Certamente, um médico não deixaria de lavar as mãos antes da cirurgia porque o paciente está com pressa. Não há voltas a dar:</p>
<blockquote>
<p>Bagunças antigas, reduzem o rendimento, a única maneira é manter o código limpo. <strong>Robert C. Martin</strong></p>
</blockquote>
<p>Ok, mas o que é um código limpo? Bem, essa é uma pergunta de muitas respostas, não é por acaso que no primeiro capítulo do livro várias personalidades da ciência da computação definem o que é clean code. Dentre as definições apresentadas, ficarei com algumas que na minha opinião resumem a ideia geral:</p>
<ol>
<li>Testes: Um código sem testes não é um código limpo.</li>
<li>Legibilidade: Somos autores e temos que tornar fácil a leitura, pois isso facilita a escrita.</li>
<li>Responsabilidade: Um código limpo faz bem apenas uma coisa.</li>
</ol>
<p>Definitivamente, um código sem teste não está limpo. Além de garantir a qualidade do código, os testes nos dão a confiança para melhorá-lo, sem eles, preferimos não tocar no que funciona. Se tivéssemos uma boa cobertura de teste, refatorar um sistema não deveria ser uma grande dor de cabeça, afinal, os testes assegurariam o comportamento anterior.</p>
<p>Embora seja óbvio que módulos, classes, métodos, todos eles devem fazer somente uma coisa, será que realmente entendemos isso? Pessoalmente, acredito que essa qualidade requer um pouco de treino. Após ler alguns capítulos do livro, comecei a perceber que vários métodos que eu escrevi faziam mais de uma coisa e/ou sabiam demais e assim, se acoplavam com outros módulos/classes desnecessariamente.</p>
<p>O código abaixo foi retirado do meu trabalho de conclusão da graduação em 2014. Embora seja um código simples e pequeno ele sofre de vários problemas. :’(</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">public List&lt;Product&gt; getList() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	if(productService == null){</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		ProductDAOImpl produtoDAOImpl = DAOFactory.createProductDAO(contextBean.getEntityManagerForTenanty());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		productService = new ProductService(productDAOImpl);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	if (list == null || list.size() == 0) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		list =  productService.list();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	return list;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">} </span><br></span></code></pre></div></div>
<p>Inicialmente, o nome do método nos sugere, que o mesmo retornará uma lista mas não de que e porque, sabemos que é uma lista de produtos, mas quais produtos? Os mais recentes? Os últimos comprados? Um método deve expressar sua função claramente, assim como o nome de uma variável. Outro ponto, e o que me incomoda mais, é que esse método não deveria se preocupar em instanciar o DAO e o Service, esse método já faz mais de uma coisa. Além disso, esse tipo de código cria um outro nível de acoplamento, a classe sabe demais. Ela sabe como recuperar DAOs e criar services. Lembre-se do S do <a href="https://pt.wikipedia.org/wiki/SOLID" target="_blank" rel="noopener noreferrer">SOLID</a>, um objeto deve ter uma só responsabilidade.</p>
<p>Se a classe A, depende da classe B para funcionar e B é uma dependência obrigatória, então a classe A, deveria receber B através do construtor, basicamente por dois motivos:</p>
<ol>
<li>Isso deixa claro para quem deseja usar a classe A, que ela depende de B e não é possível usar A sem B. Tente não deixar coisas implícitas. Expresse suas suas intenções o mais claro possível.</li>
<li>Declarar explicitamente as dependências de um objeto facilita a escrita de testes e como já sabemos, um código sem teste não é um código limpo.</li>
</ol>
<p>Certo dia, trabalhando no projeto legado o qual mencionei no início do artigo, tentei criar um simples teste unitário e para minha surpresa, ao instanciar uma classe de nome Unidade (salvo engano), com construtor padrão, recebi um erro de conexão com banco de dados. Durante o debug, descobri que objetos que eram criados no construtor da classe sob teste, tentavam se conectar ao banco de dados. What!? Isso mesmo. Por fim, não fiz o teste e não refatorei o código, porque não havia testes que me dessem segurança para fazer tal trabalho. <strong>Ou seja, implícito muitas vezes é ruim, falta de teste é ainda pior</strong>.</p>
<p>No primeiro capítulo, Uncle Bob relata que deveríamos deixar o código melhor do que o encontramos, o que eu não fiz na ocasião porque caí na armadilha do “depois eu faço”. E aqui mora outro problema conhecido como a lei de Leblanc, <strong>depois é igual a nunca</strong>. E realmente foi, pelo menos para mim. Nunca voltei no código para refatorá-lo e é provável que o mesmo esteja tal qual o deixei.</p>
<p>Quando se tem um código “sujo”, com bagunças anteriores, sem testes, com baixa legibilidade, etc, temos mais desculpas para não fazermos um código melhor, afinal, tudo já está sujo mesmo não é? Não faz diferença. Isso me lembra da teoria das <a href="https://en.wikipedia.org/wiki/Broken_windows_theory" target="_blank" rel="noopener noreferrer">janelas quebradas</a>: sinais visíveis de desordem encorajam mais desordem. Não tenho dúvida quanto a isso, pelo menos não quando o assunto é código.</p>
<p>Outro ponto negativo do método anterior, é a falta de expressividade no nome das variáveis e métodos. Nomes significativos, métodos pequenos, classes coesas, tudo isso tem um impacto sobre a legibilidade. O código limpo deve contar uma história, deve expressar bem suas intenções e não deveria deixar nada implícito. Aparentemente, um lazy loading é realizado na lista que armazena os produtos, mas isso não é tão expressivo.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>dica</div><div class="admonitionContent_BuS1"><p>Escolha nomes significativos, que expressam o porquê daquele código existir.</p></div></div>
<p>Após ler 8 capítulos do livro, veja abaixo como eu reescreveria hoje esse código:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">public List&lt;Product&gt; getAllProducts() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	if (productListIsEmpty()) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">		productList =  productService.getAllProducts();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	return productList;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">private boolean productListIsEmpty(){</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	return productList == null || productList.isEmpty();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>Primeiro ponto, o nome do método é mais significativo. Segundo ponto, ele faz só uma coisa, recupera a lista de produtos e para isso usa uma instância de um service, que por sua vez, seria passado via construtor da classe, provavelmente por um framework de injeção de dependência como o Spring.</p>
<p>Esse código conta uma história um pouco melhor que a anterior e esse é o último ponto. Devemos contar histórias através do código, para que o próximo programador não tenha que se esforçar tanto para entender o que está acontecendo ali. Mantenha seu código pequeno e simples, tente contar um história e lembre-se, se você precisa escrever comentários para explicar o que está acontecendo, esse pode ser um mau sinal.</p>
<blockquote>
<p><strong>Disclaimer</strong>: o código acima parece fazer também uma espécie de cache e guarda a lista carregada em uma variável local. Caso não haja uma boa razão para isso, provavelmente a melhor estratégia seria delegar essa função para o framework. Em um projeto Java/Spring a anotação @Cacheable poderia ser um solução aceitável. O que tornaria o código ainda mais limpo, removendo a complexidade acidental.</p>
</blockquote>
<hr>
<p>Este é um post de uma série onde eu comento minhas impressões sobre livros que li e que acredito que valem a pena ler. Você pode conferir a minha lista de must read com os principais títulos no link abaixo.</p>
<div><div class="call-to-action"><h2>Livros Obrigatórios para programadores</h2><p>Veja a lista que atualmente considero imprescindível para se tornar um melhor programador.</p><a class="button button--primary" href="https://itsmemario.com.br/book-club">Ver a lista</a></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="referências">Referências<a href="https://itsmemario.com.br/blog/clean-code#refer%C3%AAncias" class="hash-link" aria-label="Link direto para Referências" title="Link direto para Referências">​</a></h2>
<ul>
<li><a href="https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882" target="_blank" rel="noopener noreferrer">Clean code</a></li>
<li><a href="https://en.wikipedia.org/wiki/SOLID" target="_blank" rel="noopener noreferrer">SOLID</a></li>
</ul>]]></content>
        <author>
            <name>Mário Sousa</name>
            <uri>https://itsmemarioss.com.br</uri>
        </author>
        <category label="Programação" term="Programação"/>
        <category label="Livros" term="Livros"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Qual a melhor forma de aprender um novo idioma?]]></title>
        <id>https://itsmemario.com.br/blog/qual-a-melhor-forma-de-aprender-um-novo-idioma</id>
        <link href="https://itsmemario.com.br/blog/qual-a-melhor-forma-de-aprender-um-novo-idioma"/>
        <updated>2019-08-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Aprender outro idioma não é nada fácil, além de vontade é necessário dedicação. O mercado está repleto de cursos, mandingas, métodos mágicos e afins. Mas será mesmo que existe uma forma infalível para aprender outra língua?]]></summary>
        <content type="html"><![CDATA[<p>Aprender outro idioma não é nada fácil, além de vontade é necessário dedicação. O mercado está repleto de cursos, mandingas, métodos mágicos e afins. Mas será mesmo que existe uma forma infalível para aprender outra língua?</p>
<p>No vídeo abaixo, a poliglota Lýdia Machová conta que decidiu investigar como outros poliglotas aprendiam um novo idioma e qual método eles usavam. Mas para sua surpresa, não existia um método único, cada poliglota usava técnicas diferentes e ferramentas diferentes, no entanto todos tinham algo em comum.</p>
<p>Então qual é o segredo? Aquilo que ninguém te conta? Que a globo não mostra? No fim, o que todos tinham em comum era o fato de aprenderem de uma forma prazerosa, da forma que eles preferem, ou seja, surprise, surprise, é necessário se divertir durante o processo.</p>
<p>Isso quer dizer que o que é legal pra você não necessariamente é legal pra mim e vice-versa, então você precisa procurar a sua forma de aprender. Particularmente, estar sentado dentro de uma sala recebendo o mesmo conteúdo padronizado não funcionou pra mim. Contudo, pesquisar sobre tecnologia, falar sobre assuntos do meu interesse, fez todo sentido e ainda funciona muito bem.</p>
<p>Outro fato que me chamou atenção no vídeo foi a técnica usada pelo Irlandês Benny, pois ele se expunha ao novo idioma mesmo sem ter domínio do mesmo e para mim essa é a forma mais efetiva, pois é assim que aprendemos quando criança, repetindo, falando, errando e recebendo feedback.</p>
<blockquote>
<p>Procure algo que goste de fazer e depois descubra como incluir um novo idioma nessa atividade.</p>
</blockquote>
<p>Como sugestão, deixo duas alternativas que podem lhe ajudar a descobrir uma nova forma divertida de aprender.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="podcasts">Podcasts<a href="https://itsmemario.com.br/blog/qual-a-melhor-forma-de-aprender-um-novo-idioma#podcasts" class="hash-link" aria-label="Link direto para Podcasts" title="Link direto para Podcasts">​</a></h2>
<p>Se você já tem um nível intermediário, essa pode ser uma ótima ideia. Pessoalmente curto muito ouvir podcasts sobre vários temas, então a primeira coisa que fiz quando decidi começar a aprender espanhol foi procurar podcasts em espanhol, os quais escuto regularmente voltando do trabalho. Além disso, não perco a oportunidade de hablar com alguém que saiba espanhol, dessa forma consigo feedbacks do meu aprendizado.</p>
<p>Podcasts sugeridos:</p>
<ul>
<li><a href="http://espanolespontaneo.com/" target="_blank" rel="noopener noreferrer">Español Espontaneo</a> - podcast sobre temas variados, produzido por professores de espanhol que vivem nos estados unidos (ES)</li>
<li><a href="https://binarios.fm/" target="_blank" rel="noopener noreferrer">Binarios</a> - podcast sobre tecnologia produzido por jornalista do el Mundo especializado em tecnologia (ES)</li>
<li><a href="https://www.npr.org/podcasts/510308/hidden-brain" target="_blank" rel="noopener noreferrer">Hidden Brain</a> - comportamento humano e storytelling, um dos meus podcasts favoritos. (EN)</li>
<li><a href="https://jovemnerd.com.br/playlist/speak-english/" target="_blank" rel="noopener noreferrer">Nerdcast Speak English</a> - dicas de inglês e um papo descontraído (PT)</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="grupo-de-estudo">Grupo de estudo<a href="https://itsmemario.com.br/blog/qual-a-melhor-forma-de-aprender-um-novo-idioma#grupo-de-estudo" class="hash-link" aria-label="Link direto para Grupo de estudo" title="Link direto para Grupo de estudo">​</a></h2>
<p>Participei de dois grupos de estudos de inglês organizados por amigos. Durante nossos encontros escolhíamos algum tema aleatório ou algum jogo de tabuleiro e nos forçávamos a discutir/jogar em inglês. O ponto positivo dessa abordagem é contar com o apoio do grupo onde todos interagem e aprendem juntos. Quem sabe mais ajuda quem sabe menos.</p>
<p>Agora que você já descobriu o segredo milenar dos trogloditas, digo, dos poliglotas, como você pode tornar seu aprendizado mais divertido?</p>
<p><a href="https://giphy.com/gifs/whoa-hd-tim-and-eric-xT0xeJpnrWC4XWblEk" target="_blank" rel="noopener noreferrer">via GIPHY</a></p>]]></content>
        <author>
            <name>Mário Sousa</name>
            <uri>https://itsmemarioss.com.br</uri>
        </author>
        <category label="Idiomas" term="Idiomas"/>
    </entry>
</feed>