¿Existen ventajas para las prácticas ágiles además de tener una construcción funcional entre sprints?

9

Recientemente me interesé por las prácticas ágiles en el desarrollo de software y desde entonces he visto muchos artículos que señalan que estas prácticas permiten reducir los costos generales.

La lógica detrás de esto generalmente es la siguiente: si sus requisitos cambian, puede reflejar este cambio en el próximo retraso del sprint y esto conducirá a un costo reducido, porque el diseño de la nueva característica y su implementación está muy cerca en términos de tiempo, por lo que el el costo disminuye, de acuerdo con la famosa regla de que cuanto más tarde necesite realizar un cambio en sus requisitos, más costoso será satisfacer ese requisito.

Pero los proyectos de software medianos a grandes son complejos. Un cambio repentino en los requisitos no significa que no tendrá que tocar otras partes de su sistema para cumplir con ese requisito. En muchos casos, la arquitectura deberá modificarse de manera muy significativa, lo que también significa que deberá volver a implementar todas las características que se basaban en la arquitectura anterior. Entonces, todo el punto de los costos reducidos desaparece aquí. Por supuesto, si un nuevo requisito requiere una nueva parte independiente del sistema, eso no es un problema, la arquitectura antigua simplemente crece, no es necesario repensarla y volver a implementarla.

Y lo contrario. Si está utilizando una cascada y de repente se da cuenta de que debe introducirse un nuevo requisito, puede ir y cambiar su diseño. Si requiere que se modifique la arquitectura existente, debe rediseñarla. Si realmente no se mete con él pero solo introduce una nueva parte del sistema, entonces vas y haces todo el trabajo, no hay problema aquí.

Dicho esto, me parece que la única ventaja que tiene el desarrollo ágil es la creación de funciones completas entre sprints, y para muchas personas y proyectos esto no es crítico. Además, parece que ágil da como resultado una mala arquitectura de software en general, porque las características se unen entre sí, a los equipos ágiles solo les importa que una característica funcione, no cómo funciona. Esto parece ser así cuando los sistemas crecen en complejidad con el tiempo, las prácticas de desarrollo ágiles en realidad aumentan el caos en la arquitectura general del producto, lo que eventualmente resulta en costos más altos, ya que será cada vez más difícil introducir cambios, mientras que cascada le permite perfeccionar su arquitectura antes de liberar nada.

¿Alguien puede indicarme dónde me estoy equivocando aquí, porque obviamente mucha gente usa ágil en entornos de producción, por lo que debo estar equivocado en alguna parte.

tux91
fuente
Tiene un punto. Me gustaría señalar que el término 'cascada' no tiene una definición universal (como muchos otros términos en TI). La mayoría de la gente piensa que no está permitido codificar a menos que las 2000 páginas completas de requisitos estén escritas y firmadas. Este no tiene que ser el caso en absoluto.
NoChance
Sí, por "cascada" me refiero a un proceso lineal de (más básicamente) especificaciones funcionales -> diseño -> código entre hitos, no sprints. Y, claro, los requisitos de página de 2000 y las especificaciones técnicas no son imprescindibles, las responsabilidades básicas de las clases y sus relaciones entre sí a menudo son suficientes como un diseño de nivel superior.
tux91
3
@EmmadKareem: En realidad, en Waterfall, este es exactamente el caso. No comienza a codificar hasta que cada detalle del diseño sea final. Afortunadamente, Waterfall real rara vez se aplica en el desarrollo de software, principalmente porque realmente no funciona.
tdammers
1
@tdammers, gracias por tu comentario. Sin embargo, esto sucedió pocas veces. El método de cascada no tiene propietario y se puede aplicar e interpretar de manera diferente. No hay una regla que diga que no codifique hasta ... o si no ... esto se debe a que no es una metodología. Cuando se incluye una buena metodología, creo que tiene mucho sentido, especialmente en proyectos donde los usuarios conocen el núcleo de lo que necesitan de un sistema.
No,
@Emmad Kareem: Estoy de acuerdo contigo. Creo que los métodos ágiles son más adecuados para proyectos en los que los requisitos no son claros y se necesitan muchos prototipos y comentarios de los usuarios para obtener los requisitos finales. Por otro lado, hay casos en los que los requisitos básicos son claros desde el principio. En estos casos, adoptaría un método de desarrollo que sea más similar a la cascada (con cierto margen de corrección en el camino) que a un método ágil. Creo que realmente depende del tipo de proyecto en el que estés trabajando.
Giorgio

Respuestas:

7

En primer lugar, el modelo de "cascada" siempre fue un hombre de paja que describía cómo NO ejecutar un proyecto de desarrollo de software. Búscalo.

De todos modos, la mayoría de los proyectos SDLC "en cascada" implican un proceso de "Gestión del cambio", porque cuando las personas descubren que los supuestos que se escribieron en las especificaciones ya no son válidos (y esto siempre sucede en grandes proyectos complejos). Desafortunadamente, el proceso de gestión de cambios se construye como una medida de manejo de excepciones y es estúpidamente costoso, lo que significa que el proyecto terminará tarde o de mala calidad.

La idea detrás de las metodologías ágiles es que el cambio es un hecho, sucederá. Por lo tanto, debe realizar la operación estándar de "gestión de cambios" en lugar del manejo de excepciones. Esto no es fácil, pero la gente ha descubierto que si usa muchas buenas prácticas de diseño, puede hacerlo.

Otro problema importante con el diseño de carga frontal es que (la mayoría de las veces) se dedica mucho tiempo a la recopilación de requisitos y al diseño, al desarrollo y al tiempo de prueba. Además, si la prueba es la última fase y se descubre un problema grave, es muy poco probable que se solucione dentro de su marco de tiempo.

Quizás una de las mejores características de un enfoque ágil es que exige una interacción continua (es decir, comunicación real) entre el equipo que desarrolla la solución y el cliente que la necesita. Se hacen las prioridades, de modo que los elementos de mayor prioridad se hagan primero (y si se agota el tiempo, se cortan los elementos de baja prioridad). La retroalimentación llega rápidamente.

Volviendo a la cuestión de los cambios dramáticos, realmente necesita usar métodos que mitiguen los cambios. Los buenos principios de SOLID OO pueden desempeñar una buena parte de esto, al igual que la construcción de conjuntos de pruebas automatizadas sólidas para que pueda probar su software de regresión. Debes hacer estas cosas independientemente de tu metodología, pero se vuelven realmente esenciales si estás tratando de ser ágil.

Matthew Flynn
fuente
Muchas gracias. Para todos los que quieran leer sobre el tema de cómo funciona el diseño en ágil y por qué no es tan malo: http://jamesshore.com/Agile-Book/incremental_design.html
tux91
8

Bueno, hay algunas ventajas. La primera es que los clientes no leen documentos de especificaciones. Siempre. Waterfall supone que todo el mundo estará de acuerdo con una especificación desde el principio y luego, cuando el software se entregue al cliente un año después de la especificación correspondiente, estarán contentos. En la práctica, los clientes solo descubren todas las cosas que realmente necesitan, realmente no necesitan y realmente necesitan ser algo diferente cuando juegan activamente con el software en sí. Agile obtiene un prototipo funcional en manos de los clientes, por lo que estas desconexiones se detectan de inmediato. Agile no se trata solo de reaccionar a los requisitos cambiantes. También se trata de que esos requisitos cambiantes ocurran temprano, cuando el costo del cambio es bajo, no al final, cuando el costo del cambio es alto.

Una segunda ventaja es que, debido a que Agile tiene entregas altamente visibles a menudo, es menos probable que los proyectos se descarrilen. Con un gran proyecto de Cascada, es muy fácil retrasarse sin siquiera darse cuenta. Waterfall produce marchas de la muerte de varios meses al final del proyecto. Con Agile, debido a que está entregando a los clientes cada dos semanas, todos saben exactamente dónde está el proyecto y los resbalones son atrapados (y ajustados) rápidamente. En mi experiencia, Waterfall produce semanas o meses de 100 horas semanales al final. Ágil significa que es posible que tengas que dedicar un par de días de 12 horas al final del sprint.

Una tercera ventaja es que los proyectos ágiles tienden a ser más motivadores. Es muy difícil para las personas tener algún tipo de sentido de conducción en un proyecto de un año. La fecha límite parece muy lejana y esa falta de inmediatez significa que las personas tienden a postergar, pulir demasiado los diseños y, de lo contrario, simplemente no funcionan de manera muy productiva. Esto es especialmente cierto porque los primeros meses se gastan en cosas que a la gente no le gusta hacer, como documentos de especificaciones. Debido a que Agile siempre tiene plazos muy inmediatos y concretos en un futuro muy cercano, las personas tienden a estar más motivadas. Es mucho más difícil postergar con una fecha límite concreta para un conjunto fijo de tareas que vencen la próxima semana.

Gort the Robot
fuente
Primer argumento, eso es exactamente para lo que estoy bajo impresión ágil. Lidiando con los requisitos en constante cambio. Además, sobre el cambio temprano de los requisitos, esto todavía tiene una gran posibilidad de meterse con la arquitectura en la mano, lo que lleva a volver a implementar una gran cantidad de código existente. Segundo argumento, ¿podría explicar por qué los proyectos en cascada causan marchas de la muerte? Parece que una pequeña disciplina junto con especificaciones técnicas concisas puede hacer maravillas aquí. Tercer argumento, ¿cuál es el problema con la construcción de un proyecto en cascada de abajo hacia arriba y poder construirlo de vez en cuando?
tux91
2
Mi experiencia con los proyectos de Waterfall es que siempre están a tiempo durante el primer 90% del tiempo planificado, momento en el cual están repentinamente atrasados ​​meses. El modelo de Agile de insistir en demos cada sprint lo hace mucho menos probable. Cuando las personas saben que serán responsables en una semana y media, generalmente están mejor motivadas que cuando serán responsables en nueve meses. Es solo psicología humana.
Gort the Robot
1
Bueno, supongo que no puedo discutir con la experiencia, aunque mi experiencia ha sido un poco diferente, con un buen diseño en la codificación manual no tiene muchos problemas en el camino y las estimaciones también parecen ser bastante buenas. Todavía creo que la arquitectura resultante será más sólida si se usa cascada.
tux91
2
Hay algunas áreas - en su mayoría las críticas para la seguridad, por ejemplo, la señalización ferroviaria, aviónica - donde los clientes hacen leer las especificaciones muy cuidadosamente. Son bastante raros y tienden a conducir a metodologías de desarrollo muy diferentes de todos modos.
Donal Fellows
4

En respuesta a la cita de la pregunta, que es un malentendido fundamental de los oponentes anti-ágiles

"... mientras que la cascada te permite perfeccionar tu arquitectura antes de lanzar algo". es una falacia, déjame arreglarlo por ti; "... mientras que la cascada te permite perfeccionar tu arquitectura para que nunca liberes nada " .

La implicación de que Waterfall de alguna manera proporciona una arquitectura de mayor calidad es fundamentalmente falsa y completamente refutada por evidencia histórica empírica.

Si Facebook se diseñó en forma de cascada con 500 millones de usuarios como un requisito difícil y rápido y no se lanzó hasta que se perfeccionó una arquitectura de soporte que nadie hubiera oído hablar de ella hoy.

Lo mismo con YouTube, Twitter y muchas otras compañías.

Obtuvieron algo que el cliente podía tocar y responder al trabajo y lo lanzaron lo más rápido posible. Recibieron comentarios, lo refinaron y lo lanzaron nuevamente; iterar. Así es como en estos tres ejemplos, responden con solo características que los clientes aceptan y desean y pierden el menor tiempo posible en cosas que los clientes encuentran de poco o ningún valor.

Cualquier persona con años significativos de experiencia en desarrollo de software estará de acuerdo en que no existe una arquitectura perfecta . Solo uno que comienza más lejos de la entropía y la gran bola de barro que otras alternativas. Agile lo reconoce y lo tiene en cuenta. Incorporando al proceso, esto como deuda técnica, rápida re-priorización y refactorización.


fuente
3
Al usar la palabra "nunca", ¿estás diciendo que no hay productos de software que se hayan hecho usando cascada? Además, ¿por qué "nunca" lanzar nada si tiene un conjunto de requisitos para un hito en particular que termina implementando con éxito?
tux91
1
@ tux91 haces mi punto por mí; nada será perfecto dado que las necesidades deben cambiarse inmediatamente después de que los diseños se pongan en papel y queden obsoletos antes de que se escriba una sola línea de código. Por lo tanto, la afirmación que cité es una falacia, nunca perfeccionará una arquitectura y, por lo tanto, nunca publicará nada.
1
@ tux91 todavía se lee para comprender, dije, que no existe una arquitectura perfecta y si no se libera hasta que exista la cita, entonces nunca se publicará nada. No dije lo que estás reclamando, punto, esto está en tu cabeza y en tu interpretación. Lo que dije es que el argumento de que la cascada de alguna manera proporciona una arquitectura de mejor calidad es una falacia y fundamentalmente defectuosa. Y estos argumentos sobre la NASA y la cascada y qué no; Además de no estar relacionado con los programadores , mató a 3 astronautas, en el terreno para el caso, no es una brillante historia de éxito.
1
@ tux91 wrt uso de "nunca", estoy con Jarrod aquí: la pregunta dice "la cascada te permite perfeccionar ..." , que contrarresta con una palabra totalmente apropiada (en este irreal contexto "perfecto") "nunca". La única razón por la que no voté es porque trato de evitar votar en las respuestas a preguntas no constructivas
mosquito
1
@gnat sí, supongo que no pensé cuando usé la palabra perfecto , eso no es lo que realmente quería decir
tux91
3

Scrum por sí mismo no prescribe ninguna práctica técnica porque es un marco general.

El desarrollo ágil de software requiere excelencia técnica del equipo. Esto viene de seguir las prácticas técnicas de XP (programación extrema). Por ejemplo, debe aprender sobre refactorización, tdd, todo el equipo, programación de pares, diseño incremental, ci, colaboración, etc.

Hacerlo así hace posible manejar los cambios de forma rápida y segura, lo que también es la razón principal para utilizar el desarrollo ágil en primer lugar.

La única medida de agile que importa es si regularmente (semanalmente, quincenalmente) logra liberar software valioso y funcional para su cliente. ¿Puedes hacer eso? Entonces eres ágil en mi libro.

Martin Wickman
fuente
Lo que no entiendo es "posible manejar el cambio de forma rápida y segura", ya que implica que un proyecto basado en cascada es más difícil de cambiar. ¿Porqué es eso? Es solo una base de código. Especifique lo que necesita cambiar, diseñe eso y cómo se adapta a la arquitectura, el código, la prueba y la versión existentes. Simplemente no lo llames sprint, llámalo hito en su lugar. No parece que tome más tiempo o presente más dificultad que ágil. La diferencia es que hace una planificación más cuidadosa pero no necesita hacer cosas XP tan rigurosamente.
tux91
@ tux91 Actualicé mi respuesta. En cuanto a la arquitectura, recomiendo leer esto o ver esto a las 26:20 sobre lo que llamamos "diseño incremental".
Martin Wickman
2

Para mí, el principal beneficio de Agile es reducir el riesgo en el proyecto.

Al entregar de forma iterativa y obtener muchos comentarios de su base de usuarios, aumenta la posibilidad de que entregue algo que realmente quiere, y lo hará entregando pragmáticamente las características más importantes para ellos lo antes posible. En teoría, esto se hará con mejores estimaciones y planificación. Obviamente, esto es muy atractivo desde la perspectiva del negocio, mucho más que solo la construcción liberable.

Se podría argumentar que este cambio constante compromete su sistema y reduce la calidad, pero yo diría dos cosas. 1) Este cambio ocurre de todos modos en proyectos de entrega de software más tradicionales: simplemente no se tiene en cuenta y ocurre más adelante en el proyecto, que es cuando, como usted señaló, las cosas son más difíciles y más caras de cambiar. 2) Agile tiene mucho que decir sobre cómo lidiar con este cambio en términos del uso de personas motivadas con experiencia y prácticas como TDD, emparejamiento y revisiones de código. Sin ese cambio de mentalidad hacia la calidad y la mejora continua, acepto que el cambio frecuente que implica ágil podría comenzar a causar problemas.

Benjamin Wootton
fuente
Sí, eso es exactamente lo que pienso de la única ventaja de la cascada. Sin embargo, hay momentos en que no desea mostrar su producto a nadie mientras está en etapas de desarrollo, porque simplemente no está listo, todavía no tiene los puntos de venta. O si tienes una idea bastante firme de lo que quieres construir al final. Sin embargo, las pruebas, la programación de pares y las revisiones de código no garantizan que terminará con una buena arquitectura general del producto, solo se realizan para garantizar que las nuevas funciones funcionen correctamente.
tux91
1

En muchos casos, la arquitectura deberá modificarse de manera muy significativa, lo que también significa que deberá volver a implementar todas las características que se basaban en la arquitectura anterior.

Si su arquitectura necesita ser modificada significativamente como resultado de un cambio en los requisitos, tiene una mala arquitectura o unos malos requisitos. Una buena arquitectura le permite diferir tantas decisiones como sea posible y desacoplar componentes de su sistema. Los buenos requisitos (del usuario) no son cosas como "usar una base de datos diferente".

Entonces, operemos bajo el supuesto de que tenemos una buena arquitectura de trabajo. Si ese es el caso, las metodologías de desarrollo ágil pierden este "lavado" con metodologías de diseño de gran tamaño. Después de todo, una característica central de las metodologías de desarrollo ágil son las prácticas como TDD que promueven el acoplamiento suelto en el código, lo que permite que el proyecto continúe a alta velocidad, ya sea cerca del comienzo o muy maduro.

Erik Dietrich
fuente
0

En muchos casos, la arquitectura deberá modificarse de manera muy significativa, lo que también significa que deberá volver a implementar todas las características que se basaban en la arquitectura anterior. Entonces, todo el punto de los costos reducidos desaparece aquí.

Después de un proceso ágil, hay una mejor oportunidad de atrapar este requisito antes de que se haya desarrollado demasiado software (y necesita ser cambiado). Cuando pasas varios meses sin trabajar con el cliente y darles algo para mirar, te das cuenta de estos grandes problemas arquitectónicos solo después de "pensar" que estás listo para entregar.

Prefiero tratar de implementar estos cambios en una aplicación que funcione que tenga cobertura de prueba que un montón masivo de código que ni siquiera se compila. Mientras era jefe de soporte técnico, me entregaron un CD de una aplicación que había estado en meses de desarrollo y que ni siquiera se instalaba. Podríamos haber encontrado ese problema la primera semana, pero en su lugar era hora de pedir la cena porque era una noche larga.

JeffO
fuente