Software Engineering30 أبريل 20268 min read

أعلام الميزات والتطوير القائم على الجذع (Trunk-Based)

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

بقلم Innovation T Team


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

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

النشر ليس هو الإطلاق

الفكرة الأكثر فائدة هنا هي أن نشر الكود وإطلاق الميزة حدثان مختلفان، وينبغي أن تكون قادرًا على القيام بأحدهما دون الآخر.

في النموذج القديم، هما ملحومان معًا. يصل الكود إلى الإنتاج، وفي تلك اللحظة يرى المستخدمون السلوك الجديد. هذا الاقتران هو ما يجعل الإصدارات مخيفة، لأن الطريقة الوحيدة للاختبار في بيئة حقيقية هي كشفها للجميع دفعة واحدة، والطريقة الوحيدة للتراجع عن إصدار سيّئ هي إعادة النشر.

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

ما الذي يعنيه التطوير القائم على الجذع فعليًا

التطوير القائم على الجذع هو نموذج تفريع يلتزم فيه الجميع بفرع مشترك واحد، الجذع، مرة واحدة يوميًا على الأقل. الفروع، إن وُجدت أصلًا، تعيش ساعات وتُدمج في اليوم نفسه.

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

قارن هذا بفروع الميزات طويلة العمر. الفرع الذي يبقى أسبوعين ينحرف بصمت عن الجذع. وبحلول وقت الدمج، تكون تُوفّق بين التباعد المتراكم للفريق بأكمله، وكلما كبُر الدمج، ارتفع احتمال حدوث عطل. يرفض التطوير القائم على الجذع السماح لهذا الدَّين بالتراكم. تُدمج صغيرًا، وتُدمج كثيرًا، وكل عملية دمج مملّة.

الاعتراض البديهي هو: كيف أدمج كود ميزة نصف منجزة دون كسر الإنتاج؟ هذه بالضبط الفجوة التي تسدّها أعلام الميزات.

أين تندرج أعلام الميزات

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

ليست كل الأعلام متماثلة، والتعامل معها كشيء واحد خطأ شائع. لها أعمار مختلفة ومُلّاك مختلفون.

الأنواع الأربعة للأعلام

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

الخلط بين هذه الفئات هو حيث تنحرف أنظمة الأعلام. عَلم إطلاق يُعامل كعَلم صلاحيات لا يُحذف أبدًا، وبعد ستة أشهر لا يتذكر أحد ما إذا كان من الآمن إزالته.

سير عمل يصمد في 2026

إليك حلقة ملموسة نستخدمها ونوصي بها للفرق المنتقلة إلى التسليم المستمر. تفترض مجموعة اختبارات متينة وخدمة أعلام حقيقية بدلًا من متغيرات بيئة مبعثرة.

  1. قسّم العمل إلى شرائح رأسية رفيعة. جزّئ الميزة إلى قطع صغيرة بما يكفي للدمج في يوم واحد، كل منها مسار كامل عبر المكدس حتى لو خدم مستخدمين داخليين فقط في البداية.
  2. لُفّ المسار الجديد داخل عَلم إطلاق، مُطفأ افتراضيًا. أول commit على الإطلاق يُدخل العَلم. وكل ما يليه يعدّل كودًا مُعتمًا بالفعل في الإنتاج.
  3. ادمج في الجذع يوميًا خلف العَلم. تصل تغييراتك إلى الإنتاج باستمرار، تختبرها الـ CI واختبارات التكامل، لكنها غير مرئية للمستخدمين لأن العَلم مُطفأ.
  4. فعّل العَلم داخليًا أولًا. فعّله لفريقك وحسابات موظفيك. جرّب الشيء الحقيقي في البيئة الحقيقية قبل أن يراه أي عميل.
  5. ارفع الطرح تدريجيًا بنسبة مئوية. انتقل إلى واحد بالمئة من حركة المرور، ثم إلى مجموعة أوسع، وأنت تراقب معدلات الأخطاء وزمن الاستجابة والمقياس التجاري الذي يُفترض أن تحرّكه الميزة.
  6. راقب مقاييس الحماية في كل خطوة. اربط الطرح بالتنبيهات. إذا استُهلكت ميزانيات الأخطاء أو تراجع مقياس رئيسي، فلديك إشارة للإيقاف المؤقت أو التراجع قبل أن يتأثر معظم المستخدمين.
  7. تراجع بالتبديل، لا بالنشر. إذا انكسر شيء، أطفئ العَلم. الإصلاح فوري وبلا لوم، وتُصحّح الخطأ على مهل والكود لا يزال آمنًا في الجذع.
  8. تخلّص من العَلم بعد اكتمال الطرح. بعد أن تصل الميزة إلى مئة بالمئة وتستقر، احذف العَلم وفرع الكود الميت في السبرنت نفسه. هذه الخطوة ليست اختيارية.

هذه الخطوة الأخيرة هي حيث تفشل معظم الفرق، ولذلك تستحق انضباطها الخاص.

نظافة الأعلام: سداد دَين الأعلام

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

أبقِ الدَّين منخفضًا ببضع عادات:

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

في خبرتنا، الفرق التي تبقى سريعة ليست تلك التي تضيف الأعلام بأسرع وتيرة. بل هي تلك التي تزيلها بالسرعة نفسها.

المقايضات وأنماط الفشل

هذا النموذج ليس مجانيًا، والتظاهر بغير ذلك يُعرّض الفرق للاحتراق.

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

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

تسافر الأعلام أيضًا على طول حدود الـ API لديك، لذا تهمّ العقود التي تكشفها. عندما يغيّر تغيير خاضع لعَلم شكل استجابة أو سلوك نقطة نهاية، تحميك المبادئ الواردة في مقالنا حول تصميم واجهات API يحبها المطورون من إطلاق تغيير كاسر خلف مفتاح يبدو بريئًا.

كيف يمكن لـ Innovation T أن تساعد

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

في Innovation T، هذا بالضبط نوع العمل الهندسي الذي نقوم به. نساعد الفرق على الانتقال من الفروع طويلة العمر والإصدارات المرهوبة إلى تدفق هادئ ومستمر: إعداد سير عمل قائم على الجذع، وربط أعلام الميزات بخط أنابيب CI و CD، وتحديد أدلة الطرح والتراجع، وبناء نظافة الأعلام التي تُبقي قاعدة الكود نظيفة بعد عام. استكشف خدماتنا في هندسة البرمجيات والسحابة، أو تواصل معنا للحديث عن كيفية إطلاق فريقك اليوم وأين يكمن الاحتكاك فعلًا.

#أعلام الميزات#التطوير القائم على الجذع#التسليم#الهندسة

جاهز للبناء مع Innovation T؟

سواء كان الأمر يتعلق بالأمن أو النمو أو الهندسة، يمكن لفريقنا مساعدتك على تنفيذه بإتقان.