چالش انتخاب تکنولوژی و یادگیری یک زبان برنامه‌نویسی جدید!


پرفرمنس!

سرعت یادگیری!

باحال بودن!

پیچیده بودنی که منجر به شو‌آف شود!

رفیقم استفاده می‌کنه!


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

این مقاله چه چیزی نیست:

ارائه راهکار برای یافتن بهترین تکنولوژی برای پروژه بعدی شما

این مقاله چه چیزی هست:

اینکه من چطور فکر می‌کردم و به کجا رسیدم و ممکنه این مسیر و راهی که رفتم به کارتون بیاد یا بتونید به من در تصمیم گیری‌های بهتر آتی کمک کنید.


در زمان‌های دور وقتی تنها راه دسترسی به اینترنت کافی‌نت‌ها و دایال آپ بود و اندکی قبل‌تر که کافی‌نت‌ها هنوز کابی‌نت بودند من کدنویسی رو شروع کردم. خب علاقه‌ی شخصی بود و دیزاین پترن و اصول معماری نرم‌افزار و ... هم که مسلما بلد نبودم (و هنوزم نیستم و هرجا گفتم بلدم الکی دارم می‌گم!) صرفا بنا به تجربه و خرابکاری میتونستم راه جدیدی پیدا کنم یا ناکام بمونم (البته از آخرین ناکامی بیشتر از ۱۰ سال می‌گذره) خلاصه اون دوران گذشت و اینترنت هم کم‌کم به همه جا راهشو باز کرد و دسترسی به منابع آموزشی بهتر و بیشتر شد و من از اون مدل آدما هستم که باید مستندات بخونم و کد بنویسم تا چیزی را یاد بگیرم پس همین‌کارو کردم و خب همونقدری که نیاز داشتم همیشه یاد گرفتم.

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


در یک دوره‌ی ۳-۴ ساله ما یک شبکه اجتماعی را توسعه می‌دادیم (جاست فور فان) و خب به خاطر ساختار فریمورک و پلتفرم که مشکلات متعددی داشت فشار بسیار زیادی روی بانک اطلاعاتی متحمل می‌شدیم و خاطرات تلخی از روزهای زیادی که مجبور بودیم به جای اضافه کردن امکانات جدید و بهبود تجربه‌ی کاربری وقت صرف بهینه‌سازی پلتفرم کنیم برامون مونده بود بنابراین من به شدت دچار بیماری پرفرمنس شدم به طوری‌که هنوزم در صورت عدم مصرف داروی مناسب این بیماری عود می‌کنه!.

این مساله در پروژه‌های بعدی باعث شد برای کار از فریمورکی مثل PhalconPHP و MongoDB استفاده کنم و چندین پروژه را با همین ساختار انجام بدیم و خب Redis را هم برای کش داشتیم. انصافا در حوزه پرفرمنس کار خوبی بود اما همونطور که احتمالا شما هم فکر میکنید غیر ضروری.

غیرضروری از این جهت که ما زمان زیادی را به خاطر این تکنولوژی‌ها از دست دادیم. زمان برای یادگیری، تست و اپدیت‌های مختلف و البته کمبود منابع باعث می‌شد تقریبا هرچیزی که لازم داشتیم خودمون در این بسترها در اون زمان توسعه بدیم و لزوما همه چیز استاندارد نبود.

خب به زبان ساده‌تر ما موفق شدیم دو تا پروژه بزرگ را به همین دلیل Fail کنیم. این برای من درس عبرت شدم که نه از اینور بوم بیوفتم و نه از اونور و حقیقتا بعدتر که با دوستان حرفه‌ای دیگه هم آشنا شدم معیارها را کمی منطقی‌تر و بر اساس مواردی که در ادامه میگم بنا کردم.

در پروژه‌های جدید و فعلی ما راهکار انتخاب تکنولوژی را بر اساس کامیونیتی گذاشتیم یعنی اول جامعه توسعه‌دهندگان را بررسی می‌کردیم و سپس روند توسعه خود پلتفرم و در نهایت ابزارهای توسعه یافته برای پلتفرم را. در روال قبلی اگر قرار بود برنامه‌نویسی اضافه بشه مدت زمان زیادی باید برای آموزش فرد صرف می‌شد و اگر اون فرد از ما به هر دلیلی جدا می‌شد مجددا این پروسه باید تکرار می‌شد. علاوه بر اون اگر من یا یکی دیگه از اعضای اصلی جدا می‌شد جایگزینی بسیار سخت می‌شد و عملا از نظر فنی همیشه ریسک بزرگ نیروی انسانی وجود داشت. (در تیم‌های بزرگ شاید این مورد چالش بزرگی محسوب نشه ولی در تیم‌های کوچیک این مورد گاهی می‌تونه منجر به فلج شدن پروژه بشه)

در فرآیند جدید به واسطه عمومی‌تر بودن تکنولوژی این جایگزینی‌ها و عملا ریسک نیروی انسانی کاهش پیدا می‌کنه اما خب اگر بخواید سوال کنید پرفرمنس چطور؟ جوابتونو در ۳ مورد خلاصه می‌کنم:

اول اینکه تو سال ۲۰۱۸ ابزارهای خیلی خوبی برای Scale وجود داره و نسبت به ۵ سال پیش این کار خیلی ساده‌تر انجام میشه. (این شاید بهترین دلیل نباشه اما وقتی لاراول یا Yii رو با PhalconPHP مقایسه کنید و تفاوت فاحش رو ببینید و بعد این مورد رو دوباره بخونید شاید نظرتون عوض بشه و اصلا وارد زبانی مثل Golang نمیشم در این بخش)

دوم اینکه سرعت توسعه محصول و ورودش به بازار در بسیاری موارد ارجحیت داره نسبت به مقداری پرفرمنس (قبول دارم این مورد موافقان و مخالفان خودشو داره و بحث مجزایی می‌طلبه اما این مورد با در نظر گرفتن بخش غیر فنی درگیر ماجرا و خود بازار هست)

سوم اینکه خیلی وقت‌ها محصولی که توسعه می‌دیم اصلا نیاز به پرفرمنس و ایده‌آل‌های ما نداره و صرفا اگر اصولی نوشته بشه و قابل توسعه باشه کفایت می‌کنه.


این مطلب نه به دنبال ارائه راهکار هست و نه قصد داره به شما کمک کنه تصمیم گیری کنید صرفا ماجرای آنچه بودم و آنچه شدم هست. هرکدوم ما در مسیر کارمون داستان خودمونو داریم که باعث شده چیزای مختلفی یاد بگیریم و ممکنه در آینده نظرم نسبت به آنچه که امروز اینجا نوشتم تغییر کنه و قطعا در اون زمان هم دلایل خودمو خواهم داشت.

در نهایت برای رها که باعث شد این مطلب رو بنویسم و البته می‌دونم به خوبی جوابشو ندادم باید بگم همونطوری که دوستان دیگه داخل توییت موارد خیلی خوبی عنوان کردن اول علاقه و بعد استفاده‌ای که قراره از زبان یا ابزاری که قصد یادگیریشو داره مدنظر قرار بده.

https://twitter.com/raha1923/status/974632928675336192