March 4th, 2010
Continuando os relatos sobre imersão Agil da Agence, essa semana estamos trabalhando em provas de conceito para desenvolver orientado a testes (TDD) em PHP. Como acontece com Ruby (Linguagem) + Rails (Framework), partimos para a premissa de utilizar um framework PHP, no caso, o que estamos mais usando por aqui que é o
CakePHP.
Para nossa “sorte” o Cake já tem algumas facilidades para implementação de testes no estilo xUnit, usando o framework SimpleTest, que é uma mistura de JUnit com JWebUnit permitindo tanto a implementação de testes de unidade/integração como testes funcionais/aceitação simulando comportando do Browser.
O código-fonte produzido está disponível no GitHub, e em breve vamos escrever alguns artigos explicando melhor como foi a experiência. Mas, como sempre, feedbacks já são muito bem vindos!
Fica algumas boas referências de sites e blogs sobre o assunto:
- KISS: blog muito movimentado sobre TDD em CakePHP, em PT-BR!
- Debuggable: empresa especializada em desenvolvimento em CakePHP, acredito que alguns componentes de teste foram desenvolvidos por eles.
- Mark Story: blog dedicado a CakePHP e assuntos relacionados.
- Testes automatizados no CakePHP: excelente apresentação sobre TDD em CakePHP.
Tags: Agence, Agile, Agile Adoption, BDD, CakePHP, github, JUnit, JWebUnit, PHP, SimpleTest, TDD, Teste de Software
Posted in
Agence, Agile, PHP |
No Comments »
March 3rd, 2010
Dando continuidade aos relatos da imersão Ágil na Agence, nosso colega Fernando Cezar publicou no Geeks Anônimos um artigo explicando (e ilustrando) como estamos usando Kanban (e SCRUM??) em projetos 12 projetos de manutenção. Aproveite e deixe seus comentários sobre o tema, o feedback da comunidade é muito importante.
Tags: Agence, Agile, Agile Adoption, Fernando Cézar, Geeks Anônimos, Kanban, Scrum
Posted in
Agence, Agile |
No Comments »
March 2nd, 2010
Estou começando a usar Git de verdade em um projeto da Agence e já de início me deparei com uma situação que o SVN não atenderia. Estamos desenvolvendo uma prova de conceito e ainda não está pronto para enviar ao servidor central, porém, gostaria de compartilhar minha versão com outro desenvolvedor que seguirá uma linha diferente da minha.
Com o SVN, enviaria pra ele um .zip do meu projeto, mas como estamos usando um DCVS podemos fazer isso com os recursos do Git. Primeiramente, devo rodar um processo na minha máquina que permitirá outra pessoa dentro da mesma rede acessar meu repositório usando o protocolo git. Existem outras opções para compartilhar repositórios, veja aqui mais detalhes. Para iniciar o git-daemon usei o comando abaixo:
git daemon --verbose --export-all --enable=upload-pack --enable=receive-pack --base-path=/Users/sauloarruda/Projetos/Users/sauloarruda/Projetos/sauloarruda.eti.br/libres/libres-php/.git
E o outro desenvolvedor simplesmente usou o comando abaixo para clonar meu repositório. O legal nesse caso é que ele consegue pegar minhas atualizações com git pull, mas quando ele faz um commit as mudanças não são feitas no meu repositório.
git clone git://172.20.12.180/sauloarruda.eti.br/libres/libres-php/.git
Referências:
Tags: CVS, DCVS, git, SVN
Posted in
Drops |
1 Comment »
February 28th, 2010
Nos dias 22 a 25 de Junho de 2010 acontecerá em Porto Alegre um grande evento dedicado ao tema Agile, o Agil Brazil 2010. As submissões de palestra tiveram seu prazo aumentado para dia 07/03 pelo site http://submissoes.agilebrazil.com/. Submeti a palestra abaixo e estou na torcida pela aprovação! Aproveite e deixe seus comentários, será de grande valia!
Em 6 meses de imersão ágil o que mudou?
Público alvo
Desenvolvedores e testadores, gerentes de projeto, executivos, entusiastas e iniciantes em métodos ágeis, quem mais tiver interesse!
Resumo
Começamos o ano de 2010 com um desafio: reverter o cenário de baixa produtividade e desmotivação da equipe que estava pairando no ar. Após várias discussões entre as pessoas chave da equipe bolamos um plano e entramos de cabeça em um projeto de agile adoption. Este trabalho mostra os principais resultados e dificuldades deste processo.
Descrição completa
No final de 2009, iniciamos uma reforma na unidade de Campo Grande da Agence. Literalmente o teto caiu e passamos grandes dificuldades com a chuva diária no chão do escritório. A reforma está construindo um segundo andar na nossa sede, mas como todos sabemos, não é nada agradável “morar” em uma casa em reforma.
Além disso, nossa equipe estava pecando no quesito qualidade e prazo em alguns projetos, o que gerou um descrédito por parte da diretoria da empresa. No final do ano, tivemos o desligamento de 3 profissionais, além da insatisfação com as dificuldades no ambiente de trabalho e projetos.
Nesse contexto, reunimos as pessoas chave da equipe e após várias discussões bolamos um plano para adotar desenvolvimento ágil como uma forma de motivação da equipe e melhoria no produto desenvolvido.
O plano abrange 6 meses a começar a partir de janeiro de 2010 e têm metas bastante agressivas que envolve várias mudanças na forma de trabalho, além de sessões semanais de treinamento (tech thursday) e vários finais de semana dedicados à estudos.
A proposta deste trabalho é mostrar nossa experiência na adoção de métodos ágeis em uma equipe de 20 pessoas que trabalha com vários tipos diferentes de projetos: novos sistemas, manutenção e pesquisa & desenvolvimento.
O plano prevê adoção da técnica pomodoro, SCRUM, Behavior Driven Development (BDD), Domain Driven Design (DDD) e Programação em Pares. Ufa! Continuamos com a mão na massa e já estamos colhendo resultados desse trabalho e gostaríamos muito de compartilhar essas experiências com a comunidade.
Mecânica/Processo
Apresentação de slides seguindo a Agenda abaixo:
- Como estávamos no final de 2009?
- Qual nosso plano?
- 1º mês: Pomodoro
- 2º mês: Scrum
- 3º mês: Behavior Driven Development
- 4º mês: Domain Driven Design
- 5º mês: Pair Programming
- 6º mês: E agora?
- Conclusões e resultados
Benefícios
Durante esses 6 meses de projeto, estamos publicando vários artigos, no blog da empresa e individuais, com o objetivo de trocar idéias e mostrar como estamos buscando melhorar nossa forma de trabalho. Acredito na importância da apresentação dessas experiências em um evento dedicado ao assunto, que permitirá excelente troca de idéias com pessoas que também tem os mesmos interesses
Experiência com o assunto
Venho estudando métodos ágeis há pelo menos 3 anos e já aplicando algumas práticas na Agence, que tem um processo mais próximo do “OpenUP”. Já ministrei treinamentos em diversas áreas sempre divulgando métodos ágeis e pregando boas práticas de engenharia e já dei consultoria em algumas empresas para MPS nas áreas de gerenciamento de projetos e requisitos, baseado nos modelos MPS.br e CMMi.
Tags: Agence, Agile, Agile Adoption, Agile Brazil, BDD, Campo Grande, CMMI, DDD, Evento, eXtreme Programming, MPS, MPS.br, OpenUP, Pair Programming, Porto Alegre, Scrum
Posted in
Agence, Agile, Drops, Eventos |
4 Comments »
February 24th, 2010
Estou trabalhando em uma prova de conceito usando Rails e me deparei com uma situação muito comum no dia-a-dia de desenvolvedores: Implementar um auto-complete que no banco de dados refere-se a um relacionamento has_and_belongs_to_many. No meu caso, a tela se parece com algo assim:

Nesse exemplo, o campo Authors permite que conforme você vá digitando, ele abre sugestões de autores já cadastrados no banco de dados. Permite também que você separe vários autores por vírgula e cadastra os autores que não existem ainda no banco de dados.
A implementação do controller nesse caso, usa o componente Autocomplete.Local do Script.aculo.us que não é muito complicado de ser usado e inclusive já vem de brinde com o Rails. Se você quer saber mais detalhes sobre isso, dá uma olhada no arquivo app/views/books/_authors.html.erb. O que vejo ser mais complicado nesse exemplo é a implementação do model Book que deve ter uma lista de autores.
Neste momento você deve estar se perguntando: Mas não tem nada complicado nisso! Eu simplesmente vou receber um parâmetro param[:book][:authors_s] e chamar o método split(",") para obter um array de nomes de autores e chamar o método Author.find_or_create_by_name(author_name) para criá-lo.
E eu respondo: Exatamente! Sua solução está perfeita. Mas tenho uma pequena pergunta: Onde esse código será colocado? [ ] Na classe books_controller no método create. [ ] Na classe book.
Tendenciosa minha pergunta, não? Se você pensar um pouco e lembrar das palestras sobre MVC na hora você responde “Na classe book”. Mas o primeiro instinto é implementar no controller, inclusive já vi centenas de códigos em Rails cometendo exatamente esse erro. Lógica de negócio deve ficar em objeto de negócio (ou de domínio se você preferir) e não no controller.
Logo, no nosso caso, o código da classe Book ficaria algo parecido com isso (repare que o campo Tags, logo abaixo do campo Authors, tem o mesmo comportamento):
O objetivo do código acima é permitir que um objeto da classe Book seja instanciado no controller desta forma:
Vamos dissecar um pouco mais o código:
- Na view, fazemos um bind para o atributo book.authors_s, que é uma representação string do objeto authors criada por nós:
<%= f.text_field :authors_s %>. Logo, o parâmetro params[:book][:authors_s] no exemplo seria "Kent Beck, Martin Fowler".
- Declarar o atributo authors com o comando:
has_and_belongs_to_many :authors, :join_table => "books_authors" permite que a classe receba um array de objetos da classe Author como o parâmetro :authors. Logo, temos que converter o atributo authors_s para o atributo authors, lembrando da necessidade de gravar os autores novos no banco de dados.
- Para resolver esse problema, implementei alguns callbacks:
- O primeiro no método before_save que faz o algoritmo que falamos anteriormente (
split + find_or_create_by_name). Desta forma, os autores novos só serão gravados caso o objeto book seja válido (before_save só é chamado após a validação).
- O segundo no método after_find que carrega o atributo authors_s com os valores do atributo author. Desta forma, permite a edição de livros.
Naturalmente é possível fazer algumas melhorias no código, mas a idéia que gostaria de apresentar é essa. Sinta-se à vontade para baixar o código completo no githut e deixar seus comentários/dúvidas/sugestões/críticas abaixo.
Updated 25/02: Meu amigo e co-worker Rodrigo Toledo me deu várias dicas sobre como este exemplo pode ser implementado, inclusive resolvendo alguns bugs que ficaram pra trás. Resumo das alterações:
- Retiramos o controller “autocomplete_controller” incluindo a lógica no helper e simplesmente imprimindo um json na view para auto completar os campos tags e authors.
- Alteramos a lógica do model book.rb para usar os callbacks after_find e before_save para fazer o bind da string separada por vírgulas para um array.
- Pequena alteração para não usar eval no método Book.array_to_string conforme o comentário.
Todo o código já está comitado no github e já fiz as alterações nos pasties mostrados no artigo.
Tags: ActiveRecord, auto-complete, Domain Driven Design, github, Libres, Receita, Ruby on Rails
Posted in
Drops, Receitas, Ruby on Rails |
1 Comment »
February 23rd, 2010
Há alguns dias postei sobre o uso da Técnica Pomodoro na Agence. Hoje o Lucas Souza iniciou uma discussão no InfoQ sobre o “mérito” do uso da técnica para troca de idéias dos entusiastas e dos céticos. Estamos participando, vejo vocês lá!
Tags: Agence, Agile, InfoQ, Lucas Souza, Pomodoro, Produtividade
Posted in
Agile, Drops |
No Comments »
February 18th, 2010
Estou trabalhando com uma prova de conceito usando Webrat e Cucumber para testes de aplicações CakePHP (em breve renderá um artigo) e me deparei com o seguinte problema:
Quando rodo os testes usando o comando “cucumber” recebia a seguinte warning:
!!!!! DEPRECATION NOTICE !!!!!
The WWW constant is deprecated, please switch to the new top-level Mechanize
constant. WWW will be removed in Mechanize version 2.0
You've referenced the WWW constant from /opt/local/lib/ruby/gems/1.8/gems/webrat-0.7.0/lib/webrat/adapters/mechanize.rb:43:in `mechanize', please
switch the "WWW" to "Mechanize". Thanks!
Sincerely,
Pew Pew Pew
Consultando o changelog do Mechanize, a versão 1.0.0 deprecia o uso do módulo WWW, que ainda não foi atualizado no Webrat. Para resolver o problema basta instalar a versão anterior do Mechanize (0.9.0) usando o comando:
sudo gem install mechanize --version '= 0.9.0'
E dizendo no arquivo env.rb para usar a versão 0.9.0 conforme abaixo:
require 'rubygems'
gem 'mechanize', '= 0.9.0'
Tags: BDD, Bugs, CakePHP, Cucumber, Mechanize, PHP, Ruby, Teste de Software, Webrat
Posted in
Bugs, Drops, PHP, Ruby on Rails |
2 Comments »
February 10th, 2010
Venho estudando um framework para Behavioral Driven Development chamado Cucumber e me impressionado com a facilidade e clareza que a atividade de implementar testes automatizados vem se tornando. Para quem quiser saber mais sobre Cucumber, antes mesmo de continuar essa leitura, recomendo consultar esses links:
O foco deste, é apresentar minha experiência em usar o Cucumber integrado com o Selenium e mostrar um exemplo de como é simples implementar testes funcionais. Para começar, leia essa documentação que explica como configurar seu ambiente. Se você usa MacOS Snow Leopard (10.5) deve passar pelos mesmos problemas que eu tive e que encontrei a solução neste link.
A idéia central é escrever estórias para teste de telas (caixa preta). Disponibilizei no github o código-fonte da aplicação em Rails que está sendo testada e de outra aplicação, somente Ruby, usando Cucumber + Selenium. Para demonstrar o uso do Selenium, escolhi um cenário bastante simples, trata-se de um história de autenticação de usuários:
Perceba que nos preocupamos em escrever a história o mais “User Friendly” possível. Isso facilita bastante o entendimento sobre o que você está de fato testando e o que o seu usuário (ou cliente) acha que você deveria testar. E, como você já deve saber, as palavras-chave “dado”, “quando” e “então” representam ações que são implementadas em Ruby. Para começar, configuramos no arquivo support/env.rb o ambiente da API para Selenium em Ruby criando uma instância da classe Selenium::SeleniumDriver.
No arquivo support/paths.rb configuramos o mapeamento de nome de páginas para URIs e também de label de campos para o nome do campo no formulário HTML. Os métodos path_to, field_for e button_for fazem essas funções.
OK, concordo com vocês que essas funções não fazem lá muita coisa, mas lembre-se que estamos fazendo o nosso primeiro caso de teste, tenha certeza que serão úteis no futuro próximo. Um exemplo que eu já posso citar foram os testes que implementamos para testar uma aplicação, na verdade um portal, desenvolvido em Drupal, onde o “label” dos campos não era nem um pouco parecido com o nome (do componente HTML) do campo. Lembrando que as histórias tem de ficar o mais próximo possível da taxonomia (ou idioma) do seu usuário.
Agora, vamos à parte que interessa, de fato a implementação dos passos descritos nas estórias. Criei o arquivo step_definitions/common_steps.rb contendo os passos mais comuns que você deverá usar na maioria de suas estórias. Para passos específicos de determinada história, recomenda-se criar um outro arquivo no diretório step_definitions com o nome da estória.
O exemplo é bastante simples, e a aplicação Rails do github contém uma implementação bastante simples do que está sendo testado. Para executar, basta usar o comando “cucumber” na raiz do projeto de testes. Lembrando que você deve iniciar o servidor do Selenium usando o comando “selenium” (isso funcionou pra mim após instalar o Selenium RC).
Se você tiver dúvidas ou problemas na execução do exemplo, fique à vontade de postar nos comentários que farei o possível para tentar ajudar. E, por hora ficamos por aqui. Em breve devo postar alguns exemplos de passos mais complexos como uso de tabelas e/ou editores ricos. Estamos trabalhando nisso agora!
Tags: Agile, BDD, Cássio Marques, Cucumber, eXtreme Programming, Jefferson Girão, MacOS, RSpec, Ruby on Rails, Selenium, TDD, Teste de Software, Urubatan
Posted in
Agile, Artigos, Ruby on Rails |
No Comments »
February 5th, 2010
Há mais ou menos duas semanas temos usado na Agence a técnica Pomodoro. Como vocês já devem saber, a técnica objetiva aumento da produtividade para trabalhos que exigem esforço intelectual, ou, em outras palavras, para quem usa a cabeça. Serve como uma luva para estudo e desenvolvimento de software!
O princípio básico da técnica é dedicar 25 minutos de puro trabalho com 5 minutos de descanso. Isso é o que se chama 1 (um) “Pomodoro”. Após 4 Pomodoros você faz uma pausa maior. A apresentação que usei para apresentar a técnica aqui na Agence está disponível no slideshare. Além disso, tem um livro gratuito escrito pelo autor da técnica, Francesco Cirillo.
Nossa experiência até o momento tem sido bastante produtiva. Estamos usando fichas pautadas 4” x 6” para registrar diariamente e no fim da semana o estagiário lança as atividades em um sistema que ele mesmo fez. Estamos trabalhando em alguns relatórios para avaliar, principalmente, a constância da equipe. Provavelmente usaremos um gráfico de controle pra isso.
Por enquanto é isso que temos a dizer. Assim que as coisas começarem a fazer mais sentido pra gente, vou postando aqui as experiências.
Tags: Agence, Agile, Gestão, Gráfico de Controle, Pomodoro, Produtividade, Scrum, Slideshare, Treinamento
Posted in
Drops |
1 Comment »
November 10th, 2009
Ontem estive em Coxim/MS a convite da UFMS para ministrar uma palestra falando de mercado Java na Semana de Sistemas de Informação. Apesar da viagem ter sido um pouco cansativa fiquei bastante satisfeito com a recepção e com a participação dos alunos, que fizeram várias perguntas de grande relevância.
Após a palestra participei de uma mesa redonda com os professores Karen, Alfredo e Jane para discussão de temas relacionado a tecnologia e como os alunos podem escolher suas especialidades após formados e entrar no mercado de trabalho.
Parabéns ao pessoal da organização e bom restante de semana de sistemas da informação para os alunos!
Updated in 18/11: Fotos disponíveis em http://www.cpcx.ufms.br/semanasi2009/?page_id=120.
PS: Coloquei os slides no SlideShare abaixo para consultas aos links, downloads, etc.
Tags: Coxim, CPCX, Java, Mato Grosso do Sul, UFMS
Posted in
Drops, Eventos, Java, Palestras |
No Comments »