Urgente, atualizem seus feedreaders :)

Criei um blog para falar somente sobre desenvolvimento, na verdade eu tinha criado já tem uns 2 meses, mas a falta de tempo e a preguiça clássica impediram de lancá-lo.

Prometo um post novo todo santo dia, o foco como não poderia deixar de ser, vai ser as tecnologias que dão vida a WEB 2.0. Claro que não impede de falar sobre outras coisas como desenvolvimento desktop e assuntos que eu achar relevante e que seja ligado ao desenvolvimento.

Esse blog vai continuar sua existência, ficará para todos os outros assuntos não ligados a desenvolvimento de software. Há tempos reclamavam que eu falava muito de política e outros assuntos que não interessam os NERDS.

Ahhh… link do blog novo: CMilfont Tech

O estágio é um modelo de trabalho muito específico, eu não confiaria um código importante nas mãos de estagiários. Não desmerecendo as pessoas, se você é estagiário e sabe codificar bem então sua empresa está desvalorizando seu potencial, saia enquanto é tempo.

Contratar um estagiário é empregar alguém “verde” para acompanhar os projetos como um assistente, mas sem grande responsabilidades. Imagina um médico pedindo ao seu estagiário para ir cortanto o paciente enquanto ele toma café. É assim que várias empresas tratam seus estagiários.

O estágio é uma preparação de alguém ainda imaturo naquela área que abraça, por isso defendo o estágio desde o início dos cursos superiores.

Durante o almoço eu conversava sobre a condição que alguém se encontra para ser estagiário, elaborei aqui um pequeno roteiro para entrevista, tentar sumular essa sabatina como um teste oral:

1 – Participa de projeto Open Source?
2 – Quantas regras de normalização você conhece (lembra)?
3 – Usa DOCTYPE declarado como transitional no XHTML 1.1?
4 – Qual o equivalente da função addEventListener no IE?
5 – Voce usa um FeedReader web? poderia exportar para mim, como OPML, seus feeds mais importantes?
6 – Ainda lembra do resultado de uma derivada de qualquer função constante?
7 – Usou pnuts ou beanshell como DSL?
8 – Já precisou implementar herança no javascript via método call.
9 – Conhece a diferença de Continuation entre Ruby e como o praticado pelo RIFE?

Explanações

1 – Participa de projeto Open Source?

Qual a vantagem? demonstra que o cara pelo menos experimentou codificar entre gigantes, acompanha um projeto, tem uma certa experiencia que é dificil em novatos. Agora cuidado com quem é fanático, tipo o cara dá piti se tiver que trabalhar em uma estação Windows.

2 – Quantas regras de normalização você conhece (lembra)?

Geralmente voce só se preocupa com normalização se for DBA ou fez cadeira na faculdade, se pelo menos ele lembrar que são basicamente 3 mais importantes e mais 3 extendidas, é sinal que já estudou DML e DDL. Daí pode extender a conversa para controle de transação entre outras coisas.

3 – Usa DOCTYPE declarado como transitional no XHTML 1.1?

Se o cara não tiver idéia do que é isso ou enrolar é porque sabe pouco de web, se seu negócio/produto é baseado na web não é legal pegar alguém tão cru nisso.

4 – Qual o equivalente da função addEventListener no IE?

Mostra que o cara conhece DOM Events e no mínimo tem uma vivência legal na web.

5 – Voce usa um FeedReader web? poderia exportar para mim, como OPML, seus feeds mais importantes?

Essa pergunta para mim é a mais importante e serve para qualquer área/cargo.
Para nossa área mostra que o indíduo é no mínimo geek, eu não gosto de trabalhar com não-geeks no desenvolvimento.

6 – Ainda lembra do resultado de uma derivada de qualquer função constante?

Só para saber se o cara é nerd mesmo e detectar o nível :)

7 – Usou pnuts ou beanshell como DSL?

Se ele souber pelo menos o que é uma DSL já está de ótimo tamanho, se usou alguma dessas linguagens talvês esteja maduro demais :)

8 – Já precisou implementar herança no javascript via método call.

Mostra que conhece detalhes da linguagem e sabe trabalhar com ela, dificilmente alguém com perfil de estagiário saberá.

9 – Conhece a diferença de Continuation entre Ruby e como o praticado pelo RIFE?

Se souber o que é Continuation, já está muito maduro. Se ele conhecer o RIFE já é grande coisa, imagina ainda mais a diferença entre Ruby e RIFE :) , deve ser contratado como desenvolvedor direto (mas o que ele estaria procurando em uma vaga de estágio?)

Modelo relacional prejudica a asbtração

Nos últimos tempos venho intrigado pensando porque a cultura Java se volta tanto ao modelo VO-DTO-BO que se popularizou, nas minhas investigações empíricas descobri um dos causadores e portanto levanto a hipótese que o modelo relacional pode provocar uma naturalidade na abordagem desse modelo.

Lembro que fiz um curso ano passado pago por voces (o governo pagou) de análise de sistemas orientado a objetos e aprendi segundo o professor, que um modelo eficiente em java é construir uma classe para cada tabela, uma action, um value object e um Business Delegate sempre. Assim como receita de bolo, e se dependendo da tela eu deveria criar um DTO para trabalhar em cima dos dados especificos da tela em questão.
Detalhe importante, isso para qualquer sistema, desde aquele cadastro de locadora (Hello World de faculdade) à mega-hiper-supergerenciador financeiro. Vale dizer que o curso não me trouxe nada significativo, seu dinheiro foi totalmente disperdiçado, mas pior, deve ter confundido umas duas dúzias de programdores não-java (eu era o único que trabalha com java).

Bancos relacionais são os vilões

Desde que os Bancos de dados relacionais se firmaram no mercado que todo desenvolvimento é orientado a relacional. Observe que o desenvolvimento orientado a eventos que fez tanto sucesso com Visual Basic e Delphi é basicamente uma camada de manipulação das tabelas de um banco relacional. A orientação a objetos também sofre com isso. Não a orientação em si, mas a maioria dos desenvolvedores.

É evidente que o modelo relacional é eficientíssimo e trouxe uma evolução em todos os aspectos na manipulação dos dados, quem se lembra quando programava sem banco sabe muito bem disso. Cada projeto basicamente voce tinha que construir seu próprio banco de dados, garantir na aplicação concorrência e a segurança, entre outras coisas. Não sou tão velho, mas lembro que bancos de dados no Brasil eram luxo na década de 80 e ainda na primeira metade da década de 90, voce não tinha opções como existem hoje, muito menos cultura.

Com a popularidade dos bancos de dados, todo o trabalho de manipulação ficou resumido ao SQL. Isso evidentemente causou um consenso imediato no mercado, dificilmente um projeto que precise manipular dados e persistí-lo (quase todos) se dá ao luxo de não usar um SGBD. Toda a orientação a eventos foi por anos beneficiada pelo uso do SGBD.

A orientação a objetos se firmou como um conceito padrão de mercado pelo sucesso de linguagens como Java (que pela primeira ves na história uniu o mercado ao ambiente acadêmico, antes o que era sucesso em um como Delphi ou VB, não era usado em outro como C) que inspiraram outras como C# e que essa OO é a base de toda linguagem moderna como Ruby. Mas todo projeto usa os SGBDs que está baseado no modelo relacional e se choca com o desenvolvimento orientado a objetos.

A cultura relacional é ainda dominante e será em muito tempo, inclusive que a grande maioria dos desenvolvedores inciam em conceitos que não o orientado a objetos e difcilmente aprendem de forma correta, se limitando a imitarem o modelo relacional com uma linguagem OO.

Mapeamento Objeto Relacional

O mais comum que já presenciei é iniciarem um projeto pelo modelo relacional do banco ou influenciados por ele, mesmo quando se inicia modelando as classes, todos os diagramas já são pensados em como vão ficar como Entidades.

Isso é muito comum, primeiro inicia o modelo E/R, depois vai fazendo as classes e se aplica toda a OO do projeto, por isso fica quase impossível uma cultura que não caia na tentação de simular as tabelas como classes, daí surgirem os famigerados VOs diferentes do que determina o Pattern.

No mundo Java, a arquitetura Entidade-Classe, onde cada entidade do modelo relacional possui uma classe correspondente não é o melhor mapeamento, quando não o pior. Mas essa cultura de se pensar no modelo relacional provoca essa associação

Hoje com ferramenta como Hibernate, o custo de desenvolvimento do mapeamento cai drasticamente, mas mesmo assim não faz milagres, ainda moldamos certos relacionamentos pela característica relacional da coisa.

Os testes unitários tambem ajudam a isolar o aspecto de tratamento de dados da aplicação, mas se você trabalha sem um ambiente ágil que siga rigorosamente uma metodologia que prioriza os testes unitários, fica quase impossível não cair na tentação de implementar diretamente. Precisa muito autocontrole para não burlar a ordem do desenvolvimento.

Recentemente iniciei em um projeto novo de desenvolvimento e caímos na modelagem do banco, foi muito trabalhoso tentar incutir nas pessoas que a modelagem OO nada tem a ver com o modelo E/R e que esse poderia ficar para uma etapa posterior ao desenvolvimento do domínio da aplicação, pelo menos dos casos trabalhados, mas a resistência é enorme a uma abordagem que não possuam um banco diretamente.

Aplicar um desenvolvimento OO puro no domínio da aplicação hoje é dificil pela cultura dos bancos relacionais mas não impossível, não temos cultura suficiente para isso, basta dizer que no Brasil OO ainda é novidade comparado com toda a literatura e situação na civilização mas chegamos lá.

Minha fé se concentra nas ferramentas de mapeamento como Hibernate que influenciaram especificações como a JPA.

Veremos.

Sem muito tempo para escrever, rabiscarei algumas considerações sobre a "Engenharia de Software" no ano da graça de 2007 que me deixam profundamente enojado.

Tivemos avanços significativos no modo como fazemos software nos últimos anos, deixamos de lado analogias com a construção civil e focamos nas características mutáveis do software para tentar entendê-lo. Tudo vai bem a não ser o temor que tenho de que os abutres do charlatanismo virão agora atrás da carne fresca, não deixarão sequer o animal morrer para estraçalhá-lo.

Hoje mesmo comentei nesse post do Rafael Carneiro sobre o problema estar nas pessoas por não entenderem a metodologia do que propriamente na metodologia. Comentei que daqui a pouco essas empresas todas correrão atrás dos métodos ágeis para enfeitarem seus portfolios e não serão nada ágeis, assim como não sabem aplicar o RUP. O problema não está na metodologia, eu me enganei quando pensei que o RUP que era errado, as pessoas é que não entendem como usar.

Pois bem, colaram no meu gtalk o link de uma discussão no GUJ sobre uma matéria da revista EXAME com o título "Fábricas de informação". Eu li a discussão sobre trechos da reportagem após o almoço, ou seja, vomitei a parte mais gostosa da feijoada, toda aquela gordurinha dos nossos amigos suínos que não havia sido digerida ainda. Não que o problema seja da revista ou do autor da matéria, pelo contrário, a matéria não se inclui na categoria de não ser especializada porque as maiores empresas de consultoria (como TCS, EDS, BRQ, IBM, Accenture, Stefanini) colaboraram com a reportagem e concordam 100% como tudo que foi escrito.

Essas empresas daqui a aproximadamente 12 meses estarão contratando profissionais especializados em metodologias ágeis que possuam certificação Scrum e afirmarão que apenas os possuidores de CMMi nível 5 serão capazes de desenvolverem softwares adaptáveis. Um mercado editorial se alargará com obras como "Seja ágil em 24hrs" e "Como se tornar um ScrumMaster". O ciclo recomeça, e tome palestras organizadas pela VOCE S/A para explicar aos acionistas o que os CIOs querem fazer com aquele aumento de 2% no orçamento trimestral, isso tudo aliado a buzzwords lindas e emotivas que fazem a gente se orgulhar de ter um diploma de Bacharel em Ciência da Computação na sala da avó materna.

Como hoje meditei, fiz Yoga, acendi um incenso e tomei um chazinho, não vou me alongar nesse assunto.

Fiquem com um pouco de sabedoria chinesa que escreveram na revista, daquelas de 1,99:

"A produção é organizada como numa linha de montagem. É comum que estes profissionais nem saibam exatamente para que serve o software que estão criando."

Já que gostam tanto de analogia, imagina agora um padeiro recebendo parte da receita e tentanto imaginar o que está "programando", será que é assim que funciona uma padaria? Essas empresas nem para budega servem, mas tem CMMi5.

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.

Next Page »