Blog de Jarley Nóbrega
Artigos com o marcador Java
O Futuro de Java
09/03/10
Interessante post de Eric Bruno sobre o futuro de Java como plataforma e linguagem de programação. O post original pode ser visto aqui. Um dado curioso extraído do texto é sobre a quantidade de linguagens dinâmicas que atualmente utilizam a JVM para rodar. A lista inclui Rexx, Ruby, JavaScript, Python, PHP, Groovy, Clojure e Scala.A justificativa para esse movimento é a melhora sensível na execução das aplicações através de recursos como os compiladores Just-In-Time da plataforma.
Apesar de muita gente nos últimos meses ter começado a fuçar outras linguagens em substituição a Java (eu me incluo nesse meio), a linguagem ainda é a mais utilizada pelos desenvolvedores, com mais de nove milhões deles construindo aplicações para as mais variadas plataformas e dispositivos. Um fato que assustou a comunidade Java foi a recente compra da Sun pela Oracle e as incertezas no futuro da plataforma geradas pela aquisição. Os caras da Oracle se comprometeram a manter o Java Community Process como o fórum de discussão e evolução da plataforma e adiantaram ainda que a nova versão (chamada provisoriamente de Java 7) trará algumas mudanças significativas, incluindo a modularização da JVM, o suporte nativo à outras linguagens e melhorias no suporte ao processamento com vários núcleos. A integração da JVM com o JRockit da BEA levará a criação de um novo mecanismo de garbage collection, trazendo alguns benefícios adicionais de performance para as aplicações.
Eric também prevê que o sofrimento atual dos desenvolvedores de aplicações para web na criação de interfaces com o usuário, deverá ser amenizado quando ocorrer a evolução natural das novas versões de JavaFX. Confesso que não me animei muito em estudar essa nova API, e atualmente estou estudando e desenvolvendo uma pequena aplicação com o Vaadin, um framework criado como uma extensão dos componentes de GWT. Assim que a aplicação entrar no ar, eu divulgarei a URL para vocês acessarem.
“10 good reasons to look for something better than Java”, de Mario Fusco
21/07/09
Tentando fazer o papel de advogado do diabo, repasso o interessante post de Mario Fusco. No texto ele fala de 10 razões para começar a pensar em uma linguagem que substitua Java.
“Don’t get me wrong. During my professional life I have written tons of Java code and of course I think it is a great language still. For sure it has been a great improvement from C++ and Smalltalk. But now even Java is starting to feel the weight of its 15 years.
Indeed during my experience I had to face up with some mistakes, flaws and lacks in its design and specification that made my Java programmer life less pleasant. With millions of Java programmers and billions of lines of code out in the world, I am far to say that Java is going to be dead in the near future. Anyway after the rise of some JVM compatible languages (my favorite is Scala), these issues are becoming even less tolerable and I am starting thinking that it is time to slowly move away from Java (but not from the JVM). More in detail, in my opinion, the 10 most important problems of the Java language are:
1. Lack of closure: I don’t think I have to explain this. Functional programming exists since decades, but in the last years they are gaining more and more interests, mostly because it allows to write naturally parallelizable programs. I partially agree with Joshua Bloch that underlined the problems of introducing them in Java as a second thought (the BGGA proposal was truly awful), but anyway their lack makes impossible to have any kind of real functional programming in Java.
2. Lack of first class function: this issue is in some way related to the former one but I believe it is even worse. The only way to achieve a similar result in Java is by using the ugly and sadly famous one-method anonymous inner classes, but it looks actually a poor solution. Even in C# has been provided a better one by the implementation of the delegate mechanism.
3. Primitive types: it should be beautiful if everything in Java was an Object, but they didn’t design it in that way. That leaded to some issue, like the impossibility to have a Collection of int partially resolved in Java 5 through the autoboxing feature (see below). It also generated some confusion between passing by value and passing by reference. Indeed a primitive data type is passed to a method by value (a copy of the data type is duplicated, and passed to the function) while true objects are passed by reference.
4. Autoboxing and autounboxing: this feature has been introduced in Java 5 to overcome the problems caused by the presence of primitive types. It allows to silently convert a primitive type in the corresponding object, but often it is cause of other problems. For example an Integer can have null value, but the same doesn’t apply to int, so in this case when the Integer is changed in an int the JVM can’t do anything else than throw a difficult to debug NullPointerException. Moreover it is cause of other strange behavior like in the following example where it is not so easy to understand why the test variable is false:
Integer a = new Integer(1024);
Integer b = new Integer(1024);
boolean test = a < b || a == b || a > b;
5. Lack of generics reification: generics are one of the cool features introduced with Java 5, but in order to mantain the compatibility with the older version of java they miss some important characteristic. In particular it is not possible to introspect their generic type at runtime. For example if you have a method that accepts as parameter a List<?> and you pass to it a List<String> you are not allowed to know at runtime the actual type of the generic. For the same reason you cannot create array of generics. It means that despite it looks quite natural the following statement won’t compile:
List<String>[] listsOfStrings = new List<String>[3];
6. Unavoidable generics warnings: have you ever found yourself in the impossibility to get rid of a bothering warning about generics? If you make a large use of generics like me, I bet you did. And the fact that they felt the need to introduce a special annotation to manage this situation (@SuppressWarnings(“unchecked”)) is symptomatic of the dimension of this problem and, in my opinion, that generics could have been designed better.
7. Impossibility to pass a void to a method invocation: I admit that the need to pass a void to a method could look weird at a first glance. Anyway I like DSL and while implementing a special feature of my DSL library (lambdaj) I had the need to have a method with a simple signature like this: void doSomething(Object parameter) where the parameter passed to this method is the result of another method invocation done with the only purpose to register the invocation itself and execute it in the future. With my big surprise, and apparently without a good reason, since the println method returns void, I am not allowed to write something like this:
doSomething(System.out.println(“test”));
8. No native proxy mechanism: proxy is a very powerful and widely used pattern, but Java offers a mechanism to proxy only interfaces and not concrete classes. This is why a library that provide this feature like cglib is employed in so many main stream frameworks like Spring and Hibernate. Moreover cglib implements this feature by creating at runtime a Class that extends the proxied one, so this approach has a well known limitation in the impossibility to extend and then proxy a final Class like String.
9. Poor switch … case statement: the switch … case as specified in java allows to switch only on int and (starting from java 5) enum. That looks extremely few powerful especially if compared with what offered by a more modern language like Scala.
10. Checked exception: like primitive types, checked exception have been one of the original sins of Java. They oblige programmers to do one of the following two equally horrible things: fill your code with tons of poorly readable and error prone try … catch statement where often the most meaningful thing to do is to wrap the catched exception in a runtime one and rethrow it; or blurring your API with lots of throws clause making them less flexible and extensible.
The real problem here is that the only way to fix the biggest part of the issues I mentioned is to take a painful decision and define a specification of the language that drops the backward compatibility with the current one. I guess they will never do that, even if I believe it should not be extremely difficult to write a program that allows to automatically translate the old Java sources in order to make them compatible with this new hypothetic release. And in the end, this is the reason why I decided to start looking for a better JVM compatible language.”
—
Esse post gerou uma boa discussão nos fórums do The Server Side, com um monte de gente se posicionando contra ou a favor. No meu ponto de vista, boa parte das fragilidades apontadas no texto podem ser resolvidas através de bibliotecas que estendem a linguagem. E falando francamente, não acho as alegações de Mario boas o suficiente para promover uma mudança de plataforma, principalmente quando levamos em consideração todo o legado construído na última década. Os problemas apontados por ele são reais, mas não impactam em nada na produtividade e extensibilidade das aplicações desenvolvidas em Java.
Uma das maiores reclamações da comunidade em torno de Java era que as ferramentas de desenvolvimento não seriam tão eficientes e produtivas como as encontradas para a plataforma .Net. Quem acompanhou as últimas versões do Eclipse e do Netbeans sabe que os recursos para construção de aplicações a partir de modelos ou templates já fazem parte do dia a dia de todo desenvolvedor. Para melhorar um pouco mais as coisas, novos frameworks surgem quase que diariamente com o objetivo de melhorar continuamente a maneira de desenvolver aplicações na linguagem (atualmente estou desenvolvendo meus projetos usando o Seam. Complexo e completo).
A discussão é boa, mas eu ainda pretendo investir algumas horas de meu tempo para melhorar as minhas habilidades como desenvolvedor Java. Mas como nada é eterno, não custa nada começar a olhar algumas coisas como Scala, Ruby on Rails, Grails e outras linguagens e frameworks da moda
Comparação Joomla X WordPress
26/06/09
Muito interessante o post de Klaus Peter Laube sobre a sua experiência no uso do Joomla e do WordPress como ferramentas para publicar conteúdo na Web. No artigo, ele relata porque prefere o WP como solução de publicação, enfatizando a simplicidade da ferramenta. Por outro lado, a complexidade na customização dos componentes do Joomla e os problemas de segurança ocorridos no passado fazem dessa solução um opção para sites mais complexos.
Como eu utilizo as duas ferramentas, tenho uma opinião parecida com a de Klaus:
- O Joomla foi feito para administrar o conteúdo de portais de tamanho médio, com uma curva de aprendizado razoável para customizar um site completo sem utilizar os famosos templates criados pela comunidade. O que me atrai mais nessa solução é a capacidade de agregar dezenas de componentes customizáveis desenvolvidos por seus milhares de desenvolvedores, além é claro, de uma farta documentação disponível (encontrei pelo 11 livros sobre Joomla na Oreilly).
- O WP é uma ferramenta de blog…mas com centenas de plugins que podem ser utilizados para gerenciar conteúdo perfeitamente. Posso dizer que se o projeto de seu site comportar um processo iterativo e incremental, onde as versões possam ser entregues paulatinamente para os seus clientes, o WP é uma solução sem risco. Dá para ir agregando funcionalidade ao site com os plugins criados pela comunidade.
Apesar de não ser muito fã de PHP, utilizo essas duas ferramentas para gerenciar o conteúdo de meu portal e do meu blog, além de utilizá-la como ferramenta de LMS através do Moodle. A facilidade de criação, customização e publicação de conteúdo dessas ferramentas explicam a sua enorme popularidade entre os web designers. Por outro lado, penso que soluções mais robustas, do tipo “mission-critical” devam ter uma plataforma com o mesmo grau de robustez e confiabilidade. Nos últimos meses venho estudando várias soluções de CMS para a plataforma Java. Ao final, depois de testar mais de 15 soluções open-source, minhas escolhas ficaram restritas à duas ferramentas:
- Jboss Portal: Talvez a ferramenta de CMS mais completa para a plataforma Java, conta com o apoio de uma empresa líder no mercado de software open source (Red Hat) e com uma comunidade ativa em torno dela. Possui farta documentação e está em constante atualização por parte de seus desenvolvedores. Possui uma vasta biblioteca de portlets e integração com as outras soluções Jboss (Jboss AS, Seam, Hibernate, jBPM, etc.). Um ponto positivo da solução é a disponibilidade de um plugin para o Eclipse, contendo todas as ferramentas para o desenvolvimentos de portlets nessa IDE. Minha grande crítica para o Jboss Portal é em relação aos requisitos para rodar a plataforma como um todo. Como ela está otimizada para utilizar o Jboss AS como servidor de aplicações nativo, a infraestrutura necessária requer muita memória do servidor e algum grau de tunning no ambiente para rodar sem gargalos.
- Liferay Portal: Na minha opinião, a mais flexível das ferramentas de portais construídas para a plataforma Java. Da mesma forma que o Jboss Portal, conta com o suporte de uma empresa no seu desenvolvimento, que disponibiliza uma versão open source para a comunidade. Possui uma vasta gama de portlets desenvolvidos pela comunidade e permite a utilização de vários servidores de aplicações para rodar os projetos. O ponto positivo da ferramenta é a sua facilidade de instalação. É só baixar o pacote com o AS escolhido, descompactá-lo em uma pasta e rodar o script de inicialização. Por ser uma ferramenta mais robusta que os seus concorrentes escritos em PHP, o Liferay requer um servidor um pouco mais parrudo, sob o risco de enfrentar algum memory leak ao longo do caminho.
Apesar das duas soluções para o mundo Java possuírem portlets para o gerenciamento de blogs, confesso que nada é comparável à flexibilidade e a facilidade de uso do WordPress. Esse é um campo onde as soluções Java precisarão de algum tempo para produzir uma ferramenta que concorra com o bom e velho WP.
Programando com o Google App Engine
23/06/09
Uma das principais reclamações de meus alunos nas disciplinas de programação da Universo e Maurício de Nassau é em relação à configuração de seus projetos web nos laboratórios das instituições. Para quem não tem notebook e depende das estações de trabalho é a mesma novela a cada aula: reconfigura o projeto para atualizar as urls’s das bibliotecas, do Tomcat, do banco, e por aí vai.
A solução mais adequada para o problema seria a utilização de um repositório de versões (CVS ou Subversion) contendo as últimas versões dos projetos, ao invés da tradicional cópia nos pendrives. Mas essa alternativa requer a disponibilidade de um servidor e a sua configuração a cada semestre para 40 ou mais alunos, além de depender da liberação de portas por conta da política de segurança de cada instituição.
Desde abril, podemos contar com mais uma alternativa para hospedar as nossas aplicações Java: o Google App Engine. Essa nova iniciativa do Google aproveita os recursos de computação em nuvem da empresa. Nesse ambiente, os programadores poderão contar com os recursos de uma máquina virtual Java, ambiente de deployment das aplicações e acesso aos serviços mais comuns de aplicação web, como persistência, e-mail entre outros. Os caras do Google também implementaram um plugin para o Eclipse que permite criar um projeto e fazer o deploy das aplicações diretamente nos servidores da nuvem.
Para o semestre 2009.2 eu irei preparar alguns slides sobre como usar a infraestrutura do Google, como um plano B para as estações de trabalho dos laboratórios.
Para saber mais sobre o Google App Engine, dê uma olhada nos endereços abaixo:
Java é a linguagem de programação mais popular
23/06/09
Mantendo a liderança desde meados de 2005, a linguagem Java continua sendo a mais utilizada pelo programadores no desenvolvimento de suas aplicações. A informação foi divulgada pelo TIOBE Programming Community, uma empresa especializada em serviços de qualidade de software. Desde 2002 eles publicam a cada mês um ranking com as linguagens mais populares, baseado em pesquisas com desenvolvedores e empresas da área. Uma descrição sobre a montagem do ranking pode ser vista aqui.
No ranking de Junho, Java lidera com pouco mais de 20% da preferência dos programadores, seguido de perto por C (16%) e C++ (10%). A tabela abaixo mostra o ranking para as 20 primeira colocadas.
| Position Jun 2009 |
Position Jun 2008 |
Delta in Position | Programming Language | Ratings Jun 2009 |
Delta Jun 2008 |
Status |
|---|---|---|---|---|---|---|
| 1 | 1 | ![]() |
Java | 20.147% | -0.74% | A |
| 2 | 2 | ![]() |
C | 16.779% | +1.27% | A |
| 3 | 3 | ![]() |
C++ | 10.594% | -0.21% | A |
| 4 | 4 | ![]() |
PHP | 9.675% | -0.53% | A |
| 5 | 5 | ![]() |
(Visual) Basic | 7.943% | -1.84% | A |
| 6 | 7 | ![]() |
Python | 4.756% | -0.14% | A |
| 7 | 8 | ![]() |
C# | 4.536% | +0.48% | A |
| 8 | 9 | ![]() |
JavaScript | 4.021% | +1.09% | A |
| 9 | 6 | ![]() ![]() ![]() |
Perl | 3.909% | -1.64% | A |
| 10 | 10 | ![]() |
Ruby | 2.629% | -0.01% | A |
| 11 | 11 | ![]() |
Delphi | 2.182% | +0.16% | A |
| 12 | 14 | ![]() ![]() |
PL/SQL | 0.879% | +0.12% | A |
| 13 | 26 | ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
RPG (OS/400) | 0.778% | +0.53% | A– |
| 14 | 13 | ![]() |
SAS | 0.759% | -0.16% | A |
| 15 | 15 | ![]() |
Pascal | 0.759% | +0.16% | A |
| 16 | 27 | ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
ABAP | 0.726% | +0.49% | A– |
| 17 | 12 | ![]() ![]() ![]() ![]() ![]() |
D | 0.620% | -0.83% | A– |
| 18 | 16 | ![]() ![]() |
Lisp/Scheme | 0.607% | +0.17% | B |
| 19 | 19 | ![]() |
Lua | 0.557% | +0.19% | B |
| 20 | 23 | ![]() ![]() ![]() |
MATLAB | 0.527% | +0.26% | B |
Olhando o gráfico de popularidade dos últimos anos, nota-se que Java e C++ perderam quase 1/3 de seus seguidores, provavelmente por conta do aumento da adoção de linguagens voltadas para aplicações RIA, como Ruby, PHP, Python e (quem diria) JavaScript. Na figura abaixo, pode-se ver o com a evolução do ranking desde 2002.



