Hay muchas opiniones fuertes en torno al debate, pero obviamente esto no es realmente una cuestión de opinión, es una cuestión de hechos . Entonces deberíamos mirar la investigación empírica . Y la evidencia de eso es clara:
Sí , la escritura estática vale la pena, y no solo un poco, sino de hecho de manera sustancial . De hecho, la evidencia sólida muestra que la escritura estática puede reducir la cantidad de errores en el código en al menos un 15% (y esta es una estimación baja, el porcentaje real es casi seguro mayor). Ese es un número sorprendentemente alto : creo que incluso la mayoría de los defensores de la escritura estática no habrían pensado que marcara una diferencia tan drástica.
Considere esto: si alguien le dijo que había una manera simple de reducir los errores en su proyecto en un 15% durante la noche, sería obvio. 1 Es casi la proverbial bala de plata.
La evidencia se presenta en el documento To Type or Not to Type: Quantifying Detectable Bugs in JavaScript por Zheng Gao, Christian Bird y Earl T. Barr. Animo a todos a leerlo, es un artículo bien escrito que presenta una investigación ejemplar.
Es difícil resumir sucintamente cuán rigurosamente los autores realizaron su análisis, pero aquí hay un bosquejo (muy aproximado):
TypeScript y Flow son dos lenguajes de programación basados en JavaScript que, si bien son compatibles, agregan sugerencias de tipo y verificación de tipo estático. Esto permite aumentar el código existente por tipos y luego escribirlo.
Los investigadores recopilaron proyectos de código abierto escritos en JavaScript desde GitHub, analizaron los informes de errores resueltos e intentaron reducir cada uno de los errores informados a un código que sería atrapado por el verificador de tipo estático de TypeScript o Flow. Esto les permitió estimar que un límite inferior del porcentaje de errores podría repararse mediante el uso de la escritura estática.
Los investigadores tomaron precauciones estrictas para asegurarse de que su análisis no consideraría un error no relacionado con el tipo como relacionado con los tipos. 2
En comparación con estudios anteriores, este nuevo estudio tiene fortalezas particulares:
- Hay una comparación directa de la tipificación estática frente a la dinámica, con pocos (si los hay) factores de confusión, ya que la única diferencia entre JavaScript y TypeScript / Flow es la tipificación.
- Realizan la replicación a través de múltiples dimensiones al verificar TypeScript y Flow (es decir, diferentes sistemas de tipos), y al hacer que diferentes personas reproduzcan la anotación de tipo (manual) para corregir los errores. Y realizan esto en una gran cantidad de bases de código de diferentes proyectos.
- El documento mide el impacto directo de la escritura estática en errores reparables (en lugar de algunos de calidad más vaga).
- Los autores definen un modelo riguroso de qué medir y cómo, por adelantado. Además, su descripción es increíblemente clara y facilita el análisis de fallas (siempre es bueno cuando un trabajo de investigación se abre a los ataques: si ningún ataque logra dañar sus argumentos, se vuelve aún más fuerte). 3
- Realizan un análisis de potencia adecuado para que su tamaño de muestra sea suficiente y su posterior análisis estadístico sea hermético.
- Son demasiado conservadores para excluir explicaciones confusas, y solo miden una sola parte móvil. Además, restringen su análisis a errores que se pueden corregir de inmediato al incluir tipos y excluyen cualquier cosa que pueda requerir una refactorización más avanzada para acomodar la escritura. Entonces, en realidad, el efecto es mucho más grande, pero ciertamente no más pequeño de lo que informaron.
- Y finalmente, no encuentran un ligero efecto, sino una asombrosa diferencia. A pesar de su procedimiento demasiado conservador, incluso en el extremo inferior del intervalo de confianza del 95% descubren que hay al menos el 10% de los errores que simplemente desaparecerían con un mínimo de controles de tipo agregado.
A menos que haya una falla fundamental en el documento que nadie haya descubierto aún, el documento muestra de manera concluyente un gran beneficio del tipeo estático, casi sin costo. 4 4
En una nota histórica, la investigación sobre las disciplinas de mecanografía en la programación ha tenido un comienzo difícil porque, durante mucho tiempo, la evidencia no estaba clara en absoluto. La razón de esto es que hacer experimentos sistemáticos para examinar el efecto del tipeo estático vs dinámico no es fácil: un experimento sistemático debe aislar el efecto que estamos investigando. Y desafortunadamente no podemos aislar el efecto de la disciplina de escritura, ya que está vinculada a los lenguajes de programación.
En realidad, había lenguajes de programación que permitían la escritura tanto estática como dinámica en diferentes dialectos (por ejemplo, VB con Option Strict
On
o Off
, o Lisp con escritura estática). Sin embargo, estos no eran adecuados para una comparación directa, lo más importante porque no existían bases de código suficientemente grandes que permitieran la comparación directa. En el mejor de los casos, podríamos compararlos en "entornos de laboratorio", donde los sujetos de prueba resuelven aleatoriamente una tarea en la variante del lenguaje escrita de forma estática o dinámica.
Desafortunadamente, estas tareas de programación artificial no modelan bien el uso en el mundo real. En particular, muchos de ellos tienen un alcance pequeño y resuelven un problema bien definido que puede resumirse en media página de texto.
Afortunadamente, eso está en el pasado, porque TypeScript, Flow y JavaScript son, de hecho, los mismos lenguajes, excepto por la escritura estática, y porque hay un extenso conjunto de datos del mundo real de código y errores de los que se puede probar.
1 Inspirado en una cita del artículo original.
2 No estoy del todo contento con esto: una de las principales fortalezas de los lenguajes estáticamente tipados es que los problemas aparentemente no relacionados con el tipo de texto pueden expresarse de manera que se puedan verificar de forma estática. Esto transforma muchos errores lógicos en errores de tipo, lo que aumenta drásticamente la tasa de errores que pueden ser detectados por la escritura estática. De hecho, el documento clasifica aproximadamente los errores no relacionados con el tipo y afirmo que un gran porcentaje de ellos podría ser atrapado por la escritura estática.
3 Invito a cualquiera, especialmente a los defensores de la tipificación dinámica, a tratar de encontrar fallas no abordadas en el análisis. No creo que haya muchos (si los hay), y estoy seguro de que ningún defecto potencial alteraría materialmente el resultado.
4 Sospecho que el costo real de la escritura estática en proyectos reales a gran escala es inexistente, ya que luego se convierte en una parte natural de la arquitectura e incluso podría simplificar la planificación. La reparación de errores de tipo estático lleva tiempo, pero mucho menos que los errores descubiertos más tarde. Esto ha sido ampliamente estudiado empíricamente y se conoce desde hace décadas (véase, por ejemplo, Código completo ).