لتحصل على شرح مفيد للكود من الذكاء الاصطناعي، قل كم تعرف مسبقًا، واطلب الشرح سطرًا سطرًا، واطلب تتبّعًا: جدولًا بالقيم التي يحملها كل متغير أثناء تشغيل الكود. عبارة "اشرح هذا الكود" وحدها تعطيك ملخّصًا مكتوبًا لقارئ متوسط متخيَّل، وهو عادةً إما بسيط جدًا أو سريع جدًا بالنسبة إليك.
سطرًا سطرًا، مع تتبّع للقيم
يسأل التبويبان عن الدالة القصيرة نفسها. قارن ما يتيح لك كل رد التحقق منه.
def running_max(nums):
result = []
best = None
for n in nums:
if best is None or n > best:
best = n
result.append(best)
return result
print(running_max([3, 1, 4, 1, 5]))تحسب هذه الدالة القيمة العظمى المتراكمة لقائمة. تمر على الأرقام، وتتتبّع أكبر قيمة رأتها حتى الآن في best، وتضيف تلك القيمة إلى result في كل خطوة. الشرط best is None يتعامل مع العنصر الأول. والاستدعاء يطبع [3, 3, 4, 4, 5].
تعمل الدالة في زمن O(n)، لأنها تزور كل عنصر مرة واحدة.
الرد الأول دقيق، لكنه لا يفيد إلا إذا كنت تعرف مسبقًا ما القيمة العظمى المتراكمة. ويضيف أيضًا ملاحظة عن التعقيد الزمني لم يطلبها أحد، وهذا نوع الإضافات التي تحصل عليها حين لا يعرف النموذج من يقرأ. أما الرد الثاني فيربط كل جملة بسطر تستطيع الإشارة إليه، ويجعل الجدول ملموسًا ما يذكره الملخّص عابرًا فقط: result.append(best) تعمل في كل دورة، ومنها الدورات التي لا تتغير فيها best. لهذا يظهر 3 مرتين، وتراه في الصف 2 بدلًا من استنتاجه من عبارة "في كل خطوة".
جدول التتبّع فحص للشرح نفسه أيضًا. تستطيع التحقق من كل صف بتشغيل الكود مع print(n, best, result) داخل الحلقة. وإذا اختلف صف مع المخرجات الحقيقية، فالشرح خاطئ في مكان ما، والآن تعرف أين.
اشرحه بمستواي
أنفع سطر منفرد في موجّه الشرح هو ما تعرفه مسبقًا. يخبر النموذج بالأسطر التي يتجاوزها والتي يتمهّل عندها. وقد تساعد جملة الدور أيضًا ("أنت مدرّس لأشخاص في شهرهم الأول من تعلّم البرمجة")، لكنها تعمل بالآلية نفسها: تخبر النموذج من هو القارئ. تشرح صفحة موجّه الدور ما يغيّره الدور وما لا يغيّره.
هذا المثال نسخة قابلة لإعادة الاستخدام. غيّر المستوى أو الجزء المربك أو الكود، فيتغير الشرح معه.
text = "the cat and the hat"
counts = {}
for word in text.split():
counts[word] = counts.get(word, 0) + 1
top = sorted(counts.items(), key=lambda kv: kv[1], reverse=True)[:2]
print(top)الحلقة تعدّ كل كلمة: تنتهي counts بالقيمة {'the': 2, 'cat': 1, 'and': 1, 'hat': 1}.
والآن السطران الأخيران، من الداخل إلى الخارج:
counts.items()تعطي الأزواج('the', 2)و('cat', 1)و('and', 1)و('hat', 1).lambda kv: kv[1]دالة صغيرة بلا اسم. تأخذ زوجًا واحدًا وتُرجع عنصره الثاني، أي العدد. مع('the', 2)تُرجع2.sorted(..., key=...)ترتّب الأزواج حسب ما تُرجعه تلك الدالة، أي حسب العدد. وreverse=Trueتضع الأكبر أولًا. الكلمات ذات الأعداد المتساوية تحتفظ بترتيبها الأصلي.[:2]تُبقي أول زوجين.
إذن top هي [('the', 2), ('cat', 1)]، وهذا ما يُطبع.
عبارة "الأعداد المتساوية تحتفظ بترتيبها الأصلي" هي التفصيل الذي يغفله الشرح السريع، وهي سبب فوز cat بالمركز الثاني لا and أو hat. الدالة sorted في Python مستقرة، وreverse=True تحافظ على هذا الاستقرار. ما كنت لتفكر في السؤال عن ذلك، وطلب "القيمة التي تنتجها كل قطعة لهذا المُدخل" هو ما أظهره.
اسأل عن جزء واحد، لا الملف كله
لصق ملف من 500 سطر وسؤال "ماذا يفعل هذا" يعطيك جولة في بنية الملف. عندما تتعثر في دالة واحدة، الصق تلك الدالة والأسطر التي تستدعيها، واسأل عنها مباشرة: "لماذا تعود هذه الدالة مبكرًا حين تكون القائمة فارغة؟" أو "ماذا تفعل yield في السطر 12، وما الذي سيتغير لو كانت return؟" السؤال الضيق يعطيك إجابة عن كودك، والسؤال الواسع يعطيك إجابة عن كود يشبه كودك.
وفي قاعدة كود كبيرة غير مألوفة، اعكس الترتيب: اطلب خريطة أولًا ("اذكر الوحدات الرئيسية ومسؤولية كل منها، في سطر واحد لكل وحدة")، ثم اسأل عن الوحدة التي تحتاجها. هذه سلسلة موجّهات صغيرة، وكل خطوة تُبقي إجابة النموذج قصيرة بما يكفي لفحصها.
اشرحه عبر لغة تعرفها
الكود بلغة غير مألوفة أسهل قراءة حين يرتكز الشرح على لغة تعرفها. قل ذلك في الموجّه: "أعرف Python. اشرح دالة Go هذه ونبّهني إلى كل موضع تتصرف فيه بشكل مختلف عما يتوقعه مبرمج Python." الفروق هي حيث يسكن سوء الفهم: قسمة الأعداد الصحيحة، والقيم الصفرية بدلًا من None، والشريحة (slice) التي تتشارك الذاكرة مع المصفوفة التي جاءت منها. الشرح العادي لكود Go سيصف تلك الأسطر بشكل صحيح ولن يخبرك أبدًا أن حدسك عنها خاطئ.
تحقق من أنك فهمت
الشرح الذي تقرؤه وتوافق عليه قد يتركك عاجزًا عن كتابة الكود بنفسك. موجّهان يسدّان هذه الفجوة:
- توقّع أولًا. قبل أن تشغّل الكود أو تطلب شرحًا، اكتب ما تظن أنه سيطبعه. ثم اطلب من النموذج شرح الأسطر التي أخطأ فيها توقّعك فقط.
- اشرحه بنفسك. اكتب شرحك الخاص واطلب من النموذج أن يشير إلى أي خطأ أو نقص فيه، دون أن يعيد كتابته.
def running_max(nums):
result = []
best = None
for n in nums:
if best is None or n > best:
best = n
result.append(best)
return result
اطرح عليّ 3 أسئلة تتحقق من أنني أفهمه فعلًا، سؤالًا في كل مرة. ضمّنها سؤالًا واحدًا عليّ فيه توقّع المخرجات لمُدخل جديد. انتظر إجابتي قبل أن تطرح السؤال التالي، وأخبرني هل إجابتي صحيحة ولماذا.السؤال 1 من 3: ماذا تُرجع running_max([2, 7, 5, 9])؟ احسبها قبل أن تشغّلها.
الطريقة نفسها تعمل حين يتصرف البرنامج بشكل خاطئ، لكنك عندها تريد السبب لا درسًا: راجع موجّهات لتصحيح الأخطاء. وعندما يكون الكود أمامك من كتابة الذكاء الاصطناعي، فالشرح سطرًا سطرًا طريقة سريعة لمراجعته قبل أن تحتفظ به، وتذكر صفحة موجّهات لكتابة الكود الفحوص الأخرى التي تجريها.
الأسئلة الشائعة
كيف أطلب من ChatGPT أو Claude شرح الكود؟
الصق الكود وقل ثلاثة أشياء: ما تعرفه مسبقًا، وأي جزء يربكك، وبأي شكل تريد الشرح. عبارة "اشرح كل سطر في جملة واحدة، ثم اعرض جدولًا بقيم المتغيرات بعد كل دورة من الحلقة" تعطي إجابة أنفع بكثير من "اشرح هذا الكود".
ما هو جدول التتبّع؟
جدول التتبّع (trace table) يتابع البرنامج أثناء تشغيله: صف لكل خطوة (غالبًا دورة واحدة من الحلقة)، وعمود لكل متغير، وقيمة كل متغير عند تلك النقطة. طلبه يحوّل الوصف المجرد إلى قيم ملموسة تستطيع مقارنتها بالكود. إنه سجل مكتوب لما يُظهره لك مصحّح الأخطاء (debugger) وأنت تتنقل خطوة خطوة في البرنامج.
هل يستطيع الذكاء الاصطناعي شرح كود بلغة لا أعرفها؟
نعم، وهذا من أنفع ما يمكن طلبه. سمِّ لغة تعرفها واطلب من النموذج المقارنة: "أعرف Python، اشرح كود Rust هذا ونبّهني إلى المواضع التي يتصرف فيها بشكل مختلف عن Python." تحقق من الادعاءات عن سلوك اللغة بتشغيل أمثلة صغيرة، فقد تكون الشروح خاطئة بثقة في التفاصيل.
هل استخدام الذكاء الاصطناعي لشرح الكود يضر بالتعلّم؟
يعتمد ذلك على ما تفعله بعده. قراءة الشرح والمضي قدمًا تعلّمك القليل. أما توقّع المخرجات قبل تشغيل الكود، أو طلب أن يختبرك النموذج، أو شرح الكود بنفسك وسؤاله عما أخطأت فيه، فكلها تجعلك أنت من يفكر، وهناك يحدث التعلّم.