那么,什么是X-Y问题呢?我举两个例子:
请大家看下面这张图:
这个同学写的爬虫代码运行一段时间以后,内存会急剧上升,因此它觉得上Requests 有内存泄漏的问题。于是大家都在回答怎么检测哪一行代码导致了内存泄漏,以及出现了内存泄漏应该怎么办。甚至有人为了复现这个问题,专门写了很长的代码,搞了几十个线程,循环请求一个网站几十万次来验证Requests在什么情况下会内存泄露。
很多人劳神费力搞了半天,最后无论怎么样都没有办法触发这个内存泄漏的问题。于是让那个提问的人把代码发上来。大家一看代码才发现,这个同学的代码里面,在while True
中不停创建线程,导致内存占用越来越高。他的整个问题跟Requests没有半毛钱关系。
第二个例子,肯定在你身上也发生过。你的代码报错了,报错原因是xxx,于是你去网上搜索xxx报错是什么原因,怎么解决。看了一下午,问题始终没有办法解决。最后让大神来从头看了一下你的代码,发现问题其实是yyy。
所谓的X-Y问题,就是发生了一个问题X,但是你根据问题的表象,以为这是问题Y,于是尝试去找Y的答案,从而浪费大量的时间和人力。
所以,如果你要提问,你必须要确保你问的是真正问题的解决方案,而不是你以为的问题的解决方案。如果你不知道真正要解决的问题是什么,为了避免出现误解,你需要先把自己的业务场景描述清楚,你期望的结果是什么,实际的结果是什么。然后给出一段脱敏后的,能复现问题的最小代码Demo,这样别人在分析问题的时候,才能帮你找到根本原因,而不是被你自以为是问题的Y牵着鼻子走。
在公众号粉丝群里面,有不少同学提问题不讲科学,毫无逻辑,上来就说:xxx报错了是什么原因?
。然后就没有然后了。
报错的原因千千万,谁知道你这个报错是什么原因,你至少把具体报错信息截图发一下,再把报错位置的代码发一下啊。
问题都不会提,就不要怪别人不想回答你了。因此,再次建议大家,提问之前做一些准备,避免浪费大家的时间:
- 这个问题的背景是什么?
- 你期望的结果是什么?
- 实际上运行的结果是什么?是报错了还是结果错误?
- 如果是报错,把报错信息截图发上来
- 准备一段能够稳定复现你的问题的代码。这一段代码需要满足:
- 提前单步调试你的代码,把所有不必要的环节全部省略,能写死的变量全部写死,只保留直接触发问题的关键代码
- 不要超过40行
- 使用截图发送,而不是直接把文字发送到聊天窗口,带上行号
- 给出能够触发问题的输入
- 如果你做不到第5条,那就不要把一段包含几百行代码的文件发送出来了,没有人想去看这么长的代码,你又没给钱
那么如果有人的问题不是代码报错,而是类似于FastAPI怎么返回二进制文件
这种问题的话,搜索引擎会比群友更快回答你。
END