Baru-baru ini saya menyaksikan semakin banyak masalah yang serupa dengan yang dijelaskan dalam artikel ini tentang persimpangan fitur. Istilah lain untuk itu adalah lini produk, meskipun saya cenderung menghubungkan ini dengan produk yang sebenarnya berbeda, sedangkan saya biasanya menghadapi masalah ini dalam bentuk kemungkinan konfigurasi produk.
Gagasan dasar dari jenis masalah ini sederhana: Anda menambahkan fitur ke suatu produk, tetapi entah bagaimana hal menjadi rumit karena kombinasi dari fitur yang ada lainnya. Akhirnya, QA menemukan masalah dengan kombinasi fitur yang jarang ada yang tidak dipikirkan sebelumnya dan apa yang seharusnya menjadi perbaikan bug sederhana bahkan dapat berubah menjadi membutuhkan perubahan desain besar.
Dimensi dari masalah persimpangan fitur ini adalah kompleksitas yang mengejutkan. Katakanlah versi perangkat lunak saat ini memiliki N
fitur dan Anda menambahkan satu fitur baru. Mari kita sederhanakan juga dengan mengatakan bahwa masing-masing fitur dapat dihidupkan atau dimatikan saja, maka Anda sudah memiliki 2^(N+1)
kemungkinan kombinasi fitur untuk dipertimbangkan. Karena kurangnya kata-kata yang lebih baik / istilah pencarian, saya menyebut keberadaan kombinasi ini sebagai masalah persimpangan fitur . (Poin bonus untuk jawaban termasuk referensi untuk jangka waktu yang lebih mapan.)
Sekarang pertanyaan yang saya perjuangkan adalah bagaimana menangani masalah kompleksitas ini pada setiap tingkat proses pengembangan. Untuk alasan biaya yang jelas, tidak praktis sampai menjadi utopis, ingin mengatasi setiap kombinasi secara individual. Bagaimanapun, kami mencoba untuk menjauh dari algoritma kompleksitas eksponensial untuk alasan yang baik, tetapi untuk mengubah proses pengembangan itu sendiri menjadi monster berukuran eksponensial terikat untuk mengarah pada kegagalan total.
Jadi, bagaimana Anda mendapatkan hasil terbaik dengan cara sistematis yang tidak meledakkan anggaran apa pun dan lengkap dengan cara yang layak, bermanfaat, dan diterima secara profesional.
Spesifikasi: Ketika Anda menentukan fitur baru - bagaimana Anda memastikan bahwa fitur itu berfungsi baik dengan semua anak lain?
Saya dapat melihat bahwa seseorang dapat secara sistematis memeriksa setiap fitur yang ada dalam kombinasi dengan fitur baru - tetapi itu akan menjadi isolasi dari fitur-fitur lainnya. Mengingat sifat kompleks dari beberapa fitur, pandangan terisolasi ini sering sudah sangat terlibat sehingga perlu pendekatan terstruktur sendiri, apalagi
2^(N-1)
faktor yang disebabkan oleh fitur lain yang satu sengaja diabaikan.Implementasi: Ketika Anda mengimplementasikan fitur - bagaimana Anda memastikan kode Anda berinteraksi / berpotongan dengan benar dalam semua kasus.
Sekali lagi, saya bertanya-tanya tentang kerumitan semata. Saya tahu berbagai teknik untuk mengurangi potensi kesalahan dari dua fitur berpotongan, tetapi tidak ada yang akan skala dengan cara yang masuk akal. Saya berasumsi, bahwa strategi yang baik selama spesifikasi harus menjaga masalah selama implementasi.
Verifikasi: Ketika Anda menguji suatu fitur - bagaimana Anda menghadapi fakta, bahwa Anda hanya dapat menguji sebagian kecil dari ruang persimpangan fitur ini?
Cukup sulit untuk mengetahui bahwa menguji satu fitur dalam isolasi tidak menjamin apa pun di dekat kode bebas kesalahan, tetapi ketika Anda menguranginya menjadi sepersekian
2^-N
, sepertinya ratusan tes bahkan tidak mencakup setetes air pun di semua samudera yang digabungkan . Lebih buruk lagi, kesalahan yang paling bermasalah adalah kesalahan yang berasal dari persimpangan fitur, yang orang mungkin tidak harapkan menyebabkan masalah - tapi bagaimana Anda menguji ini jika Anda tidak mengharapkan persimpangan yang kuat?
Sementara saya ingin mendengar bagaimana orang lain mengatasi masalah ini, saya terutama tertarik pada literatur atau artikel yang menganalisis topik ini secara lebih mendalam. Jadi, jika Anda secara pribadi mengikuti strategi tertentu, alangkah baiknya untuk menyertakan sumber yang sesuai dalam jawaban Anda.