Gần đây tôi đã chứng kiến ngày càng nhiều vấn đề tương tự như những vấn đề được giải thích trong bài viết này về các giao điểm tính năng. Một thuật ngữ khác cho nó sẽ là các dòng sản phẩm, mặc dù tôi có xu hướng gán những thứ này cho các sản phẩm thực sự khác nhau, trong khi tôi thường gặp phải những vấn đề này dưới dạng cấu hình sản phẩm có thể.
Ý tưởng cơ bản của loại vấn đề này rất đơn giản: Bạn thêm một tính năng vào sản phẩm, nhưng bằng cách nào đó mọi thứ trở nên phức tạp do sự kết hợp của các tính năng hiện có khác. Cuối cùng, QA tìm thấy một vấn đề với sự kết hợp các tính năng hiếm hoi mà không ai nghĩ đến trước đây và những gì đáng lẽ là một lỗi đơn giản thậm chí có thể biến thành yêu cầu thay đổi thiết kế lớn.
Các kích thước của vấn đề giao cắt tính năng này là một sự phức tạp đáng kinh ngạc. Giả sử phiên bản phần mềm hiện tại có N
các tính năng và bạn thêm một tính năng mới. Chúng ta cũng hãy đơn giản hóa mọi thứ bằng cách nói rằng mỗi tính năng chỉ có thể bật hoặc tắt, sau đó bạn đã có 2^(N+1)
các kết hợp tính năng có thể xem xét. Do thiếu từ ngữ / cụm từ tìm kiếm tốt hơn, tôi đề cập đến sự tồn tại của các kết hợp này là vấn đề giao cắt tính năng . (Điểm thưởng cho một câu trả lời bao gồm (các) tham chiếu cho một thuật ngữ được thiết lập nhiều hơn.)
Bây giờ câu hỏi tôi đấu tranh là làm thế nào để đối phó với vấn đề phức tạp này trên từng cấp độ của quá trình phát triển. Vì lý do chi phí rõ ràng, không thực tế đến mức không tưởng, muốn giải quyết từng kết hợp riêng lẻ. Rốt cuộc, chúng tôi cố gắng tránh xa các thuật toán phức tạp theo cấp số nhân vì một lý do chính đáng, nhưng để biến chính quá trình phát triển thành một con quái vật có kích thước theo cấp số nhân chắc chắn sẽ dẫn đến thất bại hoàn toàn.
Vì vậy, làm thế nào để bạn có được kết quả tốt nhất theo cách có hệ thống, không làm bùng nổ bất kỳ ngân sách nào và được hoàn thành một cách tử tế, hữu ích và được chấp nhận một cách chuyên nghiệp.
Đặc điểm kỹ thuật: Khi bạn chỉ định một tính năng mới - làm thế nào để bạn đảm bảo rằng nó chơi tốt với tất cả những đứa trẻ khác?
Tôi có thể thấy rằng người ta có thể kiểm tra một cách có hệ thống từng tính năng hiện có kết hợp với tính năng mới - nhưng điều đó sẽ tách biệt với các tính năng khác. Do tính chất phức tạp của một số tính năng, quan điểm biệt lập này thường liên quan đến mức nó cần một cách tiếp cận có cấu trúc, chứ đừng nói đến
2^(N-1)
yếu tố gây ra bởi các tính năng khác mà người ta sẵn sàng bỏ qua.Triển khai: Khi bạn triển khai một tính năng - làm thế nào để bạn đảm bảo mã của mình tương tác / giao nhau đúng cách trong mọi trường hợp.
Một lần nữa, tôi tự hỏi về sự phức tạp tuyệt đối. Tôi biết các kỹ thuật khác nhau để giảm khả năng lỗi của hai tính năng giao nhau, nhưng không có kỹ thuật nào có thể mở rộng theo bất kỳ cách hợp lý nào. Mặc dù vậy, tôi cho rằng một chiến lược tốt trong đặc tả sẽ giúp giải quyết vấn đề trong quá trình thực hiện.
Xác minh: Khi bạn kiểm tra một tính năng - làm thế nào để bạn đối phó với thực tế, rằng bạn chỉ có thể kiểm tra một phần của không gian giao nhau của tính năng này?
Thật khó để biết rằng việc kiểm tra một tính năng duy nhất trong sự cô lập không đảm bảo bất cứ nơi nào gần mã không có lỗi, nhưng khi bạn giảm nó xuống một phần của
2^-N
nó thì có vẻ như hàng trăm thử nghiệm thậm chí không bao gồm một giọt nước trong tất cả các đại dương kết hợp . Thậm chí tệ hơn, các lỗi có vấn đề nhất là những lỗi xuất phát từ giao điểm của các tính năng, mà người ta có thể không mong đợi dẫn đến bất kỳ vấn đề nào - nhưng làm thế nào để bạn kiểm tra những lỗi này nếu bạn không mong đợi một giao lộ mạnh như vậy?
Mặc dù tôi muốn nghe cách người khác giải quyết vấn đề này, tôi chủ yếu quan tâm đến văn học hoặc các bài viết phân tích chủ đề sâu hơn. Vì vậy, nếu cá nhân bạn theo một chiến lược nhất định, sẽ rất tốt nếu bao gồm các nguồn tương ứng trong câu trả lời của bạn.