Upgrade to Pro — share decks privately, control downloads, hide ads and more …

The Simple Solid Process - Maximize Frameworks ...

Rodrigo Serradura
September 06, 2024
430

The Simple Solid Process - Maximize Frameworks MV*️⃣ sem comprometer a Engenharia de Software

The Simple Solid Process é um método de desenvolvimento (+ bibliotecas) que nasceu e se provou no Ruby/Rails, mas que pode ser aplicado em qualquer outra stack. Ele possibilita equilibrar velocidade com qualidade, mantendo a eficiência do uso do framework sem abrir mão de princípios da engenharia de software.

Um dos principais objetivos é espalhar valores e práticas presentes do Rails Way e colocar em xeque certos "axiomas" ligadas ao DDD e Arquitetura Hexagonal e que são comumente impostos quando o assunto é qualidade / engenharia de software.

Rodrigo Serradura

September 06, 2024
Tweet

Transcript

  1. Rodrigo Serradura - Trabalho com desenvolvimento desde 2006. - Sou

    Software Engineer na Wavelo. - Já atuei como CTO, Head, Tech Lead… - Criei bibliotecas open source. u-case, solid-process... - Entusiasta em Design e Arq. de Software.
  2. Custo? • Custo para escrever código novo • Custo para

    promover mudanças em código existente • Custo para entender código existente • Custo da espera pelo código
  3. Demandas Inovação Manutenção Nova funcionalidade Aprimorar funcionalidade Infraestrutura Correção de

    Bugs Refatoração Observabilidade Documentação Performance Remover funcionalidade Suporte On call Segurança
  4. Velocidade + Qualidade Menor custo para promover mudanças Eficiência +

    Eficácia = Efetividade -Custo +Resultado Impacto
  5. Velocidade + Qualidade Menor custo para promover mudanças Eficiência +

    Eficácia = Efetividade -Custo +Resultado Impacto Pragmatismo Good Enough
  6. Racional até aqui Custo do software = Investimento necessário para

    promover mudanças (manter o sistema) Acoplamento = Propagação de mudanças Alto acoplamento = Alto custo para manter o software Baixo custo para manter o software = Baixo Acoplamento
  7. Racional até aqui Desacoplar código = Reduzir o custo da

    mudança Reduzir o custo da mudança = Engenharia de software Engenharia de software = Qualidade Qualidade = Código desacoplado (ortogonalidade)
  8. Manter junto o que faz sentido Propósito 1. Para que

    serve? ◦ Que problema resolve? 2. A quem serve? ◦ A qual contexto pertence?
  9. 02 directories, 06 files app ├── controllers │ ├── application_controller.rb

    │ ├── todos_controller.rb │ └── users_controller.rb └── models ├── application_record.rb ├── todo.rb └── user.rb v00
  10. 04 directories, 12 files app ├── controllers │ ├── application_controller.rb

    │ ├── todos_controller.rb │ └── users_controller.rb ├── models │ ├── application_record.rb │ ├── todo.rb │ └── user.rb ├── serializers │ ├── application_serializer.rb │ ├── todo_serializer.rb │ └── user_serializer.rb └── services ├── application_service.rb ├── todo_service.rb └── user_service.rb v01
  11. 04 directories, 17 files app ├── controllers │ ├── application_controller.rb

    │ ├── todos_controller.rb │ └── users_controller.rb ├── models │ ├── application_record.rb │ ├── todo.rb │ └── user.rb ├── serializers │ ├── application_serializer.rb │ ├── todo_serializer.rb │ └── user_serializer.rb └── services ├── application_service.rb ├── complete_todo_service.rb ├── create_todo_service.rb ├── create_user_service.rb ├── destroy_todo_service.rb ├── find_todo_service.rb ├── find_todos_service.rb └── incomplete_todo_service.rb v02
  12. 06 directories, 17 files app ├── controllers │ ├── application_controller.rb

    │ ├── todos_controller.rb │ └── users_controller.rb ├── models │ ├── application_record.rb │ ├── todo.rb │ └── user.rb ├── serializers │ ├── application_serializer.rb │ ├── todo_serializer.rb │ └── user_serializer.rb └── services ├── application_service.rb ├── todo │ ├── complete_service.rb │ ├── create_service.rb │ ├── destroy_service.rb │ ├── find_all_service.rb │ ├── find_service.rb │ └── incomplete_service.rb └── user └── create_service.rb v03
  13. 09 directories, 22 files app ├── controllers │ ├── application_controller.rb

    │ ├── todos_controller.rb │ └── users_controller.rb ├── enums │ ├── todo_statuses_enum.rb │ └── user_roles_enum.rb ├── models │ ├── application_record.rb │ ├── todo.rb │ └── user.rb ├── permitted_params │ ├── todo_permitted_params.rb │ └── user_permitted_params.rb ├── serializers │ ├── application_serializer.rb │ ├── todo_serializer.rb │ └── user_serializer.rb ├── services │ ├── application_service.rb │ ├── todo │ │ ├── complete_service.rb │ │ ├── create_service.rb │ │ ├── destroy_service.rb │ │ ├── find_all_service.rb │ │ ├── find_service.rb │ │ └── incomplete_service.rb │ └── user │ └── create_service.rb └── value_objects └── user_password_value_object.rb v04
  14. 16 directories, 22 files app ├── controllers │ ├── application_controller.rb

    │ ├── todos_controller.rb │ └── users_controller.rb ├── enums │ ├── todo │ │ └── statuses_enum.rb │ └── user │ └── roles_enum.rb ├── models │ ├── application_record.rb │ ├── todo.rb │ └── user.rb ├── permitted_params │ ├── todo │ │ └── permitted_params.rb │ └── user │ └── permitted_params.rb ├── serializers │ ├── application_serializer.rb │ ├── todo │ │ └── serializer.rb │ └── user │ └── serializer.rb ├── services │ ├── application_service.rb │ ├── todo │ │ ├── complete_service.rb │ │ ├── create_service.rb │ │ ├── destroy_service.rb │ │ ├── find_all_service.rb │ │ ├── find_service.rb │ │ └── incomplete_service.rb │ └── user │ └── create_service.rb └── value_objects └── user └── password_value_object.rb v05
  15. 16 directories, 22 files app ├── controllers │ ├── application_controller.rb

    │ ├── todos_controller.rb │ └── users_controller.rb ├── enums │ ├── todo │ │ └── statuses.rb │ └── user │ └── roles.rb ├── models │ ├── application_record.rb │ ├── todo.rb │ └── user.rb ├── permitted_params │ ├── todo │ │ └── permitted_params.rb │ └── user │ └── permitted_params.rb ├── serializers │ ├── application_serializer.rb │ ├── todo │ │ └── serializer.rb │ └── user │ └── serializer.rb ├── services │ ├── application_service.rb │ ├── todo │ │ ├── complete.rb │ │ ├── create.rb │ │ ├── destroy.rb │ │ ├── find.rb │ │ ├── find_all.rb │ │ └── incomplete.rb │ └── user │ └── create.rb └── value_objects └── user └── password.rb v06
  16. 06 directories, 22 files app ├── controllers │ ├── application_controller.rb

    │ ├── todos_controller.rb │ └── users_controller.rb └── models ├── application_record.rb ├── application_serializer.rb ├── application_service.rb ├── todo │ ├── permitted_params.rb │ ├── serializer.rb │ ├── services │ │ ├── complete.rb │ │ ├── create.rb │ │ ├── destroy.rb │ │ ├── find.rb │ │ ├── find_all.rb │ │ └── incomplete.rb │ └── statuses.rb ├── todo.rb ├── user │ ├── password.rb │ ├── permitted_params.rb │ ├── roles.rb │ ├── serializer.rb │ └── services │ └── create.rb └── user.rb v07
  17. 05 directories, 22 files app ├── controllers │ ├── application_controller.rb

    │ ├── todos_controller.rb │ └── users_controller.rb └── models ├── application_record.rb ├── application_serializer.rb ├── application_service.rb ├── todo │ ├── list │ │ ├── add_item.rb │ │ ├── complete_item.rb │ │ ├── destroy_item.rb │ │ ├── find_item.rb │ │ ├── find_items.rb │ │ └── incomplete_item.rb │ ├── permitted_params.rb │ ├── serializer.rb │ └── statuses.rb ├── todo.rb ├── user │ ├── password.rb │ ├── permitted_params.rb │ ├── register.rb │ ├── roles.rb │ └── serializer.rb └── user.rb v08
  18. 05 directories, 22 files app ├── controllers │ ├── application_controller.rb

    │ ├── todos_controller.rb │ └── users_controller.rb └── models ├── application_record.rb ├── application_serializer.rb ├── application_service.rb ├── todo │ ├── list │ │ ├── add_item.rb │ │ ├── complete_item.rb │ │ ├── destroy_item.rb │ │ ├── find_item.rb │ │ ├── find_items.rb │ │ └── incomplete_item.rb │ ├── permitted_params.rb │ ├── record.rb │ ├── serializer.rb │ └── statuses.rb └── user ├── password.rb ├── permitted_params.rb ├── record.rb ├── register.rb ├── roles.rb └── serializer.rb v09
  19. 05 directories, 22 files app ├── controllers │ ├── application_controller.rb

    │ ├── todos_controller.rb │ └── users_controller.rb └── models ├── application_record.rb ├── todo │ ├── list │ │ ├── add_item.rb │ │ ├── complete_item.rb │ │ ├── destroy_item.rb │ │ ├── find_item.rb │ │ ├── find_items.rb │ │ └── incomplete_item.rb │ ├── permitted_params.rb │ ├── record.rb │ ├── serializer.rb │ └── statuses.rb └── user ├── password.rb ├── permitted_params.rb ├── record.rb ├── register.rb ├── roles.rb └── serializer.rb lib ├── application_serializer.rb └── application_service.rb v10
  20. 05 directories, 22 files app ├── controllers │ ├── application_controller.rb

    │ ├── todos_controller.rb │ └── users_controller.rb └── models ├── application_record.rb ├── todo │ ├── list │ │ ├── add_item.rb │ │ ├── complete_item.rb │ │ ├── destroy_item.rb │ │ ├── find_item.rb │ │ ├── find_items.rb │ │ └── uncomplete_item.rb │ ├── permitted_params.rb │ ├── record.rb │ ├── serializer.rb │ └── statuses.rb └── user ├── password.rb ├── permitted_params.rb ├── record.rb ├── register.rb ├── roles.rb └── serializer.rb lib ├── application_serializer.rb └── application_service.rb v10 Propósito 1. Para que serve? ◦ Que problema resolve? 2. A quem serve? ◦ A qual contexto pertence?
  21. 05 directories, 22 files app ├── controllers │ ├── application_controller.rb

    │ ├── todos_controller.rb │ └── users_controller.rb └── models ├── application_record.rb ├── todo │ ├── list │ │ ├── add_item.rb │ │ ├── complete_item.rb │ │ ├── destroy_item.rb │ │ ├── find_item.rb │ │ ├── find_items.rb │ │ └── incomplete_item.rb │ ├── permitted_params.rb │ ├── record.rb │ ├── serializer.rb │ └── statuses.rb └── user ├── password.rb ├── permitted_params.rb ├── record.rb ├── register.rb ├── roles.rb └── serializer.rb lib ├── application_serializer.rb └── application_service.rb v10
  22. 07 directories, 22 files app ├── controllers │ ├── application_controller.rb

    │ ├── todos │ │ ├── permitted_params.rb │ │ └── serializer.rb │ ├── todos_controller.rb │ ├── users │ │ ├── permitted_params.rb │ │ └── serializer.rb │ └── users_controller.rb └── models ├── application_record.rb ├── todo │ ├── list │ │ ├── add_item.rb │ │ ├── complete_item.rb │ │ ├── destroy_item.rb │ │ ├── find_item.rb │ │ ├── find_items.rb │ │ └── incomplete_item.rb │ ├── record.rb │ └── statuses.rb └── user ├── password.rb ├── record.rb ├── register.rb └── roles.rb lib ├── application_serializer.rb └── application_service.rb v11
  23. versus app ├── controllers │ ├── application_controller.rb │ ├── todos_controller.rb

    │ └── users_controller.rb ├── enums │ ├── todo_statuses_enum.rb │ └── user_roles_enum.rb ├── models │ ├── application_record.rb │ ├── todo.rb │ └── user.rb ├── permitted_params │ ├── todo_permitted_params.rb │ └── user_permitted_params.rb ├── serializers │ ├── application_serializer.rb │ ├── todo_serializer.rb │ └── user_serializer.rb ├── services │ ├── application_service.rb │ ├── todo │ │ ├── complete_service.rb │ │ ├── create_service.rb │ │ ├── destroy_service.rb │ │ ├── find_all_service.rb │ │ ├── find_service.rb │ │ └── incomplete_service.rb │ └── user │ └── create_service.rb └── value_objects └── user_password_value_object.rb v04 app ├── controllers │ ├── application_controller.rb │ ├── todos │ │ ├── permitted_params.rb │ │ └── serializer.rb │ ├── todos_controller.rb │ ├── users │ │ ├── permitted_params.rb │ │ └── serializer.rb │ └── users_controller.rb └── models ├── application_record.rb ├── todo │ ├── list │ │ ├── add_item.rb │ │ ├── complete_item.rb │ │ ├── destroy_item.rb │ │ ├── find_item.rb │ │ ├── find_items.rb │ │ └── incomplete_item.rb │ ├── record.rb │ └── statuses.rb └── user ├── password.rb ├── record.rb ├── register.rb └── roles.rb lib ├── application_serializer.rb └── application_service.rb v11
  24. versus app ├── controllers │ ├── application_controller.rb │ ├── todos_controller.rb

    │ └── users_controller.rb ├── enums │ ├── todo │ │ └── statuses.rb │ └── user │ └── roles.rb ├── models │ ├── application_record.rb │ ├── todo.rb │ └── user.rb ├── permitted_params │ ├── todo │ │ └── permitted_params.rb │ └── user │ └── permitted_params.rb ├── serializers │ ├── application_serializer.rb │ ├── todo │ │ └── serializer.rb │ └── user │ └── serializer.rb ├── services │ ├── application_service.rb │ ├── todo │ │ ├── complete.rb │ │ ├── create.rb │ │ ├── destroy.rb │ │ ├── find.rb │ │ ├── find_all.rb │ │ └── incomplete.rb │ └── user │ └── create.rb └── value_objects └── user └── password.rb v06 app ├── controllers │ ├── application_controller.rb │ ├── todos │ │ ├── permitted_params.rb │ │ └── serializer.rb │ ├── todos_controller.rb │ ├── users │ │ ├── permitted_params.rb │ │ └── serializer.rb │ └── users_controller.rb └── models ├── application_record.rb ├── todo │ ├── list │ │ ├── add_item.rb │ │ ├── complete_item.rb │ │ ├── destroy_item.rb │ │ ├── find_item.rb │ │ ├── find_items.rb │ │ └── incomplete_item.rb │ ├── record.rb │ └── statuses.rb └── user ├── password.rb ├── record.rb ├── register.rb └── roles.rb lib ├── application_serializer.rb └── application_service.rb v11
  25. versus app ├── controllers │ ├── application_controller.rb │ ├── todos

    │ │ ├── permitted_params.rb │ │ └── serializer.rb │ ├── todos_controller.rb │ ├── users │ │ ├── permitted_params.rb │ │ └── serializer.rb │ └── users_controller.rb └── models ├── application_record.rb ├── todo │ ├── list │ │ ├── add_item.rb │ │ ├── complete_item.rb │ │ ├── destroy_item.rb │ │ ├── find_item.rb │ │ ├── find_items.rb │ │ └── incomplete_item.rb │ ├── record.rb │ └── statuses.rb └── user ├── password.rb ├── record.rb ├── register.rb └── roles.rb lib ├── application_serializer.rb └── application_service.rb v11 app ├── controllers │ ├── application_controller.rb │ ├── todos_controller.rb │ └── users_controller.rb └── models ├── application_record.rb ├── application_serializer.rb ├── application_service.rb ├── todo │ ├── list │ │ ├── add_item.rb │ │ ├── complete_item.rb │ │ ├── destroy_item.rb │ │ ├── find_item.rb │ │ ├── find_items.rb │ │ └── incomplete_item.rb │ ├── permitted_params.rb │ ├── serializer.rb │ └── statuses.rb ├── todo.rb ├── user │ ├── password.rb │ ├── permitted_params.rb │ ├── register.rb │ ├── roles.rb │ └── serializer.rb └── user.rb v08
  26. Racional até aqui Desacoplar código = Promover coesão Coesão =

    Boas abstrações Boas abstrações = Modularização Modularização = Separação de responsabilidades Separação de responsabilidades = Contextos coesos
  27. Racional até aqui Desacoplar código = Promover coesão Coesão =

    Boas abstrações Boas abstrações = Modularização Modularização = Separação de responsabilidades Separação de responsabilidades = Contextos coesos Propósito 1. Para que serve? ◦ Que problema resolve? 2. A quem serve? ◦ A qual contexto pertence?
  28. Racional até aqui Desacoplar código = Promover coesão Coesão =

    Boas abstrações Boas abstrações = Modularização Modularização = Separação de responsabilidades Separação de responsabilidades = Contextos coesos Propósito 1. Para que serve? ◦ Que problema resolve? 2. A quem serve? ◦ A qual contexto pertence? Se for simples de entender, será simples manter.
  29. WTF/minute ETC (Easy to Change) Lento + Qualidade Alto WTF

    Baixo ETC Baixo WTF Alto ETC Alto WTF Alto ETC Baixo WTF Baixo ETC Coesão (Se for simples de entender, será simples manter)
  30. Velocidade Qualidade Lento + Qualidade sem velocidade sem qualidade sem

    velocidade com qualidade com velocidade sem qualidade com velocidade com qualidade Entregar demandas (Lead time sustentável)
  31. Velocidade Qualidade Lento + Qualidade com velocidade sem qualidade sem

    velocidade com qualidade com velocidade com qualidade sem velocidade sem qualidade Entregar demandas
  32. Velocidade Qualidade Lento + Qualidade sem velocidade sem qualidade sem

    velocidade com qualidade com velocidade sem qualidade com velocidade com qualidade Entregar (Lead time sustentável)
  33. Velocidade Qualidade Lento + Qualidade sem velocidade sem qualidade sem

    velocidade com qualidade com velocidade sem qualidade com velocidade com qualidade Entregar (Lead time sustentável)
  34. Velocidade Qualidade Lento + Qualidade sem velocidade sem qualidade sem

    velocidade com qualidade com velocidade sem qualidade com velocidade com qualidade Entregar (Lead time sustentável) Como?
  35. Velocidade Qualidade Lento + Qualidade com velocidade sem qualidade sem

    velocidade com qualidade com velocidade com qualidade sem velocidade sem qualidade Entregar (Lead time sustentável)
  36. Velocidade Qualidade Lento + Qualidade com velocidade sem qualidade sem

    velocidade com qualidade com velocidade com qualidade sem velocidade sem qualidade Make It work Entregar (Lead time sustentável)
  37. Velocidade Qualidade Lento + Qualidade com velocidade sem qualidade sem

    velocidade com qualidade com velocidade com qualidade sem velocidade sem qualidade Make It work Entregar (Lead time sustentável) Make It better
  38. Velocidade Qualidade Lento + Qualidade com velocidade sem qualidade sem

    velocidade com qualidade com velocidade com qualidade sem velocidade sem qualidade Make It work Make It better Make It even better Entregar (Lead time sustentável)
  39. Velocidade Qualidade Lento + Qualidade com velocidade sem qualidade sem

    velocidade com qualidade com velocidade com qualidade sem velocidade sem qualidade Make It work Make It better 1 2 3 Entrega Comportamento Entrega melhorias para a Estrutura Make It even better Entregar (Lead time sustentável)
  40. Velocidade Qualidade Lento + Qualidade com velocidade sem qualidade sem

    velocidade com qualidade com velocidade com qualidade sem velocidade sem qualidade Make It work Make It better 1 2 3 Entrega Comportamento Entrega melhorias para a Estrutura Make It even better Entregar (Lead time sustentável)
  41. Velocidade Qualidade Lento + Qualidade com velocidade sem qualidade sem

    velocidade com qualidade com velocidade com qualidade sem velocidade sem qualidade Make It work Make It better 1 2 3 Entrega Comportamento Entrega melhorias para a Estrutura Make It even better Entregar (Lead time sustentável) app ├── controllers │ ├── application_controller.rb │ ├── todos_controller.rb │ └── users_controller.rb └── models ├── application_record.rb ├── todo │ └── list │ ├── add_item.rb │ ├── complete_item.rb │ ├── destroy_item.rb │ ├── find_item.rb │ ├── find_items.rb │ └── incomplete_item.rb ├── todo.rb ├── user │ └── register.rb └── user.rb Make It work
  42. Velocidade Qualidade Lento + Qualidade com velocidade sem qualidade sem

    velocidade com qualidade com velocidade com qualidade sem velocidade sem qualidade Make It work Make It better 1 2 3 Entrega Comportamento Entrega melhorias para a Estrutura Make It even better Entregar (Lead time sustentável) app ├── controllers │ ├── application_controller.rb │ ├── todos_controller.rb │ └── users_controller.rb └── models ├── application_record.rb ├── todo │ └── list │ ├── add_item.rb │ ├── complete_item.rb │ ├── destroy_item.rb │ ├── find_item.rb │ ├── find_items.rb │ └── incomplete_item.rb ├── todo.rb ├── user │ └── register.rb └── user.rb Make It work app ├── controllers │ ├── application_controller.rb │ ├── todos_controller.rb │ └── users_controller.rb └── models ├── application_record.rb ├── todo │ ├── status.rb │ └── list │ ├── add_item.rb │ ├── complete_item.rb │ ├── destroy_item.rb │ ├── find_item.rb │ ├── find_items.rb │ └── incomplete_item.rb ├── todo.rb ├── user │ └── register.rb └── user.rb Make It better
  43. Velocidade Qualidade Lento + Qualidade com velocidade sem qualidade sem

    velocidade com qualidade com velocidade com qualidade sem velocidade sem qualidade Make It work Entregar Make It right 1 2 3 Make It better Entrega Comportamento Entrega melhorias para a Estrutura Make It even better 1. Gere valor no menor tempo possível e dentro de um padrão mínimo de qualidade . 2. Tá em produção? Então melhore a estrutura, dado que agora se tem mais clareza e domínio do que foi feito. Objetivo: máximo de velocidade dentro de uma estrutura que possibilite qualidade.
  44. Velocidade Qualidade Lento + Qualidade com velocidade sem qualidade sem

    velocidade com qualidade com velocidade com qualidade sem velocidade sem qualidade Make It work Entregar Make It right 1 2 3 Entrega Comportamento Entrega melhorias para a Estrutura Make It even better 1. Gere valor no menor tempo possível e dentro de um padrão mínimo de qualidade . 2. Tá em produção? Então melhore a estrutura, dado que agora se tem mais clareza e domínio do que foi feito. Objetivo: máximo de velocidade dentro de uma estrutura que possibilite qualidade. Lead time insustentável = Velocidade sem possibilidade de qualidade
  45. Velocidade Qualidade Lento + Qualidade com velocidade sem qualidade sem

    velocidade com qualidade com velocidade com qualidade sem velocidade sem qualidade Make It work Make It better Make It even better Entregar (Lead time sustentável)
  46. Problema / Necessidade Solução / Sistema Receber uma transferência Internacional

    1. Criar conta de beneficiário PF / PJ 2. Cadastrar conta bancária PF /PJ 3. Criar conta Internacional p/ o beneficiário 4. Receber pagamento internacional 5. Enviar invoice do pagamento 6. Transferir valor cotado para o beneficiário 1 2 3 4 5 6 Business/Context Driven Development
  47. Problema / Necessidade Solução / Sistema Receber uma transferência Internacional

    1. Criar conta de beneficiário PF / PJ 2. Cadastrar conta bancária PF /PJ 3. Criar conta Internacional p/ o beneficiário 4. Receber pagamento internacional 5. Enviar invoice do pagamento 6. Transferir valor cotado para o beneficiário 1 2 3 4 5 6 ? Processos de negócio Business/Context Driven Development
  48. 1 2 3 4 5 6 1 2 3 4

    5 6 Sistema = Processos de negócio que o compõem. Business/Context Driven Development
  49. 1 2 3 4 5 6 1 2 3 4

    5 6 Sistema = Processos de negócio que o compõem. FATO: Todo sistema é orientado por processos, seja de forma explícita ou implícita. Business/Context Driven Development
  50. 1. Momento das Pessoas versus Negócio 2. Codebase orientado ao

    negócio 3. Separação de responsabilidades (-Acoplamento e +Coesão) 4. Escalabilidade (Monolito > Citadel > Microsserviços) Business/Context Driven Development
  51. B/CDD: Momento Negócio versus Pessoas Pessoas em diferentes níveis: -

    Junior - Pleno - Senior Momento do Negócio: - Experimentação - Transformação - Consolidação
  52. B/CDD: Momento Negócio versus Pessoas Pessoas em diferentes níveis: -

    Junior - Pleno - Senior Momento do Negócio: - Experimentação - Transformação - Consolidação
  53. Solução / Sistema 1. Criar conta de beneficiário PF /

    PJ 2. Cadastrar conta bancária PF /PJ 3. Criar conta Internacional p/ o beneficiário 4. Receber pagamento internacional 5. Enviar invoice do pagamento 6. Transferir valor cotado para o beneficiário 1 2 3 4 5 6 B/CDD: Codebase orientado ao negócio
  54. Solução / Sistema 1. Criar conta de beneficiário PF /

    PJ 2. Cadastrar conta bancária PF /PJ 3. Criar conta Internacional p/ o beneficiário 4. Receber pagamento internacional 5. Enviar invoice do pagamento 6. Transferir valor cotado para o beneficiário 1 2 3 4 5 6 B/CDD: Codebase orientado ao negócio
  55. Solução / Sistema 1. Criar conta de beneficiário PF /

    PJ 2. Cadastrar conta bancária PF /PJ 3. Criar conta Internacional p/ o beneficiário 4. Receber pagamento internacional 5. Enviar invoice do pagamento 6. Transferir valor cotado para o beneficiário 1 2 3 4 5 6 Beneficiários Pagamentos Invoices B/CDD: Codebase orientado ao negócio
  56. Solução / Sistema 1. Criar conta de beneficiário PF /

    PJ 2. Cadastrar conta bancária PF /PJ 3. Criar conta Internacional p/ o beneficiário 4. Receber pagamento internacional 5. Enviar invoice do pagamento 6. Transferir valor cotado para o beneficiário 1 2 3 4 5 6 Beneficiários Pagamentos Invoices 1. Processos existem dentro de contextos. Ex: app/models/user/password/change.rb 2. No contexto, processos estão no centro, o restante os orbitam. (existem para representar e suportar as regras de negócio). app/models/user/ password.rb password/ change.rb B/CDD: Codebase orientado ao negócio
  57. Entry Point Input Output Process Contrato/ Tradutor Interface Context Core

    Context Requisições HTTP - Routes -> Controllers - Rack apps - Rails Engines - Sinatra CLI - Rake tasks - Whenever - bin/rails runner Background Jobs - Active Job - Sidekiq Entry points em uma aplicação Ruby on Rails B/CDD: Separação de responsabilidades
  58. Entry Point Input Output Process Contrato/ Tradutor Interface Context Core

    Context Requisições HTTP - Routes -> Controllers - Rack apps - Rails Engines - Sinatra CLI - Rake tasks - Whenever - bin/rails runner Background Jobs - Active Job - Sidekiq Entry points em uma aplicação Ruby on Rails São entry points por serem processos isolados (a nível de SO). B/CDD: Separação de responsabilidades
  59. app ├── controllers │ ├── application_controller.rb │ ├── todos │

    │ ├── permitted_params.rb │ │ └── serializer.rb │ ├── todos_controller.rb │ ├── users │ │ ├── permitted_params.rb │ │ └── serializer.rb │ └── users_controller.rb └── models ├── application_record.rb ├── todo │ ├── list │ │ ├── add_item.rb │ │ ├── complete_item.rb │ │ ├── destroy_item.rb │ │ ├── find_item.rb │ │ ├── find_items.rb │ │ └── incomplete_item.rb │ ├── record.rb │ └── statuses.rb └── user ├── password.rb ├── record.rb ├── register.rb └── roles.rb lib ├── application_serializer.rb └── application_service.rb
  60. app ├── controllers │ ├── application_controller.rb │ ├── todos │

    │ ├── permitted_params.rb │ │ └── serializer.rb │ ├── todos_controller.rb │ ├── users │ │ ├── permitted_params.rb │ │ └── serializer.rb │ └── users_controller.rb └── models ├── application_record.rb ├── todo │ ├── list │ │ ├── add_item.rb │ │ ├── complete_item.rb │ │ ├── destroy_item.rb │ │ ├── find_item.rb │ │ ├── find_items.rb │ │ └── incomplete_item.rb │ ├── record.rb │ └── statuses.rb └── user ├── password.rb ├── record.rb ├── register.rb └── roles.rb lib ├── application_serializer.rb └── application_service.rb
  61. app ├── controllers │ ├── application_controller.rb │ ├── todos │

    │ ├── permitted_params.rb │ │ └── serializer.rb │ ├── todos_controller.rb │ ├── users │ │ ├── permitted_params.rb │ │ └── serializer.rb │ └── users_controller.rb └── models ├── application_record.rb ├── todo │ ├── list │ │ ├── add_item.rb │ │ ├── complete_item.rb │ │ ├── destroy_item.rb │ │ ├── find_item.rb │ │ ├── find_items.rb │ │ └── incomplete_item.rb │ ├── record.rb │ └── statuses.rb └── user ├── password.rb ├── record.rb ├── register.rb └── roles.rb lib ├── application_serializer.rb └── application_service.rb Browser Route View Controller Interface Core Processos Abstractions / Infra
  62. app ├── controllers │ ├── application_controller.rb │ ├── todos │

    │ ├── permitted_params.rb │ │ └── serializer.rb │ ├── todos_controller.rb │ ├── users │ │ ├── permitted_params.rb │ │ └── serializer.rb │ └── users_controller.rb └── models ├── application_record.rb ├── todo │ ├── list │ │ ├── add_item.rb │ │ ├── complete_item.rb │ │ ├── destroy_item.rb │ │ ├── find_item.rb │ │ ├── find_items.rb │ │ └── incomplete_item.rb │ ├── record.rb │ └── statuses.rb └── user ├── password.rb ├── record.rb ├── register.rb └── roles.rb lib ├── application_serializer.rb └── application_service.rb Browser Route View Controller Interface Core Processos Abstractions / Infra Background Job Job Interface Core Processos Abstractions / Infra
  63. Monolito (Modular) Citadel (Monolito Modular + Serviços satélites) Microsseviços Entry

    Point Input Output Process Contrato/ Tradutor Interface Context Core Context B/CDD: Escalabilidade
  64. 1356 035-... 1359 040-... 1462 050-... 1456 051-... 1504 060-...

    1519 061-... 1526 062-... 1563 063-... 1613 070-... 1326 010-... 1350 011-... 1342 020-... 1361 021-... 1361 030-... 1355 031-... 1355 032-... 1356 033-... 1356 034-...
  65. 2.144 solid-...-2.60 2.234 solid-...-2.80 2.365 solid-...-2.95 2.474 solid-...-2.99 2.527 solid-...-3

    2.947 solid-...-4 1.434 vanilla-rails 1.459 solid-...-0 1.481 solid-...-1 1.866 solid-...-2.00 1.894 solid-...-2.20 1.904 solid-...-2.40
  66. 1. Core 1. Represente operações importantes como processos. i. Código

    procedural que orquestra objetos especializados. 2. Agrupe processos por contexto (namespaces). 3. Crie abstrações para suportar os processos. 4. Testes processos de forma integrada. 2. Interface 1. Desacople o input e output dos processos dos entry points. 2. Crie abstrações para suportar os entry points. The Simple Solid Process
  67. Obrigado +100 horas de dedicação para preparar esse conteúdo. ;)

    Agradecimentos: Talita Bella Luiza Dom Eu 🫶vocês ⭐🩷⭐ @serradura rodrigoserradura.com The Simple Solid Process Maximize Frameworks MV* sem comprometer a Eng. de Software