DEV Community

Francisco Zanfranceschi
Francisco Zanfranceschi

Posted on

[Desafio] - Desenhar uma Solução de Lançamentos Financeiros a Partir de Requisitos

Conteúdo original em https://twitter.com/zanfranceschi/status/1601954872168837120


Ei dev, achou que minhas threads tinham ido de base, né? 🤭

Pra você que cansou de fazer CRUD e tá sem inspiração pra estudar/praticar, vou propor um desafio em que só descrevo os requisitos e restrições sobre um assunto conhecido – lançamentos financeiros.

cc @sseraphini

Image


Esse tipo de situação é comum pra quem trabalha com desenvolvimento. O cliente quer uma aplicação, fala como algumas coisas têm que ser e deixa outras em aberto. É um cenário realista e legal pra quem gosta de arquitetura e/ou quer alguma coisa diferente pra praticar.


DISCLAIMER

Esse é um desafio um pouco mais avançando. Então se vc for iniciante não se preocupe caso não entenda alguma coisa. Se quiser mesmo assim fazer e tiver alguma dúvida, é só perguntar aqui! Só gente legal lê minhas threads e alguém vai te ajudar! 💕


Vamos então começar com o que a nossa solução deverá entregar. É basicamente uma API mais ou menos como mostra a imagem.

São dois endpoints, um para o saldo atual e outro para mostrar os lançamentos.

Image


Bora pros requisitos.

- Essa API deve ser otimizada pra leitura. Ela deve apenas ler o saldo pronto de um banco de dados sem precisar computá-lo a cada leitura.

- Ela tem que limitar a leitura dos lançamentos – uma paginação e filtros por período são necessários.


- Apenas lançamentos de até 90 dias ficam disponíveis no endpoint de lançamentos – nada antes disso.

- Para lançamentos anteriores a 90 dias, tem que haver um endpoint para fazer a solicitação e então a aplicação gerar um arquivo para ficar disponível pra download. +


Então, na verdade, precisamos de mais alguns endpoints: solicitação de lançamentos anteriores a 90 dias; consulta dessas solicitações; e download desses lançamentos antigos. Ah, tem que haver um expurgo desses arquivos também. (Esteja preparada/o para solicitações de mudanças!)


- Para alimentar o banco da API, os lançamentos são disponibilizados de duas formas:

1- Um arquivo gerado diariamente; e

2- Uma fila onde, em tempo quase real, os lançamentos são publicados.

Aqui, a abordagem com filas é mais desejada do que a leitura de arquivos, tá?


- O processamento (tanto das mensagens nas filas ou dos arquivos) precisa ser idempotentes! Ou seja, se a mesma mensagem ou arquivo for processado duas ou mais vezes, o saldo e os lançamentos precisam permanecer corretos.


- Inicialmente, existe uma restrição de runtime em que a primeira versão da solução precisa ter todos os componentes compartilhando o mesmo processo (API, daemons, consumidores, etc) – exceto o banco.


- 4 meses após o lançamento da primeira versão, os componentes devem ser executados em processos distintos – runtimes dedicados –, inclusive com execuções individuais de CI/CD. E essa mudança de um runtime compartilhado para runtimes dedicados precisa ser a mais rápida possível!


- A solução deve funcionar adequadamente com distribuição de carga entre vários nós/servidores. Ou seja, deve escalar horizontalmente, tratar condições de corrida e possuir o mínimo possível de estado nos nós que não sejam os de banco de dados.

- Use o banco de dados que quiser.


- Use a lang/stack que quiser.

- Não negligencie a observabilidade: métricas, logs, e talvez rastreabilidade.


- Lembra dos até 90 dias de lançamentos? Tudo que for anterior a isso, mova do banco onde estão os lançamentos para um armazenamento mais barato. E tudo que for anterior a 3 anos, expurgue – exclua definitivamente.


É isso, gente. Eu poderia ficar horas e horas inventando requisitos, mas a thread ficaria enorme. De toda forma, acredito que tenha conseguido inventar um desafio com requisitos realistas pra vc poder estudar/praticar/pensar. E claro!, adicione seus requisitos também, se quiser.


Queria agradecer de coração se você leu até aqui e/ou me acompanha dando essa moral, sabe? É por você e pelo compartilhamento de experiências que escrevo esse tipo de conteúdo. ♥️

Muito obrigado! 🥹

Top comments (3)

Collapse
 
luanmobile profile image
Luan Henrique

Bom dia Francisco, tudo bem ? Queria uma ajuda, fiquei com dúvida nessa parte dos lançamentos. O que seria os campos "descricao" e "salario" ?

Collapse
 
zanfranceschi profile image
Francisco Zanfranceschi

Oi, Luan. Tudo bem? Tá errada a imagem! Não tinha percebido. Tudo deveria ser apenas "descrição". Algum copia/cola que fiz errado.

Abraço.

Collapse
 
luanmobile profile image
Luan Henrique

Boa noite Francisco, tudo bem ? Finalizei o desafio e gostaria de deixar aqui, caso tiver algo faltando ou que eu pudesse melhorar, agradeceria por uma avaliação sua.

github.com/LuanMobile/desafio-disc...