IFMAN: Seu super-herói para Features e Testes A/B!

Gabriel Queiroz
Wirecard Brasil

--

Um dos super-heróis do Moip, o IFMAN, pode te ajudar quando o assunto é feature flag e testes A/B!

É um projeto OpenSource que foi desenvolvido durante o HackDay, um dia dedicado para projetos e desafios que fogem da rotina de trabalho. Procurava solucionar uma necessidade interna para um problema muito comum: Controlar o lançamento de novas features de maneira prática, rápida e segura.

O IFMAN é uma interface gráfica simples para gerenciar suas features e trabalha em conjunto com o JCurtain e RCurtain, bibliotecas para Java e Ruby respectivamente.

Como funciona?

O IFMAN funciona junto com o Redis, um armazenamento de estrutura de dados de chave-valor na memória, que também é OpenSource. Tudo começou com a ideia do Curtain. A ideia era “Abra a cortina e veja se a sua feature está habilitada”.

Com o curtain, temos duas possíveis estruturas de dados que podem ser criados no Redis:

Estrutura de dados usada pelo Curtain no Redis

Com base nessas estruturas, as bibliotecas possuem um método chamado isOpen, literalmente “está aberta?”. O método isOpen recebe dois parâmetros, a feature e o usuário. A partir dai com base na estrutura de dados toda vez que o parâmetro feature for consultada é verificado se o parâmetro usuário está habilitado para aquela chave (users) ou ela vai ter X% de chance de retornar habilitada (percentage).

Por exemplo, a feature login terá as duas estruturas de dados no Redis: “feature:login:percentage” e “feature:login:users”. Vamos dizer que a chave percentage tem o valor de 10%. Já a users tem o valor de “Maria, Joao”. Ao buscar a feature login, primeiro será verificado se o parâmetro passado esta dentro do users, caso esteja ele retornará true de imediato. Já caso não esteja, ele então terá 10% de chande de retornar true (Ou 90% de retornar false).

Exemplo de possíveis cenários no IFMAN

Como usar?

Como citado anteriormente o IFMAN trabalha em conjunto com o JCurtain e RCurtain. Para utilizar, basta incluir uma pequena configuração informando a URI e senha do Redis. Pronto, feito isso basta utiliza-lo livremente no projeto.

Java

Adicionar ao pom.xml:

<dependency>
<groupId>br.com.moip</groupId>
<artifactId>jcurtain</artifactId>
<version>0.1.0</version>
</dependency>

Em seguida, voce pode criar uma classe de configuração informando a URI do Redis. Caso esteja familiarizado com Spring Annotation, recomendo utilizar esta classe como Configuration e o seu método como Bean, assim o Spring irá coordenar essa classe facilitando o uso do JCurtain no projeto.

Após configurado basta utilizar o método isOpen informando a feature e opcionalmente um parâmetro extra para validação da feature.

Ruby

Adicionar ao seu Gemfile:

gem 'rcurtain'

Em seguida, voce pode incluir a configuração do RCurtain informando a URI do Redis em “config/initializers/rcurtain.rb”.

Assim como no Java, após configurado basta utilizar o método opened informando a feature e opcionalmente um parâmetro extra para validação da feature.

IFMAN

Acesse http://ifman.herokuapp.com/ para criar, excluir e editar as configurações das suas features. O user é a URI do seu Redis (incluindo a porta) e o password é a senha do seu Redis.

Casos de uso

IFMAN: Login e Dashboard.

Feature Flag

No Moip utilizamos o IFMAN com features flags, para auxiliar o lançamento de novas features provendo segurança e agilidade. Com ele podemos incluir features específicas e ir liberando aos poucos para um grupo de usuários, sendo possível colher feedbacks antes do lançamento oficial do produto.

Um exemplo foi o novo extrato financeiro do Moip. Durante o desenvolvimento foi utilizado o IFMAN para liberar um novo layout de extrato para um grupo específico de usuários, onde foi possível colher estatísticas e feedbacks de como o novo extrato se comportava. Tudo isso foi possível adicionando apenas uma linha de código junto com a implementação do novo extrato.

Testes A/B

Com a flexibilidade de controlar features por porcentagem, é possível atingir toda a sua base de usuários permitindo testes A/B de maneira prática e rápida.

Por exemplo, ao testar um novo fluxo de notificações de saldo foi utilizado o percentage para coordenar as mudanças de maneira segura e rápida. Começamos com a feature habilitada em 10%, e a cada dia era possível aumentar a feature minimizando os impactos e colhendo feedback dos usuários. Também tínhamos a flexibilidade de ao perceber qualquer comportamento anormal rapidamente desabilitar a feature alterando o valor percentage para 0%.

Conclusão

Atualmente temos mais de 15 features sendo controladas com o IFMAN em produção entre diversos projetos do Moip, além de features já removidas por terem sido liberadas para toda a base. O IFMAN se mostrou uma ferramenta versátil entre todos os times de engenharia e acreditamos que podemos ajudar a comunidade compartilhando e melhorando essa ferramenta.

Gostou do IFMAN e do Curtain e quer ajudar? Estamos abertos para sugestões, críticas, issues e forks! Fork us on Github e deixe uma star no projeto caso o IFMAN também tenha te ajudado!

Referências

--

--