در این مقاله نگاهی میاندازیم به انواع باگها در صنعت توسعهٔ نرمافزار (و اینکه تا چه اندازه میتوانند عجیب باشند) که جالب است بدانید نام خود را از دانشمندان معروف گرفتهاند.
در مقالهای معروف تحت عنوان ?Why Do Computers Stop and What Can Be Done About It که در سال 1985 منتشر شد، Jim Gray، که یکی از دانشمند مطرح علوم کامپیوتر است باگها را بر اساس نام دو دانشمند معروف به دو دستهٔ کلی Bohrbugs و Heisenbugs تقسیمبندی کرد اما امروزه با انواع و اقسام باگها در پروسهٔ توسعهٔ نرمافزار سروکار داریم و از همین روی به دو دستهٔ دیگر هم نگاهی خواهیم داشت و در نهایت هم هر چهار گروه را با ذکر مثال بررسی خواهیم نمود.
Bohrbug
بیشتر باگهایی که با آنها برخورد داریم مجدداً قابلتولید هستند که تحت عنوان Bohrbugs شناخته میشوند به طوری که این دسته از باگها نام خود را از دانشمندی به نام Niels Bohr گرفتهاند که در سال 1913 یک مدل اتمی ساده و قابلدرک ارائه داد که در این مدل چیزهایی مثل مسیر حرکت و مقدار انرژی یک الکترون در یک اتم، قاب پیشبینی هستند.
به طور مشابه، باگهایی از نوع Bohrbug نیز قابلپیشبینی هستند به طوری که اگر تحت همان شرایط قبلی نرمافزار را اجرا کنید، دوباره ایجاد میشوند. برای مثال، وقتی به خاطر اینکه از یک موجودیت null استفاده میکنید و بالتبع برنامهٔ شما کِرش میکند، قطعاً بار دیگر برنامه برای یک ورودی دیگر با مقدار null در همین قسمت از ادامه باز خواهد ایستاد و فلذا مشخص است که این باگ قابلیت تولید مجدد داشته و بالتبع خیلی راحت قابل دیباگ کردن است.
Heisenbug
همهٔ دولوپرهای حرفهای با این موضوع مواجه شدهاند که وقتی برنامه را دوباره اجرا میکنند، باگی که باعث شده بود برنامه کِرش کند، ناپدید میگردد! صرفنظر از اینکه چقدر تلاش میکنید و زمان خود را صرف پیدا کردن دوبارهٔ همان باگ میکنید، ولی احتمال پیدا کردن مجدد باگ مذکور خیلی کم خواهد بود. این نوع از باگها اسم خود را از دانشمند معروف Werner Heisenberg گرفتهاند که به خاطر Uncertainty Principle (اصل عدم قطعیت) شناخته شده است که بر اساس این اصل، در یک زمان مشخص امکان اندازهگیری مکان و سرعت یک الکترون درون یک اتم به صورت دقیق و یا تقریبی وجود ندارد.
وقتی که میخواهید عملیات دیباگینگ را انجام دهید و باگها رفتار متفاوتی از خود نشان میدهند، با باگی از جنس Heisenbug روبهرو هستید. برای مثال، اگر متغیرهایتان را مقداردهی اولیه نکنید، ممکن این اتفاق رخ دهد به طوری که وقتی برنامه اجرا میشود، به متغیرهایی که مقداردهی اولیه نشدهاند دسترسی خواهد داشت و این باعث ایجاد باگ میشود اما این در حالی است که وقتی میخواهید برنامه را دیباگ کنید، برنامه احتمالاً درست کار خواهد کرد چرا که بسیاری از دیباگرها متغیرهایی که مقداردهی اولیه نشدهاند را با 0 مقداردهی میکنند و همین باعث میشود که شما با باگ مورد نظر برخورد نکنید.
Mandelbugs
وقتی علت ایجاد باگ بسیار پیچیده و غیرقابل فهم باشد و باگ رفتاری غیرطبیعی از خود نشان میدهد، آن را Mandelbugs مینامند به طوری که این دسته از باگها نام خود را از روی Benoit Mandelbrot گرفتهاند که به عنوان پدر علم هندسه فراکتال شناخته میشود. یک باگ در سیستمعامل که به زمانبندی وابسته است، مثال خوبی در این زمینه است.
Schroedinbug
گاهی اوقات به سورسکد نگاه میاندازید و متوجه میشوید که باگ یا مشکلی وجود دارد که در مرحلهٔ اول اصلاً نباید اجازهٔ اجرا شدن برنامه را بدهد و وقتی میخواهید همین کد را اجرا کنید، باگ مورد نظر بیدرنگ ظاهر میشود و نرمافزار متوقف میشود. هرچند این مورد کمی غیرمعمول به نظر میرسد، اما چنین باگهایی گاهی اوقات رخ میدهند و با نام Schroedinbug شناخته میشوند (معمولاً این نوع باگها از مراحل اولیهٔ تستهای کیفیت نرمافزار رد میشوند و خود را نشان نمیدهند.) که این دست باگها نام خود را از دانشمند معروف Erwin Schrödinger گرفتهاند که ایدهٔ «آزمایش تئوری گربه» را ارائه کرد.
در واقع، در فیزیک کوانتوم ذرههای کوانتومی، مانند اتمها، میتوانند در دو حالت یا بیشتر وجود داشته باشند ولی شرودینگر پیشنهاد کرد که در موجودیتهای کلاسیکتری مانند حیوانی همچون گربه که از اتمهای بسیاری تشکیل شده، وجود داشتن در دو حالت غیرممکن است. وی یک سناریو را پیشنهاد کرد که در آن یک گربه در داخل جعبهای در بسته همراه با شیشهای با محتوای سَم (که به یک اتم رادیواکتیو متصل است) قرار دارد به طوری که اگر نیمهعمر اتم تمام شود، شیشه شکسته میشود و سم به بیرون نَشت کرده و باعث مسموم شدن گربه و بالتبع مرگش میشود ولی از آنجا که درِ جعبه بسته است هرگز نمیتوان گفت گربه زنده است یا مرده و از همین روی تا زمانی که در جعبه باز نشود، گربه میتواند در دو حالت قرار داشته باشد: زنده یا مرده که در فیزیک کوانتوم، به این وضعیت اصطلاحاً Superposition State میگویند.
در ارتباط با باگها، صرفاً با مشاهدهٔ مشکل در کد، شما دست به ایجاد یکسری تغییرات میزنید که در این صورت یا نرمافزار اجرا میشود و یا کار نمیکند. بنابراین این نوع از باگها با عنوان Schroedinbug شناخته میشوند (انواع باگهای دیگری هم وجود دارند که در قالب این چهار دسته قرار نمیگیرند که از آن جمله میتوان به باگهای به اصطلاح Aging-Related اشاره کرد که فقط زمانی رخ میدهند که نرمافزار برای مدت طولانی کار کند!)
در پایان هم ممکن است این سؤال برای شما پیش آمده باشد که اصلاً اصطلاح Bug (به معنی حشره) از چه زمانی در صنعت توسعهٔ نرمافزار باب شده است که برای پافتن پاسخ به این سؤال، توصیه میکنیم به مقالهٔ Grace Murray Hopper: کسی که برای اولین بار اصطلاح Bug را باب کرد! مراجعه نمایید.
آیا باگهایی که تاکنون با آنها برخورد داشتهاید در این دستهبندیها قرار میگیرند؟ تجربهٔ شما در برخورد با باگهای عجیبی که ساعتها شما را درگیر کردهاند چیست؟ نظرات، دیدگاهها و تجربیات خود را با دیگر کاربران سکان آکادمی به اشتراک بگذارید.