Apa yang dimaksud dengan "bendera fitur"?

Jawaban:

104

Sebuah 'feature flag' (atau Feature Toggle ) adalah kemampuan untuk mengaktifkan / menonaktifkan fitur (sub-bagian) aplikasi Anda dengan mudah:

  • mungkin melalui penerapan ulang, atau
  • beberapa halaman internal tempat halaman / fitur dapat diubah secara langsung.

Saya kira contoh di sana adalah berguna untuk memiliki kontrol untuk mengurangi set fitur agak jika Anda perlu, katakanlah, mengurangi kueri db jika beban terlalu tinggi.

Ada banyak alasan lain mengapa Anda ingin menggunakan ini - salah satu yang utama adalah mengaktifkan Pengiriman Berkelanjutan : mendorong hal-hal ke dalam produksi / langsung namun memiliki fitur dinonaktifkan / diubah hingga selesai. Kami sering menggunakan apa yang kami sebut 'cookie dev' untuk menunjukkan fitur yang belum selesai hanya kepada tim pengembang. Dengan cara ini kami dapat menguji pekerjaan yang sebagian selesai dalam produksi (oh yeh! Apakah ada integrasi yang lebih baik?) Melalui beberapa rilis / penerapan sebelum kami 'melepaskan' (menyelesaikannya) dan itu menjadi terlihat oleh publik.

Berikut adalah paket sederhana yang membantu Anda melakukan ini di tanah ASP.NET MVC: https://github.com/cottsak/DevCookie (pengungkapan penuh: Saya penulisnya)

Fowler juga memiliki artikel yang jauh lebih panjang daripada yang ditautkan di atas dengan lebih banyak detail .

Posting ini (di situs Fowler juga) menjelaskan berbagai jenis strategi toggle . DevCookie mendukung strategi berbasis jalur utama / trunk dan disebut " Toggle Rilis " dalam artikel.

Jawaban Adil menyoroti bahwa ada banyak istilah dan alasan mengapa Anda menginginkan beberapa infrastruktur ini. Ingatlah bahwa Anda mungkin hanya membutuhkan beberapa dari hal-hal ini. Misalnya, saya mungkin hanya ingin mengaktifkan alur kerja penerapan / pengiriman yang sederhana dan gesit sehingga infrastruktur sederhana sudah cukup. Jika Anda kemudian memilih ingin beralih ke eksperimen #leanstartup lengkap dengan A / B, pengujian kelompok, dan hal-hal seperti peluncuran terkontrol, Anda harus mempertimbangkan alat analisis (misalnya Heap ) yang memfasilitasi metodologi pengembangan berbasis data tersebut sebagai solusi yang berbeda . Infrastruktur toggle yang melakukan semua hal di atas akan menyebabkan pembengkakan dan kerumitan yang tidak perlu.

Jika Anda berhasil sejauh ini, Anda mungkin ingin memeriksa beberapa pemikiran saya yang lain tentang Pengembangan Jalur Utama, fitur toggling, dan ide konyol lainnya seperti TEST, QA, SIT, STAND, CROUCH .

Matt Kocaj
sumber
1
Lucunya, saya selalu membayangkan hal yang sama dalam apapun yang saya bangun. Itu bisa menjadi fitur yang sangat efektif.
GurdeepS
7
Seringkali Anda akan menemukan hal-hal seperti ini yang tampak jelas. Ternyata seseorang selalu menemukan nama untuk itu.
Matt Kocaj
27

Tanda Fitur adalah teknik untuk menonaktifkan beberapa fungsi aplikasi Anda, melalui konfigurasi, tanpa menerapkan kode baru.

Flag fitur memainkan peran penting dalam skema CI di mana fitur terus-menerus diterapkan tetapi tidak harus "dirilis" ke dalam produksi.

Info lebih lanjut di sini:

- EDIT:

Fitur Flags implementasi java .

Maxim Veksler
sumber
3
Ini dijelaskan dengan baik dalam 'Penerapan Berkelanjutan' dan merupakan persyaratan yang cukup banyak untuk pengembangan 'jalur utama'. Daripada bercabang di SCM untuk fitur, fitur dihidupkan atau dimatikan, memungkinkan Anda untuk merilis kode dengan fitur yang seharusnya belum diaktifkan.
Chip McCormick
Hanya catatan tentang "melalui konfigurasi, tanpa menerapkan kode baru": tampaknya pernyataan itu berarti mengubah konfigurasi dan kemudian menerapkan aplikasi lagi (meskipun mungkin tidak ada kode yang berubah). Ini masih bisa berlangsung dari detik hingga menit tergantung pada pipeline penerapan Anda. Sebuah Flag Fitur atau Fitur Toggle mungkin tidak bertahan dalam konfigurasi. Ini bisa berada di toko / db di suatu tempat dan berperilaku dalam mode "live" - ​​yaitu, menavigasi ke beberapa halaman admin di mana Anda menekan tombol untuk mengaktifkan beberapa perilaku di seluruh situs secara instan (tidak ada penerapan, tidak ada perubahan konfigurasi).
Matt Kocaj
1
Saya bekerja untuk ConfigCat.com dan cara saya melihatnya "mengubah konfigurasi, tanpa menerapkan kode baru" berarti bahwa konfigurasi dilayani oleh layanan tanda fitur dan aplikasi Anda mengakses nilai dengan menarik file konfigurasi tersebut. Dengan cara ini Anda dapat yakin bahwa mengubah nilai tidak memerlukan penerapan ulang aplikasi apa pun. Selain itu, ini memungkinkan Anda membuat aturan sehingga Anda memberikan nilai kepada satu pengguna dan yang berbeda satu sama lain. keren adalah semua evaluasi tanda fitur ada di sisi klien dan semua logika ini berfungsi tanpa perlu mendorong data apa pun kembali ke layanan tanda fitur.
sige
techblog.outbrain.com/tag/feature-flags - Url tidak berfungsi
Sathish
19

Tanda Fitur, pengalihan fitur, eksperimen, dan peluncuran terkontrol adalah sinonim untuk ide yang sederhana namun kuat: penerapan kode terpisah dari peluncuran fitur. Singkatnya, ini adalah kemampuan untuk mendorong komitmen fitur Anda ke produksi sambil memilih siapa di antara pelanggan Anda - jika ada orang lain - yang dapat melihat fitur itu.

Mereka dipopulerkan sebagian oleh Penjaga Gerbang Facebook . LiX LinkedIn adalah contoh bagus lainnya.

Merangkul ide sederhana ini menjadi dasar untuk banyak praktik terbaik, termasuk:

Penerapan / Pengiriman Berkelanjutan - beberapa kode didorong ke produksi dalam satu hari.

Pengembangan Trunk / Mainline - cabang fitur harus dibuat hanya untuk permintaan tarik, bukan untuk pengembangan fitur yang berumur panjang.

Tidak Ada Kereta Rilis Lagi untuk menghentikan segalanya.

Pengujian QA / Perf dalam Produksi - QA nyata dan pengujian kinerja ada pada infrastruktur produksi dengan lalu lintas produksi. Jangan buang waktu membangun laboratorium kinerja yang ekstensif dan lingkungan pementasan.

Eksperimen - ketahui bagaimana fitur baru menggerakkan jarum pada KPI Anda.

Menghindari Hotfix atau Rollback Kode saat Masalah Terjadi - hotfix dan rollback kode dapat menimbulkan stres, membutuhkan waktu lama, dan menyebabkan lebih banyak masalah daripada yang diperlukan. Alih-alih, matikan fitur atau turunkan fitur.

Yang lain menyebutkan pustaka open source. Contoh bagus dari solusi lengkap - seperti Gatekeeper dan LiX - adalah Split . Saya bekerja untuk Split.

Adil Aijaz
sumber
Menurut saya, penting untuk tidak menggabungkan tanda fitur hanya untuk mendukung CI verses AB / cohort / lean experiment - tujuannya berbeda. Misalnya, menggunakan fitur toggle untuk memasukkan sesuatu ke Prod untuk QA / penerimaan mungkin merupakan alat sederhana untuk membantu CI / CD dan dalam kasus seperti itu Split bisa berlebihan. Kemudian lagi jika Anda ingin melakukan eksperimen lean atau pengujian A / B maka Anda mungkin memerlukan alat analitik yang baik seperti Heap dengan perkakas tambahan dan pelaporan telemetri bawaan. Saya tidak suka gagasan menggabungkan dua tujuan ini - sepertinya Anda bisa membengkak dengan sangat mudah.
Matt Kocaj
14

Ada banyak jawaban bagus di sini, semuanya mengacu pada definisi dasar dan penting yang dipopulerkan di pos Martin Fowler :

Itu adalah potongan kode yang "[mengizinkan] tim untuk mengubah perilaku sistem tanpa mengubah kode."

Jadi kami secara historis menganggapnya sebagai diwakili oleh pseudo-code:

if(app_settings["beta-mode"] == "true")
  showAwesomeNewGui();
else
  sameOldSnoozeFeset();

Itu cara yang benar-benar akurat untuk memikirkannya, dan baik Matt maupun Adil mengembangkannya dengan baik dengan berbagai kasus penggunaan taktis untuk bendera fitur.

Tapi saya ingin menawarkan definisi yang direvisi yang mencerminkan bagaimana realitas telah berkembang dalam enam tahun dan berubah sejak dotnetdev mengajukan pertanyaan asli. Saya bekerja untuk Rollout.io , platform flag fitur, jadi saya memiliki kursi baris depan untuk evolusi ini.

Sederhananya, tanda fitur bukan lagi hanya cara untuk mengaktifkan dan menonaktifkan fungsionalitas di aplikasi Anda. Itu seperti menjawab "apa itu item baris faktur" dengan mengatakan "ini adalah deskripsi dan jumlah mata uang". Benar, tetapi tidak mengarahkan pada poin yang lebih luas dari faktur itu sendiri.

Flag fitur adalah bit taktis dari solusi strategis menyeluruh dalam perangkat lunak modern. Mereka adalah cara yang Anda gunakan untuk menunda logika keputusan penting dalam kode Anda hingga waktu proses ketika Anda memiliki lebih banyak informasi. Dan, mungkin yang paling penting, mereka tidak hanya terjadi dalam isolasi lagi, dengan satu pemeriksaan untuk melihat apakah nomor versi lebih besar dari 2.7 atau tidak; organisasi yang menggunakannya biasanya memasukkannya sebagai bagian dari pendekatan produk di seluruh sistem yang komprehensif.

Seperti yang disebutkan orang lain, Facebook dan LinkedIn memelopori ini, tetapi pada 2018, banyak organisasi melakukannya. Mereka menunda pertanyaan logika keputusan untuk runtime sebagai bagian dari strategi pengembangan, strategi operasi (atau strategi DevOps, jika Anda mau), dan strategi produk. Berikut adalah contoh pertanyaan semacam itu.

  • Siapa yang seharusnya melihat layar admin baru yang kami luncurkan, dan kapan?
  • Tingkat keanggotaan apa yang diperlukan untuk membuka kunci telur Paskah ini?
  • Kapan kami harus beralih ke database baru?
  • Haruskah kita meletakkan gambar cheetah atau elang di tombol checkout untuk meningkatkan konversi?

Untuk memiliki aplikasi yang menunda sejumlah besar keputusan seperti itu hingga runtime, Anda tidak dapat melemparkan tanda fitur ke aplikasi Anda secara ad-hoc atau Anda akan mengubur diri Anda dalam hutang teknis. Saat ini, Anda perlu memiliki strategi pengelolaan tanda fitur yang komprehensif, yang mencakup beberapa komponen berbeda.

  • Toggle point digunakan untuk mengubah perilaku fitur baru.
  • Beberapa titik toggle bersatu untuk membentuk router toggle . Router toggle menentukan status fitur.
  • Konteks Toggle menyediakan informasi kontekstual yang diperlukan router toggle (misalnya, pengguna tertentu).
  • Konfigurasi Toggle menyediakan informasi router toggle tentang lingkungan.

Jadi, pada akhirnya, apa itu feature flag?

Ya, mereka adalah bagian penting dari strategi yang lebih luas untuk memiliki aplikasi yang dapat disesuaikan dengan kebutuhan teknis dan pasar.

Erez Rosovsky
sumber
9

Tanda fitur (juga dikenal sebagai pembalikan fitur atau pengalih fitur ) adalah pengalih untuk mengaktifkan atau menonaktifkan fitur yang berpotensi mahal sesuai kebutuhan (seperti, misalnya, saat situs diserang dengan lalu lintas yang tidak terduga). Ini akan memberi Anda sedikit waktu sampai Anda menaikkan skala, atau sampai lonjakan beban hilang.

Berikut adalah contoh dari dokumentasi SWIG .

Michael Petrotta
sumber
6
Itu adalah salah satu penggunaan tanda fitur, ya, tetapi konsep besar yang harus dipahami adalah bahwa mereka memisahkan rilis fitur dan penerapan kode, sehingga Anda dapat merilis fitur kapan pun Anda mau, alih-alih kapan pun kode dikirimkan. Ini adalah landasan integrasi berkelanjutan.
Eric Elliott
6

Di perusahaan saya, kami dulu punya solusi sendiri untuk itu. Kami membuat layanan yang menyediakan file config ( .json) yang dapat diunduh untuk setiap aplikasi. Dalam konfigurasi itu kami menyimpan tanda untuk fitur. Berdasarkan konfigurasi itu, aplikasi dapat menampilkan atau menyembunyikan fitur saat ini. (Misalnya menampilkan atau menyembunyikan item menu di sidebar).

Kami juga membuat halaman admin internal tempat kami dapat mengkonfigurasi fitur-flag. Ini bekerja cukup baik untuk sementara waktu tetapi setelah itu kami ingin melakukan penargetan pengguna dan pengujian A / B. Untuk mengembangkan sendiri Sepertinya terlalu banyak usaha, jadi kami memilih solusi pihak ketiga. Seperti yang sudah disebutkan di sini ada banyak solusi untuk itu.

Kami memilih ConfigCat karena mendukung grup target yang disesuaikan dan peluncuran berbasis persentase sekaligus. Anda dapat memeriksa sdks open-source yang didukung di github .

mon
sumber
4

Tanda fitur (atau pengalih fitur) memungkinkan Anda mengaktifkan fitur dari jarak jauh pada aplikasi tanpa perlu membangun ulang / menerapkan ulang aplikasi. Hal ini memungkinkan Anda untuk menerapkan kode ke produksi tetapi tidak merilis fitur sampai Anda siap. Anda dapat menargetkan pengguna tertentu, sehingga Anda dapat mengaktifkan fitur baru untuk diuji oleh pengguna beta Anda.

Di perusahaan kami, kami sebelumnya telah menggunakan LaunchDarkly dan saran lain dari FeatureFlags.io . Kami juga mencoba menggunakan Remote config Firebase untuk mencoba dan membuat ini berfungsi, namun kami menemukan itu tidak benar-benar cocok untuk tujuan ini.

Kami akhirnya mengembangkan versi kami sendiri yang disebut Kereta Peluru , yang kami buka bersumber. Ini menggabungkan Feature Flags / Toggles dan Remote Config.

TStu
sumber
4

Feature Flags digunakan untuk beberapa tujuan. Ide umumnya adalah mendelegasikan kendali atas pengguna mana yang melihat fitur apa ke dasbor jarak jauh atau semacam back-office.

Setelah fitur ditandai di kode, Anda sekarang dapat menggunakan beberapa metode untuk menentukan pengguna mana yang melihatnya di aplikasi Anda: 1. Aktif / Nonaktif - menampilkan fitur ke semua atau tidak satu pun pengguna Anda. 2. Rilis Bertahap - menampilkan fitur hanya kepada sebagian pengguna Anda, kemudian secara bertahap menampilkannya kepada semua pengguna. 3. Penargetan - menampilkan fitur kepada pengguna tertentu berdasarkan properti atau karakteristik pengguna tersebut.

Alat yang membantu mengontrol Tanda Fitur (boolean) dan Konfigurasi Fitur (string, angka, dll) biasanya disebut Platform Manajemen Fitur. Ada layanan hebat untuk Manajemen Fitur yang disebut Configz.io

Monad seperti ...
sumber
3

Dari sudut pandang pengkodean, flag fitur bisa sesederhana ifpernyataan yang membungkus kode baru yang Anda tulis. Ketika ifpernyataan bernilai true (tanda fitur aktif) maka kode baru akan dieksekusi.

Dalam contoh dunia nyata pengiriman perangkat lunak, file if pernyataan yang dijelaskan di atas akan dievaluasi secara berbeda tergantung pada lingkungan tempat perangkat lunak dijalankan. Misalnya jika aplikasi sedang dijalankan pada server QA Anda, tanda fitur akan mengembalikan true dan fitur baru akan menjadi terlihat. Jika dieksekusi di server produksi Anda, flag fitur akan mengembalikan false dan fitur akan disembunyikan.

Dari pengalaman pribadi saya selama karir saya, saya telah menggunakan tanda fitur dengan cara berikut:

  1. Memisahkan penerapan kode dari peluncuran fitur ke pelanggan. Ini adalah penggunaan pertama saya atas tanda fitur dalam proses pengembangan kami. Kami menggunakannya untuk menghilangkan ketergantungan antara tim pemasaran dan produk kami serta tim teknik yang melakukan pengembangan dan rilis. Bendera fitur memungkinkan kami untuk menerapkan kode kami berminggu-minggu sebelum peluncuran sedangkan sebelumnya kami menerapkan kode pada malam sebelum rilis!

  2. Pengujian dalam produksi. Sebelum kami menggunakan tanda fitur ketika kami merilis kode kami, itu adalah peristiwa semua atau tidak sama sekali, baik semua pelanggan kami mendapatkan fitur tersebut atau tidak ada yang mendapatkannya. Kami menggunakan tanda fitur untuk memungkinkan kami meluncurkan fitur baru ke sebagian kecil pengguna pada satu waktu. Ini memungkinkan kami untuk mengumpulkan umpan balik dan data berharga tentang fitur baru tanpa mempertaruhkan potensi masalah apa pun ke seluruh basis pelanggan.

  3. Mengaktifkan / menonaktifkan fitur per lingkungan dalam siklus hidup pengembangan. Kami menggunakan ini secara ekstensif dalam pengembangan untuk memungkinkan proses penerapan yang jauh lebih mulus - kami memiliki pipeline CI / CD di mana penggunaan tanda fitur sangat penting.

  4. Membuat tombol pemutus. Kami telah membungkus fitur tertentu dari aplikasi kami dengan tanda fitur yang memungkinkan kami untuk 'mematikan' fitur tersebut jika ada masalah yang kami alami dengan aplikasi pada saat itu. Misalnya, jika kami mengalami beban berat, kami dapat menonaktifkan fitur non-esensial tertentu dari situs web untuk membantu mengatasi masalah tersebut.

Anda dapat membaca lebih lanjut tentang tanda fitur di sini.

Anda dapat menambahkan tanda fitur ke kode Anda dengan berbagai cara.

  1. Anda dapat membuat sendiri atau menggunakan pustaka tanda fitur pihak ketiga dan menambahkan data tanda fitur Anda ke file konfigurasi yang dapat disertakan dalam paket penerapan Anda.
  2. Anda dapat membuatnya sendiri atau menggunakan pustaka tanda fitur pihak ketiga dan menambahkan data tanda fitur Anda ke dalam file konfigurasi yang dapat dimuat pada waktu proses.
  3. Anda dapat menggunakan layanan manajemen tanda fitur berbasis cloud untuk mengelola semua kebutuhan tanda fitur untuk Anda.

Menulis perpustakaan Anda sendiri mungkin tampak ide bagus pada awalnya dan biasanya bisa dimulai dengan cara itu. Namun, Anda dapat segera mengalami masalah saat ingin menerapkan kasus penggunaan yang lebih lanjut dari tanda fitur seperti meluncurkan ke sejumlah persentase pengguna atau menargetkan grup pengguna tertentu. Masalah lain dalam membuat implementasi tanda fitur Anda sendiri adalah jika Anda menggunakan banyak bahasa, Anda perlu mengimplementasikan kode Anda beberapa kali.

Cara terbaik dan termudah untuk menggunakan tanda fitur adalah dengan menggunakan layanan pengelolaan tanda fitur online seperti Floodgate . Dengan cara ini Anda dapat memanfaatkan platform untuk semua pekerjaan berat yang kemudian memungkinkan Anda untuk berkonsentrasi pada pembuatan fitur untuk aplikasi Anda.

Berikut adalah contoh cara menambahkan tanda fitur Floodgate ke aplikasi yang menggunakan .NET SDK.

using FloodGate.SDK;

var floodgateClient = new FloodGateClient("API-KEY");

var flag = floodgateClient.GetValue("a-new-feature", false);

if (flag)
{
  // Execute the code for my new feature here...
}

Jika Anda bekerja dalam tim pengembangan dan Anda tidak menggunakan tanda fitur dan Anda mengalami masalah dalam penerapan dan manajemen kode dalam tim. Menggunakan tanda fitur bisa menjadi cara yang bagus untuk menyelesaikan masalah ini. Ada juga efek samping yang bagus dari fitur flag yang mempercepat kecepatan pengembangan tim Anda.

Martin Fowler memberikan tulisan yang sangat mendalam tentang flag fitur di sini yang saya sarankan untuk Anda baca.

Eugene
sumber
2

Pemahaman saya adalah bahwa tanda fitur membantu Anda mem-gerbang fungsionalitas dengan memutuskan pengguna mana yang menerima fitur tertentu.

Misalnya, Anda hanya ingin pengguna beta melihat fitur baru. Anda akan "mengaktifkan" fitur itu untuk pengguna beta dan pengguna Anda lainnya tidak akan melihatnya.

LDUser user = new LDUser("[email protected]");

boolean showFeature = ldClient.toggle("your.feature.key", user, false);

if (showFeature) {
     // application code to show the feature 
 }
else {
     // the code to run if the feature is off
 }

Saya menguji tanda fitur LaunchDarkly untuk beberapa pengujian JS A / B front-end - tampaknya berfungsi dengan baik. Anda juga dapat melihat situs ini untuk matikan fitur dan pustaka bendera fitur .

Hbitspark
sumber
1

Fitur Flags pada dasarnya memberi Anda kemampuan untuk menghidupkan dan mematikan fitur tanpa membuat perubahan apa pun pada kode atau merilis versi baru. Ini adalah solusi penting terutama untuk pengembang aplikasi seluler karena mereka tidak memiliki kendali atas pengguna untuk memperbarui aplikasi mereka ke versi baru.

Ada beberapa perusahaan yang memberikan layanan ini untuk para pengembang aplikasi seluler.

OFK
sumber
Berhati-hatilah dengan ini. Anda tidak perlu mengintegrasikan salah satu layanan ini untuk membuat sakelar sederhana yang dapat digunakan untuk menyembunyikan beberapa fitur dari visibilitas / integrasi PROD. Anda juga tidak perlu melakukan ini secara langsung - karena menunggu penerapan bukanlah masalah besar saat penerapan PROD hanya beberapa menit (yang harus Anda optimalkan karena banyak alasan lainnya).
Matt Kocaj
2
Sebagai tambahan, berikut adalah perbandingan layanan flag fitur terbaik saat ini: featureflagservices.io
sige
1

Di perusahaan saya, kami menggunakan tanda fitur untuk setiap fitur baru yang kami perkenalkan di aplikasi SaaS kami. Selain manfaat bagi kinerja, ini juga memungkinkan kami meluncurkan fitur baru secara bertahap - memperkenalkan fitur baru kepada pengguna yang mahir terlebih dahulu, mendapatkan umpan balik dari mereka, dan mengimprovisasinya sebelum kami dapat meluncurkannya ke semua pengguna.

Hal ini juga memungkinkan kami untuk menyesuaikan penawaran untuk pengguna individu - power user menginginkan semua fitur; pengguna sederhana mungkin hanya menginginkan hal-hal dasar dan mungkin bingung dengan semua fitur kompleks yang canggih. Ini juga memungkinkan tim penjualan kami untuk menjual.

Dan tentu saja seperti yang ditunjukkan orang lain, jika kami menemukan fitur yang menyebabkan penurunan kinerja, kami cukup mematikan satu fitur itu (baik untuk semua klien atau satu klien yang menyebabkan masalah).

Dharmendar Kumar 'DK'
sumber