Steven
Steven7 min de lectura

La anatomía de lanzar software a la perfección: cómo la revisión de código detectó lo que las pruebas no podían

A lo largo de la serie GeekBye v2, pasa una y otra vez lo mismo: un arreglo pasa todas las pruebas en la máquina del desarrollador, y luego la revisión de código demuestra que habría fallado para casi todo el mundo. Este es el flujo de trabajo detrás de nueve lanzamientos — la puerta de revisión, las cazas del arreglo-primero y la disciplina de probar-antes-de-lanzar que convierte "en mi máquina funciona" en "funciona".

Ingeniería
Proceso
Revisión de código
Lanzamientos de GeekBye
La anatomía de lanzar software a la perfección: cómo la revisión de código detectó lo que las pruebas no podían

Durante un par de semanas, GeekBye lanzó nueve versiones — de la v2.0.0 a la v2.0.11 — y esta serie contó la historia de cada una. Léelas juntas y salta a la vista un patrón más interesante que cualquier error concreto: una y otra vez, un arreglo pasaba todas las pruebas en la máquina del desarrollador, y la revisión de código demostraba que habría fallado para casi todos los demás.

Ese hueco — entre "en mi máquina funciona" y "funciona" — es donde vive de verdad la fiabilidad. Este es el flujo de trabajo que lo cierra, y el índice de cada lanzamiento que produjo.

El patrón: pruebas en verde, respuesta equivocada

Estos son tres de los casos más claros de la serie, porque hacen concreto lo abstracto.

  • En el arreglo de captura multimonitor (v2.0.10), la primera implementación anclaba la captura de pantalla a la ventana superpuesta de la app. Pasó las pruebas — en una máquina de desarrollo con un solo monitor. La revisión razonó sobre dónde vive realmente esa ventana superpuesta (la pantalla principal, siempre, salvo que la arrastres físicamente) y demostró que el "arreglo" habría resuelto de vuelta al monitor equivocado para casi cualquier usuario real. El anclaje correcto — el cursor — salió de ese argumento, no de una ejecución de pruebas.
  • En el lanzamiento del fallback por WebSocket (v2.0.8), la revisión encontró que el 403 exacto que devuelve un proxy que bloquea se clasificaba como un error de autenticación fatal — así que el fallback que la función existía para disparar nunca podía activarse. La función se habría lanzado, habría pasado sus pruebas de camino feliz, y no habría hecho nada por su verdadero público.
  • En el arreglo del tiempo de inactividad (v2.0.9), la primera versión estampaba el reloj de "sigo vivo" dentro de una ruta de código que un subconjunto de transcripciones se salta legítimamente — la del otro interlocutor. La revisión detectó que un cambio futuro podía reintroducir en silencio el mismo error que se estaba arreglando, y la marca se movió a un lugar incondicional, con una prueba para mantenerla ahí.

Ninguno de estos se detectó ejecutando el código. Todos se detectaron con un revisor razonando sobre por qué funciona el código — y encontrando un caso en el que no.

Las tres partes de la puerta

El flujo de trabajo detrás de la serie no es elaborado. Son tres hábitos aplicados sin excepción.

1. La revisión razona sobre la corrección, no solo ejecuta el código. Una prueba que pasa demuestra que el código funciona para el caso que se te ocurrió. La revisión es un segundo modelo, adversario, del sistema que pregunta ¿qué caso no se te ocurrió? — el segundo monitor, el proxy corporativo, la transcripción que se salta la rama, el cliente que va una versión por detrás. El paso de revisión en esta serie fue con frecuencia un revisor agente independiente al que se le pedía refutar el arreglo, no bendecirlo. Ese enfoque es todo el sentido: un revisor que intenta romper tu razonamiento encuentra el agujero por el que un revisor que intenta aprobarlo pasa de largo.

2. Cada arreglo de comportamiento se lanza con una prueba que fija el fallo exacto. No una prueba de que la función funciona — una prueba de que este error concreto está muerto. El 403 del proxy bloqueado debe caer hasta el fallback; un 403 de autenticación real no. El reloj de actividad debe estamparse en una transcripción que se salta la atribución. Estas pruebas existen para que el error no pueda volver sigilosamente dentro de seis meses cuando alguien refactorice al lado — el fallo queda clavado al suelo.

3. La compilación se notariza y se verifica antes de lanzarse. Varios de estos arreglos pasaron del diagnóstico a un lanzamiento firmado, notarizado y con autoactualización en un día. Esa velocidad solo es segura porque la puerta es disciplinada: el diagnóstico demuestra la causa raíz (el lanzamiento del permiso de micrófono lanzó su diagnóstico primero), la prueba fija el arreglo, la revisión refuta el razonamiento, y solo entonces sale una compilación notarizada de verdad. El rigor es lo que hace segura la velocidad, no lo que se cambia por ella.

Por qué esto importa más para una app de IA

Hay una razón por la que esta disciplina es innegociable para una herramienta como GeekBye en concreto. Varios de los errores más feos de la serie eran silenciosamente-erróneos, no ruidosamente-cierre: una captura de pantalla que alimentaba el monitor equivocado a la IA (v2.0.10), una transcripción sesgada hacia términos basura, de modo que "speak" salía como un nombre (v2.0.11), un asistente respondiendo en el modo equivocado sin forma de verlo (v2.0.3 + v2.0.5). Cuando tu app alimenta contexto a un modelo, una entrada equivocada produce una salida segura de sí misma pero equivocada y ningún error en ninguna parte. No puedes salir de los fallos que no lanzan excepción a base de pruebas. Tienes que salir razonando — que es exactamente para lo que sirve la puerta de revisión.

La serie, en orden

Cada uno de estos es un caso de estudio autónomo sobre un lanzamiento. Leídos de principio a fin, son la anatomía de llevar un producto de "funciona" a "es de fiar".

  1. Lo que de verdad cuesta una versión 2: 206 commits de estados honestos — v2.0.0. El cimiento: nunca mostrar un estado que no sea cierto.
  2. El día que nuestra app se hizo DDoS a sí misma — v2.0.1 + v2.0.4. Un atasco de subidas al arrancar que estampidaba contra nuestro propio backend, y la escalera de vitalidad que forzó.
  3. Software tranquilo: el arreglo del parpadeo y el chip de modo de respuesta — v2.0.3 + v2.0.5. Lanzamientos sin funciones que compraron confianza detalle a detalle.
  4. Tu app de Mac olvida el acceso al micrófono en cada arranque — v2.0.6. La App Translocation de macOS, y lanzar el diagnóstico antes del arreglo.
  5. Una variable CSS, cinco rondas de revisión y una cadena de herramientas Swift que mentía — v2.0.7. Translucidez uniforme, y un binario que cambiaba de tamaño porque la documentación no concordaba con el script de comprobación.
  6. Transcripción en directo cuando el firewall bloquea los WebSockets — v2.0.8. Un fallback de HTTPS puro, y el 403 que lo habría ocultado de sí mismo.
  7. Por qué tu notetaker con IA deja de grabar a mitad de reunión — v2.0.9. Un temporizador de inactividad que solo podía oírte a ti, y un cierre que podía bloquear tu escritorio.
  8. Por qué la grabación de pantalla captura el monitor equivocado — v2.0.10. El error de la pantalla equivocada, y el arreglo que pasó en un monitor y habría fallado en dos.
  9. Por qué la transcripción con IA oye mal los términos técnicos — v2.0.11. Sesgar el habla hacia tu vocabulario — y la regresión que lo empeoró antes de mejorarlo.

La conclusión

La perfección no es un estado al que llegas; es una puerta que mantienes. Nueve lanzamientos, y las mismas tres preguntas en cada uno: ¿qué caso no se te ocurrió, está el fallo exacto fijado por una prueba, y salió de verdad una compilación firmada? Nada de esto es glamuroso. Todo ello es por lo que GeekBye v2 se siente tranquilo. Si construyes software — de IA o de lo que sea — la parte transferible no es ningún arreglo concreto. Es el hábito de tratar una batería de pruebas en verde como el principio del argumento, no el final.

Cada lanzamiento de arriba está disponible por autoactualización. Para el producto al que suman estos arreglos, mira las novedades de GeekBye v2.

Artículos Relacionados

El silencio era estructural
Steven
Steven8 min de lectura

El silencio era estructural

Las dos últimas releases de GeekBye v1 giran en torno a la misma verdad incómoda: la transcripción en tiempo real sobre una red real no es sin pérdidas, y lo honesto es dejar de fingir que lo es. La v1.8.20 guardaba en disco una copia de cada chunk de audio antes de descartarlo durante una reconexión, y empezó a marcar en voz alta los huecos en la transcripción. La v1.9.0 dejó de enviar silencio para ahorrar ancho de banda — y descubrió que el silencio era justo la señal que el transcriptor usaba para saber que una frase había terminado. Dos releases sobre el coste de tirar cosas.

Ingeniería
Audio
Fiabilidad
Los tres verbos que mantienen vivo el Web Audio
Steven
Steven10 min de lectura

Los tres verbos que mantienen vivo el Web Audio

Dos releases puntuales de GeekBye, con dos meses de diferencia y en dos archivos distintos, le enseñaron a nuestro código de audio la misma lección desde extremos opuestos: dejar de tratar el AudioContext del navegador como desechable. Una release aprendió a hacer resume() de un contexto que macOS había suspendido silenciosamente a mitad de grabación; la otra aprendió a hacer suspend() en vez de close() para que las sesiones consecutivas dejen de estrellarse contra el techo de aproximadamente seis contextos de Chromium. Resume, suspend, close — ese es todo el argumento.

Ingeniería
Audio
Desktop
Distinguir una llamada de una app abierta
Steven
Steven10 min de lectura

Distinguir una llamada de una app abierta

GeekBye puede notar que te has unido a una reunión por video y ofrecerte grabarla. La detección resulta ser la mitad fácil — un binario Swift que lee títulos de ventana cada diez segundos. La mitad difícil es la precisión: no dispararse cuando Zoom está meramente abierto, no ofrecerte grabar una reunión que ya estás grabando, y no silenciar el micrófono en la llamada en la que realmente estás. Tres releases, y cada una es una salvaguarda que tuvo que aprender a no derrotarse a sí misma.

Ingeniería
macOS
Desktop