Porque usamos Frameworks?

Vamos contextualizar o que são Frameworks. Segundo a Wikipedia:

"No desenvolvimento do software, um framework ou arcabouço é uma estrutura de suporte definida em que um outro projeto de software pode ser organizado e desenvolvido. Um framework pode incluir programas de suporte, bibliotecas de código, linguagens de script e outros softwares para ajudar a desenvolver e juntar diferentes componentes de um projeto de software."

Segundo essa definição, o Framework deveria nos auxiliar como construir nossa aplicação sem nos preocuparmos em definirmos a estrutura dos paradigmas ou teorias escolhidos, em outras palavras: "Extendemos um framework e implementamos apenas os processos levantados em cima do fluxo que ele organiza". Alguns Frameworks, como o Hibernate, vão mais além, são Engines, motores de software prontos para uso.

Vamos exemplificar em alguns contextos. Os conceitos são importantes para a escolha dos frameworks necessários, quando voce desconhece ou relega isso fica muito mais difícil ter o feeling necessário para avaliar uma situação como essas.

Uma das formas clássicas de desacoplamento de um serviço para diferenciar o tratamento adequado à requisição é na implementação de fábricas de classes concretas das interfaces sugeridas. A implementação de DAOs é clássica como exemplo disso, voce cria uma interface para manipulação dos dados e classes concretas para cada mecanismo de persistência diferente. A inversão de controle a injeção de dependências foi uma evolução desse modelo, auxiliando até na camada de modelo caso necessite desse desacoplamento, como por exemplo uma interface de Nota Fiscal para encapsular entre o sistema de contabilidade e faturamento, o "quando" injetar fica a cargo do framework que conhece o mapeamento adequado. Voce não vai desenvolver injeção porque existe o melhor Framework para isso e ele se chama Spring.

Após a popularização dos bancos de dados para o desenvolvimento de software, dificilmente voce divergirá (por pressão do mercado) nesse segmento em prol de outra solução, ainda mais se a persistência requer cuidados capciosos e de dificil manipulação e manutenção como controle de concorrência. Ainda hoje existem sistemas que fazem seu próprio mecanismo de persistência, e não estou falando em salvar dados em xml, falo ainda em arquivos comuns, sem padronização reconhecida pelo mercado, geralmente sistema legado com seus bons 15 ou até 20 anos de existência. Mas o uso de SGBDs se chocam com o desenvolvimento Orientado a Objetos e o mapeamento objeto-relacional corresponde pela parte mais significativa do tempo de desenvolvimento medida em horas. O uso de um framework para minimizar esse desenvolvimento é significativo no sucesso do projeto. O problema reside quando voce abdica do uso de um produto reconhecido e amplamente suportado por uma solução In House.

Frameworks caseiros

A comunidade JAVA é pejoramente reconhecida pela utilização desenfreada de padrões e Frameworks, o que acarreta em complexidades enormes e geralmente evitáveis. Como a plataforma JAVA é robusta e dominou o modelo Enterprisey (usada como principal plataforma pelos maiores Players no fornecimento de soluções como IBM, Sun, Oracle, Borland, etc), unificando de forma inédita o marcado e o mundo acadêmico, acarretou na proliferação de Frameworks que solucionam um mesmo contexto. Nenhuma plataforma é tão rica em soluções diferentes para o mesmo problema. Solução para uns, problemas para outros. É comum desenvolvedores menos experientes sofrerem crises existenciais sobre qual solução adotar, vide o modelo MVC Model 2 que possui meio milhão de frameworks que fazem a mesma coisa (vale ressaltar a sanidade mental do pessoal do Struts e Webwork que resolveram unificar suas soluções e fazer algo melhor juntos).

Tenho e tive problemas sérios com equipes que acham que podem criar uma solução melhor que o mundo inteiro. Explico, na empresa que trabalho existe uma ferramenta que se propõe a competir com o Hibernate com a diferença que só quem conhece são as pessoas que trabalharam na sua concepção e por sinal nem fazem parte da empresa em questão. Será que elas pensaram em todos os problemas do mapeamento objeto-relacional que grandes especialistas no mundo inteiro pensaram e ajudaram a solucionar ou mesmo minimizar no Hibernate? Evidente que não tiveram recursos suficientes.

E aqueles Frameworks que suspostamente são Open Source mas que o controle é rigidamente orquestrado por uma empresa apenas? Eles conseguem a eficiência na resolução de problemas com tamanha agilidade e precisão que projetos abertos e suportados por uma grande comunidade?

A diversidade é interessante, a concorrência ajudou ao JAVA ser o que é, mas o ego e os sentimentos humanos de discórdia por ciumes ou vícios semelhantes proliferam ferramentas desnecessárias. Você teve uma idéia excelente que melhora um conceito? O que está esperando para criar um projeto? Mas será que não é melhor contribuir com um projeto existente e ajudá-lo a melhorar? Essas são questões que só dependem das pessoas envolvidas, não está certo ou errado criar mais uma ferramenta, mas é saudável saber escolher, antes de tudo é preferível levar em conta o pós-desenvolvimento, esse é o mais importante nos custos finais de um produto.

A escolha precipitada principalmente empolgada por apresentações e promessas mágicas de solucionar o que o mercado tenta a 30 anos ou mais é a mais nociva à saúde financeira dos negócios. Assim como existem pessoas que não saem sem consultar o horóscopo do dia ou levam a sério charlatanismo de búzios e bacias com água, existem arquitetos e gerentes que acreditam que alguém solucionou um problema do mercado e está cobrando somente U$ 20,000 dólares por isso. Pior, acreditam que sua equipe conseguirá desenvolver uma ferramenta melhor do que o mundo inteiro. Isso que não entendo, geralmente as empresas já trabalham no limite de seus recursos, o que diabos levam a crer que desenvolvendo algo que já existe é melhor do que ajudar a melhorá-lo?

Quem se enganou com Egen e coisas similares se enganou não por falta de aviso, isso é comum na engenharia de softwares, ninguém pode substituir o ser humano na criação, não existe inteligência artificial ainda que consiga pensar, e o software é uma criação, é como uma obra de arte precisa de um artista. Porque modelos de desenvolvimento falharam por associar o desenvolvimento de software com construção civil? Porque depois que se levanta um prédio, ninguem o move para a direita ou muda um andar de lugar, já no software você pode iniciar a construção pelo telhado. O que eu quero dizer com isso é que um framework é apenas um arcabouço como diz a definição do Wikipedia, ele não vai implementar seus processos, somente o programador.

Usar ou não usar.

Quanta complexidade você gosta? Eu gosto do simples, quanto mais simples melhor.

Se eu sou contratado para desenvolver um software web, eu não chego com Spring, Struts, Hibernate, JSF, KYZ debaixo do braço e digo: quando começamos e qual é o prazo?

Quando falamos em desenvolvimento WEB (um exemplo para contextualizarmos) de forma tradicional só vem na minha mente inicialmente que tratarei de trabalhar com o protocolo HTTP, tecnologias das especificações W3C (como CSS, XHTMl) e JEE no lado servidor (mas ainda num sentido macro, nem sei se precisarei de EJBs, talvês apenas JSP e Servlet).

Vamos voltar um pouco no passado, a Sun criou os EJBs imaginando um modelo distribuído que estava em moda no início desse milênio. O cotidiano das empresas mostrou que esse modelo não era realidade, poucos são os casos que sistemas precisam rodar em servidores de aplicações distintos. Imaginavam a contabilidade no Brasil e o Financeiro na Europa por exemplo. Qual a realidade disso nas empresas? Até nas grandes isso é incomum quando se parte para a prática, inviável pelos custos logísticos associados em todos os fatores que impactam nos negócios como comunicação entre os manipuladores dos dados. Porque eu vou usar EJB se meu sistema sequer é distribuído? Existem outros fatores, mas compensa o custo? Engraçado como a nova especificação deixou o Criteria do Hibernate de fora do JPA e ainda disseram que Criteria era extranho, extranho é essa insanidade de deixar de fora o principal componente do Framework que deu vida ao troço.

Como alguém pode antes de sequer conhecer os processos do negócio já saber que vai usar Spring? e para que?

Não quero tirar o mérito de nenhum framework aqui, apenas saber se o uso está sendo razoável.

Recentemente foi selecionado para ser o arquiteto de um projeto novo aqui na secretaria que trabalho, selecionei como arquitetura da aplicação apenas JSP, Servlet e DWR (como controlador da aplicação) além dos POJOS no modelo da aplicação usando Hibernate3 como engine de persistencia, ponderei sobre o que precisava e cheguei a conclusão que isso era o suficiente. Deu uma confusão dos diabos com o desenvolvedor porque segundo ele, não sabia trabalhar com servlet, nunca desenvolveu na vida sem o Struts, deu piti, sustentei minha argumentação, dei piti, discutimos, ele me xingou, eu pedi para sair do projeto, no final a gerência do projeto SABIAMENTE me deu ganho de causa (óbvio que se eu tivesse perdido a queda de braços eu estaria chamando de não sabios). Tirei dessa experiência que os princípios são mais importantes que as práticas, que os valores são ainda mais importantes ainda. Fui precipitado e confesso que não soube levar a situação da devida forma. Resumo da história, o único servlet que existe até o momento na aplicação é o do DWR que nem foi nós que desenvolvemos, criamos os dois casos de uso principais (que são o coração da aplicação) e agora que virão aqueles cadastros e operações CRUD que correspondem aos resto da aplicação mas é a parte mais simples. Pode até ser que daqui por diante venha a precisar de Struts ou outro Framework, mas até agora não precisei, o custo de adicionar na aplicação é irrisório, mas construir sobre algo que não havia necessidade era altíssimo.

Quando alguém me pergunta o que acho de usar um determinado Framework, eu faço como Platão, respondo com perguntas para saber se há a necessidade.

Fui selecionado para ministrar uma palestra no próximo "Café com Tapioca", evento realizado pelo CEJUG (Grupo de Discussões Java do Ceará) .

O anúncio foi divulgado nesse endereço do CEJUG, portanto voce tem mais informações sobre o evento. A palestra será sobre Ajax e como implementar um modelo MVC nessa tecnologia.

Voces estão todos convocados para irem na Fortes no dia 12, não aceitarei a ausência em hipótese alguma.

Sou questionado constantemente na Célula JAVA da faculdade Lourenço Filho (da qual fomos os fundadores, eu e o Handerson), sobre o ambiente que uso para desenvolver. Resolvi então criar um post mais direcionado aos novatos para compartilhar essas informações.

Como trabalho exclusivamente com JAVA no meu emprego e tenho seguido minha carreira nessa plataforma, meu ambiente se baseia no Eclipse, a melhor IDE java do mercado.

No trabalho uso o Windows como S.O. e em casa a dobradinha win/lin dual boot, a maioria dos softwares aqui mencionados funcionam nos dois.

IDE

Como mencionado, eu uso como base o Eclipse. Essa IDE tem centenas de plugins bons mas também tem bastante porcarias, já experimentei vários, fiquei com o seguinte ambiente:

Java 6. Sempre instalo a última versão, já conheço as novidades e faço "rêlouordis" para ficar antenado, essa de ficar com java 1.4 instalado não é interessante, afinal a plataforma sempre mantém compatibilidade com as versões passadas de forma extremamente estável (diferente de outro ambiente ali que as coisas da versão 2 não rodam as da versão 1, vai entender o que eles entendem por compatibilidade).

Eclipse como IDE base.

MyEclipse como suíte de plugins para desenvolvimento web e JEE, é o único que não é open source no meu ambiente de trabalho, mas vale cada centavo. O preço é escandalosamente barato para uma ferramenta tão boa.

Aptana, JSEclipse como plugins para html, css e javscript, sendo o último exclusivamente para javascript. o MyEclipse tem editores para esses artefatos, mas não são tão bons quanto o Aptana, eu ainda prefiro o JsEclipse da Adobe no caso do javascript, mas é questão meramente pessoal, em termos de features eles são praticamente a mesma coisa. Ultimamente testei o Spket apenas por curiosidade, por ele já trazer uma integração com o Ext, mas ele não tem diferencial comparado ao Aptana ou mesmo ao JSEclipse.

Container JEE

Tomcat 6 como container web JEE. Por questões de política do meu trabalho tenho que usar o Oracle AS10g como servidor de aplicações, preferiria o JBoss por inúmeros fatores (indiferente de questões filosóficas), mas uso o tomcat para testar todas as aplicações. Obviamente temos que nos policiar quanto às últimas novidades porque a Oracle sempre está alguns passos atrás (medidos em versões) dos outros servidores. Não temos nenhuma aplicação (pelo menos sob minha orientação) que use EJB, como não temos nenhum sistema distribuído e dificilmente teríamos (pelo contexto do nosso trabalho), nunca tivemos tal necessidade.

Banco de dados

Oracle 10g. Diferente do servidor de aplicações, o banco da Oracle na minha concepção é o melhor que existe (alguns dizem que é o IBM DB2, mas eu acho o Oracle). Mas mantenho o brinquedo MySQL instalado para testar as coisas devido a facilidade de instalação e manipulação.

Uso o programa DbVisualizer (que é feito em java) para trabalhar diretamente com os bancos de dados. Ele tem recursos menores se comparado às ferramentas nativas que são disponibilizadas pelas Players dos próprios bancos, mas como acessa todos os bancos que acesso diretamente: SQL Server (legado), MySQL (testes) e Oracle (produção e desenvolvimento), tenho preferência por ele.

Integração Contínua

Não temos um ambiente que enfatize a integração contínua e metodologias ágeis, nossa metodologia tem como base ainda se espelhar no IBM RUP (apesar de não ser o RUP).

Usamos o DotProject (provisoriamente) como gerenciador dos projetos. Não é a melhor ferramenta, aliás é muito fraca de ser considerada uma boa ferramenta, mas por enquanto o custo/benefício dela está falando mais alto, mas já existem movimentos de substituí-la. Esse é um exemplo de que a filosofia não deve falar mais alto que os aspectos técnicos, tínhamos uma base no uso do MSProject, que é muito superior ao DotProject, mas foi relegado em nome do Software Livre pela desculpa dos custos. Esse é um ponto onde o SL sempre perde pontos. Talvês existam softwares livres melhores que o DotProject que poderiam ter sido comparados ao MSProject, mas trocar um software que está funcionando corretamente por questões de custos não é uma boa alternativa, afinal o ROI medido posteriormente desmereça essa troca.

Nosso sistema de controle de versões é o velho e fantástico CVS que já tem suporte nativo excelente no Eclipse, mas vamos mudar para o SVN nesses próximos dias, posteriormente blogarei sobre essa mudança. Existe uma equipe que trabalha com o MSSourceSafe que deverá usar o SVN também, vamos ver o que vai sair dessa mudança, sinceramente eu não tenho opinião final formada sobre isso. Acredito que pode não ser uma boa idéia, já que essa equipe trabalha com DotNet e a integração entre o VisualStudio e o Sourcesafe seja bem melhor (evidente) que com o SVN, vamos ver.

Como eu mencionei, não enfatizamos (infelizmente) os métodos ágeis, mas tento seguir as boas práticas do XP, como não tenho um sistema de geração de builds, tento controlar usando o velho Apache Ant mesmo, tenho um script antigão aqui que coordena o processo inteiro, quem sabe não tenhamos um CruiseControl por aí em breve (que seria um salto extraordinário), quem sabe.

Agora nosso "Calcanhar de Aquiles" é o sistema de Issue Tracking daqui, é uma solução In House H-O-R-R-Í-V-E-L (como ficou gay meigo essa declaração). Já está sendo providenciado outra solução, mas In House também o que é uma pena devido a enorme lista de sistemas excelentes que existem por aí.

Last But Not Least…

O mais importante não é montar um ambiente de desenvolvimento ou simplesmente achar que conseguirá manter o mesmo pelo resto da vida e sim ter consciência de quais são as necessidades e como suplantá-las sempre procurando a melhor ferramenta que se adapte aos seus projetos. Espero que esse post ajude aos novatos como um passo inicial para pesquisar sobre aquilo que melhor o satisfaz na busca por um ambiente produtivo.

Um dos assuntos corriqueiros que volta e meia surgem em fóruns ou listas de discussões é o surgimento de uma linguagem "x" ou súbito interesse sobre ela por parte da mídia especializada.

Tomem como exemplo o Ruby, desde meados da década de 1990 que a linguagem existe, mas somente com o surgimento do "Ruby on Rails" que a linguagem alçou ao posto de "destaque do ano", isso como algo por volta de 10 anos depois de sua criação. Subitamente os velhos Rubistas se viram lado a lado com centenas de joviais newbies insuflando a gordura normal que toda tecnologia candidata a Hype provoca.

Mas a atenção atraiu hackers que antes estavam apenas com Python, Perl, Lisp ou outra linguagem não "Enterprisey". Assim como também atraiu boa gente de Java e C#.

Brigas desnecessárias já foram travadas entre Java vs Perl, Java vs Python, Java vs C#, Java vs Lisp, etc. (Me refiro especificamente sobre Java porque acompanho mais de perto o Java, mas aconteceram e acontecem brigas entre as outras também). Ultimamente acompanhamos discussões entre Java vs Ruby.

A bala de prata

Sempre que uma tecnologia tem maior "Market Share", ela será alvo das críticas principais, assim foi com o Delphi e VB quando o Java pretendia ser a líder de mercado, lembro que todas as críticas eram destinados a essas duas plataformas, o pessoal de Perl e Java eram até aliados na guerra contra VB nessas horas.

Mas linguagens são criadas e pensadas para resolverem problemas especificos ou voltadas a trabalhar em um contexto especifico, seja ele necessitário ou mercadológico.

Dificilmente voce conseguirá desenvolver toda e qualquer aplicação em apenas uma linguagem ou plataforma, mas isso não quer dizer que uma aplicação fica melhor com Java ou com C#, porque ambas praticamente são do mesmo contexto, não é essa diferença que enfatizo, e sim se o contexto favorece a determinada linguagem.

Eu fui infelizmente um defensor dos monoglotas, até o início de 2005 eu praticava apenas Java e via com maus olhos toda e qualquer linguagem pelo simples preconceito, na verdade era mais  uma discriminação por autodefesa. E olhe que conheci Clipper, C e Pascal na faculdade, trabalhei com Delphi um tempo e tinha um bom conhecimento com Javascript(pelo menos eu achava). Não sou psicólogo mas imagino que eu me apavorava com a possibilidade de ter que reaprender toda a sintaxe de uma nova linguagem, novos frameworks, novas APIs e tudo mais. Olhe que estávamos ainda no auge do Struts-like.

Admirável mundo novo

Com o surgimento do Ajax e consequentemente a popularização do Javascript como linguagem OO, me especializei a fundo na ECMA-262 como tinha feito com o Java mas nunca com outra linguagem. 

Esse novo mundo que conheci me trouxe mais dúvidas do que certezas. Assim como voce só aprende inglês se submergir na cultura de Shakespeare, voce só aprende uma linguagem de programação se penetrar no contexto ao qual ela foi pensada para sua concepção.

Como entender Closures quem vinha de Java?

A tendência natural era achar que era a mesma coisa de "Inner Classes". Quando voce realmente entra no contexto, as nuances antes não percebidas quase magicamente saltam aos olhos.

Como falei em um post anterior, se voce que faz um curso regular em uma Faculdade de Ciência da Computação e aprende a construir uma linguagem, aprender várias linguagens é algo singelo.

Como soluciona isso?

No estudo do Javascript como linguagem orientada a objetos (e não mais uma auxiliar para formatação de data e validação de inputs HTML), me deparei com contexto inéditos para mim, e problemas antes sequer diagnosticados.

Isso me provocou a natural curiosidade nerd de conhecer outras linguagens, pelo menos teoricamente.

Conceitos como Closure, Currying, Continuation, Design By Contract, Actor model, Lazy evaluation, Tail recursion, Quine e tantos outros (só para citar algumas features de algumas  boas linguagens) voce não conhecerá na faculdade, e imagino que nem na pós e nos mestrados da vida. Devo admitir que nem haveria espaço para tanto, a faculdade (como sempre enfatizei) é apenas um local para socialização, algo como: "entre um networking e um fórum".

Solucionar um problema não é conhecer sua resposta e sim as perguntas necessárias, conhecer antes de tudo a pergunta certa. Eu posso criar uma aplicação qualquer em java, isso vai me custar uma quantidade "y" de recursos, com a plataforma/linguagem "z" eu construiria em "y/2" dos recursos.

Quantas linguagens voce está disposto a aprender?

Conhecer outras linguagens é conhecer outras culturas, é abrir mais uma janela para o conhecimento.

"Infomação não é conhecimento, conhecimento não é sabedoria…" [Frank Zappa]

Concordo com o Zappa, a sabedoria está mais ligada à capacidade de responder a um determinado questionamento do que simplesmente a ter mais informações. Mas uma informação é crucial para determinar o rumo de uma investigação, quando voce está planejando a resolução de determinado problema, quanto mais subsídios puderem embasar sua avaliação, melhor.

Em outras palavras, se voce conhece mais culturas, voce tem a chance de encontrar não somente uma resposta ao problema, mas sim a melhor resposta. Vou mais além, poderá até diagnosticar o problema, antes de sequer ser sabido.

Selecionei as linguagens que pretendo aprender por contexto, como prototype-based (IO, Self, Lua e Javascript) , Funcionais (Erlang, Scheme, Haskell) e assim por diante, não me preocupo com sintaxe ou decorar APIs, mas como e porque elas foram desenvolvidas. Pode ser que eu nunca as use em algo, quem sabe, mas no mímino me abrirá a mente para enfrentar os problemas do cotidiano com mais tranquilidade.

Hoje li esse post do Daniel Q. Oliveira no meu reader sobre essa discussão no GUJ. Interessante porque me faz refletir esse momento que estou vivendo, acompanhem porque pode se traduzir em novos posts de gente que tem sempre muito a compartilhar, só feras na discussão.

CURSO AJAX AVANÇADO

Dos conceitos avançados no desenvolvimento de aplicações WEB com AJAX até o domínio dos frameworks UI mais produtivos, o curso explicará em detalhes as principais técnicas utilizadas pelas empresas de WEB2, de maneira que o aluno seja capacitado a criar aplicações personalizadas e arrasadoras.

Foco nos frameworks UI (DWR, YUI e Ext),  JavaScript orientado a objetos e na linguagem JAVA como implementação no lado servidor.

Pré-requisitos:
Desejável conhecimento de HTML, programação, javascript e linguagem JAVA.
(O curso não requer comprovação, mas esses assuntos básicos para o entendimento não serão revistos)

Datas:
Sábado, 12/05/2007 (13:00 as 17:00)
Sábado, 19/05/2007 (13:00 as 17:00)
Sábado, 26/05/2007 (13:00 as 17:00)
Sábado, 02/06/2007 (13:00 as 17:00)

Carga Horaria:
16hrs (4hrs em 4 sábados)
   
Valor: 
R$ 55,00 reais (à vista)
Aluno da FLF tem desconto de 20%.

Inscrições:
Reservas por internet, preencha o formulário de contato no endereço http://www.milfont.org/blog/?page_id=51
Reservas somente enquanto houver vagas (máximo de 20 vagas), portanto garanta já a sua.

Pagamento até o dia 04/05 na sede da Faculdade Lourenço Filho

Material:
CD com ferramentas utilizadas, material didático exclusivo e código das aplicações a serem vistas.
Certificado de conclusão no formato digital ao término do curso. (Qualidade a ser impresso em papel fotográfico)

Local:
Faculdade Lourenço Filho.
Rua Barão do Rio Branco, 2101 Centro
Fortaleza – Ceará CEP 60025-062, Fone/Fax: (85) 4009.6060

Professor:
Christiano Milfont
Analista de Sistemas da SEPLAG – Secretaria do Planejamento e Gestão do Estado do Ceará.
Arquiteto Java da Triadworks ASG ( http://www.triadworks.com.br)
http://www.milfont.org

Grade:

  1. Fundamentos de Ajax – 12/05/2007 (13:00 as 17:00)
    1. Overview do XHR
    2. Iniciando com DWR.
    3. Padrões WEB, melhores práticas no uso do Ajax
  2. Javascript Avançado – 19/05/2007 (13:00 as 17:00)
    1. O que é JSON e como usá-lo
    2. Javascript Orientado a Objetos
    3. DWR avançado
  3. Usabilidade e Frameworks UI – 26/05/2007 (13:00 as 17:00)
    1. MVC original implementado na web
    2. Componentes UI com YUI e Ext
  4. Melhores práticas  – 02/06/2007 (13:00 as 17:00)
    1. Minificação (Jmin), Verificação (JSLIN) e Documentação (JSdoc)
    2. Testes unitários (JsUnit)
    3. Uma aplicação completa