راهنمای جامع برنامه‌‌نویس شدن

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

نکته: مراحل موسوم به «bonus» مربوط به مسائلی خارج از بحث اصلی بوده و می‌توانید از آن‌ها گذر کنید.

مرحله‌ی «1-»: چرا باید برنامه‌نویسی بیاموزید؟

“Whether you want to uncover the secrets of the universe, or you just want to pursue a career in the 21st century, basic computer programming is an essential skill to learn.”
Stephen Hawking
«چه بخواهید از رازهای کیهان پرده افکنید و چه تنها بخواهید پیشه‌ای را در قرن ۲۱ـم دنبال کنید، برنامه‌نویسی مقدّماتی رایانه، مهارتی ضروری برای یادگیریست.»
— استیون هاکینگ (از فیزیکدانان برتر قرن ۲۱)
“In fifteen years we’ll be teaching programming just like reading and writing, and wondering why we didn’t do it sooner.”
— Mark Zuckerberg
«طی پانزده سال آینده، برنامه‌نویسی را همچون خواندن و نوشتن [در مدارس] یاد خواهیم داد و تعجّب خواهیم کرد که چرا این‌کار را زودتر شروع نکردیم.»
— مارک زاکربرگ (بنیان‌گذار Facebook)

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

“The computer is incredibly fast, accurate, and stupid. Man is unbelievably slow, inaccurate, and brilliant. The marriage of the two is a challenge and opportunity beyond imagination.”
― Stuart Walesh
«کامپیوترها به طرز شگفت‌آوری سریع‌، دقیق و احمق هستند. انسان‌ها به طرز ماورای تصوّری کُند، بی‌دقّت و نابغه هستند. عقد این دو، چالشی و فرصتی ماورای تصوّر است.»
― استوارت ولش

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

مرحله‌ی «bonus»: درآوردن ادای برنامه‌نویس‌ها!

آیا می‌خواهید برنامه‌نویس نشوید امّا ادای برنامه‌نویس‌ها را در بیاورید؟! سایت‌هایی چون Hacker Typer و Geek Typer برای شماست! همچنین با نصب Genact (مخصوص لینوکس، ویندوز و مک) می‌توانید «چیزهای خفن» در صفحه‌ی ترمینال خود ظاهر نمایید. علاوه‌برآن، با CMatrix نیز همان بارشِ نوشته‌های سبزرنگ در فیلم Matrix را در صفحه‌ی ترمینالتان ایجاد می‌کند. جدا از شوخی، این سایت‌ها و برنامه‌های معرّفی‌شده می‌توانند بسیار برای کارگردانان و فیلم‌سازان مفید باشند و برای ضبط سکانس‌هایی که درآن بازیگری در نقش یک برنامه‌نویس، مختصّص کامپیوتر، هکر یا... مشغول کار با کامپیوتر است، مورد استفاده قرار گیرند.

هکری در حال هک با CSS و در Notepad! - سریال هوش سیاه (پخش از صداوسیما) | کاش پیش از ضبط این سکانس، کارگردان محترم این سریال، حداقل ۵ دقیقه گفتگو با یک متخصص کامپیوتر داشته بود و کمی راهنمایی می‌طلبید!
هکری در حال هک با CSS و در Notepad! - سریال هوش سیاه (پخش از صداوسیما) | کاش پیش از ضبط این سکانس، کارگردان محترم این سریال، حداقل ۵ دقیقه گفتگو با یک متخصص کامپیوتر داشته بود و کمی راهنمایی می‌طلبید!


مرحله‌ی «bonus»: برای تشویق خانم‌ها

شاید برخی هنوز گمان کنند که برنامه‌نویسی متعلّق به مردان بوده و مناسب زنان نیست. در این صورت متعجّب خواهند شد اگر بدانند که برخلاف تصوّرشان، زنان بودند که نقش کلیدی را در این حوزه ایفا کردند. لقب «اوّلین برنامه‌نویس» به خانم اِیْدا لاولِیْس تعلّق دارد؛ ریاضی‌دانی متعلق به قرن ۱۹ م. که اوّلین برنامه‌ی کامپیوتری دنیا را نوشت: برنامه‌ای جهت محاسبه‌ی اعداد برنولی در کامپیوتر مکانیکی چارز بَبِج. یک قرن بعد و زنانی که به عنوان متصدّی اوّلین کامپیوترهای الکترونیکی به استخدام شرکت‌هایی چون IBM در می‌آمدند و وظیفه‌ی ورود دستورالعمل‌ها به کامپیوترها را داشتند برای اوّلین‌بار توانستند مفهوم نرم‌افزار را از سخت‌افزار جدا کرده و آن را به عنوان شاخه‌ای مستقل گسترش دهند. در همان دوران و در سال ۱۹۵۹ م. (۱۳۳۸ هـ.ش)، نوبت خانم گریِس هاپر، دریادار و دانشمند کامپیوتر بود که زبان برنامه‌نویسی COBOL را به عنوان اوّلین زبان کامپایلری کاربردوست (user-friendly) را ایجاد نمود. ۱۰ سال پس از او نیز خانم مارگارت هامیلتن بود که با ایجاد یک نرم‌افزار قابل اعتماد برای کامپیوتر ناوبری (AGC) فضاپیمای آپولو ۱۱، برای اولّین‌بار به مفهوم «مهندسی نرم‌افزار» معنا بخشید.
همان‌گونه که پیش‌تر نیز ذکر شد، برنامه‌نویسی صرفاً یک ابزار بوده و تخصیص آن به جنسیتی خاص همانند اینست که بگوییم استفاده از مداد، بیشتر متعلّق به افرادیست که رنگ موی آن‌ها مشکی است!

Margaret H. Hamilton
Margaret H. Hamilton

مرحله‌ی «Ø»: پیش‌نیازها

برای برنامه‌نویسی ابتدا لازم است بدانید چگونه می‌توان کنترل یک فضاپیمای آپولو را در دست گرفته Trans-lunar Injection را بگونه‌ای انجام داد که فضاپیما در Free-return Trajectory قرار گیرد! خیر؛ برنامه‌نویسی مقدّماتی تقریباً هیچ پیش‌نیازی ندارد و «تقریباً» برای زمانی است که با الفبای رومی آشنایی ندارید، نمی‌دانید چگونه می‌توان کامپیوتر را روشن کرد و یا کار با هیچ سیستم‌عاملی (ویندوز، مک، لینوکس یا...) را در سطح نصب چند نرم‌افزار و بازکردن چند برنامه نیز بلد نیستید! اگر جز این است، برنامه‌نویسی مقدّماتی برای شما هیچ پیش‌نیازی ندارد. با این وجود، داشتن برخی از مهارت‌ها می‌توانند کار شما را بسیار ساده‌تر کنند. برخی از مهم‌ترین آن‌ها عبارت‌اند از:

  • آشنایی با زبان انگلیسی: منابع آموزشی زیادی – اعم از محتوای چندرسانه‌ای یا کتاب – برای برنامه‌نویسی موجود است. همچنین بسیاری از اشکالاتی که در حین برنامه‌نویسی به آن بر می‌خورید، پیش‌تر برای افراد دیگری نیز رخ داده است. بنابراین در بسیاری از مواقع، اینترنت به کمک شما آماده و با کمی جستجو می‌توانید راه حل مناسبی پیدا کنید. امّا طبق آمار ۲۰۱۸ (گزارش)، بیش از ۵۴٪ صفحات وب به زبان انگلیسی نگارش و مابقی میان زبان‌های دیگر تقسیم شده‌اند که سهم فارسی برابر ۲٪، ترکی برابر ۱/۲٪ و عربی برابر ۰/۶٪ (از کل) است و سهم مابقی زبان‌های رایج در ایران، حتّی از ۰/۱٪ نیز کمتر می‌باشد. و تازه این آمار مربوط به کلّ محتوای وب است و نه حتّی محتوای تخصّصی حوزه‌ی برنامه‌نویسی. واضح است که بدون آشنایی با زبان انگلیسی (حداقل در سطح متوسّط)، خود را از حجم بسیار گسترده‌ای از منابع موجود محروم کرده‌اید. بسیار بعید است که بتوانید با جستجو در صفحات فارسی، راه حلّ مشکل خود را بیابید؛ در حالی که به راحتی می‌توانید با جستجو در میان مستندات، انجمن‌های پرسش و پاسخ و... به زبان انگلیسی، چیزی که به دنبال آن هستید را بیابید. برای مثال، Stack Overflow عملاً برای برنامه‌نویسان حکم یک فرشته‌ی نجات را دارد! در این خصوص لطیفه‌ی بی‌مز‌ّه‌ای میان برخی برنامه‌نویسان نقل می‌شود که می‌گوید:
چطور بدون Stack Overflow، خودِ Stack Overflow رو برنامه‌نویسی کردن؟

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

  • آشنایی با ریاضیات: نه مفاهیم چندان پیچیده، بلکه فقط کمی آشنایی با ریاضیات گسسته‌ی دبیرستان (جبر مجموعه‌ها، کلّیاتی از نظریه‌ی گراف‌ها، کمی از ماتریکس‌ها و...) و درکی اجمالی از توابع نمایی، فاکتوریل و... کاملاً برای سطح مقدّماتی کفایت می‌کند. فقط در سطوح تخصّصی و شاخه‌هایی همچون یادگیری ماشین، پردازش تصویر و... است که به ریاضیات پیش‌رفته نیاز پیدا خواهید کرد. بنابراین اگر در ریاضی ضعیف هستید هیچ جای نگرانی‌ای وجود ندارد.
  • سرچ کردن: این مهم‌ترین مهارت است! هرگز ممکن نیست که تمام دستورات برنامه‌نویسی را از حفظ باشید و لازم است در حین برنامه‌نویسی، مرتّب در اینترنت جستجو کرده و به مستندات آنلاین رجوع کنید. همچنین به اشکالات و خطاهای زیادی نیز بر خواهید خورد و لازم است بدانید چه جستجو کنید تا راه حلّی بیابید. اگر با تحقیق و جستجو در اینترنت غریبه بوده و انتظار داشته باشید همیشه شخصی باشد که شما را راهنمایی کند، هیچگاه برنامه‌نویس خوبی نخواهید شد. متأسّفانه این مهارت مهم، هرگز در مدارس ایران به ما آموزش داده نشده است. همیشه در مدارس، بابت حفظ کردن حجمی اطلاعات تشویق شده‌اید؛ نه بابت توانایی در تحقیق و تحلیل. پیشتر مطلب کوتاه و خودمانی در این خصوص نوشته‌ام که مهم‌ترین دلیل عقب‌ماندگی ما، آموزش و پرورش است.
https://virgool.io/education/edu-sys-problems-efg8kjsaeu1u

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

مرحله‌ی «1»: انتخاب زبان برنامه‌نویسی

زبان‌های برنامه‌نویسی به دو دسته تقسیم می‌شوند:
۱- آن‌هایی که برنامه‌نویسان ازشان شاکی هستند.
۲- آن‌هایی که منسوخ شده‌اند!

واقعیّت این است که هر زبانی مزایا و معایب خود را داشته و هیچ زبانی نیست که از همه‌نظر برتری داشته باشد. یک زبان سریع است و دیگری انعطاف‌پذیر. یکی محدود و گران است و یکی آزاد و رایگان. یکی از پشتیبانی تجاری برخوردار است و دیگری community (اجتماع) قدرتمندی پشت اوست. یکی برای برنامه‌نویسی سمت وب مناسب است و دیگری برای محاسبات ریاضی. هر زبان یک وسیله است و کاربرد خود را دارد؛ درست شبیه ابزار نجاری. ارّه بهتر است یا سنباده و یا مغار؟! ارّه‌ی آهن‌بُر بهتر است یا ارّه مویی؟ چیزی بنام بهتر و بدتر در میان ابزارها معنی ندارد؛ چرا که ابزار را شما انتخاب نمی‌کنید بلکه توسّط پروژه انتخاب می‌شوند. لذا چندان به دعوای میان برنامه‌نویس‌ها که کدام زبان بهتر است توجّه نکنید؛ خود ما برنامه‌نویسان نیز می‌دانیم که این دعواها بیشتر جنبه‌ی تفریحی دارند. برای مثال بنده علاقه‌ی بسیاری به مسخره کردن زبان JS دارم درحالی که به خوبی می‌دانم که بدون وجود این زبان، اکنون نمی‌توانستم این مطلب را در ویرگول منتشر کنم (حداقل نه به سهولت فعلی)!

یکی از اوّلین memeهایی که در زمینه‌ی برنامه‌نویسی ساختم و به سرعت در میان جامعه‌ی برنامه‌نویسان viral شد! هم‌اکنون نیز با کمی جستجو می‌توانید تی‌شرت و استیکر آن را هم پیدا کنید!
یکی از اوّلین memeهایی که در زمینه‌ی برنامه‌نویسی ساختم و به سرعت در میان جامعه‌ی برنامه‌نویسان viral شد! هم‌اکنون نیز با کمی جستجو می‌توانید تی‌شرت و استیکر آن را هم پیدا کنید!


اگر شما هدف کاملاً مشخّصی از یادگیری برنامه‌نویسی دارید و می‌خواهید از آن در زمینه‌ی خاصّی استفاده کنید، با کمی تحقیق می‌توانید متوجّه شوید که مناسب‌ترین زبان‌ها برای هدف شما چیست. برای مثال MATLAB بسیار برای کسانی مناسب است که قصد انجام پردازش‌های محاسباتی – مخصوصاً در زمینه‌هایی چون هوش مصنوعی، الکترونیک، ریاضیات و... – را دارند (نکته: نام این زبان را باید در فارسی، «متلب» بنویسید نه «مطلب») و یا زبان R بسیار برای آمار و کار با داده‌ها مناسب است. امّا در کل و مخصوصاً اگر هدف چندان مشخّصی ندارید، خیلی خود را درگیر مرحله‌ی انتخاب زبان نکنید. چیزی که اهمّیّت دارد، این است که شما اصول مقدّماتی برنامه‌نویسی را بیاموزید. پس از آن به راحتی می‌توانید سراغ هر زبان جدیدی که نیاز بود بروید و آن را فرا گیرید. توصیه‌ی شخصی من این است که بیشتر از ۲ روز را صرف تحقیق برای انتخاب زبان مناسب برای شروع نکنید! افراد بسیاری را دیده‌ام که ماه‌ها در حال جستجو برای انتخاب یک زبان بودند، در حالی که اگر همان ابتدا به وسیله‌ی شیر و خط، زبانی را انتخاب کرده و بقیه‌ی زمان را صرف فراگیری آن کرده بودند، پس از چند ماه می‌توانستند رسماً شروع به کار کنند. شاید هم دلیل ماندن طولانی مدّت آن‌ها در این مرحله این بود که واقعاً حوصله نداشتند یادگیری خود را آغاز کنند و این به اصطلاح تحقیق، صرفاً روشی بود تا هدف خود را پشت گوش بیندازند! اگر اکنون در حال خواندن این مطلب هستید و بیشتر از ۲ روز است که دارید راجع به انتخاب زبان تحقیق می‌کنید، همین الآن در گوگل سرچ کنید: «a random number» و با توجّه به عددی که برای شما نمایان شده است، یکی از این زبان‌ها را انتخاب نمایید! در غیر این صورت ممکن است تا چند ماه بعد هم همچنان در همین مرحله باشید!

1. C++
2. C#
3. Java
4. JavaScript
5. Delphi
6. Ruby
7. Python
8. PHP
9. Go
10. Visual Basic

به هر حال طبق تجربه‌ی شخصی، من زبان #C (بخوانید: «سی شارپ») را برای شروع افراد مبتدی مناسب می‌دانم. چرا که زبان نسبتاً ساده‌ای است، مباحث آموزشی گوناگون (متغیّرها، توابع، کلاس‌ها و...) در آن به خوبی وجود دارد و همچنین با نصب نرم‌افزار Visual Studio، بسیاری از امکانات آن (کامپایلر، NET. و...) نیز خود به خود نصب شده و حتّی فرد مبتدی می‌تواند به راحتی و در همان مراحل اوّلیه‌ی یادگیری، اقدام به ساخت اپلیکیشن‌های گرافیکی ساده نموده که تأثیر بسیار مثبتی در افزایش اشتیاق و انگیزه‌ی فراگیر دارد. غیر از #C، در بسیاری از مدارس و مؤسّسه‌های جهان (و البته نه ایران!)، افراد مبتدی را از طریق زبان Python (در فارسی بخوانید: پایْتون) وارد دنیای برنامه‌نویسی می‌نمایند. تفاوتی نمی‌کند، فقط چیزی را انتخاب کرده و شروع کنید! نگران نباشید؛ زمانی که اصول برنامه‌نویسی را به کمک آن زبان آموختید، به راحتی خواهید توانست سراغ هر زبان دیگری نیز بروید. درست شبیه یادگرفتن رانندگی - مهم‌تر از این که رانندگی را با چه خودرویی فرا بگیرید این است که رانندگی را فرا بگیرید! زمانی که به اصول پایه‌ی رانندگی مسلّط شدید، به راحتی خواهید توانست پشت هر خودروی جدید دیگری نیز نشسته و به سرعت، تکنیک راندن آن خودرو را نیز کشف کنید.

قسمت اوّل سری ویدیوهای زیر از فرادرس می‌تواند اطلاعات مفیدی در خصوص انواع زبان‌های برنامه‌نویسی و نحوه‌ی عملکردشان به شما بدهد:

https://faradars.org/courses/fvrprg101-programming-basics-concepts

مرحله‌ی «1Ø»: ابزار مورد نیاز

انسان‌ها ۱۰ دسته هستند: آن‌هایی که می‌دانند باینری چیست، و آن‌هایی که نمی‌دانند.

تنها زبانی که سخت‌افزار کامپیوتر متوجّه می‌شود، ۰ و ۱ است. یک ترانزیستور فقط می‌تواند قطع یا وصل باشد (مگر این که احیاناً قصد فراگیری برنامه‌نویسی کوانتومی داشته باشید!). از طرفی دیگر، درک این زبان برای انسان بسیار دشوار است. لذا زبان‌های برنامه‌نویسی سطح بالاتری ساخته شده‌اند که برای انسان قابل درک باشند. در این میان به یک مترجم نیازمندیم که واسط میان ما و کامپیوتر بوده و کدهای ما را به همان ۰ و ۱ها ترجمه کند. به این مترجم، کامپایلر (Compiler) گفته می‌شود. برخی زبان‌ها نیز بجای کامپایلر، از مفسّر (Interpreter) بهره می‌برند (فعلاً در سطح مبتدی نیازی نیست تفاوت این‌دو را بدانید). همچنین برخی از زبان‌ها از ابزار دیگری چون Runtime Environment و Package Manager نیز بهره می‌برند. این ابزار نیز لازم است نصب شوند. البته بستگی به این که چه زبانی را انتخاب کرده و همچنین سیستم‌عامل شما چیست، ممکن است این ابزار از قبل نیز در سیستم شما نصب بوده باشند. به هر حال نگران نباشید، امروزه نصب و راه‌اندازی ابزار مورد نیاز برای بسیاری از زبان‌های برنامه‌نویسی، به راحتی و با چند کلیک امکان‌پذیر بوده و آموزش گام‌به‌گام این کار نیز در سراسر اینترنت موجود است. لذا ذهن خود را چندان درگیر جزئیّات این موضوع نکنید. آموزش‌های بسیاری از اینترنت قابل دسترسند که به شما کمک می‌کنند همه‌ی ابزار لازم برای زبان مورد نظر خود را نصب کرده و اوّلین برنامه‌ی خود را بنویسید.

عملکرد کامپایلر
عملکرد کامپایلر

ابزار مهمّ دیگری که به آن نیازمندید، یک editor (ویرایشگر متن) یا IDE (محیط توسعه) است. از نظر فنّی شما می‌توانید تمام کدهای خود را در notepad بنویسید و اجرا کنید و هیچ محدودیتی از این بابت وجود ندارد. امّا editorها و IDEهای مختلف، امکانات جانبی بسیار زیاد دیگری را نیز در اختیار شما می‌گذارند تا امر برنامه‌نویسی را به سادگی هرچه بیشتر انجام دهید. Editor نرم‌افزاریست برای برای ویرایش متون و editorهای مخصوص برنامه‌نویسی، معمولاً امکاناتی چون رنگی کردن بخش‌های مختلف کد جهت فهم راحت‌تر، حدس زدن ادامه‌ی دستورات به هنگام تایپ چند حرف اوّل و موارد مشابه را انجام می‌دهند تا نوشتن برنامه، ساده‌تر گردد.
از طرفی دیگر، IDEها نرم‌افزارهای جامع‌تری بوده که علاوه بر داشتن یک editor در دل خود، امکانات بسیار بیشتری را نیز همچون تنظیم معماری برنامه، شبیه‌سازی محیطی برای اجرای برنامه و... در اختیار برنامه‌نویس قرار می‌دهند. این که از چه استفاده کنید بسیار بستگی به زبان انتخابی شما، سلیقه‌ی شما، پروژه‌های مدّنظر شما و امکانات در دسترس شما (سیستم‌عامل، بودجه‌ی مالی – البته برای کاربران ساکن ایران چندان تفاوتی نمی‌کند! – و...) است.
به هر حال چند Editor معروف عبارت‌اند از :

  • Notepad++ (رایگان، متن‌باز، بسیار سبک و ساده)
  • Atom (رایگان، متن‌باز و بسیار پرامکانات و قدرتمند، با پلاگین‌های مختلف)
  • VS Code (ساخت مایکروسافت، رایگان، متن‌باز و بسیار پرامکانات و قدرتمند، با پلاگین‌های مختلف)
  • Sublime Text (نسبتاً سبک امّا بسیار کاربردی)
  • Vim (مخصوص اساطیر!)
  • Emacs (باز هم مخصوص اساطیر!)

و چند IDE معروف:

(یک IDE بسیار پرامکانات و قدرتمند ساخت شرکت مایکروسافت با امکان پشتیبانی از بسیاری زبان‌ها چون #C و Python و ++C و JavaScript و...)

(شرکت JetBrains محصولات بسیار خوبی در زمینه‌ی برنامه‌نویسی داشته و IDEهای مختلف و بسیار مناسبی برای زبان‌های مختلف ارائه می‌کند؛ مثل IntelliJ برای Java و PyCharm برای Python)

(یک IDE از شرکت Apple و عموماً مناسب برنامه‌نویسی برای محصولات Apple)

(یک IDE متن‌باز، عموماً برای C و ++C)

(یک IDE متن‌باز و نسبتاً پرامکانات برای زبان Java)

(این IDE سابقاً بسیار محبوب پراستفاده بوده است؛ امّا هم‌اکنون شخصاً پیشنهاد می‌کنم هرکجا که آن را دیدید، فقط فرار کنید! دلیلش را بعداً خواهید فهمید؛ فعلاً فقط فرار کنید!)

Atom:
Atom: "A hackable text editor for the 21st Century"

مرحله‌ی «11»: Hello World

زمانی که همه‌چیز آماده شد، نوبت به آشنایی با زبان و محیط برنامه‌‌نویسی انتخابی، نوشتن اوّلین برنامه‌ی اجرایی (معروف به Hello World) و یادگیری اصول پایه‌ی برنامه‌نویسی (تعریف متغیّرها، اعمال ریاضی و...) می‌باشد. منابع زیادی برای یادگیری برنامه‌نویسی وجود دارد - در قالب‌ها (کتاب، کلاس، ویدیو، MOOC و...) و زبان‌ها (فارسی، انگلیسی و...) مختلف. چندان فرقی نمی‌کند از چه منبعی استفاده کنید. سبک یادگیری هرکس متفاوت است. لذا با جستجو، منابع آموزشی مختلف را امتحان کرده تا کشف کنید که بهترین روش یادگیری برای خودتان چیست. برای مثال برخی با ویدیوهای آموزشی بهتر یاد می‌گیرند و برخی با مطالعه‌ی کتاب‌های آموزشی. برخی منبعی می‌خواهند که گام به گام پیش رفته باشد، امّا برخی نیز حوصله‌شان سر می‌رود و منبعی را ترجیح می‌دهند که صرفاً کلّیّات را بیان کرده و مابقی را به عهده‌ی خودشان بگذارد. لذا زمان زیادی را برای پرس‌وجوی این که بهترین منبع آموزشی چیست، صرف نکنید. صفحاتی از کتاب‌های مختلف را بخوانید و دقایقی از نمونه ویدیوهای گوناگون را ببینید تا دریابید که با چه منبعی راحت‌تر هستید. همان منبع، بهترین منبع برای شما خواهد بود.

در نهایت، عناوینی که شما در این مرحله نیاز به آموختن دارید از این قرار خواهد بود:
(البته بسته به این که چه زبان برنامه‌نویسی‌ای انتخاب می‌کنید ممکن است کمی متفاوت باشند)

  • آشنایی با محیط کدنویسی مورد نظر
  • نوشتن و اجرای برنامه‌ی Hello World
  • کامنت‌گذاری (commenting)
  • متغیّرها (variable)
  • کار روی متغیّرها و انجام اعمال ساده‌ی ریاضی
  • عملگرها (operator) – مثل: + - * / % & | ^ ! = == < > << >> و...
  • کار با رشته‌ها (string)
  • دستورات شرطی ساده – مثل: if و else
  • دستورات حلقه‌ای (loop) – مثل: for و while
  • ایجاد توابع
  • آرایه‌ها/لیست‌ها

چهار مبحث آخر، مهم‌ترین قسمت خواهد بود و باید بتوانید آن‌ها را به خوبی درک کنید.

مرحله‌ی «bonus»: ساخت ماشین‌حساب

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

نخستین ماشین‌حساب من :)
نخستین ماشین‌حساب من :)

مرحله‌ی «1ØØ»: یادگیری الگوریتم

به موازات مرحله‌ی پیشین، چیز دیگری نیز نیاز دارید: این که روی تفکّر و نگرش خود کار کنید.

“Everybody should learn to program a computer, because it teaches you how to think.”
— Steve Jobs
«همه باید یاد بگیرند که چگونه یک کامپیوتر را برنامه‌نویسی کنند، چرا که این به شما یاد می‌دهد چگونه فکر کنید.»
— استیو جابز (بنیان‌گذار Apple)

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

یادگیری الگوریتم‌ها به حدّی اهمّیّت داشته که در آموزش برنامه‌نویسی به کودکان، ابتدا تلاش می‌شود که تفکّر الگوریتمیک در قالب بازی‌های گوناگون به کودکان آموزش داده شده و سپس اقدام به تدریس خود برنامه‌نویسی شود؛ چرا که الگوریتم، قلب برنامه‌‌نویسی است. یک نمونه از آن، بازی زیر است:

https://studio.code.org/s/frozen

از جمله کتاب‌های مفید جهت یادگیری الگوریتم، می‌توان «الگوریتم و فلوچارت | تألیف: بهرام غلامی - علیرضا جبّاریه | ناشر: دیباگران تهران» را نام برد. بدیهیست که این تنها کتاب موجود نبوده و با کمی جستجو می‌توانید منابع آنلاین و آفلاین گوناگون بسیاری پیدا کنید.

به هر حال لازم است تفکّر الگوریتمیک را به مرور در خود تقویت کنید؛ به این معنا که بتوانید برای یک مسئله، الگوریتمی واضح جهت حل ارائه دهید. برای نمونه، فرض کنید از شما خواسته شده است تا فاکتوریل هر عدد دلخواهی را محاسبه کنید (مثال: ۵×۴×۳×۲×۱ = !۵). بیان راه حل برای شما، به عنوان یک انسان، شاید آسان باشد: «از یک تا آن عدد را در هم ضرب می‌کنیم.» امّا برای پیاده‌سازی چنین چیزی در کامپیوتر، نیازمند یک الگوریتم هستید تا روش حل را دقیق و مرحله به مرحله توضیح دهد. برای مثال:

۰- شروع
۱- عدد n را از ورودی بگیر.
۲- متغیّر s و i را تعریف کن و مقادیر پیش‌فرض آن‌ها را به ترتیب برابر ۱ و ۰ قرار بده.
۳- آیا i برابر n است؟
بلی: به خطّ ۷ برو.
خیر: به خطّ ۴ برو.
۴- یکی به i اضافه کن و حاصل را به عنوان مقدار جدید i ذخیره کن.
۵- مقدار i را در مقدار s ضرب کن و حاصل را به عنوان مقدار جدید s ذخیره کن.
۶- به خطّ ۳ برگرد.
۷- مقدار s را به عنوان حاصل مسئله نمایش بده.
۸- پایان

حال می‌توان بر اساس این الگوریتم، برنامه‌ای جهت حلّ این مسئله نوشت که شبیه چنین چیزی می‌شود:

n ← input
s ← 1, i ← 0
L3: (i == n)? true: goto L7 | false: goto L4
L4: i ← i + 1
s ← i × s
goto L3
L7: print s

کد بالا درواقع یک شبه‌کد است. حال برای نمونه، پیاده‌سازی آن با زبان ++C به این صورت است:

#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int s = 1,  i = 1;
    for (i; i <= n; i++)
    {
        s = s * i;
    }
    cout << s;
    
    return 0;
}

و یا با Python:

n = int(input())
s = 1
for i in range (1, n+1):
    s = s * i
print(s)

مرحله‌ی «1Ø1»: برنامه‌نویسی اصولی

تا این‌جا یاد گرفته‌اید که چگونه به یک کامپیوتر دستور دهید. امّا دستورات شما عموماً غیراصولی و همچنین «کثیف» هستند؛ درواقع منطق‌های محض و خالصی که پشت سر هم قرار گرفته تا کاری را انجام دهند. در این حالت با مشکلات متعدّدی روبه‌رو هستید:

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

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

  • روش‌های best practice: روش‌های نام‌گذاری استاندارد متغیّرها، کلاس‌ها و پوشه‌ها - کامنت‌گذاری درست - مستندسازی - ...
  • پارادایم‌های برنامه‌نویسی (programming paradigms): «پارادایم» به معنای «الگوواره» است. معمولاً رایج‌ترین چیزی که در این سطح باید یاد بگیرید، برنامه‌نویسی شی‌گرا (Object-oriented Programming) می‌باشد. رویکردهای دیگری همچون برنامه‌نویسی تابعی (Functional Programmingبرنامه‌نویسی سرویس‌گرا (Service-oriented Programming) و... نیز وجود دارد که ممکن است بعداً بسته به نیازتان ملزم به یادگیری آن‌ها نیز بشوید.
  • الگوهای طرّاحی (design patterns): خود زیرمجموعه‌ای از best practiceها بوده و درواقع روش‌ها یا قالب‌هایی بهینه و استاندارد برای حلّ مسائل گوناگون هستند. پیروی از آن‌ها سبب کاهش مشکلات رایج بسیاری در تولید نرم‌افزار می‌گردد.
  • ساختمان داده (data structure): این یکی از مهم‌ترین مباحثیست که باید به درستی درک کنید. تا این‌جا به احتمال زیاد تنها روشی که برای ذخیره‌سازی یک سری داده می‌دانستید، استفاده از یک آرایه (array) بود. امّا شیوه‌های بسیار دیگری نیز جهت سامان‌دهی داده وجود داشته که بسته به طبیعت مسئله‌ی مورد نظر شما می‌توانند مورد استفاده قرار گیرند. همیشه بهترین راه سامان‌دهی داده‌ها، ذخیره‌ی آن‌ها در یک آرایه نیست بلکه ممکن است بسیار ساده‌تر و/یا بهینه‌تر باشد اگر برای مثال در قالب گراف، درخت، پُشته یا... ذخیره شوند. از این مبحث بسیار مهم نباید به هیچ‌وجه غافل شد.

مرحله‌ی «11Ø»: برنامه‌نویسی حرفه‌ای

تا مرحله‌ی قبل، شما به جایگاهی رسیدید که اصول پایه‌ی برنامه‌نویسی را آموخته‌اید (هرچند هنوز به تجربه‌ی زیادی نیاز دارید). هم‌اکنون دیگر حتّی می‌توانید زبان برنامه‌نویسی خود را عوض کرده و زبان جدیدی را در مدّت کوتاهی فرا بگیرید؛ چرا که اصول همچنان همان است و تنها چیزی که اکنون باید بیاموزید، syntax (نحو – چگونه متغیّر تعریف کنید، تابع بنویسید و...) آن زبان است. حتّی شاید بتوانید پروژه‌هایی نیز بنویسید. امّا هنوز یک برنامه‌نویس حرفه‌ای نیستید!

در هنگام برنامه‌نویسی ممکن است به مسائل تکراری زیادی بر بخورید. آیا همیشه باید هر پروژه‌ای را خودتان از ۰ تا ۱۰۰ بنویسید؟ مثلاً آیا هر بازی‌سازی ناچار است برای ساخت هر بازی جدید، ابتدا فرمول‌های فیزیک را مجدّداً پیاده‌سازی کرده و از صفر تعریف کند که اگر جسمی در بازی رها شد، شتابی تحت تأثیر گرانش بگیرد؟ آیا برای ساخت ۱۰۰ فروشگاه آنلاین متفاوت، باید ۱۰۰ بار از نو تعریف کرد که محصولات چگونه لیست شوند و مشتری آن‌ها را چگونه به سبد خرید اضافه کند؟ یا اصلاً آیا برای نمایش یک صفحه‌ی گرافیکی ساده بر روی نمایشگر، باید جزء به جزء تعریف کرد که هر پیکسل از نمایشگر در هر لحظه چگونه باشد؟ واضح است که این درست نیست. مگر هر شرکت خودروسازی مجبور است برای تولید هر خودروی جدید، ابتدا چرخ را خودش از نو اختراع کند؟ برای جلوگیری از اختراع مجدّد چرخ در برنامه‌نویسی، ابزار و روش‌های بسیاری وجود دارد.

برنامه‌نویسان خیلی از مسائل متداول و تکراری را از پیش و یک‌بار برای همیشه حل کرده و آن‌ها را در قالب کتابخانه (library) منتشر می‌کنند – مجموعه‌ای از زیربرنامه‌ها و توابع آماده که می‌توان به هر برنامه‌ای افزود و استفاده کرد. به عنوان مثال، برای بسیاری از زبان‌های برنامه‌نویسی، کتابخانه‌ایی موسوم به Math موجود بوده که بسیاری از دستورات و توابع مهمّ ریاضی در آن پیاده‌سازی شده است. برای محاسبه‌ی سینوس یک عدد در برنامه‌تان نیازی نیست سری تیلور را از نو پیاده‌سازی کنید! فقط کافیست کتابخانه‌ی Math را به برنامه‌ی خود افزوده و از تابع سینوس موجود در آن که پیشتر پیاده‌سازی شده است استفاده نمایید.

گاهی مجموعه‌ای از کتابخانه‌ها در کنار هم گردآوری شده تا یک جعبه‌ابزار (toolkit) را تشکیل داده و شما را برای انجام کار خاصّی یاری دهند. برای مثال اگر قرار باشد برای برنامه‌ی خود یک رابط کاربری گرافیکی (graphical user interface) طرّاحی کنید، آن‌چه معمولاً می‌تواند کار شما را ساده کند یک widget toolkit (همچون Qt) بوده که امکانات گوناگونی را در اختیار شما قرار می‌دهد.

برنامه‌ی شما همیشه همچون جزیره‌ای مستقل نسبت به سایر برنامه‌ها قرار ندارد. برای مثال اگر بخواهید در برنامه‌ی خود از نقشه استفاده کنید، یا باید خودتان سرویسی برای نقشه تولید کرده و یا خیلی راحت‌تر، از سرویسی آماده چون Google Maps استفاده نمایید. یا ممکن است بسیار پیش بیاید که بخواهید برنامه‌ی شما از امکانات موجود در سیستم‌عامل نیز بهره ببرد (مثلاً یک notification ارسال کند). برای ارتباط با سیستم‌عامل یا سایر برنامه‌ها و سرویس‌ها، از رابط‌هایی موسوم به API استفاده می‌گردد – تعاریف، الگوها و پروتکل‌هایی که امکان ارتباط میان برنامه‌ی شما با سایر برنامه‌ها را به صورت استاندارد و اصولی فراهم می‌سازد.

کتابخانه‌ها به شما کمک می‌کنند تا مسائل تکراری را از نو حل نکنید. امّا مشکل دیگری که همچنان وجود دارد، ساختارهای تکراری است. در بسیاری از مواقع، قالب و ساختمان برنامه‌ها عملاً یکی هستند . لذا در این‌جا فریم‌ورک‌ها (framework) بسیار کاربردی بوده و به شما کمک می‌کنند تا بجای درگیری با حاشیه‌ها، روی هدف اصلی تمرکز کنید. فریم‌ورک‌های بسیار متعدد و گوناگونی برای زبان‌های مختلف وجود داشته که هر یک کاربردها و ویژگی‌های خاصّ خود را دارند.

برای این که بتوانید عملاً یک برنامه‌نویس حرفه‌ای شده و از این راه کسب درآمد کنید لازم است علاوه بر آشنایی با یک زبان برنامه‌نویسی، نسبت به کتابخانه‌ها و toolkitهای رایج نیز شناخت داشته و ترجیحاً با استفاده از یک یا چند فریم‌ورک و API خاص در حوزه‌ی خاصّ مورد نظرتان هم آشنایی داشته باشید. این که دقیقاً چه انتخاب کنید، کاملاً وابسته به هدف و زمینه‌ی فعّالیت شماست.

مرحله‌ی «bonus»: بازگشت به عقب

تا این نقطه شما همچون راننده‌ای بودید که می‌تواند خودرویی را براند و حتّی رانندگی را به عنوان حرفه‌ی خود برگزنید؛ امّا هیچ شناختی نسبت به مکانیک خودرو نداشته و اصلاً نمی‌داند مثلاً در پشت کلاچی که هر روز با آن سر و کار دارد چه می‌گذرد. جز این که بخواهد یک مهندس مکانیک شود نیز نیازی به درک عمیقی از مکانیک خودرو ندارد. امّا داشتن یک دید کلّی از این که خودروی خودش چگونه کار می‌کند می‌تواند او را در بهره‌وری هرچه بهتر از خودرویش یاری دهد. به همین ترتیب شما نیز احتمالاً درکی از مفاهیمی چون parsing، کامپایلر (compiler)، سیستم‌عامل (operating system)، شبکه و... نداشته و ندانید که برنامه‌ای که نوشتید دقیقاً چگونه اجرا می‌شود. به احتمال زیاد قرار هم نیست که مثلاً زبان برنامه‌نویسی جدیدی طرّاحی کنید. امّا به هرحال داشتن یک شناخت و دید کلّی از چنین مفهوم‌هایی بسیار مفید بوده و شما را یاری می‌دهد تا برنامه‌های بهتر و بهینه‌تری بنویسید که برای مثال با سرعت بیشتر، حافظه‌ی مورد نیاز کمتر و امنیت بیشتری اجرا شوند. از همین رو سعی کنید علاوه بر آن‌چه تاکنون به صورت عملی آموخته‌اید، به دنبال این مفاهیم تئوری نیز باشید (سیستم دانشگاه‌ها متأسّفانه دقیقاً برعکس است! شما را در معرض سیلی از مطالب تئوری قرار می‌دهند؛ بی‌آن‌که بدانید اصلاً این‌ها در عمل به چه دردی می‌خورند!). آشنایی با چنین مفاهیمی برای یک برنامه‌نویس شاید اجباری نباشد امّا بسیار بسیار مفید و کاربردی است.

پیش‌تر نیز تأکید شد که برای برنامه‌نویس شدن لزومی به تحصیل در رشته‌ی مهندسی نرم‌افزار نیست. با این وجود داشتن درکی عمیق از مفاهیم و زیرشاخه‌های مهندسی نرم‌افزار است که می‌تواند برنامه‌نویس را به یک «برنامه‌نویس خوب» ارتقا دهد؛ مخصوصاً اگر هدف تولید نرم‌افزاری تجاری است.

تأکید بر این موضوع دو دلیل عمده دارد:

۱- داشتن دانشی از مهندسی نرم‌افزار موجب برنامه‌ریزی و عملکرد بهتر در فرایند تولید می‌گردد. کمک می‌کند که تخمین‌های اصولی‌تری از زمان و هزینه‌های مورد نیاز داشته باشید، رویکرد مناسبی در تولید اتّخاذ کنید و آمادگی تغییرات را داشته باشید، به عنوان عضوی از تیم بهتر کار کنید و...

۲- داشتن درکی از نحوه‌ی کارکرد ماشین، سیستم‌عامل، کامپایلر/مفسّر، ماشین مجازی (VM) و... موجب می‌شود که برنامه‌های بهینه‌تری (از نظر زمان اجرا و میزان مصرف منابع سخت‌افزاری) بنویسید.

یک مثال واقعی شاید در این‌جا کمک کند: دوستی یک بازی ساده در سبک تیراندازی (shooter) درست کرده بود و از نظر برنامه‌نویسی نیز هیچ مشکلی نداشت و بدون هیچ خطایی کار می‌کرد. با هر شلّیک توسّط کاربر، شی (object) مربوط به یک گلوله‌ی جدید در حافظه ایجاد شده و با ظاهر شدن در انتهای لوله‌ی اسلحه، مسیری را در محیط بازی طی می‌کرد و درصورت اصابت به هدف، منطق لازم (کم کردن سلامتی هدف) را اجرا می‌کرد و در انتها نیز حذف می‌شد. امّا مشکلی وجود داشت: پس از مدّتی بازی کردن، اجرای بازی دیگر روان نبود و به شدّت کُند می‌شد. مشکلی در کدها وجود نداشت و هیچ خطایی نمایش داده نمی‌شد. مشکل از جای عمیق‌تری ریشه می‌گرفت: عدم درک عمیق از کارکرد RAM و CPU. دلیل این بود که با شلّیک گلوله‌های بسیار زیاد، هم CPU به شدّت درگیر فرایندهای ایجاد و حدف گلوله‌ها شده و هم فضای RAM به شیوه‌ی غیربهینه‌ای اشغال می‌شود. راه حل استفاده از تکنیکی موسوم به Object Pooling است: بجای ایجاد و نابودسازی مداوم گلوله‌ها، تعداد آن‌ها از سقف معیّنی تجاوز نمی‌کند. در عوض هر گلوله پس از برخورد نابود نمی‌گردد، بلکه علیرغم نمایش داده نشدن در محیط بازی، جایی در RAM نگهداری شده و در شلّیک‌های بعدی، بجای تولید گلوله‌های جدید، از همان گلوله مجدّداً استفاده می‌شود!

منبع و طّلاعات بیشتر از Object Pooling در بازی‌سازی: https://raywenderlich.com/847-object-pooling-in-unity
منبع و طّلاعات بیشتر از Object Pooling در بازی‌سازی: https://raywenderlich.com/847-object-pooling-in-unity

یک مثال دیگر: دستورات زیر به زبان Java نوشته شده و قرار است مقدار دو متغیّر را به تابعی انتقال داده و باهم جابه‌جا کند.

public class Main{
    public static void main(String []args){
        int a = 1;
        int b = 2;
        swap(a, b);
        System.out.printf("a = %s, b = %s", a, b);
    }
    
    private static void swap(int x, int y) {
        int temp = y;
        y = x;
        x = temp;
    }
}

برخلاف انتظار، این برنامه‌ی ساده درست کار نمی‌کند! خروجی نهایی برابر است با:

a = 1, b = 2

برای دانستن دلیل این مشکل و حل کردنش نیز باید درک مناسبی از شیوه‌ی عملکرد ماشین مجازی جاوا (JVM) داشته باشید.

پس پیشنهاد می‌شود که به عنوان مطالعات جانبی، به عقب نیز برگردید و درک کنید آن برنامه‌ی Hello Worldـی که قبلاً نوشته بودید، واقعاً چگونه کار می‌کند.

مرحله‌ی «111»: برنامه‌نویسی در تخصّص

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

امکان دیگر فعّالیت به عنوان برنامه‌نویس ارشد (senior/señor programmer) است؛ برنامه‌نویسی عموماً با دانش و تجربه‌ی بالا، آن هم نه فقط در برنامه‌نویسی و نرم‌افزار، بلکه در اخلاق تیمی، تحلیل، برآورد، مذاکره و... که تیمی از برنامه‌نویسان زیر نظر او کار می‌کنند. به غیر از برنامه‌نویسی ارشد، عناوین شغلی گوناگون دیگری نیز وجود دارند که هر یک به نوعی با صنعت نرم‌افزار ارتباطتند: CTO، مهندس نرم‌افزار، QA، مختصّص امنیت و... . به هر حال برای فعّالیت در همگی این عناوین شغلی، برنامه‌نویسی یک نیاز است (نه لزوماً برای کدنویسی مستقیم – ممکن است مثلاً یک CTO خودش مستقیماً حتّی یک خط کد هم ننویسد – بلکه برای درک دقیق از کارها).

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

نکات تکمیلی و مهم

  • فقط برنامه‌نویسی کافی نیست: به احتمال خیلی زیاد، برنامه‌نویسی تنها ابزاری نیست که به آن نیاز خواهید داشت. برای مثال در بسیاری از پروژه‌ها نیاز به ذخیره‌ی داده‌هایی دارید و خیلی زود متوجّه خواهید شد که ذخیره‌ی همه‌چیز در یک فایل متنی ساده، مشکلات بسیاری دارد. در این‌جا نیاز به یادگیری مفاهیم پایگاه داده و معمولاً زبان پرس‌وجویی همچون SQL نیز نیاز خواهید داشت؛ به علاوه‌ی این که باید کار با یک پایگاه‌داده (این که چه و از چه نوعی باشد بسته به زمینه‌ی فعّالیتتان دارد) را نیز فرا بگیرید. این نیاز اکثراً موازی با سطوح «برنامه‌نویسی اصولی» یا «برنامه‌نویسی حرفه‌ای» پیش آمده و باید آن‌ها را یاد بگیرید. به غیر از آن، نیاز به فراگیری مفاهیم، مهارت‌ها، استانداردهای دیگری همچون استانداردهای XML و JSON، کار با خطّ فرمان سیستم‌های عامل گوناگون، پلاگین‌های مختلف و... نیز برایتان پیش خواهد آمد.
  • کنترل نسخه: در بسیاری از مواقع، نه شما تنها کسی هستید که روی برنامه ای کار می‌کنید و نه قرار است فقط یک نسخه (ورژن) از برنامه‌ی شما ارائه شود (برخلاف سخت‌افزار که با گذشت زمان فرسوده‌تر می‌شود، نرم‌افزار با گذشت زمان پیشرفت می‌کند). در خصوص به ابزارهای کنترل نسخه (version control) نیاز بوده و یکی از رایج‌ترین آن‌ها Git است. به محض این که وارد مرحله‌ی حرفه‌ای شدن شدید، اهمّیت کنترل نسخه را درک خواهید کرد.
  • طرّاحی صفحات وب با برنامه‌نویسی تحت وب یکی نیست: برخلاف تصوّر بسیاری از تازه‌واردان، HTML و CSS هیچ‌یک زبان‌های برنامه‌نویسی نیستند. HTML زبانی برای توصیف صفحات وب و CSS زبانی برای تنظیم چیدمان و الگوبندی است. نکته‌ی دیگر نیز این است که یک صفحه‌ی وب (web page) با یک برنامه‌ی تحت وب (web application) نیز یکی نیست. برای درک بهتر می‌توان Google را مثال زد. جستجوی مطالب توسّط یک اپلیکیشن عظیم تحت وب انجام می‌شود امّا نمایش حاصل جستجو به شیوه‌های مختلفی می‌تواند انجام شود که و صفحه‌ی وبی که با HTML و CSS تولید شده است، فقط یکی از آن روش‌هاست.
  • تست بنویسید: شیوه‌ی سنّتی تولید (نه فقط در حوزه‌ی نرم‌افزار) به این صورت بود که ابتدا محصول تولید می‌شد و فقط پیش از توزیع، آزمایش‌هایی نیز بر روی آن انجام می‌گرفت. امّا در شیوه‌ی مدرن، علاوه بر آزمایش‌های نهایی، در مراحل تولید نیز آزمایشات و شیوه‌های کنترل کیفی بسیاری انجام می‌گیرد تا محصول هرچه بیشتر به بی‌نقص بودن نزدیک شود. دلیل این که شرکت‌های بزرگی چون BMW در حوزه‌ی خودرو یا Apple در حوزه‌ی تکنولوژی پیشتازند و نسبت به کیفیت محصولات خود اطمینان دارند نیز همین است (البته با این حال هم امکان رخداد مشکلات و نقص‌ها همچنان است). در تولید یک نرم‌افزار نیز باوجود این که تیم‌های QA وظیفه‌ی تست و بررسی اشکالات را دارند، برنامه‌نویس نیز نیاز دارد با رویکرد تست‌محور آشنا باشد. باید بتوانید مرتّب از کارکرد درست اجزای گوناگون برنامه‌ی خود اطمینان حاصل کنید؛ حتّی اگر قرار نباشد محصولی تجاری تحویل دهید.
  • از کمال‌گرایی پرهیز کنید: کمال‌گرایی در برنامه‌نویسی بسیار خطرناک است و جلوی پیشرفت پروژه‌هایتان یا حتّی خودتان را می‌گرد. کمال‌گرایی در روند یادگیری موجب می‌شود تا ابد در بن‌بستِ «حالا من توی همینش هم موندم!» گیر کنید و هیچ‌وقت جلو نروید. در تولید نیز باعث می‌شود هیچ‌گاه هیچ محصولی تحویل ندهید و همیشه درگیر بی‌نقص‌سازی باشید که البته این کار نیز هیچ‌گاه به پایان نمی‌رسد. یاد بگیرید که ابتدا یک محصول اوّلیه‌ی هرچند ناقص را سر هم کرده و بیرون دهید، سپس به مرور زمان آن را ارتقا داده و ویژگی‌های جدیدتری اضافه کنید. گاهی در برنامه‌نویسی مجبور می‌شوید «کثیف» کار کنید و چاره‌ای هم نیست! خودتان را از این بابت اذیت نکنید.
ایستگاه فضایی بین‌المللی (ISS) - سال ۱۹۹۸
ایستگاه فضایی بین‌المللی (ISS) - سال ۱۹۹۸
همان ایستگاه فضایی بین‌المللی (ISS) - امروز
همان ایستگاه فضایی بین‌المللی (ISS) - امروز
  • به جزئیات توجّه داشته باشید: در عین حال که کمال‌گرایی در برنامه‌نویسیْ خطرناک است، دقّت و توجّه به ظرافت‌ها و جزئیّات بسیار لازم است. یک اشتباه کوچک به راحتی می‌تواند برنامه‌ی شما را دچار اشکالات اساسی کند. در سال ۱۹۶۲ م. (۱۳۴۰ ه‍.ش)، ناسا یک کاوشگر فضایی بسیار گران‌قیمت، موسوم به Mariner-1، را با هدف گذر از نزدیکی سیّاره‌ی زهره و انجام تحقیقات پرتاب کرد. امّا حدود چهار دقیقه پس از پرتاب و در مسیر قرارگیری در مدار، ناگهان راکت حامل این کاوشگر، یعنی Atlas LV-3، دچار تغییری غیرعاّدی در مسیر از پیش برنامه‌ریزی‌شده شد و بجای تزریق شدن در مدار، به سمت مناطق مسکونی روی زمین تغییر جهت داد! برای جلوگیری از تلفات انسانی، مدیر پرتاب به سرعت فرمان انهدام عمدی راکت را صادر کرد و کاوشگر گران‌قیمت، به همراه کلّ موشک حاملش، در کسری از ثانیه به قطعات ریز تبدیل شدند... امّا علّت این تغییر مسیر چه بود؟ یک راکت فضایی، نه به صورت دستی بلکه توسّط برنامه‌های کامپیوتری هدایت می‌شود. در برنامه‌ی سیستمی از این راکت که وظیفه‌ی سنجش لحظه‌ای سرعت را داشت و به زبان فورترن نوشته شده بود، فقط یک علامت « ‾ » جا افتاده بود و موجب شده بود که منطق برنامه به کلّی تغییر کند. این خطا باعث شد که راکت در محاسبه‌ی سرعت خود دچار اشتباه شده و سعی کند به سرعت از پیش تعیین‌شده‌ی خود دست پیدا کند – با نشانه‌روی به سمت مناطق مسکونی!
    البته از جمله نکاتی که در مهندسی نرم‌افزار به آن توجّه بسیاری می‌شود (یا اصولاً باید بشود)، تحمّل خطاست. سیستم‌ها باید به گونه‌ای طرّاحی شوند که در برابر خطاهای انسانی، اشتباهات پیاده‌سازی و رخ دادن شرایط پیشبینی نشده نیز مقاومت و پویایی نشان دهند.
  • رایگان کار کنید: یکی از فرهنگ‌های بسیار خوبی که در میان جامعه‌ی برنامه‌نویسان جهان و حتّی ایران شکل گرفته است، انجام فعّالیت‌های داوطلبانه و رایگان می‌باشد. کارهای بسیاری از نوشتن و توسعه‌ی نرم‌افزار، کتابخانه و فریم‌ورک، تهیه‌ی مستندات، ترجمه‌ی مستندات، تهیه‌ی محتوای آموزشی، تألیف کتاب و... است که به صورت کاملاً داوطلبانه انجام گرفته و رایگان و بدون چشم‌داشت مالی در اختیار همگان قرار می‌گیرد.
    در فیلم بتمن، شوالیه‌ی سیاه (The Dark Knight | 2008 | Christopher Nolan)، نقل قولی از جوکر وجود دارد:
“If you are good at something, never do it for free.”
«اگر در چیزی مهارت داری، هیچگاه مجانی انجامش نده.»

خوب این فلسفه لزوماً همیشه درست نیست! انجام کار به صورت رایگان نیز لزوماً از سر دلسوزی یا مهربانی نیست! با ورود به دنیای برنامه‌نویسی خواهید دید بسیار پیش بیاید که نظریه‌ی بازی‌ها (Game Theory) به شما بگوید که بهترین استراتژی، بازی به صورت برد–برد است. اگر مثلاً کتابخانه‌ای که نوشتید را آزادانه در اختیار جهان قرار دهید، برنامه‌نویس دیگر هم می‌توانند علاوه بر استفاده، روی آن کار کرده و آن را توسعه دهند تا خود شما نیز از آن بهره ببرید. سیستم‌عامل گنو/لینوکس نیز به همین منوال تولید شد. پروژه‌ای کاملاً آزاد و داوطلبانه که دسترسی هرکس به آن بلامانع است. درحالی که مثلاً ویندوز توسّط تیم خاصّی در مایکروسافت توسعه می‌یابد و کسی خبر ندارد که در میان کدهای آن چه خبر است، توسعه‌دهندگان لینوکس را میلیون‌ها داوطلب از سراسر جهان تشکیل می‌دهند. هر شخص یا شرکتی می‌تواند ویژگی‌های مورد نظر خود را به لینوکس اضافه کند، ایرادهایی که در آن پیدا می‌کند را رفع کند و دیگران نیز از آن‌چه او انجام داده است بهره‌مند شوند. دلیل کارایی، قدرت و امنیت فوق‌العاده‌ی این سیستم‌عامل در همین فلسفه نهفته است. هم‌اکنون در بسیاری جاها، از برخورددهنده‌ی هاردونی بزرگ مرکز CERN در ۱۷۵ متر زیر زمین گرفته تا ایستگاه فضایی بین‌المللی در ۴۰۰ کیلومتر بالای زمین، از توزیع‌های گوناگون لینوکس بهتره می‌برند.

در ایران نیز خوشبختانه این فرهنگ رشد خوبی داشته است؛ از ایجاد و توسعه‌ی مخازن کد متن‌باز گرفته تا تولید محتوای آموزشی رایگان و تا برگزاری همایش‌ها و دورهمی‌های سالانه، ماهانه و هفتگی در بسیاری از شهرها. بسیاری از این‌ها حتّی تحت مدیریت‌هایی متمرکز نیز انجام نشده و کاملاً آنارشیستی اداره می‌شوند – در حقیقت کلید این پیشرفت‌ها نیز همین مدیریت داوطلبانه و غیرمتمرکز است. با ورود به دنیای برنامه‌نویسی، به سرعت در خواهید یافت که تنها نیستید و افراد بسیاری داوطلبند که دستان شما را گرفته و شما را به شکل‌های مختلف یاری دهند؛ همان‌گونه که کسانی نیز پیش‌تر آن‌ها را یاری داده‌اند.

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

جمع‌بندی و سخن نهایی

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

تفاوتی ندارد که در کدامین زمینه مشغول به فعّالیت باشید. کامپیوتر می‌تواند شغل شما را دگرگون کند. برنامه‌نویسی نیز در این میان یک ابزار است تا بتوانید با آن به کامپیوترها فرمان دهید. ساکنین قرن ۱۹ مشغول تجربه‌ی انقلاب صنعتی بودند که عموماً مکانیک کلیددار اصلی آن بود. امّا شما به عنوان ساکنین قرن ۲۱، مشغول تجربه‌کردن انقلاب دیگری هستید: انقلاب دیجیتال.

به موجب انقلاب دیجیتال، اهمّیّت توانایی کار با کامپیوترها در قرن ۲۱ به همان اندازه شده است که توانایی خواندن و نوشتن در قرن ۲۰ مهم بود. برخورداری از دانش برنامه‌نویسی در بسیاری از زمینه‌ها، به زودی نه یک انتخاب بلکه یک نیاز خواهد بود. دیگر همچون قرن ۲۰، برنامه‌نویسی دیگر صرفاً منحصر به آزمایشگاه‌های Bell یا IBM نیست. حتّی دیگر منحصر به کشورهای توسعه‌یافته هم نیست؛ بلکه حتّی برای کشورهای درحال توسعه نیز فرصتی باالقوه جهت پیشرفت فراهم آورده است.

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