Indo alem do_mvc_node_js

Indo além do MVC
com Node.JS
by Gustavo S. Rodrigues (@gustavo_s_r)
Sobre o palestrante
Sou um arquiteto de soluções
apaixonado por linhas de códigos e
por problemas não convencionais.
Já atuei como executivo de contas,
analista de QA, analista de
requisitos, programador Front-end,
Programador Back-end,
Desenvolvedor Full-Stack e
Arquiteto de Soluções prestando
serviços para clientes como Porto
Seguro, Terra, Claro e Natura. Gustavo S. Rodrigues
Sobre o que falaremos?
Essa palestra tem o objetivo de
apresentar conceitos de construção
de aplicações escaláveis e de fácil
manutenção, aplicando padrões de
projetos conhecidos mas com
Node.js
Keep it simple
stupid
Um bom software não é aquele que
tem menos linhas de código, assim
como não é o que implementa
funções ou atribuições complexas.
Qual dessas estruturas encontramos mais
complexidade?
/models
/routes
/modules(ou libs)
index.js
config.js
middlewares.js
package.json
/configs/
/infraestructure/providers/{external_resources}
/infraestructure/adapters/
/domains/models/
/domains/repositories/
/domains/datasource.js
/http/controllers/
/http/middlewares/
/http/routes/
/modules/
index.js
package.json
?!
/configs/
/infraestructure/providers/{external_
resources}
/infraestructure/adapters/
/domains/models/
/domains/repositories/
/domains/datasource.js
/http/controllers/
/http/middlewares/
/http/routes/
/modules/
index.js
package.json
Don't repeat
yourself
Estruturas mal definidas ou muito
reduzidas tendem a trazer consigo mais
responsabilidades para um bloco de
código, e por sua vez gera uma curva
exponencial de complexidade, que
dificulta a sustentação desse projeto
Show me the code!
O Que são Repositories?
Repository
Um sistema com um modelo de domínio complexo geralmente se beneficia de uma camada, como a
fornecida pelo Data Mapper (165), que isola os objetos de domínio dos detalhes do código de acesso ao
banco de dados. Em tais sistemas, pode valer a pena construir outra camada de abstração sobre a
camada de mapeamento, onde o código de construção da consulta é concentrado. Isso se torna mais
importante quando há um grande número de classes de domínio ou consultas pesadas. Nesses casos,
especialmente, adicionar essa camada ajuda a minimizar a lógica de consulta duplicada. Um Repositório
medeia entre o domínio e as camadas de mapeamento de dados, agindo como uma coleção de objetos
de domínio na memória. Objetos clientes constroem especificações de consulta declarativamente e as
submetem ao Repositório para satisfação. Objetos podem ser adicionados e removidos do Repositório,
como eles podem de uma simples coleção de objetos, e o código de mapeamento encapsulado pelo
Repositório realizará as operações apropriadas nos bastidores. Conceitualmente, um Repositório
encapsula o conjunto de objetos persistidos em um armazenamento de dados e as operações
executadas sobre eles, fornecendo uma visão mais orientada a objeto da camada de persistência. O
Repository também suporta o objetivo de obter uma separação limpa e uma dependência unidirecional
entre o domínio e as camadas de mapeamento de dados. (Patterns of Enterprise Application Architecture,
Martin Fowler)
Separar a regra de abstração de dados das regras de
controle te traz a flexibilidade de em apenas um lugar
controlar os provedores de dados, tornando mais fácil
a implementação de uso de mais de uma modalidade
de banco de dados ou de implementação de cache de
dados, sem se preocupar com re-implementar isso em
todos os controllers.
Por que separar
camada de controller
das camadas de rota?
Temos a tendência natural de acreditar que controller
deve por si só resolver chamadas http, mas a partir
dos momento que sua aplicação pode ser invocada via
função Lambda por handler, ou que sua controller
pode ser invocada por uma instrução bash, você
começa a observar que o controller serve para tratar
regras de negócio, recebendo dados de entrada,
tratando-os e devolvendo algo, e é papel de quem o
implementa definir o protocolo de entrada e saída,
seja HTTP ou não.
Existem outros modelos?
Claro que sim, depende do tamanho e da
complexidade do sistema que você pretende
construir, o modelo anterior colocamos apenas
algumas camadas de apoio para suportar mudanças
de forma mais simples, mas existem modelos mais
granulares como o do próximo slide.
Modelos
ONION
https://medium.com/@domagojk/patterns-for-designing-flexible-
architecture-in-node-js-cqrs-es-onion-7eb10bbefe17
Modelos
ONION
https://medium.com/@Killavus/hexagonal-architecture-in-
javascript-applications-and-how-it-relates-to-flux-349616d1268d
Fazer simples é mais difícil do que sair implementado
código, mas o preço que se paga é gigantesco quando
seu projeto cresce!
E o que vem depois?
Não é possível implementar bons padrões de
arquitetura sem uma inteira remodelagem no seu
processo de delivery!
TDD ou BDD
Independente do conceito aplicado,
teste, faça sempre uma cobertura
de teste no mínimo de 80% da sua
aplicação, entre testes unitários e
end-to-end.
Automatize atualizações
Com uma boa cobertura de testes,
algumas coisas como atualização
de pacotes de forma automática
para garantir o uso dos módulos em
suas versões mais atualizadas e
seguras utilizando o Renovate Bot
(https://renovatebot.com/)
Garanta deploys seguros
Além de utilizar uma boa ferramenta
de CI/CI, é importante que além de
automatizar o processo de build,
que se automatize os testes, e mais
do que isso, que garanta que seu
projeto continue seguro.
Faça uma arquitetura de
referência
Mais importante que usar boas
práticas de desenvolvimento,
documente, crie boilerplates básicos
de implementações para reuso,
construa libs e mais do que isso,
compartilhe código com a
comunidade.
Onde Aprender mais sobre Good parts?
Links
12 Fator - https://12factor.net/pt_br/
System design primer - https://github.com/donnemartin/system-design-primer/
P of EAA - https://martinfowler.com/books/eaa.html
SOLID NODE - https://medium.com/@domagojk/patterns-for-designing-flexible-
architecture-in-node-js-cqrs-es-onion-7eb10bbefe17
Dúvidas?
Obrigado!
Medium: https://medium.com/@gustavosrodrigues
Twitter: @gustavo_s_r
Linkedin: https://www.linkedin.com/in/gustavosilvarodrigues/
1 de 31

Recomendados

Como DDD e Strategic Design estão nos ajudando a modernizar um Legado por
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoComo DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoLuiz Costa
1.5K visualizações68 slides
Asp net mvc por
Asp net mvcAsp net mvc
Asp net mvcCleiton Estigarribia
496 visualizações20 slides
Hexagonal Rails por
Hexagonal RailsHexagonal Rails
Hexagonal RailsLuiz Costa
1.2K visualizações105 slides
Modular Monoliths - Como é possível organizar sua aplicação para habilitar um... por
Modular Monoliths - Como é possível organizar sua aplicação para habilitar um...Modular Monoliths - Como é possível organizar sua aplicação para habilitar um...
Modular Monoliths - Como é possível organizar sua aplicação para habilitar um...Luiz Costa
1.1K visualizações89 slides
Micro serviços com node.js por
Micro serviços com node.jsMicro serviços com node.js
Micro serviços com node.jsBruno Trecenti
2K visualizações43 slides
Julho 2016 - BDD com SpecFlow por
Julho 2016 - BDD com SpecFlowJulho 2016 - BDD com SpecFlow
Julho 2016 - BDD com SpecFlowGrupo de Testes Carioca
337 visualizações20 slides

Mais conteúdo relacionado

Mais procurados

BDD (Behavior-Driven Development) - Setembro/2015 por
BDD (Behavior-Driven Development) - Setembro/2015BDD (Behavior-Driven Development) - Setembro/2015
BDD (Behavior-Driven Development) - Setembro/2015Renato Groff
1.6K visualizações48 slides
O comparativo de arquiteturas de software monolíticas em relação a arquitetur... por
O comparativo de arquiteturas de software monolíticas em relação a arquitetur...O comparativo de arquiteturas de software monolíticas em relação a arquitetur...
O comparativo de arquiteturas de software monolíticas em relação a arquitetur...Emmanuel Neri
2.2K visualizações51 slides
Apresentação Flisol 2016 por
Apresentação Flisol 2016Apresentação Flisol 2016
Apresentação Flisol 2016Laryssa Muniz
212 visualizações27 slides
TDC2016SP - Trilha Microservices por
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservicestdc-globalcode
533 visualizações30 slides
BDD por
BDDBDD
BDDLEANDRO DE SOUZA RAMOS
1.7K visualizações23 slides
Estudo da aplicação da arquitetura orientada a serviços em um sistema de gest... por
Estudo da aplicação da arquitetura orientada a serviços em um sistema de gest...Estudo da aplicação da arquitetura orientada a serviços em um sistema de gest...
Estudo da aplicação da arquitetura orientada a serviços em um sistema de gest...Glauco Vinicius Argentino de Oliveira
2.7K visualizações26 slides

Mais procurados(20)

BDD (Behavior-Driven Development) - Setembro/2015 por Renato Groff
BDD (Behavior-Driven Development) - Setembro/2015BDD (Behavior-Driven Development) - Setembro/2015
BDD (Behavior-Driven Development) - Setembro/2015
Renato Groff1.6K visualizações
O comparativo de arquiteturas de software monolíticas em relação a arquitetur... por Emmanuel Neri
O comparativo de arquiteturas de software monolíticas em relação a arquitetur...O comparativo de arquiteturas de software monolíticas em relação a arquitetur...
O comparativo de arquiteturas de software monolíticas em relação a arquitetur...
Emmanuel Neri2.2K visualizações
Apresentação Flisol 2016 por Laryssa Muniz
Apresentação Flisol 2016Apresentação Flisol 2016
Apresentação Flisol 2016
Laryssa Muniz212 visualizações
TDC2016SP - Trilha Microservices por tdc-globalcode
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservices
tdc-globalcode533 visualizações
Aplicação da arquitetura de micro serviços em softwares corporativos por Emmanuel Neri
Aplicação da arquitetura de micro serviços em softwares corporativosAplicação da arquitetura de micro serviços em softwares corporativos
Aplicação da arquitetura de micro serviços em softwares corporativos
Emmanuel Neri846 visualizações
Arquitetura e Integração de sistemas por Jether Rodrigues
Arquitetura e Integração de sistemasArquitetura e Integração de sistemas
Arquitetura e Integração de sistemas
Jether Rodrigues738 visualizações
JUGVale 14 - 14/09/2019 por Jether Rodrigues
JUGVale 14 - 14/09/2019JUGVale 14 - 14/09/2019
JUGVale 14 - 14/09/2019
Jether Rodrigues184 visualizações
Usando MVC para agilizar o desenvolvimento por Alexandre Andrade
Usando MVC para agilizar o desenvolvimentoUsando MVC para agilizar o desenvolvimento
Usando MVC para agilizar o desenvolvimento
Alexandre Andrade1.6K visualizações
01 - Introdução a programação para internet v1.1 por César Augusto Pessôa
01 - Introdução a programação para internet v1.101 - Introdução a programação para internet v1.1
01 - Introdução a programação para internet v1.1
César Augusto Pessôa389 visualizações
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ... por Renato Groff
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...
Renato Groff859 visualizações
Camadas por Sonia Góes
CamadasCamadas
Camadas
Sonia Góes240 visualizações
NoSql e NewSql por Suzana Viana Mota
NoSql e NewSqlNoSql e NewSql
NoSql e NewSql
Suzana Viana Mota541 visualizações
TCC 1 - Um método para o desenvolvimento de software baseado em microserviços por Thiago Pereira
TCC 1 - Um método para o desenvolvimento de software baseado em microserviçosTCC 1 - Um método para o desenvolvimento de software baseado em microserviços
TCC 1 - Um método para o desenvolvimento de software baseado em microserviços
Thiago Pereira5.3K visualizações
Aula09 SD - Replicação e Consistência por Messias Batista
Aula09 SD - Replicação e ConsistênciaAula09 SD - Replicação e Consistência
Aula09 SD - Replicação e Consistência
Messias Batista2.4K visualizações
03 - Aplicações web com ASP.net v1.0 por César Augusto Pessôa
03 - Aplicações web com ASP.net v1.003 - Aplicações web com ASP.net v1.0
03 - Aplicações web com ASP.net v1.0
César Augusto Pessôa508 visualizações

Similar a Indo alem do_mvc_node_js

Workshop soa, microservices e devops por
Workshop soa, microservices e devopsWorkshop soa, microservices e devops
Workshop soa, microservices e devopsDiego Pacheco
1.5K visualizações390 slides
Treinamento ASP.NET 2014 por
Treinamento ASP.NET 2014Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Eric Gallardo
636 visualizações46 slides
Arquitetura de sistemas web por
Arquitetura de sistemas webArquitetura de sistemas web
Arquitetura de sistemas webOpakus - Soluções Inteligentes
3.2K visualizações25 slides
Microserviços - Universidade Metodista - EETI 2016 por
Microserviços - Universidade Metodista - EETI 2016Microserviços - Universidade Metodista - EETI 2016
Microserviços - Universidade Metodista - EETI 2016Renato Groff
451 visualizações48 slides
Plataforma Android: Produtividade Além do SDK por
Plataforma Android: Produtividade Além do SDKPlataforma Android: Produtividade Além do SDK
Plataforma Android: Produtividade Além do SDKRyan Padilha
660 visualizações24 slides
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure por
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on AzureTDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azuretdc-globalcode
118 visualizações35 slides

Similar a Indo alem do_mvc_node_js(20)

Workshop soa, microservices e devops por Diego Pacheco
Workshop soa, microservices e devopsWorkshop soa, microservices e devops
Workshop soa, microservices e devops
Diego Pacheco1.5K visualizações
Treinamento ASP.NET 2014 por Eric Gallardo
Treinamento ASP.NET 2014Treinamento ASP.NET 2014
Treinamento ASP.NET 2014
Eric Gallardo636 visualizações
Microserviços - Universidade Metodista - EETI 2016 por Renato Groff
Microserviços - Universidade Metodista - EETI 2016Microserviços - Universidade Metodista - EETI 2016
Microserviços - Universidade Metodista - EETI 2016
Renato Groff451 visualizações
Plataforma Android: Produtividade Além do SDK por Ryan Padilha
Plataforma Android: Produtividade Além do SDKPlataforma Android: Produtividade Além do SDK
Plataforma Android: Produtividade Além do SDK
Ryan Padilha660 visualizações
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure por tdc-globalcode
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on AzureTDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure
tdc-globalcode118 visualizações
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola por Dextra Sistemas / Etec Itu
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério NizzolaTdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
Dextra Sistemas / Etec Itu78 visualizações
Devops: Gestão e publicação de Dados no SQL Server por Igor Rosa Macedo
Devops: Gestão e publicação de Dados no SQL ServerDevops: Gestão e publicação de Dados no SQL Server
Devops: Gestão e publicação de Dados no SQL Server
Igor Rosa Macedo125 visualizações
Microservices por Rafael Sousa
MicroservicesMicroservices
Microservices
Rafael Sousa41 visualizações
Clean Architecture por Rodrigo Branas
Clean ArchitectureClean Architecture
Clean Architecture
Rodrigo Branas760 visualizações
[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices por Deep Tech Brasil
[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices
[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices
Deep Tech Brasil226 visualizações
Arquitetura de Microserviços - Stone Tech Saturday - Março/2017 por Renato Groff
Arquitetura de Microserviços - Stone Tech Saturday - Março/2017Arquitetura de Microserviços - Stone Tech Saturday - Março/2017
Arquitetura de Microserviços - Stone Tech Saturday - Março/2017
Renato Groff1.2K visualizações
Microservices com Spring Boot e Spring Cloud Netflix por Natanael Fonseca
Microservices com Spring Boot e Spring Cloud NetflixMicroservices com Spring Boot e Spring Cloud Netflix
Microservices com Spring Boot e Spring Cloud Netflix
Natanael Fonseca616 visualizações
Microservices por Renato Groff
MicroservicesMicroservices
Microservices
Renato Groff1.1K visualizações
Microservices - ALM Roadshow 2015 por Renato Groff
Microservices - ALM Roadshow 2015Microservices - ALM Roadshow 2015
Microservices - ALM Roadshow 2015
Renato Groff1.5K visualizações
MIT DevOps IaC - Infra como Código por Caio Candido
MIT DevOps IaC - Infra como CódigoMIT DevOps IaC - Infra como Código
MIT DevOps IaC - Infra como Código
Caio Candido36 visualizações
Apresentacão Android Components - Programando em camadas por Victor Aldir
Apresentacão Android Components - Programando em camadasApresentacão Android Components - Programando em camadas
Apresentacão Android Components - Programando em camadas
Victor Aldir57 visualizações
TDC2016SP Trilha Arquitetura.NET - Revitalizando aplicações desktop usando C... por Marcelo Palladino
TDC2016SP  Trilha Arquitetura.NET - Revitalizando aplicações desktop usando C...TDC2016SP  Trilha Arquitetura.NET - Revitalizando aplicações desktop usando C...
TDC2016SP Trilha Arquitetura.NET - Revitalizando aplicações desktop usando C...
Marcelo Palladino51 visualizações
TDC2016POA | Trilha Arquetetura - Revitalizando aplicações desktop usando Ce... por tdc-globalcode
TDC2016POA | Trilha Arquetetura -  Revitalizando aplicações desktop usando Ce...TDC2016POA | Trilha Arquetetura -  Revitalizando aplicações desktop usando Ce...
TDC2016POA | Trilha Arquetetura - Revitalizando aplicações desktop usando Ce...
tdc-globalcode487 visualizações

Indo alem do_mvc_node_js

  • 1. Indo além do MVC com Node.JS by Gustavo S. Rodrigues (@gustavo_s_r)
  • 2. Sobre o palestrante Sou um arquiteto de soluções apaixonado por linhas de códigos e por problemas não convencionais. Já atuei como executivo de contas, analista de QA, analista de requisitos, programador Front-end, Programador Back-end, Desenvolvedor Full-Stack e Arquiteto de Soluções prestando serviços para clientes como Porto Seguro, Terra, Claro e Natura. Gustavo S. Rodrigues
  • 3. Sobre o que falaremos?
  • 4. Essa palestra tem o objetivo de apresentar conceitos de construção de aplicações escaláveis e de fácil manutenção, aplicando padrões de projetos conhecidos mas com Node.js
  • 6. Um bom software não é aquele que tem menos linhas de código, assim como não é o que implementa funções ou atribuições complexas.
  • 7. Qual dessas estruturas encontramos mais complexidade? /models /routes /modules(ou libs) index.js config.js middlewares.js package.json /configs/ /infraestructure/providers/{external_resources} /infraestructure/adapters/ /domains/models/ /domains/repositories/ /domains/datasource.js /http/controllers/ /http/middlewares/ /http/routes/ /modules/ index.js package.json ?!
  • 10. Estruturas mal definidas ou muito reduzidas tendem a trazer consigo mais responsabilidades para um bloco de código, e por sua vez gera uma curva exponencial de complexidade, que dificulta a sustentação desse projeto
  • 11. Show me the code!
  • 12. O Que são Repositories?
  • 13. Repository Um sistema com um modelo de domínio complexo geralmente se beneficia de uma camada, como a fornecida pelo Data Mapper (165), que isola os objetos de domínio dos detalhes do código de acesso ao banco de dados. Em tais sistemas, pode valer a pena construir outra camada de abstração sobre a camada de mapeamento, onde o código de construção da consulta é concentrado. Isso se torna mais importante quando há um grande número de classes de domínio ou consultas pesadas. Nesses casos, especialmente, adicionar essa camada ajuda a minimizar a lógica de consulta duplicada. Um Repositório medeia entre o domínio e as camadas de mapeamento de dados, agindo como uma coleção de objetos de domínio na memória. Objetos clientes constroem especificações de consulta declarativamente e as submetem ao Repositório para satisfação. Objetos podem ser adicionados e removidos do Repositório, como eles podem de uma simples coleção de objetos, e o código de mapeamento encapsulado pelo Repositório realizará as operações apropriadas nos bastidores. Conceitualmente, um Repositório encapsula o conjunto de objetos persistidos em um armazenamento de dados e as operações executadas sobre eles, fornecendo uma visão mais orientada a objeto da camada de persistência. O Repository também suporta o objetivo de obter uma separação limpa e uma dependência unidirecional entre o domínio e as camadas de mapeamento de dados. (Patterns of Enterprise Application Architecture, Martin Fowler)
  • 14. Separar a regra de abstração de dados das regras de controle te traz a flexibilidade de em apenas um lugar controlar os provedores de dados, tornando mais fácil a implementação de uso de mais de uma modalidade de banco de dados ou de implementação de cache de dados, sem se preocupar com re-implementar isso em todos os controllers.
  • 15. Por que separar camada de controller das camadas de rota?
  • 16. Temos a tendência natural de acreditar que controller deve por si só resolver chamadas http, mas a partir dos momento que sua aplicação pode ser invocada via função Lambda por handler, ou que sua controller pode ser invocada por uma instrução bash, você começa a observar que o controller serve para tratar regras de negócio, recebendo dados de entrada, tratando-os e devolvendo algo, e é papel de quem o implementa definir o protocolo de entrada e saída, seja HTTP ou não.
  • 18. Claro que sim, depende do tamanho e da complexidade do sistema que você pretende construir, o modelo anterior colocamos apenas algumas camadas de apoio para suportar mudanças de forma mais simples, mas existem modelos mais granulares como o do próximo slide.
  • 21. Fazer simples é mais difícil do que sair implementado código, mas o preço que se paga é gigantesco quando seu projeto cresce!
  • 22. E o que vem depois?
  • 23. Não é possível implementar bons padrões de arquitetura sem uma inteira remodelagem no seu processo de delivery!
  • 24. TDD ou BDD Independente do conceito aplicado, teste, faça sempre uma cobertura de teste no mínimo de 80% da sua aplicação, entre testes unitários e end-to-end.
  • 25. Automatize atualizações Com uma boa cobertura de testes, algumas coisas como atualização de pacotes de forma automática para garantir o uso dos módulos em suas versões mais atualizadas e seguras utilizando o Renovate Bot (https://renovatebot.com/)
  • 26. Garanta deploys seguros Além de utilizar uma boa ferramenta de CI/CI, é importante que além de automatizar o processo de build, que se automatize os testes, e mais do que isso, que garanta que seu projeto continue seguro.
  • 27. Faça uma arquitetura de referência Mais importante que usar boas práticas de desenvolvimento, documente, crie boilerplates básicos de implementações para reuso, construa libs e mais do que isso, compartilhe código com a comunidade.
  • 28. Onde Aprender mais sobre Good parts?
  • 29. Links 12 Fator - https://12factor.net/pt_br/ System design primer - https://github.com/donnemartin/system-design-primer/ P of EAA - https://martinfowler.com/books/eaa.html SOLID NODE - https://medium.com/@domagojk/patterns-for-designing-flexible- architecture-in-node-js-cqrs-es-onion-7eb10bbefe17