„To nie bug, to feature” — kultowe powiedzenie ze świata programowania, które zamienia błąd w udokumentowane zachowanie. Żart tak stary, że jego korzenie sięgają wczesnych dni branży — pierwsze udokumentowane użycie datuje się na 1976 rok w kontekście edytora tekstu RUNOFF. Od tamtej pory fraza stała się uniwersalnym usprawiedliwieniem dla każdego nieoczekiwanego zachowania programu. Według badania JetBrains Developer Ecosystem 2024, 72% programistów przynajmniej raz w życiu użyło tego powiedzenia — żartem lub na serio. Analizujemy historię memu, psychologię jego używania oraz granicę między bugiem a feature'em.
Najważniejsze
„To nie bug, to feature” — powiedzenie, którym programista lub menedżer oznacza, że nieoczekiwane zachowanie programu jest zamierzone, a nie błędne. W klasycznym przypadku jest to żart: wszyscy rozumieją, że zachowanie jest błędne, ale nazywają je „feature'em” dla rozładowania napięcia. Jednak w rzeczywistych projektach fraza używana jest również na serio — gdy zachowanie rzeczywiście odpowiada specyfikacji, ale nie odpowiada oczekiwaniom użytkownika.
Różnica między bugiem a feature'em jest często subiektywna. Dla programisty, który napisał kod, pewne zachowanie może wydawać się logiczne. Dla użytkownika — nieoczekiwane i błędne. Subiektywność percepcji — główny powód, dla którego fraza jest tak żywotna. Pozwala przenieść rozmowę z płaszczyzny „kto jest winien” na płaszczyznę „tak zostało zaprojektowane”. Według UX Collective, 40% bugów zgłaszanych przez użytkowników to w rzeczywistości problemy UX, a nie błędy kodu.
W zespołach agile fraza często używana jest jako mechanizm obronny podczas demo. Programista pokazuje nieoczekiwane zachowanie, product owner marszczy brwi i pada sakramentalne „to nie bug, to feature”. Zaufanie w zespole decyduje, czy fraza zostanie odebrana jako żart, czy jako próba ukrycia problemu. W zdrowym zespole taki żart rozładowuje atmosferę, w toksycznym — wywołuje konflikt.
Pierwsze znane użycie frazy odnotowano w 1976 roku w jednym z biuletynów DECUS (Digital Equipment Corporation User Society). Użytkownik skarżył się, że edytor tekstu RUNOFF nieprawidłowo przetwarza puste linie. Odpowiedź programisty: „To nie bug, to feature — w ten sposób przetwarzane są akapity”. Od tamtej pory fraza stała się symbolem obrony kodu napisanego „tak jak jest”, niezależnie od jego rzeczywistej jakości.
Do popularyzacji frazy przyczynił się Jargon File — słownik hakerskiego slangu, który w latach 90. stał się podstawą książki „The New Hacker's Dictionary”. W Jargon File hasło „feature” bezpośrednio odnosi się do bugów, które stały się feature'ami z powodu niemożności lub niechęci do ich naprawienia. Przykład: klawisz Caps Lock we wczesnych terminalach nie miał wskaźnika — był to bug, który stał się feature'em „do ślepego pisania”.
W latach 2000. fraza przeniknęła do kultury masowej za pośrednictwem memów internetowych. Obrazek z kotem podpisany „It's not a bug, it's a feature” rozszedł się po forach i mediach społecznościowych. W branży gier fraza używana jest szczególnie często: glitche, które nie przeszkadzają w rozgrywce, ogłaszane są „feature'ami” dla atmosfery. Fenomen kulturowy wyszedł daleko poza IT — frazę można usłyszeć w każdym kontekście, w którym usprawiedliwia się błąd.
Psychologiczną podstawą frazy jest dysonans poznawczy. Programista spędził godziny na pisaniu kodu, a przyznanie, że wynik jest błędny, oznacza zdewaluowanie własnej pracy. Fraza „to nie bug, to feature” zmniejsza dysonans: błąd zamienia się w zamierzone rozwiązanie, a programista — z winowajcy w autora pomysłu. To mechanizm obronny psychiki, który chroni poczucie własnej wartości.
Drugi powód — strach przed przeróbkami. Jeśli przyznać się do buga, trzeba ponownie przejść code review, testowanie i wdrożenie. „Feature” nie wymaga poprawy — zadanie jest zamykane, obciążenie maleje. Według Microsoft Research, programiści świadomie zaniżają wagę bugów, aby uniknąć przeróbek, w 23% przypadków. Fraza jest łagodną formą takiego zaniżania.
Trzeci powód — kultura korporacyjna. W niektórych firmach bugi są uwzględniane w KPI programisty, a wykrycie buga podczas code review uznaje się za błąd autora. W takim środowisku fraza „to nie bug, to feature” to sposób na uniknięcie negatywnych konsekwencji dla kariery. Zdrowa kultura błędów (blameless culture) eliminuje ten powód: jeśli bugi nie są karane, łatwiej je przyznawać.
Wyraźna granica istnieje tylko przy Acceptance Criteria (kryteriach akceptacji). Jeśli zachowanie nie odpowiada żadnemu punktowi AC — to bug. Jeśli zachowanie odpowiada AC, ale nie podoba się użytkownikowi — to problem UX, a nie bug. Jeśli AC nie ma — każde zachowanie można ogłosić feature'em i to jest główna przyczyna żywotności frazy.
Praktyczna zasada: bug — to kiedy program robi to, czego nie powinien, lub nie robi tego, co powinien, zgodnie ze specyfikacją. Feature — to kiedy program robi to, co zostało zaprojektowane, nawet jeśli wynik zaskakuje użytkownika. Przypadki sporne: undefined behavior (język nie określa wyniku), race conditions (przejawiają się niestabilnie), wartości skrajne (działa dla 99% danych).
Do rozgraniczenia używaj macierzy decyzji:
Najbardziej niebezpieczny przypadek — gdy specyfikacja nie istnieje, a programista sam decyduje, co jest feature'em. W takich projektach każdy błąd może zostać ogłoszony „feature'em”, co czyni kod nieprzewidywalnym dla całego zespołu. Jasne Acceptance Criteria dla każdego zadania — jedyny sposób na obiektywne wyznaczenie granicy.
Pierwsze zagrożenie — rozmycie jakości. Jeśli każdy bug można ogłosić feature'em, zespół nie ma motywacji do pisania wysokiej jakości kodu. Błędy przestają być naprawiane, dług techniczny rośnie, a użytkownicy przyzwyczajają się do „dziwnego zachowania”. Prędzej czy później konkurent wypuszcza produkt działający przewidywalnie i użytkownicy odchodzą.
Drugie zagrożenie — konflikty w zespole. Inżynier QA znajduje buga, programista mówi „to feature”. Jeśli brak obiektywnych kryteriów (Acceptance Criteria), spór przechodzi w sferę osobistą: „źle testujesz” vs „źle programujesz”. Według PractiTest State of Testing 2023, spory „bug vs feature” to jedna z trzech głównych przyczyn tarcia między QA a programistami.
Trzecie zagrożenie — ryzyka prawne. W branżach regulowanych (medycyna, finanse, lotnictwo) pojęcia „bug” i „feature” mają wagę prawną. Jeśli w oprogramowaniu medycznym zachowanie zostanie ogłoszone feature'em, a prowadzi ono do nieprawidłowego obliczenia dawkowania — to nie żart, a naruszenie wymogów regulacyjnych. Systemy safety-critical nie wybaczają zamiany pojęć, dlatego zawsze stosuje się w nich formal verification.
Głównym narzędziem są jasne Acceptance Criteria w każdym zadaniu. AC pisze się przed rozpoczęciem prac: „Po wprowadzeniu X system powinien zwrócić Y”. Jeśli zachowanie nie jest opisane — to domyślnie bug, nawet jeśli programista uważa inaczej. AC muszą być mierzalne i weryfikowalne: „przycisk zielony” — źle, „HEX #00FF00” — dobrze.
Drugim narzędziem jest Definition of Done w zespole. Jasny opis tego, co oznacza „zadanie wykonane”: kod napisany, testy napisane, testy przechodzą, code review zaliczone, wdrożone na staging, przetestowane przez QA. Jeśli wszystkie punkty DoD są spełnione, a użytkownik narzeka — to nie bug, a missed requirement, który trafia do backlogu jako nowy feature.
Trzecim narzędziem jest kultura blameless post-mortem. Jeśli bug został ogłoszony feature'em i trafił na produkcję — analizujemy przyczyny, a nie szukamy winnego. Dlaczego programista uznał, że to feature? Dlaczego QA przepuścił? Dlaczego AC były niekompletne? Odpowiedzi na te pytania usprawniają proces, a nie karzą ludzi. Usprawnienia systemowe działają skuteczniej niż zakaz frazy „to nie bug, to feature”.
Często zadawane pytania
Tylko jako żart w nieformalnej rozmowie, gdy wszyscy uczestnicy rozumieją, że to ironia. Lub gdy zachowanie rzeczywiście odpowiada specyfikacji, ale budzi wątpliwości. W poważnych dyskusjach — nigdy.
Sprawdź Acceptance Criteria zadania. Jeśli zachowanie nie jest opisane — to bug. Jeśli jest opisane, ale zaimplementowane inaczej — bug. Jeśli opisane i zaimplementowane poprawnie — feature, niezależnie od tego, jak dziwnie wygląda.
W branży gier niektóre nieoczekiwane zachowania stają się popularne wśród graczy i utrwalają się jako feature'y. Przykłady: rocket jumping w Quake, wave dashing w Super Smash Bros. Mechanika powstała z buga z czasem staje się częścią gry.
Zadaj pytanie: „Gdzie w Acceptance Criteria jest opisane takie zachowanie?”. Jeśli nie ma odpowiedzi — poproś o dodanie opisu do zadania. Jeśli programista odmawia — porusz temat na daily standup lub code review. Dokumentacja — jedyny obiektywny arbiter.
Tak, jeśli product owner świadomie podejmuje decyzję o pozostawieniu zachowania bez zmian i aktualizuje specyfikację. W takim przypadku bug przestaje być bugiem — staje się zamierzonym zachowaniem, potwierdzonym dokumentacyjnie i uzgodnionym z zespołem.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również