O que é Java ?

Postado em Atualizado em

Dentro dos vários cursos que eu venho ministrando nos últimos anos como instrutor e consultor, tenho um que se chama JSE Módulo I com o objetivo de introduzir os participantes ao mundo Java. O curso tem um conteúdo muito bacana, apresentando o Java desde seu histórico, download, configuração, IDE’s, conceitos, implementações OO e API diversas como JDBC, I/O, Swing etc.. Já tive muitas experiências interessantes com este curso em específico porque é nele que eu me deparo confrontando candidatos universitários, programadores experientes, responsáveis de T.I e até alguns curiosos perdidos sem rumo na vida, todos com aqueles olhinhos para o quadro esperando o primeiro dia de aula para perguntar aquela mesma questão:

O que é Java?

Todas as vezes que eu inicio este curso básico de Java, sou questionado o “por que” do vasto volume de informações e a de sempre comentada sopa de letrinhas jPra-ca, jPra-la, jAqui, jAli, jNão sei que, o pessoal em geral se sente muito perdido sem saber por onde começar. Esta pergunta vem a tona originando-se de diversas pessoas diferentes, com experiências, visões  e questionamentos diferentes que me fizeram ao longo destes anos aprender a ter um certo “jogo de cintura” em moderar a resposta, tendo com objetivo em primeiro lugar saciar a pergunta no contexto do candidato e em segundo lugar não despejar 15 anos de evolução da tecnologia em um primeiro contato com o aluno.
É justamente isso que eu gostaria de abordar neste artigo, alguns dos pontos mais comuns que venho desenvolvendo ao responder este tipo de questionamento em salas de aula, consultorias, palestras etc.…Segue abaixo os tópicos mais importantes, em uma seqüência gradativa que venho usando para construir esta resposta na cabeça da galera.

Java é uma tecnologia

A primeira coisa a se entender é que Java é uma tecnologia abrangente e continuamente crescente. Ela é independente de plataforma, ou seja, a tecnologia Java não esta amarrado com nenhum hardware ou sistema operacional em específico, como vemos acontecer com outras tecnologias. Este fator foi fundamental para sua rápida adoção e popularização no mundo. Atualmente esta disponível para ser usado nos grandes “players” denominados: desktop, web, dispositivos moveis inteligentes e cartões de crédito.  A filosofia da tecnologia é ser disponibilizada para o uso em qualquer lugar que seja providos de capacidades computacionais. Ou seja, qualquer dispositivo eletrônico provido de capacidades de processamento, gerenciamento de memória e conectividade é um possível candidato a rodar Java. O passado e as expectativas futuras nos prova isso, uma vez que o fato aconteceu com os aparelhos celulares que passaram de mero receptores de sinais para poderosos dispositivos com capacidades computacionais. Sendo assim, foram habilitados para rodar Java. Para aqueles que ainda não conseguiram visualizar, esta mesma história esta se repetindo hoje com as os aparelhos de televisão que também estão deixando de ser mais um mero dispositivo, agregando capacidades computacionais. Como não poderia ser diferente, já existem movimentações e bases concretas que o Java será habilitado para rodar neste futuro televisores inteligentes. Em resumo seria isso, Java é tecnologia multiplataforma que não tem amarrações com provedores de hardwares ou sistemas operacionais.
Este fato é possível porque a tecnologia é interpretada por um agente intermediário chamado de ”maquina virtual” que é habilitada previamente na determinada plataforma de execução. Com isso, poderíamos conceitualmente afirmar que uma solução escrita com a tecnologia Java não contem nenhum tipo de amarrações específicas da plataforma de execução, podendo ser portavelmente executado livremente em qualquer lugar.

Java não é uma linguagem de programação

Esta é a pergunta muito comum onde as pessoas sempre estão associando uma linguagem com a sua tecnologia. A resposta é não !!! Java não é uma linguagem de programação! Java é uma tecnologia que possui muitas linguagens de programação. Segue um resumo de algumas delas:

  • Padrão – Linguagem padrão orientada a objetos que foi a primeira a ser idealizada com a tecnologia.
  • JavaServer Pages – linguagem de programação voltadas para páginas web dinâmicas baseado em componentes servlets.
  • AspectJ – linguagem de programação pertencente ao paradigma de “orientação à aspectos”.
  • Groovy e Ruby –  linguagens scripts dinâmicas voltada para produtividade.
  • Scala – linguagem de programação denominada moderna pertencente ao paradigma “programação funcional”.
  • JavaFX – linguagem de script utilizada no desenvolvimento de aplicações RIAs – Rich Internet Application.

Existem algumas outras na qual eu não descrevi, pois o importante é saber que existe algumas opções de linguagem de programação que devem ser selecionadas ou combinadas objetivando implementar os determinados requisitos de uma solução. Para outras linguagens no Java veja este artigo.

Java não é um RAD

Nos anos 90 houve uma popularização muito grande relacionado com ferramentas baseados em ambientes RAD, e eu venho percebendo ao longo dos anos que muitos novatos vêm me questionando sobre o assunto.  Estes questionamentos são bem comuns naqueles vindos de ambientes plataformados e proprietários como Delphi e Visual Basic 6. Mas… Java não é uma IDE ou uma RAD !!! Java é uma tecnologia que contem muitas ferramentas relacionadas com produtividades. A questão é que a ideologia no Java sofre alguma alteração, sendo que as filosofias de ambientes RAD se chocam com algumas diretrizes e motivações que existem por de traz da tecnologia Java.
Um simples exemplo deste fato seria a questão da construção de interfaces gráficas de usuários conhecidas como GUI. Em ambientes RAD proprietários plataformados existe uma certa facilidade na hora de arrastar e posicionar os componentes visuais em um formulário GUI. O mesmo não acontece na tecnologia Java, porque as GUI em Java deve ser construídas visando a portabilidade. Ou seja, no Java não é comum usarmos “posicionamento absoluto” para os componentes visuais por que não temos como garantir à exatidão a mesma, devido os diferentes controles de renderização das diferentes plataformas. Em Java, a diretriz é usar os “objetos controladores de layout” que são responsáveis por posicionar e dar tamanho automaticamente para os componentes visuais, garantido assim máxima portabilidade. Outras questões arquiteturais mais complexas que eu deixarei fora do artigo também podem vir a complicar mais o assunto.
Mas em resumo, existe sim uma vasta e crescente linha de ferramentas para promover produtividade na hora de implementar uma solução completa com Java, que deve ser previamente avaliadas e selecionadas para serem conscientemente aplicados. Antes disto, a tecnologia deve ser razoavelmente entendida e dominada para se conseguir a produtividade.

Organização da tecnologia

Toda a tecnologia Java esta separada em agrupadores denominados “pacotes” com nomes específicos que fornecem fronteiras conceituais em uma “macro-visão”. Ou seja, tudo na tecnologia Java esta corretamente separada e organizada em pacotes que refletem o lugar de sua aplicabilidade. Os pacotes são chamados de JSE, JEE, JME, JavaCard e JavaFX. Segue um descritivo bem básico:

  • Java Standard Edition JSE – recursos usados para construir soluções desktop.
  • Java Enterprise Edition JEE – recursos usados para construir soluções de grande escala, normalmente usando o paradigma de aplicações distribuídas.
  • Java Micro Edition JME – recursos usados para construir soluções para dispositivos móveis como pagers, celulares, smartphones, PDA’s, screenphones, comunicators, high-end PDA’s etc… No JME temos dois novos leques atualmente em processo de evolução que refletem os novos lugares que o Java sera usado – TV-Digital e Midia Blu-ray.
  • JavaCard – recursos que permite que pequenos aplicativos Java sejam executados com segurança em smart cards e dispositivos similares com limitações de processamento e armazenamento, amplamente utilizado em cartões SIM (usados em celulares GSM) e em caixas eletrônicos.
  • JavaFX – recursos usados para construir soluções usando a filosofia RIA – Rich Internet Applications.

A palavra “recursos” acima usada expressa uma série de coisas como, por exemplo:

  • Linguagens de programação.
  • Kits de ferramentas para: desenvolvimento, testes, depuração e produção.
  • Bibliotecas, componentes e frameworks.
  • Padrões, diretrizes e boas práticas gerais.

Poderíamos exemplificar usando o mais básico de tudo que é o JSE:

O JSE consiste no pacote que agrupa coisas para dar soluções em aplicações desktop. Ou seja, dentro do JSE existem opções de linguagens de programações que podem ser selecionadas ou combinadas. Existem opções de kit’s de ferramentas usado para o desenvolvimento, depuração, teste e produção. Existe também diversas opções de bibliotecas, componentes e frameworks já prontos que podem ser agregados e combinados na solução. Existe uma série de documentos que apresentam padrões, diretrizes e práticas que podem ser usadas na hora de escrever uma solução desktop. Estes documentos devem ser lidos, entendidos e aplicados de acordo com a necessidade.

Regimento por especificação

Umas das grandes novidades que Java introduziu no mercado desde o seu início é que todas as tecnologias envolvidas são baseadas em especificações. Isso quer dizer que não existe uma empresa proprietária “por de traz do Java” detenho seu controle total. Existe um órgão padrão independente chamado Java Communty Process – JCP que é responsável por determinar as evoluções de todas as tecnologias, visando encaminhar o Java para um “caminho” de crescimento voltado a um ”padrão global” aonde qualquer pessoa/empresa interessada possa ter livre voto ou sugestão. O que eu quero dizer é que a tecnologia Java não é controlada por uma empresa só, ele é controlada por todos nós !!! Qualquer pessoa de qualquer empresa pode fazer um pedido na tecnologia Java, desde que descreva seguindo a formalidade no JCP dizendo “o que quer…”, “por que quer…”, “e como seria isso…” Temos vários casos que algumas tecnologias Java foram criadas, retrocedidas ou alteradas quando não estavam sendo aceitas no mercado devido a uma serie de fatores diferenciados. Alguns exemplos marcantes destes fatos são as tecnologias  JSF, EJB e JPA. Quando se usa uma tecnologia baseado em especificação, quer dizer que a sua aplicação final esta escrita em um “padrão” conhecido que resulta no principal fato de ter sua solução completamente livre e portável de fornecedor de tecnologia. Para entender isso, vamos exemplificar usando a especificação JDBC:

Java Data Base Connection é a especificação que defini a tecnologia padrão para se fazer uma solução escrita em Java se conectar em um banco de dados relacional.  O JDBC é nada mais, nada menos que alguns documentos que descreve como é esse padrão. Muito bem, qualquer empresa fornecedora de banco de dados que tenha o interesse de fazer que seu banco de dados seje acessível com Java é obrigado a implementar esse padrão !!  Quais são as implicações disso:

  • Aprendizado Unificado – quando se aprende a conectar com o banco de dados em Java, você aprende a usar a especificação uma única vez, por que todos os vendedores de bancos de dados tem que implementar a mesma “forma padrão” de comunicação. Quando se usa uma tecnologia proprietária, é necessário aprender diferentes formas de se conectar banco de dados de diferentes vendedores perdendo assim todo investimento financeiro de tempo, conhecimento e dinheiro.
  • Portabilidade – existe a possibilidade de ser trocar um banco de dados de uma empresa por outra sem quebrar uma linha de código na solução final. Quando se usa uma tecnologia proprietária, a troca do tipo de banco de dados necessita na alteração do sistema final, mesmo utilizando-se de padrões de persistências já conhecidos na engenharia de software.
  • Independência – a equipe de  desenvolvimento pode usar qualquer banco de dados para construir o produto e o cliente final comprador da solução em Java não é obrigado a usar o determinado banco de dados selecionado pela empresa de desenvolvimento. Se o cliente final tem condições de pagar um bom banco, ele deve fazer, senão ele tem a liberdade de usar um free. Quando se usa uma tecnologia proprietária, a empresas de desenvolvimento acabam obrigando o cliente final da solução a usar aquele determinado banco de dados.
  • Concorrência – fornecedores de banco de dados devem concorrer entre si no mercado. Os clientes finais de soluções corporativas não podem ser obrigados a usarem esse ou aquele banco de dados. Eles devem ter aplicações portáveis em mãos e assim estarão abertos a usar/comprar aquele determinado banco que for melhor. Hoje ele pode começar com um free e em um futuro breve mudar para um caro e robusto. Em outras palavras, o vendedor de solução em Java não deve se meter nessa decisão.

Existem outros fatores positivos nas questões da especificação que eu deixarei fora neste artigo, mas entenda que na tecnologia Java, os player envolvidos estão livres e independentes entre si para concorrer e trabalhar em cima da suas áreas de atuação. Para outras informações, vejam outro artigo meu falando sobre o assunto.

Já parou para pensar o “por que” da possibilidade de se comprar outro pneu para seu carro? Toda a loja de pneus tem pneu para seu carro… Sabe por quê? Por que existe uma especificação! Já pensou o caos que seria se você comprasse um carro com pneus específicos e proprietário? Ele poderia colocar o preço que ele quisesse! Certo? E se a empresa fechasse? Acho que você teria que comprar outro carro porque não encontraria pneu para ele… Você já se tocou que tudo ao seu redor é baseado em especificação? A especificação é bom para todos: fabricantes de carros, fabricante de pneus, vendedores de pneus e compradores finais !!! Então… em Java funciona assim, tudo é especificação!

Engenharia de software

Um dos fatores de peso que cooperam diretamente para essa grande curva de aprendizado e que as plataformas Java foram completamente concebidas em cima de conceitos e técnicas da Engenharia de Software e atualmente tem evoluído o cooperado para o seu desenvolvimento. O que acontece na maioria dos casos é que o candidato a aprender Java acaba de deparando com um mundo totalmente novo e complexo, devido à falta de uma base sólida de conhecimento sobre o assunto. Ou seja, poderíamos afirmar inversamente que se uma pessoa tem conhecimentos básicos sobre assuntos relacionados com a ENGENHARIA DE SOFTWARE, normalmente não apresentaria dificuldades para entrar na “dança”. Neste artigo sobre o assunto, eu listo 26 itens básicos que podem vir a ser pesquisados e aprendidos de forma gradativa de acordo com a necessidade.

Objetivo

Algo muito importante a se entender é que as plataformas e suas constantes evoluções têm o objetivo de fornecer todas as características necessárias de uma “infra-estrutura” robusta e segura em especificações para que se possa implementar uma solução de pequeno, médio e principalmente grande porte. O que todas as pessoas precisam visualizar no momento que se deparam com o Java é que dentro das plataformas, existem produtos/especificações previamente selecionados que expressa as necessidades básicas de uma equipe para implementar uma solução completa. Para e pense! Imagine um contexto em que uma empresa precise de uma solução automatizada que englobe um sistema desktop internamente usado, integrado com outro sistema web externamente usado e que estas dois aplicações troquem mensagens SMS com outras aplicações sendo executadas em celulares. Tudo isso envolvendo colaboradores, clientes, fornecedores e diretores. Complicado? Sim… bastante! Bom, no Java já temos isso resolvido! Ou seja, não é necessário implementar nenhuma linha de código voltada a infra-estrutura, o que se precisa fazer é descobrir, aprender e integrar as determinadas tecnologias das plataformas que resolvem os requisitos do contexto citado. Trocando as palavras, o objetivo então é oferecer aos desenvolveres uma opção de tecnologia com o intuito de reduzir tempo e custo no desenvolvimento dos mais variados tipos de soluções possíveis.

Java é uma solução

Outra coisa que eu sempre gosto de falar para os novos candidatos é que ao entrar no mundo Java, as pessoas deixam de ser meros “programadores” para se tornarem então “solucionadores de problemas”. Este sentimento de ser apenas um “programadorzinho que sabe fazer if, else, while…” tem que ter completamente colocada de lado e uma nova visão precisa ser implantada na cabeça do individuo. O que eu quero dizer é as pessoas precisam ampliar a sua própria visualização de como as soluções podem ser construídas, adequando isso para a realidade no qual a tecnologia Java oferece. Hoje estamos vendo a televisão entrar como mais um dispositivo habilitado com  Java e com ele a promessa de muitas novas oportunidades. E amanha? Qual será o próximo dispositivo?  Sem esse motivador, a tecnologia Java nunca deixara de ser um monstro cheio de coisas complexas, cada dia mais incompreendida.

Ficou com vontade de aprender Java? Neste artigo eu apresento quais são os passos iniciais. Eu termino por hoje meus amigos. O artigo fica aberto para opiniões ou complementos. A paz a todos.

“Portanto, cada um de nós agrade ao próximo no que é bom para edificação. “Romanos 15:2

16 comentários em “O que é Java ?

    Flavio Alves Granato disse:
    26/05/2010 às 15:59

    Muito bom o artigo.

    Eulen Mesquita disse:
    26/05/2010 às 21:09

    Muito bom artigo. Super completo.

    Onde você ministra seus cursos? Como posso saber datas e horários?

    Boa sorte e sucesso.

      Fernando Franzini disse:
      27/05/2010 às 11:27

      Sua empresa pode me contratar ou vc pode ir na Adetec que é a empresa de treinamento no qual eu sou responsavel pela academia java – http://www.formacon.br55.biz/

    Zezinho disse:
    18/06/2010 às 12:03

    …”Muito bem, qualquer empresa fornecedora de banco de dados que tenha
    o interesse de fazer que seu banco de dados seje acessível com Java é obrigado a implementar esse padrão !!”…

    Cuma??? Quer dizer que são os bancos de dados quem tem que se adaptar ao “”padrão”” do Java (JDBC)?

    Tá maluco!?!?!?!?!?!?

      Fernando Franzini disse:
      18/06/2010 às 12:08

      Sim….não estou maluco não…..
      Pq ? Vc acha q não é assim ? kkkkkk

    Zezinho disse:
    18/06/2010 às 12:24

    E vc é instrutor JAVA!?!?!?

    Meu caro, na especificação da JDBC, estão as diversas implementações de conectores com bancos de dados. Lá tem o “driver” para conectar com PostGres, Oracle, SQLServer, etc…
    É lá que está implementado C.O.M.O. deve se conectar em cada banco…

    Cada SGBD fornece a sua forma de conexão.

    Quem tem que se adaptar a ela são as linguagens, e não o contrário!

    Java tem seu driver, Delphi tem o seu, C++ tem o seu…

      Fernando Franzini disse:
      18/06/2010 às 12:40

      Então meu querido, vc esta completamente certo……só não sabe de um detalhe….os “drivers” no java são polimórficos…ou seja….existe uma interface padrão da especificação…que todos os fornecedores tem que implementar….bem vindo ao mundo OOP !!!! kkkkkkk
      Sendo assim, o PostGres, Oracle, SQLServer etc….fazem a sua implementação em particular mas que para o desenvolver final fica escapsulado pela especificação……kkkk

    Eulen disse:
    18/06/2010 às 12:37

    Zezinho, desculpe se eu estive errado. Mas eu também entendo que implementação do conector é feita pelo fabricante. A Sun não escrever as classes de conexão p/ cada BD novo que é lançado no mercado ou as reescreve à cada alteração dos produtos. Isso é por conta de cada emprsa.
    Veja que o conector p/ mysql é fornecido pela próprio mysql, ídem para o DB Oracle que são disponibilizados pela própria Oracle.

      Fernando Franzini disse:
      18/06/2010 às 12:50

      Sim….seria assim….
      1. Sun fez a especificação JDBC….que consiste em documentos que definem “como acessar um SGDB” pelo java.
      2. A especificação gera interfaces..que são classes abstratas…definem os métodos pendentes sem corpo…..
      3. Cada provedor de SGDB interessado tem que ler os documentos da especificação e implementar as interfaces Driver, Connection, ResultSet….escrecendo como conectar no seu banco.
      4. Programador final usa referências poliformicas no programa java para apontar para as classes concretas do provedor, ficando completamente escondido e encapsulado o codigo do provedor especifico.

    Zezinho disse:
    18/06/2010 às 12:53

    “….existe uma interface padrão da especificação…que todos os fornecedores tem que implementar.”

    Quase certo, só um detalhe que vc esqueceu – A “interface padrão” é o SGBD quem fornece, e não (novamente) o contrário…

    A grosso modo, o banco lhe dá a interface, e como vc conecta a ela, é o JDBC que implementa…

    Existe uma série de operações padrão para conectar-se e trabalhar com os bancos de dados. A JDBC apenas tem que se adequar a cada uma delas, ou seja, se vou usar PostGres na minha aplicação, apenas informo ao datasource, e o resto é com a JDBC, correto!? http://java.sun.com/products/jdbc/overview.html

    Então, acho que vc está fazendo confusão em relação ao conceito…

      Fernando Franzini disse:
      18/06/2010 às 13:04

      Não….não esta correto…..o banco não da interface !!!!…a interface vem da SUN pré-disponivel no JSE…mas especificamente no pacote java.sql.
      Se vc tem duvidas…abre o as classes dos provedores do qualquer SGDB….
      vai ter um código nas classes assim “implements java.sql.Connection”…..
      Se cada banco gerasse sua interface não teriamos polimorfismo e nem portabilidade….rssss
      Outro erro, o datasource é outra especificação para fornecer pool de conexão. Pode ou não ser usada com JDBC. Me desculpe..mas não estou fazendo confusão….

        Fernando Franzini disse:
        18/06/2010 às 13:11

        Vai dois exemplos das classes driver:
        MySql:
        public class com.mysql.jdbc.Driver extends com.mysql.jdbc.NonRegisteringDriver implements java.sql.Driver {….

        SQLServer:
        public class net.sourceforge.jtds.jdbc.Driver implements java.sql.Driver {

        Da mesma forma acontece com as outras…..ou seja JDBC tem as interfaces padrão….cada provedor de banco fornece sua implementação..isso é polimorfismo = VARIAS FORMAS DIFERENTES DE COMPORTAR…

    gustavobite disse:
    27/03/2012 às 00:41

    Excelente post Fernando. Já li vários outros seus aqui no seu blog, mas nesse me deparei com um trecho interessante que seria esse:
    “Ao entrar no mundo Java, as pessoas deixam de ser meros “programadores” para se tornarem então “solucionadores de problemas”.”
    Interessante sua posição, pois ao decorrer em ler seus posts, fico cada vez com mais ‘sede’ de aprender mais e mais.. a Tecnologia Java.

    kevinstortz disse:
    25/07/2013 às 20:50

    Olá Fernando, ótimo post, obrigado por dividir conosco seu conhecimento. Estou referenciando o seu post no meu blog!

    Marcos Vieira de Oliveira disse:
    05/07/2015 às 15:56

    Olá Fernando, tenho certeza que serei este solucionador de problemas. Graça e Paz, Obrigado meu irmão.

Deixe um comentário