Feature Bits at LSSC10

of 34/34
Feature Bits: Enabling Flow Within and Across Teams Erik Sowa and Rob Loh LSSC10 (April 2010) Thursday, May 27, 2010
  • date post

    31-Aug-2014
  • Category

    Technology

  • view

    2.581
  • download

    1

Embed Size (px)

description

Slides from my Feature Bits presentation at the 2010 Lean Software and Systems conference in Atlanta. See http://atlanta2010.leanssc.org/home/erik-sowa/ and http://www.leanssc.org/files/201004/videos/20100421_Sowa_EnabilingFlowWithinAndAcrossTeams/20100421_Sowa_EnabilingFlowWithinAndAcrossTeams.html

Transcript of Feature Bits at LSSC10

  • Feature Bits: Enabling Flow Within and Across Teams Erik Sowa and Rob Loh LSSC10 (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/7641 http://www.slideshare.net/jallspaw/10-deploys-per-day-dev-and-ops-cooperation-at-flickr http://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 ExactTarget o "Feature bits" used by Sean G. Ryan and team Flickr o Previously cited talk mentions "feature flags" o http://en.oreilly.com/velocity2010/public/schedule/detail/14145 Twitter o "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
  • Outline Implementation Context Requirements Model API Discovery Coding Patterns Simple By Design Closing Points Thursday, May 27, 2010
  • Implementation Thursday, May 27, 2010
  • Context Thursday, 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
  • Flex: Embedded in the bootstrap ...etc... Flex: Simple X-Path implementation public function isFeatureOn(featureName:String):Boolean { var nodes:XMLList = xml.features.feature. (@name==featureName); return null != nodes && 0 < nodes.length(); } Core Service API ${core-url}/accounts/featureBits?userUid=&orgUid=& Thursday, May 27, 2010
  • Thursday, May 27, 2010
  • Coding Patterns Thursday, May 27, 2010
  • Generalized / Meta-data { sectionName: "Mobile Marketing", links: [ { app:"EmailLabs", type:"panel", panelClass:"smssubscribers", featurebit:"el.enable_sms_messages" }, //... Basic Checks if( registry.config.isFeatureOn( featureName ) ) { // new implementation ... } else { // the old way ... Cached public function onInitialize():void { featureAIsOn = registry.config.isFeatureOn ( featureA ); Thursday, May 27, 2010
  • Use with Strategy pattern: if( registry.cong.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 TrickleReportNotier( .. ) ); } 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