====== Wstęp ====== Ktoś zwrócił ci uwagę, że być może nie opisałeś pierwotnego problemu, więc przeczytaj to uważnie. ===== Wikipedia ===== (([[https://en.wikipedia.org/wiki/XY_problem|Wikipedia O problemie X i Y]])) Problem XY to problem komunikacyjny występujący w centrach pomocy technicznej i podobnych sytuacjach, w których osoba prosząca o pomoc zaciemnia prawdziwy problem, X, ponieważ zamiast zapytać bezpośrednio o problem X, pyta o to, jak rozwiązać problem drugorzędny, Y, który jej zdaniem pozwoli jej rozwiązać problem X. Jednak rozwiązanie problemu Y często nie rozwiązuje problemu X lub jest niewłaściwym sposobem na jego rozwiązanie, a ukrycie prawdziwego problemu i wprowadzenie potencjalnie dziwnego problemu drugorzędnego może sprawić, że osoba próbująca pomóc napotka niepotrzebne trudności w komunikacji i/lub zaproponuje niewłaściwe rozwiązania. Problem XY często występuje w środowiskach pomocy technicznej lub obsługi klienta, gdzie użytkownik końcowy próbował samodzielnie rozwiązać problem i błędnie rozumie jego prawdziwą naturę, wierząc, że jego rzeczywisty problem X został już rozwiązany, z wyjątkiem pewnego drobnego szczegółu Y w jego rozwiązaniu. Niezdolność personelu wsparcia do rozwiązania rzeczywistego problemu lub zrozumienia charakteru zgłoszenia może wywołać frustrację u użytkownika końcowego. Sytuacja ta może stać się jasna, gdy użytkownik końcowy zapyta o jakiś pozornie nieistotny szczegół, który nie ma związku z żadnym użytecznym celem końcowym. Rozwiązaniem dla personelu wsparcia jest zadawanie pytań dociekliwych dotyczących tego, dlaczego dana informacja jest potrzebna, aby zidentyfikować podstawowy problem i skierować użytkownika końcowego z dala od nieproduktywnej ścieżki zapytania. ---- ==== Stack Exchange ==== (([[https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem|StackExchange na temat problemu X i Y]])) Czym jest ten problem? \\ Problem XY polega na tym, że pytanie dotyczy proponowanego rozwiązania, a nie rzeczywistego problemu. \\ \\ Oznacza to, że próbujesz rozwiązać problem X i uważasz, że rozwiązanie Y mogłoby zadziałać, ale zamiast pytać o X, gdy napotykasz trudności, pytasz o Y. \\ \\ ====== Problem „ ====== ” \\ Może to powodować frustrację u osób, które próbują pomóc ci rozwiązać problem, ponieważ w momencie, gdy o to pytasz, rozwiązanie, w którym potrzebujesz pomocy, może nie mieć żadnego oczywistego związku z problemem, który próbujesz rozwiązać. Jak tego uniknąć Aby nie wpaść w tę pułapkę, zawsze podawaj informacje dotyczące szerszego kontekstu wraz z każdą proponowaną metodą rozwiązania. Jeśli ktoś poprosi o więcej informacji, a zwłaszcza o bardziej konkretne pytanie, podaj szczegóły. Jeśli istnieją inne rozwiązania, które Twoim zdaniem mogą zostać zaproponowane, a które już wykluczyłeś, nie próbuj unikać ponownego ich omawiania – zamiast tego wyjaśnij, dlaczego je wykluczyłeś, ponieważ dostarcza to więcej informacji na temat Twoich wymagań i pomaga innym udzielić lepszych odpowiedzi. == Przykład == Oto niedawna rozmowa na IRC jako ilustracja: \\ P: Czy istnieje funkcja zwracająca ciąg znaków pomiędzy dwoma ogranicznikami? \\ B: Nie rozumiem, o co ci chodzi, ale wątpię, żeby taka funkcja już istniała \\ C: Split i slice \\ D: „Partition” też \\ P: Próbowałem użyć funkcji partition \\ P: Próbowałem użyć wbudowanych funkcji, aby uzyskać liczbę znajdującą się między czymś takim w ciągu znaków: „attribute1: 50.223, attribute2: 442.1” \\ D: Dlaczego po prostu nie przeanalizować tego ciągu znaków? \\ Q: Myślałem, że mogą istnieć jakieś wbudowane funkcje do analizowania \\ D: pairs = [x.strip() for x in s.split(",")]; attribs = {k: v for x in pairs for k, v in [x.split(": ")]} \\ D: Istnieje kilka bibliotek, ale proste formaty są wystarczająco łatwe — jeśli nie zależy ci na obsłudze błędów \\ D: Jeśli to możliwe, zaleca się zmodyfikowanie kodu źródłowego tak, aby korzystał z powszechnie znanego formatu, np. JSON lub YAML \\ P: Ten kod faktycznie pochodzi z HTML \\ P: Ale nie wiem, jak parsować JavaScript za pomocą HTMLParser lub jakkolwiek to się nazywa \\ D: Czy jest on po prostu osadzony w HTML, czy też jest to jakaś zniekształcona wersja HTML? \\ P: Jest osadzony w kodzie HTML \\ D: Jeśli to JavaScript (a tak właśnie jest, z wyjątkiem brakujących nawiasów zewnętrznych), JSON prawdopodobnie da radę go przeanalizować \\ P: Dzięki \\ D: Nie powiedziałem tego wprost: JSON analizuje wyłącznie struktury danych, a nie kod JS \\ Q: Potrzebuję tylko, żeby przeanalizowano strukturę danych \\ Problem polega na tym, że //tak naprawdę// w tym, jak przetworzyć struktury danych JavaScriptu, a nie w znalezieniu „ciągu znaków między dwoma ogranicznikami”, jednak dotarcie do sedna sprawy zajmuje sporo czasu i wymaga intuicji. Łatwiej jest to zrobić w pełni interaktywnym czacie (niezależnie od trybu), ale na stronie SE, gdzie dopracowuje się nieco post, publikuje go, a następnie czeka się 5–30 minut lub dłużej na opinie, naprawdę pomaga podążać we właściwym kierunku od samego początku. ---- ==== XYProblem.info ==== (([[https://xyproblem.info/|xyproblem.info o problemie X i Y]])) Problem XY polega na tym, że pytanie dotyczy raczej proponowanego rozwiązania niż rzeczywistego problemu. Prowadzi to do ogromnej straty czasu i energii, zarówno ze strony osób proszących o pomoc, jak i tych, które ją udzielają. \\ \\ Użytkownik chce wykonać X. \\ Użytkownik nie wie, jak wykonać X, ale uważa, że uda mu się jakoś dotrzeć do rozwiązania, jeśli tylko zdoła wykonać Y. \\ Użytkownik nie wie też, jak wykonać Y. \\ Użytkownik prosi o pomoc w sprawie Y. \\ Inni próbują pomóc użytkownikowi w sprawie Y, ale są zdezorientowani, ponieważ Y wydaje się dziwnym problemem, który ktoś chciałby rozwiązać. \\ Po wielu rozmowach i zmarnowanym czasie w końcu staje się jasne, że użytkownik tak naprawdę potrzebuje pomocy w sprawie X, a Y nie było nawet odpowiednim rozwiązaniem dla X. \\ Problem pojawia się, gdy ludzie utkną w tym, co uważają za rozwiązanie, i nie są w stanie nabrać dystansu oraz w pełni wyjaśnić problemu. \\ \\ == Co z tym zrobić? == Zawsze podawaj informacje dotyczące szerszego kontekstu wraz z każdą proponowaną metodą rozwiązania. \\ Jeśli ktoś poprosi o więcej informacji, podaj szczegóły. \\ Jeśli istnieją inne rozwiązania, które już wykluczyłeś, wyjaśnij, dlaczego je odrzuciłeś. Dzięki temu uzyskamy więcej informacji na temat twoich wymagań. \\ Pamiętaj, że gdyby twoje hipotezy diagnostyczne były trafne, nie prosiłbyś o pomoc, prawda? \\ --- # Przykłady Przykład 1 n00b tak naprawdę nie chce ostatnich 3 znaków w nazwie pliku, tylko rozszerzenia plików, więc po co pytać o ostatnie 3 znaki? \\ \\ \\ Jak mogę wyświetlić trzy ostatnie znaki nazwy pliku? \\ Jeśli znajdują się w zmiennej: echo ${foo: -3} \\ Dlaczego 3 znaki? Czego NAPRAWDĘ chcesz? \\ Czy chcesz uwzględnić rozszerzenie? \\ Tak. \\ Nie ma gwarancji, że każda nazwa pliku będzie miała trzyliterowe rozszerzenie, \\ więc ślepe wybieranie trzech znaków nie rozwiązuje problemu. \\ echo ${foo##*.} \\ == Przykład 2 == Gdyby Angela na początku wyjaśniła, że chce uniemożliwić innym wykrycie jej systemu operacyjnego, dyskusja mogłaby być znacznie krótsza i bardziej owocna. \\ Angela: Polecenie „nmap -O -A 127.0.0.1” zwraca kilka wierszy zaczynających się od „OS:”. Jak to zmienić? \\ Obama: Zajrzyj do kodu źródłowego programu nmap, sprawdź, w jaki sposób rozpoznaje on system Linux, a następnie przepisz swój stos TCP/IP tak, aby nie działał w sposób, który nmap może wykryć. \\ Angela: Tak, ale nie mam pojęcia o interfejsie API systemu Linux. \\ Obama: Cóż, rozpoznawanie nmap opiera się na sposobie działania stosu TCP/IP, więc nie ma innego rozwiązania niż przepisanie odpowiednich części tego stosu. \\ Angela: Naprawdę muszę uniknąć tych komunikatów. Czy iptables poradzi sobie z tym zadaniem? \\ Obama: Cóż, nie korzystaj z funkcji wykrywania systemu operacyjnego ani skanowania wersji. \\ Angela: Chcę uniemożliwić innym poznanie typu mojego systemu operacyjnego \\ ---- ====== Wnioski ====== Problem X i Y można rozwiązać w ten sposób, że dokładnie opiszesz, co chcesz osiągnąć i jakie próby już podjąłeś.