Lo primero que que me gustaría mencionar es que Bruce Eckel ha escrito un artículo muy interesante llamado Strong Typing vs Strong Testing (el enlace está inactivo en este momento, por desgracia, pero espero que sea pronto).
Su idea es que cuando se trata de lenguajes compilados, el compilador solo actúa como el primer paso automático de prueba automática. Cuando realice el cambio a un lenguaje dinámico, perderá este primer nivel de prueba automática. Pero en ambos casos, este primer nivel automático es solo una parte de las pruebas, y ni siquiera una parte muy importante.
Su punto es que si está desarrollando programas correctamente, es decir, haciendo algún tipo de pruebas y pruebas de regresión, la falta de un compilador solo lo obligará a agregar algunas pruebas más básicas, de todos modos, por lo que no es gran pérdida.
Así que supongo que la primera respuesta que le doy es, concéntrese en sus pruebas, algo que debería hacer de todos modos, y tales cambios no deberían afectarlo demasiado.
Lo segundo que me gustaría mencionar es que muchos lenguajes dinámicos que he visto (por ejemplo, Python) tienen mejores habilidades para cambiar los métodos/clases sin romper el código existente.
Por ejemplo, con Python, si su método solía aceptar dos parámetros pero ahora requiere un tercero, siempre puede agregar un parámetro predeterminado sin romper ningún código existente, pero que ahora puede utilizar. Esta es una técnica muy básica, pero en el caso de Python (y supongo que la mayoría de los otros lenguajes dinámicos también), estas técnicas pueden ser mucho más interesantes; dado que son dinámicos, puede cambiar prácticamente la implementación de funciones para módulos específicos, cambiar lo que significan las variables, etc.
Sugiero ver qué técnicas tiene Clojure que permiten cosas similares, y decidir si se aplican en tu situación
¿Cómo pueden lidiar con esto? En mi experiencia, la respuesta correcta sería "No muy bien". –