اجعل الكود المولد بالذكاء الاصطناعي قابلاً للمراجعة عبر توحيد المجلدات والتسميات وكتابة الثوابت لتمكين فريق بشري من الاستلام والإصدار بأمان.

userId مقابل userid مقابل user_id) مما يجعل البحث غير موثوق ويُسهّل تفويت الأخطاء.\n- يتم تكرار الإعدادات والقيم "السحرية".\n- ينحرف التعامل مع الأخطاء والتحقق، فتتصرف الحالات الحافة بشكل مختلف عبر الشاشات أو النهايات.\n\nتتكاثر التباينات الصغيرة وتضاعف وقت الصيانة لأنها تجبر على اتخاذ قرارات متكررة. إذا كان لكل شاشة جديدة موقع مجلد مختلف، واسم مكوّن مختلف، وأسلوب جلب بيانات مختلف قليلًا، لا يستطيع المراجعون بناء نموذج ذهني ثابت. عليهم إعادة تعلّم الكود في كل مرة.\n\nمثال واقعي: مؤسس غير تقني يستخدم أداة توليد نصية لبناء CRM بسيط. العرض التوضيحي جيد، لكن عندما يتسلمه فريق صغير، يجد ثلاث طرق مختلفة لتخزين حالة المصادقة، ونمطين لتسمية مكونات React، وقواعد عمل منتشرة بين كود الواجهة ومعالجات الخلفية. لا شيء "مكسور"، لكن كل تغيير يبدو محفوفًا بالمخاطر لأن لا أحد يعرف أي الأنماط هي الحقيقية.\n\nتصبح عملية التسليم أسهل عندما تقلل الخيارات. تتحرك الفرق أسرع عندما يخبرها مستودع الكود بهدوء، وبشكل متسق، بما يجب فعله بعد ذلك.\n\n## ماذا يعني "قابل للمراجعة" عمليًا\n\n"قابل للمراجعة" يعني أن مطورًا جديدًا يمكنه فتح المستودع، إيجاد المكان الصحيح للتغيير، إجراء التغيير، والتأكد من أن شيئًا آخر لم ينكسر. هذا أساسي، وأيضًا ما يفوته الكثير من نماذج الذكاء الاصطناعي.\n\nلجعل الكود المولد بالذكاء الاصطناعي قابلاً للمراجعة، ركز أقل على البراعة وأكثر على مدى أمان تداخل إنسان معه. قابلية المراجعة تتعلق بخفض مخاطر التغيير.\n\n### ما الذي يحتاج المراجعون لرؤيته\n\nعندما يراجع زميل طلب سحب، يحاول الإجابة عن بضعة أسئلة بسرعة:\n\n- ما هدف هذا التغيير بكلمات بسيطة؟\n- أين يعيش السلوك (الواجهة، الـ API، قاعدة البيانات) ولماذا هناك؟\n- ما هي الحدود (ما الذي لا يجب أن يؤثر عليه هذا التغيير)؟\n\n- كيف يمكنني التحقق منه (اختبارات، خطوات يدوية، أو كليهما)؟\n\n- ما خطة التراجع إذا تصرف بشكل سيء؟\n\nالاختلافات الصغيرة مفيدة، لكن "الصغر" ليس فقط بعدد الأسطر. يعني أيضًا حدودًا ثابتة: لا ينبغي أن يتطلب تغيير في منطقة واحدة لمس ملفات غير ذات صلة.\n\n### إشارات تجعل قاعدة الشيفرة قابلة للمراجعة\n\nلا تحتاج للكمال. تحتاج اتفاقيات، بعض الوثائق، بعض الاختبارات، وقواعد تمنع الانحراف المستقبلي.\n\nيشعر المراجع بالأمان عندما يستطيع بسرعة ملاحظة:\n\n- بنية وأسماء متوقعة.\n- نية واضحة في الدوال والمكونات (لا مساعدين غامضين).\n- README قصير لتشغيل، اختبار، وسيناريوهات شائعة.\n- بضعة اختبارات ذات قيمة حول التدفقات الحرجة.\n- قواعد صريحة لسلوك "يجب ألا ينكسر" (ثوابت).\n\nمثال: بنيت واجهة React وAPI بـ Go. يعمل النموذج الأولي، لكن مسار "إنشاء عميل" منتشر عبر كود الواجهة، معالجات الـ API، واستدعاءات قاعدة البيانات بأسماء حقول مختلفة قليلًا. جعلها قابلة للمراجعة يعني توحيد تلك الأسماء، إبقاء حد الـ API واضحًا، وكتابة القواعد (مثلًا: "يجب أن يكون البريد الإلكتروني فريدًا" و"الحالة يمكن أن تكون نشطة أو موقوفة فقط").\n\nلا تهدف لإعادة كتابة كل شيء حتى يبدو كمشروع نموذجي. الكود الجاهز للتسليم واضح، متسق، وآمن للتغيير، حتى لو لم يكن الأجمل بعد.\n\n## بنية مجلدات تجعل التنقل سهلًا\n\nيمكن للفريق أن يتسامح مع كود غير مثالي. ما يصعب عليهم هو عدم معرفة مكان وجود الأشياء. إذا أردت أن يكون الكود المولد قابلاً للمراجعة، اجعل المشروع سهل الفحص: مجموعة صغيرة من المجلدات العليا، أسماء متسقة، وموطن واحد واضح للإعدادات.\n\n### بنية بسيطة تعمل\n\nحافظ على خريطة المستوى الأعلى ثابتة مع نمو التطبيق. الكثير من عمليات التسليم تفشل لأن مجلدات جديدة تظهر لكل تجربة. بدلًا من ذلك، انفصل بين ثلاثة اهتمامات: تركيب التطبيق (الشاشات، المسارات)، قواعد العمل الأساسية، والبنية التحتية.\n\nإليك نمط عملي يمكنك تكييفه (مثال لتطبيق ويب):\n\ntext\n/\n /app # routes/pages and UI composition\n /core # domain logic: entities, rules, use-cases\n /ui # reusable components, styles, design tokens\n /infra # db, api clients, queues, auth adapters\n /config # env schema, feature flags, app settings\n /scripts # local tooling, seed data, one-off tasks\n /docs # handoff notes, invariants, decisions\n\n\nإذا كانت نسختك الأولى مولدة بسرعة، حافظ على هذا الفصل مرئيًا. ضع الوحدات المولدة القابلة للاستبدال تحت شيء مثل /generated، واحتفظ بالوحدات المعدلة يدويًا تحت /core أو /app. الفكرة هي تجنّب التعديلات العرضية على كود قد تُعيد توليده لاحقًا.\n\n### اجعل سؤال "أين يعيش هذا؟" قابلًا للإجابة خلال 10 ثوانٍ\n\nقبل التسليم، قم باختبار تنقل سريع مع زميل (أو مع نفسك في المستقبل). اسأل أين توجد واجهة الدخول، أين قواعد التفويض، أين تعريف الوصول لقاعدة البيانات، أين تُحدد عناوين الـ API الأساسية وعلامات الميزات، وأين توجد السكربتات "الخاصة".\n\nإذا بدأ أي جواب بـ "ذلك يعتمد" أو "ابحث عنها"، عدّل البنية حتى يكون لكل موضوع موطن واحد وممل. ذلك الشعور بالملل هو ما يجعل الصيانة سريعة وآمنة.\n\n## اتفاقيات تسمية يمكن للبشر الوثوق بها\n\nاتفاقية التسمية هي وعد: يجب أن يستطيع المراجع تخمين ما هو الشيء، أين يعيش، وكيف يُستخدم قبل فتح الملف.\n\nابدأ بأسماء الملفات والتزم بنمط واحد عبر المستودع. الافتراضي البسيط: المجلدات بكابيتال-حروف صغيرة-قصيرة (kebab-case)، مكونات React بـ PascalCase، وملفات TypeScript غير المكونات بـ camelCase. اكسر القاعدة فقط عندما يتوقع النظام البيئي ذلك (مثل قواعد Flutter القياسية أو ملفات تقليدية مثل README).\n\nيجب أن تكشف الأسماء النية، لا التطبيق:\n\n- جيد: BillingSummaryCard.tsx (ما يمثّله)\n- مخاطرة: StripeCard.tsx (يربط الاختيار بمزود)\n- مخاطرة: RenderBilling.tsx (يوصف الكيف، لا السبب)\n\nكن صارمًا مع الدروج الغامضة. الملفات المسماة utils أو helpers أو common تتحول سريعًا إلى أدراج قمامة، خاصة عندما يُولد الكود دفعات. إذا احتجت كودًا مشتركًا، سمِّه بالنطاق والغرض، مثل auth/tokenStorage.ts أو billing/billingCalculations.ts.\n\n### مجلدات الميزات مقابل المجلدات التقنية\n\nمجلدات الميزات تصف مساحة مشكلة المستخدم. المجلدات التقنية تصف البنية العرضية. خلطهما يخفي الحدود.\n\nتقسيم عملي هو ميزات مثل billing، onboarding، inventory، ومناطق تقنية مثل api، db، routing، design-system. عندما يكون لديك عملاء متعددون (ويب، خادم، موبايل)، الحفاظ على نفس أسماء الميزات عبر الطبقات يسهل تتبع التغييرات.\n\n### مقياس تسمية سريع للمراجعين\n\nاستخدم هذا المقياس القصير في مراجعة الكود:\n\n- هل يمكنك معرفة ما هو خلال 3 ثوانٍ فقط من الاسم؟\n- هل يتطابق الاسم مع المستوى (أسماء ميزات لمنطق العمل، أسماء تقنية للبنية)؟\n- هل سيبقى الاسم منطقيًا لو تغيّر التطبيق؟\n- هل هو متسق مع الملفات والمجلدات القريبة؟\n\nأعد التسمية مبكرًا. التغييرات في الأسماء رخيصة أثناء التسليم ومكلفة بعد أن يبني الفريق فوق الالتباس.\n\n## وثّق الثوابت (القواعد التي يجب أن تبقى صحيحة)\n\nالثابت هو قاعدة يعتمد عليها التطبيق ليظل صحيحًا حتى مع تغيّر الميزات. كثيرًا ما "يعمل" الكود المولد لأن المولّد افترض مجموعة من القواعد، لكن تلك القواعد قد تعيش فقط في المطالبات أو في رأس شخص ما. اكتُبها حتى يعرف المراجعون ما لا يجب أن يتغير بهدوء.\n\nالثوابت الجيدة مملة ومحددة وقابلة للاختبار. تجنّب عبارات غامضة مثل "تحقق من المدخلات". قل بالضبط ما المسموح، من يستطيع القيام به، وماذا يحدث عندما تُنتهك القاعدة.\n\n### أمثلة ثوابت مفيدة (يبحث عنها المراجعون)\n\nمعظم ألم التسليم يأتي من نفس المجالات:\n\n- الأذونات: "فقط مالكو المشروع يمكنهم دعوة الأعضاء؛ المشرفون يمكنهم إزالة الأعضاء؛ الأعضاء يمكنهم العرض لكن لا يمكنهم تعديل الفوترة."\n- ملكية البيانات: "كل مهمة تنتمي لمشروع واحد بالضبط. يمكن للمستخدم الوصول فقط إلى المهام الخاصة بالمشروعات التي هو عضو فيها."\n- قواعد الهوية والصيغة: "المعرفات العامة هي سلاسل UUIDv4. المعرفات الرقمية الداخلية لا تخرج في استجابات الخادم."\n- انتقالات الحالة: "حالة الطلب يمكن أن تنتقل draft -> paid -> shipped. لا يمكن لإعادة shipped أن تعود إلى paid."\n- تكامل البيانات: "البريد الإلكتروني فريد (غير حساس لحالة الأحرف). حذف المشروع يقوم بحذف ناعم للمهام؛ المهام لا تُحذف نهائيًا."\n\nإذا استطعت تحويل الجملة إلى اختبار وحدة أو اختبار API، فهي على المستوى الصحيح.\n\n### أين توثق الثوابت حتى تُراجع فعليًا\n\nضع الثوابت حيث ينظر الناس طبيعيًا أثناء المراجعة:\n\n- في README للمستودع: قسم "قواعد النظام" القصير مع أهم الثوابت.\n- بجانب الكود الذي يطبقها: تعليقات قصيرة قرب فحوصات التفويض، التحقق، وانتقالات الحالة.\n- في ملاحظة قرار صفحة واحدة للقواعد الكبيرة: نموذج التفويض، اختيارات نموذج البيانات، حالات سير العمل.\n\nتجنّب إخفاء الثوابت في مستندات طويلة لا يفتحها أحد. إن لم تظهر أثناء مراجعة PR العادية، فسيُغفلها الفريق.\n\n### كيفية كتابة الثوابت (وكيف تغيّرها بأمان)\n\nصِغ كل ثابت بنطاق، القاعدة، ونقطة الإنفاذ. مثال: "لكل النقاط تحت /api/projects/:id، يجب أن يكون الطالب عضوًا في المشروع؛ تُنفّذ في ميدلوير التفويض وتُفحص مرة أخرى عند تحديث المهام."\n\nعندما يتغير ثابت، اجعله صريحًا. حدّث السطر في الوثيقة، أشر إلى مواقع الكود التي تغيّرت، وأضف أو حدّث اختبارًا كان سيفشل تحت القاعدة القديمة. وإلا يميل الفريق للحفاظ على نصف السلوك القديم ونصف الجديد.\n\nإذا كنت تستخدم منصة توليد مثل Koder.ai، إحدى خطوات التسليم المفيدة هي أن تطلب منها سرد الثوابت التي افترضتها أثناء توليد التطبيق. ثم حوّل ذلك إلى مجموعة صغيرة من القواعد القابلة للاختبار التي يمكن للفريق مراجعتها وتحديثها.\n\n## خطوة بخطوة: حوّل نموذجًا أوليًا إلى كود جاهز للتسليم\n\nالتسليم ليس هو نفسه "يعمل على جهازي." الهدف هو جعل المشروع سهل القراءة، آمنًا للتغيير، ومتوقعًا عندما يفتحه شخص جديد.\n\nابدأ بتجميد النطاق. اختر تاريخًا وقائمة قصيرة بما يجب أن يكون ثابتًا (الشاشات الأساسية، التدفقات الرئيسية، التكاملات). اكتب أيضًا ما هو خارج النطاق صراحةً حتى لا يواصل أحد إضافة ميزات أثناء تنظيف الأمور.\n\nثم قم بالتنظيف قبل إضافة أي شيء جديد. هنا تبدأ قابلية المراجعة بالظهور: يتصرف مستودع الشيفرة كمنتج، لا عرض توضيحي.\n\nتسلسل عملي:\n\n- قفل نطاق التسليم: 3 إلى 5 رحلات مستخدم يجب أن تعمل، بالإضافة إلى 3 إلى 5 أشياء لن تُغيّر.\n- توحيد المجلدات والأسماء: نقل الملفات إلى بنية متوقعة، إعادة تسمية الوحدات غير الواضحة، حذف الكود الميت.\n- أضف ملاحظات وحدات صغيرة حيث سيرى الناسها: "ما الذي يفعله" و"ما الذي لا يجب أن يفعله"، مكتوبة ببضع سطور.\n- ضع الثوابت بجانب تطبيقها: اكتب القاعدة فوق الدالة أو الاستعلام أو المكون الذي يُطبقها.\n- أنشئ خطة اختبار دخان minimal: قائمة تحقق قصيرة تطابق النطاق المجمد والثوابت.\n\nحافظ على خطة اختبار الدخان صغيرة لكنها حقيقية. لتطبيق React مع API بـ Go و Postgres، قد تكون: تسجيل الدخول، إنشاء سجل، التحديث، التأكد من الاستمرار في التخزين، والتأكد من فشل إجراء مقيد.\n\nقم بجولة مراجعة واحدة تركز على قابلية القراءة، لا الميزات. اطلب من زميل قضاء 30 دقيقة في الإجابة: "هل أستطيع إيجاد الأشياء؟" "هل الأسماء تطابق السلوك؟" "هل الثوابت واضحة؟" أصلح ما يبطئهم، ثم توقف.\n\n## فحوصات سريعة قبل أن تسلمه للفريق\n\nقبل التسليم، قم باختبار "عيون جديدة". اطلب من شخص لم يبنِ النموذج فتح المستودع وسرد ما يعتقد أنه يفعله. إذا لم يستطع إيجاد نقاط البداية بسرعة، سيدفع الفريق ذلك الثمن مع كل تغيير.\n\nقاعدة بسيطة: يجب أن يكون بمقدور مطور جديد تحديد نقاط الدخول الرئيسية في أقل من دقيقتين. هذا عادة يعني README واضح يذكر مكانين أو واحد للبدء (نقطة دخول الويب، نقطة دخول الـ API، الإعداد)، وتلك الملفات ليست مدفونة.\n\nتحقق أيضًا من حجم المراجعة. إذا كانت الوحدات الأساسية تتطلب تمريرًا لا نهاية له، يتوقف المراجعون عن الإمساك بالمشكلات. قسّم الملفات الطويلة بحيث يؤدّي كل ملف وظيفة واحدة ويمكن فهمه في جلسة واحدة.\n\nقائمة فحص قصيرة للتسليم:\n\n- نقاط الدخول واضحة: أين يبدأ التطبيق، أين تعيش المسارات، أين تُقرأ إعدادات البيئة.\n- الملفات صغيرة الحجم: معظمها يملأ شاشة أو شاشتين؛ لا توجد "ملفات إلهية".\n- الأسماء تطابق السلوك: validateUser يتحقق فقط، ولا يكتب لقاعدة البيانات.\n- الثوابت قريبة من الكود: تعليقات أو كتلة وثائق صغيرة توضح القواعد التي يجب أن تبقى.\n- كل تغيير سهل التحقق: فحص سريع يثبت أن التدفقات الأساسية ما زالت تعمل.\n\n## سيناريو تسليم واقعي\n\nمايا مؤسسة غير تقنية. أنشأت MVP عبر وصف المنتج في الدردشة: CRM بسيط لأعمال خدمات صغيرة. يعمل: تسجيل الدخول، العملاء، الصفقات، الملاحظات، وشاشة مشرف أساسية. بعد بضعة أسابيع، توظف مطورين اثنين ليجعلوه موثوقًا للأعمال.\n\nفي اليوم الأول، لا يبدأان بإعادة الكتابة. يبدأان بجعل الكود قابلاً للمراجعة. خطوتهم الأولى هي تقسيم التطبيق إلى دلوين: الوحدات الأساسية (الأشياء التي تعتمد عليها كل ميزة) والميزات (الشاشات وتدفقات العمل). هذا يمنحهم مكانًا لوضع القرارات، ومكانًا لوضع التغيير.\n\nيتفقان على خريطة ميزات بسيطة: النواة (المصادقة، وصول القاعدة، الأذونات، السجل، مكونات الواجهة) والميزات (العملاء، الصفقات، الملاحظات، المشرف).\n\nبعدها يضبطان المجلدات لتطابق تلك الخريطة. قبل ذلك، الملفات مشتتة، بتسمية مختلطة مثل CustomerPage.tsx, customer_view.tsx, وcustPageNew.tsx. بعد التعديل، كل ميزة لها موطن واحد، والكود الأساسي منفصل وواضح. تصبح المراجعات أسرع لأن طلبات السحب تميل إلى البقاء داخل مجلد ميزة واحدة، والتغييرات الأساسية تصبح واضحة.\n\nقاعدة تسمية صغيرة تفعل معظم العمل: "المجلدات أسماء اسمية، المكونات PascalCase، الدوال أفعال، ولا نختصر." لذلك custPageNew.tsx يصبح CustomerDetailsPage.tsx، وdoStuff() يصبح saveCustomerNote().\n\n### ثابت واحد يمنع الأخطاء الصامتة\n\nيكتبون قاعدة رئيسية يجب أن تبقى صحيحة ويضعونها في INVARIANTS.md قصير داخل مجلد الميزة.\n\nمثال ثابت لـ CRM:\n\nفقط مالك الصفقة أو المشرف يمكنه تعديل صفقة. الباقون يمكنهم العرض فقط، لكن لا يمكنهم تغيير الحالة أو القيمة أو الملاحظات.\n\nتوجّه هذه الجملة فحوصات الخادم، استعلامات قاعدة البيانات، وحالات واجهة المستخدم. عندما يضيف شخص لاحقًا "تحرير بالجملة"، يعرف المراجعون بالضبط ما لا يجب أن ينكسر.\n\n### ما الذي يبدو جيدًا بعد أسبوع واحد\n\nبعد أسبوع، الكود ليس مثاليًا، لكن التسليم حقيقي:\n\n- كل ميزة تعيش في مجلد واحد بأسماء ملفات متوقعة.\n- الوحدات الأساسية مفصولة ومعاد استخدامها، لا منسوخة.\n- الثوابت مكتوبة حيث تحدث التغييرات، ليس مدفونة في تاريخ الدردشة.\n- التغييرات الجديدة تُسلم عبر PRs صغيرة سهلة المراجعة.\n\n## أخطاء شائعة تجعل كود الذكاء الاصطناعي هشًا\n\nيمكن للذكاء الاصطناعي أن يوصلك إلى نموذج عمل بسرعة. المشكلة أن "يعمل" كثيرًا ما يعتمد على افتراضات مخفية. عندما يلمسه فريق لاحقًا، تغيرات صغيرة تكسر أشياء في أماكن مفاجئة.\n\nخطأ شائع واحد هو إعادة الهيكلة الكاملة دفعة واحدة. تنظيف واسع النطاق ممتع، لكنه يصعّب رؤية ما تغيّر ولماذا. حدِّد الحدود أولًا: قرِّر أي الوحدات ثابتة، أين يُسمح للكود الجديد، وما السلوك الذي لا يجب تغييره. ثم حسن منطقة واحدة في كل مرة.\n\nمشكلة متكررة أخرى هي المفاهيم المكررة بأسماء مختلفة. سيولد الذكاء الاصطناعي بسرور كلًا من UserService وAccountManager لنفس المهمة، أو plan مقابل pricingTier لفكرة واحدة. اختر مصطلحًا واحدًا لكل مفهوم أساسي وأعد التسمية بشكل متسق عبر الواجهة، الـ API، والقاعدة.\n\nالقواعد المخفية أيضًا مصدر رئيسي للهشاشة. إذا كانت منطق الأعمال الحقيقي يعيش في المطالبات أو سجل الدردشة، يصبح المستودع صعب الصيانة. ضع القواعد في قاعدة الكود كتعليقات واضحة، اختبارات، أو وثيقة ثوابت قصيرة.\n\nالمجلدات الشاملة مثل shared, common, أو utils تتحول بصمت إلى أدراج قمامة. إذا احتجت وحدات مشتركة، حدد ما تملكه (المدخلات، المخرجات، المسؤوليات) وابقها ضيقة.\n\nدمج قواعد العمل في كود الواجهة فخ آخر. شرط سريع في مكوّن React يصبح المكان الوحيد لوجود قاعدة تسعير. لاحقًا، يتعارض التطبيق المحمول أو الخادم. حافظ على قواعد العمل في طبقة واحدة (غالبًا الخلفية أو وحدة المجال) واجعل الواجهة تستدعيها بدل إعادة تنفيذها.\n\nأخيرًا، ينشأ الكود الهش غالبًا من تخطي معايير المراجعة. الفرق تحتاج اختلافات صغيرة، التزامات واضحة، ونية واضحة. حتى لو أنتج المولد التغيير، عامله كـ PR عادي: اجعل النطاق ضيقًا، اشرح ما تغيّر، وسهّل التحقق.\n\n## الخطوات التالية: اجعل الصيانة سير عمل عاديًا\n\nعامل التسليم كبداية للصيانة، لا خط النهاية. الهدف يبقى بسيطًا: يستطيع شخص جديد إجراء تغيير صغير دون كسر قواعد مخفية.\n\nحوّل تفضيلات الفريق إلى بعض الإعدادات المكتوبة: خريطة مجلد واحدة يتبعها الجميع، نمط تسمية واحد، ونموذج واحد للثوابت. عندما تُتفق تلك القواعد مسبقًا، تتوقف تعليقات المراجعة عن كونها أذواقًا شخصية وتصبح فحوصًا متسقة.\n\nحافظ على "README التسليم" الذي يشير إلى الأماكن القليلة المهمة: أين تعيش الثوابت، كيفية تشغيل التطبيق، كيفية إضافة ميزة بأمان، وما الذي لا تغيّره دون نقاش. يجب أن يجد الزميل الجديد الإجابات في أقل من خمس دقائق.\n\nإذا كان سير عملك يدعم الاسترجاعية، استعملها. على سبيل المثال، Koder.ai يدعم اللقطات والتراجع، مما يمكن أن يكون شبكة أمان بسيطة قبل عمليات إعادة الهيكلة أو ترقية التبعيات. عندما تكون جاهزًا لنقل الملكية، يمنحك تصدير المصدر من koder.ai نقطة بداية نظيفة لعمل Git الاعتيادي.ابدأ بجعل الكود متوقعًا. طابق بنية المجلدات والتسميات والحدود حتى يستطيع زميل أن يخمن أين تعيش الأشياء وكيف تتصرف دون البحث في المستودع كله.
اختر نمطًا واحدًا لكل مهمة متكررة (حالة المصادقة، جلب البيانات، التحقق من الصحة، التعامل مع الأخطاء) وطبِّقه في كل مكان. الهدف ليس أن يكون الأفضل بل أن يكون متسقًا، حتى لا يضطر المراجعون لإعادة تعلّم التطبيق مع كل تغيير.
قاعدة قابلة للمراجعة تسمح للمطور الجديد أن يجد المكان المناسب للتغيير، يجري تعديلًا صغيرًا، ويتحقق بأمان. إذا كانت التغييرات تمتد إلى ملفات غير ذات صلة أو تتطلب تخمين القواعد، فهي ليست قابلة للمراجعة بعد.
استخدم مجموعة صغيرة وثابتة من المجلدات العليا واجعل كل مسؤولية لها موطن واضح. فصل تركيب التطبيق (الصفحات/Routes)، قواعد العمل الأساسية، والبنية التحتية يجعل التنقل يعادل ثوانٍ بدلًا من عمل محقق.
ضع الكود الذي قد تُعيد توليده تحت مجلد واضح مثل /generated، واحفظ كود التحرير البشري في أماكن مستقرة مثل /core و/app. هذا يمنع التعديلات العرضية التي قد تُستبدل لاحقًا ويجعل الملكية واضحة أثناء المراجعة.
اختر قاعدة واحدة وطبّقها في كل مكان: تنسيق ثابت للمجلدات والملفات، تسمية مكونات ثابتة، وأسماء حقول متسقة عبر الواجهة، الـ API، والقاعدة. الاتساق يجعل البحث موثوقًا ويقلل الأخطاء الدقيقة الناتجة عن أسماء غير متطابقة.
الثوابت هي القواعد التي يجب أن تبقى صحيحة مع تغيّر المنتج—مثل الأذونات، قيود التفرد، وانتقالات الحالة المسموح بها. كتابتها يحول الافتراضات المخفية إلى اختبارات مرئية يمكن للمراجعين حمايتها.
ضعها حيث يراها الناس فعليًا: قسم قصير في README بالإضافة إلى ملاحظات قصيرة بجانب الكود الذي يطبّق القاعدة. إذا لم تظهر القاعدة أثناء مراجعة PR العادية، فستُنسى.
ثبّت النطاق أولًا باختيار مجموعة صغيرة من رحلات المستخدم الأساسية التي يجب أن تعمل وما هو خارج النطاق صراحة. بعد ذلك طابع المجلدات والأسماء، احذف الكود الميت، أضف قائمة اختبار دخان صغيرة، وقم بمرور مراجعة يركّز على قابلية القراءة فقط.
تجنّب عمليات إعادة هيكلة ضخمة التي تغيّر كل شيء دفعة واحدة، مجلدات اصطلاحية كالـ utils، ودمج قواعد العمل داخل الشيفرة الواجهية. راقب أيضًا التكرار بالمُسميات المختلفة وانحراف التحقق والتعامل مع الأخطاء عبر النهايات والشاشات.