در حوزهی کامپیوتر، به خطا یا Error در یک برنامه ی کامپیوتری، باگ (Bug) میگویند. همچنین به فرآیند پیدا کردن یک باگ، دیباگینگ یا اشکال زدایی (Debugging)دیباگ چیست؟ معرفی روشها و ابزارهای دیباگینگ(اشکال زدایی)این مقاله عالی مفاهیم دیباگ (debug)، دیباگینگ (Debugging) یا همان اشکال زدایی، دیباگر (Debugger) را معرفی و همچنین روشها و ابزارهای دیباگینگ را بررسی کرده میگویند. عملیات مربوط به دیباگ کردن معمولا بعد از اینکه کد برنامه نوشته شد شروع میشود و در طول فرآیند ساخت یک نرم افزار، یعنی وقتی قسمت ها و اجزای مختلف برنامه نویسی شدهی نرم افزار، جمع و به هم الحاق میشوند ادامه مییابد.
باگها معمولا بعد از عرضهی یک محصول کامپیوتری و یا هنگام تست کردن نسخهی بتا (Beta Testing) کشف میشوند. وقتی همچین اتفاقی بیافتد، کاربران آن نرم افزار مجبور هستند یک راهی پیدا کنند تا از پدید آمدن مشکل در نرم افزار جلوگیری کنند. البته راه دیگری که وجود دارد این است که توسعه دهندگان نرم افزار، آپدیت هایی در قالب patch منتشر میکنند و در این پچ ها، باگها نیز رفع میشوند.
داشتن باگ در برنامه، تنها یک نوع از مشکلی است که یک برنامه میتواند داشته باشد. برنامهها میتوانند بدون داشتن هیچ اشکالی اجرا شوند ولی همچنان استفاده از آنها مشکل باشد و یا در بعضی از عملیات و پردازشهای سنگین به مشکل بخورند. تست کردن یک نرم افزار با این مشکل، دشوارتر از برنامهای است که دارای باگ (Bug) است. بنابراین فرآیند توسعهی یک نرم افزار از اهمیت بالایی برخوردار است، یک برنامه باید طوری توسعه یابد که به ازای هزاران خط کد، باگهای کمتری داشته باشد و فرآیند تولید آن نیز کنترل شده باشد. همچنین در مراحل آزمایش این برنامه نیز بتوان از آن استفاده کرد که به این خاصیت اصطلاحا Usability in Testing میگویند.
انواع باگ های نرم افزاری
باگهای متفاوتی وجود دارند که باعث بوجود آمدن اختلال در عملکرد کامپیوترها میشوند. بعضی از مهم ترین انواع باگها که بیشتر رخ میدهند را در زیر آوردهایم:
- باگ های محاسباتی (Arithmetic): باگهای محاسباتی، باگهایی هستند که به دلیل خطاهایی در محاسبات ریاضی نوشته شده در کد پدید میآیند و باعث میشود نرم افزار به درستی کار نکند.
- باگ های واسط (Interface): گاهی اوقات دلیل بوجود آمدن باگ، متصل شدن سیستمهای ناسازگار به کامپیوتر است. این سیستمها میتوانند قطعات سخت افزاری یا نرم افزاری باشند. به عنوان مثال استفادهی نادرست از یک APIAPI چیست؟ همه چیز درباره api یا رابط برنامه نویسی کاربردیاین مقاله عالی بررسی کرده که API چیست و چه کاربردی دارد و چگونه می توان از api ها در برنامه های خود استفاده نمود. همچنین استاندارد api و کاربرد api بررسی شده میتواند دلیل وقوع این نوع باگ باشد.
- باگ های منطقی (Logic): این باگها زمانی رخ میدهند که منطق یک کد یا اسکریپت، باعث تولید یک خروجی نادرست شود و یا برنامه با اشکال مواجه شود (مثلا هنگ کند) و هیچ خروجی نمایش ندهد. از نمونه مثالهای بارز برای باگها و خطاهای منطقی میتوان به گیر کردن در حلقه ی بینهایت اشاره کرد، این مشکل زمانی رخ میدهد که یک قسمت از کد به طور مداوم اجرا شود و هیچ وقت تمام نشود.
- باگ های دستور زبان یا سینتکس (Syntax): این نوع باگها زمانی رخ میدهند که در یک کد، خطای دستوری یا به اصطلاح خطای املایی وجود داشته باشد. زبان های مختلف برنامه نویسی، سینتکسها و دستور زبان های مختلفی دارند. بنابراین استفاده از دستور یک زبان در زبان دیگر، میتواند وقوع این نوع باگ را در پی داشته باشد.
- باگ های کار گروهی (Teamwork): این باگ زمانی ایجاد میشود که ارتباط بین برنامه نویسان ضعیف باشد، یک مثال ساده این است که بین مستندات یا داکیومنتهای یک محصول و خود محصول تفاوتهایی وجود داشته باشد. مثلا فرض کنید یک برنامه نویس Comment گذاری اشتباهی انجام داده است و باعث شده کد های یک برنامه نویس دیگر نیز با خطا روبرو شود.
باگ های نرم افزاری را میتوان از دیدگاه کاربران نیز دسته بندی کرد. از نظر کاربر دو نوع باگ وجود دارد که به صورت زیر است:
- باگ های بصری (Visual): یک کاربر از نرم افزار به درستی استفاده میکند و قوانین آن نرم افزار را نیز رعایت میکند، اما در ظاهر نرم افزار مشکلی پدید میآید. این مشکل ممکن است مربوط به طراحی واکنشگرای نرم افزار یا همان Responsive Design باشد. مثلا ممکن است یک وبسایت را رفرش کنید و بعد متوجه شوید که یک دکمه ناپدید شده است!
- باگ های عملکردی (Functional): به طور خلاصه باگ عملکردی باعث میشود تا برنامه، آن طور که باید عمل نکند. به عنوان مثال کاربر بر روی دکمهی ذخیره کلیک میکند اما داده ذخیره نمیشود.
باگها را همچنین میتوان بر اساس سطح دشواری که برای کاربر ایجاد میکند یا بر اساس شدت آنها نیز طبقه بندی کرد. مثلا:
- تاثیر کم (Low-impact): باگهایی که تاثیر کمی بر روی تجربه ی کاربری یا User Experience دارند.
- تاثیر زیاد (High-impact): باگهایی که بعضی از عملکردهای نرم افزار را مختل میکنند، اما نرم افزار همچنان قابل استفاده است.
- باگ های بحرانی (Critical bugs): این باگها مانع عملکرد اصلی برنامه میشوند.
یکی دیگر از دیدگاهها برای دسته بندی کردن باگها این است که این باگها کجا رخ دادهاند:
- باگ در سطح جزئی (Unit-level bugs): باگهای سادهای میباشند که معمولا در یک قسمت یا یک جزء بوجود میآیند. منشاء این باگها بیشتر محاسباتی و منطقی بوده که با یک قسمت از نرم افزار سرو کار دارند. رفع کردن این نوع باگها معمولا کار دشواری نیست.
- باگ های سطح سیستمی (System-level bugs): باگهای پیچیدهتری هستند و دلیل بوجود آمدن این نوع باگها بخش های مختلف یک نرم افزار میباشند که با هم در تعامل هستند.
- باگ های خارج از محدوده (Out-of-bound bugs): دلیل وقوع این نوع باگ، تعامل کاربر با برنامه است به گونهای که برنامهی مورد نظر، برای اینگونه تعامل درست نشده باشد. اگر بخواهیم ساده تر بگوییم، فرض کنید در یک فرم، یک فیلدی وجود دارد و کاربر مقداری را در آن فیلد وارد میکند که برنامه قادر به مدیریت آن نیست. در این صورت یک باگ خارج از محدوده پدید میآید. به عنوان مثال در یک فرم، در فیلد مربوط به سن، کاربر به جای سن واقعی خودش که یک عدد دو رقمی یا نهایت سه رقمی است، عدد چند ده رقمی وارد کند.
چگونه از پدید آمدن باگ جلوگیری کنیم؟
راه حلهای مختلفی برای جلوگیری از به وقوع پیوستن باگ وجود دارد که بسته به نوع باگ و اینکه چه موقع و کجا این باگ رخ داده است متفاوت است.
فرآیند توسعه
بهترین راه برای رفع خطا های کد نویسی، جلوگیری از وقوع آن است. استفاده از رویکرد ها یا متدولوژی توسعه ی نرم افزار مانند Agile و DevOps که از معروف ترین متدولوژی های توسعه ی نرم افزار است، میتواند از رخ دادن باگ جلوگیری کند. علت آن این امر است که در این متدولوژیها، مرحلهای برای تست کیفیت یا Testing for Quality وجود دارد.
یکی از انواع روشهای توسعه نرم افزار، توسعه آزمایش محور یا به اصطلاح Test-Driven Development است. عملیات آزمایش در این روش باید قبل از ساخت و کد نویسی یک ویژگی برای نرم افزار و استاندارد سازی آن انجام شود.
یک روش خوب دیگر، استفاده از توسعه مبتنی بر رفتار یا Behavior-Driven Development است. در این روش توسعه دهندگان، یک برنامه را بر اساس نحوهی تعامل کاربر با آن برنامه کد نویسی و مستند سازی میکنند.
آزمایش نرم افزار
آزمایش یا تست کردن نرم افزار یکی از راه های کشف باگ است. به طور کلی سه نوع روش تست نرم افزار وجود دارد که در این قسمت آورده شده است:
- تست عملکرد (Functional Testing): شامل تست عملکرد بخشهای اصلی نرم افزار برای رفع خطا ها قبل از رفتن به مرحلهی تست بعدی میشود. با استفاده از این نوع تست، اطمینان حاصل میکنیم که قسمت تست شدهی برنامه ی ما به درستی عمل میکند.
- تست اکتشافی (Exploratory Testing): این نوع تست شامل تکنیکهایی است که در تست عملکرد، کمتر یا اصلا بررسی نمیشوند. به عنوان مثال یکی از انواع تستهای اکتشافی، تست پوشش یا Coverage Test است که بررسی میکند آیا یک برنامهی کاربردی در دستگاهها و مرورگرها یا سیستم عامل های مختلف درست کار میکند یا خیر.
- تست رگرسیون (Regression Testing): یکی از پرکاربرد ترین تستها، تست رگرسیون میباشد. این تست برای این صورت میپذیرد که توسعه دهنده ببیند که آیا تغییراتی که اخیرا در کد اعمال شده، باعث ایجاد مشکلات ناخواسته شده است یا خیر ؟ تست رگرسیون شامل انواع زیر است:
- تست واحد یا Unit Testing
- تست ادغام یا Integration Testing
- تست سیستم یا System Testing
- تست پذیرش یا Acceptance Testing
توسعه دهندگان نرم افزار میتوانند با تستهای زودهنگام و مکرر، از رسیدن باگها به کاربران جلوگیری کنند. مثلا کدهای همدیگر را بررسی کنند تا مشکلی نداشته باشد. در شرکتهای توسعهی نرم افزاری معمولا از تیم های تضمین کیفیت یا QA برای این مورد استفاده میکنند.
تست بنچمارک
تست بنچمارک یا تست معیار، انتظارات عملکرد پایهای را برای نرم افزار، تحت انواع مختلف میزان بار کاری بررسی میکند. اگر به مقایسه ی انواع کامپیوترها، لپ تاپها و کنسولهای بازی علاقه داشته باشید، احتمالا این نوع تست را زیاد مشاهده کردید. تست بنچمارک میتواند پایداری، پاسخگویی، سرعت و اثربخشی نرم افزار را ارزیابی کند.
باگهایی وجود دارد که ممکن است تحت شرایطی وجود نداشته باشند، اما در شرایط دیگر، مشکلات جدی ایجاد کنند. تست بنچمارک میتواند به شناسایی چنین باگهایی کمک کند. برخی از انواع تست های بنچمارک به شرح زیر است:
- تست بنچمارک بارگذاری (Load Benchmarking): این نوع تست بنچمارک، سیستمهای نرم افزاری را تحت یک میزان بار خاص ارزیابی میکند که اغلب مقدار معمول ترافیک مورد انتظار برای یک نرم افزار است.
- تست بنچمارک Spike: در این نوع تست، حجم کار یا میزان بار، به صورت ناگهانی افزایش مییابد و سپس عملکرد نرم افزار تحت این شرایط ارزیابی میشود.
- تست بنچمارک نقطعه انفصال (Breakpoint Benchmarking): در این نوع تست، نرم افزار را به شدت تحت فشار قرار میدهیم تا ببینیم قبل از خراب شدن یا به اصطلاح کرش کردن نرم افزار، چقدر میتواند استرس یا فشار را تحمل کند.
نحوه رفع باگ
دیباگینگ یا اشکال زدایی
وقتی در یک نرم افزار، یک باگ پیدا شد، باید آن باگ را رفع کرد. عملیات مربوط به رفع باگ یا دیباگینگ، از سه مرحلهی زیر تشکیل شده است:
- ایزوله کردن باگ
- پیدا کردن منشا اصلی باگ
- رفع باگ و حل کردن مشکل
برای برنامه نویسان، بررسی کردن کدهایی که نوشتهاند و مرور مجدد کد هایشان که بسیار هم زیاد است ممکن است سخت باشد. یکی از راه های جالب رفع باگها، برنامههای پاداش محور یا Bug Bounty Pogram هستند. در این روش، به کسانی که مشکلات نرم افزاری را پیدا کنند یا باگی را گزارش دهند، پاداش داده میشود. پیدا کردن این موارد معمولا به دست محققان امنیت نرم افزار یا هکرهای قانونمند انجام میشود.
پیشرفت مداوم
سازمان هایی که به دنبال این هستند که باگ های نرم افزاری را به حداقل برسانند، باید بین تعداد عرضهها و بازگرداندن نسخههای نرم افزاری یا همان تعداد Rollout ها و Rollback هایی که انجام میدهند، تعادل ایجاد کنند. با انجام این کار، اطمینان حاصل میشود تا هیچ خللی در فرآیند برنامهریزی انتشار نرم افزار وارد نمیشود. در سازمان هایی که از متدولوژی Agile استفاده میکنند این کار صورت میگیرد.
با این وجود، برخی از باگ ها در محصول منتشر شده نیز همچنان وجود دارند. تیم های توسعه دهنده میتوانند انتشار یک نرم افزار را به عنوان یک فرایند دیباگینگ در نظر بگیرند و به حل مشکلات آن و ایجاد بهبود در نرم افزار بپردازند.
یک تیم یا یک فرد در تیم توسعه ی نرم افزار ممکن است هر روز یک زمان ثابتی را به رفع باگ ها اختصاص دهد. به این ترتیب جمع آوری داده ها در مورد باگ ها و خود فرایند دیباگینگ به بخشی از برنامه روزانه تبدیل میشود. یک تیم میتواند از این داده های جمع آوری شده برای تخمین مدت زمانی که یک اصلاح باگ طول میکشد استفاده کند و برنامه های خود را بر اساس این زمان ها سازماندهی کند.
رفع تمامی باگ ها به یکباره، تقریبا غیر ممکن است و جمع آوری داده های مورد نیاز برای تخمین زدن زمان حدودی برای وقوع و رفع باگ نیز زمانبر است. برنامه نویسان در سطح مهارت برنامه نویسی و قابلیتشان، با هم تفاوت دارند و نحوه و زمان مورد نیاز برای رفع باگ ها در بین برنامه نویسان نیز متفاوت است. با گذشت زمان، یک تیم میتواند ببیند که چه تعداد باگ را میتواند در یک ماه رفع کند.
لازم است بگوییم که دیباگینگ پایان ماجرا نیست. باگ های جدید همواره ظاهر میشوند. هدف تیم های توسعه دهنده باید رفع این باگ ها به صورت کارآمد باشد تا هم در زمان و هم در هزینه صرفه جویی شود و انتشار نسخه های مختلف نرم افزار به درستی انجام شود.
تاریخچه باگ های نرم افزاری
کلمهی باگ اصطلاحی است که در حوزهی مهندسی استفاده میشود. کاربرد این اصطلاح به گریس هاپر (Grace Hopper) که از اولین برنامه نویسان کامپیوتری بود نسبت داده میشود. در سال 1944، هاپر یک افسر جوان نیروی دریایی بود که در هاروارد بر روی کامپیوتر Mark کار میکرد. هاپر توضیح داد که در آن موقع یک مشکلی برای کامپیوتر بوجود آمده بود. با بررسی کامپیوتر و قطعات الکتریکی آن، متوجه شدند که یک حشره (باگ در زبان فارسی به معنای حشره است) در واقع یک نوع پروانه بین دو رلهی الکتریکی گیر کرده و باعث اتصال کوتاه شده است. نیروی دریایی این پروانهها سالها به نمایش گذاشته بود. این پروانه اکنون در موزهی Smithsonian نگهداری میشود.
اگرچه باگ کامپیوتری معمولا آزار دهنده است، اما در بعضی مواقع تاثیر آنها میتواند جدیتر باشد. در سال 2005 مقاله ی Wired در مورد 10 تا از بدترین باگ های نرم افزاری در تاریخ گزارش داده بود که باگ های نرم افزاری باعث انفجار های عظیم، فلج کردن کاوشگرهای فضایی و حتی کشته شدن افراد شده است. به عنوان مثال در سال 1982، یک سیستم که گفته میشود توسط CIA جاسازی شده بود تا خط لوله گاز ترانس سیبری را کنترل کند، باعث بوجود آمدن بزرگترین انفجار غیر هستهای در تاریخ شد.
در این مقاله همچنان نوشته شده است که بین سال های 1985 تا 1987، وجود یک باگ با نام Race Condition در یک دستگاه پرتودرمانی، منجر به ارسال دوزهای کشنده ی پرتو شد که باعث کشته شدن پنج نفر و مجروج شدن چند نفر دیگر شد. همچنین در سال 2005، کمپانی خودرو سازی تویوتا، 160 هزار خودروی پریوس را باز خواند، زیرا یک باگ باعث روشن شدن چراغ های هشدار (Warning) و خاموش شدن موتور بدون هیچ دلیلی شده بود.
از دیگر باگهای قابل توجه، وجود یک باگ در سیستم Autopilot ماشین تسلا در سال 2016 بود. یک خودروی تسلا نتوانست یک تریلر تراکتور سفید رنگ را که در حال عبور از بزرگراه بود در مقابل آسمان روشن تشخیص دهد. این باگ باعث تصادف خودرو شد که منجر به مرگ نیز شد.
جمع بندی
باگها یکی آزاردهنده ترین پدیدههایی هستند که داخل یک نرم افزار بوجود میآیند. مراحل پیدا کردن و اشکال زدایی (Debugging)دیباگ چیست؟ معرفی روشها و ابزارهای دیباگینگ(اشکال زدایی)این مقاله عالی مفاهیم دیباگ (debug)، دیباگینگ (Debugging) یا همان اشکال زدایی، دیباگر (Debugger) را معرفی و همچنین روشها و ابزارهای دیباگینگ را بررسی کرده ، بسیار فرآیند زمانبر و هزینهبری است. ابزار های زیادی برای رفع این باگها پدید آمده است که دائما در حال بروز رسانی و پیشرفتهتر شدن هستند. در این مقاله به طور کلی به بررسی انواع باگها و دسته بندی آنها و همچنین راههای مختلف برای رفع آنها پرداختیم.
باگ چیست؟
باگ یک اصطلاح مهندسی برای وجود یک خطا در کد نویسی یک نرم افزار یا سخت افزار است. وجود باگ در یک برنامه، باعث بوجود آمدن اختلال در عملکرد نرم افزار میشود.
آیا باگ ها یک بد افزار یا ویروس هستند؟
خیر، احتمالا در خبرها شنیدهاید که وجود یک باگ یا یک خطا باعث رخدادن اتفاق های ناگوار مثل انفجار یا تصادف شده است. اما این خطاها ناخواسته بوده اند و به دلیل اشتباه نوشتن یک قسمت از کد بوجود میآید. اما بد افزار یا ویروس، ناخواسته نیستند و هدف آنها، مختل کردن سیستم مورد نظر است.
آیا باگ مربوط به نرم افزار میشود یا سخت افزار؟
باگها هم میتوانند در نرم افزار باشند و هم در سخت افزار. باگ های نرم افزاری، به علت کد نویسی ناصحیح بوجود میآیند و باگ های سخت افزاری، به دلیل پیاده سازی ناصحیح مدار ها، طراحی نادرست یا در عملکرد آنها بوجود میآیند.