ANUPET ACADEMY رجوع للموقع

مراجعة الكود اللي الذكاء الاصطناعي كتبه: قائمة فحص

سبع نقاط تعدّي عليها قبل ما تدخّل أي كود جالك من مساعد — أمان، حالات حدية، أداء، ومعالجة أخطاء — بأمثلة كود قبل وبعد.

مراجعة الكود اللي الذكاء الاصطناعي كتبه: قائمة فحص

مراجعة الكود اللي الذكاء الاصطناعي كتبه: قائمة فحص

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

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

١) هو أصلًا بيعمل المطلوب؟

قبل أي حاجة تانية. المساعد بيرد على السؤال اللي فهمه، مش على السؤال اللي في دماغك. طلبت «امسح الأوردرات القديمة»، فهم «القديمة» على إنها أقدم من سنة، وإنت كنت قاصد «الملغية».

اقرا المتطلب بتاعك بصوت عالي، وبعدين اقرا الكود، وقارن. لو مش قادر تقول «آه، ده بالظبط اللي طلبته» — وقّف هنا، مش لازم تكمّل باقي القائمة.

٢) الصلاحية والأمان

دي النقطة اللي بتسكت أكتر حاجة، لأن غيابها مالوش عرض. الكود شغال تمام — بالظبط زي ما هو شغال لواحد مش من حقه.

اتأكد من تلاتة:

التحقق من الهوية والصلاحية موجود:

// جاي كده — أي حد معاه ID بيقرا أي أوردر
public function show(Order $order)
{
    return $order;
}
// المفروض
public function show(Order $order)
{
    $this->authorize('view', $order);

    return $order;
}

مفيش استعلام متبني بالتجميع:

// خطر — الإيميل جاي من المستخدم وداخل الاستعلام كنص
DB::select("SELECT * FROM users WHERE email = '".$request->email."'");
// آمن — القيمة بتتبعت منفصلة عن الاستعلام
DB::select('SELECT * FROM users WHERE email = ?', [$request->email]);

مفيش حقول بتتحفظ على عماها: لو شفت Model::create($request->all()) قف. لازم يكون $request->validated()، وموديل ليه $fillable محترم — وإلا اليوزر يبعت role في الفورم ويرقّي نفسه.

٣) الحالات الحدية

النموذج بيكتب المسار السعيد لأنه هو اللي مكتوب في كل الأمثلة اللي شافها. اسأل الأسئلة دي على كل دالة:

  • لو الليستة رجعت فاضية؟
  • لو القيمة null؟
  • لو الرقم صفر أو سالب؟
  • لو النص عربي أو فيه إيموجي — الطول بيتحسب صح؟
  • لو الدالة اتنادت مرتين بنفس الطلب (المستخدم دوس مرتين)؟

المثال الكلاسيكي:

$average = array_sum($scores) / count($scores);

سطر بريء، وبيقع بـ DivisionByZeroError أول ما الطالب يبقى ملوش درجات. والإصلاح مش شطارة:

$average = $scores === [] ? 0 : array_sum($scores) / count($scores);

وفي الحاجات العربية بالتحديد: strlen('مصر') بترجّع ٦ مش ٣، لأنها بتعد البايتات. اللي إنت عايزه mb_strlen. الكود الجاهز بيستخدم الأولانية كتير جدًا لأن أغلب الأمثلة اللي اتدرب عليها إنجليزي.

٤) الأداء

مش محتاج تبقى خبير — دوّر على تلات أنماط بس:

  • استعلام جوه لوب. أي foreach جواها ->find() أو ->where() دي علامة حمرا. الحل غالبًا with() أو استعلام واحد بـ whereIn.
  • تحميل كل الصفوف. Model::all() على جدول بيكبر، أو get() من غير limit. على جهازك خمسين صف، على السيرفر ميتين ألف.
  • شغل تقيل جوه الطلب. إرسال إيميل، توليد PDF، مناداة API خارجي — دول مكانهم queue مش وسط استجابة المستخدم.

٥) معالجة الخطأ

أكتر نمط خطر في الكود المولّد هو الاستثناء المبلوع:

try {
    $this->gateway->charge($order);
} catch (\Exception $e) {
    // مفيش حاجة
}

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

try {
    $this->gateway->charge($order);
} catch (PaymentFailed $e) {
    Log::warning('charge failed', ['order' => $order->id, 'reason' => $e->getMessage()]);

    return back()->withErrors(__('الدفع لم يكتمل، حاول مرة أخرى.'));
}

ولاحظ: catch (PaymentFailed) مش catch (\Exception). اصطاد اللي إنت متوقعه بس.

٦) هو أصلًا موجود عندنا؟

المساعد بيكتب من الصفر لأنه مش شايف باقي مشروعك. فبتلاقي دالة بتنسّق التاريخ اتكتبت للمرة التالتة، وكل نسخة بتنسّق بشكل مختلف شوية. قبل ما تدخّل أي helper، دوّر في المشروع الأول. التكرار مش بيوجع النهاردة، بيوجع لما تيجي تغيّر التنسيق وتلاقي نفسك بتدوّر على تلات أماكن — وتلاقي التالت بعد ما العميل يشتكي.

٧) هفهمه بعد شهر؟

آخر سؤال، وهو أهم من شكله. لو الكود فيه لعبة شاطرة، أو ريجيكس من تلات سطور، أو سلسلة map وfilter وreduce مالهاش آخر — اسأل: أنا اللي هصلّحه الساعة اتنين بالليل. هعرف؟

الكود الممل اللي بيتقرا من أول مرة أحسن من الكود الذكي، دايمًا. ولو اضطريت تسيب حتة معقدة، اكتب فوقها سطرين بيقولوا ليه — مش بيعمل إيه، ليه.

إزاي تخلي القائمة دي عادة

اطبعها ورقة وحطها جنب الشاشة أول أسبوعين. بعد كده هتلاقي نفسك بتعدّي عليها في دماغك في نص دقيقة. وأسرع طريقة تقلل شغل المراجعة أصلًا هي إنك تكتب طلب أوضح من الأول، وده شرحته بالتفصيل في [إزاي تكتب prompt لمهمة كود حقيقية](/blog/prompt-for-real-code-task).

إحنا في أكاديمية أنوبت بنخلي الطالب يراجع كود زميله بالقائمة دي قبل ما يراجع كوده هو، لأن العين بتشوف في شغل غيرها أكتر بكتير ما بتشوف في شغلها. المهارة دي — إنك تقرا كود مش بتاعك وتحكم عليه — هي أغلى حاجة بتتعلمها في [مسار الباك إند المتقدم](/courses/back-end-2)، وهي بالمصادفة نفس المهارة اللي السوق بيدور عليها دلوقتي.

الكلمات المفتاحية مراجعة الكود code review بالعربي أمان الكود sql injection n+1 laravel كود الذكاء الاصطناعي

كل المقالات