أوامر تصحيح أخطاء تحدد الموقع فعلاً

Prompts تحديد مكان الـ Bug

4 دقيقة للقراءة

الطريقة الغلط في الـ debug مع LLM إنك تلصق الـ function المكسورة وتقول "ده غلط، صلّحه." الموديل بيعيد كتابة الحاجة كلها، بتخسر البنية اللي موجودة، وبتراجع implementation جديد بالكامل بدل fix سطر واحد.

النمط الصح هو اللي المهندسين الشغّالين بيعملوه فعلاً: حدّد المكان الأول، صلّح بعد كده. Prompt الـ localization بيطلب من الموديل يلاقي الـ bug — مش يعيد كتابة الـ function.

تدفق الـ module ده:

Module 2 — 4 prompts للـ debugging، بالترتيب اللي بتستخدمهم بيه

1. حدّد المكان

لاقي السطر. امنع إعادة الكتابة صراحةً

2. اشرح

الـ traceback ده معناه إيه بالنسبة للكود ده؟

3. متوقّع مقابل فعلي

للـ bugs اللي مفيش exception تلزقه

4. ثبّت الإصلاح

Regression test، شغّله أحمر قبل الأخضر

حلقة localize-then-fix الكاملة:

حلقة localize-then-fix

  1. 1أعد الإنتاج

    هات input فاشل محدد قبل ما تكتب prompt. من غير repro، مفيش حلقة

  2. 2حدّد المكان

    اطلب السطر و fix في سطر واحد. امنع إعادة الكتابة

  3. 3شغّل الـ test تاني

    على الـ fix المقترح. دي الخطوة اللي بتمسك إجابة واثقة وغلط

  4. 4ثبّته

    Regression test مسمّى على الخاصية، متأكد إنه أحمر الأول

ده prompt localization على second_largest مكسورة:

The following Python function is supposed to return the second-largest distinct number, but it sometimes returns the largest. Identify the bug, give the exact line, and the one-line fix. Do not rewrite the whole function.

def second_largest(nums):
    if len(nums) < 2:
        return None
    largest = float("-inf")
    second = float("-inf")
    for n in nums:
        if n > largest:
            second = largest
            largest = n
        elif n > second:
            second = n
    return second

Test that fails: second_largest([5, 5]) returns -inf, expected None.

Claude Sonnet 4.5 رجّع:

## Bug Identification

Line with bug: Line 10 (the `elif n > second:` condition)

Problem: When all numbers are the same (like `[5, 5]`), the function doesn't
check if `n` is distinct from `largest` before updating `second`. This allows
duplicate values to become the "second largest."

One-line fix:
        elif n > second and n != largest:

This ensures that `second` only gets updated if the number is both greater than
the current second AND different from the largest, guaranteeing we get the
second-largest distinct number.

Captured from Claude Sonnet 4.5 (claude-sonnet-4-5) on 2026-04-27. Re-runs may differ slightly. شوف ملاحظة دورة حياة الموديل في Module 1، الدرس الأول.

دلوقتي شغّله. طبّق الـ fix اللي في سطر واحد ونادي نفس الـ test اللي في الـ prompt:

>>> second_largest([5, 5])
-inf

ما اتغيّرش. الـ prompt دخّل test فاشل — second_largest([5, 5]) بترجّع -inf والمتوقّع None — والـ fix اللي الموديل اقترحه مش بيخلّي الـ test ده ينجح.

التشخيص مش بلا قيمة، وده اللي بيخلّيه يستاهل الدراسة. جرّب [5, 3, 5] وهتلاقي الـ fix بيكسب مكانه: من غير n != largest، الـ 5 الأخيرة كانت هتكتب فوق second بـ 5؛ معاها، second بتفضل 3 صح. الموديل لقى bug حقيقي في التعامل مع التكرار. هو بس ما لقاش الـ bug اللي الـ test الفاشل بيوصفه، وقدّم اللي لقاه كأنه هو هو.

الـ bug اللي الـ test بيشاور عليه فعلاً حاجة تانية: لما كل القيم متطابقة، second ما بتتسندش خالص، فالـ sentinel float("-inf") بيتسرّب كقيمة راجعة. مفيش شرط elif يقدر يصلّح ده، لأن الفرع نفسه ما بيشتغلش. الـ function محتاجة تبطّل ترجّع الـ sentinel بتاعها:

    return second if second != float("-inf") else None

الدرس اللي جوه الدرس. الـ localization prompt بيرجّع فرضية، متنسّقة بثقة النتيجة — عناوين، رقم سطر، fix، وفقرة بتشرح ليه بيشتغل. مفيش حاجة في التنسيق ده دليل. الـ test الفاشل اللي إنت لزقته في الـ prompt هو الحاجة الوحيدة في المحادثة اللي تقدر تحسم السؤال، وإعادة تشغيله بتاخد 4 ثواني.

فضيف خطوة للحلقة، بشكل دائم:

أعد تشغيل الـ test الفاشل على الـ fix المقترح قبل ما تقرا الشرح. لو الـ test لسه فاشل، يبقى الشرح بيوصف bug تاني.

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

3 حاجات بتخلي الـ prompt ده شغّال:

  1. السلوك المتوقع متقال في جملة — "supposed to return the second-largest distinct number." الموديل دلوقتي عارف يعني إيه صح.
  2. حالة test فاشلة متضمّنةsecond_largest([5, 5]) بترجع -inf، المتوقع None. ده بيربط الـ bug بـ input تقدر تعيده.
  3. شكل المخرج مقيّد — "exact line, one-line fix, do not rewrite." الموديل مش هيقدر يهرب لـ refactor.

تعليمة "do not rewrite" هي أهم كلمة في الـ prompt ده. من غيرها، الموديل بيرجع للسلوك المفيد إنه يرجع rewrite نظيف — اللي بيخلي الـ review أصعب، والـ PR الصغيرة أصعب، والتعلم منها أصعب.

لما مش هتقدر تضمّن failing test (الـ bug متقطّع، أو مش عندك repro)، اوصف الأعراض بدقة. "Returns 0 when input is empty" أحسن من "doesn't work for empty inputs." Inputs و outputs محددة بتدّي الموديل هدف. Prose غامض بيدّيه مساحة يخترع.

التالي: تخلّي الموديل يفسّر traceback حقيقي بلغة سهلة. :::

اختبار

الوحدة 2: Prompts الـ Debugging

خذ الاختبار
هل كان هذا الدرس مفيدًا؟

سجّل الدخول للتقييم