Produtividade Python VS Produtividade Java

24

No SO, deparei-me com uma pergunta sobre qual plataforma, Java ou Python é melhor para o desenvolvimento no Google AppEngine. Muitas pessoas estavam se gabando do aumento de produtividade obtido com o uso do Python sobre Java. Uma coisa que eu diria sobre o argumento da produtividade Python x Java, é que o Java possui excelentes IDE para acelerar o desenvolvimento, onde o Python está realmente ausente nessa área por causa de sua natureza dinâmica.

Portanto, mesmo que eu prefira usar o Python como uma linguagem, não acredito que isso proporcione um aumento de produtividade em comparação ao Java, especialmente ao usar uma nova estrutura. Obviamente, se fosse Java vs Python e o único editor que você pudesse usar fosse o VIM, o Python lhe proporcionaria um enorme aumento de produtividade, mas quando os IDEs são trazidos para a equação, isso não é tão claro.

Eu acho que os méritos de Java geralmente são avaliados apenas em nível de linguagem e com base em suposições desatualizadas, mas o Java tem muitos benefícios externos à própria linguagem, por exemplo, a JVM (frequentemente criticada, mas oferece um enorme potencial), excelentes IDE e ferramentas, grandes números de terceiros. bibliotecas de partido, plataformas etc.

Pergunta: As linguagens dinâmicas relacionadas ao Python / realmente oferecem os enormes aumentos de produtividade frequentemente comentados? (considerando o uso de novas estruturas e o trabalho com aplicativos de médio a grande porte).

toc777
fonte
2
Confira o PyCharm IDE. Mas também acredito que há uma nova estrutura para o GAE que converte o código Java em JavaScript para uso no front-end, o que pode ser um grande ganho de produtividade.
Andrew M
14
IDE ou não, você ainda precisa escrever 10 linhas de Java para algumas coisas que podem ser feitas (bem) em uma linha de Python.
2
Não tenha vergonha do seu amor por Java. Você aprendeu alguns truques (IDE, bibliotecas e estruturas) que permitem chutar as pontas. Abrace-o. Você não precisa da nossa permissão para ser incrível. Se o Java faz você produtiva, então isso é o suficiente.
quer
11
1) O potencial da JVM é muito limitado . Deliberadamente. Não é "ruim", é apenas, bem, limitante. 2) Os IDEs só podem ajudar se você integrar centenas de componentes existentes (que é um tipo de programação válido e honrado, mas não o único). Quando se trata de implementar algoritmos complexos, o Python é muito mais produtivo que o Java (até coisas como funções lambda e compreensão de lista fazem uma enorme diferença).
SK-logic
11
Se sua produtividade é significativamente aumentada pelo seu IDE, as chances são de que haja algo terrivelmente errado com você ou com a sua plataforma de programação. (Smalltalk é a exceção, porque cria um sistema totalmente reflexivo para a programação).
Marcin

Respostas:

18

Uma das principais vantagens do Python é sua filosofia "pilhas incluídas": uma biblioteca padrão extensa e simples de usar. Em Java, apenas ler um arquivo de texto requer várias linhas de código, leitores aninhados e assim por diante. Em Python é f.read(). Definitivamente, isso será um enorme aumento de produtividade, especialmente em prototipagem rápida. Em Python, a linguagem também é geralmente menos detalhada, o que não é uma coisa ruim (embora eu ache que a importância da verbosidade versus concisão geralmente é exagerada).

No entanto, se você já está trabalhando em alguma estrutura, como o GAE, esperaria que as diferenças fossem muito menores e, principalmente, até a fluência pessoal no idioma. Você estará basicamente conectando a estrutura à sintaxe de sua escolha, e a excelente biblioteca padrão do Python ajuda pouco.

Joonas Pulakka
fonte
Eu realmente preciso aprender a usar o GAE. Alguma série de tutoriais online que você recomendaria? Eu estou familiarizado com o Python, mas não tenho idéia do GAE. Obrigado!
@Sergio: code.google.com/appengine/docs :-)
Joonas Pulakka
4
Ou você pode adicionar o Apache Commons IO com uma linha de configuração do Maven e ler os arquivos em uma linha também. A abordagem das baterias incluídas é uma faca de dois gumes para mim.
jiggy
@ jiggy: Eu concordo até certo ponto; As baterias do Python são quase sempre úteis e muitas vezes suficientes, mas, obviamente, a biblioteca padrão não pode atender a todos os propósitos possíveis; portanto, às vezes é preciso recorrer às bibliotecas.
Joonas Pulakka
2
Ler um arquivo de texto em java: List<String> lines = Files.readAllLines(Paths.get("file.txt"), Charset.forName("UTF-8"));. Não é tão ruim! (Este é o java 7, que ainda não foi lançado em 11 de março).
assylias
19

Aqui estão os meus 2 centavos. Na minha experiência, o Python é bom para projetos de pequeno e médio porte, enquanto que para projetos maiores eu sou mais produtivo com Java.

Em geral, posso usar uma linguagem de tipo dinâmico como Python (ou PHP) para projetos menores: não é muito complexo, você quer fazer isso rapidamente e não há muito que possa dar errado. Nesse caso, acho que o Python pode ser mais prático de usar.

No entanto, quando tenho que desenvolver um software maior, prefiro uma linguagem de tipo estaticamente como Java, porque prefiro que o compilador execute o máximo de verificações possível para mim. Minha experiência é que, em projetos maiores, tenho que gastar mais tempo corrigindo bugs com Python do que com Java, por isso não me importo se demorar um pouco mais para escrever o código em Java, pois isso economizará tempo mais tarde.

Giorgio
fonte
6
+1, concordo plenamente. Adoro usar Python e linguagens semelhantes em projetos menores, onde posso envolver minha cabeça em todo o escopo sem grandes problemas. O problema ocorre em projetos maiores, nos quais é necessário inferir interfaces entre componentes. Isso, combinado com um suporte mais fraco à refatoração, me deixa menos confiante na produção de sistemas grandes, estáveis ​​e com manutenção. Muitos testes precisam ser escritos e mantidos, apenas para compensar a falta de análise estática que o compilador executa. Quando chega a esse ponto, os benefícios da rápida iteração inicial são perdidos na manutenção.
bunglestink
Eu uso os dois e gosto dos dois. Eu concordo plenamente com você.
Daniel Baktiar
11

Sou muito mais produtivo em linguagens mais poderosas como Python ou Ruby. Não importa se parte do código Java pode ser gerado por um IDE. Há mais código para ler e manter. Leva mais tempo para percorrer o código repetitivo e encontrar as partes importantes e mais tempo para alterá-lo. Tudo bem que o Eclipse possa converter

private Date dateOfBirth;

para:

private Date dateOfBirth;
public Date getDateOfBirth() { return dateOfDeath; }
public setDateOfBirth(Date d) { dateOfBirth = d; }

mas toda vez que eu abrir a aula, verei esse lixo e preciso passar por ele para encontrar as partes interessantes. Além disso, durante a manutenção, erros podem ser introduzidos no código gerado.

Eu preferiria ver:

attr :date_of_birth

Para mim, a necessidade de um IDE funcionar efetivamente com Java é um bom motivo para escolher outra linguagem.

Talvez com mais força, compare este código Ruby:

avg = people.filter { |p| p.height > 200 }.collect(:weight).average

contra código Java semelhante:

List<Double> weights = new ArrayList<Double>();
for (Person p: people) {
  if (p.getHeight() > 200) {
    weights.add(p.getWeight());
  }
}
return Stats.average(weights);

O código Ruby é uma tradução direta da especificação: o peso médio das pessoas com altura superior a 200 (cm). Um comentário seria totalmente redundante.

O código Java requer um trabalho considerável para escrever e ler.

Paul Graham faz um argumento convincente para a brevidade nas linguagens de programação neste ensaio . Tendo feito alguma matemática no nível de pós-graduação, considero seus argumentos convincentes e os argumentos contra a brevidade fracos. Certamente, uma única linha em uma linguagem de alto nível pode ser mais difícil de entender do que uma única linha em uma linguagem de baixo nível, assim como uma equação diferencial parcial é mais difícil de compreender do que uma simples adição. Mas uma única linha em uma linguagem poderosa é mais fácil de entender do que as cinco ou dez linhas que ela substitui. Imagine ler um texto matemático que foi escrito usando palavras em vez de símbolos.

Kevin Cline
fonte
Eu não usei Python, mas usei C # que possui propriedades automáticas. Quanto trabalho faz no Python adicionar lógica a isso (por exemplo, disparar um evento ou lógica de validação)?
Mlk
@mlk - A instrução "attr" é do Ruby. No Ruby, é muito simples anexar comportamento quando uma propriedade é configurada.
Kevin cline
No python, todos os atributos de classe são automaticamente públicos, portanto, na maioria das vezes, você os acessará diretamente.
Zhehao Mao
3
O Python não precisa de getters ou setters - apenas torne dateOfBirthpúblico. Se a lógica precisar ser adicionada posteriormente a get ou set, adicione a _dateOfBirthpara armazenar os dados e crie um propertynome dateOfBirthcom os métodos get e set. O código de chamada não precisa ser alterado no Python. Java usa apenas acessadores porque não possui o conceito de "propriedade" s.
Izkata
11
Com o Java 8 e fluxos, seu código de peso médio pode ser escrito da seguinte forma:people.stream().filter(p -> p.getHeight() > 200).mapToDouble(Person::getWeight).average().orElse(0);
vitro
7

Mudei de Java para Python há alguns anos e, pessoalmente, sinto que sou mais produtivo. Como o @Joonas aponta, grande parte da produtividade vem da biblioteca empacotada. Mas parte disso é da própria linguagem. Não consigo imaginar não ter dicionários, listas de compreensão, funções de ordem superior e um shell.

Lembre-se de que, se você já conhece Java, levará algum tempo para se tornar fluente em Python.

Dave
fonte
7

Essa é uma pergunta antiga, mas eu gostaria de adicionar meus $ 0,03. Eu acho que isso depende muito da maneira como você pensa. Eu realmente não suporto linguagens dinâmicas interpretadas. Eu sou, por outro lado, um grande fã de linguagens estaticamente tipadas. Claro, o uso do Java pode ser mais detalhado, mas acho mais fácil ler e manter uma vez que tudo já foi dito e feito. Acho Python, Ruby e Perl extremamente difíceis de ler (para mim). Eu simplesmente não consigo entender, mesmo que eu tenha tentado. Dito isto, posso escrever código no Scala muito bem e não é grande coisa. Eu acho que depende do que você está confortável. No final das contas, Java será muito mais poderoso; mais do que Ruby, Python ou Perl. A JVM é uma peça de tecnologia atraente e aprender a aproveitar o poder dela pode ser muito benéfico para você.

Nodey, o cara do nó
fonte
11
Concordo, com certeza você pode invadir o Python muito rápido, mas pode se tornar um pesadelo depurar mais tarde ou adicionar novos recursos, é por isso que costuma ser chamado de "linguagem de prototipagem" e é exatamente isso que eu acho útil (ou para tipo hoc de scripts)
programmx10
2
quando chegará o fim do dia? Esperamos cerca de 20 anos e o Java ainda não possui funções de primeira classe ou nenhum recurso de metaprogramação. Enquanto isso, o C # avançou tremendamente. No ano passado, comecei a escrever código Groovy em vez de Java e minha produtividade aumentou tremendamente. O código Groovy é muito menor e mais fácil de entender do que o código Java correspondente, porque o ruído desapareceu.
Kevin cline
@ Kevin Cline - eu sei o que você está dizendo - sou desenvolvedor de .NET nos últimos seis anos ou algo assim. Não estou falando apenas de produtividade, mas de todo o tempo de compilação, simultaneidade e coisas do tipo multicore. Java e JVM (Groovy, Scala, etc.) A JVM é a coisa mais importante aqui, não necessariamente o próprio Java.
Nodey The Node Guy
2
@ programmx10 A manutenção do seu código Python depende de como você o escreveu. Se você criou um grande kludge, é claro que não poderá depurá-lo. Se, por outro lado, você organizou bem seu código e separou sua funcionalidade em módulos e classes, pode ser tão fácil de manter (se não mais fácil) quanto o código Java.
Zhehao Mao
5

Acho que Python, Ruby, Javascript e SQL são muito mais produtivos do que linguagens compiladas, como Java, porque essas linguagens têm um ciclo de feedback muito rápido. Você pode executar algumas linhas de código em uma linha de comando e saber imediatamente se o código está correto ou não. Se ele lançar exceções, você saberá imediatamente. Com o Java, você precisa compilar, empacotar e implantar, o que geralmente leva alguns minutos para sistemas grandes, e isso resulta em um ciclo de feedback muito lento.

O rápido ciclo de feedback permite iterar rapidamente para uma boa solução, e é isso que torna as linguagens dinâmicas mais produtivas.

Jay Godse
fonte
ótima aplicação do termofeedback loop
anfíbio 13/11
3

Eu tenho feito muito mais python recentemente e sou programador de java há muito tempo, e para novos desenvolvimentos, acho que sou um pouco mais produtivo em python. muitas coisas bastante simples em java podem ser um pouco tediosas, como processamento de arquivos / fluxos, ler coisas de um URL, serializar XML etc. por "tedioso", quero dizer o que leva cinco linhas de código em java geralmente parece pegue apenas um em python. usar as ferramentas certas, como goiaba ou outra API de coleções, pode realmente ajudar com isso.

Eu acho que estou dizendo que uma vantagem do python é que ele vem com muitos recursos que você precisa usar uma biblioteca de terceiros em java para obter.

tudo dito, para certas coisas, eu seria muito mais produtivo em java do que em python, principalmente quando se trata de refatorar e trabalhar com grandes bases de código, etc.

Paul Sanwald
fonte
11
No entanto, o Java é sobre bibliotecas, com o Python eles têm vários métodos, como o PHP, para onde pode ser difícil lembrar de todos, com o Java, basta procurar a biblioteca apropriada e, pelo menos, você tem opções como para o que você usa
programmx10
11
@ programmx10 Do que você está falando? O Python tem muitas bibliotecas para todos os tipos de coisas. Basta olhar para a documentação da biblioteca padrão. As bibliotecas Python são separadas em módulos, assim como as bibliotecas Java são separadas em pacotes.
Zhehao Mao