<?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 André Leoni on Medium]]></title>
        <description><![CDATA[Stories by André Leoni on Medium]]></description>
        <link>https://medium.com/@andreleoni?source=rss-2f88c0b0da0e------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/2*i1aZ819feZgjVMf_7Dwy3Q.jpeg</url>
            <title>Stories by André Leoni on Medium</title>
            <link>https://medium.com/@andreleoni?source=rss-2f88c0b0da0e------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 08:22:02 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@andreleoni/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[Google ADK + FastAPI (Python) — Cheatsheet]]></title>
            <link>https://andreleoni.medium.com/google-adk-fastapi-python-cheatsheet-40be25cc93cb?source=rss-2f88c0b0da0e------2</link>
            <guid isPermaLink="false">https://medium.com/p/40be25cc93cb</guid>
            <category><![CDATA[google-adk]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[fastapi]]></category>
            <category><![CDATA[gemini]]></category>
            <category><![CDATA[fastapi-tutorials]]></category>
            <dc:creator><![CDATA[André Leoni]]></dc:creator>
            <pubDate>Mon, 15 Dec 2025 11:38:03 GMT</pubDate>
            <atom:updated>2025-12-15T11:38:03.023Z</atom:updated>
            <content:encoded><![CDATA[<h3>Google ADK + FastAPI (Python) — Cheatsheet</h3><p>Procurando na documentação do ADK (hoje), não encontrei nenhum conteúdo sobre como fazer a integração do Google ADK com um fastAPI (pra subir em um container seu) para as requisições. Se alguém precisar, tá aí!</p><p>Meu objetivo não é nem explicar o que é o fastapi e nem o que é o adk, você pode consultar os links para buscar mais informações:</p><ul><li>FastAPI: <a href="https://fastapi.tiangolo.com/">https://fastapi.tiangolo.com</a></li><li>Google ADK (Agent Development Kit): <a href="https://google.github.io/adk-docs/">https://google.github.io/adk-docs/</a></li></ul><p>Esta documentação foi feita em <strong><em>15/dezembro/2025</em></strong>, então, e como as coisas estão evoluindo, pode acabar ficando defasada bem rápido. hehe</p><p>Este é o tree do projeto:</p><pre>.<br>├── README.md<br>├── api.py<br>├── main.py<br>├── requirements.txt<br>└── root_agent<br>    └── agent.py</pre><h3>Dependencias</h3><p>Pra começar tudo, eu não consegui instalar as dependências com o resolver padrão <em>pip -r requirements.txt, </em>ele da um problema em uma biblioteca que não consegue se resolver, a versão aceita pelo fastAPI não é aceita pelo google-adk, vc vai ficar recebendo este erro:</p><pre>The conflict is caused by:<br>    google-adk 1.21.0 depends on starlette&lt;1.0.0 and &gt;=0.49.1<br>    fastapi 0.115.0 depends on starlette&lt;0.39.0 and &gt;=0.37.2</pre><p>Neste caso, instalei as duas libs manualmente, e tudo funcionou muito bem. Não sei dizer qual é o problema de compatibilidade entre elas…</p><pre>pip install google-adk<br>pip install fastapi</pre><h3>Agora o coding…</h3><p>Meu <em>root_agent/agent.py</em> ficou assim:</p><pre>from google.adk.agents.llm_agent import Agent<br><br># Mock tool implementation<br>def get_current_time(city: str) -&gt; dict:<br>    &quot;&quot;&quot;Returns the current time in a specified city.&quot;&quot;&quot;<br>    return {&quot;status&quot;: &quot;success&quot;, &quot;city&quot;: city, &quot;time&quot;: &quot;10:30 AM&quot;}<br><br>root_agent = Agent(<br>    model=&#39;gemini-2.5-flash&#39;,<br>    name=&#39;root_agent&#39;,<br>    description=&quot;Tells the current time in a specified city.&quot;,<br>    instruction=&quot;You are a helpful assistant that tells the current time in cities. Use the &#39;get_current_time&#39; tool for this purpose.&quot;,<br>    tools=[get_current_time],<br>)</pre><p>Meu <em>api.py</em> ficou assim:</p><pre>from fastapi import APIRouter<br>from pydantic import BaseModel<br>from google.genai import types<br><br># Use InMemoryRunner para facilitar, pois ele já configura serviços em memória<br>#   Também tem uma classe de runner, que você pode usar para plugar storage <br>#   de sessão, conversa e etc.<br>from google.adk.runners import InMemoryRunner<br>from root_agent.agent import root_agent<br><br><br>router = APIRouter()<br><br>runner = InMemoryRunner(agent=root_agent)<br><br>class ChatRequest(BaseModel):<br>    message: str<br>    session_id: str = &quot;default_session&quot; # A sessão tem que vir do frontend, <br>                                        # pra manter o historico para aquele<br>                                        # chat especificamente<br>    user_id: str = &quot;default_user&quot;<br><br><br>@router.post(&quot;/chat&quot;)<br>async def chat(req: ChatRequest):<br>    # Cria a mensagem no formato esperado pelo ADK<br>    new_message = types.UserContent(parts=[types.Part(text=req.message)])<br><br>    # Verifica s a sessão existe, senão, ele precisa criar ela<br>    session = await runner.session_service.get_session(<br>        app_name=runner.app_name,<br>        user_id=req.user_id,<br>        session_id=req.session_id<br>    )<br>    if not session:<br>        await runner.session_service.create_session(<br>            app_name=runner.app_name,<br>            user_id=req.user_id,<br>            session_id=req.session_id<br>        )<br><br>    response_text = &quot;&quot;<br><br>    # Usa run_async para processar a mensagem<br>    # O run_async retorna um gerador assíncrono de eventos, desta forma,<br>    # ele não bloqueia o event loop do fastapi, e permite várias requests<br>    # simultaneamente<br>    async for event in runner.run_async(<br>        user_id=req.user_id,<br>        session_id=req.session_id,<br>        new_message=new_message<br>    ):<br>        # Captura o texto da resposta do modelo<br>        # O evento pode conter várias coisas, aqui focamos no conteúdo de texto<br>        if event.content and event.content.parts:<br>            for part in event.content.parts:<br>                if part.text:<br>                    response_text += part.text<br><br>    return {<br>        &quot;response&quot;: response_text<br>    }</pre><p>E o meu <em>main.py </em>está assim:</p><pre>from fastapi import FastAPI<br>from api import router<br><br>app = FastAPI(title=&quot;ADK API&quot;)<br><br>app.include_router(router)</pre><h3>Executando</h3><p>Para executar ele, você precisará de uma API key do Google Cloud para poder fazer uma request para o Gemini (no meu exemplo é o 2.5 flash) como ENV <em>GEMINI_API_KEY.</em></p><p>Você pode criar uma API key aqui no <a href="https://aistudio.google.com/">https://aistudio.google.com</a>. (Para produção e uso em massa, é recomendado usar a API do vertex IA por estabilidade).</p><p>Para executar, suba o seu servidor:</p><pre>uvicorn main:app --reload</pre><p>E pode fazer a request com o curl:</p><pre>curl -X POST &quot;http://127.0.0.1:8000/chat&quot; \<br>     -H &quot;Content-Type: application/json&quot; \<br>     -d &#39;{<br>           &quot;message&quot;: &quot;Que horas são em Nova York?&quot;,<br>           &quot;session_id&quot;: &quot;teste_123&quot;,<br>           &quot;user_id&quot;: &quot;usuario_teste&quot;<br>         }&#39;</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/885/1*BvpondWAso3tWKZN7GwEBQ.png" /></figure><h3>Percepções e cuidados</h3><p>Eu não achei esta forma de executar o servidor documentado em nenhum lugar da doc oficial do ADK (talvez foi falha minha ao ler ela), então, tenha cautela se for usar isso em produção, pode ser que não seja uma API estável.</p><p>O google orienta na doc deles fazer deploy nas clouds deles diretamente, ou kubernetes, mas a vida pode ser um pouco mais simples, né.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=40be25cc93cb" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Ferramentas de análise de trade-offs para Arquitetos de Software]]></title>
            <link>https://andreleoni.medium.com/ferramentas-de-an%C3%A1lise-de-trade-offs-para-arquitetos-de-software-2005a887af2b?source=rss-2f88c0b0da0e------2</link>
            <guid isPermaLink="false">https://medium.com/p/2005a887af2b</guid>
            <category><![CDATA[trade-off]]></category>
            <category><![CDATA[desenvolvimentodesoftware]]></category>
            <category><![CDATA[arquitetura-de-software]]></category>
            <dc:creator><![CDATA[André Leoni]]></dc:creator>
            <pubDate>Thu, 20 Feb 2025 18:22:14 GMT</pubDate>
            <atom:updated>2025-02-20T18:22:14.123Z</atom:updated>
            <content:encoded><![CDATA[<p>Analisar trade-offs para um arquiteto de software é uma habilidade muito importante, pois na prática, nenhuma decisão que um arquiteto toma, é a única decisão possível para resolver um problema, desta forma, conseguir analisar os trade-offs das soluções, e documentá-las é extremamente importante.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zToS9c3sGz4XfAEbWxR0OQ.png" /><figcaption>imagem gerada pelo chatgpt o1</figcaption></figure><p>No mercado, existem vários modelos e diagramas de trade-off que ajudam arquitetos de software a tomarem decisões estratégicas. Aqui estão os mais relevantes:</p><h3><strong>Trade-off Quadrant (Matriz de Trade-off)</strong></h3><p><strong>📌 O que é?<br></strong> • Um gráfico cartesiano onde cada eixo representa dois critérios opostos.<br>• Exemplo clássico: Escalabilidade vs. Simplicidade.</p><p><strong>📌 Exemplo:<br></strong> • Sistemas altamente escaláveis tendem a ser mais complexos.<br>• Sistemas simples geralmente sacrificam escalabilidade.<br>• A decisão depende do que é mais importante no momento.</p><p>🔹 Exemplo de matriz:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jcRC5-7H5hPWhGiozvcx4Q.png" /></figure><p>👉 Usado para: Decidir entre arquiteturas monolíticas, microsserviços, serverless, etc.</p><h3>Architecture Decision Records (ADR) — Registro de Decisões Arquiteturais</h3><p><strong>📌 O que é?</strong><br>• Um documento estruturado para registrar trade-offs e justificar escolhas arquiteturais.</p><p>Normalmente, segue o formato:<br>• Contexto: Qual o problema?<br>• Opções: Quais alternativas foram consideradas?<br>• Decisão: O que foi escolhido?<br>• Justificativa: Por quê?<br>• Consequências: Impactos positivos e negativos.</p><p><strong>📌 Exemplo de decisão:</strong><br><em> • Problema:</em> Precisamos decidir entre GraphQL ou REST para uma API pública.<br> • <em>Opções:</em><br> • GraphQL → Flexível para os consumidores, mas aumenta complexidade do backend.<br> • REST → Simples e bem documentado, mas menos flexível.<br><em> • Decisão:</em> REST, porque nossos clientes já estão acostumados e a mudança para GraphQL teria um custo alto.</p><p>👉 Usado para: Documentar e justificar decisões técnicas dentro de times e empresas.</p><h3>Trade-off Sliders (Deslizadores de Decisão)</h3><p><strong>📌 O que é?</strong><br>• Uma escala visual para avaliar prós e contras de diferentes soluções.<br>• Cada critério é representado como um slider de 0 a 10.</p><p><strong>📌 Exemplo:</strong><br>Decisão entre SQL vs. NoSQL pode ser representada assim:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Kr0iVMla9-eeebRY8KJc_g.png" /></figure><p>👉 Usado para: Comparar tecnologias e frameworks de maneira visual.</p><h3>The Architecture Tradeoff Analysis Method (ATAM)</h3><p><strong>📌 O que é?</strong><br>• Um método formalizado para avaliar arquitetura baseado em cenários, atributos e trade-offs.<br>• Ajuda times a prever riscos e entender impactos de decisões arquiteturais.</p><p><strong>📌 Passos principais:<br></strong> 1. Definir objetivos e critérios (Exemplo: “queremos um sistema escalável e seguro”).<br>2. Listar atributos arquiteturais (Exemplo: disponibilidade, desempenho, manutenibilidade).<br>3. Criar cenários de avaliação (Exemplo: “Se um servidor cair, quanto tempo o sistema leva para se recuperar?”).<br>4. Identificar trade-offs (Exemplo: “Se aumentarmos a segurança, podemos impactar a performance?”).<br>5. Gerar recomendações para ajustes.</p><p>👉 Usado para: Analisar impactos de arquiteturas antes de implementá-las.</p><h3>The Software Architecture Properties Table (SAPT)</h3><p><strong>📌 O que é?<br></strong> • Uma tabela de trade-offs que avalia diferentes atributos de qualidade da arquitetura.<br>• Criada pelo SEI (Software Engineering Institute) para balancear performance, manutenibilidade, escalabilidade, etc.</p><p><strong>📌 Exemplo:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rg3OI9kIqt4lxOIJD9-ldA.png" /></figure><p>👉 Usado para: Comparar arquiteturas em um formato estruturado.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2005a887af2b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Trabalho não precisa ser sinônimo de dificuldade!]]></title>
            <link>https://andreleoni.medium.com/trabalho-n%C3%A3o-precisa-ser-sin%C3%B4nimo-de-dificuldade-98ade957db97?source=rss-2f88c0b0da0e------2</link>
            <guid isPermaLink="false">https://medium.com/p/98ade957db97</guid>
            <category><![CDATA[produtividade-pessoal]]></category>
            <category><![CDATA[saúde-mental]]></category>
            <category><![CDATA[trabalho]]></category>
            <category><![CDATA[produtividade-no-trabalho]]></category>
            <category><![CDATA[trabalho-em-equipe]]></category>
            <dc:creator><![CDATA[André Leoni]]></dc:creator>
            <pubDate>Sat, 26 Mar 2022 15:00:49 GMT</pubDate>
            <atom:updated>2022-03-26T15:00:49.892Z</atom:updated>
            <content:encoded><![CDATA[<p>Muitas vezes sacrificamos nosso tempo, nossa energia e até nossa sanidade mental por <em>acreditar que o sacrifício é essencial por si só</em>. O problema é que a complexidade da vida moderna criou uma falsa dicotomia entre coisas que são “essenciais e difíceis” e coisas que são “triviais e fáceis”. É quase uma lei natural para algumas pessoas: <strong>se uma coisa é fácil, então ela não é tão importante.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/0*kRAmKEW2Ky2dtgdN.jpg" /></figure><p>A linguagem ajuda a revelar nossos pressupostos mais arraigados. Pense nestas frases reveladoras: quando realizamos algo importante, dizemos que exigiu “sangue, suor e lágrimas”. Afirmamos que grandes feitos são “duramente conquistados”, quando poderíamos dizer apenas “conquistados”.</p><p><strong>A linguagem também denuncia nossa desconfiança da facilidade.</strong> Quando falamos de “dinheiro fácil”, insinuamos que foi obtido por meios ilegais ou questionáveis. Usamos a expressão “falar é fácil” como crítica, em geral, quando buscamos invalidar a opinião de alguém.</p><p>Acho curioso recorrermos a frases como “Não vai ser fácil, mas vai vale a pena” ou “será bem difícil conseguir isso, mas temos que tentar”. É como se todos aceitássemos automaticamente que o jeito “certo” é, de forma inevitável, o mais difícil.</p><p>Em minha experiência, raramente isso é questionado. Na verdade, se uma pessoa desafiar esse dogma, pode até pegar mal para ela. Nem paramos para pensar que algo essencial e valioso pode ser feito com facilidade.</p><p>Se o maior impedimento para<em> fazermos o que importa</em> for o falso pressuposto de que aquilo envolve um esforço imenso? <strong><em>E caso passarmos a pensar que se algo parece difícil, é porque ainda não encontramo o jeito mais fácil de fazê-lo?</em></strong></p><p>Retirado do Livro: <em>Sem esforço: Torne mais fácil o que é mais importante</em> de <em>Greg Mckeown</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=98ade957db97" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Porque não sou reconhecido no meu trabalho? Conheça os desvirtuadores de carreira!]]></title>
            <link>https://andreleoni.medium.com/porque-n%C3%A3o-sou-reconhecido-no-meu-trabalho-conhe%C3%A7a-os-desvirtuadores-de-carreira-3f9e67e48d61?source=rss-2f88c0b0da0e------2</link>
            <guid isPermaLink="false">https://medium.com/p/3f9e67e48d61</guid>
            <category><![CDATA[carreira-profissional]]></category>
            <category><![CDATA[desenvolvimento-pessoal]]></category>
            <category><![CDATA[crescimento-profissional]]></category>
            <category><![CDATA[self-improvement]]></category>
            <category><![CDATA[crescimento-pessoal]]></category>
            <dc:creator><![CDATA[André Leoni]]></dc:creator>
            <pubDate>Sat, 12 Mar 2022 14:22:07 GMT</pubDate>
            <atom:updated>2022-03-14T21:01:59.458Z</atom:updated>
            <content:encoded><![CDATA[<p>Devido ao crescimento do acesso à informação, se fala muito hoje em dia que o que diferencia desenvolvedores júnior, pleno e sênior, são muito mais <em>soft skills</em> do que de fato <em>hard skills</em>. Mas isso pode ser expansível para qualquer outra área, de tecnologia principalmente.</p><p>Recentemente estive lendo o livro “Your teams loves mondays? (…right?)” da <em>Kristin Sherry</em>, e encontrei um trecho que me chamou muita atenção, que a autora as chama de <em>os desvirtuadores de carreira</em>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/0*5jafEEYqsuxS7vpv" /><figcaption>Fonte: <a href="https://www.forbes.com/sites/johnhall/2019/09/22/how-to-get-your-team-to-look-forward-to-mondays/?sh=69ad1ad571ec">https://www.forbes.com/sites/johnhall/2019/09/22/how-to-get-your-team-to-look-forward-to-mondays/?sh=69ad1ad571ec</a></figcaption></figure><h3>O que são os desvirtuadores de carreira?</h3><p>Os desvirtuadores de carreira são alguns conjuntos de comportamentos nocivos para as pessoas, e principalmente para suas equipes, que dissipam a capacidade de trabalho em equipe.</p><p>Às oito características que apresentaremos a seguir estão relacionadas à estagnação na carreira de uma pessoa em todos os níveis. Estes são os comportamentos com maior probabilidade de deter o crescimento profissional.</p><ul><li><strong>Incapacidade de se adaptar às mudanças</strong>: quando a pessoa tem problemas para atuar ou se adequar a novos chefes, estratégias, planos ou programas;</li><li><strong>Excesso de ambição: </strong>quando a pessoa olha apenas “para o seu próprio umbigo”, frequentemente, gerando prejuízo aos colegas;</li><li><strong>Arrogância: </strong>quando a pessoa pensa que tem sempre a resposta certa para todos os problemas, e descarta a opinião dos outros. Esta atitude gera sentimentos de inferioridade nos colegas, e acaba afastando-os, se tornando frio e arrogante;</li><li><strong>Desleal: </strong>quando a pessoa<strong> </strong>diz uma coisa e faz outra de maneira imprevisível, normalmente, estas pessoas também são inconsistentes e não honram seus compromissos, quebrando qualquer planejamento que se conte com elas para execução. Falta de transparência e confiança são grandes ofensores para o trabalho em equipe de qualquer organização.</li><li><strong>Falta de compostura: </strong>quando a pessoa é hostil ou sarcástica em momentos de estresse, ou quando algo foge do planejado. Estes comportamentos aumentam a quantidade de decisões erradas e precipitadas sob pressão, além de ser menos produtivo em momentos difíceis;</li><li><strong>Defensividade: </strong>quando a pessoa não está aberta a críticas, nega os próprios erros e falhas, culpa os outros, não aceita <em>feedbacks</em> negativos e não compartilha suas limitações pessoais.</li><li><strong>Insensibilidade:</strong> quando a pessoa é intimidadora, faz com que sua equipe se sinta mal, não se importando sobre a forma que a afeta ou com as necessidades alheias.</li><li><strong>Microgerenciamento: </strong>quando a pessoa<strong> </strong>interfere <em>sem necessidade</em> na rotina, removendo a autonomia de seus colegas. Algumas das causas deste problema é a incapacidade de delegar eficazmente atividades e falta de auto-confiança.</li></ul><h3><strong>Conclusão</strong></h3><p>Acredito muito no desenvolvimento pessoal e autoconhecimento. Saber como você age em cada um destes cenários, fará toda a diferença para que nossa carreira não seja sabotada por nós mesmos.</p><p>Caso já recebeu alguma devolutiva, ou percebeu que fez algum destes comportamentos, é importante para, refletir e buscar melhorá-los, pois em algum momento sua carreira pode ser inibida de crescer por qualquer um deles.</p><blockquote>E não dependa do seu líder, empresa, ou colegas apenas para melhorar… Sua carreira, é sua responsabilidade!</blockquote><p>Muito obrigado pelo seu tempo!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3f9e67e48d61" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Um papo sobre liberdade]]></title>
            <link>https://andreleoni.medium.com/um-papo-sobre-liberdade-a9f7ccba9268?source=rss-2f88c0b0da0e------2</link>
            <guid isPermaLink="false">https://medium.com/p/a9f7ccba9268</guid>
            <category><![CDATA[amor-proprio]]></category>
            <category><![CDATA[autoconhecimento]]></category>
            <category><![CDATA[motivação]]></category>
            <category><![CDATA[liberdade]]></category>
            <dc:creator><![CDATA[André Leoni]]></dc:creator>
            <pubDate>Wed, 01 Dec 2021 23:14:51 GMT</pubDate>
            <atom:updated>2021-12-01T23:19:46.013Z</atom:updated>
            <content:encoded><![CDATA[<p>Quando examinamos a nossa autoimagem, nossa tribo, nossos papéis, podemos reconhecer que eles são provisórios. Podemos aprender a honrá-los estando perdidos, e sem estar completamente identificados com eles.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/0*BjU01PArU4-7GDZ_.jpg" /><figcaption><a href="https://www.significadodossonhosonline.com/sonhar-com-passaro-voando/">https://www.significadodossonhosonline.com/sonhar-com-passaro-voando/</a></figcaption></figure><p>Quando Shakespeare escrevia suas peças, as limitações eram apenas a sua imaginação e a ampla gama de possibilidades cênicas. Mas às vezes ele dirigia as suas próprias peças e então, embora pudesse fazer certas escolhas, ele tinha que seguir o roteiro comum usado por todos os atores. Nesse papel, a sua liberdade era reduzida. Em outras vezes ainda, o próprio Shakespeare tornava-se um ator. Então, sua única liberdade era variar a sua interpretação e recitação de suas falas.</p><blockquote>Mas em cada um desses papéis, Shakespeare sabia quem ele era. Internamente ele não estava limitado ao papel e ao roteiro.</blockquote><p>Na nossa vida haverá períodos em que parece que somos o autor, com grande liberdade de escolher uma direção. E então haverá períodos quando papéis mais limitados devem ser cumpridos: o progenitor, o ganha-pão, o cidadão, o membro da comunidade, o contemplativo, o líder, o liderado. Uma vida madura requer uma capacidade para entrar em cada um dos papéis que nos são dados.</p><p><strong>A liberdade surge quando adotamos uma perspectiva leve, quando vemos cada um destes papéis pelo que eles são.</strong> Quando entendemos que precisamos nos libertar do nosso próprio “eu”, sem julgamentos. Cumprindo cada papel temporário que a vida nos presenteia, cada um no seu tempo.</p><blockquote>“Quando você compreender seu próprio “<em>eu”</em>, verá que você não é nada. E não sendo nada, você é tudo”. Kalu Rinpoche</blockquote><p>Retirado do livro “Psicologia do Amor” de Jack Kornfield.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a9f7ccba9268" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Dicas rápidas para conseguir o primeiro emprego de programação]]></title>
            <link>https://andreleoni.medium.com/dicas-r%C3%A1pidas-para-conseguir-o-primeiro-emprego-de-programa%C3%A7%C3%A3o-ee24ac20abc7?source=rss-2f88c0b0da0e------2</link>
            <guid isPermaLink="false">https://medium.com/p/ee24ac20abc7</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[junior-developer]]></category>
            <category><![CDATA[emprego]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[programação]]></category>
            <dc:creator><![CDATA[André Leoni]]></dc:creator>
            <pubDate>Sat, 20 Nov 2021 14:07:33 GMT</pubDate>
            <atom:updated>2021-11-20T14:21:27.437Z</atom:updated>
            <content:encoded><![CDATA[<p>Navegando no LinkedIn ultimamente, observei que aumentou muito a quantidade de pessoas buscando a primeira oportunidade de emprego em programação, o que, convenhamos, não é uma atividade tão fácil, mesmo com o mercado aquecido.</p><p>Tenho feito mais de 50 entrevistas no último ano, e algumas características me chamam bastante atenção na seletiva de candidatos para nosso bate-papo.</p><p>Vou deixar aqui algumas dicas do que eu fiz a 6 anos atrás quando consegui minha primeira vaga em programação e que percebo que diferenciam bastante no momento de seleção de desenvolvedores para próximas etapas seletivas.</p><h3>Não se prenda a detalhes</h3><p>Se atentar a todos os detalhes é importante, mas para um desenvolvedor pleno para sênior.</p><p>Quando você utiliza o framework Rails, por exemplo, dificilmente você conseguirá entender a fundo como o Rails funciona no seu primeiro ano de desenvolvimento.</p><p>Não se prenda aos detalhes de como as coisas funcionam, se preocupe em aprender a entregar projetos pessoais e mostrar resultados.</p><h3>Aprenda a usar GIT</h3><p>Eu sinceramente, não conheço uma empresa hoje em dia que não utilize git para fazer o gerenciamento de versão do código. Recomendo estudar git e saber no mínimo o básico.</p><p>Alguns sites que recomendo para estudar git:</p><ul><li><a href="https://www.freecodecamp.org/news/what-is-git-and-how-to-use-it-c341b049ae61/">https://www.freecodecamp.org/news/what-is-git-and-how-to-use-it-c341b049ae61/</a></li><li><a href="https://learngitbranching.js.org/">https://learngitbranching.js.org/</a></li></ul><h3>Crie um repositório pessoal no Github</h3><p>O Github permite criar repositório pessoal para auto-apresentação.</p><p>Aqui você pode colocar links de repositórios pessoais e de coisas que você tem testado, pode ser a sua página de portfólio e blog com coisas que tem estudado. Para configurá-lo, pode acessar esta página, mas várias documentações podem te ajudar com isso.</p><ul><li><a href="https://pages.github.com/">https://pages.github.com/</a></li></ul><p>Existem vários modelos prontos na internet, no meu próprio <em>github pages</em>, possui uma documentação. Deixei aqui como exemplo de layout meu <em>Github </em>pessoal:</p><ul><li><a href="https://andreleoni.github.io/">https://andreleoni.github.io/</a></li></ul><h3>Crie projetos e envie para o Github</h3><p>Acredito que a melhor forma de mostrar o que tem estudado, é de fato mostrando o que você tem estudado. O Github é uma ferramenta que você pode usar para mostrar isso. Tenha o hábito de submeter seus códigos de cursos e treinamentos que tem feito como portfólio e adiciona os que mais tem orgulho em sua página inicial do <em>github pages</em>.</p><h3>Brinque com exercícios de lógica</h3><p>Mostrar que você pratica exercícios de lógica também é um bom caminho para conseguir a tão sonhada primeira vaga de emprego em programação. Tenho algumas plataformas que gosto de brincar com exercícios, como, por exemplo:</p><ul><li><a href="https://codesignal.com/">https://codesignal.com/</a></li><li><a href="https://www.codewars.com/">https://www.codewars.com/</a></li></ul><p>O interessante destes sites, é que você pode criar um perfil e exibir os exercícios que já tem feito.</p><h3>Escreva o que você aprendeu</h3><p>Escrever sobre seus aprendizados não é uma prática apenas para pessoas iniciantes, mas para desenvolvedores mais experientes também conseguirem ter uma melhor fixação dos assuntos que tem estudado. No caso de programador júnior, esta prática com certeza mostrará um genuíno interesse por programar, por se autodesenvolver, e por desenvolver as pessoas a sua volta.</p><p>Não espere ser um mestre no tema para escrever algo, escrever qualquer coisa pode ajudar alguém a tirar dúvidas simples, o que eu gosto de pensar sempre é: <em>eu escrevo para mim mesmo, e não para os outros</em>.</p><p>Meus artigos e repositórios do Github do <em>medium </em>são minha maior fonte de consulta de assuntos que já tenho estudado na vida.</p><h3>Assista vídeos sobre como se portar em entrevistas</h3><p>Veja vídeos de simulações de entrevistas para entender como funciona e se preparar para tal. Veja também sobre os requisitos da vaga, pois é o que provavelmente lhe perguntarão na entrevista. Alguns exemplos:</p><ul><li><a href="https://www.youtube.com/watch?v=aI3D5WSX8rE">https://www.youtube.com/watch?v=aI3D5WSX8rE</a></li><li><a href="https://www.youtube.com/watch?v=P2y1n_NyJy0">https://www.youtube.com/watch?v=P2y1n_NyJy0</a></li></ul><h3>Utilize o Heroku como plataforma para publicar seus projetos pessoais</h3><p>O Heroku (<a href="https://www.heroku.com/">https://www.heroku.com/</a>) é uma plataforma que você pode publicar seus portfólios e publicar até 5 aplicações de graça. É uma boa saída de baixo custo para mostrar seus conhecimentos.</p><h3>Estude, estude e estude</h3><p>Um pouquinho da minha história. Programo desde os 12 anos, e consegui um emprego em programação apenas aos 24 anos. Trabalhei por muito tempo em outras funções até conseguir juntar uma grana para me manter por um tempo enquanto estudava.</p><p>Quando decidi ir para programação, larguei meu antigo emprego e fiquei 9 meses estudando e criando meu portfólio na época (que não era tão fácil como hoje) para que a tão sonhada vaga viesse.</p><p>Em 6 anos de experiência hoje sou líder de uma equipe de cerca de 15 desenvolvedores no <em>Enjoei</em>.</p><p>Espero ter ajudado um pouco a explicitar os caminhos com algumas dicas simples.</p><p>Muito obrigado pelo seu tempo, e te desejo toda sorte do mundo nesta jornada.</p><p><em>Escolher a área de desenvolvimento em minha carreira foi a melhor decisão que já fiz na vida.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ee24ac20abc7" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Reflexão a respeito de mudanças — Quem mexeu no meu queijo?]]></title>
            <link>https://andreleoni.medium.com/reflex%C3%A3o-a-respeito-de-mudan%C3%A7as-quem-mexeu-no-meu-queijo-b9b344f4f296?source=rss-2f88c0b0da0e------2</link>
            <guid isPermaLink="false">https://medium.com/p/b9b344f4f296</guid>
            <category><![CDATA[mindset]]></category>
            <category><![CDATA[mindset-ágil]]></category>
            <category><![CDATA[mude-sua-rotina-é-bom]]></category>
            <category><![CDATA[mudanças]]></category>
            <category><![CDATA[mude-sua-rotina]]></category>
            <dc:creator><![CDATA[André Leoni]]></dc:creator>
            <pubDate>Tue, 05 Oct 2021 22:43:09 GMT</pubDate>
            <atom:updated>2021-10-05T22:43:09.213Z</atom:updated>
            <content:encoded><![CDATA[<h3>Reflexão a respeito de mudanças — Quem mexeu no meu queijo?</h3><p>Lendo o livro “Quem mexeu no meu queijo” do <em>Spencer Johnson </em>tive alguns pontos que realmente me chamaram atenção…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/0*9ta12TZUZl67yVzv.png" /></figure><p>O livro conta a história de 2 ratos, <em>Sniff</em> e <em>Scurry</em>, e 2 homenzinhos, <em>Hem</em> e <em>Haw</em> que estão presos em um labirinto, e o seu objetivo é correr atrás de queijo, sim, queijo! O livro faz relação de que o labirinto é a nossa caminhada pela vida, e o queijo é o nosso objetivo de vida (família, amigos, carreira, etc.).</p><p>Os ratos logicamente, são movidos pelo extinto, e os homens, inteligentes, pensativos, racionais, calculam o preço, tem poder de mudança, de decisão.</p><blockquote><em>O que aconteceu?</em></blockquote><p>O que acontece, é que ambos saem para procurar o seu queijo, e encontram… Os ratos, saem diariamente de suas casas para comer o queijo, como conta a história, ao chegar no local onde estão os queijos, <em>Scurry</em>, pendura seus tenis sobre o pescoço, para caso ocorra algum problema, ele possa rapidamente calçá-los e ir em busca de um novo queijo, e <em>Sniff</em>, é um farejador nato, ambos juntos, encontram novos queijos com facilidade.</p><p>Já os dois homens, são muito mais expertos e inteligentes, resolvem construir uma morada ao lado de onde o queijo está, assim, eles podem acordar um pouco mais tarde, e fazer pouco esforço para alcançá-lo, onde até então, isso é o melhor dos mundos!</p><p>O desfecho da história, é que o queijo onde estão os ratos e os homenzinhos, um dia acabou. Os ratos, perceberam que o queijo acabou e saíram rapidamente procurar outro queijo, depois de muito procurarem, acharam e se alimentaram, já os homens, ficaram se lamentando e tentando entender:</p><blockquote><em>Como acabou o queijo?!</em></blockquote><p>Os homens espertos como são, esperaram o queijo voltar “sozinho”, não acreditaram no que aconteceu, porque era tão bom, eles já haviam chegado no objetivo, não tinham o porque sair do lugar e continuar procurando, porque eles já haviam encontrado, estavam perdidos, não sabiam o que fazer, e de repente, <em>Haw</em> da uma gargalhada da situação, e fala “Precisamos sair pelo labirinto, e encontrar mais queijo!”, Hem achou uma péssima ideia, não quis sair da zona de conforto, e aceitar o desafio, afinal de contas, lá SEMPRE teve queijo, não tem porque ele ter sumido! O que os homens não se deram contas… é que o queijo estava acabando aos poucos, e já poderiam ter procurado outros lugares que tinham queijo.</p><p>No decorrer da história Hem fica esperando o queijo “voltar sozinho” enquanto Haw, passa por vários conflitos internos sobre ir atráz de um novo lugar com queijos, e com isso, ele anda escrevendo nas paredes frases de estímulo, como por exemplo:</p><blockquote><em>O que você faria se não tivesse medo?</em></blockquote><p>A espera que seu amigo as leia, e isso ajuda tanto ele, quanto seu amigo Hem, que decide ficar no antigo local de queijo, a encontrar a nova jazida de queijo!</p><blockquote><em>Moral da História</em></blockquote><p>Haw supera seus medos, aprende com eles, aprende que deve perceber as mudanças ao seu redor, e que deve se precaver caso aconteca novamente o problema de acabar o queijo, ou seja,</p><blockquote><em>Haw aprendeu a se adaptar as mudanças e aos tempos de crise.</em></blockquote><p>Enquanto isso, a história deixa em off a situação de Hem, como ele ficou?</p><blockquote><em>Certamente, Hem ficou preso em seus medos de mudança, e morreu de fome.</em></blockquote><p>Esta história nos ensina algumas lições:</p><ul><li>A mudança ocorre, continuam a mexer no queijo;</li><li>Antecipe a mudança: prepare-se para caso o queijo não esteja mais lá;</li><li>Monitore a mudança, cheire o queijo com frequência para saber quando está ficando velho;</li><li>Adapte-se rapidamente a mudança, quanto mais rápido você esquece do velho queijo, mais rápido poderá saborear o outro;</li><li>Saia do lugar, assim como o queijo!</li></ul><p>O que mais me chamou atenção nesta história é a importância de nos atentarmos quem somos na história… Somos os ratos? Que agem rapidamente as mudanças, e quando acaba o queijo, rapidamente vão PROCURAR outro queijo sem agir precavidamente? Ou somos como <em>Hem</em>, que fica preso em seu medo, no medo de sair do lugar? Porque afinal, sempre deu certo! Ou somos como <em>Haw</em>, que luta com seus medos, vai em frente, aprende as lições, e age precavidamente quanto aos desafios e as mudanças da nossa vida?</p><p>Será que quando algo em nossa vida muda, olhamos para a situação e rimos, ou lamentamos? Rir da nossa situação pode ser a cura para o nosso medo, lembre-se que a procura pelo queijo pode demorar, mas o que importa, é que no final:</p><blockquote><em>Você encontrou o seu queijo!</em></blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b9b344f4f296" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Nada de Janelas Quebradas!]]></title>
            <link>https://andreleoni.medium.com/nada-de-janelas-quebradas-3da2f3495e87?source=rss-2f88c0b0da0e------2</link>
            <guid isPermaLink="false">https://medium.com/p/3da2f3495e87</guid>
            <category><![CDATA[software-testing]]></category>
            <category><![CDATA[quality-software]]></category>
            <category><![CDATA[janelas-quebradas]]></category>
            <category><![CDATA[quality-assurance]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[André Leoni]]></dc:creator>
            <pubDate>Tue, 05 Oct 2021 22:27:51 GMT</pubDate>
            <atom:updated>2021-10-05T22:27:51.733Z</atom:updated>
            <content:encoded><![CDATA[<p>Pesquisas no campo de criminalidade e decadência urbana, descobriram que uma janela quebrada pode rapidamente levar um prédio limpo e intacto a se tornar um prédio decadente e abandonado.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*W0viQcO5qh232Hr3" /></figure><p>A teoria da janela quebrada afirma que uma janela quebrada, se não consertada, por algum tempo, transmite para as pessoas que ninguém se importa com o prédio. Então, de repente, outra janela é quebrada, se acumulando mais lixo, aparecem paredes pichadas, lixo no quintal, até que o dono não consegue mais dar conta de reparar os danos causados, tornando o que antes era um sentimento de abandono, em um real abandono.</p><p>Assim é um código sem testes, o próximo desenvolvedor com certeza terá a impressão de não houve zelo em fazer aquele código, produzindo mais códigos sem testes, ou, mais “Janelas quebradas”.</p><p>Com o passar do tempo, já não existem mais códigos com cobertura, todas as janelas foram quebradas, o código já não é mais refatorado, todas as boas práticas de desenvolvimento são quebradas, e todos se acham no direito de continuar quebrando janelas.</p><p>Sempre que uma janela é quebrada, abre brecha para que se quebre outra, e outra… Sendo assim, NUNCA quebra uma janela e NUNCA deixe passar uma janela quebrada sem se importar!</p><p><em>Baseado no livro: Agile: Desenvolvimento de software com entregas frequentes e foco no valor de negócio de André Faria Gomes (2013).</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3da2f3495e87" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Não é grande coisa ou é o fim do mundo?]]></title>
            <link>https://andreleoni.medium.com/n%C3%A3o-%C3%A9-grande-coisa-ou-%C3%A9-o-fim-do-mundo-b8b3c3ec6a5b?source=rss-2f88c0b0da0e------2</link>
            <guid isPermaLink="false">https://medium.com/p/b8b3c3ec6a5b</guid>
            <category><![CDATA[gestão-de-conflitos]]></category>
            <category><![CDATA[management-and-leadership]]></category>
            <category><![CDATA[time]]></category>
            <category><![CDATA[liderança]]></category>
            <category><![CDATA[gerenciamento]]></category>
            <dc:creator><![CDATA[André Leoni]]></dc:creator>
            <pubDate>Sat, 04 Sep 2021 19:53:52 GMT</pubDate>
            <atom:updated>2021-09-04T19:57:47.516Z</atom:updated>
            <content:encoded><![CDATA[<p>Vamos dizer algo que deveria ser óbvio:<em> as pessoas não gostam de ter suas queixas subestimadas ou ignoradas</em>. Quando isso acontece, mesmo a menor irritação pode se transformar em uma cruzada obsessiva.</p><p>Imagine que você está hospedado em um hotel e o ar-condicionado não está funcionando direito. Você chama a recepção para falar sobre o problema, e eles respondem que estão cientes do problema e alguém vai consertar na semana que vem (depois que você for embora). Por enquanto, você poderia abrir a janela (que dá para aquela rua barulhenta e movimentada)? Nem sequer um pedido de desculpas, nem mesmo um tom de culpa.</p><p>Bem, o que antes causava apenas um pouco de aborrecimento (afinal, está fazendo 23C e você gosta de dormir a 20C) agora se tornou o fim do mundo! Você vai ficar furioso, jurar que vai escrever uma carta para a gerência e acabar com o hotel na avaliação on-line.</p><p>Jean-Louis Gassée, que costumava comandar a Apple France, descreve essa situação como a escolha entre dois botões.</p><blockquote>Quando você lida com os problemas dos outros, pode optar por apertar o botão que diz “Não é grande coisa” ou o que diz “É o fim do mundo”. Qualquer que seja o botão escolhido, as pessoas pegam o outro.</blockquote><p>A equipe do hotel no exemplo acima escolheu <strong>“Não é grande coisa”</strong> e, como resultado, foi forçada a lidar com <strong>“É o fim do mundo”</strong>. Mas poderiam muito bem ter feito a escolha oposta.</p><p>Imagine a equipe respondendo algo assim: <em>“Sinto muito. Isso é claramente inaceitável! Posso entender completamente como deve ser quase impossível dormir em um quarto tão quente. Se eu não conseguir consertar esse problema hoje à noite, gostaria que eu reembolsasse sua estadia e o ajudasse a encontrar um quarto de hotel diferente nas proximidades? De qualquer forma, enquanto estamos buscando uma solução, permita-me enviar uma garrafa de agua gelada e sorvete. Nós sentimos muitíssimos por esse problema e faremos todo o possível para resolvê-lo”.</em></p><p>Com uma resposta como essa, você é quase forçado a escolher <em>“Não é grande coisa”. </em>Sim, claro, um pouco de água e sorvete vai ser ótimo!</p><blockquote>Todos querem ser ouvidos e respeitados. Geralmente não custa muito fazer isso. E realmente não importa tanto assim se você pensa que está certo ou errado. Argumentar com quem está se sentindo prejudicado só vai aumentar o problema.</blockquote><p>Tenha isso em mente na próxima vez que escolher um botão. Qual vai apertar para o seu cliente?</p><p>Retirado do livro <a href="https://www.amazon.com.br/trabalho-n%C3%A3o-precisa-ser-loucura-ebook/dp/B085LTHVQS/ref=sr_1_1?__mk_pt_BR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;dchild=1&amp;keywords=o+trabalho+n%C3%A3o+precisa+ser+uma+loucura&amp;qid=1630785096&amp;sr=8-1">“O trabalho não precisa ser uma loucura”</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b8b3c3ec6a5b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tell, don’t ask]]></title>
            <link>https://andreleoni.medium.com/tell-dont-ask-372141d0e381?source=rss-2f88c0b0da0e------2</link>
            <guid isPermaLink="false">https://medium.com/p/372141d0e381</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[ruby]]></category>
            <category><![CDATA[orientação-a-objeto]]></category>
            <category><![CDATA[software-engineer]]></category>
            <category><![CDATA[tell-dont-ask]]></category>
            <dc:creator><![CDATA[André Leoni]]></dc:creator>
            <pubDate>Sat, 21 Aug 2021 14:03:08 GMT</pubDate>
            <atom:updated>2021-08-21T14:07:42.435Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Diga, não pergunte </em>é um princípio de orientação a objetos que visa relembrar sobre um princípio de orientação a objetos: <em>ao invés de pedir dados a um objeto, devemos pedir para ele fazer algo.</em></p><p>Pedir dados de um objeto para saber se podemos executar uma ação, nos obriga a expor atributos deste objeto de maneira pública, o que, no princípio de orientação a objetos, é sempre algo que devemos evitar.</p><h4>Partindo para um exemplo prático, um exemplo do que não deveria ser feito:</h4><pre>class Post<br>  attr_reader :state</pre><pre>  def initialize(state:)<br>    @state = state<br>  end</pre><pre>  def publish!<br>    @state = &quot;published&quot;<br>  end    <br>end</pre><pre>#### Example execution</pre><pre>post = Post.new(state: &quot;draft&quot;)</pre><pre>if post.state == &quot;draft&quot;<br>  post.publish!<br>else<br>  raise StandardError.new(&quot;post not draft to be published&quot;)<br>end</pre><pre>post</pre><p>Analisando o exemplo acima, temos que perguntar qual é o estado de um atributo a classe para saber seu conteúdo. Isso viola os princípios de encapsulamento e orientação a objetos. Com o passar do tempo, caso, várias rotinas possam publicar o um <em>Post, </em>possivelmente este código deverá ser duplicado entre vários trechos do código.</p><blockquote>É aí que o conceito se aplica. Jamais devemos perguntar o <em>valor</em> de um atributo de um objeto para realizar uma ação, “Peça, não pergunte”.</blockquote><p>Agora, vamos refatorar o exemplo acima sobre algo que poderia ser feito para melhorar este trecho de código.</p><h4>Aplicando o conceito de <em>Tell, don’t ask</em></h4><pre>class Post  <br>  def initialize(state:)<br>    @state = state<br>  end</pre><pre>  def publish!<br>    raise StandardError.new(&quot;post not draft to be published&quot;) if state != &quot;draft&quot;<br>    @state = &quot;published&quot;<br>  end</pre><pre>  private</pre><pre>  attr_reader :state<br>end</pre><pre>#### Example execution</pre><pre>post = Post.new(state: &quot;draft&quot;)<br>post.publish!<br>post</pre><p>Analisando a classe e o código de execução de teste, podemos perceber que agora não estamos mais perguntando o <em>status</em> do atributo de um objeto (o que podemos permitir que ele seja privado), apenas estamos pedindo para fazer, caso o objeto não consiga executar o que é necessário, ele mesmo levanta uma exceção, protegendo o comportamento de publicação de um <em>Post </em>e evitando possíveis duplicações de código em outros pedaços da aplicação.</p><p>Baseei este rápido post no do <a href="https://martinfowler.com/bliki/TellDontAsk.html">Martin Fowler</a>.</p><p>Muito obrigado pelo seu tempo.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=372141d0e381" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>