Feature Toggle e seus poderes

0

Thayná | Maio 08, 2019

Por João Sávio Ceregatti Longo

Neste artigo discutiremos uma técnica que pode ser bastante útil em determinadas situações e que é bastante usada, entre outros objetivos, para levar novas funcionalidades para o ambiente de produção de forma controlada: feature toggle. Ela funciona como a maioria das técnicas em engenharia de software, porém a feature toggle precisa ser usada com cautela e nos cenários corretos, caso contrário pode trazer mais problemas do que soluções.

Além da definição da técnica, cobrimos exemplos de aplicações, vantagens e desvantagens e cuidados na sua implementação. Boa leitura!

O que é Feature Toggle?

Feature toggle é uma técnica usada para permitir mudanças de comportamento de um sistema sem necessidade de um novo deployment. Neste contexto, podemos entender por mudança de comportamento uma adição/alteração/remoção de uma funcionalidade, que pode ser aplicada desde uma UI até um serviço backend (API, banco de dados, etc).

Esta mudança de comportamento pode ser feita via URL, arquivos de configuração, banco de dados, ou mesmo via uma API de gerenciamento de feature togglesVamos analisar um exemplo. Suponha que gostaríamos de habilitar um novo menu apenas para alguns usuários de um dado site (https://example.com), e que depois de validado, vamos torná-lo o menu padrão do site.

Como uma primeira ideia de implementação, poderíamos configurar o sistema de tal forma que se ele for acessado com um novo parâmetro de URL, chamado newMenu (https://example.com?newMenu=true), o site vai mostrar este novo menu. No entanto, por padrão, o antigo menu é mostrado se não alterarmos a URL. Agora já é possível uma mudança de comportamento em tempo real. No entanto, ainda teríamos que fazer um novo deployment depois da validação do novo menu, para habilitá-lo por padrão.

Se quisermos evitar este deployment adicional, poderíamos associar cada usuário no banco de dados com um conjunto de features. Entre estas features estaria o novo menu, marcado por padrão como desabilitado, e habilitado para somente alguns usuários. Assim, quando um usuário logar, o site saberá se deve ou não mostrar o novo menu. E quando o novo menu estiver pronto, bastaria habilitá-lo no banco de dados para todos os usuários.

Em ambas implementações usamos a técnica de feature toggle, embora a segunda implementação seja mais poderosa que a primeira, pois evitaria um deployment adicional e permitiria habilitar e desabilitar o novo menu a qualquer momento, e para qualquer número de usuários.

Em quais casos aplicamos essa técnica?

Podemos usar esta técnica para os seguintes casos:

1. Liberar uma mudança para usuários determinados.

É útil quando queremos que somente alguns usuários vejam uma mudança e forneçam feedback antes de liberar para todos. Em uma outra perspectiva, também pode ser utilizado para permitir features “premium” de um produto.

2. Permitir que mudanças sejam desabilitadas rapidamente.

Podemos utilizar quando trabalhamos com continuous deployment. Nesta situação, o feedback dos usuários é rápido e, por esse motivo, é importante ter uma forma rápida de desabilitar uma mudança caso ela não agrade ou seja problemática de alguma forma.

Também pode ser usado quando, em situações não ideais, o ambiente de produção tenha (ou possa ter) variações de configuração, rede, contas específicas (entre outros) que possam fazer com que uma mudança cause problemas somente naquele ambiente. Nestes casos, é prudente permitir voltar ao antigo comportamento rapidamente.

3. Permitir liberar uma mudança não completa (mas desabilitada) para produção.

Muito útil quando existe uma nova feature que vai demorar muito tempo até ficar pronta. Neste caso, os desenvolvedores não precisam manter esta mudança em uma branch separada até ficar pronta, e posteriormente ter muitos problemas com merges e conflitos. Ao invés disso, eles podem continuar integrando pedaços da nova feature no branch principal sem problemas, visto que para o usuário final a feature vai estar desabilitada por padrão.

4. Ajudar com investigação de problemas e desenvolvimento.

Alguns bugs só acontecem em produção e é necessário aumentar o nível de log para uma melhor compreensão do problema. Muitas vezes é perigoso aumentar o nível de log em ambiente de produção, devido a possíveis problemas de performance. Assim, é possível utilizar a técnica de feature toggle, configurando um modo debug, desabilitado por padrão. Ao habilitá-lo somente para um usuário, será possível visualizar mais logs, e ao mesmo tempo não comprometer a performance do sistema.

Além disso, aqui cabe um exemplo de utilização em sistemas legados. Muitos destes sistemas foram desenvolvidos sem feature toggles. Alguns deles possuem muitas opções de se configurar uma conta de usuário, por exemplo. Acabam aparecendo bugs de UI somente em produção, com determinadas configurações custosas de se replicar em ambiente de desenvolvimento. Neste contexto, é útil para os desenvolvedores criarem um mecanismo de sobreposição de configurações de conta (por exemplo, via URL). É importante que isto funcione somente em ambiente de desenvolvimento, pois não queremos expor uma possível configuração perigosa em produção (por exemplo: “?premiumAccount=true”). Assim, será muito mais fácil reproduzir o bug e resolvê-lo com mais rapidez.

Quais as desvantagens de utilizá-la?

A principal desvantagem é o aumento da complexidade no desenvolvimento, o que eleva o risco de bugs. No entanto, algumas medidas podem ser tomadas para se reduzir o risco de bugs decorrente da utilização de feature toggles:

1. Sempre criar testes para as duas situações: mudança habilitada e desabilitada.
A ideia é garantir que poderemos habilitar e desabilitar uma mudança a qualquer momento.

2. Garantir alta porcentagem de cobertura em testes de regressão.
Com isto, garantimos que a introdução de features incompletas (mas desabilitadas) não altere as funcionalidades disponíveis aos usuários.

Em ambas as medidas mencionadas ocorrerá um aumento de complexidade no desenvolvimento de testes automatizados, principalmente nos de integração e end-to-end. Isto se deve ao fato de que será necessário habilitar/desabilitar as mudanças antes de cada teste, através de uma API externa, alterando configurações, etc. Uma desvantagem secundária, dependendo do uso da técnica, seria a necessidade de  criação de uma API de gerenciamento e uma UI para administração

Para aplicar a técnica de feature toggle é sempre importante entender o contexto de cada cliente/projeto. Nem todas as formas funcionarão bem. Como vimos, ao introduzir essa técnica aumentamos a complexidade do código e necessitamos de uma atenção maior nos testes.


João Sávio Ceregatti Longo

Atua como arquiteto de sistemas e líder técnico na Daitan. Mestre em Ciência da Computação pela Unicamp e bacharel pela Unesp.