continuous innovation @ gilt groupe

65
Continuous Innovation Eric Bowman VP Architecture Gilt Groupe @ebowman [email protected] http://tech.gilt.com

Upload: eric-bowman

Post on 15-Jan-2015

3.637 views

Category:

Technology


7 download

DESCRIPTION

This is a talk about different ways we enable continuous innovation. Working bottom-up from tech stack through how we organize teams, to how we do architecture & organize teams of teams, we share various approaches we've found work well.

TRANSCRIPT

Page 1: Continuous Innovation @ Gilt Groupe

Continuous Innovation

Eric Bowman VP Architecture

Gilt Groupe

@[email protected] http://tech.gilt.com

Page 2: Continuous Innovation @ Gilt Groupe

http://www.flickr.com/photos/nationaalarchief/4193508328/sizes/o/in/photolist-7oyPVJ-7oyPWW-7oyPYf-7oyQ1s-7oyQ4u-7oyQh7-7oyQju-7oyQmm-7oyQqS-7oDszB-a7vaUw-fJHB9E-fJHBbj-fJHBaw-fJHB8N-fJrhsz-9uzYLJ-f5hWTe-f5i3Fv-f5ibHt-f5i6T2-f5ibEH-f5ibFz-f5ibGF-f5i3G8-fa97G7-f5i6Sk-f5ibDa-f5i3EH-f5i3E2-f5ifwt-f5i6Tk-f5i6PX-f5i3CV-fadccE-fadcgw-fadcf5-7JxdSE-8F3Akp-8F3AjM-8F6Lah-7GBRia-8PWU2Q-8PWU8j-dbzybh-9Nk8fN-8wBt83-cweZi9-8PWYgo-8PWYTN-8PTRqn/

Page 3: Continuous Innovation @ Gilt Groupe

http://megmurph.com/wp-content/uploads/2013/03/success-1.jpg

Page 4: Continuous Innovation @ Gilt Groupe

http://upload.wikimedia.org/wikipedia/commons/7/7f/Structure_Paris_les_Halles.jpg

Page 5: Continuous Innovation @ Gilt Groupe

http://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Train_wreck_at_Montparnasse_1895.jpg/853px-Train_wreck_at_Montparnasse_1895.jpg

Page 6: Continuous Innovation @ Gilt Groupe

http://www.andpop.com/wp-content/uploads/2013/01/Screen-Shot-2013-01-03-at-11.18.47-AM.png

Page 7: Continuous Innovation @ Gilt Groupe

http://ontherealny.com/wp-content/uploads/2013/01/OfficeSpace.jpg

Page 8: Continuous Innovation @ Gilt Groupe

http://500motivators.com/motivate/me/motivation-its-not-that-im-lazy-i-just-dont-care/

Page 9: Continuous Innovation @ Gilt Groupe
Page 10: Continuous Innovation @ Gilt Groupe
Page 11: Continuous Innovation @ Gilt Groupe
Page 12: Continuous Innovation @ Gilt Groupe

A Social Experiment.

Page 13: Continuous Innovation @ Gilt Groupe

http://i.imgur.com/rjhDNfQ.jpg

Page 14: Continuous Innovation @ Gilt Groupe

http://1.bp.blogspot.com/_gS-Swh3xoXc/TGBKtRIB2PI/AAAAAAAAA8o/j-2oz2Nhdm8/s1600/Dave+driving+Antique+Car.JPG

Page 15: Continuous Innovation @ Gilt Groupe

http://bothsides.wpengine.netdna-cdn.com/wp-content/uploads/2013/09/Transparency.jpg

Page 16: Continuous Innovation @ Gilt Groupe

http://i.imgur.com/8yj8CqJ.jpg

Page 17: Continuous Innovation @ Gilt Groupe

http://i.imgur.com/6vCz2.jpg

Page 18: Continuous Innovation @ Gilt Groupe

http://www.flickr.com/photos/dno1967b/8600410187/sizes/h/in/photolist-e6Zmjg-a9Ton2-9GUHja-ehXg1P-aaryES-fbpos6-fKqHKk-exbKfX-aarwxu-aawuWM-aaoH6B-8T5YTg-858k1A-ajFRPZ-7N7783/

Page 19: Continuous Innovation @ Gilt Groupe

object Build extends ClientServerCoreProject with ClientServerCoreDeps { val name = "svc-persistent-session" val servicePort = 8260 override val ioncannonTrack = IonCannon.FastTrack override def coreDeps = Seq( "com.giltgroupe" %% "commons-util" % "5.2.3" ) ++ defaultTestLibs override def clientDeps = Seq( "com.giltgroupe" %% "commons-core" % "5.2.3", "com.giltgroupe" %% "commons-test" % "5.2.3" % "test" ) ++ defaultTestLibs override def serverDeps = Seq( "com.giltgroupe" %% "commons-core" % "5.2.3", "com.giltgroupe" %% "commons-voldemort" % "1.1.1" % "compile->compile;endorsed->endorsed", "com.giltgroupe" %% "commons-squeryl" % "0.5.2", "com.gilt.service" %% "zookeeper" % "0.6.7" ) ++ gilt.ServiceFramework.dependencies("2.3.1") ++ defaultTestLibs }

Page 20: Continuous Innovation @ Gilt Groupe

$ sbt gilt-upgrade

Page 21: Continuous Innovation @ Gilt Groupe

object Build extends ClientServerCoreProject with ClientServerCoreDeps { val name = "svc-persistent-session" val servicePort = 8260 override val ioncannonTrack = IonCannon.FastTrack override def coreDeps = Seq( "com.giltgroupe" %% "commons-util" % "5.2.4" ) ++ defaultTestLibs override def clientDeps = Seq( "com.giltgroupe" %% "commons-core" % "5.2.4", "com.giltgroupe" %% "commons-test" % "5.2.4" % "test" ) ++ defaultTestLibs override def serverDeps = Seq( "com.giltgroupe" %% "commons-core" % "5.2.4", "com.giltgroupe" %% "commons-voldemort" % "1.1.1" % "compile->compile;endorsed->endorsed", "com.giltgroupe" %% "commons-squeryl" % "0.5.3", "com.gilt.service" %% "zookeeper" % "0.6.7" ) ++ gilt.ServiceFramework.dependencies("2.4.0") ++ defaultTestLibs }

Page 22: Continuous Innovation @ Gilt Groupe

@Path("/persistent-session") class PersistentSessionResource(storage: StorageApi) { ! @GET @Path("/{namespace}/{id}/{key}") def get(@PathParam("namespace") namespace: String, @PathParam("id") id: String, @PathParam("key") key: String): Option[core.Value] = { storage.get(makeKey(namespace, id, key)) }

Page 23: Continuous Innovation @ Gilt Groupe

trait Session { def get(key: String): Future[Option[Value]] } !private class SessionImpl(namespace: String, id: String) extends Session with CommonsClient[ServiceException] with CommonsClientConfig {

def get(key: String): Future[Option[Value]] = { getResponse(svcUri,

"persistent-session/%s/%s/%s".format(namespace, id, key)) { bytes => CommonsJson.parse[Option[core.Value]](bytes).map(

ValueImpl.apply) } }

Page 24: Continuous Innovation @ Gilt Groupe

abstract class SessionClientTest extends TestClients with Predictable { @Test def putValueCanBeGotBack() { val session = sessionClient.getSession(rndString()) val key = rndString() val value = rndString() session.get(key).get() should equal(None) session.put(key, Value(value)).get() session.get(key).get().get.value should equal(value) } } !@Functional class FunctionalSessionClientTest extends SessionClientTest with FunctionalTest @Capture class CaptureSessionClientTest extends SessionClientTest with CaptureTest @Mock class MockSessionClientTest extends SessionClientTest with MockTest

Page 25: Continuous Innovation @ Gilt Groupe

$ sbt release

Page 26: Continuous Innovation @ Gilt Groupe
Page 27: Continuous Innovation @ Gilt Groupe

val cluster = allocateCluster("svc-foo", "1.2.2") for (server <- cluster.allocateServers()) { deploySoftware(server, "svc-foo", "1.2.2") addToPool(server) } for (server <- findServers("svc-foo", "1.2.1")) { removeFromPool(server) } garbageCollect("svc-foo", "1.2.1")

Page 28: Continuous Innovation @ Gilt Groupe
Page 29: Continuous Innovation @ Gilt Groupe

http://i.imgur.com/OIpCx.jpg

Page 30: Continuous Innovation @ Gilt Groupe

http://www.recruitmenttakeout.com/wp-content/uploads/2013/04/brian.png

Page 31: Continuous Innovation @ Gilt Groupe

Openness. Autonomy.

Transparency. Trust.

Page 32: Continuous Innovation @ Gilt Groupe

Strategy

Page 33: Continuous Innovation @ Gilt Groupe

Strategy

Initiative 1Initiative

Page 34: Continuous Innovation @ Gilt Groupe

Initiative

Page 35: Continuous Innovation @ Gilt Groupe

Initiative

Initiative 1KPI

Page 36: Continuous Innovation @ Gilt Groupe

Initiative

Initiative 1KPI

Team

Page 37: Continuous Innovation @ Gilt Groupe
Page 38: Continuous Innovation @ Gilt Groupe

Tools for Emergent Centralization

Page 39: Continuous Innovation @ Gilt Groupe

Publish on the blog?

Page 40: Continuous Innovation @ Gilt Groupe

Have a party?

Page 41: Continuous Innovation @ Gilt Groupe

Release to production?

Page 42: Continuous Innovation @ Gilt Groupe

Anybody. Anytime.

Page 43: Continuous Innovation @ Gilt Groupe

Zero Waiting.

Page 44: Continuous Innovation @ Gilt Groupe

http://3.bp.blogspot.com/_q3ojg-NVpyU/TLMLUNGhgjI/AAAAAAAABS8/IJQSBSqII5s/s1600/compass.jpg

Page 45: Continuous Innovation @ Gilt Groupe

gilt.com

Page 46: Continuous Innovation @ Gilt Groupe

giltcity.com

gilttaste.com

parkandbond.com

Gilt Hom

e

gilt.com

Page 47: Continuous Innovation @ Gilt Groupe

giltcity.comgilttaste.comparkandbond.comGilt Homegilt.com

Page 48: Continuous Innovation @ Gilt Groupe

gilt.com

platform

Page 49: Continuous Innovation @ Gilt Groupe

http://shirt.woot.com/derby/entry/18736/positive-feedback-loop

Page 50: Continuous Innovation @ Gilt Groupe

Voluntary Adoption

Page 51: Continuous Innovation @ Gilt Groupe

• Move Fast • Fail Fast • Focus on Function • Enabled by Platform • Pick & Choose • Drives Platform Innovation • Teams Measured by KPIs

Shared UI

Features

Core

DB

ProductPlatform

Page 52: Continuous Innovation @ Gilt Groupe

• Move Slower • Proven Technologies • Focus on Scaling • Drives Product • Teams Measured by

Adoption

Shared UI

Features

Core

DB

ProductPlatform

Page 53: Continuous Innovation @ Gilt Groupe

Shared UI

Features

Core

DB

ProductPlatform Stronger than

the sum of its parts

Page 54: Continuous Innovation @ Gilt Groupe

http://4.bp.blogspot.com/-oemCGhrR6yw/UHnXg5LiiTI/AAAAAAAAHOI/JyZctjen3_4/s1600/simple+vs+complex.png

Page 55: Continuous Innovation @ Gilt Groupe

http://i.imgur.com/tUyGc.jpg

Page 56: Continuous Innovation @ Gilt Groupe
Page 57: Continuous Innovation @ Gilt Groupe

https://www.facebook.com/photo.php?fbid=403764539746425&set=a.289682334487980.65204.289626304493583&type=1&theater

Page 58: Continuous Innovation @ Gilt Groupe

http://pocketpause.com/woofwoof/wp-content/uploads/2012/12/IMG_6225.jpg

http://i.ytimg.com/vi/g8yN5fivBt8/0.jpg

Page 59: Continuous Innovation @ Gilt Groupe

http://marcelnunis.com/blog/wp-content/uploads/2011/12/coins.jpg

Page 60: Continuous Innovation @ Gilt Groupe

http://brettlegree.files.wordpress.com/sunset-joy-2-1.jpg

Page 61: Continuous Innovation @ Gilt Groupe

http://thumbs.dreamstime.com/z/boy-sleeping-hammock-5090586.jpg

Page 62: Continuous Innovation @ Gilt Groupe

http://online.portenf.sa.gov.au/sites/default/files/16_0.jpg

Page 63: Continuous Innovation @ Gilt Groupe

https://www.apertus.org/sites/default/files/bart_os.gif

Page 64: Continuous Innovation @ Gilt Groupe

http://creditmanagementassociation.org/wp-content/uploads/2013/03/mousetrap.jpg

Page 65: Continuous Innovation @ Gilt Groupe

http://i.imgur.com/Owoeyzi.jpg