Download - Feature Bits at LSSC10

Transcript
Page 1: Feature  Bits at LSSC10

Feature Bits:Enabling Flow

Within and Across Teams

Erik Sowa and Rob LohLSSC10 (April 2010)

Thursday, May 27, 2010

Page 2: Feature  Bits at LSSC10

Outline of Talk

• Business context• Continuous flow of code• Latent code: Introducing feature bits• Lyris' implementation (Rob Loh)• Lessons learned

Thursday, May 27, 2010

Page 3: Feature  Bits at LSSC10

Invitation...

Thursday, May 27, 2010

Page 4: Feature  Bits at LSSC10

Business Context

Thursday, May 27, 2010

Page 5: Feature  Bits at LSSC10

Enable Flow: Avoid Big Bangs

Photo Credit: USDOE (http://commons.wikimedia.org/wiki/File:Castle_romeo2.jpg)

Thursday, May 27, 2010

Page 6: Feature  Bits at LSSC10

Deployment Pipeline

Photo Credit: Ryan McFarland (http://commons.wikimedia.org/wiki/File:Alaska_Pipeline.jpg )

Thursday, May 27, 2010

Page 7: Feature  Bits at LSSC10

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

Page 8: Feature  Bits at LSSC10

Feature Bits: Latent Code

Photo Credit: Marcin Wichary (http://commons.wikimedia.org/wiki/File:IMSAI8080_TV11.jpg)

Thursday, May 27, 2010

Page 9: Feature  Bits at LSSC10

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

Page 10: Feature  Bits at LSSC10

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

Page 11: Feature  Bits at LSSC10

Our implementation

• Rob Loh

Thursday, May 27, 2010

Page 12: Feature  Bits at LSSC10

Feature Bits

Technical Details

Thursday, May 27, 2010

Page 13: Feature  Bits at LSSC10

ImplementationContextRequirements ModelAPIDiscovery

Coding PatternsSimpleBy Design

Outline

Closing Points

Thursday, May 27, 2010

Page 14: Feature  Bits at LSSC10

Implementation

Thursday, May 27, 2010

Page 15: Feature  Bits at LSSC10

ContextThursday, May 27, 2010

Page 16: Feature  Bits at LSSC10

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

Page 17: Feature  Bits at LSSC10

Data Model

Thursday, May 27, 2010

Page 18: Feature  Bits at LSSC10

<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

Page 19: Feature  Bits at LSSC10

Thursday, May 27, 2010

Page 20: Feature  Bits at LSSC10

Coding Patterns

Thursday, May 27, 2010

Page 21: Feature  Bits at LSSC10

{ 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

Page 22: Feature  Bits at LSSC10

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

Page 23: Feature  Bits at LSSC10

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

Page 24: Feature  Bits at LSSC10

Lessons Learned

Photo Credit: Underwood & Underwood (http://commons.wikimedia.org/wiki/File:Ecuadoran_Students.jpg)

Thursday, May 27, 2010

Page 25: Feature  Bits at LSSC10

Design Pressure is Good

Photo Credit: Tokino (http://commons.wikimedia.org/wiki/File:Air_pressure_gauge.jpg)Thursday, May 27, 2010

Page 26: Feature  Bits at LSSC10

Manage the Lifecycle

Photo Credit: Pyrothansia (http://commons.wikimedia.org/wiki/File:Life_cycle.jpg)

Thursday, May 27, 2010

Page 27: Feature  Bits at LSSC10

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

Page 28: Feature  Bits at LSSC10

Default state: Decouple code rolls

Photo Credit: Kazumasa Ogawa (http://commons.wikimedia.org/wiki/File:Japanese_Chain_coupler.jpg)

Thursday, May 27, 2010

Page 29: Feature  Bits at LSSC10

Naming Convention Matters

Thursday, May 27, 2010

Page 30: Feature  Bits at LSSC10

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

Page 31: Feature  Bits at LSSC10

Customer-facing releases

Thursday, May 27, 2010

Page 32: Feature  Bits at LSSC10

Limit the overhead

Photo Credit: Henning Klevier (http://commons.wikimedia.org/wiki/File:Fibonacci_%28x%2B1%29%5En.png)

Thursday, May 27, 2010

Page 33: Feature  Bits at LSSC10

Beta- and Split-Testing

Photo Credit: US Navy (http://commons.wikimedia.org/wiki/File:Navy_binoculars.jpg)Thursday, May 27, 2010

Page 34: Feature  Bits at LSSC10

Q&A

Thursday, May 27, 2010