É muito comum utilizarmos objetos diferentes que fazem mesma coisa, no entanto, de modo diferenciado… Confuso?!?!

Muito bem… Imagine que você esteja desenvolvendo um sistema que pode emitir boleto de vários bancos diferentes. Para todos os bancos, os boletos possuem características semelhantes como: código de barras, número de documento, nosso número, código do banco entre outros. Ou seja, todo e qualquer boleto quando chamado deve retornar esses dados, mas cada banco tem uma regra própria para realizar os cálculos e retornar, por exemplo, os dados do código de barras.

Inicialmente podemos ter dois bancos para começarmos o sistema que, de cara, poderá ter mais bancos muito em breve. Vamos começar, por exemplo, com Itaú e Banco do Brasil (não, não é merchan…rsrs).

Claro, prevendo o crescimento, os bancos estão configurados em banco de dados ou o nome é passado na URL. De qualquer forma o nome do banco escolhido estará em uma string. Supondo que as classes já estão prontas com seus respectivos métodos, isso é muito tranquilo com design patterns como “factory” ou “builder” com um método que retorna o tal banco.

class FabricaBanco
  def banco_atual(nome)
    case nome
      when "itau"
        Itau.new
      when "banco_do_brasil"
        BancoDoBrasil.new
    end
  end
end

Na classe BancoDoBrasil, por exemplo, termos o método que retorna o valor do código de barras:

class BancoDoBrasil
  def codigo_barras()
    "12345678901234567890123456789012345678901234"
  end
end

É só fazer a chamada em seu controller e usar:

banco = banco_atual "banco_do_brasil"

codigo_barras = banco.codigo_barras

Agora o sistema começou a crescer e seus clientes estão pedindo boleto do Bradesco também. É só adicionar mais um banco na condição:

class Banco
  def banco_atual(nome)
    case nome
      when "itau"
        Itau.new
      when "banco_do_brasil"
        BancoDoBrasil.new
      when "bradesco"
        Bradesco.new
    end
  end
end

Até aí tudo bem… Mas, cada vez que surgir um novo banco, além de criar sua classe, será necessário adicionar mais um banco à condição. Naturalmente vamos criar um método gigante e aumentar a complexidade de manutenção.

Não seria mais fácil se aproveitássemos o nome do banco da string? Ruby tem algumas funções “mágicas”  muito úteis (claro, não existe mágica em Ruby, mas é só para ilustrar), no entanto deve-se tomar muito cuidado! Já explico o porquê.

Nesse caso podemos usar o método “eval” para converter a string em um objeto conhecido pela aplicação e resumir nosso método “banco_atual” com apenas uma linha de implementação. Mas, além disso, é necessário que o nome do banco também seja semelhante ao da classe. Usaremos o método “camelize” do Ruby on Rails que converte a string que está em lower case para camel case. Ex.: de “banco_do_brasil” para “BancoDoBrasil”. E nosso código fica assim:

def banco_atual(nome)
  eval nome.camelize.new
end

Agora vem o alerta!!! O método “eval” transforma qualquer string em código Ruby. Por exemplo, no “irb” digite:

>> eval “puts ‘QUE PERIGO!’”

Vai ser exibido “QUE PERIGO!” em seu terminal, ou seja, foi executado o que estava na string passada para o método “eval”. Isso significa que, para utilizar esse método você deve estar muito consciente do que está fazendo e, principalmente, deve “sanitizar” seu código para proteger sua aplicação.

Uma boa saída é utilizar o método “constantize” do Ruby on Rails que tenta encontrar uma constante ou objeto com o nome da string em camel case. Caso não encontre ou a string não esteja em camel case, é devolvido um NameError.

def banco_atual(nome)
  nome.camelize.constantize.new
end

Mesmo assim, não deixe de tratar os inputs!

O evento de TI mais esperado do ano aconteceu nos dias 13 e 14 de outubro no Auditório Elis Regina no Anhembi em São Paulo. O Rails Summit 2009 reuniu muitos desenvolvedores não apenas de Ruby on Rails, mas tinha muita gente de outras comunidades também. Isso porque o que a comunidade Rails tem a oferecer é muito mais do que o framework ou a linguagem (claro que merecem destaque pela felxibilidade, etc), mas a disseminação do conhecimento, paixão pelo que fazem e a forma como é feito.

A organização foi excelente, desde a escolha dos palestrantes até as tomadas próximas às cadeiras para podermos carregar os notebooks.

DSC01341

Abaixo vai uma pequena descrição das palestras que participei nesses dois dias:

Dia 13:

Chad Fowler – “Ruby on Rails Insurgency”

Chad iniciou sua palestra sendo enfático: “Stop doing things you know are wrong!”. Mostrou um pouco das dificuldades de se introduzir novas tecnologias em ambientes corporativos e deu dicas de como chegar lá.

Gregg Pollack – “On The Edge of Rails Performance”

Conhecido por seus screencasts, Gregg falou como melhorar a performance de aplicações Rails baseado em sua série “Scaling Rails Screencast Series”.

Deu dicas como: “Assista aos screencasts”, “Não abuse do banco de dados”, “Adicione índices a suas migrations”, além de apresentar alguns plugins que podem ajudar muito. Veja.

Carlos Brando – “Yet Another Ruby Framework – Como o Rails funciona por dentro”

Carlos Brando começou sua palestra com uma pegadinha. Pergutou quem da plateia programa em Rails. A maioria levantou a mão. Foi aí que ele soltou: “Niguém programa e Rails. Vocês programam em Ruby. Ruby o Rails é um framework para desenvolvimento web feito em Ruby”. Comparou o Rails com um miojo, que fica pronto rapidinho e você pode até incrementar com alguns temperos, etc, mas que não serve para tudo como fazer uma feujoada, por exemplo.

Apresentou o Sociably que é o framework que ele está desenvolvendo.

José Valim – “Rails 3.0 generators”

José Valim apresentou o Thor como gerador de código e como sendo a junção de Rake + Sake + Rubygen + RailsTemplate. A apresentação pode ser vista aqui.

David Chelimsky – “RSpec and Cucumber: Beyond the Basics”

Chelimsky falou mais sobre RSpec enfatizando que o desenvolvimento orientado pelo comportamento (BDD) acaba sendo uma evolução do TDD, pois, dessa forma, os próprios testes, sendo fáceis de ler, se tornam a documentação do sistema.

Fábio Akita – “Agile, além do Caos”

O Akita começo a sua palestra “viajando”, mas no final, tudo se ligou e foi excelente. Ele falou sobre conformidade, caos, auto-organização. Foi muita informação de uma vez só! O cérebro ainda está processando…

Quem sofreu foram as tradutoras que estavam fazendo a tradução simultânea para o inglês :)

Matt Aimonetti – “O Futuro do Ruby & Rails”

Matt falou sobre o Ruby 3.0, o Rails 2.0 e também algo sobre JRuby, IronRuby e o MacRuby (com o qual está envolvido atualmente). Comentou sobre o crescimento do número de desenvolvedores que utilizam Ruby on Rails e como espera um aumento maior ainda.

O destaque do primeiro dia ficou por conta do pequeno Aldo Filho na “desconferência” (um espaço para que os participantes da platéia também possam se apresentar). O garoto de 11 anos, de fato, colocou muito marmanjo no chinelo apresentando seu blog em 15 minutos. Veja o vídeo:

Dia 14:

Rich Kilmer – “MacRuby + HotCocoa”

Richard iniciou a palestra falando um pouco da história e o objetivo da Apple em tornar o Mac OS X a melhor plataforma para desenvolvimento Ruby. Apresentou o MacRuby para desenvolvimento de aplicações Ruby para Mac e o HotCocoa para auxiliar no desenvolvimento da interface.

Carlos Villela – “Ruby na ThoughtWorks”

O Carlos Villela falou sobre a experiência na adoção de Ruby em alguns projetos da ThoughtWorks. A aprovação de algumas equipes e a resistência de outras no uso da linguagem. Falou também sobre os cuidado na empolgação no uso de metaprogramação, pois isso pode tornar a manutanção do código muito difícil. Plugins também podem ser um perigo, pois podem causar imcompatibilidades dependendo da versão do framework.

Marcos Tapajós – “CouchDB com Ruby”

Tapajós apresentou sua experiência no uso do banco de dados não relacional o CouchDB. Falou sobre, map reduce, processos do Couch e o tratamento de conflitos. Deu dicas para instalação e utilização dele com Ruby.

Bruno Miranda e Jeison Seifer – “Escalando Rails”

A apresentação foi conduzida pelo Bruno, pois Jeison, que acabou gravando sua apresentação em vídeo, não pode vir ao Brasil. Foi apresentado o caso do desenvolvimento do MSN Music Cyloop e o desavio para escalar e trazer boa performance. Infelizmente, não consegui fazer muitas anotações desta palestra.

Vinícius Telles - De Serviço para Produto

Vinícius Telles fez uma palestra nada técnica, mas voltada à negócios. Ele contou sua trajetória desde o primeiro emprego até a criação do Be On The Net. Deu dicas importantes para quem tem um projeto e deseja fazer dele um produto rentável e fazer de seu cliente um amigo. A principal dica foi: “Tenha reserva financeira”. O vídeo pode ser assistido aqui.

Obie Fernandez – “Dominando a Arte de Desenvolvimento de Aplicações”

Obie fez a relação entre programação de sistemas e a arte. De como podemos sempre melhorar algo que fizemos ou que já existe. O sucesso de um sistema não está relacionado com a ferramenta que foi usada e sim com o talento de quem o fez. Deixou claro que não trabalha com pessoas que consideram o desenvolvimento somente como um emprego. É necessário ter paixão pelo que faz e focar sempre nas pessoas e não nas corporações.

Nesse primeiro post do meu novo blog vou falar de um assunto numa forma não muito técnica, mas que vai servir de base para os próximos posts.

Como alguns já sabem, trabalho com desenvolvimento web há uns 9 anos mais ou menos. No entanto, resolvi fazer uma graduação na área somente agora.

Uma das coisas que já ouvi muito nos corredores é: “Se você souber Java, você está feito na vida” ou, “Java é a nata da programação”, “Você tem que se epecializar em Java”. Citando até casos de ex-alunos que se deram muito bem e que ganham muito porque são “os caras” nessa linguagem.

escolhaMuita gente ainda tem a idéia de que se especializar em uma única tecnologia é o melhor caminho para sua carreira. E é muito triste, pois, dessa forma ela está é fadada à estagnação. Naturalmente, isso é para qualquer um que esteja decidido a obter uma certificação e seguir a trilha de uma única tecnologia como se ela fosse imortal ou a solução para todo e qualquer problema.

Obter a certificação não é um problema, mas ela não o fará dominar o assunto e tende a cada vez mais não agregar valor ao seu currículo. Em algumas ofertas de trabalho em empresas de tecnologia já é desejável que o profissional colabore em algum projeto open source, questiona-se qual livro o profissional leu, está lendo ou pretende ler e até mesmo tenha um blog que colabore com a comunidade. Isso acaba agregando muito mais valor do que a certificação.

Mas, voltando ao nosso assunto… Conhecer e dominar uma única linguagem de programação é a mesma coisa que saber falar muito bem somente o português. É como ter um mundo de possibilidades e não ser capaz de sair do lugar. No entanto, se você souber um pouco de inglês, as coisas começam a clarear um pouco.

O mesmo acontece com a plataforma. Não adianta ser bom somente em Windows ou Linux e acabar não dando a solução que o cliente realmente precisa.

Durante um bom tempo fui defensor da idéia de se especializar e acreditava que não havia motivos para sair da plataforma Windows já que trabalhava bem com ASP, SQL e C#. Na verdade, o que sempre existiu foi um lado religioso nessa questão que era pregado tanto por “seguidores” do Tux quanto pelos que se sentiam orgulhosos por usar o sistema operacional do homem mais rico do mundo (há alguns anos atrás).

Então, desde a época em que se começou a falar sobre disponibilização de servços pela web, começou a ficar claro pra mim que os sistemas espalhados pelo mundo teriam que se conversar, independente da plataforma ou linguagem e que não era essa ou aquela a olução de todos os problemas. Eu já estava disposto a conhecer coisas novas.

Há pouco tempo começamos a ver Ruby on Rails na empresa e surgiu a oportunidade de fazermos um curso… Uau!!! Quanta flexibilidade!!! Tivemos que usar o Ubuntu… Ótimo!!! Logo depois, adquiri um MacBook… Foi como se tivesse tomado a pílula vermelha. É muito bom poder ter uma visão de todos os mundos.

Hoje, se me perguntarem sobre qual linguagem aprender ou qual tecnologia usar, a resposta é simples: DEPENDE!

Depende da necessidade, depende do custo, se vai ser web ou desktop, ou os dois, depende da habilidade da maioria da equipe, depende da disponibilidade para se aprender uma nova tecnologia.

O importante é ter a cabeça aberta e estar disposoto, acima de qualquer “religiosidade” tecnológica, a resolver o problema do cliente.

P.S.: Só para apimentar um pouco… enquanto escrevia, fiquei na dúvida sobre a cor da pílula e, quando fui pesquisar, encontrei este vídeo (rsrsrs):