باگ چیست؟ باگ ها چگونه بوجود آمده اند؟ انواع باگ های در برنامه نویسی کدام ها هستند و بر چه اساسی طبقه بندی شده اند؟ چگونه از وقوع باگ ها در برنامه جلوگیری کنیم؟ جواب این سوالات و مراحل از پیشگیری باگ تا رفع باگ ها در برنامه نویسی را با خواندن این مطلب از مجله برنامه نویسی سایت آموزش برنامه نویسی الکامکو بدست خواهید آورد.
باگ چیست؟
به هر مشکل یا نقص سخت افزاری یا نرم افزاری غیرمنتظره ای باگ گفته می شود. در فناوری کامپیوتر، باگ (Bug) یک خطای کدگذاری در یک برنامه کامپیوتری است.
معنی باگ چیست ؟ نام باگ به انگلیسی با این اسامی هم شناخته می شود:
باگ به انگلیسی به صورت «Bug» نوشته میشود و به معنای حشره است. همچنین به ایراد یا خطای نرم افزاری هم به انگلیسی «Software Bug» گفته میشود. سایر مترادفها برای باگ به انگلیسی در ادامه به همراه ترجمه آنها فهرست شدهاند:
- Computer Malfunction (خرابی کامپیوتر)
- Breakdown (از کار افتادن)
- Defect (عیب و نقص)
- Error (خطا)
- Failure (خرابی)
- Flaw (ضعف و نقص)
- Hitch (مشکل جزئی)
- Glitch (اشکال و نقص فنی کوچک و مختصر)
همچنین بخوانید » واسط برنامه نویسی کاربردی (API) چیست؟ | مفسر برنامه نویسی چیست؟ | IDE چیست؟
تاریخچه باگ های نرم افزاری
کلمه باگ از علوم مهندسی نشات گرفته است. استفاده از این اصطلاح در محاسبات به برنامه نویس پیشگام خانم گریس هاپر (Grace Hopper) نسبت داده می شود. در سال ۱۹۴۴، هاپر یک افسر جوان نیروی دریایی بود که در هاروارد روی کامپیوتر Mark I کار می کرد.
بر طبق گفته های خانم هاپر، ماشین حسابی به مشکل بر خورد و از کار افتاد که خانمی با نام گریس هاپر به جستجو و رفع این مشکل پرداخت و شروع به جستجو کرد و جالب است که بدانید مشکل از وجود یک حشره در میان قطعات دستگاه بود و زمانی که ان حشره را از میان قطعات بیرون کشیدند دستگاه مجدد شروع به کار کرد. در حال حاضر موسسه «اسمیتسونین» (Smithsonian) این پروانه رادر اختیار دارد.
اما امروزه باگ ها به دلیل وجود حشرات نیستند بلکه باگ ها از اشتباهات برنامه نویسان به وجود می اید که باعث به وجود امدن مشکلاتی ازجمله مشکلات امنیتی می شود و هکر ها از این مشکلات امنیتی می توانند استفاده کنند و به هدف دلخواه خود دست پیدا نمایید.
اگرچه باگ ها معمولاً باعث بروز مشکلاتی در برنامه ها می شوند، تأثیر وجود آنها می تواند خیلی جدی تر هم باشد. مقاله Wired در سال ۲۰۰۵ در مورد ۱۰ تا از بدترین باگ های نرم افزاری تاریخ گزارش داد که این باگ ها باعث انفجارهای بزرگ، فلج شدن کاوشگرهای فضایی و کشته شدن افراد شده است. به عنوان مثال، در سال ۱۹۸۲، وجود باگ در سیستمی که گفته می شود توسط آژانس اطلاعات مرکزی جاسازی شده بود که خط لوله گاز ترانس سیبری را کنترل می کرد، بزرگترین انفجار غیرهسته ای تاریخ را ایجاد کرد.
این مقاله همچنین میگوید، بین سالهای ۱۹۸۵ تا ۱۹۸۷، یک حشره به نام «وضعیت رقابتی» (Race Condition) در یک دستگاه پرتودرمانی منجر به ارسال تابش کشنده اشعه شد و باعث کشته شدن پنج نفر و مجروح شدن دیگران شد.
همچنین در سال ۲۰۰۵، تویوتا ۱۶۰۰۰۰ خودروی «پریوس» (Priuse) را به کارخانه برگرداند زیرا یک باگ باعث بدون دلیل روشن شدن چراغ های هشدار و خاموش شدن موتور شد.
یکی دیگر از اتفاق هایی که در اثر وجود باگ بوجود امد این بود که در سال ۲۰۱۶ ویژگی رانندگی خودکار (Autopilot) تسلا دچار نقص شد. این خودرو نتوانست یک تریلر تراکتور سفید رنگ را که داشت از بزرگراه عبور میکرد بخاطر روشنی هوا تشخیص دهد و باعث تصادف خودرو شد که منجر به مرگ هم شد.
همچنین بخوانید » HTML چیست؟ | CSS چیست؟
معرفی انواع باگ در برنامه نویسی :
انواع باگ در برنامه نویسی بر اساس دسته بندی باگ های نرم افزاری:
انواع باگ در برنامه نویسی باعث اختلال در عملکرد کامپیوترها می شوند. بعضی از رایج ترین انواع باگ های کامپیوتری عیبارتند از:
- باگ محاسباتی – Arithmetic: باگ های محاسباتی، خطاهای ریاضی در کد هستند که باعث می شوند برنامه دچار نقص شود و کار نکند.
- باگ رابط یا واسط – Interface: یک باگ رابط وقتی اتفاق می افتد که سیستم های ناسازگار به کامپیوتر متصل شوند. مشکل می تواند از یک قطعه سخت افزار یا نرم افزار باشد. به عنوان نمونهای از یک باگ واسط میتوان وجود خطا در «واسط برنامه نویسی اپلیکیشن» (API | Application Programming Interface) را نام برد.
- باگ منطقی – Logic: این نوع خطاها زمانی اتفاق میافتند که منطق اسکریپت باعث میشود برنامه اطلاعات نادرستی را خروجی دهد یا به مانع برخورد کند و هیچ خروجی ارائه ندهد.
- باگ سینتکسی – Syntax: این نوع خطاها در کدهایی رخ میدهند که با کاراکترهای اشتباهی نوشته شدهاند. زبانهای برنامه نویسی مختلف دارای سینتکسهای متفاوتی هستند و این سینتکسها باید به دقت رعایت شوند.
- باگ کار تیمی – Teamwork: این نوع از انواع باگ در برنامه نویسی زمانی اتفاق میافتد که بین برنامه نویسان سوءتفاهم و سوء برداشت بوجود بیاید. به عنوان مثال وقتی تفاوتهایی میان مستندات محصول و خود محصول وجود داشته باشد این اتفاق رخ میدهد. یک مثال دیگر در این خصوص این است که در کامنتها کدهای برنامه به درستی توصیف و تشریح نشده باشند.
انواع باگ در برنامه نویسی بر اساس دسته بندی باگ ها از دید کاربران :
یکی دیگر از راه های ساده برای دسته بندی باگ ها از دیدگاه کاربر است. انواع این نوع از باگ ها شامل موارد زیر است:
- باگ بصری (دیداری | Visual): در این نوع باگ کاربر میتواند عملکرد مورد نظرش را تکمیل کند، اما در این میان ظاهر موردی خاص یا برخی موارد به نظر صحیح نیست. این نوع باگ ممکن است مشکلی در خصوص طراحی واکنشگرای برنامه مربوطه باشد.
- باگ عملکردی (Functional): باگ عملکردی یعنی برنامه طوری عمل نمیکند که مورد انتظار است. برای مثال کاربری دکمه ذخیره (Save) را کلیک میکند، اما دادهها ذخیره نمیشوند.
ممکن است باگ ها بر اساس سطح دشواری که برای کاربر ایجاد می کنند طبقه بندی شوند:
- باگهای با تاثیر اندک – Low-Impact Bug: این نوع باگها اثر کمی روی تجربه کاربری دارند.
- باگهای با تاثیر زیاد – High-Impact Bug: اینها باگهایی هستند که تا حدی کاربردپذیری و عملکرد برنامه را تحت تاثیر قرار میدهند، اما همچنان میتوان از آن اپلیکیشن استفاده کرد.
- باگهای حیاتی – Critical Bugs: این نوع از باگها مانع عملکرد اصلی برنامه میشوند و رفع آنها بسیار ضروری است.
یکی دیگر از رویکردهای طبقهبندی انواع باگ در برنامه نویسی، بررسی محل وقوع آنها است:
- باگهای سطح واحد (Unit-Level Bug): اینها باگهای نرم افزاری هستند که در داخل یک واحد از کدها وجود دارند. آنها معمولاً به دلیل خطاهای محاسباتی و منطقی رخ میدهند و تنها با یک قطعه از نرم افزار سر و کار دارند. رفع باگهای سطح واحد معمولاً آسان است.
- باگهای سطح سیستمی (System-Level Bug): خطاهای پیچیدهتری هستند که به وسیله چندین قطعه نرم افزاری بوجود میآیند. این قطعات نرم افزاری به شکلهایی با هم در ارتباط هستند که وجود چنین باگهایی در آنها مشکلاتی را ایجاد خواهد کرد.
- باگهای خارج از محدوده (Out-of-Bound): این نوع از باگها زمانی رخ میدهند که کاربر به شیوهای غیرمنتظره با برنامه تعامل داشته باشد. برای مثال وقتی کاربری پارامتری را در یک فیلد فُرمی وارد کند که برنامه برای مدیریت آن طراحی نشده باشد، چنین باگی اتفاق خواهد افتاد.
چطوری از وقوع باگ ها در برنامه جلوگیری کنیم؟ مراحل از پیشگیری باگ تا رفع باگ ها در برنامه نویسی
با توجه به نوع باگ ها زمان، محل وقوع آنها روشهای مختلفی برای رفع و حتی جلوگیری آنها وجود دارند. در اینجا می خواهیم شما را با انواع روش های مقابله با باگ ها آشنا کنیم:
-
مرحله اول برای جلوگیری از Bug در برنامه نویسی: پیشگیری در فرایند توسعه (Development Process):
حتما شما هم این جمله را بارها شنیده اید که پیشگیری همیشه بهتر از درمان است! در اموزش های برنامه نویسی هم همینطور است. پیشگری از وقوع باگ برنامه نویسی بهتر از رخ دادن آن و بوجود آوردن مشکلات بعد از آن است. با روش های زیر می توان از وقوع باگ در برنامه نویسی پیشگیری کرد:
- به کارگیری اصول چابُک (اجایل | Agile): بیانیه چابک یا اصول ۱۲ گانه مدیریت چابک، روی ارزشها و الزاماتی تاکید میکند که همه اعضای تیم چابک با درک عمیق آنها، در همه حال سعی میکنند به آنها پایبند باشند. بهعبارتی اگر درصد قابل توجهی از این اصول در تیم شما رعایت نشود، نمیتوانید مدعی شوید که صاحب یک «تیم چابک» هستید. همچنین افرادی که خود را ملزم به رعایت این اصول نمیدانند، برای عضویت یا مدیریت تیمهای چابک مناسب نیستند.
- به کارگیری روشهای دواپس (DevOps): چارچوبها و رروشهای مختلف برای کمک به کسب و کارها به وجود آمادهاند اما گاهی اوقات عدم اطلاعات کافی از این چارچوبها یا به روشها باعت میشود نتوانیم انتخاب درست را انجام بدهیم. این اتفاق در مورد ITIL و دواپس (DevOps) بسیار رایج است. DevOps یک فلسفه برای توسعه و ارائه نرم افزار است که هدف آن یکپارچه سازی توسعه و عملیات اجرایی است. دواپس به منظور دستیابی به ارتباط و همکاری بهتر بین تیمهای مدیریت محصول، توسعه نرم افزار و استقرار طراحی شده است. DevOps ترکیبی از فلسفه ها، شیوه ها و ابزارهای فرهنگی است که توانایی سازمان را در ارائه برنامه ها و خدمات با سرعت بالا افزایش می دهد: تکامل و بهبود محصولات با سرعتی بیشتر از سازمان هایی که از نرم افزارها و فرایندهای مدیریت زیرساخت سنتی استفاده می کنند. این سرعت سازمان ها را قادر می سازد تا به مشتریان خود بهتر خدمت کنند و در بازار رقابت موثرتری داشته باشند.
- توسعه تست محور ( TDD – Test-Driven Development): توسعه تست محور یک فرایند توسعه نرمافزار است که متکی بر تکرار یک چرخه توسعه بسیار کوتاه است که طی آن نیازمندیها تبدیل به موارد آزمون بسیار خاص میشوند و سپس نرمافزار به قدری بهبود بخشیده میشود که فقط بتواند تستهای مطرح شده را پاس کند. در این روش از پیشگیری وقوع باگ در برنامه نویسی تستها را باید پیش از کدنویسی یک قابلیت ایجاد کرد تا استانداردی برای کدنویسی و توسعه آن قابلیت فراهم شود.
- توسعه رفتارمحور (Behavior Driven Development): در این روش برنامه نویسان و توسعهدهندگان تشویق میشوند برنامه کاربردی را براساس این مسئله برنامه نویسی کنند که کاربر قرار است چگونه با آن تعامل کند.
همچنین بخوانید » دوره آموزشی فلاتر از مبتدی تا پیشرفته برای ساخت اپ های اندروید و ios | فریمورک فلاتر چیست؟
-
مرحله دوم برای جلوگیری از Bug در برنامه نویسی: تست نرم افزار (Software Testing):
تست نرم افزار روشی برای کشف باگها در برنامه نویسی است. ۳ نوع مختلف تست نرم افزار در ادامه فهرست شدهاند و شرحی از هر کدام ارائه شده است:
- «تست عملکردی» (Functional Testing): این نوع تست شامل آزمایش بخشهای هستهای برنامه برای پیدا کردن باگ در برنامه نویسی پیش از رفتن به مرحله بعدی تست است.
- «آزمایش اکتشافی» (Exploratory Testing): این نوع تست شامل روشهایی میشود که مسیرهای کمتر رایج نرم افزاری در آن آزمایش میشوند یا در واقع آن مسیرهایی بررسی میشوند که یک تست عملکردی ممکن است آنها را در نظر نگیرد. مثلاً نوعی تست اکتشافی، آزمایش پوشش است که در آن بررسی میشود آیا برنامه بعد از ساخت اپلیکیشن در دستگاهها، مرورگرها یا سیستم عاملهای مختلف کار میکند یا خیر؟
- «تست رگرسیون» (Regression Testing): این روش به گونهای طراحی شده تا بتوان بررسی کرد آیا تغییرات قبلی که روی کدها اعمال شدهاند منجر به بروز مشکل ناخواستهای خواهند شد یا خیر؟ تست رگرسیون انواع مختلف زیر را شامل میشود:
-
- «تست واحد» (Unit Testing)
- «تست یکپارچگی» (Integration Testing)
- «تست سیستم» (System Testing)
- «آزمون پذیرش» (Acceptance Testing)
توسعهدهندگان میتوانند به وسیله تستها و آزمایشهای زودهنگام و مداوم از وقوع باگها جلوگیری کنند. علاوه بر تست نرم افزار، بررسی و مرور کدها با سایر توسعهدهندگان، وجود توسعه دهنده ارشد یا تیم تضمین کیفیت (Quality Assurance | QA) هم میتواند بسیار کاربردی باشد.
همچنین بخوانید » معرفی بازی های برنامه نویسی
-
مرحله سوم برای جلوگیری از Bug در برنامه نویسی: کاراییسنجی (تست معیار | Benchmarking):
در کاراییسنجی یا همان بنچمارک کردن (Benchmarking | Benchmark Testing | تست معیار) انتظارات عملکرد پایه تحت انواع مختلف حجم کاری برای نرم افزار ایجاد میشود. با استفاده از تستهای بنچمارک میتوان پایداری، واکنشپذیری، سرعت و تاثیرگذاری نرم افزار را ارزیابی کرد.
باگهایی که تحت مجموعهای از شرایط غیر فعال هستند، ممکن است در سایر شرایط مشکلات جدی ایجاد کنند. به وسیله تست معیار یا همان تست بنچمارک میتوان به شناسایی چنین باگهایی کمک کرد. در ادامه برخی از انواع بنچمارک فهرست شدهاند:
- کاراییسنجی حجم کاری (Load Benchmarking): در این نوع از بنچمارکینگ، سیستمهای نرمافزاری تحت حجم و فشاری مشخص ارزیابی میشوند که این میزان مشخص معملاً مقدار ترافیکی است که انتظار میرود یک اپلیکیشن با آن مواجه شود.
- کاراییسنجی جهش (Spike Benchmarking): در این روش، عملکرد نرم افزار در طول افزایش ناگهانی حجم کاری ارزیابی میشود.
- کاراییسنجی نقطه توقف (Breakpoint benchmarking): در این روش روی نرم افزار فشار وارد میشود تا بتوان مشخص کرد که چه میزانی از تنش را میتواند تحمل کند.
همچنین بخوانید » روش های یادگیری برنامه نویسی کدام ها هستند؟
-
مرحله چهارم برای جلوگیری از Bug در برنامه نویسی: رفع باگ (دیباگ کردن | Debugging):
دیباگ کردن چیست؟
فرآیند پیدا کردن باگ ها توسط کاربران اشکال زدایی یا دیباگینگ (Debugging) نامیده می شود. اشکال زدایی پس از نوشتن کد شروع می شود و در مراحلی که کد با واحدهای دیگر برنامه نویسی ترکیب می شود تا یک محصول نرم افزاری مانند یک سیستم عامل یا یک برنامه کاربردی را تشکیل دهد، ادامه می یابد.
باگ ها معمولا پس از انتشار یک محصول یا در طول آزمایش عمومی بتا کشف می شوند. هنگامی که این اتفاق می افتد، کاربران باید راهی برای جلوگیری از استفاده از کد باگ پیدا کنند.
برای برنامهنویسان قطعه کدها برگشت به گامهای گذشته و مرور کدهای پیچیده و پرتراکم میتواند سخت باشد. «طرح جایزه باگ پیدا کردن» که به آن «باگ بانتی» (Bug Bounty) میگویند راهی برای جمعسپاری تلاش برای دیباگ کردن به حساب میآید.
در جمعسپاری باگ بانتی به محققان امنیت نرمافزار و هکرهای اخلاقی جایزه پرداخت میکنند. این جایزهها برای پیدا کردن مشکلات و فراهم کردن گزارشهایی در خصوص باگهایی اهدا میشوند که ممکن است تکثیر یابند یا رفع آنها آسیبپذیری را کاهش دهد.
یک باگ چگونه رفع می شود؟
همانطور که امروزه کامپیوترها، سخت افزارها و نرم افزارهای کامپیوتری پیچیده هستند، چیزی به نام نرم افزار یا سخت افزار بدون اشکال وجود ندارد. وقتی باگی پیدا میشوند با توجه به اینکه باگ در نرم افزار رخ داده یا در سخت افزار باید نسبت به رفع آنها اقدام کرد:
دیباگینگ سخت افزاری (رفع باگ های سخت افزاری):
اشکالات سختافزاری قابل حل با بهروزرسانیهای میانافزار و درایورها برطرف میشوند. در مورد باگ های سخت افزاری حادتر، ممکن است قطعه ای از دستگاه کلا عوض شود.
دیباگینگ نرم افزاری (رفع باگ های نرم افزاری):
اگر باگی در نرمافزار پیدا شود، باید آن را دیباگ کرد. دیباگ کردن ۳ مرحله دارد که هر یک در ادامه فهرست شدهاند:
- ایزولهسازی باگ (عایقکاری کردن یا جداسازی خطا)
- مشخص کردن ریشه مشکل
- رفع کردن باگ
-
مرحله پنجم برای جلوگیری از Bug در برنامه نویسی: بهسازی مداوم (Continuous improvement):
بهبود مداوم برای رفع باگ در برنامه نویسی: سازمانهایی که به دنبال به حداقل رساندن اشکالات نرمافزاری هستند، باید بین تعداد عرضهها و عقبگردهای نسخههای نرمافزاری انجام شده تعادل ایجاد کنند. با انجام این کار، آنها اطمینان حاصل میکنند که فرایند دیباگ کردن مانع انتشار زمانبندی شده نرمافزار پایدار نخواهد شد. این شیوه را سازمانهایی به کار میگیرند که در محیط توسعه نرم افزار به روش چابُک (اجایل) فعالیت میکنند.
با این تفاصیل، برخی از باگها به هر نحو به محصول نرم افزاری منتشر شده راه پیدا میکنند. تیمهای برنامه نویسی میتوانند نسخه منتشر شده را به عنوان بخشی از فرآیند اشکالزدایی، جمعآوری بازخورد، شکست سریع و ایجاد بهبود در نظر بگیرند.
تیم یا فردی در داخل تیم ممکن است هر روز زمان ثابتی را برای بررسی باگهای نرم افزاری در نظر بگیرد. به این طریق، جمعآوری دادههای مربوط به باگها و خود فرایند دیباگ کردن به بخشی از برنامه روزانه تبدیل میشود. یک تیم توسعه نرم افزار ممکن است از دادههای مربوط به فرایند دیباگ کردن برای تخمین مدت زمان مورد نیاز برای رفع یک باگ استفاده کند و تلاشهای خود را متناسب با آن سازماندهی کند.
رفع تمام باگها در یک نوبت غیرممکن است و جمعآوری دادههای مورد نیاز برای ایجاد برآوردهای دقیق در مورد باگها امری زمانبر به حساب میآید. برنامه نویسان در مورد سطح مهارتها و تواناییهایشان با هم تفاوت دارند. به همین دلیل برآوردهای رفع باگ نیز ممکن در میان برنامه نویسان مختلف به گونهای متفاوت انجام شوند. در طول زمان یک تیم میتواند برآوردهایی را در خصوص تعداد رفع باگهایی بدست آورد که امکان انجام آنها را در طول یک ماه دارد.
دیباگ کردن هرگز کاری بدون نقص و کامل نیست. همواره باگهای جدیدی پیدا میشوند. تیمهای توسعه باید هدفشان این باشد که باگها را به طور بهینه هدف قرار دهند و با انتشار هر نسخه از نرم افزار ارزش خالص مثبتی را به ذینفعان ارائه دهند.
همچنین بخوانید » آموزش برنامه نویسی #C
سوالات متداول در زمینه باگ چیست؟
در این قسمت می خواهیم شما را با سوالاتی رایج کاربران در زمینه Bug ها آشنا کنیم:
√ تفاوت بین خطا و باگ چیست؟
خطا پیامی است که به کاربر یک برنامه نشان داده می شود تا متوجه شود مشکلی پیش آمده است. باگ یک مشکل در کد برنامه است که باعث ایجاد خطا شده است.
√ زمان لازم برای رفع باگ ها:
زمان لازم برای رفع یک باگ به پیچیدگی آن، تعداد توسعه دهندگان و مدت زمان آنها بستگی دارد. اگر فکر می کنید اشکالی را در یک برنامه یا دستگاه پیدا کرده اید، گزارش باگ به سازنده بهترین راه برای رفع اشکال است.
√ دلایلی که یک شرکت در مواجه با باگ پیش آمده در محصولات برای کاربران، اقدامی نمی کند چه مواردی می تواند باشد؟
برای رفع هر گونه باگ نرم افزاری یا سخت افزاری، شرکت باید برنامه نویسی را استخدام کند که بتواند کدهای ایجاد کننده باگ را پیدا و دیباگ کند. لیست زیر به این دلیل است که چرا یک شرکت ممکن است یک باگ را برطرف نکند یا رفع آن را به تاخیر بیندازد.
- این باگ تنها درصد کمی از افراد را تحت تاثیر قرار می دهد و یک اشکال با اولویت پایین است.
- اشکال قابل تکرار یا پیدا شدن نیست.
- رفع اشکال در نسخه بعدی محصول منتشر رفع و آپدیت خواهد شد.
- این محصول توسط یک نفر یا یک تیم کوچک است که منابع لازم برای دیباگ آن را ندارد.
- رفع اشکال بسیار پیچیده است یا برای رفع آن به منابع زیادی نیاز دارد.
- محصول EOL (پایان عمر) است یا دیگر پشتیبانی نمی شود.
- این شرکت دیگر در تجارت فعالیتی نمی کند و غیرفعال شده است.