Feature flags são um conceito fundamental no desenvolvimento de software que permite o controle da ativação ou desativação de funcionalidades em tempo de execução, sem necessidade de reimplantação. É uma técnica essencial para lançamentos seguros, testes A/B e personalização da experiência do usuário.
No artigo de hoje, descubra mais sobre as feature flags e seu papel no desenvolvimento de software.
O que são Feature Flags?
Feature flags (alternância de recursos, em tradução livre) é uma técnica que permite que sejam feitas mudanças no comportamento da aplicação a partir de condições que possam “ligar” ou “desligar” funcionalidades de uma aplicação sem a necessidade de realizar um novo deployment (implantação, em português).
Também chamada de feature toggles, esta técnica possibilita que as empresas lancem novos recursos gradualmente, permitindo que os usuários experimentem a nova funcionalidade, enquanto monitoram e ajustam a sua implantação com base no feedback dos usuários.
Por meio das feature flags, também é possível ativar uma feature somente para testes e a definição de quem poderá vê-la, para também que se faça a remoção de funcionalidades que ninguém mais usa em um sistema.
Para que serve o Feature Flag?
Basicamente, economizar tempo e esforço de desenvolvimento do time, além de diminuir riscos com o lançamento de funcionalidades de maneira mais incremental e evitando alterações manuais no sistema, que podem gerar erros.
Além disso, auxilia no gerenciamento de versões do software, na experimentação de produtos e testes A/B e reduz o risco de migrações, como explicaremos a seguir:
Versões de software sem risco (gerenciamento de versões)
É possível a implantação de código novo em produção sem a necessidade de ativá-lo imediatamente para todos os usuários. As equipes de desenvolvimento podem liberar novas funcionalidades de maneira mais segura e ativar ou desativar recursos conforme necessário, reduzindo o risco de erros críticos durante a produção.
Melhorar a confiabilidade e a integridade operacional
O uso de feature flags pode gerenciar e controlar o comportamento de um sistema pela ativação/desativação de um recurso para minimizar o impacto de incidentes.
Com o uso de feature flags, é possível testar migrações para novos microsserviços, alterar logs em tempo real para fins de depuração, limitar as solicitações de API para garantir a sua confiabilidade e implantar disjuntores ou interruptores de segurança para desabilitar recursos se ele impactar a experiência do usuário de forma negativa.
Direcionar e personalizar experiências de software
Com feature flags específicos, é possível personalizar a experiência do usuário com base em dados específicos, como localização geográfica, preferências de idioma ou histórico de compras. Isso é útil para personalizar a experiência do usuário e fornecer recursos relevantes para usuários específicos.
Aprender por meio de experimentação de produtos e testes A/B
Os testes A/B são de importância alta, pois diferentes variações de uma funcionalidade podem ser experimentadas em um ambiente controlado para determinar qual variação trabalha melhor antes de lançá-la para todos os usuários.
Isso é proveitoso para a equipe de desenvolvimento de software porque ela pode coletar dados sobre o desempenho de cada versão do produto, antes de fazer o lançamento, o que otimizar a experiência do usuário.
Reduzir o risco de migrações
Em projetos de migração ou refatoração, feature flags permitem a ativação de partes específicas de uma nova arquitetura (como um novo sistema ou serviço) sem interromper o funcionamento geral da aplicação. Tal vantagem facilita uma transição gradual e controlada com a possibilidade de realizar rollbacks (reversão, em português) imediatos caso algo dê errado.
Quais são os tipos de uso do Feature Flag?
Feature flags podem ser usados em diferentes em linguagens de programação, como JavaScript, Python, Node.js, entre outras, conforme detalhamos a seguir.
Feature Flags para DevOps
Para DevOps, trata-se de uma ferramenta essencial para facilitar a integração contínua e a entrega contínua (CI/CD). As equipes de desenvolvimento podem implementar novas funcionalidades de forma incremental, sem interromper o fluxo de trabalho.
Logo, as equipes podem lançar atualizações com mais frequência, reduzindo o tempo de espera entre o desenvolvimento e a disponibilização de novas funcionalidades para os usuários finais.
Feature Flags para JavaScript
Neste caso, é permitido que aplicativos JavaScript ativem ou desativem recursos de forma dinâmica. Desenvolvedores podem usar feature flags em casos de uso simples, como instruções condicionais.
Feature Flags para Node.js
Engenheiros, desenvolvedores e as equipes de produto podem ativar ou desativar recursos sem precisar fazer o deployment de código algum. Feature flags de Node.js também capacitam as mesmas funcionalidades.
Feature Flags para Python
No caso, feature flags permite que desenvolvedores ativem e desativem novos recursos, seja fazendo experimentos, testes para fins de controle de qualidade ou para implementar alterações para usuários em produção, otimizando o ciclo de vida de desenvolvimento de software.
Feature Flags para React
Feature flags podem ativar ou desativar recursos com base em critérios pré-definidos. Esses recursos podem ser controlados dinamicamente por meio de configuração, APIs, ou serviços de terceiros, o que traz mais flexibilidade nas implantações.
Feature Flags para Ruby
No caso de Ruby, feature flags permitem o controle do lançamento e o comportamento de funcionalidades de forma dinâmica, sem a necessidade de um novo deploy.
Isso possibilita que funcionalidades sejam liberadas para um grupo específico de usuários, mitigação de riscos, testes A/B e controle granular sobre o lançamento de funcionalidades.
Como uma Feature Flag afeta no desempenho do software?
Feature flags auxiliam no lançamento de novas funcionalidades de forma mais rápida, implantações contínuas, além de controle de ciclo de vida de recursos, como explicamos abaixo.
Desenvolvimento baseado em tronco
O desenvolvimento baseado em tronco permite que novas funcionalidades sejam lançadas sem a necessidade de branches (filiais, em português) longos ou complexos. Isso porque os branches de longa duração costumam causar conflitos de mesclagem complexos que levam a problemas difíceis de depurar.
O código de uma feature pode ser integrado ao branch principal (tronco) e/ou mesclam branches de curta duração. A complexidade dos merges (mesclas, em português) é eliminada, o que permite que as equipes se movam mais rapidamente e, assim, implantações de código podem ser implantadas continuamente.
Gerenciar o ciclo de vida dos recursos
Controlar quem tem acesso a um recurso permite que as equipes controlem todo o seu ciclo de vida. Um feature flag pode disponibilizar novos recursos apenas para um subconjunto de usuários para teste e feedback antes de lançamento público. Ou também um lançamento pode ser programado para coincidir com uma campanha de marketing sem ser necessária a exigência de uma implantação ou intervenção de engenheiros.
Remover o estresse e o risco das versões de software
Feature flags permitem uma resolução mais rápida de incidentes (tempo médio de correção, que é uma métrica fundamental do DORA - Deployment Frequency, Lead Time for Change, Mean Time to Recovery, Change Failure Rate - Frequência de implantação, tempo de espera para mudança, tempo médio de recuperação, taxa de falha de mudança, em português), o que reduz o estresse em torno dos lançamentos.
Caso um recurso cause problemas, desativar a flag correspondente desativa o recurso em questão, resolvendo o problema imediatamente, sem a necessidade de reverter uma versão complexa que pode conter vários recursos ou correções críticas.
Feature flags também permitem a entrega progressiva, na qual um recurso é lançado gradualmente para populações maiores de usuários para garantir que ele funcione conforme o esperado.
Como implementar uma Feature Flag?
Para implementar uma feature flag, é preciso envolver o código que implementa a funcionalidade em uma condição que verifica se a flag está ativada ou não.
Vamos aos passos a seguir:
- Identifique a funcionalidade que deseja controlar com a tag;
- Defina a tag com uma variável ou outro valor que represente seu estado (ativado ou desativado);
- Envolva o código que implementa a feature em uma condição que verifica o valor da flag;
- Decida onde a flag será gerenciada (aplicativo, servidor, banco de dados, etc.);
- Use a flag para controlar o acesso à funcionalidade, por exemplo, para diferentes grupos de usuários ou diferentes ambientes;
- Teste a funcionalidade em diferentes estados para garantir que a flag funciona corretamente.
Como ativar e desativar a funcionalidade sem impactar na experiência do usuário?
Algumas dicas para ativar e desativar funcionalidades sem afetar a experiência do usuário são remover feature flags, quando estas não estão mais em testes, aplicar processos de refatoração e redução gradual, como destacamos a seguir.
Remover feature flags
Uma das alternativas é retirar os controles de funcionalidades que não estão mais em testes pode ajudar a reduzir a complexidade do código e aprimorar a estabilidade do sistema. Porém, tal ação deve ser feita com parcimônia, a fim de não causar problemas, isto é, que todas as referências à flag sejam removidas e que a funcionalidade relacionada a essa mesma flag não cause problemas na aplicação.
Processos de refatoração
Se a funcionalidade relacionada às feature flags estiver entrelaçada em vários pontos do código, pode ser necessário refatorar o código para remover a flag de forma limpa, o que pode envolver a extração de código relacionado à funcionalidade em uma nova classe ou módulo e substituir as referências da flag por chamadas diretas à nova classe ou módulo.
Redução gradual
Como a redução de uma feature flag pode ser arriscada, principalmente se ela estiver sendo usada por inúmeros usuários, ou em um ambiente de produção, a redução pode ser uma alternativa viável. Isso pode ser feito com a redução do número de usuários que utilizam o feature flag até que ele seja totalmente removido.
5 boas práticas para implementar e gerenciar Feature flags
Algumas boas práticas para implementação e gerenciamento de feature flags são, por exemplo, minimização de riscos, validação da funcionalidade de recursos, e planejamento adequado, a fim de melhorar o controle de qualidade e evitar problemas, como explicamos a seguir:
Minimizar riscos
Equipes podem aproveitar feature flags e o monitoramento de métricas do sistema para responder a quaisquer problemas observáveis. Por exemplo, caso um aplicativo apresente picos de tráfego e os sistemas de monitoramento relatarem um aumento nos problemas, feature flags podem ser usados pelas equipes para desabilitar recursos com desempenho insatisfatório.
Validar a funcionalidade dos recursos
O feature flag pode ser definido como desativado, uma vez que o código é implementado, ele permanece inativo durante a produção e o novo recurso é desabilitado até que a alternância de features seja explicitamente ativada.
Consequentemente, as equipes decidem quando querem ativar as feature flags, bem como a hora de ativar o código e permitir que as equipes executem o controle de qualidade.
Planejamento adequado
É importante realizar um planejamento adequado antes de utilizar as feature flags. Defina os objetivos e funcionalidades que serão controladas pelas flags. Identifique também os grupos de usuários que serão afetados por cada flag e estabeleça critérios claros para habilitação e desabilitação, para evitar confusões e problemas futuros.
Mantenha um código organizado
É importante prezar por um código limpo e organizado quando se fala de feature flags. Evite criar flags desnecessárias ou duplicadas e mantenha uma estrutura de código clara e fácil de entender. A importância disso é a manutenção e a evolução do código no futuro.
Utilize testes automatizados
Os testes automatizados garantem o bom desempenho das funcionalidades controladas pelas flags. Crie testes unitários e testes de integração que cubram todas as possíveis combinações de habilitação e desabilitação das flags. A medida é importante para evitar regressões e problemas de compatibilidade.
Simplifique sua gestão de documentos fiscais com a Focus NFe
Somos um ecossistema de soluções para a emissão e gestão de documentos fiscais. Nossas APIs utilizam o formato JSON, o que facilita a integração e a gestão fiscal, permitindo que empresas de todos os tamanhos e setores economizem tempo e orientem seus esforços no que realmente importa.
Sua empresa tem desenvolvedores e um sistema interno, e deseja otimizar a emissão de notas fiscais? Conheça nosso conjunto de APIs e tenha acesso a uma solução ágil e eficiente!