Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Performance and Maintainability with Continuous...
Search
Seth Walker
April 24, 2014
Technology
1.3k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Performance and Maintainability with Continuous Experimentation
Seth Walker
April 24, 2014
More Decks by Seth Walker
See All by Seth Walker
A Public Commitment to Performance
sethwalker
0
3.8k
Other Decks in Technology
See All in Technology
[2026 Oracle Technical Deep Dive] AI時代のデータベース基盤をどう選ぶ? Exadata Database Serviceの選択肢と使い分け (2026年9月17日開催)
oracle4engineer
PRO
0
170
【データ横丁主催】AI Agentがコンテキストを使って仕事をした後、何が残るのか― 組織の経験を次の判断に引き継ぐ「Agent Memory」
shisyu_gaku
2
310
Claude起点の仕様駆動開発
tanakaseiya
0
280
20260930_Gemma4_Hands-on
tsho
0
210
キャリアLT今日までそして明日から
kentapapa
1
140
いちAWSエンジニアのAI活用を振り返る #devio2026 / devio osaka 2026 kawahara
masahirokawahara
2
310
AWS FinOps Agent 結局何が得意なの?
siromi
0
230
OSC2026on_the-world-is-waiting-for-your-voice.pdf
naruoga
0
220
1人アドミンな私はAWSアカウント申請をSlackで完結したい!
ysuzuki
0
110
Apache Iceberg が拓く AI 時代のオープンレイクハウス
tomtanaka
0
210
IR Today: Theory, Practice, and Agents
dtunkelang
0
320
ビジネスを止めない技術的負債の返済のための戦略とその手法 - 技術的負債と向き合う / Complexity and Simplicity
soudai
PRO
2
390
Featured
See All Featured
Marketing to machines
jonoalderson
1
5.8k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
540
How to make the Groovebox
asonas
2
2.5k
Scaling GitHub
holman
464
140k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
Ruling the World: When Life Gets Gamed
codingconduct
0
380
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
Utilizing Notion as your number one productivity tool
mfonobong
4
610
How to build a perfect <img>
jonoalderson
1
6.1k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.7k
Transcript
Performance and Maintainability with Continuous Experimentation @sethwalker sethwalker.me/talks/continuous-experimentation
@sethwalker Seth Walker Allison McKnight Jonathan Klein @sethwalker @aemcknig @jonathanklein
Daniel Espeset @danielespeset @dxna Daniel Na Lara Swanson @laraswanson
None
@sethwalker
@sethwalker 175 committers
@sethwalker 100 committers touch CSS & JS
@sethwalker
@sethwalker Confidence?
Operations
@sethwalker Feature Flags
@sethwalker $cfg['save_everything'] = 'staff'; // ... snip ... if (isEnabled('save_everything'))
{ writeToDB($everything); } else { throwAway($everything); }
@sethwalker $cfg['save_everything'] = '1%'; // ... snip ... if (isEnabled('save_everything'))
{ writeToDB($everything); } else { throwAway($everything); }
@sethwalker $cfg['save_everything'] = '5%'; // ... snip ... if (isEnabled('save_everything'))
{ writeToDB($everything); } else { throwAway($everything); }
@sethwalker $cfg['save_everything'] = '1%'; // ... snip ... if (isEnabled('save_everything'))
{ writeToDB($everything); } else { throwAway($everything); }
@sethwalker $cfg['save_everything'] = '5%'; // ... snip ... if (isEnabled('save_everything'))
{ writeToDB($everything); } else { throwAway($everything); }
@sethwalker $cfg['save_everything'] = '10%'; // ... snip ... if (isEnabled('save_everything'))
{ writeToDB($everything); } else { throwAway($everything); }
@sethwalker $cfg['jquery_1_11'] = 'staff'; // ... snip ... if (isEnabled("jquery_1_11"))
{ <script src="/js/lib/jquery-1.11.0.js"></script> } else { <script src="/js/lib/jquery-1.8.2.js"></script> }
@sethwalker $cfg['jquery_1_11'] = '5%'; // ... snip ... if (isEnabled("jquery_1_11"))
{ <script src="/js/lib/jquery-1.11.0.js"></script> } else { <script src="/js/lib/jquery-1.8.2.js"></script> }
@sethwalker $cfg['jquery_1_11'] = '50%'; // ... snip ... if (isEnabled("jquery_1_11"))
{ <script src="/js/lib/jquery-1.11.0.js"></script> } else { <script src="/js/lib/jquery-1.8.2.js"></script> }
None
None
None
None
None
@sethwalker $cfg['jquery_1_11'] = '5%'; // ... snip ... if (isEnabled("jquery_1_11"))
{ <script src="/js/lib/jquery-1.11.0.js"></script> } else { <script src="/js/lib/jquery-1.8.2.js"></script> }
None
None
None
None
@sethwalker $cfg['jquery_1_11'] = '50%'; // ... snip ... if (isEnabled("jquery_1_11"))
{ <script src="/js/lib/jquery-1.11.0.js"></script> } else { <script src="/js/lib/jquery-1.8.2.js"></script> }
@sethwalker $cfg['jquery_1_11'] = '100%'; // ... snip ... if (isEnabled("jquery_1_11"))
{ <script src="/js/lib/jquery-1.11.0.js"></script> } else { <script src="/js/lib/jquery-1.8.2.js"></script> }
None
@sethwalker
@sethwalker window.Etsy.Context = { // ... snip ... "feature":{ "conversations.rejuvination":true,
"activity.dynamic_load_on_scroll":true, "overlays.buttery_smooth":true, "collections.perf_render_fix":true, } };
@sethwalker if (Etsy.Context.feature["overlays.buttery_smooth"]) { doSmooth(); } else { doJanky(); }
@sethwalker TODO: Feature Flags for the asset pipeline
@sethwalker $cfg['js_debug_build'] = 'staff'; // ... snip ... if (isEnabled("js_debug_build"))
{ <script src="/js-debug/main.js"></script> } else { <script src="/js/main.js"></script> }
@sethwalker + Analytics
Continuous Experimentation
@sethwalker Small, measurable changes Dan McKinley - http://mcfunley.com/design-for-continuous-experimentation
@sethwalker Validate hypotheses
@sethwalker Invalidate hypotheses
None
None
@sethwalker
None
:(
@sethwalker 100+ active flags
@sethwalker 60+ active experiments
@sethwalker 14 experimental iterations on listing page redesign
None
None
None
None
None
None
None
None
None
None
None
None
None
@sethwalker N inactive experiments
@sethwalker N inactive experiments N > 0
@sethwalker Cruft
@sethwalker if (isEnabled("new_listing_page")) { <script src="/js/listing/new-listing.js"></script> } if (isEnabled("new_favorite_button")) {
<script src="/js/new-favorites.js"></script> } if (isEnabled("cart2")) { <script src="/js/add-to-cart2.js"></script> }
@sethwalker $cfg["new_listing_page"] = "100%"; $cfg["new_favorite_button"] = "5%"; $cfg["cart2"] = "50%";
@sethwalker define("foo", ["logger"], function(Logger) { Logger.warn("foo is deprecated!"); doFoo(); });
@sethwalker <link rel="stylesheet" href="/css/base.css" /> <link rel="stylesheet" href="/css/listing.css" /> if
(isEnabled("new_listing_page")) { <link rel="stylesheet" href="/css/new-listing.css" /> } if (isEnabled("new_favorite_button")) { <link rel="stylesheet" href="/css/new-favorites.css" /> } if (isEnabled("cart2")) { <link rel="stylesheet" href="/css/add-to-cart2.css" /> }
@sethwalker Let's clean up!
Fear
@sethwalker Throw away
@sethwalker Throw away ability
@sethwalker Design for Throwaway-ability Bill Scott - http://www.looksgoodworkswell.com/the-experimentation-layer/
@sethwalker Tools
@sethwalker Needs More Visibility
None
None
None
None
None
None
None
@sethwalker selectorText = document.styleSheets[i].cssRules[j].selectorText; selected = document.querySelector(selectorText); results.push({ selector: selectorText,
found: !!selected ? 1 : 0}); // ... snip ... log(results);
@sethwalker Existing code - Seen in the wild = SUSPECT
@sethwalker Instrumentation
@sethwalker Increasing confidence
@sethwalker Adapting tools and process
Thanks! @sethwalker sethwalker.me/talks/continuous-experimentation