Java 25: um overview da linguagem no seu Jubileu de Prata

Image for post
Image for post
Logo oficial da comemoração

Pela primeira vez, deixo de lado os artigos com temas mais voltados às ferramentas e tutoriais, para escrever um editorial sobre um aniversariante que é amado por uns, odiado por outros, mas amplamente utilizada por um grande número de profissionais da computação: Java. Esse artigo também tem uma versão em inglês, que pode ser lida aqui, caso deseje.

Nessa semana, a Oracle e a comunidade iniciaram as comemorações dos 25 anos de existência do Java, seu Jubileu de Prata como a tradição diz, completados nesse sábado, dia 23 de maio de 2020. Fez essa passagem pertencendo a um grupo restrito de linguagens de programação que já passaram da “adolescência”, mas com os méritos de ainda ser muito presente no mercado até hoje.

Segundo o TIOBE Index, de 2005 a 2019, a linguagem liderou o ranking das mais populares do mundo da TI. Esse índice é calculado mensalmente com base na quantidade de linhas de código escritas em diversas fontes consultadas na pesquisa: cursos disponíveis, third party vendors, repositórios de software, ferramentas de busca como Google, Amazon, YouTube, etc. Estima-se que temos aproximadamente 10 milhões de desenvolvedores Java no mundo. Na versão de Maio de 2020, Java perde apenas para a linguagem que foi utilizada de base para a sua criação, o C. Motivo? O C é uma linguagem comum em dispositivos médicos (junto com C++) e faz sentido ela estar mais em destaque pelo momento que vivemos (COVID-19).

Ranking da TIOBE sobre as linguagens mais populares em Maio de 2020

Mesmo diante dessa prerrogativa e dos diversos anúncios de “morte” ao longo dos anos (arrisco que o Java está no top 5 das linguagens com maior número de tentativas de assassinato), por que o Java continua tão popular, tão utilizado e com mercado de trabalho ainda tão aquecido no mundo inteiro?

Para tentar responder essas perguntas, contarei brevemente a sua história, falarei um pouco sobre as transformações que a linguagem tem passado, além de dicas de conteúdo para quem ainda quer aprender e embarcar nessa jornada Javística!

O início de tudo

Escreva uma vez, execute em qualquer lugar!

A origem do Java remonta ao início dos anos 90, quando um grupo de engenheiros da Sun Microsystems, liderados por Patrick Naughton, Sun Fellow e James Gosling (coordenador do projeto), pretendiam antecipar uma tendência: criação de ecossistemas de dispositivos interconectados, por exemplo, uma geladeira ou uma TV conectadas à computadores. Para isso, precisavam de uma linguagem que pudesse estar em qualquer um desses dispositivos, ou seja, independente da plataforma.

Inicialmente, esse projeto foi chamado de Projeto Green. A primeira criação do grupo foi o *7 (StarSeven), que era um controle remoto com uma interface touchscreen e esse aparelho tinha um mascote que ensinava o usuário a utilizar o controle. Quem era esse mascote? O nosso querido Duke!

Image for post
Image for post
Duke, o mascote do Java

A linguagem com a qual desenvolveram esse controle se chamava Oak (Carvalho, em tradução livre), nome que Gosling deu em homenagem à um carvalho que dava para a janela do seu escritório. Mas como o nome Oak já estava registrado como uma linguagem de programação, o que forçou os engenheiros a escolherem outro nome. O nome escolhido foi Java, em referência à uma ilha da Indonésia de onde o café que o grupo consumia era importado. Entenderam agora a origem da logo?

No começo do projeto, não tiveram muito apoio da Sun e também não houveram outros interessados em adquirir a tecnologia na época. O Java só entrou no mercado de fato, em 1995, com um projeto chamado HotJava Browser (projeto já descontinuado), em uma tentativa de mergulhar na era dos browsers. Nessa época, como não havia interatividade nas páginas WEB, apenas conteúdos estáticos eram exibidos. Dessa forma, a ideia era criar um navegador para suportar Java applets e criar uma plataforma para demonstrar todo o poder da linguagem para o mundo.

Assim que esse ambiente Java foi apresentado, foi um sucesso absoluto, pois tinha portabilidade para qualquer ambiente e para múltiplas plataformas. Além dessas duas características, a linguagem também é conhecida por ter suporte à orientação a objetos, por ser robusta, por ser multi-thread, por ser interpretada (o compilador pode executar os bytecodes do Java diretamente em qualquer máquina) e pela simplicidade em relação às linguagens que ela se originou (como o C).

A primeira versão mesmo do Java, a 1.0, veio em 1996. Em relação ao Java Core, ele não tinha muitos recursos comparado com outras linguagens como o C++, C# na época. Aos poucos, o core foi sendo aprimorado para o que conhecemos hoje. Por exemplo, o conceito de Enterprise só veio na versão 1.2 (1998). Já nas versões 1.3 e 1.4 tivemos correções de bugs, sendo a 1.4 a versão responsável por trazer os Assertions.

O primeiro game-changing do Java veio na versão 5.0, lançada em 2004. Depois de muitos anos de pesquisa, foram adicionados à linguagem: Generics (comparável ao que já existia no C++) e o desafio aqui foi adicionar os tipos genéricos sem fazer grandes alterações na JVM; outras features importantes, inspiradas no C#, como os loops com for each, enums, autoboxing e annotations. Essa versão foi seguida de outras duas, a 6 e a 7 (já sem o sufixo “.0”), com melhorias adicionais de performance e de bibliotecas utilizadas.

O segundo game-changing ocorreu em 2014, com o lançamento do Java 8 e com a tecnologia já vendida para a Oracle. Certamente, esse release foi o que trouxe mudanças mais significativas na linguagem nessas quase três décadas de sua existência. Essas mudanças serão comentadas na próxima seção.

A chegada do Java 8

Lambdas, Default Methods e Streams API

A versão 8 foi tão grandiosa que trouxe mais de 80 novas funcionalidades em seu pacote, que vão de recursos já conhecidos em bibliotecas famosas como o JodaTime à mudanças na máquina virtual (JVM). Depois de 10 anos da versão 5.0, a proposta trazida aqui impactou a forma como escreveríamos o código Java.

Em relação à sintaxe, tivemos talvez a alteração mais significativa: adoção de elementos da programação funcional, oferecendo ao desenvolvedor uma facilidade em executar tarefas que antes demandava muitas linhas de código e eram de alta complexidade. O símbolo desse processo de simplificar ainda mais a linguagem foram as Expressões Lambda (EL — Lambda Expressions), feature já conhecida para quem já trabalha ou já trabalhou com Groovy, Scala e/ou Clojure: possibilidade de passar funções como parâmetro para outras funções e não somente escrever métodos que recebem apenas objetos ou tipos primitivos como parâmetro.

Também temos como o recurso os Default Methods, introduzido para possibilitar a evolução de interfaces já existentes, permitindo a criação desses métodos como pontes, sem afetar a funcionalidade do software e sem exigir que o código das classes concretas também tenha que ser refatorado com essas mudanças.

Outro recurso adicionado à linguagem é a uma nova API para lidar com datas/tempo, a Date-Time API. Essa API, conforme já falamos no começo dessa seção foi baseada na famosa biblioteca JodaTime, da JodaOrg, que já era desenhada no modelo ISO e com domínios bem mais consistentes para data, hora, duração e períodos que as antigas classes Date e Calendar, que nem eram thread-safe e imutáveis como as suas substitutas são. As implementações de data/tempo deixam de estar no pacote java.util e passam a estar no novo pacote, java.time.

Por fim, a versão 8 traz uma grande evolução na manipulação de Collections, seguindo os princípios da programação funcional, com a Streams API. Basicamente, as implementações da API permitiram com que todas as Collections em Java sejam fontes de dados para streams. Tudo isso por meio do método stream().

Poucas linguagens fizeram mudanças e evoluíram de forma tão grandiosa para permanecerem relevantes, atualizadas e amplamente utilizadas. Nesse quesito, o Java mostrou uma capacidade notável em fazê-las. De 2014 em diante, o projeto evoluiu ainda mais, trouxe e trará mais recursos interessantes para a linguagem, conforme falarei na seção abaixo.

O que veio depois?

Mais performance e mais produtividade

A próxima fase do Java se iniciou com a proposta de uma quebra da sua enorme e monolítica plataforma e ganhar em modularidade. Fruto de um trabalho que durou longos 11 anos, o JPMS (Java Platform Module System), uma das principais características do Java 9, foi lançado na versão de 2017. Módulos em Java são unidades de código independentes para implementar uma funcionalidade específica. Foi um movimento importante para tornar a plataforma mais organizada e modularizada.

Daí em diante, tivemos muitas melhorias relacionadas à performance. Além do JPMS, no Java 9, passamos a ter um padrão diferente de GarbageCollector (GC), o G1, com tempos de resposta mais curtos e outros tunnings na JVM, como o GraalVM ainda em fase experimental (que poderia ser usado com AOT compiler Ahead of Time). No Java 10, já era possível usar o GraalVM como JIT compiler (Just-in-time compiler) em todos os sistemas. Outra novidade interessante da versão 10 foi a inferência de tipos em variáveis locais, um avanço interessante para quem “torcia o nariz” por ela sempre ter sido fortemente tipada.

No Java 11, tivemos uma nova alteração na sintaxe da linguagem, permitindo a inferência de tipos para variáveis locais (do Java 10) em Expressões Lambda. Além disso, tivemos a consolidação de uma nova API para o cliente HTTP (que estava em incubação desde o Java 9), com a implementação de um modelo não blocante de comunicação — o CompletableFuture (semelhante ao Nodejs), possibilitando a comunicação assíncrona por meio do protocolo HTTP.

As versões 12 e 13 fornecem melhorias na declaração do bloco Switch, aperfeiçoamento no GC G1 e melhorias no processo de compartilhamento de dados de classes. Essa última feature, foi criada para ajudar no início mais rápido das aplicações e na economia de memória quando há vários processos sendo utilizados na JVM.

No Java 14, várias propostas de melhorias que estavam em preview nas últimas duas versões viraram features nela, além de outras duas propostas bem interessantes: Pattern Matching para o instanceof, com objetivo diminuir a verbosidade do uso do instanceof; e os Records, que vieram com a proposta de reduzir drasticamente linhas de código de classes que só armazenam dados, conhecidas como classes POJO (Plain Old Java Object) ou classes do Model (em arquiteturas MVC), como no Kotlin.

Outra mudança importante que ocorreu em 2018, após o Java 8 e a mudança para a Oracle, são que todas as versões do Java passaram a ser lançadas semestralmente, para permitir uma introdução mais rápida das features propostas. Esses lançamentos geralmente são programados para março e setembro de um mesmo ano, embora sejam sujeitos à alterações. Seguindo essa lógica, já podemos esperar pelo Java 15 em setembro deste ano!

Reflexões e dicas

Como um bom vinho, envelheceu bem

Uma das coisas mais bacanas de se ver na transformação do Java nesses 25 anos é o quanto a linguagem evoluiu, mantendo a mesma proposta e características iniciais. Também, ver o quanto os profissionais que contribuem para essa transformação tem trabalhado intensamente para propor melhorias em relação à performance e produtividade. A linguagem nasceu de proposta inovadora para época e continua tentando se adequar ao que há de melhor nos tempos de hoje.

Além de tudo que falamos nas seções passadas, vale mencionar duas coisas cruciais para o sucesso do Java: a comunidade, que é muito grande e forte, e a quantidade de frameworks também muito populares que ajudaram na sua evolução técnica. Se focarmos nos momentos de virada de jogo (game-changing) da linguagem, em especial o Java 5.0, muitas das mudanças que Java trouxe naquela época já estavam em frameworks conhecidos, como Spring, por exemplo. As críticas que o Rod Johnson (criador do Spring) fez ao JavaEE lá em 2002/2003, foram fundamentais para a linguagem se propor a ser cada vez melhor e mais fluida. Essa tônica se manteve ao longo dos anos.

A minha experiência pessoal com o Java começou na faculdade, nas aulas práticas de programação e nos grupos de pesquisa que participei. Há quase 10 anos, a linguagem me acompanha no mercado (junto com outras, claro) e é a que majoritariamente trabalhei em todos esses anos. Durante todo esse tempo, ouvi múltiplas vezes frases do tipo “o Java vai morrer daqui 10 anos…” ou “Java é muito verboso, é melhor investir tempo em outras coisas porque ninguém vai usar mais… vai terminar como Cobol”. Pois bem, todos os dados coletados nos últimos anos, a comunidade e seus 10 milhões de desenvolvedores em todo mundo mostram o contrário, acredite ou não. Java não parou no tempo, tampouco perdeu sua essência. Arrisco dizer que como um bom vinho, até envelheceu bem.

E para quem pouco conhece a linguagem ou já trabalha com Java e quer sempre aprimorar seus conhecimentos, aqui vão algumas dicas:

  • Livros: aconselho a série Core Java, Volume I — Fundamentals e Volume II — Advanced Features do Cay Horstmann e do Gary Cornell. Excelente para quem procura conhecer a origem, os conceitos e tudo sobre Java em detalhes.
  • Blogs: assim como a comunidade é gigante, a quantidade de bons blogs também. Vou recomendar quatro que eu gosto mais: Baeldung, do Eugen Paraschiv, que tem uma quantidade incrível de tutoriais não só da linguagem, mas de frameworks conhecidos; o blog da Loiane Groner, que tem diversos textos, tutoriais e também cursos muito bons; o blog Javarevisited, do Javin Paul; e a InfoQ.
  • Comunidade: o SouJava é grupo muito forte no Brasil e tem organizado palestras online. Recomendo seguir o canal deles no YouTube, pois as lives ficam salvas e sempre tem um ótimo conteúdo por lá. De alcance internacional, recomendo o Thoughts On Java, do Thorben Janssen e SpringDeveloper, que divulga vídeos de dicas, webminars e talks sobre Java e Spring.

Encerro esse artigo não só com meus parabéns, mas também com um agradecimento por tudo que linguagem/plataforma/tecnologia me proporcionou de experiência, conhecimento e aprendizado até hoje!

Foi e tem sido uma jornada incrível!

“Feliz Aniversário, Java!”

Referências

  1. Java — https://www.java.com/pt_BR/about/
  2. Core Java Volume I — Fundamentals, por Cay Horstmann, Gary Cornell
  3. https://tableless.com.br/java-origem/
  4. JEPs: https://openjdk.java.net/jeps/
  5. Baeldung: Java — https://www.baeldung.com/category/java/
  6. InfoQ: https://www.infoq.com/br/java/

Written by

Senior Software Developer/Tech Lead, master in Computer Science/Software Engineering, Java, open source, and software quality enthusiast.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store