← Alle berichten

Codeeropdracht Grocery Store

Op deze pagina

Deze codeeropdracht is de eerste van een serie die ik ga plaatsen voor TypeScript en Golang, al kun je hem ook in andere talen maken. Omdat ze worden gebruikt voor interne werving, raad ik je aan je repositories bij deze opdracht privé te houden.

Grocery Store

Een supermarkt moet elke nacht om 12:00 uur ‘s nachts updates voorbereiden voor twee systemen. De systemen lezen data in hun eigen formaten. Het ene bestand is al gegenereerd en moet worden bijgewerkt, het andere moet je zelf genereren.

Het eerste systeem is voor voorraadbestellingen. Het moet weten hoeveel producten er de hele dag zijn verbruikt, zodat het bestellingen voor de winkel kan genereren. Deze data is opgemaakt als XML.

Het tweede systeem is voor promoties aan klanten. Het moet weten welke producten elke klant heeft gekocht. Het ontvangt alleen informatie over klanten die bij het bestellen hun klantenkaart hebben gebruikt. Deze data is opgemaakt als JSON.

De bestellingen van de dag staan in een CSV. Elke bestelling bevat het bestel-ID, de afdeling, het product en het klant-ID (als dat beschikbaar is).

Downloads

TypeScript starter kit

Maak je deze opdracht in TypeScript, gebruik dan gerust de starter kit die hier staat. Die bevat TypeScript, Jest, eslint en prettier, al ingesteld en klaar voor gebruik.

Doe je de opdracht voor Coles, gebruik dan de starter kit.

Opdracht

Deel 1: Bestellingen per klant groeperen

Groepeer voor elke klant die op die dag iets kocht de bestellingen op klant-ID, en neem alleen de gekochte producten en de gekochte hoeveelheid per product op.

Neem geen bestellingen op zonder klant-ID.

Schrijf deze JSON-uitvoer naar een bestand met de naam summaries/GroupedOrders.json.

Behandel het bestand Customers.json als een database. Niet alle klanten in Customers.json hebben die dag iets gekocht en als je uit het bestand leest, houd dan rekening met geheugenzuinige aanpakken.

Deel 2: Voorraad bijwerken

Het bestand Stock.xml bevat de hoeveelheid van elk item dat die dag is gekocht en is onjuist totdat je het bijwerkt met de bestellingen van vandaag. Werk voor elke bestelling de bijbehorende hoeveelheden in Stock.xml bij.

Verwijder dubbele items en voeg producten toe als ze nog niet bestaan.

De bijgewerkte voorraad moet naar summaries/Stock.xml.

Aandachtspunten

  1. Wees geheugenzuinig. Deze opdracht heeft maar ~3.000 records, maar in de praktijk kunnen databases biljoenen records bevatten.
  2. Behandel het bestandssysteem als een database. Denk aan IOPS en de impact van veel gelijktijdige schrijfacties.
  3. Gebruik asynchrone fs-methoden als je de opdracht in TypeScript maakt.
  4. Denk aan schaalbaar coderen. In een gesprek kun je gevraagd worden de opdracht uit te breiden met nieuwe onderdelen of data.
  5. Hou het DRY: herhaal jezelf niet. Gebruik tests en vermijd gekopieerde logica.
  6. Heb plezier. Ook als je de volgende ronde niet haalt, leer je nieuwe dingen.

Inleveren

Zorg als je de opdracht klaarmaakt om in te leveren dat je repository privé is en dat je beoordelaar als contributor is toegevoegd. Ben ik je beoordelaar, voeg dan willhackett toe.

Commit regelmatig. Je eerste pogingen zijn misschien niet ideaal, maar het is goed om vooruitgang te laten zien en het kan helpen het verhaal te vertellen over hoe je bij het eindproduct kwam.