من طرفدار شبکههای اجتماعی نیستم. بارها در این مورد نوشتم، مثلا اینجا اینجا اینجا و اینجا. ساختاری که این شبکه ها برای ایجاد اعتیاد در ما استفاده میکنند رو میشناختم و میخواستم با مهندسی معکوس از همون ساختار استفاده کنم تا ترک کردن این شبکهها رو حداقل برای خودم راحتتر کنم.
نتیجهی اون شد دیتاکسیوم. یه اپ اندرویدی که با استفاده گیمیفیکیشن فرایند عادتی که شبکههای اجتماعی بوجود میآرند رو میشکنه و کمک میکنه کمتر برای دست کشیدن از اون شبکهها اذیت بشیم.
به زبون خیلی ساده، دیتاکسیوم یک ویجت کاملا شبیه به آیکون شبکهی اجتماعی که شما میخواید ازش خلاص بشید روی صفحهی اصلیتون میسازه اما با کلیک روی اون به جای وارد شدن به اون شبکه وارد دیتاکسیوم میشید یه روتین کوچیک تقریبا اعتیاد آور انجام میدید و بعد رها میشید.جلوتر بیشتر توضیح میدم.
[WPGP gif_id="1193" width="600"]
حقیقتش اینه که من مطلقا هیچگونه قصد بیزنسی در مورد دیتاکسیوم ندارم و جامعه استفاده کنندگانش رو زیر صد نفر در نظر گرفتم و خب خبر واضح اینه که رایگان و اپن سورسه، تبلیغات نداره و همچنین هیچ نیازی به مارکتینگ و تبلیغش نیست، اگر حس کردید کمکتون میکنه میتونید دانلود کنید و استفاده کنید.
انگیزهی اصلیم در مورد انجام دادن پروژه بیشتر پیاده سازی ۱)سیستم گیمیفیکیشن ساده و ۲) داشتن یک پروژهی اپن سورس اندروید که از دگر۲ و ریاکتیوپروگرمینگ و تا احد امکان کامپوننت های جدید گوگل استفاده میکنه و تحت معماری ام وی پی نوشته شده تا برای مینی کورسهایی که احتمالا دربارهی این موضوعات درست خواهم کرد کمک دستم باشند.
در ادامه فرایند تولیدش رو توضیح میدم چرا که شفافیت پدرمادر همهی خوبیهاست. به دو بخش تقسیمش میکنم، در بخش اول سیستم گیمیفیکیشنش رو میشکافم و در بخش دوم در این که از نظر فنی چه اتفاقی افتاده غور میکنیم. فکر میکنم خوندشون خالی از لطف نباشه.
گیمیفیکیشن
سیستم بازیسازی خیلی از شبکههای اجتماعی ساده کار میکنه. در واقع پیادهسازی کمی پیچیدهتری هست از همون چرخهی عادتی که بارها صحبتش رو انجام دادیم.

چرخهی عادت از سه بخش تشکیل شده:
۱)نشانه: شما آیکون توییتر رو میبینید و دلتون دوپامین توییتهای جدید میخواد، شما آیکون اینستاگرام رو میبینید ودلتون اون نوتفیکیشن قرمز رو میخواد. شما میرید لب پنجره و دلتون سیگار میخواد. شما براتون یک سوال پیش میاد بلافاصله یاد گوگل میفتید. به اینها میگن نشانه، میتونه بیرونی باشه یا درونی، اکسترنال یا اینترنال.
۲) روتین: شما بعد از دیدن نشانه یک فعالیتی رو انجام میدید. اپ رو باز میکنید. در گوگل سرچ میکنید. پاکت سیگار رو برمیدارید و سیگار رو روشن میکنید و قس الی هذه.
۳) جایزه: نقطهی کانونی داستان اینجاست. اونجا که تو ذهنتون دوپامین ترشح میشه بخاطر دیدن این که کراشتون تو توییتر ریتوییتون کرده یا لایک فلانی روی فلان عکس اینستاگرامتون(یا مثلا دوز دوپامین کامنت تو اینستاگرام یادمه بیشتر بود اون زمان که اکانت داشتم) یا مثلا اون حس آرامشی که نیکوتین سیگار میده. اینا همه پاداش هایی هستند که این چرخه رو کامل میکنند و اعتیاد ایجاد کنند.
اما خب شرکتهای تکنولوژی خبیثتر از این هستند که به همین چرخه اکتفا کنند، و یکسری عناصردیگه به این چرخه اضافه میکنند تا مطمئنشن قلابشون طعمه رو گرفته.
۴)اولین و مهمترین چیزی که به چرخهی عادت اضافه میکنند، پیشبینی ناپذیر کردن جایزه هست. ظاهرا نه تنها ما بلکه تمام موجوداتی که تونستیم تو آزمایشگاه روشون آزمایش کنیم، به چرخههای تصادفی علاقهی بیشتری نشون میدن به نسبت چرخههای قابل پیشبینی. شما هردفعه که اینستاگرام رو باز میکنید مطمئن نیستید که قراره جایزه بگیرید، ممکنه توییت کنید و هیچ انتراکشنی نبینید و اما همونقدر هم ممکنه که توییتی کنید و بیاید ببینید وایرال شده. همین باعث میشه به توییت کردن معتاد بشیم. این غیرقابل پیشبینی بودن هستهی همون فرایندیه که قمار رو تبدیل به یک کار خطرناک و اعتیادآور میکنه وگرنه یه شرط بندی ریز که این حرفارو نداره.
۵) عنصر دیگهای که به سرویسهاشون اضافه میکنند برای نگه داشتن ما، ایجاد کردن توهم سرمایه گذاری هست. با خودمون میگیم اوه من در توییتر هزارتا فالور دارم، تاحالا ده هزارتا توییت کردم چطوری میتونم ترکش کنم؟ من همهی خاطرات سالهای گذشتهم رو توی اینستاگرام ریختم چطوری ببندمش؟ { اینجور مواقع من خودم به این که در هرحال یه روز میمیرم فکر میکنم و این که هیچکس اونقدری که ممکنه توهمش رو داشته باشم در مورد من فکر نمیکنه و اهمیتی نمیده که فلان اکانتم رو پاک کنم یا نه}. کلید سرمایه گذاری اعداد هستن همون اعدادی که تحت عنوان فالوور، فالووینگ تعداد پست بالای هراکانت کنار عکس زیبای خودمون میبینیم.
۶) عنصر آخر هم مرتبط بودنه. شبکههای اجتماعی سعی میکنند به شخص خود ما مرتبط باشند، دوستانمون رو بهمون نشون بدند. اگر کسی چیزی دربارهی ما گفت سریع بهمون اطلاع بدند. ارجاع میدم به یک سکانس از فیلم سوشال نتورک فینچر، زاکربرگ (قبل از ساخت فیسبوک) میگه دنبال یک ایدهام که آدمها رو به خودشون نشون بدم. آدمها عاشق اینن که خودشون رو ببینند و بعد فیسمش رو میسازه.
پرانتز طولانی: مضرترین بخش چرخهی عادت روتین هست. نه جایزه. کسی با آرامش بعد سیگار مشکلی نداره اما مشکل اصلی هزینهای هست که بابت اون آرامش میدیم و ریههامون رو داغون میکنیم. ترشح دوپامین تو مغز ضامن سلامت روانمونه اما ساعتها وقت تلف کردن در اینستاگرامه که مضره.
خب پرحرفی بسه، دیتاکسیوم چطوری میخواد جلوی این فرایند پر خط و خال بایسته؟
بهترین راه ترک عادت، ول کردن ناگهانی اون یا ول کردن تدریجی اون نیست، بهترین راه ترک عادت اینه که نشانه و جایزه رو نگه داریم اما روتین رو عوض کنیم. این رو من نمیگم، این رو آقای چارلز داهیگ تو کتاب قدرت عادت میگه. بذارید بیشتر توضیح بدم.
اگر سیگاری هستید نشانه شما ممکنه سیری بعد ناهار باشه، اوکی مشکلی نداره اما به جای سیگار کشیدن روتین رو عوض کنید، برید چوب شور مصرف کنید(یه آرامش عجیبی به ادم دست میده بعدش: )
همهي کاری که دیتاکسیوم انجام میده اینه که جای نشانه و پاداش میشینه اما روتین رو عوض میکنه.
۱)شما در ابتدا همونطوری که در گیف بالا میبینید یک ویجت شبیه به شبکهی اجتماعی که میخواید ترکش کنید میسازید. این میشه نشانه. مغزتون گوشی رو آنلاک میکنه میخواد تلگرام رو چک کنه. رو آیکون تلگرام کلیک میکنه و میره تو یک اپ دیگه.
۲)فرایند تو دیتاکسیوم خیلی شبیه به شبکههای اجتماعیه، هردفعه که شما اپ رو باز میکنید تعداد غیرقابل پیشبینی نوتفیکیشن دارید، این نوتفیکیشنها تعداد شانسهای شما هستند برای انجام یک بازی کوچیک. بازی چی هست؟ کلیک کردن روی یک انیمیشن.


۳)وقتی روی دکمه کلیک میکنید دوتا اتفاق میفته، بسته به شانس یا تلاشتون ناموفقه که صفحه قرمز میشه و ازتون میخواد که دوباره تلاش کنید و یا تلاش موفقیت آمیزه که وصل میشه به سرور و جایزهتون که یک گفتار از یکی از بزرگان تاریخ هست رو براتون نمایش میده: )
(صفحه سبز میشه، ویبره میزنه و بعد باتوم شیت میاد بالا از اون پایین)

خب، تقریبا ساده بود، شما نشانه دیدید روتین انجام دادید و پاداش گرفتید در کمتر از یک دقیقه(همین فرایند در توییتر یا اینستاگرام میتونن تا ساعتها طول بشن)
ما تا اینجا چهارتا از عناصر گیمیفیکیشن رو پیاده کردیم، نشانه(لوگو)، روتین(بازی ساده با انیمیشن)، پاداش (ویبره،سبز شدن صفحه و گرفتن گفتار)، غیرقابل پیشبینی بودن (تعداد شانسهای بازی و موفق بودنشون برتوابع رندوم بنا شده).
میمونه بخش سرمایه گذاری. آیا یوزر میتونه اینجا سرمایه گذاری کنه؟ تقریبا. در بخش آرشیو زمان به یوزر تعداد بارهایی که دیتاکسیوم رو به جای هر اپ باز کرده رو نشون میدیم و محاسبه میکنیم اگر اون اپها رو باز کرده بود چقدر از وقتش تلف شده بود و الان چقدر ذخیره کرده(زیاد دقیق نیست). و در بخش آرشیو کلام هم گفتارهایی که یوزر بدست آورده و براش جذاب هست رو ذخیره کردیم که میتونه اونها رو مدیریت کنه(در یک اپ که واقعا قراره پول دربیاره مشخصا نیاز به لنگرهای محکمتری داریم اما فعلا همین برای ما کفایت میکنه)

در نهایت فوت کوزهگری هم این که، اگر فرایند گیمیفیکیشن طراحی میکنیم یادمون باشه که یوزر باید جایزههای اولیهش رو خیلی سریع بگیره و پابند بشه توی اپ. پس اولین تلاشها همیشه باید موفقیت آمیز باشند. میگن قماربازهای حرفهای وقتی میبینن یه نوب اومده سر میز، میذارن دست اول رو ببره : )
دو نکته:
الف) یکی از مهمترین بخشهای گیمیفیکیشن رو پیاده نکردیم. شخصی سازی و ارتباط داشتن. یوزر در اپ ما چیزی که مستقیما مرتبط به خودش باشه نمیبینه(مگه این که یهو نیچه برگرده مستقیم باهاش صحبت کنه: ) ) و همین باعث میشه اعتیادی براش ایجاد نشه. دوتا دلیل داره پیاده نشدن این موضوع تو اپ. یک) راه حل سادهای براش پیدا نکردم و پیاده کردنش غیرمنطقی میکرد تولید اپ رو ۲) نمیخوایم که یوزر واقعا معتاد شه، میخوایم از شر این بلای خانمان سوز راحت شه: )
ب) یادآوری دوباره دربارهی این که این اپی نیست که به قصد منافع مستقیم تولید شده باشه و هدف اصلی پیاده سازی یه سری چیزا بوده که تو ذهن خودم بوده لذا اگر فرایند در شان یک سرویس واقعی نیست بر من ببخشایید.
فنی:
برای دپندنسی اینجکشن از دگر۲ استفاده کردم، فورک گوگل: ). نظر شخصیم؟ به عنوان کسی که علاقهی زیادی داره روی هرچیزی یه لایه ابسترکت بکشه و زیاد دربارهی معماری فکر کنه دگر رو دوست دارم اما واقع گرایانه اگر نگاه کنیم زیادی بویلرپلیت داره و پیادهسازی این پترن میتونه سادهتر هم باشه. ایشاا... که آقای جیک وارتون بعدا یه فکر میکنه براش: ))
دونکته دربارهی دگر.
یک) چون تو پکیج di یه زیرمجموعه به اسم اسکوپ دارم گفتم شاید بد نباشه توضیح بدم که چرا از سینگلتون استفاده نکردم.تو سمپلهای اوپن سورس داخلی که از پیاده سازی دگر دیدم دیدم که @Singleton رو به اشتباه به جای اسکوپ ها واقعی استفاده میکنند. این کار اشتباهه چون سینگلتون یهدونه ابجکت در سطح اپلیکیشن ایجاد میکنه و نه اکتیویتی و فرگمنت و همین پتانسیل مموری لیک داره، بهتره که برای هراکتیویتی یا فرگمنتمون و دپندنسیهاشون اسکوپ های جداگانه ایجاد کنیم. احتمالا ویدیو در مورد دگر ضبط کنم و اونجا جزئیات رو توضیح بدم ولی خب ساده ست در کل به همون پکیج di میشه رجوع کرد.
دو) من بدلیل تسلط پایینم به دگر یه اشتباه تو پیاده سازیش انجام دادم(یا حداقل فکر میکنم که اشتباهه) تقریبا برای هر اکتیویتی و فرگمنت یه کامپوننت جدا ساختم(چون حداقل به یه پرزنتر اختصاصی وابستگی دارن هرکدومشون) تنبلی کردم و روش بهتری رو نگشتم پیدا کنم اما فکر میکنم ساب کامپوننت ها روال باشن برای این هدف. میذارم تو لیست تودوهای رپو. پول رکوئست را روی چشممان میگذاریم: ).
برای ویو اینجکشن از باترنایف استفاده کردم که چیز عجیبی نیست.
برای نتورک از رتروفیت استفاده کردم، احمد طهانی یه دورهی خوب تو فرانش دربارهی رتروفیت داره اگر یاد ندارید میتونید بهش رجوع کنید. چرا رتروفیت؟ به نظرم حتا خود گوگل هم والی رو رها کرده و خب چه کاریه کاسهی داغتر از آش بشیم؟
برای دیتابیس از کامپوننت روم که گوگل جدیدا معرفی کرده استفاده کردم. خیلی چیز بامزه و راه دستیه. مثل او آر ام های دیگه ست تقریبا و نکتهی پیچیدهای نداشت واقعا جز این که حین ساخت اپ کامپوننت ها از حالت آزمایشی دراومدن و نسخهی یکشون ریلیز شد و منم گریلدم رو اپدیت کردم همین: ).
وسط پروژه البته اندروید استودیو و گردل رو هم اپدیت کردم که مشکل خاصی بوجود نیاورد. ضمنا از جاوا ورژن هشت واقعی هم اندروید استودیو پشتیبانی میکنه و من پروژه رو اپدیت کردم که ازش استفاده کنی. کلی لامبدا و اینا ریختم تو کدا بعدش : )))
از RxJava RxAndroid & RxBinding استفاده کردم. در واقع نظر شخصیم اینه که استفاده از این عزیزان برای دیتاکسیوم Overengineering هست اما برای مقاصد آموزشی ازشون استفاده کردم. خیلی خیلی باحالن، اصلا هم سخت نیستند، و اگر قسمت باشه یه ویدیو نه چندان بلند درموردشون ضبط میکنم. (متاسفانه حجم اپ رو حدود یک مگابایت افزایش دادند این دوستان، منطقی بود که حذفشون کنم وقتی استفادهی چندانی نداشتند اما دلم نیومد، بخاطر تقریبا ۴ مگابایتی بودن apk من رو مقصر ندونید خیلی از بهینهسازیهای معقول رو انجام دادم روش)
معماری هم که از یه نوع من تقریبا من درآوردی از ام وی پی رو پیاده کردم، اول این رو بگم که پکیج بندی رو بر اساس فیچر انجام دادم که به نظرم معقولتر از پکیج بندی بر اساس نوع فایلهاست ( تو مدیوم یکی نوشته بود این که فایلها چون از یه نوعند رو بذاری توی یک پکیج مثل اینه که تو شرکت برنامه نویس ها و دیزاینر ها رو بذاری تو تیم های جدا چون نوعشون فرق میکنه)
برای هر فرگمنت و اکتیویتی یک اینترفیس کانترکت تعریف کردم. که توش برای ویو و پرزنتر و اینتراکتور اینترفیسهای جدا تعریف شده.
مطلقا هیچ چیز اندرویدی تو پرزنتر نیست و همچنین تا جایی که شد بیزنس لاجیک رو نریختم تو ویو ها. کجاش من درآوردیه؟ این که برای هر فرگمنت یه اینتراکتور جدا تعریف کردم. اساسا ایدهی اینتراکتور تک مسئولیتی بودن هست اما اینجا به نظرم اینجوری کارآمدتر میومد: ))
بیزنس لاجیک ها همه تو اینتراکتورها هستند، و فقط و فقط اینتراکتورها هستند که با دیتا کار میکنند حتا اگر این دیتا شیردپرفرنس باشد: ).
روشهای باحالتری هستند مثلا جدا کردن مدل و ویو در سطح ماژول که احتمالا برای اپهای بعدی از اونها استفاده کنم اما همین هم تجربهی بدی نشد: ).
دو تشکر:
برای گرفتن گفتارها از api سایت قصارها استفاده کردم. قصارها یک دایرکتوری گفتار بزرگانه که یحیی ساخته. جالب بود چون دنبال ای پی آی برای چنین منظوری میگشتم به یحیی گفتم نمیشناسی؟ گفت خودم یه پروژه دارم اینطوری: ). ای پی آیش پابلیک نیست و اگر دوست داشتید استفاده کنید، میتونید به یحیی ایمیل بدید: )
برای فونت اپلیکیشنهم از فونت آزاد و زیبای "وزیر" صالح راستی کردار استفاده کردم.