Buscar en Gazafatonario IT

Mostrando las entradas con la etiqueta Requisitos. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Requisitos. Mostrar todas las entradas

domingo, agosto 30, 2026

El espejismo del control: Cuando lo determinista se topa de frente con lo probabilístico

 

"El mayor peligro de la inteligencia artificial es, sin duda, que la gente llegue a la conclusión demasiado pronto de que la entiende". – Eliezer Yudkowsky.  ("Artificial Intelligence as a Positive and Negative Factor in Global Risk." Oxford University Press.)

Hace algunos meses escribí sobre Specification-Driven Development: un nuevo orden en el desarrollo de nuevo software con IA, donde conté de dónde vengo con esto de las especificaciones, treinta y nueve años después de mis primeros intentos de generar código sin tener que escribirlo línea por línea. Desde ese artículo no he parado. Sigo experimentando con SDD, spec tras spec, equipo tras equipo, casi con obsesión, tratando de sacarlos de la burbuja de la innovación donde muchos siguen atrapados: esa donde se hacen demos brillantes, PoC que enamoran en una presentación de viernes y el lunes siguiente nada llegó a producción, nada le cambió la vida a un usuario real.

Y en medio de ese experimento permanente me tropecé, otra vez, con la misma pregunta de siempre disfrazada de tesis novedosa: ¿quién gobierna lo que la IA hace con tu especificación? ¿Se puede tener gobernanza determinista sobre algo que, por diseño, no lo es?

Para responder a esta cuestión, volví a hacer un repaso de treinta años por los vericuetos de lo que significa una buena especificación de requisitos, hoy simplemente llamada “Spec” por obra y gracia de las nuevas tecnologías, y reviví aquellos atributos de claridad, precisión y verificación, entre otros (todo eso que aprendí, practiqué y promulgué con la IEEE 830 hace tantos años), y lo contrasté con el comportamiento que estoy observando en los practicantes actuales, sobre todo, con lo que sucede después de su elaboración, cuando esa Spec entra a un motor que, por naturaleza, no es determinista. La conversación deja de ser sobre requisitos justo ahí y se convierte en algo más incómodo.

En todo caso, la respuesta corta es “Sí”. Aunque no de la forma en que se la imagina la mayoría de los comités de "gobernanza de IA", sentados en su sala de reuniones creyendo que van a agarrar el toro por el cachos con una hoja de Excel.

La gobernanza, por naturaleza, es determinista: roles y responsabilidades fijas, políticas escritas, umbrales, puntos de aprobación, guardada bajo signos de pulcritud en los anaqueles de la gerencia de turno y sellada con incontables ISO numeral que ya nadie en la empresa recuerda, eso no cambia, así era hace 50 años y seguirá siendo así cuando nosotros ya no estemos. Lo que sí cambia es el elemento que estás tratando de gobernar. Escribí sobre esto hace más de una década hablando de Scrum y hace más de dos hablando de RUP y CMMi: las reglas del ajedrez son pocas y sencillas, pero el medio juego (esa zona donde ya no hay libro de aperturas que valga) es puro criterio, improvisación, riesgo calculado. Lo conté, por ejemplo, en Antipatrones Scrum: primer acercamiento, citando al mismísimo Schwaber: las reglas del juego son deterministas, las jugadas no.

Con la IA que escribe código pasa lo mismo, multiplicado. No puedes gobernar la línea exacta que un modelo va a escribir a las tres de la tarde con la temperatura configurada en 0.7. Gobiernas el tablero: la especificación de entrada, las reglas del entorno, los criterios de aceptación, quién firma antes de que esa pieza se mueva a producción. Y en casi todos los comités de "IA responsable" a los que me han invitado veo el mismo tejemaneje: terminan gobernando el proceso convencidos de que están gobernando el resultado, y ese resultado, con un sistema probabilístico, sencillamente no se puede garantizar. Retomo entonces al influyente, aunque controvertido Yudkowsky que cité arriba: el riesgo más grande aparece justo cuando crees que ya entendiste lo suficiente lo que está pasando y cómo está sucediendo como para bajar la guardia.

Lo que sí se puede gobernar

Pensándolo en capas, como aprendí a concebir los requisitos hace más de tres décadas:

La intención. La especificación sigue siendo el contrato, ese protocolo entre el humano y la máquina. Esto viene de mucho antes de ChatGPT, aunque hoy todo el mundo actúe como si se hubiera inventado la semana pasada. Escribí largo y tendido sobre esto en mi era preágil, cuando todavía creía que un documento de veinte, cien o hasta de doscientas páginas podía atrapar la realidad de un sistema, y terminé dejando consignada buena parte de esas ideas en mi libro Asuntos de la Ingeniería de Software, Volumen 2. Pero hoy, además de hablarle a otros humanos y de servir de apoyo al entendimiento entre las partes (humanas) sobre la solución que queremos, esa especificación le “debe” hablar a un sistema que traduce la intención en código sin ninguna garantía de hacerlo igual dos veces seguidas. Gobernar la calidad y la trazabilidad de esa especificación es la palanca más poderosa que existe. Si la Spec es floja, la gobernanza solo será ornamental.

Las barreras. Políticas convertidas en código: qué dependencias se prohíben, qué patrones de seguridad son obligatorios, qué licencias no se tocan ni con guante ni pinzas. Esto es determinista de cabo a rabo, y se automatiza sin pedirle permiso al modelo. Se aplica después, sobre lo que salió, sin importar cómo se generó.

El proceso y los puntos de control humano. Llevo años repitiendo esto hasta el cansancio: inspeccionar y adaptar no es un evento de calendario, es una actitud. Lo escribí en Nuestro Scrum empírico de todos los días y volví sobre ello en Mis notas sobre el Corazón de la Agilidad: sin esa reflexión constante, un equipo (o una organización entera) queda atrapado usando procesos que ya no sirven. Una Definición de Terminado sigue mandando, escribí acerca de esto en Sobre multifuncionalidad y la creación de un incremento de producto: llegar a la mitad del camino sin que nada alcance esa definición ya era mal presagio antes de que existiera un modelo generando el código por ti. La IA no se aprueba a sí misma su propio trabajo, faltaba más. Esa firma sigue siendo, y debe seguir siendo, humana.

La trazabilidad. Qué modelo generó qué, con qué prompt, bajo qué versión, aprobado por quién. Normas advenedizas como la ISO/IEC 42001 llegaron para que intentemos asegurarnos de que exista alguien a quien preguntarle después.

Esto ya existe: la constitución como artefacto de gobernanza

Miren, esto ya se puede tocar. En el ecosistema de Spec-Driven Development circula un archivo que hace exactamente lo que vengo describiendo: spec-kit, la herramienta de GitHub para SDD, te obliga a escribir un constitution.md antes de tocar una sola Spec, y ese archivo pesa: es el documento que la IA tiene que respetar, sí o sí, antes de generarte una línea de código. Algo así:

# Constitución del proyecto

 

## Principio 1: Ningún código a producción sin revisión humana

Toda funcionalidad generada por IA pasa por al menos un revisor humano antes de fusionarse.

 

## Principio 2: TDD no negociable

No se escribe implementación antes de que existan pruebas, aprobadas por una persona, y esas pruebas fallen primero.

 

## Principio 3: Cero secretos, cero dependencias sin licencia

Ninguna llave, token o credencial embebida. Ninguna dependencia sin licencia verificada.

 

## Principio 4: Todo criterio de aceptación debe ser verificable

Si no se puede probar automáticamente, no entra a la Spec.

En este último, como pregoné tantas veces en el pasado, podemos usar buena parte, si no toda la gobernanza de requisitos de la IEEE 830 o de los criterios FURPS+. Esta vez no entraré en detalles de algo que dejé claro hace más de 20 años, pero que quizás pueda volver a recordarles pronto.

En todo caso, ahí están: cuatro principios, cero ambigüedad. Listos para que los incorpores a tus propios desarrollos. Fíjate que ninguno le dice al modelo qué código escribir, eso ni siquiera les compete. Lo que hacen es fijar bajo qué condiciones ese código tiene permiso de existir, que ya es bastante. Esa tabla de cuatro renglones resume toda la diferencia entre gobernar el proceso y gobernar el resultado.

A propósito, valga la pena decir que, aunque OpenSpec no incluye explícitamente una "constitution.md" al estilo de Spec-Kit, nada evita crearla y ponerla en una capa de principios permanentes paralela a AGENTS.md, por ejemplo, con versionamiento, con un dueño explícito, con reglas concretas, entre otros aspectos, y referenciarla desde el flujo de OpenSpec. Este asunto está fuera del ámbito de este artículo, pero regresaré también a ello en otra oportunidad.

Lo que no se puede gobernar, aunque te vendan lo contrario

Hay que seguir anunciándolo a los cuatro vientos, como si se tratara de "la exhibición del más fabuloso hallazgo de los nasciancenos": el razonamiento interno del modelo no se gobierna. La línea exacta de código, tampoco. Ni siquiera puedes prometer que el mismo prompt, dos veces, te devuelva lo mismo. Un desarrollador senior con experiencia, frente a un problema nuevo, casi siempre converge hacia soluciones parecidas cuando entendió bien el encargo, al menos, ese era mi caso. Un modelo generativo, no. Le pides lo mismo cinco veces y te devuelve cinco soluciones distintas, todas con cara de que funcionan.

Lo he vivido con mi propia sangre, mientras experimento y ayudo a otros a experimentar con SDD: misma intención, distinta spec; misma spec modificada manualmente por mí sin llegar a la estrechez absurda de la restricción perfecta, distinto resultado. No una, no dos. Varias veces.

Y tampoco puedes prometer corrección garantizada para problemas verdaderamente nuevos. Esa fue siempre una promesa incumplida de la ingeniería de software prescriptiva, y la IA tampoco la va a cumplir ahora. Lo único que hace es ponernos esa promesa incumplida en la cara, sin anestesia. Cuarenta años desarrollando software me soportan.

¿Hasta qué punto, entonces?

Hasta que dejes de perseguir una certeza que, sencillamente, no vas a conseguir, y empieces a trabajar con algo bastante más útil: confianza calibrada. ¿Como así?  Sí, capas deterministas alrededor de un núcleo que no lo es. Verificación automatizada que no se preocupa por cómo llegaste al resultado, sino por lo que eres capaz de demostrar. Y personas (sí, humanos) con poder real para decir “no” cuando equivocarse cuesta caro. Eso es defensa en profundidad aplicada a un problema que antes ni siquiera teníamos. Y hay otra cosa: también tienes que aprender a delegar en la IA. Sí, delegar. Como antes lo hacías con tus pares o con las personas que estaban a tu cargo.

La gobernanza de IA para desarrollo de software se mete en las circunstancias bajo las que el código puede nacer, en qué pruebas tiene que sobrevivir y, sobre todo, en a quién le toca firmar cuando algo estalla en producción. Eso es, prácticamente, todo lo que alcanza a tocar. El código en sí mismo, línea por línea, queda fuera de su alcance directo, y cualquiera que te prometa lo contrario te está intoxicando con un tufillo disfrazado de perfume cinco estrellas mientras deja en tu escritorio la PPTx con la que harás alucinar a todos en el próximo comité corporativo.

Hace unos meses escribía que de nada sirve tener una Definición de Terminado impecable si, sprint tras sprint, no estás entregando valor real ni moviendo la aguja del negocio (lo dejé registrado en Tu Definición de Terminado no funciona y lo sabes). Con la IA pasa exactamente igual, solo que ahora hay más comités, más checklists, más gente convencida de que un marco de vigilancia es lo mismo que un producto que a alguien le importe.

Todo lo anterior para decirte que si me preguntas qué prefiero, un desarrollo blindado en gobernanza que no aporta valor real, o un desarrollador con IA que entrega, sin pedir tanto permiso, algo que el cliente ama de verdad, prefiero lo segundo cada vez. Y que los marcos de inspección se acomoden a esa verdad. No al revés.

martes, febrero 10, 2026

Specification-Driven Development: un nuevo orden en el desarrollo de nuevo software con IA

 Specification-Driven Development: un nuevo orden en el desarrollo de nuevo software con IA

Dime de dónde vienes y te diré para dónde vas

En el pasado “soñábamos” con pasar de los diseños de software modelados en alguna herramienta de “cuarta generación” al código sin tener que escribirlo. Mis primeros intentos de generar software datan de 1987 cuando trabajé con mi profesor de algoritmos y luego de sistemas expertos Fabián Ríos y mi amigo Fabio Ruíz en un compilador para el lenguaje LEXICO (creado por Fabián) para el cual también hicimos algunos traductores a los lenguajes populares de la época: C, Pascal, C++ y BASIC, entre otros, y creamos un entorno de programación que permitía a los nuevos estudiantes de Ingeniería de Sistemas correr y probar sus programas escritos en  LEXICO.

Con Fabián y Fabio y otros amigos fundamos el entonces Equipo de Ambientes de Programación, dedicado a estos menesteres, en los que también hicimos nuestros primeros pinitos en inteligencia artificial con el lenguaje PROLOG y con Lisp. De hecho, Fabián escribió el primer intérprete de LEXICO en PROLOG y nosotros lo probamos, mucho antes de construir el compilador.

En los 90 pasamos por las herramientas generadoras de código a partir de diagramas, en los 2000 estos diagramas eran descritos usando lenguaje UML, incluyendo los casos de uso, una técnica de especificación de requisitos funcionales y no funcionales que usábamos con la metodología RUP. Fueron intentos incipientes. Normalmente teníamos que escribir el 99,9 % del código fuente, o todo.

Escribí miles de líneas de código en más de una docena de lenguajes de programación de todo tipo. Pero dejé de programar hace 2 décadas, aunque he seguido acompañando equipos de desarrollo de software, incluso de vez en cuando todavía me llaman para resolver algún problema de rendimiento en bases de datos relacionales.

Hoy las cosas han cambiado con la inteligencia artificial. Es evidente que la tarea principal del programador cambió. De hecho, ya hemos sido advertidos de que algunas herramientas de IA podrán reemplazar a los programadores puros y duros en muy poco tiempo. Por ejemplo, y a propósito de compiladores, en Anthropic acaban de construir un compilador C con Opus 4.6 usando equipos de agentes IA en solo dos semanas, algo que dice mucho sobre el futuro del desarrollo autónomo de software. Nuestros amigos de Anthropic dicen que hasta el 90 % de su código será escrito por sus nuevas herramientas en los próximos tres a seis meses. Es solo cuestión de “cuando” el resto de nosotros lo hará. Pero llegaré a esto un poco más tarde.

El caso de los requisitos de software, los casos de uso y las historias de usuario

Cuando de desarrollar software se trata, mi mayor interés siempre fue la comunicación. Primero entre personas y luego entre personas y las máquinas. Por eso este asunto de los requisitos en todos sus colores, tamaños y sabores siempre ha estado en la palestra de mis prácticas favoritas. Y durante las tres últimas décadas he estudiado el asunto a fondo, he realizado miles de experimentos, pero también he ayudado a implementar cientos de productos de software en algunas de las más grandes empresas de Colombia y algunas de Latinoamérica.

En los 90 con requisitos a la usanza tradicional, grandes documentos de texto en “lenguaje natural”. Hice lo mejor que pude. Pero desde finales de esa década y toda la siguiente usé casos de uso. Escribí, revisé, corregí y ayudé a escribir miles de casos de uso y también diseñé, planteé arquitecturas de software, programé y probé a partir de ellos. Escribí mucho sobre el tema en mi blog Gazafatonario. Finalmente, toda esta experiencia quedó consignada en mi libro Asuntos de la Ingeniería de Software, Volumen II, aunque todos los artículos originales siguen en mi blog.

Los casos de uso eran una buena práctica, aunque bastante exigente para todos los involucrados, incluyendo el mismo usuario. Así que entré en la era “ágil” y empecé a trabajar con historias de usuario. Fui a la fuente. Extreme Programming. Lo primero que supe fue que se plantearon originalmente de manera escueta, diciendo que “son como casos de uso”, en la primera edición del libro de Kent Beck. Me pareció natural y rápidamente adopté e implementé el concepto en los equipos que acompañaba.

También, casi todo esto quedó registrado en los libros que publicara con mi gran amigo Jorge Abad, Historias de usuario: una visión pragmática, Volumen I y Volumen II. Y también, casi todo el material de estos libros pueden leerlo en nuestros blogs. El de Jorge es Lecciones Aprendidas.

Distintas técnicas, mismo objetivo: lograr que todos los involucrados entiendan lo que quiere el usuario y conseguir que todos entiendan exactamente lo mismo. Siempre fue difícil. Aunque con el enfoque ágil abreviamos los tiempos de desarrollo y entrega, en el proceso la información transmitida igual se corrompía. Lo solucionábamos más rápido, pero el retrabajo siempre estaba a la orden del día.

No me malentiendan. Yo sí puedo decir que tanto aquellas técnicas como estas son muy buenas y funcionan, con los equipos donde participé pusimos en producción muchos sistemas de información que hoy se continúan usando. De hecho, incluso los casos de uso, ni hablar de las historias de usuario, hoy reciben un nuevo aire con esto de la Spec-Driven Development con IA, que es el asunto que nos convoca.

Entra la inteligencia artificial generativa

Sé que me extendí en la historia, pero para mí era muy importante contarles de dónde vengo, ahora sí, para decirles hacia dónde voy.

Así que me voy a saltar toda la perorata de los últimos tres años, la IA no viene a reemplazarte y todo ese blablablá ampliamente difundido, comentado y embutido hasta la saciedad en nuestras mentes, e iré directo al punto: allí estaba la herramienta con la que había soñado hace cuatro décadas para generar código, pero los primeros intentos no funcionaron. Por muy buenos que eran los “prompts”, no salía nada más allá de lo que yo mismo podía hacer con otras herramientas.

Y empecé a iterar, a refinar, a usar la IA como colaboradora de primera categoría. A descargar en ella todo lo que creía que era útil para que pudiera construir mejores productos, al menos, mejores MVP. Y entonces hace por allá un año escuché o leí de SDD y las cosas tomaron su curso natural, en el fondo, era lo que había estado haciendo en los dos últimos años, alimentar o instruir a la IA con especificaciones más precisas, no ambiguas… ¡Hey, esperen! Esto me recuerda algo:

·       Instrucciones legibles

·       Otra información relevante que posea alguna influencia sobre esas instrucciones

·       Identificación unívoca de cada instrucción

·       Instrucciones correctas

·       No ambiguas

·       Completas

·       Consistentes

·       Verificables

·       Modificables

·       Trazables

Es difícil lograr todo eso de una buena vez, alguna vez, pero hay que hacer el mejor trabajo posible. Recordé aquel modelo de la IEEE 830 de 1998, el estándar de requisitos según el prestigioso Instituto de Ingeniería Eléctrica y Electrónica, bajo el cual escribí y modelé requisitos con distintas técnicas y en diferentes formatos durante muchos años.

Pero también empecé a hablarle a la IA de usabilidad, de confiabilidad, de desempeño, de capacidad de soporte e, incluso, de restricciones de diseño y requisitos de implementación. Y entonces también recordé ese otro modelo FURPS+ que complementó aquel estándar. ¡Ah, y la arquitectura! Ya llegaremos a ese nivel.

De todo esto ya escribí y publiqué. Por eso era necesario contar toda aquella historia previa. Lo de ahora es “empaquetar” todo eso en una especificación estructurada, práctica y sistemática y entregársela a una IA para que genere el código que queremos, el producto que necesitamos. Eso es, más o menos, Specification-Driven Development o SDD y no me voy a desgastar nombrándola en español como hice antes muchas veces con incontables conceptos que nacieron en inglés.

“Hola, mundo” con SDD

Un ejemplo para terminar. Así empecé hace tres décadas escribiendo sobre requisitos y casos de uso, y hace década y media sobre historias de usuario. Vendrá mucho más sobre esto, pero los dejaré con un ejemplo breve. La gran diferencia ahora es que podemos tener el resultado de esa especificación en minutos, cuando no en segundos. Y podemos iterar, ajustar, repetir, y en medio de todo ello, verificar, en muy muy muy corto lapso de tiempo. Veamos el ejemplo.

Hoy por hoy, escribir un mensaje en WhatsApp o un correo electrónico se ha convertido en algo común, pero nunca estás seguro de si suenas demasiado agresivo, muy tímido o poco profesional. La solución: una caja de texto donde escribes o pegas tu mensaje y la IA te ofrece 3 versiones instantáneas: una "Directa y Ejecutiva", otra "Empática y Amigable" y una más "Mínima (estilo Gen-Z)". ¿Te gusta la idea? A mí sí. Es un “Sintonizador de Tono Comunicacional”. Les dije que este asunto de la comunicación entre personas está en mi ADN. Aquí vamos entonces.

Una Specification para IA incluye (o debe incluir) la visión de lo que quieres:

Una herramienta de productividad diseñada para eliminar la ansiedad en la comunicación digital. Permite a los usuarios transformar mensajes crudos o mal estructurados en versiones optimizadas según el contexto social, asegurando que el mensaje sea efectivo y el tono sea el adecuado.

Incluso puedes probar eso como un prompt directo a tu IA favorita. Las posibilidades son infinitas. Pero con eso no vas a obtener lo que quieres, al menos no de inmediato. Ni siquiera en las mejores herramientas IA que existen hoy para crear productos digitales.

Una Spec también incluye la Estructura de la Interfaz (UI). Vamos con una parte de esta:

A. Panel de Entrada

Área de Texto: Un `textarea` sin bordes pesados, con una tipografía Serif o Sans-serif elegante.

Contador de caracteres: Discreto en la esquina inferior.

Botón de Acción: "Sintonizar Mensaje" (Efecto de brillo suave al pasar el mouse).

 

B. Panel de Resultados

Un grid de 3 columnas (o 1 columna en móvil) que muestra tres variantes:

1. Variante: Directa & Ejecutiva

Color: Azul Cobalto (Focus en eficiencia y claridad).

Badge: "Profesional".

Como esta App usa IA necesitamos un “system prompt” mínimo viable. Es otra parte de la Spec. Les dejaré esta sección aquí completa:

3. Lógica de Inteligencia Artificial (Prompt de Sistema)

Para generar los resultados, la aplicación debe enviar este contexto al LLM:

> "Actúa como un experto en comunicación asertiva y psicología organizacional. Tu tarea es reescribir el mensaje del usuario en 3 versiones estrictamente diferenciadas.

> Reglas:

> 1. Directo & Ejecutivo: Elimina rellenos, ve al grano, usa lenguaje formal pero activo. Ideal para correos a superiores o clientes.

> 2. Empático & Amigable: Usa lenguaje cálido, validación de sentimientos y suaviza peticiones. Ideal para equipos cercanos o situaciones delicadas.

> 3. Minimalista: Reduce el mensaje a su esencia absoluta (máximo 15 palabras). Ideal para Slack, WhatsApp o equipos rápidos.

>

> Output: Devuelve un JSON con las llaves: `profesional`, `amistosa`, `minimalista`."

Sí, por supuesto puedes probar el prompt directamente en la IA de turno.

Pero la Spec también puede incluir requisitos técnicos e interacciones, como “Cada tarjeta de resultado debe tener un botón de ‘Copiar’”, ¿lo recuerdan? Precisión, cero ambigüedad, completitud, etcétera, etcétera; también pueden tener historias de usuario o hasta casos de uso, pero eso será motivo de próximos artículos; incluso puede tener y es bueno que tengan instrucciones para la IA que se va a usar. Y mucho más.

Todo esto lo almacenan en un documento Markdown (.md) y se lo pasan a la IA. Esta vez usé Lovable, es apenas el “Hola, mundo” de SDD. Les dejo el documento completo para su descarga.

[Enlace a la especificación]

El resultado, en modo oscuro y colores vibrantes, dos de los requisitos precisos, consistentes y verificables que encontrarán en la Spec completa:

Me cuentan cómo les va corriendo la Spec que les dejé. En el próximo artículo les hablaré más en detalle de la anatomía de una Spec y avanzaremos en esto.

Hace poco, mi también gran amigo Daniel Ramírez decía en un artículo que “La vibra no escala, la arquitectura sí” y preguntaba al final: “¿En qué punto una automatización deja de ser una PoC y se convierte en un sistema que requiere una arquitectura de verdad?” Bueno mi estimado Daniel, SDD es un paso, uno grande, en esa dirección.

Déjenme saber en el foro qué se les ocurre que hagamos con esto.

 

Lucho Salazar

Villa de Nuestra Señora de La Candelaria de Medellín, 5 de febrero de 2026

39 años después.




Video generado con Grok

jueves, febrero 01, 2018

Diferencias en el tratamiento de los requisitos entre los enfoques Cascada y Ágil


¡Una pregunta de un viejo amigo me llevó una vez más por este sendero!
Es un hecho. Muchos profesionales trabajan actualmente en circunstancias desafortunadas y, sin embargo, no toman la iniciativa de cambiar su situación porque están condicionados a un formato de seguridad, conformidad y conservación, donde todo puede parecer tranquilo pero, en realidad, nada es más perjudicial para el espíritu innovador y de transformación que requerimos hoy quienes vivimos en los tiempos del VUCA*.
En particular, durante la transición de un enfoque en cascada a uno Ágil tenemos que lidiar con la búsqueda de medios y maneras para acortar el tiempo de salida al mercado y entregar productos de alta calidad y de más valor, más temprano y más frecuente y, si es posible, a un costo menor. Sin embargo, el camino hacia la Agilidad puede ser escabroso, con baches riesgosos y con personas deambulando por allí erráticamente y hasta en dirección opuesta, incluso con temor a o sin saber cómo avanzar.
Y uno de los aspectos que empiezan a diferenciar en profundidad el uso de uno u otro enfoque es este de los requisitos. Abordamos este asunto con Carlos Gil, Johnny Ordoñez, Carlos Quiroga, Luis Mulato y el grandioso equipo de coaches del Scrum Coaching Retreat Cartagena y, como siempre, llegamos a algunas conclusiones que se mueven en el terreno de los principios y, más en el fondo, de los valores Ágiles, la cultura ágil, el Ágil es algo que eres:

  • En Ágil no hablamos de requisitos, más bien de respuestas a necesidades y, en otros casos, de hipótesis de cosas que queremos aprender. Cambiar el enfoque de “requisito” a “necesidad” o respuesta a necesidad, genera un sentido profundo de empatía entre todos los interesados, es decir, equipo de desarrollo de producto y usuarios o clientes finales.
  • A propósito de clientes finales, en Ágil, el cliente siempre es el centro de atención. Esto habilita a los equipos a buscar las mejores formas de suplir esa necesidad o de comprobar las hipótesis. Estas en últimas son necesidades de aprendizaje.
  • Creemos que esta es la distinción más grande entre las dos propuestas: el requisito te lleva a algo preestablecido, definitivo o definible claramente. Hablar de necesidades o de hipótesis abre la puerta al cambio.
  • En el enfoque Cascada se definen experiencias orientadas al proceso, con momentos de interacción preconcebidos por los formularios y procesos definidos en los requisitos, y aun hablamos de interacciones y no de conversaciones con las soluciones tecnológicas. En Ágil, aspectos como la experiencia de usuario, momentos de verdad, conversaciones, son esenciales para la definición de la historia de usuario que guía el desarrollo de producto.
Vamos con las disparidades entre uno y otro enfoque cuando de requisitos se trata
Son muchas las diferencias que existen en la forma de abordar los requisitos de un producto cuando usamos (o usábamos) la forma Cascada y lo que hacemos ahora, motivados por el pensamiento Ágil. Estas que describo a continuación son apenas algunas de ellas, algunas más relevantes que otras pero significativas todas al fin y al cabo.
Al principio del proyecto o del esfuerzo de desarrollo

En Cascada se toman o "levantan" (casi) la totalidad de los requisitos al principio del proyecto, y de muchos de ellos se hace con gran detalle. En Ágil no. Se establece un alcance, sí, una visión, pero de muy alto nivel, muy horizontal, es decir, no se llega a ningún detalle excepto quizás para esas necesidades de los dos primeros Sprints (a lo sumo), la porción de producto que se va a construir durante las primeras de cambio. El llamado Mínimo (o Minimísimo) Producto Viable.
En Cascada nos tardamos semanas y hasta meses haciendo esta primera actividad. En Ágil nos tardamos unas pocas horas, a lo sumo unos pocos días, se establece un bloque de tiempo (time-box) y cuando este se acaba, se acaba.
En Cascada participa una persona del lado del equipo de desarrollo o un "subequipo", el o los analistas funcionales o de requisitos. Quizás en algún momento entra uno que otro rol, como el Arquitecto de Software. En cualquier caso, no participa todo el equipo. En Ágil participa todo el equipo de desarrollo desde el inicio, escuchando a los usuarios e interesados en el producto.
Más adelante, cuando el proyecto está en marcha
En Cascada se refinan los requisitos, hay ajustes, controles de cambios. El sobrevaluado CCC (léase Comité de Control de Cambios) que se reúne el último jueves de cada mes, mientras el cliente ve impaciente cómo su competencia se adelanta y le quita parte del mercado. Mientras tanto, en Ágil se van refinando los requisitos iteración tras iteración. Siempre nos concentramos en lo que se va a construir en los siguientes 2 sprints o iteraciones, a lo sumo. Más tiempo no, porque las cosas pueden cambiar. Los equipos Ágiles aprovechamos los cambios para brindar ventaja competitiva a nuestros clientes.
En Cascada los requisitos siempre los "administra" una persona o un subequipo (analistas), con los usuarios. En Ágil hay un Dueño de Producto (representante de los usuarios), pero la responsabilidad es de todo el equipo.
En Cascada los requisitos se construyen, como sabemos, siguiendo un proceso secuencial donde ellos se tratan aparte y son una entrada al resto de ese proceso; además, el producto se entrega como un todo. En Ágil se construye un incremento del producto en cada iteración (de muy pocos días), esto es, producto probado y funcionando con valor, potencialmente desplegable y que genera retorno de la inversión (ROI) o, al menos, permite recibir retroalimentación, con lo que podemos aprender muchísimo del comportamiento y de la reacción de los usuarios al uso del producto.
En Cascada normalmente el orden de construcción lo decide el equipo de desarrollo (quizás en cabeza de un arquitecto o un subequipo). En Ágil el orden de construcción lo decide el usuario (dueño de producto), es él quien tiene la última palabra sobre esto.
En Cascada, el énfasis en cuanto a requisitos está en la especificación (documentación) de los mismos, en otras palabras, en escribir y escribir requisitos. En Ágil, el énfasis está en la conversación que tienen los usuarios o su representante (dueño de producto) con el equipo de desarrollo. Esta conversación es cara a cara y continua, durante todo el proyecto o esfuerzo de desarrollo.
Esta última característica es lo que nos empieza a volver ágiles, cuando lo logramos nos damos cuenta que estamos usando el pensamiento Ágil y estamos dejando atrás la cascada y otras formas tradicionales de trabajo.
En Cascada se espera que prácticas de aseguramiento de calidad permitan que se entregue un producto que cumpla con casos de prueba previamente definidos y aprobados con el área de negocio. En Ágil damos espacios a prácticas como TDD y BDD para guiar la definición de los criterios de aceptación, identificando de manera temprana la respuesta real que espera el usuario final, la prueba es guiada por la retroalimentación continua, lo cual mejora el uso y por lo tanto la aceptación del usuario.
Y sobre medios o herramientas para “recolectar” y administrar requisitos
Una diferencia en cuanto a los medios o mecanismos para "recolectar" requisitos:
En Cascada se usan medios como los documentos escritos tradicionales llenos de expresiones tipo "el sistema debe hacer esto" o "el sistema debe hacer aquello", o se usan mecanismos como casos de uso, entre otros. En cualquier caso, como mencioné antes, la fuerza está en elaborar grandes cantidades de documentación de requisitos. Escribí mucho sobre esto aquí en el Gazafatonario durante la década pasada y publiqué un libro al respecto. Lo pueden encontrar en Amazon.
En Ágil, por su parte, usamos medios o mecanismos que promuevan la conversación entre los interesados (usuarios y equipo de desarrollo). Las Historias de Usuario se han constituido en el medio esencial para esto. Pueden encontrar una especie de índice de mis artículos y propuestas y las de mi gran amigo Jorge Abad sobre este tema en bit.ly/lashistoriasdelucho.
Ahora sí, cuéntame en el foro de otras diferencias a la hora de recolectar y administrar requisitos o necesidades que consideres importantes.



*VUCA: siglas en inglés de Vulnerabilidad, Incertidumbre, Complejidad, Ambigüedad

miércoles, junio 14, 2017

De las Reuniones de Requisitos - 1 -


Empiezas a construir una solución errónea y a nadie le importa...
¡Solicitas una reunión de requisitos y todo el mundo pierde la cabeza!

domingo, junio 26, 2016

¡El tamaño sí importa!


Vamos al grano. Si la mayoría de tus historias de usuario llegan a “Terminado” apenas unas pocas horas antes de la Revisión del Sprint, todavía pueden ser más pequeñas. Tu equipo debería tener historias tan pequeñas que las puedas finalizar durante las primeras horas o días del Sprint, dependiendo de la duración de este. Así te aseguras desde las primeras de cambio que el equipo está siendo productivo, está enfocado y que van a entregar valor al final de la iteración. ¡Después de todo, finalizar una tarea aumenta la moral del equipo!
Aunque el objetivo de un Sprint no debe medirse en número de historias de usuario a terminar (implementar), sino al cumplimiento de un objetivo específico, siempre es mejor “prometer” o planear terminar varias historias pequeñas o muy pequeñas que muy pocas historias medianas o grandes.
Es evidente: si tienes 10 historias en tu lista de pendientes del sprint (alias el backlog del sprint), y no terminas 2, es mucho mejor que si solo tienes 4 y terminas 2. En ambos casos fallaste en el mismo número de historias, pero en el primer escenario tuviste un acierto del 80% mientras que en el segundo apenas llegaste a la mitad de la promesa del sprint. El resultado es menos alentador si las historias terminadas son dos de 3 puntos y dejaste sin terminar o aun a punto de terminar dos historias de 13. Solo cumpliste con 6 de los treinta puntos que prometiste.
Hablando de puntos, una buena medida, algo que me ha funcionado casi siempre, es implementar historias cuyo puntaje no sobrepase entre una décima parte y una sexta parte de la velocidad del equipo. Es decir, si la velocidad del equipo de desarrollo es 30 puntos por Sprint, las historias a implementar no deberían ser más grandes de 3 a 5 puntos. Historias de ½, 1 y 2 puntos siempre son bienvenidas en este escenario.
Ahora bien, el tamaño de las historias es un concepto relativo. Un equipo de 7 o 9 personas no ve igual una historia de usuario en un sprint de 3 o 4 semanas que un equipo de 3 o 5 personas en un sprint de 1 o 2 semanas. Pero algo en lo que todos estamos de acuerdo es que, una vez terminadas, las historias deben proporcionar valor al negocio. Las cosas así, otro indicador de “pequeño” es Pareto.
El objetivo siempre es encontrar ese 20% de la historia (de funcionalidades que se van implementar vía esa historia) que genere o entregue el 80% del valor total de la misma. A partir de allí, la división se hace de manera orgánica, adicionando historias al backlog de producto que complementen la historia de “más valor”.
También ayuda el nivel de entendimiento de toda la historia y qué tan rápido llegamos a entenderla por completo. Un índice de que quizás la historia no es pequeña es que no la hemos terminado de entender, quizás no están claros algunos de los criterios de aceptación o hay nubes en la conversación (la c de conversación de la historia) relacionadas con los requisitos funcionales o no funcionales a implementar.
El Principio de Sweepnoise, de mi amigo Leonardo Agudelo, ilustra muy bien este punto:


Finalmente, no solo la S de INVEST indica que la historia es pequeña (Sucinta). Un indicativo de que quizás no lo es tanto, es que  algunas partes de la misma (o toda la historia) no sean negociables o que no haya consenso en su estimación o que tengamos dudas acerca de si es posible conducirla a través de un proceso que nos asegure la calidad del producto terminado o de que incluso tenga dependencias con otra(s) historia(s).

Comparte conmigo y con los demás lectores del blog lo que piensas sobre este asunto del tamaño, ¿importa? ¿No importa? ¿Qué haces habitualmente para dividir tus historias de usuario? Cuéntanos tus heurísticas.
---------------------------------------------------------------------------------------------------------------
Para saber más sobre historias de usuario, puedes leer mi artículo introductorio:
Historias de Usuario: un nuevo orden en los requisitos del software:
http://www.gazafatonarioit.com/2013/07/historias-de-usuario-un-nuevo-orden-en.html

Para saber más de los criterios INVEST de las historias de usuario puedes leer mi serie de artículos sobre el asunto.
La serie de artículos "Escribiendo Historias de Usuario Altamente Efectivas":
Escribiendo Historias de Usuario Altamente Efectivas, 1 - Introducción
Escribiendo Historias de Usuario Altamente Efectivas, 2 - Independiente
Escribiendo Historias de Usuario Altamente Efectivas, 3 - Negociable
Escribiendo Historias de Usuario Altamente Efectivas, 4 - Valiosa (y Valuada)

Y este otro:

De historias de usuario, culturas y del arte de narrar historias


También puedes visitar el blog Lecciones Aprendidas de mi amigo Jorge Abad:
Video de explicación: Cómo se construyen historias de usuario
Ejemplo: Una historia de usuario - Listado de Morosos
Ejemplo de historia de usuario : Ingreso al sistema
http://www.lecciones-aprendidas.info/2015/03/ejemplo-de-historias-de-usuario-ingreso.html