spinny:~/writing $ less openfeature-feature-flags-progressive-delivery.md
12A implantação ocorre quando o código chega à produção. Liberação é quando alguém pode realmente usá-lo. Confundir os dois é uma das maneiras mais rápidas de tornar cada implantação um momento um pouco tenso.34Os feature flag servem para colocar espaço entre esses dois momentos. Você pode implantar hoje, iniciar amanhã para a equipe interna, depois para um cliente piloto e depois para 10% dos usuários. Se algo der errado, desligue a bandeira. Você não precisa necessariamente reverter a versão inteira.56## A bandeira não é apenas um if78Tecnicamente, geralmente é um `if`. Culturalmente é muito mais.910```typescript11if (await flags.isEnabled('checkout.v2.enabled', context)) {12 return newCheckout(input);13}1415return oldCheckout(input);16```1718Esse pequeno `if` pode representar uma implementação gradual, um experimento, uma migração, uma licença empresarial ou um kill switch operacional. O problema é que se você não administrar bem, também pode virar uma dívida técnica que fica no código por dois anos.1920## Onde entra OpenFeature2122OpenFeature é uma especificação aberta para avaliar feature flag com um API comum. A ideia é simples: o código da sua aplicação não deve depender diretamente do fornecedor ou do sistema interno que você usa para flags.2324O aplicativo pergunta:2526```typescript27const enabled = await client.getBooleanValue('checkout.v2.enabled', false, {28 targetingKey: user.id,29 plan: user.plan,30 country: user.country,31});32```3334O provedor decide de onde vêm as regras: SaaS, arquivo, serviço interno, sinalizador, configuração do GitOps. Se um dia você alterar o back-end de sinalização de recursos, o aplicativo não precisará ser reescrito em todos os lugares.3536Esta separação parece um detalhe arquitetônico, mas é sentida à medida que o projeto cresce.3738## Contexto é metade da batalha3940Um sinalizador ligado ou desligado para todos é útil, mas limitado. A entrega progressiva vive no contexto:4142- usuário interno ou externo;43- plano gratuito ou empresarial;44- aldeia;45- organização;46- versão do aplicativo;47- porcentagem estável de tráfego.4849A chave importante é `targetingKey`: deve ser estável. Se mudar a cada solicitação, um usuário pode acabar uma vez na variante A e uma vez na variante B. Para um experimento é terrível, para um checkout pode ser desastroso.5051## Uma implementação sensata5253Um fluxo que gosto é este:54551. implantar com sinalizador desativado;562. ignição para desenvolvedores e controle de qualidade;573. ativação para um cliente ou inquilino piloto;584. Implementação de 5%;595. implantação em 25%;606. Implementação 100%;617. remoção de código e sinalizador antigos.6263O ponto frequentemente esquecido é o último. Uma bandeira temporária deve ter uma data de falecimento. Se permanecer para sempre, todo refatorador futuro terá que perguntar: "mas esse branch ainda é útil?".6465## Kill switch: prepare-os primeiro6667O kill switch é o sinalizador que salva você quando uma dependência externa começa a atrapalhar você, um trabalho consome muitos recursos ou uma nova lógica produz erros estranhos.6869Um bom kill switch deve ser:7071- fácil de encontrar;72- documentado no runbook;73- testado ocasionalmente;74- observável quando ativado;75- independente, tanto quanto possível, da parte que possa quebrar.7677O pior é descobrir durante o acidente que a bandeira existe, mas ninguém sabe se ainda funciona.7879## Observabilidade ou entrega não progressiva8081Ativar um recurso em 10% sem olhar as métricas é apenas otimismo com múltiplas etapas.8283Cada implementação deve responder a perguntas simples:8485- os erros aumentaram?86- a latência mudou?87- os usuários completam o fluxo?88- há mais tickets ou novas tentativas?89- uma variante afeta apenas um segmento?9091OpenFeature suporta ganchos em torno da avaliação de sinalizadores. Eles são úteis para registrar erros, adicionar métricas ou vincular a classificação a trace.9293## Nomenclatura e propriedade9495Os nomes são importantes. `new_ui` não diz nada. `checkout.v2.enabled` diz muito mais.9697Para cada bandeira eu marcaria pelo menos:9899- nome;100- descrição;101- proprietário;102- padrão seguro;103- razão pela qual existe;104- data ou condição da remoção.105106Uma bandeira sem dono é quase sempre uma bandeira que ninguém irá eliminar.107108## Onde avaliá-los109110Front-end, back-end ou edge? Depende.111112Se o sinalizador for para layout, cópia ou integração, o frontend está bom. Se se tratar de permissões, cobrança, limites ou dados confidenciais, deve estar no backend. Se envolver roteamento ou experimentos de alto tráfego, a vantagem pode fazer sentido.113114A regra simples: o frontend pode melhorar a experiência, mas não deve ser a única barreira de segurança.115116## Conclusão117118Os feature flag bem feitos mudam a relação com a produção. Eles não eliminam o risco, mas o tornam menor e mais gerenciável. Você pode soltar em fatias, observar, parar, voltar, aprender.119120OpenFeature adiciona uma base limpa: um API comum, provedores intercambiáveis e uma maneira mais organizada de expandir o sistema. Mas a disciplina continua sendo sua: padrões seguros, nomes claros, métricas, proprietários e limpeza.121122A melhor bandeira é aquela que te ajuda a liberar com calma e depois desaparece quando não for mais necessária.123124## Fontes125126- [OpenFeature: Introduction](https://openfeature.dev/docs/reference/intro/)127- [OpenFeature: Node.js SDK](https://openfeature.dev/docs/reference/sdks/server/javascript/)128- [OpenFeature Specification: Flag Evaluation API](https://openfeature.dev/specification/sections/flag-evaluation)129- [OpenFeature: Hooks](https://openfeature.dev/docs/reference/concepts/hooks/)130- [CNCF: OpenFeature](https://www.cncf.io/projects/openfeature/)131
:Feature flag: solte sem prender a respiraçãolines 1-131 (END) — press q to close