$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
  2. @serradura rodrigo.serradura@gmail.com

  3. None
  4. None
  5. https://adarb.com.br/

  6. None
  7. Agenda - Aviso - Velocidade + Qualidade - B/CDD -

    Aplicação prática - Guideline
  8. Aviso

  9. None
  10. Não autorizo a replicação desse conteúdo em qualquer idioma sem

    minha autorização prévia
  11. Resumindo: Sem plágio por favor!

  12. None
  13. Velocidade + Qualidade

  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.
  15. Velocidade + Qualidade + Pragmatismo

  16. Entregar

  17. Velocidade Entregar

  18. Velocidade Qualidade Entregar

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

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

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

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

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

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

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

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

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

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

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

    velocidade com qualidade com velocidade com qualidade sem velocidade sem qualidade Como? Entregar
  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
  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
  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
  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
  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
  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
  36. Make it Work, Right and Fast

  37. Make it Work, Right and Fast

  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
  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.
  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
  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
  42. https://martinfowler.com/articles/is-quality-worth-cost.html

  43. B/CDD Business Context Driven Development

  44. B/CDD Business Context Driven Development

  45. Business Context Driven Development Problema / Necessidade

  46. Problema / Necessidade Solução / Sistema 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 Business Context Driven Development
  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
  49. Business Context Driven Development

  50. Business Context Driven Development Sistema = Casos de uso que

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

    o compõem.
  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
  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.
  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
  55. None
  56. Rails way Módulos / Camada dedicada

  57. Rails way Módulos / Camada dedicada

  58. B/CDD Business Context Driven Development

  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
  60. B/CDD Pessoas + momento do negócio

  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
  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
  63. B/CDD Codebase orientado ao negócio

  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
  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
  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
  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
  68. B/CDD Separação de responsabilidades

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

    Case Contratos
  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
  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
  72. B/CDD Escalável

  73. Entry Point Context Input Output Use Case Contratos B/CDD: Escalável

    Monolito (Modular) Citadel (Monolito + Serviços) Microsseviços
  74. Talk is cheap. Show me the code. Linus Torvalds

  75. Demo Photo by Denis Pavlovic on Unsplash

  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
  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
  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
  79. B/CDD Guideline

  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
  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.
  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
  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:
  84. Obrigado @serradura rodrigo.serradura@gmail.com ~24 horas de dedicação para preparar esse

    conteúdo. ;)