چگونه یک زبان برنامه نویسی را انتخاب میکنم

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

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

شروع کنیم!

توسعه‌ی متن‌باز و آزاد

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

‬مستقل بودن از پلتفرم

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

سیستم اجرایی زبان

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

  • سیستم ران‌تایم

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

  • سیستم مدیریت اتوماتیک حافظه (GC)

اگر زبان مد نظر شما از سیستم اتوماتیک مدیریت حافظه بهره می‌برد، اطلاع از طرز کار این سیستم بسیار برای برنامه‌ی شما حیاتی است؛ چرا که تاثیر زیادی در کیفیت اجرای برنامه‌ها دارد. برای مثال، با اینکه من خودم پایتون را دوست دارم، اما واقعا نمی‌توان GC پایتون را با چیزی مانند جاوا مقایسه کرد. ممکن است سوال کنید که بر چه عنوانی چنین حرفی را می‌زنم؟ برای جواب گرفتن باید با مکانیزم‌ها و الگوریتم‌های مختلف سیستم‌های GC آشنا باشید…

  • مطالعه‌ی تایپ سیستم

زبان‌هایی مانند PHP یا JS که تایپ سیستم آن‌ها در دسته‌ی تایپ سیستم‌های (به اصطلاح!) Weak طبقه بندی می‌شوند، به سرعت از لیست ذهنی من خط می‌خورند. (دقت به واژه‌ی به «اصطلاح» بکنید، چون این مدل طبقه بندی کردن ها کمی پیچیده تر از این حرف هاست!).

زبان‌هایی با تایپ سیستم Static برای من در ارجحیت است (البته مشخصا نه آن استاتیک تایپ بودنی که در جاوا و سی‌پلاس‌پلاس می‌شناسید!). اگر زبان Dynamic بود، باید حتما در دسته‌ی تایپ سیستم‌های (به اصطلاح) Strong قرار داشته باشد. اگر زبانی Dynamic بود، اما از تایپ سیستم اختیاری استاتیک هم بهره‌مند بود (Optional Static Typing)، پیش من از امتیاز بالایی برخوردار خواهد شد‪.‬

موارد دیگری هم در این زمینه دخیل هستند:

  • آیا زبان دارای تایپ‌های جبری هست یا خیر؟(Algebraic Data Type)
  • آیا زبان دارای تایپ سیستم یک پارچه ای هست؟ فرضا قوانینی که در همه جا یکسان عمل می‌کنند، اما در مستندات گفته شده که در فلان مورد و در فلان کد رفتار متفاوتی دارند!
  • آیا می‌توانم تایپ سیستم زبان را به راحتی درک کنم؟

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

مستندات

فکر نمیکنم این فاکتور زیاد جای بحث یا توضیحی داشته باشد:

  • مستندات رسمی مناسب برای «شروع» یادگیری زبان
  • مستندات رسمی مناسب برای «آشنایی با جنبه‌های مختلف» زبان (به صورت عمقی‌تر)
  • مستندات رسمی مناسب برای کتابخانه‌ی استاندارد
  • مستندات مناسب برای کتابخانه‌ها و یا ابزارهای رده بالای زبان (آن هایی که در جامعه‌ی کاربری معروفیت دارند)
  • «کیفیت» مستندات موجود. فقط حجم آن‌ها مهم نیست.
  • شیوه‌ی دسترسی به مستندات (فرضا تحت یک سایت با رابط کاربری آسان و شکیل، و امکان جستجو و دستیابی راحت به مطالب مورد نیاز)

رصد کردن جامعه‌ی کاربری

  • پست‌های وبلاگی
  • توییت‌های افراد مختلف در تویتر با هشتگ‌های مخصوص به زبان
  • میزان فعالیت، و پاسخ گویی مناسب در میلینگ لیست زبان
  • اعلان‌های روزانه در رددیت
  • اعلان‌های روزانه در هکر نیوز
  • رفتار جامعه‌ی کاربری چگونه است؟ آیا از تازه کاران با آغوش باز استقبال می‌کنند؟
  • جامعه‌ی کاربری بیشتر به کدام موضوع برنامه‌نویسی گرایش دارند؟ وب؟ دسکتاپ؟ پردازش داده؟ سیستم‌های توکار؟ وسایل همراه (گوشی‌ها)؟ بازی‌ها؟ منطق فکری جامعه‌ی کاربری درباره ابزارها چگونه است؟ فرضا آیا اکثریت دوست دارند از فریم‌ورک‌های بزرگی مانند Spring استفاده کنند یا به طرف چیزهایی مانند Spark گرایش دارند؟ (خودتان این مثال را بسط دهید : مثلا Django یا Flask ؟… فریم‌ورک‌های بزرگ یا کتابخانه‌های کوچک)

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

رصد کردن اکوسیستم

  • میزان کتابخانه‌ها و پکیج‌های جانبی
  • کیفیت کدهای جانبی (مهم فقط کمیت نیست)
  • آیا امکان استفاده از پکیج‌های موجود در زبان‌های دیگر در آن وجود دارد؟ (مانند رابطه‌ی کلوژور و جاوا، یا الیکسیر و ارلنگ….)
  • آیا زبان از «پکیج منیجر» و «پروژکت منیجری» که مورد قبول اکثریت جامعه‌ی کاربری باشد برخوردار است؟

گردهمایی ها

  • تعداد نشست‌های ماهانه یا هفتگی گروه‌های کاربری
  • پراکندگی این نشست‌ها (فرضا آیا فقط در امریکا این اتفاق می‌افتد یا در آلمان و انگلیس و سوئد هم این قبیل نشست‌ها برگزار میشوند؟)
  • از همه مهم‌تر، «کنفرانس‌»های سالانه‌
  • کیفیت ارایه‌های این کنفرانس‌ها چگونه است؟ چه کمپانی‌هایی اسپانسر کنفرانس شده ‌اند؟ چه تعداد افراد در آن شرکت کرده‌اند؟ مهمان‌های افتخاری کنفرانس‌ چه کسانی هستند؟

پارادایم برنامه‌نویسی

من به دلایل مختلف علاقه‌ی چندانی به «شی‌گرایی» ندارم! البته منظورم از شی‌گرایی آن چیزی است که در جاوا و سی‌پلاس‌پلاس و سی‌شارپ و پایتون و امثال آن می‌بینید؛ و نه آن چیزی که می توانید در گولنگ و ارلنگ و کلوژور و یا راست داشته باشد (ممکن است بگویید این موارد آخر که گفتی هیچ کدام شی گرا نیستند، درباره‌ی چی صحبت می‌کنی؟…. خوب، این قضیه رو بهتره در نوشته‌ی جداگانه‌ای توضیح داد!)

بنابراین اگر زبان پارادایم خاصی را زور تحمیل نکند، و یا اینکه به طرف پاردایم «رویه‌گرا» یا «فانکشنال» بودن متمایل باشد، پیش من از امتیاز بالاتری برخوردار خواهد بود. من به اندازه‌ی کافی عمر خودم را در زبان‌های شی‌گرا (گروه اول) تلف کرده ام!

تاثیر زبان های پیشین

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

مصرف منابع سیستم

آیا مدل اجرایی زبان از نظر مصرف منابع سیستم به صرفه است؟ هرچه زبان بتواند محیطی را فراهم کند که برنامه‌هایش از نظر مصرف سی‌پی‌یو یا حافظه بهینه‌تر باشند، امتیاز بالاتری پیش من خواهد داشت. البته باید دقت داشت که مدل طراحی یک زبان‌ ممکن است در این فاکتور تاثیر گذار باشد. فرضا یک برنامه‌ی ۲۰ خطی جاوا ممکن است از برنامه‌ی ۲۰۰۰ خطی پایتون هم بیشتر رم مصرف کند، اما این دلیل بر مصرف بیهوده‌ی حافظه از طرف جاوا نیست و نباید همینطور روی هوا درباره آن قضاوت کرد .

من، خودم، و دوستانم!

آیا این زبان، برای «من» به شکل «فردی»، و یا «من» در قالب یک «تیم چند نفره» مناسب است یا خیر؟

واقعیت را قبول کنید، تعداد انگشت شماری مانند گوگل و اپل و مایکروسافت هستند که هزاران برنامه‌نویس تحت استخدام خود دارند. اغلب تیم‌های برنامه‌نویسی بین ۲۰ تا ۵۰ نفر بیش‌تر نیستند؛ و این هم تازه برای شرکت‌هایی است که آن‌ها را شرکت‌های «بزرگ» تلقی می‌کنیم. در حالت نرمال تیم‌های برنامه‌نویسی فقط بین ۲ تا ۵ نفر هستند؛ حداقل، تعداد افرادی که روی قسمت خاصی از پروژه کار می‌کنند تا این حد است.

بنابراین وقتی شخصی می‌گوید فلان زبان برای تیم‌های بزرگ مناسب نیست، من زیاد متوجه نمی‌شوم از چه چیزی حرف می‌زند! کدام تیم بزرگ؟ تیم بزرگی دور و اطراف خودتان می‌بینید که من از آن بی‌خبرم؟ شرکتی مانند «واتس اپ» با ۱۳ برنامه‌نویس بَک‌اِند در حال فعالیت است! تیم برنامه‌نویسی شما که قرار است پاسخ گوی مقیاس بسیار کوچک‌تری باشد، قرار است چند نفر برنامه‌نویس داشته باشد؟ اگر شما محصولی با مقیاس خیلی کوچک دارید ولی با تعداد پرشماری برنامه‌نویس، احتمال اینکه یک جای راه را اشتباه میروید زیاد است!

بنابراین برای من مهم نیست که فلان زبان در گوگل یا مایکروسافت خوب جواب داده یا نه، مهم این است که برای شخص من، یا در نهایت یک تیم چند نفره از دوستان من بتواند خوب ظاهر شود.

یکی دیگر از چیزهایی که من در این فاکتور به آن توجه دارم این است که آیا افرادی در سطح معلومات «من»، می توانند به راحتی این زبان را یاد بگیرند؟ این مورد وقتی مهم می‌شود که بخواهید زبان را به هم تیمی‌های خود معرفی نمایید.

آیا این زبان برای من که بیشتر کار وب، شبکه، و برنامه‌های مبتنی بر دیتابیس انجام می دهم مناسب است؟ ممکن است زبانی در چنین مواردی خوب عمل کند، اما در سیستم‌های توکار، برنامه‌های گرافیکی دسکتاپ، و یا ساخت بازی‌های کامپیوتری نتواند به خوبی جلب توجه کند. مهم این است که در حیطه‌ی کاری «من» مناسب باشد؛ حالا اگر در دیگر حیطه‌ها هم کارایی داشت که دیگر چه بهتر…

امکانات همروندی

دلمان بخواهد یا نخواهد، دنیای سخت افزار مسیر جدیدی را برای ادامه‌ی حیات خود برگزیده است. برای کار کشید از سخت افزارهای امروزی راهی جز ساخت برنامه‌های همروند و موازی نداریم. زبان هایی که در سال ۲۰۱۵ هنوز هم امکانات همروندی مناسبی ندارند در لیست من حضور پر رنگی نخواهند داشت. دارا بودن قابلیت‌های مختص به همروندی و همچنین دارا بودن ساختارهای داده‌ای «غیرقابل تغییر» (immutable) از جمله مواردی هستند که من برای آن‌ها ارزش زیادی قائلم.

زیبایی

آیا از چیزی که روی صفحه‌ی نمایشگر می‌بینم راضی هستم؟ این مورد مشخصا به سینتکس زبان برمی‌گردد. درست است که اکثر اوقات می گویند سینتکس زیاد مهم نیست و اصل قضیه طرز کار زبان است، اما فکر نمی‌کنم کسی از اینکه زبان مد نظرش از سینتکس زیبا و خوانایی خوبی برخوردار باشد بدش بیاید! دقت کنید که زیبایی وابسته به نگاه بیننده است و این فاکتور بیشتر جنبه‌ی سلیقه ای دارد.

سرعت

این فاکتور به عمد در انتهای این لیست بلند بالا جای گرفته؛ چون جایش دقیقا همین‌جاست: سرعت آخرین عامل سنجش یک زبان است!

دو چیز در این فاکتور باید مورد توجه قرار بگیرند:

  • ارزیابی سرعت یک زبان، بدون انجام کارهایی واقعی با آن اصلا کار راحتی نیست.
  • شما به چه میزان سرعتی نیاز دارید؟ اکثرا جواب مناسبی برای این سوال ندارند و قالبا می‌گویند هر چه سریع تر بهتر! وقتی «حد» یا «میزان» برای این قضیه مشخص نباشد، چگونه می خواهید آن را مورد ارزیابی قرار دهید؟

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

از چه فاکتورهایی دوری کنیم؟

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

جمع بندی

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

از آنجایی که افراد متخلف با توجه به دانش و تجربیات خودشان دیدگاه‌های متفاوتی خواهند داشت، باید به این توجه کرد که نظرات شخصی خودتان را هم در تصمیم گیری دخیل کنید تا مطمئن شوید که زبان مورد نظر با سیستم فکری شما سازگار است؛ وگرنه هیچ‌وقت با آن احساس راحتی نخواهید کرد.

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

نظرات

comments powered by Disqus