Categories
Etc.

Meu ambiente de trabalho em 7 itens

O Anderson Casimiro (@duodraco) começou um meme muito legal: “Seu ambiente de trabalho em 7 itens”. Nele você escreve sobre quaisquer 7 coisas do seu ambiente de trabalho que achar mais interessantes e em seguida indica de 3 a 5 pesoas para fazerem o mesmo. O Anderson passou o meme para o Ivo Nascimento (@ivonascimento), que depois mandou para o Bruno Roberto Gomes (@brgomes) e por fim para o Hélio Costa (@hlegius) que me colocou nesta roda.

Então vamos lá, as 7 coisas que mais gosto e acho importantes no meu ambiente de trabalho são:

1) Git + Github

O Git é uma fantástica ferramenta de controle de versão. Sua característica principal é ser um sistema de controle de versão distrubuído, o que significa que você pode criar repositórios locais independentes de um servidor central, por exemplo. Com isso você pode criar facilmente novos branchs e repositórios praticamente sem custo (ou seja, muito rápido). Outra coisa sensacional é que o Git praticamente resolve sua vida com relação a merges. Na maioria das vezes ele consegue “se achar” sozinho e resolver conflitos para você, o que poupa um bocado de tempo quando você está trabalhando em equipe com várias pessoas alterando a mesma base de código.

O Github faz o Git – que ja é fantástico – ficar ainda melhor. O Github mudou para melhor a forma de colaboração entre desenvolvedores em projetos open source. Basta você criar um clone remoto do projeto que deseja contribuir, fazer suas alterações e fazer um “pull request”. Você pode adicionar colaboradores nos seus repositórios ou até mesmo criar um time de colaboradores. Isso é mais ou menos o que as pessoas já faziam antes, o Github apenas entendeu esse processo e criou uma ferramenta excelente para suportá-lo com algumas melhorias. E isso tudo não serve apenas para projetos abertos não, você pode fazer como eu (e muita gente) e por alguns míseros dólares você terá seus repositórios privados para trabalhar nos seus projetos particulares. Hoje basicamente não tenho nada importante que não esteja no Github.

2) Google App Engine

O Google App Engine também é um absurdo. Com ele você pode desenvolver aplicações Python ou Java num estalar de dedos e colocá-las para funcionar numa infraestrutura bastante confiável e rápida. O App Engine oferece banco de dados, cache, storage e várias coisas úteis que te ajudam a focar na sua aplicação e esquecer a infraestrutura. Para os Railers que lêem este blog, o Heroku é um bom quebra galho (mesmo sendo bem mais simples que o App Engine).

3) VMWare Fusion

O VMWare Fusion me possibilita ter vários sistemas operacionais com diferentes browsers para testar minhas aplicações web em uma máquina só. Além disso, como trabalho muitas vezes desenvolvendo coisas que serão servidas com Red Hat Enterprise Linux ou CentOS, posso facilmente criar ambientes de desenvolvimento locais com esses sistemas operacionais e continuar trabalhando no conforto do meu Mac sem ficar com medo das coisas não funcionarem em produção.

4) TextMate

Todo mundo tem seu editor preferido, e o meu é o TextMate. Gosto dele porque é leve, fácil de escrever plugins e snippets e possui umas centenas de plugins disponíveis por aí para trabalhar com qualquer linguagem que já precisei até hoje, suportar sistemas de controle de versão, e por aí vai. Infelizmente não consigo usá-lo para todas as linguagens que trabalho. Por exemplo, quando programo em Java ainda prefiro usar o Eclipse, ou o XCode para brincar com iOS, mas para todo o resto uso o TextMate (ou, quando em servidores remotos, o Vim).

5) Shell

Não tem como sobreviver sem um shell. Eu costumo usar o Terminal do Mac OS X com algumas customizações, e como shell uso o Bash. Além de me possibilitar diagnosticar problemas em servidores remotos, ver logs e etc., também uso o shell para algumas tarefas de desenvolvimento como usar o Git (incluindo resolver conflitos, prefiro fazer manualmente), buscar arquivos, inspecionar minha máquina e por aí vai. Também costumo escrever shell scripts para fazer algumas tarefas pessoais como codificar vídeos com ffmpeg e fazer backups remotos.

6) MacBook + Mac OS X

Os Macs são computadores que simplesmente funcionam. É isso. Meu MacBook Pro é potente e tem um hardware excelente que não me deixa na mão. E quanto ao Mac OS X, ao invés de ficar no meu caminho me pedindo drivers para fazer qualquer coisa ele simplemente funciona e deixa o caminho livre para que eu possa trabalhar. Já se foi a época em que eu tinha tempo para comprar peça por peça e montar meu próprio computador, ou então ficar re-configurando meu xorg.conf a cada update de sistema operacional. 🙂 Hoje não dá mais, preciso focar em coisas mais importantes.

7) Monitor adicional de 24″, teclado e mouse

Nós que trabalhamos intensivamente com computadores não podemos nos dar ao luxo de não ter um teclado, mouse ou monitor confortáveis. O monitor de 24″ é o mais importante do meu setup de trabalho. Usar dois ou mais monitores me deixa muito mais produtivo, além de ser muito mais confortável do que o display do MacBook (porque é gigante). Se você nunca tentou usar dois monitores, não perca mais tempo e tente agora, você vai ver a diferença. Quanto ao mouse e teclado, durante muito tempo usei hardware Microsoft (aliás, isso eles fazem bem) mas recentemente tenho usado o Magic Mouse e um mini teclado sem fio, ambos da Apple.

E para continuar a brincadeira…

Indico mais 5 pessoas para participar:

Categories
Agile

Louco por automatização!

Ultimamente tenho feito uma brincadeira que todos ficam achando que eu sou maluco. Costumo dizer que o meu objetivo a cada dia é tentar fazer com que todo o trabalho que eu faria em 2 dias seja feito em apenas 1 hora, e assim eu posso aproveitar as outras 15 horas escrevendo posts no meu blog, estudando coisas novas, jogando Guitar Hero ou até mesmo dormindo (se eu não tivesse insônia).

Parece loucura mas não é. Quando eu ainda era um jovem Padawan um dos vários mentores que tive ao longo da minha vida me ensinou uma lição muito valiosa.

Há bastante tempo atrás, observando um amigo trabalhar percebi que ele passava horas e horas automatizando cada pequena tarefa que faziamos na empresa. Se precisavamos criar uma entrada no DNS, tinha um shell script para fazer isso. Se precisavamos fazer backup, existia um script para fazer isso e ele até já funcionava sozinho. E no caso dele, ele tinha scripts prontos até para facilitar fazer as compras do mês no Zona Sul online (isso é sério mesmo). Basicamente ele era obcecado por automatizar tarefas.

Como ele passava a grande maioria do tempo automatizando coisas, um dia eu resolvi perguntar porque ele perdia tanto tempo fazendo aquilo. Não era apenas uma obsessão sem sentido, tinha um fundamento muito simples. Ele disse: “Quanto mais você trabalhar para tornar a sua vida mais fácil automatizando as tarefas repetitivas, mais você terá tempo livre para fazer mais coisas que você quiser! Fazendo assim você vai ter tempo de sobra para investir nas tarefas realmente desafiadoras, que vão exigir toda sua intelectualidade e que vão te dar prazer. É por isso que eu sempre trabalho com a meta mental de reduzir todo o trabalho que eu faria em 2 dias para 1 hora, e fazendo assim todo o dia e a todo momento as coisas simplesmente vão acontecer; e eu vou produzir muito mais que qualquer um sem absolutamente nenhum esforço”.

Eu sempre achei isso genial! Obviamente ele não passava 15 horas de bobeira fazendo outras coisas. O objetivo era apenas estabelecer uma meta agressiva de automatização de tarefas para conseguir alcançar um nível onde muitas coisas podem ser feitas com pouquissimo esforço, e a brincadeira de “passar 15 horas de bobeira” serve apenas para ilustrar e tornar o exemplo mais divertido. 🙂

Desde essa época eu venho usando essa abordagem para o máximo de coisas que eu consigo. Meu problema sempre foi que eu nunca tentei de verdade ser tão extremo quanto ele (ao ponto de automatizar até as compras do mês), mas de uns meses pra cá eu tenho sido cada vez mais e mais radical e tenho me tornado cada vez mais produtivo (apesar de ainda ir fisicamente no mercado fazer compras).

“Radical” e “extremo” são palavras que têm uma conotação muito negativa, mas ser radical ou extremo pode ser muito útil quando se tem um propósito como esse (ou então para se fazer uma abordagem como a que eu postei sobre porque eu não gosto de escrever comentários no código).

Em projetos de desenvolvimento de software, os ganhos com uma abordagem desse tipo são impressionantes. No último projeto que comecei (e que estou atualmente) propús para os meu amigos do time que tentassemos fazer uma abordagem desse tipo – radical e extrema – em relação a automatização. A regra que criamos juntos e concordamos ficou bem simples: se alguma coisa precisou ser feita mais de uma vez então ela necessariamente deve ser automatizada.

Depois de aproximadamente 3 semanas de trabalho as coisas funcionam mais ou menos assim:

  • Todos os testes unitários e de aceitação são automatizados e podem ser rodados com apenas um comando (desde criar/atualizar banco de dados até subir Selenium Server, colocar o sistema em um estado conhecido, executar os testes e depois desfazer isso tudo).
  • Toda vez que é feito um push para o Git, o build server roda primeiro todos os testes unitários automaticamente.
  • Se qualquer um dos testes falha, uma sirene toca automaticamente alertando que alguém fez besteira.
  • Se os testes passam, o Capistrano faz um deploy em cada uma das máquinas do ambiente de testes de aceitação e dispara a execução de todos os testes de aceitação nesse ambiente.
  • Se o banco de dados mudou, o upgrade do schema de banco de dados também é feito automaticamente.
  • Finalmente, quando todos os testes passam, é feito um deploy automatico para o ambiente “live”, que tem por objetivo ser o lugar onde se pode ver a última versão de desenvolvimento que passa em todos os testes.
  • Se precisarmos colocar a aplicação em produção, um script fará isso da forma mais simples, segura e instantânea possível.
  • Se um desenvolvedor precisar desenvolver nesse projeto, basta baixar o código do repositório e com um script tudo se configura e funciona automaticamente.
  • Se for preciso criar uma nova tela de cadastro padrão desse sistema, basta rodar um script e ela será quase toda criada automaticamente (apenas as particularidades precisam ser configuradas).
  • … e por aí vai.

Todas essas coisas juntas não foram simples de serem feitas, muito pelo contrário, foi bastante trabalhoso (e até chato algumas vezes). Porém, o resultado não deixa dúvidas: o ganho de performance é absurdamente alto e vale a pena cada minuto gasto investido.

No início levamos muito tempo automatizando tudo mas depois dos primeiros 3 ou 4 dias qualquer coisa passou a levar bem menos tempo do que levaria. Em pouquissimo tempo (algo em torno de 3 semanas, como eu disse) já é possível perceber resultados concretos dessa abordagem. Apesar de ainda termos um monte de coisas para melhorar, nossa agilidade para fazer coisas simples e vê-las funcionando é muito grande!

Não gaste seu nobre tempo fazendo coisas repetidas e chatas. Automatize tudo que puder! Faça os scripts trabalharem pra você!!!

Categories
Engenharia de software

Java é ruim?

Em tempos de Ruby on Rails parece que está na moda falar mal de Java. Na Rails Summit então meus ouvidos chegaram a doer de tanto ouvir falar que Java é ruim, Java é burocrático, bla bla bla e que Ruby on Rails é fantástico, produtivo e sexy. Calma, essa não é mais uma daquelas comparações ridículas de Java versus Ruby on Rails.

Mas ainda ficou a pergunta que não quer calar: Java é ruim mesmo? A resposta, como sempre, é que depende do caso…

Em um projeto de desenvolvimento de software, mesmo antes de começar o desenvolvimento você já tem algumas restrições para escolher tecnologias. A finalidade do software por si só pode já restrigir muito a tecnologia que terá que ser usada.

Por exemplo, se você estiver fazendo um website, provavelmente você não escapará de fazer uma interface em HTML, Flash ou qualquer outra coisa específica para desenvolver uma camada de apresentação web. Provavelmente você não vai querer usar Assembly para fazer a parte server-side, já que não seria muito produtivo (apesar de não ser impossível). Eventualmente esse site pode ser um portal como a Globo.com que têm milhões de acessos por dia e você terá que escolher uma plataforma/linguagem/arquitetura que priorizem performance e favoreçam escalabilidade. Ou então pode ser um site com pouquíssimos acessos e você nem precisará se preocupar com isso…

Ou então você pode precisar fazer um pequeno script para fazer backup automatizado de um banco de dados MySQL. Seria totalmente incoerente usar Delphi, Fortran ou Piet. Provavelmente você vai querer usar algo como Shell script e resolver o problema em meia dúzia de linhas. Alguns bancos como o SQL Server têm mecanismos de agendamento de backup automático que são super fáceis de configurar e usar, portanto nesse caso usar Shell script seria trabalho desnecessário.

Meu ponto aqui é que não dá para dizer que Java (ou qualquer outra coisa) é ruim por sí só. Java pode ser ruim ou bom dentro de um contexto. Por exemplo, em 2005 eu trabalhei num projeto de Call Center à distância via Internet onde precisei desenvolver um softphone e a melhor opção foi usar Java Applets. Além de existirem bibliotecas Java para trabalhar com IAX (que é um protocolo como o SIP, só que proprietário do Asterisk), o usuário não precisava instalar nenhum programa para falar com o Call Center, bastava acessar o site. Eu odeio Applets com todas as minhas forças, mas foi ótimo para esse projeto (eu diria até que foi relativamente fácil). Seria correto então dizer que Ruby on Rails é ruim só porque seria impossível de fazer esse projeto com tanta facilidade? É óbvio que não!!!

Jamais existirá uma única linguagem ou plataforma para resolver todos os problemas. O desenvolvedor de software precisa conhecer vários tipos de ferramenta e saber escolher a melhor delas para resolver cada problema. Que fique claro que eu não sou defensor de Java, Ruby ou de qualquer outra coisa. O caso é que é incoerente dizer que X ou Y é bom ou ruim por sí só; é preciso analisar as opções dentro de um contexto.

Categories
Shell script

Se você não sabe Shell script, deveria saber

Ontem estava conversando com um amigo meu sobre shell script. Na verdade nós conversamos sobre esse assunto várias vezes nos últimos tempos. Sempre conto para ele como eu resolví um problema interessante com shell script e ele fica com água na boca e diz: “caramba, eu tenho que aprender esse troço”.

Shell script é pau pra toda obra. Para quem trabalha com Unix direto como eu, saber shell script pode fazer a diferença entre levar 30 minutos para resolver um problema ou levar 10 segundos para resolver o mesmo problema. Muitas vezes dá pra resolver com apenas uma linha de shell script. Pelo que eu me lembro nunca passei de umas 25 linhas. É sério.

É claro que o shell script não serve para todas as coisas. Por exemplo, ele não é feito para programar um site como este. Mas para as coisas que ele serve ele não decepciona. Vou dar exemplo de algumas coisas doidas que eu andei fazendo nas últimas semanas, todas com menos de 25 linhas de shell script:

1) Precisava visualisar simultaneamente os logs de 7 servidores de aplicação. Quando eu desse um refresh na tela (browser) precisava saber para dos servidores que o balanceador iria me jogar e visualizar o log deste servidor. E a cada refresh da tela o servidor pode mudar. Então, fiz um script para conectar simultaneamente em todas as máquinas e na mesma tela me mostrar as mensagens de log de todos os servidores, indicando no início da linha qual o servidor que havia mandado a mensagem. Tempo para fazer: 2 minutos. Linhas de script: 8 + arquivo de configuração com o endereço dos servidores.

2) Em determinadas horas o request para um mesmo Servlet feito pelo mesmo browser na mesma máquina e com os mesmos parâmetros estava gerando respostas completamente diferentes. Quem viu isso foi o técnico do suporte, que jurou de pé junto que era verdade. Olhando o código da aplicação deveria ser impossível que isso acontecesse mas como o cara jurou pela mãe dele, tinha que comprovar. Então resolví fazer um script para baixar 50.000 vezes o conteúdo deste Servlet. A cada vez que o conteúdo era baixado comparava com o anterior para ver se estava diferente. Em caso positivo ele parava a execução e me mostrava na tela a diferença entre os dois. Tempo para fazer: 10 minutos. Linhas de script: 21. (ah, todos os 50.000 arquivos baixados eram iguais um ao outro!)

3) Os DBAs aqui da empresa estavam limpando o banco de dados e selecionaram umas 30 tabelas candidatas a serem removidas do banco de dados por não estarem sendo utilizadas. Então eles me pediram para dar uma olhada nos nossos projetos e verificar se realmente elas não estavam sendo utilizadas em nenhum sistema. Fiz então um script para varrer o repositório de projetos e buscar por arquivos contendo uma ou mais das tabelas relacionadas. Tempo para fazer: 20 segundos. Linhas de script: 1 + arquivo de configuração com o nome das tabelas.

Provavelmente se eu não soubesse shell script estaria até agora escrevendo alguma coisa em Java ou qualquer outro treco para fazer tudo isso e não teria tempo de escrever no meu blog! Como eu quero ter tempo de escrever aqui preciso resolver meus problemas o mais rápido possível e por este motivo o shell script é essencial na minha vida! Hehe.

Agora é sério, já deu para ter uma idéia de como é interessante?

Para você poder começar neste minuto, selecionei alguns links legais para leitura:

– Conceitos básicos de Unix: http://sc.tamu.edu/help/general/unix/unix.html
– Wikipedia – Shell script: http://pt.wikipedia.org/wiki/Shell_script
– Prompt-doc: “Tira Dúvidas” sobre Shell: http://aurelio.net/curso/conectiva/conectiva-shell-prompt.html
– Shelldorado – Shell tips & tricks: http://www.shelldorado.com/shelltips/