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
- É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.
- Traite le système de fichiers comme une base de données : pense aux IOPS et à l’effet de nombreuses écritures simultanées.
- Utilise les méthodes
fsasynchrones si tu fais le défi en TypeScript. - 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.
- Reste DRY : ne te répète pas. Écris des tests, évite de copier la logique.
- 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.