Feature Bits:Enabling Flow
Within and Across Teams
Erik Sowa and Rob LohLSSC10 (April 2010)
Thursday, May 27, 2010
Outline of Talk
• Business context• Continuous flow of code• Latent code: Introducing feature bits• Lyris' implementation (Rob Loh)• Lessons learned
Thursday, May 27, 2010
Invitation...
Thursday, May 27, 2010
Business Context
Thursday, May 27, 2010
Enable Flow: Avoid Big Bangs
Photo Credit: USDOE (http://commons.wikimedia.org/wiki/File:Castle_romeo2.jpg)
Thursday, May 27, 2010
Deployment Pipeline
Photo Credit: Ryan McFarland (http://commons.wikimedia.org/wiki/File:Alaska_Pipeline.jpg )
Thursday, May 27, 2010
Continuous Delivery
Documented examples: • Allspaw, John and Hammond, Paul,
10+ Deploys Per Day: Dev and Ops Cooperation at Flickr
http://en.oreilly.com/velocity2009/public/schedule/detail/7641http://www.slideshare.net/jallspaw/10-deploys-per-day-dev-and-ops-cooperation-at-flickrhttp://velocityconference.blip.tv/file/2284377/
• Humble, Jez and Farley, David,
Continuous Delivery (O'Reilly Rough Cuts)• What about features you can't build in a day?
Thursday, May 27, 2010
Feature Bits: Latent Code
Photo Credit: Marcin Wichary (http://commons.wikimedia.org/wiki/File:IMSAI8080_TV11.jpg)
Thursday, May 27, 2010
Latent code variants
• DigitalRiver and ExactTargeto "Feature bits" used by Sean G. Ryan and team
• Flickro Previously cited talk mentions "feature flags" o http://en.oreilly.com/velocity2010/public/schedule/detail/14145
• Twittero "dynamically controlling features" and "infrastructure"o http://nosql.mypopescu.com/post/407159447/cassandra-twitter-an-interview-with-
ryan-king• Google ???
o Gradual rollout of new features• Etc.
Thursday, May 27, 2010
Usage at Lyris
• Introduced August, 2008• ~ 80 active bits by December, 2009• 48 active bits in March, 2010
Photo Credit: superde1uxe (http://commons.wikimedia.org/wiki/File:IMSAI8080.jpg)
Thursday, May 27, 2010
Our implementation
• Rob Loh
Thursday, May 27, 2010
Feature Bits
Technical Details
Thursday, May 27, 2010
ImplementationContextRequirements ModelAPIDiscovery
Coding PatternsSimpleBy Design
Outline
Closing Points
Thursday, May 27, 2010
Implementation
Thursday, May 27, 2010
ContextThursday, May 27, 2010
Requirements
• 3 levels of granularity: Global, Org, User-Org Account• Absence of a feature or any bits means that feature is off• Consistent list across our shared environments• Simple checks from the Flex tier, and the services tier• Simple process to register new features• In general, keep it simple for adoption and because of our
internal diversity.
Thursday, May 27, 2010
Data Model
Thursday, May 27, 2010
<features> <feature name="hq.remote_panel_load" /> <feature name="el.enable_asset_library" /> ...etc... </features>
public function isFeatureOn(featureName:String):Boolean { var nodes:XMLList = xml.features.feature. (@name==featureName); return null != nodes && 0 < nodes.length();}
Flex: Embedded in the bootstrap
Flex: Simple X-Path implementation
${core-url}/accounts/featureBits?userUid=&orgUid=&
Core Service API
Thursday, May 27, 2010
Thursday, May 27, 2010
Coding Patterns
Thursday, May 27, 2010
{ sectionName: "Mobile Marketing", links: [ { app:"EmailLabs", type:"panel", panelClass:"smssubscribers", featurebit:"el.enable_sms_messages" }, //...
if( registry.config.isFeatureOn( featureName ) ) {
// new implementation ...
} else {
// the old way ...
Generalized / Meta-data
Basic Checks
public function onInitialize():void { featureAIsOn = registry.config.isFeatureOn( featureA );
Cached
Thursday, May 27, 2010
Use with Strategy pattern:if( registry.config.isFeatureOn("ct.analyzer.v2") ) { service.analyzer = new Analyzer2(); } else { service.analyzer = new Analyzer();}
Use with Factory pattern:public function createMainDisplay():DisplayObject { if( registry.config.isFeatureOn( "service.panel.v2" ) ) { return new panel2(); // which extends panel } else { return new panel(); // which extends DisplayObject }}
Use with Chain of Responsibility pattern:if( registry.config.isFeatureOn("hq.trickle_reporting") ) { userActionLogger = userActionLogger.setNext( new TrickleReportNotifier( .. ) );}
Thursday, May 27, 2010
Closing Points
• Assess the need for feature-bit protections early.• Employ a naming system so as to prevent collision between
teams. Avoid re-using names.• Ensure QA understands the intended state of bits for the
code in production.• Some teams have used feature-bits to demonstrate bug
fixes during Sprint Reviews. Be careful with this pattern.• Multiple code paths will need support/maintenance for as
long as a "feature" is in the system.• Create stories/work items for retiring feature bit protection
for any work requiring them, at the time that work is happening.
• Ensure old code is retired as well as protections removed.
Thursday, May 27, 2010
Lessons Learned
Photo Credit: Underwood & Underwood (http://commons.wikimedia.org/wiki/File:Ecuadoran_Students.jpg)
Thursday, May 27, 2010
Design Pressure is Good
Photo Credit: Tokino (http://commons.wikimedia.org/wiki/File:Air_pressure_gauge.jpg)Thursday, May 27, 2010
Manage the Lifecycle
Photo Credit: Pyrothansia (http://commons.wikimedia.org/wiki/File:Life_cycle.jpg)
Thursday, May 27, 2010
Maintain Production Quality
Code hidden behind feature bits is subject to the same quality requirements as any code
Photo Credit: Rjgdoy (http://commons.wikimedia.org/wiki/File:Quality_not_quantity.png)
Thursday, May 27, 2010
Default state: Decouple code rolls
Photo Credit: Kazumasa Ogawa (http://commons.wikimedia.org/wiki/File:Japanese_Chain_coupler.jpg)
Thursday, May 27, 2010
Naming Convention Matters
Thursday, May 27, 2010
Do Not Overload
Photo Credit: Jonathan Mallard(http://commons.wikimedia.org/wiki/File:Unsafe_transport_of_a_shipping_container_in_Afghanistan.jpg)
Thursday, May 27, 2010
Customer-facing releases
Thursday, May 27, 2010
Limit the overhead
Photo Credit: Henning Klevier (http://commons.wikimedia.org/wiki/File:Fibonacci_%28x%2B1%29%5En.png)
Thursday, May 27, 2010
Beta- and Split-Testing
Photo Credit: US Navy (http://commons.wikimedia.org/wiki/File:Navy_binoculars.jpg)Thursday, May 27, 2010
Q&A
Thursday, May 27, 2010
Top Related