spinny:~/writing $ less openfeature-feature-flags-progressive-delivery.md
12يتم النشر عندما يصل الكود إلى مرحلة الإنتاج. الإصدار هو عندما يمكن لشخص ما استخدامه بالفعل. يعد الخلط بين الاثنين أحد أسرع الطرق لجعل كل عملية نشر لحظة متوترة بعض الشيء.34يعمل feature flag على وضع مسافة بين هاتين اللحظتين. يمكنك النشر اليوم، والبدء غدًا للفريق الداخلي، ثم للعميل التجريبي، ثم لـ 10% من المستخدمين. إذا حدث خطأ ما، قم بإيقاف تشغيل العلم. ليس عليك بالضرورة التراجع عن الإصدار بأكمله.56## العلم ليس مجرد حالة78من الناحية الفنية غالبًا ما يكون `if`. ثقافيا هو أكثر من ذلك بكثير.910```typescript11if (await flags.isEnabled('checkout.v2.enabled', context)) {12 return newCheckout(input);13}1415return oldCheckout(input);16```1718يمكن أن يمثل هذا `if` الصغير طرحًا تدريجيًا أو تجربة أو ترحيلًا أو تصريح مؤسسة أو تشغيل kill switch. المشكلة هي أنه إذا لم تقم بإدارتها بشكل جيد، فقد تصبح أيضًا ديونًا فنية تبقى في الكود لمدة عامين.1920## أين يأتي OpenFeature2122OpenFeature هي مواصفات مفتوحة لتقييم feature flag مع API مشترك. الفكرة بسيطة: لا ينبغي أن يعتمد رمز التطبيق الخاص بك بشكل مباشر على البائع أو النظام الداخلي الذي تستخدمه للأعلام.2324التطبيق يسأل:2526```typescript27const enabled = await client.getBooleanValue('checkout.v2.enabled', false, {28 targetingKey: user.id,29 plan: user.plan,30 country: user.country,31});32```3334يقرر الموفر مصدر القواعد: SaaS، الملف، الخدمة الداخلية، العلامة، تكوين GitOps. إذا قمت يومًا ما بتغيير الواجهة الخلفية لميزة وضع العلامات، فلن يلزم إعادة كتابة التطبيق في كل مكان.3536يبدو هذا الانفصال وكأنه تفصيل معماري، ولكن يتم الشعور به مع نمو المشروع.3738## السياق هو نصف المعركة3940يعد وضع العلم أو إيقافه مفيدًا للجميع، ولكنه محدود. يعيش التسليم التدريجي في السياق:4142- مستخدم داخلي أو خارجي؛43- خطة مجانية أو خطة المؤسسة؛44- قرية؛45- منظمة؛46- نسخة التطبيق؛47- نسبة مستقرة من حركة المرور.4849المفتاح المهم هو `targetingKey`: يجب أن يكون مستقرًا. إذا تغير مع كل طلب، يمكن أن ينتهي الأمر بالمستخدم مرة واحدة في المتغير (أ) ومرة في المتغير (ب). بالنسبة للتجربة، يكون الأمر فظيعًا، وبالنسبة لعملية الدفع يمكن أن يكون كارثيًا.5051## طرح معقول5253التدفق الذي يعجبني هو هذا:54551. النشر مع رفع العلم؛562. الاشتعال للمطورين وضمان الجودة.573. التشغيل للعميل التجريبي أو المستأجر.584.5% طرح؛595. الطرح بنسبة 25%؛606. طرح بنسبة 100%؛617. إزالة الرمز والعلم القديمين.6263النقطة المنسية في كثير من الأحيان هي النقطة الأخيرة. يجب أن يكون للعلم المؤقت تاريخ وفاة. إذا بقي إلى الأبد، فسيتعين على كل معيد بناء مستقبلي أن يتساءل: "ولكن هل لا يزال هذا الفرع مفيدًا؟".6465## Kill switch: جهزهم أولاً6667kill switch هي العلامة التي تنقذك عندما تبدأ تبعية خارجية في العبث بك، أو عندما تستهلك المهمة الكثير من الموارد، أو عندما ينتج المنطق الجديد أخطاء غريبة.6869يجب أن يكون kill switch جيدًا:7071- من السهل العثور عليها؛72- موثق في كتاب التشغيل؛73- يتم اختباره من حين لآخر؛74- يمكن ملاحظتها عند تفعيلها؛75- الاستقلال قدر الإمكان عن الجزء الذي يمكن أن ينكسر.7677أسوأ ما في الأمر هو أن تكتشف أثناء الحادث أن العلم موجود، لكن لا أحد يعرف ما إذا كان لا يزال يعمل أم لا.7879## قابلية الملاحظة أو التسليم غير التدريجي8081إن تشغيل الميزة بنسبة 10% دون النظر إلى المقاييس هو مجرد تفاؤل بخطوات متعددة.8283يجب أن تجيب كل عملية طرح على أسئلة بسيطة:8485- هل زادت الأخطاء؟86- هل تغير الكمون؟87- هل يكمل المستخدمون التدفق؟88- هل هناك المزيد من التذاكر أو إعادة المحاولة؟89- هل يؤثر البديل على شريحة واحدة فقط؟9091OpenFeature يدعم الخطافات حول تقييم العلم. وهي مفيدة لتسجيل الأخطاء أو إضافة مقاييس أو ربط التقييم بـ trace.9293## التسمية والملكية9495الأسماء مهمة. `new_ui` لا يقول شيئًا. `checkout.v2.enabled` يقول أكثر من ذلك بكثير.9697لكل علم أود أن أضع علامة على الأقل:9899- الاسم؛100- وصف؛101- مالك؛102- الافتراضي الآمن؛103- سبب وجودها؛104- تاريخ أو حالة الإزالة.105106العلم الذي لا مالك له هو دائمًا علم لن يقوم أحد بإزالته.107108## مكان تقييمها109110الواجهة الأمامية أم الخلفية أم الحافة؟ يعتمد على.111112إذا كانت العلامة للتخطيط أو النسخ أو الإعداد، فإن الواجهة الأمامية جيدة. إذا كان الأمر يتعلق بالأذونات أو الفوترة أو الحدود أو البيانات الحساسة، فيجب أن يكون ذلك على الواجهة الخلفية. إذا كان الأمر يتضمن توجيهًا أو تجارب ذات حركة مرور عالية، فقد تكون الحافة منطقية.113114القاعدة البسيطة: يمكن للواجهة الأمامية تحسين التجربة، لكن لا ينبغي أن تكون الحاجز الأمني الوحيد.115116## الخلاصة117118لقد قام feature flag بعمل جيد لتغيير العلاقة مع الإنتاج. إنها لا تقضي على المخاطر، لكنها تجعلها أصغر حجمًا وأكثر قابلية للإدارة. يمكنك تحريرها على شكل شرائح، والمراقبة، والتوقف، والعودة، والتعلم.119120OpenFeature يضيف أساسًا نظيفًا: API مشترك، ومقدمي خدمات قابلين للتبديل، وطريقة أكثر ترتيبًا لتنمية النظام. لكن الانضباط يظل ملكك: الإعدادات الافتراضية الآمنة، والأسماء الواضحة، والمقاييس، والمالكون، والنظافة.121122العلم الأفضل هو الذي يساعدك على التحرر بهدوء ثم يختفي عندما لا تكون هناك حاجة إليه.123124## المصادر125126- [OpenFeature: Introduction](https://openfeature.dev/docs/reference/intro/)127- [OpenFeature: Node.js SDK](https://openfeature.dev/docs/reference/sdks/server/javascript/)128- [OpenFeature Specification: Flag Evaluation API](https://openfeature.dev/specification/sections/flag-evaluation)129- [OpenFeature: Hooks](https://openfeature.dev/docs/reference/concepts/hooks/)130- [CNCF: OpenFeature](https://www.cncf.io/projects/openfeature/)131
:Feature flag: أطلق دون حبس أنفاسكlines 1-131 (END) — press q to close