橡皮鸭解题法

橡皮鸭子真的很有用,多年来,帮我解决了无数的问题。不敢私藏,愿与大家分享。

下面内容来自一篇很有趣的文章——Rubber Duck Problem Solving,简单翻译了一下,希望对大家有帮助:

Stack Exchange 上,我们坚持 提问题的人应该在提问之前先花点时间研究一下他们的问题。是的,我们在某种程度上非常坚持这种观点。也就是说,当你提问一下问题时,你应该:

  • 最大程度地描述清楚你的问题,让我们能够跟上你的思路。提供必要的背景信息,帮助我们理解发生了什么,即使我们不是你那个领域的专家。
  • 告诉我们你为什么想得到这个答案,你是如何想到找我们解决问题的。你的提问只是出于好奇心,还是你卡在了某个项目上?我们并不需要你全部的人生故事,给我们一些关于该问题基本的外围信息就好。
  • 告诉我们你在尝试解决该问题时都尝试了哪些方法,是否有所发现,你都发现了什么。我们想问一下,如果你没有尝试过任何解决问题的方法,你应该直接到这里来问吗?退一万步讲,这是个公平问题 --- 如果你想让我们花一些很有价值的时间去帮助你解决问题,唯一让我们觉得公平的是,你同样花了合情合理的有价值的时间去制造一个是合适的问题。帮助我们就是帮助你自己。

我们有一个非常好的How to Ask 页面解释了所有的内容。(并且在Stack Overflow上,由于问题太多,我们实际上强制新用户在提问第一个问题之前点击那个页面。通过匿名用户或点击Ask Question in incognito你就能看到这个页面。)

大部分时间,我们试图避免那些无法回答的问题。那样的问题对任何人都没有帮助,留下来只将一个好端端的问答网站变成阴魂不散的虚拟城市。在Stack Exchange上,那些缺少信息和背景的无法合情合理地回答的问题将被直接关闭。并且,如果在接下来的一段时间内没有改进,将最终被删除。

正如我之前所说的,我们就是这种人。但有更好解释是:我们通过教授你橡皮鸭子问题解决法,试图非常明确地努力帮助你。而且,一直以来这样做都是有效的。人们在Stack Overflow或者另一外的Stack Exchange网站上得到了大量的反馈,就是说,以这样的方式撰写具体问题的过程中,最终他们自己想出了自己问题的答案。

这事已经很常见了。不信的话你自己看:

当我解决了自己的问题,我该如何感谢社区呢?

迄今为止我只发布过一个问题,并且几乎要发布另一个。在这两种情况下,在撰写问题的过程中,我往往能部分地回答我自己要问的问题。我之所以能想出答案,这要归功于社区以及描述问题的过程。在我描述问题时,没有明确的与问题答案有关的线索,但问题写完之后,却可以让我有另一条思路去思考该问题。

为什么正确地描述你的问题往往会自助地产生答案呢?

我不知道这已经发生多少次了:

  • 我有一个问题
  • 我决定把它放到stackoverflow上面
  • 我粗略地将问题写下来
  • 我知道该问题描述的不好
  • 我又花费了15分钟时间重新思考该如何描述问题
  • 我意识到自己正在一个完全错误的方向上解决问题
  • 我再次从头开始,并且迅速找到了问题的解决方案

上述这样的事情是否也发生在你身上呢?有时候,提出正确的问题,似乎问题就已经解决一半了。

开始提交一个问题,实际上是在帮助我调试我自己的问题

开始提出一个问题,实际上是在帮助我调试我自己的问题,尤其为了得到像模像样的的答案时,我们总是会提供足够详细的与问题相关内容。这样的事情以前是否在别的人身上发生过?

这不是一个什么新东西,只要给予足够的时间,每一个互联网社区似乎都能找到自己的解决问题方式,但是“向鸭子提问”的确是一个非常强大的解决问题的技巧和方法

鲍勃指着办公室的角落,“在那儿”,他说,“有一只鸭子。我希望你向那只鸭子提出你的问题。”

我看着那只鸭子。事实上,它吃的很饱,一动不动。即便它还能动,也不可能是一个关于设计信息的有效来源。我看着鲍勃,鲍勃是认真的。他当然是我的上司,我不想失去这份工作。

我摇摇晃晃地向鸭子走了过去,并且站在它旁边。我低下头和鸭子交流,看起来有点像祷告。“什么?”鲍勃问,“你在干什么?”

鲍勃的一位上司正巧在他的办公室。他开怀大笑起来。

“安迪”,他说,“我不是让你向鸭子祈祷,我是让你向鸭子问问题。” 我舔了舔我的嘴唇。“大声吗?”我说。

“大声”,鲍勃坚定地说。

我清了清嗓子。“鸭子”,我要开始了。

“它的名字叫小鲍勃”,鲍勃的那位上司补充了一句。我对他投以不悦的眼神。

“鸭子”,我继续说,“我想知道,当你使用U形夹挂钩,在头部卸下时,怎样避免喷水管跳出U形夹,导致管…”

在我向鸭子问问题的过程中,我得到了问题的答案。U形夹挂钩被悬挂在全螺纹长杆上面。如果管道安装工削减全螺纹杆,使其靠在管的顶部,它实质上是固定住挂钩的管子,并会防止它从那儿脱落。

我转头看向鲍勃。鲍勃在点头。“你知道答案了,是这样吗?”他说。

“你把全螺纹长杆放到管子的上面”,我说。

“完全正确”,鲍勃说。“下次你再有问题,我还让你来这儿继续问鸭子,而不是问我。大声地问它。如果你仍不知道答案,你再来问我。”

“好的”,我说,然后回去继续工作。

我很喜欢这个特别的故事,因为它讲解地十分清楚 解决橡皮鸭问题的关键部分是向这个虚构的人或者静物问一个深入且详细的问题。是的,即使你最终抛出这个问题,因为你最终意识到你犯了一些愚蠢的错误。向虚构的人问问题,要一步一步来,并且尽量详细,这样的尝试经常能让你找到问题的答案。如果你不愿意花费精力去完全说明问题以及你如何解决过这个问题,那么在你问其他人之前,你就不能得到深度思考你的问题所带来的好处。

如果你在编程上缺少伙伴(但是你绝对应该有),你可以利用橡皮鸭问题解决法这样的技巧找出答案来,当然这全部要靠你自己,或者利用伟大的互联网在社区中寻求答案。即使你没有得到你想要的答案,强制自己完整地描述自己的问题 - 最好以书面形式 - 往往就会产生新的认识和发现。

最后,左耳朵耗子老师也讲过这个问题,而且讲得非常好,一定要看: 橡皮鸭程序调试法