Um bom exemplo do que estou tentando perguntar seria o novo recurso de linha do tempo do Facebook. No começo, apenas alguns selecionados tinham acesso à linha do tempo. À medida que o recurso se solidificava no funcionamento e os bugs eram corrigidos, usuários adicionais tiveram acesso ao recurso. Posteriormente, um grande grupo de usuários teve acesso ao recurso e agora é um recurso geral para todos os usuários. Como uma equipe de desenvolvimento gerencia esse tipo de recurso?
Eu brinquei com a idéia de usar as definições de configuração para controlar seletivamente o acesso se algo estiver em teste ou em produção por meio de um arquivo de configuração e com instruções condicionais if no código. Agora, enquanto isso é válido para recursos simples, acredito que, se tentássemos implementar isso em um conjunto maior de recursos, isso se tornaria incontrolável.
Qual seria a melhor maneira de gerenciar lançamentos de recursos dessa maneira?
Respostas:
É fácil adivinhar que um sistema como o Facebook é impulsionado principalmente por bancos de dados. Todos os dados do usuário são obviamente armazenados em bancos de dados, e isso provavelmente inclui informações sobre como renderizar os dados do usuário. É impossível saber exatamente como o banco de dados do Facebook está configurado, mas deve ser o caso de um recurso como o Timeline ser lançado aos usuários de maneira gradual, selecionando periodicamente os usuários no banco de dados, com base em alguns critérios e alterando o valor ( s) de alguns campos.
Por exemplo, talvez eles têm um campo na tabela user como
timeline_status
que tem valores comonot offered
,offered
,preview
, epublic
. Com base nisso, o sistema do Facebook pode decidir como renderizar a página de informações do usuário. A equipe do FB poderia então experimentar o recurso Linha do tempo selecionando um grupo de usuários e alterando o valor desse campo.Na prática, tenho certeza de que é um pouco mais complicado que isso, mas a idéia principal é que uma conta de usuário seja apenas dados, e alguns desses dados podem determinar quais recursos estão disponíveis. A implantação de um novo recurso é apenas uma questão de atualizar os registros do usuário no banco de dados.
fonte
Sim, essa é a maneira errada de fazer isso. Qualquer que seja o recurso X, se for configurável, ele deverá estender ou substituir algo. Faça isso no código. Por exemplo, a coisa do FB pode ter algo assim:
Em seguida, você criaria uma fábrica que cria objetos UserPageView ao visitar uma página de usuário com base na configuração. Você ativaria essa visão. Sem galhos tolos.
Você quer fazer dessa maneira, porque se alguém lhe pedir para mudar uma vez, ele solicitará novamente. Além disso, eles pedirão para mudar outra coisa. Enigma sua arquitetura com casos especiais e se está por toda parte e você terá uma tigela gigante de espaguete mofado e inatingível, em vez de um produto maduro e rico em recursos.
fonte
Pense no recurso da mesma maneira que você pensaria em um recurso de administração em um local de casamento.
Quando uma página está carregando, verifique se o usuário tem os privilégios corretos para o recurso, se for o caso.
O Facebook parece usar uma abordagem baseada em localização ao lançar novos recursos. Pode ser tão simples quanto olhar o endereço IP do usuário para encontrar sua localização.
fonte