لماذا طلبات السحب (Pull Requests) أهم من مراجعة الكود
لقد كنت تعمل على ميزة لمدة يومين. الكود يترجم، الاختبارات تمر على جهازك، وأنت واثق أنها تعمل. تدفع فرعك (branch)، وتفتح طلب سحب (merge request)، وفي غضون دقائق يعلق مطور آخر: "هذا المنطق ينهار عندما لا يكون لدى المستخدم صلاحيات." لقد فاتتك تلك الحالة الحدية. بدون طلب السحب، كان هذا الخطأ سينتقل مباشرة إلى قاعدة الكود المشتركة ويصل إلى الإنتاج.
تلك هي اللحظة التي تتوقف فيها طلبات السحب عن كونها إجراءً شكليًا وتبدأ في كونها شبكة أمان.
المشكلة مع الدمج المباشر
عندما يدمج المطورون مباشرة في الفرع الرئيسي (main branch)، لا يوجد نقطة تفتيش. يمكن لأي شخص دفع التغييرات في أي وقت دون معرفة ما إذا كانت هذه التغييرات صحيحة، أو ما إذا كانت تقدم آثارًا جانبية، أو ما إذا كانت تطابق ما تم طلبه بالفعل. يعمل الفريق على الثقة فقط، والثقة لا تكتشف أخطاء المنطق، أو الحالات الحدية المفقودة، أو العواقب غير المقصودة.
الدمج المباشر يعمل عندما تكون الشخص الوحيد الذي يلمس الكود. بمجرد أن يكون لديك فريق، حتى لو كان فريقًا من اثنين، فأنت بحاجة إلى طريقة لفحص التغييرات قبل أن تصبح جزءًا من قاعدة الكود المشتركة.
ما يفعله طلب السحب فعليًا
طلب السحب هو طلب رسمي لدمج التغييرات من فرع إلى آخر، عادةً من فرع الميزة (feature branch) إلى الفرع الرئيسي. لكن الآلية نفسها أقل أهمية مما تتيحه.
عندما يفتح مطور طلب سحب، فهو لا يدمج تغييراته. إنه يرسل دعوة لبقية الفريق: "انظروا إلى هذا. أخبروني إذا كان صحيحًا."
هذا يحول الدمج من إجراء فردي إلى نقاش جماعي. يمكن للمطور الذي فتح الطلب أن يشرح ما تغير ولماذا. يمكن لأعضاء الفريق الآخرين النظر إلى كل ملف تم تعديله، وقراءة الكود سطرًا بسطر، وترك تعليقات. يمكنهم طرح الأسئلة، واقتراح التحسينات، أو طلب التوضيح. كل جزء من تلك المحادثة يتم تسجيله داخل طلب السحب، بحيث يمكن لأي شخص العودة لاحقًا إلى الأساس المنطقي وراء التغيير.
يوضح المخطط الانسيابي التالي كيف يحول طلب السحب الدمج الفردي إلى عملية يتحقق منها الفريق مع سجل دائم:
أبعد من مراجعة الكود: فحص المخاطر
طلبات السحب ليست فقط لاكتشاف أخطاء بناء الجملة أو انتهاكات الأسلوب. إنها المكان الذي يتحقق فيه الفريق من المخاطر.
- هل يؤثر هذا التغيير على أجزاء أخرى من التطبيق؟
- هل يتعارض مع عمل يقوم به شخص آخر على فرع مختلف؟
- هل تم اختباره بشكل صحيح؟
- هل هناك آثار أمنية؟
تقوم العديد من الفرق بدمج خط أنابيب التكامل المستمر (CI pipeline) مباشرة في طلبات السحب. في كل مرة يدفع فيها مطور commit جديد، يقوم خط الأنابيب تلقائيًا بتشغيل عمليات البناء والاختبارات. تظهر النتائج مباشرة داخل طلب السحب: بناء ناجح، اختبارات فاشلة، تغطية منخفضة، أو فحص أمني وجد ثغرة. يمكن للفريق رؤية ما إذا كان التغيير آمنًا للدمج على الفور، دون مغادرة واجهة المراجعة.
هذا يحول طلب السحب إلى مصدر وحيد للحقيقة حول جاهزية التغيير. لا تحتاج إلى السؤال "هل قمت بتشغيل الاختبارات؟" يجيب خط الأنابيب على هذا السؤال تلقائيًا.
خطوة الموافقة
بمجرد انتهاء النقاش واتفاق الجميع على أن التغيير جاهز، يحتاج طلب السحب إلى موافقة. الموافقة هي الإشارة الرسمية على أن التغيير تمت مراجعته ويعتبر آمنًا للدمج.
يعتمد عدد الموافقات التي تحتاجها على فريقك ومدى تحملك للمخاطر. قد يكون الفريق الصغير بخير مع موافقة واحدة من مطور آخر. قد يتطلب فريق أكبر أو مشروع يتعامل مع بيانات حساسة موافقتين أو ثلاث، بما في ذلك توقيع من مهندس أول أو قائد تقني. تطلب بعض الفرق أيضًا موافقة من أدوار محددة، مثل مسؤول قاعدة البيانات لتغييرات المخطط (schema) أو مهندس أمن للكود المتعلق بالمصادقة.
المفتاح ليس عدد الموافقات. المفتاح هو أن شخصًا آخر غير المؤلف نظر إلى التغيير وقال "نعم، هذا جاهز."
سجل التدقيق الذي لم تكن تعلم أنك بحاجة إليه
الجزء الأكثر قيمة في طلب السحب ليس المراجعة نفسها. إنه السجل الذي يتركه وراءه.
كل طلب سحب يلتقط:
- من قام بالتغييرات
- من راجعها
- ما هي التعليقات التي أثيرت
- ما هي التغييرات التي تم إجراؤها بعد المراجعة
- متى تم دمج التغييرات أخيرًا
يصبح سجل التدقيق هذا حاسمًا عندما يحدث خطأ ما. عندما يظهر خطأ في الإنتاج وتحتاج إلى تتبع مصدره، يخبرك طلب السحب بالضبط متى دخل التغيير إلى قاعدة الكود، ومن وافق عليه، وما هو الأساس المنطقي الذي تم تقديمه في ذلك الوقت. يساعد أيضًا أثناء تدقيقات الامتثال، عندما تحتاج إلى إثبات أن التغييرات مرت بعملية خاضعة للرقابة قبل الوصول إلى الإنتاج.
بدون طلبات السحب، أنت تترك للتخمين. معها، لديك جدول زمني للقرارات يمكنك متابعته من البداية إلى النهاية.
طلبات السحب تفتح البوابة، لا تغلقها
طلب السحب هو البوابة التي تضمن أن كل تغيير يجتاز الفحص قبل أن يدخل قاعدة الكود المشتركة. لكن طلب السحب نفسه يفتح البوابة للمراجعة فقط. بمجرد اكتمال المراجعة والموافقة على التغيير، لا تزال هناك خطوات يجب اتخاذها: دمج التغيير في الفرع الرئيسي، ووضع علامة إصدار (tagging a version)، ونشره إلى الإنتاج.
طلب السحب ليس نهاية عملية التسليم. إنه نقطة التفتيش التي تجعل بقية العملية أكثر أمانًا.
قائمة مراجعة عملية لطلبات السحب
- هل يشرح وصف طلب السحب ما تغير ولماذا؟
- هل فحوصات CI ناجحة قبل طلب المراجعة؟
- هل قام شخص واحد على الأقل لم يكتب الكود بمراجعة كل سطر؟
- هل تم حل التعليقات قبل الدمج؟
- هل عدد الموافقات مناسب لمستوى مخاطرة التغيير؟
الخلاصة الملموسة
طلبات السحب موجودة لأن الدمج محفوف بالمخاطر بحيث لا يمكن تركه لشخص واحد. إنها تحول الإجراء الفردي إلى محادثة جماعية، وتكشف عن المخاطر قبل وصولها إلى الإنتاج، وتترك سجلاً دائماً لكل قرار تم اتخاذه على طول الطريق. إذا كان فريقك لا يستخدم طلبات السحب، ابدأ غدًا. إذا كان فريقك يستخدمها بالفعل، تعامل معها على أنها أكثر من مجرد مربع اختيار. إنها خط دفاعك الأول ضد التغييرات السيئة التي تصل إلى المستخدمين.