كيف تتفادى الأخطاء الخفيّة أثناء البرمجة: ثأرُها صعب!

5  تعليق

حينما كُنت أعمل في وظيفة “محلل دعم تقني” لم يكن عملي مقتصراً على حُدود مسمى الوظيفة، كانت مهمتي فعلياً دعم الفريق كاملاً لإنجاح الإصدارات الشهرية للنظام الذي نعمل عليه.

انضمّ إلى فريقنا عضوٌ جديد، فاجتمع الفريقُ لتعريفه بأعضاء الفريق قبل حضوري، فأتيتُ أثناء الاجتماع وعند دُخولي طُلب مني تقديمُ نفسي ومهمتي بالفريق.

رددتُ بجملتين..

إسمي مصطفى الطيب، أنا جامعُ النفايات  Garbage Collector

تعالت بعضُ الضحكات والابتسامات وهو ما قصدتُه ولم أزد على ذلك.. فبرغم الطرفة كان الجميع يعلم أن هذه هي مهمتي الحقيقية. جامعُ نفايات الفريق كما يفعل جامعُ النفايات في آلة جافا الافتراضية JVM.

لم تُوجد البرامج التي تعمل دون أخطاء بعد، توقّع الأخطاء بعد إطلاق الإصدارات دائماً

ما قبل وأثناء عملية إطلاق الإصدارة الشهرية تأتي العديد من المشاكل التي ربما تكون بسبب أخطاءٍ برمجيّة بسيطة أو مُركّبة، منطقيّة أو تقنيّة أو حتى تجاريّة.

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

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

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

خداعُ الحرُوف البصري!

هل تعلم |نّ حرف الألف المكتوب في كلمة “أن” السابقة ليس حرف ألف؟ إنّها علامة “أو” البرمجية. عُد إليها الآن وانسخها في ملف Notepad وكبّرها وتأكد 🙂

لقد خدعك توقُّعك لحرف الألف أو أن علامة “أو” البرمجية قد خدعتك .. اختر أيَّهما أحبُّ إليك 🙂

سُقت لك هذا المثال باللغة العربية، ولكن اللغة الإنجليزية مليئة بالمتشابهات من الأحرف والأرقام والعلامات مثل:

  • حرف إل الصغير l وعلامة أو |.
  • حرف B ورقم 8 في بعض الخطوط.
  • حرف آي الكبير I و رقم 1.
  • حرف S ورقم 5.

انظر للشفرة المصدرية التالية مثلاً

    public static void main(String args[]){
        Long totalRevenue = 5325l; 
        System.out.println(" Total Revenue = " + totalRevenue);
    }

هل تعلم ما هو الرقم الذي سيطبع في الشاشة؟ ركّز قليلاً ثم انظر إلى النتيجة أدناه

نتيجة تنفيذ البرنامج
نتيجة تنفيذ البرنامج

أين ذهب الرقم 1 في يمين مجموع الأرباح؟!!

نعم نعم.. إنّه حرف إل L الصغير الخاص بتعريف المتغير كنوع Long.

فضل أن يستخدم حرف L الكبير للتعبير عن رقم من النوع Long لتفادي الخداع البصري لحرف L الصغير واعتقاده الرقم 1.

انظر للمثال أدناه والذي يدل على سهولة تلافي هذا النوع من الأخطاء.

    public static void main(String args[]){
        Long totalRevenue = 5015325L; 
        System.out.println(" = " + totalRevenue);
    }

التلاعب الشهير في معرّفات المخترقين بين الـ O والـ 0 كمثال آخر

إستخدام أرقام بدل الأحرف في معرّفات المخترقين
استخدام أرقام بدل الأحرف في معرّفات المخترقين

مثال آخر هو الخلط بين حرف O و صفر 0 والتي يستخدمها المخترقون في أسمائهم كثيراً للتمويه، مثل المثال التالي

    public static void main(String args[]){
        String role = "R0LE"; 
    }

بينما هذه الأخطاء ربما يكون من السهل الانتباهُ لها، أعتبر الخطأ التالي خطئاً مركباً لأنه يعتمد على التحويل من النظام الثماني إلى العشري.

11 تصبح 9 بسبب صفر إضافي فقط!

فكما تعلم عند تعريف رقم ثُمانيٍ في لغة جافا نسبق الرقم بالرقم صفر ثم يليه عدة أرقام تتراوح بين 0 و 7، وبالتالي إذا ما عرّفت متغيراً من النوع Int ثم أسندت له رقماً ثمانياً فستتم عملية التحويل دون أن تنتبه!

شاهد هذا المثال

    public static void main(String args[]){
        int age = 011;
        System.out.println("Age = "+age);
    }

طباعةُ هذا الرقم لن تكون 11 كما قد يعتقد البعض، بل ستكون 9

نتيجة التحويل من رقم ثماني إلى عشري
نتيجة التحويل من رقم ثماني إلى عشري

خاتمة

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

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

الأخطاء الخفية في الشفرة المصدرية

قد يعجبك أيضا

ما رأيك؟ اترك تعليقاً أدناه


  1. لا يا أستاذ مصطفى، صعبة عليّ، فأنا رجل أبلغ من
    العمر 65 عاما، ففى زماننا كان كتاب “عادل وسعاد” يلعبان
    فى الحديقة، وكامل عامل فى مصنع، وحصُلت على الابتدائية
    وقتها بمجموع 202 من 300. كان ذلك بين عامي 1961-1960
    تقريبا. وسيادتكم قلتم:
    «تجاربُ الصغر هذه تعلمتُ منها منذ نعومة أظافري أن القصص
    و النصائح لا تكفي للتعلم، و إنما لا بُد للتجربة أن تحل محلها».
    منذ نعومة الأظافر، فكانت النكسة فى العام 1967
    وإعادة البناء وتَحَمَّل الفقراء العبء الأكبر مع 131 قرش معاشا
    شهريا لثلاثة أفراد: أم وطفلين!! بعد وفاة أب ترك طفل فى
    السابعة من عمره، وطفل فى الخامسة من عمره.
    واليوم بفضل وكرم من رب السموات السبع ورب العرش العظيم
    الله الواحد الأحد، خَصَّص لى معاشا كريما حكوميا بعد التقاعد
    نحمده سبحنه فهو أكرم الأكرمين ويدير مصالح وشؤون مخلوقاته
    جميعا وحده بدون مساعدين ولا مستشارين وحاشا لله قائم بذاته
    يدير شؤون ويلبى مطالب 7 مليار وأكثر هم عدد سكان
    كوكب الأرض. الله القوى العزيز العظيم لم يلد ولم يولد
    ولم يكن له كفوا أحد، قائم بذاته سبحانه وتعالى تنزه
    فى علاه عما يصفون وعما بشركون.
    فصعبٌ عليّ فهم لغتكم الجديدة، ولكنى أحاول جاهدا أن أجاريكم
    علّنى أفوز بمعلومة أتعكز عليها لو حضرت نقاشا طيبا.
    شكرا لكم، وتقبلوا تحياتنا.
    شكر إضافى:
    نشكركم على خاصية التنبؤ بإسم الضيف وبريده
    الإلكترونى.

{"email":"البريد الالكتروني غير صحيح","url":"رابط الموقع غير صحيح","required":"بعض الحقول المطلوبة لم تتم تعبئتها"}

نجاح!

تنبيه!

خطأ!