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
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
650
Sign In with Apple
nonchalant
1
2.5k
iOSDC RejectCon 20180915: Factoryの自動生成によりテストを書きやすくする
nonchalant
1
760
iOSDC 20180902: 小さくはじめる端末管理
nonchalant
2
1k
devsap 20180728: コード生成のススメ
nonchalant
0
150
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
巨大モノリシックアプリ モダン化大作戦
ktcryomm
0
1k
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
560
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
240
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
160
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
240
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
620
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
1
550
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
280
cdk deploy JawsSonic #MARATHONしながらAWSリソースをデプロイしてみよう
akihisaikeda
2
130
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
120
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
930
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
100
Featured
See All Featured
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
520
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
240
Into the Great Unknown - MozCon
thekraken
41
2.7k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.9k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6.2k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
250
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
280
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
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