This article originally appeared in the May 2012 issue of INTERNET TELEPHONY magazine.
Developers at 99designs use agile and lean startup methodologies, but as our development team gets bigger, deployments happen more frequently. This volume of change brings increased risk for the stability of our site. It can also be quite a challenge to measure the success of a single new feature on a rapidly changing website with multiple new features operating at any given time. In our earlier days, we’d demo new features on a staging server, but as 99designs has grown, using several staging servers to demo all our new features at once has become clunky. So how do we solve these issues? Feature flipping.
What is feature flipping?
Feature flipping enables the ability to turn site features on or off on a per-user basis. You've probably encountered it before with companies like Google or Facebook (News - Alert) when they're rolling out major changes. A few examples include the recent UI changes to Google Docs and Google Mail, and Facebook's new Timeline. Our approach was inspired by a presentation from our friends at Learnable, and slots in well with the Lean Startup methodology of releasing minimum viable products, measuring, and adapting through fast feedback.
Rolling out features incrementally gives companies the ability to ensure the appropriateness and stability of a feature. Some companies make this visible to users via an opt in/out approach, but in our case we use this internally as an improved form of A/B testing. Traditionally we would only A/B test on landing pages and static content, but feature flipping additionally allows us to experiment with pervasive site functionality.
How it works at 99
As a developer, a feature is simply registered in our codebase for use in a conditional statement which is used to guard feature-specific code. Incremental roll outs can easily be set up by defining a percentage chance of obtaining a feature or additionally creating a set of criteria a user must meet before a given feature is enabled.
99designs staff members get a nice interface where they can turn on and off features for themselves or a specific user. Here they can also view the progress of any experiments hanging off this feature. Many of our stakeholders are located remotely; by giving them the power to enable features themselves, they can try these out in production and provide feedback. This removes the need for a dedicated staging environment for demoing.
Developing with a multi-version mindset is probably one of the most challenging parts of feature flipping. What was once a simple deployment requiring a migration now entails more thought to allow the old and new versions to function independently of one other.
Deprecated code can start to accumulate when you start leaving code wrapped in feature checks. We try to curtail this as much as possible by coming back to clean up unused code paths once a feature has been fully rolled out. Also, we generally have a grace period even for features we're decided on, so that we can roll back if the need arises.
Unit and integration tests become more difficult when you’re working with an exponential number of feature combinations at any given time. This can lead to an out-sized volume of test cases, a problem we're still solving.
Feature flipping is our approach to solving several problems we face as 99designs expands. Managing features gives us fine-grained control over exactly what our users see, and is paving the way for us to experiment and adapt to our users much faster than was previously possible.
Big companies often execute this approach to development seamlessly, while there’s more of a learning curve for small to mid-sized companies. In our case, we’re still learning but we're far enough along to be reaping the benefits.
Where to go from here? We suggest you explore a few open source solutions that deal with features:
flip (https://github.com/pda/flip) - Declare and manage features.
rollout (https://github.com/jamesgolick/rollout) - Conditionally roll out features with Redis.
degrade (https://github.com/jamesgolick/degrade) - Keeps track of features, degrades functionality if errors are too high.
Chris Campbell is a web developer at 99designs (www.99designs.com), which calls itself the No. 1 marketplace for crowd-sourced graphic design.
Edited by Stefania Viscusi