¿Qué es Trunk-Based Development?

¿Qué es Trunk-Based Development?

Trunk-Based Development (TBD) es una estrategia de control de versiones que promueve la colaboración continua y la integración frecuente de cambios en una única rama principal del código, conocida como "trunk" o "main". Este enfoque busca minimizar los conflictos de integración y acelerar el ciclo de entrega de software. A continuación, se presenta un resumen detallado de los principios, beneficios y consideraciones clave de TBD.([Atlassian]1, [Harness.io]2)


¿Qué es Trunk-Based Development?

Trunk-Based Development es una práctica de gestión de control de versiones en la que los desarrolladores integran pequeños y frecuentes cambios en una rama principal compartida, denominada "trunk" o "main". Este modelo evita la creación de ramas de desarrollo de larga duración, promoviendo en su lugar la integración continua y la entrega rápida de software.

A diferencia de otros enfoques como Git Flow o Feature Branching (en la imagen), que fomentan el uso de múltiples ramas (por ejemplo, develop, release, hotfix, feature/*), Trunk-Based Development busca simplificar el flujo de trabajo y reducir los riesgos de integración tardía.

Mientras Git Flow es útil en entornos con ciclos de lanzamiento largos y estructuras más formales, Trunk-Based Development está más alineado con metodologías ágiles y DevOps, donde la prioridad es la automatización, la productividad y la colaboración constante entre equipos.

Al eliminar la complejidad innecesaria del manejo de ramas prolongadas, esta estrategia facilita el testing automatizado, el deployment continuo y una mayor calidad en el software entregado.

TBD


Principios fundamentales de TBD

Los iremos desarrollando a lo largo de este artículo. De momento te los enumero:

  1. Integración continua: Los desarrolladores integran sus cambios en la rama principal varias veces al día, lo que facilita la detección temprana de errores y reduce los conflictos de integración.
  2. Ramas de corta duración: Si se utilizan ramas, estas son de vida corta, generalmente de horas o pocos días, y se integran rápidamente al trunk.
  3. Revisión de código continua: Las revisiones de código se realizan de manera continua y rápida, lo que mejora la calidad del código y facilita la colaboración entre desarrolladores.
  4. Automatización de pruebas: Se implementan pruebas automatizadas que se ejecutan con cada integración para garantizar la estabilidad y calidad del código.
  5. Uso de feature flags: Se emplean banderas de características para activar o desactivar funcionalidades en producción sin necesidad de desplegar nuevo código, permitiendo una mayor flexibilidad y control.

Beneficios de Trunk-Based Development

  • Reducción de conflictos de integración: Al integrar cambios frecuentemente, se minimizan los conflictos que suelen surgir al fusionar ramas de larga duración.
  • Entrega continua: El código en la rama principal está siempre en un estado desplegable, lo que permite realizar entregas frecuentes y rápidas.
  • Mejora en la calidad del código: Las revisiones continuas y las pruebas automatizadas contribuyen a mantener un código de alta calidad.
  • Mayor colaboración: Al trabajar en una única rama compartida, se fomenta la colaboración y comunicación constante entre los miembros del equipo.

Comparación con GitFlow

Mientras que GitFlow utiliza múltiples ramas de larga duración para gestionar el desarrollo, las correcciones y las versiones, TBD se centra en una única rama principal con integraciones frecuentes. GitFlow puede ser más adecuado para proyectos con ciclos de lanzamiento definidos y necesidades de mantenimiento específicas, mientras que TBD es ideal para equipos que buscan una entrega continua y rápida. ([Harness.io]2)

Paso 1: Establecer una Rama Principal Compartida

Introducción

El primer paso fundamental para adoptar Trunk-Based Development (TBD) es establecer una rama principal compartida como centro neurálgico del desarrollo. Esta rama es comúnmente denominada main o trunk, y todos los desarrolladores integran directamente (o a través de ramas muy breves) su trabajo en ella.

Esta práctica representa un cambio de paradigma frente a otros flujos de trabajo más tradicionales como Git Flow, donde las ramas de desarrollo (develop, feature/*, release/*, hotfix/*) son fundamentales. En TBD, simplificamos la topología del repositorio para maximizar la velocidad de integración y minimizar la divergencia.


¿Por qué una sola rama?

Mantener una única rama principal compartida tiene los siguientes beneficios:

  • Evita la deriva de código entre ramas largas.
  • Promueve la integración continua, ya que todos los cambios convergen rápidamente.
  • Minimiza el coste de la fusión, al hacer merges pequeños y frecuentes.
  • Aumenta la visibilidad del estado actual del producto, porque lo que hay en main es lo que hay.

Pasos para establecerla correctamente

1. Nombrar la rama principal

La convención moderna recomienda usar main como nombre de la rama principal en lugar de master, por razones de claridad y neutralidad. En proyectos más antiguos, puedes renombrar así:

git branch -m master main
git push -u origin main
git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/main

2. Bloquear el uso de ramas largas

Configura el entorno de desarrollo y los repositorios (por ejemplo, en GitHub, GitLab o Bitbucket) para:

  • Restringir la creación de ramas de larga duración.
  • Desalentar el uso de ramas develop, release, etc.
  • Establecer reglas claras para pequeñas ramas temporales (máx. 1–2 días).

3. Activar protección y revisión en main

Aunque TBD impulsa la integración frecuente, eso no significa que se omita la calidad. Puedes:

  • Activar branch protection rules que exijan que los commits a main pasen por PR (pull request).
  • Requerir revisiones ligeras o rotativas.
  • Automatizar pruebas para impedir integraciones defectuosas.

En GitHub, por ejemplo:

Settings > Branches > Branch Protection Rules > Require status checks to pass before merging

4. Automatizar la integración y las pruebas

Cada cambio en main debe:

  • Ser testeado automáticamente mediante CI (por ejemplo, GitHub Actions, GitLab CI/CD, CircleCI).
  • Lanzar procesos de despliegue automáticos si corresponde (CD).

Este pipeline debe ser rápido (<10 minutos idealmente), confiable y visible para todos.

TBD

5. Educar al equipo

Cambiar a TBD requiere compromiso del equipo. Algunas acciones útiles:

  • Realizar formaciones o talleres sobre flujo de trabajo con una rama compartida.
  • Establecer normas: “nunca rompas main”, “integra al menos una vez al día”, “usa feature toggles”, etc.
  • Incentivar la colaboración en cambios grandes para evitar bloqueos.

Buenas prácticas adicionales

  • Commits pequeños y atómicos: Evita grandes commits que dificulten las revisiones y el troubleshooting.
  • Mensajes de commit claros: Usa convenciones como Conventional Commits (feat:, fix:, refactor:…).
  • Feature toggles: Activa/desactiva funcionalidades en producción sin necesidad de ramas largas.

Veamos un ejemplo de como activar una nueva funcionalidad con feature toggle en Python

Supongamos que estás desarrollando una API y quieres introducir una nueva funcionalidad de búsqueda avanzada, pero sin romper la versión actual en producción. En lugar de crear una rama larga, usas un toggle para activarla o no:

# config.py
FEATURE_FLAGS = {
    "advanced_search": False  # Cambia a True para activarla
}
# main.py
from config import FEATURE_FLAGS

def basic_search():
    return "Ejecutando búsqueda básica..."

def advanced_search():
    return "Ejecutando búsqueda avanzada con filtros..."

def search():
    if FEATURE_FLAGS["advanced_search"]:
        return advanced_search()
    return basic_search()

if __name__ == "__main__":
    print(search())

Ahora hacemos commit, dejando un mensaje claro:

git add main.py config.py
git commit -m "feat: añade feature toggle para búsqueda avanzada"
  • feat: indica que estás añadiendo una nueva funcionalidad al código (útil para changelogs automatizados).
  • El resto del mensaje describe claramente qué se está incorporando: el feature toggle para activar o desactivar la búsqueda avanzada.

Otros ejemplos comunes de mensaje en el commit incluirían:

  • fix: corrige error al desactivar la búsqueda avanzada
  • refactor: reorganiza lógica de búsqueda sin cambiar funcionalidad
  • test: añade pruebas unitarias para toggle de búsqueda avanzada

Posibles dificultades

  • Rupturas accidentales: Si alguien introduce código defectuoso en main, todos se ven afectados. Por eso CI y revisión son imprescindibles.
  • Resistencia al cambio: Equipos acostumbrados a Git Flow pueden tener miedo de "romper cosas". Aquí es clave la formación.
  • Cambios grandes: Para grandes refactors o features complejas, usar feature branches de muy corta duración o técnicas como branch by abstraction.

Ejemplo realista

Supón que trabajas con un equipo de 4 desarrolladores. Todos comparten la rama main y se organizan así:

  • Cada uno crea una rama feat/nueva-funcionalidad y hace push el mismo día.
  • Cada PR se revisa rápidamente (máximo 30 minutos desde que se abre).
  • Al hacer merge, los tests corren automáticamente.
  • Si todo va bien, se despliega en staging automáticamente.

En este contexto, no hay ramas develop, ni release, ni semanas de trabajo sin integración.


Paso 2: Fomentar Integraciones Frecuentes

Uno de los principios esenciales del Trunk-Based Development (TBD) es que los desarrolladores deben integrar sus cambios en la rama principal varias veces al día. Esta práctica, conocida como frequent commits o continuous integration, es vital para mantener un código limpio, coherente y en constante evolución.

Integrar con frecuencia no es solo un hábito técnico, sino una filosofía que prioriza la comunicación continua entre personas, la visibilidad colectiva del código y la responsabilidad compartida del producto.


¿Qué significa integrar con frecuencia?

En el contexto de TBD, "integrar frecuentemente" implica:

  • Que cada desarrollador sincroniza su trabajo con el trunk al menos una o dos veces por jornada de trabajo.
  • Que las integraciones son pequeñas y manejables, no grandes paquetes de cambios acumulados.
  • Que el trunk se mantiene siempre en un estado estable, desplegable y verificable mediante pruebas automáticas.

Beneficios de integrar frecuentemente

1. Reducción de conflictos

Integrar frecuentemente reduce drásticamente los conflictos de fusión (merge conflicts), ya que:

  • El código divergente se detecta rápidamente.
  • Las diferencias entre desarrolladores se resuelven en horas, no en semanas.
  • Se evita la “sorpresa” de cambios incompatibles acumulados.

2. Visibilidad y colaboración

Cuando todos integran con regularidad:

  • Todo el equipo ve lo que los demás están haciendo en tiempo real.
  • Se fomentan conversaciones técnicas tempranas y constructivas.
  • El conocimiento del sistema se distribuye de forma natural.

3. Mejora continua

Las integraciones frecuentes habilitan:

  • La mejora constante del producto.
  • El feedback inmediato tras cada cambio (gracias a CI/CD).
  • La corrección rápida de errores y la iteración ágil.

Requisitos para que funcione

Para que la integración frecuente sea efectiva, deben darse ciertas condiciones técnicas y culturales.

1. Tests automáticos rápidos y fiables

Cada push al trunk debe ejecutar una batería de pruebas. Cuanto más rápido y fiable sea este feedback, más seguro será integrar a menudo.

  • Unit tests en segundos.
  • Integration tests en minutos.
  • Fail fast: que fallen rápido y con mensajes útiles.

2. Integración continua (CI) bien configurada

Herramientas como GitHub Actions, GitLab CI, Jenkins o CircleCI deben estar integradas al repositorio para:

  • Ejecutar automáticamente los tests tras cada push o PR.
  • Notificar a los desarrolladores del resultado.
  • Bloquear merges si los tests fallan.

3. Desacoplamiento y modularidad

Es difícil integrar cambios frecuentemente si el código está muy acoplado. Algunos principios útiles:

  • Single Responsibility Principle.
  • Micro-commits: cada cambio realiza una tarea clara.
  • Uso de interfaces o abstracciones para facilitar refactors incrementales.

4. Pequeños pasos (baby steps)

Romper funcionalidades grandes en pequeños pasos ayuda a:

  • Integrar más rápido.
  • Probar partes aisladas.
  • Usar feature toggles para funcionalidades incompletas.

5. Uso de Feature Flags

Las banderas de características permiten integrar código en producción sin activarlo. Esto:

  • Elimina la necesidad de mantener ramas largas.
  • Permite pruebas A/B y despliegues progresivos.
  • Facilita revertir sin hacer rollback de código.

Técnicas para lograrlo

Commit temprano, commit a menudo

Realiza pequeños commits funcionales y súbelos tan pronto como sea posible.

Push en medio del trabajo

No esperes a terminar todo para hacer push. Es preferible subir parte del trabajo, protegido por un feature flag, a quedarte con días de trabajo fuera del trunk.

Pull frecuente del trunk

Antes de comenzar el día o cada pocas horas:

git pull origin main

Mantener tu entorno sincronizado evita sorpresas desagradables al hacer merge.

Short-lived branches

Si usas ramas de funcionalidad, que duren solo unas horas o un día. Ejemplo:

git checkout -b feat/nueva-validacion
# Haces el cambio
git push origin feat/nueva-validacion
# Abres PR -> CI -> revisión rápida -> merge

Qué evitar

  • ❌ Ramas que duran varios días.
  • ❌ Esperar a “tenerlo todo listo” para integrar.
  • ❌ Introducir cambios grandes sin tests.
  • ❌ Integrar sin revisar el estado del trunk (pull).
  • ❌ Depender solo de integración manual (sin CI/CD).

Cultura de equipo: un factor clave

Integrar frecuentemente es una práctica que debe estar respaldada por la cultura del equipo. Esto incluye:

  • Confianza entre desarrolladores.
  • Valentía para subir código incompleto (pero protegido).
  • Disciplina para escribir tests desde el principio.
  • Revisión rápida y constante de PRs.
  • Tolerancia al cambio constante, entendiendo que el código está vivo.

Ejemplo práctico

En un equipo que sigue TBD correctamente:

  • Pedro comienza su día, hace git pull origin main.
  • Crea una rama feat/nueva-alerta, y en 2 horas termina la primera parte.
  • Abre una PR con tests y la etiqueta #WIP (Work In Progress).
  • Su compañero Jaime la revisa al momento y sugiere un cambio.
  • Pedro lo aplica, se pasa CI, y Jaime mergea a main.
  • Al final del día, Pedro ha integrado 3 veces a main.

Paso 3: Automatizar Pruebas y Despliegues

Introducción

Una de las piedras angulares del Trunk-Based Development es garantizar que cada integración en el trunk sea segura, verificada y potencialmente desplegable. Para lograrlo, la automatización de pruebas y despliegues se vuelve indispensable.

En TBD, los equipos integran cambios varias veces al día. Hacer esto manualmente es insostenible y arriesgado. La única forma de mantener la calidad, velocidad y estabilidad es delegar en un sistema automatizado y confiable que pruebe y despliegue el código de forma continua.


¿Qué significa automatizar pruebas y despliegues?

Automatizar en este contexto implica:

  • Ejecutar pruebas automáticas (unitarias, de integración, de extremo a extremo) después de cada cambio en el código.
  • Desplegar automáticamente a entornos como staging o incluso producción, si el código pasa todos los controles.
  • Eliminar tareas repetitivas y propensas a error, como validaciones manuales, ejecución de scripts o pasos de configuración.

Objetivos de la automatización

  • Detectar errores rápidamente Cuanto antes se detecta un bug, más fácil y barato es corregirlo.
  • Evitar regressiones Una buena suite de pruebas asegura que los cambios no rompan lo existente.
  • Reducir el tiempo entre escribir código y verlo funcionando El feedback inmediato impulsa una mayor productividad y aprendizaje.
  • Permitir despliegues frecuentes y seguros La entrega continua es solo posible si hay confianza total en el pipeline automatizado.

Automatización de pruebas

Tipos de pruebas automatizadas

  • Unitarias Prueban funciones o métodos individuales en aislamiento. Son rápidas y fáciles de mantener. Ejemplo: pytest, Jest, xUnit.
  • De integración Verifican que varios módulos colaboren correctamente. Ejemplo: interacción entre API y base de datos.
  • End-to-end (E2E) Simulan el comportamiento del usuario final en todo el sistema. Ejemplo: Cypress, Playwright, Selenium.
  • Contract Testing / API Garantizan que una API cumpla con el contrato definido, muy útil en microservicios. Ejemplo: Pact.

Cuándo y cómo ejecutarlas

  • En cada pull request.
  • Con cada push a main.
  • De forma paralela para reducir tiempos.
  • Usando un orquestador CI como:
    • GitHub Actions
    • GitLab CI/CD
    • CircleCI
    • Jenkins
    • Drone CI

Ejemplo con GitHub Actions:

name: Run Tests

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Install dependencies
        run: npm install
      - name: Run unit tests
        run: npm test

Automatización del despliegue

¿Qué es el despliegue continuo?

Despliegue continuo (CD) significa que el código que pasa todos los tests puede desplegarse automáticamente en producción, sin intervención manual. Se diferencia de la entrega continua en que esta última requiere aprobación humana antes del paso final.

Tipos de entornos de despliegue

  • Staging / preproducción Para pruebas internas, QA y validación de negocio.
  • Producción Público general. Despliegue automatizado posible si existe alta confianza.

Herramientas comunes

  • Docker + Kubernetes Para contenerizar y orquestar aplicaciones.
  • Terraform / Ansible Infraestructura como código (IaC).
  • CI/CD pipelines Integrados en plataformas como GitHub, GitLab, Bitbucket o Jenkins.

Ejemplo básico de despliegue con GitLab CI

deploy_staging:
  stage: deploy
  script:
    - echo "Deploying to staging"
    - ./scripts/deploy_staging.sh
  only:
    - main

Prácticas recomendadas

  • Tests rápidos y confiables
    • Evita falsos positivos/negativos.
    • Divide tests lentos y rápidos.
  • Despliegues idempotentes
    • Pueden repetirse sin cambiar el estado final del sistema.
  • Rollback automatizado
    • Si el despliegue falla, revertir al estado anterior automáticamente.
  • Monitorización y alertas
    • Detecta errores post-deploy (por ejemplo, con Prometheus, Grafana, Datadog).
  • Despliegue progresivo
    • Usa técnicas como:
      • Canary releases
      • Blue/green deployments
      • Feature toggles

Ventajas de una automatización bien diseñada

BeneficioResultado
Menor riesgo de errores humanosMás fiabilidad en producción
Integración y despliegue más rápidosMayor velocidad de entrega
Reducción de tareas repetitivasAumento de la productividad
Feedback inmediatoMejora en la calidad del software
Confianza en el pipelineDespliegues más frecuentes y seguros

Desafíos y cómo superarlos

DesafíoSolución
Pruebas lentas o inestablesParalelización, refactor, mocks
Infraestructura complejaContenerización (Docker), Terraform
Miedo a romper producciónFeature flags, staging, pruebas exhaustivas
Falta de cultura DevOpsFormación, documentación, mentoría

Cultura de equipo y automatización

Automatizar no es solo un tema de scripts y herramientas. Requiere compromiso cultural:

  • Confianza en el proceso y en el equipo.
  • Responsabilidad compartida por el código y su estabilidad.
  • Mentalidad de mejora continua.

Un equipo bien entrenado confía en que cualquier commit en main pasará por una cadena de pruebas y despliegue sin fricción.


Paso 4: Utilizar Feature Flags

Introducción

En el modelo de Trunk-Based Development (TBD), los desarrolladores integran cambios frecuentemente al trunk (rama principal), incluso si una funcionalidad aún no está terminada. Para evitar que código incompleto o inestable afecte a los usuarios, se utiliza una técnica clave: las Feature Flags, también conocidas como toggles o switches.

Una feature flag es un mecanismo que habilita o deshabilita una funcionalidad en tiempo de ejecución, sin necesidad de desplegar nuevo código. Esto permite liberar código sin activar inmediatamente la funcionalidad, y gestionar su exposición de forma segura, controlada y flexible.


¿Qué es una Feature Flag?

Una feature flag es básicamente una condición lógica en el código que evalúa si una característica debe estar activa o no. Puede estar basada en múltiples criterios: usuario, grupo, entorno, porcentaje de tráfico, tiempo, etc.

Ejemplo en pseudocódigo:

if feature_flag_is_enabled("nueva_busqueda"):
    mostrar_nueva_interfaz()
else:
    mostrar_interfaz_clasica()

Este enfoque permite que ambos caminos coexistan en el código sin afectar la experiencia del usuario, hasta que la nueva funcionalidad esté lista para su lanzamiento.

TBD


Tipos de Feature Flags

  • Flags de desarrollo Se usan para ocultar funcionalidades en construcción. Se eliminan una vez se libera la funcionalidad.
  • Flags de lanzamiento Permiten liberar una funcionalidad sin activarla para todos los usuarios. Se puede activar de forma progresiva.
  • Flags experimentales (A/B) Para realizar pruebas A/B o tests multivariantes entre grupos de usuarios.
  • Flags operacionales Controlan aspectos técnicos (como activar el logging extendido o modos de mantenimiento) sin redeploy.
  • Flags de permisos Activan características basadas en roles de usuario o niveles de suscripción.

Ventajas del uso de Feature Flags

BeneficioResultado práctico
Desacopla despliegue de activaciónPuedes subir código a producción sin activarlo
Evita ramas largasTodo se integra al trunk rápidamente
Permite releases progresivosActiva por lotes o porcentajes
Facilita rollbackDesactiva la flag si algo falla
Mejora la experimentaciónPrueba funcionalidades sin compromiso

Cómo implementarlas correctamente

1. Estructura condicional clara

Evita la lógica compleja o anidada. Una flag debe encapsular un cambio puntual y tener un nombre descriptivo.

if (flags.nuevaBusqueda) {
  mostrarNuevaBusqueda();
} else {
  mostrarBusquedaAntigua();
}

2. Sistema de gestión de flags

Es común usar un archivo de configuración, una base de datos o un servicio externo. Ejemplos:

  • Servicios SaaS:
  • Soluciones open source/self-hosted:
    • Unleash OSS
    • GrowthBook
    • Flipt
  • Propia implementación (válida en entornos pequeños o controlados).

3. Control dinámico y seguro

La activación debe ser:

  • Sin redeploys (usando paneles de control, API o dashboards).
  • Auditable (con logs de cambios).
  • Basada en criterios avanzados (segmentación, porcentajes, entornos).

Pruebas con Feature Flags

Las flags añaden rutas condicionales al código, lo que implica:

  • Aumentar la cobertura de tests: testear ambas ramas de la condición.
  • Tests específicos para usuarios con y sin la flag.
  • Asegurar que los flags no rompan la compatibilidad ni la UX.

Mantenimiento y limpieza

⚠️ Un error común es olvidar limpiar flags antiguas. Esto lleva a un código complejo, lleno de condiciones innecesarias.

Buenas prácticas:

  • Asocia cada flag a un ticket o historia de usuario.
  • Planifica su retirada justo después de que la funcionalidad esté 100% activada.
  • Usa linters o herramientas como archaeologist (Python) para detectar flags obsoletas.

Casos de uso realistas

✔️ Despliegue progresivo

Activar una nueva funcionalidad solo para el 10% de los usuarios:

if (user.id % 10 === 0) {
  mostrarNuevaFuncionalidad();
}

✔️ Activación por entorno

if ENV == "production" and feature_flag("nueva_ui"):
    render_nueva_ui()
else:
    render_ui_actual()

✔️ Rollback instantáneo

Si un cambio en producción rompe algo, se desactiva la flag desde el dashboard, sin hacer rollback de código.


Desafíos del uso de Feature Flags

DesafíoSolución práctica
Acumulación de flags viejasAuditorías periódicas y limpieza automatizada
Complejidad condicionalNombres claros y cobertura de tests
Malas prácticas (flag driven dev)Usarlas solo para control de comportamiento
Pérdida de visibilidadDashboards centralizados y métricas

Cultura del equipo y Feature Flags

El uso efectivo de feature flags requiere una cultura orientada a:

  • Integración continua real.
  • Releases frecuentes sin miedo.
  • Confianza mutua en los cambios.
  • Observabilidad post-release.

Las flags se convierten en herramientas de colaboración, no solo líneas de código.


Paso 5: Capacitar al equipo

Introducción

Adoptar Trunk-Based Development (TBD) no es solo una cuestión de cambiar el flujo de trabajo con Git. Requiere un cambio profundo en la mentalidad del equipo de desarrollo. Significa comprometerse con prácticas como la integración continua, la automatización, las pruebas rigurosas, el uso de feature flags y, sobre todo, una colaboración fluida y constante.

Ninguna herramienta, configuración o pipeline será suficiente si el equipo no entiende, cree y domina las prácticas que hacen sostenible el Trunk-Based Development. Por eso, la capacitación del equipo es una inversión estratégica ineludible.


¿Por qué capacitar?

  • Para evitar la resistencia al cambio.
  • Para asegurar que todos los miembros dominan las prácticas y herramientas de TBD.
  • Para fomentar una cultura de mejora continua, comunicación y responsabilidad compartida.
  • Para lograr una adopción orgánica, efectiva y duradera del nuevo modelo de trabajo.

Principios de una buena capacitación

  • Formación técnica y cultural
    • No basta con enseñar a usar git pull o CI/CD.
    • Hay que explicar el “por qué” de cada práctica.
    • Las sesiones deben combinar teoría, casos reales y práctica.
  • Aprendizaje progresivo y constante
    • No se trata de una única charla inicial.
    • TBD se aprende por fases, con refuerzo continuo y adaptado a cada rol.
  • Capacitación transversal
    • No solo los desarrolladores deben estar formados.
    • También QA, DevOps, product managers y líderes deben entender cómo encajan en el nuevo modelo.

Contenidos clave a capacitar

🧠 Filosofía y fundamentos de TBD

  • Qué es TBD y por qué se adopta.
  • Comparación con Git Flow y otras estrategias.
  • Ciclo de vida de una funcionalidad desde idea hasta producción.

⚙️ Prácticas técnicas concretas

  • Integración continua real (commits frecuentes a main).
  • Automatización de pruebas y despliegues.
  • Feature flags y ramas de corta duración.
  • Pull requests pequeñas, rápidas y eficientes.

🛠️ Herramientas del ecosistema

  • Sistemas de CI/CD (GitHub Actions, GitLab CI, Jenkins…).
  • Sistemas de gestión de flags (LaunchDarkly, Unleash, Flagsmith…).
  • Linters, formateadores automáticos, test runners.
  • Observabilidad y rollback.

🧪 Testing eficaz

  • Qué tipos de tests aplicar (unitarios, integración, E2E).
  • Cómo estructurar el código para testabilidad.
  • Cómo detectar errores antes de llegar al trunk.

🗣️ Comunicación y colaboración

  • Cultura de revisión constante y constructiva.
  • Resolución rápida de conflictos.
  • Visibilidad compartida del trabajo en curso.
  • Refuerzo del feedback continuo.

Métodos de capacitación

✅ Talleres prácticos

  • Simular ciclos de desarrollo con ramas cortas y PRs rápidos.
  • Romper y reparar pipelines.
  • Crear y eliminar feature flags en ejercicios reales.

✅ Katas y ejercicios guiados

  • Ejercicios de TDD que incluyen integración continua.
  • Flujos de trabajo con conflictos controlados.

✅ Pair programming y mob programming

  • Desarrollar juntos permite transmitir buenas prácticas en tiempo real.
  • Ayuda a igualar el conocimiento entre perfiles senior y junior.

✅ Documentación interna actualizada

  • Guías paso a paso para usar el flujo de trabajo TBD.
  • Checklists de buenas prácticas.
  • Casos de éxito del propio equipo.

✅ Mentores internos

  • Asignar “champions” del cambio: desarrolladores experimentados que acompañen a sus compañeros.
  • Resolución rápida de dudas, code reviews ejemplares, refuerzos positivos.

Acompañar el cambio cultural

Capacitar también implica romper viejos hábitos. Por ejemplo:

Mal hábitoNueva práctica con TBD
Ramas largas de semanasRamas pequeñas, de horas o 1-2 días
“Merge cuando todo esté terminado”“Merge temprano, con feature flags”
Revisiones lentas y extensasRevisiones ligeras y continuas
Depender del QA al finalAutomatizar tests desde el principio
Culpa individual por erroresResponsabilidad colectiva del trunk

El liderazgo técnico debe reforzar con el ejemplo: usar el trunk correctamente, hacer revisiones frecuentes, aplicar tests y no romper la build. Nada enseña más que la coherencia entre el discurso y la práctica.


Métricas para evaluar la capacitación

IndicadorCómo medirlo
Tiempo medio entre mergesMás bajo = mayor frecuencia de integración
Tamaño medio de PRsMás pequeño = cambios más manejables
Porcentaje de cobertura de testsMás alto = más confianza en integraciones
Tiempo de revisión de PRsMás corto = mayor fluidez de colaboración
Incidencias tras desplieguesMenor número = mejor calidad

Estos indicadores pueden servir para reforzar aprendizajes y mostrar avances concretos.