സൈറ്റിന്റെ റൂട്ട് ലേഔട്ടിലുള്ള (root layout) ഒരു ഷെയർഡ് ഫംഗ്ഷൻ, A/B-ടെസ്റ്റ് എക്സ്പോഷർ കൗണ്ടറിനെ ഒരു പേജ്-വ്യൂ കൗണ്ടറായി മാറ്റി. ഇത് സാമ്പിൾ സൈസ് വർദ്ധിപ്പിക്കുകയും കൺവേർഷൻ നിരക്കുകളെ അർത്ഥശൂന്യമാക്കുകയും ചെയ്തു. ഹോംപേജിന്റെ 50/50 സ്പ്ലിറ്റ് ആയിരുന്ന ഈ ടെസ്റ്റിൽ, ഒരു വേരിയന്റിന് 178 ഹിറ്റുകളും മറ്റൊന്നിന് 57 ഹിറ്റുകളും റിപ്പോർട്ട് ചെയ്തു—പ്രതീക്ഷിച്ച തുല്യമായ വിഭജനത്തിൽ നിന്നും ഇത് വളരെ അകലെയായിരുന്നു.
എങ്ങനെയാണ് ഈ പിശക് റാൻഡമൈസറിൽ (randomizer) നിന്ന് രക്ഷപ്പെട്ടത്
സന്ദർശകരെ ഒരു വേരിയന്റിലേക്ക് നിയോഗിക്കുന്ന റാൻഡമൈസർ ഡെവലപ്പർ ആദ്യം പരിശോധിച്ചു. അദ്ദേഹം മിഡിൽവെയർ (middleware) വായിക്കുകയും, കുക്കി (cookie) ലോജിക് പരിശോധിക്കുകയും, അസൈൻമെന്റ് ഫംഗ്ഷൻ 10,000 തവണ വിളിക്കുന്ന ഒരു സ്ക്രിപ്റ്റ് പ്രവർത്തിപ്പിക്കുകയും ചെയ്തു; അത് കൃത്യമായ 50/50 വിഭജനം നൽകി. റാൻഡമൈസർ ശരിയായി പ്രവർത്തിക്കുന്നുണ്ടായിരുന്നു; പ്രശ്നം എക്സ്പോഷർ എങ്ങനെ രേഖപ്പെടുത്തുന്നു എന്നതിലായിരുന്നു.
ഒരു ഫംഗ്ഷൻ രണ്ട് ജോലികൾ നിർവ്വഹിക്കുന്നുണ്ടായിരുന്നു:
- വേരിയന്റ് സെറ്റ് ചെയ്യുക (Set the variant) – സന്ദർശകന്റെ അനുഭവം സ്ഥിരമായി നിലനിർത്തുന്നതിനായി ഓരോ പേജ് ലോഡ് ചെയ്യുമ്പോഴും ഇത് പ്രവർത്തിക്കുന്നു.
- എക്സ്പോഷർ ഇവന്റ് രേഖപ്പെടുത്തുക (Record the exposure event) – വേരിയന്റ് ആദ്യമായി കാണുന്ന നിമിഷം, ഓരോ സന്ദർശകനും ഒരു തവണ മാത്രം ഇത് പ്രവർത്തിക്കണം.
ഓരോ നാവിഗേഷനിലും റെൻഡർ ചെയ്യപ്പെടുന്ന ഒരു കംപോണന്റായ റൂട്ട് ലേഔട്ടിലായിരുന്നു ഈ ഫംഗ്ഷൻ ഉണ്ടായിരുന്നത്. എക്സ്പോഷർ റെക്കോർഡ് ചെയ്യുന്ന കോഡ് ഓരോ തവണ ലേഔട്ട് റെൻഡർ ചെയ്യുമ്പോഴും പ്രവർത്തിച്ചതിനാൽ, ഓരോ പേജ് വ്യൂവും പുതിയൊരു എക്സ്പോഷറായി കണക്കാക്കപ്പെട്ടു. ഹോംപേജിലെ രണ്ട് വേരിയന്റുകളും നേരിയ വ്യത്യാസമുള്ള ലേഔട്ട് ട്രീകളാണ് (layout trees) ഉപയോഗിച്ചിരുന്നത്, അതിനാൽ അവയുടെ പേജ്-വ്യൂ നിരക്കുകൾ വ്യത്യാസപ്പെട്ടു, ഇത് റാൻഡമൈസർ തകരാറിലായെന്ന തെറ്റായ ധാരണ ഉണ്ടാക്കി.
ഈ തെറ്റായ കണക്കെടുപ്പ് എന്തുകൊണ്ട് പ്രധാനമായി
കൺവേർഷൻ നമ്പറുകൾ—ക്ലിക്ക്-ത്രൂകൾ, സൈൻ-അപ്പുകൾ, പർച്ചേസുകൾ—ശരിയായി രേഖപ്പെടുത്തിയിരുന്നു. എന്നാൽ ഡിനോമിനേറ്റർ (denominator - എക്സ്പോഷറുകളുടെ എണ്ണം) തെറ്റായിരുന്നു. കണക്കാക്കിയ കൺവേർഷൻ നിരക്കുകൾ യഥാർത്ഥത്തേക്കാൾ വളരെ കുറവായി കാണപ്പെട്ടു, ആ നിരക്കുകളെ അടിസ്ഥാനമാക്കിയുള്ള ഏത് തീരുമാനങ്ങളും വിശ്വസനീയമായിരുന്നില്ല.
ഈ വ്യത്യാസം പുറത്തുവരുന്നതിന് മുമ്പ് രണ്ട് ആഴ്ചയോളം ടെസ്റ്റ് നടന്നു, ഇത് ടീമിനെ മുഴുവൻ ഡാറ്റാ സെറ്റും ഉപേക്ഷിക്കാൻ നിർബന്ധിതരാക്കി.
പരിഹാരം
പരിഹാരം ലളിതമായിരുന്നു: ഉത്തരവാദിത്തങ്ങളെ വേർതിരിച്ച് വ്യത്യസ്ത ഫംഗ്ഷനുകളാക്കി മാറ്റി. എക്സ്പോഷർ റെക്കോർഡ് ചെയ്യുന്ന കോഡ് ഇപ്പോൾ സന്ദർശകനെ നേരത്തെ കണക്കാക്കിയിട്ടുണ്ടോ എന്ന് പരിശോധിക്കുന്നു, അങ്ങനെ ഓരോ ഉപയോക്താവിനും ഒരു തവണ മാത്രം പ്രവർത്തിക്കുന്നു. വേരിയന്റ് സെറ്റ് ചെയ്യുന്ന കോഡ് അതിന്റെ സ്ഥാനത്ത് തന്നെ തുടരുന്നു, ഓരോ നാവിഗേഷനിലും അത് പ്രവർത്തിച്ചുകൊണ്ടേയിരിക്കുന്നു.
പരീക്ഷണങ്ങൾ നടത്തുന്നവർക്കുള്ള മൂന്ന് പാഠങ്ങൾ
- സ്റ്റേറ്റ് സെറ്റിംഗിനെ (state-setting) ഒറ്റത്തവണ മാത്രം സംഭവിക്കുന്ന ഇവന്റുകളിൽ നിന്ന് വേർതിരിക്കുക. ഒരു വേരിയന്റ് അസൈൻ ചെയ്യുകയും ഒപ്പം ഒരു എക്സ്പോഷർ ലോഗ് ചെയ്യുകയും ചെയ്യുന്ന ഫംഗ്ഷൻ തമ്മിൽ സംഘർഷമുണ്ടാകും, കാരണം ആദ്യത്തേത് ആവർത്തിക്കുന്നു എന്നാൽ രണ്ടാമത്തേത് ആവർത്തിക്കരുത്.
- റൂട്ട് ലേഔട്ടിൽ വൺ-ഷോട്ട് ലോജിക് (one-shot logic) ഒഴിവാക്കുക. ഓരോ പേജ് ലോഡ് ചെയ്യുമ്പോഴും റെൻഡർ ചെയ്യപ്പെടുന്ന ഒരു കംപോണന്റിൽ വെക്കുന്ന എന്തും ആവർത്തിച്ച് പ്രവർത്തിക്കും, ഇത് "ഓരോ സന്ദർശകനും ഒരു തവണ" എന്നത് "ഓരോ പേജ് വ്യൂവിനും ഒരു തവണ" എന്നതാക്കി മാറ്റും.
- നിരീക്ഷിച്ച സ്പ്ലിറ്റ് റാൻഡമൈസറിന് വിരുദ്ധമാകുമ്പോൾ, ആദ്യം കൗണ്ടർ പരിശോധിക്കുക. ഡെവലപ്പർമാർ പലപ്പോഴും റാൻഡമൈസറിന്റെ കൃത്യത പരിശോധിക്കാറുണ്ട്, എന്നാൽ കൗണ്ടിംഗ് മെക്കാനിസം കൃത്യമാണോ എന്ന് അപൂർവ്വമായി മാത്രമേ പരിശോധിക്കാറുള്ളൂ.
ഇനി ശ്രദ്ധിക്കേണ്ട കാര്യങ്ങൾ
എക്സ്പോഷറിനായി ഒരു സിംഗിൾ കൗണ്ടറുകളെ ആശ്രയിക്കുന്ന ഏത് പരീക്ഷണവും, ആ കൗണ്ടർ കംപോണന്റ് ട്രീയിൽ (component tree) എവിടെയാണെന്ന് പരിശോധിക്കണം. കൗണ്ടർ ഒരു ഗ്ലോബൽ ലേഔട്ടിലാണെങ്കിൽ, കുക്കി അല്ലെങ്കിൽ ലോക്കൽ-സ്റ്റോറേജ് ഫ്ലാഗ് (local-storage flag) പോലുള്ള ഒരു പെർസിസ്റ്റന്റ് ഐഡന്റിഫയറുമായി (persistent identifier) ഇവന്റിനെ ബന്ധിപ്പിക്കുന്ന ഒരു ചെക്ക് ചേർക്കുക. ടീമുകൾ അവരുടെ ഡാഷ്ബോർഡുകളിൽ ഒരു സാനിറ്റി ചെക്ക് (sanity check) കൂടി ഉൾപ്പെടുത്തണം: നിരീക്ഷിച്ച വേരിയന്റ് വിതരണം ചെറിയൊരു സ്റ്റാറ്റിസ്റ്റിക്കൽ മാർജിനിൽ നിന്ന് വ്യതിചലിക്കുന്നുണ്ടെങ്കിൽ, റാൻഡമൈസർ തകരാറിലാണെന്ന് കരുതുന്നതിന് മുമ്പ് കൗണ്ടർ ഓഡിറ്റിനായി ആ ടെസ്റ്റിനെ അടയാളപ്പെടുത്തുക.
ചുരുക്കത്തിൽ, വിശ്വസനീയമായ ഒരു എക്സ്പോഷർ കൗണ്ട് ഇല്ലാതെ കൃത്യമായി പ്രവർത്തിക്കുന്ന ഒരു റാൻഡമൈസറും ഉപയോഗശൂന്യമാണ്. ഉത്തരവാദിത്തങ്ങൾ വിഭജിക്കുന്നതും ഒറ്റത്തവണ മാത്രം സംഭവിക്കുന്ന ഇവന്റുകളെ എപ്പോഴും റെൻഡർ ചെയ്യപ്പെടുന്ന കംപോണന്റുകൾക്ക് പുറത്ത് നിർത്തുന്നതും A/B ടെസ്റ്റുകൾ കൃത്യമായി നിലനിർത്താനും ആഴ്ചകളോളം നീളുന്ന അനാവശ്യ വിശകലനങ്ങൾ ഒഴിവാക്കാനും സഹായിക്കുന്നു.
