عصر امروز، عصر اطّلاعات بوده و کامپیوتر به شکلهای مختلف در زندگیهای شخصی و حرفهای هر یک از ما نفوذ کردهاست. برنامهنویسی، روش دستور دادن به یک کامپیوتر، نیز به همین ترتیب دیگر منحصر به فقط چند زمینهی خاص نبوده و تقریباً در تمام رشتهها کاربرد دارد، از پژوهشهای زیستشناسی گرفته تا تحلیلهای جامعهشناسی. لذا افراد بسیاری هستند که فراگیری مهارت برنامهنویسی برایشان بسیار مفید خواهد بود. راهنمای جامع برنامهنویس شدن به همین منظور گردآوری شده است تا دید و نقشهی راهی به علاقهمندان ارائه دهد.
نکته: مراحل موسوم به «bonus» مربوط به مسائلی خارج از بحث اصلی بوده و میتوانید از آنها گذر کنید.
“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
«کامپیوترها به طرز شگفتآوری سریع، دقیق و احمق هستند. انسانها به طرز ماورای تصوّری کُند، بیدقّت و نابغه هستند. عقد این دو، چالشی و فرصتی ماورای تصوّر است.»
― استوارت ولش
چگونه میتوان میان این همه کامپیوتر زندگی کرد درحالی که نمیتوانید به هیچیک از آنها دستور سادهای دهید؟ تفاوتی نمیکند حرفهی شما چیست. چه زیستشناسی باشید که قصد دارد دادههایی را جمعآوری و تحلیل کند، چه جامعهشناسی باشید که سعی دارد یک الگوی رفتاری مشخّص را از تحقیقاتش استخراج کند، چه حسابداری باشید که نیاز دارد روی حجم عظیمی از اعداد، محاسباتی انجام دهد، چه عکّاسی باشید که نیاز دارد تغییرات خاصّی را در تعداد زیادی عکس بدهد و چه واقعاً هدفتان تولید یک نرمافزار باشد، در هر صورت داشتن دانشی از برنامهنویسی برای شما یک مزیت بزرگ است؛ چرا که کامپیوتر میتواند به راحتی کارهایی را انجام دهد که انجام دستی آنها بسیار زمانبر و وقتگیر است.
آیا میخواهید برنامهنویس نشوید امّا ادای برنامهنویسها را در بیاورید؟! سایتهایی چون Hacker Typer و Geek Typer برای شماست! همچنین با نصب Genact (مخصوص لینوکس، ویندوز و مک) میتوانید «چیزهای خفن» در صفحهی ترمینال خود ظاهر نمایید. علاوهبرآن، با CMatrix نیز همان بارشِ نوشتههای سبزرنگ در فیلم Matrix را در صفحهی ترمینالتان ایجاد میکند. جدا از شوخی، این سایتها و برنامههای معرّفیشده میتوانند بسیار برای کارگردانان و فیلمسازان مفید باشند و برای ضبط سکانسهایی که درآن بازیگری در نقش یک برنامهنویس، مختصّص کامپیوتر، هکر یا... مشغول کار با کامپیوتر است، مورد استفاده قرار گیرند.
شاید برخی هنوز گمان کنند که برنامهنویسی متعلّق به مردان بوده و مناسب زنان نیست. در این صورت متعجّب خواهند شد اگر بدانند که برخلاف تصوّرشان، زنان بودند که نقش کلیدی را در این حوزه ایفا کردند. لقب «اوّلین برنامهنویس» به خانم اِیْدا لاولِیْس تعلّق دارد؛ ریاضیدانی متعلق به قرن ۱۹ م. که اوّلین برنامهی کامپیوتری دنیا را نوشت: برنامهای جهت محاسبهی اعداد برنولی در کامپیوتر مکانیکی چارز بَبِج. یک قرن بعد و زنانی که به عنوان متصدّی اوّلین کامپیوترهای الکترونیکی به استخدام شرکتهایی چون IBM در میآمدند و وظیفهی ورود دستورالعملها به کامپیوترها را داشتند برای اوّلینبار توانستند مفهوم نرمافزار را از سختافزار جدا کرده و آن را به عنوان شاخهای مستقل گسترش دهند. در همان دوران و در سال ۱۹۵۹ م. (۱۳۳۸ هـ.ش)، نوبت خانم گریِس هاپر، دریادار و دانشمند کامپیوتر بود که زبان برنامهنویسی COBOL را به عنوان اوّلین زبان کامپایلری کاربردوست (user-friendly) را ایجاد نمود. ۱۰ سال پس از او نیز خانم مارگارت هامیلتن بود که با ایجاد یک نرمافزار قابل اعتماد برای کامپیوتر ناوبری (AGC) فضاپیمای آپولو ۱۱، برای اولّینبار به مفهوم «مهندسی نرمافزار» معنا بخشید.
همانگونه که پیشتر نیز ذکر شد، برنامهنویسی صرفاً یک ابزار بوده و تخصیص آن به جنسیتی خاص همانند اینست که بگوییم استفاده از مداد، بیشتر متعلّق به افرادیست که رنگ موی آنها مشکی است!
برای برنامهنویسی ابتدا لازم است بدانید چگونه میتوان کنترل یک فضاپیمای آپولو را در دست گرفته Trans-lunar Injection را بگونهای انجام داد که فضاپیما در Free-return Trajectory قرار گیرد! خیر؛ برنامهنویسی مقدّماتی تقریباً هیچ پیشنیازی ندارد و «تقریباً» برای زمانی است که با الفبای رومی آشنایی ندارید، نمیدانید چگونه میتوان کامپیوتر را روشن کرد و یا کار با هیچ سیستمعاملی (ویندوز، مک، لینوکس یا...) را در سطح نصب چند نرمافزار و بازکردن چند برنامه نیز بلد نیستید! اگر جز این است، برنامهنویسی مقدّماتی برای شما هیچ پیشنیازی ندارد. با این وجود، داشتن برخی از مهارتها میتوانند کار شما را بسیار سادهتر کنند. برخی از مهمترین آنها عبارتاند از:
چطور بدون Stack Overflow، خودِ Stack Overflow رو برنامهنویسی کردن؟
با این حال بدون آشنایی کافی به زبان انگلیسی نیز میتوانید در دنیای برنامهنویسی (و همچنین در دنیا!) به بقا ادامه دهید؛ امّا با دشواریهای متعدّدی روبهرو خواهید شد. ضمناً طبق تجربهی شخصی، پس از انگلیسی، آشنایی زبانهای روسی و چینی ماندارین نیز میتواند کمی کمکحال باشد؛ چرا که مستندات نرمافزاری زیادی نیز به این دو زبان تولید میشوند. با این وجود، درصد آنها در برابر انگلیسی همچنان ناچیز است.
یک باور نادرست این است برای برنامهنویسی، حتماً باید در رشتهی مهندسی نرمافزار تحصیل کرد؛ درحالی که چنین نیست. همانگونه که پیشتر نیز ذکر شد، برنامهنویسی فقط یک ابزار است و میتواند در هرجایی کاربرد داشته باشد؛ همانگونه که قلم و کاغذ نیز ابزارهایی صرفاً منحصر نویسندگان نبوده و در همهجا کاربرد دارند. در حقیقت حتّی با تحصیل در رشتهی مهندسی نرمافزار نیز برنامهنویس نخواهید شد! همانگونه که از اسم این رشته پیداست، خروجی آن مهندس نرمافزار است (یا اصولاً باید باشد)، نه برنامهنویس؛ هرچند که درک برنامهنویسی برای یک مهندس نرمافزار بسیار حیاتیست.
زبانهای برنامهنویسی به دو دسته تقسیم میشوند:
۱- آنهایی که برنامهنویسان ازشان شاکی هستند.
۲- آنهایی که منسوخ شدهاند!
واقعیّت این است که هر زبانی مزایا و معایب خود را داشته و هیچ زبانی نیست که از همهنظر برتری داشته باشد. یک زبان سریع است و دیگری انعطافپذیر. یکی محدود و گران است و یکی آزاد و رایگان. یکی از پشتیبانی تجاری برخوردار است و دیگری community (اجتماع) قدرتمندی پشت اوست. یکی برای برنامهنویسی سمت وب مناسب است و دیگری برای محاسبات ریاضی. هر زبان یک وسیله است و کاربرد خود را دارد؛ درست شبیه ابزار نجاری. ارّه بهتر است یا سنباده و یا مغار؟! ارّهی آهنبُر بهتر است یا ارّه مویی؟ چیزی بنام بهتر و بدتر در میان ابزارها معنی ندارد؛ چرا که ابزار را شما انتخاب نمیکنید بلکه توسّط پروژه انتخاب میشوند. لذا چندان به دعوای میان برنامهنویسها که کدام زبان بهتر است توجّه نکنید؛ خود ما برنامهنویسان نیز میدانیم که این دعواها بیشتر جنبهی تفریحی دارند. برای مثال بنده علاقهی بسیاری به مسخره کردن زبان JS دارم درحالی که به خوبی میدانم که بدون وجود این زبان، اکنون نمیتوانستم این مطلب را در ویرگول منتشر کنم (حداقل نه به سهولت فعلی)!
اگر شما هدف کاملاً مشخّصی از یادگیری برنامهنویسی دارید و میخواهید از آن در زمینهی خاصّی استفاده کنید، با کمی تحقیق میتوانید متوجّه شوید که مناسبترین زبانها برای هدف شما چیست. برای مثال 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 (در فارسی بخوانید: پایْتون) وارد دنیای برنامهنویسی مینمایند. تفاوتی نمیکند، فقط چیزی را انتخاب کرده و شروع کنید! نگران نباشید؛ زمانی که اصول برنامهنویسی را به کمک آن زبان آموختید، به راحتی خواهید توانست سراغ هر زبان دیگری نیز بروید. درست شبیه یادگرفتن رانندگی - مهمتر از این که رانندگی را با چه خودرویی فرا بگیرید این است که رانندگی را فرا بگیرید! زمانی که به اصول پایهی رانندگی مسلّط شدید، به راحتی خواهید توانست پشت هر خودروی جدید دیگری نیز نشسته و به سرعت، تکنیک راندن آن خودرو را نیز کشف کنید.
قسمت اوّل سری ویدیوهای زیر از فرادرس میتواند اطلاعات مفیدی در خصوص انواع زبانهای برنامهنویسی و نحوهی عملکردشان به شما بدهد:
انسانها ۱۰ دسته هستند: آنهایی که میدانند باینری چیست، و آنهایی که نمیدانند.
تنها زبانی که سختافزار کامپیوتر متوجّه میشود، ۰ و ۱ است. یک ترانزیستور فقط میتواند قطع یا وصل باشد (مگر این که احیاناً قصد فراگیری برنامهنویسی کوانتومی داشته باشید!). از طرفی دیگر، درک این زبان برای انسان بسیار دشوار است. لذا زبانهای برنامهنویسی سطح بالاتری ساخته شدهاند که برای انسان قابل درک باشند. در این میان به یک مترجم نیازمندیم که واسط میان ما و کامپیوتر بوده و کدهای ما را به همان ۰ و ۱ها ترجمه کند. به این مترجم، کامپایلر (Compiler) گفته میشود. برخی زبانها نیز بجای کامپایلر، از مفسّر (Interpreter) بهره میبرند (فعلاً در سطح مبتدی نیازی نیست تفاوت ایندو را بدانید). همچنین برخی از زبانها از ابزار دیگری چون Runtime Environment و Package Manager نیز بهره میبرند. این ابزار نیز لازم است نصب شوند. البته بستگی به این که چه زبانی را انتخاب کرده و همچنین سیستمعامل شما چیست، ممکن است این ابزار از قبل نیز در سیستم شما نصب بوده باشند. به هر حال نگران نباشید، امروزه نصب و راهاندازی ابزار مورد نیاز برای بسیاری از زبانهای برنامهنویسی، به راحتی و با چند کلیک امکانپذیر بوده و آموزش گامبهگام این کار نیز در سراسر اینترنت موجود است. لذا ذهن خود را چندان درگیر جزئیّات این موضوع نکنید. آموزشهای بسیاری از اینترنت قابل دسترسند که به شما کمک میکنند همهی ابزار لازم برای زبان مورد نظر خود را نصب کرده و اوّلین برنامهی خود را بنویسید.
ابزار مهمّ دیگری که به آن نیازمندید، یک editor (ویرایشگر متن) یا IDE (محیط توسعه) است. از نظر فنّی شما میتوانید تمام کدهای خود را در notepad بنویسید و اجرا کنید و هیچ محدودیتی از این بابت وجود ندارد. امّا editorها و IDEهای مختلف، امکانات جانبی بسیار زیاد دیگری را نیز در اختیار شما میگذارند تا امر برنامهنویسی را به سادگی هرچه بیشتر انجام دهید. Editor نرمافزاریست برای برای ویرایش متون و editorهای مخصوص برنامهنویسی، معمولاً امکاناتی چون رنگی کردن بخشهای مختلف کد جهت فهم راحتتر، حدس زدن ادامهی دستورات به هنگام تایپ چند حرف اوّل و موارد مشابه را انجام میدهند تا نوشتن برنامه، سادهتر گردد.
از طرفی دیگر، IDEها نرمافزارهای جامعتری بوده که علاوه بر داشتن یک editor در دل خود، امکانات بسیار بیشتری را نیز همچون تنظیم معماری برنامه، شبیهسازی محیطی برای اجرای برنامه و... در اختیار برنامهنویس قرار میدهند. این که از چه استفاده کنید بسیار بستگی به زبان انتخابی شما، سلیقهی شما، پروژههای مدّنظر شما و امکانات در دسترس شما (سیستمعامل، بودجهی مالی – البته برای کاربران ساکن ایران چندان تفاوتی نمیکند! – و...) است.
به هر حال چند Editor معروف عبارتاند از :
و چند IDE معروف:
(یک IDE بسیار پرامکانات و قدرتمند ساخت شرکت مایکروسافت با امکان پشتیبانی از بسیاری زبانها چون #C و Python و ++C و JavaScript و...)
(شرکت JetBrains محصولات بسیار خوبی در زمینهی برنامهنویسی داشته و IDEهای مختلف و بسیار مناسبی برای زبانهای مختلف ارائه میکند؛ مثل IntelliJ برای Java و PyCharm برای Python)
(یک IDE از شرکت Apple و عموماً مناسب برنامهنویسی برای محصولات Apple)
(یک IDE متنباز، عموماً برای C و ++C)
(یک IDE متنباز و نسبتاً پرامکانات برای زبان Java)
(این IDE سابقاً بسیار محبوب پراستفاده بوده است؛ امّا هماکنون شخصاً پیشنهاد میکنم هرکجا که آن را دیدید، فقط فرار کنید! دلیلش را بعداً خواهید فهمید؛ فعلاً فقط فرار کنید!)
زمانی که همهچیز آماده شد، نوبت به آشنایی با زبان و محیط برنامهنویسی انتخابی، نوشتن اوّلین برنامهی اجرایی (معروف به Hello World) و یادگیری اصول پایهی برنامهنویسی (تعریف متغیّرها، اعمال ریاضی و...) میباشد. منابع زیادی برای یادگیری برنامهنویسی وجود دارد - در قالبها (کتاب، کلاس، ویدیو، MOOC و...) و زبانها (فارسی، انگلیسی و...) مختلف. چندان فرقی نمیکند از چه منبعی استفاده کنید. سبک یادگیری هرکس متفاوت است. لذا با جستجو، منابع آموزشی مختلف را امتحان کرده تا کشف کنید که بهترین روش یادگیری برای خودتان چیست. برای مثال برخی با ویدیوهای آموزشی بهتر یاد میگیرند و برخی با مطالعهی کتابهای آموزشی. برخی منبعی میخواهند که گام به گام پیش رفته باشد، امّا برخی نیز حوصلهشان سر میرود و منبعی را ترجیح میدهند که صرفاً کلّیّات را بیان کرده و مابقی را به عهدهی خودشان بگذارد. لذا زمان زیادی را برای پرسوجوی این که بهترین منبع آموزشی چیست، صرف نکنید. صفحاتی از کتابهای مختلف را بخوانید و دقایقی از نمونه ویدیوهای گوناگون را ببینید تا دریابید که با چه منبعی راحتتر هستید. همان منبع، بهترین منبع برای شما خواهد بود.
در نهایت، عناوینی که شما در این مرحله نیاز به آموختن دارید از این قرار خواهد بود:
(البته بسته به این که چه زبان برنامهنویسیای انتخاب میکنید ممکن است کمی متفاوت باشند)
چهار مبحث آخر، مهمترین قسمت خواهد بود و باید بتوانید آنها را به خوبی درک کنید.
تا این سطح یکی از اپلیکیشنهای کاربردیای که میتوانید جهت تمرین بنویسید، یک ماشینحساب است؛ برنامهای که دو عدد را به عنوان ورودی از کاربر گرفته و یک عمل ریاضی را به انتخاب کاربر روی آنها انجام دهد. بعدها نیز دیدن این ماشینحساب برای شما بسیار خاطرهانگیز خواهد بود. البته برای برنامهنویسی یک ماشینحساب حرفهای که بتواند نه فقط دو ورودی، بلکه یک چندجملهای ریاضی را دریافت و محاسبه کند هنوز زود است و نیاز به دانشی از ساختمانداده خواهید داشت. در کل یکی از بهترین راههای یادگیری برنامهنویسی، یادگیری پروژهمحور است. پروژهای برای خود تعریف کنید تا ضمن پیشروی در آن چیزهای جدیدی یاد بگیرید.
به موازات مرحلهی پیشین، چیز دیگری نیز نیاز دارید: این که روی تفکّر و نگرش خود کار کنید.
“Everybody should learn to program a computer, because it teaches you how to think.”
— Steve Jobs
«همه باید یاد بگیرند که چگونه یک کامپیوتر را برنامهنویسی کنند، چرا که این به شما یاد میدهد چگونه فکر کنید.»
— استیو جابز (بنیانگذار Apple)
الگوریتم چیست؟ برگرفته از اسم خوارزمی، جهت حلّ یک مسئله به کار میرود و مجموعهای متناهی از دستورالعملهاست که گامبهگام و به ترتیب خاصّی اجرا میشوند.
یادگیری الگوریتمها به حدّی اهمّیّت داشته که در آموزش برنامهنویسی به کودکان، ابتدا تلاش میشود که تفکّر الگوریتمیک در قالب بازیهای گوناگون به کودکان آموزش داده شده و سپس اقدام به تدریس خود برنامهنویسی شود؛ چرا که الگوریتم، قلب برنامهنویسی است. یک نمونه از آن، بازی زیر است:
از جمله کتابهای مفید جهت یادگیری الگوریتم، میتوان «الگوریتم و فلوچارت | تألیف: بهرام غلامی - علیرضا جبّاریه | ناشر: دیباگران تهران» را نام برد. بدیهیست که این تنها کتاب موجود نبوده و با کمی جستجو میتوانید منابع آنلاین و آفلاین گوناگون بسیاری پیدا کنید.
به هر حال لازم است تفکّر الگوریتمیک را به مرور در خود تقویت کنید؛ به این معنا که بتوانید برای یک مسئله، الگوریتمی واضح جهت حل ارائه دهید. برای نمونه، فرض کنید از شما خواسته شده است تا فاکتوریل هر عدد دلخواهی را محاسبه کنید (مثال: ۵×۴×۳×۲×۱ = !۵). بیان راه حل برای شما، به عنوان یک انسان، شاید آسان باشد: «از یک تا آن عدد را در هم ضرب میکنیم.» امّا برای پیادهسازی چنین چیزی در کامپیوتر، نیازمند یک الگوریتم هستید تا روش حل را دقیق و مرحله به مرحله توضیح دهد. برای مثال:
۰- شروع
۱- عدد 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)
تا اینجا یاد گرفتهاید که چگونه به یک کامپیوتر دستور دهید. امّا دستورات شما عموماً غیراصولی و همچنین «کثیف» هستند؛ درواقع منطقهای محض و خالصی که پشت سر هم قرار گرفته تا کاری را انجام دهند. در این حالت با مشکلات متعدّدی روبهرو هستید:
زمانی که این کد را نوشتم، فقط خدا و من میدانستیم که چگونه کار میکرد... اکنون فقط خدا میداند!
لذا در این مرحله لازم است مفاهیم و استانداردهایی یاد بگیرید تا از مشکلات بالا بکاهد و همچنین مزایای دیگری در اختیارتان قرار دهد. از جملهی آنها:
تا مرحلهی قبل، شما به جایگاهی رسیدید که اصول پایهی برنامهنویسی را آموختهاید (هرچند هنوز به تجربهی زیادی نیاز دارید). هماکنون دیگر حتّی میتوانید زبان برنامهنویسی خود را عوض کرده و زبان جدیدی را در مدّت کوتاهی فرا بگیرید؛ چرا که اصول همچنان همان است و تنها چیزی که اکنون باید بیاموزید، syntax (نحو – چگونه متغیّر تعریف کنید، تابع بنویسید و...) آن زبان است. حتّی شاید بتوانید پروژههایی نیز بنویسید. امّا هنوز یک برنامهنویس حرفهای نیستید!
در هنگام برنامهنویسی ممکن است به مسائل تکراری زیادی بر بخورید. آیا همیشه باید هر پروژهای را خودتان از ۰ تا ۱۰۰ بنویسید؟ مثلاً آیا هر بازیسازی ناچار است برای ساخت هر بازی جدید، ابتدا فرمولهای فیزیک را مجدّداً پیادهسازی کرده و از صفر تعریف کند که اگر جسمی در بازی رها شد، شتابی تحت تأثیر گرانش بگیرد؟ آیا برای ساخت ۱۰۰ فروشگاه آنلاین متفاوت، باید ۱۰۰ بار از نو تعریف کرد که محصولات چگونه لیست شوند و مشتری آنها را چگونه به سبد خرید اضافه کند؟ یا اصلاً آیا برای نمایش یک صفحهی گرافیکی ساده بر روی نمایشگر، باید جزء به جزء تعریف کرد که هر پیکسل از نمایشگر در هر لحظه چگونه باشد؟ واضح است که این درست نیست. مگر هر شرکت خودروسازی مجبور است برای تولید هر خودروی جدید، ابتدا چرخ را خودش از نو اختراع کند؟ برای جلوگیری از اختراع مجدّد چرخ در برنامهنویسی، ابزار و روشهای بسیاری وجود دارد.
برنامهنویسان خیلی از مسائل متداول و تکراری را از پیش و یکبار برای همیشه حل کرده و آنها را در قالب کتابخانه (library) منتشر میکنند – مجموعهای از زیربرنامهها و توابع آماده که میتوان به هر برنامهای افزود و استفاده کرد. به عنوان مثال، برای بسیاری از زبانهای برنامهنویسی، کتابخانهایی موسوم به Math موجود بوده که بسیاری از دستورات و توابع مهمّ ریاضی در آن پیادهسازی شده است. برای محاسبهی سینوس یک عدد در برنامهتان نیازی نیست سری تیلور را از نو پیادهسازی کنید! فقط کافیست کتابخانهی Math را به برنامهی خود افزوده و از تابع سینوس موجود در آن که پیشتر پیادهسازی شده است استفاده نمایید.
گاهی مجموعهای از کتابخانهها در کنار هم گردآوری شده تا یک جعبهابزار (toolkit) را تشکیل داده و شما را برای انجام کار خاصّی یاری دهند. برای مثال اگر قرار باشد برای برنامهی خود یک رابط کاربری گرافیکی (graphical user interface) طرّاحی کنید، آنچه معمولاً میتواند کار شما را ساده کند یک widget toolkit (همچون Qt) بوده که امکانات گوناگونی را در اختیار شما قرار میدهد.
برنامهی شما همیشه همچون جزیرهای مستقل نسبت به سایر برنامهها قرار ندارد. برای مثال اگر بخواهید در برنامهی خود از نقشه استفاده کنید، یا باید خودتان سرویسی برای نقشه تولید کرده و یا خیلی راحتتر، از سرویسی آماده چون Google Maps استفاده نمایید. یا ممکن است بسیار پیش بیاید که بخواهید برنامهی شما از امکانات موجود در سیستمعامل نیز بهره ببرد (مثلاً یک notification ارسال کند). برای ارتباط با سیستمعامل یا سایر برنامهها و سرویسها، از رابطهایی موسوم به API استفاده میگردد – تعاریف، الگوها و پروتکلهایی که امکان ارتباط میان برنامهی شما با سایر برنامهها را به صورت استاندارد و اصولی فراهم میسازد.
کتابخانهها به شما کمک میکنند تا مسائل تکراری را از نو حل نکنید. امّا مشکل دیگری که همچنان وجود دارد، ساختارهای تکراری است. در بسیاری از مواقع، قالب و ساختمان برنامهها عملاً یکی هستند . لذا در اینجا فریمورکها (framework) بسیار کاربردی بوده و به شما کمک میکنند تا بجای درگیری با حاشیهها، روی هدف اصلی تمرکز کنید. فریمورکهای بسیار متعدد و گوناگونی برای زبانهای مختلف وجود داشته که هر یک کاربردها و ویژگیهای خاصّ خود را دارند.
برای این که بتوانید عملاً یک برنامهنویس حرفهای شده و از این راه کسب درآمد کنید لازم است علاوه بر آشنایی با یک زبان برنامهنویسی، نسبت به کتابخانهها و toolkitهای رایج نیز شناخت داشته و ترجیحاً با استفاده از یک یا چند فریمورک و API خاص در حوزهی خاصّ مورد نظرتان هم آشنایی داشته باشید. این که دقیقاً چه انتخاب کنید، کاملاً وابسته به هدف و زمینهی فعّالیت شماست.
تا این نقطه شما همچون رانندهای بودید که میتواند خودرویی را براند و حتّی رانندگی را به عنوان حرفهی خود برگزنید؛ امّا هیچ شناختی نسبت به مکانیک خودرو نداشته و اصلاً نمیداند مثلاً در پشت کلاچی که هر روز با آن سر و کار دارد چه میگذرد. جز این که بخواهد یک مهندس مکانیک شود نیز نیازی به درک عمیقی از مکانیک خودرو ندارد. امّا داشتن یک دید کلّی از این که خودروی خودش چگونه کار میکند میتواند او را در بهرهوری هرچه بهتر از خودرویش یاری دهد. به همین ترتیب شما نیز احتمالاً درکی از مفاهیمی چون parsing، کامپایلر (compiler)، سیستمعامل (operating system)، شبکه و... نداشته و ندانید که برنامهای که نوشتید دقیقاً چگونه اجرا میشود. به احتمال زیاد قرار هم نیست که مثلاً زبان برنامهنویسی جدیدی طرّاحی کنید. امّا به هرحال داشتن یک شناخت و دید کلّی از چنین مفهومهایی بسیار مفید بوده و شما را یاری میدهد تا برنامههای بهتر و بهینهتری بنویسید که برای مثال با سرعت بیشتر، حافظهی مورد نیاز کمتر و امنیت بیشتری اجرا شوند. از همین رو سعی کنید علاوه بر آنچه تاکنون به صورت عملی آموختهاید، به دنبال این مفاهیم تئوری نیز باشید (سیستم دانشگاهها متأسّفانه دقیقاً برعکس است! شما را در معرض سیلی از مطالب تئوری قرار میدهند؛ بیآنکه بدانید اصلاً اینها در عمل به چه دردی میخورند!). آشنایی با چنین مفاهیمی برای یک برنامهنویس شاید اجباری نباشد امّا بسیار بسیار مفید و کاربردی است.
پیشتر نیز تأکید شد که برای برنامهنویس شدن لزومی به تحصیل در رشتهی مهندسی نرمافزار نیست. با این وجود داشتن درکی عمیق از مفاهیم و زیرشاخههای مهندسی نرمافزار است که میتواند برنامهنویس را به یک «برنامهنویس خوب» ارتقا دهد؛ مخصوصاً اگر هدف تولید نرمافزاری تجاری است.
تأکید بر این موضوع دو دلیل عمده دارد:
۱- داشتن دانشی از مهندسی نرمافزار موجب برنامهریزی و عملکرد بهتر در فرایند تولید میگردد. کمک میکند که تخمینهای اصولیتری از زمان و هزینههای مورد نیاز داشته باشید، رویکرد مناسبی در تولید اتّخاذ کنید و آمادگی تغییرات را داشته باشید، به عنوان عضوی از تیم بهتر کار کنید و...
۲- داشتن درکی از نحوهی کارکرد ماشین، سیستمعامل، کامپایلر/مفسّر، ماشین مجازی (VM) و... موجب میشود که برنامههای بهینهتری (از نظر زمان اجرا و میزان مصرف منابع سختافزاری) بنویسید.
یک مثال واقعی شاید در اینجا کمک کند: دوستی یک بازی ساده در سبک تیراندازی (shooter) درست کرده بود و از نظر برنامهنویسی نیز هیچ مشکلی نداشت و بدون هیچ خطایی کار میکرد. با هر شلّیک توسّط کاربر، شی (object) مربوط به یک گلولهی جدید در حافظه ایجاد شده و با ظاهر شدن در انتهای لولهی اسلحه، مسیری را در محیط بازی طی میکرد و درصورت اصابت به هدف، منطق لازم (کم کردن سلامتی هدف) را اجرا میکرد و در انتها نیز حذف میشد. امّا مشکلی وجود داشت: پس از مدّتی بازی کردن، اجرای بازی دیگر روان نبود و به شدّت کُند میشد. مشکلی در کدها وجود نداشت و هیچ خطایی نمایش داده نمیشد. مشکل از جای عمیقتری ریشه میگرفت: عدم درک عمیق از کارکرد RAM و CPU. دلیل این بود که با شلّیک گلولههای بسیار زیاد، هم CPU به شدّت درگیر فرایندهای ایجاد و حدف گلولهها شده و هم فضای RAM به شیوهی غیربهینهای اشغال میشود. راه حل استفاده از تکنیکی موسوم به Object Pooling است: بجای ایجاد و نابودسازی مداوم گلولهها، تعداد آنها از سقف معیّنی تجاوز نمیکند. در عوض هر گلوله پس از برخورد نابود نمیگردد، بلکه علیرغم نمایش داده نشدن در محیط بازی، جایی در RAM نگهداری شده و در شلّیکهای بعدی، بجای تولید گلولههای جدید، از همان گلوله مجدّداً استفاده میشود!
یک مثال دیگر: دستورات زیر به زبان 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ـی که قبلاً نوشته بودید، واقعاً چگونه کار میکند.
ممکن است هدف اصلی شما از برنامهنویسی، توسعهی نرمافزار نبوده باشد؛ بلکه برنامهنویسی را به عنوان ابزاری برای استفاده از یک تخصّص فرا گرفته باشید. از همین رو، این سطح جاییست که باید شروع به استفاده از برنامهنویسی در تخصّص مورد نظر خود کنید. مثلاً ممکن است بخواهید از برنامهنویسی در هوش مصنوعی و زیرشاخههای آن (برخلاف باور عمومی، هوش مصنوعی یک رشتهی فقط منحصر به کامپیوتر نیست؛ بلکه علمی میانرشتهای است)، دادهکاوی، مهندسی شبکه، آمار، ریاضیات، الکترونیک، عمران، جغرافیا و... استفاده کنید. معمولاً برای هر زمینهی تخصّصی، ابزار (فریمورکها، کتابخانهها و...) مخصوصی نیز نوشته شده است.
امکان دیگر فعّالیت به عنوان برنامهنویس ارشد (senior/señor programmer) است؛ برنامهنویسی عموماً با دانش و تجربهی بالا، آن هم نه فقط در برنامهنویسی و نرمافزار، بلکه در اخلاق تیمی، تحلیل، برآورد، مذاکره و... که تیمی از برنامهنویسان زیر نظر او کار میکنند. به غیر از برنامهنویسی ارشد، عناوین شغلی گوناگون دیگری نیز وجود دارند که هر یک به نوعی با صنعت نرمافزار ارتباطتند: CTO، مهندس نرمافزار، QA، مختصّص امنیت و... . به هر حال برای فعّالیت در همگی این عناوین شغلی، برنامهنویسی یک نیاز است (نه لزوماً برای کدنویسی مستقیم – ممکن است مثلاً یک CTO خودش مستقیماً حتّی یک خط کد هم ننویسد – بلکه برای درک دقیق از کارها).
به هر حال در این مرحله لازم است جایگاه برنامهنویسی در تخصّص خود را کشف کرده و به ابزار مورد نیاز نیز مسلّط شوید.
“If you are good at something, never do it for free.”
«اگر در چیزی مهارت داری، هیچگاه مجانی انجامش نده.»
خوب این فلسفه لزوماً همیشه درست نیست! انجام کار به صورت رایگان نیز لزوماً از سر دلسوزی یا مهربانی نیست! با ورود به دنیای برنامهنویسی خواهید دید بسیار پیش بیاید که نظریهی بازیها (Game Theory) به شما بگوید که بهترین استراتژی، بازی به صورت برد–برد است. اگر مثلاً کتابخانهای که نوشتید را آزادانه در اختیار جهان قرار دهید، برنامهنویس دیگر هم میتوانند علاوه بر استفاده، روی آن کار کرده و آن را توسعه دهند تا خود شما نیز از آن بهره ببرید. سیستمعامل گنو/لینوکس نیز به همین منوال تولید شد. پروژهای کاملاً آزاد و داوطلبانه که دسترسی هرکس به آن بلامانع است. درحالی که مثلاً ویندوز توسّط تیم خاصّی در مایکروسافت توسعه مییابد و کسی خبر ندارد که در میان کدهای آن چه خبر است، توسعهدهندگان لینوکس را میلیونها داوطلب از سراسر جهان تشکیل میدهند. هر شخص یا شرکتی میتواند ویژگیهای مورد نظر خود را به لینوکس اضافه کند، ایرادهایی که در آن پیدا میکند را رفع کند و دیگران نیز از آنچه او انجام داده است بهرهمند شوند. دلیل کارایی، قدرت و امنیت فوقالعادهی این سیستمعامل در همین فلسفه نهفته است. هماکنون در بسیاری جاها، از برخورددهندهی هاردونی بزرگ مرکز CERN در ۱۷۵ متر زیر زمین گرفته تا ایستگاه فضایی بینالمللی در ۴۰۰ کیلومتر بالای زمین، از توزیعهای گوناگون لینوکس بهتره میبرند.
در ایران نیز خوشبختانه این فرهنگ رشد خوبی داشته است؛ از ایجاد و توسعهی مخازن کد متنباز گرفته تا تولید محتوای آموزشی رایگان و تا برگزاری همایشها و دورهمیهای سالانه، ماهانه و هفتگی در بسیاری از شهرها. بسیاری از اینها حتّی تحت مدیریتهایی متمرکز نیز انجام نشده و کاملاً آنارشیستی اداره میشوند – در حقیقت کلید این پیشرفتها نیز همین مدیریت داوطلبانه و غیرمتمرکز است. با ورود به دنیای برنامهنویسی، به سرعت در خواهید یافت که تنها نیستید و افراد بسیاری داوطلبند که دستان شما را گرفته و شما را به شکلهای مختلف یاری دهند؛ همانگونه که کسانی نیز پیشتر آنها را یاری دادهاند.
بشر میکروسکوپ، تلسکوپ، رادیوتلسکوپ و... را اختراع کرد تا فراتر از توان چشمانش ببیند. استتوسکوپ، فراصوتسنج و... را اختراع کرد تا فراتر از توان گوشهایش بشنود. اهرم، موتور، پیستون و... را اختراع کرد تا فراتر از توان بازوانش نیرو وارد کند. خودرو، زیردریایی، فضاپیما و... را اختراع کرد تا فراتر از توان پاهایش جابهجا شود. و امّا خط، چرتکه و البته کامپیوتر را اختراع کرد تا فراتر از توان مغزش فکر و محاسبات کند.
تفاوتی ندارد که در کدامین زمینه مشغول به فعّالیت باشید. کامپیوتر میتواند شغل شما را دگرگون کند. برنامهنویسی نیز در این میان یک ابزار است تا بتوانید با آن به کامپیوترها فرمان دهید. ساکنین قرن ۱۹ مشغول تجربهی انقلاب صنعتی بودند که عموماً مکانیک کلیددار اصلی آن بود. امّا شما به عنوان ساکنین قرن ۲۱، مشغول تجربهکردن انقلاب دیگری هستید: انقلاب دیجیتال.
به موجب انقلاب دیجیتال، اهمّیّت توانایی کار با کامپیوترها در قرن ۲۱ به همان اندازه شده است که توانایی خواندن و نوشتن در قرن ۲۰ مهم بود. برخورداری از دانش برنامهنویسی در بسیاری از زمینهها، به زودی نه یک انتخاب بلکه یک نیاز خواهد بود. دیگر همچون قرن ۲۰، برنامهنویسی دیگر صرفاً منحصر به آزمایشگاههای Bell یا IBM نیست. حتّی دیگر منحصر به کشورهای توسعهیافته هم نیست؛ بلکه حتّی برای کشورهای درحال توسعه نیز فرصتی باالقوه جهت پیشرفت فراهم آورده است.
چه قصد جمعآوری و تحلیل دادههایی آماری را داشته باشید و چه حتّی خلق یک اثر هنری توسّط گرافیک کامپیوتری، برنامهنویسی یک ابزار بسیار مفید برای شما خواهد بود. با خرج علاقه، حوصله و البته سماجت کافی، به راحتی خواهید توانست مهارت کار با این ابزار را کسب نموده و از آن در زندگی حرفهای و حتّی بعضاً شخصی خود استفاده نمایید.