Episodio 15

La primera sesión de pairing

"El control es una alucinación solitaria"
13 min de lectura
Semana del 11 - 15 de mayo de 2026

Stefan propone pairing y, peor todavía, mob programming. El equipo espera caos. Daniel teme perder la última palanca que todavía mueve: las aprobaciones. Mariana espera teatro. Hassan espera una nueva forma de que lo culpen. En cambio, Stefan lo mantiene brutalmente pequeño: un bug, una rama, una sesión. Mientras tres desarrolladores comparten teclado y discuten en tiempo real, detectan problemas que, de otro modo, habrían explotado días después en producción. La primera sesión de pairing no los hace más rápidos. Los hace menos solos.

Anteriormente: "La documentación que no existe" — Stefan pidió documentos de arquitectura y encontró un wiki vacío. Pidió un runbook de despliegue y recibió la misma respuesta: "Está en la cabeza de alguien." Con la fecha de salida de Tomasz contando hacia atrás, Stefan se sentó a su lado y empezó a escribir el conjunto mínimo de verdades que mantiene vivo a un sistema.

Lunes, 09:26 — Tres sillas, un teclado

Una sala pequeña de vidrio con tres sillas demasiado cerca de un escritorio. Stefan con cuaderno abierto, Mariana con laptop, Daniel tenso con teléfono boca abajo. Hassan visible a través del vidrio en su escritorio.
"Tenemos un sistema y tres puntos únicos de fallo."

Mariana ya estaba en la sala de vidrio. Shorts cortados, piernas morenas desnudas pese al fresco de la mañana, Docs desatadas, y una camiseta de gira de Arch Enemy desteñida con las mangas arrancadas a la altura de los hombros. El diseño de Wages of Sin era casi ilegible después de cien lavados.

Stefan se detuvo en la puerta.

“¿Wacken?” preguntó.

Mariana levantó la cabeza. No defensiva. Sorprendida.

“2019,” dijo.

“Mismo año. Lado derecho del escenario. Alguien me empujó al pit durante ‘Nemesis.’”

La sonrisa de Mariana llegó rápida y sin filtro. La primera de verdad que Stefan le había visto.

“Probablemente fui yo,” dijo.

Tres segundos. Luego su cara volvió a cerrarse en distancia profesional. Pero algo se había quebrado entre ellos. No proceso. No competencia. El recuerdo compartido de ser aplastados por la misma pared de sonido en un campo embarrado de Schleswig-Holstein.

Stefan se sentó y abrió su cuaderno.

No lo anunció como una iniciativa.

Lo anunció como una restricción.

“Tenemos un sistema y tres puntos únicos de fallo,” dijo.

La mandíbula de Daniel se movió sin abrir la boca. Ese gesto de tragarse palabras.

Mariana se recostó y dejó que la silla chillara. El eye roll ni siquiera fue disimulado.

“¿Quieres que escribamos más documentación?” dijo.

“No,” dijo Stefan. “Eso fue ayer. Quiero que dejen de trabajar solos en cosas peligrosas.”

La risa de Hassan llegó desde el otro lado del vidrio. No fuerte. No amable.

“Suerte,” dijo, mirando sus monitores. “A este lugar le encantan las cosas peligrosas.”

Stefan giró la cabeza hacia él.

“Ya lo noté,” dijo.

Daniel se aclaró la garganta.

“No tenemos tiempo para…” empezó.

“Pairing,” completó Mariana. Como una mala palabra.

Los ojos de Daniel se fueron a ella. No le gustó que lo dijera en voz alta.

Stefan sonrió una vez.

“Pairing,” confirmó. “Y a veces mob programming.”

Las cejas de Mariana subieron.

“Ay, por favor,” dijo. “¿Ahora vamos a hacer la cosa de 2009?”

“Vamos a hacer la cosa de 2026,” dijo Stefan. “Dejar de pagar intereses por el silencio.”

La mano de Daniel apretó un bolígrafo.

“No quiero una sala llena de gente discutiendo mientras no se hace nada,” dijo.

Quería decir: no quiero ver cómo mi autoridad se disuelve en tiempo real.

Stefan asintió.

“No va a pasar,” dijo. “Esto no es democracia. Es gestión de riesgo.”

Mariana resopló.

“Gestión de riesgo suena a PowerPoint,” dijo.

“Entonces mantengámoslo fuera de slides,” dijo Stefan. “Una sesión. Noventa minutos. Un bug que nos duele si sale mal. Una rama. O sacamos valor o paramos.”

Hassan por fin levantó la vista.

“¿Y cuando salga mal?” preguntó.

La voz de Stefan se mantuvo plana.

“Entonces aprendemos con luz,” dijo. “No a las 23:40 con las manos temblando y nadie respondiendo en Slack.”

La boca de Hassan se tensó. Sus dedos se flexionaron una vez, como si tuviera que convencerlos de estar quietos.

Daniel miró la mesa. El vidrio le devolvió su propia cara. Se veía más viejo de lo que quería.

“¿Quién maneja?” preguntó Stefan.

Mariana señaló la silla vacía de Emma como si fuera obvio.

“La nueva desarrolladora de plataforma,” dijo. “Si vamos a romper algo, al menos que sea con estilo.”

Stefan no se rió. Solo escribió una hora en su cuaderno.

“11:00,” dijo. “Traigan la cosa más pequeña y más aterradora que estén tocando esta semana.”

Daniel exhaló por la nariz.

“Vale,” dijo.

No era acuerdo.

Era rendición con formulario.

Lunes, 11:04 — El bug que nunca llegó a producción

Emma en un escritorio con un monitor externo. Mariana de pie detrás de su silla. Stefan sentado a un lado con cuaderno abierto. Daniel en la puerta con brazos cruzados.
"Tú manejas. Tus manos. Tu teclado. Tus errores."

El ventilador del laptop era la voz más fuerte del cuarto.

Stefan hizo que Emma tecleara.

No porque no confiara en ella.

Porque no quería convertirlo en un show donde la persona senior “enseña” y los demás miran.

“Tú manejas,” dijo. “Tus manos. Tu teclado. Tus errores.”

Los ojos de Emma fueron a Mariana.

“Si rompo producción, me voy del país,” dijo.

“No lo harás,” dijo Mariana. “Lo rompemos juntas. Como familia.”

Hassan se sentó en el borde de la mesa como si no mereciera una silla.

“¿Qué estamos viendo?” preguntó.

Emma abrió un pull request. Pequeño. El tipo de cambio que se ve inocente y se aprueba un viernes.

Un update del runbook.

Una línea en el script de deploy.

“Solo hace que el script imprima el nombre del entorno,” dijo Emma. “Para que no despliegues a producción pensando que es staging.”

Las cejas de Daniel subieron.

“Eso está bien,” dijo, sorprendido de escucharse.

La sonrisa de Mariana fue afilada.

“Está bien porque tenemos miedo,” dijo.

Stefan se inclinó.

“Pruébalo local,” dijo.

Emma lo ejecutó.

El script imprimió: ENV=staging.

“Ahora cambia el flag,” dijo Stefan.

Emma cambió una variable y lo corrió otra vez.

ENV=production.

Los hombros de Daniel se aflojaron un centímetro.

“Ok,” dijo. “Lo integro.”

Stefan no se movió.

“Todavía no,” dijo.

Daniel parpadeó.

“¿Por qué?” preguntó, y la irritación se despertó.

Stefan señaló una línea.

“Ese string viene de un archivo de config,” dijo. “¿Cuál?”

Emma hizo scroll.

config/env.sh,” dijo.

“¿De dónde sale ese archivo en CI?” preguntó Stefan.

Emma dudó.

Mariana no.

“Del laptop de alguien,” dijo.

La risa de Hassan salió como tos.

“Del mío,” corrigió.

La sala se quedó en silencio de ese modo que pasa cuando una verdad es demasiado vergonzosa para discutirla.

Stefan asintió una vez.

“Entonces el script imprime el entorno desde un archivo que quizá no existe en CI,” dijo. “¿Qué pasa si no existe?”

Emma ejecutó el script sin ese archivo.

No imprimió ENV=.

No imprimió nada.

Y luego cayó en producción por defecto.

La cara de Daniel se vació.

“Eso…” empezó.

“Ese es el bug,” dijo Mariana. Su voz se volvió calma. Demasiado calma.

Hassan miró la terminal. Su garganta se movió.

“Ese iba a ser mi martes en la noche,” dijo.

Las manos de Emma quedaron suspendidas sobre el teclado como si no confiara en ellas.

“No vi eso,” susurró.

“Claro que no,” dijo Stefan. No cruel. No amable. Solo verdad. “Estabas sola.”

Daniel descruzó los brazos. Se acercó.

“Arréglalo,” dijo.

Stefan negó con la cabeza.

“No,” dijo. “Emma arregla. Mariana explica. Hassan verifica. Tú apruebas cuando lo entiendas.”

Daniel lo miró.

“Eso es más lento,” dijo.

El bolígrafo de Stefan golpeó una vez el cuaderno.

“Más lento que el pánico,” dijo. “Más rápido que los postmortems.”

Emma tragó saliva.

“Ok,” dijo.

Mariana se inclinó sobre su hombro y señaló.

“Guardrail,” dijo. “Si falta el archivo, falla duro. Sal. Grita. Nada de defaults.”

Hassan asintió.

“Y muestra la fuente de la config,” agregó. “Para saber si viene de CI o de un estado local maldito.”

Emma tecleó.

El script ahora se negaba a continuar si faltaba config/env.sh.

No era elegante.

Era sobrevivible.

Daniel miró el diff como si estuviera viendo magia.

“Eso se habría ido,” dijo.

“Se habría ido porque lo habrías aprobado un viernes,” dijo Mariana.

Daniel se encogió.

“Sí,” admitió.

Stefan cerró su cuaderno.

“Primera sesión de pairing,” dijo. “Un bug muerto antes de nacer.”

Nadie sonrió.

Ese era el punto.

Martes, 14:38 — El test de Mariana, el silencio de Tomasz

Mariana al teclado, postura hacia delante, concentración afilada. Tomasz sentado a su lado con ojos cansados. Stefan detrás con cuaderno. Daniel más atrás, observando.
"Por eso nunca toqué ese código."

Mariana eligió la siguiente “cosita pequeña y aterradora” con una sonrisa que decía: ya se acabó la diplomacia.

“Rewards,” dijo.

Los ojos de Daniel se estrecharon.

“Eso lo tiene product,” dijo.

Nota del lector: El reflejo de Daniel aquí es territorial: "eso lo tiene product" significa "no es nuestro problema." Es la postura predeterminada en organizaciones que asignan culpa por departamento. La propiedad del código se convierte en escudo, no en responsabilidad. Si el sistema de rewards se rompe, es culpa de product por especificarlo mal, no de desarrollo por construirlo frágil.

Mariana hace lo opuesto. Toma un bug que cruza fronteras y se sienta con él. No pide permiso. No crea un ticket. Escribe un test. Ese cambio de "¿de quién es este código?" a "¿qué está roto y cómo lo arreglamos juntos?" es toda la diferencia entre equipos que trabajan en pares y equipos que señalan con el dedo. La propiedad colectiva del código no significa que nadie sea responsable. Significa que todos lo son.

“Todo es de product hasta que se rompe,” dijo Mariana. “Después es de Hassan.”

Hassan pasó por la puerta sin detenerse.

“Hechos,” dijo, sin mirar.

Mariana abrió un reporte de live ops.

Jugadores diciendo que habían recibido el mismo reward dos veces.

No pasaba mucho.

Lo cual lo hacía peor.

Los bugs raros no se arreglan.

Los bugs raros se explican.

“No lo puedo reproducir,” dijo Daniel.

“Porque lo estás haciendo bonito,” dijo Mariana.

Escribió un test.

No un unit test que demuestra que una función devuelve el número correcto.

Un test sucio que simula a un jugador abriendo la app cruzando la frontera de medianoche.

Stefan no interrumpió.

Miró a Tomasz.

Tomasz miró a Mariana como alguien mirando a otra persona tocar una mina que él lleva dos años rodeando.

El test falló.

No con una aserción prolija.

Con un crash.

Los labios de Mariana se abrieron.

“Oh,” dijo.

Los hombros de Tomasz se tensaron.

“Por eso nunca toqué ese código,” murmuró.

Stefan giró la cabeza.

“Dilo otra vez,” dijo.

Tomasz lo miró.

“Por eso nunca toqué ese código,” repitió, más fuerte, irritación tapando vergüenza.

Daniel parpadeó.

“¿Nunca lo tocaste?” preguntó.

La risa de Tomasz fue seca.

“Querías que estuviera estable,” dijo. “Así que aprendí qué partes había que temer.”

Mariana no pidió permiso.

Siguió el crash hasta un helper de parseo de fechas que asumía que la zona horaria local era igual a la del servidor.

No lo era.

Nunca lo fue.

Hora de Berlín.

UTC.

Jugadores en Brasil.

Jugadores en Turquía.

La medianoche ocurre en momentos distintos para gente distinta.

La voz de Mariana cambió.

Dejó de actuar seguridad.

“Llevamos dando rewards duplicados porque no sabemos qué día es,” dijo.

La cara de Daniel hizo algo parecido a dolor.

“¿Qué tan grave?” preguntó.

Mariana encogió los hombros.

“No catastrófico,” dijo. “Pero humillante. Y caro. Y el tipo de bug que hace que un jugador piense que lo estás cagando.”

Tomasz se inclinó.

“Si lo arreglas mal, puedes bloquearle a la gente los rewards diarios,” dijo.

“Bien,” dijo Stefan.

Todos lo miraron.

“¿Bien?” dijo Daniel.

“Bien,” repitió Stefan. “Ahora el riesgo está visible. Sigan.”

Fue lo más importante que dijo en toda la semana, y lo dijo como si no fuera nada. Tomasz acababa de nombrar la trampa: arréglalo mal y rompes algo peor. En la mayoría de los equipos, esa frase mata el impulso. Alguien dice “pospongamos esto” o “necesitamos una especificación” o “creo un ticket.” El miedo a empeorar las cosas se convierte en la razón por la que nada mejora.

Stefan hizo lo opuesto. Tomó el miedo y lo hizo útil. Bien no significaba “me alegra que esté roto.” Significaba: ahora lo pueden ver. Ahora pueden decidir. Ahora el riesgo tiene forma en vez de ser una sombra alrededor de la cual Tomasz camina en la oscuridad.

Esa sola palabra le dio al cuarto permiso para seguir tocando lo peligroso en vez de alejarse.

Mariana reescribió el helper.

No sola.

Katja apareció en la puerta de vidrio. Café en una mano, camiseta de Opeth gastada, lentes de lectura en la frente. No entró. Solo se apoyó en el marco y miró a Mariana rastrear el crash a través de tres archivos.

La postura de Mariana se movió un centímetro hacia la puerta sin levantar la vista. Inconsciente.

La comodidad entre ellas tenía un peso específico. No era actuación. No era política. Algo más cálido y más viejo que la cadencia de un standup.

Katja miró un minuto completo, cruzó la mirada con Stefan, asintió una vez, y se fue.

Stefan lo archivó.

Tomasz aportó la historia. El incidente raro de 2024 cuando soporte se inundó. El workaround que nadie documentó.

Stefan hizo la pregunta que lo volvió seguro.

“¿Qué harías a las 02:00 cuando el test falla y odias a tu yo del pasado?”

Tomasz exhaló.

“Pondría la conversión de timezone en un solo lugar,” dijo. “Y lo escribiría.”

Los dedos de Mariana se detuvieron.

“Te vas,” dijo, sin acusar. Solo afirmando.

Tomasz no respondió.

Su silencio era respuesta.

Mariana asintió una vez y tecleó más rápido.

Cuando el test por fin quedó verde, nadie celebró.

La voz de Daniel fue baja.

“Eso nos habría tomado días,” dijo.

Mariana no se giró.

“Días para ti,” dijo. “Semanas para el backlog. Un año para la realidad.”

Stefan escribió una frase en su cuaderno y la subrayó.

Pensar juntos es más barato que arreglar solos.

Jueves, 18:03 — Aprobar no es seguridad

Daniel y Stefan en la cocina cerca de la máquina de café. Daniel con mangas dobladas y ojos cansados. Stefan con chaqueta en el brazo, listo para irse. Mariana y Emma riéndose al fondo.
"Lidera. No controles."

Daniel alcanzó a Stefan cuando ya estaba guardando cosas.

“Lo hiciste a propósito,” dijo Daniel.

Stefan no fingió no entender.

“Sí,” dijo.

“Elegiste cambios que se ven seguros,” dijo Daniel. “Para que mi aprobación fuera lo que casi nos mata.”

Stefan asintió.

“Tu aprobación nunca fue el mecanismo de seguridad,” dijo.

Las fosas nasales de Daniel se tensaron.

“Entonces, ¿qué hago yo?” preguntó.

Quería decir: ¿qué valgo si no soy la puerta?

La voz de Stefan se mantuvo suave sin volverse blanda.

“Intentas que la gente no se ahogue,” dijo. “Pero no puedes hacer eso desde una checklist.”

Los hombros de Daniel se hundieron.

“Si no apruebo, se despliega mal,” dijo.

“Se despliega mal con tu aprobación,” dijo Stefan. “Eso es lo que mostró hoy.”

Daniel miró la máquina de café como si tuviera respuestas.

“Odio las reuniones,” dijo.

“Yo también,” dijo Stefan.

La risa de Daniel fue cansada.

“Entonces, ¿por qué esto funciona?” preguntó.

Stefan se encogió.

“Porque no es una reunión,” dijo. “Es trabajo. Trabajo compartido. Feedback en tiempo real. Un code review humano.”

Daniel tragó saliva.

“Yo pensé que mob programming era…” buscó la palabra.

“Cringe,” dijo Mariana desde atrás sin levantar la vista.

Emma se rió.

Stefan sonrió.

“Puede serlo,” dijo. “Si lo haces como teatro. Esto no es teatro. Esto es quitarle presión a la persona que siempre paga.”

El teléfono de Daniel vibró otra vez.

No lo agarró.

Eso solo ya era un milagro.

“Ok,” dijo Daniel. “Otra más la semana que viene.”

Stefan se puso la chaqueta.

“Pregúntale al equipo,” dijo.

Daniel frunció el ceño.

“Soy Head of QA,” dijo.

Las cejas de Stefan subieron.

“Entonces actúa como tal,” dijo. “Lidera. No controles.”

Se fue a las 18:10.

Daniel se quedó ahí, mirando la máquina de café, como si fuera un confesionario.

Detrás, volvió la risa de Mariana.

No cruel.

Aliviada.

Navigator — Daniel Weber — 15 de mayo de 2026, 18:22

Aprobé un cambio el lunes que habría dejado un deploy cayendo en producción por defecto.

Se veía seguro.

Ese es el punto.

Me repito que mis aprobaciones son seguridad. Pero las aprobaciones son papeleo. Se sienten como control porque son visibles. Crean la ilusión de que alguien es responsable.

Hoy, tres personas se sentaron en una sala y mataron un bug antes de que existiera. Sin héroes. Sin noche larga. Sin pánico. Solo cerebros en el mismo lugar al mismo tiempo.

Mariana dijo que era cringe. No se equivoca. Es cringe cuando es forzado.

Pero cuando Emma tecleó y Hassan verificó y Tomasz dijo la verdad sobre las minas y Stefan siguió haciendo preguntas lentas, no se sintió como proceso.

Se sintió como un equipo.

Me aterra perder el control.

Me aterra más quedármelo.

Próximo Episodio: "El code review que no es un review" Stefan hace una pregunta simple que cae como un insulto: ¿por qué se aprueban pull requests sin que nadie los lea? Daniel insiste en que las revisiones ocurren. Mariana se ríe. Hassan muestra las reacciones con emojis que cuentan como ‘proceso’. Stefan se sienta con ellos y convierte el code review en lo que se suponía que era: entendimiento compartido, no un sello.
×
×