层楼

Write codes that work and speak

0%

【译】XY问题

译自:The XY Problem

XY问题是什么?

XY问题是指:你向别人问问题时,问的是尝试的解决办法,而不是原本遇到的问题。这对于寻求和提供帮助的人来说,都是时间和精力的浪费。

  • 用户想解决X。
  • 用户不知道怎么做到X,但认为如果能够做到Y,就可以摸索出解决方案。
  • 用户也不知道怎么做到Y。
  • 用户寻求帮助,询问如何做到Y。
  • 其他人试图帮助用户解决问题Y,但感觉很困惑,因为解决Y听起来很怪。
  • 经过长时间交流,浪费大量时间,最终搞明白用户真正要做的是X,而Y其实都算不上一个好的解决方案。

问题就在于人们陷入自认为的解决方案中,不能退一步完整解释原本的问题。

应该怎么办?

  • 在讨论任何尝试的解决方案时,别忘了描述问题的全貌。
  • 如果有人想了解更多信息,请提供详细背景。
  • 如果你已经排除了一些解决方案,分享一下为什么你排除了它们。这可以更清楚地阐明你的需求。

请记住,如果你的诊断理论准确的话,你就不需要寻求帮助了,对吧?

示例

示例1

n00b实际上不是想要文件名的最后3个字符,他想要的是文件扩展名,所以为什么要询问最后3个字符呢?

1
2
3
4
5
6
7
8
<n00b> 如何打印出文件名的最后三个字符?
<feline> 如果它们在一个变量中:echo ${foo: -3}
<feline> 为什么是3个字符?你想要做什么?
<feline> 你是想要文件的扩展名吗?
<n00b> 是的。
<feline> 并不是每种文件扩展名的长度都是三个字母。
<feline> 盲目地打印三个字符并不能解决问题。
<feline> echo ${foo##*.}

示例2

如果Angela一开始就解释她想要防止他人检测到她的操作系统,这个讨论可能会更加简洁高效。

1
2
3
4
5
6
7
<Angela> 'nmap -O -A 127.0.0.1' 会返回一些以 'OS:' 开头的行。如何更改它?
<Obama> 查找 nmap 的源代码,找出它如何确定 Linux 的部分,然后重写你的 TCP/IP 协议栈,使其不以 nmap 可以检测到的方式工作。
<Angela> 是的,但我对 Linux 系统 API 一无所知。
<Obama> 嗯,nmap 的参考指纹(fingerprint)是基于 TCP/IP 协议栈的工作方式,除了重写相应部分的协议栈,没有其他的办法。
<Angela> 我真的需要避免这些消息。iptables 能做这个工作吗?
<Obama> 嗯,不要使用操作系统检测或版本扫描。
<Angela> 我想要防止他人知道我的操作系统类型。