Desafio de código Grocery Store
Nesta página
Este desafio de código é o primeiro de uma série que vou publicar para TypeScript e Golang, embora possa ser feito noutras linguagens. Como são usados em recrutamento interno, recomendo que mantenhas privados os repositórios com este desafio.
Grocery Store
Uma mercearia precisa de preparar atualizações para dois sistemas todas as noites à meia-noite (12:00 AM). Os sistemas consomem dados nos seus próprios formatos proprietários. Um já está gerado e precisa de ser atualizado, o outro tem de ser gerado à mão.
O primeiro sistema serve para encomendar stock. Precisa de saber quantos produtos foram consumidos ao longo do dia, para poder gerar as encomendas da loja. Estes dados estão em XML.
O segundo sistema serve para promoções a clientes. Precisa de saber que produtos cada cliente comprou. Só recebe informação sobre os clientes que usaram o cartão de fidelização na compra. Estes dados estão em JSON.
As encomendas do dia estão num CSV. Cada encomenda tem o ID da encomenda, o departamento, o produto e o ID do cliente (se existir).
Descargas
Kit inicial de TypeScript
Se fizeres este desafio em TypeScript, considera usar o kit inicial disponível aqui. Este kit inclui TypeScript, Jest, eslint e prettier já configurados e prontos a usar.
Se estás a fazer o desafio para a Coles, usa o kit inicial.
Desafio
Parte 1: agrupar encomendas por cliente
Para cada cliente que fez uma compra nesse dia, agrupa as encomendas pelo ID do cliente, incluindo apenas os produtos comprados e a quantidade de cada um.
Não incluas nenhuma encomenda sem ID de cliente.
Escreve este resultado em JSON num ficheiro chamado summaries/GroupedOrders.json.
Trata o ficheiro Customers.json como uma base de dados: nem todos os clientes do ficheiro Customers.json terão feito uma compra nesse dia e, ao ler o ficheiro, pensa em abordagens eficientes em memória.
Parte 2: atualizar o stock
O ficheiro Stock.xml inclui a quantidade de cada artigo comprado nesse dia e está incorreto até ser atualizado com as encomendas de hoje. Para cada encomenda, atualiza as quantidades correspondentes no ficheiro Stock.xml.
Remove os duplicados e acrescenta os produtos que não existirem.
O stock atualizado deve ser escrito em summaries/Stock.xml.
Considerações
- Sê eficiente em memória. Embora este desafio tenha só cerca de 3 000 registos no total, no mundo real as bases de dados podem conter biliões de registos.
- Trata o sistema de ficheiros como uma base de dados: pensa nos IOPS e no impacto de muitas operações de escrita em simultâneo.
- Usa os métodos assíncronos de
fsse fizeres o desafio em TypeScript. - Pensa em código escalável: numa entrevista podem pedir-te que alargues o desafio atual com novos componentes ou dados.
- Mantém o DRY, não te repitas. Usa testes, evita copiar lógica.
- Diverte-te. Mesmo que não passes à fase seguinte, estás a aprender coisas novas.
Submissão
Ao preparar este desafio para submissão, garante que o teu repositório é privado e que o teu avaliador está adicionado como colaborador. Se eu for o teu avaliador, adiciona willhackett.
Faz commits com regularidade. Embora as primeiras tentativas possam não ser as ideais, é bom mostrar a progressão, e isso pode ajudar a contar a história de como chegaste ao produto final.