السؤال عن function بالاسم
كان الدرس 4.2 عن تحديد النطاق حسب الملف. هذا الدرس عن تحديد النطاق بدرجة أدقّ — حسب الشيء داخل الملف الذي يهمّك فعلًا.
إن كان لديك اسم، فلستَ بحاجة إلى موقع. الاسم هو السؤال.
معظم الفضول في الكود يحدث على مستوى function واحدة، أو component واحد، أو class واحدة — لا ملف واحد. زميل يقول «الـ bug في handleLogin». تصطدم بـ stack trace يشير إلى User.save. تقرأ ملف إعدادات فترى استدعاءً لـuseAuth لم تسمع به من قبل. لستَ بحاجة إلى العثور على الملف أولًا. كل ما عليك هو أن تسأل.
الخطوة
أين handleLogin وماذا تفعل؟
where is handleLogin and what does it do?
سيقوم Claude بما يلي:
- يبحث في المشروع عن
handleLogin. - يفتح الملف الذي تعيش فيه.
- يقرأ الـ function (وعادةً الأسطر المحيطة بها مباشرةً).
- يخبرك بما تفعله — بلغة عربية واضحة.
تتعلم أين هي وماذا تفعل في الإجابة نفسها. عصفوران بسؤال واحد.
لماذا هذا أكبر مما يبدو
قبل Claude، كان العثور على function بالاسم مهمةً صغيرة بحد ذاتها. كنتَ تفتح المشروع في محرّر، وتضغط «الانتقال إلى الرمز»، وتمرّر عبر النتائج، وتجرّب ملفين أو ثلاثة، حتى تجدها في النهاية. أو كنتَ تستخدم grep للبحث عن الاسم، فتحصل على جدارٍ من المطابقات، وتنتقي الصحيحة منها بعينك.
هذا ليس صعبًا. إنه مجرد احتكاك. والاحتكاك يقتل الفضول — يتوقف معظم الناس عن طرح السؤال لأن العثور على الإجابة يستغرق وقتًا طويلًا.
مع Claude، زال الاحتكاك. السؤال والإجابة يستغرقان العدد نفسه من الثواني. تستطيع أن تتحمّل تكلفة الفضول حيال كل اسم لا تتعرّف عليه، بدلًا من تلك التي تبدو مهمة فقط.
بضعة أشكال مفيدة
النسخة الأساسية:
اشرح handleLogin
explain handleLogin
حين قد يوجد الاسم نفسه في أكثر من مكان:
هناك functions باسم save في هذا المشروع — ما الفرق بينها؟
there are two functions called save in this project — what's the difference?
حين تريد عمقًا، لا مجرد تحديد:
اشرح لي User.save سطرًا سطرًا. ماذا تفعل، وماذا تستدعي، وماذا تُرجع؟
walk me through User.save line by line. What does it do, what does it call, and what does it return?
حين تريد معرفة ما إذا كان آمنًا تغيير الـ function:
ما الذي يستدعي handleLogin؟ هل تغيير طريقة معالجتها للأخطاء سيكسر أي شيء واضح؟
what calls handleLogin? Would changing how it handles errors break anything obvious?
ذلك الشكل الأخير — «ما الذي يستدعي هذا؟» — هو فكرة كبيرة بحد ذاته، وله درسه الخاص تاليًا.
النقطة التي تربك الناس
فخّان.
الأول، يفترض المتعلمون أن Claude يحتاج إلى تهجئة مثالية. لا يحتاج. «ابحث عن الـ function التي تعالج عمليات تسجيل الدخول» ينجح. «هناك شيء اسمه شبيه بـloginHandler أو handleLogin، اعثر عليه» ينجح. Claude متسامح حيال التسمية — أعطه وصفًا وسيكتشف الرمز.
الثاني، يفترض المتعلمون أن «اعثر على هذه الـ function» يعني «اعثر على function بهذا الاسم بالضبط». ليس بالضرورة. «اعثر على الـ function التي تُرسل رسالة الترحيب» سؤال جيد تمامًا. أنت تبحث حسب ما تفعله، لا حسب ما اسمها. أحيانًا لا تعرف الاسم بعد — وهذا لا بأس به.
وحدة الفضول هي الشيء الذي تريد فهمه، لا الشيء المُسمّى بهذا الاسم بالضبط.
الربط بمفرداتك الحالية
في الدرس 3.7 تعلّمتَ أن الـ codebase هو مجلد من الملفات. والملفات تحتوي على functions. والـ functions هي ما يؤدّي الأشياء — إنها أفعال البرنامج.
في معظم الأوقات، حين يحدث شيء مثير للاهتمام في الكود، تكون هناك function مسؤولة عنه. يحدث تسجيل الدخول لأن function ما عملت. تُعرَض لوحة المعلومات لأن component ما (وهو ليس سوى function) استُدعي. تخرج الرسالة لأن function ما قرّرت إرسالها.
معرفة كيفية السؤال عن الـ functions بالاسم هي، بمعنى حقيقي، تعلّم كيفية السؤال عن ما تفعله برمجياتك فعليًا.
الـ grep الكامن وراء السؤال
تذكّر ذلك «الجدار من المطابقات» — الطريقة القديمة البطيئة لاصطياد function قبل Claude؟ لنشغّله فعلًا، لأنه بالضبط ما يفعله Claude لحظة أن تسأل «أين handleLogin؟».
أنت في مشروع taskly مجددًا. ابحث في كل ملف عن الاسم:
grep -rn "handleLogin" .
الـ grep يجد النص داخل الملفات. الـ -r يعني ابحث في كل شيء هنا، المجلدات وكل ما فيها؛ والـ -n يعني أرني أرقام الأسطر. اقرأ ما يعود: handleLogin مُعرَّفة في src/auth.ts ومُستدعاة هناك في src/routes.ts.
هذا هو البحث الذي يشغّله Claude نيابةً عنك. الفرق هو ما يحدث بعد ذلك: بدلًا من أن يُلقي في حِجرك كومةً من المطابقات الخام لتفرزها بعينك، يفتح Claude تلك الملفات، ويقرأ حول كل مطابقة، ويخبرك في جملة بما تفعله الـ function وأين تعيش. نفس الـ grep — دون أي احتكاك.
ما التالي
ما إن تستطيع السؤال عن function واحدة، حتى يصبح السؤال البديهي التالي «وماذا يلامسها أيضًا؟» — من أين تُستدعى، وإلى أين يذهب return value الخاص بها، ومن أين تأتي البيانات التي تعتمد عليها. هذا هو التتبّع، وهو أعلى قراءة رافعةً في هذا المستوى بأكمله.