Estratégias de Lançamento de Software Progressivo: Além do Simples If/Else com Feature Flags
Source: Dev.to
O que são Feature Toggles?
Imagine que você está construindo um foguete espacial (seu software, claro!). Você tem várias seções novas: um motor de dobra espacial, um sistema de entretenimento holográfico e um robô assistente. Você não quer lançar o foguete com tudo isso de uma vez sem testar, certo? E se o motor de dobra espacial der problema, você quer poder desligá‑lo rapidamente sem ter que pousar o foguete e trocar a peça.
Feature Toggles são exatamente isso: chaves de controle no seu código que permitem ligar ou desligar funcionalidades específicas em tempo de execução. Elas desacoplam o deploy de código do lançamento de funcionalidades. Isso significa que você pode enviar código novo para produção (com a funcionalidade desligada) e ativá‑la apenas quando estiver pronto, para quem quiser, ou sob certas condições.
Pete Hodgson categoriza os Feature Toggles com base em sua longevidade e dinamismo. Entender essas categorias é crucial para usar os toggles de forma eficaz e evitar a temida “dívida técnica” de toggles antigos.
Categorias de Feature Toggles
| Categoria | Longevidade | Dinamismo | Propósito Principal | Exemplo de Uso | Gerenciamento |
|---|---|---|---|---|---|
| Release Toggles | Curta (dias/semanas) | Baixo | Habilitar/desabilitar funcionalidades incompletas ou para lançamento coordenado. | Lançar uma nova interface de usuário para todos os clientes em uma data específica. | Remover após o lançamento completo. |
| Experiment Toggles | Média (semanas) | Alto | Testes A/B, multivariados. | Mostrar duas versões de um botão de compra para diferentes grupos de usuários para ver qual converte mais. | Remover após o experimento e decisão. |
| Ops Toggles | Curta/Longa | Alto | Controle operacional, “kill switches”. | Desabilitar uma funcionalidade de alto consumo de recursos em caso de pico de tráfego. | Manter alguns “kill switches” essenciais, remover outros após estabilidade. |
| Permissioning Toggles | Longa (meses/anos) | Alto | Personalização de experiência para usuários/grupos específicos. | Funcionalidades “premium” para assinantes, acesso antecipado para beta testers. | Podem ser permanentes, parte da lógica de negócio. |
Exemplo prático: FastAPI + Feature Toggles
Vamos criar um cenário simples: uma API FastAPI que tem uma nova funcionalidade de cálculo de frete otimizado. Queremos fazer o deploy do código, mas só ativar essa funcionalidade para um grupo seleto de usuários ou em um momento específico.
1. Crie o projeto FastAPI (usando Poetry)
poetry new feature-toggle-app
cd feature-toggle-app
poetry add fastapi uvicorn
2. Arquivo main.py
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def hello_world():
return {"status": "ok"}
3. Gerenciando os toggles (arquivo feature_flags.py)
Para simplificar, usaremos um dicionário simples. Em um cenário real, isso viria de um serviço externo (LaunchDarkly, Unleash, banco de dados, config server, etc.).
# feature_flags.py
FEATURE_TOGGLES = {
"OTIMIZED_SHIPPING": False, # Nosso Release Toggle
"NEW_DASHBOARD_BETA": False, # Exemplo de Permissioning/Experiment Toggle
}
def is_feature_enabled(feature_name: str) -> bool:
"""Retorna True se o toggle estiver ativo."""
return FEATURE_TOGGLES.get(feature_name, False)
4. Usando o toggle na API (atualize main.py)
# main.py
from fastapi import FastAPI, HTTPException
from feature_flags import is_feature_enabled
app = FastAPI()
@app.get("/")
async def hello_world():
return {"status": "ok"}
@app.get("/shipping_cost/{item_id}")
async def get_shipping_cost(item_id: int):
"""
Calcula o custo de frete.
- Se OTIMIZED_SHIPPING estiver ativo → cálculo otimizado.
- Caso contrário → cálculo padrão.
"""
if is_feature_enabled("OTIMIZED_SHIPPING"):
# Lógica do novo cálculo de frete otimizado
cost = item_id * 0.5 # Exemplo: cálculo mais barato
method = "optimized"
else:
# Lógica do cálculo de frete antigo
cost = item_id * 1.0 # Exemplo: cálculo padrão
method = "standard"
return {"item_id": item_id, "cost": cost, "method": method}
# Endpoint que só aparece se o toggle estiver ativo
@app.get("/admin/new_dashboard")
async def new_admin_dashboard():
if not is_feature_enabled("NEW_DASHBOARD_BETA"):
raise HTTPException(status_code=404, detail="New dashboard not available")
return {"message": "Bem-vindo ao novo painel de administração beta!"}
5. Rode a aplicação
poetry run uvicorn main:app --reload
6. Teste os toggles
-
Acesse
http://127.0.0.1:8000/shipping_cost/10.- Você verá o método “standard”.
-
Altere
OTIMIZED_SHIPPINGparaTrueemfeature_flags.pye salve. O uvicorn recarregará automaticamente. -
Acesse novamente
http://127.0.0.1:8000/shipping_cost/10.- Agora você verá o método “optimized”!
Isso é um Release Toggle em ação! Você pode fazer o deploy do código com a funcionalidade “desligada” e ativá‑la quando quiser, sem um novo deploy.
Boas práticas e armadilhas
- Nomeie bem seus toggles: nomes claros como
OTIMIZED_SHIPPINGsão melhores queFEATURE_A. O nome deve indicar o propósito da funcionalidade. - Mantenha a taxonomia: use as categorias (Release, Experiment, Ops, Permissioning) para guiar a longevidade e o gerenciamento.
- Remova toggles obsoletos: toggles de Release e Experiment devem ser removidos assim que cumprirem seu propósito. Eles são dívida técnica! Agende a remoção.
- Evite “if‑else” excessivo: código cheio de condicionais pode virar uma teia difícil de manter. Considere abstrações ou bibliotecas de feature flag que ofereçam APIs mais limpas.
- Documente cada toggle: registre quem criou, por quê, quando deve ser removido e quem é o responsável.
Referências
Isolamento de Código
- Objetivo: Tente isolar o código da funcionalidade por trás do toggle.
- Dica: Evite espalhar
if is_feature_enabled(...)por todo o codebase.
Testes
- Teste ambos os caminhos (toggle ligado e desligado).
- Seus testes devem cobrir todas as variações.
Ferramentas de Gerenciamento
Para projetos maiores, considere usar ferramentas dedicadas como LaunchDarkly, Unleash ou Split.io. Elas oferecem:
- Dashboards
- Segmentação de usuários
- Gerenciamento centralizado
Tipos de Feature Toggles e Recomendações
| Tipo de Toggle | Quando remover / manter | Observações |
|---|---|---|
| Release Toggles | Remova‑os assim que a funcionalidade for totalmente lançada e estabilizada. | Refatore para eliminar o if e o código antigo. |
| Experiment Toggles | Remova‑os após a conclusão do experimento e a decisão de manter ou descartar a funcionalidade. | |
| Ops Toggles | Mantenha apenas os “kill switches” essenciais. | Revise‑os periodicamente. |
| Permissioning Toggles | Podem ser de longa duração, mas devem ser bem documentados e tratados como parte da lógica de negócio. |
Nota: O maior desafio dos Feature Toggles é o gerenciamento. Um toggle de Release que fica muito tempo no código se torna um toggle de Permissioning ou Ops por acidente, adicionando complexidade desnecessária.
Benefícios dos Feature Toggles
- Reduz risco de deploys
- Facilita testes A/B e experimentos em produção
- Permite liberar funcionalidades para subconjuntos de usuários
- Permite reagir rapidamente a problemas em produção
Ao adotar essa técnica com sabedoria, você não apenas melhora a qualidade do seu software, mas também a confiança e a velocidade da equipe.
Referência
- Fowler, Martin. Feature Toggles (aka Feature Flags). MartinFowler.com, 2017. Disponível em: .