IFMAN: Seu super-herói para Features e Testes A/B!
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:
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).
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
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
- IFMAN Site - http://ifman.herokuapp.com/
- IFMAN Github - https://github.com/moip/ifman
- RCurtain - https://github.com/moip/rcurtain
- JCurtain - https://github.com/moip/jcurtain
- Redis - https://redis.io/
- What is Redis? - https://aws.amazon.com/pt/elasticache/what-is-redis/