Estratégias de Lançamento de Software Progressivo: Além do Simples If/Else com Feature Flags

Published: (February 18, 2026 at 08:43 PM EST)
6 min read
Source: Dev.to

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

CategoriaLongevidadeDinamismoPropósito PrincipalExemplo de UsoGerenciamento
Release TogglesCurta (dias/semanas)BaixoHabilitar/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 TogglesMédia (semanas)AltoTestes 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 TogglesCurta/LongaAltoControle 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 TogglesLonga (meses/anos)AltoPersonalizaçã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

  1. Acesse http://127.0.0.1:8000/shipping_cost/10.

    • Você verá o método “standard”.
  2. Altere OTIMIZED_SHIPPING para True em feature_flags.py e salve. O uvicorn recarregará automaticamente.

  3. 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_SHIPPING são melhores que FEATURE_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 ToggleQuando remover / manterObservações
Release TogglesRemova‑os assim que a funcionalidade for totalmente lançada e estabilizada.Refatore para eliminar o if e o código antigo.
Experiment TogglesRemova‑os após a conclusão do experimento e a decisão de manter ou descartar a funcionalidade.
Ops TogglesMantenha apenas os “kill switches” essenciais.Revise‑os periodicamente.
Permissioning TogglesPodem 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

  1. Fowler, Martin. Feature Toggles (aka Feature Flags). MartinFowler.com, 2017. Disponível em: .
0 views
Back to Blog

Related posts

Read more »