Lecciones aprendidas al solucionar un problema con el carrito de compras

Rate this content
Bookmark

Los errores de producción pueden ser complicados, especialmente cuando no se pueden reproducir fácilmente o no ocurren con frecuencia. En esta charla, repasaremos un caso de estudio de un problema de coincidencia de cantidad en el carrito de compras y los pasos de solución de problemas que tomamos para resolverlo. Luego, basándonos en ese problema, aprenderemos algunas lecciones que todos podemos aplicar como desarrolladores frontend.

9 min
02 Dec, 2022

Comments

Sign in or register to post your comment.

Video Summary and Transcription

Esta charla discute las lecciones aprendidas al solucionar un problema con el carrito de compras en una aplicación de mercado de restaurantes. El error era difícil de reproducir pero ocurrió con más frecuencia a medida que la aplicación crecía. La investigación involucró verificar los registros del frontend y utilizar herramientas como Sentry y Fullstory. La solución consistió en utilizar la vista del cliente al finalizar la compra como fuente de verdad y enfatizar la importancia de las pruebas y la responsabilidad financiera.

Available in English

1. Lecciones aprendidas de solucionar un problema con el carrito de compras

Short description:

Voy a hablar sobre las lecciones aprendidas de solucionar un problema con el carrito de compras. Hoy hablaremos sobre React y trabajar con un ecosistema. Compartiré un error que encontré en una aplicación de mercado de restaurantes. Tenía un flujo de comercio electrónico estándar, pero ocurrió un problema extraño.

Voy a hablar hoy sobre las lecciones aprendidas de solucionar un problema con el carrito de compras. Así que, la mayoría de nosotros hemos utilizado carritos de compras. Mi nombre es Hussein. Soy un desarrollador de personal en Shopify y he estado trabajando en el desarrollo completo durante unos 10 años ahora. React durante siete. He cometido todos los errores posibles con React. Ahí está mi Twitter, si quieres seguirme. Fanático del Chelsea, desafortunadamente.

¿Por qué esta charla? Así que, hoy estamos hablando mucho sobre React. Muchos de nosotros usamos React. Codificamos en React. Pero la realidad es que siempre trabajas con un ecosistema. Siempre. Entonces, ya sea el navegador en el que estás usando React, las API web, como viste muchas de las escuchas de eventos. Tratas con clientes, si das un paso atrás. Todos tratamos con clientes en nuestro código. Y siempre tenemos un dominio comercial. Específicamente yo, ahora estoy en comercio electrónico. Entonces, todos tratamos con eso. Entonces, trabajas en un ecosistema, lo que agrega complejidad a tu aplicación, lo que a su vez agrega errores a tu aplicación. Y hoy estoy hablando de uno de esos errores que tuve. Así que, solo un breve contexto sobre este error. No fue en Shopify, fue en una startup en la que trabajé antes en 2019. Era una aplicación de mercado de restaurantes, construida en React y Redux, cientos de usuarios, millones en GMV, no tan grande, en comparación con Shopify, por supuesto. Teníamos alrededor de 50 empleados, alrededor de 10 a 15 eran desarrolladores de tecnología. Entonces, hay un camino feliz en la aplicación, que es bastante estándar en el comercio electrónico. Inicias sesión, agregas artículos a tu carrito, proporcionas información de envío, pagas, recibes ese dinero y luego recibes tus artículos. Bastante estándar, ¿verdad? Como esto es lo que hacen la mayoría de los sitios de comercio electrónico. Eso es lo que teníamos. Pero luego tuvimos un problema muy extraño aquí.

2. Solución de problemas del error del carrito de compras

Short description:

Una vez al mes o menos, un cliente informaba un error en el que recibían menos artículos de los que habían pedido. Verificamos el pedido en el backend, los registros del servidor y los correos electrónicos al proveedor. Nuestros datos en la base de datos coincidían con todo, por lo que el cliente cometió un error. Es importante tener en cuenta las suposiciones al solucionar errores.

Una vez al mes o menos, como una vez al mes o menos, un cliente informaba un error específico, y decían que recibieron menos artículos de los que realmente habían pedido. ¿Qué significa eso? Entonces, la aplicación es un poco diferente ahora. Así que tuve que hacer un poco de trabajo de captura de pantalla. Aquí puedes ver, por ejemplo, cinco cajas de piña, es lo que pidieron. Entonces, un cliente, por ejemplo, diría que en realidad recibieron seis o siete cajas, no cinco. Muy extraño, muy malo. ¿Qué hacemos entonces? En la vida de una startup, hicimos lo mismo que cualquier desarrollador haría. Verificar el pedido en el backend. Asegurarnos de que los números fueran correctos. Revisamos los registros del servidor, para ver si había errores y si los números coincidían. Verificamos los correos electrónicos que enviamos al proveedor, ¿eran el número correcto? Y lo que vimos es que resulta que nuestros números en la database coinciden con todo. Así que le dijimos al cliente, estás equivocado. Nuestros data son correctos, qué lástima. ¿Entiendes a lo que me refiero? Entonces cometiste un error, básicamente. Y por eso es importante hablar sobre nuestras suposiciones cuando tenemos errores. Esto te da un poco de contexto sobre lo que estábamos pensando en ese momento.

3. Desafíos con faltantes y artículos faltantes

Short description:

En la industria de restaurantes, los faltantes y los artículos faltantes son comunes. Los clientes a menudo hacen pedidos en grandes cantidades, lo que brinda amplias oportunidades para cometer errores. El error que encontramos era raro y difícil de reproducir. Sin embargo, a medida que crecíamos, comenzó a ocurrir con más frecuencia con clientes más grandes. Tuvimos que investigarlo seriamente, probando enfoques tanto en el backend como en el frontend.

En la industria de restaurantes en América del Norte, tenemos este concepto de faltantes. Entonces, cuando haces un pedido en Amazon, pides dos o tres artículos, vas a recibir esos artículos. Nadie te dice después de hacer el pedido, dicen, `oye, qué lástima, solo puedo conseguirte dos cosas de esas tres`. En la industria de restaurantes, es diferente. Llego con cinco cajas de piña que pediste, solo tengo cuatro. Entonces digo, `oye, cliente, solo tenía cuatro esta mañana`. Te daré un crédito. O, ya sabes, a veces el cliente ve cinco cajas y dice, `esta se ve terrible`, no la quiero, así que la devuelven en el acto. Esto es común en la industria. Los faltantes y los artículos faltantes son comunes. La otra cosa es, como, cuando hago un pedido en Amazon, pido, como, dos o tres cosas a la vez. Como, nunca pido, como, sabes, como 50 bolsas de café, aunque quiera. Pero en esta industria, ya sabes, la gente hace pedidos, como, 20 latas de tomate, 50 cabezas de lechuga, 60, lo que sea. Entonces hay muchas oportunidades para cometer errores en esos artículos. Muchas veces nuestros clientes no eran expertos en tecnología, por lo que muchas veces los errores no eran errores reales. Esto es algo a lo que estábamos acostumbrados. Y el error ni siquiera ocurría con tanta frecuencia. Era menos de una vez al mes, y no pudimos reproducirlo en absoluto. Así que para nosotros, ya sabes, esta es la mentalidad con la que abordamos el problema. Y fue muy, como, despectivo. Y esa es la gran razón por la que creo que se mantuvo ahí. Entonces, el problema es que a medida que crecíamos, comenzó a ocurrir con clientes más grandes una vez a la semana ahora. Así que tuvimos que comenzar a investigarlo muy, muy, muy seriamente. Entonces, nuevamente, el enfoque del backend que tomamos, este es el que hicimos antes. Lo intentamos de nuevo. Intentamos lo mismo. No hay nada mal. ¿Entonces qué está pasando? Pero sabemos que es un problema ahora. De acuerdo. Enfoque del frontend.

4. Investigando el Error del Carrito de Compras

Short description:

Revisamos nuestros registros del frontend, utilizamos herramientas como Sentry y Fullstory para investigar un error del carrito de compras. Vimos que el error ocurría en producción, pero no pudimos reproducirlo. El problema estaba relacionado con las solicitudes que no llegaban al servidor, posiblemente debido a una mala conexión Wi-Fi en las cocinas de los restaurantes.

Revisamos nuestros registros del frontend. En ese momento estábamos utilizando Sentry. Aún así, no encontramos nada. Continuamos reproduciéndolo en diferentes navegadores y dispositivos móviles. Equipo de control de calidad. Aún no pudimos encontrar nada.

Finalmente, revisamos un software de grabación llamado Fullstory. Así que si alguno de ustedes está familiarizado con Fullstory, es una especie de herramienta de análisis que permite grabar las sesiones de usuario. Muy buena aplicación. LogRocket es otro ejemplo que me encanta para los desarrolladores de frontend, en particular. Con esta grabación, pude ver el error ocurriendo en producción. Vi a un cliente tener, como, seis artículos en su carrito de compras, y luego de repente solo había cinco. Lo vi con mis propios ojos, ahora no se puede negar. Pero aún no pudimos reproducirlo. Y si no puedes reproducirlo, ¿cómo lo solucionas?

Ahora tenemos que reproducirlo. Entonces, ¿cómo podría haber ocurrido esto? Este es un ejemplo. Como el carrito de compras, se ve mucho con los botones de más y menos. Lo que sucedió fue que un cliente estaba haciendo clic en más más más más más más. Y cada vez que enviamos la solicitud al servidor y, ya sabes, estábamos debounceando y cosas así. Pero cada vez que presionaban el botón, enviaban una solicitud al servidor. De alguna manera, esta solicitud para cambiar la cantidad simplemente no llegaba al servidor. ¿Verdad? De alguna manera no lo hacía. Así que cuando llegabas a la página de pago, no lo veías. En ese momento, tuve una sospecha porque estaba trabajando mucho con restaurantes en persona. Una cosa que noté es que muchas veces los restaurantes, la persona misma, ponía su pedido en su cocina. Y en la cocina, la conexión Wi-Fi suele ser bastante mala. Así que pensé, tal vez la solicitud no llega porque la conexión Wi-Fi es mala. ¿Sabes? Esta podría ser la razón. Así que hice algo que quizás te resulte familiar.

5. Lecciones de Solución de Problemas del Error del Carrito de Compras

Short description:

Encontramos la solución al error del carrito de compras utilizando lo que el cliente ve al momento de pagar como la fuente de verdad. No nos importa lo que el servidor diga si hay una discrepancia entre el carrito de compras y el pago. Las lecciones aprendidas incluyen comenzar asumiendo que el error es culpa tuya y utilizar grabaciones de pantalla para ayudar a los desarrolladores de frontend.

Haz un throttling, una conexión lenta 3G. Pensé, vamos a intentarlo. Quiero decir, hemos intentado de todo. ¿Y sabes qué? Ese era el problema. ¿Verdad? Así que ahora pudimos reproducirlo. Entonces, ¿cómo lo solucionamos? Bueno, sabíamos que no llegaba a tiempo a la página de pago, por eso sucedía. Así que ves las diferentes cantidades. Entonces, lo que terminamos haciendo, y esto es un ejemplo aquí, es utilizar lo que el cliente ve al momento de pagar, o al momento del carrito de compras, como la fuente de verdad, no el servidor. Lo que ve el cliente. Porque eso es lo único que importaba. Así que si hay una discrepancia entre el carrito de compras y el pago, ¿verdad? Como si hay seis en el carrito de compras y luego cinco en el pago. No nos importa lo que diga el servidor. Es lo que el cliente vio. Así que lo cambiamos de vuelta. Y eso es lo que hicimos. Porque estas son dos páginas diferentes. De esa manera, la versión que ve el cliente es siempre lo que obtienen. Y nunca volvimos a tener ese problema.

Para resumir, las lecciones aprendidas. La fuente de verdad no es el servidor. No siempre es el servidor. A veces sí lo es. Comienza asumiendo que el error es culpa tuya. Hay un dicho que se llama `select no está roto`, lo que básicamente significa, como, sabes, la database en sí no está rota. Tú rompiste algo. Tú causaste el problema. Acércate a ello desde esa mentalidad. Las grabaciones de pantalla son muy útiles para los desarrolladores de frontend. Si puedes hacerlo, asegúrate de bloquear cualquier información personal. Muchos lo hacen automáticamente, pero a veces, dependiendo de tu industria, puede ser más estricto.

6. Importancia de las pruebas y la responsabilidad financiera

Short description:

No pruebes tu aplicación en las mejores condiciones. Suposiciones incorrectas pueden costarte dinero. En Shopify, nuestra escala es masiva, con millones de dólares en ventas por minuto. Comparto estas lecciones para evitar repeticiones y transmitir conocimiento a otros desarrolladores.

Y no pruebes tu aplicación en las mejores condiciones. Lo hacemos mucho como desarrolladores. Estás como, en mi, ya sabes, Macbook, 64 gigas de RAM y la mejor conexión a Internet del mundo. Era perfecto. Entonces, ¿cuál es el problema, verdad? Entonces, ¿por qué importa esto?

Suposiciones incorrectas pueden y te costarán dinero. Personalmente, le costé a la empresa unos miles de dólares. No es gran cosa, ¿verdad? Ahora, en Shopify, nuestra escala es muy masiva. $3.5 millones de dólares en ventas por minuto en el Viernes Negro. Así que no puedo hacer eso. Pero si lo hago en Shopify, es una responsabilidad financiera mucho mayor. Así que tomo estas lecciones como una forma de no repetirlas en Shopify. Y transmito este conocimiento a otros desarrolladores para asegurarme de que abordemos los errores con una mentalidad similar a la que tuvimos después de resolverlo.

Eso es todo en mi charla. Muchas gracias, y espero que hayas aprendido algo.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

GraphQL Galaxy 2022GraphQL Galaxy 2022
31 min
Your GraphQL Groove
Building with GraphQL for the first time can be anywhere between daunting and easy-peasy. Understanding which features to look for in your client-side and server-side tooling and getting into the right habits (and ridding yourself of old habits) is the key to succeed with a team of any size in GraphQL.

This talk gives an overview of common struggles I've seen numerous teams have when building with GraphQL, how they got around common sources of frustration, and the mindset they eventually adopted, and lessons learned, so you can confidently stick with and adopt GraphQL!
DevOps.js Conf 2024DevOps.js Conf 2024
25 min
Atomic Deployment for JS Hipsters
Deploying an app is all but an easy process. You will encounter a lot of glitches and pain points to solve to have it working properly. The worst is: that now that you can deploy your app in production, how can't you also deploy all branches in the project to get access to live previews? And be able to do a fast-revert on-demand?Fortunately, the classic DevOps toolkit has all you need to achieve it without compromising your mental health. By expertly mixing Git, Unix tools, and API calls, and orchestrating all of them with JavaScript, you'll master the secret of safe atomic deployments.No more need to rely on commercial services: become the perfect tool master and netlifize your app right at home!
React Advanced Conference 2021React Advanced Conference 2021
6 min
Full-stack & typesafe React (+Native) apps with tRPC.io
Top Content
Why are we devs so obsessed with decoupling things that are coupled nature? tRPC is a library that replaces the need for GraphQL or REST for internal APIs. When using it, you simply write backend functions whose input and output shapes are instantly inferred in your frontend without any code generation; making writing API schemas a thing of the past. It's lightweight, not tied to React, HTTP-cacheable, and can be incrementally adopted. In this talk, I'll give a glimpse of the DX you can get from tRPC and how (and why) to get started.

Workshops on related topic

React Advanced Conference 2021React Advanced Conference 2021
168 min
How to create editor experiences your team will love
Workshop
Content is a crucial part of what you build on the web. Modern web technologies brings a lot to the developer experience in terms of building content-driven sites, but how can we improve things for editors and content creators? In this workshop you’ll learn how use Sanity.io to approach structured content modeling, and how to build, iterate, and configure your own CMS to unify data models with efficient and delightful editor experiences. It’s intended for web developers who want to deliver better content experiences for their content teams and clients.