Entendendo MapReduce

Sabemos que ter um bom modelo de banco de dados relacionais é importante, porém com a necessidade de aplicações mais escaláveis nos dias atuais, talvez você precise “desnormalisar” o seu banco de dados. O que adiantaria uma foreign key se você tem tabelas espalhadas em diversos data sources? Por questões de performance, dados podem ser distribuídos em data centers distintos, então como buscar pelo id se você não sabe onde está esse dado? Por isso é importantíssimo que a aplicação controle essa integridade, com um bom design OO, para não depender de constraints e stored procedures do banco de dados.

MapReduce é um modelo de programação, e framework introduzido pelo Google para suportar computações paralelas em grandes coleções de dados em clusters de computadores. Agora MapReduce é considerado um novo modelo computacional distribuído, inspirado pelas funções map e reduce usadas comumente em programação funcional. MapReduce é um “Data-Oriented” que processa dados em duas frases primárias: Map e Reduce. A filosofia por trás do MapReduce é: Diferentemente de data-stores centrais, como um banco de dados, você não pode assumir que todos os dados residem em um lugar central portanto você não pode executar uma query e esperar obter os resultados em uma operação síncrona. Em vez disso, você precisa executar a query em cada fonte de dados simultaneamente. O processo de mapear a requisição do originador para o data source é chamado de ‘Map’, e o processo de agregação do resultado em um resultado consolidado é chamado de ‘Reduce’.

Hoje existem diversas implementações de MapReduce, como : Hadoop, Disco, Skynet, FileMap e Greenplum. Hadoop é a implementação mais famosa implementada em Java como um projeto open source.

Se você quer contribuir nesse projeto, assista esse screencast.

Scaffolding para aplicações baseadas em Spring

Vejam a tradução da notícia que saiu no Infoq Brasil sobre o tema aqui

A nova funcionalidade de geração (scaffolding) do Spring MVC pela ferramenta  Skyway Builder Community Edition (CE) permite os desenvolvedores gerar os modelos de domínio (domain model) e uma aplicação CRUD em Java, baseado no Spring. Classes de Testes JUnit também são automaticamente gerados pela ferramenta. Skyway builder ajuda desenvolvedores Java nas seguintes areas da aplicação web.

Camada de dados:

  • Modelagem de dados
  • Queries Nomeadas (Named Queries)
  • Java Persistence API (JPA) incluindo Hibernate, JPQL and SQL.

Camada Service:

  • Modelagem de Serviços
  • Operação de Queries(Operation Queries)
  • Modelagem de Action
  • Composição de Serviços(Composite Services)

Camada Web:

  • Modelagem de Controllers Web
  • Modelagem de Conversação
  • Modelagem de Action
  • Desenvolvimento AJAX

Além de integração com o Maven.

Práticas de Testes – Parte 1

Alguns dias atrás fiz uma tecnical session na empresa que trabalho, Bluesoft, sobre práticas de testes para projetos java utilizando ferramentas em Ruby. Como existem desenvolvedores Java que não conhecem as ferramentas de teste do Ruby, essa sessão foi apenas para demonstrar o funcionamento básico de ferramentas como Cucumber e Rspec. Posteriormente pretendo apresentar coisas mais avançadas dessas ferramentas.

A apresentação se baseou nos tópicos:

  1. TDD
    • É uma prática de desenvolvimento que envolve escrever o código antes de ser testado. Escrevendo um pequeno teste de um código que ainda não exista. Rodar o teste e, naturalmente, falhar. Agora escreva apenas o suficiente para fazer o teste passar. Quanto estiverem passando, observe o resultado do design e refatore para remover alguma duplicação que você vê.
  2. BDD
    • O problema é testar o que o objeto é, e não o que ele faz. O que ele faz é significamente mas importante. Pense no nível de aplicação, como se você estivesse falando com uma pessoa de negócio. Exemplo:“Um cliente deve realizar um pedido” ou “o pedido deve ser guardado em um banco de dados relacional ANSI-compiant”
  3. Cucumber
    • Uma ferramenta BDD  que lê textos puros que descreve as caracteristicas da aplicação, com exemplos em cenários, e usa os passos desse cenário (step definitions) para automatizar a interação com o código sendo desenvolvido. Os cenários são parseados e tratados como códigos reais, proporcionando benefícios inestimáveis como acompanhar os passos pelos textos, e suporte a múltiplos idiomas.
  4. Rspec
    • Framework Behaviour Driven Development para Ruby. Foco no comportamento. Descreve o comportamento em um nível muito mais granular.
  5. Webrat
    • Teste de aceitação para aplicações Web em Ruby. Um simulador de Browser. 
  6. O que tem a ver?
    • Programadores Java devem estar se perguntando: O que todas essas ferramentas tem a ver comigo?
    • Conhecer várias linguagens nos torna melhores programadores.
    • As ferramentas em ruby podem ser utilizada em projetos Java graças ao JRuby.
    • Existem plugins do Maven para facilitar essa integração. E você pode ajudar a desenvolvê-los. Como esse aqui.
  7. JRuby
  8. Demo. A seguir os passos executados na apresentação:
  • Criar um projeto Maven no Eclipse chamada “biblioteca”
  • No diretório raiz do projeto digitar os comandos:
    • jruby -S rails .
    • jruby -S script/generate cucumber
    • jruby -S script/generate rspec
  • Como será utilizado Rspec, a pasta test pode ser removida
  • Criar o arquivo /features/funcionario_manipula_livros.feature
  • Editar esse arquivo com o conteúdo:


Feature: funcionario manipula os livros
   Como um funcionário
   Eu quero cadastrar um livro
   E quero relacionar livros do mesmo genero
   Scenario: cadastrar um livro
      Given um livro novo
      When eu entro no cadastro
      Then eu deveria cadastrar ele
      And o sistema deveria dizer "Livro cadastrado com sucesso"

  • Executar o comando  abaixo para mostrar os passos pendentes
    • jruby -S cucumber features -n
  • Observe o retorno. O que está em amarelo é um passo pendente para ser implementado:


Feature: funcionario manipula os livros
    Como um funcion#rio
    Eu quero cadastrar um livro
    E quero relacionar livros do mesmo genero
    Scenario: cadastrar um livro
        Given um livro novo
        When eu entro no cadastro
        Then eu deveria cadastrar ele
        And o sistema deveria dizer "Livro cadastrado com sucesso"

1 scenario
4 steps pending (4 with no step definition)

  • Executar comandos git
    • git init
    • git add -A
    • git commit -a -m “Importe inicial do projeto”

Por enquanto só foi preparado o ambiente para a Demo. Em breve colocarei a segunda parte desse post com a implementação do Sistema de Biblioteca usado na apresentação. Os slides apresentados podem ser visualizados aqui: RSpec-Cucumber