¿Cómo crear la arquitectura / diseño de una aplicación en Agile?

8

Si estoy a punto de desarrollar una aplicación Enterprise, pero por lo que sé del proceso ágil, divido las características en pequeños fragmentos y las desarrollo de forma iterativa. Solía ​​crear primero la base de datos y el núcleo de la aplicación, luego los extendía de forma iterativa.

La pregunta es: ¿Tengo que mantener lo que solía hacer anteriormente (desarrollar el núcleo primero) o debo distribuir el desarrollo central sobre el desarrollo de las historias? ¡Más adelante, no estoy seguro de que el código sea lo suficientemente flexible para futuras extensiones!

¿Alguna idea?

Sameh Deabes
fuente
2
Las probabilidades son lo que consideraría "suficientemente flexible" por adelantado, ya sea demasiado flexible o demasiado flexible.
OK, ¿hay alguna técnica para entregar un buen diseño / arquitectura mientras se desarrolla de forma iterativa sin desarrollar el núcleo primero? lo siento, soy nuevo en ágil: /
Sameh Deabes

Respuestas:

11

No desarrolles el núcleo primero . Un principio clave del desarrollo ágil es escribir el código mínimo necesario para las funciones completadas. De esa manera puede entregar en cualquier momento. El código se mantiene flexible porque refactoriza continuamente para eliminar la duplicación. La refactorización es compatible con las pruebas automatizadas que escribió para cada característica a medida que la construyó. El núcleo crece automáticamente a medida que elimina la duplicación del código de nivel superior.

Básicamente, en lugar de generar flexibilidad en un intento generalmente inútil de minimizar los costosos cambios futuros en el código, Agile crea pruebas automatizadas para admitir la refactorización, de modo que los cambios en el código sean relativamente económicos.

Refactorización de Martin Fowler es mi libro favorito sobre técnicas efectivas de refactorización. Es mucho más fácil factorizar un núcleo utilizable que definir uno desde el principio. Definir un núcleo utilizable antes de la implementación de características es casi imposible, a menos que simplemente esté reimplementando una API existente. Y no hay valor en eso.

Kevin Cline
fuente
Entonces, la clave aquí es la refactorización continua + pruebas automatizadas. ¡Gracias!
Sameh Deabes
1
@Girgio: Lo siento, claro. Quise decir que no tenía ningún valor escribir su propio marco de registro u ORM, etc. en lugar de simplemente adoptar una de las muchas alternativas existentes. Parece obvio, pero he visto a varias compañías hacer exactamente eso.
Kevin Cline
1
@kevin: Creo que en ciertos casos hay valor en ir con su propia solución. Algo como Logging, que es relativamente pequeño en su alcance, probablemente usaría una solución existente. Algo así como un ORM puedo ver valor en rodar el tuyo. Algo así como Doctrine tiene código para manejar una tonelada de diferentes casos de uso y características, pero ¿qué pasa si solo necesito el 25-30% de ellos? Si uso el 25-30% de la funcionalidad que necesito, terminaré con algo más pequeño, más fácil de usar y probablemente con mejor rendimiento.
ryanzec
2
No puede simplemente refactorizar la arquitectura de un sistema para que exista. Este es un mito común de ágil y arquitectura.
Michael
1
@SamehSerag, "El núcleo crece de forma automática a medida que [re] factoriza ..." implica que la arquitectura no se está eligiendo activamente, sino que se le permite emerger "automáticamente" por decisiones coincidentes sobre decisiones de nivel inferior (no de nivel sistémico). Ese es el problema al tratar de "hacer crecer" orgánicamente la arquitectura mediante la refactorización.
Michael
1

Mi enfoque para el desarrollo ágil es construir "cortes verticales". Tomo una historia de la interfaz de usuario para el almacenamiento y la implemento. Tengo algunas herramientas livianas que utilizo para ayudar a este proceso (como un marco IRepository / UnitOfWork simple que tiene adaptadores para In Memory (generalmente para pruebas), Entity Framework y NHibernate. En este momento no creo que haya mucho de un argumento de si uno debe usar un O / RM, sino cuál usar, y para mí depende del entorno.

He descubierto que este enfoque se gana a los detractores con respecto al desarrollo ágil porque pueden ver el software en funcionamiento más rápidamente que si paso mucho tiempo por adelantado creando un núcleo. En combinación con el diseño impulsado por dominio y algunas otras técnicas que utilizo, generalmente puedo obtener mucha funcionalidad de trabajo frente a los usuarios muy rápidamente.

La prueba TDD o incluso la prueba de unidad post-hoc es importante porque parte del mantenimiento de la velocidad a medida que su aplicación crece es tener esa red de seguridad que proporciona un conjunto completo de pruebas unitarias. "Necesito hacer un cambio en esta clase, ¿cómo me aseguro de no romper nada?" Con un buen conjunto de pruebas unitarias, es tan simple como ejecutar ese conjunto de pruebas. Sin esto, se trata de ejecutar manualmente la aplicación para verificarla. No es divertido en absoluto.

Michael Brown
fuente
-1

Cree el marco horizontal mínimo que admita una porción vertical de funcionalidad. El marco está diseñado para ser extensible y es donde inicialmente se enfoca la mayor parte del esfuerzo. La parte vertical de la funcionalidad es demostrar que el marco admite un valor real. En las iteraciones posteriores, se dedica menos esfuerzo a medida que se realiza el marco y más para desarrollar capacidades utilizando el marco. Continúe de esta manera hasta que la gran mayoría del esfuerzo se centre en la funcionalidad utilizando el marco que se desarrolló a través de las iteraciones.

Chris Wolters
fuente