بسیاری از افراد تازهوارد به دنیای کامپیوتر، نخستین مسئلهای که به آن بر میخورند انتخاب یک زبان برنامهنویسی است. دائماً میپرسند که «کدام زبان برنامهنویسی را یاد بگیریم؟» و گاه مدت زمان بسیار زیادی را نیز صرف یافتن این پرسش میکنند. اشکال اما اینجاست که هیچ پاسخ مشخصی وجود ندارد؛ چرا که اساساً پرسش اشتباهی را طرح کردهاند! امید است که مطلب پیش رو، راهگشای ایشان باشد.
نخستین لازم است بدانید که تمامی زبانهای برنامهنویسی [۱] رایجی که ممکن است نامشان را شنیده باشید [۲]، از دید نظری با یکدیگر همارز هستند [۳] و هر منطقی را که بتوان به وسیلهی هر یک پیادهسازی کرد، توسط بقیهی آنها نیز قابل پیادهسازی است (چنین نیست که پیادهسازی الگوریتمی مثلاً با Python امکانپذیر و با Rust ناممکن باشد). تفاوت زبانهای برنامهنویسی گوناگون در خصوصیتهایی چون شیوهی اجرا بر روی کامپیوتر (مثلاً اجرای بیواسطه بر روی سختافزار، یا نیازمند به یک برنامهی واسط جهت تبدیل کد نوشته شده به آن زبان به دستوراتی جهت اجرای مستقیم بر روی سختافزار)، دامنه و کاربرد (زبانهایی چون ++C یا JavaScript، همه منظوره یا general-purpose محسوب میشوند، درحالی که مثلاً زبان R اختصاصاً برای انجام محاسبات آماری یا Solidity مناسب برای نوشتن قراردادهای هوشمند طراحی شده است و اصطلاحاً به آنها خاصدامنه یا domain-specific میگویند) و البته فنآوریهای توسعهدادهشده در پیرامون آنها (مثلاً پشتیبانی موتور بازیسازی Unity از زبان #C) است. هر زبان مزایا و معایبی دارد؛ زبانهای برنامهنویسی کممزیت اساساً منسوخ شدهاند و بعید است نامشان را شنیده باشید، و زبان برنامهنویسی ایدهآل و بدون عیب نیز وجود ندارد.
پس بالاخره کدام زبان را برای برنامهنویسشدن یاد بگیریم؟ کجای پرسش یادشده در مقدمه ایراد دارد؟ این ما را به دومین نکته میرساند: عنوان شغلیِ «برنامهنویس» وجود ندارد!
کاملاً درست متوجه شدید! چنین عنوانی در میان مشاغل وجود ندارد و هیچکس صرفاً بخاطر این که بلدید الگوریتمی را در قالب یک کد بازنویسی کنید (اصلاحاً کدنویسی کنید) به شما حقوق نمیدهد! در دنیای کامپیوتر، عناوین شغلی بسیار گوناگونی تعریف شده است، همچون:
همچنین ممکن است برای هر یک از این عناوین شغلی، به دنبال فردی بگردند که به کار با ابزار و فنآوریهای خاصی نیز آشنا باشد (مثلاً توسعهدهندهی back-end آشنا به Python و Django) و یا شخصی را استخدام کنند که به واسطهی آشنایی با مجموعهای از ابزار خاص و طیفی از دانشها و مهارتها، بتواند چند وظیفهی خاص شبیه به هم را همزمان انجام دهد (مثلاً یک توسعهدهندهی #C که هم با ASP.NET آشناست و هم با Xamarin که میتواند هم در توسعهی یک اپلیکیشن تحت وب مشارکت داشته باشد و هم در توسعهی یک اپلیکیشن تحت اندروید). در هر حالت عنوان هیچ یک از مشاغل، «برنامهنویس» خالی نیست!
هر یک از زبانهای برنامهنویسی، فقط یک ابزار است. درحالی که موقعیتهای شغلی گوناگون نیازمند آنند که شخص به دانشها و فنون خاصی مسلط بوده و کار چندین ابزار گوناگون را نیز بلد باشد. تنها یکی از این فنون، توانایی برنامهنویسی بوده و زبان برنامهنویسی نیز یکی از چندین ابزار مورد نیاز است.
برای فهم بهتر، بگذارید مثالی را با یک توسعهدهندهی back-end پیش ببریم (مهم نیست اگر با این عنوان شغلی و همچنین با هیچ یک از اسامی خاصی که در ادامه ذکر میشود آشنا نباشید. هدف صرفاً ارائهی یک مثال برای درک بهتر منظور است).
مشابه اکثر دیگر مشاغل مرتبط با کامپیوتر، یک توسعهدهندهی back-end نیاز دارد که اصول برنامهنویسی (مفاهیمی چون متغیرها، عبارتهای شرطی، حلقهها، ساختمانهای داده و…) بلد باشد و بتواند الگوریتمی را به یک زبان برنامهنویسی (مثلاً همان Python که در مثال گفته شد) پیادهسازی کند. اما کارش هرگز اینجا تمام نمیشود. چنین شخصی نیاز دارد به آشنایی [۴] با:
میبینید که برنامهنویسی فقط یکی از مهارتهای بسیاری است که شخص به آن نیاز دارد. از سوی دیگر، زمانی که شخص بتواند دانشها و مهارتهای مورد نیاز برای یک حوزهی خاص را فرا بگیرد، یادگیری کار با ابزار جدید برایش چندان زمانبر نخواهد بود. مثلاً یک توسعهدهندهی back-end که تا کنون با Java و فنآوریهای مرتبط با آن کار کرده و استقرار اپلیکیشنهای خود را با AWS انجام میداده است، با صرف حدود چند ماه میتواند به سراغ توسعهی back-end با #C رفته و این بار اپلیکیشنهای خود را نیز روی Azure مستقر کند (چنین تغییری مطمئناً بیهزینه نیست و همچنین زمان میبرد تا به فنآوریهای جدید عادت کند؛ اما دیگر نیازی به یادگیری مجدد تمامی دانش و فنون مرتبط با توسعهی back-end نیز وجود ندارد).
پس میتوان دریافت که برای یک فرد تازهوارد آنچه اهمیت دارد فراگیری دانش و فن است، نه ابزار. واقعاً تفاوت چندانی نمیکند اگر هماکنون با Python شروع کنید، یا با ++C یا Java یا هرچه. اگر هدف خود را از پیش مشخص کردهاید، میتوانید نگاهی به آگهیهای کاری عنوان شغلی مد نظر خود انداخته [۵] و ببینید که عموماً چه ابزاری را ترجیح میدهند. و اگر فعلاً هدف مشخصی ندارید، با یکی از زبانهای برنامهنویسی سطح بالا و همهمنظوره (high-level و general-purpose) که منابع آموزشی مبتدی به آنها توجه بیشتری دارند [۶] آموزش را شروع کرده و اصول و مفاهیم الگوریتم، فلوچارت، برنامهنویسی و حل مسئله را یاد بگیرید. و اگر زبانی که با آن شروع کرده بودید برای رسیدن به هدفتان چندان مناسب نبود، هیچ جایی برای نگرانی نخواهید داشت؛ چرا که پس از گذر مرحلهی یادشده و فراگیری اصول، به راحتی و تنها با صرف کمی وقت میتوانید هر زبان جدید دیگری را نیز یاد بگیرید [۷].
پیشتر در مطلب «راهنمای جامع برنامهنویسشدن» تلاش کردهام مراحل مختلف در روند یادگیری برنامهنویسی را از هم تفکیک کرده و همچنین توضیح دادهام که از چه مرحلهای به بعد میتوانید به سراغ فراگیری یک زبان جدید بروید.
پرسشی که درواقع باید به دنبال پاسخش باشید (اما نیازی نیست شروع یادگیری برنامهنویسی را برای یافتن این پاسخ به تأخیر افکنید) این است: «برای دستیابی به تخصص x، کدام نقشهی راه را پیش بگیریم؟» این پرسش کاملاً بهجایی بوده و پاسخدهی به آن نیز نیازمند تحقیق و بررسی است.
در اینجا جستجو در اینترنت و استفاده از سایتهایی چون roadmap.sh میتواند بسیار کارگشا باشد. اگر مطمئن نیستید که میخواهید به سراغ کدام شاخه بروید نیز میتوانید دانش و مهارتهایی عمومی که میان بسیاری از شاخههای حوزهی نرمافزار مشترک هستند را یاد بگیرید:
برای یادگیری هر یک نیز منابع بیشماری در قالب کتاب، دورههای ویدیویی و… وجود دارد. حتی نیاز چندانی به صرف هزینه ندارید و به ویژه اگر سطح آشنایی شما با زبان انگلیسی intermediate به بالا باشد، تقریباً هر چیزی را میتوانید به صورت رایگان و یا با صرف هزینهای ناچیز یاد بگیرید (۸). همچنین در خصوص مفاهیم مقدماتی که شمار متقاضیان برای یادگیری آنها زیاد است نیز به فارسی یا هر زبان دیگری، منابع گوناگونی پیدا میشود (۹).
زبانْ ابزار بوده «چه زبانی یاد بگیرم؟» پرسشی اشتباه است. اگر از پیش هدف مشخصی دارید و میدانید که میخواهید به کجا بروید، با جستجو در اینترنت به دنبال نقشهی راه برای رسیدن به آن باشید و از بررسی آگهیهای کاری جهت اطلاع از آخرین فنآوریهای مورد نیاز نیز غافل نشوید. اگر هدفتان مشخص نیست نیز بجای جستجوی بیهوده برای انتخاب ابزار، به دنبال فراگیری دانش و فنونی باشید که در بیشتر شاخههای دنیای کامپیوتر مورد استفاده قرار میگیرند. بجای هفتهها تحقیق برای این که از کجا شروع کنید، از جایی شروع کنید!