من مطمئن هستم که شما در مورد streak ها شنیده اید یا از یک برنامه با آن استفاده کرده اید. اما تا به حال به این فکر کرده اید که چرا streak ها اینقدر محبوب و قدرتمند هستند؟ خب، واضح است که برنامهها تا حد ممکن توجه شما را میخواهند، اما جدا از آن، آیا میدانستید که وقتی اپلیکیشن یادگیری محبوب Duolingo ویجتهای iOS را برای نمایش رگهها معرفی کرد، تعهد کاربر تا 60 درصد افزایش یافت. شصت درصد یک تغییر بزرگ در رفتار است و نشان میدهد که چگونه میتوان از الگوهای «رگهای» برای افزایش تعامل و افزایش استفاده استفاده کرد. در ابتدایی ترین حالت، یک رگه تعداد روزهای متوالی است که کاربر یک فعالیت خاص را تکمیل می کند. برخی افراد همچنین آن را به عنوان یک عادت «بازیشده» یا معیاری که برای تشویق استفاده مداوم طراحی شده است، تعریف میکنند. اما رگه ها فراتر از یک معیار یا رکورد در یک برنامه هستند. روانی تر از آن است. غرایز انسان به راحتی با عوامل مناسب تحت تأثیر قرار می گیرند. به این سه عامل نگاه کنید: پیشرفت، غرور، و ترس از دست دادن (که معمولا FOMO نامیده می شود). همه اینها چه وجه مشترکی دارند؟ تلاش هرچه تلاش بیشتری برای چیزی انجام دهید، هویت شما را بیشتر شکل می دهد و اینگونه است که رگه هایی به دنیای روانشناسی رفتاری می رسد. اکنون، با قدرت زیاد، مسئولیت بزرگی به وجود می آید، و به همین دلیل، جنبه تاریکی برای رگه ها وجود دارد. در این مقاله، ما به روانشناسی، UX و اصول طراحی پشت ساخت یک سیستم موثر خطی خواهیم پرداخت. ما به (1) چرا مغز ما تقریباً به طور غریزی به فعالیت رگهای پاسخ میدهد، (2) نحوه طراحی رگهها به روشهایی که واقعاً به کاربران کمک میکند، و (3) کارهای فنی مربوط به ایجاد یک الگوی رگهای را بررسی خواهیم کرد. روانشناسی پشت رگه ها برای طراحی و ساخت یک سیستم رگه ای موثر، باید بدانیم که چگونه با نحوه سیم کشی مغز ما هماهنگ است. مثلاً، چه چیزی آن را تا حدی مؤثر میکند که ما اینقدر فداکاری شدید برای محافظت از رگههای خود احساس میکنیم؟ سه اصل جالب و مستند روانشناسی وجود دارد که از آنچه رگه ها را بسیار قدرتمند و اعتیاد آور می کند، پشتیبانی می کند. بیزاری از دست دادن این احتمالاً قوی ترین نیروی پشت رگه ها است. من این را می گویم زیرا اغلب اوقات، تقریباً نمی توانید از این در زندگی اجتناب کنید. این طور فکر کنید: اگر دوستی به شما 100 دلار بدهد، خوشحال خواهید شد. اما اگر 100 دلار از کیف پول خود را از دست بدهید، ضرر بیشتری خواهد داشت. وزن عاطفی آن موقعیت ها برابر نیست. از دست دادن بسیار بیشتر از به دست آوردن احساس خوبی دارد. بیایید آن را جلوتر ببریم و بگوییم که من 100 دلار به شما می دهم و از شما می خواهم که یک قمار بازی کنید. 50% احتمال برنده شدن 100 دلار دیگر و 50% احتمال از دست دادن 100 دلار اصلی وجود دارد. آیا آن را می گیرید؟ من نمی خواهم. اکثر مردم این کار را نمی کنند. این همان باخت گریزی است. اگر فکرش را بکنید، منطقی است، قابل درک است، انسانی است. مفهوم پشت از دست دادن گریزی این است که ما درد از دست دادن چیزی را دو برابر لذت به دست آوردن چیزی با ارزش یکسان احساس می کنیم. از نظر روانشناسی، ضرر بیشتر از سود باقی می ماند. احتمالاً می بینید که چگونه این به رگه ها مربوط می شود. برای ایجاد یک خط قابل توجه، به تلاش نیاز دارد. همانطور که یک رگه رشد می کند، انگیزه پشت آن شروع به محو شدن می کند. یا دقیق تر، شروع به ثانویه شدن می کند. در اینجا یک مثال آورده شده است: بگویید دوست شما یک دوره سه روزه دارد که "حلقه های حرکتی" خود را در ساعت اپل می بندد. آنها تقریباً چیزی برای از دست دادن ندارند جز اینکه بخواهند به هدف خود برسند و ثابت قدم باشند. در عین حال، شما یک رگه قابل توجه 219 روزه دارید. این احتمال وجود دارد که شما در دام ترس از دست دادن آن باشید. به احتمال زیاد در این مرحله به دستاورد فکر نمی کنید. این بیشتر در مورد محافظت از تلاش های سرمایه گذاری شده شما است و آن ضرر گریزی است. Duolingo توضیح می دهد که چگونه بیزاری از دست دادن به بی میلی کاربر برای شکستن یک رگه طولانی، حتی در تنبل ترین روزها کمک می کند. به نوعی، زمانی که بیزاری از دست دادن به وجود می آید، یک رگه می تواند به یک عادت تبدیل شود. مدل رفتار مه (B = MAP) اکنون که ترس از دست دادن تلاشهای انجام شده در رگههای طولانیتر را درک کردهایم، یک سوال دیگر این است: چه چیزی باعث میشود در وهله اول این کار را روز به روز، حتی قبل از اینکه رگه بزرگ شود، انجام دهیم؟ این همان چیزی است که مدل رفتاری فاگ در مورد آن است. نسبتا ساده است. یک رفتار (B) تنها زمانی رخ می دهد که سه عامل - انگیزه (M)، توانایی (A) و اعلان (P) - در یک لحظه همسو شوند. بنابراین، معادله B=MAP. اگر هر یک از این عوامل، حتی یکی، در آن لحظه وجود نداشته باشد، این رفتار اتفاق نخواهد افتاد. بنابراین، برای اینکه یک سیستم خطی کارآمد و تکرار شونده باشد، هر سه عامل باید وجود داشته باشند: انگیزه این شکننده است و چیزی نیست که به طور مداوم وجود داشته باشد. روزهایی هست که هستیبرای یادگیری زبان اسپانیایی تلاش می کنید، و روزها حتی ذره ای اراده برای یادگیری زبان احساس نمی کنید. انگیزه ایجاد یک عادت به خودی خود غیرقابل اعتماد است و از همان روز اول یک نبرد بازنده است. توانایی برای جبران محدودیت های انگیزه، توانایی بسیار مهم است. در این زمینه، توانایی به معنای سهولت عمل است، یعنی تلاش آنقدر آسان است که غیرواقعی است که بگوییم ممکن نیست. اکثر برنامه ها عمدا از این استفاده می کنند. Apple Fitness فقط به شما نیاز دارد که یک دقیقه در یک ساعت بایستید تا به هدف Stand خود برسید. Duolingo فقط به یک درس کامل نیاز دارد. این کارها به تلاش زیادی نیاز ندارند. مانع آنقدر کم است که حتی در بدترین روزها هم می توانید آن را انجام دهید. اما تلاش ترکیبی یک رگبار مداوم جایی است که ایده از دست دادن آن خط شروع می شود. PromptThis چیزی است که معادله را کامل می کند. انسان ها به طور طبیعی فراموشکار هستند، بنابراین بله، توانایی می تواند 90 درصد ما را به آنجا برساند. اما یک اعلان به ما یادآوری می کند که عمل کنیم. رگه ها با طراحی پایدار هستند، بنابراین به کاربران باید به طور مداوم یادآوری شود که عمل کنند. Duolingo برای اینکه بفهمد یک اعلان چقدر میتواند قدرتمند باشد، یک تست A/B انجام داد تا ببیند آیا یک نشان قرمز کوچک روی نماد برنامه باعث افزایش استفاده مداوم میشود یا خیر. باعث افزایش 6 درصدی در کاربران فعال روزانه شد. فقط یک نشان قرمز محدودیت های مدل با تمام این موارد، محدودیتی برای مدل فاگ وجود دارد که به موجب آن منتقدان و تحقیقات مدرن متوجه شدهاند که طراحی که به شدت به دستورات متکی است، مانند اعلانهای تهاجمی، خطر ایجاد خستگی ذهنی را به همراه دارد. اعلانهای مداوم و اضافه کاری میتواند باعث پرت شدن کاربران شود. بنابراین، مراقب آن باشید. اثر زیگارنیک وقتی یک پروژه را نیمه کاره رها می کنید چه احساسی دارید؟ این خیلی افراد را عصبانی می کند زیرا کارهای ناتمام فضای ذهنی بیشتری را نسبت به کارهایی که ما کامل می کنیم اشغال می کند. وقتی کاری انجام می شود و از بین می رود، ما تمایل داریم آن را فراموش کنیم. وقتی کاری انجام نشده رها می شود، روی ذهن ما سنگینی می کند. دقیقاً به همین دلیل است که محصولات دیجیتال از شاخصهای پیشرفت مصنوعی مانند نوار تکمیل نمایه Upwork استفاده میکنند تا به کاربر اطلاع دهند که نمایهاش فقط "60٪ کامل شده است". کاربر را وادار می کند تا کاری را که شروع کرده به پایان برساند.
بیایید به مثال دیگری نگاه کنیم. شما پنج کار در یک برنامه لیست کارها دارید و در پایان روز، فقط چهار مورد از آنها را به عنوان تکمیل شده بررسی می کنید. بسیاری از ما به دلیل همین یک کار ناتمام احساس ناتمام بودن می کنیم. همانجا، اثر زیگارنیک وجود دارد. اثر زیگارنیک توسط روانشناس بلوما زیگارنیک نشان داده شد، او توضیح داد که ما تمایل داریم کارهای ناتمام را بیشتر از کارهای انجام شده در حافظه خود فعال نگه داریم. الگوی رگه ای به طور طبیعی در طراحی UX به این موضوع کمک می کند. فرض کنید در روز 63 یک دوره یادگیری هستید. در آن مرحله، شما در یک الگوی مداوم از کار ناتمام هستید. مغز شما به ندرت آن را فراموش می کند زیرا در پشت ذهن شما قرار دارد. در این مرحله، مغز شما کسی است که برای شما اعلان ارسال می کند. وقتی این نیروهای روانشناختی را کنار هم قرار می دهید، متوجه می شوید که چرا streak ها فقط یک ویژگی عادی برنامه نیستند. آنها قادر به تغییر شکل رفتار انسان هستند. اما جایی در امتداد خط - نمی توانم دقیقاً بگویم چه زمانی، زیرا برای همه متفاوت است - همه چیز به جایی می رسد که یک رگه از "سرگرم کننده" به چیزی تبدیل می شود که احساس می کنید نمی توانید از دست بدهید. شما نمی خواهید 58 روز تلاش به هدر برود، درست است؟ این همان چیزی است که یک سیستم خطی را موثر می کند. اگر به درستی انجام شود، رگهها به کاربران کمک میکنند تا عادتهای خیرهکنندهای بسازند که به هدفی دست مییابد. این می تواند خواندن روزانه یا رفتن مداوم به باشگاه باشد. این اعمال تکراری (گاهی کوچک) با گذشت زمان ترکیب می شوند و در زندگی روزمره ما آشکار می شوند. اما هر سکه دو روی دارد. خط نازک بین عادت و اجبار اگر دنبال کرده اید، از قبل می توانید بگویید که یک جنبه تاریک برای سیستم های خطی وجود دارد. شکل گیری عادت در مورد سازگاری با یک هدف تکراری است. با این حال، اجبار، ثبات کار روی هدفی است که دیگر مورد نیاز نیست، اما از ترس یا فشار به آن ادامه میدهیم. این یک خط نازک به اندازه تیغ است. شما هر روز صبح بدون فکر مسواک می زنید. خودکار و غریزی است، با هدف واضح داشتن نفس خوب. این یک رگه است که یک عادت خوب را تشکیل می دهد. یک سیستم خط اخلاقی به کاربران فضایی برای نفس کشیدن می دهد. اگر به دلایلی صبح مسواک نمیزنید، میتوانید ظهر مسواک بزنید. نقص بدون ترس از دست دادن تلاش طولانی مجاز است. اجبار مسیر معکوس را طی می کند، به موجب آن یک رگه شما را مضطرب می کند، احساس گناه می کنید یا حتی خسته می شوید، و گاهی احساس می کنید علیرغم تمام کارهایتان هیچ کاری را انجام نداده اید.کار کردن شما نه به این دلیل که می خواهید، بلکه به این دلیل که ناخودآگاه از دیدن صفر شدن مجدد پیشرفت خود وحشت دارید. حتی یک نفر این را کاملاً توصیف کرد: "احساس میکردم که دارم تقلب میکنم، اما به سادگی اهمیتی نمیدادم. این نشان می دهد که رگه های نگهدارنده شدیدی که می تواند روی یک فرد داشته باشد. تا جایی که کاربران شروع به گره زدن ارزش خود به یک معیار دلخواه می کنند نه هدف یا دلیل اصلی که در وهله اول شروع به کار کردند. رگه تبدیل می شود به آنها که هستند، نه فقط کاری که انجام می دهند. یک سیستم خطی اخلاقی که به خوبی طراحی شده باشد باید برای کاربر تشویق باشد، نه فشار یا الزام. این به تعادل انگیزه درونی و بیرونی مربوط می شود. انگیزه بیرونی (پاداش بیرونی، اجتناب از تنبیه) ممکن است باعث شروع کار کاربران شود، اما انگیزه درونی (انجام کار برای یک هدف شخصی مانند یادگیری زبان اسپانیایی، زیرا واقعاً میخواهید با یکی از عزیزانتان ارتباط برقرار کنید) برای تعامل طولانیمدت قویتر است. یک سیستم خوب باید با استفاده دقیق از عناصر بیرونی به سمت انگیزه درونی گرایش پیدا کند، یعنی به کاربران یادآوری کند که تا کجا پیش رفته اند، نه اینکه آنها را با آنچه ممکن است از دست بدهند تهدید کند. باز هم خط ظریفی است. یک آزمایش ساده هنگام طراحی یک سیستم خطی این است که در واقع کمی زمان بگذارید و فکر کنید که آیا محصولات شما با فروش راه حل هایی برای اضطرابی که محصول شما ایجاد کرده است، درآمد کسب می کند یا خیر. اگر بله، احتمال زیادی وجود دارد که از کاربران سوء استفاده کنید. بنابراین سؤال بعدی این است که اگر من استفاده از streak را انتخاب کنم، چگونه آن را به گونهای طراحی کنم که واقعاً به کاربران در دستیابی به اهدافشان کمک کند؟ UX طراحی سیستم خوب استریک من معتقدم اینجا جایی است که اکثر پروژه ها یا یک سیستم رگه موثر را میخکوب می کنند یا به طور کامل آن را خراب می کنند. بیایید از طریق برخی از اصول UX یک طراحی خوب خطی بپردازیم. آن را بدون زحمت نگه دارید احتمالاً قبلاً این را شنیدهاید، شاید از کتابهایی مانند عادات اتمی، اما لازم به ذکر است که یکی از سادهترین راههایی که میتوان عادتها را شکل داد، کوچک کردن و آسان کردن این عمل است. این شبیه به فاکتور توانایی است که از مدل رفتاری فاگ بحث کردیم. اولین قانون هر طراحی رگه باید این باشد که اقدامات مورد نیاز را تا حد ممکن کوچکتر کنید و در عین حال پیشرفت داشته باشید. اگر برای انجام یک عمل روزانه نیاز به اراده داشته باشید، آن عمل از پنج روز گذشته نخواهد بود. چرا؟ شما نمی توانید پنج روز متوالی انگیزه داشته باشید. نمونه موردی: اگر یک برنامه مدیتیشن اجرا می کنید، نیازی نیست که کاربران را مجبور کنید یک جلسه 20 دقیقه ای را صرفاً برای حفظ این برنامه انجام دهند. در عوض یک دقیقه، شاید حتی چیزی به کوچکی سی ثانیه را امتحان کنید. به قول معروف، قطره های کوچک آب اقیانوس عظیمی را می سازد). تلاش های کوچک با گذشت زمان به دستاوردهای بزرگ تبدیل می شوند. این باید هدف باشد: اصطکاک را حذف کنید، به خصوص زمانی که ممکن است لحظه دشوار باشد. هنگامی که کاربران استرس دارند یا خسته هستند، به آنها بگویید که صرفاً ظاهر شدن، حتی برای چند ثانیه، به عنوان تلاش به حساب می آید. ارائه بازخورد بصری واضح انسان ها ذاتا بصری هستند. اغلب اوقات، برای باور کردن نیاز به دیدن چیزی داریم. این نیاز به تجسم چیزها برای درک بهتر آنها و در نظر گرفتن آنها وجود دارد. به همین دلیل است که الگوهای رگهای اغلب از عناصر بصری مانند نمودارها، علامتها، حلقههای پیشرفت و شبکهها برای تجسم تلاش استفاده میکنند. به نمودار مشارکت GitHub نگاه کنید. این یک تجسم ساده از سازگاری است. با این حال توسعه دهندگان آن را مانند اکسیژن تنفس می کنند.
نکته کلیدی این است که یک سیستم خطی را انتزاعی نکنید. باید احساس واقعی و کسب درآمد داشته باشد. به عنوان مثال، حلقههای فعالیت تناسب اندام Duolingo و Apple از طرحهای انیمیشن تمیز پس از تکمیل یک رگه استفاده میکنند، و GitHub دادههای تاریخی ثبات کاربر را در طول زمان نشان میدهد.
از زمان بندی خوب استفاده کنید قبلاً اشاره کردم که انسان ها عموماً ذاتاً فراموشکار هستند و اخطارها می توانند به حفظ حرکت رو به جلو کمک کنند. بدون درخواست، اکثر کاربران جدید فراموش می کنند که به کار خود ادامه دهند. زندگی ممکن است شلوغ شود، انگیزه ناپدید شود و اتفاقاتی بیفتد. حتی کاربران طولانی مدت نیز از اعلانها سود میبرند، اگرچه اغلب اوقات، آنها قبلاً در حلقه عادت قفل شدهاند. با این وجود، حتی متعهدترین فرد ممکن است به طور تصادفی یک روز را از دست بدهد. سیستم رگه شما قطعاً به یادآوری نیاز دارد. پرکاربردترین یادآورهای سریع، اعلان های فشاری هستند. هنگام کار با اعلانهای فشاری، زمان واقعاً مهم است. نوع برنامه نیز مهم است. ارسال یک اعلان در ساعت 9 صبح با گفتن "شما امروز تمرین نکرده اید" برای یک برنامه یادگیری عجیب است زیرا بسیاری از آنها قبل از اینکه حتی به اتمام یک درس فکر کنند کارهایی را در روز انجام می دهند. اگر ما در مورد یک برنامه تناسب اندام صحبت می کنیم، آن رامنطقی است و شاید حتی انتظار می رود که در اوایل روز یادآوری شود. اعلانهای فشاری بر اساس دستهبندی برنامه بهطور قابل توجهی متفاوت هستند. برای مثال، برنامههای تناسب اندام با اعلانهای صبح زود (7 تا 8 صبح) تعامل بیشتری را مشاهده میکنند، در حالی که برنامههای بهرهوری ممکن است در اوایل ظهر عملکرد بهتری داشته باشند. نکته کلیدی این است که A/B زمان بندی برنامه خود را بر اساس رفتارهای کاربران خود آزمایش کنید نه اینکه فرض کنید همه چیز برای همه یکسان است. آنچه برای یک برنامه مدیتیشن کار می کند ممکن است برای یک ردیاب کدنویسی کار نکند. سایر روشهای سریع، نقاط قرمز روی نماد برنامه و حتی ویجتهای برنامه هستند. مطالعات متفاوت است، اما افراد به طور متوسط بین 50 تا 150 بار در روز قفل دستگاه خود را باز می کنند (PDF). اگر کاربر هر بار که قفل گوشی خود را باز می کند، نقطه قرمزی را روی یک برنامه یا ویجت ببیند که نشان دهنده یک خط فعلی است، تعهد را افزایش می دهد. فقط زیاده روی نکنید؛ اعلان باید به عنوان یک یادآوری باشد، نه یک نق زدن. نقاط عطف را جشن بگیرید یک سیستم streak باید سعی کند نقاط عطف را جشن بگیرد تا احساسات را دوباره شعله ور کند، به خصوص برای کاربرانی که عمیقاً در یک رگه هستند. هنگامی که یک کاربر روز 7، روز 30، روز 50، روز 100، روز 365 را میزند، باید کار بزرگی انجام دهید. دستاوردها را به رسمیت بشناسید - به ویژه برای کاربران طولانی مدت.
همانطور که قبلا دیدیم، Duolingo متوجه این موضوع شد و یک گرافیک متحرک اجرا کرد که نقاط عطف را با کانفتی جشن می گیرد. برخی از پلتفرمها حتی پاداشهای پاداش قابل توجهی را میدهند که تلاشهای کاربران را تأیید میکند. و این می تواند برای برنامه ها مفید باشد، به طوری که کاربران تمایل دارند نقاط عطف خود را به صورت عمومی در رسانه های اجتماعی به اشتراک بگذارند. مزیت دیگر این است که قبل از رسیدن به نقاط عطف پیش بینی می شود. این فقط زنده نگه داشتن خط بی پایان نیست. کاربران چیزی برای انتظار دارند. از مکانیزم های گریس استفاده کنید زندگی غیر قابل پیش بینی است. مردم حواسشان پرت می شود. هر سیستم خط خوب باید انتظار نقص را داشته باشد. یکی از بزرگترین تهدیدات روانی برای سیستم streak، بازنشانی سخت به صفر پس از تنها یک روز از دست رفته است. یک سیستم خطی «اخلاقی» باید کمی سستی را برای کاربر فراهم کند. فرض کنید یک دوره 90 روزه یادگیری شطرنج دارید. شما سه ماه خوب ثابت بودید، و یک روز، تلفن شما در سفر می میرد، و دقیقاً به همین ترتیب، 90 تبدیل به 0 می شود - همه چیز، تمام آن تلاش، پاک می شود و پیشرفت ناپدید می شود. کاربر ممکن است کاملاً ویران شود. فکر بازسازی آن از ابتدا به قدری تضعیف کننده است که تلاش ارزشش را ندارد. در بدترین حالت، ممکن است کاربر پس از احساس شکست، برنامه را رها کند. اضافه کردن یک مکانیسم "فیض" را به سیستم خط خود در نظر بگیرید:
Streak Freeze به کاربران این امکان را می دهد که عمداً یک روز را بدون جریمه از دست بدهند. زمان اضافی اجازه دهید چند ساعت (2 تا 3) از ضرب الاجل معمول قبل از شروع بازنشانی گذشته باشد. مدلهای پوسیدگی بهجای بازنشانی سخت، رگه به مقدار کمی کاهش مییابد، به عنوان مثال، 10 روز از رگه به ازای هر روز از دست رفته کم میشود.
از لحن تشویقی استفاده کنید بیایید دو پیام نمایش داده شده به کاربران را در هنگام شکستن یک خط مقایسه کنیم:
"شما 42 روزه خود را از دست دادید. از نو شروع کنید." "شما 42 روز متوالی حاضر شدید. این پیشرفت باورنکردنی است! می خواهید دوباره امتحان کنید؟"
هر دو اطلاعات یکسانی را منتقل می کنند، اما تأثیر احساسی متفاوت است. اولین پیام به احتمال زیاد باعث می شود که کاربر احساس تضعیف کند و او را ترک کند. پیام دوم آنچه قبلاً به دست آمده را جشن می گیرد و به آرامی کاربر را تشویق می کند تا دوباره تلاش کند. چالش های طراحی سیستم های خطی قبل از اینکه به مشخصات فنی ساخت یک سیستم خطی بپردازیم، باید از چالش هایی که ممکن است با آن روبرو شوید آگاه باشید. همانطور که انتظار دارید همه چیز می تواند پیچیده شود. مدیریت مناطق زمانی دلیلی وجود دارد که مدیریت زمان و تاریخ یکی از دشوارترین مفاهیمی است که توسعه دهندگان با آن سروکار دارند. قالببندی، بینالمللیسازی و موارد دیگر وجود دارد که باید در نظر گرفته شود. بگذارید این را از شما بپرسم: چه چیزی یک روز محسوب می شود؟ ما می دانیم که جهان در مناطق زمانی مختلف اجرا می شود، و گویی این کافی نیست، برخی از مناطق دارای ساعت تابستانی (DST) هستند که دو بار در سال اتفاق می افتد. از کجا شروع به کار با این موارد لبه می کنید؟ چه چیزی به عنوان "شروع" فردا به حساب می آید؟ برخی از توسعه دهندگان سعی می کنند با استفاده از یک منطقه زمانی مرکزی مانند UTC از این امر جلوگیری کنند. برای برخی از کاربران، این می تواند نتایج صحیحی را به همراه داشته باشد، اما برای برخی، ممکن است یک ساعت، دو ساعت یا بیشتر خاموش باشد. این ناهماهنگی تجربه کاربر را خراب می کند. کاربران کمتر اهمیت می دهند که شما چگونه زمان پشت صحنه را اداره می کنید. تنها چیزی که آنها انتظار دارند این است که اگر یک عمل رگه ای را در ساعت 11:40 بعد از ظهر انجام دهند، باید دقیقاً در آن زمان و در زمینه آنها ثبت شود. شما باید «یک روز» را بر اساس منطقه زمانی محلی کاربر تعریف کنید، نه زمان سرور. مطمئنا، شما می توانید به راحتی انجام دهیدمسیریابی و تنظیم مجدد رگه ها در سطح جهانی برای همه کاربران در نیمه شب UTC، اما شما به شدت ناعادلانه ایجاد می کنید. یک نفر در کالیفرنیا نسبت به کسی که در لندن زندگی می کند همیشه هشت ساعت اضافی برای انجام وظیفه خود دارد. این یک نقص طراحی ناعادلانه است که کاربران خاصی را به دلیل موقعیت مکانی آنها مجازات می کند. و اگر آن شخص در لندن فقط در حال بازدید باشد، یک کار را انجام دهد، سپس به منطقه زمانی دیگری برگردد، چه؟ یکی از راهحلهای مؤثر برای همه این موارد این است که از کاربران بخواهیم به صراحت منطقه زمانی خود را در حین ورود (ترجیحاً پس از اولین تأیید هویت) تنظیم کنند. ایده خوبی است که یک یادداشت ظریف درج کنید که ارائه اطلاعات منطقه زمانی فقط برای ردیابی دقیق پیشرفت برنامه به جای استفاده به عنوان داده های قابل شناسایی شخصی استفاده می شود. و این ایده خوب دیگری است که آن را به یک تنظیم قابل تغییر تبدیل کنید. من به هر کسی پیشنهاد میکنم از مدیریت مستقیم منطق منطقه زمانی در یک برنامه خودداری کند. از کتابخانه های تاریخ آزمایش شده و واقعی مانند Moment.js یا Pytz (Python) و غیره استفاده کنید. نیازی به اختراع مجدد چرخ برای چیزی به این پیچیدگی نیست. روزهای از دست رفته و موارد لبه چالش دیگری که باید نگران آن باشید موارد لبه غیرقابل کنترل مانند خواب بیش از حد کاربران، خرابی سرور، تاخیر، خرابی شبکه و غیره است. استفاده از ایده مکانیسمهای لطف، مانند مواردی که قبلاً در مورد آن صحبت کردیم، میتواند کمک کند. یک فرصت دو ساعته ممکن است به کاربر و توسعه دهنده کمک کند، به این معنا که کاربران به دلیل شرایط غیرقابل کنترل زندگی به شدت مجازات نمی شوند. برای توسعه دهندگان، پنجره های گریس در آن لحظات غیرقابل کنترلی که سرور در نیمه شب از کار می افتد، مفید است. مهمتر از همه، هرگز به مشتری اعتماد نکنید. همیشه در سمت سرور اعتبارسنجی کنید. سرور باید تنها منبع حقیقت باشد. پیشگیری از تقلب باز هم، من نمی توانم به اندازه کافی روی این موضوع تاکید کنم: مطمئن شوید که همه چیز سمت سرور را تأیید کنید. کاربران انسان هستند و اگر فرصت داده شود ممکن است انسان ها تقلب کنند. اجتناب ناپذیر است. ممکن است امتحان کنید:
ذخیره تمام کنشها با مُهرهای زمانی UTC. مشتری میتواند زمان محلی خود را ارسال کند، اما سرور میتواند فوراً آن را به UTC تبدیل کرده و در برابر زمان سرور اعتبارسنجی کند. به این ترتیب، اگر مهر زمانی مشتری به طور مشکوکی دور باشد، سیستم می تواند آن را به عنوان یک خطا رد کند، و UI می تواند مطابق با آن پاسخ دهد. با استفاده از ردیابی مبتنی بر رویداد. به عبارت دیگر، یک رکورد از هر اقدام با ابرداده از جمله اطلاعاتی مانند شناسه کاربر، نوع عملکرد انجام شده، و مهر زمانی و منطقه زمانی ذخیره کنید. این به اعتبار سنجی کمک می کند.
ساخت موتور سیستم Streak این یک آموزش کد نیست، بنابراین من از ریختن یک سری کد روی شما اجتناب می کنم. من این را عملی نگه میدارم و توضیح میدهم که چگونه کارها به طور کلی یک موتور سیستم خطی را از نظر معماری، جریان و قابلیت اطمینان کار میکنند. معماری هسته همانطور که چندین بار گفته ام، سرور را تنها منبع حقیقت برای داده های خطی قرار دهید. معماری می تواند چیزی شبیه به این روی سرور باشد:
داده های هر کاربر را در یک پایگاه داده ذخیره کنید. ذخیره رگه فعلی (به طور پیش فرض به عنوان 0) به عنوان یک عدد صحیح. اولویت منطقه زمانی، یعنی رشته منطقه زمانی IANA را ذخیره کنید (به طور ضمنی از مهر زمانی محلی یا به طور صریح با درخواست از کاربر برای انتخاب منطقه زمانی خود). به عنوان مثال، "America/New_York". با بررسی منطقه زمانی که نسبت به منطقه زمانی محلی کاربر است، همه منطق را مدیریت کنید تا مشخص کنید که آیا این خط ادامه دارد یا می شکند.
در همین حال، در سمت مشتری:
نمایش رگه فعلی که معمولاً از سرور واکشی می شود. اقدام انجام شده را در قالب ابرداده به سرور ارسال کنید تا تأیید کنید آیا کاربر واقعاً یک اقدام خطی واجد شرایط را انجام داده است یا خیر. ارائه بازخورد بصری بر اساس پاسخ های سرور.
بنابراین، به طور خلاصه، مغز روی سرور است و مشتری برای اهداف نمایش و ارسال رویدادها است. این کار شما را از بسیاری از خرابی ها و موارد لبه نجات می دهد، به علاوه به روز رسانی و رفع مشکل را آسان تر می کند. جریان منطقی بیایید مروری بر نحوه عملکرد یک موتور سیستم خطی با حداقل کارآمدی زمانی که کاربر یک اقدام را انجام میدهد، شبیهسازی کنیم:
کاربر یک اقدام خط مقدماتی را تکمیل می کند. مشتری یک رویداد را به عنوان ابرداده به سرور ارسال می کند. این میتواند «کاربر X عملکرد Y را در مُهر زمانی Z انجام داد» باشد. سرور این رویداد را دریافت می کند و اعتبار سنجی اولیه را انجام می دهد. آیا این کاربر واقعی است؟ آیا آنها احراز هویت شده اند؟ آیا عمل معتبر است؟ آیا منطقه زمانی سازگار است؟ اگر این اتفاق بیفتد، سرور داده های نوار کاربر را از پایگاه داده بازیابی می کند. سپس، مهر زمانی اقدام دریافتی را به منطقه زمانی محلی کاربر تبدیل کنید. به سرور اجازه دهید تاریخ های تقویم (نه مهرهای زمانی) را در منطقه زمانی محلی کاربر مقایسه کند: اگر همان روز باشد عمل زائد است و تغییری در آن ایجاد نمی شودرگه. اگر روز بعد باشد، رگه گسترش می یابد و 1 افزایش می یابد. اگر بیش از یک روز فاصله وجود داشته باشد، خط شکسته می شود. با این حال، اینجا جایی است که می توانید مکانیک فضل را اعمال کنید. اگر مکانیسم لطف از دست رفته است، رگه را به 1 بازنشانی کنید.
اگر انتخاب میکنید که دادههای تاریخی را برای دستاوردهای نقطه عطف ذخیره کنید، سپس متغیرهایی مانند «طولانیترین خط» یا «کل روزهای فعال» را بهروزرسانی کنید. سپس سرور پایگاه داده را به روز می کند و به مشتری پاسخ می دهد. چیزی شبیه این:
{ "current_streak": 48، "طولانی ترین_رگه": 50، "Total_active_days": 120، "streak_extended": درست است، }
به عنوان یک اقدام دیگر، سرور باید یا دوباره امتحان کند یا آن را رد کند و هنگامی که هر چیزی در طول فرآیند شکست خورد، به مشتری اطلاع دهد. ساختمان برای تاب آوری همانطور که قبلا ذکر شد، از دست دادن یک سری از کاربران به دلیل باگ یا از کار افتادن سرور، UX وحشتناکی است و کاربران انتظار ندارند که پاییز را قبول کنند. بنابراین، سیستم streak شما باید محافظ هایی برای آن سناریوها داشته باشد. اگر سرور به دلیل تعمیر و نگهداری (یا هر دلیل دیگری) از کار افتاده است، در نظر بگیرید که یک پنجره موقت از ساعت های اضافی را برای رفع مشکل در نظر بگیرید تا اقدامات دیر ارسال شوند و همچنان حساب شوند. همچنین میتوانید انتخاب کنید که به کاربران اطلاع داده شود، بهویژه اگر وضعیت بتواند بر یک رگههای مداوم تأثیر بگذارد. توجه: یک درب پشتی مدیریت ایجاد کنید که در آن داده ها به صورت دستی بازیابی شوند. اشکالات اجتناب ناپذیر هستند، و برخی از کاربران با برنامه شما تماس می گیرند یا برای پشتیبانی از اینکه خط آنها به دلیلی که قادر به کنترل آنها نبودند شکسته می شود، تماس می گیرند. اگر پس از بررسی، حق با کاربر باشد، باید بتوانید به صورت دستی رگه ها را بازیابی کنید. نتیجه گیری یک چیز روشن است: رگه ها به دلیل نحوه عملکرد روانشناسی انسان در سطح اساسی واقعاً قدرتمند هستند. بهترین سیستم خطی موجود، سیستمی است که کاربران آگاهانه به آن فکر نمی کنند. این به یک روال نتایج فوری یا پیشرفت قابل مشاهده تبدیل شده است، مانند مسواک زدن که به یک عادت عادی تبدیل می شود. و من فقط این را می گویم: همه محصولات به یک سیستم خطی نیاز ندارند. آیا واقعاً فقط به این دلیل که کاربران فعال روزانه می خواهید، باید ثبات را مجبور کنید؟ پاسخ ممکن است به خوبی "نه" باشد.