Creo que hay algunos conceptos diferentes que se mezclan / combinan en esta pregunta, por lo que complementaré las otras respuestas con una que creo que es importante y no se ha abordado:
¿Cuál es el equilibrio correcto entre Big Design Up Front (BDUF) y Usted no lo va a necesitar (YAGNI), o simplemente menos diseño?
La razón de la combinación: las metodologías ágiles tienden a recomendar quizás medio día de diseño al comienzo de cada Sprint, mientras que las metodologías “más pesadas” (RUP típicas) o Waterfall pueden asignar meses a la tarea. Pero realmente estamos hablando de Ingeniería aquí, por lo que, aunque la prescripción del tiempo es una cuestión de proceso, la respuesta correcta está más basada en hechos que derivada de la filosofía.
- ¿Qué tipo de empresas utilizan C como su lenguaje principal en el desarrollo de software?
- ¿Cuáles son las complicaciones que podríamos enfrentar al desarrollar una red de sensores inalámbricos a gran escala (1000 nodos)?
- ¿Por qué es popular Golang en China?
- ¿Cuál es el mejor enfoque para probar los requisitos implícitos?
- ¿Cuál es la mejor manera de tener una plataforma de automatización para una distribución de películas?
DEPENDE DEL COSTO DE EQUIVOCARLO
El avance principal en el enfoque ágil en este sentido fue darse cuenta de que el costo de un error, al menos en software, es MUCHO más pequeño de lo que se suponía anteriormente. Básicamente, desde la historia del software, las personas han estado aplicando arquitectura física y analogías de ingeniería para construir software. Para construir un puente o un rascacielos se requiere una gran cantidad de diseño inicial, por lo que, naturalmente, se convirtió en parte del proceso de creación de software para realizar un gran diseño inicial.
Pero, ¿se imaginan lo que sucedería si se construyera un puente en el lugar equivocado, o si estuviera bien para los automóviles normales, pero nadie se detuviera a pensar en la carga de peso de los camiones de entrega diaria de las 5 am?
En el software, era cierto que un mal diseño podría ser costoso. Parte de la razón podría ser que el hardware al principio podría tener que ser personalizado. Además, al principio, no había herramientas o prácticas estándar para las pruebas automatizadas, el control de versiones, etc. Resulta que otro costo importante era inherente al proceso en sí: si para cambiar un diseño, debe cambiar toda la documentación, obtener varios niveles de aprobación, obtener el presupuesto para arreglarlo, mover las fechas de lanzamiento, etc., bueno … mejor hazlo bien la primera vez.
En estos días, para una gran mayoría de proyectos de software, es incluso discutible si la documentación vale la pena. Cambiar el software es tan rápido que a menudo es mejor realizar pruebas y errores (comprobar los resultados empíricos y adaptarse) que detenerse para intentar planificar con anticipación. A medida que disminuyen los riesgos arquitectónicos (gracias a la infraestructura escalable de la nube, los servicios no operativos, etc.), hay incluso menos variables de las que preocuparse. Mientras sigas uno de los patrones comunes, puedes seguirlo.
Así que ahora casi no he abogado por ningún diseño:
¿Vale la pena hacer un diseño frontal?
¡Por supuesto! Solo depende del costo de equivocarse (versus el costo de planificar con anticipación). Estos son algunos ejemplos de dónde la prueba y error podría no ser el mejor enfoque:
- Al escribir software que va de la mano con un nuevo hardware (aunque el costo del nuevo hardware también está bajando …)
- Cuando un error puede ser irrecuperable: sistemas de guía espacial, por ejemplo. Es cierto, ahora pueden actualizar el software en vuelo (suponiendo que todavía haya contacto), pero el sistema de actualización remota también tuvo que ser diseñado …
- Cuando un error puede causar daños graves: sistemas de control nuclear, por ejemplo. O simplemente un sistema de actualización remota que, cuando está mal, bloqueará millones de teléfonos en todo el mundo.
- Cuando el costo o el esfuerzo de reemplazar la solución actual es demasiado costoso o difícil: ¿cuánto tiempo ha llevado sacar el IPv6 a la naturaleza? ¿Cuánto esfuerzo valió la pena poner en ese diseño, en lugar de “arrojémoslo y hagamos un IPv6.1 si las cosas no están bien”? En una escala más pequeña, siempre pienso más en mis API públicas, de las que otras personas tendrán que depender, que en mi propio uso interno.
Esas son algunas ideas. Sin embargo, tenga en cuenta que NINGUNO de estos impide el uso de un proceso ágil. Podría evolucionar fácilmente IPv6 en un laboratorio sprint por sprint. Pero estamos hablando de diseño inicial aquí. La pregunta es, ¿qué tan malo sería liberar una solución inmadura en la naturaleza? ¿Y cómo sabrá que es inmaduro si no pone el pensamiento inicial para saber la diferencia?