Pytanie :
Jaki jest właściwy sposób usunięcia błędu, który zdaniem użytkownika końcowego jest cechą?
Opracowanie :
Zgaduję, że jeśli duży procent użytkowników spodziewał się, że będzie to funkcja, należy pozostawić „niezmieniony” lub „naprawiony”, aby był bardziej stabilny? Co jednak, jeśli bardzo mały procent użytkowników spodziewa się, że będzie to funkcja ... powiedzmy 0,1% lub 1%, a ten błąd musi zostać naprawiony.
Teoretycznie, ponieważ jest to niewielka poprawka błędu, można ją zakwalifikować jako PATCH, zgodnie z wersją semantyczną: xyZ Jednakże, ponieważ łamie ona kompatybilność wsteczną (nawet tylko dla kilku użytkowników), powinna to być GŁÓWNY wzrost: Xyz Prawidłowo? Czy nadal można go zakwalifikować jako PATCH (ponieważ nie był zamierzony jako funkcja), o ile jest to udokumentowane?
EDYCJA: W tym konkretnym przypadku jest to błąd w interfejsie API biblioteki używanej wewnętrznie, z której korzystają inni programiści.
źródło
Odpowiedzi:
Czy błąd dodaje wartości? Jeśli tak, to bardziej funkcja. Czasami „błąd” może skończyć jako „wartość dodana”.
Trudno na to jednoznacznie odpowiedzieć, ponieważ każda sytuacja będzie inna.
W takim przypadku dołączę poprawkę w ramach następnej przełomowej zmiany w odniesieniu do kompatybilności wstecznej. Nie możesz naprawdę tego robić konsekwentnie w większości środowisk i prawdopodobnie istnieje na to harmonogram / ramy czasowe.
Jako programista ostatnią rzeczą, z którą chcę sobie poradzić, jest interfejs API, który ma nieprawidłowe lub niespójne zachowanie. Błędy są uważane za to.
Przynajmniej stwórz wewnętrznie jakiś rodzaj „znanych błędów z aktualną wersją” dokumentu / wiki, abyś mógł upewnić się, że wszyscy użytkownicy wewnętrzni wiedzą, że funkcjonalność jest podobna do błędów. Mamy nadzieję, że masz wystarczająco dużo testów obejmujących obszary, w których ludzie używają funkcji błędu jako funkcji, dzięki czemu zobaczysz, gdzie / kiedy coś się psuje, kiedy / jeśli naprawisz błąd.
źródło
Polecam uczynić go bardziej stabilnym. Użytkownicy są kanonicznym źródłem tego, co robi twoje oprogramowanie. Jeśli tego chcą i zaczęli na tym polegać, dwa razy zastanowiłbym się nad wyrwaniem go.
Dobrym przykładem tego jest mechanika „Narciarstwo” w grze wideo „Plemiona”. Początkowo błąd w sposobie, w jaki silnik fizyki radził sobie ze skokami na wzgórzu, ostatecznie stał się jedną z podstawowych mechaniki gry. Możesz przeczytać trochę więcej na ten temat tutaj , jeśli jesteś ciekawy.
źródło
Ponieważ błąd znajduje się w bibliotece, oto inne podejście, które możesz zastosować:
Zrób klon błędnej funkcji biblioteki. W wielu przypadkach ludzie po prostu dodają
2
do nazwy funkcji w tych przypadkach, ale jeśli masz inne zmiany, które chciałbyś zastosować do interfejsu tej funkcji, możesz również nadać jej zupełnie inną nazwę.Napraw błąd tylko w klonie (i zaimplementuj wszystkie inne zmiany interfejsu, które chcesz, gdy jesteś przy nim).
Zadeklaruj oryginalną funkcję jako przestarzałą.
Usuń oryginalną funkcję w nadchodzącej wersji głównej.
Takie podejście jest szczególnie przydatne w przypadku funkcji, których interfejs jest zasadniczo uszkodzony: nie łamiesz kodu użytkownika od razu, ale dajesz odpowiednie ostrzeżenie każdemu, kto polega na zepsutym kodzie, aby przejść na korzystanie ze stałego kodu. I nawet jeśli ludzie nie zważą na ostrzeżenie, nie mogą tak naprawdę obwiniać cię, gdy faktycznie usuniesz zepsutą funkcję.
źródło
Jeśli ci inni programiści myśleli, że takie zachowanie jest cechą, prawdopodobnie używali go i zbudowali na nim działające oprogramowanie . Naprawienie błędu prawdopodobnie spowoduje uszkodzenie istniejącego kodu i obwini za to ciebie. To sprawia, że naprawienie błędu jest kompromisem i trzeba to rozważyć
czy naprawdę ważne jest, aby naprawić błąd, na przykład ponieważ istnieje wysokie ryzyko, że użytkownicy Twojego interfejsu API zepsują swoje aplikacje, jeśli błąd nie zostanie naprawiony? A może chodzi o spójność interfejsu API?
czy ważniejsze jest utrzymanie stabilności istniejącego oprogramowania, a twoja biblioteka jest kompatybilna wstecz?
Odpowiedź na pytanie nie zawsze jest prosta, musisz wziąć pod uwagę liczbę potencjalnych użytkowników interfejsu API, potencjalną ilość pracy, jaką będą musieli zmienić oprogramowanie, ilość oprogramowania, która ulegnie awarii, jeśli zmienisz interfejs API , ale także ryzyko związane z tym, co może się stać, jeśli nie naprawisz interfejsu API.
To, że udokumentujesz zmianę poprawki na „liście przełomowych zmian w następnej ważnej wersji”, nie sprawia, że Twoi klienci są zadowoleni - jeśli to zrobisz, powinieneś mieć przynajmniej jakieś uzasadnienie, dlaczego nie możesz pozwolić API jako takiemu był wcześniej. Często utrzymanie zgodności wstecznej jest ważniejsze niż naprawianie błędu. Napraw to tylko wtedy, gdy potrafisz oszacować wpływ na bazę użytkowników i ich oprogramowanie i jesteś pewien, że nie podejmiesz nieuzasadnionych wysiłków, gdy będą próbować zaktualizować do najnowszej wersji biblioteki. A jeśli nie masz wystarczających informacji, aby dokonać dobrego oszacowania, prawdopodobnie lepiej nie zmieniać zachowania.
(I tak, jeśli zamierzasz dokonać zmiany interfejsu API, który nie jest kompatybilny wstecz, numery wersji muszą to wyraźnie wyrażać, nie ma znaczenia, czy nazwiesz to „poprawką”, czy nie).
źródło
Przyjmij to. Może sprawić, że cały twój produkt.
GunZ: The Duel (gra online) zawiera błąd, który możesz wykorzystać i ciągle nadużywać, aby zmienić prawie całą rozgrywkę (zwaną K-Style; sprawdź na YouTube). Sprawiło, że cała gra stała się trudniejsza; wymagało to umiejętności i sprawiło, że stało się po prostu niesamowite i zabawne ... tak zabawne, że nawet moderatorzy otwarcie używali go jako głównego stylu gry.
To właśnie sprawiło, że gra.
Nie grałem od lat, ale do dziś, jako gracz, jest to jedna z moich ulubionych gier wszechczasów, ponieważ jest oparta na umiejętnościach i po prostu świetna zabawa, a cała ta niesamowitość tylko z powodu błędu.
W końcu to naprawili, ale ludzie tak bardzo tego nienawidzili, że deweloperzy poważnie to zepsuli.
Więc moja odpowiedź jest ustabilizowana i podtrzymuję ją (w razie potrzeby refaktoryzujemy).
Mówiąc o pięknej historii, nie sądzę, że ta sama odpowiedź dotyczy wszystkiego, co nie ma bezpośredniej przewagi. Jeśli twój błąd powoduje zdarzenie, które powoduje przewagę, zwykle lepiej jest naprawić błąd i znaleźć inny sposób na osiągnięcie tego, co się da. Jeśli jest poza zakresem, rozważ pozostawienie go poza byciem poza zakresem lub utwórz inny moduł (być może mały), aby go wprowadzić. Zasadniczo: nie naruszaj zasady pojedynczej odpowiedzialności .
źródło