Tu usuario no vive en el servidor: Midiendo la experiencia real
En el artículo anterior hablé sobre el rol del Product Engineer y la importancia de entender el impacto de nuestro trabajo, incluso más allá del momento del release. Hoy voy a profundizar en el concepto de medición.
Por lo general, cuando hablamos de rendimiento, lo primero que se nos viene a la cabeza son los datos de rendimiento del backend. Pensamos en el uso de la CPU, la memoria, el tiempo de respuesta, las tasas de error y la latencia. Pero ¿qué pasa cuando todo eso está bien y los usuarios siguen sintiendo que la aplicación es lenta?
El problema es que el frontend no es tan fácil de medir, ya que estamos lejos de poder controlarlo al 100%. Nuestra aplicación va a correr en distintos dispositivos, con distintas conexiones y en condiciones impredecibles.
Por esto no podemos confiarnos en las métricas del servidor; no nos alcanzan. Necesitamos medir la experiencia de usuario.
Web vitals
Google propone los Web Vitals como una guía unificada de señales para medir la calidad de nuestra web. Específicamente, existe un subconjunto llamado Core Web Vitals, diseñado para cuantificar la experiencia directa de los usuarios.
Estos pueden variar con el tiempo, pero hoy el foco está puesto en tres pilares: carga, interactividad y estabilidad visual. Es súper importante que sepamos traducir el dato numérico a la sensación del usuario:
- Largest Contentful Paint (LCP): Mide la carga. Se enfoca en ver cuánto tiempo tarda en aparecer el contenido más grande visible en pantalla. Para considerar que la experiencia es buena, debe ocurrir en menos de 2.5 segundos.
- Interaction to Next Paint (INP): Mide la interactividad. Se enfoca en ver qué pasa cuando el usuario hace un click. ¿La página reacciona inmediatamente o se congela? Debería ser menor a 200ms.
- Cumulative Layout Shift (CLS): Mide la estabilidad visual. Mientras carga la página, ¿los elementos se mueven de forma inesperada? Esta métrica debe ser menor a 0.1.
Algo crucial es la forma en que medimos. Podemos hacerlo desde nuestras Chrome DevTools, pero esto se conoce como Lab Data: un escenario idealista. Si tenemos la última MacBook Pro y fibra óptica, el dato no será representativo.
Por eso, es interesante incluir la librería web-vitals en nuestro proyecto para reportar métricas de usuarios reales (Field Data) y contar con un panorama real.
Error Boundaries
En React, cuando ocurre un error durante el renderizado, la librería desmonta por defecto toda la interfaz. Esto da como resultado una pantalla en blanco.
Los Error Boundaries son componentes que atrapan esos errores y reemplazan ese pantallazo blanco por una interfaz alternativa que nosotros decidamos (“Ups, algo salió mal”).
Es importante contar con estas alternativas para comunicar al usuario lo que ocurre, pero nuestro trabajo no termina ahí. Si el cartel de error aparece 100 veces al día, indica un problema profundo, aunque la app no se haya “roto”. Necesitamos medir la frecuencia de activación de estos boundaries para entender la salud real de la aplicación.
Cuantificar la frustración
Hay un escenario en el que los Web Vitals se ven bien y no hay errores de código, pero el usuario sigue descontento. ¿Qué pasa ahí?
Existe un campo muy interesante para medir la frustración mediante el comportamiento:
- Rage Clicks: Ocurre cuando el usuario clickea rápido y muchas veces sobre un mismo elemento. Señal de que la UI no da feedback, es confusa o no responde.
- Dead Clicks: El usuario hace click sobre algo que parece interactivo, pero no hace nada. Suele ser un problema de diseño.
- Error Clicks: Un click que lanza un error inmediato de JavaScript.
Herramientas como PostHog, Sentry o LogRocket nos permiten visualizarlo mediante Session Replays o Heatmaps. Ver a un usuario frustrado en una grabación vale más que mil logs.
Performance percibida
Quizás la estrategia más importante de todas es el uso de la psicología. La percepción de fluidez es más importante que la velocidad real.
El ejemplo clásico es el del ascensor. En el pasado, la gente se quejaba de que eran lentos. La solución de ingeniería hubiera sido invertir en motores más rápidos (costoso e ineficiente). La solución de producto consistió en instalar espejos.
La gente empezó a usar el tiempo para acomodarse la ropa o para mirarse. El tiempo de viaje era el mismo, pero la percepción cambió: el viaje se sentía más corto.
En el frontend pasa lo mismo:
- Un spinner en una pantalla blanca hace que 500ms parezcan una hora.
- Un Skeleton animado hace que el usuario sienta progreso y la espera disminuya.
Un ejemplo moderno son los LLMs (como ChatGPT). En lugar de un simple “Cargando…”, muestran mensajes como “Analizando…”, “Buscando…” y “Generando…”. Dan feedback constante para generar sensación de avance.
Como ingenieros, tenemos herramientas para mejorar esto: Optimistic UI, Local-first, Background Sync. Temas en los que profundizaremos más adelante.
Conclusión
Para conocer el impacto de nuestro trabajo necesitamos medir la experiencia real, y eso requiere ver lo que hace el usuario. Si dominamos los Core Web Vitals, controlamos los errores y reducimos las frustraciones, tendremos una base sólida.
Pero eso no alcanza. Una app rápida y sin errores no es garantía de éxito. En el próximo artículo hablaré de las otras métricas: las de negocio. ¿Cómo medimos si lo que lanzamos a producción está aportando valor real?