Archive for May, 2007

O Ataque dos Clones

Friday, May 11th, 2007

Temg ente que me deixa intrigado. O que deu no Steve Jobs apra ele liberar o design do iPgone tanto tempo antes, dando espaço para bizarrices como essa?

Será que a Apple realmente vai lançar aquele mesmo iPhone mês que vem?

Plataforma não Vence Cultura

Thursday, May 10th, 2007

Recentemente tive um debate interessante com o Vitor Pamplona no blog dele sobre se o Prevayler oferece uma OO razoável ou não. Hoje estava passeando pelo repositório do java.net quando resolvi baixar o JavaFreeCMS e dando uma olhada rápida nos fontes confirmei que não é porque você tem uma plataforma (persistência, linguagem, VM, etc.) de objetos que você tem objetos.

O Prevayler te induz a um modelo de persistência baseado em Commands. Commands são classes que representam uma unidade de trabalho, como um algoritmo. Na maioria dos casos os Commands viram erroneamente TransactionScripts, que são alternativas muito interessantes para sistemas simples mas são antagônicos a um Domain Model.

Num TransactionScript estruturas de dados são manipuladas pelo algoritmo do Command, o que nós já conhecemos como domínio anêmico. Num Domain Model objetos ‘de verdade’ cooperam para atingir a um fim (implementar um caso de uso/user story).

O exemplo abaixo mostra como um código procedural pode ser produzido neste ambiente:


public class PostComment extends CMSTransaction {
.
public static final long serialVersionUID = 1L;
.
private long idNew;
private Date date = new Date();
private long idComment;
private String desc;
private String author;
private String authorName;
private String page;
private String email;
.
public PostComment(long idNew, String desc, String author, String authorName, String page, String email) {
this.idNew = idNew;
this.idComment =0;
this.desc = desc;
this.author = author;
this.authorName = authorName;
this.page = page;
this.email = email;
}
.
public PostComment(long idNew, long comment, String desc, String authorName, String author, String page, String email) {
this.idNew = idNew;
this.idComment = comment;
  this.desc = desc;
this.author = author;
this.authorName = authorName;
this.page = page;
this.email = email;
}
.
public void executeOn(CMS cms) {
New news = (New)cms.getModule(CMS.NEWS).getItem(idNew);
.
if (news == null) {
return;
}
Comment item = prepare(cms, news, date);
}
.
public Parser getParser(Wiki wiki) {
  return FormatPrevalenceFactory.createDefaultParser(wiki);
}
.
public Comment prepare(CMS cms, New news, Date date) {
Parser parser = getParser(cms.wiki());
.
// Creating the text and identifyng wiki words.
Text textObject = new Text(author, date);
parser.parseText(desc, textObject);
.
Comment comment = news.getComment(idComment);
.
if (comment == null) {
comment = new Comment(0, date);
}
.
comment.setAuthor(author);
comment.setAuthorName(authorName);
comment.setEmail(email);
comment.setPage(page);
comment.setDesc(textObject);
.
news.addComment(comment);
.
return comment;
}
.
}

E qual o problema com este código? Perceba que as estruturas de dados são manipuladas pelo Command que é a classe PostComment. Primeiro se cria o objeto:


// Creating the text and identifyng wiki words.
Text textObject = new Text(author, date);
parser.parseText(desc, textObject);
.
Comment comment = news.getComment(idComment);
.
if (comment == null) {
comment = new Comment(0, date);
}

Depois se popula o objeto com dados:


comment.setAuthor(author);
comment.setAuthorName(authorName);
comment.setEmail(email);
comment.setPage(page);
comment.setDesc(textObject);

Mais a frente dizemos ao objeto o que fazer:

news.addComment(comment);
return comment;

O que acotnece se precisarmos criar um objeto exatamente como o fizemos, porém precisamos que a descrição seja, digamos, precedida por um disclaimer do tipo: “o Forum não se Responsabiliza pela opinião deste usuário”? E se precisarmos fazer isso apenas para usuários da nossa blacklist?

Pelo andar da carruagem vamos criar uma outra classe de Command que faz exatamente o que esta faz mas muda uma linha:


comment.setAuthor(author);
comment.setAuthorName(authorName);
comment.setEmail(email);
comment.setPage(page);
.
if(blackList.contains(author)){
comment.setDesc(DISCLAIMER+textObject);
}else{
comment.setDesc(textObject);
}

Claro que podemos refatorar o Command para que vire um TemplateMethod e esta pequena modificação vire um hook mas… e se precisarmos criar um Comment em outro lugar, digamos quando os dados vêm de uma conexão na rede, ou um WebService REST? Fazemos a classe que cuida disso estender o Command?

O problema neste caso é que a responsabilidade pela criação do objeto não está no lugar correto. Imagine que ao contrário do que temos hoje o objeto Comment tivesse suas próprias regras de negócio (afinal, objetos são dados+funções, estado+comportamento). Ao criar um objeto Comentário ele já se popularia com os dados passados no construtor (o que, aliás, evitaria quebrar a invariante deste objeto, o que acontece no exemplo acima) e que para criar um comentário com disclaimer seja tão simples quanto criar uma subclasse chamada DisclaimeredCommet, que já traz a lógica de negócios. Podemos ter algo como:


Comment newOne = commentFactory.createComment(author, text);

E na Factory:

public Comment createComment(Author author, Text text){
.
Comment created=null;
.
if(blacklist.contains(author)) {
created=new DisclaimeredCommet(author, text);
} else{
created=new CommonComment(author,text);
}
.
return created;
}

A lógica sobre qual comentário criar ficaria no objeto responsável pela criação (a Factory) e não por 500 outros objetos. Para quem exibe não existe diferença entre CommonComment e DisclaimeredComment, eles são instâncias de Comment (Zahl abençoe o polimorfismo). Não importa onde fosse chamado, o código sempre iria produzir o objeto correto.

Claro que este exemplo poderia ser resolvido de mil maneiras diferentes mas é só um exercício sobre pensamento procedural x orientado a objetos. Na verdade nem pensamento procedural porque mesmo este paradigma tem meios para evitar os problemas citados (mais sobre isso em outro post). Mas não se engane: o problema não é o JavaFree, seu CMS muito menos quem o implementou. Só está aqui porque é o único proejto em produção que eu conheço (e tenho acesso aos fontes) usando Prevayler. Se quem criou este design o fez assim fez porque a cultura que impregna nossa comunidade, academia e mercado não é OO. Este mesmo problema acontece em zilhões de outros projetos livres (inclusive de outros fóruns e CMS), projetos comerciais e mesmo em simples exercícios de faculdade.

O problema dos bancos de dados relacionais já foi quase que completamente resolvido com ORMs eficientes como Hibernate e JPA, o problema ainda é, como era há 30 anos, fazer com que os sistemas sigam uma modelagem OO. Como fazer com que as pessoas entendam que objetos não são containeres de dados e sim entidades ‘vivas’ em um sistema. Muitos pensavam que ter uma plataforma OO amplamente difundida faria isso acontecer. java mostrou que falharam. Outros pensaram que ter um SGBD relacional é o problema, tirar o SGBD faz os objetos fluírem, o código acima mostra o contrário.

O problema não é na plataforma, é na cultura.

What Would Rich Green Do?

Tuesday, May 8th, 2007

Ok, Marc Fleury fez mais barulho que software na vida mas não dá pra negar que o cara é muito bom, tanto tecnicamente (microkernel JMX como core do servidor de aplicações, primeiro AS open-source considerado ‘de verdade’…) quanto economicamente (ficar rico no final). Talvez pela minha amizade com alguns funcionários do JBoss/RH que contam sempre ótimas histórias dele.

Eu gosto bastante de seus artigos, basta tirar todo o bashing gratuito (que acho que já é mais personalidade do que interesse). Nunca concordei tanto com ele quanto neste texto, entretanto.

Professional OPen Source was rooted in the notion that you pay for the superior talent and you pay well. In the mythical man month approach to software development, superior coders are more productive by an order of magnitude than just “good coders”.

A economic translation of the mythical man month hypothesis, is that “mathematically” you get more innovation and productivity by paying one superior developer $10 than by paying $1 to 10 average guys.

Message to Rich Green: you are at the crux of Professional Open Source’s raison d’etre. Keep on digging. Standalone JBoss was an implementation of this model at a small scale. JBoss as a division of RHT is an implementation of this model at a medium scale. You can figure it out on a large scale.

Eu tive o prazer de ter cinco minutos de conversa com Rich Green há um mês e ele me pareceu alguém a altura do desafio, resta não deixar o ‘enterprisey’ tomar conta.

Ah, e por favor, quando lerem ‘Professional Open Source’ por aí pnesem em modelos como do JBoss, onde se produz software open-source de qualidade e se cobra por serviços em cima desta plataforma, não como os exemplos existentes por aí que empacotam tudo num CD, junto um quilo de glue code mal feito e vendem.

Ele Não Aguenta Mais Arroz Com Ovo

Monday, May 7th, 2007

Continuando na nossa série de alertas (não, não era uma série mas acabo de inventar isso) chegamos a um excelente texto sobre o futuro de java x .Net no infoQ. Deste eu destaco:

When .NET was first released in 2000/2001, the Java community considered it a “clone” of Java, both language and standard library. Comparing simple code samples surely support this impression. However, MS profited from many years of experience with Java, and managed to solve some issues that Sun only now realizes as problems. The impression that the .NET and the CLR are evolving faster than Java is not lost on the Java community.

Other examples of this are modularization and versioning, which.NET solved by choosing the assembly, a collection of classes, as the basic deployment unit. Assemblies are equipped with metadata such as version information, unlike Java’s Jar file which lack versioning metadata. This is troublesome for increasingly large applications, which load many libraries. OSGi now provides a solution for this, Sun is busy adding something similar to Java 7.

The Java language keeps on catching up with C#, adding features such as Generics and features such as AutoBoxing, Enumerated types or Annotations. C# now has anonymous expression support, which forms the underpinning of the LINQ technology. LINQ can be thought of a statically typed query language for many different types of data sources, such as XML, relational databases, but also arbitrary object graphs. The Java space, meanwhile, debates language minutiae such as language support for properties and which of four types of anonymous function to include in the language.

The Java space doesn’t really any of the mentioned items, except for the hosting interface, which was added in Java 6, under the name of JSR 223. This is basically just framework to add new language runtimes and initialize and access them in a standardized way.

Jim Hugunin continues with a detailed explanation of how dynamic method dispatch is handled, which makes use of extension methods and other existing CLR systems. The only comparable initiative is JSR 292, which among other things wants to add a new bytecode invokedynamic .This effort was started by Gilad Bracha, who soon after the creation of the JSR, left Sun, and is now not convinced that this project will bring any short term solutions:

Exceto a bizarrice do LINQ, este texto só mostra algo que vem sendo visto diariamente. Provavelmente a JVM e a CLR vão disputar como VMs de linguagens dinâmicas e de DSLs, e tudo mostra uma vantagem técnica para a MSFT. Acordemos.

Seria Cômico se não fosse…real

Monday, May 7th, 2007

O Hugo Vidal me mandou um mail sobre seu novo projeto: http://www.codecomics.com.

codecomics

A idéia é simples: quadrinhos feitos pelo próprio com textos rápidos e precisos sobre desenvolvimento de software. Fantástico.

RUP em Waterfall?

Sunday, May 6th, 2007

Vagando pela Internet sei lá porque achei a descrição de uma fábrica de software:

A Empresa oferece a seus clientes o acesso a um processo de produção baseado no RUP (Rational Unified Process) que atenua as distâncias frequentemente causadas entre o requirement e o delivery. É um centro de competência em desenvolvimento de sistemas com padrão internacional (em processo de implementação de CMMi nível 2).

Esta infra-estrutura permite a Empresa atender clientes dos mais variados segmentos, desenvolvendo ou integrando projetos para diversos ambientes e plataformas. Colocam também a empresa numa posição de vanguarda no setor.

Baseada nos mais modernos processos metodológicos, o processo inicia-se com o estabelecimento junto ao cliente da melhor solução para os seus sistemas, por profissionais altamente qualificados. Em seguida a engenharia de sistemas desenha a solução de acordo com o ambiente tecnológico existente.

Por último, a produção do código se inicia à medida que a engenharia de sistemas vai sendo concluída. Este formato apresenta produtividade elevada para a reutilização de código através de bibliotecas de objetos e ainda permite ao cliente dispor de todo o processo, ou parte dele, conforme suas necessidades.

Os mais modernos processos são…waterfall? O RUP é iterativo ao extremo, uma empresa que diz que faz RUP e tem ‘fases de projeto, codificação, testes, etc. só está se contradizendo. Esse é o mal da atualidade em TI: pessoas que não tem sequer noção do que estão falando.

IBM’s Bubble (Gum?)

Sunday, May 6th, 2007

Deu no meiobit que a IBM GlobalServices está a ponto de demitir 150.000 mil pessoas no mundo todo. A motivação seria o fato de que o braço de consultoria da Big Blue estaria sofrendo os efeitos de anos entrando em contratos que não dão lucro ou mesmo dão um belo prejuízo.

Tem anos que algumas pessoas vêm alertando para o fato de que o modelo de consultorias de tecnologia da informação atual é inviável, uma grande bolha. É diferente da bolha da web porque há benefício sendo gerado para o cliente. O problema é quando você tem, uhm.. 150.000 pessoas fazendo trabalhão que poderia ser feito pela metade.

As grandes consultorias, conhecidas no submundo de TI como ‘as empresas de três letras’, são especialistas em encher o cliente com profissionais saídos da faculdade ou dos cursinhos “aprenda Java em 15 minutos”, cobrando uma fortuna pela hora destes profissionais e dando uma mesada para os dito-cujos no lugar do salário e os “profissionais” vivem pulando de galho em galho por qualquer aumento de 1% na mesada que outra empresa promete. O resultado de contratar estagiários que pulam de galho em galho é software de péssima qualidade sendo desenvolvido e entregue.

O único motivo pelo qual esta coisa meio que dá certo é que já chegamos a um ponto na ciência da computação onde qualquer criança de dez anos consegue criar um programa CRUD. Ele não tem que se preocupar com arquitetura, design, projeto, performance: a plataforma dá tudo para ele (Dijkstra tinha razão…). Claro que apesar de 93.56% dos programas hoje em dia serem grandes CRUD, todos (ou quase) possuem aspectos não-CRUD. Geralmente estes são os aspectos não-funcionais e só se mostram em ocasiões do tipo problemas de performance, manutenção, grandes mudanças de fornecedor, extensão do sistemas e outras coisas que não acontecem no dia a dia mas quando acontecem são mortais.

Será que é o início do fim? E os milhares de empregos na área de TI que atraem e empregam milhares de incapacitados todos os anos? Minha visão é que vai haver um breve período cinza mas em breve eles vão voltar. Não adianta, enquanto não avançarmos um degrau técnico para que programas simples (93.56% dos existentes, lembrem-se) sejam criados e mantidos por administradores de empresas e outros perfis menos técnicos vão haver muitas vagas, muitos sistemas são construídos.

Não sei, posso estar errado mas eu já acertei algumas vezes.

Workshop IEEE

Tuesday, May 1st, 2007

Acabo de voltar de Porto Alegre onde participei do Workshop do SPIN-RS sobre tendências no desenvolvimento de software, realizado pelo IEEE. Foi um evento fantástico com apresentação de pessoas do porte de Philippe Kruchten, Stephen J. Mellor e Rebecca Wirfs-Brock, certamente o melhor conteúdo técnico que já vi em um evento nacional.

A única crítica que teria ao evento não é a este em si mas sim a cultura nacional. Muitas e muitas vezes vemos pessoas se despencando até São Paulo ou onde for e pagando várias centenas de reais para ver meia dúzia de pessoas que fazem apenas propaganda sobre uma dada ferramenta. Quando finalmente temos um evento onde pessoas importantes estão falando sobre temas importantes ficamosrestritos aos poucos que ouvem falar e têm coragem de ir ao local. Parabéns a organização do evento e aos presentes por mostrar que este país não é feito (apenas) de arrastadores de caixinhas.