+ - Disqus described their similar system in a 2010 blog post here: [[http://blog.disqus.com/post/789540337/partial-deployment-with-feature-switches | Disqus Feature Switches]].
+ - Forrst describes their similar system in a 2010 blog post here: [[http://blog.forrst.com/post/782356699/how-we-deploy-new-features-on-forrst | Forrst Buckets]].
+ - Martin Fowler discusses these systems in a 2010 blog post here: [[http://martinfowler.com/bliki/FeatureToggle.html | Martin Fowler's FeatureToggle]].
+ - Phabricator just adds config options but defaults them to off. When developing, we turn them on locally. One a feature is ready, we default it on. We have a vastly less context to deal with than most projects, however, and sometimes get away with simply not linking new features in the UI until they mature (it's open source anyway so there's no value in hiding things).
+
+When building this system there are a few things to avoid, mostly related to not
+letting the complexity of this system grow too wildly:
+
+ - Facebook initially made it very easy to turn things on to everyone by
+ accident in Gatekeeper. Don't do this. The UI should make it obvious when
+ you're turning something on or off, and default to off.
+ - Since Gatekeeper is essentially a runtime business rules engine, it was
+ heavily abused to effectively execute code living in a database. Avoid this
+ through simpler design or a policy of sanity.
+ - Facebook allowed Gatekeeper rules to depend on other Gatekeeper rules
+ (for example, 'new_profile_tour' is launched if 'new_profile' is launched)
+ but did not perform cycle detection, and then sat on a bug describing
+ how to introduce a cycle and bring the site down for a very long time,
+ until someone introduced a cycle and brought the site down. If you implement
+ dependencies, implement cycle detection.
+ - Facebook implemented some very expensive Gatekeeper conditions and was
+ spending 100+ms per page running complex rulesets to do launch checks for a
+ number of months in 2009. Keep an eye on how expensive your checks are.
+
+That said, not all complexity is bad:
+
+ - Allowing features to have states like "3%" instead of just "on" or "off"
+ allows you to roll out features gradually and watch for trouble (e.g.,
+ services collapsing from load).
+ - Building a control panel where you hit "Save" and all production servers
+ immediately reflect the change allows you to quickly turn things off if
+ there are problems.
+ - If you perform A/B testing, integrating A/B tests with feature rollouts
+ is probably a natural fit.
+ - Allowing new features to be launched to all employees before they're
+ launched to the world is a great way to get feedback and keep everyone
+ in the loop.
+
+Adopting runtime feature controls increases the risk of features leaking (or
+even launching) before they're ready. This is generally a small risk which is
+probably reasonable for most projects to accept, although it might be
+unacceptable for a some projects. There are some ways you can mitigate this
+risk:
+
+ - Essentially every launch/leak at Facebook was because someone turned on
+ a feature by accident when they didn't mean to. The control panel made this
+ very easy: features defaulted to "on", and if you tried to do something
+ common like remove yourself from the test group for a feature you could
+ easily launch it to the whole world. Design the UI defensively so that it
+ is hard to turn features on to everyone and/or obvious when a feature is
+ launching and this shouldn't be a problem.
+ - The rest were through CSS or JS changes that mentioned new features being
+ shipped to the client as part of static resource packaging or because
+ the code was just added to existing files. If this is a risk you're
+ concerned about, consider integration with static resource management.
+
+In general, you can start with a very simple system and expand it as it makes
+sense. Even a simple system can let you move away from feature branches.
+
+= Next Steps =
+
+Continue by:
+
+ - reading recommendations on structuring revision control with
+ @{article:Recommendations on Revision Control}; or
+ - reading recommendations on structuring changes with