Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Red or Green? Let us test
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Dmytro Khmelenko
April 13, 2019
Programming
50
0
Share
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
34
Securing Python Web Applications
dkhmelenko
0
40
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
75
How Git helps us with localization
dkhmelenko
0
110
Dagger.Android module
dkhmelenko
0
77
MVVM vs. MVP
dkhmelenko
0
58
Other Decks in Programming
See All in Programming
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
530
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
120
プラグインで拡張される Context をtype-safe にする難しさと設計判断
kazupon
2
540
Signal Forms: Beyond the Basics @ngBaguette 2026 in Paris
manfredsteyer
PRO
0
200
初めてのRubyKaigiはこう見えた
jellyfish700
0
400
Oxcを導入して開発体験が向上した話
yug1224
4
270
CSC307 Lecture 17
javiergs
PRO
0
310
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
0
120
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
360
AI時代の仕事技芸論 — ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ
kuranuki
1
580
Old Dog, New Tricks: The Java 25 Reinvention - JNation
bazlur_rahman
0
140
New "Type" system on PicoRuby
pocke
1
410
Featured
See All Featured
The Mindset for Success: Future Career Progression
greggifford
PRO
0
350
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
What's in a price? How to price your products and services
michaelherold
247
13k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.3k
Everyday Curiosity
cassininazir
0
220
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
190
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
350
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
320
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
240
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
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