$30 off During Our Annual Pro Sale. View Details »

iOSDC20200921: Feature Flagを適切に分類することでA/Bテストの運用コストを下げる

Takeshi Ihara
September 21, 2020

iOSDC20200921: Feature Flagを適切に分類することでA/Bテストの運用コストを下げる

Takeshi Ihara

September 21, 2020
Tweet

More Decks by Takeshi Ihara

Other Decks in Programming

Transcript

  1. Feature FlagΛద੾ʹ෼ྨ͢Δ
    ͜ͱͰA/Bςετͷӡ༻ίετ
    ΛԼ͛Δ
    iOSDC 2020
    2020/09/21 Takeshi Ihara (ABEMA)

    View Slide

  2. A/Bςετ
    ίϯςϯπ഑৴ܕαʔϏεʹ͓͍ͯɺ৽ػೳͷϦϦʔεͷࡍɺKPIͷม
    Խ͕৽ػೳʹΑΔӨڹ͔ίϯςϯπʹΑΔӨڹ͔ͷ۠ผ͕ࠔ೉
    ৽ػೳͷޮՌଌఆͷਫ਼౓޲্ͷͨΊɺ৽ػೳͷ༗ແҎ֎ͷཁҼΛۃྗഉ
    আ͢Δ͜ͱ͕Ͱ͖ΔA/Bςετ͕༻͍ΒΕΔ

    View Slide

  3. ABEMAʹ͓͚Δ৽ػೳͷA/Bςετ
    • ৽ػೳͷදࣔͷ੾Γସ͑ͷΈ
    • ϦϦʔεͷલʹଌఆࢦඪͱωΫετΞΫγϣϯΛࡦఆ
    A. ৽ػೳͷImp/Click (= දࣔ਺/ར༻਺)
    B. ؔ࿈ػೳͷImp/Click
    C. ࢹௌ࣌ؒ΍ࢹௌຊ਺ (KPI)

    View Slide

  4. Feature Flag
    • ίʔυ্Ͱಛఆػೳͷදࣔͷ੾Γସ͑ʹ༻͍ΒΕΔ
    • Feature Toggle, Feature Switchͱ΋ݺ͹ΕΔ
    • ؅ཧαʔϏεͷྫ
    A. Firebase A/B Testing
    B. Launch Darkly

    View Slide

  5. A/Bςετ + Feature Flagͷεςʔλε؅ཧ
    • A/Bςετͷ਺ = Feature Flagͷ਺͕૿͍͑ͯ͘ʹैͬͯɺ֤A/Bςε
    τʹΑΔίʔυ্ͷ෼ذʹΑΓঢ়ଶͷ਺͕ංେԽ͍ͯ͘͠
    • A/Bςετ + Feature FlagͷεςʔλεΛ؅ཧ͠ͳ͍ͱɺະ࣮ࢪͷA/
    Bςετ͕ຊ൪ʹ࿐ग़ͨ͠ΓɺݕূࡁͷA/Bςετ͕ίʔυ্ʹ࢒Γ
    ଓ͚Δ໰୊͕ൃੜ͠͏Δ

    View Slide

  6. 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.

    View Slide

  7. Feature Flagͷ෼ྨ (ΫϥΠΞϯτ)
    • Release Flag
    • Ops Flag
    • Permission Flag
    • Experiment Flag

    View Slide

  8. Release Flag
    • ຊ൪؀ڥͰܾͯ͠༗ޮʹͳΒͳ͍࣮૷த΍ະςετͷػೳʹରͯ͠ͷ
    Feature Flag
    • τϥϯΫϕʔε։ൃͱ૬ੑ͕ྑ͍
    • ੜଘظؒ) ୹͍
    • มߋن໛) খ ~ த
    • ྫ) ։ൃதͷ৽ػೳ

    View Slide

  9. Ops Flag
    • γεςϜͷಈ࡞Λ੍ޚ͢ΔͨΊͷFeature Flag
    • ੜଘظؒ) ௕͍
    • มߋن໛) খ ~ த
    • ྫ) ಈըϓϨΠϠʔͷΤϥʔ࣌ͷϦτϥΠִؒ

    View Slide

  10. Permission Flag
    • ಛఆͷϢʔβʔ͕ड͚औΔػೳ΍੡඼ମݧΛมߋ͢ΔFeature Flag
    • ੜଘظؒ) ୹͍
    • มߋن໛) େ
    • ྫ) VoiceOverͷମݧ޲্ͷͨΊͷϢʔβʔςετ

    View Slide

  11. Experiment Flag
    • ύϑΥʔϚϯεଌఆ΍A/BςετͷͨΊͷFeature Flag
    • ੜଘظؒ) ୹͍
    • มߋن໛) த ~ େ
    • ྫ) ϦϦʔεࡁΈͷ৽ػೳ

    View Slide

  12. ੜଘظؒ
    มߋن໛
    3FMFBTF'MBH
    &YQFSJNFOU'MBH
    0QT'MBH
    1FSNJTTJPO
    'MBH

    View Slide

  13. Code of
    Feature Flag
    enum FeatureFlag {
    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Λฦ٫͢Δ
    }
    }
    }
    ΫϥΠΞϯτଆͰͷ࣮૷

    View Slide

  14. ·ͱΊ
    • ΫϥΠΞϯτଆͰFeature FlagΛ4छྨʹ෼ྨ
    A. ؅ཧπʔϧʹґଘ͠ͳ͍
    B. ຊ൪؀ڥͰͷ։ൃ్தͷ࿐ग़Λ๷͛Δ
    • ఆظతʹFeature Flagͷ୨Է͕͠ඞཁ
    C. ߴස౓) Release Flag, Experiment Flag
    D. ௿ස౓) Ops Flag, Permission Flag

    View Slide