¿Cómo obtener un buen diseño cuando se utilizan métodos ágiles?

15

He estado utilizando una metodología ágil (SCRUM) durante aproximadamente tres años y veo ciertas ventajas, especialmente en la retroalimentación a corto plazo en muchos niveles (de clientes que tienen acceso temprano a funciones implementadas, de probadores que pueden probar características como tan pronto como se implementen, de otros desarrolladores que pueden proporcionar comentarios muy tempranos sobre el nuevo código a través de la revisión, etc.

Por otro lado, tengo dos problemas abiertos, el primero de los cuales trataré de explicar en esta pregunta.

Problema: dificultad para obtener un buen diseño

Intento refactorizar tan pronto como el código se vuelve desordenado, escribo pruebas unitarias tanto como puedo (lo que ayuda a prevenir errores en general y cuando refactoriza en particular). Por otro lado, desarrollar algunas características complejas en pequeños incrementos, con compromisos diarios y repensar continuamente el código cuando se desestructura, no me permite producir un diseño realmente bueno.

El único módulo bien diseñado que pude producir recientemente lo obtuve adoptando un enfoque diferente: analicé el problema durante unos días (en realidad, tuve el problema en mi mente durante un par de meses antes de comenzar a trabajar en serio ), esbocé un diseño bastante detallado de todas las clases involucradas y sus relaciones durante un par de días más, y luego me encerré en mi oficina y escribí todo el código trabajando sin interrupción durante aproximadamente tres semanas. El resultado fue lo mejor que he producido en mucho tiempo, con muy pocos errores que fueron bastante fáciles de localizar y corregir, y con un diseño muy claro, que no ha requerido ningún cambio relevante desde entonces.

Entonces, hasta ahora, me resultó mucho más efectivo obtener una imagen general de lo que quiero hacer de antemano que comenzar a escribir código en pequeños incrementos con la esperanza de que la gran imagen surja mágicamente en el proceso. Con mi mejor esfuerzo, el enfoque de desarrollo de incrementos pequeños siempre me ha llevado a un peor diseño.

Pregunta : ¿Alguien ha tenido una experiencia similar? ¿Estoy aplicando SCRUM de forma incorrecta o a qué debo prestar atención si deseo desarrollar en pequeños incrementos y aún así terminar con un software bien diseñado? ¿O debería programar una historia de usuario de diseño antes de comenzar la codificación real? ¿Se considera esto una buena práctica, al menos para características que son más complejas que el promedio?

EDITAR NOTA

Soy consciente del hecho de que un buen diseño no es algo absoluto y no tiene un valor en sí mismo, sino que depende del contexto, y que uno debe apuntar a un diseño que sea lo suficientemente bueno para el problema en cuestión.

Por ejemplo, no me importa (demasiado) el buen diseño si tengo que implementar un componente simple que (1) debe estar listo lo antes posible, (2) se va a usar solo una vez, (3) no utilizado por otras partes del sistema (YAGNI).

Me importa el buen diseño cuando un componente (1) se usará varias veces y en varias versiones diferentes de un producto, (2) debe mantenerse y ampliarse con el tiempo, (3) tiene muchos otros componentes dependiendo de él .

Giorgio
fuente
55
The only well-designed module I could produce recently I obtained by taking a different approach-- Usted contestó su propia pregunta. Todavía necesita un diseño inicial; no se puede esperar que un buen diseño simplemente crezca orgánicamente de la refactorización. No funciona de esa manera.
Robert Harvey
1
No. Porque quizás no estoy aplicando SCRUM correctamente.
Giorgio
3
No existe tal cosa como "SCRUM correctamente". Solo existe ese proceso que produce el resultado deseado.
Robert Harvey
1
Es por eso que se llaman "pautas" :) De todos modos, comprométase todos los días, tenga sprints cortos (1 semana a 1 mes), reglas como esta no hablan en absoluto para diseñar. Todavía tienes que tener diseño.
Robert Harvey

Respuestas:

13

Por otro lado, desarrollar algunas características complejas en pequeños incrementos, con compromisos diarios y repensar continuamente el código cuando se desestructura, no me permite producir un diseño realmente bueno.

Entonces no hagas eso.

No todo encaja en la bonita caja ágil. Muchas veces un producto tendrá algunas cosas complejas que no pueden ser cultivadas por individuos y no pueden completarse de manera sensata dentro de un sprint. Forzarlos a esa caja solo causará problemas. Pero estos deberían ser pocos y distantes entre sí. Si encuentra que muchos de sus componentes son así, el propietario de su producto debe trabajar para dividir las cosas mejor (con su equipo). Estoy bien haciendo lo que hiciste: toma la historia, diseñala, luego házlala lo antes posible con la expectativa de que tomará algunas semanas.

En el caso más general, hay 3 cosas que he visto hacer para obtener un buen diseño en Agile:

  • Realmente diseño : muchos lugares que he visto comienzan su carrera y simplemente comienzan a codificar. Obtendrá un mal diseño de esta manera. Agile no cambia el proceso de desarrollo de plan - código - prueba - lanzamiento, solo lo acorta a piezas más granulares. Al comienzo del sprint, siéntate según sea necesario y diseña tu solución.

  • Tenga un arquitecto / líder : una vez que su proyecto sea lo suficientemente grande, terminará con varios equipos scrum trabajando en diferentes partes de la aplicación. Es muy útil tener a alguien (o varias personas dependiendo del tamaño de la aplicación) cuyo trabajo principal es saber qué están haciendo todos los equipos desde el punto de vista del diseño. Pueden responder preguntas y guiar a los equipos hacia un diseño general más armonioso. También he visto que cada equipo de scrum tiene una ventaja que sabe la mayoría de lo que otros equipos están haciendo y que fue muy efectivo.

  • Sé un pragmático . Cubrí esto arriba. Agile es una herramienta, y como cualquier herramienta; No se aplica a todos los problemas. Si no tiene sentido aplicar a algún componente, no lo aplique allí. Su objetivo es enviar un buen software; no lo olvides

Telastyn
fuente
3
+1 (+10 si tuviera más de un voto!) Por "Forzarlos a esa casilla solo causará problemas".
Giorgio
17

Es muy posible implementar en pequeños incrementos y terminar con un código mantenible bien estructurado. En teoría, es muy simple: si se asegura de que el código esté bien estructurado después de cada cambio, siempre estará bien estructurado. Su código está mal estructurado porque continúa agregando código cuando debería refactorizarlo.

No importa cuánto tiempo dedique al diseño, eventualmente los requisitos cambiarán de manera imprevista y tendrá que escribir código que no se ajuste al diseño original. Entonces tendrá que hacer un cambio incremental. Si tiene un buen conjunto de pruebas unitarias y es experto en refactorización, podrá mantener el código bien estructurado a medida que cumpla con los nuevos requisitos.

Kevin Cline
fuente
+1: OK Por lo tanto, debo programar una historia de refactorización cuando creo que es necesario y no agregar ninguna característica nueva hasta que vuelva a tener un diseño suficientemente bueno. Eso es probablemente lo que nos falta en nuestro proceso (además del hecho de que, en mi opinión, los incrementos que estamos desarrollando a menudo son demasiado pequeños).
Giorgio
2
en realidad, debe agregar la historia de la deuda técnica y discutir cuándo actuar con el propietario del producto, esto es lo que se entiende por deuda técnica .
44
Todos los proyectos que he visto en los que pones la responsabilidad de la calidad del código en manos del propietario del producto al crear historias de "deuda técnica" o similar, la calidad del código siempre se ha priorizado tanto como para dañar seriamente la velocidad y la moral. Creo que el equipo es la entidad que se responsabiliza de la calidad del código. El equipo debe estimar las historias para que haya espacio para entregar con deuda técnica preservada o, si es necesario, reducida.
Buhb
44
La "historia de refactorización" o la "historia de la deuda técnica" no deberían suceder. Nunca. El costo de la refactorización es parte del desarrollo y no debería ser una tarea separada. Debe hacerse continuamente en pequeños pasos, no planeados, después del hecho, historias. Sé esto, nuestro equipo probó las historias de refactorización, es malo. Cuando comience a refactorizar 'sobre la marcha', verá que la refactorización se convierte en una parte de su estilo de codificación y no en una tarea separada.
Patkos Csaba
1
Si cree que la base de código no podrá manejar convenientemente la historia X sin una reestructuración / reescritura significativa, entonces esta reestructuración debería ser parte de la historia X y el trabajo necesario para esta reestructuración debería tenerse en cuenta al estimar la historia X.
Buhb
6

"Bien diseñado" es subjetivo

¿Qué significa "bien diseñado" para ti? al propietario del producto? ¿al cliente?

¿Es "bien diseñado " un objetivo del propietario del producto? un objetivo del cliente? o solo tu?

¿Lo que considera "no bien diseñado" sigue cumpliendo con las expectativas de los propietarios de productos y haciendo feliz al cliente? Entonces eso es bastante "bien diseñado" .

Lo suficientemente bueno y yagni

Nada en la mayoría de las metodologías ágiles habla de "bien diseñado", porque cualquier sistema en el que el propietario del producto acepta las historias como completo y los clientes creen que cumple con sus requisitos está "bien diseñado" .

Se espera que los desarrolladores sean profesionales y usen pragmáticamente las mejores prácticas, diseños apropiados y expresiones idiomáticas para implementar las características y las historias.

Si no tiene en cuenta el tiempo para hacer las cosas correctamente, es un problema del desarrollador, si el Propietario del producto exige cosas en menos tiempo de lo que se puede hacer, es su prerrogativa hacer esto, y es su responsabilidad educarlos sobre consecuencias en forma de historias técnicas de deuda .

MELÉ

La metodología ágil que se puede escribir, no es la metodología ágil. "- Jarrod Roberson

Se supone que SCRUM es un marco de herramientas para administrar el ciclo de vida total de un producto de software. No se supone que sea un conjunto rígido de cosas, solo un buen lugar para comenzar y, con suerte, mejorar.

La mayoría de las tiendas en las que he trabajado tienen lo que se llama Sprint ZERO, Sprints para que los miembros principales del equipo esbocen una arquitectura general o un tema del producto.

Las historias que son más grandes que 20 por lo general se desglosan hasta que en realidad son unas historias de 3 a 5 puntos. Una de estas historias es: "Como equipo tenemos que reunirnos para discutir cómo vamos a diseñar esta característica, de modo que tengamos la menor deuda técnica posible dado el tiempo asignado".

En general

En general, un sistema "bien diseñado" es lo suficientemente bueno y sigue a YAGNI.

Agile, y SCRUM, en particular como una implementación de Agile, son más acerca de cómo producir un producto de la forma más transparente posible para el Propietario / Patrocinadores del producto.

No se trata de nada de diseño técnico / arquitectura inteligente. Es más una filosofía sobre cómo abordar la entrega de software que satisfaga las necesidades y expectativas de los clientes. Si no hay lo que llamas partes "bien diseñadas" , eso no es un error en sí mismo, ya que no es una parte fundamental de la filosofía.

Robert Harvey
fuente
2
Está "bien diseñado" un objetivo del propietario del producto: no un objetivo directo. Indirectamente, sí: bien diseñado significa más fácil de depurar y mantener. Tuve que pasar semanas encontrando errores críticos (que bloquearon la aplicación) en código desordenado y mal diseñado.
Giorgio
3
Qué respuesta tan deprimente. Básicamente garantiza un software mediocre que envuelve al planeta como una sustancia gris.
Robert Harvey
@Giorgio que no es un objetivo, es una expectativa implícita.
@RobertHarvey que has visto el video de Big Ball of Mud y has leído el periódico. Esta es la vida real, SCRUM en particular es un reconocimiento de BBOM y lo abarca en la metodología al aceptar la entropía como parte del proceso y administrarla al tratar de documentarla (debut técnico) y ralentizarla (refactorización). Sí, debe comenzar lo más lejos posible de BBOM / Entropía total, pero en la vida real no siempre es así.
1
OK, pero no puedes comer una "expectativa implícita". Eso es solo agitar las manos. "Estará bien diseñado porque soy un profesional y sé lo que estoy haciendo". (usando mi mejor voz de Bill Murray) Sí, claro.
Robert Harvey
3

Hemos estado trabajando con scrum durante varios meses y quiero compartir mi experiencia con respecto a su problema.

Hace unos meses me dieron una gran pieza para implementar. Tenía todas las especificaciones listas, así que tuve que implementar nuevas funciones en consecuencia. La tarea consistía en demorar entre 5 y 6 semanas (como calculé). Pasé la primera semana trabajando solo en diseño. La tarea era un poco complicada: había un objeto principal que, como concluí de la especificación, tenía 15 estados diferentes, y la IU debía tener comportamientos diferentes para cada estado.

Luego diseñé todo el flujo de trabajo y la estructura y clases de DB.

No veo ningún otro enfoque en mi caso. Si me sumergiera en la codificación de una vez, habría tenido un gran desastre al final, casi imposible de mantener y extremadamente difícil de realizar más cambios. Pero los cambios llegaron en las próximas 2 semanas, así que tuve que volver a trabajar el código. Esto fue fácil ahora, con el diseño pensado inicialmente. Esto nos ahorró tiempo, dinero y nervios.

Después de esta experiencia, estoy absolutamente seguro de que vale la pena hacer un diseño aceptable al principio, que espero que con algún milagro lo tenga al final.

superM
fuente
1
+1: respuesta muy interesante. Los partidarios ágiles le dirían que debería haber dividido su historia de 6 semanas en historias más pequeñas. Una vez me dieron un consejo similar y respondí que mis seis historias de 1 semana habrían tenido muchas dependencias entre sí: porque incluso si cambio mi plan de trabajo, no puedo cambiar el dominio del problema. No obtuve respuesta sobre esto: ágil a menudo supone que puedes dividir tu trabajo en historias pequeñas e independientes, pero en el mundo real este no es siempre el caso.
Giorgio el
1

La vista trasera es de 20-20. Si tenía la información a su disposición al comienzo del proyecto para resolver todo y luego escribir el código en unas pocas semanas, le sugiero que lo haga.

No está otorgando suficiente crédito a todas las ideas que adquirió, los enfoques que se probaron y fallaron / tuvieron que cambiarse, y la mayor capacidad del cliente / usuario para proporcionar los requisitos de crédito suficiente.

¿Por qué alguien con un historial de proyectos exitosos de caída de agua, cambiaría a una metodología ágil?

JeffO
fuente
"¿Por qué alguien con una historia de proyectos exitosos de caída de agua, cambiaría a una metodología ágil?": Muy buena observación (+1). Creo que la elección entre cascada y ágil debería estar relacionada con el tipo de proyectos que uno hace: para proyectos con requisitos mal definidos que necesitan prototipos frecuentes y en los que un prototipo probablemente se convertirá en el producto final, ágil puede ser apropiado. Para un proyecto en el que los requisitos son más estables y donde la robustez y la estabilidad son más importantes, la cascada (o alguna variación) es probablemente una mejor opción.
Giorgio
0

Siempre necesita una imagen más amplia de cuál debería ser el objetivo final, y qué características están destinadas a implementarse y cuándo, antes de comenzar un proyecto. Trabajar en historias como tareas atómicas es pedir problemas. Debe tener en cuenta los requisitos futuros tanto como sea posible.

James
fuente
¿Es una buena práctica programar una historia de usuario de diseño ?
Giorgio
@Giorgio: Probablemente sea innecesario, pero el Propietario del producto debería al menos dar a su equipo una visión general de las expectativas del cliente sobre el proyecto, antes de que comience el proyecto, y una explicación de cómo se desglosó tal como estaba.
James
1
Si alguien vota negativamente, por favor, dé una razón
James
Los votantes negativos rara vez se toman el tiempo para explicar por qué votaron negativamente. Me resulta bastante molesto.
Giorgio