Lecciones Aprendidas por Jorge Abad
Este blog comparte estrategias y aprendizajes sobre desarrollo de software, marcos, métodos y metodologías ágiles como Scrum, Kanban y XP, con un enfoque en escalamiento ágil y Business Agility. Su propósito es ayudar a profesionales de la gerencia de proyectos, productos, scrum masters, agile coaches, agentes de cambio, y líderes a mejorar sus procesos y promover la experimentación como motor de innovación, facilitando su adaptación en entornos empresariales cambiantes.
sábado, marzo 01, 2025
lunes, febrero 24, 2025
Transformando conversaciones en código funcionando: El rol de las Historias de Usuario
Hola a todos,
El software no es simplemente un conjunto de líneas de código que ejecutan instrucciones en un procesador. Es la representación digital del mundo real, un esfuerzo por modelar procesos, resolver problemas y crear experiencias significativas para los usuarios. Pero esta transformación del mundo físico al digital no ocurre de manera automática; se da a través de la conversación, el entendimiento compartido y la construcción colaborativa de soluciones.
Las historias de usuario (HU) no son especificaciones técnicas ni documentos cerrados; son el punto de partida de una conversación sobre lo que queremos construir. Son el vehículo que nos permite expresar necesidades, compartir expectativas y alinear criterios entre negocio, desarrollo y usuarios. Como lo señala Jeff Patton en User Story Mapping, las historias de usuario son “promesas de una conversación” más que requerimientos detallados (1). Es en estas conversaciones donde se define el valor del software y cómo este reflejará la realidad que buscamos modelar.
De la Conversación al Código: El Software como Modelo del Mundo Real
En esencia, desarrollar software es un proceso de traducción: convertimos problemas y oportunidades en soluciones digitales. Cada línea de código es el resultado de múltiples interacciones entre equipos de negocio, desarrollo y usuarios, quienes discuten qué se necesita, cómo debe funcionar y cuál es la mejor manera de representar una solución efectiva.
Martin Fowler, en Refactoring: Improving the Design of Existing Code, argumenta que el software evoluciona en ciclos de retroalimentación constante y que la claridad en la comunicación es esencial para evitar malentendidos que se traduzcan en código incorrecto o innecesario (2). Esto refuerza la idea de que el software no es solo código, sino la cristalización de un entendimiento compartido sobre cómo resolver un problema.
La conversación es el insumo fundamental del desarrollo de software. Sin una comunicación efectiva, los equipos corren el riesgo de construir soluciones que no reflejan la intención original. Como lo menciona Kent Beck en Extreme Programming Explained, la programación extrema (XP) enfatiza la comunicación continua entre todos los involucrados para garantizar que el software represente fielmente las necesidades del negocio y de los usuarios finales (3). En otras palabras, la calidad del software está directamente relacionada con la calidad de las conversaciones que lo preceden.
El Proceso de Creación de Software: De la Idea a la Validación
El desarrollo de software es un ciclo iterativo donde cada etapa está respaldada por conversaciones clave que permiten garantizar que lo que se construye es realmente lo que se necesita. El flujo típico sigue esta secuencia:
- Idea: Surge una necesidad o una oportunidad que se quiere materializar en software.
- Conversación inicial: Se llega a un acuerdo sobre lo que se quiere lograr y por qué.
- Historia de usuario: Se plasma el concepto en una HU que actúa como un recordatorio de la conversación.
- Conversación de refinamiento: Se profundiza en los detalles y se acuerda lo que realmente se va a construir.
- Codificación: Se implementa la funcionalidad en base a la conversación previa.
- Conversación durante la construcción: Se acuerdan partes difusas de la HU, se cierran detalles, se identifican oportunidades de ajuste. Los pasos 5 y 6 se pueden repetir varias veces.
- Conversación de validación: Se presenta y valida lo construido con el usuario para verificar que cumple con las expectativas.
Este proceso se repite de manera continua, asegurando que cada funcionalidad agregada tenga sentido, sea útil y cumpla con los objetivos del negocio. En un entorno ágil, las conversaciones no terminan con la entrega del software; más bien, se mantiene un diálogo constante que permite mejorar y adaptar la solución a las necesidades cambiantes del usuario y del mercado.
El Rol de la Inteligencia Artificial en la Conversación del Software
Con la evolución de la inteligencia artificial (IA), el ciclo de retroalimentación en el desarrollo de software se está reduciendo drásticamente. Herramientas como GitHub Copilot y modelos avanzados de procesamiento de lenguaje natural están acelerando la transformación de ideas en código. Sin embargo, esto no significa que la IA pueda reemplazar la conversación humana.
La IA puede asistir en la generación de código, la identificación de patrones y la optimización de soluciones, pero aún depende de instrucciones claras y precisas. Como lo menciona Google en su investigación sobre Software 2.0, los modelos de IA pueden generar código, pero requieren contexto, intención y guía humana para producir resultados valiosos (4). Esto refuerza la importancia de las historias de usuario como un puente entre el entendimiento humano y la ejecución automatizada.
Incluso en un mundo donde la IA nos permite validar ideas en tiempo récord, sigue siendo crucial plasmar nuestras necesidades en historias de usuario claras y concisas. No se trata de eliminar la conversación, sino de hacerla más eficiente. Las HU siguen siendo necesarias para estructurar y comunicar lo que queremos construir en pequeños fragmentos implementables en cuestión de horas, manteniendo el ciclo de entrega ágil y efectivo.
De las Historias de Usuario a la Conversación Continua
En metodologías ágiles, las historias de usuario no solo sirven como un punto de partida, sino que también facilitan la conversación continua a lo largo del desarrollo del software. Como señala el Agile Manifesto, la colaboración frecuente entre negocio y desarrollo es un principio clave para entregar software de calidad (5). Cuando los equipos adoptan este enfoque, logran reducir el riesgo de malinterpretaciones, mejorar la alineación estratégica y aumentar la satisfacción del usuario final.
El software no es solo código. Es la representación de acuerdos, decisiones y aprendizajes compartidos a lo largo de múltiples interacciones. Es un reflejo de cómo entendemos y resolvemos problemas en el mundo real. Por eso, la calidad del software no depende únicamente de la tecnología utilizada, sino de la capacidad de los equipos para conversar, comprender y traducir esas conversaciones en soluciones digitales efectivas.
Cerrando
El desarrollo de software es un proceso de diálogo estructurado, donde las historias de usuario actúan como catalizadores de la conversación. La inteligencia artificial está acelerando la implementación de soluciones, pero no reemplaza la necesidad de expresar, compartir y validar ideas. En este ecosistema, la clave no está en generar más documentación, sino en mejorar la forma en que conversamos, porque al final del día, el software es solo eso: una conversación convertida en ceros y unos.
Referencias:
- Jeff Patton, User Story Mapping: Discover the Whole Story, Build the Right Product (O'Reilly Media, 2014).
- Martin Fowler, Refactoring: Improving the Design of Existing Code (Addison-Wesley, 1999).
- Kent Beck, Extreme Programming Explained: Embrace Change (Addison-Wesley, 1999).
- Google Research, "Software 2.0: AI-Driven Code Generation and Its Future", 2023.
- Agile Manifesto, “Principles Behind the Agile Manifesto”, 2001.
De Colección: Una buena definición de Historia de Usuario - continuación
Esta es la explicación del post: De Colección: Una buena definición de Historia de Usuario
Hola a todos
Uno de los retos más comunes en agilidad es definir claramente qué es una historia de usuario y, sobre todo, cuál es su tamaño adecuado. He encontrado útil compartir esta definición:
"Una Historia de usuario es una pequeña porción de valor cuyo tiempo de análisis, desarrollo, pruebas, corrección y despliegue, puede estar entre unas cuantas horas hasta máximo 36 aproximadamente."
Otra versión que enfatiza el impacto en el negocio es:
"Una Historia de usuario es una pequeña porción funcional de valor cuyo tiempo de análisis, desarrollo, pruebas, corrección y despliegue; puede estar entre unas cuantas horas hasta máximo 36 aproximadamente, que le permite al equipo de desarrollo de forma tangible y rápida mostrar progreso al negocio"
Justificación de esta definición
El propósito de estas definiciones es alinear expectativas sobre el tamaño y alcance de una historia de usuario. En la práctica, es común encontrar historias que son demasiado grandes o demasiado pequeñas, lo que afecta el flujo de trabajo y la entrega de valor real.
¿Qué significa una "pequeña porción de valor"?
Para que una historia de usuario tenga el tamaño adecuado, debe cumplir dos principios clave:
- Ser lo suficientemente pequeña para completarse en poco tiempo (idealmente en menos de dos días de trabajo acumulado). Esto permite que el equipo entregue de forma frecuente y fluida.
- Ser lo suficientemente grande para aportar valor tangible al usuario o negocio. Esto significa que debe entregar una funcionalidad completa y usable, no solo una parte técnica aislada.
Una historia demasiado pequeña puede caer en fragmentación innecesaria, por ejemplo:
- "Agregar un nuevo campo en un formulario" (sin que esto implique una funcionalidad completa para el usuario).
- "Implementar solo la lógica de frontend" sin que el usuario pueda interactuar con el sistema de manera funcional.
Por otro lado, una historia demasiado grande se convierte en un problema porque:
- No se logra entregar dentro del sprint, afectando la previsibilidad del equipo.
- Genera un esfuerzo desproporcionado que impide recibir retroalimentación temprana.
- Puede requerir múltiples iteraciones para completarse, lo que dificulta la entrega continua de valor.
¿Por qué definir un límite de hasta 36 horas?
Anteriormente, usaba la referencia en días, pero esto generaba confusión. Algunas personas asumían que se trataba del esfuerzo acumulado de varias personas en paralelo, cuando en realidad el enfoque está en el tiempo total requerido.
Este límite de tiempo permite que las historias de usuario sean manejables y estén listas para ser desplegadas dentro del sprint sin convertirse en un obstáculo para el equipo. Además, facilita:
- Un flujo de entrega continuo, evitando acumulaciones y bloqueos.
- Un progreso visible para el negocio, al recibir incrementos de valor en ciclos cortos.
- La detección temprana de problemas, reduciendo el riesgo de retrabajo.
¿Cómo lograr historias de usuario con el tamaño adecuado?
- Asegurar que cada historia entregue valor real. Si un usuario no puede interactuar con la funcionalidad o si no se resuelve un problema concreto, entonces la historia está mal definida.
- Evitar fragmentación innecesaria. Dividir en tareas técnicas (backend por un lado, frontend por otro) no es lo ideal, ni lo correcto. En su lugar, cada historia debe representar un incremento funcional, usable y comprobable del usuario.
- Reducir la complejidad sin perder el impacto. Si una historia es demasiado grande, dividirla de manera que cada parte siga teniendo sentido de negocio y sea usable por el usuario.
Definir historias de usuario en estos términos ayuda a los equipos a mejorar su agilidad y a entregar valor de forma consistente.
¿Tu equipo tiene una definición clara de historia de usuario? ¿Cómo manejan su tamaño? Comparte tu experiencia en los comentarios.
miércoles, febrero 19, 2025
Guía para identificar mejores criterios de aceptación en historias de usuario
Hola a todos,
Escribir criterios de aceptación, a pesar de ser un proceso de llegar a un acuerdo sobre lo que se quiere recibir, no deja de ser un reto. En este proceso surgen al menos tres preguntas:
- ¿Hasta cuándo es suficiente detalle?
- ¿Estoy dejando la descripción muy general?
- ¿Qué más debo incluir?
Ante esto, generalmente, a los Product Owners les digo:
- No te preocupes, que si falta detalle, los developers te lo recordarán.
- Si olvidaste algo, es porque aún no es importante.
Aún así, el pedido que constantemente recibo es:
"¿Podrías escribir una guía para hacer criterios de aceptación?"
Considerando que lo anterior lo he respondido de forma particular, voy a cambiar mi aproximación y hacerlo por medio de este artículo que, con seguridad, iré engrosando en la medida que la retroalimentación y la experiencia vayan llegando.
¿Qué son los criterios de aceptación?
Los criterios de aceptación son las condiciones que una historia de usuario debe cumplir para considerarse completada cuando es desarrollada y desplegada por el equipo. Funcionan como una guía para los desarrolladores y testers, asegurando que lo que se construye es realmente lo que el negocio necesita.
Es de considerar que el formato original de las historias de usuario no incluía los criterios de aceptación (1), y aunque no hay un acuerdo sobre quien los incluyó, Ron Jeffries hace referencia tácita a ellos en su artículo sobre las tres C (Card - Conversation- Confirmation) (2):
"Al comienzo de la iteración, el cliente comunica a los programadores lo que desea y les dice cómo confirmará que han hecho lo que se necesita. Define las pruebas de aceptación que se utilizarán para demostrar que la historia se ha implementado correctamente".(2)
No se habla de un formato específico, incluso se sugiere el uso de ejemplos para que estos sean más claros, algo que al final incluyó Behavior Driven Development (BDD) (3).
No confundir con la Definition of Done (DoD). Mientras que los criterios de aceptación son específicos para una historia de usuario, la Definición de Terminado es un estándar general del equipo para determinar cuándo una historia está terminada desde un punto de vista técnico y de calidad.
¿Por qué son clave en un desarrollo ágil? (4)
Los criterios de aceptación cumplen un papel fundamental en la comunicación entre los equipos de desarrollo y los stakeholders. Algunas razones por las que son esenciales incluyen:
- Evitan malentendidos: Reducen la ambigüedad y ayudan a alinear expectativas.
- Mejoran la calidad del producto: Definen el mínimo aceptable para el negocio.
- Facilitan la prueba y validación: Los testers pueden usarlos para diseñar pruebas.
- Permiten la automatización: Son la base para la creación de pruebas automatizadas.
- Pueden contener ejemplos que van a guiar a los desarrolladores: Basados en los ejemplos proporcionados, los desarrolladores encontrarán como cumplir con lo que se espera de la fucionalidad.
Cómo aceptar la funcionalidad con el usuario durante la escritura de historias de usuario
Validar la historia de usuario antes de escribir los criterios de aceptación
- Explicar la historia de usuario en términos simples y preguntar:
- “¿Esta historia realmente cubre tu necesidad?”
- Preguntar si falta algo en la descripción de la historia.
- Asegurar que la historia esté escrita en el lenguaje del usuario, no en lenguaje técnico. No incluyas llamado a bases de datos, nombres de tablas, etc.
Involucrar al usuario en la definición de criterios de aceptación
- Preguntar cómo espera que funcione la funcionalidad en su día a día.
- Plantear escenarios de uso y validar que cubran sus expectativas.
- Escribir los criterios de aceptación junto con el usuario o validarlos con él antes de finalizar la historia.
Revisar los criterios de aceptación con ejemplos
- Presentar ejemplos de cómo funcionará la funcionalidad basados en los criterios de aceptación y preguntar:
- Si esto se comporta así, ¿te parecería correcto?
- ¿Cuáles son los campos que van a viajar en el formulario? ¿Cuáles serán las validaciones asociadas a cada campo?
- ¿Cuáles son los campos que tendrá el reporte? ¿Tendrá filtros?
- ¿Cuáles son los mensajes de éxito y de fracaso, según el resultado?
- ¿La imagen o gráfico será interactivo? ¿Qué comportamientos tendrá?
- ¿Se enviarán notificaciones? ¿De qué forma? ¿A quiénes?
- Si usa formato Given-When-Then (más adelante cubriré este aspecto), leer los escenarios y validar con el usuario.
Usar prototipos o bocetos si es necesario
- Si la funcionalidad es visual, mostrar wireframes o pantallas para confirmar que la historia refleja lo que el usuario espera.
Obtener aprobación antes de llevarla a desarrollo
- Preguntar directamente: “Si construimos esto con base en estos criterios de aceptación, ¿estarías satisfecho?”
- Si hay dudas o cambios, refinarlos antes de que el equipo empiece a desarrollarla.
- Preguntas adicionales para descubrir criterios de aceptación
Si quieres mejorar la identificación de criterios de aceptación, aquí tienes más preguntas que puedes hacer al usuario o al equipo:
- Sobre el objetivo de la historia
- ¿Cuál es el problema exacto que queremos resolver con esta historia?
- ¿Cómo sabremos si la funcionalidad realmente cumple su propósito?
- ¿Hay métricas o indicadores que podrían ayudarnos a medir el éxito?
- Sobre los escenarios clave
- ¿En qué situaciones usarías esta funcionalidad?
- ¿Cuál es el flujo ideal desde tu perspectiva?
- ¿Existen variantes o excepciones que debamos considerar?
- Sobre las reglas de negocio
- ¿Existen restricciones específicas para esta funcionalidad?
- ¿Qué pasa si el usuario introduce datos incorrectos?
- ¿Hay algún comportamiento especial que deba seguir la funcionalidad en ciertos casos?
- Sobre la experiencia de usuario
- ¿Qué tan rápido esperas que responda el sistema?
- ¿Cómo te gustaría recibir la confirmación de que la acción se completó?
- ¿Prefieres una notificación visual, un correo, o algún otro mecanismo?
- Sobre seguridad y accesos
- ¿Todos los usuarios deberían poder acceder a esta funcionalidad?
- ¿Necesitamos permisos o restricciones especiales?
- Sobre el manejo de errores y excepciones
- ¿Qué pasa si el sistema no puede completar la acción?
- ¿Cómo debería informarse al usuario en caso de error?
- Sobre la integración con otros sistemas
- ¿Esta funcionalidad afecta o depende de otros módulos o sistemas?
- ¿Qué datos necesitamos capturar o enviar a otras áreas del sistema?
Elementos esenciales de un buen criterio de aceptación
Para que los criterios de aceptación sean efectivos, deben cumplir con estas características:
- Claridad y precisión: No deben dejar espacio a interpretaciones.
- Independencia de implementación: No describen cómo hacerlo, sino qué resultado se espera.
- Testabilidad: Deben ser verificables con pruebas manuales o automatizadas.
- Alineación con las necesidades del usuario: Siempre deben responder a lo que el usuario final necesita.
Formatos comunes para escribir criterios de aceptación
Formato tradicional
Es el más simple: una lista de condiciones que deben cumplirse.
Ejemplo:
Historia de usuario:
Yo como usuario quiero poder restablecer mi contraseña para acceder a mi cuenta en caso de olvido.
Criterios de aceptación:
- El usuario debe recibir un correo con un enlace de restablecimiento.
- El enlace debe expirar en 30 minutos.
- La nueva contraseña debe cumplir con requisitos de seguridad.
Formato Given-When-Then (Gherkin)
Este formato, popular en BDD (Behavior Driven Development), ayuda a describir escenarios de manera estructurada:
- Given: Estado inicial.
- When: Acción del usuario.
- Then: Resultado esperado.
Ejemplo:
Given que el usuario olvidó su contraseña,
When ingresa su correo en la opción “Olvidé mi contraseña” y presiona enviar,
Then debe recibir un correo con un enlace de restablecimiento.
Este enfoque facilita la automatización de pruebas con herramientas como Cucumber.
Errores comunes al redactar criterios de aceptación
- Ambigüedad: Si no es claro, cada persona lo interpretará de manera diferente. Aunque invitan a la conversación en fases tempranas, próximos al desarrollo pueden convertirse en una fuente de incertidumbre, ejemplo: si la transacción no es exitosa se deberá confirmar al usuario. Surgen varias preguntas con lo anterior ¿Cómo? ¿Qué mensaje? ¿A través de que medios? ¿Proporcionaremos al usuario alguna forma de hacer reclamos?
- Demasiado técnico: No deberían describir cómo implementarlo, sino qué resultado se espera.
- No validarlos con el equipo: Deben ser revisados en sesiones de refinamiento del backlog.
Mejores prácticas para escribir criterios de aceptación efectivos
- Involucrar a todas las partes interesadas: No es solo tarea del Product Owner, los desarrolladores y testers también deben participar.
- Refinarlos en sesiones de backlog refinamiento con el equipo: Asegurar que sean claros antes de iniciar el desarrollo.
- Hacerlos testables: Si no se pueden probar, probablemente no están bien escritos.
- Utilizar el lenguaje del usuario final: Evitar tecnicismos innecesarios.
Cómo automatizar pruebas basadas en criterios de aceptación
Los criterios de aceptación bien definidos pueden traducirse directamente en pruebas automatizadas. Algunas herramientas que permiten hacer esto incluyen:
- Cucumber (BDD, Given-When-Then).
- Selenium (Pruebas UI basadas en escenarios).
- JUnit / TestNG (Pruebas unitarias automatizadas).
Esto permite que el equipo valide rápidamente si una historia cumple con los requerimientos sin depender exclusivamente de pruebas manuales.
Checklist final para validar criterios de aceptación
- Historia de usuario validada con el usuario o stakeholder.
- Criterios de aceptación basados en necesidades reales. Evita el desperdicio, es decir, poner criterios que no serán usados.
- Ejemplos o escenarios de uso confirmados.
- Información que se capturará o que retornará la funcionalidad, y el nombre de sus campos.
- Reglas de negocio y restricciones documentadas.
- Casos de error y manejo de excepciones definidos.
- Aprobación del usuario antes de pasar a desarrollo.
Nota importante: Un buen criterio de aceptación se puede convertir en un caso de prueba, directamente. Si el tester puede escribir una prueba automatizada o manual a partir de él, es una señal de que está bien definido.
Y si quedas con muchos criterios de aceptación
Cerrando
Escribir buenos criterios de aceptación es clave en el desarrollo ágil. Mejoran la comunicación, reducen malentendidos y permiten entregar software de mejor calidad.
Si en tu equipo todavía no los documentan formalmente, este es un buen momento para comenzar.
Notas. Aclaraciones Comentarios
- De Colección: Ejemplos de Historias de Usuario de la Fuente: Los Libros de Extreme Programming (XP) - Clic aquí.
- XP esencial: Tarjeta, Conversación, Confirmación - Clic aquí.
- What's in a Story? - Clic aquí.
- En este momento de la historia existe un boom sobre la Inteligencia Artificial y lo que puede proporcionarnos el uso de agentes; es posible que en el futuro cercano muchas o todas las tareas de desarollo y testing sean ejecutadas por Agentes de IA. Amanecerá y veremos.
- La historia de las historias de usuario - Clic aquí.