Productividad Python VS Productividad Java

24

En SO me encontré con una pregunta sobre qué plataforma, Java o Python es mejor para desarrollar en Google AppEngine. Muchas personas se jactaban del aumento de la productividad obtenida del uso de Python sobre Java. Una cosa que diría sobre el argumento de productividad Python vs Java, es que Java tiene excelentes IDE para acelerar el desarrollo, ya que Python realmente carece en esta área debido a su naturaleza dinámica.

Entonces, aunque prefiero usar Python como lenguaje, no creo que brinde un gran impulso de productividad en comparación con Java, especialmente cuando se usa un nuevo marco. Obviamente, si fuera Java vs Python y el único editor que pudiera usar fuera VIM, Python le daría un gran impulso de productividad, pero cuando los IDE se incorporan a la ecuación no es tan claro.

Creo que los méritos de Java a menudo se evalúan únicamente a nivel de lenguaje y, a menudo, en supuestos obsoletos, pero Java tiene muchos beneficios externos al lenguaje en sí, por ejemplo, la JVM (a menudo criticada pero ofrece un gran potencial), excelentes IDE y herramientas, un gran número de terceros bibliotecas de fiestas, plataformas, etc.

Pregunta, ¿Python / lenguajes dinámicos relacionados realmente dan los enormes aumentos de productividad de los que se habla a menudo? (considerando el uso de nuevos marcos y el trabajo con aplicaciones medianas a grandes).

toc777
fuente
2
Echa un vistazo a PyCharm IDE. Pero también, creo que hay un nuevo marco para GAE que convierte el código Java en JavaScript para su uso en el front-end, lo que podría ser una gran ganancia de productividad.
Andrew M
14
IDE o no, todavía tiene que escribir 10 líneas de Java para algunas cosas que se pueden hacer (bueno) en una línea de Python.
2
No te avergüences de tu amor por Java. Has aprendido algunos trucos (IDE, bibliotecas y marcos) que te permiten patear los traseros. Abrázalo. No necesitas permiso de nosotros para ser increíble. Si Java te hace productivo, entonces es suficiente.
Escaso Roger
1
1) El potencial de JVM es muy limitado . Deliberadamente. No es "malo", es simplemente, bueno, limitante. 2) Los IDE solo pueden ayudar si todo lo que hace es integrar cientos de componentes existentes (que es un tipo de programación válido y honrado, pero no el único). Cuando se trata de implementar algoritmos complejos, Python es mucho más productivo que Java (incluso cosas como las funciones lambda y las comprensiones de listas hacen una gran diferencia).
SK-logic
1
Si su IDE aumenta significativamente su productividad, entonces es probable que haya algo terriblemente mal en usted o en su plataforma de programación. (Smalltalk es la excepción, porque crea un sistema totalmente reflexivo para la programación).
Marcin

Respuestas:

18

Una de las principales ventajas de Python es su filosofía de "baterías incluidas": una biblioteca estándar extensa y fácil de usar. En Java, solo leer un archivo de texto requiere varias líneas de código, lectores anidados y demás. En Python es f.read(). Esto definitivamente será un gran aumento de la productividad, especialmente en la creación rápida de prototipos. Python el lenguaje también es generalmente menos detallado, lo que no es malo (aunque creo que la importancia de la verbosidad frente a la concisión a menudo se enfatiza demasiado).

Sin embargo, si ya está trabajando en algún marco, como GAE, entonces esperaría que las diferencias sean mucho más pequeñas, y principalmente hasta la fluidez personal del idioma. En su mayoría, solo conectará el marco junto con la sintaxis de su elección, y allí la gran biblioteca estándar de Python ayuda poco.

Joonas Pulakka
fuente
Yo realmente necesito aprender cómo utilizar el GAE. ¿Alguna serie de tutoriales en línea que recomendarías? Estoy familiarizado con Python, pero no tengo idea de GAE. ¡Gracias!
@Sergio: code.google.com/appengine/docs :-)
Joonas Pulakka
44
O puede agregar Apache Commons IO con una línea de configuración de Maven y luego leer archivos en una línea también. El enfoque de baterías incluidas es una espada de doble filo para mí.
jiggy
@jiggy: estoy de acuerdo en cierto grado; Las baterías de Python son casi siempre útiles y a menudo suficientes, pero obviamente la biblioteca estándar no puede satisfacer todos los propósitos posibles, por lo que a veces debe recurrir a las bibliotecas.
Joonas Pulakka
2
La lectura de un archivo de texto en Java: List<String> lines = Files.readAllLines(Paths.get("file.txt"), Charset.forName("UTF-8"));. ¡No está mal! (Esto es Java 7, que aún no se lanzó el 11 de marzo).
Assylias
19

Aquí están mis 2 centavos. En mi experiencia, Python es bueno para proyectos pequeños a medianos, mientras que para proyectos más grandes soy más productivo con Java.

En general, puedo usar un lenguaje de tipo dinámico como Python (o PHP) para proyectos más pequeños: no es demasiado complejo, desea hacerlo rápido y no hay demasiado que pueda salir mal. En este caso, encuentro que Python puede ser más práctico de usar.

Sin embargo, cuando tengo que desarrollar un software más grande, prefiero un lenguaje de tipo estático como Java porque prefiero que el compilador realice tantas comprobaciones como sea posible. Mi experiencia es que en proyectos más grandes tengo que pasar más tiempo reparando errores con Python que con Java, así que no me molesto si toma un poco más de tiempo escribir el código en Java porque esto ahorrará tiempo más adelante.

Giorgio
fuente
66
+1, totalmente de acuerdo. Me encanta usar Python y lenguajes similares en proyectos más pequeños donde puedo entender todo su alcance sin muchos problemas. El problema viene en proyectos más grandes donde tienes que inferir interfaces entre componentes. Esto, combinado con un soporte de refactorización más débil, me da menos confianza para producir sistemas grandes, estables y mantenibles. Se deben escribir y mantener muchas pruebas, solo para compensar la falta de análisis estático que realiza el compilador. Cuando llega a este punto, el beneficio de la iteración inicial rápida se pierde en mantenimiento.
bunglestink
Yo uso ambos, y me gustan los dos. Estoy totalmente de acuerdo con usted.
Daniel Baktiar
11

Soy mucho más productivo en lenguajes más potentes como Python o Ruby. No importa si un IDE puede generar parte del código Java. Hay más código para leer y mantener. Se necesita más tiempo para leer el código repetitivo y encontrar las partes importantes, y más tiempo para cambiarlo. Está bien que Eclipse pueda convertir

private Date dateOfBirth;

a:

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

pero cada vez que abro la clase veré esa basura y tendré que pasar rápidamente para encontrar las partes interesantes. Además, durante el mantenimiento, se pueden introducir errores en el código generado.

Prefiero ver:

attr :date_of_birth

Para mí, la necesidad de un IDE para trabajar efectivamente con Java es una buena razón para elegir otro idioma.

Quizás más poderosamente, compare este código Ruby:

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

contra código Java similar:

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

El código Ruby es una traducción directa de la especificación: el peso promedio de las personas más altas que 200 (cm). Un comentario sería completamente redundante.

El código Java requiere un trabajo considerable tanto para escribir como para leer.

Paul Graham hace un argumento convincente de brevedad en los lenguajes de programación en este ensayo . Después de haber hecho algunas matemáticas a nivel de posgrado, encuentro su argumento convincente y los argumentos contra la brevedad son débiles. Ciertamente, una sola línea en un lenguaje de alto nivel puede ser más difícil de entender que una sola línea en un lenguaje de bajo nivel, así como una ecuación diferencial parcial es más difícil de comprender que una simple suma. Pero una sola línea en un lenguaje poderoso es más fácil de comprender que las cinco o diez líneas que reemplaza. Imagine leer un texto matemático que se escribió usando palabras en lugar de símbolos.

Kevin Cline
fuente
No he usado Python, pero he usado C # que tiene propiedades automáticas. ¿Cuánto trabajo es en Python agregar lógica a eso (por ejemplo, disparar un evento o lógica de validación)?
mlk
@mlk: la declaración "attr" es de Ruby. En Ruby, es muy sencillo asociar el comportamiento cuando se establece una propiedad.
Kevin Cline
En python, todos los atributos de clase son públicos automáticamente, por lo que la mayoría de las veces accederá a ellos directamente.
Zhehao Mao
3
Python no necesita captadores o setters, solo hazlos dateOfBirthpúblicos. Si es necesario agregarle lógica más adelante en get o set, agregue a _dateOfBirthpara almacenar los datos, luego cree un propertynombre dateOfBirthcon los métodos get y set. El código de llamada no necesita cambiar en absoluto en Python. Java solo usa accesores porque no tiene el concepto de "propiedad".
Izkata
1
Con Java 8 y las transmisiones, su código de peso promedio puede escribirse como tal:people.stream().filter(p -> p.getHeight() > 200).mapToDouble(Person::getWeight).average().orElse(0);
vitro
7

Me mudé de Java a Python hace unos años y personalmente siento que soy más productivo. Como señala @Joonas, gran parte de la productividad proviene de la biblioteca empaquetada. Pero algo de eso es del lenguaje mismo. No puedo imaginar no tener diccionarios, listas de comprensión, funciones de orden superior y un shell.

Tenga en cuenta que si ya conocía Java, tomará un tiempo adquirir fluidez en Python.

Dave
fuente
7

Esta es una pregunta un poco antigua, pero me gustaría agregar mi $ .03. Creo que también depende mucho de tu forma de pensar. Por mi parte, realmente no soporto lenguajes dinámicos e interpretados. Soy, por otro lado, un gran fanático de los lenguajes de tipo estático. Claro, usar Java puede ser más detallado, pero me resulta más fácil de leer y mantener una vez que todo está dicho y hecho. Creo que Python, Ruby y Perl son extremadamente difíciles de leer (para mí). Simplemente no puedo entenderlo a pesar de que lo he intentado. Dicho esto, puedo escribir código en Scala bien y no es gran cosa. Creo que depende de con qué te sientas cómodo. Al final del día, Java será mucho más poderoso; más que Ruby, Python o Perl. El JVM es una tecnología atractiva y aprender a aprovechar su poder podría resultar muy beneficioso para usted.

Nodey The Node Guy
fuente
1
De acuerdo, seguro que puedes hackear Python muy rápido, pero puede convertirse en una pesadilla depurar más tarde o agregar nuevas características, por eso a menudo se llama un "lenguaje de creación de prototipos" y eso es justo lo que creo que es útil (o para publicidad) tipo específico de scripts)
programmx10
2
¿Cuándo va a llegar el final de ese día? Hemos estado esperando unos 20 años y Java todavía no tiene funciones de primera clase o ninguna instalación de metaprogramación. Mientras tanto, C # ha avanzado enormemente. Durante el año pasado comencé a escribir código Groovy en lugar de Java y mi productividad aumentó enormemente. El código Groovy es mucho más pequeño y fácil de entender que el código Java correspondiente porque el ruido se ha ido.
Kevin Cline
@Kevin Cline - Sé lo que estás diciendo - He sido desarrollador de .NET durante los últimos seis años o algo así. No estoy hablando solo de productividad, sino de tiempo de compilación, concurrencia y material multinúcleo. Java y JVM (Groovy, Scala, etc.) JVM es lo que es lo más importante aquí, no necesariamente el propio Java.
Nodey The Node Guy
2
@ programmx10 La capacidad de mantenimiento de su código Python depende de cómo lo haya escrito. Si lo hiciste todo un gran error, por supuesto, no podrás depurarlo. Si, por otro lado, organizó bien su código y separó su funcionalidad en módulos y clases, entonces puede ser tan fácil de mantener (si no más fácil) que el código Java.
Zhehao Mao
5

Me parece que Python, Ruby, Javascript y SQL son mucho más productivos que los lenguajes compilados como Java porque esos lenguajes tienen un ciclo de retroalimentación muy rápido. Puede ejecutar algunas líneas de código en una línea de comando e inmediatamente saber si el código es correcto o no. Si arroja excepciones, lo sabes de inmediato. Con Java, tiene que compilar, empaquetar e implementar, lo que a menudo puede llevar minutos para sistemas grandes, y esto resulta en un ciclo de retroalimentación muy lento.

El rápido ciclo de retroalimentación le permite iterar rápidamente hacia una buena solución, y eso es lo que hace que los lenguajes dinámicos sean más productivos.

Jay Godse
fuente
gran aplicación del términofeedback loop
anfibio
3

He estado haciendo mucho más Python recientemente y he sido programador de Java durante mucho tiempo, y para un desarrollo completamente nuevo, creo que soy bastante más productivo en Python. Muchas cosas bastante simples en Java pueden ser un poco tediosas, como el procesamiento de archivos / secuencias, leer cosas de una URL, serializar XML, etc. por "tedioso", quiero decir, lo que te lleva 5 líneas de código en Java a menudo parece tomar solo uno en python. Sin embargo, usar las herramientas adecuadas, como la guayaba u otra API de colecciones, realmente puede ayudar con esto.

Supongo que estoy diciendo que una ventaja de python es que viene con muchas características que necesitas para usar una biblioteca de terceros en Java.

Dicho todo esto, para ciertas cosas sería mucho más productivo en Java que en Python, especialmente cuando se trata de refactorizar y trabajar con grandes bases de código, etc.

Paul Sanwald
fuente
1
Sin embargo, Java tiene que ver con las bibliotecas, con Python tienen un montón de métodos, algo así como PHP, hasta donde puede ser difícil recordarlos todos, con Java solo busca la biblioteca adecuada y al menos tiene opciones como a lo que usas
programmx10
1
@ programmx10 ¿De qué estás hablando? Python tiene muchas bibliotecas para todo tipo de cosas. Solo mire la documentación de la biblioteca estándar. Las bibliotecas de Python están separadas en módulos, al igual que las bibliotecas de Java están separadas en paquetes.
Zhehao Mao