¿Los lenguajes dinámicos están en desventaja para el desarrollo ágil?

12

Por lo que he leído, el desarrollo ágil a menudo implica la refactorización o el código de ingeniería inversa en diagramas. Por supuesto, hay mucho más que eso, pero si consideramos las prácticas que se basan en estos dos métodos, ¿los lenguajes de tipo dinámico están en desventaja?

Parece que los lenguajes de tipo estático facilitarían mucho la refactorización y la ingeniería inversa.

¿La refactorización o la ingeniería inversa (automatizada) son difíciles, si no imposibles, en lenguajes de tipo dinámico? ¿Qué dicen los proyectos del mundo real sobre el uso de lenguajes de tipo dinámico para una metodología ágil?

Gerenuk
fuente
55
¿Código de ingeniería inversa en diagramas? ¿Por qué harías eso en Agile?
CaffGeek
77
Ágil no significa "codificar primero, documentar después".
Gort the Robot
@CaffGeek: Algunos libros recomendados a menudo sugieren dibujar diagramas en una pizarra, luego codificar y finalmente invertir el código de ingeniería en diagramas para la próxima reunión.
Gerenuk
1
Creo que se debe eliminar con letra muy fuerte de las etiquetas y el texto de esta pregunta. La pregunta parece ser sobre estática vs dinámica no fuerte vs débil.
Winston Ewert
@ WinstonEwert - Buena llamada, he cambiado las etiquetas a dynamic-typingystatic-typing
Carson63000

Respuestas:

11

Los lenguajes dinámicos están teóricamente en desventaja, todo lo demás es igual, porque especifican menos sobre cómo funciona el código (cuáles son las restricciones) y, por lo tanto, menos de la refactorización se puede hacer automáticamente, y los problemas que surgen no se pueden detectar automáticamente también. .

Pero todo lo demás no es igual. Los lenguajes dinámicos más populares permiten un código altamente compacto pero comprensible, que generalmente hace que el desarrollo en ellos sea más rápido y hace que la lógica (que puede cambiar en la refactorización) sea más fácil de detectar visualmente. Entonces, aunque podría perder parte de la ventaja relativa de trabajar en un lenguaje dinámico, aún podría salir adelante, especialmente si de todos modos planeaba hacer su refactorización a mano.

Por otro lado, existen lenguajes estáticamente tipados con esencialmente las mismas ventajas que los lenguajes dinámicos (es decir, compactos y comprensibles, con tipos en su mayoría inferidos, pero mucho allí): Haskell es quizás el ejemplo principal, pero OCaML / F #, Scala, y otros también están en esta categoría. Desafortunadamente, dado que son menos utilizados que los lenguajes tipados estáticamente más populares, no tienen un conjunto de herramientas tan extenso para ellos (por ejemplo, para refactorizar).

Entonces, como conclusión, creo que lo hará adecuadamente con metodologías ágiles en la mayoría de los idiomas; No diría que hay un claro ganador en este momento, ya que la práctica aún no ha alcanzado la teoría.

Rex Kerr
fuente
Creo que esta respuesta aborda los puntos clave de la pregunta mejor :) ¿Podría explicar también la importancia de la refactorización segura y la ingeniería inversa para un desarrollo ágil? ¿Asumí que jugó un papel muy importante? Tal vez sea menos de lo que pensaba y las herramientas para el lenguaje dinámico son lo suficientemente buenas.
Gerenuk
1
@Gerenuk: no tengo suficiente experiencia con el desarrollo ágil (especialmente en lenguajes dinámicos) para dar una respuesta autorizada: ¿se desestima el aspecto de refactorización, se deja igual, etc.? Tenga en cuenta que otros aspectos comunes del proceso, por ejemplo, el desarrollo basado en pruebas, pueden ayudar a determinar dónde salió mal su refactorización, y si pone un poco más de esfuerzo, por ejemplo, en la fase de diseño, es posible que no necesite refactorizar tanto. No creo que una técnica en particular sea ​​la clave: mantener un conjunto completo de herramientas a mano, implementadas con frecuencia y en colaboración.
Rex Kerr
14

La refactorización automática se inventó en Smalltalk, un lenguaje de tipo dinámico. Entonces, no, no es imposible tener una refactorización automática en un lenguaje de tipo dinámico. Lo difícil que sea depende mucho más de otros factores además de la disciplina de escritura. C ++ y Java son de tipo estático, pero las herramientas de refactorización solo existen realmente para Java. Smalltalk con su introspección y sintaxis simple fue un muy buen candidato para las herramientas de refactorización.

De alguna manera, la escritura dinámica en realidad facilita la refactorización. Si tiene un buen conjunto de pruebas, puede estar seguro de que sus refactorizaciones no han roto nada. Una base de código de tipo dinámico suele ser más pequeña. Además, las refactorizaciones tienden a afectar menos código. En conjunto, el esfuerzo involucrado en la refactorización manual de una base de código dinámico es menor que el de una base de código estático.

Winston Ewert
fuente
1
¿Qué pasa con la ingeniería inversa entonces? ¿Smalltalk es diferente de Python con respecto a la escritura? Parece un problema difícil deducir todos los tipos en Python y así determinar qué métodos son realmente idénticos y no solo el mismo nombre.
Gerenuk
2
Smalltalk no es que mucho diferente de Python con respecto a la tipificación. Que es , sin embargo, significativamente diferente con respecto a los útiles . Las herramientas y los IDE que están disponibles para Smalltalk son mucho mejores que los disponibles para Python o incluso C #, C ++ y Java. La razón por la cual los IDE para Python son malos no es porque Python se tipee dinámicamente, es porque, bueno, los IDEs para Python son malos. No olvidemos que el IDE que ahora conocemos como Eclipse solía llamarse VisualAge para Smalltalk una vez. La comunidad Smalltalk tiene 40 años de experiencia en la construcción de IDEs, y lo aplican a Java.
Jörg W Mittag
@Gerenuk, la escritura de Smalltalk no es diferente a la de Python. En otras formas, como la introspección, Smalltalk proporciona un conjunto de características más amigable para la refactorización. La inferencia de tipos en python requeriría trabajo, pero ya se ha hecho, vea el proyecto PyPy.
Winston Ewert
1
@WinstonEwert "pero puede refactorizar manualmente, y los lenguajes dinámicos en realidad lo hacen bastante fácil" - No, la refactorización manual no escala. El soporte de herramientas para la refactorización cambia todo incluso cuando la refactorización no es 100% automática (vea los fragmentos de estudio de caso a continuación - programmers.stackexchange.com/a/166594/4334 )
igouy
1
Casi todos los puntos de su "programación dinámica realmente facilita la refactorización" son dudosos o no sequitur. La programación dinámica no significa que tenga un conjunto de pruebas más completo, solo uno más grande (porque algunas cosas necesitan pruebas que de otro modo estarían atrapadas estáticamente). No ofrece ningún soporte para "las refactorizaciones tienden a afectar menos código" (como una adición a "el proyecto es más pequeño de todos modos", lo que probablemente sea cierto dada la actual cosecha de lenguajes dinámicos). ¡Y el "esfuerzo involucrado en la refactorización manual" parece incorrecto a menos que quiera decir que ni siquiera dejará que su compilador lo ayude!
Rex Kerr
8

La refactorización se inventó en lenguajes dinámicos. Las herramientas de refactorización automatizadas se inventaron en lenguajes dinámicos. Los IDE se inventaron en lenguajes dinámicos. Se inventaron varias metodologías ágiles en lenguajes dinámicos.

Realmente no veo ningún problema.

Jörg W Mittag
fuente
"Smalltalk no es muy diferente de Python con respecto a la escritura. Sin embargo, es significativamente diferente con respecto a las herramientas". - Tal vez eso está empezando a cambiar, vea jetbrains.com/pycharm/features/index.html
igouy
3

Para que no olvidemos, la forma de trabajo "ágil" que se conoció como Extreme Programming (XP) se creó en un proyecto Smalltalk (y Smalltalk ciertamente cuenta como un lenguaje "dinámico").

Aquí hay un caso práctico de uso industrial de una herramienta de refactorización provista con un lenguaje de tipo dinámico:

Se desarrolló una aplicación Smalltalk muy grande en Cargill para apoyar la operación de los elevadores de granos y las actividades de comercio de productos básicos asociadas. La aplicación cliente Smalltalk tiene 385 ventanas y más de 5,000 clases. Alrededor de 2.000 clases en esta aplicación interactuaron con un marco de acceso a datos temprano (circa 1993). El marco realizó dinámicamente una asignación de atributos de objeto a columnas de la tabla de datos.

El análisis mostró que aunque la búsqueda dinámica consumía el 40% del tiempo de ejecución del cliente, era innecesario.

Se desarrolló una nueva interfaz de capa de datos que requería que la clase de negocios proporcionara el atributo del objeto a la asignación de columnas en un método codificado explícitamente. Las pruebas mostraron que esta interfaz era mucho más rápida. El problema era cómo cambiar los 2,100 usuarios de clase empresarial de la capa de datos.

Una aplicación grande en desarrollo no puede congelar el código mientras se construye y prueba una transformación de una interfaz. Tuvimos que construir y probar las transformaciones en una rama paralela del repositorio de código desde la secuencia de desarrollo principal. Cuando la transformación se probó por completo, se aplicó a la secuencia de código principal en una sola operación.

Se encontraron menos de 35 errores en los 17.100 cambios. Todos los errores se resolvieron rápidamente en un período de tres semanas.

Si los cambios se hicieran manualmente, estimamos que habría llevado 8.500 horas, en comparación con las 235 horas, para desarrollar las reglas de transformación.

La tarea se completó en el 3% del tiempo esperado mediante el uso de Reglas de reescritura. Esta es una mejora por un factor de 36.

de "Transformación de una capa de datos de la aplicación" Will Loew-Blosser OOPSLA 2002

Además, "Herramientas para realizar cambios imposibles: experiencias con una herramienta para transformar grandes programas Smalltalk"

igouy
fuente
1

Sus principios pensados ​​me parecen correctos .

Los lenguajes fuertemente tipados como C # son buenos candidatos para una base de código que necesita constantemente re-factorización. Básicamente, la mayoría de las herramientas de refactorización (como Resharper, JustCode, etc.) en el mercado son muy efectivas en lenguajes de programación de tipo estático.

¿Qué dicen los proyectos del mundo real sobre el uso de lenguajes de tipo dinámico para una metodología ágil?

Para el equipo de desarrollo que practica la metodología Agile / Scrum, es muy útil (incluso crítico) tener un buen conjunto de herramientas de refactorización bajo armadura. De lo contrario, todos los cambios repentinos en el próximo sprint pueden ser una pesadilla para modificar o rediseñar.

Por lo tanto, la metodología ágil no proporciona ventajas a los lenguajes tipados estáticamente o dinámicos una vez. Lo que proporciona es un enfoque iterativo para construir una aplicación sólida.

Yusubov
fuente
44
Los lenguajes dinámicos tenían herramientas de refactorización automatizadas mucho antes de que C # existiera y cuando Notepad seguía siendo el IDE de Java más poderoso.
Jörg W Mittag
44
Esta respuesta no es completamente compatible con mi experiencia. Los lenguajes dinámicos suelen ser más rápidos para hacer cosas que los más convencionales tipados estáticamente ( tengo que aprender Haskell o ML o algo así en algún momento). También son mucho más rápidos de modificar si de repente se necesitan, lo que llevó a mi conclusión de que Common Lisp era el mejor lenguaje cuando realmente no sabías lo que estabas haciendo. Además, ¿dónde crees que comenzó la refactorización?
David Thornley
1
¿por qué piensas eso? por ejemplo, javascript es un lenguaje dinámico, pero Re-sharper no hace el mismo trabajo hábil que hace con C #. En segundo lugar, NO dije que "los lenguajes dinámicos son más lentos para hacer las cosas".
Yusubov
De las personas que le trajeron IntelliJ IDEA - PyCharm - "Cambiar el nombre de la refactorización permite realizar cambios de código global de forma segura e instantánea. Los cambios locales dentro de un archivo se realizan en el lugar. Las refactorizaciones funcionan en proyectos simples de Python y Django. Utilice Introducir Variable / "Campo / Constante e Inline Local para mejorar la estructura del código dentro de un método, Extraer método para dividir métodos más largos, Extraer superclase, Empujar hacia arriba, Bajar y Mover para mover los métodos y clases". jetbrains.com/pycharm/features/index.html
igouy
@igouy, me refiero a Resharper y JustCode en mi respuesta. Por lo tanto, es cierto para el contexto al que se refiere.
Yusubov