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
iOSDC20200921: Feature Flagを適切に分類することでA/Bテストの運用...
Search
Takeshi Ihara
September 21, 2020
Programming
1.4k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
iOSDC20200921: Feature Flagを適切に分類することでA/Bテストの運用コストを下げる
https://fortee.jp/iosdc-japan-2020/proposal/cfd5bd01-c940-42e6-b06c-66edf3bef6f8
Takeshi Ihara
September 21, 2020
More Decks by Takeshi Ihara
See All by Takeshi Ihara
iOSDC 20190906: 動画アプリの投げ銭機能における 消耗型課金の仕組みと実装
nonchalant
3
6.4k
iOSDC 20190906: 動画アプリの投げ銭機能における 消耗型課金の仕組みと実装 with 発表ノート
nonchalant
2
630
Sign In with Apple
nonchalant
1
2.4k
iOSDC RejectCon 20180915: Factoryの自動生成によりテストを書きやすくする
nonchalant
1
750
iOSDC 20180902: 小さくはじめる端末管理
nonchalant
2
1k
devsap 20180728: コード生成のススメ
nonchalant
0
140
potatotips #50: iOSは自動生成の夢を見るか?
nonchalant
0
2k
try! Swift Tokyo 2018: Best Docker Container in Swift
nonchalant
1
1.4k
Otemachi.swift x Kyobashi.swift #02: Vapor + ProtocolBuffers + DockerでServer Side Swift入門
nonchalant
1
370
Other Decks in Programming
See All in Programming
Creating Composable Callables in Contemporary C++
rollbear
0
180
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.5k
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
230
Oxlintのカスタムルールの現況
syumai
6
1.2k
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
280
1B+ /day規模のログを管理する技術
broadleaf
0
120
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
210
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
770
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
6.7k
Datadog LLM Observabilityで実現する 安全なLLM Usage 管理
3150
0
130
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
150
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
220
Featured
See All Featured
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
Practical Orchestrator
shlominoach
191
11k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.2k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
870
Designing for humans not robots
tammielis
254
26k
4 Signs Your Business is Dying
shpigford
187
22k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
330
BBQ
matthewcrist
89
10k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
240
Code Review Best Practice
trishagee
74
20k
Transcript
Feature FlagΛదʹྨ͢Δ ͜ͱͰA/Bςετͷӡ༻ίετ ΛԼ͛Δ iOSDC 2020 2020/09/21 Takeshi Ihara (ABEMA)
A/Bςετ ίϯςϯπ৴ܕαʔϏεʹ͓͍ͯɺ৽ػೳͷϦϦʔεͷࡍɺKPIͷม Խ͕৽ػೳʹΑΔӨڹ͔ίϯςϯπʹΑΔӨڹ͔ͷ۠ผ͕ࠔ ৽ػೳͷޮՌଌఆͷਫ਼্ͷͨΊɺ৽ػೳͷ༗ແҎ֎ͷཁҼΛۃྗഉ আ͢Δ͜ͱ͕Ͱ͖ΔA/Bςετ͕༻͍ΒΕΔ
ABEMAʹ͓͚Δ৽ػೳͷA/Bςετ • ৽ػೳͷදࣔͷΓସ͑ͷΈ • ϦϦʔεͷલʹଌఆࢦඪͱωΫετΞΫγϣϯΛࡦఆ A. ৽ػೳͷImp/Click (= දࣔ/ར༻) B.
ؔ࿈ػೳͷImp/Click C. ࢹௌ࣌ؒࢹௌຊ (KPI)
Feature Flag • ίʔυ্ͰಛఆػೳͷදࣔͷΓସ͑ʹ༻͍ΒΕΔ • Feature Toggle, Feature SwitchͱݺΕΔ •
ཧαʔϏεͷྫ A. Firebase A/B Testing B. Launch Darkly
A/Bςετ + Feature Flagͷεςʔλεཧ • A/Bςετͷ = Feature Flagͷ͕૿͍͑ͯ͘ʹैͬͯɺ֤A/Bςε τʹΑΔίʔυ্ͷذʹΑΓঢ়ଶͷ͕ංେԽ͍ͯ͘͠
• A/Bςετ + Feature FlagͷεςʔλεΛཧ͠ͳ͍ͱɺະ࣮ࢪͷA/ Bςετ͕ຊ൪ʹ࿐ग़ͨ͠ΓɺݕূࡁͷA/Bςετ͕ίʔυ্ʹΓ ଓ͚Δ͕ൃੜ͠͏Δ
https://martinfowler.com/articles/feature-toggles.html Feature toggles can be categorized across two major dimensions:
how long the feature toggle will live and how dynamic the toggling decision must be.
Feature Flagͷྨ (ΫϥΠΞϯτ) • Release Flag • Ops Flag •
Permission Flag • Experiment Flag
Release Flag • ຊ൪ڥͰܾͯ͠༗ޮʹͳΒͳ͍࣮தະςετͷػೳʹରͯ͠ͷ Feature Flag • τϥϯΫϕʔε։ൃͱ૬ੑ͕ྑ͍ • ੜଘظؒ)
͍ • มߋن) খ ~ த • ྫ) ։ൃதͷ৽ػೳ
Ops Flag • γεςϜͷಈ࡞Λ੍ޚ͢ΔͨΊͷFeature Flag • ੜଘظؒ) ͍ • มߋن)
খ ~ த • ྫ) ಈըϓϨΠϠʔͷΤϥʔ࣌ͷϦτϥΠִؒ
Permission Flag • ಛఆͷϢʔβʔ͕ड͚औΔػೳମݧΛมߋ͢ΔFeature Flag • ੜଘظؒ) ͍ • มߋن)
େ • ྫ) VoiceOverͷମݧ্ͷͨΊͷϢʔβʔςετ
Experiment Flag • ύϑΥʔϚϯεଌఆA/BςετͷͨΊͷFeature Flag • ੜଘظؒ) ͍ • มߋن)
த ~ େ • ྫ) ϦϦʔεࡁΈͷ৽ػೳ
ੜଘظؒ มߋن 3FMFBTF'MBH &YQFSJNFOU'MBH 0QT'MBH 1FSNJTTJPO 'MBH
Code of Feature Flag enum FeatureFlag<Value> { case release(id: String,
defaultValue: Value) case ops(id: String, defaultValue: Value) case permission(id: String, defaultValue: Value) case experiment(id: String, defaultValue: Value) var value: Value { #if DEBUG_MENU // DEBUGϝχϡʔͰઃఆ͞Ε͕ͨ͋Εฦ٫͢Δ #endif if case let .release(_, defaultValue) = self { return defaultValue } else { // ཧπʔϧ͔Βऔಘ͕ͨ͋͠Εฦ٫͢Δɺͳ͚Ε defaultValueΛฦ٫͢Δ } } } ΫϥΠΞϯτଆͰͷ࣮
·ͱΊ • ΫϥΠΞϯτଆͰFeature FlagΛ4छྨʹྨ A. ཧπʔϧʹґଘ͠ͳ͍ B. ຊ൪ڥͰͷ։ൃ్தͷ࿐ग़Λ͛Δ • ఆظతʹFeature
Flagͷ୨Է͕͠ඞཁ C. ߴස) Release Flag, Experiment Flag D. ස) Ops Flag, Permission Flag