برنامه نویسی

پرچم های ویژگی: درسهایی از سنگرها – قسمت 1

این مقاله بخشی از سری جامع من در مورد پرچم های ویژگی است. می توانید مقاله و سریال کامل را در وبلاگ من پیدا کنید.

با گذشت سالها ، من تماشا کرده ام (و گاهی اوقات با تجربه دردناک) چگونه پرچم های ویژگی از بی گناه تکامل می یابند if اظهارات در سیستم های پیچیده ای که می تواند معماری برنامه شما را ایجاد یا از بین ببرد. در حالی که ممکن است آنها ساده شروع شوند ، اجرای آنها اغلب شامل بررسی دقیق عوامل مختلفی است که بلافاصله آشکار نیستند.

تکامل هیچ کس در مورد آن صحبت نمی کند

بیشتر تیم ها با چیزی شبیه به این شروع می شوند:

if (flags.isEnabled('new-checkout')) {
  return <NewCheckoutFlow />;
} else {
  return <CurrentCheckoutFlow />;
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

“ما آن را ساده نگه داریم!” آنها با اطمینان اعلام می کنند. (راوی: آنها قطعاً آن را ساده نگه ندارند.)

آنچه به عنوان یک ضامن ساده شروع می شود ، اغلب به عنوان مقیاس برنامه ها به یک سیستم پیچیده تبدیل می شود و تیم ها بالغ می شوند. شما شروع به اضافه کردن می کنید:

  • برنامه های پیشرونده برای مدیریت ریسک
  • قابلیت های آزمایش A/B
  • کنترل پیکربندی سیستم
  • سفارشی سازی مشتری شرکت

قبل از اینکه آن را بدانید ، با سه سیستم در هم تنیده سر و کار دارید:

  1. پرچم های برجسته: کنترل در دسترس بودن و آزمایش ویژگی
  2. کنترل دسترسی مبتنی بر نقش (RBAC): مدیریت چه کسی می تواند به چه چیزی دسترسی پیدا کند
  3. حق: رسیدگی به قوانین تجاری و دسترسی مبتنی بر اشتراک

چالش های واقعی

سفر از پرچم های ویژگی ساده به یک سیستم جامع مدیریت ویژگی ها ، چالش های مختلفی را نشان می دهد که تیم ها اغلب خیلی دیر کشف می کنند:

// Initial implementation
if (featureFlags.isEnabled('new-checkout-flow')) {
  return <NewCheckout />;
} else {
  return <LegacyCheckout />;
}

// 1 year later...
if (featureFlags.isEnabled('new-checkout-flow')) {
  if (featureFlags.isEnabled('payment-provider-switch')) {
    if (featureFlags.isEnabled('stripe-integration')) {
      // 🤯 This is getting out of hand...
      if (featureFlags.isEnabled('stripe-3ds')) {
        return <NewCheckoutWithStripe3DS />;
      }
      return <NewCheckoutWithStripe />;
    }
    // 📝 Documentation? What documentation?
    return <NewCheckoutWithNewPayment />;
  }
  return <NewCheckout />;
} else {
  // 👻 This code path hasn't been tested in months
  return <LegacyCheckout />;
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

می خواهید بیشتر بدانید؟

این فقط نگاهی اجمالی به دنیای پرچم های ویژگی است. در مقاله کامل ، من عمیق تر به:

  • استراتژی های عملی برای مدیریت پیچیدگی پرچم ویژگی
  • تکنیک های بهینه سازی عملکرد
  • الگوهای دنیای واقعی برای جدا کردن نگرانی ها
  • چشم اندازهای جایگزین که بهترین شیوه های مشترک را به چالش می کشد
  • نمونه های کد و الگوهای اجرای

به علاوه ، این بخشی از یک سری بزرگتر است که به بررسی اجرای در مقیاس و برنامه های دنیای واقعی می پردازد.

مقاله کامل را در وبلاگ من بخوانید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا