لو بتفايب كود معلش قوم اتطمن علي كودك
خد بالك الذكاء الاصطناعي بيكتبلك كود انت مش محتاجه
عايز أحكيلك إزاي مشروع vibe coding بيموت.
مش بيموت بسبب bug مثلا لا ده بيموت يوم ما صاحبه يطلب تعديل صغير اه والله زي مبقولك كده مثلا تغيير سعر، تعديل رسالة، شرط جديد في التسجيل والمآساة انه بيكتشف إن التعديل “الصغير” ده لازم يتعمل في 7 حتت مختلفة، هو عارف منهم 4 بس.
يعدّل الـ 4. الـ 3 التانيين يفضلوا شغالين بالنسخة القديمة. العملاء يشوفوا سعرين مختلفين. الثقة في المشروع تروح وتخسر ناس وصباح الفل بقي
اللي حصل ده ليه اسم، وليه حل، والحل عمره 27 سنة. خد معايا 6 دقايق معلش من وقتك علشان افهمك عايز اقولك ايه وركز معلش
اول حاجة هكلمك عنها اسمها DRY
في سنة 1999، Andy Hunt و Dave Thomas كتبوا The Pragmatic Programmer واحد من أهم كتب البرمجة في التاريخ وحطوا فيه مبدأ اسمه DRY: Don’t Repeat Yourself.
الناس فهمتها: “متكتبش نفس الكود مرتين”. وده غلط.
التعريف الأصلي بيقول:
كل قطعة معرفة في النظام لازم يكون ليها مصدر واحد بس.
ركّز في كلمة معرفة. مش “كود” — معرفة. يعني إيه؟
سعر الاشتراك في السيستم بتاعك = قطعة معرفة. لو السعر ده مكتوب في صفحة الـ pricing، وفي الـ checkout، وفي إيميل التأكيد، وفي الـ invoice كده انت عندك 4 نسخ من نفس المعرفة. يوم ما تغيّر السعر، لازم تفتكر الـ 4. مش تفتكر 3 بس وتنسي الرابعة
ده بالظبط سيناريو المشروع اللي مات فوق المعرفة الواحدة كانت موجوده في 7 أماكن.
والعكس مهم برضه: لو عندك دالتين شبه بعض حرفيًا واحدة بتحسب خصم العملاء الجداد وواحدة بتحسب خصم الـ Black Friday دول مش تكرار. دول قرارين مختلفين في البيزنس صدفة إن شكلهم واحد النهاردة. لو ضميتهم في دالة واحدة، أول ما البيزنس يغيّر واحد منهم هتلاقي نفسك بتكسر التاني. DRY بتوحّد المعرفة الواحدة مش الكود اللي شبه بعضه.
دي النقطة اللي بتفرق اللي فاهم عن اللي حافظ القاعدة.
الحاجة التانية وهي YAGNI
من نفس الفترة تقريبًا، Kent Beck و Ron Jeffries — مؤسسين الـ Extreme Programming — طلعوا بقاعدة تانية: YAGNI: You Aren’t Gonna Need It.
القاعدة: أي حاجة بتبنيها علشان “يمكن نحتاجها بعدين” متبنيهاش. ابنيها لما تحتاجها فعلًا.
ليه؟ لأن الـ feature المبنية بالتوقّع بتدفع تمنها 4 مرات:
تكلفة البناء — وقت وجهد راحوا في حاجة محدش طلبها
تكلفة الحمل — كل سطر زيادة بيبطّأ كل تعديل جاي، حتى لو السطر ده “مش بيعمل حاجة”
تكلفة الغلط — لما الاحتياج الحقيقي ييجي، بيطلع مختلف عن اللي توقعته، فبتبني تاني من الأول فوق كود قديم بيعاكسك
تكلفة الإزالة — شيل حاجة متشابكة في السيستم أصعب بكتير من إنك متحطهاش أصلًا
والمفارقة: الاحتمال الأكبر إن الـ “بعدين” دي عمرها ما بتيجي أصلًا.
طيب إيه علاقة ده كله بالـ AI؟
هنا بقى لب الموضوع. المبدأين دول اتكتبوا لبشر لكن الـ AI بيكسرهم بطريقة منهجية، لسببين:
السبب الأول: الـ AI معندوش ذاكرة المشروع. كل سيشن بتبدأ من الصفر تقريبًا. الـ AI مش شايف إن فيه دالة formatting للتليفونات كاتبها من أسبوع في ملف تاني فبيكتبلك واحدة جديدة. شغالة؟ آه. وده اللي بيخدعك: الكود المكرر بيشتغل، فمبتحسش بيه غير لما تيجي تعدّل.
وخليني اقولك انه أبحاث GitClear على مئات الملايين من أسطر الكود لقت إن الـ duplicated blocks زادت 81% عن 2023، وإن 2024 كانت أول سنة في التاريخ اللي الـ copy/paste فيها يعدّي الكود اللي بيتعمله refactoring. الصناعة كلها بتنتج أسرع وبتعيد استخدام أقل وأنت جزء من الإحصائية دي سواء عارف أو لأ.
السبب التاني: الـ AI متدرّب يبان helpful. بتطلب زرار login، بيرجعلك زرار login + نظام صلاحيات + دعم OAuth + config لـ 3 حالات مثلا شكله شغل محترم، صح؟ ده YAGNI violation بالضبط وأنت كـ vibe coder بتقبله لأنه “جه ببلاش وسهل واتعمل”.
هو الحقيقة مجاش ببلاش جه بالتكاليف الأربعة اللي فوق، وكمان بياكل من الـ context window فكل ما مشروعك لمؤاخذة يتخن ويكبر الـ AI نفسه بيبقى أغبى في التعامل معاه وبيبقي دايرة مفرغة.
طيب إزاي تخلّي الـ AI يمشي على المبدأين؟
المفتاح: متعتمدش على ذاكرتك ولا أخلاق الـ AI. حط القواعد في مكان الـ AI بيقراه كل مرة وهو ملف الـ rules بتاعك (CLAUDE.md أو اللي شبهه في الأداة اللي بتستخدمها):
1. قبل ما تضيف أي function جديدة، دوّر في المشروع على
implementation موجود بيعمل نفس الحاجة. لقيته؟ استخدمه.
2. نفّذ المطلوب فقط. ممنوع abstractions أو config options
أو edge cases أنا مطلبتهاش. لو شايف إضافة مفيدة، اقترحها
في سطر — متبنيهاش.
3. أي قيمة بتظهر في أكتر من مكان (سعر، limit، endpoint،
رسالة) تتعرّف مرة واحدة في ملف constants ويشاور عليها
الكل من هناك.
او استخدم السطر ده فيه التلات مبادئ مع بعض
Apply DRY and YAGNI pragmatically. Reuse existing patterns, avoid duplicated business logic, and implement only the requested scope. Avoid premature abstractions, unrelated refactors, and speculative features.3 سطور. بيغيّروا سلوك الـ AI في كل prompt جاي من غير ما تفتكرهم تاني.
بس خليني برضه احذرك من حاجة مهمة
ال DRY الزيادة عن اللزوم أخطر من التكرار نفسه.
الراجل ده Kent C. Dodds سماها AHA: Avoid Hasty Abstractions الـ abstraction الغلط أغلى من الـ duplication. لو استعجلت ووحّدت حاجتين قبل ما الـ pattern يستقر، هتقضي عمرك بتحشر exceptions جوه الـ abstraction علشان تخدم حالات هي مصممتش ليها.
الترتيب الصح دايمًا: كرّر ← استنى الـ pattern يثبت ← وقتها وحّد. مش العكس.
طيب دي توولز لطيفة هتساعدك
jscpd — بيمسح المشروع كله وبيطلعلك تقرير: فين الكود المكرر وبنسبة قد إيه. شغّله مرة وشوف الرقم غالبًا هيصدمك. 🔗 github.com/kucherenko/jscpd
Knip — بيكشف الملفات والـ dependencies اللي محدش بيستخدمها في مشاريع JS/TS. أداة YAGNI وحرفيًا كل اللي هيطلع في التقرير ده كود دفعت تمنه ببلاش. 🔗 knip.dev
الـ 3 سطور اللي فوق — انسخهم في الـ rules file بتاعك قبل ما تقفل الإيميل ده وده بجد أرخص أداة في القايمة وأعلاهم ROI.
طيب بقولك ايه ما تقوم تطمن علي كودك



