كم مرة سمعت أحد يتحدث "في bug بالنظام" أو "لقينا defect جديد" أو "صار failure بالسيرفر"؟
المشكلة إنه كثير ناس يستخدموا هذه المصطلحات وكأنها نفس الشي - لكن الحقيقة إنها مختلفة تماماً، وفهم الفرق بينهم مهم جداً لأي مختبر أو مطور محترف.
في هذا الدرس، سنتحدث عن أربع مصطلحات أساسية:
بنهاية هذا الدرس، ستكون قادراً على:
Error هو خطأ بشري (Human Mistake) يحصل أثناء كتابة الكود.
الـ Error يحصل عندما:
> بدل >=)تخيل معي إنه عندنا نظام للقبول في كلية الطب. شروط القبول هي:
المبرمج كتب الكود التالي:
public boolean isEligibleForMedicalSchool(int average, int age) {
if (average > 94 && age < 30) {// هنا في خطأ!
return true;
} else {
return false;
}
}ما الخطأ هون؟
المبرمج كتب:
average > 94 ← لكن المفروض average >= 94age < 30 ← لكن المفروض age <= 30هذا Error - خطأ بشري من المبرمج!
Defect هو نفس الخطأ (Error) لكن عندما ننكشفه أثناء الاختبار (Testing) - يعني قبل أن يوصل للـ Production.
عندما:
في هذه الحالة، الحمدلله - المشكلة انكشفت قبل لا توصل للعملاء!
لو المختبر عمل test case:
النتيجة المتوقعة: ✅ مقبول النتيجة الفعلية: ❌ مرفوض
المختبر لقى المشكلة قبل أن النظام ينزل للـ Production ← هذه Defect.
المختبر يفعل ticket في Jira:
Title: Defect - Student with average 94% is incorrectly rejected
Priority: High
Environment: TestingBug هو نفس المشكلة (Defect) لكن عندما يكتشفها المختبر أو أي أحد يختبر في بيئة الإنتاج (Production).
عندما:
تخيل إنه:
هون المشكلة صارت Bug لأنها انكشفت في Production من قِبل المختبر أو الفريق (مش من المستخدم النهائي).
Failure هو عندما المستخدم النهائي (End User) يكتشف المشكلة ويتأثر فيها.
عندما:
الـ Failure هو أسوأ سيناريو - المشكلة وصلت للمستخدم الحقيقي، هو الذي اكتشفها، وتأثر فيها سلباً!
تخيل إنه:
هون:
average > 94 بدل >= 94الـ Failure هون خطير جداً لأنه:
خلينا نشوف كيف ينتقل الخطأ من المبرمج للمستخدم النهائي:
المبرمج كتب كود غلط
↓
Error (خطأ بشري)
↓
┌──────────────────────────────────────────────┐
│ │
↓ ↓
Defect Bug
(المختبر لقاها في Testing) (المختبر لقاها في Production)
│ │
↓ ↓
بنصلحه قبل Production بنصلحه بسرعة (Hotfix)
│ │
↓ ↓
✅ ما صار Bug أو Failure ✅ ما صار Failure
│
│ لو ما انتبهنا...
↓
Failure
(المستخدم النهائي لقاها وتأثر)أفضل سيناريو: ننكشف الـ Error ونصلحه قبل أن يصير Defect أصلاً!
سيناريو كويس: المختبر يلاقي Defect في Testing ونصلحه
سيناريو مقبول: المختبر يلاقي Bug في Production ونصلحه بسرعة قبل أن المستخدم يتأثر
أسوأ سيناريو: Failure - المستخدم النهائي يلاقي المشكلة ويتأثر فيها
خلينا ناخذ مثال من تطبيق الكل يستخدمه - Instagram.
تخيل إنه في feature جديدة: "نشر story بصورة متعددة (carousel)".
المتطلبات:
المبرمج كتب:
public boolean canPostStory(int numberOfPhotos) {
if (numberOfPhotos > 0 && numberOfPhotos < 10) {// خطأ هنا!
return true;
} else {
return false;
}
}Error: المبرمج كتب numberOfPhotos < 10 بدل <= 10
المختبر جرّب:
المختبر لقى المشكلة في Testing ← هذه Defect.
الفريق صلّح الكود قبل أن ينزل Production ← ما صار Bug أو Failure.
تخيل إنه المختبر ما جرّب حالة الـ 10 صور في Testing.
النظام نزل Production، والمختبر عمل Sanity Testing في Production وجرّب ينشر 10 صور.
النظام رفض! المختبر اكتشف المشكلة.
هون: Bug - المختبر لقى المشكلة في Production قبل أن المستخدمين يتأثروا.
الفريق يقدر يعمل Hotfix بسرعة ويصلح المشكلة.
تخيل إنه:
النظام رفض! لا يوجد رسالة واضحة، لكن ما اشتغل.
سارة:
هون: Failure - سارة (المستخدم النهائي) هي التي اكتشفت المشكلة وتأثرت فيها
ISTQB (المنظمة الدولية لاختبار البرمجيات) بتعرّف:
Bug = Defect (نفس الشي تماماً)
لكن إحنا منفرّق بينهم بناءً على وين انكشفت المشكلة.
عندما تقول لمديرك:
دعونا نلخص المصطلحات الأربعة:
✅ Error (الخطأ): خطأ بشري من المبرمج أثناء كتابة الكود
✅ Defect (العيب): المشكلة عندما المختبر يلاقيها في بيئة Testing (قبل Production)
✅ Bug (الخلل): المشكلة عندما المختبر أو الفريق يلاقيها في Production (قبل أن المستخدم يتأثر)
✅ Failure (الفشل): عندما المستخدم النهائي يلاقي المشكلة ويتأثر فيها
✅ الفرق بين Defect و Bug و Failure - الفرق بالـ من اكتشفها ووين
✅ ISTQB بيعتبر Bug = Defect، لكن تعريفنا العملي أوضح وأفضل للتقارير والـ metrics
✅ الهدف: ننكشف كل الـ Errors كـ Defects في Testing، ونمنعهم يوصلوا Production كـ Bugs
مبرمج كتب في نظام حجز طيران:
if (passengerAge > 2) {
ticketPrice = 100;
} else {
ticketPrice = 0;// مجاني للأطفال
}المتطلبات كانت: الأطفال سنتين أو أقل مجاني، الباقي بـ 100 دولار.
ما اسم المشكلة هون؟
Error (خطأ بشري)
المبرمج كتب passengerAge > 2 لكن المفروض passengerAge > 2 صحيحة، أو بالأصح المفروض passengerAge <= 2 للحالة المجانية.
المشكلة: طفل عمره سنتين بالضبط سيدفع 100 دولار بدل مجاني!
الـ Error هو الخطأ البشري الذي عمله المبرمج.
نفس المشكلة من السؤال الأول - المختبر عمل test case لطفل عمره سنتين ولقى إنه النظام يطلب منه يدفع 100 دولار.
هذا أصبح هناك بيئة الـ Testing.
ما اسم المشكلة هون؟
Defect (عيب)
نفس الخطأ، لكن لأنه انكشف في بيئة Testing (قبل Production)، منسميه Defect.
المختبر سيعمل ticket ويبلغ الفريق، والمبرمج سيصلحه قبل أن ينزل Production.
نفس المشكلة - لكن هالمرة المختبر ما لقاها في Testing.
النظام نزل Production، والمختبر عمل Sanity Testing ولقى إنه طفل عمره سنتين النظام يطلب منه 100 دولار.
ما اسم المشكلة هون؟
Bug (خلل)
المختبر لقى المشكلة في Production (مش المستخدم النهائي)، فـ منسميها Bug.
الفريق يقدر يعمل hotfix بسرعة ويصلح المشكلة قبل أن المستخدمين يتأثروا.
نفس المشكلة - لكن المختبر ما عمل Sanity Testing في Production.
عائلة رحلت على دبي، وطفلهم عمره سنتين. عندما حاولوا يحجزوا تذاكر، النظام طلب منهم يدفعوا 100 دولار للطفل.
العائلة دفعت الـ 100 دولار الزيادة (مع إنه المفروض مجاني). بعد ذلك اكتشفوا الخطأ، زعلوا، وكتبوا review سيء للشركة على Google.
ما اسم المشكلة هون؟
Failure (فشل)
هون المستخدم النهائي (العائلة) هم الذين اكتشفوا المشكلة وتأثروا فيها:
الـ Failure = المستخدم النهائي لقى المشكلة + تأثر فيها.
حسب تعريفات ISTQB، الـ Bug والـ Defect:
أ) مختلفين تماماً ب) نفس الشي ج) Bug أخطر من Defect د) Defect يحصل قبل Bug
ب) نفس الشي
ISTQB بيعتبر Bug = Defect (مترادفات).
لكن إحنا بنفرّق بينهم عملياً:
هذا التفريق يساعدنا نحسّن الـ process ونفهم وين المشاكل تحصل.
في الدرس الجاي، رح نحكي عن Severity vs Priority - شو الفرق بينهم؟ ومتى نعطي مشكلة High Severity بس Low Priority؟
استعد لأمثلة واقعية من Facebook و WhatsApp و Uber!
ملاحظة أخيرة:
لا تحفظ التعريفات - افهمها وطبقها! الهدف مش إنك تحفظ "Defect هو كذا" - الهدف إنك عندما تلاقي مشكلة، تعرف كيف توصفها بدقة وتعرف ما الـ action المناسب.
شكراً ويعطيكم العافية! 🚀