Reto de código Grocery Store
En esta página
Este reto de código es el primero de una serie que iré publicando para TypeScript y Golang, aunque se puede completar en otros lenguajes. Como se usan en procesos internos de selección, te recomiendo que mantengas privados los repositorios de este reto.
Grocery Store
Un supermercado tiene que preparar actualizaciones para dos sistemas todas las noches a las 12:00 de la noche. Los sistemas consumen datos en sus propios formatos propietarios. Uno ya está generado y hay que actualizarlo, y el otro hay que generarlo a mano.
El primer sistema se usa para el pedido de existencias. Necesita saber cuántos productos se han consumido a lo largo del día para generar los pedidos de la tienda. Estos datos tienen formato XML.
El segundo sistema se usa para promociones a clientes. Necesita saber qué productos compró cada cliente. Solo recibirá información de los clientes que usaron su tarjeta de fidelidad al comprar. Estos datos tienen formato JSON.
Los pedidos del día están disponibles en un CSV. Cada pedido contiene el ID del pedido, el departamento, el producto y el ID del cliente (si lo hay).
Descargas
Kit de inicio para TypeScript
Si haces el reto en TypeScript, aprovecha el kit de inicio que tienes aquí. Incluye TypeScript, Jest, eslint y prettier ya configurados y listos para usar.
Si haces el reto para Coles, usa el kit de inicio.
Reto
Parte 1: agrupar los pedidos por cliente
Por cada cliente que hizo una compra en el día, agrupa sus pedidos por ID de cliente, incluyendo solo los productos comprados y la cantidad de cada uno.
No incluyas ningún pedido que no tenga ID de cliente.
Escribe esta salida JSON en un archivo llamado summaries/GroupedOrders.json.
Trata el archivo Customers.json como una base de datos. No todos los clientes del archivo Customers.json habrán hecho una compra ese día, y al leer el archivo conviene pensar en enfoques eficientes en memoria.
Parte 2: actualizar las existencias
El archivo Stock.xml incluye la cantidad de cada artículo comprado ese día y es incorrecto hasta que se actualiza con los pedidos de hoy. Por cada pedido, actualiza las cantidades correspondientes en el archivo Stock.xml.
Elimina los duplicados y añade los productos que no existan.
Las existencias actualizadas deben salir en summaries/Stock.xml.
Consideraciones
- Sé eficiente en memoria. Aunque este reto solo tiene ~3000 registros en total, en el mundo real las bases de datos pueden contener billones de registros.
- Trata el sistema de archivos como una base de datos: piensa en las IOPS y en el impacto de muchas operaciones de escritura a la vez.
- Usa los métodos asíncronos de
fssi haces el reto en TypeScript. - Piensa en código escalable: en una entrevista te pueden pedir ampliar el reto actual con componentes o datos nuevos.
- Mantenlo DRY, no te repitas. Usa tests, evita copiar lógica.
- Pásalo bien. Aunque no llegues a la siguiente ronda, estás aprendiendo cosas nuevas.
Entrega
Cuando prepares el reto para entregarlo, asegúrate de que tu repositorio es privado y de que tu revisor figura como colaborador. Si yo soy tu revisor, añade a willhackett.
Haz commits con regularidad. Aunque tus primeros intentos no sean ideales, conviene mostrar la progresión, y puede ayudar a contar la historia de cómo llegaste al producto final.