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

B/CDD - Business Context Driven Development wit...

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. Agenda - Aviso - Velocidade + Qualidade - B/CDD -

    Aplicação prática - Guideline
  2. 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.
  3. Velocidade Qualidade Lento + Qualidade sem velocidade sem qualidade sem

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

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

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

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

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

    velocidade com qualidade com velocidade com qualidade sem velocidade sem qualidade Make It work Entregar
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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.
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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.
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. 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
  31. Entry Point Context Input Output Use Case Contratos B/CDD: Escalável

    Monolito (Modular) Citadel (Monolito + Serviços) Microsseviços
  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 1 2 3 Entrega Comportamento Entrega melhorias para a Estrutura 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 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. 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
  36. 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.
  37. 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
  38. 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: