Para consolidar todos los conceptos de Extreme Programming (XP), nada mejor que un ejemplo práctico. A continuación, simularemos el inicio de un proyecto siguiendo las prácticas y el flujo de trabajo de XP, desde la planificación hasta la codificación y la entrega de valor.
Imaginemos un equipo pequeño de tres desarrolladores (Ana, Carlos y Sofía), un Coach (David) y un Cliente (Laura). El proyecto consiste en crear una API REST para un sistema de blog. El equipo decide adoptar XP con iteraciones de una semana.
El objetivo de la primera semana es tener los endpoints más básicos para leer artículos, sentando las bases de la arquitectura y el proceso de trabajo.
El lunes por la mañana, el equipo se reúne con Laura para el Planning Game. Laura llega con un conjunto de tarjetas, cada una con una historia de usuario que describe una necesidad del negocio. Para la primera iteración, las más importantes son:
El equipo discute las historias con Laura para aclarar dudas. Luego, estiman el esfuerzo de cada una. Acuerdan que HU1 y HU2 son de tamaño similar, y HU3 es un poco más pequeña. Deciden que las tres historias son factibles para la primera iteración de una semana. El plan está listo.
El mismo lunes, Ana y Carlos se sientan juntos para empezar a trabajar en la primera historia (HU1) usando Pair Programming. Deciden usar Python con el micro-framework Flask. Su primera tarea es crear un endpoint `GET /api/articles`.
1. Red (Escribir una prueba que falla): Antes de escribir una sola línea de la aplicación, crean un archivo de prueba `test_app.py`. Usando `pytest`, escriben una prueba que espera que al llamar a `/api/articles`, la respuesta sea exitosa (código 200) y el cuerpo sea una lista JSON vacía.
# test_app.py
import pytest
from app import create_app
@pytest.fixture
def client():
app = create_app()
app.config['TESTING'] = True
with app.test_client() as client:
yield client
def test_get_articles_returns_empty_list(client):
"""Prueba que GET /api/articles devuelve una lista vacía al inicio."""
response = client.get('/api/articles')
assert response.status_code == 200
assert response.json == []
Ejecutan la prueba. Falla con un error 404 porque la ruta `/api/articles` no existe. ¡Están en rojo!
2. Green (Escribir el código mínimo para que pase): Ahora, en `app.py`, escriben el código más simple posible para que la prueba pase.
# app.py
from flask import Flask, jsonify
def create_app():
app = Flask(__name__)
@app.route('/api/articles', methods=['GET'])
def get_articles():
return jsonify([])
return app
Vuelven a ejecutar las pruebas. ¡Ahora pasan! Están en verde.
3. Refactor (Refactorizar y mejorar): El código es muy simple, pero deciden que los datos de los artículos deberían venir de una capa de "servicio" en lugar de estar directamente en la ruta. Crean una estructura inicial para ello, aunque por ahora solo devuelva datos falsos.
A lo largo de la semana, el equipo continúa este ciclo:
El viernes por la tarde, el equipo realiza la revisión de la iteración con Laura, la cliente. Le muestran la API funcionando en un entorno de pruebas.
Resultados de la primera semana:
En la retrospectiva de la iteración, el equipo discute qué fue bien y qué se puede mejorar. Se dan cuenta de que su manejo de errores puede ser más consistente. Deciden crear una historia de usuario técnica para la siguiente iteración con el fin de estandarizar los formatos de respuesta de error en toda la API. Así, el ciclo de mejora continua sigue adelante.