quarta-feira, abril 18, 2007
Grandes decepções
Eu estava comentando com uns colegas sobre "grandes idéias brochantes", ou seja, idéias que inicialmente pareciam muito boas, mas que depois descobrimos alternativas melhores, ou descobrimos que não eram lá tão boas assim.
[AVISO! O conteúdo a seguir é de alta octanagem e pode causar flame wars ao menor contato com trolls e outros cabeçudos de plantão. Lembre-se que essas opiniões são baseadas na minha experiência pessoal. Sua opinião pode ser diversa e sua experiência pode ser outra, por isso, se quiser dizer que estou errado e sou um idiota, seja no mínimo educado, pra não passar por troll. (E se me ofender, vou aí chutar sua bunda!)]
Vou colocar meus 2 centavos de "grandes idéias brochantes" que aconteceram comigo:
Brochante 1: RUP
Em idos de 1998, quando descobri RUP, achei que era "O" processo. Que a coisa era a solução definitiva para os problemas de projetos de software mal feitos. Comecei a estudar com afinco, e pensei "Nossa, quanta coisa! Mas um bom processo deve ter definição pra TUDO, então tá certo."
Depois, tive que fazer um projeto que usávamos um pouco de RUP. No início achei que tínhamos problemas porque estávamos usando pouca coisa, aí aumentamos nossa "aderência" ao RUP. Resultado: tempo gasto com documentação, menos desenvolvimento, documentos desincronizados, mais tempo com documentação, menos desenvolvimento... e no final, ainda muitos bugs e nenhuma estimativa confiável. Fiquei meio com um pé atrás, será que eu tinha errado? Primeira experiência com a coisa, acho que não tinha usado certo.
Aí conheci XP. Primeiro projeto besta que apareceu, experimentei. Ótimos resultados. Apareceu um projeto grande, experimentamos XP. A cada prática que colocávamos do XP, melhoravam os resultados. Conclusão: brochei do RUP.
Brochante 2: SOAP
A primeira vez que vi, achei que web services com soap eram a melhor invenção desde o pão fatiado. Ainda mais a integração que ele tinha com a plataforma .NET, super simples e fácil.
Um pouco mais tarde, descobri que o negócio era meio complicado, já que, fora do .NET, mexer com SOAP era um pesadelo (era o tempo do Apache-SOAP ainda, nem existia o Axis).
Daí, tive que fazer integração com alguns clientes que estavam usando simples "XML Vai, XML Vem" (protocolo "XV2") com posts e gets. Foi simples, fácil e muito rápido. Pronto, brochou geral. Hoje minha mente buzina "muita solução pra pouco problema" toda vez que penso em SOAP. E olha que isso foi antes d'eu conhecer RESTful Web Services.
Brochante 3: Aspectos
Quando conheci aspectos, achei a coisa mais poderosa do mundo. Simples, não intrusivo e resolvia grandes problemas.
Comecei a estudar. Até ajudei um colega a fazer um chat P2P de brincadeira em que a encriptação das mensagens era feita por aspecto. Colocava aspectos, pum, mensagens encriptadas; tirava aspectos, pam, mensagens plain text. Fantástico! Comecei a sonhar com uma camada de persistência não intrusiva, toda feita com aspectos.
Aí conheci RUBY e o "alias". Fiz tudo que fazia com aspectos sem esquentar a cabeca com pointcuts, advices e outros blah blah blahs. Resultado: brochei de Aspectos.
Hoje, quando Aspectos me vêm à mente, tem uma tag mental escrita: "classes abertas + alias, ponto final". Já tentei não pensar nisso, mas não adianta, encalacrou...
Brochante 4: Portlets
Quando vi, achei uma boa idéia. Era a componentização para web, finalmente! Com um pouco mais de trabalho, a idéia serviria pra fazer componentes que poderiam ser utilizados em aplicações "não-portal". Comecei a estudar...
De cara, achei muito tosco, submeter todo o form e tentar manter o estado de cada Portlet era uma gambiarra sem fim... Mas vá, ossos do ofício, já que a web funciona assim. Comecei a achar que componentes pra web não eram lá uma idéia muito boa (ainda acho isso...).
Aí apareceu o Gmail, com intenso uso de AJAX. Olhei pros Portlets, pensei em como fazer eles em AJAX e pensei... "poisé, tou perdendo tempo"...
Sei que AJAX tem muitas limitações, conheço elas porque uso muito AJAX. O que só reforça minha idéia de que "aplicação web não pode ser pensada como se fosse desktop". Mas sinceramente, entre eles e Portlets... :
Brochante 5: Java
Essa foi engraçada, brochei antes de conhecer a linguagem.
Em meados de 2000 eu trabalhava com Perl Orientado a Objetos (é... existe sim), e fiquei curioso quanto ao Smalltalk, já que todos os lugares falando sobre orientação a objeto mencionavam Smalltalk de um jeito ou de outro. Resolvi aprender...
Fiquei maravilhado com a linguagem: simples, poderosíssima, ambiente integrado onde eu alterava os sistemas "à quente". UAU!
Aí apareceu a oportunidade de trabalhar com Java, uma vontade que eu tinha desde os tempos de faculdade, pois todo mundo elogiava. Cheguei cheio de espectativas: "Java é bem mais novo, é orientado a objetos e deve ter todos os conceitos do Smalltalk, mas com tipagem forte!" ... Frau frau frau... Brochação geral... Collections ridículas, sem closures, pouca extensibilidade, ciclo de compilação full e nada de alterar a coisa "à quente". E a tipagem estática mais atrapalhava do que resolvia.
Conclusão: Hoje gosto muito do Java e desde lá venho usando ele 8 horas por dia, 5 dias por semana. Mas se me perguntarem se é a melhor linguagem pra programação... beeeeemmmm... tenho saudades de collections com closures...
Lições aprendidas...
O que foi que aprendi com essas "brochações"?
Aprendi que nem toda idéia do "mainstream" é uma boa, e a olhar propaganda com muita desconfiança. Aprendi que é bom olhar o underground da computação em busca de idéias novas, ou pior, de velhas idéias fantásticas que nunca caíram no gosto da maioria.
Hoje sei que sou um programador melhor a cada vez que gasto tempo aprendendo algo que me faz pensar diferente... ando aprendendo LISP... espero que dê frutos (já deu, pra ser honesto)
segunda-feira, março 19, 2007
Arquitetura três camadas é um mito sobre desacoplamento...
Uma coisa que aprendemos desde nosso primeiro "if-else" em programação é que aplicações devem ser feitas em 3 camadas (ou mais), a saber: apresentação, aplicação e persistência.
Uma arquitetura muito similar a ela é a popular MVC, que separa as coisas de forma parecida, mas a camada de persistência some dentro do "model" e a camada de aplicação é dividida entre "model" (com regras de negócio) e "controller" (que funciona como "cola" entre View e Model).
Hoje em dia, boa parte das arquiteturas pra web é um misto de MVC com 3 camadas, num bororô formado por frameworks de apresentação, controllers temperados com "Dependency Injection" e um mapeador objeto-relacional. Tudo isso somado fornece o melhor nível de desacoplamento possível no sistema. É possível até mesmo trocar de banco de dados Oracle pra SQL-Server trocando apenas umas poucas linhas...
Mas será que é desacoplado mesmo?
Que tal experimentar o desacoplamento com uma alteração bastante comum como, vejamos... adicionar um campo? Bom, temos que mexer na view pra adicionar o campo, tb temos que mexer na camada de negócio para tratar o campo e validar, aí temos o transporte (V.O.s?) onde temos que adicionar o campo, e finalmente, adicionar no banco (o Hibernate até gera o campo pra vc, só que ele não migra os dados quando acontece a evolução do esquema, é na base da recriação da tabela).
Okay, o que temos aqui? Uma simples alteração gerou uma "shotgun surgery" no código, necessitando de alterações em todas as camadas.
Agora a questão é, como eu ISOLO isso? E, sendo mais cínico, de que me adianta trocar de banco com uma linha (e muito raramente eu faria isso), se para adicionar um simples campo eu preciso espalhar as alterações pra todo lado?
Eu já vi a algum tempo atrás na web alguns artigos com a mesma preocupação, eles tinham até um nome pra isso, mas sinceramente não consigo me lembrar, e por consequência, não acho mais os artigos :( Se alguém achar, me dá um toque.
quinta-feira, janeiro 11, 2007
De volta de lugar nenhum, não fui mesmo.
Depois de dar um gás no RubyOnBr e ele ocupar todo tempo livre q eu tinha pra escrever besteira, resolvi voltar a blogar.
E como jurei solenemente pela tira dos malvados que ia ser um cara legal esse ano, vou dar um tempo com meu outro blog :)
Agora é pau na máquina e no código.
sexta-feira, abril 07, 2006
Meu último post
Vou aposentar meu blog.
É isso mesmo. ("Grandiscoisa", né?)
Depois de ouvir muita piada do Bart e do Marlus sobre como eu só posto reclamações, resolvi assumir que sou um resmungão mesmo. Então estou aposentando esse blog.... ... e criando outro :D
Agora sim o blog vai ficar bom: http://josebuscape.blogspot.com
Poisé... é isso :)
quinta-feira, abril 06, 2006
Web tranqueiras úteis
Engraçado, tou cada vez mais usando coisas web e menos aplicativos locais. Eles são muito mais simples e com menos recursos que os aplicativos locais, mas o fato de você poder compartilhar as coisas faz toda a diferença.
Aqui estão algumas web tranqueiras que eu ando usando:
del.icio.us (http://del.icio.us/rmuliana) -> Meu "bookmark social". Já não vivo sem isso.
blog (http://mecanicamente.blogspot.com) -> Uso mais pra compartilhar idéias com colegas e frequentemente, comigo mesmo.
flickr (http://flickr.com/photos/rmuliana) -> Compartilhar fotos. Uso pouco, mas quando uso, vem muito a calhar.
writely (http://writely.com) -> Escrever e compartilhar documentos de texto. Estou "começando a começar" a usar agora.
jobby (http://www.gojobby.com/Jobby/Resume/?user=986) -> Site para empregos utilizando a filosofia "Web 2.0". Meu currículo está lá e eu assino o RSS com programadores Java no Brasil. Cada indíviduo com o perfil que eu quero que entra lá, meu RSS já "apita".
segunda-feira, abril 03, 2006
Justo quando estou tentando fazer as pazes com Java...
Essa eu até tinha esquecido até 5 minutos atrás quando precisei de novo:
"Como você copia um arquivo em Java?"
Resposta: Abra dois streams e copie bytes de um para o outro....
COPIAR BYTES!!!!!! Ahhhh... Fala sério!!!
Entrou pra minha lista negra, junto com Calendar e Date: File
quinta-feira, março 23, 2006
Parei de brigar com Java
Tem um monte de coisas que eu não gosto no Java. Collections meia boca, Date e Calendar cretinos, falta de closures, "estupidamente" tipado e outras coisas mais.
Porém, tenho que reconhecer que ele tem partes excelentes, a nova api para concorrência (do Doug Lea), muitas APIs pra tudo que você puder imaginar, uma comunidade grande (Apache inclusa), excelente IDEs (como o Eclipse, IntelliJ, Netbeans).
Sem falar que eu trabalha fazem muitos anos com Java, então tenho um domínio da linguagem muito bom.
Então, decidi que ao invés de ficar reclamando como sempre, vou implementar as idéias que eu gosto (a maioria roubada de Smalltalk e Ruby) e fazer o melhor possível com o Java, usando o que é bom dele. Não dá pra fazer milagres, mas dá pra melhorar bastante.
Minha Wishlist:
- Collections: Por enquanto, acho q vou me limitar a usar o Apache commons
- Date e Calendar: ("muitas APIs") vou começar a usar Joda-Time. Parece muito boa!
- Closures: Isso não tem muito jeito. Já via algumas libs legais pra Closures (tem uma aqui muito boa) Mas Closures em Java continua não sendo fácil de usar. Principalmente porque a sintaxe fica desajeitada e porque as coleções não suportam elas (justamente onde são mais úteis). Vou usar o que tem do Apache e provalemente criar uns helpers para classes anônimas, se eu já não achar isso na net.
- Structs: Tipo beans, mas dinâmicos. Tem o Apache commons pra beans, bem útil. Mas vou criar umas pequenas estruturas para mim. Ia ser legal achar um nome tipo "Beans" :D Sei lá... o que é menor que um feijão (ou grão) e mais gostoso? "Berries"? "Café solúvel"?
Vou ver se junto tudo, faço um Jar legal e adiciono nos meus projetos.
Aquela história: "não adianta reclamar se você não vem com alguma solução"
Assinar:
Postagens (Atom)