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

اتفاقيات الإطار هي "طرق العمل الافتراضية" التي يشجّعها الإطار بهدوء — أو يتوقعها صراحة. بدل أن يخترع كل فريق تخطيط المجلدات، مخطط التسمية، أو تدفّق الطلب/الاستجابة بنفسه، يوفّر الإطار نمطًا مشتركًا. إذا تبعته، يمكن للمطورين الآخرين التكهّن بمكان الأشياء وكيف تعمل من دون الحاجة لشرح طويل.
معظم التوثيق لا يُكتب لأن الناس يحبون كتابة المستندات. بل يوجد لحل بعض المشاكل المتكررة:
الاتفاقيات تتعامل مع الأولَين بشكل جيد جدًا. عندما يُقرّر الإطار "أين نضع X" و"ماذا نسمي Y"، يقلّ ما يحتاج إلى تفسير وتقلّ المناقشات.
"الاتفاقيات تحل محل التوثيق" لا يعني أن المشروع يصبح بلا وثائق. يعني أن جزءًا كبيرًا من الإرشادات الأساسية ينتقل من نصوص إلى بنية متوقعة. بدل قراءة صفحة وكيكي لمعرفة أين تذهب المتحكّمات، تستنتج ذلك لأن الإطار يتوقع وجود المتحكّمات في مكان معيّن (وأدوات، مولّدات، وأمثلة تعزّز ذلك).
النتيجة: توثيق أقل حول البديهيات، وتركيز أكبر على توثيق ما هو مخصّص للمشروع: قواعد العمل، خيارات معمارية غير عادية، والاستثناءات المقصودة.
هذه المقالة للمطوّرين، قادة التكنولوجيا، والفرق ذات الحس المنتجّي الذين يريدون قواعد شيفرة أوضح وانخراط أسرع دون الإبقاء على موقع توثيق ضخم.
ستتعلم كيف تخلق اتفاقيات الإطار "توثيقًا ضمنيًا"، وما الأشياء التي توحّدها الاتفاقيات عادة، أين تتوقف الاتفاقيات عن المساعدة، وما الذي لا يزال يستحق توثيقه صراحة — حتى تزداد الوضوحية بينما يقلّ حجم المستندات.
"الاتفاقية بدل التهيئة" تعني أن الإطار يتخذ خيارات معقولة نيابةً عنك — طالما تتبع قواعده المتفق عليها. بدل كتابة (وقراءة) صفحات تعليمات الإعداد، يعتمد الفريق على افتراضات مشتركة يتعرّف عليها الجميع.
فكّر فيه مثل القيادة في بلد يتفق فيه الجميع على القيادة على الجانب الأيمن من الطريق، الوقوف عند الإشارات الحمراء، واتباع اللوحات القياسية.
يمكنك كتابة دليل مفصّل لكل تقاطع ("إن رأيت مثمنًا أحمرًا، توقف؛ إذا الضوء أخضر، انطلق..."), لكنك لا تحتاج لذلك — لأن الاتفاقية معروفة ومتّسقة.
تعمل اتفاقيات الإطار بنفس الطريقة: تحوّل "كيف نفعل الأشياء هنا" إلى سلوك متوقّع.
عندما يحتوي الإطار على افتراضات افتراضية، لا تحتاج لتوثيق كل قرار صغير. يستطيع الإطار (وفريقك) افتراض أنماط مثل:
controllers في مجلد، القوالب في مجلد آخر)\n- كيف تُسمى الأشياء (نموذج User يُطابق بيانات users)\n- كيف تُوصّل الميزات الشائعة (التوجيه، التحقق، إعدادات البيئة)هذا الأساس المشترك يختصر التوثيق من "كل الخطوات لإعداد X" إلى "نتبع افتراضات الإطار، ما عدا حيث نذكر خلاف ذلك." كما يقلّل الحمل الذهني أثناء الانخراط: المطوّرون الجدد يمكنهم التخمين الصحيح غالبًا، لأن الشيفرة تطابق ما شاهدوه في مشاريع أخرى.
الاتفاقيات ليست مجانية. العيب هو أنك تتخلى أحيانًا عن هياكل مجلدات غير معتادة، تسمية مخصّصة، أو تدفقات عمل مفصّلة للغاية.
الميزة هي الاتساق: جدالات أقل، مفاجآت أقل، قواعد "المعرفة القبلية" أقل التي يتذكرها القدامى فقط. الفرق تتحرّك أسرع لأن الوقت يُقضى في البناء بدل الشرح.
الاتفاقية توفر التوثيق فقط إذا كان الناس يعرفونها بالفعل — أو يمكنهم تعلمها مرة واحدة وإعادة استخدامها في كل مكان.
هذه هي قوة الأُطر الشعبية: الاتفاقيات تُدرّس على نطاق واسع، تستخدم على نطاق واسع، وتتكرر عبر قواعد شيفرة كثيرة. عندما يبقى مشروعك قريبًا من تلك الافتراضات المشتركة، تصبح الشيفرة مفهومة بشكل افتراضي مع مستندات مكتوبة أقل بكثير.
الاتفاقيات هي اختصارات مشتركة. توحّد الأسئلة التي يسألها كل زميل جديد في اليوم الأول: "أين يذهب هذا؟" و"ماذا نسميه؟" عندما تصبح الإجابات متوقعة، يمكنك استبدال صفحات التوثيق بعدد قليل من الافتراضات المتسقة.
معظم الأُطر تدفع لبنية مشروع قابلة للتعرّف: مكان للواجهة، مكان للمسارات، مكان للوصول للبيانات، مكان للاختبارات. هذا الاتساق مهم لأن الناس لا يحتاجون لقراءة دليل للعثور على "الجزء الذي يعرض صفحة" مقابل "الجزء الذي يتحدث إلى قاعدة البيانات".
أفضل الاتفاقيات تجعل المهام الشائعة تشبه الذاكرة الحركية: تضيف شاشة جديدة، تعرف بالفعل أي مجلد تنتمي إليه.
قواعد التسمية تقلّل الحاجة إلى تفسيرات مثل "المتحكّمات في X ويجب توصيلها في Y." بدل ذلك، الأسماء تلمّح للأدوار.
أمثلة شائعة:
العديد من أُطر الويب تربط الملفات بالمسارات (أو تجعل المسارات سهلة الاستنتاج). إذا يمكنك تخمين عنوان URL من اسم الملف — أو العكس — فلا تحتاج إلى وثيقة توجيه لكل ميزة.
تحدد الاتفاقية أيضًا توقعات حول المسارات الديناميكية، المسارات المتداخلة، وتعامل 404، بحيث "كيف نضيف نقطة نهاية جديدة؟" لها إجابة قياسية.
غالبًا ما تحدد الاتفاقيات أين يعيش "كود البيانات": نماذج، مستودعات، خدمات، هجرات، ملفات المخطط. حتى لو كان تطبيقك صغيرًا، وجود منزل متفق عليه لوصول البيانات يمنع استدعاءات قاعدة بيانات مرتبة في شفرة الواجهة.
أوامر قياسية (تشغيل، اختبار، بناء، تدقيق، تنسيق) تزيل الغموض. لا يجب على المطور الجديد قراءة صفحة وكيكي لمعرفة كيف يبدأ المشروع — npm test (أو ما يعادله) يجب أن يكون الخطوة الواضحة.
عندما تكون هذه المناطق الخمس متسقة، تجيب قاعدة الشيفرة نفسها عن معظم أسئلة "كيف نفعل الأشياء هنا؟".
ويكي "كيف يعمل كل شيء" يحاول وصف النظام كله بنص. غالبًا ما يبدأ مفيدًا، ثم يخرج عن التاريخ بينما تتحرك المجلدات وتتبدّل الأسماء وتظهر ميزات جديدة. تقلب الاتفاقيات تلك الفكرة: بدل قراءة شرح طويل، تقرأ البنية.
عندما يتفق الإطار (وفريقك) على أين تعيش الأشياء، يصبح المستودع قابلًا للتجوّل كشبكة شوارع.
إذا عرفت أن مكونات الواجهة في components/، وواجهات الصفحات في pages/، ومعالجات API في api/، تتوقف عن سؤال "أين X؟" لأن التخمين الأول غالبًا صحيح. حتى عندما لا يكون كذلك، يصبح بحثك محصورًا: ليس في أي مكان — بل في عدد قليل من الأماكن المتوقعة.
تجعل الاتفاقيات أيضًا أسماء الملفات والرموز تحمل معنى. يستطيع القادم الجديد استنتاج السلوك من الموقع والتسمية:
user.controller من المرجح أن يتعامل مع منطق الطلباتUserService يحتمل أن يحتوي قواعد العملmigrations/ على الأرجح يحتوي تغييرات قاعدة بيانات مرتبة "تشغل مرة واحدة"تقلّل تلك الاستنتاجات أسئلة "اشرح لي المعمارية" إلى أسئلة أصغر يمكن الإجابة عنها بسهولة ("هل هذه الخدمة مسموح لها استدعاء قاعدة البيانات مباشرة؟").
أسرع طريقة لتعزيز الخريطة هي التكويين (scaffolding). القوالب المبدئية والمولّدات تخلق ميزات جديدة بالشكل "الصحيح" افتراضيًا — المجلدات، أسماء الملفات، الأسلاك الأولية، وغالبًا الاختبارات.
هذا مهم لأن الاتفاقيات تساعد فقط عندما تُطبّق باستمرار. القالب هو حاجز توجيهي: يدفع كل مسار أو مكوّن أو وحدة جديدة للشكل المتوقع، بحيث تبقى قاعدة الشيفرة قابلة للقراءة من دون صفحات وكيكي إضافية.
إذا حافظت على قوالب داخلية، اربطها من صفحة انخراط قصيرة (مثل /docs/getting-started) ودع بنية المجلدات تفعل الباقي.
غالبًا ما تعمل اتفاقيات الإطار كتعليمات مدمجة هادئة. بدل كتابة صفحة تشرح "أين تذهب الأشياء" أو "كيف نوصل هذا"، يقرر الإطار ذلك بالفعل — ويتعلم الفريق قراءة البنية.
Rails مشهور بمبدأ الاتفاقية بدل التهيئة. مثال بسيط: إذا أنشأت متحكّمًا باسم OrdersController، تفترض Rails وجود مجلد القوالب المطابق في app/views/orders/.
تلك الاتفاقية الواحدة يمكن أن تستبدل جزءًا من التوثيق الذي يشرح عادةً:
النتيجة: يمكن للزملاء الجدد إضافة صفحة باتّباع نمط المجلدات من دون السؤال "أين يذهب هذا الملف؟"
يشجّع Django بنية "التطبيق" المتسقة. عندما يرى أحدهم تطبيق Django، يتوقع العثور على models.py لأشكال البيانات، views.py لمعالجة الطلبات، وtemplates/ لملفات HTML.
كان من الممكن كتابة دليل طويل يصف تشريح مشروعك، لكن افتراضات Django تُعلّم ذلك بالفعل. عندما يريد الزميل تغيير مظهر صفحة، يعلم أن ينظر إلى templates/. عندما يحتاج لتعديل البيانات المخزنة، يبدأ في models.py.
النتيجة: إصلاحات أسرع، وقت بحث أقل، ومرات أقل من "أي ملف يتحكم بهذا؟".
تقلّل Next.js التوثيق بجعل التوجيه انعكاسًا مباشرًا لبنية المجلدات. أنشئ ملفًا في app/about/page.tsx (أو pages/about.tsx في الإعدادات الأقدم)، وستحصل تلقائيًا على صفحة /about.
هذا يزيل الحاجة لتوثيق يشرح:\n\n- كيفية تسجيل المسارات\n- كيفية تسمية المسارات اتساقيًا\n- كيفية إضافة صفحة جديدة دون كسر التنقل
النتيجة: الانخراط أبسط — يمكن للناس اكتشاف شكل الموقع بمجرد مسح الأدلة.
Rails، Django، وNext.js تختلف في المظهر، لكن المبدأ واحد: الافتراضات المشتركة تحول بنية المشروع إلى تعليمات. عندما يثق الجميع بنفس الاتفاقيات، تجيب قاعدة الشيفرة نفسها عن كثير من أسئلة "كيف نفعل هذا هنا؟" — دون حاجة لمستند آخر يُصان باستمرار.
تبدو اتفاقيات الإطار "غير مرئية" عندما تعمل. يمكنك التخمين بمكان الملفات، ماذا تسمي، وكيف يمر الطلب عبر التطبيق. تعود الحيرة عندما تنحرف قاعدة الشيفرة عن تلك الافتراضات المشتركة.
تبدي بعض الأنماط نفسها مبكرًا:
UserService، وآخر UsersManager، وآخر user_service\n- أنماط مرتجلة تتغير من شاشة إلى شاشة أو من نقطة نهاية إلى أخرى ("عالجناها هنا بشكل مختلف لأن...") دون توجيه ثابتلا شيء من هذه خاطئ تلقائيًا — لكنها تعني أن الزميل الجديد لا يمكنه الاعتماد على "خريطة" الإطار بعد الآن.
تبدأ أغلب انهيارات الاتفاقية بتحسين محلي معقول: "الميزة هذه خاصة، لذا سنضعها هنا" أو "هذه التسمية تقرأ أفضل." المشكلة أن الاستثناءات معدية. بعد أول استثناء، يستخدم المطوّر التالي ذلك كسابقة:\n\n- ميزة ثانية تنسخ المجلد المخصّص لأنه موجود بالفعل\n- ميزة ثالثة تُعدّله قليلًا لأن الثاني لم يناسب تمامًا\n- قريبًا يصبح لديك ثلاث طرق "مقبولة" لنفس الشيء
في تلك المرحلة، تتوقّف الاتفاقية عن كونها اتفاقية — وتتحول إلى معرفة قبلية محلية.
عندما تتلاشى الاتفاقيات، يتباطأ الانخراط لأن الناس لا يستطيعون التوقّع أين ينظرون. تستغرق المهام اليومية وقتًا أطول ("أي المجلدات الحقيقية؟"), وتزداد الأخطاء (ربط الوحدة الخاطئة، استخدام نمط تسمية خاطئ، تكرار المنطق). يعوّض الفريق بجدولة مزيد من الاجتماعات، كتابة شروحات أطول في PR، وإضافة "توثيق سريع" يتقادم.
خصص فقط عندما يكون لديك سبب واضح — واترك ملاحظة مكتوبة.
قد تكون هذه الملاحظة خفيفة: README.md صغير داخل البنية الغريبة، أو مدخلة موجزة في /docs/decisions تشرح ما تغيّر ولماذا يستحق ذلك، وما النهج القياسي لمستقبَل العمل.
الاتفاقيات قد تزيل صفحات من الشرح، لكنها لا تلغي المسؤولية. الأجزاء التي لا تزال بحاجة لتوثيق هي حيث يختلف مشروعك عن افتراضات المطوّرين غالبًا.
تخطّ إعادة شرح سلوك الإطار القياسي. بدلاً من ذلك، سجّل القرارات التي تؤثر على سير العمل اليومي:\n\n- ما اخترتم (وماذا لم تختاروا)\n- ما تغيّر (ومتى)\n- لماذا تغيّر (التنازلات، القيود، إصلاحات مدفوعة بحوادث)
مثال: "نستخدم مجلدات ميزات تحت /src/features بدل مجلدات طبقية (/src/components, /src/services) لأن الملكية تتطابق مع الفرق وتقلّل الترابط بين الفرق." جملة واحدة كهذه تمنع أسابيع من الانحراف البطيء.
عندما يكون الاستثناء مهمًا محليًا، ضع الملاحظة محليًا. README.md صغير داخل المجلد، أو تعليق رأس صغير في أعلى الملف، غالبًا ما يتفوّق على ويكي مركزي لا يراجعه أحد.
مرشحو الملاحظات الجيدة:\n\n- دليل يكسر بنية المشروع المعتادة لسبب\n- وحدة يجب تهيئتها بترتيب غير اعتيادي\n- قاعدة تسمية تبدو "خاطئة" إلا إذا عرفت القيد
اجعل هذه الملاحظات قصيرة وقابلة للتنفيذ: ما المختلف، لماذا مختلف، وماذا تفعل بعد ذلك.
امتلك صفحة خفيفة واحدة (غالبًا في /docs/project-rules.md أو README الجذري) تسرد فقط 5–10 اختيارات رئيسية سيتعثر الناس عندها:\n\n- قواعد التسمية التي تختلف عن افتراضات الإطار\n- بنية المشروع المتوقعة (فقط حيث تختلف)\n- "الطريق الذهبي" لإضافة ميزة جديدة أو نقطة نهاية
هذه ليست دليلًا كاملاً — بل مجموعة من الحواجز الإرشادية.
حتى مع الاتفاقيات، يتوقف الانخراط عندما لا يستطيع الناس تشغيل التطبيق. أضف قسمًا قصيرًا "كيف تشغّل/تختبر" يطابق الأوامر القياسية وإعدادك الفعلي.
إذا كان الأمر الافتراضي هو npm test لكن مشروعك يتطلب npm run test:unit، وثّق ذلك صراحة.
يبقى التوثيق دقيقًا عندما يُعامل كجزء من التغيير. في المراجعات، اطلب: "هل أضاف هذا استثناءً جديدًا؟" إذا كان الجواب نعم، اشترط الملاحظة الموافقة (README محلي، قواعد المشروع، أو بدء سريع) في نفس طلب الدمج.
إذا كانت الاتفاقيات هي "الافتراضات المشتركة" لقاعدة الشيفرة، فالأتمتة هي ما يجعلها حقيقية. بدل مطالبة كل مطوّر بتذكر قواعد من صفحة، اجعل القواعد قابلة للتنفيذ — ليطبّق المشروع نفسه القواعد.
إعداد جيد يلتقط التآكل مبكرًا وبهدوء:\n\n- التنسيق: التنسيق التلقائي عند الحفظ وفي CI (مثل Prettier، gofmt، black) بحيث تختفي نقاشات الأسلوب.\n- قواعد lint: منع أخطاء شائعة وفرض قواعد التسمية (مثل قواعد React hooks، استيرادات غير مستخدمة، "لا للتصدير الافتراضي" إذا كان هذا معياركم).\n- تسمية وبنية الاختبارات: فرض أنماط مثل *.spec.ts، صياغة describe/it، أو تأكيدات مطلوبة لتقرأ الاختبارات بتناسق.\n- حدود المجلدات: منع استيرادات تنتهك المعمارية المقصودة (مثل "لا تستورد الميزات من ميزات أخرى" أو "الواجهة لا تستورد كود الخادم"). أدوات مثل قواعد ESLint، قيود TypeScript، أو سكربتات مخصصة يمكنها فعل ذلك.
تستبدل هذه الفحوص فقرات "من فضلك تذكّر…" بنتيجة بسيطة: الشيفرة إما تطابق الاتفاقية أو لا تطابق.
تتألق الأتمتة لأنها تفشل مبكرًا:\n\n- تُكتشف المشكلات أثناء التطوير المحلي أو في طلب الدمج، لا بعد أسابيع\n- يقضي المراجعون وقتًا أقل في مراقبة الأسلوب ووقتًا أكثر في منطق المنتج\n- يتعلم الموظفون الجدد الاتفاقيات برؤية أخطاء واضحة وحلولها
أفضل مجموعات القواعد صغيرة ومملة. ابدأ بافتراضات الإطار، ثم أضف فقط ما يحمي الوضوح (التسمية، البنية، والحدود). كل قاعدة إضافية هي شيء آخر يجب أن يفهمه الناس، لذا عامل القواعد الجديدة ككود: أضفها عندما تحل مشكلة متكررة، واحذفها عندما تتوقف عن المساعدة.
عندما تتبع قاعدة الشيفرة اتفاقيات الإطار، يمكن للاختبارات أن تفعل أكثر من "إثبات أن الشيء يعمل". يمكنها توضيح ما يُفترض أن يفعله النظام بلغة بسيطة، مباشرةً بجانب التنفيذ.
قاعدة مفيدة: اختبار واحد يصف سلوكًا واحدًا شاملًا. إذا استطاع من يقرأ اسم الاختبار أن يفهم الوعد الذي يقدمه النظام، فقد قلّلت الحاجة لتوثيق منفصل.
الاختبارات الجيدة تتبع إيقاعًا بسيطًا:\n\n- Arrange: جهّز نقطة بداية واقعية\n- Act: نفّذ فعلًا واحدًا\n- Assert: تحقق من النتيجة المهمة
الأفضل أن يكون الاسم مرآة لنية المستخدم:\n\n- signing_in_with_valid_credentials_redirects_to_dashboard\n- checkout_fails_when_shipping_address_is_missing
تلك الأسماء هي "توثيق" لا يمكنك نسيان تحديثه — لأن الاختبارات الفاشلة تفرض المحادثة.
اختبارات القبول (أو ميزات) ممتازة في توثيق كيف يتصرّف المنتج من منظور المستخدم.
سلوكيات يمكن لاختبارات القبول وصفها:\n\n- يسجّل المستخدم، يؤكّد بريده، ويصل إلى صفحة الترحيب\n- ينشئ المشرف رمز خصم ويُطبّق أثناء الدفع
تجيب هذه الاختبارات على سؤال "ماذا يحدث عندما أفعل X؟" — وغالبًا ما يكون هذا أول ما يحتاجه زميل جديد.
تتألّق اختبارات الوحدات عندما تحتاج لتوثيق "قواعد صغيرة لكنها مهمة":\n\n- سلوك التقريب\n- قواعد التحقق\n- فحوصات الأذونات\n- حالات الحافة المعقّدة (المناطق الزمنية، الحدود، الحالات الفارغة)
هي قيّمة بشكل خاص عندما لا تكون القاعدة واضحة من افتراضات الإطار.
يمكن أن تكون بيانات العيّنات توثيقًا حيًا أيضًا. تجهيز صغير ومسماه جيدًا (مثل user_with_expired_subscription) يعلّم المجال أسرع من فقرة في ويكي.
المفتاح هو الاعتدال: اجعل التجهيزات مختصرة، قابلة للقراءة، ومرتبطة بفكرة واحدة، حتى تبقى أمثلة موثوقة بدل أن تصبح نظامًا ثانويًا يجب صيانته.
قوالب البداية (والمولّدات خلفها) هي أسرع طريقة لتحويل "كيف نفعل الأشياء هنا" إلى شيء يتبعه الناس فعليًا. بدل أن تطلب من كل عضو فريق تذكر المجلدات والسكربتات والأدوات الصحيحة، تشفر تلك القرارات في مستودع يبدأ بشكل صحيح.
يقلّل الثلاثة "دين التوثيق" لأن الاتفاقية مشفّرة في نقطة البداية، لا مكتوبة في ويكي يتقادم.
عمليًا، هنا يبرز دور أدوات مثل Koder.ai: عند توليد تطبيق React جديد، backend بـ Go، مخطط PostgreSQL، أو عميل Flutter من سير دردشة، يمكنك الحفاظ على الفرق على "الطريق الذهبي" بجعل الإخراج الافتراضي يطابق اتفاقياتك (ثم تصدير الشيفرة المصدرية إلى المستودع).
معظم اللبس أثناء الانخراط ليس حول منطق العمل، بل حول أين تعيش الأشياء وكيف تشغّل. القالب الجيد يجعل المهام الشائعة متطابقة عبر المستودعات: نفس السكربتات، نفس أسماء المجلدات، نفس أوامر التحقق، ونفس توقعات PR.
إن لم تفعل شيئًا آخر، اتفق على:\n\n- مجلدات متوقعة (مثل /src, /test, /docs للملاحظات فقط)\n- طريقة واحدة للتثبيت والتشغيل عبر سكربتات الحزم (install + dev)\n- سكربتات test, lint, وformat\n- CI افتراضي يشغّل تلك السكربتات تلقائيًا
اجعلها صغيرة بحيث لا يتخطاها الفرق:\n\n1. بنية المجلدات وقواعد التسمية\n2. أمر إعداد واحد (مثل install + dev)\n3. سكربتات test, lint, وformat\n4. CI يعمل على كل PR\n5. README أساسي: الغرض، المتطلبات، و3–5 أوامر يحتاجها الناس
أكبر خطر هو نسخ قالب قديم "لأنه نجح العام الماضي." التبعيات القديمة، السكربتات الباقية، أو أنماط متخلّفة تنتشر بسرعة عندما تكون في قوالب البداية.
عامل القوالب كمنتجات: versionها، راجعها بجدول زمني، وحدثها عندما تتغير اتفاقياتك. (إذا منصتك تدعم لقطات واستعادة — كما تفعل Koder.ai — استخدم ذلك للتكرار بأمان على القوالب دون كسر الأساس للجميع.)
تقليل التوثيق لا يعني ترك الناس يخمنون. يعني جعل "المسار السعيد" متسقًا بحيث تجيب معظم الأسئلة بنفسها، وفقط الأجزاء غير العادية تُدوّن.
ابحث عن الأماكن التي يكرر فيها الناس نفس الأسئلة على Slack، تعليقات PR، الاجتماعات، أو جلسات الانخراط. بعض الأسئلة الدافعة:\n\n- "أين يجب أن يعيش هذا الملف؟"\n- "بماذا نسمي هذا الشيء؟"\n- "كيف أضيف صفحة/وظيفة/نقطة نهاية جديدة؟"\n- "لماذا يعمل هذا بشكل مختلف في هذا الموديول؟"
إذا سمعت نفس السؤال مرتين، فربما لا تحتاج المزيد من النص — تحتاج اتفاقية.
لكل سؤال متكرر، قرّر أي من التالي صحيح:\n\n- نحارب الإطار: عد لافتراضات الإطار (التوجيه، بنية المجلد، التسمية، معالجة الأخطاء). الافتراضات موثقة بالفعل في النظام البيئي.\n- لدينا سبب وجيه للاختلاف: احتفظ بالانحراف، لكن اجعله صريحًا وسهل الاكتشاف.
قاعدة مفيدة: إذا لم يوفر الانحراف وقتًا حقيقيًا أو لا يقلّل مخاطرة حقيقية، فربما لا يستحق الالتباس المستمر.
حافظ على صفحة قصيرة واحدة (مثل /docs/conventions) تسرد:\n\n- 5–10 اتفاقيات يجب أن يفترضها الجميع\n- المجموعة الصغيرة من الاستثناءات (مع السبب ومثال)
حدد نفسك على ما يحتاجه الشخص في أسبوعه الأول فقط. إذا بدأت الصفحة تكبر، فغالبًا علامة على أنه يجب تبسيط قاعدة الشيفرة بدلاً من توثيقها.
التطبيقات تتطوّر. جدولة مراجعة رقيقة ربع سنوية:\n\n- ما الأنماط الجديدة التي ظهرت؟\n- أي استثناءات أصبحت "طبيعية" (ويجب أن تصبح اتفاقية)؟\n- ما الاتفاقيات التي يتجاهلها الناس (ولماذا)؟
فضل افتراضات الإطار كلما أمكن، ودوّن فقط ما يختلف — بوضوح، باختصار، وفي مكان واحد.
اتفاقيات الإطار هي الأنماط الافتراضية التي يتوقعها الإطار منك اتباعها — مثل بنية المجلدات، التسمية، التوجيه، الوصول إلى البيانات، والأوامر الشائعة. عندما تلتزم بها، يستطيع المطورون الآخرون استنتاج مكان الملفات وكيف تعمل دون قراءة توثيق خاص بالمشروع.
لأنه من الصعب المحافظة على دقة النصوص الوصفية مع تغيّر قاعدة الشيفرة. التوثيق موجود بشكل أساسي لي:
الاتفاقيات تغطي أول أمرين عن طريق جعل البنية متوقعة.
لا. الاتفاقيات تقلل من الحاجة إلى توثيق الأمور الواضحة (مكان وضع الملفات، كيفية توصيل المسارات)، لكنك لا تزال بحاجة لتوثيق ما يخص المشروع تحديدًا: قواعد العمل، الانحرافات المقصودة، والقرارات الأساسية. فكر فيها كـ «توثيق أقل، لكن ذي قيمة أعلى».
تجعلها متوقعة وتجيب عن أسئلة اليوم الأول المتكررة:
عندما تتبع الشيفرة نمطًا معروفًا، تصبح شجرة الدليل وأسماء الملفات بمثابة لافتات إرشادية. يمكن للقادم الجديد التنقّل وفق التوقع (مثلاً: «القوالب في templates/»، «الهجرات في migrations/») بدل قراءة صفحة معمارية طويلة قديمة.
لأنها تُشفّر الاتفاقيات كقوالب افتراضية حتى لا يعتمد الناس على الذاكرة. الأُطر الجيدة/الملتقطعات تولّد:
هذا يمنع الانحراف ويُبقي «الخريطة» متسقة عبر الميزات.
تظهر عندما لا يستطيع المطورون توقع مكان الملفات أو أسمائها. إشارات التحذير الشائعة:
UserService ضد UsersManager ضد user_service)حينها يتعوّض الفريق بشرح عبر Slack، مراجعات أطول، ووثائق سريعة تتقادم.
خصص فقط عندما يكون هناك فائدة واضحة، ثم اترك ملاحظة خفيفة تشرح الانحراف:
README.md صغير داخل المجلد غير الاعتيادي/docs/decisions أو ما يشابههسجّل ما تغيّر، ولماذا، وما الأسلوب القياسي للمستقبل.
ابدأ بقاعدة عملية وصغيرة:
اجعلها خفيفة واختبر تحديثها ضمن مراجعات الكود عند إدخال استثناء جديد.
اجعل الاتفاقيات قابلة للتنفيذ باستخدام الأتمتة بدلاً من مطالبة الجميع بحفظ القواعد:
عندما تفشل هذه الفحوص محليًا أو في PR، يتعلم المطورون القواعد فورًا والمراجعين يقضون وقتًا أقل في مراقبة الأسلوب.
عندما تكون هذه الأشياء متوقعة، يصبح المستودع نفسه ذا تفسير ذاتي.