← Todos os textos

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 dê para resolver em outras linguagens. Como esses desafios são usados em recrutamento interno, recomendo que você mantenha privados os repositórios com esta solução.

Grocery Store

Um mercado precisa preparar atualizações para dois sistemas toda noite às 12:00 AM. Os sistemas consomem dados em formatos proprietários próprios. Um já está gerado e precisa ser atualizado, e o outro precisa ser gerado manualmente.

O primeiro sistema é usado para pedidos de estoque. Ele precisa saber quantos produtos foram consumidos ao longo do dia para gerar os pedidos da loja. Esses dados têm formato XML.

O segundo sistema é usado para promoções aos clientes. Ele precisa saber quais produtos cada cliente comprou. Só recebe informações dos clientes que usaram o cartão de fidelidade na hora da compra. Esses dados têm formato JSON.

Os pedidos do dia estão disponíveis em um CSV. Cada pedido traz o ID do pedido, o departamento, o produto e o ID do cliente (se houver).

Downloads

Starter kit de TypeScript

Se você for fazer o desafio em TypeScript, considere usar o starter kit disponível aqui. Ele já vem com TypeScript, Jest, eslint e prettier configurados e prontos para uso.

Se você estiver fazendo o desafio para a Coles, use o starter kit.

Desafio

Parte 1: agrupamento de pedidos por cliente

Para cada cliente que fez uma compra no dia, agrupe os pedidos pelo ID do cliente, incluindo só os produtos comprados e a quantidade de cada um.

Não inclua pedidos que não tenham ID de cliente.

Grave essa saída JSON em um arquivo chamado summaries/GroupedOrders.json.

Trate o arquivo Customers.json como um banco de dados. Nem todos os clientes do Customers.json terão feito uma compra naquele dia, e ao ler o arquivo, pense em abordagens eficientes no uso de memória.

Parte 2: atualização do estoque

O arquivo Stock.xml inclui a quantidade de cada item comprado no dia e está incorreto até ser atualizado com os pedidos de hoje. Para cada pedido, atualize as quantidades correspondentes no arquivo Stock.xml.

Remova duplicatas e adicione os produtos que não existirem.

O estoque atualizado deve ser gravado em summaries/Stock.xml.

Considerações

  1. Seja eficiente no uso de memória. Embora este desafio tenha só ~3.000 registros no total, no mundo real os bancos de dados podem ter trilhões de registros.
  2. Trate o sistema de arquivos como um banco de dados. Considere o IOPS e o impacto de muitas operações de escrita ao mesmo tempo.
  3. Use os métodos assíncronos do fs se estiver fazendo o desafio em TypeScript.
  4. Pense em código escalável. Numa entrevista, você pode ser convidado a ampliar o desafio com novos componentes ou dados.
  5. Mantenha o DRY: don’t repeat yourself. Use testes e evite copiar lógica.
  6. Divirta-se. Mesmo que você não passe para a próxima fase, está aprendendo coisas novas.

Envio

Ao preparar este desafio para envio, garanta que seu repositório seja privado e que seu avaliador esteja adicionado como colaborador. Se eu for seu avaliador, adicione willhackett.

Faça commits com frequência. Suas primeiras tentativas podem não ser ideais, mas é bom mostrar a evolução, e isso pode ajudar a contar a história de como você chegou ao produto final.