آیا برنامهنویسی را با بازیهای ویدیویی میتوان آموخت؟
if(desire_to_program > 10)
continue;
else
return;
وقتی به مردم میگویم حرفهام برنامهنویسی است، همان واکنش همیشگی از چشمانشان معلوم است؛ همان نگاههای خیره، همان لبخند مودبانه، و اینکه مشخصا میخواهند بحث را عوض کنند. اگر خوششانس باشم، ممکن است طرف صحبتم یک ایدهی جدید برای ساخت یک اپلیکیشن موبایلی انقلابی پیشنهاد کند که به نظرش بدجوری پولساز خواهد شد. اگر هم خوششانس نباشم، طرف صحبتم از من انتظار دارد تا آخر عمرم به رایگان مشاورهی فنی به او بدهم. بااینحال، گرچه بعید به نظر میرسد، اما برنامهنویسی میتواند بیشازآنچه مردم فکر میکنند سرگرمکننده باشد. آنقدر سرگرمکننده که حتی ژانری خاص برنامهنویسی در بازیهای ویدئویی وجود دارد.
اما این بازیها چقدر واقعا آموزشی هستند؟ آیا میشود با انجام آنها برنامهنویس شد؟ در همین مورد بازار استیم را شخم زدم و سه اثر که شایستهی نامزدی در این فهرست هستند را پیدا کردم. به آنها نگاهی خواهیم انداخت تا ببینیم آیا واقعا آن مهارتهای لازم را به شما میآموزانند که بتوانید اجاره بها و قبوض خانهتان را پرداخت کنید یا نه.
واضح است که کمتر بازیای میتواند به شما نحوهی کدنویسی در زبان #C را آموزش دهد، اما این بازیهای برنامهنویسیْ «مفاهیم» برنامهنویسی را به استعارههای بصری و پازلهای دسترسپذیر برگردان میکنند. بنابراین هر یک از بازیهای این فهرست را مطابق با مفاهیم برنامهنویسیای که معرفی میکنند بررسی میکنیم، تا ببینیم آیا فهم آنها بعدا وقتی برنامهنویسی را شروع کردید به کارتان میآید یا نه. فهرست را ابتدا با بازیها و مفاهیم پایهای و سادهتر شروع میکنیم و بهمرور به بازیها و مفاهیم برنامهنویسی پیچیدهتر میرسیم. اینگونه شاید یک کلاس فشرده از مفاهیم پایهای برنامهنویسی تهیه شود.
قبل از شروع باید تاکید کرد هیچیک از این بازیها ادعا نمیکنند که میتوانند کدنویسی را به شما یاد دهند؛ این صرفا نظر ماست.
Human Resource Machine
میزان سختی: تازهکار — میانرده
کل هیومن ریسورس ماشین دربارهی پردازش دادههاست. یک تسمه نقاله در مقام «ورودی»/IN مربعهایی که روی آنها عدد و حروف چاپ شده تحویل میدهد، و شما باید مربعهای صحیح — آنطور که پازلْ برای شما تعریف کرده — را به تسمه نقالهی «خروجی»/OUT بفرستید. برای این کار، فهرستی از دستورها را به کارمند مشتاقتان میدهید — این کارمند اساسا استعارهای از همان برنامه است. از آنجا که این مربعها بهطور تصادفی از تسمه نقاله بیرون میآیند، برنامهی شما هم باید تمام ترکیبهای احتمالی از اعداد و حروف را حساب کند. این مسئلهای است که تمام برنامهنویسها بهخوبی با آن آشنا هستند.
هیومن ریسورس ماشین در معرفی مفاهیم به شکل ساده عالی عمل میکند، و بهتان وقت کافی میدهد تا قبل از رسیدن به مرحلهی بعدی حسابی با دستورها آشنا شوید. از این بهتر، میشود سرعت کار کارمند را کندتر کرد، تا با دقت بیشتری بتوان دید دستوراتی که دادید کجا و چطور خلاف انتظارتان عمل کرد. نظر به اینکه برنامهنویسها وقت زیادی را به باگزدایی/دیباگینگ اختصاص میدهند، توان تجزیهی خط به خط برنامهها بسیار مفید است.
بااینحال، دسترسپذیری صرفا بخشی از معادلهی برنامهنویسی است. سوال اساسی این است: آیا هیومن ریسورس ماشین میتواند به شما برنامهنویسی را آموزش دهد؟ برای جواب، میبایست به مفاهیمی که پازلهای بازی از آنها استفاده میکند رجوع کنیم.
مفهوم: متغیرهای پایهای/Basic Variables
چه هستند؟
سروکله زدن با دادهی نامعلوم، چه در قالب تسمه نقالهای باشد که اعداد و حروف تصادفی تحویل میدهد یا دستورات سریعی که بازیکن حرفهای استارکرفت از طریق کیبورد ارسال میکند، از اجزای اساسی تقریبا همهی برنامههایی است که تاکنون نوشته شده. از آنجایی که برنامهها نمیتوانند آینده را پیشبینی کنند — البته فعلا — پس به یکجور محل نگهدارنده نیازمند هستند که در آن هر وقت دادهی نامعلومی به آنها ارسال شد بتوانند به آن انبار ذخیره رجوع کرده و معنیاش را درک کنند. اینجاست که متغیرها وارد میشوند. متغیر اساسا یکجور کانتینر برچسبدار است که در آن دادهها وجود دارند و میتوان این کانتینرها را به دلخواه پر یا خالی کرد.
چگونه آموزش داده میشوند؟
در هیومن ریسورس ماشین، مربعها حکم همان متغیرها را دارند. در مرکز هر اتاق، کف زمین به چندین مربع تقسیم شده که میتوانید موقتا اعداد و حروفی که از تسمه نقاله میگیرید را روی آنها ذخیره کنید. در لیست دستورات، این مربعها را با عددی که به آنها اطلاق شده میتوان فراخواند — این اعداد از ۰ شروع میشوند، چون در برنامهنویسی شمارش همیشه از ۰ شروع میشود و نه از ۱. البته میتوان بهجای عدد، اسامی دلخواه خودتان را به آنها اطلاق کنید تا راحتتر در ذهنتان بماند؛ مثلا ممکن است بهجای صفر، برچسب FirstAdder یا Tally به آنها بدهید. این تکنیک در برنامهنویسی خیلی مهم است، خصوصا اگر چندین و چند نفر روی یک کد یکسان کار کنند. وقتی متغیرها را درست نامگذاری کنید بعدا که به مشکل برخوردید راحتتر میتوانید ریشهاش را ببینید عوض آنکه ساعتها وقتتان تلف شود تا تازه یادتان بیاید کدی که نوشتید هدفش چیست و چکار میکند.
مفهوم: آرایهها/Arrays
چه هستند؟
وقتی متغیرها برای تعیین یک مقدار یا آبجکت مشخص استفاده شدند، سپس نوبت آرایههاست تا آبجکتهای مشابه یکدیگر را دستهبندی کنند. مثلا تصور کنید در یک بازی میخواهید اینونتوری پیاده کنید و در این اینونتوری چندین اسلات/slot برای قرار دادن آیتمها در آن وجود دارد. عوض اینکه برای هر یک از اسلاتها یک متغیر جداگانه بنویسید، میآیید و یک آرایهی «اینونتوری» تعیین میکنید که همهی آیتمها را میتوان در آن ذخیره کرد. مزیت این روش این است که آن آیتمها را میتوان با فراخوانی آرایهی «اینونتوری» فراخواند — اینونتوری[۰]، اینونتوری[۱]، اینونتوری[۲]… اینگونه برای بررسی تمام اسلاتها در اینونتوری میتوان راحتتر کد نوشت، و از نظر سختافزاری هم، آرایهها بهمراتب سبکتر و سریعترند تا تعیین متغیرها.
چگونه آموزش داده میشوند؟
هیومن ریسورس ماشین در خصوص آرایهها سرراست و بیمحدودیت است. عوض آنکه مربعها را مستقیما با برچسبها نشان دهد، مقدار درون هر یک از مربعها را میتوان بهعنوان برچسبی در ارجاع به دیگری استفاده کرد. برای مثال، مربع ‘۰’ ممکن است درون خود مقدار/عدد ۷ را داشته باشد. اگر از دستور ‘۰’ برای کپی استفاده کنید، عدد ۷ به شما برگردانده میشود. اگر هم از دستور [۰] برای کپی استفاده کنید، برنامه از عدد ۷ برای یک برچسب دیگر استفاده کرده و مقدار درون مربع شماره ۷ [که ممکن است عدد دیگری باشد] را برمیگرداند. اگر اینها زیادی گیجکننده است نگران نباشید؛ برای فهم آرایهها باید آنها را در عمل ببینید. خوشبختانه هیومن ریسورس ماشین هم با پازلهایش که شتاب مناسبی دارند اینها را در عمل به شما نشان میدهد.
مفهوم: جملات شرطی (یا همان جملات «اگر این… پس این…»/IF… THEN)
چه هستند؟
اگر برنامهها، فارغ از اینکه چه دادهای واردشان میکردید، هر دفعه خروجی یکسانی نشان میدادند، دیگر مفید نبودند. مثل بازیای میشدند که به معنای واقعی کلمه خودشان بدون دخالت بازیکن جلو میرفتند و اهمیتی نمیدادند بازیکن [از طریق کنترلر یا کیبورد] چه ورودیای بهشان میدهد. برنامهها باید تصمیمگیری کنند، چه تصمیمات ساده مثل انتخاب بین اینکه کدام یک از دو عدد بزرگترند باشد، و چه تصمیمات پیچیدهتر مثل اینکه آیا تیری که بازیکن با تیروکمان شلیک کرده به هدف میخورد یا نه. جملات شرطی حکم مغز برنامه را دارند، معادل مجازی بخش نئوکورتکس/نوقشر در مغز ما.
چگونه آموزش داده میشوند؟
برای سادهتر کردن قضیه، هیومن ریسورس ماشین دو نوع جملهی شرطی دارد: اگر عدد صفر است پس برو، و اگر عدد منفی است پس برو. با این دستورات، مقداری که در دستهای کارمندتان هست بررسی شده و اگر شرط فراهم باشد [صفر باشد یا منفی] کارمند به بخش دیگر برنامه «میرود». مثلا اگر کارمندتان مقدار ۵- در دستش باشد، دستور «اگر منفی است پس برود» اطاعت میشود و کارمند به آن نقطهای از برنامه که اشاره کردید میرود. اما اگر کارمندتان عدد ۱+ در دستش باشد، برنامه از دستور پیروی نکرده و به خط بعدی میرود. در بدو امر خیلی ساده به نظر میرسد، اما برای پازلهای بعدی به کلی از این دستورات شرطی نیاز است، و این رفتوآمدها چنان درهمبرهم میشوند که گویی یک شیطان دارد یک بازی فوتبال را رهبری میکند.
مفهوم: حلقه (یا لوپها)
چه هستند؟
تکرار، کار همیشگی محاسبات کامپیوتری است. ما برنامهنویسی میکنیم تا آن وظایفی که برایش وقت نداریم را اتوماتیک با کامپیوتر انجام دهیم، و برای این کار از لوپها استفاده میکنیم. در بازیها چگونه NPCها یک مسیر مشخص را همیشه رفتوآمد میکنند؟ دلیلش لوپهاست. چرا هر دفعه دشمنان آتش میگیرند burning damage نوار سلامتیشان را کم میکند؟ دلیلش لوپهاست. ماشینها چگونه تا زمان رسیدن به آخرین حد سرعتشان شتاب میگیرند؟ دلیلش لوپهاست. اینکه هر دفعه این اتفاقات بخواهد بیافتد آنها را دستی برنامهنویسی کنیم شدیدا نارکارآمد و وقتگیر است، و وقتی صحبت سر برنامهنویسی باشد، ناکارآمدی حکم گناه کبیره را دارد.
چگونه آموزش داده میشوند؟
هیومن ریسورس ماشین با ترکیب جملات شرطی با دستور «رفتن» است که پایههای لوپ در برنامهنویسی را آموزش میدهد. بازی به هر دو لوپ اصلی، یعنی لوپهای for و لوپهای while، میپردازد. لوپهای for مجموعهای از دستورات که از قبل تعیین شده چند بار تکرار شوند [چه یک بار و چه صد بار] را انجام میدهند. مثلا در بازی، مربعها گاهی شمارشگریاند که به صفر نزدیک میشوند تا زمانی که شرط لازم برای اجرای دستور «اگر عدد صفر است پس برو» فراهم شده و لوپ شکسته شود. لوپهای while هم همینطور هستند، با این تفاوت که زمان و تعداد دفعات تکرار از قبل تعیین نشده و تا زمانی که شرط لازم فراهم نباشد تا بینهایت تکرار میشوند. همینطور که پازلها سختتر میشوند، باید هر دو نوع لوپ را با آرایهها با هم ترکیب کنید تا فهرستی از دادههایی که طول نامعلومی دارند پردازش شوند. این نیز از بخشهای اساسی برنامهنویسی است، و هیومن ریسورس ماشین به نحو احسن و بهمرور آن را نمایش میدهد.
نتیجهگیری:
با کمک مفاهیم آشنا مثل مربعها و تسمه نقالهها، و با تمرکز روی چند دستور محدود، هیومن ریسورس ماشین به خوبی اصول پایهای برنامهنویسی را معرفی میکند. دستورهایی که با رنگهای مختلف کدنویسی شدهاند و نحوهی رفتوآمد کارمند در اتاق یادآور فلوچارتها هستند، و میتوان با آنها مراحلی که برای اجرای برنامه طی میشود را راحتتر دنبال کرد. استفاده از کلماتی مثل copyfrom و bump که مستقیما از برنامهنویسی برداشته شده اینطور نیست که یک به یک با زبانهای برنامهنویسی مدرن مشترک باشد، اما مفهوم و زیربنایشان با هم مشترک است. بعد از اینکه خوب پازلهای این بازی را حل کردید، برای شروع یادگیری برنامهنویسی در دنیای واقعی آمادهاید.
Hack ‘n’ Slash
میزان سختی: میانرده — حرفهای
شاید هنوز میخواهید قبل از اینکه وارد دنیای برنامهنویسی شوید بیشتر خودتان را گرم کنید. اینجاست که هک اند اسلش به کمکتان میآید. در نگاه اول، به نظر یک بازی مرسوم اکشن ادونچر دیگر در مایههای زلدا است. اما عوض اینکه دشمنان را قلع و قمع کنید، «هک» میکنید، یعنی با شمشیری که حکم یواسبی دارد رفتارشان را از نو برنامهنویسی میکنید. تقریبا تمام اشیای جهان بازی را میتوان به همین شیوه برنامهنویسی کرد، تا جایی که با بازنویسی کدهای بازی باعث شوید کرش/crash کند. این همزمان هم مزیت و هم عیب بازی است؛ از یک طرف، آزادی بیحدوحصری در حل همهی پازلها دارید، اما از طرف دیگر، وقتی راهحلتان جواب ندهد بدجوری آچمز میشوید. البته کل روند برنامهنویسی هم همچین حالتی دارد.
معضل اصلی هک اند اسلش این است که عملا دو بازی متفاوت درون یک بازی قرار داده شده — یکیشان پازلهایی شبیه زلدا دارد که مفاهیمی مثل متغیرها و روتینها را عمیقتر از هیومن ریسورس ماشین نشان میدهد، و یکی هم یک دیباگر تمام عیار است که بدون اینکه دستتان را بگیرد میان کلی کد ضمخت و نتراشیده رهایتان میکند. بنابراین انجام بازی هک اند اسلش سخت است، اما اگر با آن کنار بیایید، چیزهای بسیار خوبی در آن پیدا خواهید کرد.
مفهوم: متغیرهای پیشرفته/Advanced Variables
چه هستند؟
همانطور که قبلا اشاره شد، با متغیرها میشود دادهها را در برنامه ذخیره و بعدا فراخوان کرد. در هک اند اسلش، این دادههای ذخیرهشده برعکس هیومن سورس ماشین صرفا یکسری حروف و اعداد ساده نیستند، و نقششان در جهتدهی به رفتار برنامه بهمراتب واضحتر است.
چگونه آموزش داده میشوند؟
هک اند اسلش مفهوم متغیرها را با معرفی متغیرهای «مقولهبندیشده» نشان میدهد. اینها متغیرهایی هستند که تنها مقولهی خاصی از مقادیر را نگهداری میکنند، یا مقادیری که صرفا درست/true یا نادرست/false هستند. وقتی دشمنی را هک میکنید، فهرستی از متغیرهایی که میتوانید با آنها سروکله بزنید ظاهر میشود، ولی مقدار آنها را بسته به اینکه در چه مقولهای هستند میتوانید عوض کنید. مثلا نمیتوانید در متغیری که تنها اعداد را ذخیره میکند حروف وارد کنید، و نمیتوانید اعداد را ورای محدودیتی که برایش مشخص شده بالا ببرید. بهخاطر این قوانین نانوشته، بهمرور فرق بین بولی/Boolean، متغیرهای نشاندهندهی اعداد صحیح/integer، و رشتهها/strings را یاد میگیرید، حتی اگر آنها را به اسم نشناسید.
دشواریای که در آموزش متغیرها وجود دارد این است که بازی دقیقا مشخص نمیکند تغییر مقادیر متغیرها چگونه روی رفتار برنامه اثر میگذارد. بااینحال آزمون و خطا برای تشخیص این مسائل برای هر برنامهنویسی تمرین ذهنی خوبی است، خصوصا در زمان آزمایش و باگزدایی از برنامه. چون برنامهها باید بتوانند همهجور دادهای که واردشان میشود را پردازش کنند، حتی باید بتوانند آن دادههایی که باعث خرابی میشود را نادیده بگیرند. وقتی میفهمید با قرار دادن متغیر دمیج دریافتی دشمنان روی مقدار ۱- چقدر راحت کل دشمنان فرو میپاشند، تازه میفهمید چقدر آزمایش و باگزدایی مهم است، و این درس در برنامهنویسی بسیار اهمیت دارد.
مفهوم: قواعد نحوی (یا سینتکس/Syntax)
چه هستند؟
درست مثل زبانی که برای برقراری ارتباط با هم استفاده میکنیم، زبانهای برنامهنویسی هم برای اینکه چطور باید کلمات را کنار هم قرار داد تا جمله تشکیل شود قوانین خاص خودشان را دارند. به این گرامرْ سینتکس یا قواعد نحوی میگویند، و گرچه از زبانی به زبان دیگر فرق دارد، اما اکثر زبانهای برنامهنویسی امروزی از همان موازینی که چهار دهه قبل زبان C بنا گذاشته بود پیروی میکنند.
چگونه آموزش داده میشوند؟
بعد از اینکه سروکله زدن با متغیرها تمام شد، هک اند اسلش در نیمهی دوم بازی مفهوم سینتکس را معرفی میکند و مخاطب وارد کار با کدها به شکل خام آن میشود. این کدها بر اساس زبان برنامهنویسی لوآ هستند اما در سینتکس بعضی چیزها تغییر کرده که احتمالا برای این بوده تا برای مخاطب تازهوارد قابلفهمتر شود. بااینحال، در عمل، استفاده از این عبارات مندرآوردی [بهجای عباراتی که در زبان لوآ تثبیت شده] بدتر باعث گیجی شده و بازیکنی که آنها را میآموزد برای اینکه بعدا آنها را در دنیای واقعی استفاده کند محدودیت دارد. خوشبختانه، پرکاربردترین بخشهای سینتکس دستنخورده باقی مانده و میتواند شما را با ساختار کلی کدهای امروزی آشنا کند.
چنین دستور زبانهایی شامل سینتکس نقطه میشود، که مثلا در عباراتی مثل Port.Value استفاده میکنیم، که به مقدار یا Value متغیر درون یک آبجکت به نام Port ارجاع میدهد [یعنی متغیر Port را میتوان عوض کرد، مثلا ۱۰ گذاشت یا ۱۰۰]، و ساختار جملات شرطی برای تصمیمگیری. برای اینکه این قوانین سردرگمکننده سادهتر شوند، هک اند اسلش نسخهای بصری از آن کدها نشان میدهد، که متغیرها به شکل کریستالهای رنگی درآمدهاند که وقتی وارد ماشینها میشوند ماشین به حرکت درمیآید. خطوط رنگی هم مسیر جریان برنامه بین این ماشینها را نشان میدهد، گرچه این ماشینها آنقدر نزدیک هم چپانده شدهاند که گاهی سخت میشود ترتیب عملیات برنامه را دنبال کرد.
مفهوم: توابع/متدها (Functions)
چه هستند؟
یک ضربالمثل قدیمی هست که میگوید در برنامهنویسی ۹۰ درصد زمان برنامه صرف اجرای ۱۰ درصد از کدهای آن میشود. به عبارت دیگر، برنامهها بیشتر وقتشان را صرف تکرار عملیاتهای تکراری میکنند. برای اینکه از این قضیه سود ببریم، تکراریترین بخش کد را به توابع مختلف تقسیم میکنیم، و هر زمان برنامه بخواهد آن کد را اجرا کند، آن تابع را با دستوری مثل ()funFunction فرامیخوانیم. بنابراین دیگر لازم نیست همان کدها را بارها در طول برنامه از اول بنویسیم، و از این مهمتر، اگر بعدا لازم شد کدهای پرتکرار را ویرایش کنیم صرفا کافی است خود تابع ویرایش شود عوض اینکه برگردیم و تک تک کدها را ویرایش کنیم.
چگونه آموزش داده میشوند؟
در نسخهی بصری بازی از کدها، توابع به شکل ماشینهای غولپیکر درآمدهاند، و مثل خود دشمنان و بقیهی اشیای درون محیط قابل هکشدن هستند. بنابراین یکجور سناریو شبیه به فیلم اینسپشن پیش میآید، که فرد [بهجای رویا] از درون کدها وارد درون کدهای دیگر میشود. تغییراتی که در توابع داده میشود روی کل بازی اثر خواهد گذاشت، و احتمالا جلوتر پیامدهای غیرقابلمنتظرهای برای بازی دارد. این یکی از پرتکرارترین مشکلاتی است که در برنامهنویسی و خصوصا در پروژههای بزرگ پیش میآید، و به شما آموزش میدهد چگونه تغییرات کوچک در کدها باعث تغییرات بسیار بزرگ روی کل سیستم میشود.
نتیجهگیری:
هک اند اسلش را اگر صرفا به چشم یک بازی ببینیم مشکلات زیادی دارد. اما اگر به چشم ابزاری برای آموزش برنامهنویسی ببینیم بهمراتب بهتر میشود. با تمرکز روی تغییر مقادیر، و تصویرسازی و عینیتبخشی به توابع در قالب ماشینهای فیزیکی، مفاهیمی را به مخاطب میآموزاند که برای هر کسی که سودای برنامهنویسشدن دارد ارزشمند است. اگر آماده باشید و تحمیل کنید برنامهنویسی چقدر میتواند پر از آزمون و خطا و سرخوردگی باشد، به فهم خیلی خوبی از سازوکار سیستمها و روندی که طی میکنند میرسید؛ روندی که زیربنای تمام زبانهای دوران مدرن است.
TIS-100
میزان سختی: حرفهای+
اولین چیزی که زمان شروع TIS-100 میشنوید صدای سرد و بیروح بوتشدن یک مانیتور قدیمی CRT است. اینکه آیا این باعث نوستالژی میشود یا نه بعدا نشان خواهد داد آیا این بازی را خواهید پسندید یا نه — البته بهسختی میتوان این کامپایلر زبان اسمبلی که لباس بازی ویدئویی به تن کرده را صرفا یک بازی نامید. حواستان باشد که TIS-100 تنها برای مشتاقترین برنامهنویسها مفید است. اگر از قبل با جملات شرطی و تکرار و اینجور چیزها آشنایی ندارید، پس تا بیاید دستتان راه بیافتد بسیار طول میکشد. حتی اگر هم باتجربه هستید if(have_exp == true)، باز هم TIS-100 بازی سادهای نخواهد بود.
برای آنها که آشنایی ندارند: زبان اسمبلی فرمی از زبان برنامهنویسی است که در دهههای پنجاه و شصت معمول بود، قبل از آنکه با زبانهای سطح بالا مثل C در دهههای هفتاد و بعدی جایگزین شود. دستورالعملهای مبتنی بر اسمبلی معمولا بر اساس کدهای ماشینیای که کامپیوتر برای حرف زدن با خودش استفاده میکند چیده شدهاند، و بنابراین خواندن و نوشتن آنها در مقایسه با جاوا و #C بسیار سختتر است. بااینحال، با همهی کهنگیاش، TIS-100 هنوز با مفاهیمی سروکله میزند که تا امروز به قوت خود باقی ماندهاند.
مفهوم: ارتباطگیری/Communication
چه هستند؟
ارتباطگیری بخش اساسی برنامهنویسی مدرن است. از لیدربوردهای آنلاین تا شوترهای اول چندنفره و MMOها، بازیهای امروزی بیشازپیش برای اینکه سرگرمکنندهتر باشند باید با هم ارتباط برقرار کنند. مسئله این است که، عملا شدنی نیست که یک برنامه بتواند بفهمد شخص دوم در لحظه دارد چکار میکند، و برای همین ارتباطگیری بین این اشخاص دشوار میشود. تصور کنید دو نفر دارند با هم مکالمه میکنند و همزمان با گوشی خود ور میروند. اگر یکی از افراد توجهش به سمت گوشی برود، احتمالا صدای طرف مقابل را نخواهد شنید. برای حل مشکل، برنامهها با کمک پورتها و ساکت/socketها با هم ارتباط میگیرند، که اساسا حکم نامههای اداره پست را دارند که توسط سیستم عامل/operating system مدیریت میشوند. اینگونه برنامه میتواند داده را ارسال کرده و برود به کارهای دیگرش برسد، و بار چک کردن پیغامهای جدید روی دوش گیرنده بیافتد.
چگونه آموزش داده میشوند؟
برنامههای TIS-100 به چند نود/node تقسیم میشوند، و هر یک تنها دستورالعملهای محدودی را اجرا میکنند. برای رسیدن به هدفی که بازی در نظر گرفته باید مجموعهی زیادی از دادهها را بین این نودها به اشتراک بگذارید. بدتر اینکه، هر نود تنها میتواند با آن نودهایی که نزدیکش هستند ارتباط برقرار کند، و مشکل را پیچیدهتر میکند. رسیدن به راهحل درستوحسابی یعنی هر نود را باید به چشم یک برنامهی مجزا ببینید که محرم فقط به عملیاتهای خودش است. اینکه کاری کنید تا همهی اینها با هم دست همکاری بدهند یعنی باید یک پروتکل برای ارتباطگیری بین آنها بسازید که شبیه به کاری است که برنامهنویس شبکه انجام میدهد. با حل این چالشها سریعا خواهید فهمید قانعکردن برنامههای مختلف برای اینکه با هم همکاری کنند سختتر از آن چیزی است که فکر میکردید.
مفهوم: استک/Stack
چه هستند؟
مثل آرایهها، استکها هم مثل کانتینرهایی هستند که دادههای شبیه به یکدیگر را دستهبندی میکنند. بااینحال، استک بیشتر مناسب محیطهای بهاشتراکگذاریدادههاست که برنامههای مختلف، یا بخشهای مختلف یک برنامه، باید به یک دادهی یکسان دسترسی پیدا کنند بیآنکه مستقیما با هم ارتباط بگیرند. همانطور که از نامش هم پیداست، استکْ دادهها را در یک فهرست عمودی ذخیره میکند، درست مثل مدیریت موجودی به روش لایفو/LIFO (مخفف Last In, First Out). لایفو چیست؟ وقتی یک آیتم جدید به فهرست اضافه میشود، به صدر فهرست میرود، و وقتی آیتمی حذف میشود، از همان صدر فهرست خارج میشود. آن را به چشم انباری ببینید که جدیدترین کالای موجود را ابتدا ارسال میکند چون کالای جدید را نسبت به کالای قدیمی اولویت قرار میدهد. یا مثلا دکمهی Back مرورگر را در نظر بگیرید که همیشه به آخرین مورد از فهرست history سرچهایتان رجوع میکند.
چگونه آموزش داده میشوند؟
همینطور که پیچیدگی برنامههایی که مینویسید افزایش مییابد، جهتدهی به دادهها بین نودهای مختلف که تنها دو چیز را میتوانند بهطور همزمان در خود جای دهند بهمرور شبیه آن بازی پچپچ چینی میشود و شانس خطای برنامه مدام بیشتر میشود [منظور از پچپچ چینی/Chinese whispers همان یک کلاغ چهل کلاغ است. در این بازی، شخص کلمهای در گوش نفر بغلی ادا میکند و نفر بعدی باید همان کلمه را در گوش نفر بغلی بگوید. همینطور که این کلمه دهان به دهان میچرخد، مخصوصا اگر افراد زیادی دخیل باشند، شانس خطا بالا رفته و کلمه اولیه دچار تغییر میشود]. بعدا که در بازی نودهای استک وارد میشوند و میتوانند بینهایت داده را در خود جای دهند کارتان برای مدیریت حجم عظیم دادهها راحتتر میشود، اما این مزیت بیهزینه به دست نمیآید. حالا باید مسائلی مثل گره در سیستم را حل کنید، یعنی وقتی یک نود منتظر است تا یک استک خالیْ دوباره پر شود، اما نودی که قرار استک را پر کند خودش در صف انتظار است تا از آن نود اصلی چیزی دریافت کند — یعنی بنبست! مشکل بعدی هم این است که فلان استک را باید طوری پر کرد که تنها دادههای مشخصی واردش شوند و دادههای دیگر اشتباهی سرریز نشده و با آن قاطی نشوند. سبکوسنگینکردن مزایا و معایب استفاده از استک نودها یا مدیریت دادهها به صورت دستی، از آن ملاحظاتی است که برنامهنویسها معمولا با آن زیاد سروکله میزنند.
نتیجهگیری:
گرچه TIS-100 شبیه جنسی عتیقه است اما منسوخ نیست. از منوهای overlaying تا multi-core programming، مفاهیمی مثل حافظهی استک و پورتهای شبکه هنوز هم در دنیای امروز کاربرد دارند. برای کسی که در دنیای واقعی دارد تمرین برنامهنویسی انجام میدهد، TIS-100 آخرین مانع است؛ اگر بتوانید از چالشهای دشوارش جان سالم بدر ببرید، یعنی دیگر آمادهاید برای کدنویسی.
حسن ختام
پس، آیا میتوانید با انجام بازیها برنامهنویسی یاد بگیرید؟ میگویم بله، اما قبلش باید چند هشدار بدهم. اول، چالشهای برنامهنویسی بهندرت مثل پازلهایی که در بازیهای بالا دیدیم از قبل تعریف شدهاند؛ نیازمندیهای پروژه در طول توسعهی نرمافزار بارها تغییر میکند، و گاهی نمیدانید کاری که دارید میکنید اصلا شدنی هست یا نه و این را تا زمانی که مشکل حل شود یا کلا بیخیالش شوید ادامه میدهید. پس بهتر است در رزومهی کاری از هیومن ریسورس ماشین نام نبرید. دوم، بازیها بهتنهایی شما را به جان کارمک تبدیل نمیکنند؛ پایهها را آموزش میدهند و ذهنیت یک برنامهنویس را در شما تقویت میکنند، ولی باز هم باید شدیدا تحقیق، تمرین و مطالعه کنید تا بتوانید مثلا دووم/DOOM بعدی را بسازید.
بااینحال، اگر با انتظارات معقول و عزم راسخ سراغشان بروید، بازیهایی که مثلا فهرست کردم میتوانند قدم اول خوبی برای شروع برنامهنویسی باشند. فقط مهمترین قانون کار در صنعت تکنولوژی را همیشه یادتان باشد: هیچوقت به کسی نگویید شغلتان چیست، وگرنه مجبورید تا آخر عمرتان مشکل کامپیوترهای پر از خرتوپرت ناخواسته (Bloatware) خانواده و فامیل را حل کنید.
نویسنده: Matt Sayer
منبع: Rock, Paper, Shotgun