jueves, 27 de octubre de 2022

Desarrollo ágil con Arquitectura limpia Hexa3

 ¿Cómo podemos usar arquitectura limpia para desarrollar ecosistemas de aplicaciones distribuidas con equipos ágiles?

Patrón de tres capas

Antes de contestar esta pregunta anterior, podemos comenzar por… ¿Cómo podemos implementar una arquitectura limpia?

  • Domain: esta capa se encarga del “¿Cómo hacen los casos de uso para cumplir su función?”, es decir: el código de lógica, lógica compartida, de negocio o de dominio. Esto incluye los servicios de dominio y modelo de datos (agregados, entidades, value object, etc.).
  • Infrastructure: aquí va el código de acceso a recursos (acceso a base de datos, recursos, archivos, clientes api para servicios externos, consumo de colas de eventos específicos, etc.).
Ejemplo de 3 capas basado en DDD
Ejemplo de una estructura de backend MERN NestJS en 3 capas

Patrón de puertos y adaptadores

Claro que con separar en capas no alcanza para tener un código limpio y lejos de ser una madeja de código en monolito. Necesitamos seguir un gran principio en el desarrollo de software: “aumentar cohesión y disminuir acoplamiento”; y eso lo podemos hacer aplicando el principio de inyección de dependencias (“Dependency inversion principle”) con el patrón de “puertos y adaptadores”, también conocida como arquitectura de “Ports and Adapters” o como parte de la Arquitectura Hexagonal.

  • Adaptador: Es la implementación de la interfaz, en ella se generará el código específico para consumir una tecnología en concreto. Esta nunca se usará de forma directa desde otras capas, ya que su uso se realizará a través del tipo del puerto.
Ejemplo de puerto/adaptador en tres capas
Ejemplo con el patrón repositorio.
Ejemplo de inyección de dependencia con anotaciones NestJS (MERN stack) donde se inyecta en el dominio la implementación de infra. Se usa el patrón repositorio (código del ejemplo anterior).

La pauta del dominio como núcleo

Además, si nos guiamos por la propuesta de la Arquitectura Hexagonal que consiste en que el “dominio sea el núcleo de las capas y que este no se acople a nada externo”. Entonces será nuestro dominio el que contenga los puertos de entrada (incoming) y salida (outgoing). Es decir que toda acción o evento externo (i.e. como pedidos http) que llega a la aplicación por un puerto, es convertido, a través de un adaptador específico, a la tecnología del evento exterior, pasando por el dominio solo a través de sus puertos. Por ejemplo la GUI es un ejemplo de un adaptador que transforma las acciones de un usuario en la API de su puerto. La inversión de dependencia hace que la capa de aplicación y la capa de infraestructura conozcan a la capa de dominio, pero no a la inversa. Y en el caso de la capa de aplicación y la de infraestructura, es la de aplicación quién puede conocer a la de infraestructura y no a la inversa.

Diagrama de dominio como núcleo

Aplicación hexagonal

Una manera de interpretar e implementar esta arquitectura es considerar cada gran pieza de software (que será un proyecto), como una aplicación que empaqueta un conjunto de funcionalidades bajo algún concepto o dominio de problema.

Ejemplo de un API backend hexagonal

Frontend hexagonal

Inclusive, en aplicaciones cliente servidoras u orientadas a micro-servicios, un frontend puede ser desarrollado como una app hexagonal en sí misma, que depende de otras que forman el backend. Habitualmente no se implementa la arquitectura hexagonal de esta manera y se llega a tener frontends que son una verdadera madeja enredada de código. La propuesta aquí es aplicar arquitectura hexagonal también al frontend.

Ejemplo de una aplicación cliente-servidor
Ejemplo de estructura de un proyecto frontend en React (MERN stack)

Testing por capas

También tenemos que pensar en el testing. Sin ‘test’ no hay software de calidad. Un beneficio importante de esta arquitectura de software es que facilita la automatización de pruebas independientes por capas usando inyección de dependencias de Mocks y/o Stubs.

Ejemplo de full test por capas

Estructora de carpetas

Al implementar la arquitectura en un proyecto recomiendo que quede la distinción explícita en 3 directorios (uno por capa). Un ejemplo es como la siguiente:

Estructura de carpetas en un proyecto Back-end

Red de aplicaciones hexagonales

Entonces… ¿Cómo podemos desarrollar ecosistemas de aplicaciones distribuidas con arquitectura limpia? Lo podemos hacer con esta arquitectura hexagonal, distribuida, orientada a microservicios y microapps. Es decir que, en sistemas mayores o en el escalamiento, se pueden conformar sistemas distribuidos como una red de aplicaciones hexagonales interconectadas. Es decir que podemos desarrollar ecosistemas de aplicaciones interdependientes, aunque robustas, y conformadas por micro-apps (incluyendo micro-frontends de ser necesario) y micro-services hexagonales.

Red de equipos ágiles

En honor al principio de Conway, que dice que las estructuras del sistema desarrollado serán congruentes con las estructuras sociales de la organización que lo produce, es que tendremos un ecosistema de equipos acorde a esta arquitectura. En este sentido, tendríamos equipos encargados cada uno de una o varias Apps relacionadas bajo un mismo dominio de contexto. Estos equipos deberían poder desplegar software de forma independiente, en sus propios repositorios y entregar de forma evolutiva e incremental.

Vertical slicing

Y para entregar de forma evolutiva e incremental, los equipos pueden desarrollar desglosando entregables/soluciones en features con ‘vertical slicing’ que a su vez se pueden desglosar en historias de usuario. En un vertical slice pueden haber una o más historias de usuario y/o historias técnicas para completar una feature completa.

Ejemplo de ‘vertical slicing’ de una feature

Desarrollo evolutivo

Estos entregables/soluciones evolucionarían desde algún MVP a productos más complejos, adaptándose a las necesidades de los usuarios según la población foco de cada momento cronológico del ciclo de vida del producto/servicio.

Conclusión

Finalmente, concluyo que estos patrones de arquitectura, como otros semejantes, ofrecen una manera de aplicar buenas practicas de código para crear código funcional, mantenible, de fácil crecimiento y que satisfaga las necesidades de los usuarios. Lo que se recomienda es usar los principios de desarrollo de software que llevan a este tipo de arquitecturas, en busca de encontrar mejores formas de desarrollar software de calidad.

  • Principio de ‘Dependency Inversion’ con el patrón ‘Ports and Adapters’ y el patrón de diseño ‘Dependency Injection’.
  • El principio de ‘Testing’ con el patrón de diseño ‘Dependency Injection’ (de Mocks y Stubs).
  • Y por último, el clásico principio de “más cohesión y menos acoplamiento”.
  1. Applying UML and Patterns,1997, Craig Larman.
  2. Presentation Domain Data Layering, 2015, Martin Fowler.
  3. Artículo de softwarecrafters: Arquitectura hexagonal frontend.
  4. Article: Domain Driven Design, Project structure.
  5. Article: What is the 3-Tier Architecture? 2012 by Tony Marston.
  6. Artículo en Medium: Arquitectura Hexagonal.
  7. Article: Hexagonal Architecture applied to typescript react project.
  8. Article: “Hexagonal Architecture: three principles and an implementation example”.
  9. Arquitectura Hexagonal con Typescript en APIs web con Nodejs.
  10. Ejemplo de proyecto backend hexagonal/DDD con NestJs: https://github.com/ecaminero/nestjs-ddd
  11. https://javascript.plainenglish.io/applying-atom-design-methodology-and-hexagonal-architecture-using-react-6dbb1863a5d5
  12. https://medium.com/ssense-tech/hexagonal-architecture-there-are-always-two-sides-to-every-story-bc0780ed7d9c

viernes, 26 de agosto de 2016

Scrum: PO y Valor, nivel 2

¿Cómo medimos el valor trabajando bajo un marco ágil como scrum? y ¿cuán precisos somos midiendo valor? 

En la práctica estas preguntas se resuelven dependiendo del grado de madurez del equipo Scrum y de su PO. Tal vez, el primer nivel considera medir en forma relativa, subjetivo a la perspectiva del PO, sin una transparencia precisa (no se dan argumentos basados en datos ni se conoce el valor que aportan los entregables), priorizando sin técnicas precisas, etc.; y un segundo nivel puede ser como el que paso a contar seguidamente. 

Primero que nada recordemos que, Scrum es una herramienta que puede ayudar a enfocarse a la entrega temprana de valor [1], a re-enfocarse en la rentabilidad de la inversión relacionada al desarrollo de features orientadas al valor aportado [4] y a disminuir el riesgo financiero asociado al valor de pérdida por un mal producto que tarda en salir al mercado y falla [7]. Aunque no es una herramienta que brinde el cómo hacer esto ni cuán precisa debe ser la medida de valor que se tenga en cuenta. Respecto a lo primero, scrum da un “qué” relacionado al valor, el objetivo de scrum es conseguir un MVP en manos de los futuros clientes o usuarios cuán rápido sea posible y obtener sus comentarios [2]. Esto se hace para descubrir lo valioso para el cliente o usuario, validar el producto y encaminar el desarrollo en esa dirección, de ser factible el producto. Para ello se propone enfocarse en las features de valor. Ahora, el cómo se valoran las features o cómo se hace el trabajo de priorización de features de valor no es solución brindada por Scrum ni por el Manifiesto Ágil [3] -pues scrum solo da el contexto como marco de trabajo-. Para ello se usan técnicas, recomendaciones y prácticas complementarias cuya selección será subjetiva al equipo, organización que las implemente o seniority y skill del PO. Por ejemplo, se puede recomendar para buscar el MVP y focalizarse en el valor algunas técnicas como: seguir la ley de Pareto 20/80 para priorizar [7], estimación relativa de valor, medición técnica de satisfacción del usuario, ROI [5], NPV [5], IRR [5], EVM [8], etc. 

En cuanto a cuán precisa debe ser la medida de valor que se tenga en cuenta, también es ajeno al marco Scrum y al Manifiesto. Por un lado, hay que tener en cuenta (a) ¿el valor para quién? ¿para el usuario final o para el cliente negocio?... y por otro lado (b) ¿qué es específicamente el valor? (valor hipotético vs valor real) En relación a los primero (a), en Scrum se recomienda definir esto al comienzo y luego nos enfocamos según los objetivos planteados que involucran al beneficiario del valor. Aquí puede ser el usuario final (“valor percibido por el usuario”) o la compañía cliente (“valor del negocio” [1]). Relacionado a esto último es que scrum propone responder rápidamente la pregunta: ¿Ganaremos dinero con esto? [7] Aunque siempre se termina validando contra el usuario final en cuanto a “software funcionando”[3] como valioso para el usuario. Con respecto a lo segundo (b), hay que partir de que el valor mismo siempre es subjetivo y no existe realmente un valor real concreto y empírico, aunque mientras más nos acerquemos a la realidad del mercado económico, será mejor. Siempre en un justo balance, ya que lo que sí recomienda el Manifiesto es “la adaptación” en vez de seguir un plan minucioso, o sea a no tener toda la información precisa y detallada -la económica por ejemplo- de antemano, desde el comienzo, sino más bien tolerar ciertos grados de incertidumbre -valores hipotético o cercanos al real- en pos de entregar software funcionando que el usuario percibe como valioso. O sea, pretender saber qué valor real en dólares tiene asociado cada entregable es poco válido dentro del agilismo y de scrum; y hasta cierto, punto es utópico. Como versa la frase: "No hay tal cosa como valor absoluto en este mundo. Sólo se puede estimar qué cosa es valiosa para ti" [4] (Charles Dudley Warner, 1829-1900). 

Particularmente recomiendo, a equipos maduros y principalmente a POs más que juniors, las siguientes prácticas: 
  1. El establecimiento de objetivos comunes entre todos los stakeholders (internas y externas) alineados al negocio [4]. 
  2. ROI mediante desarrollo de las features más importantes [4], según MVP. 
  3. La identificación de las features innecesarias o de bajo perfil para remoción del backlog durante la “priorización continua” [4], usando ley de Pareto 20/80 [7]. 
  4. Motivar al equipo haciéndoles saber cuánto valor relativo de negocio están entregando por features o historia de usuario [4], se puede usar el Value Point como medida. 
  5. La reducción del riesgo mediante uso de MVP, MMP y release plan [6][7]. 
  6. Medir la satisfacción del cliente para buscar su incremento [4]. 
  7. Respaldar con datos el “Business Case” y el release plan. 
  8. Medición o estimaciones de revenue, cost y penetration. De lo cual se desprende el análisis de qué features aportan a la reducción de los costes, aumento de revenue y penetración en mercado. Justificar el “Business Case” y el valor aportado en las reviews. 

Hay que recordar que lo relacionado a valor es responsabilidad del PO y la calidad relacionada al mismo dependerá, en gran medida, de su seniority como PO. La excelencia es un principio en la agilidad, por lo que un buen PO debe procurar excelencia como analista del negocio y del valor del producto que el equipo entrega. Un trabajo de precisión ágil y excelencia requieren un PO de seniority alto que busca la excelencia. 

Referencias: 

[1] Scrum Alliance: Scrum Values. URL: https://www.scrumalliance.org/why-scrum/core-scrum-values-roles

[2] Book: Summary: Scrum - Jeff Sutherland: The Art of Doing Twice the Work in Half the time, by BusinessNews Publishing.

[3] Manifiesto por el Desarrollo Ágil de Software. URL: http://www.agilemanifesto.org/iso/es/

[4] Scrum Alliance: What Is Required for Business Value? Sumanth Reddy Bathula. URL: https://www.scrumalliance.org/community/articles/2016/april/what-is-required-for-business-value-(1)

[5] Scrum Alliance: Business Value Metrics. URL: https://www.scrumalliance.org/community/articles/2016/april/business-value-metrics

[6] Artículo: Desarrollo Ágil - Desarrollo mediante MVP. URL: http://programminglabpoint.blogspot.cl/2016/05/desarrollo-agil-mvp.html

[7] Book: Scrum The Art of Doing Twice The Work In Half the Time by Jeff Sutherland, 2014.

[8] Agile estimating and planning. Mike Cohn.


jueves, 19 de mayo de 2016

Desarrollo Agil: Presentaciones ágiles


¿Cómo dictar una presentación ágil?



Podemos hacer que nuestras presentaciones orales, demostraciones de productos o resultados, sprint review, show cases, exposiciones educativas, informes de noticias, capacitaciones, etc., sean ágiles. Para lograrlo tenemos que tener en cuenta los valores ágiles en su desarrollo.
Pueden haber muchas maneras de hacer una presentación en el marco de la agilidad. Aquí se muestra una forma basada principalmente en tres valores ágiles y un principio.

A continuación ofrezco 6 aspectos a tener en cuenta dentro de este marco de agilidad:
  1. Tiempo: la atención ronda entre 5 y 18 minutos. Es recomendable no superar los 20 minutos de una presentación (principalmente si las personas están de pié) y en actividades largas fraccionar en tramos de 20 min. [1] [2]. No superar los siete segundos de silencio [6]. Y por último, respetar un time-box.
  2. Útil: Dar valor al público espectador con lo que se presenta [2] [7]. Debes poder presentar tu premisa en una o dos oraciones y hacerla interesante [2].
  3. Emoción:  Motivar con emociones, sensaciones o dinámica ágil por medio del lenguaje textual y corporal [6] [7]. Conoce a las personas a las que les hablarás [2] [3]. El ponente también puede ponerse en un rol de amigo o de igual [6].
  4. Interacción: Hacer preguntas y hacer pensar interactuando con los demás. Romper la barrera con el público y capturarlo [2] [6]. Puedes solicitar feedback para poder mejorar.
  5. Simple: Buscar ser claro, conciso y concreto presentando poca información y siendo visual y minimalista, “Keep it simple” [2] [4].
  6. Cambio: Orientarse a inspirar y/o generar un cambio en el oyente. Para ello ser desafiante, innovador, buscar impactar o generar nuevas ideas o reflexiones. Tu conclusión debe ser algo que deje a tu público con una sensación positiva sobre tu idea y cómo les afectará si la deciden implementar, que los motive al cambio [2] [3]. El ponente también debe estar abierto al cambio y a salir de su zona de confort [6].



Referencias:


[1] ¿Cuánto debe durar una presentación? por Roger Prat, febrero 25, 2013

[2] TED Speaker Guide by TED.com.
[3] Manifesto for Agile Software Development by Agilemanifesto.org
[4] Principles behind the Agile Manifesto by Agilemanifesto.org
[5] Cómo dictar una charla TED
[6] Presentaciones efectivas: Técnicas para la exposición oral de trabajos y proyectos académicos. Por Iñaki Bustínduy. Editorial UOC, 11-03-2014.
[7] Neuro Presentaciones efectivas, Miguel Figueroa, Youtube, Published on Dec 3, 2015
URL: https://www.youtube.com/watch?v=GD1QosoeRtY