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
Red or Green? Let us test
Search
Dmytro Khmelenko
April 13, 2019
Programming
52
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Red or Green? Let us test
Talk at GDG DevFest Pisa 2019
Dmytro Khmelenko
April 13, 2019
More Decks by Dmytro Khmelenko
See All by Dmytro Khmelenko
Securing High-Risk Django Applications: Lessons from the Payment Domain
dkhmelenko
0
53
Securing Python Web Applications
dkhmelenko
0
43
Best of login experience
dkhmelenko
0
120
Best of sign in experience @ Droidcon Lisbon
dkhmelenko
0
130
A journey to smaller APK size
dkhmelenko
1
130
A journey to smaller apk size
dkhmelenko
0
78
How Git helps us with localization
dkhmelenko
0
110
Dagger.Android module
dkhmelenko
0
79
MVVM vs. MVP
dkhmelenko
0
61
Other Decks in Programming
See All in Programming
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
340
Embedded Swiftで作る自作USBデバイス によるiOSデバイスの自動テスト / iOSDC Japan 2026 glassfiber
glassfiber
0
290
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
270
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
160
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
130
Workers Cache を知る
syumai
0
330
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
120
AWSに止められる覚悟してますか?
morizo_1984
2
510
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
480
残高管理から台帳サービスへの進化
artoy
0
140
Androidだけじゃない、DroidKaigiで広がった私の技術スタック
akkeylab
0
120
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
130
Featured
See All Featured
RailsConf 2023
tenderlove
30
1.6k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
Designing for Performance
lara
611
70k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
700
Code Reviewing Like a Champion
maltzj
528
40k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
430
The Limits of Empathy - UXLibs8
cassininazir
1
700
Statistics for Hackers
jakevdp
799
230k
The SEO Collaboration Effect
kristinabergwall1
1
590
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
440
Transcript
Green or red? Let us test Dmytro Khmelenko Software Engineer
@ Freeletics
A/B test What is that? !2
!3
Original !4
Original Variation !5
Original Variation All users 50% 50% !6
Original Variation All users 50% 50% Winner !7
Production example 8
# 1 Purchase screen 9
Original Variation 10
Original Variation +30% Conversion rate 11
# 2 Main app screen 12
Original Variation 13
Original Variation +18% Conversion rate 14
# 3 Dark vs Light theme 15
Original Variation 16
Original Variation 17 -6% Conversion rate
A/B testing is good for your product 18
Know how 19
Remote Config 20
Remote config 21
Conditions 22
Conditions 23
Conditions 24
Conditions 25
Conditions 26
Remote config 27
Parameters 28
Feature flag 29
Feature flag 30
Feature flag 31
Firebase Remote Config App configuration 32
App configuration fun initRemoteConfig() { val remoteConfig = FirebaseRemoteConfig.getInstance() remoteConfig.fetch()
.addOnSuccessListener { remoteConfig.activateFetched() } } 33
App configuration fun initRemoteConfig() { val remoteConfig = FirebaseRemoteConfig.getInstance() val
configSettings = FirebaseRemoteConfigSettings.Builder() .setDeveloperModeEnabled(BuildConfig.DEBUG) .build() remoteConfig.setConfigSettings(configSettings) remoteConfig.setDefaults(R.xml.remote_config_defaults) remoteConfig.fetch() .addOnSuccessListener { remoteConfig.activateFetched() } } 34
App configuration fun isFeatureEnabled(name: String): Boolean { return remoteConfig.getBoolean(name) }
35
App configuration fun isFeatureEnabled(name: String): Boolean { return remoteConfig.getBoolean(name) }
... if (isFeatureEnabled(“new_purchase_screen”)) { ... } 36
37
Firebase A/B Testing (beta) 38
Firebase A/B Testing 39
@dkhmelenko