منبع اصلی نوشتار زیر در این لینک قرار دارد

مقایسه تجربی روبی، جاوا اسکریپت و اسکالا

بعد از یه مدت قابل توجه کار درست و حسابی و واقعی با سه زبان روبی، جاوا اسکریپت و اسکالا، حالا میتونم به راحتی در موردشون نظر بدم. قطعا این مقایسه فقط از نظر زبان نیست بلکه از نظر اکو سیستم اونهاست.

بیشتر کار من با روبی روی Ruby on Rails، با جاوا اسکریپت روی AngularJS و با اسکالا روی Play Framework بوده.

شروع یادگیری

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

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

کتابخانه‌ها

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

AngularJS پایین ترین سطح کتابخونه‌ها از نظر کیفیت رو داره. هر کسی که یه کمی جاوا اسکریپت بلد بوده که تعدادشون هم خیلی زیاده، یه کتابخونه برای کاری که میخواسته انجام بده نوشته. برای هر کاری هم کلی کتابخونه هست که اگر بگم؛ در بیشتر موارد هیچ کدوم درست و درمون نیستند، بزرگنمایی نکردم. در مورد سمت سرور (نود) هم یه سری ابزارهای خوب هست ولی بقیه کتابخونه‌ها بیشتر یه تمرین و بازی بودن.

روبی هم از نظر تعداد و هم از نظر کیفیت کتابخونه‌های خوبی داره. فکر کنم بین این سه تا بهترین باشه.

کامیونیتی

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

به نظر من کامیونیتی اسکالا حرف اول رو میزنه و سطح خیلی خیلی بالایی داره.

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

کامیونیتی جاوا اسکریپت کیفیت پایینتری داره. چون آدمهای بی تجربه راحتتر میتونن واردش بشن و کمک کنن. الزاما به معنی بد بودنش نیست ولی کیفیت بالایی نداره.

راحتی و سرعت در تولید

وقتی قرار باشه یه پروژه جدید شروع بشه اگر اون پروژه کوچیک باشه و معلوم نباشه قراره چه آینده‌ای داشته باشه، روبی میتونه انتخاب اول باشه. روبی و مخصوصا Rails میتونه با سرعت هر چه بیشتر آدم رو به یه محصول اولیه برسونه.

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

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

جاوا اسکریپت یه چیزی بین اسکالا و روبی هست. نه به اندازه روبی بی دردسر و راحته و نه به اندازه اسکالا زمانبر. اما خیلی چموشه و اذیت میکنه و در کل Stable نیست. وقت میبره تا بفهمی چرا یه چیزی کار کرد یا چرا کار نکرد و وقتی هم سر در اوردی باید همه چیز رو توی ذهنت نگه داری و اگر چند وقت از پروژه دور باشی دوباره به مشکلات تکراری میخوری.

نگهداری و تغییر کد

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

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

تست اتومات و دیباگ

چند وقتی هست که بیشتر از همیشه دارم تست مینویسم و البته خیلی هم راضی هستم.

چارچوب Rails قوی‌ترین و راحتترین امکانات تست رو داره. فکر همه چیز رو کردن و در کمترین زمان و با بهترین کیفیت میشه برای هر قسمت از برنامه و در هر سطحی (Unit یا Functional) تست نوشت. برای دیباگ هم، هم میشه از امکانات IntelliJ به راحتی استفاده کرد هم Gem ی مثل ByeBug واقعا دیباگینگ رو برای آدم لذت بخش میکنه.

ابزارهای تست جاوا اسکریپت زیاد قوی نیست و مخصوصا دیباگ کردن واقعا عذاب آوره. حتی console.log هم خیلی از جاها کار نمیکنه. AngularJS سعی کرده از اول کار تست رو راحت کنه ولی فقط Unit Testing رو راحت کرده و Integration Test به سختی و به کندی قابل انجام هست و اصلا لذت بخش نیست. دیباگینگ Integration Test توی Angular یکی از رنج آور ترین کارهای عالمه.

تست توی اسکالا به اندازه روبی راحت نیست ولی واقعا لذت بخشه و جزیی از سیستمه. از روز اول هم فکرش شده بوده و چیزی نیست که بعدا به سیستم اضافه شده باشه. IntelliJ هم که مثل بنز ازش پشتیبانی میکنه و دیباگینگش فوق العاده قویه. از اونجایی که اسکالا Static-type هست، وقتی برای یه نرم‌افزار تست بنویسی دیگه کاملا خیالت راحته که همه چیز اونطور که باید پیش میره و نیازی نیست به اندازه زبونهای دینامیک تست‌های واضح و مبرهن بزنی.

 ابزارهای توسعه (IDE)

برای روبی و جاوا اسکریپت مثل بقیه زبون‌های دینامیک خیلی ابزارهای توسعه قوی وجود نداره. بهترینش همون IntelliJ هست که باز هم به دل آدم نمیچسبه. بیشتر برنامه‌نویسهای این زبون‌ها کلا از IDE استفاده نمیکنن و فقط از یه ادیتور خوب استفاده میکنن.

به هر حال ساختن ابزارهای کمکی برای توسعه زبان دینامیک کلا کار سختیه و بعضی جاها غیر ممکنه.

اما برای اسکالا اوضاع بهتره. هر چند IDE های اسکالا به اندازه جاوا بالغ نیستند ولی قطعا خیلی بهتر از روبی و جاوا اسکریپته و روز به روز هم داره بهتر میشه. حداقلش اینه که وقتی میخوایی اسم یه کلاس یا متغییر رو تغییر بدی خیالت راحته که IDE گند نمیزنه توی کدات.

سرعت اجرا

واضحه که اسکالا از همه سریعتره و چارچوب Play بالاترین کارایی رو داره. هم از نظر سرعت و از نظر مقیاس پذیری (Capability). حتی چارچوب‌های وب Rust، Go و بقیه زبون‌ها هم توی تست‌هایی که روی لپ تاپ خودم گرفتم نمیتونن به پای Play برسن.

بازار کار

بازار کار جاوا اسکرپیت قطعا از روبی و اسکالا بهتره. وارد هر تیمی که بشی بالاخره یه جاوا اسکریپت کار میخوان. ولی الزاما حقوق بالایی نداره. تا جایی که من دیدم حقوق یه روبی کار بالاتر از جاوا اسکریپت‌کار در همون حده. و البته حقوق یه اسکالا کار از همه بیشتره به همین نسبت کار هم برای اسکالا از بقیه کمتره.

وضعیت نیروی انسانی

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

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

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

نتیجه گیری

نتیجه گیری نداریم! با هر زبونی که حال میکنید کد بزنید.