البرمجة

تعلم تصحيح الأخطاء

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

  • الدرس 12 من 14
  • مبتدئ
  • مجاني، دون تسجيل

من «لا يعمل» إلى سطر واحد

  1. 1

    لا يعمل

    أيا كان ما رآه المستخدم. لا يزال بلاغا، لا مسألة.

  2. 2

    بأي فعل يتكرر؟

    أقصر مسار، والبيانات ذاتها، وحالة بدء محددة. وبدون هذا الشريط لا معنى لبقية الأشرطة.

  3. 3

    أي طبقة؟

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

  4. 4

    أي دالة؟

    هنا موضع التنصيف. وعشر عمليات تنصيف تُنزل ألف سطر إلى واحد.

  5. 5

    أي سطر؟

    السطر الذي يفترق عنده اعتقادك عن سلوك البرنامج. وهو عادة ليس السطر المطبوع عليه الخطأ.

الآن يستغرق الإصلاح ثوان

لا يُغلق أي شريط إلا حين يكون لديك دليل، لا حين يكون لديك حدس. والقفز من الشريط الأول إلى الأخير هو بعينه ما يكلف ساعات.

آخر مراجعة: تُراجع الحقائق وأسماء الأدوات في هذا الدرس مقابل مصادرها في هذا التاريخ.

ما تصحيح الأخطاء، ولماذا يذهب أكثر وقتك إلى البحث لا إلى الإصلاح؟

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

وثمة تعريف أدق يجعل كل شيء أبسط: العلة موضع يختلف فيه اعتقادك عن البرنامج عما يفعله البرنامج فعلا. البرنامج لا يتصرف «بغرابة» أبدا وليست له أمزجة؛ إنه يفعل بالضبط ما كتبته. فالتصحيح إذن هو العثور على النقطة التي افترق فيها تصورك عن الواقع.

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

وأمر لا يقوله أحد للمبتدئين: سرعتك في التصحيح تعتمد على انضباط منهجك أكثر بكثير مما تعتمد على معرفتك باللغة. فالمبرمج المتمرس يمر بالمراحل الخمس نفسها، لكنه يستبعد التخمينات غير ذات الصلة أسرع.

لماذا يبدأ كل شيء بجعل العطل قابلا للتكرار؟

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

للتكرار الجيد ثلاثة أركان: أقصر مسار يبلغ العطل، والبيانات ذاتها التي يقع العطل معها، وحالة بدء محددة. فقول «أحيانا يعطي خطأ عند تسجيل الطلب» ليس تكرارا. أما «مع مستخدم أُنشئ للتو، وسلة فارغة، ورمز خصم منتهٍ، يعيد زر الإرسال خطأ ٥٠٠» فهو تكرار، وهذه الجملة وحدها أنجزت نصف العمل.

وإليك فخا كلّفنا وقتا على هذا الموقع نفسه، وهو مدوّن في ملفنا الفني: قد لا يختبر تكرارك ما تظن أنه يختبره. فنحن حين نحذف ملف ذاكرة صفحة، يظل خادم الويب يقدّم الملف المحذوف نفسه إلى دقيقة كاملة، لأنه يحتفظ بنتيجة البحث عن الملف ٦٠ ثانية. فإن فتحت الصفحة فور المسح رأيت الصفحة القديمة واستنتجت أن المسح لم ينجح. لقد نجح؛ لكنك نظرت باكرا.

وهذه حالة خاصة من خطأ عام: بين ما فعلته وما تراه طبقة لا تعلم بها. ذاكرة المتصفح، وذاكرة الشبكة، وذاكرة الشفرة، ونسخة قديمة من الملف على خادم آخر. فالسؤال الأول ليس «لماذا لا يعمل»، بل «هل أنا أصلا أشغّل ما غيّرته؟» وفي شفرة PHP أبسط طريقة لإثبات ذلك أن تضع سطر طباعة خاطئا عمدا وترى هل يظهر أصلا.

كيف تقرأ رسالة الخطأ فعلا؟

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

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

لا تقرأ الأثر من أسفل إلى أعلى. فالسطر الأقرب إلى الخطأ في أعلى القائمة، إذ ترتّب أكثر اللغات الأحدث أولا. لكن ما تبحث عنه حقا ليس أقرب سطر؛ بل أقرب سطر كتبته أنت. فإن كانت الأسطر الخمسة الأولى تعود إلى مكتبة لم تكتبها، فالمشكلة ليست هناك غالبا؛ بل في أول سطر من شفرتك استدعى تلك المكتبة وسلّمها شيئا خاطئا.

وأهم نقطة في هذا القسم: رقم السطر في الخطأ هو موضع اكتشاف المشكلة، لا بالضرورة موضع نشوئها. فإن قال السطر ٤٢ إن متغيرا فارغ، فالسطر ٤٢ سليم؛ والموضع الذي كان ينبغي أن يملأه ولم يفعل أعلى منه. مثال يومي: رسالة «استدعاء دالة على قيمة null» لا تتعلق تقريبا أبدا بالسطر المطبوعة عليه. إنها تتعلق بالسطر الذي توقعت أن يبني تلك القيمة فأعاد لا شيء، وقد يفصل بين السطرين عشر دوال.

ماذا تفعل حين لا يظهر أي خطأ؟

أصعب العلل تلك التي لا تعطي خطأ. يعمل البرنامج، وينتهي، وتكون النتيجة خاطئة أو لا نتيجة أصلا. وأول ما ينبغي تحديده هنا هو: هل لا يوجد خطأ حقا، أم أنه موجود ولا تراه؟ والفرق بينهما كبير، والجواب في أكثر الحالات هو الثاني.

ثلاثة مواضع يضيع فيها الخطأ عادة: إعداد في اللغة يطفئ عرض الأخطاء على الخادم، وكتلة التقاط تبتلع الخطأ ولا تفعل به شيئا، وقناة إخراج خاطئة. والثالث أقلها شهرة وأكثرها التهاما للوقت.

لبرنامج سطر الأوامر قناتا إخراج منفصلتان ورمز خروج. فإن قرأت الأولى وحدها بدت لك الأداة المعطوبة والنتيجة الفارغة شيئا واحدا. مثال حقيقي من هذا الخادم، في اليوم الذي كُتب فيه هذا الدرس: شغّلنا أمر استعلام قاعدة بيانات ووردبريس فأخرج صفر بايت على الإخراج القياسي. ولو استنتجنا هناك «لا صفوف» لكان استنتاجا خاطئا. فقد كان رمز الخروج ١، وكتب على قناة الخطأ أنه لم يستطع الاتصال بقاعدة البيانات أصلا.

فقاعدة هذا القسم: النتيجة الفارغة ليست دليل غياب. قبل أن تثق بمخرج فارغ، انظر إلى رمز الخروج واقرأ قناة الخطأ على حدة.

ولهذا الخطأ صورة أبسط تقع للجميع: أداة البحث لا تجد شيئا فتستنتج أن الشيء غير موجود. على هذا الموقع نفسه، تُطبع وسمة robots في الصفحة الرئيسة بعلامة اقتباس مفردة. فإن بحثت عنها بعلامة مزدوجة حصلت على صفر نتائج وأعلنت أن الوسمة مفقودة. الوسمة موجودة. نمط بحثك كان خاطئا، والأداة قالت ذلك بالضبط: «ما طلبته لم يوجد». وأما البقية فأنت من أضافها.

هل يعطي البرنامج خطأ، أم يفعل الخطأ بصمت؟

يعطي خطأ

اقرأ الرسالة كاملة

  • النوع والنص والملف ورقم السطر
  • في أثر الاستدعاء، أول سطر كتبته أنت
  • سطر الخطأ موضع الاكتشاف لا النشوء
بصمت

أثبت أولا أنه لا خطأ حقا

  • هل عرض الأخطاء مطفأ على الخادم؟
  • هل تبتلعه كتلة التقاط؟
  • هل فحصت رمز الخروج وقناة الخطأ على حدة؟

يحتاج الفرعان منهجين مختلفين تماما. وأكثر الوقت الضائع يخص من يقف في الفرع الصامت باحثا عن رسالة خطأ.

التنصيف: أقصر طريق إلى ذلك السطر الواحد

حين يكون لديك تكرار، وقد قرأت الخطأ، ولا تزال تجهل موضعه، فثمة منهج ينجح دائما تقريبا ولا يعتمد على ذكائك: نصّف.

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

وستلقى ثلاث صور عملية لهذا في يومك. على الشفرة: علّق نصف الدوال أو ضع return مبكرا. على البيانات: اقطع ملف الإدخال ذا الألف صف إلى خمسمئة وانظر هل يبقى العطل، حتى تبلغ أصغر إدخال لا يزال يفشل؛ فذلك الإدخال وحده نصف الجواب. على الزمن: إن كان يعمل أمس ولا يعمل اليوم، فابحث بين نسختين لا بين ألف سطر. ولدى جيت أمر لهذا بعينه اسمه git bisect يتولى التنصيف عنك ولا يطلب منك إلا أن تقول بعد كل خطوة: أكانت هذه النسخة سليمة أم معطوبة.

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

جولة تنصيف واحدة

  1. أطفئ النصف

    نصف الدوال، أو نصف صفوف الإدخال، أو مدى من النسخ. لا يهم أيها، بل يهم أن يكون نصفا.

    1
  2. شغّل التكرار نفسه ثانية

    المسار نفسه والبيانات نفسها بالضبط. فإن تغير التكرار لم تُفد نتيجة هذه الجولة شيئا.

    2
  3. ما زال معطوبا؟ اطرح النصف السليم

    إن بقي العطل فالمشكلة في النصف المُشغَّل، وإن زال ففي النصف المُطفأ. وفي الحالتين يسقط نصف الفضاء.

    3
  4. احتفظ بأصغر مثال معطوب

    عشرة أسطر تُعيد إنتاج الخطأ نفسه توصلك، وهي أيضا ما تسلّمه لمن يساعدك.

    4

لا تعمل هذه الحلقة إلا ما دام يتغير شيء واحد بالضبط في كل جولة. وتغييران معا يعيدانها إلى التخمين.

غيّر شيئا واحدا في كل مرة، ودوّن ما جربته

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

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

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

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

الطباعة أم المصحّح؟ وماذا عن خادم حي؟

لديك أداتان رئيستان، والجدال في أيهما أفضل بلا معنى، لأنهما تؤديان عملين مختلفين.

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

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

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

وثلاثة أشياء لا يجوز أن تدخل السجل أبدا، ما دمنا هنا: كلمات المرور، والرموز، وبيانات المستخدمين الشخصية. فالسجل ملف يقرؤه عدة أشخاص ويبقى مدة طويلة.

المسار السريع مع الذكاء الاصطناعي

المسار السريع ليس «انسخ الخطأ واسأل عن السبب». فذلك يأتي بإجابات تبدو صحيحة ولا صلة لها ببرنامجك، لأن النموذج لا يملك الأشياء الثلاثة التي لا يستطيع تخمينها. والسريع فعلا هو هذا: اجمع ثلاثة أدلة، واطلب من النموذج لا إصلاحا بل <strong>قائمة فرضيات مرتبة بالاحتمال، مع أرخص اختبار يُسقط كلا منها</strong>. ثم تُجري أنت أحد الاختبارات، فيسقط نصف القائمة في جولة واحدة. وهذا عمل حكم، فيريد نموذجا من الطبقة المتقدمة لا نموذجا سريعا؛ واختيارنا الحالي بين نماذج البرمجة في <a class="text-link" href="/ai/code/">أفضل ذكاء اصطناعي للبرمجة</a> ويُحدَّث هناك.

  1. اجمع الأدلة الثلاثة: التكرار الدقيق، ونص الخطأ كاملا مع أثر الاستدعاء، وقائمة بما تغير منذ آخر مرة عمل فيها.
  2. قل صراحة إنك لا تريد شفرة. في هذه المرحلة تريد فرضيات فقط، وإلا كتب النموذج رقعة بدل أن يفكر.
  3. أجرِ أرخص اختبار في القائمة بنفسك وأعد النتيجة الخام بلا تفسير. فتفسيرك هو بعينه ما يجعل النموذج يوافقك.
  4. حين تصمد فرضية واحدة، عندها فقط اطلب الإصلاح، واطلب أصغر تغيير ممكن. ثم شغّل أنت التكرار الأصلي من جديد.

وصفة جاهزة للنسخ

عندي علة ولا أريد شفرة. أريد فرضيات فقط.

الدليل ١ - التكرار الدقيق:
{أفعل هذا: ...} {فيحدث هذا: ...} {في كل مرة / أحيانا}

الدليل ٢ - نص الخطأ كاملا (إن وُجد):
{الصق هنا مع أثر الاستدعاء، بلا تلخيص}
{إن لم يكن هناك خطأ فاكتب: لا خطأ. المخرج المشاهَد: ... المخرج المتوقع: ...}

الدليل ٣ - ما تغير منذ آخر مرة عمل فيها:
{الشفرة / إصدار المكتبة / إعدادات الخادم / البيانات / لا شيء فيما أعلم}

البيئة: {اللغة وإصدارها} على {نظام التشغيل أو الخادم}

ما أريده:
١. خمس فرضيات على الأكثر للسبب، مرتبة من الأرجح إلى الأقل.
٢. لكل فرضية أرخص اختبار يؤكدها أو يُسقطها، في صورة أمر واحد أو فحص محدد.
٣. لكل فرضية، ما الذي ينبغي أن أراه أيضا لو كانت صحيحة. فإن لم أرَه سقطت الفرضية.
٤. واكتب على حدة ما تجهله مما لو عرفته لتغير ترتيب القائمة.

لا تكتب أي شفرة. سأطلب الإصلاح في الرسالة التالية.

قبل أن تثق بالناتج: قائمة الفرضيات تخمينات مرتبة بحسب شبهها بما رآه النموذج، لا بحسب برنامجك. أجرِ الاختبارات بنفسك ولا تُجرِ أكثر من تغيير واحد في الجولة. وثلاثة أشياء لا مكان لها في الرسالة: كلمات المرور والرموز، والسجلات التي فيها بيانات شخصية للمستخدمين، وشفرة عميل بلا إذنه.

الذكاء الاصطناعي في هذا العمل

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

أدوات تساعد فعلا

  • Claude Code ميزتها الأساسية في التصحيح أنها ترى المستودع، فبدل أن تسألك أين استُدعيت تلك الدالة تذهب وتجد بنفسها. تُثبَّت مجانا لكنها لا تعمل بلا اشتراك كلود أو حساب في كونسول أنثروبيك، وإيران ليست في قائمة الدول المدعومة لدى أنثروبيك.
  • GitHub Copilot له في هذا الموضوع ميزة حقيقية: يسكن المحرر نفسه، فحين يكون سطر العطل مفتوحا أمامك لا تحتاج إلى لصق شيء في مكان آخر. وقصة الوصول إليه غير معتادة وتستحق المعرفة؛ إذ تقول صفحة ضوابط التجارة في جيتهاب نفسها إنها تحمل ترخيصا من الخزانة الأمريكية يغطي خدماتها السحابية للمطورين المقيمين في إيران، المجانية والمدفوعة. نحن ننقل تلك الجملة ولا ندّعي أبعد منها: والدفع من إيران مسألة منفصلة لم نختبرها. وخطته المجانية تصل إلى ألفَي إكمال شهريا.
  • Claude يناسب بالضبط ما يوصي به هذا القسم: أعطه نص الخطأ كاملا واطلب قائمة فرضيات بلا شفرة. وإيران ليست في أي من قائمتَي الدول المدعومة لدى أنثروبيك؛ قرأنا ذلك على صفحة أنثروبيك نفسها لا من قياس شبكي.
  • Gemini جيد حين يأتي الخطأ من مكتبة أو خدمة كبيرة وافرة التوثيق. وتقول صفحة جوجل نفسها إن تطبيق جيميناي على الوب يعمل في أكثر من مئتين وثلاثين دولة وإقليما، وإيران ليست في تلك القائمة.

اين ينقلب ضدك

الخطر الخاص بتصحيح الأخطاء هو أن النموذج يوافقك. اكتب «أظن أن المشكلة من الذاكرة» فيسوق لك أسبابا لكونها من الذاكرة، وستبدو تلك الأسباب معقولة. ذهبت تطلب رأيا محايدا فجئت بمكبر صوت. ولهذا بالضبط تقول الوصفة أعلاه ألا تكتب تفسيرك وأن تعيد نتيجة الاختبار الخام فقط.
والخطر الثاني له رقم ومصدر. ففي استطلاع ستاك أوفرفلو للمطورين لعام ٢٠٢٥، كانت أكبر شكوى من أدوات الذكاء الاصطناعي «حلول تكاد تكون صحيحة لكن ليس تماما» بنسبة ٦٦ بالمئة، والشكوى الثانية «تصحيح الشفرة المولَّدة بالذكاء الاصطناعي يستغرق وقتا أطول» بنسبة ٤٥٫٢ بالمئة. أي أن الأداة نفسها التي تلجأ إليها لإصلاح العلل أسرع قد تضيف، إن تركتها تكتب الشفرة، نصيبا جديدا إلى عملك في التصحيح. وتسمي أنثروبيك في وثائقها هذا الصنف من الثقة بلا سند هلوسة وتشرح سبل تقليله. ولمعرفة كيف يمكن الدفع لكل من هذه الأدوات من إيران، انظر دليل الشراء.

المصادر: Stack Overflow 2025 Developer Survey: AI Anthropic: reduce hallucinations Anthropic: supported countries GitHub and Trade Controls GitHub Copilot plans Google: where the Gemini web app is available

حدود هذه النصيحة

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

من عملنا نحن

مثال «النتيجة الفارغة ليست دليل غياب» ليس منقولا من الذاكرة؛ فقد نُفِّذ على هذا الخادم في اليوم الذي كُتب فيه هذا الدرس. شغّلنا أمر ووردبريس wp db query بعدّ بسيط على جدول المقالات: فأخرج الإخراج القياسي صفر بايت، وكان رمز الخروج ١، والشيء الوحيد الذي وقع فعلا كان مكتوبا على قناة الخطأ: ERROR 2002 (HY000): Can't connect to local server through socket '/run/mysqld/mysqld.sock'. أي أن الأداة لم تبلغ قاعدة البيانات أصلا. والنص البرمجي الذي يقرأ الإخراج القياسي وحده يرى بالضبط ما ينتجه بحث بلا نتائج، ولا سبيل لديه للتمييز بينهما. وفي اليوم نفسه أخذنا المثال الثاني من الصفحة الرئيسة لهذا الموقع: تُطبع وسمة robots بعلامة اقتباس مفردة، فالبحث عن name="robots" يعطي صفر نتائج والوسمة في موضعها.

اسئلة متابعة حقيقية

كيف أعرف إن كانت المشكلة من شفرتي أم من الخادم؟

شغّل أصغر برنامج ممكن في الموضع نفسه: ملف يطبع جملة واحدة فقط. فإن فشل هو أيضا فالمشكلة ليست من شفرتك. وإن نجح فالخادم سليم، وعليك أن تكبّر ذلك المثال الأصغر خطوة خطوة حتى ينكسر؛ وتلك الخطوة هي الجواب.

أأتعلم المصحّح أم تكفي الطباعة؟

في الأشهر الأولى تكفي الطباعة ولن يحاكمك أحد عليها. وعلامة أن الوقت قد حان أن تجد نفسك تضيف طباعة إثر طباعة وتعيد التشغيل في كل مرة؛ فذلك النمط يعني أنك لا تحتاج لقطات منفصلة بل تحتاج أن ترى كل شيء معا. وتعلّمه نصف يوم.

شفرتي تعمل على جهازي ولا تعمل على الخادم. من أين أبدأ؟

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