java - importar - ¿Cómo afecta la falta de escritura estática de Python a la capacidad de mantenimiento y extensibilidad en proyectos más grandes?
como abrir un proyecto en eclipse (7)
Desde mi experiencia, los idiomas tipificados estáticamente pueden ser difíciles de mantener. Por ejemplo, digamos que tiene una función de utilidad que acepta una clase personalizada como parámetro. Si en el futuro adopta una nueva convención de nomenclatura, el nombre de esta clase tendrá que cambiar, y entonces todas las funciones de utilidad también tendrán que cambiar. En un lenguaje como python, no importa, siempre que la clase implemente los mismos métodos.
Personalmente desprecio un lenguaje que se interpone en mi camino. La velocidad de expresar sus ideas es valiosa, y esta es la ventaja que Python tiene sobre Java.
Después de leer esta pregunta muy informativa (aunque algo argumentativa) me gustaría conocer su experiencia con la programación de grandes proyectos con Python. ¿Las cosas se vuelven imposibles de manejar a medida que el proyecto se hace más grande? Esta preocupación es una cosa que me mantiene unido a Java. Por lo tanto, estaría particularmente interesado en las comparaciones informadas de mantenibilidad y extensibilidad de Java y Python para grandes proyectos.
En mi experiencia, la capacidad de mantenimiento depende de un acoplamiento bajo, buena documentación, buen proceso de desarrollo y excelentes pruebas. La escritura estática tiene muy poco que ver con esto.
Los errores que Java detectará en tiempo de compilación son solo un pequeño subconjunto de los errores que pueden ocurrir. También son casi siempre los más triviales de detectar mediante pruebas; ¡no hay manera de que no puedas dejar de llamar a un método en un objeto de la clase incorrecta si estás probando que tu código produce la respuesta correcta! En ese sentido, podría argumentar que Python es mejor para garantizar la calidad; Al forzarte a probar al menos un poco para asegurarte de que tu código esté libre de errores tipográficos simples, garantiza que realmente realices una prueba al menos un poco.
De hecho, Java ni siquiera es un buen ejemplo de un lenguaje con fuertes controles estáticos para detectar muchos errores. Intente programar en Haskell o Mercury para ver lo que quiero decir, o mejor aún, intente programar en Scala e interactuar con las bibliotecas de Java; la diferencia en la cantidad de "corrección" que el compilador puede garantizar para usted es sorprendente cuando compara el código Scala idiomático normal usando las bibliotecas Scala con el código que tiene que ver con las bibliotecas Java (realmente he hecho esto, ya que programé un poco en Scala en Android).
Su capacidad para escribir un buen código mantenible en grandes bases de código trabajadas por muchos desarrolladores durante largos períodos de tiempo, a pesar de las deficiencias de la detección de errores estáticos de Java en comparación con lenguajes como Scala, depende exactamente de las mismas técnicas que los programadores de Python utilizan para hacer lo mismo En sus grandes bases de código, a pesar de las deficiencias de la detección estática de errores de Python en comparación con Java.
He usado Python para muchos proyectos, desde unos pocos cientos de líneas hasta varios miles de líneas. La escritura dinámica es un gran ahorro de tiempo y hace que los conceptos OO como el polimorfismo sean más fáciles de usar. El sistema de tipos no hace que los proyectos no se puedan mantener. Si tiene problemas para imaginar eso, intente escribir algunas cosas en Python y vea cómo van.
Intente rastrear la fuente de un objeto aparentemente mal formado en un marco grande, de tipo dinámico con una gran cantidad de IoC u otros patrones de diseño donde el objeto no se puede rastrear directamente en la pila.
Ahora intenta hacer esto en un lenguaje estático.
A menos que el tipo de objeto esté documentado cerca del sitio de uso (por ejemplo, a través de anotaciones de tipo, la biblioteca de tipos seguros de Python) o en algún lugar de la pila, deducir de dónde proviene puede ser prácticamente imposible. Hablo por experiencia, habiendo tratado de depurar partes del framework BuildBot. Implicaba una inmensa cantidad de búsqueda de texto sin formato a través del marco, incluso utilizando IDE sofisticados como PyDev, Komodo y Wingware.
No dudo que sea posible imponer algunas restricciones de tipo en lenguajes dinámicos, pero la falta de cualquier estandarización en esto parece ser un impedimento para que cualquiera intente depurar parte de un marco grande y existente.
EDIT: desde 2014, Guido añadió PEP484, MyPy y el módulo de mecanografía. Esto ha hecho que mi experiencia sea mucho mejor, en términos de mantenimiento de grandes proyectos.
Recuerdo los días anteriores y posteriores a la innovación de IntelliJ IDEA. Hay grandes diferencias. Antes, la escritura estática era solo para compilación, el desarrollo básicamente trata el código fuente como archivos de texto. Después, el código fuente es información estructurada, muchas tareas de desarrollo deben ser más fáciles, gracias a la escritura estática.
Sin embargo, no es como si los viejos tiempos estuvieran viviendo el infierno. Lo tomamos tal como está, hacemos lo que sea necesario, usamos las herramientas disponibles hasta la fecha, construimos el sistema, la satisfacción. No había demasiados recuerdos infelices. Eso es probablemente lo que los programadores de tipificación dinámica sienten ahora. No está tan mal.
Por supuesto, nunca volveré a los viejos tiempos. Si tengo prohibido usar un IDE de este tipo, supongo que nos daremos toda la programación.
Trabajo en un producto comercial a gran escala hecho en Python. Doy una estimación muy aproximada de 5000 archivos x 500 líneas cada uno. Eso es alrededor de 2.5 millones de líneas de Python. Tenga en cuenta que la complejidad de este proyecto es probablemente equivalente a 10 mil líneas de código en otros idiomas. No he escuchado de un solo ingeniero / arquitectura / administrador que se quejara de que el código Python no se puede mantener. Por lo que he visto en nuestro rastreador de errores, no veo ningún problema sistémico que pueda evitarse mediante la comprobación de tipos estáticos. De hecho, hay muy pocos errores generados por el uso incorrecto del tipo de objeto.
Creo que esta es una muy buena materia académica para estudiar empíricamente por qué el lenguaje estático basado en clases no parece ser tan crítico como podría pensarse.
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, ambos no son SQL. No hay ningún problema relacionado con la comprobación de tipos. En primer lugar, hemos diseñado una API lo suficientemente flexible como para anticipar diferentes implementaciones subyacentes. Creo que el lenguaje dinámico es una ayuda en lugar de un obstáculo en este sentido. Cuando pasamos a las frases de prueba y corrección de errores, estábamos trabajando en el tipo de errores que las personas que trabajan en cualquier idioma tendrían que enfrentar. Por ejemplo, problemas de uso de memoria, problemas de consistencia e integridad referencial, problemas de manejo de errores. No veo que la verificación de tipos estática tenga mucha ayuda en ninguno de estos desafíos. Por otro lado, nos hemos beneficiado enormemente del lenguaje dinámico al poder inyectar el código durante el vuelo o después de un parche simple. Y somos capaces de probar nuestra hipótesis y demostrar nuestras soluciones rápidamente.
Es seguro decir que la mayoría de nuestros más de 100 ingenieros están felices y son productivos con Python. Probablemente sea impensable para nosotros construir el mismo producto usando un lenguaje de tipo estático en la misma cantidad de tiempo y con la misma calidad.
Una base de código grande en Python sin una buena cobertura de prueba podría ser un problema. Pero eso es solo una parte de la imagen. Se trata de personas y enfoques adecuados para hacer el trabajo.
Sin
- Fuente de control
- Seguimiento de errores
- Pruebas unitarias
- Equipo comprometido
Podrías fallar con cualquier tipo de lenguaje.