Git وتدفقات العمل التعاونية

إتقان مراجعة الكود

18 دقيقة الدرس 7 من 28

إتقان مراجعة الكود

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

طلبات السحب: تشريح تغيير قابل للمراجعة

المؤشر الأقوى على جودة المراجعة هو حجم الفرق. طلب السحب الذي يحتوي على 50–200 سطر مُعدَّل يُراجَع بعناية؛ أما الذي يحتوي على 2000 سطر فيُصادَق عليه دون تمحيص لأنه لا يستطيع أي مراجع الإمساك بالسياق الكامل في ذاكرة العمل. في Google، يعرض نظام المراجعة الداخلي (Critique) درجة صحة تتدهور بشكل حاد بعد 400 سطر. السبب إدراكي: يبدأ المراجعون بالتصفح السطحي، ويفوتهم أخطاء المنطق، ويوافقون فقط لرفع الحصار عن المؤلف.

  • قضية واحدة لكل طلب سحب. إعادة الهيكلة وإضافة الميزة وإصلاح الخطأ ثلاثة طلبات سحب منفصلة — لا ثلاثة أقسام في طلب سحب واحد ضخم.
  • راجع عملك أولاً. افتح الفرق الخاص بك في واجهة GitHub قبل طلب المراجعين. ستكتشف 30–40 % من التعليقات قبل أن يراها أي شخص آخر.
  • اكتب وصفاً ذا معنى. اشرح لماذا التغيير موجود، واربط التذكرة، وصف نهج الاختبار، وأشر إلى أي مقايضات مقصودة. لا ينبغي أن يضطر المراجعون إلى التبديل إلى Jira لفهم ما يقرؤونه.
  • طلبات السحب المسودة للحصول على تغذية راجعة مبكرة. افتح طلب سحب في وضع المسودة بمجرد أن يكون لديك هيكل أولي. هذا يدعو إلى نقاش معماري قبل أن تستثمر أياماً في الاتجاه الخاطئ.
الممارسة الاحترافية: لا يمكن دائماً تقسيم الميزات الكبيرة إلى طلب سحب واحد من 150 سطراً. استخدم طلبات السحب المتراصة — كل طلب سحب يستهدف الفرع السابق، لا main. يدعم GitHub وأدوات مثل Graphite هذا بشكل أصلي. يقرأ المراجعون كل طبقة باستقلالية؛ والدمج النهائي يكون دمجاً نظيفاً على main.

قالب طلب السحب: سياق متسق على النطاق الواسع

يفرض قالب طلب السحب الحد الأدنى من السياق الذي يحتاجه كل مراجع. ضع ملف PULL_REQUEST_TEMPLATE.md في مجلد .github/ وسيملأ GitHub تلقائياً نص كل طلب سحب جديد بهذا المحتوى.

## Summary <!-- فقرة واحدة: ماذا يفعل هذا التغيير ولماذا؟ --> ## Changes - - ## Testing - [ ] تمت إضافة / تحديث اختبارات الوحدة - [ ] اختبارات التكامل تعمل محلياً (`make test`) - [ ] خطوات الفحص اليدوي: ## Rollback plan <!-- كيف نتراجع إذا كسر هذا الإنتاج؟ --> ## Related issues Closes #

ثقافة المراجعة: تغذية راجعة تحسّن الكود دون كسر الأشخاص

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

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

CODEOWNERS: تعيين المراجعين تلقائياً

يقوم ملف CODEOWNERS (الموضوع في .github/ أو جذر المستودع أو docs/) بتعيين أنماط مسارات الملفات للمستخدمين أو الفرق على GitHub الذين يمتلكون ذلك الكود. يطلب GitHub تلقائياً مراجعة من المالك المطابق عندما يلمس طلب السحب تلك المسارات. يزيل هذا الخطوة اليدوية لوضع علامة على المراجعين ويضمن أن الشخص الأكثر سياقاً يرى دائماً التغييرات ذات الصلة.

# .github/CODEOWNERS # الصيغة: <نمط> <مالك> [مالك2 ...] # القاعدة الأخيرة المطابقة تسود لأي ملف معين. # المالكون الافتراضيون لكل شيء لا يطابق ما يلي * @myorg/platform-team # البنية التحتية كـكود: فريق البنية التحتية مطلوب *.tf @myorg/infra-team .github/workflows/ @myorg/infra-team # خدمة المصادقة: فريق الأمان + المهندس القائد services/auth/ @myorg/security-team @alice # الواجهة الأمامية: مالكان للواجهة الأمامية src/frontend/ @bob @carol # هجرات قاعدة البيانات: فريق DBA يجب أن يوافق database/migrations/ @myorg/dba-team

عند دمجه مع قواعد حماية الفروع التي تتطلب موافقة CODEOWNERS، تحصل على ضمان صارم: لا يمكن دمج هجرة دون موافقة مهندس قاعدة البيانات، ولا يمكن لأحد تجاوزها عن طريق الخطأ. قم بتكوين هذا في GitHub ضمن Settings → Branches → Branch protection rules → Require review from Code Owners.

PR review flow with CODEOWNERS automation Author opens PR GitHub CODEOWNERS lookup Infra Team *.tf owner Security Team services/auth/ owner DBA Team migrations/ owner Branch Protection Gate push إشعار موافقة جميع المالكين وافقوا → دمج
يعيّن CODEOWNERS المراجعين تلقائياً؛ تفرض حماية الفروع جميع الموافقات قبل الدمج.

أتمتة المراجعة: دع الروبوتات تتعامل مع العمل الميكانيكي

كل تعليق يكتبه مراجع بشري حول التنسيق أو ترتيب الاستيراد أو تغطية الاختبار هو عبء إدراكي ينبغي أتمتته. الهدف هو جعل البشر يركزون على المنطق والمعمارية والسلامة — وكل شيء آخر يعمل في CI قبل أن يفتح المراجعون الفرق حتى.

# .github/workflows/pr-checks.yml name: PR Quality Gates on: [pull_request] jobs: lint: runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - name: Run ESLint run: npx eslint . --max-warnings=0 - name: Check formatting (Prettier) run: npx prettier --check . test: runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - name: Run tests with coverage run: npm test -- --coverage --coverageThreshold='{"global":{"lines":80}}' size-check: runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - name: Warn on large diffs uses: codelytv/pr-size-labeler@v1 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} xs_label: 'size/XS' s_label: 'size/S' m_label: 'size/M' l_label: 'size/L' xl_label: 'size/XL' xl_min_size: 500

إضافة أداة تصنيف حجم طلب السحب تجعل حجم الفرق مرئياً للمراجعين. تصنيف XL هو إشارة اجتماعية بأن طلب السحب يحتاج إلى تقسيم — لا سياسة مطلوبة، مجرد رؤية.

فخ الإنتاج: لا تستخدم "squash and merge" كسياسة عالمية دون تفكير. إذا كان لطلب سحب الميزة 20 commit من العمل التراكمي الهادف، فإن الضغط يدمر تاريخ السرد الذي يستخدمه المهندسون المستقبليون لفهم لماذا تم اتخاذ قرار ما. احتفظ بالضغط للـ commits الصاخبة للإصلاحات. يفتح Critique الخاص بـ Google افتراضياً على الاحتفاظ بالـ commits الهادفة وضغط فقط الإصلاحات — يتم تكراره بـ git rebase --autosquash قبل الدمج.

إغلاق الحلقة: مقاييس المراجعة المهمة

الفرق عالية الأداء تتتبع صحة المراجعة كمياً. المقاييس الأربعة للقياس (عبر API GitHub أو أداة مثل LinearB أو DX) هي: الوقت حتى أول مراجعة (الهدف أقل من 4 ساعات)، ومدة دورة المراجعة (الوقت من آخر push حتى الموافقة، الهدف أقل من 24 ساعة)، ووقت دورة طلب السحب (من الفتح حتى الدمج، الهدف أقل من يومين لمعظم التغييرات)، وعدد تكرارات المراجعة (كم جولة ذهاباً وإياباً قبل الموافقة — أكثر من 3 يشير إلى أن الوصف كان غير واضح أو طلب السحب كان كبيراً جداً). يجعل تتبع هذه المقاييس الاختناقات مرئية ويمنح الفرق هدفاً ملموساً للتحسين.

الممارسة الاحترافية: قم بإجراء مراجعة غير متزامنة أسبوعية مدتها 15 دقيقة حول مقاييس المراجعة يتم نشرها تلقائياً في قناة Slack الخاصة بفريقك. لا حاجة لاجتماع — فقط الأرقام، يملكها من هو مناوب تلك الأسبوع. هذه العادة الواحدة قلّصت وقت دورة طلب السحب بنسبة 40–60 % في فرق واسعة النطاق متعددة.