اجرای تست A/B در اپلیکیشن اندرویدی با فایربیس — از صفر تا صد
تست A/B یک ابزار قدرتمند برای تیمی است که روی یک اپلیکیشن موبایل کار میکند. این ابزار به شما امکان میدهد که کاربران خود را به گروههای مختلفی تقسیم کرده و نسخه متفاوتی از اپلیکیشن را به طور همزمان در اختیار آنها قرار دهید تا بدون تأثیر عوامل خارجی که ممکن است در نسخههای متفاوت وجود داشته باشند، رفتار آنها را ارزیابی کنید. از این ابزار میتوان برای مقایسه عملکرد نسخههای مختلف به صورت منفرد و میزان رفع نیازهای کاربران بهره جست. در این مقاله با روش اجرای تست A/B در اپلیکیشن اندرویدی با فایربیس آشنا خواهیم شد.
چرا باید تست A/B را اجرا کنیم؟
اجرای تست A/B روشی عالی برای درک تأثیری است که هر تغییر ایجاد شده در اپلیکیشن بر کاربران میگذارد و ما را مطمئن میسازد که نرخ تبدیل کاربران و دیگر معیارهای کلیدی را بهبود بخشیدهایم. شما میتوانید هر زمان که تغییری در یکی از قابلیتهای کلیدی اپلیکیشن خود ایجاد کردید، این تست را اجرا کنید.
برای نمونه فرض کنید مشغول کار روی یک اپلیکیشن اندروید هستیم و میخواهیم دو جزء کلیدی آن را تغییر دهیم. تغییر اول در گردش ثبت نام کاربر است. ممکن است فکر کنیم که تغییر ترتیب پرسش اطلاعات کاربر موجب بهبود تعداد افرادی میشود که کل مراحل ثبت نام را طی میکنند، اما در مورد دو نسخه متفاوت دچار تردید باشیم در این موارد یک تست بین این دو نسخه در برابر نسخه قبلی اجرا میکنیم تا بینیم تأثیر این دو نسخه نسبت به نسخه قدیمی چطور است و همچنین کدام یک از آن دو عملکرد بهتری از خود نشان میدهد تا آن را انتخاب کنیم.
آزمایش دیگری نیز روی یک بخش مهم اپلیکیشن اجرا میکنیم که یک قابلیت کلیدی برای اغلب کاربران محسوب میشود. فرض میکنیم که امکان بهبود تجربه کاربران در این صفحه وجود دارد و در نتیجه با همکاری تیم UX به یک راهحل جایگزین دست پیدا میکنیم. سپس تست A/B را به مدت چند هفته اجرا میکنیم، اما در نهایت میفهمیم که این راهحل جدید در عمل موجب هیچ نوع بهبودی نشده است. به لطف همین آزمایش از انتشار تغییری که تأثیر مثبتی روی کاربران دارد منصرف میشویم و زمان بیشتری را صرف این موضوع میکنیم تا راهحل بهتری به دست آوریم که در عمل موجب بهبود تجربه کاربران شود.
ابزارهای فایربیس: Remote Config و A/B tests
پلتفرم فایربیس امکان اجرای تستهای A/B را با انواع مختلف فراهم ساخته است. برای مثال میتوانید انواع مختلفی از نوتیفیکیشنها را امتحان کنید که موجب میشود متوجه شوید کدام متن با آیکون موجب کلیک بیشتر کاربران میشود. همچنین میتوانید «پیامهای درونبرنامهای» (In-App Messages) را تست کرده و متوجه شوید کدام پیام موجب نرخ درگیرسازی بالاتر کاربران میشود.
نوع سوم آزمایش که علاقه بسیاری از افراد را برمیانگیزد، «پیکربندی ریموت» (Remote Config) نام دارد. این ابزار به ما امکان میدهد که بخشهایی از اپلیکیشن را به طور مستقیم از کنسول فایربیس کنترل کنیم. به این ترتیب میتوانیم یک سری از پارامترها را تعریف کرده و یک مقدار برای هر یک از آنها در کنسول تنظیم کنیم. سپس میتوانیم از درون اپلیکیشن به SDK مربوط به Remote Config فایربیس کوئری زده و مقدار هر پارامتر را بازیابی کنیم. بر اساس همین مقدار، میتوانیم قابلیت مربوطه را در اپلیکیشن تنظیم کنیم. برای نمونه شما میتوانید یک قابلیت را نمایش داده یا پنهان کنید، نسخههای متفاوتی از صفحه یکسان را نمایش دهید، متن یک پیام را در اپلیکیشن تغییر دهید، رنگ یک دکمه را عوض کرده و کارهای زیادی از این دست انجام دهید.
طرز کار ابزار تست A/B از فایربیس با Remote Config چنین است که کاربران را به گروههای مختلف افراز میکنید و مقادیر متفاوتی برای پارامترهای انتخابی بسته به گروهی که کاربر به آن تعلق دارد تنظیم میکنید. سپس میتوانید عملکرد هر مقدار را در کنسول فایربیس بررسی کرده و در مورد این که کدام را میخواهید حفظ کنید، تصمیمگیری نمایید. زمانی که این انتخاب را انجام دادید، تست را متوقف میکنید و نسخه مطلوب را با تعیین مقدار برنده در پارامتر در Remote Config برای همه کاربران منتشر میسازید. این بدان معنی است که همه کاربران بیدرنگ نسخه با بهترین عملکرد را دریافت میکنند و دیگر نیازی نیست که اپلیکیشن را بهروزرسانی کنید.
پیش از آن که نگاه دقیقتری به پیادهسازی این ابزار بیندازیم، باید اشاره کنیم که ابزارهای بسیار زیاد دیگری وجود دارند که امکان اجرای تست A/B را روی اپلیکیشنهای اندرویدی فراهم میسازند. فایربیس به این جهت انتخاب شده است که رایگان است، پیادهسازی آسانی دارد و به احتمال زیاد از قبل، از برخی ابزارهای دیگر آن مانند Analytics ،Crashlytics و غیره استفاده میکنید. با این حال استفاده از گزینههای دیگر برای تحلیل عمیقتر تست A/B نیز توصیه میشود.
راهاندازی Remote Config در اپلیکیشن
در صورتی که فایربیس به کلی در پروژه شما راهاندازی نشده است، باید با پیگیری مراحلی که در این راهنما (+) معرفی شدهاند، آن را در پروژه خود پیکربندی کنید و اپلیکیشن را ثبت کرده به فایل پیکربندی فایربیس اضافه نمایید.
زمانی که فایربیس راهاندازی شد، میتوانید اقدام به راهاندازی Remote Config بکنید. ابتدا باید وابستگی زیر را اضافه کنید:
implementation ‘com.google.firebase:firebase-config-ktx:19.2.0’ implementation ‘com.google.firebase:firebase-analytics-ktx:17.4.4’
وابستگی analytics برای این که بتوانید از آن در زمان تحلیل نتایج تست استفاده کنید، ضروری است. به علاوه ممکن است بخواهید از برخی رویدادهای آنالیتیک به عنوان یک آغازگر (trigger) برای تست A/B خود استفاده کنید. با استفاده از کتابخانه ktx میتوانید از اکستنشنهای کاتلین کتابخانه Firebase بهره بگیرید.
در این مرحله باید مقادیر پیشفرض درون-برنامهای را تنظیم کنید. این مقادیر در حالتی استفاده خواهند شد که اپلیکیشن نتواند به بکاند فایربیس وصل شود و یا پارامتری که کوئری زدهاید در بکاند تنظیم نشده باشد. به این منظور باید یک فایل XML ایجاد کنید. به پوشه res بروید و در صورتی که یک پوشه xml وجود ندارد، آن را ساخته و یک فایل XML در این پوشه ایجاد کنید که مثلاً نام آن remote_config_values باشد. محتوای این فایل باید به صورت زیر باشد:
1<defaultsMap>
2 <entry>
3 <key>my_parameter_key</key>
4 <value>default_value</value>
5 </entry>
6</defaultsMap>
ما این فایل را به شیء RemoteConfig با متد setDefaultAsync ارسال میکنیم. در ادامه از Firebase.remoteConfig برای بازیابی وهله ریموت کانفیگ بهره میگیریم. این وهله برای پیکربندی ریموت کانفیگ در اپلیکیشن و واکشی مقادیر تنظیم شده در کنسول مورد استفاده قرار خواهد گرفت.
نخستین کاری که باید انجام دهید، این است که «کمینه بازه واکشی» را تعیین کنید که برابر با کمترین زمانی خواهد بود که باید منتظر بمانید تا مقادیر جدید را از بکاند واکشی نمایید. مقدار پیشفرض برابر با 12 ساعت است، یعنی دفعه بعدی که اپلیکیشن تلاش خواهد کرد تا مقادیر پارامتر را از بکاند واکشی کند، همان مقادیر قبلی بازگشت مییابند؛ مگر این که بیش از 12 ساعت از زمان قبلی سپری شده باشد. در غیر این صورت جدیدترین مقادیر در کنسول بازیابی خواهند شد.
یک سهمیه سمت سرور نیز در مورد تعداد کوئریهایی که اپلیکیشن میتواند در هر ساعت بزند وجود دارد. تیم فایربیس پیشنهاد میکنند که برای این گزینه مقدار بازه کوچکی تعیین کنیم، چون ممکن است موجب شود که اپلیکیشن از سهمیه تجاوز کند. با این حال، زمانی که یک اپلیکیشن را توسعه میدهید، احتمالاً نمیخواهید ساعتها منتظر بمانید، تا بتوانید مقادیری را تغییر داده و آنها را تست کنید. از این رو در زمان کار روی یک بیلد توسعه (Development) میتوانید مقادیر بسیار کمتری مانند 10 ثانیه را انتخاب کنید. اغلب برنامهنویسان در اپلیکیشنهای خود دو Firebase.remoteConfig به صورت dev و prod دارند که بسته به این که روی کدام یک از آنها کار میکنند میزان بازه واکشی را تنظیم میکنند.
در ادامه کد مربوطه را میبینید:
1class RemoteConfigManagerImpl : RemoteConfigManager {
2
3 private val minimumFetchIntervalInSeconds =
4 if (BuildConfig.FLAVOR == "dev") // If making a dev build
5 10L // 10 seconds
6 else
7 31200L // 12 hours
8
9 private val remoteConfig: FirebaseRemoteConfig by lazy {
10 Firebase.remoteConfig.apply {
11 setConfigSettingsAsync(
12 remoteConfigSettings {
13 minimumFetchIntervalInSeconds = this@RemoteConfigManagerImpl.minimumFetchIntervalInSeconds
14 }
15 )
16 setDefaultsAsync(R.xml.remote_config_defaults)
17 }
18 }
19...
20}
در کد فوق، یک وهله به نام RemoteConfigManager وجود دارد که شامل متدی است که برای بازیابی مقدار از بکاند استفاده میشود. ما این اینترفیس را در RemoteConfigManager بدون متد پیادهسازی کردهایم. این همان کلاسی است که هر زمان بخواهیم مقداری را از بکاند بگیریم در اپلیکیشن مورد استفاده قرار میدهیم.
اکنون که وهله RemoteConfig پیکربندی شده است، میتوانیم پارامتر را از بکاند بگیریم. اگر هنوز پارامترها را در کنسول فایربیس ندارید، به کنسول و بخش Remote Config بروید. از شما خواسته میشود که پارامتر جدیدی به همراه کلید و مقدار ایجاد کنید. در مثال فوق، کلید برابر با my_parameter_key است. ما در فایل پیشفرض پیکربندی مقداری به صورت default_value قرار دادهایم، اما اکنون میخواهیم یک مقدار واقعی قرار دهیم تا بررسی کنیم آیا مقدار به درستی از بکاند دریافت میشود یا نه. برای مثال از مقدار remote_config_value استفاده میکنیم. همچنین میتوانید یک توضیح اضافه کنید که روشی مناسب برای پیگیری پارامترهای مختلفی است که اضافه شدهاند.
زمانی که کار افزودن مقادیر پایان یافت، باید روی Publish Changes کلیک کنید تا همه چیز اعتبارسنجی شده و در اختیار اپلیکیشن قرار گیرد. اینک به کد بازمیگردیم و تلاش میکنیم تا در اپلیکیشن خود مقادیر مورد نظر را دریافت کنیم.
به این منظور باید مقادیر را با شیء Remote Config «واکشی» (fetch) و «فعالسازی» (activate) کنیم. شما میتوانید از متد ()fetchAndActivate استفاده کنید که به صورت ناهمگام این عملیات را اجرا کرده و یک Task به همراه نتیجه بازگشت میدهد که میتوانید به آن شنونده اضافه کرده و در نهایت مقدارتان را بازیابی کنید:
1 ...
2 fun getRemoteConfigValue() {
3 remoteConfig.fetchAndActivate()
4 .addOnSuccessListener {
5 // $it will be true if the values are newly fetched
6 val value = remoteConfig.getString("my_parameter_key")
7 // Value should now be equal to what you set in your Firebase Console
8 }
9 .addOnFailureListener {
10 // Here you can handle the case when the remote config failed
11 }
12 }
13 ...
از آنجا که این کار به صورت ناهمگام انجام مییابد، ممکن است بخواهید لحظهای تأمل کرده و به بهترین تجربهای که میتوانید به کاربران بدهید، فکر کنید. برای نمونه میتوانستیم در زمانی که مقدار در حال واکشی است، در صورتی که تأثیر چشمگیری روی نمایش UI داشته باشد، یک صفحه بارگذاری نشان دهیم.
راهاندازی تست A/B در کنسول فایربیس
اکنون که Remote Config را در اپلیکیشن فعال کردهایم و با روش بازیابی مقادیر آشنا شدیم، میتوانیم شروع به آزمایش روی فایربیس بکنیم. به این منظور به بخش A/B Testing در کنسول بروید و روی Create an experiment کلیک کنید. در ادامه آزمایش Remote Config را انتخاب کنید.
جزئیات تست از قبیل نام و غیره را وارد کرده و به بخش Targeting روید که در آنجا یک «رویداد فعالسازی» (Activation event) انتخاب میکنیم. اگر چنین موردی را راهاندازی کنید، به این معنی است که تنها کاربرانی که این رویداد را اجرا بکنند، وارد آزمایش خواهند شد. در این حالت همه کاربران دیگر در نتایج نهایی لحاظ نخواهند شد.
در ادامه یک مثال را مطرح میکنیم که نشان میدهد چرا این امکان اهمیت بالایی دارد. فرض کنید میخواهیم یک تست روی اپلیکیشن رسانه اجتماعی اجرا کنید که بخش ثبت نام و در ادامه قابلیتهای مانند ارسال عکس دارد. ما میخواهیم ثبت نام را با یک آزمایش بهبود بخشیم. معیار اصلی که بررسی خواهیم کرد، میزان افزایش درصد کاربرانی است که مراحل ثبت نام را تکمیل میکنند، اما میتوانید یک معیار کلیتر مانند درصد کاربرانی که عکس ارسال میکنند نیز داشته باشید.
در این سناریو اگر از یک رویداد فعالسازی مانند «آغاز ثبت نام» استفاده نکنید، همه کاربران شامل آنهایی که در گذشته ثبت نام کردهاند نیز در تست مشارکت خواهند داشت و ارسال تصاویر آنها در نتایج لحاظ میشود. اما شما در عمل میخواهید تنها آن ارسال عکسهایی که مربوط به کاربران جدید است و هماینک ثبت نام خود را تکمیل کردهاند را آزمایش کنید. در این موارد باید کمی تأمل کرده و در مورد رویداد فعالسازی که باید استفاده کنید بیندیشید.
سپس در بخش «اهداف» (Goals)، از شما خواسته میشود که معیار موفقیت را تعیین کنید. شما میتوانید چیزی مانند اجرای یک رویداد دیگر یا بهبود حفظ کاربر در اپ را تعیین کنید. چنان که در ابتدای مقاله گفتیم، به نظر میرسد که بخش تحلیلی تست A/B روی فایربیس با محدودیتهایی مواجه است و از این رو بهتر است که تحلیلهای عمیقتر را با استفاده از ابزار تحلیلی دیگری مانند Amplitude اجرا کنید. Amplitude یک ابزار بسیار قوی است که برای مقدار مشخصی از رویدادهای ماهانه یک طرح رایگان دارد و از این رو پیشنهاد میکنیم آن را بررسی کنید. در این مثال ما آزمایش گردش ثبت نام را اجرا میکنیم و به طور خاص میخواهیم بدانیم کدام مراحل ثبت نام از سوی کاربر تکمیل شدهاند که متأسفانه فایربیس این مورد را به ما اعلام نمیکند.
با این حال اگر مقاصد تحلیلی سادهای دارید، مثلاً میخواهید کلیک شدن یا نشدن یک دکمه، خریدن چیزی، پرداخت مبلغ مشخص، نرخ جذب کاربری و غیره را بسنجید، در این صورت میتوانید صرفاً از فایربیس استفاده کنید.
در نهایت در بخش «گونهها» (Variants)، باید آزمایش خود را به Remote Config که قبلاً راهاندازی کردهاید، لینک کنید. اینک باید پارامتری که قبلاً ایجاد کردهاید ببینید، اما میتوانید پارامتر دیگری نیز ایجاد کنید. اینک باید چند نسخه از پارامتر را تعریف کرده و بر همین اساس کاربران را به گروههای مختلف افراز کنید.
گروه کنترل باید همان گونهای از اپلیکیشن باشد که هم اینک موجود است. برای نمونه میتوانید نام مقدار را control بگذارید. سپس باید یک گونه جدید برای هر نسخه که میخواهید تست کنید بسازید.
اکنون میتوانید در بخش Review یک «پیشنویس» (Draft) از یک آزمایش ایجاد کنید. زمانی که این پیشنویس را ساختید، میتوانید با استفاده از قابلیت Test device بررسی کنید آیا آزمایش مطابق انتظار عمل میکند یا نه. این قابلیت میتواند یک گونه خاصی از دستگاه باشد.
اکنون به اپلیکیشن بازگردید و همه گونههای مختلف را پیادهسازی کنید و آنها را بر اساس مقداری که از سوی Remote Config بازگشت مییابد به کاربران نمایش دهید.
سخن پایانی
امیدواریم این مقاله به شما کمک کرده باشد تا شروع به اجرای تست A/B در اپلیکیشن اندرویدی خود بکنید. صرفنظر از اندازه تیمی که در آن مشغول به کار هستید، قابلیت تست A/B ارزش صرف وقت و منابع را دارد، چون ابزار بسیار ارزشمندی برای درک بهتر رفتار کاربران در اپلیکیشن است و شیوه بهبود تجربه آنها را به ما نشان میدهد.