تخطَّ إلى المحتوى الرئيسي

دروس في الإزاحة المبكرة للجودة مع التطوير بالذكاء الاصطناعي

بقلم يحيى حافظقراءة ١٣ دقيقة

كيف أحافظ على الجودة بينما يكتب الذكاء الاصطناعي معظم شيفرة Read Master (يُفتح في علامة تبويب جديدة)، التطبيق الذكي لفهم القراءة والاحتفاظ بها — وماذا حدث حين صارت عملية الجودة نفسها هي المشكلة. هذا المقال رفيق لمقال دروس في تشغيل جلسات Claude Code المتوازية.

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

لسبعة أسابيع، خزّن تطبيقي محتوى كان يفترض أن يكون مشفرًا وهو ساكن — نصًا صريحًا.

كانت هناك دالة تشفير مساعدة. وكانت تعمل. لكن مسار الشيفرة الذي يهم لم يستدعِها. جلسة ما (ذكاء اصطناعي أو أنا، لا فرق) كتبت إدخال قاعدة البيانات يدويًا بدل المرور عبر الدالة المساعدة، ولم يعترض شيء في أي مكان. كل الاختبارات نجحت. وكل مراجعة بدت سليمة. سبعة أسابيع.

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

هذا هو معنى "الإزاحة المبكرة" (Shift-Left) عمليًا، وقد صرت أعتقد أنها استراتيجية الجودة الوحيدة التي تصمد أمام التطوير بسرعة الذكاء الاصطناعي. هذا المقال هو الدليل: كيف تتحول الملاحظات إلى حُرّاس، وكيف تعرف أن حُرّاسك يعملون فعلًا، ثم الجزء الذي لا يحذرك منه أحد، وهو ماذا تفعل حين تبدأ جموع الحُرّاس نفسها في التهام سرعتك.

لماذا يغيّر الذكاء الاصطناعي حسابات المراجعة

"الإزاحة المبكرة" نصيحة قديمة (أقدم من معظم الأدوات (يُفتح في علامة تبويب جديدة)): التقط المشكلات مبكرًا حيث تكون أرخص. في CI بدل الإنتاج. وعند الدفع بدل CI، وعند الإيداع بدل الدفع، وفي المحرر بدل الإيداع — والأرخص من ذلك كله أن تجعل الخطأ مستحيل الكتابة أصلًا.

يغيّر التطوير بالذكاء الاصطناعي هذه الحسابات من جهتين.

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

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

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

الدرس 1: لكل ملاحظة حارس، على أبكر درجة تطالها

حين يفلت شيء من بين الأصابع، أختار أعلى درجة تناسبه في هذا السلّم:

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

الترتيب هنا بحسب من يقوم بالالتقاط. الدرجات من 1 إلى 4 آلات. والدرجة 5 هي أنت في المستقبل، في الحادية عشرة ليلًا، تقرأ قراءة عابرة.

السلّم محور واحد: أي نوع من الفحص يلتقط الخطأ. والمحور الثاني هو أين يعمل، والفحص نفسه يمكن أن يعمل في عدة محطات. المحرر يعطيك خطًا متعرجًا لحظة الحفظ. وخطاف pre-commit يعمل سريعًا على الملفات المجهزة فقط. وخطاف pre-push يشغّل حزمة الاختبارات المحدودة النطاق. وCI يشغّل كل شيء بلا تحديد نطاق، بوصفه شبكة الأمان التي لا يعنيها كيف ضُبط حاسوب أي أحد. ثم تأتي فحوص الدمج الإلزامية، وبوابات النشر في النهاية؛ نشراتي لا تبحر إلا على CI أخضر، بل إن لدي سير عمل يعمل بعد الدمج ليدقق، بأثر رجعي، أن عمليات الدمج اتبعت السياسة. والقاعدة العملية: شغّل كل حارس في أبكر محطة يكون فيها سريعًا بما لا يزعج، وأبقِ محطة لاحقة تشغّله أيضًا. فكل مرحلة إنما وُجدت لأن شيئًا ما يفلت أحيانًا من المرحلة التي قبلها.

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

اجعلها تلقائية: قواعد lint المخصصة أقل عملًا مما تبدو. واجهة القواعد المخصصة في ESLint (يُفتح في علامة تبويب جديدة) زائرٌ على شجرة بناء الجملة، وقواعدك الحالية تصبح قوالب للجديدة؛ قواعدي تبدأ غالبًا نسخةً من أقرب جارتها. وعندي أيضًا أمر مختصر يأخذ وصف الملاحظة ويولّد هيكل القاعدة مع اختبارها. الذكاء الاصطناعي يكتب معظم القاعدة؛ والحادثة تمليه بالضبط ما الذي يطابقه.

الدرس 2: الدالة المساعدة بلا حارس مجرد اقتراح

حادثة النص الصريح تعمّم نفسها، وهي أثقل درس هنا ثمنًا: تقديم "الطريقة الصحيحة الوحيدة لفعل س" لا يفعل شيئًا ما لم يرفض شيءٌ ما الطرقَ الأخرى.

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

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

اجعلها تلقائية: تبقى هذه عادةً حتى تجعلها بندًا في قائمة فحص وسلوكًا في القالب. قالب طلبات السحب عندي يسأل: "هل يقدّم هذا التغيير دالة مساعدة معيارية؟ أين حارسها؟"، وقصص الفشل أعلاه موثقة بجوار القواعد التي أنتجتها، فترى الجلسةُ التالية لماذا وُجد النمط.

الدرس 3: شاهد كل حارس يفشل قبل أن تثق به

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

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

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

اجعلها تلقائية: كل قاعدة مخصصة تُشحن مع ملف اختبارها، وتلك الاختبارات تعمل في CI ككل اختبار آخر. الحارس غير المختبَر أمنية.

الدرس 4: احتفظ بسجل — لكن قِس الشيء الصحيح

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

اعتراف صريح: سجلي أخطأ الشطر الأول شهورًا. الأعداد الخام (138 في شهر، ثم 94، ثم 210) اتضح أنها تخلط بين كم دققنا بقوة وكم كان الخطأ كثيرًا. الرقم المهم فعلًا مختلف: هل هذه الملاحظة فئة جديدة، أم تكرار لفئة كان لها حارس أصلًا؟ الفئة الجديدة تعني أن النظام يتعلم. والتكرار يعني أن حارسًا فشل — وهي الإشارة الوحيدة التي تستحق الإنذار. وأعدادي كانت تدفنها.

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

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

الدرس 5: الثقل الموازن — حين تصبح الإزاحة المبكرة هي التضخم

كل ما سبق يتراكم. هذا هو المقصود. وهذه هي المشكلة أيضًا.

في أغسطس قست ما يكلفه النظام المتراكم فعلًا، عبر آخر 40 طلب سحب مدموج. كان خط الأنابيب الظاهر سريعًا: CI في 3–7 دقائق، والدمج في أقل من ساعة. كانت الكلفة مختبئة أبكر، داخل الجلسة. إصلاح من ثلاثة أسطر يدفع المراسم نفسها التي تدفعها ميزة من 1,200 سطر: تدقيق كامل متعدد النماذج بمهلة 12 دقيقة لكل ساق، ومذكرات تصنيف، ومصادقة، وتحديثات سياق. وطلب سحب واحد خاض سبع جولات مع مراجعٍ ذكي غير حتمي يخرج في كل جولة ملاحظات بصياغة جديدة. ومخزون الحُرّاس (125 قاعدة lint و~54 نص فحص و20 سير عمل CI) لا يعرف إلا النمو؛ لا شيء يتقاعد. ونحو ثلث طلباتي الأخيرة كانت صيانة عمليات لا منتجًا.

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

هكذا يبدو الإصلاح، من غير إضعاف شيء:

  • درّج المراسم على قدر التغيير، ودع الأدوات تقرر. التغييرات الصغيرة تحصل على تدقيق خفيف، لكن الأهلية آلية لا حكم مستعجل: فرق تحت سقف حجم، بلا تغييرات ثنائية (فرق git النصي يكذب بشأن الثنائيات؛ إيداع من 52 أيقونة "قاس" 14.6 كيلوبايت)، ولا ملف على مسار خطر (شيفرة الخادم، المخطط، الترحيلات، CI، ونصوص الحُرّاس نفسها)، وقاعدة حديثة. غير مؤهل؟ يرفض المشغّل ويسمي السبب، فتسلك المسار الكامل.
  • اقطع طرق التمويه. المرور الخفيف يجب أن يكون مميّزًا عن المرور الكامل، وبقايا مرور كامل سابق لا يجوز أن تُلبس مرورًا خفيفًا ثوبه. المسارات السريعة القادرة على انتحال البطيئة تصبح الوضع الافتراضي في أسبوع.
  • ضع سقوفًا لينة على الحلقات غير المحدودة، لا صلبة. عدّاد جولات المراجعة يحذر بصوت عالٍ عند الحد بدل أن يمنع، لأن السجل التجريبي أظهر ملاحظة حقيقية تطفو في الجولة الرابعة. قيّد الدوران، وأبقِ مخرج الطوارئ.
  • حسّن متى تُكتشف الإخفاقات وكم جولة غير حتمية تدور، لا هل تُفحص الأشياء. البوابات الحتمية (الأنواع، الفحص، الاختبارات) لا تُمس. فهي رخيصة، وهي لا تجادل.
  • جدوِل البستنة. تقاعد الحُرّاس ودمجهم لا يحدثان من تلقاء الجو؛ يحتاجان موعدهما الدوري، كتحديثات التبعيات.

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

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

الدرس 6: أغلق الدائرة — دع العملية تقترح حُرّاسها بنفسها

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

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

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

والثالثة تشير إلى الخارج. الحلقتان الأوليان تتعلمان من حوادثي أنا؛ ومهارة صغيرة أسميها glean تتعلم من حوادث الآخرين. وجّهها إلى رابط — تشريح حادثة، مقال ممارسات فضلى، دروس أحدهم المستفادة — فتقرأ الصفحة، وتفحص ما يفعله مستودعي أصلًا، وتقدّم فقط الفروق القابلة للتطبيق فعلًا، كلٌّ منها مربوط بمكان هبوطه: قاعدة، خطاف، وثيقة. معظم المقالات لا تثمر شيئًا، وهذا هو المقصود. فالمرشِّح هو "غير معمول به هنا سلفًا"، وما ينجو يستحق طلب سحب. (وإن كنت تقرأ هذا وبجانبك مساعد ذكاء اصطناعي، فهذا المقال نفسه قابل للـglean أيضًا.)

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

الخلاصة السريعة

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

لماذا يهمني كل هذا

أبني Read Master (يُفتح في علامة تبويب جديدة) وحدي: تطبيق بالذكاء الاصطناعي لفهم القراءة والاحتفاظ بها، فيه دليل ما قبل القراءة يهيئك قبل الكتاب، وتقييمات تفحص ما رسخ، وبطاقات مراجعة بالتكرار المتباعد ليبقى راسخًا، كل ذلك حول قارئ مصمم لإتاحة الوصول أولًا. "شخص واحد زائد ذكاء اصطناعي" حجم فريق حقيقي اليوم، لكن بشرط ألا تتحلل الجودة مع السرعة. الإزاحة المبكرة هي ما ينيمني مطمئنًا، وكل قاعدة في ذلك المستودع ندبة معها اختبارها.

يُطلق Read Master للعموم في سبتمبر؛ وقائمة الانتظار مفتوحة (يُفتح في علامة تبويب جديدة). وإن كنت قد بنيت أنظمة حُرّاس حول التطوير بالذكاء الاصطناعي — خصوصًا إن اصطدمت بجدار التضخم — فأنا أريد أن أسمع ما الذي أحلته على التقاعد، لا ما الذي أضفته فقط.


كتب Claude مسودة هذا المقال؛ وراجعتُها وحررتها ودققت وقائعها بنفسي. والمسودة نفسها فحصتها بعض قواعد lint التي يصفها المقال.

قراءة جيدة، في بريدك

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