Decisiones reales, contadas por quien las tomó.
Nada de listas de buenas prácticas. Escribimos sobre problemas que nos hemos comido construyendo software que está en producción, con el código delante.
Suscríbete por RSSEl 99,2 % del consumo no era demanda de usuario
Un día Isobaria agotó la cuota de sus proveedores de datos. Repartir el gasto por quién lo causó mostró que las personas eran el 0,8 %. Qué cambiamos, qué descartamos y por qué no pagar un plan era la respuesta equivocada.
- Arquitectura
- Datos
- Decisiones de producto
Los días del viaje no existen en la base de datos
En Jornia un viaje tiene paradas, pero no tiene días: se calculan al leer a partir del rango de fechas. Qué estados imposibles evita eso, y la factura que cobra a cambio.
- Arquitectura
- Android
- Bases de datos
El fallo seguro se elige antes de que falle
En la web de Plazoleta hay tres sistemas que deciden en qué lado caer cuando algo falla: el blog no publica, la analítica no mide y el formulario no dice "gracias". No es pesimismo: es elegir el lado antes de que haga falta.
- Arquitectura
- Decisiones de producto
- Método
El default que convertía 55 GB en 11.300 ficheros
Media3 trae los fragmentos de la caché a 5 MiB, un número pensado para streaming. En una biblioteca de descargas se convierte en 11.300 ficheros y en micro-parones durante la reproducción. Por qué lo subimos a 512 MiB, y por qué solo en una de las dos cachés.
- Android
- Arquitectura
- Rendimiento
El modelo de IA más barato ganó el benchmark
Montamos un benchmark con 20 modelos de opencode-go resolviendo la misma tarea en autopiloto. El de mejor nota costó tres céntimos. Qué medimos, qué nos sorprendió y por qué el precio no predice la calidad.
- IA
- Herramientas internas
- Decisiones de producto
Una idea que suena bien puede medir peor: por qué la mediana perdió contra la media
En Isobaria, cambiar la media ponderada por la mediana parecía la mejora obvia para el índice de confianza. Medido contra 151.000 horas de ERA5, era peor. La historia de por qué, y de qué se hizo en su lugar.
- Arquitectura
- Datos
- Decisiones de producto
De `main` a Google Play sin tocar nada a mano
En Jornia, cada push a main que toca la app termina en el móvil de un tester sin que nadie abra la consola de Play. Qué se automatizó, qué se dejó manual a propósito, y por qué esa segunda lista importa tanto como la primera.
- Android
- CI/CD
- Decisiones de producto
¿No-code o software a medida? Dónde está la frontera de verdad
La respuesta honesta casi nunca es "a medida". Dónde aguanta bien una herramienta no-code, qué la rompe, y cómo se nota que has cruzado la frontera antes de gastarte el dinero.
- Decisiones de producto
- Herramientas internas
"No sé" y "está vacío" no son el mismo dato
En LoverCast, ocultar categorías se sincroniza entre dispositivos. Dejar de ocultarlas todas, no. Sobre por qué colapsar la ausencia y el vacío en un solo valor es una puerta de un solo sentido.
- Bases de datos
- Arquitectura
- Sincronización
Reduce motion no es una casilla de accesibilidad: es diseño
En Jornia, la animación de marca es la única animación custom permitida en toda la app. Por qué eso hace que respetar reduce motion sea fácil, y qué se construyó primero para que fuera así.
- Diseño
- Producto
- Accesibilidad
El bug de las mayúsculas que hacía desaparecer "Continuar viendo"
Móvil y TV escribían "MOVIE", la web escribía "movie", y era la misma columna. Sobre por qué un bug que falla a medias es peor que uno que revienta.
- Sincronización
- Arquitectura
- Android
Offline-first no es una casilla: es el modelo de datos entero
En Jornia agotamos el backlog offline antes de tocar sync. La regla que lo hizo posible no fue una lista de funciones: fue un filtro que aplicamos a cada una.
- Arquitectura
- Producto
- Offline
Qué preguntarle a quien te va a construir el software
Ocho preguntas que puedes hacer en la primera llamada, con la respuesta que debería preocuparte en cada una. Sirven con nosotros y sirven con cualquier otro.
- Decisiones de producto
- Método
"Cero rotura" casi nunca es cero
La migración de perfiles de LoverCast no rompió nada visible, y aun así no fue gratis. Sobre la diferencia entre no romper y no medir lo que rompes.
- Arquitectura
- Decisiones de producto
Migrar el esquema sin romper las apps que ya están instaladas
Pasar de una fila por usuario a una por perfil cuando hay APKs ahí fuera que no puedes actualizar, y por qué la vista de compatibilidad te compra menos de lo que crees.
- Android
- Arquitectura
- Bases de datos
- Postgres