Productivité Python VS productivité Java

24

Sur SO, je suis tombé sur une question concernant la plate-forme, Java ou Python, la meilleure pour développer sur Google AppEngine. Beaucoup de gens se vantaient de la productivité accrue acquise grâce à l'utilisation de Python sur Java. Une chose que je dirais à propos de l'argument de productivité Python vs Java, c'est que Java a d'excellents IDE pour accélérer le développement alors que Python fait vraiment défaut dans ce domaine en raison de sa nature dynamique.

Donc, même si je préfère utiliser Python en tant que langage, je ne pense pas que cela donne une augmentation de productivité par rapport à Java, en particulier lors de l'utilisation d'un nouveau framework. Évidemment, si c'était Java vs Python et que le seul éditeur que vous pouviez utiliser était VIM, alors Python vous donnerait un énorme gain de productivité, mais lorsque les IDE sont mis dans l'équation, ce n'est pas aussi clair.

Je pense que les mérites de Java sont souvent uniquement évalués au niveau du langage et souvent sur des hypothèses dépassées, mais Java a de nombreux avantages externes au langage lui-même, par exemple la JVM (souvent critiquée mais offre un énorme potentiel), d'excellents IDE et outils, un grand nombre de tiers bibliothèques de fête, plates-formes, etc.

Question, Python / les langages dynamiques associés donnent-ils vraiment les gains de productivité énormes dont on parle souvent? (en envisageant d'utiliser de nouveaux cadres et de travailler avec des applications moyennes à grandes).

toc777
la source
2
Découvrez l'IDE PyCharm. Mais aussi, je pense qu'il existe un nouveau cadre pour GAE qui convertit le code Java en JavaScript pour une utilisation sur le front-end, ce qui pourrait être un gros gain de productivité.
Andrew M
14
IDE ou pas, vous devez encore écrire 10 lignes de Java pour certaines choses qui peuvent être faites (enfin) dans une ligne de Python.
2
N'ayez pas honte de votre amour pour Java. Vous avez appris quelques astuces (IDE, bibliothèques et frameworks) qui vous permettent de botter les fesses. Embrasse le. Vous n'avez pas besoin de notre permission pour être génial. Si Java vous rend productif, cela suffit.
Scant Roger
1
1) Le potentiel JVM est très limité . Délibérément. Ce n'est pas "mauvais", c'est juste, eh bien, limitant. 2) Les IDE ne peuvent aider que si vous ne faites qu'intégrer des centaines de composants existants (ce qui est un type de programmation valide et honoré, mais pas le seul). Lorsqu'il s'agit d'implémenter des algorithmes complexes, Python est tellement plus productif que Java (même des choses comme les fonctions lambda et les compréhensions de listes font une énorme différence).
SK-logic
1
Si votre productivité est considérablement augmentée par votre IDE, alors il y a des chances qu'il y ait quelque chose de terriblement mal avec vous ou votre plate-forme de programmation. (Smalltalk est l'exception, car il crée un système entièrement réfléchissant pour la programmation).
Marcin

Réponses:

18

L'un des principaux avantages de Python est sa philosophie «piles incluses»: une bibliothèque standard étendue et simple à utiliser. En Java, la simple lecture d'un fichier texte nécessite plusieurs lignes de code, des lecteurs imbriqués et autres. En Python, c'est f.read(). Ce sera certainement un énorme gain de productivité, en particulier dans le prototypage rapide. Le langage Python est également généralement moins verbeux, ce qui n'est pas une mauvaise chose (bien que je pense que l'importance de la verbosité par rapport à la concision est souvent surestimée).

Cependant, si vous travaillez déjà sur un cadre, tel que GAE, alors je m'attendrais à ce que les différences soient beaucoup plus petites, et principalement à la maîtrise personnelle de la langue. La plupart du temps, vous ne ferez que câbler le cadre avec la syntaxe de votre choix, et la grande bibliothèque standard de Python n'aide guère.

Joonas Pulakka
la source
J'ai vraiment besoin d'apprendre à utiliser le GAE. Une série de didacticiels en ligne que vous recommanderiez? Je connais Python, mais je n'ai aucune idée de GAE. Merci!
@Sergio: code.google.com/appengine/docs :-)
Joonas Pulakka
4
Ou vous pouvez ajouter Apache Commons IO avec une ligne de configuration Maven, puis lire également les fichiers sur une seule ligne. L'approche piles incluses est pour moi une épée à double tranchant.
jiggy
@jiggy: je suis d'accord dans une certaine mesure; Les batteries de Python sont presque toujours utiles et souvent suffisantes, mais évidemment la bibliothèque standard ne peut pas répondre à toutes les fins possibles, vous devez donc parfois vous rabattre sur les bibliothèques.
Joonas Pulakka
2
La lecture d' un fichier texte en java: List<String> lines = Files.readAllLines(Paths.get("file.txt"), Charset.forName("UTF-8"));. Pas mal! (Il s'agit de java 7 qui n'a pas encore été publié le 11 mars).
assylias
19

Voici mes 2 cents. D'après mon expérience, Python est bon pour les projets de petite à moyenne taille alors que pour les grands projets, je suis plus productif avec Java.

En général, je peux utiliser un langage typé dynamiquement comme Python (ou PHP) pour des projets plus petits: il n'est pas trop complexe, vous voulez le faire rapidement et il n'y a pas trop de choses qui peuvent mal tourner. Dans ce cas, je trouve que Python peut être plus pratique à utiliser.

Cependant, lorsque je dois développer un logiciel plus volumineux, je préfère un langage typé comme Java car je préfère que le compilateur effectue autant de vérifications que possible pour moi. D'après mon expérience, dans les projets plus importants, je dois passer plus de temps à corriger les bogues avec Python qu'avec Java, donc je ne m'inquiète pas s'il faut un peu plus pour écrire le code en Java car cela gagnera du temps plus tard.

Giorgio
la source
6
+1, entièrement d'accord. J'adore utiliser Python et des langages similaires sur des projets plus petits où je peux envelopper ma tête autour de leur portée sans trop de problèmes. Le problème survient dans les projets plus importants où vous devez déduire les interfaces entre les composants. Ceci, combiné avec un support de refactoring plus faible, me rend moins confiant dans la production de systèmes de grande taille, stables et maintenables. Beaucoup de tests doivent être écrits et maintenus, juste pour compenser le manque d'analyse statique que le compilateur effectue. Quand il arrive à ce point, le bénéfice de l'itération initiale rapide est perdu dans la maintenance.
bunglestink
J'utilise les deux et j'aime les deux. Je suis entièrement d'accord avec vous.
Daniel Baktiar
11

Je suis beaucoup plus productif dans des langages plus puissants comme Python ou Ruby. Peu importe si une partie du code Java peut être générée par un IDE. Il y a plus de code à lire et à maintenir. Il faut plus de temps pour parcourir le code répétitif et trouver les parties importantes, et plus de temps pour le changer. C'est bien qu'Eclipse puisse convertir

private Date dateOfBirth;

à:

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

mais chaque fois que j'ouvrirai la classe, je verrai cette camelote et je devrai la parcourir pour trouver les parties intéressantes. De plus, pendant la maintenance, des erreurs peuvent être introduites dans le code généré.

Je préférerais de beaucoup voir:

attr :date_of_birth

Pour moi, la nécessité pour un IDE de travailler efficacement avec Java est une bonne raison de choisir un autre langage.

Peut-être plus puissamment, comparez ce code Ruby:

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

contre un code Java similaire:

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

Le code Ruby est une traduction directe de la spécification: le poids moyen des personnes de plus de 200 (cm). Un commentaire serait tout à fait redondant.

Le code Java nécessite un travail considérable pour écrire et lire.

Paul Graham fait un argument convaincant pour la brièveté des langages de programmation dans cet essai . Après avoir fait des mathématiques de niveau supérieur, je trouve son argument convaincant et les arguments contre la brièveté faibles. Certes, une seule ligne dans une langue de haut niveau peut être plus difficile à comprendre qu'une seule ligne dans une langue de bas niveau, tout comme une équation différentielle partielle est plus difficile à comprendre qu'une simple addition. Mais une seule ligne dans un langage puissant est plus facile à comprendre que les cinq ou dix lignes qu'elle remplace. Imaginez que vous lisiez un texte mathématique écrit à l'aide de mots plutôt que de symboles.

Kevin Cline
la source
Je n'ai pas utilisé Python, mais j'ai utilisé C # qui a des propriétés automatiques. Quel est le travail en Python pour y ajouter de la logique (par exemple, déclencher un événement ou une logique de validation)?
mlk
@mlk - L'instruction "attr" vient de Ruby. Dans Ruby, il est très simple d'attacher un comportement lorsqu'une propriété est définie.
kevin cline
En python, tous les attributs de classe sont automatiquement publics, donc la plupart du temps vous y accéderez directement.
Zhehao Mao
3
Python n'a pas besoin de getters ou setters - il suffit de le rendre dateOfBirthpublic. Si la logique doit y être ajoutée ultérieurement lors de l'obtention ou de la définition, ajoutez un _dateOfBirthpour stocker les données, puis créez un propertynom dateOfBirthavec les méthodes get et set. Le code appelant n'a pas du tout besoin de changer en Python. Java n'utilise que des accesseurs car il n'a pas le concept de "propriété".
Izkata
1
Avec Java 8 et les flux, votre code de poids moyen peut être écrit comme suit:people.stream().filter(p -> p.getHeight() > 200).mapToDouble(Person::getWeight).average().orElse(0);
in vitro
7

Je suis passé de Java à Python il y a quelques années et je pense personnellement que je suis plus productif. Comme le souligne @Joonas, une grande partie de la productivité provient de la bibliothèque empaquetée. Mais certains proviennent de la langue elle-même. Je ne peux pas imaginer ne pas avoir de dictionnaires, de listes de compréhension, de fonctions d'ordre supérieur et d'un shell.

Gardez à l'esprit que si vous connaissiez déjà Java, il faudra un certain temps pour maîtriser Python.

Dave
la source
7

C'est un peu une vieille question, mais j'aimerais ajouter mon 0,03 $. Je pense que cela dépend aussi beaucoup de votre façon de penser. Pour ma part, je ne supporte vraiment pas les langages dynamiques et interprétés. Je suis, d'autre part, un grand fan de langues typées statiquement. Bien sûr, l'utilisation de Java peut être plus verbeuse, mais je trouve plus facile à lire et à maintenir une fois que tout est dit et fait. Je trouve que Python, Ruby et Perl sont extrêmement difficiles à lire (pour moi). Je ne peux simplement pas envelopper ma tête même si j'ai essayé. Cela dit, je peux très bien écrire du code dans Scala et ce n'est pas grave. Je pense que cela dépend de ce que vous êtes à l'aise. À la fin de la journée, Java va être beaucoup plus puissant; plus que Ruby, Python ou Perl. La JVM est une technologie convaincante et apprendre à en exploiter la puissance pourrait s'avérer très bénéfique pour vous.

Nodey The Node Guy
la source
1
D'accord, bien sûr, vous pouvez pirater Python très rapidement, mais cela peut devenir un cauchemar de déboguer plus tard ou d'ajouter de nouvelles fonctionnalités, c'est pourquoi il est souvent appelé "langage de prototypage" et c'est exactement pour cela que je me sens utile (ou pour l'ad- type de scripts ad hoc)
programmx10
2
quand la fin de cette journée va-t-elle arriver? Nous attendons depuis environ 20 ans et Java n'a toujours pas de fonctions de première classe ni aucune installation de méta-programmation. En attendant, C # a énormément progressé. Au cours de la dernière année, j'ai commencé à écrire du code Groovy au lieu de Java et ma productivité a considérablement augmenté. Le code Groovy est beaucoup plus petit et plus facile à comprendre que le code Java correspondant car le bruit a disparu.
Kevin Cline
@Kevin Cline - Je sais ce que vous dites - Je suis développeur .NET depuis six ans ou quelque chose comme ça. Je ne parle pas seulement de productivité, mais de temps de compilation, de simultanéité et de trucs de type multicœur. Java et JVM (Groovy, Scala, etc.) La JVM est la chose la plus importante ici pas nécessairement Java elle-même.
Nodey The Node Guy
2
@ programmx10 La maintenabilité de votre code Python dépend de la façon dont vous l'avez écrit. Si vous avez fait tout ça un grand coup, vous ne pourrez bien sûr pas le déboguer. Si, d'autre part, vous avez bien organisé votre code et séparé vos fonctionnalités en modules et classes, alors il peut être aussi facile à maintenir (sinon plus facile) que le code Java.
Zhehao Mao
5

Je trouve que Python, Ruby, Javascript et SQL sont beaucoup plus productifs que les langages compilés tels que Java parce que ces langages ont une boucle de rétroaction très rapide. Vous pouvez exécuter quelques lignes de code sur une ligne de commande et savoir immédiatement si le code est correct ou non. S'il lève des exceptions, vous le savez immédiatement. Avec Java, vous devez compiler, empaqueter et déployer, ce qui peut souvent prendre des minutes pour les grands systèmes, ce qui entraîne un cycle de rétroaction très lent.

Le cycle de rétroaction rapide vous permet d'itérer rapidement vers une bonne solution, et c'est ce qui rend les langages dynamiques plus productifs.

Jay Godse
la source
grande application du termefeedback loop
amphibient
3

J'ai fait beaucoup plus de python récemment et je suis programmeur java depuis longtemps, et pour un tout nouveau développement, je pense que je suis un peu plus productif en python. beaucoup de choses assez simples en java peuvent être un peu fastidieuses, comme le traitement de fichiers / flux, la lecture de trucs depuis une URL, la sérialisation de XML, etc. par "fastidieux", je veux dire ce qui vous prend 5 lignes de code en java semble souvent n'en prendre qu'un en python. Cependant, l'utilisation des bons outils, comme la goyave ou une autre API de collections, peut vraiment vous aider.

Je suppose que je dis que l'un des avantages de python est qu'il est livré avec de nombreuses fonctionnalités dont vous avez besoin pour utiliser une bibliothèque tierce en java.

tout cela dit, pour certaines choses, je serais beaucoup plus productif en java que je ne pourrais l'être en python, en particulier quand il s'agit de refactoriser et de travailler avec de grandes bases de code, etc.

Paul Sanwald
la source
1
Java est une question de bibliothèques, cependant, avec Python, elles ont un tas de méthodes, un peu comme PHP, où il peut être difficile de toutes les mémoriser, avec Java vous recherchez simplement la bibliothèque appropriée et vous avez au moins le choix comme à ce que vous utilisez
programmx10
1
@ programmx10 De quoi parlez-vous? Python possède de nombreuses bibliothèques pour toutes sortes de choses. Regardez simplement la documentation de la bibliothèque standard. Les bibliothèques Python sont séparées en modules, tout comme les bibliothèques Java sont séparées en packages.
Zhehao Mao