He usado esta analogía ... muchos proyectos de software comienzan porque la persona que necesita algún software sabe el equivalente de un "personal de mantenimiento", y contrata a esta persona para construir el equivalente de software de un cobertizo de jardín. Es una pequeña aplicación pequeña y útil que hace su trabajo muy bien.
Luego, el cliente vuelve al personal de mantenimiento, satisfecho con su trabajo, y le pide que cambie el software para hacer una cosa más. Muchas veces, esta nueva característica no tiene mucho que ver con la solicitud original, por lo que es casi como si le pidieran que construya otra habitación en la parte trasera del cobertizo del jardín con una entrada separada.
Luego quieren poner una luz dentro del cobertizo, por lo que tienen de vuelta al personal de mantenimiento, y él ejecuta un solo circuito desde el panel principal de la casa, instala un interruptor de luz de cadena en el techo de cada habitación y los conecta al circuito .
Luego, el cliente decide que quiere ejecutar algunas herramientas eléctricas, pero sigue soplando el disyuntor, por lo que llama a la persona y él tiene que extraer el circuito único que ejecutó al panel principal, e instalar un conductor más grande y un subpanel en el cobertizo. Tuvo que pasar el cable dos veces y pagar dos permisos eléctricos, etc. Esto es ineficiente.
Entonces el cliente pide algo absurdo: ¿puedes convertir mi cobertizo de jardín en un garaje? No quiero que vuelvas a hacer nada que hayas hecho ... Solo quiero que lo hagas más grande para que pueda estacionar mi auto allí. Luego, en muchos casos, el personal de mantenimiento piensa que "el cliente siempre tiene la razón" y procede a construir adiciones en 3 lados del cobertizo para hacerlo más grande, derriba la pared entre las particiones, etc. Por supuesto, el techo termina caído porque no está construido correctamente, etc.
Entonces, el cliente ya no está tan impresionado, pero todavía quiere más. Le piden al personal de mantenimiento una y otra vez que solo agregue una habitación más, o cambie esta habitación existente para hacer esto, etc. Usted termina con algo que se parece a The Burrow y es casi tan arquitectónicamente sólido.
Ahora, la mayoría de las personas no son lo suficientemente tontas como para intentar esto en el mundo de la construcción, pero sucede todo el tiempo en el mundo del software, porque las personas no hacen estas conexiones:
Una persona calificada para construir un cobertizo de jardín realmente agradable no está necesariamente calificada para construir una casa.
Si supiera de antemano que iba a construir una casa por etapas, pero que solo comenzaría como un cobertizo de jardín, haría las cosas de manera diferente y el cobertizo del jardín costaría mucho más (derramaría un almohadilla realmente gruesa, asegúrese de ejecutar un conductor lo suficientemente grande como para la carga completa de una casa terminada, etc.).
En muchos casos, la actualización de una etapa a otra implica deshacer gran parte del trabajo que se realizó anteriormente, lo que lo hace más costoso de lo que parece.
En el mundo de la construcción, podemos darle al cliente una buena idea de cómo será el resultado durante la etapa de diseño, pero no tenemos esa capacidad en el mundo del software. Si llegaste a ese punto, básicamente has escrito una parte significativa del software.
El Manifiesto Ágil es el resultado de reconocer que la analogía del software / construcción está rota. Cosas como las pruebas unitarias automatizadas y los ciclos de lanzamiento iterativos no tienen paralelo en la construcción. Estas cosas aprovechan el costo casi nulo de pasar del diseño al prototipo (lo llamamos compilación o construcción).