提问的艺术
我们每天都会问别人很多问题,也会被别人问到很多问题,在处理这些问题的时候,我们常常会发现有些问题特别好,可以带来提问者和被问者的深刻思考和非常有建设性的讨论,最后提问者和被问者都得到了学习和提高。而有些问题质量很差,通常提问者和被提问者讨论了半天都不知所云。那么怎么才能提一个好问题呢?怎么才能让自己的问题很快的得到回答?怎么才能让自己的问题对自己和对别人都有用处呢?
本文参考了这几篇非常有名的关于如何提问的文章,How To Ask Questions The Smart Way(中文版:提問的智慧),The XY Problem,Writing the perfect question,结合自己的一些感受做个简单的总结。
提问前应该做什么
- 尝试用在网上搜索一下,起码在问别人之前应该问一下google。如果在一个论坛上提问,搜一下这个问题之前有没有人问过,别让别人回答你STFW(Search The Fucking Web)。
- 阅读一下帮助文档,常见问题FAQ和源代码(如果有的话),别让别人回答你RTFM (Read The Fucking Manual)。比如函数x是干啥用的?就是一个烂问题。一个好一点的问题是,我看了函数x的代码,看起来它是干yyy的,但是我实际运行的结果发现它干了zzz,请问我是漏掉了什么吗?。
- 如果可以的话,自己应该试一试。比如x和y哪个快?就是一个烂问题。一个好一点的问题是,基于zzzz,我认为x应该比y快,但是我在tttt环境下的测试结果是x比y慢,为什么呢?。
怎么提问
- 使用描述明确的标题,比如可以使用目标-差异形式的标题。使用准确的分类,标签(tag)等。
- 把你的问题写下来,站在一个被问者的角度看看自己能不能看懂自己的问题。我经常发现当我花时间组织自己的语言来描述清楚自己问题的时候,我已经知道我的答案是什么了,或者至少对如何找到答案有了新的想法。
- 如果是书面提问,斟酌一下字句,最好别有错别字、语法错误。更重要的是,如果粘贴代码,确保你的代码能编译通过!!!(除非你标明是伪代码)如果要写输入输出,确保他们是对的!!!
- 注意格式,特别是代码格式。
- 明确标明哪些是症状,哪些是你的猜测。
- 简短,别说废话!!!
- 除非非常肯定,别动辄就说找到了bug,什么东西设计的很烂等等,更可能的情况是你漏掉了什么东西。
- 找到合适的人或者论坛发问。现在Stack Overflow已经是提问编程技术类问题的主要管道了。如果是电脑问题,可以去superuser,如果是服务器和网管,可以去serverfault。如果针对这个具体问题有相关的论坛、邮件列表的,可以去那里。
- 要有礼貌,没有人有义务回答你的问题(除非你付钱)。
问题应该包含什么
- 包含问题的背景知识,帮助别人理解你的真正问题。比如你要解决X问题,发现它的一个子问题Y问题你不知道,那么在问Y问题说一下X问题。比如你要解决X问题,你想到了一个解决方案Y,但是你不知道Y怎么做,那么在问Y时说一下你的X问题。
- 包含问题发生的环境(机器配置、操作系统(版本)、编程语言(版本)、IDE(版本)、调试器等和问题相关的一切信息)。
- 包含一个最小的可以重现你的问题的步骤。
- 包含自己尝试了哪些诊断方法,得到了什么输出。尝试过哪些解决方案,遇到的问题分别是什么。自己学到了哪些东西,有哪些是可供被问者参考的。
- 如果自己已经排除了一些解决方案,说明这些解决方案为什么会被排除,这会有利于别人更好的理解你的需求。
怎么对待别的人回答
- 问题解决后,给出一个总结,这样是对所有帮过你的人的表示尊重,同时也会帮到以后遇到同样问题的人。
- 如果别人的回答你没看懂,在继续追问前先做上面提到的提问前应该做什么。