Как правильно задавать вопросы, или Проблема XY

Что за “Проблема XY”?

Это ошибка, которая зачастую приводит к бессмысленной трате времени как просящего о помощи, так и тех, кто пытается ему отвечать. Её ещё называют “Проблемой Молотка”. Суть её, если коротко, заключается в том, что люди склонны спрашивать о своих неудачных попытках решить проблему, а не о самой проблеме. В итоге получается примерно так:

  • Человек хочет сделать X.
  • Он не знает, как сделать X, но догадывается, что к успеху может привести выполнение Y.
  • Тем не менее, человек не знает и то, как сделать Y.
  • В этот момент он решает попросить помощи у других людей.
  • Все пытаются помочь человеку с проблемой Y, удивляясь из-за того, что непонятно, зачем кому-то вообще может быть необходимо такое.
  • После длительных расспросов и ценой уймы потерянного времени наконец-то становится понятно, что человек на самом деле хотел решить X, а Y вовсе никак ему помочь не сможет.

А почему “Проблема Молотка”?

Из-за наглядного, хоть и утрированного, примера:

firstso

Источник иллюстрации: Stack Overflow, автор: Nick Volynkin

secondso

Источник иллюстрации: Stack Overflow, автор: Nick Volynkin

А можно каких-нибудь более жизненных примеров?

Конечно:

n00b: Как мне вывести последние три символа файла?

feline: Ну, например, так: echo ${foo: -3}
feline: А зачем три символа? Что надо-то?
feline: Может, расширение файла?

n00b: Да.

feline: Так и говори прямо, чего хочешь!
feline: Не факт, что каждое имя файла имеет трехбуквенное расширение.
feline: Так что тупо взять три последних символа — это не решение проблемы.
feline: Нужно так: echo ${foo##*.}

Или…

Angela: ‘nmap -O -A 127.0.0.1’ возвращает несколько строк, начинающихся с ‘OS:’. Как изменить это?
Obama: Глянь в исходники nmap, отыщи то место, где оно определяет ось, и перепиши TCP/IP стек, чтобы тот ничем не выдавал nmap операционную систему.
Angela: Круто, но я ничего не знаю про api linux’а.
Obama: Очень жаль, но, похоже, кроме как переписать TCP/IP стек, никакого выхода нет.
Angela: Но мне ооочень нужно избежать подобных сообщений :с Может iptables мне поможет?
Obama: Ну, ты можешь просто не использовать обнаружение ОС, в чём проблема?
Angela: Я хочу, чтобы и другие не могли узнать, какая у мень операционка.

Да, похоже, так можно потерять немало времени. И какая же мораль?

Чтобы избежать проблемы XY стоит придерживаться следующих несложных правил:

  • Предоставлять о решаемом вопросе достаточно широкую информацию — кроме самого неудачного примера стоит написать, чего вы хотите добиться в целом.
  • Если кто-то просит у вас больше информации о проблеме, вероятно стоит эту информацию предоставить.
  • Всегда пишите о том, что вы уже пробовали делать, и почему от этого отказались. Это поможет точнее определить, что именно вам необходимо.

И помните — если бы ваши догадки всегда оказывались верными, вам бы не нужна была помощь, верно?


Кстати, еще полезными рекомендациями по тому, как правильно задавать вопросы, с нами поделились наши друзья из Stack Overflow.

Пётр Соковых, транслятор двоичного кода в русский язык