Python-Produktivität im Vergleich zu Java-Produktivität

24

Bei SO stieß ich auf die Frage, welche Plattform, Java oder Python für die Entwicklung in Google AppEngine am besten geeignet sind. Viele Leute rühmten sich der gesteigerten Produktivität, die durch die Verwendung von Python über Java erzielt wurde. Eine Sache, die ich über das Produktivitätsargument Python vs. Java sagen möchte, ist, dass Java hervorragende IDEs hat, um die Entwicklung zu beschleunigen, da Python in diesem Bereich aufgrund seiner Dynamik wirklich fehlt.

Obwohl ich Python als Sprache bevorzuge, glaube ich nicht, dass es die Produktivität im Vergleich zu Java erheblich steigert, insbesondere wenn ein neues Framework verwendet wird. Wäre es Java gegen Python und der einzige Editor, den Sie verwenden könnten, wäre VIM, dann würde Python Ihnen einen enormen Produktivitätsschub bringen, aber wenn IDEs in die Gleichung einbezogen werden, ist dies nicht so eindeutig.

Ich denke, dass Javas Verdienste oft nur auf Sprachebene und oft auf veralteten Annahmen bewertet werden, aber Java hat viele Vorteile, die außerhalb der Sprache selbst liegen, z Partybibliotheken, Plattformen etc ..

Frage: Gibt Python / verwandte dynamische Sprachen wirklich die enormen Produktivitätssteigerungen, von denen oft gesprochen wird? (unter Berücksichtigung der Verwendung neuer Frameworks und der Arbeit mit mittleren bis großen Anwendungen).

toc777
quelle
2
Schauen Sie sich die PyCharm-IDE an. Aber ich glaube auch, dass es für GAE ein neues Framework gibt, das Java-Code für die Verwendung im Front-End in JavaScript konvertiert, was einen großen Produktivitätsgewinn bedeuten könnte.
Andrew M
14
IDE oder nicht, Sie müssen immer noch 10 Zeilen Java schreiben, um einige Dinge zu erledigen, die (auch) in einer Zeile von Python möglich sind.
2
Schäme dich nicht für deine Liebe zu Java. Sie haben ein paar Tricks gelernt (IDE, Bibliotheken und Frameworks), mit denen Sie den Nerv treffen können. Umarme es. Sie brauchen keine Erlaubnis von uns, um großartig zu sein. Wenn Java Sie produktiv macht , dann ist das genug.
Scant Roger
1
1) Das JVM-Potenzial ist sehr begrenzt . Bewusst. Es ist nicht "schlecht", sondern nur einschränkend. 2) IDEs können nur helfen, wenn Sie nur Hunderte der vorhandenen Komponenten integrieren (was eine gültige und anerkannte Art der Programmierung ist, aber nicht die einzige). Bei der Implementierung komplexer Algorithmen ist Python so viel produktiver als Java (selbst Dinge wie Lambda-Funktionen und Listenverständnis machen einen großen Unterschied).
SK-logic
1
Wenn Ihre Produktivität durch Ihre IDE erheblich gesteigert wird, besteht die Möglichkeit, dass etwas schreckliches mit Ihnen oder Ihrer Programmierplattform nicht stimmt. (Smalltalk ist die Ausnahme, da es ein vollständig reflektierendes Programmiersystem schafft.)
Marcin

Antworten:

18

Einer der Hauptvorteile von Python ist die Philosophie "Batterien enthalten": eine umfangreiche und einfach zu verwendende Standardbibliothek. In Java sind zum Lesen einer Textdatei mehrere Codezeilen, verschachtelte Reader und dergleichen erforderlich. In Python ist es f.read(). Dies wird auf jeden Fall eine enorme Produktivitätssteigerung sein, insbesondere beim schnellen Prototyping. Python ist in der Regel auch weniger ausführlich, was keine schlechte Sache ist (obwohl ich denke, dass die Bedeutung von Ausführlichkeit und Prägnanz oft überbewertet wird).

Wenn Sie jedoch bereits an einem Framework wie GAE arbeiten, würde ich davon ausgehen, dass die Unterschiede viel geringer sind und hauptsächlich von Ihrer persönlichen Sprachkenntnis abhängen. Sie werden meist nur das Framework mit der Syntax Ihrer Wahl verbinden, und dort hilft die große Standardbibliothek von Python wenig.

Joonas Pulakka
quelle
Ich muss wirklich lernen, wie man die GAE benutzt. Jede Online-Tutorialserie, die Sie empfehlen würden? Ich bin vertraut mit Python, aber keine Ahnung von GAE haben. Vielen Dank!
@ Sergio: code.google.com/appengine/docs :-)
Joonas Pulakka
4
Oder Sie können Apache Commons IO mit einer Zeile der Maven-Konfiguration hinzufügen und dann auch Dateien in einer Zeile lesen. Der mitgelieferte Ansatz für Batterien ist für mich ein zweischneidiges Schwert.
jiggy
@jiggy: Ich stimme zu einem gewissen Grad zu; Pythons Batterien sind fast immer nützlich und oft ausreichend, aber die Standardbibliothek kann natürlich nicht alle möglichen Zwecke erfüllen, sodass Sie manchmal auf Bibliotheken zurückgreifen müssen.
Joonas Pulakka
2
Lesen einer Textdatei in Java: List<String> lines = Files.readAllLines(Paths.get("file.txt"), Charset.forName("UTF-8"));. Nicht so schlecht! (Dies ist Java 7, das noch nicht im März 11 veröffentlicht wurde).
Assylias
19

Hier sind meine 2 Cent. Meiner Erfahrung nach eignet sich Python für kleine bis mittlere Projekte, während ich für größere Projekte mit Java produktiver bin.

Im Allgemeinen kann ich für kleinere Projekte eine dynamisch typisierte Sprache wie Python (oder PHP) verwenden: Sie ist nicht zu komplex, Sie möchten sie schnell erledigen, und es kann nicht zu viel schief gehen. In diesem Fall finde ich, dass die Verwendung von Python praktischer sein kann.

Wenn ich jedoch eine größere Software entwickeln muss, bevorzuge ich eine statisch typisierte Sprache wie Java, weil ich es vorziehe, wenn der Compiler so viele Prüfungen wie möglich für mich durchführt. Ich habe die Erfahrung gemacht, dass ich in größeren Projekten mehr Zeit mit der Behebung von Fehlern mit Python als mit Java verbringen muss. Daher stört es mich nicht, wenn das Schreiben des Codes in Java etwas länger dauert, da dies später Zeit spart.

Giorgio
quelle
6
+1, stimme voll zu. Ich liebe es, Python und ähnliche Sprachen für kleinere Projekte zu verwenden, bei denen ich ohne großen Aufwand meinen Kopf um ihren gesamten Umfang legen kann. Das Problem tritt bei größeren Projekten auf, bei denen Schnittstellen zwischen Komponenten abgeleitet werden müssen. In Kombination mit einer schwächeren Refactoring-Unterstützung bin ich weniger zuversichtlich, große, stabile und wartbare Systeme zu produzieren. Viele Tests müssen geschrieben und gepflegt werden, um das Fehlen einer statischen Analyse durch den Compiler auszugleichen. Wenn dieser Punkt erreicht ist, geht der Vorteil der schnellen anfänglichen Iteration bei der Wartung verloren.
Mistkerl
Ich benutze beide und ich mag beide. Ich stimme dir voll und ganz zu.
Daniel Baktiar
11

In mächtigeren Sprachen wie Python oder Ruby bin ich viel produktiver. Es spielt keine Rolle, ob ein Teil des Java-Codes von einer IDE generiert werden kann. Es gibt mehr Code zu lesen und zu warten. Es dauert länger, sich durch sich wiederholenden Code zu wühlen und die wichtigen Teile zu finden, und es dauert länger, ihn zu ändern. Es ist in Ordnung, dass Eclipse konvertieren kann

private Date dateOfBirth;

zu:

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

Aber jedes Mal, wenn ich die Klasse öffne, sehe ich diesen Müll und muss ihn überfliegen, um die interessanten Teile zu finden. Außerdem können während der Wartung Fehler in den generierten Code eingefügt werden.

Ich würde viel lieber sehen:

attr :date_of_birth

Für mich ist die Notwendigkeit, dass eine IDE effektiv mit Java zusammenarbeitet, ein guter Grund, eine andere Sprache zu wählen.

Vielleicht mächtiger, vergleiche diesen Ruby-Code:

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

gegen ähnlichen Java-Code:

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

Der Ruby-Code ist eine direkte Übersetzung der Spezifikation: das durchschnittliche Gewicht von Personen, die größer als 200 (cm) sind. Ein Kommentar wäre überflüssig.

Der Java-Code erfordert sowohl zum Schreiben als auch zum Lesen einen erheblichen Arbeitsaufwand.

Paul Graham liefert in diesem Aufsatz ein überzeugendes Argument für die Kürze der Programmiersprachen . Nach Abschluss der Mathematik finde ich sein Argument überzeugend und die Argumente gegen die Kürze schwach. Gewiss ist eine einzelne Zeile in einer höheren Sprache schwieriger zu verstehen als eine einzelne Zeile in einer niedrigeren Sprache, genauso wie eine partielle Differentialgleichung schwieriger zu verstehen ist als eine einfache Addition. Aber eine einzelne Zeile in einer mächtigen Sprache ist leichter zu verstehen als die fünf oder zehn Zeilen, die sie ersetzt. Stellen Sie sich vor, Sie lesen einen mathematischen Text, der mit Wörtern anstelle von Symbolen geschrieben wurde.

Kevin Cline
quelle
Ich habe nicht Python verwendet, sondern C # mit automatischen Eigenschaften. Wie viel Arbeit ist es in Python, Logik hinzuzufügen (z. B. ein Ereignis oder eine Validierungslogik auszulösen)?
mlk
@mlk - Die "attr" -Anweisung stammt von Ruby. In Ruby ist es sehr einfach, ein Verhalten zuzuweisen, wenn eine Eigenschaft festgelegt ist.
Kevin Cline
In Python sind alle Klassenattribute automatisch öffentlich, sodass Sie die meiste Zeit direkt darauf zugreifen können.
Zhehao Mao
3
Python braucht keine Getter oder Setter - mach es einfach dateOfBirthöffentlich. Wenn Logik später hinzugefügt werden muss, fügen Sie a hinzu _dateOfBirth, um die Daten zu speichern, und erstellen Sie dann einen propertyNamen dateOfBirthmit den Methoden get und set. Der aufrufende Code muss sich in Python überhaupt nicht ändern. Java verwendet nur Accessoren, weil es nicht das Konzept der "Eigenschaften" hat.
Izkata
1
Mit Java 8 und Streams kann Ihr durchschnittlicher Gewichtscode folgendermaßen geschrieben werden:people.stream().filter(p -> p.getHeight() > 200).mapToDouble(Person::getWeight).average().orElse(0);
vitro
7

Ich bin vor ein paar Jahren von Java zu Python gewechselt und habe das Gefühl, dass ich produktiver bin. Wie @Joonas betont, stammt ein Großteil der Produktivität aus der gepackten Bibliothek. Aber ein Teil davon stammt aus der Sprache selbst. Ich kann mir nicht vorstellen, keine Wörterbücher, Listenverständnisse, Funktionen höherer Ordnung und eine Shell zu haben.

Denken Sie daran, dass es eine Weile dauern wird, bis Sie Python fließend beherrschen, wenn Sie Java bereits kennen.

Dave
quelle
7

Dies ist eine alte Frage, aber ich möchte meine $ .03 hinzufügen. Ich denke, dass es sehr davon abhängt, wie du auch denkst. Ich kann dynamische, interpretierte Sprachen wirklich nicht ausstehen. Andererseits bin ich ein großer Fan von statisch getippten Sprachen. Sicher, die Verwendung von Java kann ausführlicher sein, aber ich finde es einfacher zu lesen und zu warten, wenn alles gesagt und getan ist. Ich finde, dass Python, Ruby und Perl (für mich) extrem schwer zu lesen sind. Ich kann einfach nicht meinen Kopf darum wickeln, obwohl ich es versucht habe. Das heißt, ich kann Code in Scala gut schreiben und es ist keine große Sache. Ich denke, es hängt davon ab, womit Sie sich wohl fühlen. Am Ende des Tages wird Java viel mächtiger sein; mehr als Ruby, Python oder Perl. Die JVM ist ein überzeugendes Stück Technologie, und das Erlernen der Nutzung ihrer Leistungsfähigkeit kann sich als sehr vorteilhaft für Sie erweisen.

Nodey The Node Guy
quelle
1
Ich bin mir sicher, dass Sie sich sehr schnell von Python abkoppeln können, aber es kann zu einem Albtraum werden, später zu debuggen oder neue Funktionen hinzuzufügen. Hoc-Typ von Skripten)
programmx10
2
Wann wird das Ende dieses Tages kommen? Wir haben ungefähr 20 Jahre gewartet und Java hat immer noch keine erstklassigen Funktionen oder Metaprogrammierungsmöglichkeiten. In der Zwischenzeit hat C # enorme Fortschritte gemacht. Im letzten Jahr habe ich angefangen, Groovy-Code anstelle von Java zu schreiben, und meine Produktivität hat sich enorm erhöht. Der Groovy-Code ist viel kleiner und verständlicher als der entsprechende Java-Code, da das Rauschen weg ist.
Kevin Cline
@ Kevin Cline - Ich weiß, was Sie sagen - Ich bin seit etwa sechs Jahren ein .NET-Entwickler oder so. Ich spreche nicht nur von Produktivität, sondern auch von reiner Kompilierungszeit, Parallelität und Multicore-Typ. Java und JVM (Groovy, Scala, etc.) JVM ist hier das Wichtigste, nicht unbedingt Java selbst.
Nodey The Node Guy
2
@ programmx10 Die Wartbarkeit Ihres Python-Codes hängt davon ab, wie Sie ihn geschrieben haben. Wenn Sie das alles zu einem großen Problem gemacht haben, können Sie es natürlich nicht debuggen. Wenn Sie andererseits Ihren Code gut organisiert und Ihre Funktionalität in Module und Klassen unterteilt haben, kann er genauso einfach zu warten (wenn nicht einfacher) sein als Java-Code.
Zhehao Mao
5

Ich finde, dass Python, Ruby, Javascript und SQL viel produktiver sind als kompilierte Sprachen wie Java, da diese Sprachen eine sehr schnelle Rückkopplungsschleife haben. Sie können einige Codezeilen in einer Befehlszeile ausführen und sofort feststellen, ob der Code korrekt ist oder nicht. Wenn es Ausnahmen auslöst, wissen Sie sofort. Mit Java müssen Sie kompilieren, packen und implementieren, was bei großen Systemen oft Minuten in Anspruch nimmt. Dies führt zu einem sehr langsamen Feedback-Zyklus.

Durch den schnellen Feedback-Zyklus können Sie schnell zu einer guten Lösung übergehen, und das macht dynamische Sprachen produktiver.

Jay Godse
quelle
großartige Anwendung des Begriffsfeedback loop
amphibient
3

Ich habe in letzter Zeit viel mehr Python gemacht und war lange Zeit Java-Programmierer, und für brandneue Entwicklungen denke ich, dass ich in Python einiges produktiver bin. Viele ziemlich einfache Dinge in Java können ein bisschen langweilig sein, wie Datei- / Stream-Verarbeitung, Lesen von Daten von einer URL, Serialisieren von XML usw. mit "langweilig" nimm nur eine in python. Die Verwendung der richtigen Tools, wie Guave oder einer anderen Sammlungs-API, kann dabei jedoch sehr hilfreich sein.

Ich vermute, ich sage, dass ein Vorteil von Python darin besteht, dass es mit vielen Funktionen ausgestattet ist, die Sie benötigen, um eine Drittanbieter-Bibliothek in Java zu verwenden.

Alles in allem wäre ich in Java weitaus produktiver als in Python, insbesondere wenn es darum geht, große Codebasen umzugestalten und mit ihnen zu arbeiten.

Paul Sanwald
quelle
1
In Java dreht sich alles um Bibliotheken. In Python gibt es eine Reihe von Methoden, ähnlich wie in PHP. In Java kann es schwierig sein, sich alle zu merken. Sie suchen einfach nach der entsprechenden Bibliothek und haben dann zumindest die Wahl zwischen zu was du verwendest
programmx10
1
@ programmx10 Wovon redest du? Python hat viele Bibliotheken für alle möglichen Dinge. Schauen Sie sich einfach die Dokumentation der Standardbibliothek an. Python-Bibliotheken sind in Module und Java-Bibliotheken in Pakete unterteilt.
Zhehao Mao