XY 问题,以及更多……
XY 问题是很经典的问题,甚至有一个 专门的网站 来阐述。很多人提问时,也陷入了 XY 问题的泥潭。
XY 问题是什么
XY 问题指的是提问者不提问实际问题,而是提问尝试的解决方案,从而导致提问者和回应者浪费大量时间和精力的问题。
这里有一个我构建出来的例子。
小明是一个 Node.js 入门者,他想要 获取一个文件夹所有文件对应的后缀名。碰巧的是,这些后缀名都是四个字符。所以小明向开发朋友提出了这样的问题:我要怎么 拿到一个字符串最后四位字符?他会得到类似的答案:string.slice(-4)
。
小明开开心心地用上了这个方案,但过了一段时间后他发现,还有太多预想外的情况了,比如 .eslintrc
没有后缀名,a.jpeg
的后缀名有五个字符。小明基于以上的答案,自己花了点时间,又去请教了别人,拓展了处理方法。
现在小明终于得到了一个可行的处理方法,它工作得很好!直到有一天,小明知道了 path.extname
就可以做到,但这个时候,他已经耗费了不止一个小时在这个问题上面,帮助他的人也因为他的提问耗费了不少时间。
你可能会觉得这个例子过于简单,或者过于虚假。我可以给出一个更为实际的例子。
小明学习 Node.js 只是出于爱好,实际上小明是一个产品经理。今天,他收到了一个需求,客户希望 后台系统可以增加侧边栏排序的功能,而且需要记录到每个账号的偏好上。他和开发同学沟通之后,发现这个工作量可不小,前后端都要调整。
小明和开发同学沟通之后,发现这个工作量可不小,前后端都要调整。在与客户沟通过上线时间后,开发和测试同学尽力工作,只用了 10 个工作日,相关功能就开发、测试、部署完毕,可以给客户使用了。
遗憾的是,他们做的都是无用功。客户想要 更方便地进入特定页面,于是想到了通过侧边栏排序的方式来实现这个想法。但是,有太多方法可以又快又好地实现这个需求了,可以在页面上增加页面搜索,快速进入页面,也可以记录下用户经常进入的页面,方便用户再次进入。这些方法都不需要 10 个工作日,只需要几个小时就可以完成。
在这个例子里,XY 问题导致了 20 倍的时间损耗(以 4 小时可以完成工作,但使用了 10 个工作日,每个工作日 8 小时来计算)。
在强调效率的现代社会,这是一件极度奢侈的事情。
怎么破解 XY 问题
人们总是不经意地忽略了自己的目标,而过于关注实现目标的过程,甚至于陷入不合适的过程中而不自知。
在上面两个例子中,目标分别是 获取一个文件夹所有文件对应的后缀名 和 更方便地进入特定页面,而过程分别是 拿到一个字符串最后四位字符 和 后台系统可以增加侧边栏排序的功能。
要破解 XY 问题本身,最有效的方法是 描述目标,而不是过程。
作为补充,在描述目标时,应当包括你能想到的所有相关信息,你尝试过的所有解决方案,为什么否决了这些解决方案。如果有人要求提供更多信息,最好的方法就是提供一下。如果你能解决这个问题,自然你也不需要提问,不是吗?
两个例子的背后
上面两个例子并非只反映出 XY 问题。我希望你能自己深入思考一下上面两个例子,再向下看,印证自己的思考。
在第一个例子中,作为 Node.js 初学者的小明,他没有去查阅文档,也没有借助 Google,而是直接向开发朋友提问,这实际上是 把自己能做的事和应该要做的事嫁接到他人身上,让别人为他付出时间。但实际上,大家都有事情要做,帮你是情分,不帮你是本分,为什么不 自己先尝试解决这个问题 呢?在解决不了的情况下,真挚地提问,详细地描述,我相信没有朋友不愿意提供力所能及地帮助。
在第二个例子中,作为产品经理的小明,在沟通之中没有切实地 分析出用户的真实需求,做了 无效沟通,而开发同学没有 遵循项目管理规范 ,没有主动和小明一起 评审需求,最终损耗了大家大量的时间和精力。
借用 阿里云云效文档 的一张图来说明,首先需要收集需求,然后评审、澄清需求,完成设计,投入开发,经过测试调整后,最终上线。这么做,可以有效地防止时间浪费,提高效率。
我非常推荐你阅读学习 非暴力沟通,在其中提到了 XY 问题以及更多内容。你可以在微信阅读上免费阅读。
此外,提问的智慧 和 如何向开源社区提问题 也值得你阅读学习。