در این مقاله، نگاهی میاندازیم به ۴ نوع از باگها که نام خود را از دانشمندان معروف گرفتهاند؛ دستهبندی این باگها مورد جالبی است و در ادامه خواهیم دید که باگهای ایجاد شده در فرایند کدنویسی تا چه اندازه میتوانند عجیب باشند!
در مقالهای معروف، آقای Jim Gray، باگها را به ۲ دستهٔ Bohrbugs و Heisenbugs، براساس نام ۲ دانشمند معروف تقسیمبندی کرده است اما امروزه، ما انواع باگهای بیشتری را میشناسیم و با آنها سروکار داریم؛ بنابراین به ۲ دستهٔ دیگر هم نگاهی خواهیم داشت و هر ۴ مورد را با ذکر مثال بررسی خواهیم کرد.
Bohrbug
بیشتر باگهایی که با آنها برخورد داریم، مجدداً قابلتولید هستند و با عنوان Bohrbugs شناخته میشوند؛ این باگها نام خود را از دانشمندی به نام Niels Bohr گرفتهاند که در سال ۱۹۱۳ یک مدل اتمی ساده و قابلدرک ارائه داد. در مدل آقای Bohr، چیزهایی مثل مسیر حرکت و مقدار انرژی یک الکترون در یک اتم، قابل پیشبینی هستند.
بهطور مشابه، Bohrbugها هم قابل پیشبینی هستند؛ بهعبارت دیگر، اگر تحت همان شرایط قبلی نرمافزار را اجرا کنید، دوباره ایجاد میشوند. برای مثال، وقتی بهخاطر اینکه از یک موجودیت null استفاده میکنید و بالتبع برنامهٔ شما کرش میکند، قطعاً بار دیگر برنامه برای یک ورودی دیگر با مقدار null در همین قسمت کرش خواهد کرد؛ پس مشخص است که این باگ بهراحتی قابل تولید مجدد و بالتبع قابل دیباگ کردن است.
Heisenbug
همهٔ دولوپرهای حرفهای با این موضوع مواجه شدهاند زمانیکه برنامه را دوباره اجرا میکنند، باگی که باعث شده بود برنامه کرش کند، ناپدید شده است! صرفنظر از اینکه چقدر تلاش میکنید و زمان خود را صرف پیدا کردن دوبارهٔ همان باگ میکنید، ولی باگ از دست شما فرار میکند و دوباره خود را نشان نمیدهد.
این نوع از باگها اسم خود را از دانشمند معروف آقای Werner Heisenberg گرفتهاند که بهخاطر «اصل عدم قطعیت» یا اصطلاحاً Uncertainty Principle شناخته شده است؛ براساس این اصل، در یک زمان مشخص، امکان اندازهگیری مکان و سرعت یک الکترون درون یک اتم، بهصورت دقیق و یا تقریبی وجود ندارد.
وقتی شما میخواهید عملیات دیباگینگ، ایزولهسازی و یا بررسی دقیق برای پیدا کردن مشکل را انجام دهید و باگها رفتار متفاوتی از خود نشان میدهند، به این نام شناخته میشوند؛ برای مثال، اگر متغیرهایتان را مقداردهی اولیه نکنید، ممکن این اتفاق رخ دهد. وقتی برنامه اجرا میشود، به متغیرهایی که مقداردهی اولیه نشدهاند دسترسی خواهد داشت و این باعث ایجاد باگ میشود اما این درحالی است که وقتی میخواهید برنامه را دیباگ کنید، برنامه احتمالاً درست کار خواهد کرد چراکه بسیاری از دیباگرها، متغیرهایی که مقداردهی اولیه نشدهاند را با ۰ مقداردهی میکنند و همین باعث میشود که شما با باگ موردنظر برخورد نکنید.
Mandelbugs
وقتی علت ایجاد باگ بسیار پیچیده و غیرقابل فهم باشد و باگ رفتاری غیرطبیعی از خود نشان میدهد، آنرا Mandelbugs مینامند. این باگها نام خود را از روی نام آقای Benoît Mandelbrot گرفتهاند که بهعنوان پدر علم هندسه فراکتال شناخته میشود (فراکتالها، ساختارهای پیچیده و شبیه به خود هستند). یک باگ در سیستمعامل که به زمانبندی وابسته است، مثالی از این نوع باگها است.
Schroedinbug
گاهیاوقات به سورسکد نگاه میاندازید و متوجه میشوید که باگ یا مشکلی وجود دارد که در مرحلهٔ اول اصلاً نباید اجازهٔ اجرا شدن برنامه را بدهد؛ وقتی میخواهید همین کد را اجرا کنید، باگ موردنظر بیدرنگ ظاهر میشود و نرمافزار متوقف میشود. هرچند این مورد کمی غیرمعمول بهنظر میرسد، اما چنین باگهایی گاهیاوقات رخ میدهند و با نام Schroedinbug شناخته میشوند (معمولاً این نوع باگها از مراحل اولیهٔ تستهای کیفیت نرمافزار رد میشوند و خود را نشان نمیدهند).
باگهای نوع Schroedinbug، نام خود را از دانشمند معروف آقای Erwin Schrödinger گرفتهاند که ایدهٔ «آزمایش تئوری گربه» را ارائه کرد؛ در فیزیک کوانتوم، ذرههای کوانتوم مانند اتمها، میتوانند در ۲ حالت یا بیشتر وجود داشته باشند ولی شرودینگر پیشنهاد کرد که در اشیاء کلاسیکتری مانند گربه که از اتمهای بسیاری تشکیل شده، وجود داشتن در ۲ حالت، غیرممکن است. وی یک سناریو را پیشنهاد میکند که در آن یک گربه در داخل جعبهای در بسته، همراه با شیشهای با محتوای سم (که به یک اتم رادیواکتیو متصل است) قرار دارد.
اگر نیمهعمر اتم تمام شود، شیشه شکسته میشود و سم به بیرون نشت میکند و باعث مرگ گربه میشود؛ ولی درِ جعبه بسته است و بنابراین نمیتوان گفت گربه زنده است یا مرده. از اینرو، تا زمانیکه درِ جعبه باز شود، گربه میتواند در ۲ حالت قرار داشته باشد: زنده یا مرده. در فیزیک کوانتوم، به این مورد اصطلاحاً Superposition State میگویند، به شکلی که گربه هم زنده است و هم مرده!
برگردیم به بحث باگها؛ صرفاً با مشاهدهٔ مشکل در کد، شما دست به ایجاد یکسری تغییرات میزنید که در این صورت یا نرمافزار اجرا میشود و یا کار نمیکند. بنابراین این نوع از باگها با عنوان Schroedinbug شناخته میشوند.
انواع باگهای دیگری هم وجود دارند که در قالب این ۴ دسته قرار نمیگیرند که از آن جمله میتوان به باگهای بهاصطلاح Aging-Related اشاره کرد که فقط زمانی رخ میدهند که نرمافزار برای مدت طولانی کار کند! در پایان هم ممکن است این سؤال برای شما پیش آمده باشد که اصلاً اصطلاح Bug (بهمعنی حشره) از چه زمانی در صنعت توسعهٔ نرمافزار باب شد؛ برای یافتن پاسخ به این سؤال، توصیه میکنیم به مقالهٔ آشنايى با دريابان گريس مارى هوپر، کسی که برای اولین بار اصطلاح Bug را باب کرد! مراجعه نمایید.
شما چه فکر میکنید، آیا باگهایی که تاکنون با آنها برخورد داشتهاید در این دستهبندی قرار میگیرند؟ تجربهٔ خود در برخورد با باگهای عجیبی که ساعتها شما را درگیر کرده است را میتوانید در بخش نظرات با ما و سایر کاربران فراتک درمیان بگذارید.