mathvbarone / awesome-programming-languages

Uma lista das principais linguagens de programação utilizadas atualmente, com o intuito de facilitar a escolha de quem esta ingressando na programação.
18 stars 2 forks source link

Pros | Contras Java #2

Closed giovannism20 closed 1 year ago

giovannism20 commented 7 years ago

Partindo do princípio que o repositório está aqui para listar linguagens de programação para pessoas que estejam afim de ingressar no mundo da programação, uma das linguagens que eu não diria ser para iniciante seria Java e já comentando um contra da linguagem, acho (minha opinião) que escreve-se muita coisa para se fazer muito pouco, não só isso gosto da JVM (local onde se é compilado a linguagem Java) mas não acho que a performance seja lá essas coisas...; não sendo um hater da mesma, acho que um ponto que podemos colocar, é a questão do "todo lugar roda", com o tempo, a linguagem começou a rodar em N lugares, sendo assim, uma linguagem boa de se aprender. Exemplos : Bancos, Chip's de Cartões, etc.

mathvbarone commented 7 years ago

Mas no caso, imagina o cenário em que a pessoa já tem uma noção de programação, ou até ja sabe programar em uma determinada linguagem, e esta querendo focar seus estudos em outra. O Java seria uma opção para essa pessoa, concorda?

mathvbarone commented 7 years ago

Em relação aos prós e contras listados, pq não faz um pr e inicia essa discução no proprio repo? :D

giovannism20 commented 7 years ago

Concordo, com toda certeza, até porque como disse acima é utilizada em MUITOS lugares. Eu até "entendo" Java ainda ser escolhido como uma das linguagens mais utilizadas para se ensinar alguém a programar que acho eu ser por conta da Orientação a Objeto (que também não acho muito legal já que se olharmos bem, a mesma não é BEM orientada a objeto...)

giovannism20 commented 7 years ago

Claro, vou fazer isso agora!

mathvbarone commented 7 years ago

Boa @GiovanniSM20 obrigado por contribuir ^^

mathvbarone commented 7 years ago

@GiovanniSM20 eu mergeei seu pr, mas agora olhando bem, teria como você fazer um ultimo commit deixando um pouco menos impessoal? Por ex., ao invés de "eu acho que a linguagem...", vc pode por "a linguagem tem as características...", entendeu? Pq ai a pessoa que ler vai saber que sao caraterísticas da linguagem em si, e não uma opinião pessoal sua.

mathvbarone commented 7 years ago

@GiovanniSM20 fiz as alterações citadas nesse commit.

rafaels88 commented 7 years ago

Não programo em Java, não gosto de Java, mas fiquei curioso com essa opinião aqui "que também não acho muito legal já que se olharmos bem, a mesma não é BEM orientada a objeto...". Até agora eu achava Java uma das linguagens mais OO de todas, provavelmente a mais OO, na verdade.

rafaels88 commented 7 years ago

E dando meu pitaco no Contra que entrou no PR, foi citado a performance dela. Lendo ali me pareceu uma opinião sem fundamentação (não to dizendo que ta errado, mas nao tem nada pra comprovar isso, n tem um link, uma fonte, nada...). Qual é a métrica que diz que a performance de Java é um contra? Tem esses números em algum lugar?

mathvbarone commented 7 years ago

@rafaels88 eu também não programo em Java, por isso não vou saber te responder qual seria a questão da performance. Porém, se o @GiovanniSM20 achou válido abordar esse tema, e o intuito do repo é fazer uma pequena introdução às linguagens, achei que esse argumento poderia entrar no repo exatamente para abrir a discussão a respeito disso, e chegarmos num texto mais condizente com a realidade.

haskellcamargo commented 7 years ago

Tô vendo que se eu fizer textão aqui vai dar uma treta linda.

mathvbarone commented 7 years ago

@haskellcamargo ahahaha Cara, o intuito do repo é exatamente debater os prós e contras de cada linguagem. Tendo maturidade, acho que a discussão é válida.

Morette commented 7 years ago

A intenção é discutir, mas se tivesse alguns links com pesquisa, números etc para reforçar a opinião. Acho super válido.

giovannism20 commented 7 years ago

@Morette vou tentar colocar isso no próximo PR :octocat:

mathvbarone commented 7 years ago

Boa! @GiovanniSM20

giovannism20 commented 7 years ago

Quanto a performance da mesma, ainda não tive tempo de separar algo decente. Mas, o @haskellcamargo escreveu um artigo quanto a Java e OO:

Java

diogowatson commented 7 years ago

Longe de ser um especialista em Java mas vou contribuit com a discussão.

1) O Java de fato é verboso, mas se vc usar uma IDLE como InteliJ ela faz boa parte do trabalho para vc. Claro, se vc quiser usar o bloco de notas vai ser um inferno.

2) Meio q se convencionou dizer q o Java tem problemas de performance. Isso era uma verdade lá pelos primordios da linguagem. Não só a linguagem e a JVM melhoraram muito como hj o poder computacional q temos a disposição tornam essa questão meio irrelevante. E o Java é mais rápido q o node (dependendo do cenário é claro) https://rclayton.silvrback.com/speaking-intelligently-about-java-vs-node-performance

3)Talvez o ponto + importante em decidir não aprender Java hj é que há forte indícios q a linguagem vai ser substituida pelo Kotlin. Converso com alguns desenvolvedores Java de longa data e estão trocando ele pelo Kotlin cada vez mais. Depois q o google a transformou em linguagem oficial de desenvolvimento do android essa tendencia é ainda maior.

JotaPe commented 7 years ago

@diogowatson A parte dele ser verboso e um problema grande para iniciantes, e tbm pode causar fadiga em outros. Sobre ser OOP, ate JS e mais OOP que Java, já que segue o padrão de SmallTalk com prototypes.

giovannism20 commented 7 years ago

Já havia colocado o texto aqui e vou colocar novamente...

Java

giovannism20 commented 7 years ago

1 - Entramos em uma questão de que quando se tem uma IDE, acaba "desaprendendo" a sintaxe da própria linguagem (isso é provado até em algumas entrevistas).

2 - A JVM é um excelente lugar, não é a toa que algumas linguagens modernas utilizam ela... É tão mais rápido do que Node que está se abrindo mão de usar a mesma... "Meio q se convencionou dizer q o Java tem problemas de performance." Não é que se convencionou, é que não tem "nada" que prove exatamente o contrário... | A gente escreve coisa para caramba para ter algo com ela.

3 - O próprio Kotlin tem mais de 50% escrito em Java... | Quanto a opinião dos desenvolvedores e tudo mais, até concordo...

rodolfo-mendes commented 7 years ago

"Meio q se convencionou dizer q o Java tem problemas de performance." Não é que se convencionou, é que não tem "nada" que prove exatamente o contrário...

Tem muita coisa sim provando o contrário. Quando falamos de performance, precisamos falar de qual performance exatamente estamos falando: CPU ? memória ? I/O ? Vamos analisar caso a caso:

  1. No quesito processamento, ou seja, aproveitamento da CPU, Java ainda é a linguagem mais rápida entre as linguagens de máquina virtual, perdendo apenas para linguagens nativas como C/C++ (porque aí é covardia). Este é apenas um dos vários benchmarks que tem na Internet: https://attractivechaos.github.io, mas consistentemente Java tem boa performance de CPU, geralmente ficando atrás apenas de C/C++

  2. No quesito memória, de fato Java consome um pouco mais que outras linguagens. Muito provavelmente porque a JVM guarda mais metadados sobre objetos, mas é uma diferença que não chega a uma ordem de grandeza, o que geralmente não justifica o abandono da linguagem

De onde veio a má fama então ?

O problema foram as implementações iniciais do Java e da JVM. Nas primeiras versões, o bytecode era interpretado pela JVM, mas hoje em dia ela trabalha com just in time compilation. Outro problema que tinha no começo era que o único GC disponível era o stop-the-world-GC, ou seja, se o heap ficasse cheio todas as threads era pausadas para liberar memória. Nas versões atuais a VM já conta com vários algoritmos de GC que evitam "congelar" a aplicação. Em resumo: os problemas de desempenho que Java já teve há 20 anos atrás já praticamente não existem mais.

Java x Node.js

Colocando o dedo na ferida: a questão da performance do Node.js tem a ver com o modelo de I/O adotado e pelo fato de que é um framework projeto com um único tipo de aplicação em mente. Basicamente, uma aplicação Node.js roda em uma única thread e faz toda a I/O de maneira assíncrona. Assim ele é muito bom para aplicações que tratam um número grande de requisições pequenas, que consomem pouca CPU, pois tudo o que a thread principal tem que fazer é praticamente ficar enfileirando requisições de I/O e ficar tratando os callbacks. Sem dúvida, para este tipo de aplicação, esta abordagem é muito melhor que disparar uma thread para cada requisição e que fica bloqueada durante as operações de I/O. Por outro lado, coloque um bubble sort para ordenar um vetor de 10.000 elementos no meio e a aplicação inteira vai para o espaço ...

Por sua vez, a maioria das aplicações e servidores Java ainda segue o antigo padrão de múltiplas threads com I/O bloqueante (assim como Python, PHP, Ruby, etc.). Porém, cada vez mais tem surgido suporte para esse novo modelo implementado pelo Node.js: já existe uma api de I/O não-bloqueante e mais ferramentas estão aparecendo.

De qualquer maneira, se o gargalo da aplicação for CPU, Java ainda é uma escolha melhor que Node.js: http://benchmarksgame.alioth.debian.org/u64q/javascript.html

giovannism20 commented 7 years ago

1 - O benchmark é BEM velho, 2011.

2 - Então você está falando que a ordem de grandeza em relação a perda de performance, não é significativa ao ponto de pegarmos e largarmos a linguagem, correto ?

Java x Node.js

Objetivos completamente diferentes.

Framework => "Um framework em desenvolvimento de software, é uma abstração que une códigos comuns entre vários projetos de software provendo uma funcionalidade genérica."

Node != Framework

"Node.js é uma plataforma construída sobre o motor JavaScript do Google Chrome para facilmente construir aplicações de rede rápidas e escaláveis. Node.js usa um modelo de I/O direcionada a evento não bloqueante que o torna leve e eficiente, ideal para aplicações em tempo real com troca intensa de dados através de dispositivos distribuídos."

Benchmark final => Já viu quanto ao consumo de memória, fica difícil liberar memória deliberadamente assim para linguagem em um servidor, vai ficar liberando máquina ? "Outro problema que tinha no começo era que o único GC disponível era o stop-the-world-GC, ou seja, se o heap ficasse cheio todas as threads era pausadas para liberar memória."

http://www.luiztools.com.br/post/por-que-aprender-nodejs/

rodolfo-mendes commented 7 years ago

1 - O benchmark é BEM velho, 2011.

Sem problemas, esse aqui é mais recente e compara Java x Node.js diretamente, nas suas versões mais recentes, e Java performa melhor: http://benchmarksgame.alioth.debian.org/u64q/javascript.html

2 - Então você está falando que a ordem de grandeza em relação a perda de performance, não é significativa ao ponto de pegarmos e largarmos a linguagem, correto ?

Não sei o que você entendeu, mas o que eu quis dizer é que ganhos/perda de memória que estejam na mesma ordem de grandeza não justificam trocar de plataforma, por exemplo se a plataforma A gasta 100MB e plataforma gasta 130MB; isso por si só não justifica trocar de plataforma.

Node != Framework

sério que você vai arrumar picuinha por causa de nomenclatura ?

Benchmark final => Já viu quanto ao consumo de memória, fica difícil liberar memória deliberadamente assim para linguagem em um servidor, vai ficar liberando máquina ?

realmente não entendi o que você quis dizer ... tanto Java quanto Node.js (assim como Python, Ruby, PHP, etc. ) dependem de garbage collection para liberar memória. E como já expliquei, os algoritmos disponíveis hoje para GC da JVM são muito melhores que os algoritmos da 1a versão, dificilmente você vai ter algum problema de performance relacionado ao GC.

Enfim, por enquanto eu ainda não vi um único argumento técnico ou evidência sobre Java ter problemas de performance, pelo contrário, somente preconceito e ironia.