← Tous les articles

Défi de code Grocery Store

Sur cette page

Ce défi de code est le premier d’une série que je publierai pour TypeScript et Golang, même si on peut le faire dans d’autres langages. Comme ils servent au recrutement interne, je te conseille de garder privés les dépôts de ce défi.

Grocery Store

Une épicerie doit préparer des mises à jour pour deux systèmes chaque nuit à 12 h 00. Les systèmes consomment des données dans leurs propres formats propriétaires. L’un est déjà généré et doit être mis à jour, l’autre doit être généré à la main.

Le premier système sert à commander le stock. Il doit savoir combien de produits ont été consommés dans la journée pour générer les commandes du magasin. Ces données sont au format XML.

Le second système sert aux promotions envoyées aux clients. Il doit savoir quels produits chaque client a achetés. Il ne reçoit des informations que sur les clients qui ont utilisé leur carte de fidélité en passant commande. Ces données sont au format JSON.

Les commandes du jour sont dans un CSV. Chaque commande contient l’ID de commande, le rayon, le produit et l’ID client (s’il y en a un).

Téléchargements

Kit de démarrage TypeScript

Si tu fais ce défi en TypeScript, pense à utiliser le kit de démarrage disponible ici. Il inclut TypeScript, Jest, eslint et prettier, déjà configurés et prêts à l’emploi.

Si tu fais ce défi pour Coles, utilise le kit de démarrage.

Le défi

Partie 1 : regrouper les commandes par client

Pour chaque client qui a fait un achat dans la journée, regroupe ses commandes par ID client, en ne gardant que les produits achetés et la quantité de chacun.

N’inclus aucune commande sans ID client.

Écris cette sortie JSON dans un fichier nommé summaries/GroupedOrders.json.

Traite le fichier Customers.json comme une base de données. Tous les clients du fichier Customers.json n’ont pas forcément acheté quelque chose ce jour-là, et pense à des approches économes en mémoire pour lire le fichier.

Partie 2 : mettre à jour le stock

Le fichier Stock.xml contient la quantité de chaque article acheté dans la journée, et il est faux tant qu’on ne l’a pas mis à jour avec les commandes du jour. Pour chaque commande, mets à jour les quantités correspondantes dans le fichier Stock.xml.

Supprime les doublons et ajoute les produits qui n’existent pas.

Le stock mis à jour doit être écrit dans summaries/Stock.xml.

À prendre en compte

  1. Économise la mémoire. Ce défi ne compte qu’environ 3 000 enregistrements au total, mais dans la vraie vie, les bases de données peuvent en contenir des milliers de milliards.
  2. Traite le système de fichiers comme une base de données : pense aux IOPS et à l’effet de nombreuses écritures simultanées.
  3. Utilise les méthodes fs asynchrones si tu fais le défi en TypeScript.
  4. Pense à un code qui passe à l’échelle. En entretien, on peut te demander d’étendre le défi avec de nouveaux composants ou de nouvelles données.
  5. Reste DRY : ne te répète pas. Écris des tests, évite de copier la logique.
  6. Amuse-toi. Même si tu ne passes pas au tour suivant, tu apprends des choses.

Rendu

Quand tu prépares ce défi pour le rendre, vérifie que ton dépôt est privé et que ton relecteur y est ajouté comme contributeur. Si c’est moi, ajoute willhackett.

Fais des commits régulièrement. Tes premiers essais ne seront peut-être pas parfaits, mais c’est bien de montrer la progression, et ça peut aider à raconter comment tu es arrivé au résultat final.