Jak leczyć błędy, które użytkownicy uważali za funkcję?

15

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.

robodude666
źródło
8
Czy nie wszystkie funkcje błędów? ;)
Lawrence Aiello
2
zapewnić przełącznik w nowej wersji, który jest domyślnie wyłączony, a po włączeniu będzie emulować stare zachowanie? zdarza się cały czas. brak wiadomości, przejdź dalej
rwong
16
Jak ogrzewanie spacją ?
Karl Bielefeldt
Czasami funkcja jest niczym więcej niż błędem, zgodnie z opisem działu marketingu.
Dan Pichelman
Zaktualizowałem oryginalny post, aby wyjaśnić, że jest to błąd w wewnętrznie używanej bibliotece; Myślę, że jest to inny przypadek niż błąd w produkcie sprzedawanym klientom, ponieważ nie wpływa to na przepływ pracy ani użyteczność.
robodude666

Odpowiedzi:

7

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?

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 tym konkretnym przypadku jest to błąd w interfejsie API biblioteki używanej wewnętrznie, z której korzystają inni programiści.

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.

kraina krańca
źródło
10

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.

Morgen
źródło
3
Funkcja wspólnego prawa .
Deduplicator
2
Innym doskonałym przykładem gry wideo jest możliwość anulowania ruchów w inne ruchy w starych wersjach Street Fighter ( en.wikipedia.org/wiki/… ). Początkowo był to błąd, który stał się „funkcją”.
Michael
8

Ponieważ błąd znajduje się w bibliotece, oto inne podejście, które możesz zastosować:

  1. Zrób klon błędnej funkcji biblioteki. W wielu przypadkach ludzie po prostu dodają 2do 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ę.

  2. Napraw błąd tylko w klonie (i zaimplementuj wszystkie inne zmiany interfejsu, które chcesz, gdy jesteś przy nim).

  3. Zadeklaruj oryginalną funkcję jako przestarzałą.

  4. 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ę.

cmaster - przywróć monikę
źródło
1
W tym konkretnym przypadku funkcja „zepsuta” może działać w nieskończoność, ponieważ zapewnia zasadniczo inne (i cenne) zachowanie.
RubberDuck
Jak ten klon działa lepiej niż nowa główna wersja korzystająca z wersji semantycznej?
Kat
@ Mike Unika łamania całego starszego kodu, który opiera się na błędzie. W zależności od ilości tego kodu może to być ogromna zaleta. Jeśli złamiesz kod użytkownika w sposób, który trudno jest naprawić, może się okazać, że Twoja nowa wersja biblioteki nie jest w ogóle używana. Wszystkie dobre rzeczy w twojej nowej wersji są ignorowane tylko dlatego, że próg adopcji jest zbyt wysoki; przywiązałeś swoich użytkowników do starej wersji. Jeśli nadal będziesz oferować „funkcję”, ludzie mogą natychmiast się zmienić. I, w zależności od Twojej komunikacji dotyczącej wycofania, zaczną również unikać przestarzałej funkcji.
cmaster
4

W tym konkretnym przypadku jest to błąd w interfejsie API biblioteki używanej wewnętrznie, z której korzystają inni programiści.

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).

Doktor Brown
źródło
1

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 .

MasterMastic
źródło