< Insights

O que é Feature Flags e como pode impactar na sua empresa?

  • DevOps
  • Artigo

A técnica de Feature Flag, também conhecida como Feature Toggle, possibilita que ocorram 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. Viabilizando então uma maneira diferente de controlar integrações de novas funcionalidades, permitir a realização de testes com um grupo de usuários isolados e coletar métricas para análise de resultados de como uma funcionalidade afeta o produto.

Manipular as funcionalidades (chamadas nesse contexto de features) de sua aplicação sem precisar realizar novas implantações, possibilita aos times de desenvolvimento realizar mudanças sem a chance algum tipo de indisponibilidade que possa ocorrer com uma nova implantação. Assim, as mudanças ocorrem sem que o usuário final perceba quaisquer alterações na experiência de uso (a não ser que a nova Feature tenha sido ativada para ele). As mudanças na aplicação acontecem quando existe alguma condição que permita “ligar” ou “desligar” a nova feature, nesse caso, é como se tivéssemos uma “bandeira” que nos ajude a indicar, daí o nome flag.

Ao longo desta matéria, veremos quais são as categorias de Feature Flags que podemos utilizar, quais são os benefícios e seus desafios, como utilizar esta técnica dentro de suas aplicações e quais são as diferenças entre Feature Flags e Feature Branches. Boa leitura!

Categorizando Feature Flags

Uma Feature Flag pode se encaixar em uma categoria de acordo com os seguintes critérios:

  • Tempo de vida;
  • Dinâmico ou estático;
  • Modo de gerenciamento.

Dado estes critérios, podemos definir algumas Feature Flags:

Release Flags

Este tipo permite realizar a inclusão de funcionalidades desenvolvidas ou que ainda estão em fase de desenvolvimento e testes, permitindo que códigos e fluxos da aplicação não testados sejam enviados para um ambiente produtivo. Este método permite que tais funcionalidades sejam testadas por um grupo exclusivo de usuários, para impedir que sejam expostas a menos que estejam totalmente validadas e testadas por eles.

Utilizando o Feature Flag de Release é a maneira mais simples de realizar implementações de uma aplicação, separando a funcionalidade do código produtivo. Vale ressaltar que esse tipo deve ser utilizado de forma transitória dentro da aplicação pois não lida de forma dinâmica como a funcionalidade será aplicada ou não.

Experiment Flags

Este pode ser utilizado para realizar testes A/B ou qualquer outro modelo de testes em que possa criar grupos de experimentação durante os acessos na aplicação. Neste tipo, um usuário é colocado em um “grupo de acesso” ao acessar a aplicação e um “roteador” irá encaminhá-lo para uma funcionalidade dependendo do grupo no qual está presente. Isso permite acompanhar o comportamento dos diferentes grupos e comparar as suas características.

A necessidade de um Feature Flag de Experimentação pode durar até que os testes que estejam sendo realizados atinjam níveis satisfatórios para incluir a nova funcionalidade para todos os usuários. Como este tipo de Feature Flag é dinâmica, mantê-la por grandes períodos pode ser um risco devido às mudanças que podem ocorrer na aplicação, invalidando os resultados dos testes.

Além disso, ao implementá-la deve considerar que um usuário deverá se manter no mesmo grupo por um período de tempo que estiver utilizando a aplicação, para que não caia em cenários inválidos ou que causem erros não previsíveis causados pela troca de “grupos de acesso”.

Operation Flags (Ops Flag)

Caso precise controlar características operacionais da aplicação, utilizar este tipo de Feature Flag pode ser o melhor caminho. Quando introduzidas, podemos fazer com que a aplicação retorne para uma versão anterior, sem alguma funcionalidade aplicada, por exemplo. Isso pode ser necessário pois a nova funcionalidade pode ter causado uma degradação na performance e a equipe de operação necessita de uma forma para desabilitar a funcionalidade rapidamente em produção. Ele é usado de maneira que permita a equipe de operação desabilitar funcionalidades que não são essenciais (ou aquelas que foram recentemente introduzidas) quando a aplicação passa por algum período de instabilidade ou carga excessiva (ou inesperada) de acessos. Uma Ops Flag também pode ser colocada dentro de uma aplicação de modo que possa responder automaticamente, ou através de uma intervenção manual, quando algum tipo evento de degradação é disparado por alguma ferramenta de monitoramento. Manter este tipo de Feature Flag dentro da aplicação indefinitivamente permite o controle por parte da equipe de operações, para que possam responder rapidamente a problemas ocorridos em ambientes produtivos para mitigar efeitos catastróficos maiores.

Permission Flags

Nesse tipo, as features flags são utilizadas para permitir a mudanças na experiência de uso da aplicação como, por exemplo, fazer com que um conjunto de funcionalidades fiquem disponíveis apenas se o usuário pagar por elas. Ou fazer com que certas funcionalidades sejam utilizadas por usuários selecionados para participar de funcionalidades em estágio “alpha” ou “beta”. Esta técnica permite que usuários reais testem funcionalidades em estágios específicos do desenvolvimento para suprir dados para análises, ou ainda, fazer com que apenas um conjunto de usuários que contribuam com a aplicação (através de um pagamento por um conjunto de funcionalidades) possam ter acesso a estas.

Gerenciando o tempo de vida de uma Feature Flag

Uma Feature Flag pode estar pode estar definida em grupos que possuem um tempo de vida curto versus aquelas que possuem um tempo de vida longo. A imagem abaixo representa essa divisão colocando Features Flags que possuem tendências a uma vida curta (região cinza) e/ou uma vida longa (região verde). Essa divisão pode ser observada na imagem abaixo:

Features Flags que possuem tendências a uma vida curta e/ou uma vida longa | Fonte: Long-lived toggles vs transient toggles

Essa divisão auxilia na escolha de como abordar o uso de uma Feature Flag dentro da aplicação. Caso uma Release Flag seja incluída para e seja definido que terá um tempo de vida curto, apenas para testes de pouca duração, por exemplo, será mais rápido que essa inclusão seja realizada com uma simples condicional que verifica se a Flag está ativa ou não. 

Porém, caso uma Feature Flag seja incluída para que tenha um tempo de vida longo, uma implementação com condicional simples não será a melhor abordagem para realizar manutenções e verificações, portanto é necessário utilizar técnicas específicas de implementação para suportar este cenário.

Gerenciando Feature Flags dinâmicas ou estáticas

Feature flags que são utilizadas durante a experiência de uso na aplicação e que são inseridas e/ou modificadas dinamicamente, necessitam de um gerenciador que contenha opções de configuração complexas. Enquanto aquelas que são definidas de modo que operam isoladamente, com curta duração ou que trabalham de forma estática, podem utilizar de configurações mais simples precisando, ou não, de um gerenciador. 

Digamos que iremos inserir um Experiment Flag na aplicação que irá realizar a inserção de alguma funcionalidade dependendo da hora de acesso do usuário. Neste caso, um gerenciador de Feature Flags precisará realizar alguma operação para inserir a funcionalidade dependendo da leitura do horário de entrada do usuário e alguma informação que o identifique, como o uso de seu ID.

A imagem abaixo representa essa divisão colocando Features Flags que possuem um comportamento estático (região cinza) e aqueles com comportamento dinâmico (região verde). Essa divisão pode ser observada na imagem abaixo:

Features Flags que possuem um comportamento estático e com comportamento dinâmico | Fonte: Long-lived toggles vs transient toggles

Saiba a diferença entre Feature Flags e Feature Branches 

Feature Branches é considerada uma método de desenvolvimento de software em que cada novo recurso é produzido em sua própria ramificação da linha de código principal atual. Depois que o feature for concluído, testado e aprovado, ele poderá ser mesclado na ramificação principal e implementado para os usuários finais. 

Já os Features Flags é um recurso de alternância utilizado em ambientes de integração e entrega contínua que permite que novos recursos sejam implantados diretamente na linha de código principal, em um estado desabilitado. Após a implantação do código, cada recurso pode ser habilitado individualmente para um usuário ou um grupo destes.

Quais os benefícios do Feature Flags?

Como explicado anteriormente, Feature Flags podem ter diversos usos e, consequentemente, diferentes benefícios. Apresentaremos abaixo alguns benefícios do uso dessa técnica:

Minimizar os riscos

Com base na ideia de soft releases, discutida acima, as equipes líderes podem aproveitar os Features Flags, bem como o monitoramento e as métricas do sistema para responder a quaisquer problemas intermitentes observáveis.

Por exemplo, se um aplicativo apresentar picos de tráfego e os sistemas de monitoramento relatarem um aumento nos problemas, as equipes poderão usar Features Flags para desabilitar recursos com desempenho insatisfatório.

Modificação no comportamento do sistema sem alterações disruptivas

Novos recursos complexos ou trabalho de refatoração sensível podem ser um desafio para integrar na ramificação de produção principal do repositório. Isso é ainda mais complicado se vários desenvolvedores estiverem trabalhando em partes sobrepostas da base de código.

Validar a funcionalidade dos recursos

O Feature Flags 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. 

Sendo assim, as equipes decidem quando ativar o Feature Flags, consequentemente, ativando o código e permitindo que as equipes executem o controle de qualidade.

Quais os desafios de usar o Feature Flags?

Aparentemente, não há nenhum problema em utilizar as Features Flags como uma estratégia de entrega de software. No entanto, pode haver algumas desavenças, caso as novas funcionalidades não funcionem corretamente ou estejam impactando de forma negativa e causando lentidão. 

Em situações como essas, temos que tirar de produção a versão mais recente implementada e voltar à anterior, fazendo com que todas as features antigas voltem para o estágio de planejamento e correção, resultando em um atraso de todas as novas funcionalidades.

Em situações que certas funcionalidades não funcionem ou causem impacto de forma negativa, a utilização de Feature Flags podem ajudar a mitigar tais eventos permitindo que a aplicação deixe de disponibilizá-las, dando ao time de desenvolvimento e de operações, liberdade para investigar as causas. Porém, a implementação de Feature Flags deve ser feita de maneira que permita separar elementos chave de uma aplicação (funcionalidades, fluxos, etc) e não fazendo a inserção em quaisquer partes dela. A implementação de Feature Flags é uma técnica que possui seus benefícios, mas também adiciona complexidade no desenvolvimento e no gerenciamento de uma aplicação. Ao manter uma aplicação que utiliza de Feature Flags, sempre exponha quais são as partes da aplicação que utilizam desse mecanismo para os times tenham conhecimento de como operar com as Flags e como utilizar o sistema (em testes, degradações, etc). Além disso, o modo de gerenciamento de Feature Flags e a escolha de quais e como utilizá-las podem afetar as manutenções. Por isso, analise como uma Feature Flag será tratada dentro da aplicação fazendo algumas perguntas, por exemplo: 

  • Onde ficarão armazenadas as configurações das Feature Flags?
  • Como elas serão inseridas dentro do sistema e porque?
  • Como serão gerenciadas?
  • Como o processo de validação de uma funcionalidade funcionará?
  • O custo de manutenção de aplicações com uma Feature Flag irá aumentar?

Essas são algumas das perguntas que podem ser feitas antes de sair introduzindo Feature Flags dentro de uma aplicação e avaliar se são necessárias em todo o sistema ou não.

 No geral, as empresas precisam fornecer recursos com mais rapidez e minimizar os riscos, porém, muitos processos atuais e ferramentas ainda não são tão rápidos o suficiente e exigem grande investimento. Portanto, deve ser feita uma avaliação se o uso de Feature Flags, comparado com outros meios, é o melhor caminho.

Quando utilizar o Feature Flags?

A técnica de Feature Flags pode ser utilizada em vários contextos diferentes, como já mencionados. Veja aqui alguns exemplos de quando utilizar o Feature Flag:

Em testes de produtos

O Feature Flags pode ser usado ​​para liberar de forma incremental novos recursos do produto. Se os usuários adotarem os novos recursos propostos e se valerá a pena o retorno do investimento pode não estar claro. 

As equipes podem publicar novos recursos do produto ou ideias parciais de recursos em Feature Flags e implantá-los em subconjuntos de usuários para feedback.

Em migrações

Um aplicativo requer migração de dados, o que requer alterações no código do aplicativo relevante. Esses cenários são tarefas de implantação de vários estágios confidenciais. Os campos do banco de dados podem ser modificados, excluídos ou adicionados ao banco de dados do aplicativo.

Em casos de interrupções do sistema

O Feature Flags também pode ser usado ​​como ferramenta de desligamento do sistema. Os aplicativos da Web podem usar essas features para “encerrar” todo o site para manutenção ou tempo de inatividade. O Feature Flags pode ser detectado em toda a base de código para serem enviados aos usuários.

Como implementar o Feature Flags?

Há muitas maneiras de implementar Features Flags com várias considerações logísticas e ROI. O caminho a seguir depende das necessidades da sua equipe e dos objetivos organizacionais. As tags de recursos têm algumas dependências de infraestrutura que precisam ser resolvidas para funcionar corretamente. 

De modo geral, a implementação de uma Feature Flags pode se tornar cada vez mais complexa à medida que uma certa quantidade delas estão dentro do código da aplicação. É de extrema importância que sejam estudados e adotados padrões de implementação e práticas que possam ajudar a reduzir tais complexidades. Tais padrões e técnicas se assemelham aqueles que são utilizados no desenvolvimento de software como o SOLID, padrões comportamentais (Strategy Pattern, por exemplo), entre outros.  Desacoplar pontos de decisão de uma Feature Flag do corpo da lógica da funcionalidade, inverter o controle de quem detém a responsabilidade de saber sobre aplicar ou não uma funcionalidade, etc.

À medida que as equipes expandem o uso de  Features Flags e os habilita/desabilita, ter mecanismos que facilitem a manutenção e o gerenciamento destes recursos faz com que as decisões de desenvolvimento e de negócios possam ser tomadas com maior tranquilidade. 

Escolher um framework de desenvolvimento que possua um mecanismo integrado de Feature Flags sem precisar implementá-los diretamente pode dar uma vantagem no tempo de desenvolvimento, pois isentam o desenvolvimento e validação de como tais mecanismos funcionarão. No desenvolvimento Java, o framework Spring Boot possui um mecanismo de Feature Flags com a utilização de anotações “ConditionalOnProperty”. Para desenvolvimento em C# (via .NET Core), a injeção do FeatureManager permite a utilização de Feature Flags dentro do código.

Muitos serviços de Feature Flags de terceiros fornecem essa dependência de armazenamento de dados. Por fim, Features Flags hospedado por terceiros geralmente é a melhor solução. Eles lidam com o trabalho pesado e fornecem bibliotecas fáceis de integrar para simplificar o processo de instalação. 

Gostou do conteúdo? Se você ficou interessado em desenvolver o Feature Flags e DevOps na sua empresa, não deixe de verificar os serviços de consultoria da Objective. Leve agilidade e bons resultados ao seu negócio!

Insights do nosso time

Obtenha insights do nosso time de especialistas sobre metodologias de desenvolvimento de software, linguagens, tecnologia e muito mais para apoiar o seu time na operação e estratégia de negócio.