در توسعه نرم افزار، Feature Toggle مکانیزمی است که امکان روشن یا خاموش کردن یک قابلیت از راه دور را فراهم می‌کند، بدون نیاز به استقرار مجدد کد. feature toggling معمولاً توسط تیم‌های محصول، مهندسی و DevOps برای عرضه تدریجی (Canary Releases)، تست A/B، آزمایش قابلیت‌ها و استقرار پیوسته استفاده می‌شوند.
feature toggling با نام‌های دیگری مانند “فلگ ویژگی” (Feature Flags)، “کلید ویژگی” (Feature Switches)، یا “toggle انتشار” (Release Toggles) نیز شناخته می‌شوند. این قابلیت‌ها کاربردهای متنوعی در اپلیکیشن‌ها و زیرساخت دارند، که عمدتاً برای کاهش ریسک به کار می‌روند.
برای مثال، در اپلیکیشن‌ها می‌توان از آن‌ها برای عرضه تدریجی ویژگی‌های جدید استفاده کرد؛ به این ترتیب تیم‌ها می‌توانند تغییرات را ابتدا روی گروه کوچکی از کاربران امتحان کنند و سپس برای همه منتشر کنند. به‌طور مشابه، در زیرساخت‌ها، feature toggling می‌توانند مانند قطع‌کننده مدار (Circuit Breaker) عمل کرده و امکان کنترل رفتار سیستم مستقر شده را از راه دور برای مهندسان فراهم کنند.

feature toggling چگونه کار می‌کند

feature toggling معمولاً به کد اضافه می‌شوند تا بتوان بخش‌هایی از منطق برنامه را در زمان اجرا (Runtime) به‌صورت کنترل از راه دور مدیریت کرد. در کد، این منطق در بلوک‌هایی قرار می‌گیرد که توسط وضعیت feature toggling کنترل می‌شوند. اگر وضعیت toggle “روشن” باشد، منطق مربوط اجرا می‌شود، و اگر “خاموش” باشد، از اجرای آن صرف‌نظر می‌شود.
وقتی اپلیکیشنی بخواهد وضعیت یک feature toggling را در زمان اجرا بداند، از یک منبع داده خارجی یا سرویسی مانند Optimizely Feature Experimentation استعلام می‌گیرد. سپس اپلیکیشن بر اساس وضعیت دریافتی تصمیم می‌گیرد که منطق مربوطه را اجرا کند یا خیر.
از آنجا که اپلیکیشن وضعیت feature toggling را از منبعی خارجی دریافت می‌کند، می‌توان منطق کنترل‌شده را از راه دور تنظیم کرد، تنها با تغییر وضعیت فلگ در فایل پیکربندی، بدون نیاز به استقرار مجدد کد. برای مثال، اگر وضعیت یک toggle در Optimizely تغییر کند، این تغییر در زمان اجرا در اپلیکیشن نیز اعمال می‌شود.
کدهای اپلیکیشن معمولاً شامل چندین feature toggling هستند که بخش‌های مختلف برنامه را کنترل می‌کنند. از این رو، هر toggle معمولاً دارای نام یا کلید منحصربه‌فردی است که نشان‌دهنده منطق مرتبط با آن است. همچنین، ممکن است وضعیت یک toggle برای کاربران یا گروه‌های مختلف متفاوت باشد. این کلیدهای منحصربه‌فرد به همراه اطلاعات مربوط به کاربر یا گروه هدف، برای دریافت وضعیت toggle از منبع خارجی استفاده می‌شوند.

مزایای feature toggling

مزیت اصلی استفاده از feature toggling، کاهش ریسک مرتبط با انتشار تغییرات در یک اپلیکیشن است. چه یک ویژگی جدید باشد و چه یک بازسازی کوچک، همیشه احتمال بروز باگ جدید وجود دارد. برای کاهش این ریسک، می‌توان تغییرات را پشت یک feature toggling قرار داد تا در صورت بروز مشکل، به‌سادگی آن را خاموش کرد.
در موارد پیچیده‌تر، می‌توان تغییرات را روی گروه کوچکی از کاربران آزمایش کرد. با فعال‌سازی toggle برای درصدی از کاربران، تیم‌ها می‌توانند پیش از انتشار کامل، اطلاعات مفیدی جمع‌آوری کنند. این قابلیت معمولاً برای عرضه تدریجی (Feature Rollouts) یا انتشار قناری (Canary Releases) استفاده می‌شود، که در آن تغییرات ابتدا روی بخشی از کاربران آزمایش می‌شود. این کار امکان شناسایی باگ‌ها پیش از انتشار عمومی و بازگرداندن سریع در صورت نیاز را فراهم می‌کند.

فرایند توسعه feature toggling

اولین مرحله در پیاده‌سازی feature toggling، تعریف آن در یک منبع داده خارجی یا سرویسی مانند Optimizely است. این مرحله شامل انتخاب نام یا کلیدی منحصربه‌فرد و تعیین وضعیت اولیه آن است. پس از تعریف، اپلیکیشن‌ها و زیرساخت‌ها می‌توانند با استفاده از این کلید، وضعیت آن را بررسی کنند.
پس از تعریف toggle، باید وضعیت آن برای اپلیکیشن قابل دسترسی باشد. بنابراین، باید کدی به برنامه اضافه شود تا بتواند وضعیت toggle را از منبع خارجی دریافت کند. Optimizely برای بسیاری از زبان‌ها و فریم‌ورک‌های اصلی SDK فراهم کرده که این قابلیت را می‌دهد.
در نهایت، پس از دسترسی اپلیکیشن به toggle‌ها، می‌توان آن‌ها را در مسیرهای خاص کد قرار داد تا کنترل از راه دور فراهم شود. مسیرهای کدی که نیاز به کنترل دارند، در منطق شرطی قرار می‌گیرند که قبل از اجرا، وضعیت toggle را بررسی می‌کند. سپس، هنگام اجرای کد، تنها در صورتی اجرا می‌شود که فلگ در وضعیت مشخصی قرار داشته باشد.

نمونه‌ها و کاربردهای feature toggling

Canary Releases

در هنگام انتشار یک ویژگی جدید، معمولاً مفید است که ابتدا آن را روی گروه کوچکی از کاربران آزمایش کرد. این روش که با عنوان “Canary Releases” شناخته می‌شود، برای کاهش ریسک استفاده می‌شود. feature toggling با کنترل نمایش یا عدم نمایش ویژگی به کاربران خاص، امکان عرضه یا بازگرداندن از راه دور را فراهم می‌کنند.

تست در محیط تولید (Testing in Production)

با توجه به پیچیدگی سیستم‌های مدرن، ممکن است تفاوت‌هایی میان محیط تست و تولید وجود داشته باشد که باعث بروز باگ‌هایی شود که در تست‌های واحد آشکار نمی‌شوند. با استفاده از feature toggling، تیم‌های توسعه می‌توانند ویژگی‌ها را به‌صورت کنترل‌شده در محیط تولید منتشر کنند و آن‌ها را فقط برای بخشی از کاربران فعال نمایند. در صورت شکست آزمایش، می‌توان تنها با تغییر وضعیت toggle، ویژگی را غیرفعال کرد، بدون نیاز به تغییر کد منبع.

تست A/B

تیم‌ها برای بررسی ایده‌های جدید و تأیید فرضیه‌ها با داده‌های واقعی از تست A/B استفاده می‌کنند. در این تست‌ها، کاربران به دو گروه تقسیم می‌شوند و هر گروه یک نسخه متفاوت از ویژگی را می‌بیند. feature toggling می‌تواند برای کنترل تخصیص کاربران به هر نسخه استفاده شود: اگر toggle برای کاربری “خاموش” باشد، نسخه A را می‌بیند و اگر “روشن” باشد، نسخه B را مشاهده می‌کند.

قطع‌کننده مدار (Circuit Breaker)

با رشد پیچیدگی برنامه یا زیرساخت، نگهداری و بازگردانی آن در صورت خطا دشوارتر می‌شود. feature toggling راهی مناسب برای پاسخ به نگرانی‌های مربوط به پایداری و قابلیت بازیابی سیستم هستند. وقتی به‌صورت قطع‌کننده مدار یا کلید اضطراری استفاده شوند، تیم‌ها می‌توانند اجزای سیستم مستقر شده را به‌صورت مرکزی و از راه دور کنترل کنند.

استقرار بر پایه Trunk

feature toggling به دلیل امکان انتشار و بازگردانی سریع کد، از فرایند توسعه بر پایه Trunk پشتیبانی می‌کنند. در این رویکرد، تغییرات مستقیماً به شاخه اصلی اعمال می‌شوند، به‌جای استفاده از شاخه‌های متعدد که نیاز به ادغام دارند. این روش منجر به چرخه‌های انتشار سریع‌تر و صرف زمان کمتر برای دیباگ می‌شود.

feature toggling و تحویل پیوسته (Continuous Delivery)

تحویل پیوسته (CI/CD) که توسط توسعه‌دهنده‌ی برجسته “مارتین فاولر” مطرح شده، روشی در توسعه نرم افزار است که در آن نرم‌افزار در هر زمانی آماده انتشار به محیط تولید است. این روش توسط شرکت‌های پیشرو در حوزه نرم‌افزار به‌کار گرفته شده و تیم‌ها را ملزم به ارائه سریع و پایدار نرم‌افزار کرده است.
feature toggling با تسهیل فرآیند استقرار پیوسته، تحقق “پیوستگی” را ممکن می‌سازند. آن‌ها از مؤلفه‌های کلیدی در پیاده‌سازی تحویل پیوسته هستند و اجازه می‌دهند که عرضه قابلیت‌ها از انتشار کد جدا شود. قابلیت‌های ناقص می‌توانند در کد نهایی ادغام شوند اما پشت فلگ‌ها پنهان باقی بمانند.