Upgrade to Pro — share decks privately, control downloads, hide ads and more …

The Realities of A/B Testing

Aydar
January 10, 2022

The Realities of A/B Testing

A/B testing isn’t just about shipping and learning. There’s also some hard work involved. What if you have several A/B tests running on top of one another? Should you duplicate lots of code or introduce lots of branching? What does statistical relevance even mean?
In this talk, I’ll dig into the realities of A/B testing. I’ll discuss how to deal with A/B testing in practice, how to continuously split test an application with a non-trivial number of variants and not go mad, and how to keep your quality standards high.

Presented on App Builders 2019, Lugano

Aydar

January 10, 2022
Tweet

More Decks by Aydar

Other Decks in Programming

Transcript

  1. BUY! BUY! A B A B BUY! BUY! A B

    FREE! C What is the A/B Test
  2. A/B Test Strategy •Hypothesis •Success criteria de fi nition •Target

    for experiment •Tra ff i c split (Product + Data Analyst)
  3. A/B Test Strategy Tra ff i c split A 50

    % B 50 % One more A/B Test?
  4. A/B Test Strategy (Product + Data Analyst) •Hypothesis •Success criteria

    de fi nition •Target for experiment •Tra ffi c split
  5. remoteConfig = RemoteConfig.remoteConfig() remoteConfig.setDefaults(fromPlist: "RemoteConfigDefaults") //... remoteConfig.fetch { [weak self]

    status, error in if status == .success { print("Config fetched!") self?.remoteConfig.activateFetched() } else { print("Config not fetched") } } A/B Test Implementation Remote con fi g
  6. remoteConfig = RemoteConfig.remoteConfig() remoteConfig.setDefaults(fromPlist: "RemoteConfigDefaults") //... remoteConfig.fetch { [weak self]

    status, error in if status == .success { print("Config fetched!") self?.remoteConfig.activateFetched() } else { print("Config not fetched") } } A/B Test Implementation Remote con fi g
  7. A/B Test Implementation Cases A and B Just do it

    ☝ Learnings if isDiamondFeatureEnabled { openDiamondViewController() } else { openDuckViewController() }
  8. Clarify future scenarios • How long should an AB test

    be alive? • If the test is successful, then … • If the test failed, then … A/B Test Implementation Learnings
  9. v1 v2 A/B Test Implementation Learnings struct FixedStructure { let

    workout: Workout } struct DynamicStructure { let workouts: [Workout] }
  10. v1 v2 A/B Test Implementation Learnings struct FixedStructure { let

    workout: Workout } struct DynamicStructure { let workouts: [Workout] } struct UniversalStructure { // ... }
  11. v1 v2 A/B Test Implementation Learnings Nothing bad in copy-pasting

    (sometimes) struct FixedStructure { let workout: Workout } struct DynamicStructure { let workouts: [Workout] }
  12. t 100% DELIVERY DEV PROT. A/B TEST INTEGRATION DEVELOPMENT INTEGRATION

    Take shortcuts A/B Test Implementation Learnings
  13. Prototype • Targeted to one locale and speci fi c

    group • Looks like designed • Tracks user behavior Take shortcuts A/B Test Implementation Learnings
  14. Prototype by images A/B Test Implementation Learnings Start Image Non

    trivial UI element Button ✅ Easy to implement ✅ Easy to implement ❌ Needs a prototype
  15. A/B Test Implementation Learnings Secret screen for “on the fl

    y” con fi guration Test Helps with manual testing
  16. isEnabled == false Feature fl ag may change A/B Test

    Implementation Learnings id Model UI Feature fl ag didSelect Out of bounds
  17. 👍 Positive trend A/B Test Results 👎 Negative trend 😐

    Flat - case A results - case B results
  18. Summing up • Strategy • Implementation • Results 🌱 A/B

    Test life cycle • UserTesting • Firebase Remote Con fi g • Firebase Analytics • BigQuery • Chartio 🛠 Tools ☝ Learnings • Clarify future scenarios • Take shortcuts • Cleanup ASAP • Test • Feature fl ag may change