Voy a hacer un intento aportando mi punto de vista:
¿Qué problema intenta resolver DDD?
Algo tan "sencillo" como poder desarrollar software que perdure y evolucione en el tiempo, entregando valor a los usuarios sin que sea necesario plantearse cada X meses/años una historia habitual: "esto es insostenible, tenemos que rehacerlo todo"
¿Cómo intenta resolverlo?
Proporcionando una serie de recetas tanto en el ámbito técnico (patrones tácticos) como en el del negocio (patrones estratégicos). Estos patrones nos ayudan a trabajar con los expertos del dominio modelando el problema (definición de los dominios, subdominios, bounded contexts, agregados, lenguaje ubícuo, etc) y modelando la solución (arquitectura hexagonal, CQRS, Event Sourcing, etc. ojo! son sólo ejemplos!)
Para mi la parte más importante está en que nos guía para centrarnos en lo que realmente importa, el negocio. Intentando que nuestro foco esté en prestar atención a la complejidad del problema (negocio, dominio) y no de la solución (implementación tecnológica)
¿Qué conceptos clave maneja?
Desde el punto de vista del dominio, para mi los fundamentales son: lenguaje ubicuo y bounded context. Maneja más, pero sólo con esos ya tenemos para rato
Desde el punto de vista técnico, para mi lo más importante es que se centra en que separemos el dominio de todo lo demás. De ahí que se recomiende la arquitectura hexagonal.
¿Qué características debe tener un proyecto para que sea interesante aplicar DDD?
Algunos indicadores para mi son:
* Si tenemos un dominio complejo
* Si no tenemos ni idea del dominio que tenemos pero sabemos que vamos a tener muchos procesos, historias de usuario, etc.
* Si se trata de un proyecto con proyección a varios años vista (con dominio, claro).
He escuchado alguna vez asociarlo al tamaño del equipo de desarrollo, personalmente no empatizo con esa idea.
¿Cuando NO se nos debe ni pasar por la cabeza aplicar DDD?
No me gusta responder forma absoluta a estos temas, pero diría que cuando no tenemos dominio. Por ejemplo, si estamos haciendo un cliente de Twitter o de Git, un Paint o algo así, creo que no tendría mucho sentido. Podría decir que cuando toda nuestra aplicación en mecanismo de entrega en si misma.
Tampoco tiene mucho sentido para aplicaciones data-centric. Aunque claro, creo que muchas veces convertimos problemas de dominio complejo en aplicaciones data-centric simplemente porque tendemos a desarrollar cruds.
Eso no impide que busquemos algo tan útil como tener un lenguaje ubicuo en nuestra aplicación Pero entiendo que es más un tema de coherencia que de decir "estoy usando una parte de DDD"
Creo que en su momento hubo algunos sectores en los que se generó hype con DDD (para variar) pero nada que no suela ocurrir, pq parece que no aprendemos
Lo que no me atrevería a decir es si DDD ha cruzado el abismo6 o no, creo que no es adecuado medirlo en esos términos.