Archive for February, 2006

Troca de guarda…

Sunday, February 19th, 2006

Acabei de ler o Software Factories no engarrafamento de sexta-feira (experimenta ter que atravessar o sambódromo uma semana antes do carnaval pra conseguir chegar em casa…). Aos poucos vou colocando material sobre o conceito aqui mas o livro em si é bem chatinho, só quem realmente se interessa pelo tema deveria ler. A parte de DSLs é muito pequena e fica mais no ‘linguagens formais’ da coisa, mesmo assim muito por alto.

Comecei a ler na sexta mesmo (depois de passar em casa, fui pra Niterói e, adivinhem? Engarrafamento na ponte…) o livro da Linda Rising e Mary Lynn Manns, Fearless Change: Patterns for Introducing New Ideas.

Se você não lembra, a simpática Linda Rising veio no Brasil ano passado para o SugarLoafPLOP 2005 e acabou dando uma das melhores palestras do ConexãoJava2005 (áudio e slides aqui). Na foto abaixo eu, Rafael Steil e Rodrigo Kumpera (louds para os íntimos) com a autora logo após sua palestra. Sim, meus olhos estavam fechados. Não, não lembro porquê :P.

O que é um arquiteto?

Sunday, February 19th, 2006

Inspirado por mais um post no GUJ, resolvi escrever um pouco meus pensamentos sobre esta tão comentada e tão pouco definida função. Quem é o arquiteto de software? O que ele faz?

Vamos olhar o que é Arquitetura de Software segundo o livro Pattern-Oriented Software Architecture, Volume 1: A System of Patterns (Hardcover) (tradução livre minha):

A arquitetura de um software é a descrição dos subsistemas e componentes e suas relações. Subsistemas e componentes são tipicamente especificados em diferentes pontos de vista para mostrar suas propriedades funcionais e não funcionas que sejam relevantes. A arquitetura é um artefato. É resultado de uma tarefa de design de software.

Nos baseando por este conceito, podemos dizer que o arquiteto é quem especifica os subsistemas e componentes de um software e como estes se relacionam.

Olhando por esta ótica, não parece que o arquiteto deva saber sequer programar. A certificação de Arquiteto Java da Sun, por exemplo, não exige esta habilidade. A prova exige conhecimentos de UML, Design Patterns clássicos e JEE, sobre a arqutietura de aplicações distribuídas e as APIs Java EE.

Ainda que acredite que a ementa da Sun seja parte integrante da formação de um bom arquiteto, algum tempo atrás em uma entrevista para o JavaPosse com Burr Sutter, líder do Chapter de Atlanta da IASA , um conceito que acredito que seja o mais importante: Um Arquiteto deveria ser capaz de fazer o sistema todo sozinho.

Não é preciso ser um super-homem para isso, na verdade basta apenas experiência. É claro que podemos ter um arquiteto que nunca participou de projetos como júnior (um em um outro cargo que não costume tomar muitas decisões sobre design de alto nível) ou pleno (ou outro cargo onde você toma muitas decisões o tempo todo mas não tem a palavra final), mas exceto em raros casos de pessoas geniais este “arquiteto nato” não vai conseguir produzir nada muito bom por nunca ter atuado na linha de frente.

Acho que quando a emrpesa possui uma equipe pequena, o arquiteto surge como o gerente da área ou como um líder escolhido por meritocracia. O papel de líder de desenvolvimento separado do de arquiteto é algo preocupante já que as atividades são muito ligadas. O arquiteto deve ser líder e mentor da equipe (não necessariamente gerente), este é seu papel fundamental.

Para resumir esta conversa vou tentar descrever o perfil de um arquiteto que eu contrataria para minha empresa hoje:

Uma pessoa experiente em projetos de diversos tamanhos, preferencialmente em mais de um tipo de negócio e com diversas tecnologias. Programa fluentemente na linguagem a qual o sistema vai ser produzido e em algumas outras, mesmo concorrentes.

Sua mesa ou bookmarks estão cheios de repositórios e catálogos, ele sempre procura referência bibliográfica sobre o que está sendo feito, mesmo que signifique ler um paper de 1975 sobre computadores com bytes de 9 bits. Está sempre sabendo das novidades na sua área de atuação, mesmo que ele nunca tenha nem entrado do site daquela tecnologia nova, ele já ouviu falar e está disposto a ouvir se alguém quiser falar mais sobre ela.

O design que ele produz é simples e extensível ao extremo. Serve como linha-base para o programador mas não sufoca o instinto criativo. Este é criado após mesas redondas com os programadores e demais interessados onde cada idéia é debatida.

Ele sabe que o design mais importante é feito diariamente, então está sempre acompanhando o repositório de código. Uma de suas primeiras atitudes foi convencer a gerência da necessidade de um build contínuo com relatório de métricas de qualidade no código. Também evangeliza ferramentas como PMD e FindBugs e exige que código tenha testes unitários. A qualidade da equipe é fundamental então ele insiste com as pessoas responsáveis que rodas de leitura, workshops e treinamentos sejam realizados.

Para vender todos os seus projetos à gerência, ele aprendeu a falar a linguagem dos gerentes. Um dos papéis mais importantes do seu trabalho é transformar métricas em algo que o seu chefe consiga entender, algo que msotre o real benefício do foco na qualidade do sistema. Mesmo sendo um excelente técnico, ele tem que desenvolver habilidades de comunicação com quem manda na empresa.

Beyond Java: Golfinho Poliglota?

Thursday, February 16th, 2006

Como venho acompanhando e escrevendo, a JVM caminha cada vez mais para um modelo multi-linguagem próximo do que o .Net tinha como proposta inicial. Uma apresentação de Grahan Hamilton no JavaPolis 2006 recentemente disponibilizada sobre o futuro da plataforma menciona que já no Dolphin (Java 7, próximo lançamento após o Mustang/Java 6) o suporte à linguagens dinâmicas diretamente no bytecode deverá ser incluído.

Por que isso é tão importante?

Porque é a primeira vez bytecode não utilizado pela linguagem Java é inserido na plataforma Java. Não haveria mais como negar a separação entre as duas coisas.

Se a JVM quer ser a plataforma o futuro (sinto decepcionar tanta gente mas Java é a plataforma do presente faz um tempinho), precisa se adaptar às novas realidades. Java não é a melhor ferramenta sempre: muitas vezes ela é complexa demais (perde para PHP ou Ruby on Rails), muitas vezes é inflexível (perde para Ruby, Python, Smalltalk e LISP) e muitas vezes exige um nível de conhecimento técnico não disponível em uma empresa (perde para VisualBasic, Delphi e PowerBuilder).

Há um bom tempo a Microsoft juntou várias idéias já existentes vindas de Java, Delphi, PERL 6, (o embrião de) Java EE, C++, J++, Visual Basic, DirectX, Applets, XML, etc, etc e misturou tudo no seu .Net. O grande problema na minha opnião é que o maior diferencial da plataforma nunca foi explorado.

Enquanto Java suportava oficialmente uma linguagem e implementar qualquer outra era (possível mas) extremamente trabalhoso, .Net já vinha com uma estrutura para suportar várias linguagens. As linguagens em sí não eram nenhuma novidade, até PERL já tinha algo assim em 2001, mas o apoio de uma organização do tamanho da MSFT colocando máquinas virtuais multi-linguagem na maioria dos computadores do mundo era algo muito interessante.

Mas o mercado de .Net se dividiu em 2: C# para o Elvis, VB para o Mort. Todo mundo usa ASP.Net assim como desenvolvedor Java geralmente (mas nem sempre) usa JSP para conteúdo web.

Então toda aquela diversidade de linguagens simplesmente sumiu. Hoje a Microsoft tenta correr atrás do prejuízo aumentando o suporte à linguagens como IronPython mas neste meio termo pessoas e empresas que investem na JVM ou apenas desejam usar uma VM comercial menos restrita já criaram alternativas (como Jython).

O mesmo está acontecendo com MDA vs. Software Factories. Redmond comprou a idéia (e o passe) de um cara que trabalhava na IBM chamado Jack Greenfield que é um contrapotno ao MDA em diversos aspectos. A idéia original é a mesma: Model Driven Design. Se você não sabe o que é, imagine por enquanto que se trata de colocar um modelo -sejam diagramas UML ou qualquer outro tipo de notação de alto nível para modelagem que não uma linguagem de programação como Java ou C#- num compilador e este gerar não só código mas o sistema inteiro. Não, não é o mesmo que CASE, mas para isso precisamos de um artigo próprio.

O Model Driven da MSFT se difere do do OMG/IBM principalmente no fato de não usar UML. A primeira vez que vi esta discussão eu achei que era apenas mais uma tentativa da Microsoft de vender uma linguagem proprietária de modelagem mas depois percebi que não era apenas isso.

Lembra lá em cima quando disse que Java não é a melhor ferramenta para todos os problemas? Bem, UML também não é. UML foi construída para ser flexível mas suas raízes em ser uma linguagem para ‘documentação e modelagem de sistemas de software orientados a objetos’ é bem visível.

Se é apenas uma questão de levantar o nível de abstração ok, podemos utilizar uma linguagem genérica. O grande problema nesta alternativa para mim é que (tirando outras características dos compiladores de modelo MDA como teórica independência de arquitetura no produto final) estamos apenas substituindo uma linguagem como Java por uma notação gráfica com o mesmo propósito: ser uma linguagem de programação genérica.

A proposta da Software Factory para este problema das linguagens é ao invés de UML/Java/C# utilizarmos uma linguagem específica para aquele problema. A linguagem não precisa ser gráfica mas deveria fazer sentido dentro do domínio, os construtos e primitivas dela devem ser conceitos daquele domínio. Nada abstrato e genérico como um StringBuffer, coisas como Tabelas, Conta, Fluxo, Pedido… estão são as Domain Specific Languages (DSLs).

Ainda é cedo para saber qual modelo vai vingar. Eu voto hoje num modelo híbrido com a parte de DSLs da Microsoft, a padronização e os compiladores do MDA. Quando Java EE 1.3, 1.2, etc trazia (traz!) aquele monte de XML a Microsoft desenvolveu um sistema de metadados de serviços. Tantos anos depois Java EE 5 bebe da mesma fonte mas aplica melhores práticas de desenvolvimento.

E agora, com maior abertura para novas linguagens, Java se aproxima mais das DSLs. Que bom!

Não dá pra ignorar o que vem da Microsoft ‘porque é da Microsoft’. De Redmond saem muitas coisas ruins mas ocasionalmente saem coisas boas. Como eu li em algum lugar na Internet dia desses “a Microsoft tem desenvolvedores brilhantes, o problema dela deve ser os gerentes”.

Mesmo assim, a MSFT não é a única a investir neste ramo. Fowler fala mais sobre isso num paper recente que, aliás, deve ser lido por qualquer um interessado no tema.

Groovy is Everywhere

Tuesday, February 14th, 2006

As duas maiores publicações brasileiras sobre Java (e, creio eu, as maiores revistas sobre programação em geral no país) trazem matérias sobre Groovy este mês.

A MundoJava traz um artigo introdutório sobre a linguagem, mas como a MJ tem investido em artigos mais densos e completos, o ‘introdutório’ já traz muito material.

A JavaMagazine traz a linguagem de script como atração principal numa matéria que fala até de Grails. Aliás, eu achei a parte sobre Grails o mais fraco na edição, para quem conhece Rails ficou um gosto de “esse barulho todo por isso?”, acho que seria melhor apenas uma citação.

Groovy é a linguagem de JVM mais famosa após Java. Isso pode mudar com a adição de JavaScript no Mustang - Java 6 - este ano, e a mesma JSR ainda traz PHP na implementação de referência. É, está na hora do chato aqui avisar novamente: abram os olhos.

Infelizmente temos ainda uma etapa antes de chegar na próxima onda de linguagens, creio. A JVM precisa se adaptar (como com o tal invokeDynamic) para implementar mais facilmente novas linguagens. Depois desta etapa, com um ecosistema de linguagens para diferentes propósitos de fornecedores diferentes (uma coisa que Microsoft .Net propôs mas não vingou), podemos criar a linguagens específicas de domínio… mas este post se extendeu demais :)

Considered Harmful: Netbeans enche o saco!

Friday, February 3rd, 2006

A Sun está enchendo o saco com essa história de Netbeans. O JavaPosse parece um programa Polishop sobre Netbeans/Creator. O site do EclipseZone tem um flash enorme sobre Netbeans (tipo aquela propaganda da Microsoft que geralmente aparece quando você lê notícias sobre Java ou GNU/Linux).

As Seen on TV!

O Netbeans evolui bastante desde a época que eu o usava por considerar o Eclipse muito complexo, na época era a primeira versão do Eclipse, acho. Em seis meses larguei e aprendi a usar o Eclipse. Basicamente quando parei de fazer JSP/Servlets e comecei a escrever código.

Faz uns bons meses que a Sun vem subsidiando grupos de usuários, eventos e publicações para falar bem do Netbeans. Realmente o produto merece uma olhada (outro dia baixei uma versão do Creator para brincar), mas não é nada excepcional e a maior prova disso é que mesmo com tanta grana (que a Sun não tem, aliás) gasta eles ainda não conseguiram convencer a massa de usuários de Eclipse que o Netbeans é uma escolha sequer para desenvolver GUI e aplicações pequenas.

Eu tenho usado Eclipse e IntelliJ, um recente projeto que migrei para Rails era previsto de usar JSF (por isso o Creator) e eu estava considerando fazer a interface no Netbeans. Obviamente a lógica de negócio e todo mais importante ia ser feito no Eclipse (que eu uso quase sem plugins aliás). O ponto é que não achei lá essas coisas. Minha maior crítica é que, por default, o Netbeans te induz a coisas demais. Por exemplo naquela estrutura de projetos baseada em ant. Legal, mas e seu eu não quiser/não puder? Pode ser que aquela estrutura atenda à maioria dos projetos, aqueles que não possuem gente muito experiente para liderar, mas num projeto customizado, vira nada.

Em compensação o Eclipse com JDT apenas é cru. Ele é para ser customizado. Se você usar um MyEclipse, RAD, WSAD, Bea Workshop ou algo assim, vai ter uma IDE ‘produtiva’.

Se você não quer gastar grana com IDE, tem muitos plugins para escolher e montar sua IDE. É uma situação aprecida com Java vs. .Net. Num sistema em java geralmente você escolhe cada pecinha do mesmo, pega uma biblioteca ali, um framework MVC ali, um framework de persistência acolá. Em .Net geralmente você trabalha com o que o framework te proporciona out-of-the-box. Você não precisa usar estes componentes, pode mudar, mas quase ninguém faz isso. Assim como eu rpefiro as opções em java eu prefiro as opções no Eclipse, questão de gosto.

Acho que o Netbeans vai se solidificar como ferramenta para programadores iniciantes e de pequenas empresas enquanto o Eclipse serve de base para IDEs customizadas. Ninguém leva o esquema de plugins do Netbeans a sério (e olha que eu acho que a API do Eclipse fede!) e nos próximos meses vamos ver um movimento focado em IDEs para linguagens de domínio.

Assim como ter uma linguagem flexível é importante para construir uma DSL, uma IDE também é. A Microsoft avança com o Visual Studio e o mundo Java precisa dar uma resposta. Hoje o Eclipse RDT já é, por exemplo, a melhor IDE Ruby que eu conheço (mesmo aidna sendo bem simples), incluindo o RadRails.

200 Páginas em 4 ônibus

Thursday, February 2nd, 2006

Terminei ontem o My Job Went to India. Mudei de opnião, você não deveria ler esse livro. Você tem quem ler o livro. :)

É como conversar com um programador mais experiente e sem papas na língua sobre seu futuro profissional.

Comecei hoje o Software Factories: Assembling Applications with Patterns, Models, Frameworks, and Tools. o livro não fala de fábricas de software como conhecemos, é um apradigma parecido com MDA mas menos genérico e menos xarope. Ainda assim não consegui formar uma opinião, esperem um artigo maior sobre o tema…

Book

Ruby + Spring

Wednesday, February 1st, 2006

Interessante esta entrada do Phil Bogle.

Os caras usam jRuby, Spring e Hibernate apra produzir aplicações web rapidamente. Apesar da semelhança com o Rails nada impede que você faça algo parecido com Jython, Groovy ou qualquer outra coisa.

Eu estava fazendo algo aprecido usando jRuby, Spring e EJB 3, mas no final parti rpo bom e velho Rails. De qualquer forma se você não pode abrir mão da JVM nem de simplicidade… pode ser uma alternativa bem legal.