Posts de ‘Guilherme Cirne’

[Guilherme Cirne] Novos Desafios

Sunday, December 21st, 2008

É com muito orgulho que digo que há 2 semanas eu assumi o papel de Scrum Master da equipe onde trabalho na Globo.com, no lugar do Guilherme Chapiewski. O GC continua na empresa, com novas atribuições, mas isso cabe a ele dizer.

Posso dizer que estou bastante empolgado, mas também um pouco ansioso, com os novos desafios que vou enfrentar. Felizmente estou contando com bastante ajuda do GC além da excelente equipe com quem trabalho desde que entrei na empresa: Anselmo Alves, Bruno Carvalho, Cainã Nunes, Flávio Arioza, Leonardo Burlamaqui, Leonardo Quixadá, Tiago Motta e Vitor Pellegrino. Também posso contar com o apoio da outra excelente equipe de WebMedia, liderada pelo Marcello Azambuja: Biriba, Bruno Souza, Diogo Kiss, Juan Carlos Castro y Castro, Rafael Pereira, Tiago Mello, Tiago Peczenyj, zED.

Espero conseguir fazer um excelente trabalho!

[Guilherme Cirne] Priorização de Histórias

Sunday, December 7th, 2008

Nos métodos ágeis, o Cliente ou Product Owner deve priorizar as histórias que serão desenvolvidas de forma a maximizar o Return On Investment (ROI).

Vamos supor dois cenários de projeto diferentes. Num, o cliente estipula uma data limite para o release do projeto mas não podemos prever quais histórias estarão prontas até lá. No outro, o cliente define o conjunto mínimo de histórias necessário para o release mas não temos como saber quando elas estarão prontas.

No primeiro cenário é bem claro qual a vantagem em priorizar as histórias. Quando chegar a data limite para o release, o time terá desenvolvido as histórias que agregam o maior valor para o cliente. Ficará de fora aquilo que é menos importante.

No segundo cenário poderia se argumentar que a priorização não é importante. Como todas as histórias serão desenvolvidas de qualquer maneira, tanto faz a ordem. Mas isso não é verdade. A priorização nesse cenário é tão importante quanto no anterior.

Em primeiro lugar, a decisão de só fazer o release quando o conjunto de histórias estiver pronto pode mudar. Por exemplo, pode surgir um novo projeto, mais importante, e se decidir por fazer o release com o que estiver pronto. Nesse caso, é importante que o que estiver pronto seja o que agrega mais valor.

Além disso, mesmo que a estratégia inicial seja mantida e o produto só seja lançado quando o conjunto de histórias estiver todo pronto, a priorização é importante para manter o foco no problema que se quer resolver com o produto. Isso ajuda a definir claramente para todos os envolvidos qual a visão para o produto.

[Guilherme Cirne] Falando em Agile 2008

Wednesday, October 22nd, 2008

Nesta quinta e sexta-feira (23 e 24/10/2008) estarei em SP para o Falando em Agile, um grande evento sobre métodos ágeis. Organizado pela Caelum, contará com palestras de Guilherme Chapiewski, Phillip Calçado, Antônio Carlos Silveira e Danilo Bardusco, entre outros.

Certamente promete!

[Guilherme Cirne] Globo Vídeos no seu iPhone

Thursday, September 25th, 2008

Já está no ar uma versão do Globo Vídeos otimizada para iPhone em http://m.video.globo.com. Com direito a efeitos que os usuários deste aparelho já estão acostumados, como transições ao navegar de uma página para outra, e de girar o aparelho.

Graças aos métodos ágeis que usamos aqui na Globo.com, o site foi totalmente desenvolvido em 2 sprints de 2 semanas. Quando digo totalmente, foi desde a infraestrutura necessária para produzir vídeos até o site propriamente dito.

Me arrisco a dizer que é um dos melhores sites para iPhone existentes. Certamente merece todo o nosso respeito tecnológico!

Além disso, agora também é possível assistir no iPhone os vídeos disponíveis nas versões clássicas dos sites da Globo.com, como G1 e Globoesporte. Essa funcionalidade surgiu como um projeto pessoal da nossa equipe sendo lançado agora também.

O Guilherme Chapiewski fala mais em seu blog tanto sobre o Globo Vídeos Mobile quanto sobre os vídeos para iPhone nas versões clássicas dos sites Globo.com, inclusive com screenshots.

[Guilherme Cirne] Comando do ubiquity para busca no Globo Vídeos

Monday, September 8th, 2008

Está no ar um comando do ubiquity para busca no Globo Vídeos.

Para instalá-lo, primeiro é preciso ter o Firefox 3 com a extensão do ubiquity instalada. Depois, basta entrar na home do Globo Vídeos. Uma barra aparecerá no topo perguntando se você quer instalar o comando. É só selecionar a opção para instalar e depois confirmar na página de aviso que aparecerá.

Para usá-lo, é só invocar o ubiquity e digitar globovideos [palavra(s) a serem buscada(s)]. Uma nova aba será aberta com o resultado da busca no Globo Vídeos.

Esse tipo de comando é apenas o começo do que se pretende fazer com o ubiquity no futuro. Certamente é um conceito inovador que promete bastante.

[Guilherme Cirne] Implementando uma fluent interface para um webservice REST com method_missing

Sunday, July 13th, 2008

Nesse post vou mostrar como usar o method_missing do ruby para implementar uma fluent interface em um cliente de um webservice REST. Vamos supor um webservice imaginário com recursos que podem ser acessados nas seguintes URLs:

/recurso/id

/recurso/doTipo/algumTipo

Queremos que um cliente ruby para esse webservice forneça a seguinte fluent interface para acesso às URLs acima:


WebService.new.recurso(1).get

WebService.new.recurso.do_tipo(algumTipo).get

Uma maneira mais tradicional de se implementar esse cliente seria algo como:


require 'net/http'
require 'uri'

class WebService

  def initialize
    @url = String.new
  end

  def recurso(id = nil)
    @url << '/recurso'
    @url << "/#{id}" unless id.nil?
    self
  end

  def do_tipo(tipo)
    @url << "/doTipo/#{tipo}"
    self
  end

  def get
    response = Net::HTTP.get_response(URI.parse("http://localhost:8080#{@url}"))
    response.value
    response.body
  end

end

Repare que nos métodos recurso e do_tipo é retornado self, possibilitando o encadeamento dos métodos na fluent interface. No método get, response.value sobe uma exceção se o retorno do webservice for qualquer coisa diferente de 200 e response.body retorna o corpo do response.

Utilizando o method_missing a implementação fica bem mais simples e elegante:


require 'net/http'
require 'uri'

class WebService

  def initialize
    @url = String.new
  end

  def get
    response = Net::HTTP.get_response(URI.parse("http://localhost:8080#{@url}"))
    response.value
    response.body
  end

  def method_missing(metodo, *args)
    @url << "/#{camel_case(metodo)}"
    @url << "/#{args[0]}" if args.length > 0
    self
  end

  private

  def camel_case(metodo)
    primeira = true
    metodo.to_s.split('_').map {|palavra|
      if primeira
        primeira = false
        palavra
      else
        palavra.capitalize
      end
    }.join
  end

end

Uma característica interessante da implementação com method_missing é que ela serve para qualquer URL de qualquer recurso que já exista ou que venha a ser criada (obviamente isso só vale se houver a padronização entre a URL e a fluent interface).