7 Meses de Time Beta: Um Balanço

April 7, 2010

Já se vão 7 meses que estou no Time Beta na Globo.com e vou aproveitar a oportunidade para fazer um balanço de como tem sido até aqui.  O que estamos fazendo de interessante, o que aprendemos, o que podemos melhorar, etc. Mas antes, um disclaimer: as opiniões aqui são minhas e não necessariamente refletem a opinião do time como um todo. No entanto, acredito que o time concorda com tudo que está escrito aqui.

Nesses 7 meses trabalhamos no Baixatudo, o site de downloads da Globo.com que já existia há algum tempo. Já no primeiro mês colocamos no ar uma nova versão, que foi sendo evoluída e refinada até chegar no que temos hoje.

Infra

Um dos pontos que acredito que estamos bem é na infraestrutura do projeto. Nosso time é 100% responsável por todas as questões de infra. Provisionamento de máquinas, instalação de SO, configuração de servidores de cache, de aplicação, de banco de dados, de busca, balanceamento de carga, monitoração, tudo é nossa responsabilidade. Por isso mesmo, praticamente toda a administração da nossa infra é automatizada. O grande benefício disso é que conseguimos mudar a arquitetura da aplicação, atualizar versões, mexer nas configurações, etc., com bastante segurança e agilidade. O assunto é bastante extenso e interessante e certamente merece um outro post detalhando melhor como funciona nossa infra.

Agile UX

Outro ponto que acredito que estamos bem é na questão de Agile UX, ou seja, como integrar UX com desenvolvimento ágil. É um assunto que pessoalmente me interessa muito e acredito que nesse time chegamos num ponto bastante positivo. Esse assunto também merece um post bem detalhado que pretendo publicar em breve. Mas basicamente, o que acontece é que tentamos garantir 2 coisas.

Uma é que o time esteja trabalhando junto na mesma funcionalidade. Enquanto o designer desenha as interfaces/fluxos/interações/variações de componentes, os outros membros do time já trabalham no seu desenvolvimento. A comunicação é rica e constante. Todo mundo dá palpite sobre UX e todo mundo desenvolve, inclusive o próprio designer que contribui com o html e css.

A outra coisa é que no final de cada iteração a gente tem uma funcionalidade tecnicamente pronta. Muitas vezes ela não está boa o suficiente para ser disponibilizada para o usuário final mas funciona do ponto de vista técnico. É em cima disso que a gente colhe feedback para refiná-la nas iterações seguintes e não em cima de telas ou outros artefatos não funcionais.

Testes A/B

Começamos a usar o Google Website Optimizer para fazer testes A/B e estamos empolgados com os resultados obtidos. O objetivo é evitar tomar decisões de UX e de produto baseadas exclusivamente em achismos. Queremos dados para ajudar nas nossas decisões. Até aqui fizemos 2 testes.

O primeiro foi para escolher o melhor texto no botão de download de um software. Inicialmente esse texto era ‘download’. Criamos uma variação com o texto ‘baixar’. O resultado foi que a segunda opção tinha uma conversão maior e por isso é ela que está no ar até hoje.

No segundo, experimentamos uma variação nos thumbs que consistia em exibir o número de downloads em cima do thumb. Uma alteração simples e que todos concordavam que deixava o produto mais bonito. Mas a conversão nesse caso era bem pior. Os usuários clicavam menos na variação que tinha os números de downloads. Por isso, essa mudança não foi implementada de forma definitiva.

Outros

Outros dois pontos que considero interessante mencionar.

O primeiro é que tentamos trabalhar num ritmo sustentado, sem pegar mais do que o time aguenta. Na única vez que trabalhamos de madrugada o resultado não foi bom. Os stakeholders não gostaram do que foi entregue e isso acabou refletindo temporariamente na motivação do time.

O outro é que tentamos manter nosso processo o mais enxuto possível. Praticamente não existem tarefas, reuniões, etc., que não agregam valor ao produto.

Resultado

O resultado disso tudo, aliado ao excelente trabalho da equipe de editores, é um aumento significativo na audiência do Baixatudo. E stakeholders satisfeitos.

A partir de agora estamos partindo para outro produto. Sabemos que ainda temos muito a evoluir, mas acredito que estamos no caminho certo. Estamos conseguindo mostrar o valor de times pequenos (4-5 pessoas no nosso caso), autônomos, ágeis.


Lei de Demeter e Ruby

December 8, 2009

Na semana passada tivemos uma discussão bem interessante na Globo.com sobre Lei de Demeter e ruby. Basicamente a questão era: faz sentido se aplicar a Lei de Demeter quando se está usando uma linguagem dinâmica como ruby?

(Para entender o que é a Lei de Demeter, vale a leitura do artigo na Wikipedia).

Ao seguir a lei de Demeter o código escrito tende a ter um acoplamento mais baixo e, portanto, é mais fácil de manter e evoluir. Por outro lado, quando a lei é violada, o acoplamento aumenta. Isso independe se a linguagem utilizada é dinâmica ou não. Ao enviar uma mensagem para um colaborador do colaborador você está aumentando o acomplamento.

Na minha opinião, a questão correta para se discutir é somente: faz sentido aplicar a Lei de Demeter? E, nesse caso, a resposta é a já manjada “depende”.

Assim, sem nenhum contexto, aplicar Demeter faz sentido. Acoplamento baixo é algo desejável. Mas, dependendo do caso, o custo de aplicar a lei pode não compensar. Por exemplo, se o modelo de domínio é muito simples, com pouquíssimas regras de negócio, podemos ser mais pragmáticos, não aplicando a lei, sem que isso tenha maiores consequências.

Como quase tudo que fazemos no nosso dia a dia, trata-se de uma questão de entender o conceito e pesar seus prós e contras dentro de um contexto para então decidir o que fazer.


Novos Desafios…

September 27, 2009

… na Globo.com!

Desde o início do mês estou fazendo parte de um novo time. Trata-se do Time Beta (Peleteiro, Meyer, Cainã Nunes e eu), responsável pelo desenvolvimento de novos produtos (ou novas versões de produtos existentes). Nosso primeiro produto é o Baixatudo, cujo release inicial já está no ar. Consideramos esse release uma versão bem básica do produto. Temos muito trabalho ainda pela frente e esperamos nos próximos releases entregar um produto cada vez melhor.

O lado ruim dessa mudança é sair do time de webmedia, onde tive a oportunidade de trabalhar com pessoas fodas e aprendi bastante! Nesse tempo que estive lá, trabalhamos em projetos bem interessantes. Além disso, acredito que tivemos algumas evoluções significativas, como:

  • Melhor preparação do backlog, envolvendo os especialistas de UX junto com o PO para deixar as histórias prontas pro time implementar (ainda há muito que melhorar nisso, mas acredito que foi dado um importante primeiro passo). Mais sobre isso em um post que já está tempo demais no meu drafts;
  • Cultura de deixar bem explícito os problemas que estamos enfrentando, com dados concretos, mostrando os impactos no projeto;
  • Grande preocupação com práticas ágeis como programação em par, desenvolvimento outside-in, TDD, BDD, integração contínua, etc. Sempre feito de forma pragmática, ou seja, focado em melhorar o desempenho do time e não por se tratar da última moda.

Por outro lado, no novo time estou bastante empolgado pois volto a exercer um papel mais de desenvolvimento. Tenho certeza que vou aprender e evoluir bastante e espero poder contribuir para o sucesso dos nossos projetos.

Ah, não se esqueça, estamos contratando!


Dev in Rio 2009: Eu Vou!

August 30, 2009

No dia 14/09 vai rolar um evento aqui no Rio de Janeiro que promete ser um sucesso: Dev in Rio 2009. E, claro, eu não poderia deixar de estar presente. Organizado pelo meu amigo Guilherme Chapiewski e pelo Henrique Bastos, contará com a presença de grandes nomes nacionais e internacionais falando sobre Open Source, Java, Ruby on Rails, Django e Desenvolvimento Ágil.

Nos vemos lá!

Dev in Rio 2009


Scrum Gathering Brazil 2009

May 11, 2009

Nesta terça (12/05) e quarta (13/05) estarei no Scrum Gathering Brazil 2009. O evento promete, com apresentações de profissionais nacionais e internacionais.

O que rolar no evento vou postar aqui ou no meu twitter.


will_paginate sem carregar ActiveRecord

April 21, 2009

Update: A solução abaixo não é mais necessária. Criei um fork do will_paginate no meu GitHub com um pequeno patch que habilita o will_paginate mesmo quando não temos o ActiveRecord carregado (obviamente, só habilita as partes que não precisam do ActiveRecord).

Para instalar:

sudo gem install gcirne-will_paginate --source http://gems.github.com

Além disso, fiz um pull request para o mislav aplicar meu patch no repositório dele. Se ele aceitar, teremos essa modificação na gem oficial do will_paginate.

Segue o post original.

O will_paginate é uma excelente gem para fazer paginação no Rails. Por default, ela pagina models do ActiveRecord. Mas também é possível paginar qualquer coleção. Basta usar o método create da classe WillPaginate::Collection.

Em aplicações Rails é possível não carregar determinados componentes do framework que não serão utilizados. Por exemplo, com a linha abaixo no arquivo config/environment.rb desabilitamos o ActiveRecord na nossa aplicação:

Rails::Initializer.run do |config|
  ...
  config.frameworks -= [ :active_record ]
  ...
end

Porém, com essa configuração o will_paginate não funciona, dando o seguinte erro:

undefined method `will_paginate'

Isso ocorre porque, ao carregar, o will_paginate insere alguns métodos em ActiveRecord::Base. Quando o ActiveRecord não está presente, o will_paginate simplesmente não carrega.  Isso é, no mínimo, estranho, já que o will_paginate funciona perfeitamente sem o ActiveRecord. Seria de se esperar que o will_paginate, nessa configuração sem ActiveRecord, carregasse normalmente, porém sem os métodos inseridos em ActiveRecord::Base (obviamente). Mas não é isso que ocorre, como podemos ver na linha abaixo no arquivo lib/will_paginate.rb da gem do will_paginate, responsável por habilitar o will_paginate:

...
if defined?(Rails) and defined?(ActiveRecord) and defined?(ActionController)
  WillPaginate.enable
end

De qualquer forma, a solução é bastante simples. Basta fazer a chamada a WillPaginate.enable_actionpack no arquivo config/environment.rb que tudo funcionará normalmente:

Rails::Initializer.run do |config|
  ...
  config.frameworks -= [ :active_record ]
  ...
  config.gem 'mislav-will_paginate',
    :lib => 'will_paginate', :source => 'http://gems.github.com', :version => '2.3.8'
end

WillPaginate.enable_actionpack

InfoFundos

March 23, 2009

Está no ar o InfoFundos, um site onde é possível acompanhar as rentabilidades de todos os fundos de investimento do mercado financeiro brasileiro. Mas este post não é sobre o site em si, e sim sobre o seu desenvolvimento.

O site é um projeto pessoal desenvolvido por mim com ruby e rails. O legal deste tipo de trabalho solo é a possibilidade de experimentar ideias, práticas, técnicas, etc.

Como não poderia deixar de ser, o desenvolvimento seguiu – e continua seguindo – os princípios e valores dos métodos ágeis. Ou seja, o site está sendo desenvolvido de forma incremental e evolutiva. A ideia é ir colhendo feedback para evoluir continuamente. Cada funcionalidade é desenvolvida da forma mais simples que poderia funcionar (simplest thing that could possibly work), com refactoring constante para deixar o código o mais limpo possível.

Uma técnica que pude usar desde o início e que ajuda a garantir a aplicação dos princípios e valores acima é o desenvolvimento outside-in sugerido pelo BDD. Cada funcionalidade é descrita por uma feature do cucumber guiada por selenium. Um passo dessa feature é escrito e, obviamente, ele falha. Então é preciso escrever apenas código suficiente para fazer este passo passar. Para isso, escrevo um spec com rspec e depois apenas o código necessário para este spec passar. Continuo assim sucessivamente, escrevendo specs e código, de fora para dentro, ou seja, das camadas mais externas até as mais internas, até que o passo esteja passando. Então, repito o ciclo continuando com o próximo passo até que toda a feature esteja passando. O ciclo completo seria algo mais ou menos assim:

feature > step > spec > implementação para spec passar > repete spec e implementação até step passar > repete step até feature passar

No final, tenho uma funcionalidade totalmente coberta por testes de aceitação com cucumber/selenium e com 100% de cobertura com rspec. Isso ajuda a garantir um código limpo, podendo ser refatorado e evoluído com bastante segurança.

Tenho diversas ideias de funcionalidades futuras para o InfoFundos e, certamente, qualquer assunto relacionado ao seu desenvolvimento será postado aqui.


Impressões da Retrospectiva Baseada em Feedback

January 27, 2009

Fizemos nossa primeira retrospectiva baseada em feedback e o resultado foi muito positivo. Acredito que conseguimos criar um ambiente de muita confiança. Todos se sentiram bem a vontade para dar e receber feedback.

Um ponto interessante que notei é que muitos comentários que normalmente ficavam guardados foram expostos de forma franca, sem que houvesse qualquer tipo de sentimento negativo de quem recebia o feedback.

Outro ponto é que eu, como Scrum Master, e o nosso Product Owner participamos normalmente. É importante que haja transparência e confiança entre todos – independente do papel que cada um exerce – já que no final das contas todos nós somos responsáveis pelo sucesso dos produtos que criamos.

O resultado de uma retrospectiva como essa é que fica bem claro para todos como nossas atitudes e ações ajudam ou atrapalham nosso trabalho em equipe. As pessoas saem realmente motivadas a melhorar. Certamente vamos repetir esse tipo de retrospectiva daqui pra frente.


Retrospectiva Baseada em Feedback

January 13, 2009

A reunião de retrospectiva ocorre ao final de cada iteração de um projeto ágil. A idéia é o time avaliar o que não está funcionando bem de forma a melhorar dali para frente. Trata-se da melhoria contínua do processo, através do ciclo de inspecionar e adaptar (inspect and adapt).

Existem diversas formas de se fazer uma reunião de retrospectiva. É interessante que a dinâmica dessa reunião seja alterada com uma certa frequência, para que não fique monótona para os participantes, o que poderia diminuir seus benefícios.

Ontem e hoje participei de um treinamento de RH. Para quem acha que esse tipo de evento é uma perda de tempo, sugiro rever seus conceitos. Fizemos uma atividade onde tínhamos que dar feedback uns para os outros. Isso me deu uma idéia para minha próxima retrospectiva.

O que fizemos na atividade (e vamos fazer na retrospectiva) é o seguinte. Cada um lista alguns pontos positivos e negativos sobre si mesmo. Uma pessoa por vez lê os seus pontos e depois só escuta enquanto as demais vão dando feedback sobre eles podendo, inclusive, acrescentar novos pontos. Prossegue-se até que todo mundo tenha dado e recebido feedback de todos os outros.

A grande sacada é a forma de dar o feedback. O que deve ser feito é ilustrar cada ponto com exemplos concretos em situações específicas de quando eles ocorreram. Não se deve fazer um julgamento pessoal do ponto em questão mas sim, no lugar disso, devem ser destacadas as suas consequências observáveis. Dessa forma, a pessoa recebendo o feedback consegue perceber mais claramente como seus comportamentos e atitudes influenciam positiva ou negativamente nas demais pessoas e nos resultados do time e, com isso, fica mais aberta a mudanças.


Retrabalho Não Combina Com Equipes Ágeis

January 9, 2009

Retrabalho significa jogar tempo, dinheiro, etc. fora. Certamente, ninguém quer isso. Para tentar evitar esse retrabalho, normalmente a solução proposta envolve especificar “bem especificado”, planejar “bem planejado”, tudo com muita antecedência. É a velha muscle memory agindo. Sabemos que isso não funciona. Simplesmente porque é impossível prever o futuro.

A solução que eu acredito funcionar é aplicar as práticas de XP. E não basta aplicar uma ou outra, temos que aplicar todas. Juntas elas promovem uma sinergia que não existe quando são utilizadas de forma isolada.

Práticas como TDD, refactoring, integração contínua, programação em par, cliente presente, sentar-se junto, design incremental garantem uma base de código saudável, com design simples. Com isso o custo de mudança permanece constante ou mesmo pode cair com o tempo.

Kent Beck viu em muitos times XP que ao longo do tempo os sistemas desenvolvidos por esses times ficavam cada vez mais flexíveis e fáceis de mudar ao invés do que estamos mais acostumados a ver, que são aqueles sistemas legados cujo custo de mudança cresce exponencialmente com o tempo. Tal afirmativa pode parecer ir contra o senso comum mas faz todo o sentido quando temos as práticas do XP aplicadas corretamente.

O custo de um time XP competente é inegavelmente alto. Mas compensa no longo prazo por permitir que sistemas não precisem ser reescritos do zero a cada x anos. Além disso, outros motivos existem para se ter um time competente. Por exemplo, evitar o custo dos Net Negative Producing Programmers. Ou seja, na minha opinião vale a pena pagar pelos melhores.

Tenho vendido a idéia de que se uma equipe ágil está funcionando bem, nunca haverá retrabalho e sim, simplesmente, trabalho.