تجربه‌هایی از ۲ سال توسعه بی‌وقفه یک نرم افزار

امروز دقیقا دو سال و سه روز از راه اندازی بپرسیم و دو سال و سه ماه و بیست و هشت روز از شروع توسعه آن می‌گذرد. استارت آپی که نه به عنوان اولین استارت آپ تیم ما ولی به عنوان جدی‌ترین و پر زحمت‌ترین و پر چالش‌ترین استارت آپ (یا به قول خودمون پروژه) ما از شروع همکاریمون تا به اینجا بوده.راه اندازی بپرسیم با شروع سال سوم دانشگاه من به عنوان یک دانشجوی پر انگیزه و پر جنب و جوش علوم کامپیوتر هم‌زمان بود و اگه تجربه همکاری با یک استارت آپ رو داشته باشید احتمالا بتونید حدس بزنید که چه حجمی از کار و دغدغه به فعالیت های روزانه من اضافه شد. به طور کلی نه سرکلاس، نه شب‌های امتحانات پایان‌ترم، نه شب‌های المپیاد، نه وسط ربوکاپ، نه وسط سفر تو هواپیما یا اتوبوس از دستش آسایش و قرار نداشتم و روزی رو به خاطر ندارم که جز دغدغه‌های اصلی من نبوده باشه!دو سال پیش یعنی ابتدای شروع این مسیر من به عنوان یک توسعه دهنده اندروید خودآموخته و کم تجربه از تعداد زیادی از باید‌ها و نباید‌ها در توسعه نرم افزار اطلاع خاصی نداشتم و خرابکاری های زیادی انجام دادم و حجم زیادی از وقتمون رو تلف کردم تا تونستم مسیر درست رو پیدا کنم.متنی که پیش روی شماست خلاصه ای از تجربه‌های یک توسعه دهنده اندروید در پایان سال دوم مسیر پر پیچ و خم یک استارت آپ می‌باشد.۱- با توسعه دهنده‌های با تجربه تر از خودتون آشنا بشیدبه جرات می‌تونم بگم که موثرترین عامل آشنایی من با اون بایدها و نبایدها دوستان بسیار عزیزی بود که طی این دو سال پیدا کردم و وقت‌های زیادی که ازشون دزدیدم تا در مورد مسائل مختلف ازشون سوال بپرسم و باهاشون بحث کنم.یکی از شب‌های پاییز ۹۵ بعد از سه ماه تلاش بی‌نتیجه برای شبیه سازی یک باگ بسیار اعصاب خورد کن خواب دیدم که به یکی از همین دوستان در حین درد و دل کردن گفتم من سه ماهه درگیر باگی هستم که برای هیچ کدوم از اطرافیانم پیش نمیاد ولی چندین بار در روز برای کاربرها اتفاق می‌افته و بعد از اینکه جریان توضیح دادم دستش رو روی گردنم انداخت و با چشم هایی پر از اشک گفت من هم خیلی وقت هست که با این باگ کلنجار میرم و روشی برای درست کردنش وجود نداره!صبح روز بعد داستان خوابم رو برای اون دوست عزیزم تعریف کردم و بعد از کلی خنده از من خواست تا اون بخش از کد رو براش ارسال کنم و کمتر از ۵ دقیقه باگ سه ماهه من کشف شد ?. برای افرادی که احتمالا مثل من در شروع کارشون با توسعه دهنده‌های همکار خودشون آشنا نیستن شبکه های اجتماعی مثل توییتر و گروه های تلگرامی می‌تونه محل خوبی برای ایجاد این نوع از ارتباط ها باشه. همین طور تعدادی زیادی وبلاگ فارسی و غیرفارسی فعال با نویسنده های بسیار خوش اخلاق در این زمینه وجود داره که دنبال کردنشون و ارتباط باهاشون خالی از لطف نیست.۲- قبل از شروع کدنویسی یک معماری مناسب برای آن انتخاب کنیدروزی که کدنویسی بپرسیم رو به عنوان یک برنامه نویس شش ساله که تجربه توسعه پروژه ای طولانی مدت را نداشت شروع کردم یک ساختار کلی برای آن که شامل قالب کلی کد ها و نحوه مرتب سازی فایل ها بود در نظر گرفتم و طبق همان ساختار پروژه را بدون مشکل پیاده سازی کردم.سرعت توسعه بپرسیم به علت ماهیت استارت آپی‌ای که داشت به حدی زیاد بود که ساختار من در مدت خیلی کمی ضعف های خودش رو نشون داد و کم کم پیش بردن کار ها رو برای من سخت کرد. این وضعیت باعث شد تا اجبارا قبل از انتشار هر نسخه زمانی رو برای برطرف کردن اون ایراد های ساختاری صرف کنم و دنبال یک راه حل اساسی برای از بین بردن این مشکل برای همیشه باشم.در نتیجه چند هفته تحقیق و مطالعه با معماری‌های (MVP (Model-View-Presenter و MVVM ( Model - View-ViewModel) آشنا شدم که به طور خلاصه باعث چند لایه شدن اپلیکیشن شما و جدا شدن لایه منطق اپلیکیشن از لایه ظاهر می‌شوند.البته یک معماری به تنهایی برای پیش بردن سریعتر کارها مناسب نیست و شما کماکان به یک ساختار مناسب برای دسته بندی فایل‌های مختلف (که در صورت استفاده از این معماری‌ها چندین برابر هم می‌شوند) نیاز دارید. با یک جستجوی سریع در اینترنت می‌توانید تعداد زیادی از این ساختارها که توسط دیگران پیشنهاد شده اند را مشاهده کنید و براساس نیاز و سلیقه خودتان یکی از آن ها انتخاب کنید یا حتی براساس خلاقیت خودتان ساختار دلخواه خود را طراحی کنید. ۳- یادگیری را فراموش نکنیدنکته بسیار مهم بعدی که نباید از اون غافل باشید دانستن این مسئله هست که هر کدی که امروز در حال تایپ آن هستید بازتابی از کدهایی هست که قبلا جایی دیده اید! بنابراین تا ‌می‌توانید کدهای افراد دیگر را چه از طریق پروژه های Open Source ای که منتشر کرده‌اند و چه از طریق مقالاتی نوشته‌اند مطالعه کنید. ۴- هنگام کد زدن به آینده خودتان هم توجه داشته باشیدیکی از موارد مهمی که باعث شد ایرادهای ساختاری‌ای که قبل‌تر بهش اشاره کردم رو راحت‌تر برطرف کنم ساختار ساده ( ولی ناکافی ) ای بود که در ابتدای پروژه در نظر گرفته بودم و مهم تر از اون یادداشت‌هایی بود که از قبل کدهای عجیب و غریبم نوشته بودم که باعث شدن موقع بررسی مجدد کدهام و تلاش برای رفع‌شون، باگ‌های عزیزم رو به یاد بیارم و اون ها رو هم در نظر بگیرم.احتمالا برای خیلی از شما هم پیش اومده باشه که بعد از کلنجار رفتن‌های طولانی با یک باگ یکی از ناجیان StackOverFlow به داد شما رسیده باشه و به قول معروف روز یا هفته شما رو Save کرده باشه! بنابراین در نظر بگیرید که یادداشت کردن اون لینک قبل از اون چند خط کد ناجی چه کمکی به شما در آینده می‌کنه.این مسئله رو هم در نظر بگیرید که ممکنه روزی به هر دلیل خوب یا بد شما باید اون استارت آپ رو ترک کنید و شخص دیگه‌‌ای به عنوان توسعه دهنده جای شما رو بگیره. بنابراین جهت جمع بندی دو مورد آخر این جمله معروف رو به خاطر بسپارید:Code as if the next developer on the project is a psychopath that knows your home address۵- نسبت به کیفیت کدهایتان وسواس نشان ندهیداحتمالا گوش شما هم مثل من از این حرف که « استاندارد کد بزنید » پر شده باشه و نیازی به گفتن مجددش نباشه!یکی از مهم تجربه‌هایی که از حضور در ربوکاپ‌های مختلف بدست آوردم این بود که همیشه امکان نوشتن با کیفیت‌ترین کد وجود نداره و نتیجه نهایی مسابقه هست که حرف آخر رو می‌زنه و کسی از شما به خاطر کد باکیفیت‌تان تشکری نمی‌کنه!از نظر من دنیای استارت آپ‌ها هم فرق زیادی با دنیای ربوکاپ نداره و اگه دیر بجنبید احتمالا رقیبتون از شما پیشی بگیره! بنابراین بدون اینکه ذره‌ای از ارزش یک محصول با‌کیفیت رو کم کنم این نکته رو بهتون یادآوری می‌کنم که زمان در یک استارت آپ بسیار مهم‌تر از کیفیت کد شما است! ۶- با دقت از چرخ آماده استفاده کنیدحتما جمله معروف « چرخ را مجددا اختراع نکنید » را که به عدم اختراع مجدد تکنولوژی های از قبل طراحی شده اشاره دارد را شنیده‌اید. توسعه دهندگان اندروید هم در پی این جمله کاملا منطقی در بسیاری از کارهای روزمره خود از کتابخانه‌های کاربردی و رایگان که توسط سایرین منتشر شده است استفاده می‌کنند و پروژه‌هایشان را توسعه می‌دهند. به هر حال احتمالا گسترش جامعه کاربرانشان با آغاز دریافت گزارش‌های ایراد پی در پی که ناشی از آن کتابخانه است هم‌ زمان شود.حالا این به تصمیم توسعه دهنده بستگی دارد که خودش وارد میدان شود یا در انتظار منتشر کننده آن کتابخانه جهت رفع ایراد باشد! پس مهم‌ترین نکته در انتخاب یک کتابخانه تعداد استفاده کنندگان و همچنین به‌روزرسانی دوره‌ای آن توسط منتشر کننده اش است.مورد بعدی که بسیار باید به آن توجه شود در نظر گرفتن حجم کتابخانه نسبت به وظیفه ای که به عهده دارد است. بسیاری از لایبرری هایی روزمره‌ای که از آن‌ها به عنوان چرخ استفاده می‌کنیم قابلیت‌هایی بسیار بیشتر از آنچه که ما نیاز داریم را شامل می‌شوند و این یکی از مقدماتی است که در آینده حجم اپلیکیشن ما را تحت تاثیر قرار می‌دهد. نیاز به گفتن این مسئله نیست که یکی از مهم‌ترین معیار‌های کاربران برای انتخاب ما حجم محصول ما است.بنابراین لطفا در انتخاب یک چرخ این دو مورد را در نظر بگیرید. ۷- رفتار کاربران خود را دنبال کنیدهمه ما با انالیتیکز ها و تاثیر بسیار زیاد آن در کمک به سرعت بهبود محصولاتمان آشنا هستیم نیازی به توضیحات اضافی در این مورد نیست. یکی از جالب‌‌ترین کارهایی که طی این دو سال انجام دادم بررسی رفتارهای کاربرها یا به اصلاح دقیق‌تر دنبال کردن Event‌هایی بود که توسط اون‌ها یا برای اون‌ها (مثل فراخوانی‌های API ) اتفاق می‌افتاد. نتیجه این بررسی‌ها پیدا کردن ضعف‌های UX بپرسیم و بازطراحی بخش زیادی از اون‌ها مثل روال ثبت‌نام، روال تکمیل پروفایل یا روال پاسخگویی به سوالات و … بود. مورد بعدی توجه به تعداد Failed شدن فراخوانی‌های API و در نتیجه بهبود زیرساخت ارتباطی جهت افزایش سرعت و کاهش این‌گونه ایرادات بود. ۸- روال تست کردن را با توسعه روی گوشی‌های ضعیف‌تر کوتاه کنیداگه از آنالیتیکز ها در اپلیکیشن خود استفاده می‌کنید حتما به لیستی از دستگاه‌های کاربرانتان دسترسی دارید. به برند‌های آن ها توجه کنید و سعی کنید گوشی ارزان قیمتی از پراستفاده‌ترین برندها به تدریج برای خود تهیه کنید! حالا چرا ارزان قیمت؟ چون احتمالا کاربرانی که از این دستگاه ها استفاده می‌کنند تجربه نامناسب‌تری از اپلیکیشن شما نسبت به سایر کاربران خواهند داشت. پس از مدتی از توسعه اپلیکیشن‌های خود بر روی دستگاه‌های مختلف متوجه تفاوت‌های اندک اجرایی آن‌ها می‌شوید و تجربه استفاده بهتری از اپلیکیشن خود را برای کاربرانتان رقم می‌زنید. ۹- امنیت کاربران خود را در اولویت قرار دهیداپلیکیشن‌های اندروید و بستر اجرایی آن‌ها به راحتی خوردن یک لیوان آب قابل نفوذ هستند و هر شخصی با اندکی کنجکاوی می‌تواند به مهم‌ترین اطلاعات کاربران شما دسترسی پیدا کند! بنابراین پیاده سازی مکانیسم‌های امنیتی از قبیل ذخیره سازی و اطلاعات حساس به صورت Encrypt شده و ناخوانا کردن کلیدهای خصوصی و درهم‌سازی الگوریتم‌های امنیتی و برقراری ارتباط امن اپلیکیشن با سرور به عهده شما است.مقالات زیادی در سایت توسعه دهندگان اندروید و سایر وبلاگ ها در این زمینه نوشته شده که کاربرد بسیار زیادی برای شما خواهند داشت. این نوشته تلاشی بود برای لیست کردن مهم‌ترین تجربه‌هایی که طی دو سال گذشته کسب کردم. خواندن پست «تجربه ای از ۲ سال کار استارتاپی» به نوشته همکارم، به عنوان تجربه ای مکمل در این استارتاپ، خالی از لطف نیست.از توجه‌تان سپاسگزارم.