<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Eriksen Costa</title>
    <description>Desenvolvedor de software e especialista em open source. Ajuda organizações a entregarem melhores softwares, continuamente.
</description>
    <link>https://blog.eriksen.com.br/pt-br/</link>
    <atom:link href="https://blog.eriksen.com.br/pt-br/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Tue, 19 May 2026 21:44:21 -0300</pubDate>
    <lastBuildDate>Tue, 19 May 2026 21:44:21 -0300</lastBuildDate>
    <generator>Jekyll</generator>
    
      
        
      
        
      
        
      
      <item>
        <title>Criando uma cultura de Engenharia</title>
        <description>&lt;p&gt;Cultura é sempre um assunto muito debatido. Peter Drucker dizia que “a cultura come estratégia no café da manhã”. Quando alinhada com estratégia e liderança, uma cultura forte leva a resultados organizacionais positivos.&lt;/p&gt;

&lt;p&gt;Ashley Goodall e Marcus Buckingham dizem, em seu livro Nine Lies About Work, que cultura importa porque contribui com a identidade, com os processos e com a visão da organização. Além disso, a cultura é a resposta que as pessoas dão quando são perguntadas sobre “como é trabalhar aí?”. Dizem, ainda, que a cultura define o quão duro as pessoas trabalharão e por quanto tempo ficarão em sua empresa.&lt;/p&gt;

&lt;p&gt;Cultura importa. Porém, cultura também pode ser um assunto complicado e confuso. Por isso, muitas vezes a cultura é relegada ao RH e tratada de forma secundária pelo negócio. Mas há como fazer um processo gerenciado de definição de cultura e dá menos trabalho do que você imagina.&lt;/p&gt;

&lt;p&gt;Antes de falar sobre como definir uma cultura organizacional, é preciso entender o que é cultura.&lt;/p&gt;

&lt;h2 id=&quot;o-que--cultura&quot;&gt;O que é cultura?&lt;/h2&gt;

&lt;p&gt;Cultura possui algumas definições, entre elas:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;É o sistema de conhecimento de um grupo relativamente grande de pessoas&lt;/li&gt;
  &lt;li&gt;É o comportamento cultivado, é a totalidade do que uma pessoa aprendeu, da experiência acumulada ao qual é socialmente transmitida – ou, mais brevemente – comportamento através de aprendizado social&lt;/li&gt;
  &lt;li&gt;É a forma de vida de um grupo de pessoas – os comportamentos, as crenças, os valores e símbolos que elas aceitam (geralmente sem pensar sobre eles) e que são passados adiante por comunicação e imitação de uma geração para outra&lt;/li&gt;
  &lt;li&gt;É comunicação simbólica. Alguns desses símbolos incluem as habilidades, atitudes, conhecimentos, valores e motivações de um grupo. Os significados dos símbolos são aprendidos e deliberadamente perpetuados em uma sociedade através de suas instituições&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como deu para perceber, cultura é sempre um fenômeno coletivo. E a cultura define o jogo social: as normas culturais definem o que é aceito ou não dentro de um grupo, além de orientá-lo em direção a um propósito compartilhado.&lt;/p&gt;

&lt;p&gt;Essa é a primeira dica para gerenciar o processo de definição de cultura. Valores, direção, crenças, comportamentos são palavras-chave que traduzem bem para conceitos de gestão estratégica como visão, missão e valores. Também vale a pena falar em princípios.&lt;/p&gt;

&lt;h2 id=&quot;viso-misso-valores-e-princpios&quot;&gt;Visão, missão, valores e princípios&lt;/h2&gt;

&lt;p&gt;Qualquer pessoa líder já se deparou com os desafios de definição de objetivos ou foram questionadas por clareza de propósito. Na gestão estratégica, as ferramentas para isso são a visão, a missão e os valores. Eu particularmente gosto das definições disponíveis no livro Product Roadmaps Relaunched:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A visão é o resultado que você busca no longo-prazo. A visão nos diz para onde queremos ir&lt;/li&gt;
  &lt;li&gt;A missão é a intenção que você tem agora. É o seu propósito, é o que te guia em direção a sua visão&lt;/li&gt;
  &lt;li&gt;Valores são crenças e ideais que governam o comportamento. Se a visão nos diz para onde queremos ir, os valores nos ajudam a corrigir o rumo para a visão&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na N26 Brasil, decidimos também definir um conjunto de princípios para a cultura de Engenharia. Princípios são ideias ou regras básicas que explicam ou controlam como algo deve funcionar.&lt;/p&gt;

&lt;p&gt;Visão, missão, valores e princípios. Parece que já temos alguns bons elementos para começar a trabalhar, certo?&lt;/p&gt;

&lt;h2 id=&quot;defina-de-forma-colaborativa&quot;&gt;Defina de forma colaborativa&lt;/h2&gt;

&lt;p&gt;Se a cultura é um conjunto de crenças e mitos compartilhados, nada melhor que defini-la colaborativamente. A minha sugestão é estruturar um workshop com atividades bem definidas. Técnicas de gestão estratégica de produto e de facilitação de cerimônias ágeis são bem úteis para isso. Identifique, pelo menos, a visão e os valores.&lt;/p&gt;

&lt;p&gt;Na N26 Brasil, fizemos esse processo em julho de 2021, quando o time de Engenharia inteiro era composto por apenas cinco pessoas. Precisávamos definir uma estratégia para a área e, para isso, precisávamos entender que tipo de cultura gostaríamos de cultivar. Com os elementos culturais definidos, ficou mais fácil criar uma visão de roadmap. Hoje, toda nossa estratégia técnica está alinhada com nossa cultura.&lt;/p&gt;

&lt;p&gt;Caso esteja curioso sobre como executar um workshop desses, consulte o playbook que criei: ele contém um passo a passo semelhante ao que fizemos na N26 Brasil.&lt;/p&gt;

&lt;h2 id=&quot;documente-compartilhe-integre-e-reconhea&quot;&gt;Documente, compartilhe, integre e reconheça&lt;/h2&gt;

&lt;p&gt;O mercado estremeceu quando a Netflix divulgou o seu &lt;a href=&quot;https://www.slideshare.net/reed2001/culture-1798664&quot;&gt;famoso slide de cultura&lt;/a&gt;. Você deve fazer o mesmo. Definir a cultura é o primeiro passo. Após sua definição, crie um documento e deixe-o facilmente acessível para todas as pessoas da sua empresa. Para deixar o documento mais útil, forneça pequenas descrições sobre cada um dos elementos identificados da sua cultura: eles serão úteis para validar comportamentos e fornecer exemplos para as pessoas.&lt;/p&gt;

&lt;p&gt;Porém, documento compartilhado não é a mesma coisa que conhecimento compartilhado. Apresente a cultura para todas as pessoas contratadas. Use cada oportunidade de interação para repetir os elementos da cultura: das All Hands às Daily Meetings, explore os elementos da sua cultura para que ela seja, de fato, compartilhada e assimilada por todas as pessoas.&lt;/p&gt;

&lt;p&gt;Na N26 Brasil, a cultura é apresentada para todas as pessoas nas sessões de onboarding. Além disso, a leitura do documento de cultura é estimulada no plano 30-60-90 que estabelecemos para todas as pessoas das disciplinas de Engenharia.&lt;/p&gt;

&lt;p&gt;Por fim, integre os elementos da sua cultura no seu &lt;a href=&quot;https://docs.google.com/document/d/1sSry9jDJ_y9HzMZbDxBS_A2Dhj1Dr2QWeuGmuQWy29E/edit&quot;&gt;processo de recrutamento&lt;/a&gt; e use os bons exemplos do dia a dia para reconhecer a contribuição das pessoas com o fortalecimento dela. Não existe uma receita pronta, a construção da sua cultura dependerá muito do cuidado e atenção dado à ela.&lt;/p&gt;

&lt;h2 id=&quot;valores-da-engenharia-da-n26-brasil&quot;&gt;Valores da Engenharia da N26 Brasil&lt;/h2&gt;

&lt;p&gt;Destaco, a seguir, alguns dos &lt;a href=&quot;https://n26brasil.atlassian.net/wiki/external/35783146/NzI1MDI3NTdlY2U4NGUwNGEwMmY1NjhmMTMxYTg5MjY&quot;&gt;valores de nossa cultura&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Profissionalismo: somos confiáveis e definimos altos padrões de conduta e execução. Nos importamos com o trabalho, com as pessoas e com nossos clientes e usuários&lt;/li&gt;
  &lt;li&gt;Pragmatismo: somos pragmáticos. Sabemos dosar quando chegamos em uma solução boa o suficiente, evitando over-engineering e cargo cult programming&lt;/li&gt;
  &lt;li&gt;Humildade: ninguém sabe de tudo. Toda dúvida é uma oportunidade para aprender. Senioridade não é um passe livre para comportamento desrespeitoso&lt;/li&gt;
  &lt;li&gt;Colaboração: os objetivos da N26 Brasil, das unidades e dos times são mais importantes que os objetivos individuais. O trabalho em time triunfa sobre o individual&lt;/li&gt;
  &lt;li&gt;Diversidade: vivemos em uma sociedade miscigenada e de cultura diversificada. Atender à pluralidade da sociedade só será possível com um time igualmente plural&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A cultura de Engenharia da N26 Brasil é uma cultura em formação. No momento em que escrevo esse texto, 64% do time tem menos de 6 meses de empresa. O mesmo cresceu 400% entre setembro de 2021 e janeiro de 2022. Mesmo assim, é possível ver os valores definidos por aquele pequeno grupo de pessoas em ação nas entrevistas, no onboarding, nos OKRs, no roadmap, na priorização de tarefas e na comunicação entre as pessoas.&lt;/p&gt;

&lt;h2 id=&quot;viva-a-cultura-e-seja-seu-maior-exemplo&quot;&gt;Viva a cultura e seja seu maior exemplo&lt;/h2&gt;

&lt;p&gt;Qualquer pessoa exercendo liderança (seja ela posicional ou não) deve ser o maior exemplo da cultura organizacional. Como bem destacado pelo David Anderson, o potencial de uma organização sempre será limitado pela maturidade da sua liderança:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;A maturidade de uma organização sempre será limitada pela maturidade de sua liderança. Resultados de negócios e aspirações sempre serão limitadas pela cultura e pelos valores.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Uma liderança madura sempre irá trabalhar para criar um senso de alinhamento, unidade e de propósito compartilhado. Uma liderança madura gerencia a cultura e a identidade. Uma liderança imatura é egoísta, narcisista e manipulativa. Uma liderança madura trabalha na cultura e identidade da organização.&lt;/p&gt;

&lt;p&gt;O trabalho de criar uma cultura é árduo e requer muita repetição e consistência. Definir valores e princípios e não vivê-los como pessoa em liderança é o primeiro passo para criar cinismo na equipe.&lt;/p&gt;

&lt;p&gt;O mesmo vale para momentos de medidas drásticas, em que certos elementos da cultura são desafiados: deixe claro para todas as pessoas quais são as circunstâncias e porque certas concessões são necessárias. A consistência se pagará neste momento.&lt;/p&gt;

&lt;p&gt;Já parou para pensar na sua cultura hoje?&lt;/p&gt;

&lt;h2 id=&quot;agradecimentos&quot;&gt;Agradecimentos&lt;/h2&gt;

&lt;p&gt;Não poderia deixar de agradecer a todas as pessoas que fazem parte do time de Tecnologia da N26 Brasil (Data, Design, Engenharia e Produto), por terem comprado o desafio de mudar a nossa relação com o dinheiro. Em especial, muito obrigado aos participantes do workshop de julho de 2021: Antonio Spinelli, Diógenes Medeiros, Henrique Sloty e Thiago Costa.&lt;/p&gt;

&lt;!-- Links --&gt;

</description>
        <pubDate>Thu, 05 May 2022 06:45:00 -0300</pubDate>
        <link>https://blog.eriksen.com.br/pt-br/cultura-engenharia-n26brasil</link>
        <guid isPermaLink="true">https://blog.eriksen.com.br/pt-br/cultura-engenharia-n26brasil</guid>
        
        
      </item>
    
      
      <item>
        <title>Três destaques do 2017 State of DevOps Report</title>
        <description>&lt;amp-img src=&quot;/assets/images/posts/state-devops-2017/report-cover.png&quot; width=&quot;650&quot; height=&quot;451&quot; layout=&quot;responsive&quot; title=&quot;A capa do 2017 State of DevOps Report&quot; alt=&quot;A capa do 2017 State of DevOps Report&quot;&gt;&lt;/amp-img&gt;

&lt;noscript&gt;
  &lt;img src=&quot;/assets/images/posts/state-devops-2017/report-cover.png&quot; title=&quot;A capa do 2017 State of DevOps Report&quot; alt=&quot;A capa do 2017 State of DevOps Report&quot; /&gt;
&lt;/noscript&gt;

&lt;p&gt;&lt;small&gt;A capa do 2017 State of DevOps Report.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Foi publicado mês passado o 2017 State of DevOps Report, um estudo publicado anualmente pela Puppet e DORA (DevOps Research &amp;amp; Assessment). Este estudo é uma leitura obrigatória para todo mundo, seja qual for a sua maturidade na adoção do DevOps.&lt;/p&gt;

&lt;p&gt;Os números são surpreendentes por si só. DevOps funciona e times de alto desempenho, comparados com times de baixo desempenho:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Fazem mais deploys e mais rapidamente
    &lt;ul&gt;
      &lt;li&gt;Frequência de deploys 46 vezes maior&lt;/li&gt;
      &lt;li&gt;Templo de ciclo de commit para deploy 440 vezes mais rápido&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Falham menos e se recuperam mais rapidamente
    &lt;ul&gt;
      &lt;li&gt;Tempo médio para recuperação de interrupção 96 vezes mais rápido&lt;/li&gt;
      &lt;li&gt;Taxa de falhas 5 vezes menor&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Automatizam mais
    &lt;ul&gt;
      &lt;li&gt;A gestão de configuração é 33% mais automatizada&lt;/li&gt;
      &lt;li&gt;Os testes são 27% mais automatizados&lt;/li&gt;
      &lt;li&gt;Os deploys são 30% mais automatizados&lt;/li&gt;
      &lt;li&gt;O processo de aprovação de mudança é 27% mais automatizado&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Tem 2 vezes mais chances de alcançar os objetivos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E agora, os meus três destaques.&lt;/p&gt;

&lt;h2 id=&quot;modelo-de-maturidade-e-melhoria-contnua&quot;&gt;Modelo de maturidade e melhoria contínua&lt;/h2&gt;

&lt;p&gt;Meu primeiro destaque não é sobre os números ou sobra uma descoberta chave. É sobre o modelo de maturidade do estudo. Eles classificam times de baixa, média e alta performance usando uma abordagem orientada por dados. A classificação é um resultado da análise anual da performance da TI, o que previne que times e organizações caiam numa “armadilha de sucesso”: após alcançar o nível de performance desejado, a melhoria contínua para, já que o objetivo era estático.&lt;/p&gt;

&lt;p&gt;Este modelo de maturidade é um alvo em movimento, não um objetivo estático, e está realmente alinhado com o princípio da melhoria contínua do Lean. Times de alta performance e organizações inovadoras sabem que essa é a chave para a excelência.&lt;/p&gt;

&lt;h2 id=&quot;arquitetura&quot;&gt;Arquitetura&lt;/h2&gt;

&lt;p&gt;O segundo destaque vai para à arquitetura. Do estudo:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Em times de alta performance, a arquitetura do sistema é projetada para que times de entrega possam testar, fazer deploy e mudar seus sistemas sem depender de outros times para trabalho adicional, por recursos, aprovações e de vai-e-vem de comunicação. Portanto, nós descrevemos tanto a arquitetura quanto os times como sendo frouxamente acoplados.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;E continua:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Abordagens arquiteturais que permitem esta estratégia incluem o uso de contextos delimitados (&lt;em&gt;bounded contexts&lt;/em&gt;) e APIs como uma forma de desacoplar grandes domínios, resultando em unidades menores e mais frouxamente acopladas. A arquitetura também deve permitir o uso de dublês de testes e virtualização para permitir os testes dos serviços ou dos componentes de forma isolada. Arquiteturas orientadas a serviço presumem estas facilidades, como qualquer arquitetura que é realmente de microserviços deve presumir.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Não é surpresa que os Contextos Delimitados (&lt;em&gt;Bounded Contexts&lt;/em&gt;) do Domain-Driven Design (DDD) seja citado como uma abordagem arquitetural que suporta esses times de alta performance. Para mim, DDD deveria ser parte da sua caixa de ferramentas na sua adoção DevOps&lt;sup id=&quot;fnref:DDDevOps&quot;&gt;&lt;a href=&quot;#fn:DDDevOps&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;DDD também suporta naturalmente uma arquitetura microserviços. Sam Newman diz, em seu livro Building Microservices (ele também é um revisor desse estudo), que Contexto Delimitado é uma forma de modelar microserviços com alta coesão e baixo acoplamento.&lt;/p&gt;

&lt;p&gt;A cobertura de Contexto Delimitado do Sam Newman é muito superficial. Eu recomendo a leitura de um dos livros do Vaughn Vernon para um tratamento correto do assunto.&lt;/p&gt;

&lt;h2 id=&quot;liderana&quot;&gt;Liderança&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;As características da liderança transformacional estão altamente correlacionadas com a performance da TI. De fato, nós observamos diferenças significativas nas características da liderança entre times de TI de baixa, média e alta performance. Times de alta performance reportaram terem líderes com os comportamentos mais fortes entre todas as dimensões: visão, comunicação inspiracional, estímulo intelectual, liderança de apoio e reconhecimento pessoal. Em contraste, times de baixa performance reportaram os menores níveis nessas características de liderança. As diferenças que encontramos foram estatisticamente significante em todos os níveis.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Você não pode subestimar como uma liderança ruim pode minar a performance de um time. Eu tenho o princípio de que todo mundo quer fazer um bom trabalho, mas gerenciar pessoas é difícil. E desenvolvimento de software é um esforço tecno-humano, e sem a parte humana, você não tem a parte tecnológica.&lt;/p&gt;

&lt;p&gt;O que eu ouço das pessoas são as mesmas estórias de terror de sempre: gerentes que usam Ágil como sinônimo de uma corrida perpétua para jogar código em produção, sem se preocupar com qualidade, sem dar tempo para permitir melhoria contínua e uma completa alienação dos times de desenvolvimento, que são apenas macaquinhos codificadores. Pessoas infelizes, código ruim e ciclo de entrega lento.&lt;/p&gt;

&lt;p&gt;As últimas quatro dimensões podem ser mapeadas diretamente para os três elementos da motivação do Daniel Pink. Se você não está preparado para trabalhar com a motivação das pessoas ou você não liga para o assunto, faça um favor a todos: peça demissão.&lt;/p&gt;

&lt;h2 id=&quot;concluses&quot;&gt;Conclusões&lt;/h2&gt;

&lt;p&gt;O estudo é de uma leitura simples e rápida, cheia de &lt;em&gt;insights&lt;/em&gt;. DevOps, que começou como um movimento cultural, é agora algo maior, amplamente divulgado e que está movendo-se no caminho do &lt;em&gt;hype cycle&lt;/em&gt;. O estudo nos lembra pra focar nos resultados e enfatiza as práticas técnicas.&lt;/p&gt;

&lt;p&gt;Eu também gostei do design gráfico do estudo, ao qual mostra uma interessante diversidade de gênero, cor e etnias. Parece intencional e é incrível! O infográfico vale o download também.&lt;/p&gt;

&lt;p&gt;E, finalmente, eu discuti sobre esse estudo com o Fernando Ike no podcast &lt;a href=&quot;https://soundcloud.com/naestradadevops/007-state-of-devops-rerport&quot;&gt;Na Estrada DevOps&lt;/a&gt; (episódio 007), confira!&lt;/p&gt;

&lt;h2 id=&quot;referncias&quot;&gt;Referências&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Brown et al, 2017. &lt;a href=&quot;https://puppet.com/system/files/2017-06/2017-state-of-devops-report_3.pdf&quot;&gt;The 2017 State of DevOps Report&lt;/a&gt; (&lt;a href=&quot;https://puppet.com/system/files/2017-06/puppet-2017-State-of-DevOps-Report_0.pdf&quot;&gt;infográfico&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Pink, 2009. &lt;a href=&quot;https://www.amazon.com/gp/product/1594484805/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1594484805&amp;amp;linkCode=as2&amp;amp;tag=ecpamzn-20&amp;amp;linkId=a53f57373bff47f5e0dbf0985cbb8629&quot;&gt;Drive: The Surprising Truth About What Motivates Us&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Vernon, 2016. &lt;a href=&quot;https://www.amazon.com/Domain-Driven-Design-Distilled-Vaughn-Vernon/dp/0134434420/ref=as_li_ss_il?ie=UTF8&amp;amp;linkCode=li3&amp;amp;tag=ecpamzn-20&amp;amp;linkId=41aa19b025c49f83ac6a75c694cc1880&quot;&gt;Domain-Driven Design Distilled&lt;/a&gt; (&lt;a href=&quot;/books/vaughn-vernon-domain-driven-design-distilled&quot;&gt;minha resenha&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Wikipedia. &lt;a href=&quot;https://en.wikipedia.org/wiki/Hype_cycle&quot;&gt;Hype cycle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;!-- Notes --&gt;

&lt;!-- Links --&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:DDDevOps&quot;&gt;
      &lt;p&gt;Eu poderia criar o termo DDDevOps, mas para o bem geral, não o farei. &lt;a href=&quot;#fnref:DDDevOps&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Wed, 05 Jul 2017 07:30:00 -0300</pubDate>
        <link>https://blog.eriksen.com.br/pt-br/2017-state-devops-report-destaques</link>
        <guid isPermaLink="true">https://blog.eriksen.com.br/pt-br/2017-state-devops-report-destaques</guid>
        
        
      </item>
    
      
      <item>
        <title>Design bom é informado e cuidadoso</title>
        <description>&lt;p&gt;Na última semana, tive a oportunidade de conversar com diversas pessoas e times de diferentes empresas. E alguns temas comuns vieram a tona, como problemas de motivação, qualidade de código, escolhas questionáveis de arquitetura e ciclos de entrega lentos.&lt;/p&gt;

&lt;p&gt;Fiquei refletindo sobre esses problemas e um elemento em comum me pareceu claro entre eles: a falta de design, ou melhor, design ruim. Para discutir o que é um design bom ou ruim, vamos à uma definição:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Bom design é design que é informado por informação específica: que tipo de clima você tem, que tipo de leis de construção você tem, que tipo de comportamento social você tem e qual você gostaria de promover. Então, tudo que você faz é feito para um propósito específico. Eu acredito que bom design é cuidadoso, design ruim é descuidado (Ingels, 2015) &lt;!-- 1'19&quot; --&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Como dá para notar, Bjarke Ingels não trabalha com software: ele fala sobre clima, burocracia e comportamento social. Ingels é um arquiteto, mas ele tem um bom ponto: design bom é &lt;em&gt;informado&lt;/em&gt; e &lt;em&gt;cuidadoso&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;uma-transformao-parcial&quot;&gt;Uma transformação parcial&lt;/h2&gt;

&lt;p&gt;Na minha apresentação de &lt;a href=&quot;/palestras/domain-driven-design-introducao&quot;&gt;introdução a Domain-Driven Design&lt;/a&gt;, eu começo discutindo sobre como design foi deixado de lado mesmo com a transformação Ágil que ocorreu nos últimos 16 anos. Sandro Mancuso discute em seu livro, &lt;em&gt;The Software Crafstman&lt;/em&gt;, sobre como essa transformação foi parcial:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;As transformações Ágeis focaram principalmente no processo: no empoderamento de pessoas, na redução da burocracia e do desperdício, na priorização, na visibilidade do trabalho em progresso, e na melhoria do fluxo de informação. Esses eram problemas reais e importantes que precisavam ser resolvidos (…). Entretanto, os princípios por trás do (Manifesto) Ágil foram esquecidos. Processo se tornou mais importante que excelência técnica. Excelência técnica, que é assumida em cada metodologia Ágil, é normalmente ignorada por gerentes e por &lt;em&gt;coaches&lt;/em&gt; despreparados. (Mancuso, 2014) &lt;!-- page 15 --&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Essa transformação parcial se manifesta nos problemas que mencionei no início desse texto além dos proverbiais “tentamos, mas não funcionou” e “isso nunca iria funcionar aqui”. Não há como metodologias e processos que dependem de ciclos de feedbacks terem sucesso sem excelência técnica, e, portanto, sem a qualificação dos profissionais que compõe o time. E temos o seguinte (triste) fato:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Muitos projetos Ágeis estão agora, regularmente e iterativamente, produzindo código ruim. (Mancuso, 2014) &lt;!-- page 10 --&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;design-em-toda-parte&quot;&gt;Design em toda parte&lt;/h2&gt;

&lt;p&gt;O design que se manifesta em código é fruto de uma intersecção entre o design da organização e o design do time. A questão de design, então, passa ao largo de ser um problema de um indivíduo no time.&lt;/p&gt;

&lt;p&gt;Vale destacar que na maior parte do tempo, quando eu falo sobre desenvolvimento de software, estou falando em uma empreitada humano-tecnológica que é feita em time. A maioria dos softwares são desenvolvidos por times.&lt;/p&gt;

&lt;p&gt;Por trás das metodologias Ágeis, do Lean/Kanban e do DevOps, sempre se encontra princípios ou objetivos para a criação de times altamente funcionais. Do Manifesto Ágil (Beck et al, 2001), temos os princípios 8 e 11, por exemplo:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Os processos ágeis promovem desenvolvimento sustentável. Os patrocinadores, desenvolvedores e usuários devem ser capazes de manter um ritmo constante indefinidamente&lt;/li&gt;
  &lt;li&gt;As melhores arquiteturas, requisitos e designs emergem de equipes auto-organizáveis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do Lean (Liker, 2003), temos os princípios 9 e 10:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Cresça líderes que entendam o trabalho completamente, vivam a filosofia e a ensine aos outros&lt;/li&gt;
  &lt;li&gt;Desenvolva pessoas e times excepcionais que sigam a filosofia da sua empresa&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E do DevOps (Debois et al, 2016), dos Princípios de Aprendizado e Experimentação Contínuos, temos: &lt;!-- location 1300 --&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Habilite uma cultura de aprendizado organizacional e uma cultura de segurança&lt;/li&gt;
  &lt;li&gt;Institucionalize a melhoria do trabalho diário&lt;/li&gt;
  &lt;li&gt;Líderes reforçam uma cultura de aprendizado&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Então, a atividade de desenvolvimento profissional de software ocorre em times, dentro de organizações. E o design da organização e do time influenciam no design de código. O doutor Melvin Conway tem umas palavras sobre esse fenômeno, que ficaram tão famosas que foram promovidas ao que é, hoje, conhecida como lei de Conway.&lt;/p&gt;

&lt;h2 id=&quot;a-lei-de-conway&quot;&gt;A lei de Conway&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Qualquer organização que projeta um sistema (definido amplamente) irá produzir um design ao qual sua estrutura é uma cópia da estrutura de comunicação da organização (Conway, 1968)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A lei de Conway é uma observação sociológica que pode ser observada em diferentes tipos de organização de time. O famoso time de duas pizzas (T2P)&lt;sup id=&quot;fnref:T2P&quot;&gt;&lt;a href=&quot;#fn:T2P&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; da Amazon, por exemplo, limita o tamanho dos times para um máximo de 5-10 pessoas. Essa restrição tem efeitos importantes (Debois et al, 2016): &lt;!-- location 2100 --&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;O time tem um claro entendimento do sistema ao qual está trabalhando&lt;/li&gt;
  &lt;li&gt;Limita a taxa de crescimento do produto ou serviço sendo trabalhado&lt;/li&gt;
  &lt;li&gt;Descentraliza o poder e possibilita autonomia&lt;/li&gt;
  &lt;li&gt;Promove uma cultura sem medo, já que o escopo menor de trabalho limita as consequências das falhas&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Da mesma forma, me parece que os &lt;em&gt;Squads&lt;/em&gt; do Spotify (Kniberg, 2012) contribuem para alcançar esses mesmos efeitos.&lt;/p&gt;

&lt;p&gt;A diferença é que a Amazon é uma organização com orientação ao mercado, otimizada para responder rapidamente às necessidades dos clientes e composta por times multidisciplinares em uma hierarquia plana. Já o Spotify é uma organização com orientação em matriz, que combina os elementos de organizações com orientação funcional (otimizadas para &lt;em&gt;expertise&lt;/em&gt;, divisão de trabalho e redução de custo) e ao mercado.&lt;/p&gt;

&lt;p&gt;O ponto mais importante que essas diferenças mostram é a escolha consciente do &lt;em&gt;design da organização&lt;/em&gt;. Se design bom é &lt;em&gt;informado&lt;/em&gt;, adotar uma organização de time como o T2P da Amazon ou o &lt;em&gt;Squads&lt;/em&gt; do Spotify requer o entendimento não apenas da estrutura dos times como também das interdependências entre eles e dos impactos dessas novas dinâmicas na organização.&lt;/p&gt;

&lt;p&gt;Esse design, feito de forma &lt;em&gt;cuidadosa&lt;/em&gt;, ditará como o trabalho será feito e os resultados alcançados (Debois et al, 2016). &lt;!-- location 1921 --&gt;&lt;/p&gt;

&lt;h2 id=&quot;times-indivduos-e-cdigo&quot;&gt;Times, indivíduos e código&lt;/h2&gt;

&lt;p&gt;O design dos times é resultado direto do design da organização. Times com orientação ao mercado são, em um extremo, totalmente responsáveis não apenas pelo desenvolvimento do software, como também pelos testes, pela segurança, implantação e por suportar seu serviço em produção. São times DevOps (Debois et al, 2016). &lt;!-- location 1957 --&gt;&lt;/p&gt;

&lt;p&gt;Já o time Scrum clássico é também multidisciplinar, composto pelo Dono do Produto (&lt;em&gt;Product Owner&lt;/em&gt;), pelo &lt;em&gt;Scrum Master&lt;/em&gt; e pelo Time de Desenvolvimento. No entanto, o objetivo desse time é de entregar um incremento de produto, este potencialmente lançável (Schwaber, 2013). A responsabilidade desse time é limitada ao desenvolvimento do software. &lt;!-- page 5 --&gt;&lt;/p&gt;

&lt;p&gt;A definição da estrutura dos times vai dizer muito sobre as interações entre eles e sobre seus potenciais conflitos. Geralmente, os desenvolvedores tem muita participação nessa definição sobre como trabalhar. No entanto, parecem não ter noção da sua influência não apenas na organização como também na sociedade no geral: o mundo depende cada vez mais de software.&lt;/p&gt;

&lt;p&gt;Desenvolvedores são, em geral, indivíduos altamente motivados e curiosos. Mas essa mesma curiosidade parece levar a uma mentalidade extremamente orientada à tecnologia. Não é incomum ver times tentando resolver problemas com tecnologia ao invés de fazer design &lt;em&gt;cuidadoso&lt;/em&gt;. O modelo do software vira então uma Grande Bola de Lama (Foote; Yoder, 1999), com pouco a quase nenhum conhecimento do negócio codificado de forma expressiva.&lt;/p&gt;

&lt;p&gt;É aqui que nós, como indivíduos, temos o dever de agirmos como profissionais. Ser profissional exige disciplina. As organizações ainda não nos entendem. O Uncle Bob (Martin, 2016) dá uma boa explicação sobre como ser profissional:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Em particular, o negócio não entende as nossas disciplinas (…), não entende Programação em Par, Desenvolvimento Guiado por Testes, Refatoração, Design Simples. Essas são disciplinas técnicas e não estão no &lt;em&gt;expertise&lt;/em&gt; do negócio.&lt;/p&gt;

  &lt;p&gt;E não deveriam estar. Elas pertencem a nós, é parte do nosso &lt;em&gt;expertise&lt;/em&gt; técnico. Então o negócio não pode aprová-las ou endossá-las. Você não pode chegar no negócio e dizer “Tudo bem se eu fizer testes?”. (…) Quando você faz isso, você está tentando se livrar do risco, você não está querendo tomar o risco, você o joga no negócio, que não pode avaliá-lo e tomá-lo. (…)&lt;/p&gt;

  &lt;p&gt;E o risco, francamente, é nosso. Nós somos os donos do risco. Nós que sabemos como as coisas precisam ser testadas, refatoradas, como que o software precisa ser feito e nós temos que tomar o risco como parte da nossa operação normal. Como profissionais. E é isso que profissionais fazem: eles tomam o risco no que eles sabem que deve ser feito. &lt;!-- 1h 04' 25&quot; --&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Outra responsabilidade profissional que temos é o de entender o domínio do negócio em que trabalhamos:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;(…) se os programadores não estão interessados no domínio, eles aprendem apenas o que a aplicação deve fazer, não os princípios por trás dela. Software útil pode ser desenvolvido dessa maneira, mas o projeto nunca chegará em um ponto onde novas funcionalidades poderosas surgirão como desdobramento de funcionalidades existentes (Evans, 2003) &lt;!-- location 677 --&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tanto o Uncle Bob quanto o Eric Evans expõe implicações econômicas profundas. Nosso profissionalismo pode ser a diferença entre o negócio realizar o retorno do investimento feito no desenvolvimento do software ou, ter software que é apenas custo.&lt;/p&gt;

&lt;p&gt;Não podemos fugir das nossas responsabilidades: temos o dever, como profissionais, como indivíduos, de nunca parar de aprender e de melhorar em nosso ofício.&lt;/p&gt;

&lt;h2 id=&quot;design-informado-e-cuidadoso&quot;&gt;Design informado e cuidadoso&lt;/h2&gt;

&lt;p&gt;Uma aproximação de desenvolvimento de software que suporta design &lt;em&gt;informado&lt;/em&gt; e &lt;em&gt;cuidadoso&lt;/em&gt; é o Domain-Driven Design (DDD). O DDD é uma forma de desenvolver software que tem, como objetivo, implementar o melhor design de software baseado em modelos que refletem as competências da organização. DDD ajuda a desenvolver software que dá vantagem competitiva ao negócio, porque força a organização a entender no que ela deve se distinguir (Vernon, 2016). &lt;!-- location 183 --&gt;&lt;/p&gt;

&lt;p&gt;Pra suportar as atividades de design na intersecção organização/time, o DDD possui ferramentas de design estratégico e tático. O design estratégico tem a ver com dividir o trabalho e encontrar o que é estrategicamente importante para o negócio. DDD é, resumidamente, sobre modelar uma &lt;em&gt;Linguagem Ubíqua&lt;/em&gt; em um &lt;em&gt;Contexto Delimitado&lt;/em&gt; (Vernon, 2016).&lt;/p&gt;

&lt;p&gt;Essas ferramentas são os pilares do DDD. Times que adotam DDD conversam em uma Linguagem Ubíqua, que, além de falada tanto por desenvolvedores quanto por especialistas de domínio, é implementada no código do software (por isso é ubíqua). Para limitar e definir claramente o vocabulário dessa Linguagem, são usados os Contextos, que são barreiras semânticas. Dentro de um Contexto, cada termo tem um significado específico, entendido por todos os membros do time.&lt;/p&gt;

&lt;p&gt;Os Contextos são o reconhecimento que o domínio do negócio é, além de grande e complexo, melhor gerenciado ao dividí-lo. A recomendação de manifestar cada Contexto como um time, um repositório e um banco de dados próprios (Vernon, 2016)&lt;!-- location 344 --&gt; alinha perfeitamente com a organização em times de produto, além de ser um caminho natural para uma arquitetura em Microserviços (Newman, 2014). &lt;!-- location 783 --&gt;&lt;/p&gt;

&lt;p&gt;O modelo resultante do design estratégico é &lt;em&gt;informado&lt;/em&gt;: o time adquiriu as informações do negócio para dividir o domínio em sub-domínios, encontrando seus Contextos e modelando a Linguagem Ubíqua.&lt;/p&gt;

&lt;p&gt;Já o design tático é um catálogo de padrões que ajudam a implementar o modelo em código, com o objetivo de tornar o software um reflexo explícito do modelo. Se meu código é uma representação explícita do modelo que foi criado pelo esforço conjunto de desenvolvedores e especialistas de domínio, esse código documenta e centraliza o conhecimento do negócio. É design &lt;em&gt;cuidadoso&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;melhoria-contnua-na-raiz-do-design&quot;&gt;Melhoria contínua na raiz do design&lt;/h2&gt;

&lt;p&gt;Organizações e relações entre times são sistemas complexos. Desenvolvimento de software é uma atividade difícil. Dado esses desafios, traçarmos estratégias para executar essas atividades de design (organizacional, time e código) afim de transformarmos a organização.&lt;/p&gt;

&lt;p&gt;Porém, uma transformação organizacional depende de pessoas. São elas que aprendem e mudam a organização (Soares, 2017). Em organizações de software, é muito comum haver uma sobrecarga de atividades transformacionais, com a adoção de múltiplos processos ocorrendo em paralelo.&lt;/p&gt;

&lt;p&gt;Além de aumentar o risco de falhas na adoção e entendimento dos processos, essa sobrecarga causa problemas de moral no time. A cada nova falha, o time se sente mais desmotivado, por que, mesmo com suas melhores intenções e esforços, o novo processo não funcionou. Uma espessa névoa de indiferença e ressentimento toma conta do lugar.&lt;/p&gt;

&lt;p&gt;Definir a criação de times totalmente DevOps como objetivo é um ótimo ponto de partida. DevOps, como conjunto de práticas, tem entre seus princípios a visualização do fluxo. A mentalidade Lean e o Método Kanban estão integrados no DevOps (Debois et al, 2016)&lt;!-- location 965 --&gt; e como já citado, a criação de uma cultura de melhoria contínua.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;O Método Kanban é projetado para minimizar o impacto inicial das mudanças e para reduzir a resistência de adoção de mudança. Adotar o Kanban deve mudar a cultura da sua organização e ajudá-la a amadurecer. Se a adoção for feita corretamente, a organização irá se transformar em uma que adota mudança rapidamente e se torna boa em implementar mudanças e melhorias de processos. (Anderson, 2010) &lt;!-- page 50 --&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Então não importa a estratégia, minimizar o impacto inicial e reduzir a resistência às mudanças é primordial para a implantação de uma cultura de melhoria contínua.&lt;/p&gt;

&lt;h2 id=&quot;design--inevitvel&quot;&gt;Design é inevitável&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Questionamentos se design é necessário ou acessível perdem o ponto: design é inevitável. A alternativa para bom design é design ruim, e não a ausência de design. Douglas Martin. (Vernon, 2016) &lt;!-- location 237 --&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sendo design inevitável, cabe a nós definir o design da organização, dos times e do código. Na ausência de alternativa, melhor fazer design &lt;em&gt;informado&lt;/em&gt; e &lt;em&gt;cuidadoso&lt;/em&gt;. O que estamos esperando para começar?&lt;/p&gt;

&lt;h2 id=&quot;referncias&quot;&gt;Referências&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Ingels, 2015. &lt;a href=&quot;https://www.youtube.com/watch?v=B_W48ZsIqSo&quot;&gt;Bjarke Ingels: Good design is careful, bad design is careless&lt;/a&gt; (vídeo)&lt;/li&gt;
  &lt;li&gt;Mancuso, 2014. &lt;a href=&quot;https://www.amazon.com/Software-Craftsman-Professionalism-Pragmatism-Robert/dp/0134052501/ref=as_li_ss_tl?ie=UTF8&amp;amp;linkCode=ll1&amp;amp;tag=ecpamzn-20&amp;amp;linkId=b1dc391b25c6ca834c23ac3087c7a37&quot;&gt;The Software Craftsman: Professionalism, Pragmatism, Pride&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Beck et al, 2001. &lt;a href=&quot;http://agilemanifesto.org/iso/ptbr/principles.html&quot;&gt;Princípios por trás do Manifesto Ágil&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Liker, 2003. &lt;a href=&quot;https://www.amazon.com/Toyota-Way-Management-Principles-Manufacturer-ebook/dp/B000SEGIVS/ref=as_li_ss_tl?ie=UTF8&amp;amp;qid=1497376464&amp;amp;sr=8-1&amp;amp;keywords=The+Toyota+Way:+14+Management+Principles+from+the+World's+Greatest+Manufacturer&amp;amp;linkCode=ll1&amp;amp;tag=ecpamzn-20&amp;amp;linkId=301d0fd216cb41cd3ecc133541258ac6&quot;&gt;The Toyota Way: 14 Management Principles from the World’s Greatest Manufacturer&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Debois et al, 2016. &lt;a href=&quot;https://www.amazon.com/DevOps-Handbook-World-Class-Reliability-Organizations-ebook/dp/B01M9ASFQ3/ref=as_li_ss_tl?s=digital-text&amp;amp;ie=UTF8&amp;amp;qid=1497379934&amp;amp;sr=1-1&amp;amp;keywords=The+DevOps+Handbook&amp;amp;linkCode=ll1&amp;amp;tag=ecpamzn-20&amp;amp;linkId=7fb0ddddf48b7b57531d22af48128117&quot;&gt;The DevOps Handbook: How to Create World-Class Agility, Reliability, and Security in Technology Organizations&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Conway, 1968. &lt;a href=&quot;http://www.melconway.com/Home/Committees_Paper.html&quot;&gt;How Do Committees Invent?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kniberg; Ivarsson, 2012. &lt;a href=&quot;https://dl.dropboxusercontent.com/u/1018963/Articles/SpotifyScaling.pdf&quot;&gt;Scaling Agile @ Spotify&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Schwaber; Sutherland, 2013. &lt;a href=&quot;http://www.scrumguides.org/docs/scrumguide/v1/scrum-guide-us.pdf&quot;&gt;The Scrum Guide&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Martin, 2016. &lt;a href=&quot;https://www.youtube.com/watch?v=ecIWPzGEbFc&quot;&gt;The Future of Programming&lt;/a&gt; (vídeo)&lt;/li&gt;
  &lt;li&gt;Foote; Yoder, 1999. &lt;a href=&quot;http://www.laputan.org/mud/mud.html&quot;&gt;Big Ball of Mud&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Evans, 2003. &lt;a href=&quot;https://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215/ref=as_li_ss_tl?s=books&amp;amp;ie=UTF8&amp;amp;qid=1495135870&amp;amp;sr=1-1&amp;amp;keywords=Domain-Driven+Design&amp;amp;linkCode=ll1&amp;amp;tag=ecpamzn-20&amp;amp;linkId=efb6fe623ad3774de42c4b49d0f4f921&quot;&gt;Domain-Driven Design: Tackling Complexity in the Heart of Software&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Vernon, 2016. &lt;a href=&quot;https://www.amazon.com/Domain-Driven-Design-Distilled-Vaughn-Vernon/dp/0134434420/ref=as_li_ss_il?ie=UTF8&amp;amp;linkCode=li3&amp;amp;tag=ecpamzn-20&amp;amp;linkId=41aa19b025c49f83ac6a75c694cc1880&quot;&gt;Domain-Driven Design Distilled&lt;/a&gt; (&lt;a href=&quot;/books/vaughn-vernon-domain-driven-design-distilled&quot;&gt;minha resenha&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Newman, 2015. &lt;a href=&quot;https://www.amazon.com/Building-Microservices-Designing-Fine-Grained-Systems/dp/1491950358/ref=as_li_ss_tl?s=books&amp;amp;ie=UTF8&amp;amp;qid=1495138293&amp;amp;sr=1-1&amp;amp;keywords=building+microservices&amp;amp;linkCode=ll1&amp;amp;tag=ecpamzn-20&amp;amp;linkId=02ff5fac74496845d6dfca4a59a1045c&quot;&gt;Building Microservices: Designing Fine-Grained Systems&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Soares, 2017. &lt;a href=&quot;https://www.thoughtworks.com/insights/blog/barriers-organizational-learning&quot;&gt;Barriers to organizational learning&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Anderson, 2010. &lt;a href=&quot;https://www.amazon.com/Kanban-Successful-Evolutionary-Technology-Business/dp/0984521402/ref=as_li_ss_tl?s=digital-text&amp;amp;ie=UTF8&amp;amp;qid=1497379986&amp;amp;sr=8-1&amp;amp;keywords=Kanban:+Successful+Evolutionary+Change+for+Your+Technology+Business&amp;amp;linkCode=ll1&amp;amp;tag=ecpamzn-20&amp;amp;linkId=e89d33fdc9a43010a9e4b6051968a7eb&quot;&gt;Kanban: Successful Evolutionary Change for Your Technology Business&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;!-- Notes --&gt;

&lt;!-- Links refs. --&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:T2P&quot;&gt;
      &lt;p&gt;A ideia é que o time deve ter um tamanho que possibilite ser alimentado por duas pizzas. Acredito, pelo menos por enquanto, que não é um plano da Amazon de aumentar a procura por pizzas ao abrir o apetite de leitores desavisados. &lt;a href=&quot;#fnref:T2P&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Tue, 13 Jun 2017 13:30:00 -0300</pubDate>
        <link>https://blog.eriksen.com.br/pt-br/design-bom-informado-cuidadoso</link>
        <guid isPermaLink="true">https://blog.eriksen.com.br/pt-br/design-bom-informado-cuidadoso</guid>
        
        
      </item>
    
      
      <item>
        <title>Mapeando seu conhecimento de domínio</title>
        <description>&lt;p&gt;Nós construímos software para ajudar as pessoas - os usuários e os clientes - a alcançarem seus objetivos. Esta é a única maneira da sua organização conseguir o que almeja: faturamento para empresas ou um impacto mensurável para organizações sem fins lucrativos.&lt;/p&gt;

&lt;p&gt;Para construir qualidade em software, empregamos uma variedade de práticas como Desenvolvimento Orientado a Testes (&lt;em&gt;Test-Driven Development&lt;/em&gt;, TDD) e Integração Contínua (&lt;em&gt;Continuous Integration&lt;/em&gt;). Essas práticas são ótimas para diminuir o número de defeitos no código mas, sozinhas, não garantem que o software desenvolvido contenha os conceitos do domínio do negócio tampouco que ajude as pessoas de forma efetiva a alcançarem seus objetivos. É muito fácil desenvolver o software errado.&lt;/p&gt;

&lt;p&gt;É por isso que as metodologias Ágeis incluem práticas que melhoram a comunicação e a colaboração. Por exemplo, o &lt;a href=&quot;http://www.scrumguides.org/scrum-guide.html&quot;&gt;Scrum&lt;/a&gt; tem eventos como o &lt;em&gt;Daily Scrum&lt;/em&gt;, o Planejamento da Sprint (&lt;em&gt;Sprint Planning&lt;/em&gt;) e a Retrospectiva da Sprint (&lt;em&gt;Sprint Retrospective&lt;/em&gt;). O &lt;a href=&quot;https://en.wikipedia.org/wiki/Extreme_programming_practices&quot;&gt;Extreme Programming&lt;/a&gt; tem o Time Coeso (&lt;em&gt;Whole Team&lt;/em&gt;) e as Metáforas de Sistema (&lt;em&gt;System Metaphor&lt;/em&gt;). Ambas as metodologias fazem uso do &lt;a href=&quot;http://c2.com/cgi/wiki?IterativeDevelopment&quot;&gt;Desenvolvimento Iterativo&lt;/a&gt;, não apenas para entregar software funcional frequentemente, como também para provar a hipótese de valor do software entregue. Estas práticas são baseadas nos &lt;a href=&quot;http://agilemanifesto.org/principles.html&quot;&gt;princípios do Manifesto Ágil&lt;/a&gt; de redução do risco de desenvolver o software errado.&lt;/p&gt;

&lt;p&gt;Entregar software funcional que deixa as pessoas felizes não significa que o time está criando entendimento compartilhado como tampouco significa que o design do software tem os conceitos do domínio onde opera. E aqui vai uma crítica aos meus camaradas desenvolvedores, uma que escuto frequentemente: na correria para desenvolver uma funcionalidade solicitada, nós evitamos as conversas que ajudam a criar entendimento compartilhado do negócio em favor de discussões técnicas.&lt;/p&gt;

&lt;p&gt;A crítica é benéfica porque mostra que as pessoas de negócio estão interessadas em criar este entendimento compartilhado, que elas estão incorporando os princípios do Manifesto Ágil. Mas estamos pulando direto para a implementação, perdendo uma oportunidade de aprender o domínio e de modelar o software com os conhecimentos do domínio. Eric Evans (2003) vai além:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;(…) se os programadores não estão interessados no domínio, eles aprendem apenas o que a aplicação deve fazer, não os princípios por trás dela. Software útil pode ser desenvolvido dessa maneira, mas o projeto nunca chegará em um ponto onde novas funcionalidades poderosas surgirão como corolárias de funcionalidades existentes (Evans, 2003) &lt;!-- Kindle location: 677 --&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Como motivar os desenvolvedores a se interessarem mais sobre o domínio do negócio? O Mapeamento de Estórias de Usuário pode ajudar.&lt;/p&gt;

&lt;amp-img src=&quot;/assets/images/posts/usm-domain/wikidu.jpg&quot; width=&quot;800&quot; height=&quot;600&quot; layout=&quot;responsive&quot;&gt;&lt;/amp-img&gt;

&lt;noscript&gt;
  &lt;img src=&quot;/assets/images/posts/usm-domain/wikidu.jpg&quot; /&gt;
&lt;/noscript&gt;

&lt;p&gt;&lt;small&gt;Um mapa incipiente do Wikidu&lt;/small&gt;&lt;/p&gt;

&lt;h2 id=&quot;mapeamento-de-estrias-de-usurio&quot;&gt;Mapeamento de Estórias de Usuário&lt;/h2&gt;

&lt;p&gt;O &lt;a href=&quot;http://jpattonassociates.com/user-story-mapping/&quot;&gt;Mapeamento de Estórias de Usuário&lt;/a&gt; (&lt;em&gt;User Story Mapping&lt;/em&gt;) é um padrão descoberto por Jeff Patton que ajuda times a entenderem um produto ou funcionalidade completa, com o objetivo de construir um produto melhor:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Mapear estórias nos mantém focados nos usuários e na sua experiência, resultando em melhores conversas e, ultimamente, em um produto melhor. (Patton, 2014) &lt;!-- Kindle location: 133 --&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A excepcional documentação que Patton criou joga uma luz em como as estórias&lt;sup id=&quot;fnref:stories&quot;&gt;&lt;a href=&quot;#fn:stories&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; tem sido mal usadas, fazendo com que times caíssem em uma ou mais armadilhas, aos quais destaco duas:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;O backlog plano: estórias permitem que times foquem em construir pequenas coisas, &lt;em&gt;perdendo a visão do horizonte maior&lt;/em&gt;. Frequentemente resulta em produtos Frankenstein, onde o produto parece ter sido montado com partes que não se encaixam&lt;/li&gt;
  &lt;li&gt;Forma ao invés de substância: quando há foco apenas em escrever estórias ao invés de criar &lt;em&gt;entendimento compartilhado&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eu incluo uma introdução rápida para explicar melhor como o padrão ajuda a motivar todos na criação de entendimento compartilhado. Você precisará de notas adesivas (&lt;em&gt;post-its&lt;/em&gt;), canetas e uma mesa ou parede (ou um quadro branco).&lt;/p&gt;

&lt;amp-img src=&quot;/assets/images/posts/usm-domain/flat-backlog.jpg&quot; width=&quot;800&quot; height=&quot;600&quot; layout=&quot;responsive&quot; title=&quot;Um Kanban com uma colunas de backlog. Não há uma visão, apenas prioridades de curto prazo&quot;&gt;&lt;/amp-img&gt;

&lt;noscript&gt;
  &lt;img src=&quot;/assets/images/posts/usm-domain/flat-backlog.jpg&quot; title=&quot;Um Kanban com uma colunas de backlog. Não há uma visão, apenas prioridades de curto prazo&quot; /&gt;
&lt;/noscript&gt;

&lt;p&gt;&lt;small&gt;A coluna backlog não mostra a visão desse produto&lt;/small&gt;&lt;/p&gt;

&lt;h2 id=&quot;introduo&quot;&gt;Introdução&lt;/h2&gt;

&lt;p&gt;Configure um &lt;em&gt;timebox&lt;/em&gt; (10 minutos no máximo), e peça que as pessoas escrevam, em silêncio, as tarefas que os usuários farão na sua aplicação. Essas &lt;em&gt;tarefas de usuário&lt;/em&gt; são coisas como “Solicitar uma corrida”, “Avaliar o livro”, “Adicionar produto ao carrinho”. Uma vez que todo mundo terminou, peça às pessoas que leiam cada nota e a coloquem em cima da mesa. Se houver tarefas duplicadas, elimine-as. Em resumo, os passos são: pense, escreva, explique e posicione.&lt;/p&gt;

&lt;p&gt;Você descobrirá algumas coisas interessantes durante o processo:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A maioria das notas serão de frases verbais curtas&lt;/li&gt;
  &lt;li&gt;As pessoas irão organizar as tarefas intuitivamente num fluxo ordenado, com as tarefas que devem ocorrer primeiro no lado esquerdo com as conseguintes após elas&lt;/li&gt;
  &lt;li&gt;Algumas notas irão conter tarefas que acontecem ao mesmo tempo que outras tarefas. Essas são sub-tarefas. Numa aplicação de software, podem ser passos adicionais e/ou opcionais que o usuário dará&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora que você identificou as tarefas do usuário, é hora de organizar seu mapa. Intuitivamente, parte desse trabalho já foi feito: tarefas que devem acontecer primeiro foram colocadas no lado esquerdo, com tarefas posteriores seguindo-as. Empilhe as sub-tarefas abaixo das tarefas principais.&lt;/p&gt;

&lt;p&gt;Para validar se este fluxo está consistente, comece a contar a estória do seu mapa: aponte para a primeira tarefa dizendo “Primeiro o usuário faz isso” e, então, aponte para a próxima dizendo “e então ele faz isto” até a última tarefa.&lt;/p&gt;

&lt;p&gt;Este é o &lt;em&gt;“fluxo narrativo”&lt;/em&gt; como definido por Patton. Re-ordene a posição das tarefas se a narrativa parecer sem sentido. Você sempre irá encontrar ausência de detalhes porque o mapa o ajuda a ver o horizonte do produto, o todo. Preenche os detalhes que faltam enquanto completa o mapa.&lt;/p&gt;

&lt;amp-img src=&quot;/assets/images/posts/usm-domain/narrative-ptbr.jpg&quot; width=&quot;800&quot; height=&quot;600&quot; layout=&quot;responsive&quot; title=&quot;Fluxo narrativo, tarefas dos usuários e atividades destacados em um Mapa de Estórias de Usuário&quot;&gt;&lt;/amp-img&gt;

&lt;noscript&gt;
  &lt;img src=&quot;/assets/images/posts/usm-domain/narrative-ptbr.jpg&quot; title=&quot;Fluxo narrativo, tarefas dos usuários e atividades destacados em um Mapa de Estórias de Usuário&quot; /&gt;
&lt;/noscript&gt;

&lt;p&gt;&lt;small&gt;Prove a consistência do seu mapa contando a estória dele&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;O próximo passo é o de destilar o mapa. Dê um passo para trás e preste atenção no fluxo narrativo. Você encontrará grupos de tarefas que são muito próximas. As tarefas de um usuário de e-commerce, “Adicionar ao carrinho”, “Estimar frete” e “Fazer checkout” poderiam ser agrupadas em uma atividade “Fazer pedido”. Em uma rede social, “Procurar por nome”, “Visitar o perfil da pessoa” e “Adicionar contato” poderiam ser agrupados em atividades como “Conectar” ou “Fazer amizade”.&lt;/p&gt;

&lt;p&gt;Escreva o nome da atividade em uma nota e a coloque acima do grupo de tarefas correspondente. Valide se o fluxo narrativo ainda está consistente, lendo as atividades da mesma forma que você leu as tarefas. As atividades formam a coluna vertebral do mapa.&lt;/p&gt;

&lt;amp-img src=&quot;/assets/images/posts/usm-domain/backbone-ptbr.jpg&quot; width=&quot;800&quot; height=&quot;600&quot; layout=&quot;responsive&quot; title=&quot;Coluna vertebral do Mapa de Estórias de Usuário destacada&quot;&gt;&lt;/amp-img&gt;

&lt;noscript&gt;
  &lt;img src=&quot;/assets/images/posts/usm-domain/backbone-ptbr.jpg&quot; title=&quot;Coluna vertebral do Mapa de Estórias de Usuário destacada&quot; /&gt;
&lt;/noscript&gt;

&lt;p&gt;&lt;small&gt;A coluna vertebral do mapa é formada pelas suas atividades&lt;/small&gt;&lt;/p&gt;

&lt;h2 id=&quot;adicionado-contexto-ao-mapa&quot;&gt;Adicionado contexto ao mapa&lt;/h2&gt;

&lt;p&gt;Uma mapa pode ter mais que tarefas e atividades de usuários. Você pode adicionar mais informações importantes ao mapa, ajudando a criar entendimento compartilhado:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Oportunidades e hipóteses&lt;/em&gt;. Por quê construí-lo? Que tipo de problema resolve?&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Princípios do produto&lt;/em&gt;. Exemplos: divertido, fácil, acessível (isto deveria ser um princípio de qualquer produto!), amigável, rápido&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Clientes e usuários&lt;/em&gt;. Quem são os usuários? Quais os diferentes papéis desses usuários? Por quê eles irão usar o produto? O que nós achamos deles? Quais tipos nós iremos priorizar agora?&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Detalhes, opções, dúvidas&lt;/em&gt;. Mais detalhes sobre as tarefas e atividades podem ser adicionadas assim como alternativas. Notas com dúvidas podem ser adicionadas caso alguém não tenha certeza sobre como irá funcionar. Observações sobre como outros serviços - competidores ou não - resolveram o problema podem ser colocados no mapa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você pode usar notas adesivas de diferentes cores e colocar esta informação onde for mais útil para fins de contextualização.&lt;/p&gt;

&lt;amp-img src=&quot;/assets/images/posts/usm-domain/context-ptbr.jpg&quot; width=&quot;800&quot; height=&quot;600&quot; layout=&quot;responsive&quot; title=&quot;Um Mapa de Estórias de Usuário enriquecido com contexto&quot;&gt;&lt;/amp-img&gt;

&lt;noscript&gt;
  &lt;img src=&quot;/assets/images/posts/usm-domain/context-ptbr.jpg&quot; title=&quot;Um Mapa de Estórias de Usuário enriquecido com contexto&quot; /&gt;
&lt;/noscript&gt;

&lt;p&gt;&lt;small&gt;Enriqueça sua conversa adicionando mais contexto no seu mapa&lt;/small&gt;&lt;/p&gt;

&lt;h2 id=&quot;criar-entendimento-compartilhado--a-chave&quot;&gt;Criar entendimento compartilhado é a chave&lt;/h2&gt;

&lt;p&gt;O que realmente importa durante a criação do mapa é o entendimento compartilhado criado atráves de melhores conversas. Esta era a ideia do Kent Beck quando introduziu o conceito de estórias: para trocar o foco de documentos compartilhados por entendimento compartilhado.&lt;/p&gt;

&lt;p&gt;Apenas escrever estórias como documentos compartilhados não ajuda a criar entendimento compartilhado porque quando alguém lê uma estória, pode interpretá-la de forma diferente do autor da estória. A única forma possível é externalizando nossas ideias. A estória escrita se torna então um meio, e não um fim.&lt;/p&gt;

&lt;h2 id=&quot;como-isso-pode-motivar-desenvolvedores-que-s-pensam-em-tecnologia&quot;&gt;Como isso pode motivar desenvolvedores que só pensam em tecnologia?&lt;/h2&gt;

&lt;p&gt;Como desenvolvedor, eu sei muitos dos motivos que fazem com que desenvolvedores fiquem menos preocupados com o negócio. Uma delas é a ausência de visão de produto, a falta de um horizonte. Roadmaps são constantemente criados para prover esse horizonte mas não são visuais o suficiente ou atualizados para comunicar claramente em que ponto da jornada o time está. E o backlog plano pode dar a impressão que o único trabalho dos desenvolvedores é o de processar novas estórias.&lt;/p&gt;

&lt;p&gt;Isto os aliena dos objetivos de negócio, perdendo então o interesse sobre o domínio. E como desenvolvedores gostam de construir coisas, é fácil focar a atenção no lado tecnológico e resolver problemas de domínio com tecnologia (Evans, 2003). &lt;!-- Kindle location: 541 --&gt;&lt;/p&gt;

&lt;p&gt;Como ferramenta visual, um mapa pode claramente radiar informação sobre este horizonte. Pode ser usado para priorizar estórias a serem trabalhadas (Patton explica técnicas de priorização em seu livro). É um roadmap vivo. Os desenvolvedores podem entender o quê e o porquê do que estão trabalhando e como isso se encaixa no horizonte.&lt;/p&gt;

&lt;p&gt;Pedir ajuda aos desenvolvedores para criar o mapa (acho que o primeiro mapa deve ser criado com a colaboração do time inteiro) pode ajudar não apenas com diferentes pontos de vista como também com ideias interessantes e valiosas (desenvolvedores tendem a ser &lt;em&gt;early adopters&lt;/em&gt; de todo tipo de tecnologia, de aplicativos à &lt;em&gt;wearables&lt;/em&gt;). Quando eles começarem a perguntar o porquê/o quê/como, não estarão apenas ajudando a criar entendimento compartilhado, como também exibindo disposição para aprender sobre o negócio.&lt;/p&gt;

&lt;p&gt;Criar o mapa pode ajudar também a criar relacionamentos fortes entre os membros do time e a desenvolver valores como respeito e coragem. Se o time for além e tentar entender melhor os usuários/clientes e criar personas&lt;sup id=&quot;fnref:personas&quot;&gt;&lt;a href=&quot;#fn:personas&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;, podem criar empatia pelos usuários nos desenvolvedores. Relacionamentos mais fortes entre os membros do time, mais consciência sobre os objetivos do negócio e mais empatia pelos usuários pode fazer emergir um dos três elementos da motivação: propósito (Pink, 2009). Propósito é o anseio de fazer o que fazemos por algo maior que nós mesmos. Pessoas que encontram o propósito no seu trabalho alcançam o último nível do &lt;a href=&quot;http://deliveringhappiness.com/the-motivation-trifecta-autonomy-mastery-and-purpose/&quot;&gt;jogo da motivação&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;mapeie-para-ajudar-na-sua-adoo-de-ddd-e-para-produzir-uma-linguagem-ubqua&quot;&gt;Mapeie para ajudar na sua adoção de DDD e para produzir uma Linguagem Ubíqua&lt;/h2&gt;

&lt;p&gt;O livro &lt;a href=&quot;http://dddcommunity.org/book/evans_2003/&quot;&gt;Domain-Driven Design&lt;/a&gt; (DDD) de Evans introduziu uma nova abordagem de desenvolvimento de software que baseia a implementação do design em um modelo do domínio. Pode ajudar a alcançar um nível onde o design é exatamente como o software funciona (Vernon, 2013), &lt;!-- Kindle location: page 45 --&gt; por meio de ferramentas estratégicas e táticas que ajudam a projetar software de alta qualidade e que satisfaz os objetivos do negócio (&lt;em&gt;core business&lt;/em&gt;)&lt;!-- Kindle location: page 46 --&gt;.&lt;/p&gt;

&lt;p&gt;Como abordagem, DDD não é sobre tecnologia:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;DDD é sobre discussões, escutar, entender, descobrir, valores de negócio, tudo no esforço de centralizar o conhecimento. Se você for capaz de entender o negócio sobre o qual a sua empresa opera, você pode no mínimo participar no processo de descoberta de modelagem de software para produzir uma Linguagem Ubíquia (&lt;em&gt;Ubiquitous Language&lt;/em&gt;) (Vernon, 2013) &lt;!-- Kindle location: page 47 --&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para construir um modelo de domínio e efetivamente adotar DDD, é necessário processar conhecimento&lt;sup id=&quot;fnref:knowledge-crunching&quot;&gt;&lt;a href=&quot;#fn:knowledge-crunching&quot; class=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;. “Centralizar o conhecimento” é um sinônimo de “criar entendimento compartilhado”. Evans diz que modeladores de domínio são &lt;em&gt;processadores de conhecimento&lt;/em&gt; e enfatiza que isto é uma atividade de time (e um requisito para a prática de DDD):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Processamento de conhecimento não é uma atividade solitária. Um time de desenvolvedores e especialistas no domínio colaboram, tipicamente liderados por desenvolvedores. Juntos eles obtêm informações e a processam em um formato útil. A matéria prima vem das mentes dos especialistas no domínio, dos usuários de sistemas existentes, da experiência prévia do time técnico com o sistema legado ou de outro projeto no mesmo domínio. Vem na forma de documentos escritos para o projeto ou usados no negócio, e de muitas e muitas conversas. Primeiras versões ou protótipos retroalimentam o time e mudam interpretações. (Evans, 2003) &lt;!-- Kindle location: 675 --&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Desse processamento de conhecimento, o time (desenvolvedores e especialistas no domíno) devem desenvolver uma Línguagem Ubíqua, que é uma linguagem compartilhada. O vocabulário dessa linguagem é centrado em como o negócio em si pensa e opera (Vernon, 2013) &lt;!-- Kindle location: page 69 --&gt;. Esta linguagem previne desendentimento entre as pessoas de negócio e os desenvolvedores ao remover a necessidade de traduções entre conceitos de negócio e as abstrações usadas no design do software.&lt;/p&gt;

&lt;p&gt;A Linguagem Ubíqua é um dos pilares do DDD ao lado dos Contextos Delimitados (&lt;em&gt;Bounded Context&lt;/em&gt;) (Vernon, 2013) &lt;!-- Kindle location: page 68 --&gt;.  Seu vocabulário inclue nome de classes e operações proeminentes, sendo o principal portador dos aspectos do design que não aparecem no código (Evans, 2003). &lt;!-- Kindle location: 862 --&gt;&lt;/p&gt;

&lt;p&gt;É aqui que o Mapeamento de Estórias pode ajudar na sua adoção de DDD. É uma técnica incrível para começar o processamento de conhecimento e produzir o glossário inicial da Linguagem Ubíqua. Faça esse esforço de forma colaborativa: irá ajudar a formar o seu time e irá motivá-los a terem as conversas necessárias.&lt;/p&gt;

&lt;h2 id=&quot;mapeie-para-avaliar-a-complexidade-do-seu-domnio&quot;&gt;Mapeie para avaliar a complexidade do seu domínio&lt;/h2&gt;

&lt;p&gt;No &lt;a href=&quot;https://vaughnvernon.co/?page_id=168&quot;&gt;Implementing Domain-Driven Design&lt;/a&gt;, Vernon apresenta um &lt;em&gt;scorecard&lt;sup id=&quot;fnref:scorecard&quot;&gt;&lt;a href=&quot;#fn:scorecard&quot; class=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/em&gt; para ajudar times a determinarem se vale a pena adotar DDD em um projeto. Se você tiver uma pontuação maior ou igual a sete, considere a adoção de DDD.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Se o seu projeto&lt;/th&gt;
      &lt;th&gt;Pontos&lt;/th&gt;
      &lt;th&gt;Considerações de apoio&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Se sua aplicação é completamente centrada em dados e qualifica-se para uma solução CRUD pura, onde cada operação é basicamente uma simples consulta no banco de dados para Criar, Ler, Atualizar ou Apagar, você não precisa de DDD. Seu time precisa apenas colocar uma cara bonita em cima de um editor de tabelas de banco de dados. Em outras palavras, você pode confiar nos seus usuários inserindo dados diretamente em uma tabela, atualizá-los, e de vez em quando apagá-los, você pode nem precisar de uma interface. Isto não é realista, mas conceituamente relevante. Você poderia até usar uma simples ferramenta de desenvolvimento de banco de dados para criar uma solução, não gaste o tempo e dinheiro da sua empresa com DDD.&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;Isto parece simples, mas geralmente não é fácil determinar o simples versus o complexo.  Não é como se cada aplicação que não é um CRUD puro merecesse o tempo e esforço de adotar DDD. Então talvez pudéssemos ter outras métricas úteis para delinear o que é complexo e o que não é…&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Se o seu sistema requer apenas 30 ou menos operações de negócio, provavelmente é muito simples. Isto significaria que sua aplicação teria não mais que 30 estórias de usuário or fluxos de caso de uso, cada um desses fluxos tendo lógica mínima de negócio. Se você puder rapidamente e facilmente desenvolver tal aplicação usando Ruby on Rails ou Groovy and Grails e não sentir a dor da falta de poder e controle sobre complexidade e mudança, seu sistema provavelmente não precisa de DDD.&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;Pra ser claro, eu estou falando de 25-30 métodos de negócio únicos, não 25-30 interfaces completas de serviços, cada qual com múltiplos métodos. O último pode ser complexo&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Vamos dizer que em algum lugar no intervalo de 30 a 40 estórias de usuário ou fluxos de caso de uso poderia indicar complexidade. Seu sistema pode estar entrando no território do DDD.&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;Atenção: frequentemente complexidade não é reconhecida cedo o suficiente. Nós desenvolvedores de software somos, de fato, bons em subestimar complexidade e esforço. Apenas porque possamos querer codificar uma aplicação usando Ruby ou Grails não significa que devemos. No longo prazo, isto pode mais atrapalhar que ajudar&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Mesmo que a aplicação não vá ser complexa agora, a complexidade irá aumentar? Você pode não saber com certeza até que os usuários reais comecem a usá-la, mas há um passo em &lt;em&gt;Considerações de apoio&lt;/em&gt; que pode ajudar a descobrir a situação real.&lt;br /&gt;&lt;br /&gt;Tenha cuidado. Se há alguma dica de que a aplicação tem até mesmo complexidade moderada - esta é uma boa hora pra ser paranóico - pode ser um indicador suficiente que irá ser realmente mais do que moderadamente complexa. Considere DDD.&lt;/td&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;Aqui vale a pena revisar os cenários de uso mais complexos com especialistas no domínio e ver onde isto leva. Os especialistas de domínio…&lt;br /&gt;&lt;br /&gt;(1) já pediram funcionalidades mais complexas? Se sim, é um indicador suficiente que a aplicação já é ou em breve se tornará muito complexa para usar uma abordagem CRUD.&lt;br /&gt;&lt;br /&gt;(2) estão tão entediados com as funcionalidades que dificilmente suportam discutí-las? Provavelmente não é complexo.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;As funcionalidades da aplicação irão mudar frequentemente ao longo dos anos, e você não pode antecipar que tipos de mudanças serão simples&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
      &lt;td&gt;DDD pode ajudar você a gerenciar a complexidade da refatoração do seu modelo ao longo do tempo.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Você não entende o Domínio porque ele é novo. Tão longe quanto você e seu time sabe, ninguém fez isto antes. Isto provavelmente significa que é complexo, ou ao menos merece a diligência devida com escrutínio analítico para determinar o nível de complexidade&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;Você precisará trabalhar com especialistas no domínio e experimentar com modelos para conseguir fazer certo. Você provavelmente pontuou em ou ou mais dos itens anteriores, então use DDD.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Após concluir o seu mapa, você verá o horizonte do produto que você quer construir. Você se lembra das &lt;em&gt;tarefas de usuário&lt;/em&gt;? Elas são as estórias que o seu time precisará desenvolver. Cada uma pode ter &lt;em&gt;n&lt;/em&gt; sub-tarefas ou fluxos alternativos. Conte-as e você saberá se o você pontuou no segundo ou terceiro caso. Outros indicadores de complexidade são a densidade visual do mapa e a quantidade de papéis de usuário (e a forma como eles influenciam as tarefas).&lt;/p&gt;

&lt;p&gt;Obviamente o mapa sozinho pode não ser suficiente para avaliar a complexidade do seu projeto. Por exemplo, muitas startups exploram oportunidade de negócio que se encaixam no último caso. E quando uma startup depende de uma aplicação de software para o seu negócio, você deve esperar que suas funcionalidades irão mudar ao longo do tempo para melhor suportar seu crescimento e sua continuidade. &lt;em&gt;Use o mapa como uma matéria-prima para sua avaliação&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;concluses&quot;&gt;Conclusões&lt;/h2&gt;

&lt;p&gt;Mapeamento de Estórias de Usuário é um padrão simples mas intuitivo que resgata a ideia original das estórias do Kent Beck: de ter uma boa conversa para o bem do entendimento compartilhado. Como uma tarefa colaborativa, ajuda na formação e motivação do time.&lt;/p&gt;

&lt;p&gt;Alguns praticantes ágeis podem temer que o mapeamento de estórias seja muito planejamento. Não é para ser. Construa o primeiro mapa para descobrir a narrativa e então o use para priorizar as estórias a serem desenvolvidas. Quando estiverem próximas a serem priorizadas para serem desenvolvidas, inicie o processamento de conhecimento para identificar o que você precisa aprender.&lt;/p&gt;

&lt;p&gt;Mantenha-o como um documento vivo e o atualize cada vez que você descobrir algo novo. Atualize o fluxo narrativo enquanto você valida a sua hipótese de valor. Use o mapa como seu backlog, sem perder a visão de horizonte!&lt;/p&gt;

&lt;p&gt;Curiosamente, alguns desenvolvedores acostumados a desenvolvimento Ágil temem que DDD podem levá-los a fazer design prematuro. Minha crença pessoal é que esta impressão é causada pela ênfase nas conversas e nos diagramas encontrada na literatura. Você precisa discutir porque precisa aprender os princípios do negócio por trás da estória. Os diagramas são apenas abstrações, eles não necessariamente refletem o design futuro: muito será deixado para ser descoberto e é aqui que TDD brilha.&lt;/p&gt;

&lt;p&gt;Por último mas não menos importante, Mapeamento de Estórias pode ser valioso na sua avaliação da adoção de DDD. Se seu projeto é complexo e você adotar a abordagem DDD para desenvolvimento de software, o mapa pode ajudar a iniciar o processamento de conhecimento e na produção inicial do glossário da Linguagem Ubíqua.&lt;/p&gt;

&lt;h2 id=&quot;agradecimentos&quot;&gt;Agradecimentos&lt;/h2&gt;

&lt;p&gt;Obrigado ao &lt;a href=&quot;https://twitter.com/nelson_senna&quot;&gt;Nelson Senna&lt;/a&gt; e &lt;a href=&quot;https://twitter.com/fernandoike&quot;&gt;Fernando Ike&lt;/a&gt; pela revisão e pro &lt;a href=&quot;https://twitter.com/vaughnvernon&quot;&gt;Vaughn Vernon&lt;/a&gt; pelo feedback positivo.&lt;/p&gt;

&lt;h2 id=&quot;referncias&quot;&gt;Referências&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://dddcommunity.org/book/evans_2003/&quot;&gt;Evans, 2003. Domain-Driven Design: Tackling Complexity in the Heart of Software&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://jpattonassociates.com/user-story-mapping/&quot;&gt;Patton, 2014. User Story Mapping: Discover the Whole Story, Build the Right Product&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.danpink.com/drive/&quot;&gt;Pink, 2009. Drive: The Surprising Truth About What Motivates Us&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://vaughnvernon.co/?page_id=168&quot;&gt;Vernon, 2013. Implementing Domain-Driven Design&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;!-- Notes. --&gt;

&lt;!-- References. --&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:stories&quot;&gt;
      &lt;p&gt;Eu uso o substantivo estória ao invés de estória de usuário por conveniência. Estórias são amplamente usadas em metodologias Ágeis para propósitos de planejamento. Introduzidas por &lt;a href=&quot;http://martinfowler.com/bliki/UserStory.html&quot;&gt;Kent Beck&lt;/a&gt;, estórias encorajam conversas informais para a criação de conhecimento compartilhado. &lt;a href=&quot;#fnref:stories&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:personas&quot;&gt;
      &lt;p&gt;Uma persona é uma representação escrita de um usuário específico ao qual pode ser usada para tomar decisões sobre funcionalidade do software. Patton descreve uma forma pragmática de criar &lt;a href=&quot;http://www.stickyminds.com/article/pragmatic-personas&quot;&gt;personas&lt;/a&gt;. &lt;a href=&quot;#fnref:personas&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:knowledge-crunching&quot;&gt;
      &lt;p&gt;Como no restante desse texto, a tradução é livre. Uma tradução literal seria &lt;em&gt;triturar conhecimento&lt;/em&gt; (&lt;em&gt;to crunch knowledge&lt;/em&gt;). &lt;a href=&quot;#fnref:knowledge-crunching&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:scorecard&quot;&gt;
      &lt;p&gt;Uma explicação completa do scorecard do DDD também está disponível no site do &lt;a href=&quot;http://www.informit.com/articles/article.aspx?p=1944876&amp;amp;seqNum=2&quot;&gt;InformIT&lt;/a&gt; &lt;a href=&quot;#fnref:scorecard&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Mon, 07 Nov 2016 08:30:00 -0200</pubDate>
        <link>https://blog.eriksen.com.br/pt-br/mapeando-conhecimento-dominio</link>
        <guid isPermaLink="true">https://blog.eriksen.com.br/pt-br/mapeando-conhecimento-dominio</guid>
        
        
      </item>
    
      
      <item>
        <title>Palestras sobre web performance na Germinadora</title>
        <description>&lt;p&gt;No próximo dia 18, teremos duas palestras em São Paulo (capital) sobre &lt;a href=&quot;http://www.meetup.com/Germinadora/events/222137886/&quot;&gt;&lt;em&gt;web performance&lt;/em&gt;&lt;/a&gt;. A organização é da &lt;a href=&quot;http://www.germinadora.com/&quot;&gt;Germinadora&lt;/a&gt;, dentro do Papo de Primeira, uma série de eventos gratuitos voltados ao ecossistema de &lt;em&gt;startups&lt;/em&gt; brasileiras.&lt;/p&gt;

&lt;p&gt;Assistindo as palestras, você irá se questionar se &lt;strong&gt;seu site está preparado para um milhão de usuários&lt;/strong&gt; além de aprender as &lt;strong&gt;novidades do HTTP/2&lt;/strong&gt;. O interessante deste evento é que as palestras complementam-se. Na primeira, são discutidos os impactos que uma performance ruim tem na retenção e conversão de usuários e uma série de técnicas para otimização de sites enquanto a segunda mostra o caminho da adoção do protocolo HTTP/2, ao qual tem o objetivo de tornar a Internet mais rápida.&lt;/p&gt;

&lt;p&gt;E claro, um conteúdo desses torna-se mais atraente quando sabemos que os palestrantes, &lt;a href=&quot;http://www.fernandoike.com/&quot;&gt;Fernando Ike&lt;/a&gt; e Alex Soares, trabalham há anos em projetos dos maiores portais da América Latina na Exceda/Akamai. É conhecimento direto da trincheira!&lt;/p&gt;

&lt;p&gt;A ideia do evento é do Fernando Ike, entre um café e outro enquanto discutíamos sobre tecnologia e a vida (de contêineres). Estamos para decidir a frequência das palestras, a temática e a data da próxima edição. Considere esta um ensaio para um novo evento (e sim, este é um anúncio extraoficial).&lt;/p&gt;

&lt;p&gt;Os agradecimentos especiais vão para o Dairton Bassi (Agile Trends) e para a Barbara Bernabó e o Ibrahim Cesar (Germinadora) por facilitarem este encontro.&lt;/p&gt;

&lt;p&gt;Espero você por lá!&lt;/p&gt;

&lt;h2 id=&quot;quando-onde-e-como&quot;&gt;Quando, onde e como&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;18 de maio, às 7:30 PM&lt;/li&gt;
  &lt;li&gt;Germinadora, &lt;a href=&quot;https://www.google.com/maps?f=q&amp;amp;hl=en&amp;amp;q=Rua+Eng.+Jos%C3%A9+S%C3%A1+Rocha,+173,+S%C3%A3o+Paulo,+br&quot;&gt;Rua Eng. José Sá Rocha, 173, São Paulo/SP&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.meetup.com/Germinadora/events/222137886/&quot;&gt;&lt;strong&gt;É necessário confirmar presença através do Meetup&lt;/strong&gt;&lt;/a&gt;. Na página do evento no Meetup tem uma descrição mais completa das palestras e as mini-biografias dos palestrantes&lt;/li&gt;
  &lt;li&gt;As palestras serão disponibilizadas em vídeo posteriormente&lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Wed, 13 May 2015 09:30:00 -0300</pubDate>
        <link>https://blog.eriksen.com.br/pt-br/palestras-web-performance-germinadora</link>
        <guid isPermaLink="true">https://blog.eriksen.com.br/pt-br/palestras-web-performance-germinadora</guid>
        
        
      </item>
    
      
      <item>
        <title>Composer: não tente, use</title>
        <description>&lt;p&gt;A nova edição do &lt;a href=&quot;http://www.thoughtworks.com/radar&quot;&gt;Technology Radar da ThoughtWorks&lt;/a&gt; listou pela primeira vez um projeto em PHP e foi o &lt;a href=&quot;http://www.thoughtworks.com/radar/tools/composer&quot;&gt;Composer&lt;/a&gt;. Entretanto, eles listaram o composer no quadrante &lt;em&gt;Trial&lt;/em&gt; (tentar, experimentar), enquanto eu acredito que deveria ter sido listado no &lt;a href=&quot;https://twitter.com/eriksencosta/status/545753084522405888&quot;&gt;quadrante &lt;em&gt;Adopt&lt;/em&gt;&lt;/a&gt; (adotar). E eu quero dizer a você o por quê.&lt;/p&gt;

&lt;p&gt;Primeiro, é importante ressaltar que o &lt;a href=&quot;http://www.thoughtworks.com/radar/faq&quot;&gt;Technology Radar&lt;/a&gt; não é uma lista das tecnologias aprovadas pela ThoughtWorks. É uma compilação de tecnologias baseado apenas em opiniões e experiência de técnicos seniores. É uma publicação repleta de &lt;em&gt;insights&lt;/em&gt; ao qual recomendo a leitura.&lt;/p&gt;

&lt;p&gt;Quando eu penso no nome “ThoughtWorks”, PHP não me vem à mente. Eu não lembro de nenhuma publicação deles mencionando a linguagem. Com isto em mente, fiquei surpreso ao ver que o Composer havia sido listado. Talvez essa falta de intimidade com o ecossistema PHP seja a razão do porque o Composer foi posicionado no quadrante &lt;em&gt;Trial&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;O Composer foi lançado no final de 2011. Até então, instalar dependências em projetos PHP era limitado a duas escolhas: funcionalidades de sistemas de versão de controle como o &lt;em&gt;SVN externals&lt;/em&gt; ou &lt;em&gt;submodules Git&lt;/em&gt; ou, se disponível, através do instalador PEAR.&lt;/p&gt;

&lt;p&gt;Ainda naquele ano, o Symfony2 tinha sido lançado em julho, empurrando o ecossistema PHP. Uma onda de &lt;a href=&quot;http://pooteeweet.org/blog/0/1915#m1915&quot;&gt;bibliotecas e ferramentas&lt;/a&gt; haviam sido lançadas, renovando o interesse na linguagem. Composer, lançado meses depois, era a ferramenta que precisávamos para nos beneficiar facilmente dessas novas bibliotecas e ferramentas.&lt;/p&gt;

&lt;p&gt;Em algumas semanas, 227 pacotes estavam listados no Packagist (o principal repositório de pacotes do Composer) enquanto o repositório PEAR tinha 592 pacotes. O que foi impressionante foi o fato que esses pacotes eram para o PHP 5.3+ enquanto que no PEAR apenas 192 pacotes eram PHP 5+. O impacto &lt;a href=&quot;http://nelm.io/blog/2011/12/composer-part-2-impact/&quot;&gt;talvez tenha sido mais rápido&lt;/a&gt; do que Jordi Boggiano (um dos desenvolvedores líderes do Composer) previu.&lt;/p&gt;

&lt;p&gt;Hoje, &lt;a href=&quot;https://packagist.org/statistics&quot;&gt;45 mil pacotes&lt;/a&gt; estão registrados no Packagist. Rubygems, que remonta a 2003, tem &lt;a href=&quot;http://rubygems.org/stats&quot;&gt;93 mil gems&lt;/a&gt;. Brechas de segurança foram &lt;a href=&quot;http://blog.astrumfutura.com/2014/02/composer-downloading-random-code-is-not-a-security-vulnerability/&quot;&gt;discutidas&lt;/a&gt;, &lt;a href=&quot;http://evertpot.com/composer-bug-fixed/&quot;&gt;corrigidas&lt;/a&gt; e &lt;a href=&quot;http://blog.astrumfutura.com/2014/03/thoughts-on-composers-future-security/&quot;&gt;alternativas&lt;/a&gt; foram propostas. &lt;a href=&quot;http://fabien.potencier.org/article/67/don-t-use-php-libraries-with-known-security-issues&quot;&gt;Ferramentas&lt;/a&gt; &lt;a href=&quot;http://ocramius.github.io/blog/roave-security-advisories-protect-against-composer-packages-with-security-issues/&quot;&gt;adicionais&lt;/a&gt; lançadas por desenvolvedores da comunidade ajudam a garantir maior segurança. &lt;a href=&quot;https://getcomposer.org/doc/&quot;&gt;A boa documentação&lt;/a&gt; provê um ponto de partida seguro e sempre tem alguém ajudando você a usá-lo da &lt;a href=&quot;http://www.slideshare.net/rdohms/composer-the-right-way-sweetlakephp&quot;&gt;forma correta&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Por último e não menos importante, milhares de organizações estão usando o Composer para gerenciar dependências. Milhões de execuções em ambientes de Integração Contínua aconteceram além de outras milhões de milhões em ambientes de desenvolvedores. Como não recomendar uma ferramenta que é a solução &lt;em&gt;de-facto&lt;/em&gt; na caixa de ferramentas do ecossistema?&lt;/p&gt;

&lt;p&gt;Não faça com que as pessoas riam de você num bar ao dizê-las que você não usa o Composer.&lt;/p&gt;

</description>
        <pubDate>Wed, 24 Dec 2014 17:00:00 -0200</pubDate>
        <link>https://blog.eriksen.com.br/pt-br/composer-nao-tente-use</link>
        <guid isPermaLink="true">https://blog.eriksen.com.br/pt-br/composer-nao-tente-use</guid>
        
        
      </item>
    
      
      <item>
        <title>Uma imagem Docker para desenvolvimento PHP multiversão</title>
        <description>&lt;p&gt;Eu liberei uma &lt;a href=&quot;https://registry.hub.docker.com/u/eriksencosta/php-dev/&quot;&gt;imagem Docker&lt;/a&gt; voltada para desenvolvimento PHP com as últimas versões suportadas do PHP instaladas mais a última versão do PHP 5.3. O objetivo da imagem é ajudar desenvolvedores que precisam desenvolver e testar seus projetos em diferentes versões do PHP (especialmente desenvolvedores de softwares livres ou de código aberto).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker&lt;/a&gt; é uma ferramenta construída em cima das funcionalidades de virtualização de nível de sistema operacional do Linux. Permite que aplicações sejam construídas e entregues como &lt;em&gt;containers&lt;/em&gt; (contêineres), o que pode significar que você pode usá-lo no seu &lt;em&gt;deployment pipeline&lt;/em&gt; para gerar um container Docker como seu binário entregável (se adotar Docker tanto para desenvolvimento como para produção) ou apenas usá-lo para propósitos de desenvolvimento como uma reposição ao Vagrant, por exemplo. Eu não vou me estender nesse assunto, leia o &lt;a href=&quot;https://docs.docker.com/userguide/&quot;&gt;Docker &lt;em&gt;User Guide&lt;/em&gt;&lt;/a&gt; e este parágrafo irá ficar muito mais claro, acredite!&lt;/p&gt;

&lt;h2 id=&quot;usando-a-imagem-docker&quot;&gt;Usando a imagem Docker&lt;/h2&gt;

&lt;p&gt;Agora que você está acostumado com o Docker e o instalou, usar a imagem PHP Development será bem simples. Na data de publicação desta, as seguintes versões do PHP estão disponíveis:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;5.6.3&lt;/li&gt;
  &lt;li&gt;5.5.19&lt;/li&gt;
  &lt;li&gt;5.4.35&lt;/li&gt;
  &lt;li&gt;5.3.29&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada versão do PHP vem com as extensões Zend OPCache e Xdebug instaladas e algumas ferramentas de QA para PHP estão instaladas globalmente com o Composer. A imagem também possui o Nginx e PHP-FPM instalados. &lt;a href=&quot;https://registry.hub.docker.com/u/eriksencosta/php-dev/&quot;&gt;Veja a página da imagem&lt;/a&gt; para uma lista completa das extensões e bibliotecas instaladas.&lt;/p&gt;

&lt;p&gt;Vamos iniciar um novo container. Primeiro, faça o download da imagem do Docker Hub:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ docker pull eriksencosta/php-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora, vamos criar uma aplicação “Hello World” muito simples:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ mkdir ~/hello-world; echo '&amp;lt;?php echo &quot;Hello world!&quot;;' &amp;gt; ~/hello-world/index.php
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Inicie o container:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ docker run -p 80:80 -v ~/hello-world:/var/www/hello-world -d &quot;eriksencosta/php-dev:latest&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Abra o endereço &lt;code&gt;http://localhost/hello-world/&lt;/code&gt; (se estiver usando o Boot2Docker, substitua &lt;code&gt;localhost&lt;/code&gt; com o endereço de IP retornado pelo comando &lt;code&gt;boot2docker ip&lt;/code&gt;) no seu navegador e se delicie com a sua incrível aplicação cumprimentando o mundo inteiro. Melhor que a ONU, dizem.&lt;/p&gt;

&lt;p&gt;Se você acessar o endereço &lt;code&gt;http://localhost/info.php&lt;/code&gt;, você verá a informação completa da versão do PHP em execução.&lt;/p&gt;

&lt;h2 id=&quot;trocando-entre-as-verses-do-php&quot;&gt;Trocando entre as versões do PHP&lt;/h2&gt;

&lt;p&gt;Para ver o valor real da imagem, você precisa trocar entre versões PHP. Pare o container atual em execução:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ docker stop $(docker ps -l | tail -1 | awk '{print $1}')
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E inicie um novo container em modo interativo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ docker run -t -i -p 80:80 -v ~/hello-world:/var/www/hello-world &quot;eriksencosta/php-dev:latest&quot; /bin/bash
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Você será atribuído a um terminal no container. Para trocar entre diferentes versões do PHP, use o comando &lt;code&gt;phpenv&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# phpenv versions
  5.3
  5.3.29
  5.4
  5.4.35
  5.5
  5.5.19
  5.6
* 5.6.3 (set by /opt/phpenv/version)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;5.6, 5.5, 5.4 e 5.3 são apenas atalhos. O phpenv permite que você defina as versões globais (pro sistema) e locais do PHP. Para determinar globalmente:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# phpenv global 5.4
# php -v
PHP 5.4.35 (cli) (built: Dec 14 2014 00:35:12)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
    with Xdebug v2.2.6, Copyright (c) 2002-2014, by Derick Rethans
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para determinar uma versão local, execute:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# cd /var/www/hello-world
# phpenv local 5.3
# php -v
PHP 5.3.29 (cli) (built: Dec 14 2014 00:24:19)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
    with Xdebug v2.2.6, Copyright (c) 2002-2014, by Derick Rethans
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para iniciar o Nginx e o PHP-FPM, execute:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# webserver start
Starting PHP-FPM (PHP version 5.3) server.
Starting Nginx server.
Done.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para desabilitar o Zend OPCache (é habilitado por padrão):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# opcache disable
The Zend OPCache (PHP version 5.3) was disabled.

You need to restart the webserver for the changes to take effect.
Execute: webserver restart
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;um-exemplo-da-vida-real&quot;&gt;Um exemplo da vida real&lt;/h2&gt;

&lt;p&gt;Não há nada de errado com a nossa aplicação &lt;em&gt;“Hello World”&lt;/em&gt; mas… ela não faz nada! Então vamos ver um exemplo melhor usando uma &lt;a href=&quot;https://github.com/eriksencosta/silex-docker-example&quot;&gt;aplicação Silex&lt;/a&gt; bem simples. Esta aplicação exemplo é um &lt;em&gt;issue tracker&lt;/em&gt; que apenas lista as &lt;em&gt;issues&lt;/em&gt; (que estão armazenadas em um banco de dados MySQL). Faça um clone do repositório da aplicação:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cd ~
$ git clone git://github.com/eriksencosta/silex-docker-example.git
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nossa aplicação precisa de um banco de dados MySQL. Mas nosso container PHP não vem com um servidor MySQL. O poder do Docker está no uso de imagens leves como blocos de construção. Então, ao invés de criar uma imagem com todas as dependências da aplicação, você inicia diferentes &lt;em&gt;containers&lt;/em&gt; Docker e os consome como &lt;a href=&quot;http://12factor.net/backing-services&quot;&gt;recursos anexados de rede&lt;/a&gt;. Com isto em mente, faça o download da imagem Docker do MySQL:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ docker pull mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Inicie o container MySQL:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -d mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Inicie o container PHP:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ docker run -t -i --link some-mysql:mysql -p 80:80 -v ~/silex-docker-example:/var/www/example -P &quot;eriksencosta/php-dev:latest&quot; /bin/bash
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Execute os comandos de preparação e configuração necessários:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# cd /var/www/example
# composer install
# php app/console example:configure:environment --variable=&quot;EXAMPLE_DEBUG=true&quot;
# php app/console example:database:create
# php app/console example:schema:create
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para verificar que tudo está funcionando, execute a suíte de testes:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# behat
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Carregue as &lt;em&gt;fixtures&lt;/em&gt; no banco de dados:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# php app/console example:fixtures:load --truncate
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Configure o virtual host Nginx e inicie os servidores:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# cp dockerfiles/php-dev/default.vhost /etc/nginx/sites-available/default
# webserver start
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;No seu navegador, acesse &lt;code&gt;http://localhost&lt;/code&gt;. Isso é tudo!&lt;/p&gt;

&lt;h2 id=&quot;concluindo&quot;&gt;Concluindo&lt;/h2&gt;

&lt;p&gt;Eu limitei o escopo deste post para apresentar a você a imagem Docker e não para explicar totalmente o que é o Docker e como usá-lo mas, espero que eu tenha despertado o interesse em você.&lt;/p&gt;

&lt;p&gt;Esta imagem Docker é voltada apenas para propósitos de desenvolvimento (não é para ser usada em produção!). A imagem é construída usando o &lt;a href=&quot;https://github.com/eriksencosta/ansible-php-dev&quot;&gt;playbook Ansible PHP Development&lt;/a&gt;. O Dockerfile também está no &lt;a href=&quot;https://github.com/eriksencosta/docker-php-dev&quot;&gt;GitHub&lt;/a&gt;. O README da &lt;a href=&quot;https://github.com/eriksencosta/ansible-php-dev&quot;&gt;aplicação de exemplo em Silex&lt;/a&gt; tem um exemplo de uso extra.&lt;/p&gt;

</description>
        <pubDate>Tue, 16 Dec 2014 11:30:00 -0200</pubDate>
        <link>https://blog.eriksen.com.br/pt-br/imagem-docker-desenvolvimento-php-multiversao</link>
        <guid isPermaLink="true">https://blog.eriksen.com.br/pt-br/imagem-docker-desenvolvimento-php-multiversao</guid>
        
        
      </item>
    
      
      <item>
        <title>Painel sobre Continuous Delivery da Electric Cloud - você está convidado!</title>
        <description>&lt;p&gt;&lt;em&gt;Atualização&lt;/em&gt; (17 de setembro): veja a &lt;a href=&quot;http://electric-cloud.com/blog/2014/09/continuous-discussion-online-panel/&quot;&gt;página oficial do evento&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;No dia 8 de outubro, eu irei participar em um painel on-line com experts em Agile, DevOps e Continuous Delivery. O painel é organizado pela &lt;a href=&quot;http://electric-cloud.com/powering-continuous-delivery/&quot;&gt;Electric Cloud&lt;/a&gt;, que tem feito grandes projetos de Continuous Delivery para organizações como SpaceX, Cisco, GE e E*TRADE.&lt;/p&gt;

&lt;p&gt;No painel, eu e os demais painelistas iremos discustir como entregar melhor software continuamente, quais são os obstáculos na adoção do Agile, o que DevOps significa e como é a jornada para chegar ao Continuous Delivery - passando por Continuous Integration e automação de deployment.&lt;/p&gt;

&lt;p&gt;A Electric Could também irá compartilhar a sua experiência implementando Continuous Delivery em grande escala, oferecendo vitórias rápidas que qualquer um pode implementar para acelerar a entrega de software. Será uma discussão espontânea de Continuous Delivery de como e em qual extensão podemos implementá-la.&lt;/p&gt;

&lt;p&gt;Eu tenho certeza que o painel será incrível. O pessoal na Electric Cloud está organizando esse evento como artesãos: com altos padrões para a qualidade da discussão. Os painelistas incluem experts com diferentes &lt;em&gt;backgrounds&lt;/em&gt; em diversas indústrias e de diferentes países.&lt;/p&gt;

&lt;p&gt;Assista e junte-se a nós no painel, e preencha a &lt;a href=&quot;http://electric-cloud.com/lp/software-delivery-community-survey/&quot;&gt;rápida pesquisa sobre o estado da entrega de software&lt;/a&gt; - nós iremos discutir os resultados durante o painel.&lt;/p&gt;

&lt;h2 id=&quot;quando&quot;&gt;Quando&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;8 de outubro, às 10 AM &lt;abbr title=&quot;Pacific Standard Time&quot;&gt;PST&lt;/abbr&gt; (2 PM no horário de Brasília, &lt;a href=&quot;http://www.worldtimebuddy.com/?qm=1&amp;amp;lid=8,3448439,2988507,1850147&amp;amp;h=8&amp;amp;date=2014-10-8&amp;amp;sln=10-11&quot;&gt;verifique o seu fuso horário&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://electric-cloud.com/lp/software-delivery-community-survey/&quot;&gt;Preencha a rápida pesquisa sobre o estado da entrega de software&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www4.gotomeeting.com/ojoin/804599135/300000000000438971&quot;&gt;Assista e junte-se a nós no painel&lt;/a&gt;: esse link irá começar a funcionar minutos antes do evento. Não é necessário se cadastrar. O evento irá acontecer on-line através do GoToMeeting - no seu navegador web. &lt;a href=&quot;http://support.citrixonline.com/en_US/GoToMeeting/help_files/GTM010003?Title=System+Requirements&quot;&gt;Verifique os requisitos de sistema do GoToMeeting&lt;/a&gt; (se for assistir usando um dispositivo móvel, instale o aplicativo &lt;a href=&quot;https://itunes.apple.com/us/app/gotomeeting/id424104128?mt=8&quot;&gt;iOS&lt;/a&gt; ou o aplicativo &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.citrixonline.android.gotomeeting&quot;&gt;Android&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- Abbreviations. --&gt;

&lt;!-- References. --&gt;

&lt;!-- Not used references. --&gt;

</description>
        <pubDate>Tue, 09 Sep 2014 09:35:00 -0300</pubDate>
        <link>https://blog.eriksen.com.br/pt-br/painel-electric-cloud-continuous-delivery</link>
        <guid isPermaLink="true">https://blog.eriksen.com.br/pt-br/painel-electric-cloud-continuous-delivery</guid>
        
        
      </item>
    
      
      <item>
        <title>Como instalar o RabbitMQ com a última versão do Erlang no Debian</title>
        <description>&lt;p&gt;O RabbitMQ é uma aplicação Erlang. A linguagem evolui rapidamente e cada &lt;a href=&quot;http://www.erlang.org/download/otp_src_R16B.readme&quot;&gt;nova versão&lt;/a&gt; tem &lt;a href=&quot;http://www.infoq.com/news/2013/03/erlangR16B_released&quot;&gt;otimizações de performance&lt;/a&gt;. Isto é bom até que você tenta instalar o &lt;a href=&quot;http://www.rabbitmq.com/install-debian.html&quot;&gt;pacote DEB do RabbitMQ&lt;/a&gt; no seu servidor Debian-like e nota que o gerenciador de pacote instalou uma versão antiga do Erlang.&lt;/p&gt;

&lt;p&gt;Para o Debian Squeeze, o pacote &lt;a href=&quot;http://packages.debian.org/squeeze/erlang-nox&quot;&gt;erlang-nox&lt;/a&gt; vem com o &lt;a href=&quot;http://www.erlang.org/download/otp_src_R14A.readme&quot;&gt;Erlang R14A&lt;/a&gt; (lançado em junho de 2010). O &lt;a href=&quot;http://packages.debian.org/squeeze-backports/erlang-nox&quot;&gt;pacote backports&lt;/a&gt; vem com o &lt;a href=&quot;http://www.erlang.org/download/otp_src_R15B01.readme&quot;&gt;Erlang R15B01&lt;/a&gt; (lançado em abril de 2012). Para o Ubuntu LTS atual (Precise), &lt;a href=&quot;http://packages.ubuntu.com/precise/erlang-nox&quot;&gt;erlang-nox&lt;/a&gt; vem com o &lt;a href=&quot;http://www.erlang.org/download/otp_src_R14B04.readme&quot;&gt;Erlang R14B04&lt;/a&gt; (lançado em outubro de 2011) enquanto que o último &lt;a href=&quot;http://packages.ubuntu.com/raring/erlang-nox&quot;&gt;pacote do Raring&lt;/a&gt; - assim como o pacote do backports do Debian Squeeze - vem com o Erlang R15B01.&lt;/p&gt;

&lt;p&gt;Esse post mostra como compilar a última versão do Erlang (R16B) no Debian Squeeze e como satisfazer a dependência erlang-nox do &lt;a href=&quot;http://www.rabbitmq.com/install-debian.html&quot;&gt;pacote DEB RabbitMQ&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;compilando-o-erlang&quot;&gt;Compilando o Erlang&lt;/h2&gt;

&lt;p&gt;O processo de compilação é muito simples, nós iremos basicamente seguir os passos disponíveis na &lt;a href=&quot;http://www.erlang.org/doc/installation_guide/INSTALL.html&quot;&gt;documentação oficial do Erlang&lt;/a&gt;. Primeiro, instale algumas de suas dependências:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo aptitude install -y build-essential libssl-dev ncurses-dev m4
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Explicando as dependências:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://packages.debian.org/squeeze/build-essential&quot;&gt;build-essential&lt;/a&gt;: lista de pacotes considerados essenciais para criar pacotes Debian. Alguns desses pacotes são necessários para compilar o Erlang, como o gcc e make&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://packages.debian.org/squeeze/libssl-dev&quot;&gt;libssl-dev&lt;/a&gt;: necessários para suporte SSL&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://packages.debian.org/squeeze/ncurses-dev&quot;&gt;ncurses-dev&lt;/a&gt;: para melhor suporte no terminal&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://packages.debian.org/squeeze/m4&quot;&gt;m4&lt;/a&gt;: necessário para compilar com suporte HiPE (&lt;em&gt;High Performance Erlang&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Faça o download e compile o Erlang:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo mkdir -p /opt/src/erlang /opt/erlang
$ cd /opt/src/erlang
$ sudo curl -O http://www.erlang.org/download/otp_src_R16B.tar.gz
$ sudo tar xzvf otp_src_R16B.tar.gz
$ sudo mv otp_src_R16B r16b
$ cd r16b
$ sudo ./configure --prefix=/opt/erlang/r16b --enable-hipe --with-ssl
$ sudo make
$ sudo make install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Finalmente, crie os links simbólicos dos binários Erlang (se você não quiser usar links simbólicos, você pode executar &lt;code&gt;configure&lt;/code&gt; com a opção &lt;code&gt;--bindir=/usr/bin&lt;/code&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo ln -s /opt/erlang/r16b/bin/dialyzer /usr/bin
$ sudo ln -s /opt/erlang/r16b/bin/epmd /usr/bin
$ sudo ln -s /opt/erlang/r16b/bin/erl /usr/bin
$ sudo ln -s /opt/erlang/r16b/bin/erlc /usr/bin
$ sudo ln -s /opt/erlang/r16b/bin/run_erl /usr/bin
$ sudo ln -s /opt/erlang/r16b/bin/run_test /usr/bin
$ sudo ln -s /opt/erlang/r16b/bin/typer /usr/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;instalando-o-rabbitmq&quot;&gt;Instalando o RabbitMQ&lt;/h2&gt;

&lt;p&gt;Faça o download do pacote DEB do RabbitMQ disponível no site do projeto:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cd /tmp &amp;amp;&amp;amp; curl -O http://www.rabbitmq.com/releases/rabbitmq-server/v3.1.0/rabbitmq-server_3.1.0-1_all.deb
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Como já discutimos, este pacote depende do pacote erlang-nox:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ dpkg -I rabbitmq-server_3.1.0-1_all.deb
 Package: rabbitmq-server
 Version: 3.1.0-1
 Architecture: all
 Maintainer: RabbitMQ Team &amp;lt;packaging@rabbitmq.com&amp;gt;
 Installed-Size: 4460
 Depends: erlang-nox (&amp;gt;= 1:12.b.3) | esl-erlang, adduser, logrotate
 Section: net
 Priority: extra
 Homepage: http://www.rabbitmq.com/
 Description: AMQP server written in Erlang
  RabbitMQ is an implementation of AMQP, the emerging standard for high
  performance enterprise messaging. The RabbitMQ server is a robust and
  scalable implementation of an AMQP broker.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Se você tentar instalar o pacote usando o aptitude, o gerenciador de pacote irá instalar uma versão antiga do Erlang. A forma mais fácil de prevenir isso é usando o dpkg com a opção &lt;code&gt;--ignore-depends&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo dpkg -i --ignore-depends=erlang-nox
(Reading database ... 42128 files and directories currently installed.)
Preparing to replace rabbitmq-server 3.1.0-1 (using rabbitmq-server_3.1.0-1_all.deb) ...
Unpacking replacement rabbitmq-server ...
Setting up rabbitmq-server (3.1.0-1) ...
Adding group `rabbitmq' (GID 107) ...
Done.
Adding system user `rabbitmq' (UID 105) ...
Adding new user `rabbitmq' (UID 105) with group `rabbitmq' ...
Not creating home directory `/var/lib/rabbitmq'.
Starting message broker: rabbitmq-server.
Processing triggers for man-db ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Você pode verificar que o RabbitMQ está executando com o comando &lt;code&gt;rabbitmqctl&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo rabbitmqctl status
Status of node rabbit@squeeze64 ...
[{pid,1776},
 {running_applications,[{rabbit,&quot;RabbitMQ&quot;,&quot;3.1.0&quot;},
                        {mnesia,&quot;MNESIA  CXC 138 12&quot;,&quot;4.8&quot;},
                        {os_mon,&quot;CPO  CXC 138 46&quot;,&quot;2.2.11&quot;},
                        {xmerl,&quot;XML parser&quot;,&quot;1.3.3&quot;},
                        {sasl,&quot;SASL  CXC 138 11&quot;,&quot;2.3.1&quot;},
                        {stdlib,&quot;ERTS  CXC 138 10&quot;,&quot;1.19.1&quot;},
                        {kernel,&quot;ERTS  CXC 138 10&quot;,&quot;2.16.1&quot;}]},
...
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;resolvendo-a-dependncia&quot;&gt;Resolvendo a dependência&lt;/h2&gt;

&lt;p&gt;O que fizemos quando instalamos o RabbitMQ foi simplesmente pedir para o dpkg ignorar a dependência durante o processo de instalação. O problema é que para o gerenciador de pacote, a dependência não foi satisfeita. Se você tentar instalar ou atualizar um pacote, o gerenciador de pacote irá sugerir a remoção do pacote &lt;code&gt;rabbitmq-server&lt;/code&gt; por causa de sua dependência não satisfeita:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo aptitude install tree
The following NEW packages will be installed:
  tree
0 packages upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 32.4 kB of archives. After unpacking 98.3 kB will be used.
The following packages have unmet dependencies:
  rabbitmq-server: Depends: erlang-nox (&amp;gt;= 1:12.b.3) but it is not going to be installed. or
                            esl-erlang which is a virtual package.
The following actions will resolve these dependencies:

     Remove the following packages:
1)     rabbitmq-server

Accept this solution? [Y/n/q/?]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Se você não aceitar a solução, o aptitude irá sugerir a instalação de um monte de pacotes Erlang. Isto não é o que queremos, nós queremos ter o RabbitMQ instalado com a versão do Erlang que compilamos. Para resolver esta dependência, nós iremos criar um pacote “falso” usando equivs. Da &lt;a href=&quot;http://www.linuxcertif.com/man/1/equivs-build/&quot;&gt;documentação do equivs-build&lt;/a&gt;: &lt;em&gt;“equivs-build é um programa que cria pacotes Debian aos quais podem ser usados para informar para o dpkg sobre pacotes instalados localmente e de suas dependências. Pacotes vazios que apenas requerem outros pacotes também podem ser criados com equivs. Estes podem ser usados como pacotes “perfis” aos quais apenas marcam outros pacotes para instalação”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Antes de instalar o equivs, desinstale o RabbitMQ:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo aptitude purge -y rabbitmq-server
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Então instale o equivs:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo aptitude install -y equivs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Crie um arquivo com o seguinte conteúdo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Section: interpreters
Priority: optional
Standards-Version: 3.6.2

Package: erlang-nox
Version: 1:12.b.3
Maintainer: The Maintainer &amp;lt;maintainer@example.com&amp;gt;
Description: Dummy Erlang package.
  This package provides a dummy package for erlang-nox, a dependency of the rabbitmq-server package.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ou apenas copie e cole os seguintes comandos:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ erlang_nox=&quot;Section: interpreters
Priority: optional
Standards-Version: 3.6.2

Package: erlang-nox
Version: 1:12.b.3
Maintainer: The Maintainer &amp;lt;maintainer@example.com&amp;gt;
Description: Dummy Erlang package.
  This package provides a dummy package for erlang-nox, a dependency of rabbitmq-server package from RabbitMQ.&quot;
$ IFS='%'; echo $erlang_nox &amp;gt; erlang-nox; unset IFS
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Então execute o comando &lt;code&gt;equivs-build&lt;/code&gt; para criar o pacote DEB:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ equivs-build erlang-nox
...
dpkg-deb: building package `erlang-nox' in `../erlang-nox_12.b.3_all.deb'.

The package has been created.
Attention, the package has been created in the current directory,
not in &quot;..&quot; as indicated by the message above!
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora, instale o pacote DEB recém-criado e o pacote DEB do RabbitMQ:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo dpkg -i erlang-nox_12.b.3_all.deb rabbitmq-server_3.1.0-1_all.deb
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Você pode verificar que o pacote “falso” foi instalado:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ aptitude show erlang-nox
Package: erlang-nox
State: installed
Automatically installed: no
Version: 1:12.b.3
Priority: optional
Section: interpreters
Maintainer: The Maintainer &amp;lt;maintainer@example.com&amp;gt;
Uncompressed Size: 36.9 k
Description: Dummy Erlang package.
 This package provides a dummy package for erlang-nox, a dependency of rabbitmq-server package from RabbitMQ.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora você não precisa mais se preocupar com o aptitude reclamando sobre a dependência não satisfeita do pacote &lt;code&gt;rabbitmq-server&lt;/code&gt;. Ao menos não quando for tentar instalar novos pacotes. Espere…&lt;/p&gt;

&lt;h2 id=&quot;marcando-o-pacote-como-mantido-held&quot;&gt;Marcando o pacote como mantido (&lt;em&gt;held&lt;/em&gt;)&lt;/h2&gt;

&lt;p&gt;Tudo bem até que você tenta atualizar os pacotes do seu sistema e se depara com algo assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo aptitude safe-upgrade
Resolving dependencies...
The following NEW packages will be installed:
  erlang-asn1{a} erlang-base{a} erlang-corba{a} erlang-crypto{a} erlang-docbuilder{a} erlang-edoc{a} erlang-erl-docgen{a} erlang-eunit{a}
  erlang-ic{a} erlang-inets{a} erlang-inviso{a} erlang-mnesia{a} erlang-odbc{a} erlang-os-mon{a} erlang-parsetools{a} erlang-percept{a}
  erlang-public-key{a} erlang-runtime-tools{a} erlang-snmp{a} erlang-ssh{a} erlang-ssl{a} erlang-syntax-tools{a} erlang-tools{a} erlang-webtool{a}
  erlang-xmerl{a} libltdl7{a} libsctp1{a} lksctp-tools{a} odbcinst{a} odbcinst1debian2{a} unixodbc{a}
The following packages will be upgraded:
  erlang-nox
1 packages upgraded, 31 newly installed, 0 to remove and 0 not upgraded.
Need to get 20.8 MB of archives. After unpacking 36.5 MB will be used.
Do you want to continue? [Y/n/?]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Veja o arquivo &lt;code&gt;erlang-nox&lt;/code&gt; que criamos anteriormente. Ele declara a versão como &lt;code&gt;1:12.b.3&lt;/code&gt; enquanto a versão do pacote &lt;a href=&quot;http://packages.debian.org/squeeze/erlang-nox&quot;&gt;erlang-nox&lt;/a&gt; do Debian Squeeze é a &lt;code&gt;1:14.a-dfsg-3squeeze1&lt;/code&gt;. Se nós criássemos o pacote “falso” declarando uma versão mais recente, nós teríamos o mesmo problema se uma nova versão fosse lançada.&lt;/p&gt;

&lt;p&gt;Para resolver isto, apenas marque o pacote como mantido com o aptitude:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo aptitude hold erlang-nox
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;aptitude show&lt;/code&gt; irá mostrar o pacote como instalado e mantido:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ aptitude show erlang-nox
Package: erlang-nox
State: installed [held]
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora você está livre das restrições de pacotes e usar a versão desejada do Erlang para executar não apenas o RabbitMQ mas qualquer aplicação Erlang!&lt;/p&gt;

&lt;!-- Links --&gt;

</description>
        <pubDate>Mon, 06 May 2013 07:00:00 -0300</pubDate>
        <link>https://blog.eriksen.com.br/pt-br/instalar-rabbitmq-com-ultima-versao-erlang-no-debian</link>
        <guid isPermaLink="true">https://blog.eriksen.com.br/pt-br/instalar-rabbitmq-com-ultima-versao-erlang-no-debian</guid>
        
        
      </item>
    
      
      <item>
        <title>Curso Desbravando o Symfony2 na PHP Conference Brasil 2012</title>
        <description>&lt;p&gt;No próximo dia 29 de novembro (quinta-feira) estarei na &lt;a href=&quot;http://www.phpconf.com.br&quot;&gt;PHP Conference Brasil&lt;/a&gt; ministrando &lt;a href=&quot;http://www.phpconf.com.br/handson/symfony&quot;&gt;um curso&lt;/a&gt; sobre &lt;a href=&quot;http://symfony.com&quot;&gt;Symfony2&lt;/a&gt;. O curso tem um conteúdo básico para habilitar os alunos a desenvolverem aplicações básicas usando o framework e ter o conhecimento para descobrir as melhores bibliotecas desenvolvidas pela comunidade Symfony para tornar o trabalho de desenvolvimento mais produtivo e prazeroso.&lt;/p&gt;

&lt;p&gt;Apesar de básico, o curso detalha bastante os conceitos do framework conforme destacados na grade:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Conhecendo o framework
    &lt;ul&gt;
      &lt;li&gt;Arquitetura&lt;/li&gt;
      &lt;li&gt;Componentes&lt;/li&gt;
      &lt;li&gt;Bundles&lt;/li&gt;
      &lt;li&gt;Distribuições&lt;/li&gt;
      &lt;li&gt;Instalação&lt;/li&gt;
      &lt;li&gt;Criando o primeiro bundle&lt;/li&gt;
      &lt;li&gt;Criando a primeira página&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Criando rotas e manipulando dados da requisição
    &lt;ul&gt;
      &lt;li&gt;Definindo uma classe Controller&lt;/li&gt;
      &lt;li&gt;Mapeamento de controllers e rotas&lt;/li&gt;
      &lt;li&gt;Acessando dados da requisição (&lt;code&gt;$_GET&lt;/code&gt;, &lt;code&gt;$_POST&lt;/code&gt;, &lt;code&gt;$_COOKIE&lt;/code&gt;)&lt;/li&gt;
      &lt;li&gt;Acessando e gravando dados de sessão (&lt;code&gt;$_SESSION&lt;/code&gt;)&lt;/li&gt;
      &lt;li&gt;Redirecionamento de página&lt;/li&gt;
      &lt;li&gt;Encaminhamento de ações&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Configuração
    &lt;ul&gt;
      &lt;li&gt;Os formatos XML, YAML e PHP&lt;/li&gt;
      &lt;li&gt;Configuração global da aplicação&lt;/li&gt;
      &lt;li&gt;Sobrescrevendo a configuração global via bundles&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Formulários
    &lt;ul&gt;
      &lt;li&gt;Formulários básicos&lt;/li&gt;
      &lt;li&gt;Criando tipos de formulário customizados&lt;/li&gt;
      &lt;li&gt;Validação&lt;/li&gt;
      &lt;li&gt;Boas práticas para o processamento de formulários&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Persistência
    &lt;ul&gt;
      &lt;li&gt;Usando o ORM Doctrine2&lt;/li&gt;
      &lt;li&gt;Mapeando uma entidade&lt;/li&gt;
      &lt;li&gt;Recuperando e persistindo uma entidade de formulário&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;O container de serviços (DependencyInjection)
    &lt;ul&gt;
      &lt;li&gt;Criando um serviço&lt;/li&gt;
      &lt;li&gt;Consumindo um serviço&lt;/li&gt;
      &lt;li&gt;Definindo dependências entre serviços&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As inscrições vão até o dia 23/11 (&lt;a href=&quot;http://www.phpconf.com.br/registration&quot;&gt;veja valores e outras informações&lt;/a&gt;). Caso o curso de Symfony não lhe interesse, recomendo os cursos de &lt;a href=&quot;http://www.phpconf.com.br/handson/mongodb&quot;&gt;MongoDB&lt;/a&gt; (do Jean “Suíssa” Carlo) e de &lt;a href=&quot;http://www.phpconf.com.br/handson/rest&quot;&gt;Webservices RESTful&lt;/a&gt; (do Alex Piaz).&lt;/p&gt;

</description>
        <pubDate>Mon, 19 Nov 2012 06:30:00 -0200</pubDate>
        <link>https://blog.eriksen.com.br/pt-br/curso-desbravando-symfony2-php-conference-brasil-2012</link>
        <guid isPermaLink="true">https://blog.eriksen.com.br/pt-br/curso-desbravando-symfony2-php-conference-brasil-2012</guid>
        
        
      </item>
    
      
      <item>
        <title>Criando boxes Vagrant customizados com o Veewee</title>
        <description>&lt;p&gt;Eu já falei um pouco sobre o &lt;a href=&quot;/pt-br/fuja-user-space-usando-vagrant-configurar-ambientes-desenvolvimento&quot;&gt;Vagrant&lt;/a&gt; e sobre a filosofia &lt;a href=&quot;/pt-br/devops-colocando-ponte-entre-desenvolvimento-operacoes&quot;&gt;DevOps&lt;/a&gt;. No post sobre Vagrant mostrei como usar um &lt;em&gt;box&lt;/em&gt; Ubuntu publicamente disponível e quão fácil é usar um provisionador shell para configurar um &lt;em&gt;box&lt;/em&gt; &lt;abbr title=&quot;Linux, Apache, MySQL and PHP/Perl or Python.&quot;&gt;LAMP&lt;/abbr&gt; básico.&lt;/p&gt;

&lt;p&gt;Então eu disse que existem &lt;em&gt;boxes&lt;/em&gt; publicamente disponíveis mas omiti o site &lt;a href=&quot;http://www.vagrantbox.es&quot;&gt;Vagrant boxes&lt;/a&gt;. Por que da omissão? Simplesmente eu não os acho tão úteis e acho que as desvantagens superam os benefícios. Pegar um &lt;em&gt;box&lt;/em&gt; que você não sabe como foi coonfigurado por levar a sérios problemas de segurança. E se o &lt;em&gt;box&lt;/em&gt; é apenas uma instalação básica, é quase sem real utilidade já que você precisará fazer o provisionamento da sua configuração desejada a cada vez que iniciar uma &lt;abbr title=&quot;Virtual machine&quot;&gt;VM&lt;/abbr&gt; baseada no &lt;em&gt;box&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;E por que não criar um &lt;em&gt;box&lt;/em&gt; base? Veewee ao resgate!&lt;/p&gt;

&lt;h2 id=&quot;veewee&quot;&gt;Veewee&lt;/h2&gt;

&lt;p&gt;O &lt;a href=&quot;https://github.com/jedi4ever/veewee&quot;&gt;Veewee&lt;/a&gt; é uma ferramenta para criar &lt;em&gt;boxes&lt;/em&gt; Vagrant e imagens &lt;abbr title=&quot;Kernel-based Virtual Machine&quot;&gt;KVM&lt;/abbr&gt;, VirtualBox e Fusion facilmente. Mãos a obra, vamos abrir um terminal. Você precisará ter o &lt;a href=&quot;http://rubygems.org/pages/download&quot;&gt;RubyGems instalado&lt;/a&gt; na sua máquina para instalar o Veewee. Leia o post sobre o &lt;a href=&quot;/pt-br/fuja-user-space-usando-vagrant-configurar-ambientes-desenvolvimento#instalacao&quot;&gt;Vagrant&lt;/a&gt; para ver como instalá-lo. Vamos instalar a última versão alpha disponível (observação: os seguintes comandos foram testados em um velho e bom MacOS X Leopard).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo gem install veewee --pre
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Veewee vem com muitos templates de sistemas operations que você pode usar para criar seu &lt;em&gt;box&lt;/em&gt; base Vagrant ou imagem de &lt;abbr title=&quot;Virtual machine&quot;&gt;VM&lt;/abbr&gt; (e é por isso que usamos a última versão alpha já que contém templates atualizados para os principais sistemas operacionais). Você pode listar os templates disponíveis usando o seguinte comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant basebox templates | sort
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Existem templates para distros Linux populares (Debian, Ubuntu, CentOS, Scientific Linux), alguns sabores Unix (Solaris, FreeBSD) e até mesmo a &lt;em&gt;preview release&lt;/em&gt; 8 do Windows. Vamos criar um &lt;em&gt;box&lt;/em&gt; Debian. Primeiro, vamos definir o nosso &lt;em&gt;box&lt;/em&gt; base com o nome ‘squeeze64-lamp’ usando o Debian 6.0.4 AMD64.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ mkdir -p ~/Dev/veewee/squeeze/amd64
$ cd ~/Dev/veewee/squeeze/amd64
$ vagrant basebox define squeeze64-lamp Debian-6.0.4-amd64-netboot
[vagrant] The basebox 'squeeze64-lamp' has been succesfully created from the template 'Debian-6.0.4-amd64-netboot'
[vagrant] You can now edit the definition files stored in definitions/squeeze64-lamp or build the box with:
[vagrant] vagrant basebox build 'squeeze64-lamp'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nós podemos ver alguns arquivos no diretório &lt;code&gt;definitions/squeeze64-lamp&lt;/code&gt; que são usados para instalar o software necessário para um &lt;em&gt;box&lt;/em&gt; base Vagrant:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ls definitions/squeeze64-lamp/
base.sh       cleanup-virtualbox.sh definition.rb      puppet.sh       vagrant.sh        zerodisk.sh
chef.sh       cleanup.sh            preseed.cfg        ruby.sh         virtualbox.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;O principal arquivo aqui é o &lt;code&gt;definition.rb&lt;/code&gt;. Ele tem um hash com algumas definições da &lt;abbr title=&quot;Virtual machine&quot;&gt;VM&lt;/abbr&gt; VirtualBox (como o número de CPUs e tamanhos de memória e disco), definições de boot e do Kickstart - que são usadas para automatizar a instalação do sistema operacional - e os arquivos de pós-instalação. Vamos configurar o mesmo &lt;em&gt;box&lt;/em&gt; &lt;abbr title=&quot;Linux, Apache, MySQL and PHP/Perl or Python.&quot;&gt;LAMP&lt;/abbr&gt; do post &lt;a href=&quot;/pt-br/fuja-user-space-usando-vagrant-configurar-ambientes-desenvolvimento#provionamento-lamp&quot;&gt;sobre Vagrant&lt;/a&gt;. Faça o download ou clone o repositório Git &lt;a href=&quot;https://github.com/eriksencosta/vagrant-shell-scripts&quot;&gt;vagrant-shell-scripts&lt;/a&gt; e altere os arquivos de pós-instalação em &lt;code&gt;definitions.rb&lt;/code&gt; usando o seguinte trecho:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;ss&quot;&gt;:postinstall_files&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;base.sh&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;vagrant.sh&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;virtualbox.sh&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;ruby.sh&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;puppet.sh&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;chef.sh&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;dotdeb.sh&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;db-mysql.sh&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;dev-tools.sh&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;php5.sh&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;php5-qa.sh&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;php5-tools.sh&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;drush.sh&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;cleanup-virtualbox.sh&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;cleanup.sh&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;zerodisk.sh&amp;quot;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Dica:&lt;/strong&gt; coloque seus arquivos de pós-instalação após o arquivo &lt;code&gt;base.sh&lt;/code&gt; e antes do arquivo &lt;code&gt;cleanup.sh&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Com tudo no lugar, cria seu &lt;em&gt;box&lt;/em&gt;! Isto pode levar algum tempo já que será feito o download do Virtual Box Guest Additions e da imagem ISO do sistema operacional (mas apenas para a primeira vez).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant basebox build squeeze64-lamp
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Após criar o &lt;em&gt;box&lt;/em&gt;, valide-o:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant basebox validate squeeze64-lamp
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Com os testes ok, exporte seu &lt;em&gt;box&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant basebox export squeeze64-lamp
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora você tem um &lt;em&gt;box&lt;/em&gt; base Vagrant customizado ao qual pode distribuir para o seu time de TI. Apenas adicione-o no Vagrant e comece a usá-lo!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant box add squeeze64-lamp squeeze64-lamp.box
$ vagrant init squeeze64-lamp
$ vagrant up
$ vagrant ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;!-- ABBR. --&gt;

&lt;!-- Links refs. --&gt;

</description>
        <pubDate>Wed, 20 Jun 2012 08:50:00 -0300</pubDate>
        <link>https://blog.eriksen.com.br/pt-br/criando-boxes-vagrant-customizados-com-veewee</link>
        <guid isPermaLink="true">https://blog.eriksen.com.br/pt-br/criando-boxes-vagrant-customizados-com-veewee</guid>
        
        
      </item>
    
      
      <item>
        <title>Fuja do user space: usando Vagrant para configurar ambientes de desenvolvimento</title>
        <description>&lt;amp-img src=&quot;/assets/images/posts/runner.jpg&quot; width=&quot;610&quot; height=&quot;412&quot; layout=&quot;responsive&quot; title=&quot;A Brand New Day, por Thomas Hawk&quot; alt=&quot;Foto de uma mulher correndo&quot;&gt;&lt;/amp-img&gt;

&lt;noscript&gt;
  &lt;img src=&quot;/assets/images/posts/runner.jpg&quot; title=&quot;A Brand New Day, por Thomas Hawk&quot; alt=&quot;Foto de uma mulher correndo&quot; /&gt;
&lt;/noscript&gt;

&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.flickr.com/photos/thomashawk/287666827/in/photostream/&quot;&gt;A Brand New Day&lt;/a&gt;, por Thomas Hawk.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;No post &lt;a href=&quot;/pt-br/devops-colocando-ponte-entre-desenvolvimento-operacoes&quot;&gt;sobre DevOps&lt;/a&gt;, eu disse que o Vagrant é uma ferramenta útil que facilita a criação e configuração de ambientes virtualizados e faz com que a frase “funciona na minha máquina” seja uma desculpa do passado. Certamente o Vagrant é uma ferramenta que auxilia as equipes DevOps a assegurarem coerência nos ambientes. Mas você não precisa praticar DevOps para desfrutar dos benefícios.&lt;/p&gt;

&lt;p&gt;Você sabe, como desenvolvedor, que é difícil manter seu ambiente de desenvolvimento atualizado quando se alterna entre diferentes projetos. Até mesmo ferramentas como &lt;a href=&quot;https://github.com/sstephenson/rbenv&quot;&gt;rbenv&lt;/a&gt; e &lt;a href=&quot;https://github.com/humanshell/phpenv&quot;&gt;phpenv&lt;/a&gt; (que ajudam na coexistência de diferentes versões da mesma linguagem de programação em uma mesma máquina), ainda temos problemas quando precisamos usar versões diferentes de bancos de dados, servidores de aplicações e outros softwares que compõem a pilha de dependência dos diferentes projetos.&lt;/p&gt;

&lt;p&gt;Então você começa a compilar diferentes versões de bancos de dados, criando scripts para iniciar/parar serviços de acordo com um projeto mas, com o passar do tempo, você termina com um ambiente tão bagunçado que a manutenção torna-se um pesadelo.&lt;/p&gt;

&lt;p&gt;Outro problema é que você começa a sentir o &lt;em&gt;user space&lt;/em&gt; cada vez menos responsivo com o passar do tempo. O &lt;em&gt;startup&lt;/em&gt; da sua máquina fica mais lento, especialmente quando você tem um monte de software instalado como serviço. Se estiver usando um notebook na bateria, ela pode ser descarregada mais rapidamente.&lt;/p&gt;

&lt;p&gt;Então você desenvolve usando Mac ou Windows. Aquele novo e impressionante projeto &lt;em&gt;open source&lt;/em&gt;? Às vezes ele não tem (um bom) suporte. Quando se tem (usando ferramentas como MacPorts, Homebrew ou Cygwin) às vezes você ficar com uma versão mais antiga de um pacote.&lt;/p&gt;

&lt;p&gt;Eu mesmo tive problemas como esses. Eu tenho um Mac. Nos últimos anos eu trabalhei em diversos projetos baseados em PHP e tive um monte de problemas para compilar o PHP com extensões que precisam de bibliotecas como PDFlib, &lt;abbr title=&quot;International Components for Unicode&quot;&gt;ICU&lt;/abbr&gt; e libxml. Há um ano, eu decidi ajudar no desenvolvimento do framework Symfony2, especificamente no componente &lt;a href=&quot;https://github.com/symfony/Locale&quot;&gt;Locale&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O componente Locale do Symfony2 depende do &lt;abbr title=&quot;International Components for Unicode&quot;&gt;ICU&lt;/abbr&gt;, uma vez que usa as classes da ext/intl do PHP. Mas Fabien Potencier e os desenvolvedores do &lt;em&gt;core&lt;/em&gt; do Symfony haviam decidido que o framework não deveria depender de funcionalidades não-&lt;em&gt;core&lt;/em&gt; do PHP para funcionar. Então, precisávamos desenvolver uma maneira de imitar os comportamentos ​das classes ext/intl em código &lt;em&gt;user land&lt;/em&gt;. Então &lt;a href=&quot;http://wiedler.ch/igor/&quot;&gt;Igor Wiedler&lt;/a&gt; e eu decidimos na hora em criar os testes comparando os resultados de nossa implementação contra a implementação ext/intl.&lt;/p&gt;

&lt;p&gt;Então eu precisava instalar algumas versões diferentes do PHP e do &lt;abbr title=&quot;International Components for Unicode&quot;&gt;ICU&lt;/abbr&gt; para encontrar qual a versão mínima que iríamos nos basear para codificar nossa implementação (nós nos baseamos na versão 4.2). Eu não queria compilar todos os softwares na minha máquina (um Macbook com o velho, mas bom MacOS X Leopard). Eu estava pensando em voltar a usar alguma distro baseada em Debian como desktop.&lt;/p&gt;

&lt;p&gt;Nada bate uma distribuição Linux (e seus vários gerenciadores de pacotes) quando se trata de usar projetos &lt;em&gt;open source&lt;/em&gt; para desenvolvimento de software. Mas eu ainda preferia usar o Mac como ambiente &lt;em&gt;desktop&lt;/em&gt;. Na época, eu já estava usando o VirtualBox para desenvolvimento e, então, eu descobri o Vagrant, que tornou minha vida muito mais fácil. Desde então, eu crio um ambiente virtualizado para cada projeto. Este post mostra a maneira que eu pessoalmente uso o Vagrant.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Talk is cheap&lt;/em&gt;. Vamos para a diversão!&lt;/p&gt;

&lt;p&gt;&lt;a name=&quot;instalacao&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;instalao-e-comandos-bsicos&quot;&gt;Instalação e comandos básicos&lt;/h2&gt;

&lt;p&gt;Como o Vagrant cria máquinas virtuais VirtualBox, você obviamente irá precisar &lt;a href=&quot;https://www.virtualbox.org/wiki/Downloads&quot;&gt;dele instalado&lt;/a&gt; (versão 4.0.x ou 4.1.x). &lt;a href=&quot;http://downloads.vagrantup.com/&quot;&gt;Faça o download da versão mais recente do Vagrant&lt;/a&gt;, que tem instaladores para Windows e MacOS X e pacotes para Debian, RedHat e Arch Linux. Ou você pode instalá-lo usando &lt;a href=&quot;http://rubygems.org/pages/download&quot;&gt;Rubygems&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo gem install vagrant
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Com o Vagrant instalado, você terá que adicionar um &lt;em&gt;box&lt;/em&gt;. Um &lt;em&gt;box&lt;/em&gt; é um pacote &lt;em&gt;tar&lt;/em&gt;, que contém uma imagem de máquina virtual base. Comece adicionando um dos &lt;em&gt;boxes&lt;/em&gt; oficiais do Vagrant:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant box add lucid32 http://files.vagrantup.com/lucid32.box
$ vagrant box add lucid64 http://files.vagrantup.com/lucid64.box
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ao executar um dos comandos acima, o &lt;em&gt;box&lt;/em&gt; escolhido será baixado do site do projeto Vagrant. O primeiro argumento do comando &lt;code&gt;vagrant box add&lt;/code&gt; é o nome do &lt;em&gt;box&lt;/em&gt; em seu ambiente Vagrant. Você vai usá-lo para especificar qual &lt;em&gt;box&lt;/em&gt; que você deseja usar ao criar um ambiente virtualizado. Você pode listar os &lt;em&gt;boxes&lt;/em&gt; disponíveis no seu ambiente Vagrant com o comando &lt;code&gt;vagrant box list&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant box list
lucid32
lucid64
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Após terminar o download, crie o seu primeiro ambiente virtualizado usando Vagrant:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant init lucid32
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vamos discutir o arquivo Vagrantfile no próximo tópico. Como a mensagem acima diz, basta executar o comando &lt;code&gt;vagrant up&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant up
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Em seguida, faça o &lt;em&gt;login&lt;/em&gt; na &lt;abbr title=&quot;Virtual machine (Máquina Virtual)&quot;&gt;VM&lt;/abbr&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant ssh
vagrant@lucid32:~$
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;O Vagrant automaticamente configura uma pasta VirtualBox compartilhada no caminho &lt;code&gt;/vagrant&lt;/code&gt; para o diretório do Vagrantfile:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;vagrant@lucid32:~$ ls /vagrant/
Vagrantfile
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Depois que parar de usar o ambiente virtualizado, você pode suspendê-lo (pausá-lo) ou pará-lo (desligá-lo). Primeiro, faça o &lt;em&gt;log off&lt;/em&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;vagrant@lucid32:~$ exit
$ vagrant status
Current VM states:

default                  running

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Então execute o comando &lt;code&gt;vagrant suspend&lt;/code&gt; ou &lt;code&gt;vagrant halt&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant suspend
[default] Saving VM state and suspending execution...
$ vagrant status
Current VM states:

default                  saved

To resume this VM, simply run `vagrant up`.
$ vagrant halt
[default] Discarding saved state of VM...
$ vagrant status
Current VM states:

default                  poweroff

The VM is powered off. To restart the VM, simply run `vagrant up`
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;o-arquivo-vagrantfile&quot;&gt;O arquivo Vagrantfile&lt;/h2&gt;

&lt;p&gt;O Vagrantfile é onde todas as definições de uma &lt;abbr title=&quot;Virtual machine (Máquina Virtual)&quot;&gt;VM&lt;/abbr&gt; estão. Você pode configurar qualquer &lt;a href=&quot;https://www.virtualbox.org/manual/ch08.html#vboxmanage-modifyvm&quot;&gt;definição da &lt;abbr title=&quot;Virtual machine (Máquina Virtual)&quot;&gt;VM&lt;/abbr&gt; VirtualBox&lt;/a&gt;. Para configurar sua &lt;abbr title=&quot;Virtual machine (Máquina Virtual)&quot;&gt;VM&lt;/abbr&gt; para usar 512 MB de RAM, defina o seguinte:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;customize&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;modifyvm&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;--memory&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;512&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&amp;quot;--name&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;   &lt;span class=&quot;s2&quot;&gt;&amp;quot;Meu primeiro box Vagrant&amp;quot;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Se você quiser usar outro &lt;em&gt;box&lt;/em&gt; base, mude o valor de &lt;code&gt;config.vm.box&lt;/code&gt; para o nome do &lt;em&gt;box&lt;/em&gt; desejado:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;box&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;lucid64&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Agora imagine que você está desenvolvendo uma aplicação web e que você quer deixar que seus amigos em uma mesma rede possa acessá-la. Você pode definir um IP estático para isso:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;network&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:hostonly&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;192.168.33.11&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Como vimos antes, Vagrant automaticamente configura a &lt;abbr title=&quot;Virtual machine (Máquina Virtual)&quot;&gt;VM&lt;/abbr&gt; para usar uma pasta VirtualBox compartilhada no caminho &lt;code&gt;/vagrant&lt;/code&gt;. Enquanto as pastas compartilhadas do VirtualBox podem ser úteis, o seu desempenho degrada rapidamente enquanto o número de arquivos na pasta compartilhada aumenta. Eu recomendo usar &lt;abbr title=&quot;Network File System&quot;&gt;NFS&lt;/abbr&gt; e ignorar as pastas compartilhadas completamente (você precisa definir a &lt;abbr title=&quot;Virtual machine (Máquina Virtual)&quot;&gt;VM&lt;/abbr&gt; para usar um IP estático, como mostra o exemplo anterior):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;c1&quot;&gt;# Caminho relativo&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;share_folder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;v-root&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/vagrant&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:nfs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Caminho absoluto&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;share_folder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;v-root&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/vagrant&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/Users/eriksencosta/Dev/my-project&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:nfs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Depois de alterar o seu Vagrantfile, você precisa reiniciar a &lt;abbr title=&quot;Virtual machine (Máquina Virtual)&quot;&gt;VM&lt;/abbr&gt; para que as alterações entrem em vigor:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant halt
$ vagrant up
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Se estiver usando a pasta compartilhada &lt;abbr title=&quot;Network File System&quot;&gt;NFS&lt;/abbr&gt;, será solicitado a você direitos de administrador, já que o Vagrant modifica o arquivo &lt;code&gt;/etc/exports&lt;/code&gt; para configurar corretamente o servidor &lt;abbr title=&quot;Network File System&quot;&gt;NFS&lt;/abbr&gt; na máquina &lt;em&gt;host&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;É o suporte a provisionadores que torna o Vagrant uma ferramenta muito útil. Até aqui, você viu como criar uma nova &lt;abbr title=&quot;Virtual machine (Máquina Virtual)&quot;&gt;VM&lt;/abbr&gt; e alguma configuração básica, mas faltava alguma coisa. Para desenvolver uma aplicação, nós normalmente precisamos de outros softwares instalados como linguagens de programação, bancos de dados e afins. Mas o processo de instalação deve ser repetível e, mais importante, automatizado.&lt;/p&gt;

&lt;p&gt;Vagrant suporta provisionamento usando Chef (Solo e Server), Puppet (Standalone e Server) e Shell. Seu suporte a Chef e Puppet é uma funcionalidade valiosa para aprender e testar Cookbooks Chef e Módulos Puppet. Para simplificar, vamos configurar um ambiente &lt;abbr title=&quot;Linux, Apache, MySQL and PHP/Perl or Python.&quot;&gt;LAMP&lt;/abbr&gt; usando o provisionador Shell.&lt;/p&gt;

&lt;p&gt;&lt;a name=&quot;provionamento-lamp&quot;&gt;&lt;/a&gt;
## Criando um ambiente &lt;abbr title=&quot;Linux, Apache, MySQL and PHP/Perl or Python.&quot;&gt;LAMP&lt;/abbr&gt; usando o provisionador Shell&lt;/p&gt;

&lt;p&gt;Vamos criar um ambiente &lt;abbr title=&quot;Linux, Apache, MySQL and PHP/Perl or Python.&quot;&gt;LAMP&lt;/abbr&gt;. Nós iremos instalar o Apache, MySQL e PHP, disponíveis nos repositórios Ubuntu, algumas ferramentas de desenvolvimento genéricas (Git, Subversion), ferramentas PHP (Phing, compositor), ferramentas de QA PHP (PHPUnit, PDepend) e uma ferramenta específica para Drupal (Drush). Faça o download ou clone o repositório Git &lt;a href=&quot;https://github.com/eriksencosta/vagrant-shell-scripts&quot;&gt;vagrant-shell-scripts&lt;/a&gt;. Em seguida, adicione o trecho ao seu Vagrantfile:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Vagrant&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;provision&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:shell&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/path/to/vagrant-shell-scripts/db-mysql.sh&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;provision&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:shell&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/path/to/vagrant-shell-scripts/dev-tools.sh&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;provision&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:shell&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/path/to/vagrant-shell-scripts/php5.sh&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;provision&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:shell&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/path/to/vagrant-shell-scripts/php5-qa.sh&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;provision&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:shell&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/path/to/vagrant-shell-scripts/php5-tools.sh&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;provision&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:shell&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;/path/to/vagrant-shell-scripts/drush.sh&amp;quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Após salvar o arquivo, execute o comando &lt;code&gt;vagrant up&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant up
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vagrant irá mostrar-lhe o progresso do provisionamento. Ao concluir, você terá um ambiente totalmente configurado. Faça o login e tente executar o comando &lt;code&gt;phpunit&lt;/code&gt;!&lt;/p&gt;

&lt;p&gt;Nota: depois de desligar uma máquina que tem definições de provisionamento, rodar o comando &lt;code&gt;vagrant up&lt;/code&gt; irá fazer com que o provisionamento seja executado novamente. Caso você não queira que isso ocorra, use a opção &lt;code&gt;--no-provision&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vagrant up --no-provision
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;O Vagrantfile é o que torna o processo de criação de ambientes &lt;abbr title=&quot;Virtual machine (Máquina Virtual)&quot;&gt;VM&lt;/abbr&gt; repetível. É a parte de &lt;a href=&quot;/pt-br/devops-colocando-ponte-entre-desenvolvimento-operacoes&quot;&gt;infraestrutura como código&lt;/a&gt; do Vagrant. Adicione-o no repositório do seu projeto para compartilhá-lo com sua equipe, então cada desenvolvedor só irá precisar executar o comando &lt;code&gt;vagrant up&lt;/code&gt; para usar o mesmo ambiente de trabalho.&lt;/p&gt;

&lt;p&gt;E não se esqueça de ler a &lt;a href=&quot;http://vagrantup.com/v1/docs/index.html&quot;&gt;excelente documentação&lt;/a&gt; disponível no site do Vagrant!&lt;/p&gt;

&lt;!-- ABBR. --&gt;

&lt;!-- Links. --&gt;

</description>
        <pubDate>Fri, 08 Jun 2012 06:50:00 -0300</pubDate>
        <link>https://blog.eriksen.com.br/pt-br/fuja-user-space-usando-vagrant-configurar-ambientes-desenvolvimento</link>
        <guid isPermaLink="true">https://blog.eriksen.com.br/pt-br/fuja-user-space-usando-vagrant-configurar-ambientes-desenvolvimento</guid>
        
        
      </item>
    
      
      <item>
        <title>DevOps, colocando a ponte entre desenvolvimento e operações</title>
        <description>&lt;p&gt;Onze anos após o Manifesto Ágil e muito mais anos de melhorias contínuas nas práticas de desenvolvimento de software resultaram em um grande impacto na nossa indústria. Práticas como Desenvolvimento Orientado a Testes (&lt;em&gt;Test Driven Development&lt;/em&gt;, ou simplesmente, TDD) e Entrega Contínua (&lt;em&gt;Continuous Delivery&lt;/em&gt;) permitiu que times de desenvolvedores desenvolvessem melhores softwares e de forma mais previsível. Mas ainda restava uma lacuna - entre operações e desenvolvedores - &lt;strong&gt;DevOps&lt;/strong&gt; é a ponte que nos permite saltar essa lacuna.&lt;/p&gt;

&lt;h2 id=&quot;entra-devops&quot;&gt;Entra DevOps&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://www.jedi.be/blog/2010/02/12/what-is-this-devops-thing-anyway&quot;&gt;DevOps é&lt;/a&gt;, de acordo com &lt;a href=&quot;http://agilesysadmin.net&quot;&gt;Stephen Nelson-Smith&lt;/a&gt;, um “movimento de pessoas que pensam que é hora de mudança para a indústria de TI - hora de parar com o desperdício de dinheiro, hora de começar a entregar software excelente e para construir sistemas que escalam e duram”.&lt;/p&gt;

&lt;p&gt;O movimento tem raízes nos movimentos de Infraestrutura e Operações Ágeis que estavam aplicando as práticas de engenharia Ágeis para melhorar a Entrega Contínua. Estes movimentos foram uma resposta a um problema identificado, que era o fato de que as organizações que estavam desenvolvendo software com métodologias Ágeis caiam para uma metogologia &lt;em&gt;waterfall&lt;/em&gt; (cascata) quando era hora de implantar o software desenvolvido.&lt;/p&gt;

&lt;p&gt;Essa fronteira entre o processo &lt;em&gt;waterfall&lt;/em&gt; é o que &lt;a href=&quot;http://stochasticresonance.wordpress.com&quot;&gt;Andrew Shafer&lt;/a&gt; chama de &lt;a href=&quot;http://www.infoq.com/presentations/agile-infrastructure&quot;&gt;círculo da felicidade e parede da confusão&lt;/a&gt;. Basicamente o time de desenvolvimento (desenvolvedores, testadores e &lt;em&gt;product owners&lt;/em&gt;) ficam dentro deste círculo com &lt;em&gt;feedbacks&lt;/em&gt; regulares entre as iterações e comunicação fácil. Mas a comunicação com pessoas de fora deste círculo é desastrada e isto trás uma série de problemas que afetam a entrega de valor.&lt;/p&gt;

&lt;amp-img src=&quot;/assets/images/posts/wall-of-confusion-pt-br.png&quot; width=&quot;610&quot; height=&quot;239&quot; layout=&quot;responsive&quot; title=&quot;O círculo da felicidade e a parede da confusão&quot;&gt;&lt;/amp-img&gt;

&lt;noscript&gt;
  &lt;img src=&quot;/assets/images/posts/wall-of-confusion-pt-br.png&quot; title=&quot;O círculo da felicidade e a parede da confusão&quot; /&gt;
&lt;/noscript&gt;

&lt;p&gt;Stephen também define quatro problemas que a nossa indústria de software lida hoje que o DevOps pode ajudar a eliminar ou mitigar: medo de mudanças, implantações arriscadas, “funciona no meu computador” e silo-ização&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. O &lt;strong&gt;medo da mudança&lt;/strong&gt; leva a processos de gerenciamento burocráticos que faz com que qualquer mudança na aplicação (seja a introdução de uma nova funcionalidade ou uma correção de bug) leve um longo período tempo para ser concluída. &lt;strong&gt;Implantações arriscadas&lt;/strong&gt; prejudicam especialmente os times de desenvolvimento e operações já que isso pode levar a implantações em horários calmos - muitas vezes na madrugada, ao qual pode queimar muita energia dos times - porque não há confiança no software a ser implantado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Funciona no meu computador!&lt;/strong&gt; é um &lt;em&gt;cliché&lt;/em&gt;. Quem nunca presenciou um problema que ocorre em produção e que quando fora reportado aos desenvolvedores estes responderam: “funciona no meu computador!”? Não é incomum encontrar times de desenvolvimento usando diferentes sistemas operacionais e/ou o ambiente de dependências do software em versões diferentes do ambiente de produção. Isto pode levar a suposições enganosas baseadas nas diferentes funcionalidades disponíveis nas diferentes camadas que compõe a pilha de dependência do software - ao qual é especialmente evidente quando os desenvolvedores não conhecem a infraestrutura.&lt;/p&gt;

&lt;p&gt;E o problema notório com times em &lt;strong&gt;silos&lt;/strong&gt; diferentes é a cultura de “apontar o dedo” e a mentalidades “nós e eles”. O círculo da felicidade de Shafer é muito sobre este problema: os silos diferentes tem medo um do outro, eles colaboram e comunicam-se mal.&lt;/p&gt;

&lt;h2 id=&quot;mudanas-culturais&quot;&gt;Mudanças culturais&lt;/h2&gt;

&lt;p&gt;DevOps é muito sobre mudança de cultura já que aplica muitas das lições aprendidas com as práticas de Desenvolvimento de Software Ágil. Uma das lições é sobre comunicação e colaboração. DevOps reduz as fronteiras entre desenvolvimento e operações ao construir um time multidisciplinar com pessoas que, como Stephen destaca, “sentem-se confortáveis com infraestrutura e configução, mas também felizes por arregaçar as mangas, escrever testes, debugar e entregar funcionalidades”.&lt;/p&gt;

&lt;p&gt;Colocar desenvolvedores e operações juntos significa dar-lhes oportunidades para descobrirem melhores formas para entregar melhor software. Isso propaga a corrente de valor de negócio que é bem conhecida no círculo da felicidade para o time de operações, que começa a ser visto como parte da solução ao invés de apenas ser visto como responsável por manter os servidores 24x7. Isto preenche a lacuna que estava faltando nas metodologias Ágeis: faz com que operações fiquem em sincronia com o processo de desenvolvimento, alinhando os times de desenvolvimento e operações com um processo de negócio unificado.&lt;/p&gt;

&lt;p&gt;Certamente não é fácil ir de um time de operações caixa preta para um time totalmente DevOps. É difícil encontrar pessoas com esta mentalidade multidisciplinar. Mas DevOps, como &lt;a href=&quot;http://mitchellhashimoto.com&quot;&gt;Mitchell Hashimoto&lt;/a&gt; diz, &lt;a href=&quot;http://vimeo.com/31367609&quot;&gt;não é algo absoluto e sim uma escala&lt;/a&gt;. Você não precisa procurar ter um time onde os desenvolvedores fazem todas as operações, você precisa procurar a sua forma de fazer DevOps. É mais sobre identificar pessoas que podem ser as pontes entre desenvolvimento e operações, encorajando-as e dando-lhes autonomia para que elas o façam.&lt;/p&gt;

&lt;p&gt;Citando Stephen novamente, DevOps “tem um tremendo impacto nos negócios. De repente o time técnico começa a tentar trabalhar como um só. Uma mentalidade de ‘todos a bordo’ emerge, com todas as pessoas técnicas sentindo-se capazes de ajudar em todas as áreas. As áreas tradicionalmente problemáticas de implantação e manutenção quando em produção tornam-se tratáveis - e os campos de batalhas chave dos desenvolvedores (‘o sysadmin construiu uma plataforma não confiável’) versus sysadmins (‘os desenvolvedores escreveram código não confiável’) começa a transformar-se em uma aproximação interdisciplinar para maximizar a confiabilidade em todas as áreas. Isto tem, claro, um efeito positivo no final - melhor confiabilidade e disponibilidade, clientes mais felizes, menor tempo de lançamento para o mercado, &lt;strong&gt;e mais tempo para focar a energia do time no negócio principal do que a desperdiçando em administração ou apagando incêndios&lt;/strong&gt;” (ênfase minha).&lt;/p&gt;

&lt;h2 id=&quot;ferramentas&quot;&gt;Ferramentas&lt;/h2&gt;

&lt;p&gt;Além das mudanças culturais, DevOps é carregado de boas práticas Ágeis aplicadas na infraestrutura. Uma grande mudança é o conceito de infraestrutura em código. Com DevOps, tudo deve estar no controle de versão - da configuração de rede à configuração das aplicações. Não há DevOps sem controle de versão já que esta é a base para todas as outras práticas. Como software, a infraestrutura deve ser construída a partir do código-fonte e igualmente tratada como uma aplicação.&lt;/p&gt;

&lt;p&gt;Construir do código-fonte significa ter serviços &lt;em&gt;online&lt;/em&gt; a partir de um servidor “limpo” através de um processo automatizado. Os sistemas de gerenciamento de configuração são muito úteis aqui: eles colocam um sistema em um estado conhecido usando a configuração que fica disponível no controle de versão e ajudam a alcançar consistência no ambiente de TI. Ele possibilita que operações gerenciem o ciclo de vida dos servidores, provisionando novos servidores pelo objetivo de seus serviços, de forma semelhante a aplicação de templates, dando aos servidores responsabilidades como “Servidor de Banco de Dados”, “Servidor de Cache HTTP” ou “Servidor de Aplicação”.&lt;/p&gt;

&lt;p&gt;Existem alguns sistemas de gerenciamento de configuração &lt;em&gt;open source&lt;/em&gt; disponíveis, sendo o &lt;a href=&quot;http://puppetlabs.com&quot;&gt;Puppet&lt;/a&gt; e o &lt;a href=&quot;http://www.opscode.com/chef&quot;&gt;Chef&lt;/a&gt; os mais conhecidos. Você pode encontrar muitos casos de uso interessantes de ambos os sistemas. &lt;a href=&quot;https://www.tumblr.com&quot;&gt;Tumblr&lt;/a&gt; (a popular plataforma de blog), por exemplo, usa Puppet para &lt;a href=&quot;http://highscalability.com/blog/2012/2/13/tumblr-architecture-15-billion-page-views-a-month-and-harder.html&quot;&gt;atualizar os computadores dos desenvolvedores&lt;/a&gt;. &lt;a href=&quot;http://travis-ci.org&quot;&gt;Travis CI&lt;/a&gt; (o serviço de Integração Contínua hospedado) usa &lt;a href=&quot;https://github.com/travis-ci/travis-cookbooks&quot;&gt;Chef para construir as imagens dos &lt;em&gt;workers de Integração Contínua&lt;/em&gt;&lt;/a&gt; que são responsáveis por executar os testes de dezenas de milhares de projetos &lt;em&gt;open source&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Esse tipo de gerenciamento de servidores otimiza operações ao prevení-la de realizar a configuração manual dos servidores, o que leva a incosistência entre servidores com serviços semelhantes e previne a ocorrência do que Shafer chama de “Máquina Misteriosa” - um servidor que ninguém sabe o que executa e que todos tem medo de desligar. Outro aspecto importante desses sistemas é a idempotência - nesse contexto, a habilidade de aplicar o &lt;em&gt;template&lt;/em&gt;&lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; de configuração na mesma máquina várias vezes sem modificar o resultado final, que é a máquina configurada como descrito no &lt;em&gt;template&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Outras ferramentas são igualmente úteis. Uma delas é o &lt;a href=&quot;http://vagrantup.com&quot;&gt;Vagrant&lt;/a&gt;&lt;sup id=&quot;fnref:3&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;, que é uma ferramente que facilita a criação e configuração de ambientes virtualizados. Com o Vagrant você pode, por exemplo, criar uma máquina virtual com um ambiente o mais semelhante possível do ambiente de produção para ser distribuída no time. Esta é uma ferramenta realmente importante para fazer da frase “funciona no meu computador” uma desculpa do passado. O Vagrant também é usado como um &lt;em&gt;sandbox&lt;/em&gt; para testar &lt;em&gt;templates&lt;/em&gt; de sistemas de gerenciamento de configuração como Puppet ou Chef. Você também pode usar scripts shell para configurar o seu ambiente.&lt;/p&gt;

&lt;p&gt;Os avanços das tecnologias de virtualização também possuem um papel importante para alcançar melhor qualidade e entrega de software. Aproveite a computação em nuvem quase ubíqua para rapidamente prover ambientes de desenvolvimento, teste, &lt;em&gt;staging&lt;/em&gt; e produção tão semelhantes quanto possível para o seu time.&lt;/p&gt;

&lt;p&gt;Mas, lembre-se, mais importante que as ferramentas é a criação da cultura. Crie um time com habilidades interfuncionais e envolva-o nas atividades de implantação. Faça da implantação uma atividade que tanto desenvolvedores e operações possam fazer facilmente e em qualquer hora. Como o código-fonte de seu projeto, faça da sua infraestrutura uma propriedade coletiva e encontre a sua maneira de fazer DevOps em passos de bebê&lt;sup id=&quot;fnref:4&quot;&gt;&lt;a href=&quot;#fn:4&quot; class=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;!-- Notes --&gt;

&lt;!-- Links refs. --&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;&lt;strong&gt;Silo-ização&lt;/strong&gt; é um neologismo. O próprio termo usado por Stephen Nelson-Smith, &lt;em&gt;siloisation&lt;/em&gt; parece ser um neologismo em inglês, já que existem poucas referências na web para a palavra (a grafia com z, &lt;em&gt;siloization&lt;/em&gt; possui mais referências). Podemos definir como o resultado da separação de grupos de pessoas em diferentes silos, com pouca interação/colaboração entre os diferentes silos. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;Esta é apenas uma simplificação do que essas sistemas realmente provêem. Puppet possui &lt;a href=&quot;http://docs.puppetlabs.com/puppet/2.7/reference/modules_fundamentals.html&quot;&gt;Modules&lt;/a&gt; e Chef possui &lt;a href=&quot;http://wiki.opscode.com/display/chef/Cookbooks&quot;&gt;Cookbooks&lt;/a&gt;. Ambos (&lt;a href=&quot;http://docs.puppetlabs.com/guides/templating.html&quot;&gt;Puppet Templating&lt;/a&gt;, &lt;a href=&quot;http://wiki.opscode.com/display/chef/Templates&quot;&gt;Chef Templates&lt;/a&gt;) usam &lt;em&gt;templates&lt;/em&gt; como uma forma de substituir ou criar arquivos de configuração como descrito em um &lt;em&gt;module&lt;/em&gt; ou &lt;em&gt;cookbook&lt;/em&gt;. &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:3&quot;&gt;
      &lt;p&gt;Como Puppet e Chef, Vagrant é escrito em Ruby. Python é outra linguagem de &lt;em&gt;scripting&lt;/em&gt; que está sendo muito utilizada para escrever este tipo de ferramenta. Um conhecimento básico dessas linguagens pode ser muito útil, especialmente caso você planeje extender funcionalidade. &lt;a href=&quot;#fnref:3&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:4&quot;&gt;
      &lt;p&gt;Contexto e bom senso são sempre importantes. Eu realmente gosto da forma que o &lt;a href=&quot;http://zachholman.com/posts/how-github-works&quot;&gt;GitHub trabalha&lt;/a&gt;. Eles não usam nenhuma metodologia Ágil mas são &lt;a href=&quot;http://zachholman.com/posts/scaling-github-employees&quot;&gt;extremamente bem sucedidos&lt;/a&gt; em sua Entrega Contínua. &lt;a href=&quot;#fnref:4&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Thu, 24 May 2012 11:30:00 -0300</pubDate>
        <link>https://blog.eriksen.com.br/pt-br/devops-colocando-ponte-entre-desenvolvimento-operacoes</link>
        <guid isPermaLink="true">https://blog.eriksen.com.br/pt-br/devops-colocando-ponte-entre-desenvolvimento-operacoes</guid>
        
        
      </item>
    
  </channel>
</rss>
