Google+ Followers

Wednesday, September 10, 2014

Vagrant e você, tudo a ver

Uma das coisas mais legais que aprendi nos últimos meses foi adicionar Vagrant no meu dia-a-dia de desenvolvimento.
Hoje os meus primeiros passos para começar um projeto [green field] são:
mkdir
git init
vagrant init ubuntu/trusty64

 O que é?

Camadas
Vagrant é uma camada que facilita, MUITO, a interação com máquinas virtuais. Ele funciona falando diretamente com o seu gerenciador de máquina virtual (comumente chamados de Hypervisor). Com vagrant você consegue subir uma máquina virtual sem nem abrir o Virtual Box, por exemplo.

Providers

Para o Vagrant o Virtual Box é um provider.
Virtual box é o provider padrão do Vagrant, ou seja, para subir uma VM virtual box com vagrant você não precisa fazer nada. Para subir uma VM VMWare você precisa instalar um plugin.

Requisitos

Como você pode imaginar tem um hypervisor instalado é um dos pré-prequisitos para usar vagrant na sua máquina.

Benefícios

Essa parte é interessante...
Existe uma variedade de tecnologias que eu uso atualmente. A saber:
  • Octave, Python e R para os projetos de Big Data e Machine Learning
  • [Ruby|Python], ImageMagik e [Postgres|MySQL] para projetos [RoR no heroku|django]
  • Java + [Tomcat|JBoss|Jetty] para projetos Java
  • Imagine outra tech stack que possa sugir aqui...
 Eu tenho apenas um computador para desenvolver. Se eu fosse instalar todos os softwares necessários diretamente no meu laptop, tenho certeza que eu teria problemas de compatibilidade, além da lentidão que meu ambiente ia ficar (imagine ter um postgres e mysql rodando na minha maquina o tempo todo).
Com Vagrant o que eu faço é criar uma máquina virtual para cada projeto e nessa máquina instalo os softwares necessários para minha app rodar, mantendo diretamente no meu laptop apenas código fonte e editor.
Por exemplo, para uma aplicação java eu deixo o maven, tomcat e banco de dados rodando dentro da VM enquanto no meu laptop ficaria apenas o eclipse.
Em projetos Ruby on Rails eu instalo Image Magik, editor, RVM e PostgreSQL na VM, deixando apenas o código fonte no meu laptop.

Vagrantfile

A maneira mais simples de iniciar o uso de vagrant em um novo projeto é executar o comando:
vagrant init
Esse comando vai criar um arquivo chamado Vagrantfile no seu diretório atual, é através desse arquivo que você configura como o vagrant deve te prover a máquina virtual.

Como configurar os ambientes

Algo muito legal no Vagrant é que ele já entende as principais ferramentas para provisionamento automático de ambiente. Então se você conhece Puppet, Chef, Ansible ou o recente adicionado Docker, você pode criar receitas/scripts/manifestos com a configuração que você deseja que seja aplicada na sua máquina virtual e o Vagrant vai aplicar a configuração quando ele criar a máquina virtual pela primeira vez (ou quando você quiser que ele re-aplique a configuração de provisionamento). Eu não vou entrar fundo no assunto de provisionamento automático de ambiente nesse post por que esse assunto é extenso mas, se quiser dar uma olhada em algo pode ver esse meu repositório no github que tem monta uma máquina virtual vagrant com OpenERP (algo bem complexo IMHO): https://github.com/rogeralmeida/sample-openerp-vagrant-setup

Acesso a máquina virtual

Tendo uma máquina virtual configurada, você pode acessá-la facilmente via ssh (com o comando vagrant ssh). Se você tiver a máquina virtual rodando, após executar o comando vagrant ssh você cairá no prompt da máquina virtual.
Além disso você pode configurar, para o vagrant fazer ssh port forward entre sua máquina virtual e seu host. Com isso você pode, por exemplo, subir uma aplicação na porta 3000 dentro da VM e acessar essa mesma aplicação pelo brownser do seu laptop através do endereço http://localhost:3000.
Você pode também mapear uma porta da VM para uma porta diferente no seu laptop. Ex: 3000->666

Enviando dados para a máquina virtual

O pulo do gato é, assim que você sobe uma máquina virtual vagrant, se você acessá-la via ssh e mudar para o diretório /vagrant você ira ver os arquivos que estavam no seu diretório do projeto no seu laptop.
Vagrant possui um conceito de pasta compartilhada, ou seja, pastas que existem no seu host que devem ser compartilhadas com sua máquina virtual.
Esse é o truque para conseguir desenvolver aplicações com linguagem script como Ruby e Python, no mundo java esse é o segredo para compartilhar o .m2/, por exemplo.

Considerações finais

Já tem um tempo que eu virei fan de Vagrant, e acho que todo desenvolvedor do Brasil deveria pelo menos brincar um pouco com Vagrant.
Tem várias outras coisas legai de vagrant, como por exemplo rodar direto na AWS ou subir um cluster de máquinas virtuais diretamente no seu laptop.
Se quiser ver algo de alguém que manja muito disso, dá uma olhada no post do bruninho sobre vagrant+puppet.

Thursday, September 4, 2014

Como é trabalhar na ThoughtWorks

Uma pergunta recorrente que me fazem é:
- E ai, como é trabalhar na ThoughtWorks?

Bom, vou tentar responder isso...

Pra começar é muito diferente de tudo que já vi aqui no Brasil. Nenhuma das empresas pelas quais passei, ou empresas que ouvi amigos próximos falando sobre o dia-a-dia se aproximam do que eu vejo aqui na ThoughtWorks. Isso tanto para bom, quanto para "não tão bom".

A ThoughtWorks te contrata para a Thoughtworks não para um projeto

Isso pra mim é algo muito bom, a maioria das empresas de consultoria no Brasil quando querem te contratar falam algo do tipo: "Temos um projeto em Alphaville com duração de 6 meses e possibilidade de prorrogação..."
Nesse cenário se tem projeto essas empresas contratam como loucas, e quando chega final do ano e os clientes tem um freezee elas demitem! Para em fevereiro do outro ano começarem a contratar de novo. Isso nunca fez sentido para mim.
Na ThoughtWorks, quando você é contratado você vira um ThoughtWorker. Basicamente o que acontece é que a empresa te considera alguém que pode agregar a empresa e te valoriza por isso. Quando você entra na empresa você fica um tempo na praia.

Praia

Quando você entra na ThoughtWorks você passa um tempo apontando hora num projeto chamado Beach (Praia). Praia não é billable. É um tempo para você se adequar a realidade da empresa. Entender como a empresa funciona e ver como as equipes trabalham no dia-a-dia.
Quando acaba um projeto, você volta para a praia. Geralmente tentamos fazer com que ninguém saia de um projeto e já comece em outro sem ter tempo de praia. Na praia você pode fazer tudo aquilo que você tinha vontade de fazer mas não podia por que estava em projeto. Aprender uma linguagem/lib/ferramenta/whatever nova. Contribuir com um projeto open-source. Fazer um curso online. Ou mesmo trabalhar com voluntário em uma ONG parceira.
Só para compartilhar, eu estou na praia atualmente e fiz um curso de estrutura de dados de Berkeley e estudei Docker.

Não tem gente ruim

Isso é diferente de tudo que eu já vi. Geralmente as empresas eram formadas por gente muito boa, gente mais ou menos e gente ruim. Na ThoughtWorks, na minha humilde opinião, não tem gente ruim. Tem gente que ainda não é efetivamente muito boa em alguma coisa, a maioria por falta de experiência, mas vai ser um dia com certeza.
Quando eu entrei na Thoughtworks eu já tinha 8 pra 9 anos de experiência e eu conheci gente com 2 anos de experiência que me colocavam (e colocam eu acredito) no chinelo!!!
Isso faz muita diferença, por que você está sempre aprendendo algo fantástico com seus colegas de trabalho.
Tem um lado não tão bom que é a desconstrução do seu ego. A maioria dos ThoughtWorkers estava acostumado a ser tratado como Rock Star nas outras empresas e quando entra na TW não recebe os mesmos "privilégios" e leva um tempo para se adequar a essa nova realidade.

Modelo horizontal com poucos níveis de Hierarquia

A TW não tem uma hierarquia enorme como as empresas geralmente tem. Entre eu e o Diretor da TW no Brasil deve ter 1 ou 2 níveis.
Algo tipo assim:
Eu(Dev) > Gerente do escritório de São Paulo > Diretor Geral do Brasil.
Na verdade eu tenho até dúvidas se o Gerente do escritório de São Paulo está no meio do caminho :S
Aqui, gerente, é um papel necessário para desenvolver um projeto. Do mesmo modo que precisamos de DEVs, BAs e QAs precisamos de Gerentes também, e os gerentes estão no mesmo nível dos DEVs, BAs, QAs, IMs, etc.
Existem papeis que cuidam de níveis maiores, por exemplo, existe um líder de demanda, existe uma líder de tecnologia. Mas a hierarquia é muito fraca ou quase nula no dia-a-dia.
É muito comum um líder colocar uma opinião em uma lista de discussão interna e alguém discordar na mesma thread.

Todos tem voz

Sim, você pode discordar de algo publicamente sem se preocupar se vai perder
o emprego. Na verdade, discordância ocorre a toda hora. O difícil é achar consenso. Mas tudo é feito no intuito de agregar. Isso é muito bom.

A lista de DEV

Esse ponto é particular para quem for dev. Imagine você ter uma lista de Dev com Paul Hammant, Martin Fowler, Danilo Sato, CV, Jim Highsmith, Badri  e mais um monte de gente no mesmo nível deles. Um ponto interessante é que a lista está sempre olhando o futuro, basta ver o que está rolando na lista que daqui a uns 6 meses muitas daquelas coisas vão ficar famosas.

Justiça Econômica e Social

A TW é baseda em 3 pilares.
O Terceiro Pilar, é o que me faz pensar que a TW pode ser a última empresa da minha vida. Nós não trabalhamos todo dia para um cara ficar rico e ficar andando de Ferrari no final-de-semana. Nos fazemos vários projetos legais ao redor do mundo ajudando a tornar o mundo um lugar melhor. Confesso que quando eu conheci a TW eu quis entrar por causa do lance de excelência técnica, mas foi a Justiça Econômica e Social que me fez querer ficar realmente.

 

Estamos contratando

Bom, agora vem a última parte... estamos contratando.
Atualmente temos vagas para todos os escritórios, mas São Paulo, onde estou atualmente e Belo Horizonte, nosso próximo escritório no Brasil estão bombando. O processo de recrutamento da TW é algo muito enriquecedor, eu considero uma boa participar do processo por que você pode ganhar vários feedbacks legais na pior das hipótese e na melhor pode vir ficar maravilhado como eu estou aqui dentro.