ساعة ضائعة بسبب خطأ بايثون غبي! قصة Debugging حقيقية (وما تعلمته عن تتبع الأخطاء)

شعور رائع أن ترى كود بايثون الذي كتبته يعمل أخيراً! لكن أحياناً، تأتي لحظات الإحباط تلك عندما يتوقف كل شيء بسبب خطأ يبدو تافهاً، وتجد نفسك تدور في حلقة مفرغة. مؤخراً، قضيتُ ساعة كاملة تقريباً أبحث عن خطأ كان بسيطاً بشكل محرج. هذه قصتي.

مطور يمسك رأسه بيأس أمام شاشة حاسوب تعرض خطأ برمجي (Traceback Error) في كود بايثون | أخطاء بايثون تضيع وقت المطورين
لحظة "لماذا لا يعمل؟!" المألوفة لكل مبرمج.

كمبرمجين، نعرف أن كتابة الكود هي نصف المعركة، والنصف الآخر هو تصحيح الأخطاء (Debugging). إنها مهارة أساسية لا تقل أهمية عن معرفة بناء الجملة (Syntax). أريد اليوم أن أشارككم تجربة "صيد أخطاء" حقيقية حدثت معي، ليس لأبدو خبيراً (لأن الخطأ كان غبياً!)، بل لنستخلص معاً بعض الدروس العملية حول كيفية التعامل مع هذه المواقف المحبطة التي يمر بها كل مطور، قديم أو جديد.

المهمة البسيطة التي تحولت إلى كابوس (خطأ IndentationError)

كنت أعمل على سكربت بايثون بسيط جداً كجزء من تمرين تعليمي. الهدف كان كتابة دالة تأخذ قائمة من أسماء المستخدمين، وتقوم بطباعة رسالة ترحيب لكل مستخدم يبدأ اسمه بحرف معين (لنقل حرف 'A'). بدا الأمر سهلاً ومباشراً، خاصة بعد مراجعة أساسيات بايثون.

كتبت الكود التالي بسرعة:


def greet_users_starting_with_a(usernames):
    print("Starting the greeting process...")
    for name in usernames:
    if name.startswith('A'):
        print(f"Hello, {name}!") # رسالة الترحيب
    print("Finished checking users.")

users = ["Ahmed", "Sara", "Ali", "Fatima", "Amal"]
greet_users_starting_with_a(users)

شغلت الكود متوقعاً رؤية رسائل ترحيب لـ "Ahmed", "Ali", "Amal". لكن بدلاً من ذلك، حصلت على خطأ غريب لم أتوقعه: IndentationError: expected an indented block (خطأ في المسافة البادئة: كان متوقعاً كتلة بمسافة بادئة).

رحلة البحث عن "المسافة المفقودة" (ساعة ضائعة!)

"خطأ مسافة بادئة؟" قلت لنفسي. "هذا بايثون، الأمر بسيط!". بدأت رحلة البحث التي استغرقت وقتاً أطول بكثير مما تستحق:

  • المحاولة الأولى (الثقة العمياء): نظرت إلى الكود، بدا لي أن المسافات صحيحة! ربما هناك حرف غير مرئي؟ حذفت المسافات وأعدت كتابتها. نفس الخطأ!
  • المحاولة الثانية (الشك في المحرر): هل محرر الأكواد (VS Code) يسبب المشكلة؟ قضيت 10 دقائق أبحث في إعدادات المسافات البادئة. لا فائدة.
  • التقسيم (Chunking) والإخراج: لو كنت أتبعت أفضل الممارسات، كان يجب أن أعزل المشكلة. كيف؟ عن طريق التعليق على الأكواد بعد سطر for name in usernames: والتحقق من أن الحلقة تعمل أولاً.
  • المحاولة الرابعة (البحث في جوجل): بحثت عن "IndentationError python for loop if". قرأت عدة إجابات. كلها تقول: "تأكد من وجود مسافة بادئة بعد جملة for". نظرت إلى كودي... "لكنها موجودة!".

لحظة الاكتشاف (المحرجة)!

لاحظت شيئاً بسيطاً جداً. انظروا مرة أخرى إلى الكود الأصلي:


    for name in usernames:
    if name.startswith('A'): 
        print(f"Hello, {name}!")

السطر if name.startswith('A'): كان يجب أن يكون داخل حلقة for. أنا وضعتها بنفس مستوى الـ for (عن طريق الخطأ)، لذلك اعتبرها بايثون كتلة فارغة بعد for: وتوقع شيئاً بداخلها بمسافة بادئة.

الحل كان بسيطاً جداً:


def greet_users_starting_with_a(usernames):
    print("Starting the greeting process...")
    for name in usernames:
        # لاحظ المسافة البادئة الصحيحة هنا
        if name.startswith('A'):
            print(f"Hello, {name}!")
            
    print("Finished checking users.")

users = ["Ahmed", "Sara", "Ali", "Fatima", "Amal"]
greet_users_starting_with_a(users)

شغلت الكود المعدل... وعمل بشكل مثالي! شعرت بالارتياح، وبكثير من الإحراج لأنني قضيت ساعة كاملة بسبب مسافة بادئة خاطئة.

الدروس المستفادة: ما تعلمته من "الخطأ الغبي"

رؤيتي الآن (قواعد الـ Debugging): هذه التجربة، رغم بساطتها، علمتني دروساً قيمة جداً حول تتبع الأخطاء، وهي دروس تنطبق على أول مشروع بايثون لك:
  • الاعتماد على Linters (أدوات الكشف الفوري): محررات الكود الحديثة (IDEs) مثل PyCharm أو VS Code مع إضافات Linters غالباً ما تضع خطاً أحمر تحت أخطاء المسافات البادئة. تعلم الاعتماد عليها لتصحيح الأخطاء أثناء الكتابة.
  • رسائل الخطأ هي صديقك: اقرأ رسالة الخطأ كلمة بكلمة وحاول فهم ما تخبرك به بالضبط. Traceback يخبرك بالملف والسطر الذي حدث فيه الانهيار.
  • استخدم قاعدة F-S-R: إذا فشلت في العثور على الخطأ، Fresh Eyes (خذ استراحة وعد)، Search (ابحث عن رسالة الخطأ)، Review (راجع الكود مع زميل أو صديق).
  • التقسيم والعزل: استخدم التعليقات (`#`) لعزل جزء كبير من الكود وتشغيله. ثم أزل التعليق عن كتلة صغيرة فقط. هذا يضيق نطاق البحث عن الخطأ.
  • الأخطاء فرصة للتعلم: كل خطأ، مهما كان بسيطاً، هو فرصة لترسيخ فهمك لأساسيات اللغة (وفي حالة بايثون، فهم أهمية المسافة البادئة).

الخلاصة: احتضن الأخطاء، وتعلم منها!

رحلة تعلم البرمجة مليئة بلحظات "آها!" ولحظات "لماذا؟!". الأخطاء، حتى البسيطة والمحرجة منها، هي جزء لا يتجزأ من هذه الرحلة. الأهم هو ليس عدم الوقوع في الخطأ، بل كيفية التعامل معه والتعلم منه لتصبح مبرمجاً أفضل وأكثر كفاءة في استخدام أدواتك.

ما هو أغبى أو أبسط خطأ برمجي أضاع وقتك لساعات؟
شاركنا قصصك المضحكة (أو المحبطة!) في التعليقات! لنتعلم من بعضنا البعض.

✍️ كتب بواسطة KamalZone

تعليقات