ما هو التنقيح؟
البرمجة هي عملية معقدة، ولأنها تتم بوساطة البشر، فهي غالباً ما تؤدي إلى أخطاء. لأسباب غريبة، تدعى الأخطاء البرمجية bugs (حشرات) وعملية ملاحقتها وتصحيحها تدعى debugging.
هناك عدة أنواع مختلفة من الأخطاء التي يمكن أن تحدث في برنامج، ومن المفيد أن نميز بينها في سبيل القبض عليها أسرع.
1.3.1 الأخطاء النحوية
لا يمكن للمجمع أن يترجم البرنامج إلا إذا كان صحيحاً نحوياً؛ وبخلاف ذلك، تفشل عملية الترجمة ولن تكون قادراً على تشغيل برنامجك. النحو (Syntax) يشير إلى بنية البرامج و قواعد كتابة تلك البنية.
مثلاً، في اللغة الإنكليزية، يجب أن تبدأ الجملة بحرف كبير وأن تنتهي بنقطة. بالنسبة لمعظم القراء، بعض الأخطاء النحوية ليست بمشكلة ذات اعتبار، لهذا السبب تجدنا نقرأ شعر e e cummings بدون أن نطلق رسائل أخطاء.
المترجمات ليست بذات القدر من التسامح. إذا وجد خطأ نحوي واحد في أي مكان من برنامجك، سيطبع المترجم رسالة خطأ ويتوقف، ولن تتمكن من تشغيل برنامجك.
ولنعقد الموضوع أكثر، فإن القواعد النحوية في Java أكثر منها في اللغة الإنكليزية، ورسائل الخطأ التي تتلقاها من المترجم ليست مفيدة على الأغلب. خلال الأسابيع الأولى من عملك في البرمجة، غالباً ما ستقضي الكثير من الوقت تبحث عن الأخطاء النحوية. على الرغم من ذلك، فإنك سترتكب أخطاءً أقل وستجدها أسرع عندما تكتسب المزيد من الخبرة.
1.3.2 أخطاء وقت التشغيل
النوع الثاني من الأخطاء هي الأخطاء عند التشغيل، وقد تمت تسميتها كذلك لأنها لا تظهر قبل تشغيل البرنامج. في Java، تظهر أخطاء وقت التشغيل عندما يشغل المفسر شفرة byte ويحدث خطأ ما.
الخبر الجيد الآن هو أن Java لغة آمنة نوعاً ما، ما يعني أن المجمع يقبض على العديد من الأخطاء. لذلك فإن أخطاء وقت التشغيل نادرة، وخاصة بالنسبة للبرامج البسيطة.
في Java، تدعى أخطاء وقت التشغيل بالاستثناءات (exceptions)، وفي معظم بيئات البرمجة تظهر بشكل نوافذ أو مربعات حوار تحتوي على معلومات عما حدث وما الذي كان البرنامج يفعله عند حدوث الخطأ. هذه المعلومات مفيدة عند تنقيح البرنامج من الأخطاء.
1.3.3 الأخطاء المنطقية
النوع الثالث من الأخطاء هو الخطأ المنطقي (logic error) أو الدلالة الخاطئة (wrong semantic). إذا وجد خطأ منطقي في برنامجك، فستتم ترجمته وتشغيله بنجاح، بمعنى أن الكمبيوتر لن يعطي أي رسائل خطأ، لكنه لن ينفذ المطلوب كما يجب. بل سينفذ شيئاً آخر. سينفذ البرنامج ما طلبته منه حرفياً.
البرنامج الذي كتبته لم يكن البرنامج الذي ترغب فيه. معنى البرنامج (أو ما يدل عليه) خاطئ. معرفة مكان وقوع الخطأ المنطقي قد يتطلب براعة، ذلك لأنها تتطلب منك العمل بالمقلوب تنظر إلى مخرجات البرنامج وتحاول استنتاج ما يفعله.
1.3.4 تصحيح الأخطاء بالتجريب
أحد أهم المهارات التي يجب عليك اكتسابها أثناء العمل مع هذا الكتاب هو تصحيح الأخطاء (debugging). وبالرغم من أنه محبط، فهو من أكثر أجزاء البرمجة تحدياً، ويتطلب ذكاء ومهارة.
أحياناً يكون اكتشاف الأخطاء مثل عمل التحري. تجد الأدلة ويجب عليك أن تحزر العمليات والأحداث التي أدت إلى النتائج التي تراها.
تصحيح الأخطاء أيضاً يشبه العلوم التجريبية. بمجرد أن تظن أنك عرفت ما هو الخطأ تعدل برنامجك وتجرب ثانية. إذا كان حدسك صحيحاً، عندئذ ستتمكن من التنبؤ بنتيجة التعديل، وتقترب خطوة من البرنامج الصحيح المطلوب. إذا كان حدسك خاطئاً، عليك أن تجد حلاً آخر. وكما يقول (شرلوك هولمز)، "بمجرد أن تستبعد المستحيل، فإن ما يبقى، مهما كان بعيد الاحتمال، لا بد أن يكون الحقيقة". (من The Sign of Four للكاتب A. Conan Doyle)
بالنسبة لبعض الناس، البرمجة وتصحيح الأخطاء هما نفس الشيء. وذلك لأن البرمجة هي عملية تصحيح أو تعديل متدرج للبرنامج حتى يفعل المطلوب منه. الفكرة هي أن تبدأ مع برنامج يعمل قادر على تنفيذ شيء ما، ثم عمل تعديلات صغيرة، وتصحيحها أولاً بأول، حتى يبقى برنامجك عاملاً طوال الوقت.
مثلاً، نظام التشغيل لينوكس الذي يحتوي على آلاف الأسطر البرمجية، بدأ كبرنامج بسيط استعمله (لينوس تورفالدز) ليستكشف رقاقة إنتل 80386. وعلى حد قول (لاري غرينفيلد)، "أحد أولى مشاريع لينوس كان برنامجاً يبدل بين طباعة AAAA و BBBB. ثم تطور هذا إلى لينوكس" (من The Linux Users' Guide Beta Version 1).
في الفصول اللاحقة سأبدي المزيد من الاقتراحات عن تصحيح الأخطاء وغيرها من الخبرات البرمجية.