A pegada de uma funcionalidade

Prévia grátis 5 min de leitura

Ser dono de uma funcionalidade de ponta a ponta começa por saber quão grande uma funcionalidade é. Não em linhas: em lugares que você precisa tocar, e lugares que podem quebrar sem você notar.

Contando o Partners

A funcionalidade de parceiros nesta aplicação. Logos de patrocínio no roadmap, cartões de vagas, um formulário de contato, um CRUD administrativo e, desde que este curso foi escrito, uma API de parceiros, webhooks assinados, um handoff de login e uma tela de consentimento do aluno. Aqui está tudo que ela é.

$ find app -path '*partners*' -type f | wc -l
70
Camada Quantidade Exemplos
Models 8 Partner, Role, Inquiry, CourseSponsorship, ApiToken, Referral, HandoffNonce, partners.rb
Controllers 9 Três de admin (partners, graduates, inquiries), inquiries, consents, e quatro na API de parceiros
Consultas 11 ActivePartnersQuery, TrackSponsorsQuery, HiringQuery, LearnersQuery, mais sete
Serviços 9 SavePartnerService, FetchSiteIconService, SubmitInquiryService, RedeemHandoffTokenService, WebhookTransport, mais quatro
Jobs 4 FetchSiteIconJob, DeliverWebhookJob, AnnounceCertificateEarnedJob, PruneHandoffNoncesJob
Mailers 1 InquiryMailer, com um template HTML e um de texto
Políticas 9 Partners::Tiers, WebhookSignature, WebhookCircuit, ApiScopes, mais cinco
Views 19 Formulários de admin, parciais públicas, templates de e-mail, três views jbuilder da API
Arquivos de spec 27 Specs de requisição, serviço, job, política e consulta, mais factories
Migrações 9 Do create_partners às tabelas de token de API e de indicação
Rotas 6 entradas Um namespace de admin, o namespace da API, o handoff, a página pública, o POST de contato e um redirecionamento

Cerca de cem arquivos: setenta em app/, vinte e sete em spec/, nove migrações. E essa contagem deliberadamente exclui o que não é arquivo. As chaves de idioma em duas línguas, o anexo do Active Storage, as filas em que os jobs rodam, e o que quer que a página do roadmap faça com a TrackSponsorsQuery.

flowchart TB
  F["uma funcionalidade: Partners"] --> M["8 models"]
  F --> C["9 controllers, 4 deles uma API"]
  F --> Q["11 consultas"]
  F --> S["9 serviços"]
  F --> J["4 jobs"]
  F --> ML["1 mailer, 2 templates"]
  F --> V["19 views"]
  F --> T["27 arquivos de spec, 9 migrações, 6 rotas"]
  F --> N["e: chaves de idioma, storage, filas, uma página pública"]

Por que a contagem importa

Porque o instinto quando alguém diz "eu pego o trabalho do logo de parceiro" é imaginar o objeto de serviço. E o objeto de serviço é um arquivo de cerca de cem.

Cada uma dessas camadas é um lugar onde a funcionalidade pode ficar pela metade. Uma consulta acrescentada e nunca chamada. Uma chave de idioma numa língua só. Uma migração que rodou em desenvolvimento e não em produção. Um job que enfileira e silenciosamente não faz nada. Uma parcial de view com uma guarda de nil que ninguém precisou até o dia em que precisou.

Ser dono significa a coluna inteira, não o arquivo interessante do meio.

Onze consultas

Olhe aquela linha de novo. Onze objetos de consulta para uma funcionalidade: ActivePartnersQuery, TrackSponsorsQuery, CourseSponsorQuery, HiringQuery, quatro atrás da API de parceiros, e três de admin.

Duas coisas decorrem desse número.

O lado de leitura é maior que o de escrita. Sete dos nove serviços escrevem; onze consultas leem. Isso é normal e raramente antecipado, e é por que "adicionar um campo em parceiros" nunca é um arquivo. Toda consulta que devolve parceiros pode precisar saber dele.

Alguém já fez a sua pergunta. Antes de adicionar uma décima segunda consulta, o primeiro passo honesto é ler as onze. Essa é a fonte mais comum de trabalho duplicado numa funcionalidade com pegada existente, e custa dez minutos evitar.

As camadas que são esquecidas

Das onze linhas, quatro são as que ficam pela metade, e são as mesmas quatro toda vez:

Chaves de idioma. A funcionalidade funciona na língua em que você desenvolveu.

O template de texto do mailer. A versão HTML recebe atenção; a de texto puro é renderizada por um cliente que você não usa.

O caminho de falha do job. Ele enfileira, então parece pronto.

O formato da migração em produção. Ela rodou num banco de desenvolvimento com quarenta linhas.

As aulas 4 e 5 são sobre essas quatro, porque é onde "terminei a funcionalidade" e "a funcionalidade funciona" se separam.

A definição

Ser dono de ponta a ponta significa: você conhece toda entrada, toda forma de falhar, e como descobriria que parou de funcionar.

Três orações. A aula 2 é a primeira, as aulas 3 e 4 são a segunda. E a aula 5 é a terceira, que é a que ninguém é dono por padrão.

Pontos-chave

  • A funcionalidade Partners são cerca de cem arquivos em onze camadas, mais chaves de idioma, storage e filas.
  • O objeto de serviço que todos imaginam é um arquivo de cerca de cem.
  • Onze consultas leem, sete serviços escrevem: o lado de leitura é maior e raramente antecipado.
  • Antes de adicionar uma consulta, leia as onze que existem; é a fonte mais comum de trabalho duplicado.
  • Ser dono de ponta a ponta: você conhece toda entrada, toda forma de falhar, e como descobriria que parou.
Aula 1 de 7 · grátis

Continue com a aula 2

Toda entrada

Mostra os dois caminhos até o serviço de busca do logo e por que diferem em momento, descarte e erros.

Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.

Digite para buscar...