Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

@serradura [email protected]

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

https://adarb.com.br/

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

Aviso

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

Resumindo: Sem plágio por favor!

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

Velocidade + Qualidade

Slide 14

Slide 14 text

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.

Slide 15

Slide 15 text

Velocidade + Qualidade + Pragmatismo

Slide 16

Slide 16 text

Entregar

Slide 17

Slide 17 text

Velocidade Entregar

Slide 18

Slide 18 text

Velocidade Qualidade Entregar

Slide 19

Slide 19 text

Velocidade Qualidade Lento + Qualidade sem velocidade sem qualidade Entregar

Slide 20

Slide 20 text

Velocidade Qualidade Lento + Qualidade sem velocidade com qualidade Entregar

Slide 21

Slide 21 text

Velocidade Qualidade Lento + Qualidade com velocidade sem qualidade Entregar

Slide 22

Slide 22 text

Velocidade Qualidade Lento + Qualidade com velocidade sem qualidade Entregar

Slide 23

Slide 23 text

Velocidade Qualidade Lento + Qualidade com velocidade com qualidade Entregar

Slide 24

Slide 24 text

Velocidade Qualidade Lento + Qualidade com velocidade com qualidade Entregar

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

Make it Work, Right and Fast

Slide 37

Slide 37 text

Make it Work, Right and Fast

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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.

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

B/CDD Business Context Driven Development

Slide 44

Slide 44 text

B/CDD Business Context Driven Development

Slide 45

Slide 45 text

Business Context Driven Development Problema / Necessidade

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

Business Context Driven Development

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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.

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

Rails way Módulos / Camada dedicada

Slide 57

Slide 57 text

Rails way Módulos / Camada dedicada

Slide 58

Slide 58 text

B/CDD Business Context Driven Development

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

B/CDD Pessoas + momento do negócio

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

B/CDD Codebase orientado ao negócio

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

B/CDD Separação de responsabilidades

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

B/CDD Escalável

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

Talk is cheap. Show me the code. Linus Torvalds

Slide 75

Slide 75 text

Demo Photo by Denis Pavlovic on Unsplash

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

B/CDD Guideline

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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.

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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:

Slide 84

Slide 84 text

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