
本文指代词统一为: 你:提问者 他、他们:被提问者
本精简版《提问的智慧》基于Github项目ryanhanwu/How-To-Ask-Questions-The-Smart-Way: https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/tree/main,另外一篇专栏也有对《提问的智慧》原翻译全文进行转载,有时间建议看原文(虽然针对与程序员而写,实际上通用于各领域,个人认为对能力和情商的提升都有帮助)。《提问的智慧》不提供任何解决实际问题的服务,但它能告诉你如何解决问题以及无法解决问题之时如何向他人求助。毕竟授人以鱼不如授人以渔。
得益于搜索引擎的发展、以及各类社区、平台的活跃,我们能够从其他高手那里获得一些好的答案或者解决方式,这是件好事。一般而言,大多数人都愿意对新手有一定程度上的包容,但这包容并不意味着无条件无底线的帮助,毕竟他们不是你的亲人。即便是亲人,就如同随处可见的那些短视频——教儿子/女儿/弟弟/妹妹小学数学的红温场景,或许有些夸张,但血压升高确有其事。
一个问题的解答是好是坏, 很大程度上取决于问题的难度以及提问方式。本指南提供了几种较好的提问方式,能够让你更容易获得满意的答案。他们会喜欢一个新的、有挑战的好问题。(如果不是,那应该也不会是你想询问的对象。)因为它通常是他们以前没有意识或思考过的问题,能够增加他们的经验。
他们蔑视对不愿思考、或者在发问前不做应做之事的人。这样的人只是时间杀手 —— 只想索取而不懂不付出,只会浪费 用于更有趣的问题或更值得回答的人身上 的时间。大多数人非常乐意平等地交流,只要你愿意付出努力来满足基本要求,就会受到欢迎,但帮助那些不愿意自助的人是没有效率的。不明白没有关系,但装不明白就是不行,这不需要你在技术上有多大成就,但你应表现一些特质 —— 机敏、有想法、善于观察、乐于主动参与解决问题。如果你做不到这些事情,建议付费去找商业服务解决问题,而不是在这等待白嫖。
在你准备要提出问题前,请先做到以下事情:
尝试在你准备提问的平台搜索以找到答案。
尝试使用搜索引擎以找到答案。
尝试阅读官方手册、平台、客服以找到答案。
尝试阅读常见问题文件(FAQ)以找到答案。
尝试自己检查或试验以找到答案。
向身边朋友打听以找到答案。
不愿意自己花时间去解决问题,而转头期待别人能够花时间帮你解决问题是不现实的。所以当提出问题的时候,请先表明已经做了上述的努力。这能表明你并不是一个不劳而获且浪费别人时间的人。如果你能一并说明在努力的过程中所学到的东西会更好,因为他们往往会帮助能从答案中学习的人。
运用某些策略,比如先用 搜索引擎 搜索你所遇到的各种错误信息,或许能直接找到解决问题的线索。即使没有,也能够在提问时加上 "我在 搜索引擎 中搜过下列句子但没有找到什么有用的东西" 也是件好事,即使它只是表明了搜索引擎不能提供哪些帮助。这么做(加上搜索过的字串)也让遇到相似问题的其他人能被搜索引擎引导到你的提问来。
别着急,不要指望几秒钟的 搜索引擎 搜索就能解决一个复杂的问题。在向他们求助之前,再阅读一下常见问题文件(FAQ)、放轻松、坐得舒服一些,再花点时间思考一下这个问题。他们能从你的提问看出你做了多少阅读与思考,如果你是有备而来,将更有可能得到解答。不要因为一次搜索没有找到答案(或者找到太多答案)就把将所有问题一股脑拋出(太长不看系列应该深有体会)。
准备好你的问题,再将问题仔细地思考过一遍,因为草率的发问只能得到草率的回答,或者根本得不到任何答案。越是能表现出在寻求帮助前你为解决问题所付出的努力,你越有可能得到实质性的帮助。
绝不要以为应该得到答案,毕竟你没有为这种服务支付任何报酬。而是你要自己去挣到一个答案,靠提出有内涵的、有趣的、有思维激励作用的问题 —— 一个有潜力能贡献社区经验的问题,而不仅仅是被动地从他人处索取知识。
另一方面,表明你愿意在找答案的过程中做点什么是一个非常好的开端。谁能给点提示?、我的这个例子里缺了什么?以及我应该检查什么地方比请把我需要的确切的过程贴出来更容易得到答复。因为你表现出只要有人能指个正确方向,你就有完成它的能力和决心。
避免用无意义的话结束提问,例如有人能帮我吗?或者这有答案吗?。 首先:如果你对问题的描述不是很好,这样问更是画蛇添足。 其次:由于这样问是画蛇添足,他们可能会厌烦你 —— 而且通常会用逻辑上正确,但毫无意义的回答来表示他们的蔑视, 例如:没错,有人能帮你或者不,没答案。 一般来说,避免用 是或否、对或错、有或没有类型的问句,除非你想得到是或否类型的回答: https://strcat.de/questions-with-yes-or-no-answers.html。
告诉他们你认为问题是怎样造成的并没什么帮助。(如果你的推断如此有效,还用向别人求助吗?),因此要保证他们看到的是与你看到的问题症状尽可能一致的东西,让他们来推测和诊断,而不是你的解释和理论。如果你认为陈述自己的猜测很重要,清楚地说明这只是你的猜测,并描述为什么它们不起作用。
漫无边际的提问是无休无止的时间黑洞。如果专业技能想像为充裕的资源,而回复的时间就是稀缺的资源。你要求他们奉献的时间越少,你越有可能从真正专业而且繁忙的他们那里得到解答。因此明确表述需要他们做什么(如提供指点、发送一段代码、检查你的补丁、或是其他等等),就最有可能得到有用的答案。因为这会定出一个时间和精力的上限,便于他们能集中精力来帮你。
所以,界定一下你的问题,使他们花在辨识你的问题和回答所需要付出的时间减到最少,这技巧对你获得有用的答案相当有帮助 —— 但这技巧通常和简化问题有所区别。因此,问我想更好地理解 X,可否指点一下哪有好一点说明?通常比问你能解释一下 X 吗?更好如果你的程序不能运作,通常请别人看看哪里有问题,比要求别人替你改正要明智得多。
如果你想弄清楚如何做某事,在开头就描述你的目标,然后才陈述重现你所卡住的特定步骤。因为有时候你的问题是走错路或者用错工具导致的。
蠢问题
我怎样才能从某绘图程序的颜色选择器中取得十六进制的 RGB 值?
聪明问题
我正试着用替换一幅图片的色码(color table)成自己选定的色码,我现在知道的唯一方法是编辑每个色码区块(table slot), 但却无法从某绘图程序的颜色选择器取得十六进制的 RGB 值。
第二种提问法比较聪明,但你可能得到像是建议采用另一个更合适的工具的回复。
仔细、清楚地描述你的问题。
描述问题发生的环境(机器配置、操作系统、应用程序、以及相关的信息),提供软件的发行版和版本号(如:QQ 11、Slackware 9.1等)。
描述在提问前你是怎样去研究和理解这个问题的。
描述在提问前为确定问题而采取的诊断步骤。
描述最近做过什么可能相关的硬件或软件变更。
尽可能地提供一个可以重现这个问题的可控环境的方法。
尽量去揣测会怎样被反问,在提问之前预先将可能提出的问题回答一遍。
以上几点中,当可能是代码问题时,一个可以重现问题的环境尤其重要。当你这么做时,你得到有效的回答的机会和速度都会大大的提升。
Simon Tatham: http://www.chiark.greenend.org.uk/~sgtatham/ 写过一篇名为《如何有效地报告Bug: http://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html》的出色文章。强力推荐你也读一读。
你需要提供精确有内容的信息。这并不是要求你简单的把成堆的出错代码或者错误信息完全放在到你的提问中。如果有较多的输出信息,尽量将它剪裁得越小越好。
这样做的用处至少有三点。 第一,表现出你为简化问题付出了努力,这可以使你得到回答的机会增加; 第二,简化问题使你更有可能得到有用的答案; 第三,在精炼你的 bug 报告的过程中,你很可能就自己找到了解决方法或权宜之计。
问题发生前的一系列操作,往往就是对找出问题最有帮助的线索。因此,你的说明里应该包含你的操作步骤,以及机器和软件的反应,直到问题发生。在命令行处理的情况下,提供一段操作记录(例如运行脚本工具所生成的),并引用相关的若干行(如 20 行)记录会非常有帮助。
如果挂掉的程序有诊断选项(如 -v 的详述开关),试着选择这些能在记录中增加调试信息的选项。记住,多不等于好。试着选取适当的调试级别以便提供有用的信息而不是让读者淹没在垃圾中。
如果你的说明很长(如超过四个段落),在开头简述问题,接下来再按时间顺序详述会有所帮助。这样他们在读你的记录时就知道该注意哪些内容了。
问题解决后,向所有帮助过你的人发个说明,让他们知道问题是怎样解决的,并再一次向他们表示感谢。如果问题引起了广泛关注,应该在那里贴一个说明比较恰当。
最理想的方式是向最初提问的话题回复此消息,并在标题中包含已修正,已解决或其它同等含义的明显标记。在人来人往的邮件列表里,一个看见讨论串问题 X和问题 X - 已解决的潜在回复者就明白不用再浪费时间了(除非他个人觉得问题 X有趣),因此可以利用此时间去解决其它问题。
补充说明不必很长或是很深入;简单的一句你好,原来是网线出了问题!谢谢大家 – Bill比什么也不说要来的好。事实上,除非结论真的很有技术含量,否则简短可爱的小结比长篇大论更好。说明问题是怎样解决的,但大可不必将解决问题的过程复述一遍。
对于有深度的问题,张贴调试记录的摘要是有帮助的。描述问题的最终状态,说明是什么解决了问题,在此之后才指明可以避免的盲点。避免盲点的部分应放在正确的解决方案和其它总结材料之后,而不要将此信息搞成侦探推理小说。列出那些帮助过你的名字,会让你交到更多朋友。
除了有礼貌和有内涵以外,这种类型的补充也有助于他人在邮件列表/新闻群组/论坛中搜索到真正解决你问题的方案,让他们也从中受益。
至少,这种补充有助于让每位参与协助的人因问题的解决而从中得到满足感。如果你自己不是技术专家或者黑客,那就相信他们,这种感觉对于那些你向他们求助的大师或者专家而言,是非常重要的。问题悬而未决会让人灰心;他们渴望看到问题被解决。好人有好报,满足他们的渴望,你会在下次提问时尝到甜头。
思考一下怎样才能避免他人将来也遇到类似的问题,自问写一份文件或加个常见问题(FAQ)会不会有帮助。如果是的话就将它们发给维护者。
在提问中,这种良好的后继行动实际上比传统的礼节更为重要,也是你如何透过善待他人而赢得声誉的方式,这是非常有价值的资产。
大约 50 字以内的标题或是问题描述是抓住他们注意力的好机会。别用喋喋不休的帮帮忙、跪求、急(更别说救命啊!!!!这样让人反感的话,用这种标题会被条件反射式地忽略)来浪费这个机会。不要妄想用你的痛苦程度来打动他们,而应该是在这点空间中使用极简单扼要的描述方式来提出问题。
一个好标题范例是目标 —— 差异式的描述:在目标部分指出是哪一个或哪一组东西有问题,在差异部分则描述与期望的行为不一致的地方。
蠢问题:救命啊!我的笔记本电脑不能正常显示了!
聪明问题:X.org 6.8.1 的鼠标指针会变形,某牌显卡 MV1005 芯片组。
更聪明问题:X.org 6.8.1 的鼠标指针,在某牌显卡 MV1005 芯片组环境下 - 会变形。
编写目标 —— 差异 式描述的过程有助于你对问题的细致思考。是什么被影响了? 仅仅是鼠标指针或者还有其它图形?只在 X.org 的 X 版中出现?或只是出现在 6.8.1 版中? 是针对某牌显卡芯片组?或者只是其中的 MV1005 型号?
总而言之,请想像一下你正在一个只显示标题的平台中搜索,用标题反应具体问题,可以使类似问题的人能够注意到问题而不是再次提问,或许你的某个问题也会因为他人的做法而解决。
这是你的问题,不是他们的。宣称紧急极有可能事与愿违:大多数人会直接删除无礼和自私地企图即时引起关注的问题。更严重的是,紧急这个字(或是其他企图引起关注的标题)通常会被垃圾信过滤器过滤掉 —— 你希望能看到你问题的人可能永远也看不到。
有半个例外的情况是,如果你是在一些很高调,会使他们兴奋的地方,也许值得这样去做。在这种情况下,如果你有时间压力,也很有礼貌地提到这点,人们也许会有兴趣回答快一点。
当然,这风险很大,因为他们兴奋的点多半与你的不同。譬如从 NASA 国际空间站(International Space Station)发这样的标题没有问题,但用自我感觉良好的慈善行为或政治原因发肯定不行。事实上,张贴诸如紧急:帮我救救这个毛茸茸的小海豹!肯定让你被黑客忽略或惹恼他们,即使他们认为毛茸茸的小海豹很重要。
如果你觉得这点很不可思议,最好再把这份指南剩下的内容多读几遍,直到你弄懂了再发文。
有些人明白他们不该粗鲁或傲慢的提问并要求得到答复,但他们选择另一个极端 —— 低声下气:我知道我只是个可悲的新手,一个失败者,但...。这既使人困扰,也没有用,尤其是伴随着与实际问题含糊不清的描述时更令人反感。
别用原始灵长类动物的把戏来浪费你我的时间。取而代之的是,尽可能清楚地描述背景条件和你的问题情况。这比低声下气更好地定位了你的位置。有时网页论坛会设有专为新手提问的版面,如果你真的认为遇到了初学者的问题,到那去就是了,但一样别那么低声下气。
彬彬有礼,多用请和谢谢您的关注,或谢谢你的关照。让大家都知道你对他们花时间免费提供帮助心存感激。
坦白说,这一点并没有比使用清晰、正确、精准且合乎语法和避免使用专用格式重要(也不能取而代之)。他们一般宁可读有点唐突但技术上鲜明的 Bug 报告,而不是那种有礼但含糊的报告。(如果这点让你不解,记住他们是按问题能教给他们什么来评价问题的价值的)
然而,如果你有一串的问题待解决,客气一点肯定会增加你得到有用回应的机会。还有一开始表达先谢了,也意味着事后就不用再感谢任何人的暗示。我们的建议是要么先说先谢了,然后事后再对回复者表示感谢,或者换种方式表达感激,譬如用谢谢你的关注或谢谢你的关照。)
有一个古老而神圣的传统:如果你收到RTFM(Read The Fucking Manual)的回应,回答者认为你应该去读他妈的手册。当然,基本上他是对的,你应该去读一读。
RTFM 有一个年轻的亲戚。如果你收到STFW(Search The Fucking Web)的回应,回答者认为你应该到他妈的网上搜索。那人多半也是对的,去搜索一下吧。(更温和一点的说法是 **Google 是你的朋友: http://lmgtfy.com/**!)
在论坛,你也可能被要求去爬爬论坛的旧文。事实上,有人甚至可能热心地为你提供以前解决此问题的讨论串。但不要依赖这种关照,提问前应该先搜索一下旧文。
通常,用这两句之一回答你的人会给你一份包含你需要内容的手册或者一个网址,而且他们打这些字的时候也正在读着。这些答复意味着回答者认为:
你需要的信息非常容易获得;
你自己去搜索这些信息比灌给你,能让你学到更多。
你不应该因此不爽;依照专家的标准,他已经表示了对你一定程度的关注,而没有对你的要求视而不见。
如果你看不懂回应,别立刻要求对方解释。像你以前试着自己解决问题时那样(利用手册,FAQ,网络,身边的高手),先试着去搞懂他的回应。如果你真的需要对方解释,记得表现出你已经从中学到了点什么。
比方说,如果我回答你:看来似乎是 zentry 卡住了;你应该先清除它。,然后,这是一个很糟的后续问题回应:zentry 是什么? 好的问法应该是这样:哦~~~我看过说明了但是只有 -z 和 -p 两个参数中提到了 zentries,而且还都没有清楚的解释如何清除它。你是指这两个中的哪一个吗?还是我看漏了什么?
部分看似无礼的行为可能不是存心冒犯。相反,它是直截了当,一针见血式的交流风格,这种风格更注重解决问题,而不是使人感觉舒服而却模模糊糊。
如果你觉得被冒犯了,试着平静地反应。如果有人真的做了出格的事,多半会有人招呼他。如果这没有发生而你却发火了,那么你发火对象的言语可能在社区中看起来是正常的,而你将被视为有错的一方,这将伤害到你获取信息或帮助的机会。
另一方面,你偶尔真的会碰到无礼和无聊的言行。与上述相反,对真正的冒犯者狠狠地打击,用犀利的语言将其驳得体无完肤都是可以接受的。然而,在行事之前一定要非常非常的有根据。纠正无礼的言论与开始一场毫无意义的口水战仅一线之隔,他们自己莽撞地越线的情况并不鲜见。别让自己卷入口水战,最好不要理睬大多数的口水战 —— 当然,这是在你检验它们只是口水战,并且未指出你有搞砸的地方,同时也没有巧妙地将问题真正的答案藏于其后(这也是有可能的)。如果你是新手或外人,避开这种莽撞的机会并不高。如果你想得到的是信息而不是消磨时光,这时最好不要把手放在键盘上以免冒险。
最后,我将透过举一些例子,来说明怎样聪明的提问;同一个问题的两种问法被放在一起,一种是愚蠢的,另一种才是明智的。
蠢问题:
我可以在哪儿找到关于 Foonly Flurbamatic 的资料?
这种问法无非想得到 STFW 这样的回答。
聪明问题:
我用 Google 搜索过 "Foonly Flurbamatic 2600",但是没找到有用的结果。谁知道上哪儿去找对这种设备编程的资料?
这个问题已经 STFW 过了,看起来他真的遇到了麻烦。
蠢问题:
我从 foo 项目找来的源码没法编译。它怎么这么烂?
他觉得都是别人的错,这个傲慢自大的提问者。
聪明问题:
foo 项目代码在 Nulix 6.2 版下无法编译通过。我读过了 FAQ,但里面没有提到跟 Nulix 有关的问题。这是我编译过程的记录,我有什么做的不对的地方吗?
提问者已经指明了环境,也读过了 FAQ,还列出了错误,并且他没有把问题的责任推到别人头上,他的问题值得被关注。
蠢问题:
我的主机板有问题了,谁来帮我?
某黑客对这类问题的回答通常是:好的,还要帮你拍拍背和换尿布吗?,然后按下删除键。
聪明问题:
我在 S2464 主机板上试过了 X 、 Y 和 Z ,但没什么作用,我又试了 A 、 B 和 C 。请注意当我尝试 C 时的奇怪现象。显然 florbish 正在 grommicking,但结果出人意料。通常在 Athlon MP 主机板上引起 grommicking 的原因是什么?有谁知道接下来我该做些什么测试才能找出问题?
这个家伙,从另一个角度来看,值得去回答他。他表现出了解决问题的能力,而不是坐等天上掉答案。
在最后一个问题中,注意告诉我答案和给我启示,指出我还应该做什么诊断工作之间微妙而又重要的区别。
事实上,后一个问题源自于 2001 年 8 月在 Linux 内核邮件列表(lkml)上的一个真实的提问。我(Eric)就是那个提出问题的人。我在 Tyan S2464 主板上观察到了这种无法解释的锁定现象,列表成员们提供了解决这一问题的重要信息。
通过我的提问方法,我给了别人可以咀嚼玩味的东西;我设法让人们很容易参与并且被吸引进来。我显示了自己具备和他们同等的能力,并邀请他们与我共同探讨。通过告诉他们我所走过的弯路,以避免他们再浪费时间,我也表明了对他们宝贵时间的尊重。
事后,当我向每个人表示感谢,并且赞赏这次良好的讨论经历的时候,一个 Linux 内核邮件列表的成员表示,他觉得我的问题得到解决并非由于我是这个列表中的名人,而是因为我用了正确的方式来提问。
黑客从某种角度来说是拥有丰富知识但缺乏人情味的家伙;我相信他是对的,如果我像个乞讨者那样提问,不论我是谁,一定会惹恼某些人或者被他们忽视。他建议我记下这件事,这直接导致了本指南的出现。
如果仍得不到回答,请不要以为他们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。没有回应不代表你被忽视,虽然不可否认这种差别很难区分。
总的来说,简单地重复张贴问题是个很糟的点子。这将被视为无意义的喧闹。有点耐心,知道你问题答案的人可能生活在不同的时区,可能正在睡觉,也有可能你的问题一开始就没有组织好。
你可以通过其他渠道获得帮助,这些渠道通常更适合初学者的需要。
有许多网上的以及本地的用户群组,由热情的软件爱好者(即使他们可能从没亲自写过任何软件)组成。通常人们组建这样的团体来互相帮助并帮助新手。
另外,你可以向很多商业公司寻求帮助,不论公司大还是小。别为要付费才能获得帮助而感到沮丧!毕竟,假使你的汽车发动机汽缸密封圈爆掉了 —— 完全可能如此 —— 你还得把它送到修车铺,并且为维修付费。就算软件没花费你一分钱,你也不能强求技术支持总是免费的。
对像是 Linux 这种大众化的软件,每个开发者至少会对应到上万名用户。根本不可能由一个人来处理来自上万名用户的求助电话。要知道,即使你要为这些协助付费,和你所购买的同类软件相比,你所付出的也是微不足道的(通常封闭源代码软件的技术支持费用比开源软件的要高得多,且内容也没那么丰富)。
态度和善一点。 问题带来的压力常使人显得无礼或愚蠢,其实并不是这样。
对初犯者私下回复。 对那些坦诚犯错之人没有必要当众羞辱,一个真正的新手也许连怎么搜索或在哪找常见问题都不知道。
如果你不确定,一定要说出来! 一个听起来权威的错误回复比没有还要糟,别因为听起来像个专家很好玩,就给别人乱指路。要谦虚和诚实,给提问者与同行都树个好榜样。
如果帮不了忙,也别妨碍他。 不要在实际步骤上开玩笑,那样也许会毁了提问者的设置 —— 有些可怜的呆瓜会把它当成真的指令。
试探性的反问以引出更多的细节。 如果你做得好,提问者可以学到点东西 —— 你也可以。试试将蠢问题转变成好问题,别忘了他们都曾是新手。
尽管对那些懒虫抱怨一声 RTFM 是正当的,但能给出文档的链接(即使只是建议个 Google 搜索关键词)会更好。
如果你决定回答,就请给出好的答案。 当别人正在用错误的工具或方法时别建议笨拙的权宜之计(workaround),应推荐更好的工具,重新界定问题。
正面地回答问题! 如果这个提问者已经很深入的研究而且也表明已经试过 X 、 Y 、 Z 、 A 、 B 、 C 但没得到结果,回答 试试看 A 或是 B 或者 试试 X 、 Y 、 Z 、 A 、 B 、 C 并附上一个链接一点用都没有。
帮助你的社区从问题中学习。 当回复一个好问题时,问问自己如何修改相关文件或常见问题文件以免再次解答同样的问题?,接着再向文件维护者发一份补丁。
如果你在研究一番后才作出了回答,展现你的技巧而不是直接端出结果。毕竟授人以鱼不如授人以渔。
Evelyn Mitchel 贡献了一些愚蠢问题例子并启发了编写如何更好地回答问题这一节, Mikhail Ramendik 贡献了一些特别有价值的建议和改进。