$30 off During Our Annual Pro Sale. View Details »

B/CDD - Business Context Driven Development with Ruby on Rails

B/CDD - Business Context Driven Development with Ruby on Rails

Resumo
======
B/CDD é um processo de desenvolvimento que visa conciliar velocidade, qualidade e pragmatismo no desenvolvimento de software. Eu o criei ao longo dos últimos anos e o mesmo se provou eficaz em diferentes empresas, times e codebases Ruby/Rails.

A talk apresenta seus benefícios, fundamentos e foca em demonstrar sua aplicação de forma prática.

Descrição
========

O Ruby on Rails é um framework altamente produtivo e sempre foi escolhido como uma ferramenta para promover entregas, mas é muito comum ouvir relatos do quão difícil é escalar o desenvolvimento em um codebase na qual a complexidade ficou alta por conta da evolução das regras de negócio.

Todo negócio tem valor ao gerar valor para quem faz uso dele, e para isso precisa se adaptar continuamente para gerar cada vez mais valor para permanecer relevante e vivo.

Essa capacidade de adaptação está intrisicamente ligada a sua capacidade de entrega. Logo, conciliar velocidade com qualidade é determinante para obter os melhores resultados possíveis.

Eu criei o u-case como um meio de acomodar melhor as regras de negócio de um codebase Ruby / Rails, ou seja, eu o criei para potencializar o desenvolvimento usando Ruby on Rails. A partir de seu uso em diferentes codebases com diferente complexidades e diferentes dinâmicas de time e empresa, vi emergir um padrão de desenvolvimento que facilita a implementação e manutenção de funcionalidades. Um padrão capaz de conciliar velocidade com qualidade e que se adapta bem aos diferentes momentos que toda empresa passa. Esse padrão que recebeu o nome de B/CDD.

Gravação:
========
https://youtu.be/dTKQbXvAlzk?t=8786

Repositório de exemplo
==================
https://github.com/serradura/todo-bcdd

---

Palestras relacionadas
=================

* De service objects a use cases:
https://www.youtube.com/watch?v=ySNzVfmYy5g

* u-case: Entenda na prática o poder do railway oriented programming:
https://www.youtube.com/watch?v=rtyZ8K58MbU&t=6424s

* Live coding: Refatorando um app Rails com casos de uso (SOLID na prática):
https://www.youtube.com/watch?v=VxQj-8lx24s&t=4096s

Rodrigo Serradura

May 21, 2022
Tweet

More Decks by Rodrigo Serradura

Other Decks in Programming

Transcript

  1. B/CDD
    Business/Context Driven Development
    with Ruby on Rails
    Photo by SpaceX on Unsplash

    View Slide

  2. @serradura
    [email protected]

    View Slide

  3. View Slide

  4. View Slide

  5. https://adarb.com.br/

    View Slide

  6. View Slide

  7. Agenda
    - Aviso
    - Velocidade + Qualidade
    - B/CDD
    - Aplicação prática
    - Guideline

    View Slide

  8. Aviso

    View Slide

  9. View Slide

  10. Não autorizo a replicação desse conteúdo em
    qualquer idioma sem minha autorização
    prévia

    View Slide

  11. Resumindo: Sem plágio por favor!

    View Slide

  12. View Slide

  13. Velocidade + Qualidade

    View Slide

  14. Velocidade + Qualidade
    Velocidade:
    Entregar (colocar em prod) no menor tempo possível.
    Qualidade:
    Reduzir o custo da mudança = Engenharia de software.
    Reduzir o custo do entendimento.

    View Slide

  15. Velocidade + Qualidade
    + Pragmatismo

    View Slide

  16. Entregar

    View Slide

  17. Velocidade
    Entregar

    View Slide

  18. Velocidade
    Qualidade
    Entregar

    View Slide

  19. Velocidade
    Qualidade
    Lento + Qualidade
    sem velocidade
    sem qualidade
    Entregar

    View Slide

  20. Velocidade
    Qualidade
    Lento + Qualidade
    sem velocidade
    com qualidade
    Entregar

    View Slide

  21. Velocidade
    Qualidade
    Lento + Qualidade
    com velocidade
    sem qualidade
    Entregar

    View Slide

  22. Velocidade
    Qualidade
    Lento + Qualidade
    com velocidade
    sem qualidade
    Entregar

    View Slide

  23. Velocidade
    Qualidade
    Lento + Qualidade
    com velocidade
    com qualidade
    Entregar

    View Slide

  24. Velocidade
    Qualidade
    Lento + Qualidade
    com velocidade
    com qualidade
    Entregar

    View Slide

  25. Velocidade
    Qualidade
    Lento + Qualidade
    sem velocidade
    sem qualidade
    sem velocidade
    com qualidade
    com velocidade
    sem qualidade
    com velocidade
    com qualidade
    Entregar

    View Slide

  26. Velocidade
    Qualidade
    Lento + Qualidade
    com velocidade
    sem qualidade
    sem velocidade
    com qualidade
    com velocidade
    com qualidade
    sem velocidade
    sem qualidade
    Entregar

    View Slide

  27. Velocidade
    Qualidade
    Lento + Qualidade
    com velocidade
    sem qualidade
    sem velocidade
    com qualidade
    com velocidade
    com qualidade
    sem velocidade
    sem qualidade
    Entregar

    View Slide

  28. Velocidade
    Qualidade
    Lento + Qualidade
    com velocidade
    sem qualidade
    sem velocidade
    com qualidade
    com velocidade
    com qualidade
    sem velocidade
    sem qualidade
    Entregar

    View Slide

  29. Velocidade
    Qualidade
    Lento + Qualidade
    com velocidade
    sem qualidade
    sem velocidade
    com qualidade
    com velocidade
    com qualidade
    sem velocidade
    sem qualidade
    Como?
    Entregar

    View Slide

  30. Velocidade
    Qualidade
    Lento + Qualidade
    com velocidade
    sem qualidade
    sem velocidade
    com qualidade
    com velocidade
    com qualidade
    sem velocidade
    sem qualidade
    Make
    It
    work
    Entregar

    View Slide

  31. 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

    View Slide

  32. 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
    Make
    It
    even
    better

    View Slide

  33. 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

    View Slide

  34. 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
    Make
    It
    even
    better

    View Slide

  35. 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
    Make
    It
    even
    better
    Inspiração: Make it Work, Right and fast

    View Slide

  36. Make it Work, Right and Fast

    View Slide

  37. Make it Work, Right and Fast

    View Slide

  38. 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

    View Slide

  39. 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.
    O X é: máximo de velocidade dentro de uma estrutura
    que possibilite qualidade.

    View Slide

  40. 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.
    O X é: máximo de velocidade dentro de uma estrutura
    que possibilite qualidade.
    Inferno =
    Velocidade sem possibilidade de
    qualidade

    View Slide

  41. 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
    Make
    It
    even
    better

    View Slide

  42. https://martinfowler.com/articles/is-quality-worth-cost.html

    View Slide

  43. B/CDD
    Business Context
    Driven Development

    View Slide

  44. B/CDD
    Business Context
    Driven Development

    View Slide

  45. Business Context Driven Development
    Problema /
    Necessidade

    View Slide

  46. Problema /
    Necessidade
    Solução /
    Sistema
    Business Context Driven Development

    View Slide

  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
    Business Context Driven Development

    View Slide

  48. 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
    ?
    Casos de uso
    Business Context Driven Development

    View Slide

  49. Business Context Driven Development

    View Slide

  50. Business Context Driven Development
    Sistema = Casos de uso que o compõem.

    View Slide

  51. Business Context Driven Development
    Sistema = Casos de uso que o compõem.

    View Slide

  52. Business Context Driven Development
    Sistema = Casos de uso que o compõem.
    1 2 3
    4 5 6
    1 2 3
    4 5 6

    View Slide

  53. Business Context Driven Development
    Sistema = Casos de uso que o compõem.
    1 2 3
    4 5 6
    1 2 3
    4 5 6
    FATO: Todo sistema é orientado por casos de
    uso, seja de forma explícita ou implícita.

    View Slide

  54. Business Context Driven Development
    Sistema = Casos de uso que o compõem.
    1 2 3
    4 5 6
    1 2 3
    4 5 6
    FATO: Todo sistema é orientado por casos de
    uso, seja de forma explícita ou implícita.
    Rails way
    Módulos / Camada
    dedicada

    View Slide

  55. View Slide

  56. Rails way
    Módulos / Camada
    dedicada

    View Slide

  57. Rails way
    Módulos / Camada
    dedicada

    View Slide

  58. B/CDD
    Business Context
    Driven Development

    View Slide

  59. 1. Pessoas + Momento do negócio
    2. Codebase orientado ao negócio
    3. Separação de responsabilidades (acoplamento e coesão)
    4. Escalável (Monolito > Citadel > Microsserviços)
    Business Context Driven Development

    View Slide

  60. B/CDD
    Pessoas + momento do negócio

    View Slide

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

    View Slide

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

    View Slide

  63. B/CDD
    Codebase orientado ao negócio

    View Slide

  64. 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

    View Slide

  65. 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

    View Slide

  66. 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

    View Slide

  67. 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. Casos de uso existem dentro de contextos. Ex:
    app/models/user/password/change.rb
    2. No domínio, casos de uso estão no centro, o restante os orbitam
    (existem para representar as regras de negócio).
    app/models/user/
    password.rb
    password/
    change.rb
    B/CDD: Codebase orientado ao negócio

    View Slide

  68. B/CDD
    Separação de responsabilidades

    View Slide

  69. B/CDD: Separação de responsabilidades
    Entry Point
    Context
    Input
    Output
    Use
    Case
    Contratos

    View Slide

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

    View Slide

  71. Requisições HTTP
    - Routes -> Controllers
    - Rack apps mounted
    - Rails Engines
    - Sinatra
    CLI
    - Rake tasks
    - Whenever
    - bin/rails runner
    Background Jobs
    - Active Job
    - Sidekiq
    Entry points em uma aplicação Ruby on Rails
    Entry Point
    Context
    Input
    Output
    Use
    Case
    Contratos
    São entry points por serem processos isolados (a nível de SO).
    B/CDD: Separação de responsabilidades

    View Slide

  72. B/CDD
    Escalável

    View Slide

  73. Entry Point
    Context
    Input
    Output
    Use
    Case
    Contratos
    B/CDD: Escalável
    Monolito (Modular)
    Citadel
    (Monolito + Serviços)
    Microsseviços

    View Slide

  74. Talk is
    cheap.
    Show me the
    code.
    Linus Torvalds

    View Slide

  75. Demo
    Photo by Denis Pavlovic on Unsplash

    View Slide

  76. 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

    View Slide

  77. 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
    Make
    It
    even
    better

    View Slide

  78. 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
    Make
    It
    even
    better

    View Slide

  79. B/CDD
    Guideline

    View Slide

  80. Casos de uso:
    - Crie dentro de um namespace (contexto).
    - Centralize o máximo de responsabilidades.
    - Teste retornos (falha, sucesso e o que é exposto) + side effects.
    - Aceite/Releve duplicação.
    - Garanta que todo entry point dependa de um.
    Entry point:
    - Garanta que o input passado para o caso de uso esteja desacoplado do Entry point.
    Ex: Não passe o params do controller como input do use case.
    - Faça com que o entry point reaja a todos os resultados de um caso de uso (on_success, on_failure, on_unknown).
    Sandi Metz
    1. Pior que duplicação é uma abstração errada.
    2. Duplicação é mais barato que uma abstração errada.
    Make it Work

    View Slide

  81. Make it Right
    Aprimore os namespaces:
    - Renomeie para melhor representar os domínios / contextos da aplicação. Depois do make it work haverá mais
    clareza para fazer isso.
    Abstrair apenas se *:
    - Padrões foram reconhecidos (a duplicação está clara).
    - Um bom nome pode ser dado (módulos, classes e métodos), ou seja, entendimento real do domínio/regras de
    negócio da aplicação.
    * Abstrair apenas se = design evolutivo, ou seja, a solução emerge para resolver um problema/dor real.
    Dica de ouro: Priorize clareza e entendimento com a menor / melhor indireção possível, mais do que fazer uma
    implementação rebuscada.

    View Slide

  82. Aumente a cobertura de testes:
    Foque nos entry points, porque o restante deveria estar sendo coberto pelos testes dos casos de uso.
    Desacople Views / interfaces de objetos que promovam side effects:
    Garanta que todo e qualquer side effect aconteça nos caso de uso e que os exponham apenas dados para quem os
    consome.
    Performance:
    Faça o melhor uso possível da infra, queries eficientes, elimine N+1, cache…
    Foque em outros requisitos não funcionais como:
    Segurança, disponibilidade, confiabilidade, observabilidade, manutenibilidade.
    Otimizações:
    Reduzir alocação em memória - constantes, memoization... (garbage collector é o que deixa o Ruby lento).
    Make it Even Better

    View Slide

  83. 1. Estrutura de pastas + arquivos devem revelar o domínio e suas regras de negócio.
    2. Casos de uso devem existir dentro dos domínios e contar boas histórias.
    3. Criar abstrações no mesmo contexto dos itens acima (design patterns, SoC, SOLID e etc)
    para potencializar a implementação dos casos de uso (ex: dificuldade de testar /
    mockar, alta complexidade nas implementações dos steps).
    4. Quando mover as abstrações para longe? (Ex: uma gem, lib) Quando houver uma real
    necessidade de reuso entre domínios/contextos.
    Priorize:

    View Slide

  84. Obrigado
    @serradura
    [email protected]
    ~24 horas de dedicação
    para preparar esse conteúdo. ;)

    View Slide