Nie ma na świecie programisty, który wiedziałby wszystko. Duża część pracy programistów poświęcona jest poszukiwaniu dobrych i optymalnych rozwiązań. Często jednak nie udaje się odnaleźć zadowalającej odpowiedzi. W takim przypadku konieczne staje się zadawanie pytań. Ten wpis pokaże Ci jak zadawać dobre pytania techniczne, bo wbrew pozorom nie jest to takie łatwe.
Przed zadaniem pytania poszukaj, czy ktoś już miał taki problem jak ty
Historia branży IT rozpoczęła się już dobre kilkadziesiąt lat temu. Przez ten okres powstał ogrom prac, książek czy źródeł internetowych. Istnieje całkiem duże prawdopodobieństwo, że ktoś napotkał na swojej drodze podobny problem do Twojego. Równie prawdopodobne jest, że pytanie opisujące Twój problem zostało gdzieś już zadane. Wystarczy jedynie je znaleźć.
Przykładowo, korzystasz w swoim projekcie z jakiejś zewnętrznej zależności. W trakcie implementacji napotykasz na bardzo enigmatyczny błąd, który powoduje, że twoja aplikacja nie działa zgodnie z oczekiwaniami. Ponadto, sprawdziłeś swój kod, dokumentację wykorzystywanej zależności i w dalszym ciągu nie widzisz, gdzie jest błąd. W tym momencie pierwszym miejscem, które powinno zostać przeszukane, jest GitHub’owa strona wykorzystanej zależności. Obowiązkowym miejscem do sprawdzenia są issues założone przez innych programistów. Co istotne, warto sprawdzić także zamknięte issues. Problem mógł na przykład zostać rozwiązany w nowszej wersji zależności lub zignorowany a issue zamknięte. Warto również przejrzeć kod źródłowy zależności i tam poszukać potencjalnego źródła problemu.
Innymi dobrymi źródłami na poszukiwanie odpowiedzi na swoje pytania są sekcje FAQ w dokumentacjach wykorzystywanych technologii, czy stary, dobry Stack Overflow.
Zastanów się, czy pytasz w dobrym miejscu
Nawet najlepiej zadane pytanie pozostanie bez odpowiedzi, jeśli zostanie zadane w złym miejscu. Dotyczy to zarówno miejsc w Internecie, jak i pytań zadawanych twarzą w twarz. Pytanie powinno być zadane w odpowiednim miejscu i odpowiedniej osobie.
Tu również najlepiej będzie to zobrazować przykładem. Grupa zrzeszająca początkujących front-end developerów może nie być najlepszym miejscem na zadawanie pytań związanych ze szczegółami związanymi z projektowaniem systemów rozproszonych. Podobnie, pytanie architekta baz danych o stylowanie przycisku na stronie WWW może nie przynieść zadowalającego efektu.
Upewnij się, że zostały podane wszystkie istotne szczegóły
Zadając pytania techniczne, upewnij się, że wszystkie istotne szczegóły związane z Twoim problemem zostały zawarte w pytaniu. Pominięcie jakiejś informacji czy nawet pozornie nieistotnego detalu może sprawić, że otrzymasz błędną odpowiedź lub wręcz nie otrzymasz odpowiedzi wcale.
Podczas formułowania pytania pokaż, że zrobiłeś uprzednio research i koniecznie podziel się jego rezultatami. Istnieje duża szansa, że pytania zadane niechlujnie, bez wykazania własnej inicjatywy lub bez kontekstu pozostaną bez odpowiedzi.
Niech zobrazowaniem złego i dobrego pytania będą poniższe przykłady:
Mam problem z algorytmem sortowania bąbelkowego. W przypadku podania zestawu liczb: „1, 4, 4, 9, 2, 5, 6” działa niepoprawnie. Gdzie mogłem popełnić błąd?
Cześć! Implementując algorytm sortowania bąbelkowego w języku Python w wersji 3.12, napotkałem następujący problem. W momencie podania zestawu liczb, w którym dana liczba występuje więcej niż raz, algorytm ustawia tę liczbę w pierwszej kolejności, nawet jeśli nie jest ona najmniejsza w zbiorze. Przykładowy zbiór liczb, dla którego opisany problem występuje to „1, 4, 4, 9, 2, 5, 6”. Wynik zwracany przez mój algorytm to „4, 4, 1, 2, 5, 6, 9”. Spodziewany wynik to „1, 2, 4, 4, 5, 6, 9”. Sytuacja powtarza się dla każdego zbioru liczb spełniającego opisany warunek.
Moja implementacja algorytmu sortowania bąbelkowego wygląda następująco:
// tutaj kod algorytmu
Będę wdzięczny za wskazówki mogące naprowadzić mnie na źródło problemu.
Pierwsze z pytań jest tak naprawdę pytaniem, na które nie da się dobrze odpowiedzieć. Przede wszystkim pytanie nie wiadomo nawet jaki faktyczny problem ma autor. Odpowiadającemu pozostaje co najwyżej wróżenie z fusów. Z mojej perspektywy pierwsze pytanie jest pytaniem, na które wręcz nie chce się odpowiadać.
W przypadku drugiego pytania sytuacja wygląda znacząco lepiej. Przede wszystkim zdefiniowano problem. Opisano warunki wystąpienia błędu oraz podano przykładowy zestaw danych. Co najważniejsze, w pytaniu znajduje się kod algorytmu. Miłym akcentem jest także przywitanie się oraz ostatnie zdanie z wyrazami wdzięczności. To pytanie ma zdecydowanie większą szansę na znalezienie adresata, który będzie w stanie na nie odpowiedzieć w zadowalający sposób.
Przeczytaj pytanie przed opublikowaniem
Przed kliknięciem przycisku „opublikuj”, warto jeszcze raz dokładnie przeczytać całe pytanie i upewnić się, czy podano wszystkie istotne szczegóły. Przeczytanie pytania w całości przed opublikowaniem ma jeszcze jedną istotną zaletę. W ten sposób możemy praktykować na samym sobie metodę debugowania Duck Debugging. Nie zliczę ile razy odpowiedź na moje pytanie przyszła mi do głowy po napisaniu pytania lub wręcz znalazła się w napisanym przeze mnie pytaniu.
Wykaż się empatią
Po otrzymaniu odpowiedzi warto podziękować. Na przykład, w serwisie Stack Overflow poprawną odpowiedź można oznaczyć zielonym haczykiem. Zdecydowanie warto to robić, ponieważ odpowiadający dostanie za to nagrodę. Z kolei na GitHub’ie na komentarze można reagować za pomocą emoji. Taka odpowiedź będzie lepiej widoczna dla ludzi, którzy napotkają taki sam problem w przyszłości. Oprócz tego zwykłe „dziękuję, pomogło” w postaci komentarza również jest miłym gestem.
Jeśli problem był szczególnie ciekawy lub skomplikowany, warto rozważyć stworzenie artykułu na ten temat i opublikowanie go.
Podsumowanie
Cieszę się, że udało Ci się dotrzeć do końca tego wpisu. Zachęcam serdecznie do zapoznania się ze źródłami i materiałami dodatkowymi, gdzie znajdziesz więcej wskazówek jak zadawać dobre pytania techniczne.
Dla mnie zawsze nieśmiertelny jest artykuł Erica Raymonda How To Ask Questions The Smart Way.