¿De qué manera la falta de tipos estáticos de Python afecta mantenibilidad y extensibilidad en proyectos de mayor envergadura?

StackOverflow https://stackoverflow.com/questions/3671827

Pregunta

Después de leer esta muy informativo (aunque algo controvertido) pregunta me gustaría saber su experiencia con la programación de proyectos grandes con Python. Hacer las cosas se vuelven manejables ONU como el proyecto se hace más grande? Esta preocupación es una cosa que me mantiene atado a Java. Por lo tanto, me interesaría particularmente en informado comparaciones de mantenimiento y extensibilidad de Java y Python para grandes proyectos.

¿Fue útil?

Solución

Yo trabajo en un producto comercial a gran escala realizado en Python. Doy una estimación muy aproximada de 5.000 archivos x 500 líneas cada uno. Eso es alrededor de 2,5 millones de líneas de Python. Cuenta que la complejidad de este proyecto es probablemente equivalente a 10 mil + líneas de código en otros idiomas. No he oído de un solo ingeniero / Arquitectura / gerente que se quejan de código Python siendo imposible de mantener. Por lo que he visto desde nuestro gestor de fallos, no veo ningún problema sistémico que podría evitarse mediante la comprobación de tipo estático. De hecho hay muy pocos errores desovar de un uso incorrecto del tipo de objeto en absoluto.

creo que esto es una muy buena materia académica para estudiar empíricamente qué lenguaje basado en la clase estática no parece ser tan crítica como uno podría pensar.

Y sobre la extensibilidad. Acabamos de agregar una base de datos 2 en la parte superior de la base de datos 1 en nuestro producto, tanto de ellos no es de SQL. No hay ningún problema relacionado con el tipo de cheques. En primer lugar hemos diseñado un API suficientemente flexible para anticipar diferente implementación subyacente. Creo que es un lenguaje dinámico ayuda en lugar de obstáculo en este sentido. Cuando fuimos a probar y corrección de errores frase, estábamos trabajando en la clase de bichos personas que trabajan en cualquier idioma tendría que enfrentarse. Por ejemplo, los problemas de uso de memoria, consistencia y problemas de integridad referencial, problemas de manejo de errores. No veo la comprobación de tipos estáticos tienen mucha ayuda en cualquiera de estos desafíos. Por otra parte nos hemos beneficiado enormemente de lenguaje dinámico al ser capaces de inyectar código en pleno vuelo o después de sencilla aplicación de parches. Y somos capaces de poner a prueba nuestra hipótesis y demostrar nuestras correcciones rápidamente.

Es seguro decir que la mayoría de nuestros más de 100 ingenieros son felices y productivos usando Python. Probablemente es impensable para nosotros para construir el mismo producto usando un lenguaje con tipos estática en la misma cantidad de tiempo con la misma calidad.

Otros consejos

A partir de mi experiencia lenguas tipos estáticos puede ser difícil de mantener. Por ejemplo digamos que usted tiene una función de utilidad que acepta una clase personalizada como un parámetro. Si por el camino que adoptar una nueva convención de nombres que el nombre de esta clase tendrán que cambiar, y luego a continuación, todas sus funciones de utilidad tendrá que cambiar también. En un lenguaje como Python no importa, siempre y en los instrumentos de la clase los mismos métodos.

En lo personal me desprecian un lenguaje que se interponga en mi camino. Velocidad de expresar sus ideas es el valor, y esta es la ventaja Python tiene más de Java.

Una gran base de código en Python sin una buena cobertura de la prueba podría ser un problema. Pero eso es sólo una parte de la imagen. Es todo acerca de las personas y los enfoques adecuados para hacer el trabajo.

Sin

  • Control de código fuente
  • seguimiento de fallos
  • Pruebas de Unidad
  • equipo comprometido

que puede fallar con cualquier tipo de lenguaje.

Me acuerdo de los días antes y después de la innovación de IntelliJ IDEA. Hay enormes diferencias. Antes, tipos estáticos sólo para la compilación, el desarrollo básicamente trata el código fuente como archivos de texto. Después de la información, el código fuente está estructurado, muchas de las tareas de desarrollo son imprescindible fácil, gracias a tipos estáticos.

Sin embargo, no es como en los viejos días estaban viviendo un infierno. Nos lo tomamos como es, hacer lo que sea necesario, utilizar las herramientas disponibles hasta la fecha, que el sistema integrado, la satisfacción. No había demasiados malos recuerdos. Eso es probablemente lo que sienten los programadores tipado dinámico ahora. No es tan malo.

Por supuesto, nunca me voy a volver a los viejos tiempos. Si tengo prohibido utilizar un IDE tal, que supongo que nos dan la programación de todos juntos.

Trate de rastreo de nuevo la fuente de un objeto aparentemente con formato incorrecto en un marco grande, de tipo dinámico con una gran cantidad de la COI u otros patrones de diseño en el que el objeto no puede atribuirse directamente hasta la pila.

Ahora intente hacer esto en un lenguaje estáticamente con tipo.

A menos que el tipo de objeto está documentado cerca de la utilización in situ (por ejemplo a través de anotaciones de tipo, a-la biblioteca de seguridad de tipos de Python) o en algún lugar de la pila, deduciendo de donde vino puede ser prácticamente imposible. Hablo por experiencia, después de haber tratado de piezas de depuración del marco BuildBot. Se trataba de una inmensa cantidad de búsqueda de texto en bruto a través del marco, incluso utilizando entornos de desarrollo de fantasía tales como PyDev, Komodo y Wingware.

No me cabe duda de que es posible imponer algunas restricciones de tipo de lenguajes dinámicos, pero la falta de estandarización en este parece ser un impedimento para cualquiera que trate de parte de depuración de un marco grande, existe.

EDIT: desde 2014, Guido añadió PEP484, MyPy y el módulo de escribir. Esto ha hecho que mi experiencia mucho, mucho mejor en términos de mantenimiento de grandes proyectos.

En mi experiencia, capacidad de mantenimiento depende de acoplamiento bajo, una buena documentación, buen proceso de desarrollo, y una excelente prueba. tipos estáticos tiene muy poco que ver con nada de esto.

Los errores que Java se pondrá al día en tiempo de compilación son sólo un pequeño subconjunto de los errores que pueden ocurrir. También son casi siempre el más trivial de detectar por las pruebas; no hay manera de que se puede perder llamar a un método en un objeto de la clase equivocada si se está probando que su código produce la respuesta correcta! A este respecto se podría argumentar que en realidad es Python mejor para garantizar la calidad; por forzando a prueba al menos un poco para asegurarse de que su código es libre de errores tipográficos simples, se asegura que en realidad lo prueba de al menos un poco.

De hecho Java no es ni siquiera un muy buen ejemplo de un lenguaje con fuertes controles estáticos para la captura de una gran cantidad de errores. Vuelva a programar en Haskell o Mercurio para ver lo que quiero decir, o mejor aún, intente programar en Scala y la interfaz con las bibliotecas de Java; la diferencia en la cantidad de "corrección" del compilador es capaz de garantía para usted que llama la atención cuando se compara el código Scala idiomática normal usando bibliotecas Scala al código que tiene que lidiar con las bibliotecas de Java (en realidad yo he hecho esto, ya que el programa que una bit en Scala en Android).

Su capacidad de escribir buen código mantenible en grandes código bases trabajado por muchos desarrolladores durante largos períodos de tiempo, a pesar de las deficiencias de detección de error estático de Java en comparación con lenguajes como Scala, depende de exactamente las mismas técnicas los programadores de Python utilizan para hacer lo mismo en sus grandes bases de código, a pesar de las deficiencias de detección de error estático de Python en comparación con Java.

He usado Python para muchos proyectos, desde unos pocos cientos a varios miles de líneas de líneas. tipado dinámico es un gran ahorro de tiempo y hace que los conceptos orientados a objetos como polimorfismo manera más fácil de usar. El sistema de tipos no hace imposible de mantener proyectos. Si tiene problemas para imaginar que, tratar de escribir algunas cosas en Python y ver cómo se van.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top