کدام زبان برنامه‌نویسی را یاد بگیریم؟

بسیاری از افراد تازه‌وارد به دنیای کامپیوتر، نخستین مسئله‌ای که به آن بر می‌خورند انتخاب یک زبان برنامه‌نویسی است. دائماً می‌پرسند که «کدام زبان برنامه‌نویسی را یاد بگیریم؟» و گاه مدت زمان بسیار زیادی را نیز صرف یافتن این پرسش می‌کنند. اشکال اما این‌جاست که هیچ پاسخ مشخصی وجود ندارد؛ چرا که اساساً پرسش اشتباهی را طرح کرده‌اند! امید است که مطلب پیش رو، راهگشای ایشان باشد.لوگوی چندی از زبان‌های برنامه‌نویسیمقایسه‌ی زبان‌هانخستین لازم است بدانید که تمامی زبان‌های برنامه‌نویسی [۱] رایجی که ممکن است نامشان را شنیده باشید [۲]، از دید نظری با یک‌دیگر هم‌ارز هستند [۳] و هر منطقی را که بتوان به وسیله‌ی هر یک پیاده‌سازی کرد، توسط بقیه‌ی آن‌ها نیز قابل پیاده‌سازی است (چنین نیست که پیاده‌سازی الگوریتمی مثلاً با Python امکان‌پذیر و با Rust ناممکن باشد). تفاوت زبان‌های برنامه‌نویسی گوناگون در خصوصیت‌هایی چون شیوه‌ی اجرا بر روی کامپیوتر (مثلاً اجرای بی‌واسطه بر روی سخت‌افزار، یا نیازمند به یک برنامه‌ی واسط جهت تبدیل کد نوشته شده به آن زبان به دستوراتی جهت اجرای مستقیم بر روی سخت‌افزار)، دامنه و کاربرد (زبان‌هایی چون ++C یا JavaScript، همه منظوره یا general-purpose محسوب می‌شوند، درحالی که مثلاً زبان R اختصاصاً برای انجام محاسبات آماری یا Solidity مناسب برای نوشتن قراردادهای هوشمند طراحی شده است و اصطلاحاً به آن‌ها خاص‌دامنه یا domain-specific می‌گویند) و البته فن‌آوری‌های توسعه‌داده‌شده در پیرامون آن‌ها (مثلاً پشتیبانی موتور بازی‌سازی Unity از زبان #C) است. هر زبان مزایا و معایبی دارد؛ زبان‌های برنامه‌نویسی کم‌مزیت اساساً منسوخ شده‌اند و بعید است نامشان را شنیده باشید، و زبان برنامه‌نویسی ایده‌آل و بدون عیب نیز وجود ندارد.عنوان شغلیِ «برنامه‌نویس» وجود ندارد!پس بالاخره کدام زبان را برای برنامه‌نویس‌شدن یاد بگیریم؟ کجای پرسش یادشده در مقدمه ایراد دارد؟ این ما را به دومین نکته می‌رساند: عنوان شغلیِ «برنامه‌نویس» وجود ندارد!کاملاً درست متوجه شدید! چنین عنوانی در میان مشاغل وجود ندارد و هیچ‌کس صرفاً بخاطر این که بلدید الگوریتمی را در قالب یک کد بازنویسی کنید (اصلاحاً کدنویسی کنید) به شما حقوق نمی‌دهد! در دنیای کامپیوتر، عناوین شغلی بسیار گوناگونی تعریف شده است، همچون:توسعه‌دهنده‌ی front-endتوسعه‌دهنده‌ی back-endتوسعه‌دهنده‌ی اندرویدتوسعه‌دهنده‌ی بلاک‌چینمهندس DevOpsمهندس شبکهمهندس نرم‌افزارمهندس QAمهندس SEOمهندس یادگیری ماشینتحلیل‌گر دادهادمین پایگاه داده‌ (DBA)ادمین سیستم (SysAdmin)مدیر ارشد فن‌آوری (CTO)همچنین ممکن است برای هر یک از این عناوین شغلی، به دنبال فردی بگردند که به کار با ابزار و فن‌آوری‌های خاصی نیز آشنا باشد (مثلاً توسعه‌دهنده‌ی back-end آشنا به Python و Django) و یا شخصی را استخدام کنند که به واسطه‌ی آشنایی با مجموعه‌ای از ابزار خاص و طیفی از دانش‌ها و مهارت‌ها، بتواند چند وظیفه‌ی خاص شبیه به هم را همزمان انجام دهد (مثلاً یک توسعه‌دهنده‌ی #C که هم با ASP.NET آشناست و هم با Xamarin که می‌تواند هم در توسعه‌ی یک اپلیکیشن تحت وب مشارکت داشته باشد و هم در توسعه‌ی یک اپلیکیشن تحت اندروید). در هر حالت عنوان هیچ یک از مشاغل، «برنامه‌نویس» خالی نیست!هر یک از زبان‌های برنامه‌نویسی، فقط یک ابزار است. درحالی که موقعیت‌های شغلی گوناگون نیازمند آنند که شخص به دانش‌ها و فنون خاصی مسلط بوده و کار چندین ابزار گوناگون را نیز بلد باشد. تنها یکی از این فنون، توانایی برنامه‌نویسی بوده و زبان برنامه‌نویسی نیز یکی از چندین ابزار مورد نیاز است.مثال: توسعه‌دهنده‌ی back-endبرای فهم بهتر، بگذارید مثالی را با یک توسعه‌دهنده‌ی back-end پیش ببریم (مهم نیست اگر با این عنوان شغلی و همچنین با هیچ یک از اسامی خاصی که در ادامه ذکر می‌شود آشنا نباشید. هدف صرفاً ارائه‌ی یک مثال برای درک بهتر منظور است).مشابه اکثر دیگر مشاغل مرتبط با کامپیوتر، یک توسعه‌دهنده‌ی back-end نیاز دارد که اصول برنامه‌نویسی (مفاهیمی چون متغیرها، عبارت‌های شرطی، حلقه‌ها، ساختمان‌های داده و…) بلد باشد و بتواند الگوریتمی را به یک زبان برنامه‌نویسی (مثلاً همان Python که در مثال گفته شد) پیاده‌سازی کند. اما کارش هرگز این‌جا تمام نمی‌شود. چنین شخصی نیاز دارد به آشنایی [۴] با:مفاهیم عمومی سیستم‌عامل و مدیریت سیستم‌عاملی خاص (همچون Linux یا Windows)کنترل نسخه و کار با ابزاری چون Gitمفاهیم کلی پایگاه‌های داده و شیوه‌ی اتصال نرم‌افزار به یک سیستم پایگاه دادهمفاهیم اصلی وب‌سرورها و کار با وب‌سروری خاص (مثل Nginx یا Apache Tomcat)اصولی از طراحی و توسعه‌ی سیستم‌های نرم‌افزاری (مثلاً SOLID، طراحی سیستم، تست، و…)مجازی‌سازی یا کانتینرسازی و ابزارهای مرتبط با آن (همچون Docker)ده‌ها مهارت دیگر (کار تیمی، امنیت وب و…)برنامه‌نویسی فقط یکی از چندین مهارت مورد نیاز استمی‌بینید که برنامه‌نویسی فقط یکی از مهارت‌های بسیاری است که شخص به آن نیاز دارد. از سوی دیگر، زمانی که شخص بتواند دانش‌ها و مهارت‌های مورد نیاز برای یک حوزه‌ی خاص را فرا بگیرد، یادگیری کار با ابزار جدید برایش چندان زمان‌بر نخواهد بود. مثلاً یک توسعه‌دهنده‌ی back-end که تا کنون با Java و فن‌آوری‌های مرتبط با آن کار کرده و استقرار اپلیکیشن‌های خود را با AWS انجام می‌داده است، با صرف حدود چند ماه می‌تواند به سراغ توسعه‌ی back-end با #C رفته و این بار اپلیکیشن‌های خود را نیز روی Azure مستقر کند (چنین تغییری مطمئناً بی‌هزینه نیست و همچنین زمان می‌برد تا به فن‌آوری‌های جدید عادت کند؛ اما دیگر نیازی به یادگیری مجدد تمامی دانش و فنون مرتبط با توسعه‌ی back-end نیز وجود ندارد).پس می‌توان دریافت که برای یک فرد تازه‌وارد آن‌چه اهمیت دارد فراگیری دانش و فن است، نه ابزار. واقعاً تفاوت چندانی نمی‌کند اگر هم‌اکنون با Python شروع کنید، یا با ++C یا Java یا هرچه. اگر هدف خود را از پیش مشخص کرده‌اید، می‌توانید نگاهی به آگهی‌های کاری عنوان شغلی مد نظر خود انداخته [۵] و ببینید که عموماً چه ابزاری را ترجیح می‌دهند. و اگر فعلاً هدف مشخصی ندارید، با یکی از زبان‌های برنامه‌نویسی سطح بالا و همه‌منظوره (high-level و general-purpose) که منابع آموزشی مبتدی به آن‌ها توجه بیشتری دارند [۶] آموزش را شروع کرده و اصول و مفاهیم الگوریتم، فلوچارت، برنامه‌نویسی و حل مسئله را یاد بگیرید. و اگر زبانی که با آن شروع کرده بودید برای رسیدن به هدفتان چندان مناسب نبود، هیچ جایی برای نگرانی نخواهید داشت؛ چرا که پس از گذر مرحله‌ی یادشده و فراگیری اصول، به راحتی و تنها با صرف کمی وقت می‌توانید هر زبان جدید دیگری را نیز یاد بگیرید [۷].نمونه‌ای از کد منبع برنامه‌ای به زبان برنامه‌نویسی "Brainfuck"!پیشتر در مطلب «راهنمای جامع برنامه‌نویس‌شدن» تلاش کرده‌ام مراحل مختلف در روند یادگیری برنامه‌نویسی را از هم تفکیک کرده و همچنین توضیح داده‌ام که از چه مرحله‌ای به بعد می‌توانید به سراغ فراگیری یک زبان جدید بروید. https://virgool.io/@pouyan_01001010/ultimate-programming-guide-ad4qinsvhlc9 نقشه‌ی راهپرسشی که درواقع باید به دنبال پاسخش باشید (اما نیازی نیست شروع یادگیری برنامه‌نویسی را برای یافتن این پاسخ به تأخیر افکنید) این است: «برای دستیابی به تخصص x، کدام نقشه‌ی راه را پیش بگیریم؟» این پرسش کاملاً به‌جایی بوده و پاسخ‌دهی به آن نیز نیازمند تحقیق و بررسی است.در این‌جا جستجو در اینترنت و استفاده از سایت‌هایی چون roadmap.sh می‌تواند بسیار کارگشا باشد. اگر مطمئن نیستید که می‌خواهید به سراغ کدام شاخه بروید نیز می‌توانید دانش و مهارت‌هایی عمومی که میان بسیاری از شاخه‌های حوزه‌ی نرم‌افزار مشترک هستند را یاد بگیرید:برنامه‌نویسی و حل مسئله به کمک یکی از زبان‌های برنامه‌نویسی رایج: همان‌طور که پیش‌تر نیز اشاره شد، این مهارت در میان اکثر مشاغل مرتبط با کامپیوتر بسیار مفید است.طراحی صفحات ایستای وب به کمک HTML و CSS: کم‌ترین کاربردی که می‌تواند برایتان داشته باشد، توانایی راه‌اندازی یک وب‌سایت شخصی کوچک است که رزومه‌ی خود را در آن قرار دهید.مقدماتی از پایگاه داده و دستورات پایه‌ی زبان SQL: در بسیاری از پروژه‌های نرم‌افزاری نیاز به ذخیره‌ی داده‌هایی خواهید داشت و در این‌جا این مهارت بسیار مفید خواهد بود.کنترل نسخه با دستورات پایه‌ی Git: جهت ذخیره‌سازی مرتب و اصولی کدهایی که نوشتید و مدیریت تغییرات آن‌ها (بجای انبار کردنشان در New Folder (1) و New Folder (2) و…!) و همچنین انجام یک پروژه‌ی تیمی، آشنایی با Git و استفاده از یک سرویس ارائه‌دهنده‌ی آن (مثلاً github.com) برای شما حیاتی خواهد بود.کدنویسی تمیز و مبانی مهندسی نرم‌افزار: اگر برنامه‌ی شما کار می‌کند، لزوماً به این معنا نیست که برنامه‌ی درستی نوشته‌اید! کدهای شما لازم است از استانداردهایی پیروی کند و برنامه‌ی شما باید اصولی طراحی شده باشد و بتوان آن را به درستی عیب‌یابی کرد، توسعه داد و… . در این‌جا آشنایی با مبانی مهندسی نرم‌افزار، تحلیل و طراحی سیستم‌های نرم‌افزاری و همچنین آشنایی با استانداردهای کدنویسی تمیز و اصولی اهمیت دارد.اگر برنامه‌ی شما کار می‌کند، لزوماً به این معنا نیست که برنامه‌ی درستی نوشته‌اید!برای یادگیری هر یک نیز منابع بی‌شماری در قالب کتاب، دوره‌های ویدیویی و… وجود دارد. حتی نیاز چندانی به صرف هزینه ندارید و به ویژه اگر سطح آشنایی شما با زبان انگلیسی intermediate به بالا باشد، تقریباً هر چیزی را می‌توانید به صورت رایگان و یا با صرف هزینه‌ای ناچیز یاد بگیرید (۸). همچنین در خصوص مفاهیم مقدماتی که شمار متقاضیان برای یادگیری آن‌ها زیاد است نیز به فارسی یا هر زبان دیگری، منابع گوناگونی پیدا می‌شود (۹).جمع‌بندیزبانْ ابزار بوده «چه زبانی یاد بگیرم؟» پرسشی اشتباه است. اگر از پیش هدف مشخصی دارید و می‌دانید که می‌خواهید به کجا بروید، با جستجو در اینترنت به دنبال نقشه‌ی راه برای رسیدن به آن باشید و از بررسی آگهی‌های کاری جهت اطلاع از آخرین فن‌آوری‌های مورد نیاز نیز غافل نشوید. اگر هدفتان مشخص نیست نیز بجای جستجوی بیهوده برای انتخاب ابزار، به دنبال فراگیری دانش و فنونی باشید که در بیشتر شاخه‌های دنیای کامپیوتر مورد استفاده قرار می‌گیرند. بجای هفته‌ها تحقیق برای این که از کجا شروع کنید، از جایی شروع کنید!یادداشت‌هاو نه زبان‌های توصیف سخت‌افزاری - همچون Verilog - یا زبان‌های markup - مثل HTML - یا مواردی از این دستهر ساله IEEE لیستی از برترین زبان‌های برنامه‌نویسی را منتشر می‌کند.توضیح فنی: همگی آن‌ها ماشین تورینگ کامل محسوب می‌شوند. هر یک از دانش/مهارت‌های مثال‌زده‌شده، با بسیاری از شاخه‌ی دیگر نیز هم‌پوشانی داشته و قرار هم نیست که فرد به همگی آن‌ها مسلط باشد (مثلاً مجازی‌سازی خود یک تخصص جدا محسوب می‌شود).اما به هر حال گاهی نیز کارفرمایان از این موضوع سواستفاده کرده و ممکن است بخواهند شخصی را استخدام کنند که همزمان چندین عنوان شغلی را برایشان پُر کند (تا فقط به یک نفر حقوق دهند!) – مثلاً شخصی به مثابه یک «چاقوی چندکاره» که هم بجای توسعه‌دهنده‌ی iOS ایفای نقش کند، هم به عنوان ادمین پایگاه داده، هم مهندس داده، جراح قلب، هیتمن، مسئول موتورخانه‌ی زیردریایی کلاس آکولا، فضانورد متخصص EVA، تحلیل‌گر مسائل لیختن‌اشتاین و فیلسوف علم!سایت‌های StackOverflow ،LinkedIn و همچنین سایت‌های ویژه‌ی کاریابی می‌توانند منابع خوبی باشند. برای داشتن یک دید آماری وسیع‌تر، تلاش کنید هم به شرکت‌های متوسط و بزرگ توجه داشته باشید و هم به استارتاپ‌ها و شرکت‌های کوچک.مثلاً Java ،C++ ، JavaScript ،C# ،Python یا… – اگر خیلی مردد هستید، پیشنهاد می‌کنم تصادفی انتخاب کنید! مثلاً به همان رتبه‌بندی IEEE سر بزنید و هر کدام که در سال جاری رتبه‌ی ۱ بود (رتبه‌ها هرسال جابه‌جا می‌شوند) را انتخاب کنید؛ یا اصلاً میان چند رتبه‌ی برتر (ضمن نادیده‌گیری زبان‌های برنامه‌نویسی domain-specific و زبان‌های غیربرنامه‌نویسی) تاس بریزید!مثالی که عمدتاً برای این موضوع استفاده می‌کنم، یادگیری رانندگی است. شما در یک کلاس رانندگی پایه‌ی ۳ ثبت‌نام کرده و رانندگی با یک خودروی سواری (مثلاً پراید یا هرچه در آن لحظه آموزشگاه برای شما موجود داشت) را به شما یاد می‌دهند. زمانی که اصول کلی رانندگی را یاد گرفتید و کمی نیز به کنترل خودرو در جاده مسلط شدید، که معمولاً چند هفته تا چند ماه طول می‌کشد، بعید است بیش‌تر از چند ساعت تا چند روز وقت بخواهید تا بتوانید رانندگی با تقریباً هر خودروی سواری جدیدی را هم فرا بگیرید (در بدترین حالت، مثلاً شما رانندگی را با یک سدان دنده‌دستی آغاز کردید و حال قرار است یک SUV دنده‌اتوماتیک را برانید که نهایتاً با صرف تنها چند روز زمان، تا حدود قابل قبولی به آن مسلط خواهید شد). حال تصور کنید که شخصی بجای ثبت‌نام در کلاس رانندگی، نخست هفته‌ها وقت بگذارد و تحقیق کند که بهتر است رانندگی را با پراید آغاز کند، با پژو یا با چه! مثلاً محتوای آموزشی رایگان زیادی را در وب‌سایت YouTube (که به دلایلی نامعلوم و بدون شک مسخره، سال‌هاست که در ایران فیلتر است) خواهید یافت.به عنوان نمونه، برای یادگیری مقدمات Git به زبان فارسی می‌توانید از آموزش گیت توسط جادی استفاده کنید.