باگ چیست؟ گول ظاهر کوتاه این پرسش را نخورید! برای فهمیدن ماهیت باگ و شناخت راههای تعامل با آن این جا هستیم تا تمام جنبههای مختلف ماجرا را بررسی کنیم و هیچ نقطه ابهامی درباره این موضوع باقی نگذاریم. در ادامه نیز به انواع باگ در برنامه نویسی و بعد از آن به انواع باگ در بازی و صنعت گیمینگ میپردازیم تا ببینیم وقتی وسط بازی و در جذابترین لحظه آن به بیرون از بازی پرت میشویم چه دستهایی پشت پرده باعث رخ دادن این اتفاق میشوند؟ تا انتها همراه پارسی گیم باشید.
معنی باگ در لغت
همان طور که میدانید باگ یا Bug یک واژه انگلیسی به معنای حشره و در معنای جزئیتر کفشدوزک یا سوسک است که حدود 150 سالی میشود معنای جدیدی برای آن تعریف شده است و میتوان این واژه را در مفهوم دیگری به کار برد. واژه باگ این روزها بیش از آن که در معنای واقعی خود به کار برود در مفهوم استعاری استفاده میشود. مفهوم استعاری کلمه Bug معنای جدید اشکال، خطا، مشکل نرمافزاری و خرابی را ایجاد میکند که بیشتر در دنیای تکنولوژی و برنامهنویسی ورد زبانها است.
واژه Bug در اصل به معنای حشره و در استعاره به معنای اشکال نرمافزاری و خطا است.
کاربرد این کلمه آن قدر وسیع است که اخیرا شاهد استفاده از آن در اتفاقات روزمره زندگی هستیم؛ در واقع دیگر نمیتوان این واژه را در یک معنای اصلی و فرعی محدود کرد و با توجه به همهگیری معنای کنایی واژه، از این پس باگ را در دو معنای اصلی معرفی میکنیم.
باگ چیست و چه مفهومی دارد؟
به طور خلاصه باگ یا Bug یک اشکال نرمافزاری است که در حین برنامهنویسی و پیادهسازی نرمافزار ایجاد میشود و عمدتا یک خطای انسانی است. برای این که بهتر این موضوع را درک کنید لازم است تا چند نکته را درباره برنامهنویسی متذکر شوم. در برنامهنویسی قواعدی برای نوشتن کد وجود دارد و این قواعد برای تمام زبانها است. درست مانند زبان فارسی که از دستور زبان فارسی تبعیت میکند یا زبان انگلیسی که یک گرامر قانونمند دارد، زبانهای برنامهنویسی نیز قواعد و چهارچوبی را تعیین میکنند و برنامهنویس موظف است تا بر آن اساس کد خود را پیاده کند.
دلیل این قانونمندی تعامل بهتر و قابل فهم بین انسان و کامپیوتر است. اگر انسان به هر شیوهای که خود دوست دارد صحبت کند یا برنامه خود را بنویسد، کامپیوتر از فهم آن عاجز خواهد ماند. بنابراین برنامهنویس ابتدا باید قاعده زبان را بیاموزد و از آن پس تحت آن چهارچوب کد خود را نوشته و به کامپیوتر بشناساند. حالا اگر این قاعده رعایت نشود کامپیوتر به شما اخطار میدهد و میگوید: من متوجه نمیشوم، یک جای کار میلنگد! این جا است که با یک باگ یا اشکال مواجه میشویم.
باگ از کجا پیدا شده است؟
تاریخ همیشه روایتهای جالبی برای ما داشته است. یکی از این روایتها ماجرای خانم هاپر را نقل میکند. گریس هاپر هنگامی که در حال کار روی ماشینحساب خود بود متوجه یک اشکال فنی در نحوه کارکرد آن شد. خانم گریس هاپر در سال 1945 روی ماشینحساب Mark 2 کار میکرد و زمانی که متوجه ایراد در عملکرد آن شد شروع به بررسی عوامل مشکلساز کرد اما غافل از این که همه چیز زیر سر یک حشره (Bug) موذی است که میان قطعات خزیده است و کار را با مشکل مواجه کرده است. این طور شد که خانم هاپر برای اولینبار واژه باگ را برای ایراد فنی به کار برد و به گوش همه رساند. بسیاری معتقدند قبل از خانم هاپر، افرادی مانند ادیسون از واژه باگ استفاده کرده بودند اما چیزی که بیش از سایر موارد گفته میشود این است که هاپر نخستین کسی بود که باعث گسترش کاربرد این واژه شد.
انواع باگ چیست؟
باگها انواع مختلفی دارند که در ادامه مطلب به آنها خواهیم پرداخت. بعضی از باگها مربوط به ریاضیات، منطق و به طور کلی نحوه ساز و کار کامپیوتر هستند؛ یعنی اگر برنامهای طوری باشد که با شیوه کار کامپیوتر همخوانی نداشته باشد، با مشکل روبهرو خواهیم شد. در مقابل بعضی از باگها یا اشکالات نیز مربوط به شیوه تعامل انسان با کامپیوتر هستند و معمولا با دقت بیشتر و یک اقدام جزئی حل میشوند.
خوب است با چند مثال درک بهتری نسبت به انواع باگ پیدا کنیم.
فرض کنید فردی در خانه میخواهد شما را نسبت به کاری که انجام میدهید راهنمایی کند (در گوشه ذهنتان این فرد را برنامهنویس و خودتان را کامپیوتر تصور کنید). این فرد به شما خبر میدهد که بیرون هوا ابری است و در ادامه دو جمله را برایتان تعیین میکند:
- اگر باران بارید چتر بردار.
- اگر باران بارید بیرون نرو.
با خواندن این دو جمله به چه نتیجهای میرسید؟ به نظرتان این دو جمله از نظر منطقی درست هستند؟ هر کدام از جملهها به تنهایی درست و کاملا منطقی هستند اما زمانی که با هم ترکیب میشوند مشکل درست میکنند. اگر کمی دقت کنیم متوجه میشویم که در صورت بارش باران، ما باید چتر برداریم و در خانه بمانیم! خوب لزومی به برداشتن چتر وجود نداشت چرا که هیچ کسی با چتر در خانه قدم نمیزند. این دو دستور شما را با منطق خودتان درگیر میکند و در صورتی که به مشکل (باگ) برخوردید به آن فرد اعتراض میکنید و این مشکل را به او اعلام میکنید. به طور مشابه اگر کامپیوتر از نظر منطقی به مشکل بربخورد به برنامهنویس اعلام میکند.
بعضی از باگها هم ذاتی هستند؛ یعنی اگر موضوعی را به کامپیوتر بگویید که آن را با تناقض ساختاری و عملکردی مواجه کند اخطار میدهد. به عبارت بهتر اگر برای انجام یک فرایند، کامپیوتر با ترتیب A، B سپس C آن کار را انجام دهد اما در هنگام برنامهنویسی از آن خواسته شود این عملیات را با ترتیب دیگری (مانند B، A بعد C) انجام دهد با ارور مواجه میشویم.
در دنیای برنامهنویسی یک جمله خیلی معروف وجود دارد آن هم این که «کامپیوتر یک ماشین بسیار خنگ اما دقیق است» و دقیقا همان کاری را انجام میدهد که شما به آن امر میکنید. کامپیوتر به شما میگوید که برای فهم بهتر باید بر اساس یک سری ضوابط با من رفتار کنید. به عنوان مثال در آخر هر گزاره یک علامت خاص بگذارید یا رشتهها را در داخل کوتیشن قرار دهید و… . در صورتی که این اصول رعایت نشود با اخطار کامپیوتر مواجه میشوید.
به طور کلی باگها قابل برطرف شدن هستند و با تمهیدات برنامهنویس میتوان آنها را رفع کرد اما بعضی از باگها بدون ارور یا خطای خاصی از زیر دست برنامهنویسان در میروند و بعدها در هنگام اجرای نرمافزار خودنمایی میکنند. برای درک بهتر در ادامه میخواهیم تفاوت ارور یا Error را با باگ بررسی کنیم. مطمئنا این قسمت به شفافسازی موضوع کمک بسزایی خواهد کرد.
باگ چه تفاوتی با ارور یا خطا دارد؟
شاید برخی از شما هنگام خواندن بخش انواع باگها کمی گیج شده باشید اما جای نگرانی نیست؛ در این بخش میخواهیم ابهامزدایی کنیم. با دو کلمه «غذا» و «برنج» شروع میکنیم! به نظر شما کدام زیرمجموعه دیگری است؟ همان طور که واضح است برنج زیرمجموعه غذا است و میتوان گفت برنج نوعی غذا است اما غذا نوعی برنج نیست. این استدلال ریاضی را در دوران مدرسه زیاد به کار بردهایم. به طور مشابه میخواهیم همین جا برای دو اصطلاح ارور و باگ از آن کمک بگیریم.
درست است که تعریف خیلی دقیقی برای باگ و ارور به نحوی که بخواهد این دو کلمه را کاملا از هم تفکیک کند وجود ندارد اما بر اساس تجربه و کاربردی که از این دو کلمه در دنیای برنامهنویسی وجود دارد میتوانیم این طور استدلال کنیم که ارور زیرمجموعهای از انواع باگها است و هر خطا یا مشکلی که هنگام نوشتن کد، اتمام آن و توسعه و انتشار نرمافزار رخ میدهد تحت دامنه مفهوم Bug قرار میگیرد اما باز هم میتوان بین این دو تمایزهایی قائل شد و در موقعیتهایی آنها را متفاوت از هم قلمداد کرد.
ارور یا Error در لغت به معنای خطا، اشتباه و تقصیر (سهوی) است. از همین معنا میتوانیم به کاربرد آن در Programming نیز پی ببریم؛ ارور در برنامهنویسی به اشتباهاتی اطلاق میشود که ناشی از نقض قوانین ساختاری «کد» است و همه چیز به همان چند خط کد ختم میشود. مقصر اصلی در به وجود آمدن ارور، برنامهنویس است چرا که نویسنده کد، انسان است و میتواند دچار خطا و اشتباه انسانی شود.
گذشته از نوشتن کد، اگر در اجرا یا عملکرد کد اشکالی ایجاد شود ما با باگ مواجه میشویم. در واقع برای این که این دو مفهوم کاملا از هم تفکیک شوند این طور بیان میکنیم که ارور تنها محدود به اشتباهات بدنه کد است اما باگ عمومیت بیشتری دارد و شامل عملکرد کد و نحوه کار کردن آن نیز میشود. (البته بسیاری از برنامهنویسان در هنگام کدزنی توجه زیادی به تفکیک این دو کلمه از هم ندارند. هنگامی که کدی نوشته میشود از عبارت باگزدایی یا همان Debugging استفاده میشود و هنگامی که باگها توسط مفسر به برنامهنویس شناسانده شد آنها را با عنوان ارور خطاب میکند. در واقع ارور در قلب باگزدایی قرار دارد و این دو در فرایند برنامه نوشتن به کرات به جای هم استفاده میشوند.)
جدول زیر تفاوت ارور و باگ را به خوبی نشان میدهد:
Bug | Error |
به دلیل نقص در سیستم نرمافزاری است و به اشکال در نحوه کارکرد کد اشاره دارد | اشکال در بدنه کد است و در صورت اصلاح نوشتهها، درست میشود |
قبل از انتشار نرمافزار، شناسایی و برطرف میشود (و در مواقعی بعد از انتشار و با ارائه آپدیتهای جدید حل میشود) | هنگام نوشتن کد برطرف میشود، در غیر این صورت کد اصلا کار نمیکند |
ناشی از اشتباهات انسانی و غیرانسانی است | صرفا دلایل انسانی دارد |
البته برخی از متخصصان حوزه برنامهنویسی از عبارت گستردهتری به نام Issue (مشکل یا مسئله) استفاده میکنند که بسیار جامعتر است و دو عبارت باگ و ارور را تحت سلطه خود میگیرد اما چیزی که کاربرد بیشتری دارد عبارت باگ است که سعی کردیم بگوییم باگ چیست و چه تفاوتی با ارور دارد. اگر همچنان سوالی در این مورد داشتید در بخش نظرات مطرح کنید.
یک مثال ملموس
حتما بارها برایتان پیش آمده است که در یک وبسایت روی دکمهای کلیک کنید و در ادامه، آن انتظارتان برآورده نشده باشد. مثلا میخواهید دکمه دانلود بازی را بزنید اما به جای دانلود از صفحه به بیرون پرت میشوید و به صفحه نخست سایت میروید یا مثلا وقتی دارید با هدفون بیسیم به موزیک گوش میدهید ولیوم خودبهخود زیاد میشود و… . همه اینها مثالهایی از باگهای نرمافزاری هستند که در زندگی روزمره با آنها مواجه میشویم (البته تمام این مثالها در مواقعی میتوانند دلایل دیگری از جمله ایرادات فنی یا سختافزاری نیز داشته باشند. به هر حال آن مسئله وقتی به طور دقیق بررسی شود مشکلساز اصلی مشخص خواهد شد).
در مقابل ارور مربوط به پشت صحنه است و پای کد را به وسط میکشد. معمولا سادهترین موضوع در Programming، چاپ عبارت Hello World است؛ به عنوان مثال اگر بخواهیم این عبارت را در زبان C (در زبانهای دیگر نیز اگر چهارچوب رعایت نشود با ارور مواجه میشویم) بنویسیم باید تایپ کنیم:
#include <stdio.h>
int main () {
printf ("Hello World");
return 0;
}
اما اگر به جای عبارت ;printf (“Hello World”) چیز دیگری بنویسیم (مثلا ;printf (Hello World) که دابل کوتیشنها فراموش شدهاند) با ارور مواجه میشویم. بنابراین اگر تغییری در ساختار کد اعمال کنیم که مطابق چهارچوبها نباشد (فرقی نمیکند در چه زبان برنامهنویسی) با حجم قابل توجهی از خطاها روبهرو خواهیم شد و باید به جنگ با آنها برویم و برطرفشان کنیم.
انواع باگ در برنامه نویسی
بعد از یک بحث مفصل درباره ماهیت ارور و توضیح این که باگ چیست و چه مفهومی دارد اکنون وقت آن رسیده است تا انواع باگ را در برنامه نویسی بررسی کنیم. مسلما هر کدام از باگها از یک مشکل خاص ناشی شدهاند و شناخت این منبع میتواند به سریعتر و بهینهتر حل کردن باگها کمک کند.
Syntax errors
رایجترین باگ یا اروری که هنگام برنامهنویسی با آن مواجه میشویم خطای Syntax است که نشان میدهد حداقل یک بخشی از کار شما در نوشتن کد اشتباه است. مثلا اگر کاراکتری در کد نوشته نشده باشد (مثلا یک براکت یا یک علامت مثل ; ) خطای سینتکس خود را نشان میدهد.
Logic errors
خطای لاجیکال یا منطقی خطایی است که کامپیوتر را تا مرز هنگ کردن نیز میبرد! یک خطای منطقی معروف، حلقه بینهایت است. وقتی به کامپیوتر میگویید «تا وقتی 2 بزرگتر از 1 است چاپ کن True» چیزی که مبرهن است ادامه پیدا کردن این دستور است؛ کامپیوتر تا ابد عبارت True را چاپ خواهد کرد چرا که تا قیام قیامت عدد 2 بزرگتر از 1 خواهد بود. گاهی ممکن است مفسر اروری نمایش ندهد و همین طور True چاپ کند. برای حل مشکل باید به طور دستی، Debugging را متوقف کنید.
Resource Error
در برنامهنویسی باید همه چیز را در اختیار کامپیوتر قرار دهید و سپس دستورهای لازم را به او بدهید. اگر این کار را نکنید با این خطا مواجه میشوید. مثلا اگر متغیری به نام A را تعریف کرده باشید و در خطوط بعدی متغیر a را به کار ببرید کامپیوتر اعلام میکند که تا به حال با متغیری به نام a برخورد نکرده است و برای او ناشناخته است چرا که شما A (آ بزرگ) را به کامپیوتر معرفی کردهاید و اکنون باید این خطا را با تغییر A به a یا برعکس رفع کنید.
Arithmetic Error
خطاهای محاسباتی یا Arithmetic Error زمانی رخ میدهند که نرمافزار در ریاضیات به بنبست بر بخورد. مثلا اگر عددی را تقسیم بر صفر کنیم این خطا به نمایش در میآید. در اشکالزدایی این خطا دقت کنید چرا که گاهی یک اشتباه محاسباتی ساده میتواند به مشکلات پرهزینه منجر شود. در سیستم بانکداری توجه ویژهای به Debugging خطای محاسباتی میشود. بد نیست بدانید معمولا این خطا تنها به ریاضیات مربوط است و دلیل دیگری ندارد.
انواع باگ در بازی
هر جا سخن از نرمافزار باشد باگ در آن جا حضور دارد؛ صنعت گیم و بازی نیز از این قاعده مستثنی نیست. اگر گیمر باشید احتمالا بیش از هر کس دیگری با ماجرای Bug آشنا هستید. در ادامه میخواهیم به معرفی انواع باگ در بازی بپردازیم.
کرش یا فریز کردن
هنگ کردن یا فریز شدن و به طور عمده از کار افتادن بازی در حین اجرا یکی از باگهای رایج در صنعت گیمینگ است. بسیاری این باگ را با عنوان کرش کردن یا Crash میشناسند که در آن بازی به یکباره متوقف شده و از بازی خارج میشود و شما به صفحه دسکتاپ پرت میشوید. به این اتفاق در اصطلاح کرش به دسکتاپ یا Crash to Desktop و به طور مخفف CTD میگویند. توسعهدهندگان بازی از میزان ناراحتکننده بودن این باگ برای بازیکنان خبر دارند و البته برای این که بتوانند پروژه خود را به خوبی به اتمام برسانند و به یک موفقیت تجاری برسند به شدت روی این باگ و رفع آن تمرکز میکنند؛ از این رو در بازیهایی که بر اساس استانداردهای اخیر تولید شدهاند چنین باگهایی را کمتر مشاهده میکنیم.
باگ سرور
گیر کردن درون بازی بیان دیگری از باگ سرور یا Server است. اگر این باگ در بازی نمایان شود شما درون بازی گیر میافتید و توانایی انجام هیچ کاری را نخواهید داشت. فرض کنید در یک بازی شوتر اول شخص هستید و میخواهید یکی از درها را باز کنید و به سمت بیرون اتاق بروید. در این حالت در باز نمیشود و شما درون اتاق گیر میکنید. برای حل مشکل مجبور هستید تا آن مرحله را دوباره بازی کنید. یک نمونه دیگر نپریدن، راه نرفتن و به طور کلی مرگ بازی است! گویا بازی هیچ علائم حیاتی از خود نشان نمیدهد و طبق برنامه پیش نمیرود. به تمام این اتفاقها باگی گفته میشود که از سمت سرور است.
باگهای عمومی
یکی دیگر از رایجترین باگها اشکالاتی است که در حین بازی رخ میدهند اما مانع از ادامه بازی نمیشوند. به عنوان مثال فردی را با شلیک گلوله میکشید و بعد از افتادنش به روی زمین، جنازه چند متر بالاتر به حالت افقی روی هوا معلق میشود! زامبی که میخواهد به شما حمله کند در زمین گیر میکند، زمانی که قدم میزنید وارد تنه درخت میشوید، هنگامی که میخواهید به همتیمی خود پاس بدهید اما با بازیکن دیگر تصادف میکنید و اعضا و جوارح دو بازیکن درون هم میروند و…، اینها همگی مثالهایی از باگهای عمومی هستند و بسیار زیاد اتفاق میافتند. احتمالا این نوع باگ پرشمارترین باگ در بازی باشد.
باگهای جزئی
این نوع باگها معمولا آن قدر جزئی هستند که گاهی توسط بازیکنها صرف نظر میشوند چرا که لذت بازی اجازه نمیدهد به آنها توجه کنند. به بیان بهتر این اشکالها خلالی در بازی ایجاد نمیکنند و اهمیت بسیار کمی دارند اما اگر کمالگرا باشید ممکن است به این نوع باگ نیز توجه کنید و در مراحل بعدی به عنوان یک عامل آزاردهنده برایتان جلب توجه کند. طبق روال بخشهای قبلی با ذکر مثال این مورد را جا میاندازیم؛ مثلا اگر دهان یکی از شخصیتها هنگام صحبت با شما باز و بسته نشود یا چرخ ماشین هنگام حرکت نچرخد میتوانیم بگوییم بازی باگ دارد و این باگ در بازی از نوع جزئی است.
حقیقت قضیه این است که گاهی به دلیل حجم پروژه و غیر ممکن بودن برطرفسازی صددرصدی باگها، توسعهدهندگان به عمد از کنار این باگها عبور میکنند. دلیل این است که اگر بخواهند روی چنین باگهایی تمرکز کنند برای مواردی که زیاد توسط گیمرها مورد توجه قرار نمیگیرد انرژی و هزینه زیادی متحمل خواهند شد. همچنین هیچ چیزی در دنیا کامل نیست و نخواهد بود، بنابراین نمیتوان تمام باگها را رفع و رجوع کرد.
باگهای گرافیکی و موسیقیایی
این باگها به تجربه بصری و صوتی بازی مرتبط هستند. گرافیک شامل مواردی مانند اشتباهات بافت و نقص در اشیا است. در حالی که صدا ممکن است شامل جلوههای موسیقی مرتبط با گیمپلی باشد. اگر پخش صدا در بازی تاخیر داشته باشد یا در بازیهایی که مکان دشمن از طریق صدای پای آن شناسایی میشود، صدا به اشتباه مخابره شود میگوییم بازی با اشکالات یا باگ صدا و موسیقیایی همراه است.
جمعبندی
همان طور که گفتیم هر جا که نرمافزاری وجود دارد قطعا باگ نیز در آن جا حضور خواهد داشت. در این مقاله سعی کردیم توضیح دهیم که باگ چیست و چه انواعی دارد. باگ در برنامه نویسی و باگ در بازی و صنعت گیمینگ دو نوع اصلی باگ بودند که بررسی شدند. درست است که بسیاری از باگها مخرب و آسیبرسان هستند اما مطمئنا پیشرفتهایی که در تکنولوژی به دست آمده حاصل اشکالزداییها و آزمونوخطاهای متعدد بوده است، به طوری که میتوان دنیای بازی و برنامهنویسی را دنیای باگ و دیباگ نامید. اگر شاهکاری از این دنیا به دنیای ما معرفی میشود به دلیل شناخت درست و تعامل مناسب با انواع باگها بوده است.
دیدگاه کاربران
تعداد دیدگاه کاربران: 1 دیدگاهمحمد امین
خوندمش…خوب بود ممنون که وقت گذاشتین