قال عالم الكمبيوتر الراحل أيدسكر دايكسترا: “إذا كان التصحيح هو عملية إزالة الأخطاء، فيجب أن تكون البرمجة هي عملية إدخالها”، إذ تعتبر مواجهة أنواع مختلفة من الأخطاء في البرمجة جزءًا كبيرًا من عملية التطوير، سنتحدث في هذا المقال عن الأنواع السبعة الأكثر شيوعًا من أخطاء البرمجة وكيف يمكنك تجنبها.
أنواع الأخطاء في البرمجة الأكثر شيوعًا:
1. أخطاء النحوية Syntax Errors:
تمامًا مثل اللغات البشرية، فإن لغات الكمبيوتر لها قواعد نحوية، ولكن في حين أن البشر قادرون على التواصل مع قواعد نحوية أقل من الكمال، لا يمكن لأجهزة الكمبيوتر تجاهل الأخطاء (أي أخطاء بناء الجملة)، على سبيل المثال، لنفترض أن الصيغة الصحيحة لطباعة شيء ما هي (“hello”)print، وننسى عن طريق الخطأ أحد الأقواس أثناء كتابة الكود، سيحدث خطأ في بناء الجملة، وسيؤدي ذلك إلى إيقاف تشغيل البرنامج.
وكلما زادت كفاءتك في لغة البرمجة، ستقل الأخطاء النحوية كثيراً، وأسهل طريقة لمنعها من التسبب في مشاكل لك هي أن تكون على دراية بها مبكرًا، يقوم العديد من محرري النصوص أو “IDE” بتقديم القدرة على تحذيرك من الأخطاء النحوية في وقت كتابة الكود.
2. الأخطاء المنطقية Logic Errors:
يمكن أن تكون الأخطاء المنطقية هي الأصعب في تعقبها، كل شيء يبدو أنه يعمل، لكنك قد قمت للتو ببرمجة الكمبيوتر لفعل الشيء الخطأ، من الناحية الفنية البرنامج صحيح، لكن النتائج لم تكون كما كنت تتوقع، فمثلا إذا لم تتحقق من المتطلبات مُسبقًا وكتبت كوداً لإرجاع أقدم مستخدم في نظامك مع أنك تحتاج إلى مستخدم الأحدث، فسيكون لديك خطأ منطقي.
وعندما تقوم بكتابة اختبارات لبرنامجك، قم بإظهارها لمدير المنتج أو مالك المنتج للتأكد من صحة المنطق الذي توشك على كتابته، فبالرجوع إلى المثال السابق، قد يكون شخص ما أقرب إلى النشاط التجاري قد اكتشف أن الموجود هو أقدم مستخدم ولكن المطلوب هو أحدث مستخدم.
أشهر مثال على الأخطاء المنطقية حدث في عام (1999) عندما فقدت وكالة ناسا مركبة فضائية بسبب الحسابات الخاطئة بين الوحدات الإنجليزية والأمريكية، حيث تم كتابة كود البرنامج بطريقة ولكنه يحتاج إلى العمل بطريقة أخرى.
3. أخطاء التجميع Compilation Errors:
تتطلب بعض لغات البرمجة خطوة تجميع، التجميع هو المكان الذي تتحول فيه لغتك عالية المستوى إلى لغة منخفضة المستوى حيث يمكن للكمبيوتر فهمها بشكل أفضل، إذ يحدث خطأ في التجميع أو خطأ وقت الترجمة عندما لا يعرف المترجم كيفية تحويل كود الخاص بك إلى كود منخفض المستوى، وإذا كان هناك خطأ في وقت الترجمة في برنامجك، فلن تتمكن من اختباره أو تشغيله.
في مثال الخطأ النحوي الخاص بنا، إذا كنا نجمع ( hello”)print، فسيتوقف المترجم ويخبرنا أنه لا يعرف كيفية تحويل هذا إلى لغة ذات مستوى أدنى لأنه توقع علامة ” قبل )، ومثل الأخطاء النحوية، فإنك ستتحسن في تجنب أخطاء التجميع بمرور الوقت، ولكن بشكل عام، فإن أفضل ما يمكنك فعله هو الحصول على ملاحظات مبكرة عند حدوثها.
4. أخطاء وقت التشغيل Runtime Errors:
تحدث أخطاء وقت التشغيل أثناء قيام المستخدم بتنفيذ برنامجك، حيث أن الكود قد يعمل بشكل صحيح على جهازك ولكن على خادم الويب قد يكون هناك تكوينه مختلف، أو قد يتم التفاعل معه بطريقة قد تتسبب في حدوث خطأ في وقت التشغيل، فإذا كان نظامك يأخذ مدخلات من نموذج وحاول جعل الحرف الأول من الاسم بأحرف كبيرة عن طريق القيام بشيء مثل “params[:first_name].capitalize”، فإن هذا قد لا يعمل إذا تم إرسال النموذج بدون الاسم الأول.
أخطاء وقت التشغيل مزعجة بشكل خاص؛ لأنها تؤثر بشكل مباشر على المستخدم النهائي، إذ سيحدث الكثير من هذه الأخطاء الأخرى عندما تكون على جهاز الكمبيوتر الخاص بك وتعمل على الكود، لكن تحدث أخطاء وقت التشغيل أثناء تشغيل النظام ويمكن أن تمنع أي شخص من القيام بما يحتاج إلى القيام به، عليك أن تتأكد من وجود تقارير أخطاء جيدة جاهزة لالتقاط أي أخطاء في وقت التشغيل، جرب وتعلم من كل تقرير خطأ حتى تتمكن في المستقبل من الحماية من هذا النوع من الأخطاء.
5. الأخطاء الحسابية Arithmetic Errors:
الخطأ الحسابي هو نوع من الخطأ المنطقي ولكنه يتضمن الرياضيات، من الأمثلة النموذجية عند إجراء معادلة قسمة أنه لا يمكنك القسمة على صفر دون التسبب في مشكلة، قلة قليلة من الناس يكتبون “5/0″، لكنك قد لا تعتقد أن حجم شيء ما في نظامك قد يكون صفراً في بعض الأحيان، مما قد يؤدي إلى هذا النوع من الخطأ.
يمكن أن تُحِدث الأخطاء الحسابية أخطاء منطقية كما ناقشناها، أو حتى أخطاء وقت التشغيل في حالة القسمة على صفر، يعد إجراء الاختبارات الوظيفية التي تتضمن دائمًا حالات الحافة مثل الصفر أو الأرقام السالبة طريقة ممتازة لإيقاف هذه الأخطاء الحسابية في مساراتها.
6. أخطاء الموارد Resource Errors:
سيخصص الكمبيوتر الذي يعمل عليه البرنامج مقدارًا ثابتًا من الموارد لتشغيله، إذا كان هناك شيء ما في الكود الخاص بك فإن الكمبيوتر يُجبَر على محاولة تخصيص موارد أكثر مما لديه، فقد يؤدي ذلك إلى حدوث خطأ في الموارد.
إذا كتبت بطريق الخطأ لوب لا يمكن لكودك الخروج منها مطلقًا، فستنفد الموارد في النهاية، في هذا المثال، ستستمر حلقة (while) في إضافة عناصر جديدة إلى المصفوفة، في النهاية، سوف تنفد الذاكرة لديك:
while(true) my_array << 'new array element' end
قد يكون من الصعب ملاحقة أخطاء الموارد؛ لأن الجهاز الذي تعمل على تطويره يمكن أن يكون غالبًا أعلى جودة من الخوادم التي تشغل كودك، ومن الصعب أيضًا محاكاة استخدام العالم الحقيقي من جهاز الكمبيوتر المحلي الخاص بك، سيؤدي وجود تقارير جيدة عن استخدام الموارد على خوادم الويب الخاصة بك إلى وضع علامة على الكود الذي يستهلك الكثير من أي نوع من الموارد بمرور الوقت.
أخطاء الموارد هي مثال على نوع من الخطأ في البرمجة قد يكون من الأمور التي يجب على فريق العمليات إصلاحها بدلاً من المطورين، هناك الكثير من تطبيقات وخدمات اختبار الحِمل التي يمكنك استخدامها لاختبار ما يحدث عندما يحاول العديد من الأشخاص تشغيل الكود الخاص بك في وقت واحد، بعد ذلك، يمكنك ضبط الاختبار ليناسب مع ما هو واقعي لتطبيقك.
7. أخطاء الواجهة Interface Errors:
تحدث أخطاء الواجهة عندما يكون هناك انفصال بين الطريقة التي قَصدت بها استخدام البرنامج وكيف يتم استخدامه بالفعل، معظم الأشياء في البرامج تتبع المعايير، إذا كانت المدخلات التي يتلقاها برنامجك لا تتوافق مع المعايير، فقد يحدث الخطأ في الواجهة، على سبيل المثال، قد يحدث خطأ في الواجهة إذا كان لديك واجهة برمجة تطبيقات تتطلب تعيين مُعاملات محددة ولم يتم تعيين هذه المُعاملات، ما لم يتم التعامل معها بشكل صحيح، ستبدو أخطاء الواجهة كخطأ من جانبك بينما الخطأ من جانب المستخدم، هذا يمكن أن يؤدي إلى الإحباط من كلا الجانبين.
إن الحصول على وثائق واضحة وجمع هذه الأخطاء وإرسالها إلى المستخدم بطريقة مفيدة، سيساعد هذا في الحفاظ على انخفاض تكاليف الدعم وإبقاء عملائك سعداء؛ لأنهم يعرفون ما يحتاجون إلى إصلاحه، إذا لم تكتشف هذه الأخطاء وترسلها إلى المستخدم، فسينتهي بك الأمر إلى ظهورها وكأنها أخطاء وقت التشغيل.