Marcação de recurso

Como expor progressivamente seus recursos com marcações de recursos.

Ian Buchanan Ian Buchanan

Resumo: Marcação de recursos (também conhecida como alternação de recursos) é uma técnica de engenharia de software que ativa e desativa a funcionalidade de seleção durante o tempo de execução, sem implantar um novo código. Ela permite que as equipes façam alterações sem enviar código adicional e permite uma experimentação mais controlada ao longo do ciclo de vida dos recursos.

Se você planeja integrar continuamente recursos ao seu aplicativo durante o desenvolvimento, considere marcações de recursos. Afinal, você pode querer alternar, ocultar, desativar ou ativar os recursos. Você também pode querer revelar diferentes variações de recursos para os usuários, a fim de descobrir qual deles é melhor. As marcações de recursos, também conhecidas como “alternâncias”, “bits”, “flippers” ou “switches” oferecem essas possibilidades e muito mais.

O que são marcações de recursos?

Marcações de recursos (também bastante conhecidos como alternâncias de recursos) é uma técnica de engenharia de software que ativa e desativa a funcionalidade de seleção durante o tempo de execução, sem implementar novo código. Ela permite que as equipes façam alterações sem enviar código adicional e permite uma experimentação mais controlada ao longo do ciclo de vida dos recursos. Por esse motivo, marcações de recursos permitem muitos novos fluxos de trabalho que são incrivelmente úteis para um estilo de gerenciamento ágil e ambientes de CI/CD.

Durante o desenvolvimento, os engenheiros de software envolvem os caminhos de código desejados em uma marcação de recurso. Veja a seguir um exemplo de uma marcação de recurso básico escrito em JavaScript:

  if(featureFlags[‘new-cool-feature’] == true){
renderNewCoolFeature();
}

Este código demonstra uma instrução simples que verifica se um “new-cool-feature” está habilitado. Mesmo com estruturas e ferramentas avançadas que ajudam a gerenciar dados de marcação ou injeção e remoção do novo caminho lógico, as marcações de recursos são, na essência, apenas instruções "se". Portanto, este interruptor binário é o que todos os sinônimos têm em comum.

Quando este código estiver pronto para ser lançado para a produção, ele vai ser implementado como de costume. No entanto, ele vai estar inativo na produção até que a marcação de recurso seja explicitamente ativada. As marcações podem ser atribuídas a um grupo de usuários de subconjunto, permitindo um comportamento altamente direcionado.

Vantagens da marcação de recursos

Destaque de diagrama de Recurso Desenvolvimento orientado por marcações

Em um nível fundamental, as marcações de recursos permitem que o código passe por commit e seja implementado na produção em um estado inativo e ativado mais tarde. Assim as equipes têm mais controle sobre a experiência do usuário do produto final. As equipes de desenvolvimento podem escolher quando e para quais usuários novos códigos são entregues.

Validar a funcionalidade do recurso
Os desenvolvedores podem aproveitar marcações de recursos para executar “soft rollouts” de novos recursos do produto. Novos recursos podem ser criados com integração imediata de alternâncias de recursos como parte da versão esperada. A marcação de recurso pode ser definida como "desativada" por padrão para que, uma vez que o código é implantado, ele permaneça inativo durante a produção e o novo recurso vai ser desativado até que a alternância do recurso seja explicitamente ativada. As equipes escolhem quando ativar a marcação de recurso, que ativa o código, permitindo que as equipes executem o controle de qualidade e verifiquem se ele se comporta conforme esperado. Se a equipe descobrir um problema durante esse processo, ela pode desativar na hora a marcação de recurso para desativar o novo código e minimizar a exposição do usuário ao problema.

Minimizar riscos
Com base na ideia de soft rollouts discutidos acima, as equipes podem aproveitar marcações de recursos em conjunto com o monitoramento do sistema e as métricas como resposta a quaisquer problemas intermitentes observáveis. Por exemplo, se um aplicativo tiver um pico no tráfego e o sistema de monitoramento relatar um aumento nos problemas, a equipe vai poder usar marcações de recursos para desativar recursos com desempenho ruim.

Modificar o comportamento do sistema sem alterações disruptivas
As marcações de recursos podem ser usadas para ajudar a minimizar cenários complicados de integração e implementação de código. Novos recursos complicados ou trabalho de refatoração sensível podem ser desafiadores para se integrar na ramificação de produção principal de um repositório. Fica ainda mais complicado se vários desenvolvedores trabalharem em partes sobrepostas da base de código.

As marcações de recurso podem ser usadas para isolar novas alterações enquanto o código estável e conhecido continua funcionando. Elas ajudam os desenvolvedores a evitar ramificações de recurso de longa duração, ao fazer commits frequentes à ramificação principal de um repositório por trás da alternância de recursos. Quando o novo código estiver pronto, um cenário de merge e implementação colaborativa disruptiva é desnecessário; a equipe pode alternar a marcação de recurso para ativar o novo sistema.

Casos de uso da marcação de recurso

A nova utilidade das marcações de recursos permite uma variedade de casos de usos criativos para equipes trabalhadoras. Os exemplos a seguir destacam alguns aplicativos populares de marcações de recursos em um ambiente ágil.

Teste do produto
As marcações de recursos podem ser usadas para lançamentos graduais de novos recursos do produto. Pode ser pouco claro no início se um novo recurso proposto vai ser adotado pelos usuários e vale o retorno sobre o investimento. As equipes podem lançar um novo recurso de produto ou uma ideia parcial do recurso em uma marcação de recurso e implementar em um subconjunto de usuários para coletar feedback. O subconjunto de usuários pode ser usuários vocais experientes que ficam contentes em revisar e testar uma versão beta. Se a ideia do novo produto se comprovar um sucesso, a equipe de desenvolvimento pode então implementar a marcação de recurso para uma base de usuários maior. Se, em vez disso, a ideia do novo produto for um fiasco, é fácil para a equipe de desenvolvimento desativar e remover a marcação de recurso da base de código.

Realização de experimentos
Experimentos ou testes A/B são um exemplo de marcação de recurso primário. Na sua forma mais simples, as marcações de recursos atuam como uma alternância do estado “on” e “off” para um recurso. Marcações de recursos avançadas utilizam várias marcações de uma só vez para ativar experiências diferentes para subconjuntos de usuários. Por exemplo, imagine que você divida sua base de usuários em terços. Cada terço recebe sua marcação e experiência do usuário únicas. Você pode então medir o desempenho dessas três marcações uns contra os outros para determinar a versão final com commit.

Migrações
Há momentos em que um aplicativo precisa de uma migração de dados que exige alterações de código de aplicativo dependentes. Esses cenários são tarefas de implementação multifásicas sensíveis. Um campo de banco de dados pode ser modificado, removido ou adicionado em um banco de dados de aplicativo. Se o código do aplicativo não estiver preparado para essa alteração de banco de dados, ele vai causar falhas e erros. Se esse for o caso, é necessária uma implementação coordenada entre as alterações do banco de dados e o código do aplicativo.

As marcações de recursos ajudam a aliviar a complexidade desse cenário, permitindo que as equipes preparem com antecedência alterações de aplicativos em uma marcação de recurso. Assim que a equipe fizer as alterações no banco de dados, ela pode alternar na hora a marcação de recurso para corresponder ao código do aplicativo. Assim são removidos o risco e o atraso de esperar para implementar o novo código do aplicativo e possivelmente ver a implementação falhar e dessincronizar o aplicativo do banco de dados.

Lançamentos canários
Um canário neste contexto é uma prática antiga e mórbida onde os mineiros de carvão traziam canários para a mina de carvão para detectar monóxido de carbono. As aves têm taxas de metabolismo mais elevadas e frequências de respiração mais rápidas, o que as fazia sucumbir ao monóxido de carbono antes dos mineiros.

Lançamentos canários no desenvolvimento de software ocorrem quando um novo recurso ou alteração de código é implementado em um pequeno subconjunto de usuários para monitorar seu comportamento antes da liberação para o conjunto completo de usuários. Se o novo recurso mostrar qualquer indicação de erros ou falha, ele vai ser automaticamente revertido. As marcações de recursos são essenciais para esse processo, pois restringem o pool de público e podem alternar recursos com facilidade.

Interrupção do sistema
Uma marcação de recurso também pode ser usada como uma ferramenta de interrupção do sistema. Um aplicativo web pode utilizar uma marcação de recurso para “desligar” todo o site para manutenção ou tempo de inatividade. A marcação de recurso pode ser instrumentada em toda a base de código para enviar transações sensíveis e exibir conteúdo de interrupção para os usuários finais. Esse recurso pode ser muito útil ao fazer implementações confidenciais ou se um problema inesperado for encontrado e precisar ser resolvido com urgência. Ele dá às equipes a confiança e a capacidade de fazer uma interrupção controlada, se for necessário.

Implementação contínua
As marcações de recursos podem ser usadas como um componente integral para criar um sistema de implementação contínua de fato. A implementação contínua é um pipeline automatizado que leva novos códigos dos desenvolvedores e o implementa automaticamente para usuários finais de produção. A implementação contínua depende de camadas de testes automatizados que verificam o novo código se comporta conforme esperado em relação a uma especificação correspondente à medida que ele se move pelo pipeline.

As marcações de recursos tornam mais segura a implementação contínua, separando as alterações de código de recursos reveladores para os usuários. O novo código pode passar por merge e implementação automáticos na produção e, em seguida, esperar atrás de uma marcação de recurso. O sistema de implementação contínua pode monitorar o comportamento e o tráfego de usuários e ativar automaticamente a marcação de recurso. Inversamente, o sistema de implementação contínua pode monitorar o novo código de marcação de recurso para ver se ele se comporta como esperado e, se não for assim, fazer a reversão.

Ramificações de recursos vs. marcações de recursos

Como implementar marcações de recursos

Há muitos caminhos para implementar marcações de recursos com considerações logísticas variadas e retorno sobre o investimento. O caminho a seguir depende das necessidades e objetivos organizacionais da sua equipe.

A marcação de recursos tem algumas dependências de infraestrutura que precisam ser endereçadas para funcionar corretamente. À medida que as equipes escalam seu uso de marcações de recursos e o ligar/desligar das marcações se torna uma decisão comercial, passa a ser fundamental ter um armazenamento de dados autoritário e um mecanismo de gerenciamento para as marcações. Muitos serviços de marcação de recursos de terceiros têm essa dependência de armazenamento de dados.

Os serviços de marcação de recursos hospedados por terceiros em geral são a melhor solução. Eles lidam com a logística pesada e oferecem bibliotecas fáceis de integrar que agilizam o processo de instalação. Assim as equipes podem manter o foco nos principais deveres de negócios em vez de gerenciamento de infraestrutura. No entanto, se sua equipe tiver problemas de segurança de terceiros, pode ser do seu interesse implementar seu back-end de marcação de segurança.

Em separado, os engenheiros precisam instrumentar a nova lógica de código que recupere o estado da marcação do serviço para ativar o conteúdo marcado. Então, eles precisam de merges de código e implementações do código de marcação antes de ser ativado. Como muitas marcações de recursos são temporárias, não se esqueça de remover as marcações de recursos que não são mais necessárias.

Conclusão...

As marcações de recursos são uma poderosa adição a um arsenal de desenvolvimento ágil. Existem muitas maneiras criativas de utilizar marcações de recursos. As marcações de recursos são complementares à implementação contínua e ao controle de versão do Git. Em geral, as marcações de recursos dão às equipes mais controle sobre sua base de código, sua implementação e a experiência do usuário final.