Ostatnio widziałem coraz więcej problemów podobnych do tych wyjaśnionych w tym artykule na temat skrzyżowań funkcji. Innym terminem na to byłyby linie produktów, chociaż zwykle przypisuję je do faktycznie różnych produktów, podczas gdy zwykle napotykam te problemy w postaci możliwych konfiguracji produktów.
Podstawowa koncepcja tego rodzaju problemu jest prosta: dodajesz funkcję do produktu, ale jakoś się komplikuje z powodu kombinacji innych istniejących funkcji. W końcu QA znajduje problem z rzadką kombinacją funkcji, o których nikt wcześniej nie pomyślał, i to, co powinno być prostą poprawką, może nawet wymagać dużych zmian projektowych.
Wymiary tego problemu przecięcia cech są zadziwiającą złożonością. Załóżmy, że obecna wersja oprogramowania ma N
funkcje i dodajesz jedną nową funkcję. Uprośćmy też, mówiąc, że każdą z funkcji można włączyć lub wyłączyć tylko, wtedy masz już 2^(N+1)
możliwe kombinacje funkcji do rozważenia. Ze względu na brak lepszego sformułowania / wyszukiwanych terminów, istnienie tych kombinacji nazywam problemem przecięcia cech . (Punkty bonusowe za odpowiedź, w tym referencje za bardziej ustalony termin).
Teraz mam problem z tym, jak poradzić sobie z tym problemem złożoności na każdym poziomie procesu programowania. Z oczywistych powodów związanych z kosztami nie jest praktyczne do tego stopnia, że jest utopijny, aby osobno zająć się każdą kombinacją. W końcu staramy się trzymać z dala od algorytmów wykładniczej złożoności nie bez powodu, ale przekształcenie samego procesu rozwoju w potwora wielkości wykładniczej z pewnością doprowadzi do całkowitej awarii.
Jak więc uzyskać najlepszy wynik w systematyczny sposób, który nie rozbija żadnych budżetów i jest kompletny w przyzwoity, użyteczny i profesjonalnie akceptowalny sposób.
Specyfikacja: Kiedy określisz nową funkcję - w jaki sposób zapewnisz, że będzie się dobrze bawić ze wszystkimi innymi dziećmi?
Widzę, że można systematycznie badać każdą istniejącą funkcję w połączeniu z nową funkcją - ale byłoby to w oderwaniu od innych funkcji. Biorąc pod uwagę złożoną naturę niektórych funkcji, ten odizolowany widok jest już często tak zaangażowany, że potrzebuje ustrukturyzowanego podejścia sam w sobie, nie mówiąc już o
2^(N-1)
czynniku spowodowanym przez inne cechy, które jeden z nich zignorował.Implementacja: Kiedy implementujesz funkcję - w jaki sposób upewniasz się, że Twój kod działa prawidłowo / przecina się we wszystkich przypadkach.
Znów zastanawiam się nad samą złożonością. Znam różne techniki zmniejszania potencjału błędu dwóch przecinających się cech, ale żadna z nich nie skalowałaby się w żaden rozsądny sposób. Zakładam jednak, że dobra strategia podczas specyfikacji powinna trzymać problem na dystans podczas wdrażania.
Weryfikacja: Kiedy testujesz funkcję - jak sobie radzisz z faktem, że możesz przetestować tylko ułamek tego miejsca przecięcia funkcji?
Trudno jest wiedzieć, że testowanie pojedynczej funkcji w izolacji nie gwarantuje niczego w pobliżu kodu bezbłędnego, ale kiedy zredukujesz to do ułamka
2^-N
, wydaje się, że setki testów nie obejmują nawet jednej kropli wody we wszystkich oceanach łącznie . Co gorsza, najbardziej problematyczne są te, które wynikają ze przecięcia się cech, których nie można oczekiwać, że doprowadzą do jakichkolwiek problemów - ale jak je przetestować, jeśli nie spodziewasz się tak silnego przecięcia?
Chociaż chciałbym usłyszeć, jak inni radzą sobie z tym problemem, interesuje mnie przede wszystkim literatura lub artykuły analizujące temat bardziej szczegółowo. Więc jeśli osobiście przestrzegasz określonej strategii, dobrze byłoby dołączyć odpowiednie odpowiedzi do swojej odpowiedzi.