© 2001 Eric Steve Raymond, Rick Moen, D.H.Grand

© 2012-2023 Conmajia

本文发表于 2012 年,已获 Raymond 及 Grand 本人授权。原文截至 2015 年已迭代至 Revision 3.10 版本。

注意 本文并非 Gerald Nadler 的 Smart Questions(《提问的艺术》),请加以区分。

其他衍生作品 Ryan Wu 于 2015 年在 GitHub 上开了一个仓库,基于原文 3.10 版本并参考了 Grand、Gasolin 等人的翻译成果。

如何获取帮助

在编程的世界里,当提出一个技术问题,你能得到怎样的回答?这不仅取决于发掘答案的难度,还取决于你提问的方法。本指南旨在帮助你提高发问技巧,以获取你最想要的答案。

首先你必须明白,程序员们只偏爱艰巨的任务,或者能激发他们思维的好问题。如若不然,我们还来干吗?如果你有值得我们反复咀嚼玩味的好问题,我们自会对你感激不尽。好的问题是激励,是厚礼,可以提高我们的理解力,而且通常会暴露我们以前从没意识到或者思考过的问题。对程序员而言,“问得好!”是发自内心的大力称赞。

尽管程序员们有蔑视简单问题和不友善的坏名声,有时看起来似乎我们对新手,对知识贫乏者怀有敌意,但其实不是那样的。

我们不想掩饰对这样一些人的蔑视——他们不愿思考,或者在发问前不去完成他们应该做的事。这种人只会谋杀时间--他们只愿索取,从不付出,无端消耗我们的时间,而我们本可以把时间用在更有趣的问题或者更值得回答的人身上。我们称这样的人为“失败者”(由于历史原因,我们有时把它拼作“lusers”,用现代网络用语来说,就是“卢瑟儿”)。

我们在很大程度上属于志愿者,从繁忙的生活中抽出时间来解惑答疑,而且时常被提问淹没。所以我们无情的滤掉一些话题,特别是抛弃那些看起来象失败者的家伙,以便更高效的利用时间来回答胜利者的问题。

如果你觉得我们过于傲慢的态度让你不爽,让你委屈,不妨设身处地想想。我们并没有要求你向我们屈服——事实上,我们中的大多数人最喜欢公平交易不过了,只要你付出小小努力来满足最起码的要求,我们就会欢迎你加入到我们的文化中来。但让我们帮助那些不愿意帮助自己的人是没有意义的。如果你不能接受这种“歧视”,我们建议你花点钱找家商业公司签个技术支持协议得了,别向程序员乞求帮助。

如果你决定向我们求助,当然不希望被视为失败者,更不愿成为失败者中的一员。立刻得到有效答案的最好方法,就是象胜利者那样提问——聪明、自信、有解决问题的思路,只是偶尔在特定的问题上需要获得一点帮助。

提问之前

译注:本节介绍提问之前的准备工作,及你应当使用哪些方法使得你能尝试先自行解决问题。本文写作于 2001 年,当时互联网并没有现在发达,各种技术的知识积累也不如今,所以可以说现在解决问题,较之当年已经是大为轻松。作为提问者的你,更加应该首先尝试通过网络、书籍等媒介自行查阅资料解决问题。换句话说,如果现在你还被称为 luser,那么相比前人,可就太挫了。

在通过(论坛/社区)电邮、新闻组或者聊天室提出技术问题前,检查你有没有做到:

  1. 通读手册,试着自己找答案
  2. 在 FAQ 里找答案(一份维护良好的 FAQ 可以包罗万象)
  3. 在网上搜索(个人推荐 Google)
  4. 向你身边精于此道的朋友打听

当你提出问题的时候,首先要说明在此之前你干了些什么;这将有助于树立你的形象:你不是一个妄图不劳而获的乞讨者,不愿浪费别人的时间。如果提问者能从答案中学到东西,我们更乐于回答他的问题。

  周全的思考,准备好你的问题,草率的发问只能得到草率的回答,或者根本得不到任何答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。

  小心别问错了问题。如果你的问题基于错误的假设,普通程序员 J.RandomHacker(这是个虚拟的人名——译注)通常会用无意义的字面解释来答复你,心里骂着“蠢问题...”,指望你会从问题的回答——仅仅是回答,而非你想得到的答案——中汲取教训。

  不要自恋地认为自己够资格得到答案:你没这种资格。毕竟你只是在网上随口提问,而并没有为解答服务支付任何报酬。你要自己去“挣”一个答案,通过提出一个有内涵、有趣的、有思维激励作用的问题,一个对开发者社区的经验有潜在贡献的问题,而不仅仅是被动地向他人索要知识。这样你才能挣到问题的答案。

  另一方面,提出你愿意在找答案的过程中做点什么,是一个非常好的开端。“谁能给点提示?”、“我这个例子里缺了什么?”以及“我应该检查什么地方?”往往比“请把确切的过程贴出来”更容易得到答复。因为你的提问会告诉人们,你具备解决问题的能力和决心,你需要的只是有人为你指点正确的方向。

怎样提问

小心地选择你提问的场合。这里有一些提问场景,会让你看起来像个卢瑟儿:

  1. 在风马牛不相及的论坛贴出你的问题
  2. 在探讨高级技巧的论坛张贴非常初级的问题;反之亦然
  3. 在太多的不同新闻组刷屏

第 2 条往往也适用于回答。比如提问如何解答小学数学题,然而回答的人却写了一大堆研究生级别的理论和公式,甚至要求你理解一些晦涩难懂的高难度纯数学原理。这只能让人觉得回答者像个急于卖弄学识的小丑,亦或是读不懂问题的蠢蛋。

用辞贴切,语法正确,拼写无误

我们从经验中发现,粗心的作者通常也是马虎的思考者(我敢打包票)。回答马大哈的问题很不值得,我们宁愿把时间耗在别处。你要知道,正确的拼写和遣词造句,乃至标点符号和分段对于写出让人易于理解的文字非常重要。一般来说,如果你的提问内容写得像个文盲,多数人不会愿意回答你的问题。

如果你在非母语的论坛提问,你可以犯点拼写和语法上的小错,但决不能在思考上马马虎虎。母语使用者可以很容易分清二者。

使用含义丰富,描述准确的标题

在邮件列表或者新闻组中,通常标题长度大约有 50 字节。一个贴切的标题是吸引行家注意力的黄金时机,如果你想要他们回答你的问题。不要在标题里喋喋不休地写上“帮帮忙”,“救命啊!!”这类让人反感的话来浪费这个机会。互联网上没人欠你什么,不要妄想通过描述你的痛苦来打动我们,你更应该在这点空间里极尽简洁地描述你的问题。

蠢问题:菜鸟求助!毕业设计要用数据库完全不会怎么办?

聪明问题:请问如何在 PC 上安装 SQL 2005

没错,这是个很傻的问题,因为没有人能够通过浏览标题而得知你想问的问题是哪方面的。志愿者们不得不浪费时间打开你的帖子或邮件内容才能看到关于问题的具体描述。如果他们是使用手机查看,更加会感觉不便。如果你的问题让潜在的回答者感到不便,那它绝对是一个蠢问题。如果你在回复中提出问题,记得要修改内容标题,表明里面有一个问题。一个看起来象“Re:测试”或者“Re:新 bug”的问题很难引起足够重视。另外,引用并删减前文的内容,给新来的读者留下线索。

精确描述,信息量大

  1. 谨慎明确的描述症状
  2. 提供问题发生的环境(机器配置、操作系统、应用程序以及别的什么)
  3. 说明你在提问前是怎样去研究和理解这个问题的
  4. 说明你在提问前采取了什么步骤去解决它
  5. 罗列最近做过什么可能有影响的硬件、软件变更
  6. 尽量想象一个程序员会怎样反问你,在提问的时候预先给他答案

Simon Tatham 写过一篇名为《如何有效的报告 bug》的出色短文。强力推荐你也读一读。

话不在多

你需要提供精确有效的信息。这并不是要求你简单的把成吨的出错代码或者数据完全转储摘录到你的提问中。如果你有庞大而复杂的测试条件,尽量把它剪裁得越小越好。

这样做的用处至少有三点。第一,表现出你为简化问题付出了努力,这可以使你得到回答的机会增加;第二,简化问题使你得到有用答案的机会增加;第三,在提炼你的 bug 报告的过程中,也许你自己就能找出问题所在或作出更正。

只说症状,不说猜想

告诉程序员们你认为问题是怎样引起的没什么帮助。如果你的推断是正确的,你还用向别人提问求助吗?因此你应该原原本本告诉他们问题的症状,不要加入你自己的理解和推论。让程序员们来诊断吧。

蠢问题:我在使用 GDI+ 画图时点击按钮图形一闪就没有了,是不是编译器有问题啊?

聪明问题:我使用 GDI+ 画图,关联了按钮事件,并在窗体上绘制了几个图形,运行时点击按钮可以画出图形,但立刻就消失了,再次点击按钮仍是这种情况。绘图代码如下……

按时间顺序列出症状

对找出问题最有帮助的线索,往往就是问题发生前的一系列操作,因此,你的说明应该包含操作步骤,以及电脑的反应,直到问题产生。

如果你的说明很长,在开头简述问题会有所帮助,接下来按时间顺序详述。这样程序员们就知道该在你的说明中找什么。

搞清楚你想问什么

漫无边际的提问近乎于无休无止的时间黑洞,没人愿意把时间浪费在这上面。最能给你有用答案的人也正是最忙的人,毕竟他们自己也需要工作。这样的人对无节制的时间黑洞不太感冒,因此也可以说他们对漫无边际的提问不大感冒。

如果你明确表述需要回答者做什么,比如提供建议,发送一段代码或是别的事情,就最有可能得到有用的答案。这会定出一个时间和精力的上限,便于回答者集中精力来帮你,这很奏效。要理解专家们生活的世界,要把专业技能想象为充裕的资源,而回复的时间则是贫乏的资源。解决你的问题需要的时间越少,越能从忙碌的专家口中掏出答案。

因此,优化问题的结构,尽量减少专家们解决它所需要的时间,会有很大的帮助——这通常和简化问题有所区别。因此,问“我想更好的理解 X,能给点提示吗?”通常比问“你能解释一下 X 吗?”更好。如果你的代码不能工作,问问它有什么地方不对,比要求别人替你修改要明智得多。

别问应该自己解决的问题

程序员们总是善于分辨哪些问题应该由你自己解决;因为我们中的大多数都曾自己解决这类问题。同样,这些问题得由你来搞定,你会从中学到东西。你可以要求给点提示,但别要求得到完整的解决方案。

去除无意义的疑问

别用无意义的话结束提问,例如“有人能帮我吗?”或者“有答案吗?”。首先,如果你对问题的描述不很合适,这样问更是画蛇添足。其次,由于这样问是画蛇添足,程序员们会很讨厌你,而且通常会用逻辑上正确的回答来表示他们的蔑视,例如:“没错,有人能帮你”或者“不,没答案”。

谦逊绝没有害处,而且常帮大忙

彬彬有礼,多用“请”和“先道个谢了”。让大家都知道你对他们花费时间义务提供帮助心存感激。然而,如果你有很多问题无法解决,礼貌将会增加你得到有用答案的机会。

问题解决后,加个简短说明

问题解决后,向所有帮助过你的人发个说明,让他们知道问题是怎样解决的,并再一次向他们表示感谢。如果问题在新闻组或者邮件列表中引起了广泛关注,应该在那里贴一个补充说明。补充说明不必很长或是很深入,简单的一句“你好,原来是网线出了问题!谢谢大家——某某”比什么也不说要强。事实上,除非结论真的很有技术含量,否则简短可爱的小总结比长篇学术论文更好。说明问题是怎样解决的,但大可不必将解决问题的过程复述一遍。

除了表示礼貌和反馈信息以外,这种补充有助于他人在邮件列表/新闻组/论坛中搜索对你有过帮助的完整解决方案,这可能对他们也很有用。最后,这种补充有助于所有提供过帮助的人从中得到满足感。如果你自己不是老手或者程序员,那就相信我们,这种感觉对于那些你向他们求助的导师或者专家而言,是非常重要的。问题久拖未决会让人灰心;程序员们渴望看到问题被解决。好人有好报,满足他们的渴望,你会在下次贴出新问题时尝到甜头。

还是不懂

如果你不是很理解答案,别立刻要求对方解释。像你以前试着自己解决问题时那样,借助手册、FAQ、网络、身边高手的指导,去理解它。如果你真的需要对方解释,记得表明你已经学到了点什么。比方说,如果我回答你:“看来似乎是 zEntry 被阻塞了,你应该先清除它。”,然后一个很糟的后续问题:“zEntry 是什么?”聪明的问法应该是这样:“哦,我看过帮助了但是只有 -z 和 -p 两个参数中提到了 zEntry 而且还都没有清楚的解释。您是指这两个中的哪一个吗?还是我看漏了什么?”很显然,后者认真学习了我的回答,那么我很自然地就更愿意为他提供更多后续解答。

三思而后问

以下是几个经典的蠢问题,以及程序员在拒绝回答时心里吐槽的:

问题:我能在哪找到某某程序?

回答:就在我找到它的地方啊蠢货——搜索引擎的那一头。天呐!还有人不会用网络的吗?

问题:我的程序/配置/SQL 声明没有用怎么办?

回答:这不算是问题吧?如果要我问你二十个问题才找得出来的话,我对找出你的真正问题没兴趣,我有更有意思的事要做呢。

问题:我的程序运行不正确,你能帮我吗?

回答:在看到这类问题的时候,我的反应通常不外如下三种:

  1. 你还有什么要补充的吗?
  2. 真糟糕,希望你能搞定。
  3. 这关我鸟事?

问题:我在安装 Visual Studio 时有问题,你能帮我吗?

回答:不能,我只有亲自在你的电脑上动手才能找到毛病,鬼知道什么毛病。

问题:我想做个病毒/怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢?

回答:想要这样做,说明你是个卑鄙小人。想找个程序员帮你,说明你是个大傻逼!

好问题,坏问题

最后,我举一些例子来说明,怎样聪明的提问:同一个问题的两种问法被放在一起,一种是愚蠢的,另一种才是明智的。

蠢问题:我可以在哪儿找到关于 CLR 的资料?

解答者:你他妈自己上网搜啊。

聪明问题:我用百度搜索过 CLR 公共运行时,我想要了解它的中间语言编译原理,但是没找到有用的结果,有谁知道在哪儿可以找到这类资料吗?

蠢问题:我从网上下载的 WinForm 项目源码没法编译。它怎么这么烂?

解答者:别人做的都是烂东西,你有多高贵?

聪明问题:WinForm 项目代码在 Visual Studio 2005 中无法编译通过,报错是……。下载的项目文件夹中包括以下文件:……。我查过了 MSDN 但是没什么头绪,这是我编译过程的记录,我有什么做得不对的地方吗?

解答者:他讲明了环境,也查过了 MSDN,还指明了错误,并且他没有把问题的责任推到别人头上,这个家伙值得留意。

蠢问题:我的程序有问题了,谁来帮我?

解答者:怎么,还要我帮你换尿布?

聪明问题:我在 Core i5 处理器上试过了 X、Y 和 Z,但没什么作用,我又试了 A、B 和 C。请注意当我尝试 C 时的奇怪现象,显然边带传输中出现了收缩,但结果出人意料。在多核处理器上引起边带泄漏的通常原因是什么?谁有好建议接下来我该做些什么测试才能找出问题?

解答者:这个家伙,从另一个角度来看,值得去回答他。他表现出了解决问题的能力,而不是坐等天上掉答案。

在最后一个问题中,注意“告诉我答案”和“给我启示,指出我还应该做什么诊断工作”之间微妙而又重要的区别。事实上,后一个问题源自于 2001 年 8 月在 Linux 内核邮件列表上的一个真实的提问。我(Eric)就是那个提出问题的人。我在 TyanS2464 主板上观察到了这种无法解释的锁定现象,列表成员们提供了解决那一问题的重要信息。

通过我的提问方法,我给了大家值得玩味的东西,我让人们很容易参与并且被吸引进来。我显示了自己具备和他们同等的能力,邀请他们与我共同探讨。我告诉他们我所走过的弯路,以避免他们再浪费时间,这是一种对他人时间价值的尊重。最后,当我向每个人表示感谢,并称赞这套程序运作得非常出色的时候,一个 Linux 内核邮件列(lkml)成员表示,问题得到解决并非由于我是这个列表中的“名人”,而是因为我用了正确的方式来提问。我们程序员从某种角度来说是拥有丰富知识但缺乏人情味的家伙。我相信他是对的,如果我象个乞讨者那样提问,不论我是谁,一定会惹恼某些人或者被他们忽视。他建议我记下这件事,给编写这个指南的人一些指导。

找不到答案怎么办

如果仍得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。没有回应不代表你被忽视,虽然不可否认这种差别很难区分。

总的说来,简单的重复张贴问题是个很糟的想法。这将被视为无意义的喧闹。

你可以通过其它渠道获得帮助,这些渠道通常更适合初学者的需要。有许多网上的以及本地的用户组,由狂热的软件爱好者——即使他们可能从没亲自写过任何软件——组成。通常人们组建这样的团体来互相帮助并帮助新手。

另外,你可以向很多商业公司寻求帮助,不论公司大还是小,比如 RedHat 和 LinuxCare。别为要付费才能获得帮助而感到沮丧!毕竟,假使你的汽车发动机汽缸密封圈爆掉了,你还得把它送到修车铺,并且为维修付费。就算软件没花费你一分钱,你也不能强求技术支持总是免费的。

对大众化的软件,例如 Linux,每个开发者至少会有上万名用户。根本不可能由一个人来处理来自上万名用户的求助电话。要知道,即使你要为帮助付费,同你必须购买同类软件相比,你所付出的也是微不足道的。通常封闭源代码软件的技术支持费用比开放源代码软件要高得多,且内容也不那么丰富。

(完)

© 2012-2023 Conmajia

提问的艺术:如何快速获得答案相关推荐

  1. 《提问的艺术:如何快速获得答案》(精读版)

    <提问的艺术><How-To-Ask-Questions-The-Smart-Way>  https://github.com/ryanhanwu/How-To-Ask-Que ...

  2. 提问的艺术 - 敏捷教练技巧

    Scrum Master角色和敏捷教练相关内容 - Scrum指南 最近我复习了一遍Ken Schwaber和Jeff Sutherlan共同开发和维护的 "Scrum指南". ( ...

  3. 提问的艺术 for ChatGPT

    原文地址:https://jiangliuhong.top/2023/04/09/normal/chatgpt_ti_wen_fen_xiang/ <提问的艺术 for ChatGPT>( ...

  4. 【新手提问导读】提问的艺术_提问的艺术

    [新手提问导读]提问的艺术 by Princiya 由Princiya 提问的艺术 (The art of asking questions) The art and science of askin ...

  5. python123第九周测验答案2020_知到智慧树2020艺术概论章节测验答案

    知到智慧树2020艺术概论章节测验答案 更多相关问题 [判断题]机械温控冰箱可以存放易燃易爆的化学品.[多选题]1.网络销售促进策略有( )[判断题]全面坚持和正确处理 "-个中心.两个基本 ...

  6. 提问的艺术!(转载)

    在黑客世界里,当提出一个技术问题时,你能得到怎样的回答?这取决于挖出答案 的难度,同样取决于你提问的方法.本指南旨在帮助你提高发问技巧,以获取你最 想要的答案. 首先你必须明白,黑客们只偏爱艰巨的任务 ...

  7. 计算机美术试题及答案,计算机二级 -小学艺术教育试题及答案(2006年10月) -我要模考网...

    小学艺术教育试题及答案(2006年10月) 作者:天那水 2010-05-15 09:47:15 以下是部分内容预览,注意图片没有显示出来,WORD里是有的.请到下载区下载完整的试题及答案. 2006 ...

  8. 《提问的艺术》读书笔记

    分享读<提问的艺术>的xmind总结,每周听一本书,打卡第一周

  9. Word编辑试卷,教你一键快速隐藏答案

    在对试卷进行制作时会连同答案一起录入,这样在批改试卷时出现了争议可以及时根据答案做出改正.但是制作的试卷是复印给学生使用的 ,这时就要对答案进行隐藏.一份完整的试卷不可能一个一个隐藏,这时就需要一些小 ...

最新文章

  1. 【MediaPipe】(4) AI视觉,远程手势调节电脑音量,附python完整代码
  2. Python的map方法的应用
  3. 用“连接”勾勒角色:《死亡搁浅》亡人的设计及其背后的故事谜题
  4. 智能指针——weak_ptr
  5. cocos2dx 3.x(屏幕截图的两种方法)
  6. HTTP管线化(HTTP pipelining)
  7. ASP.NET企业开发框架IsLine FrameWork系列之一--第一次的亲密接触
  8. floatmap 二维数组_Golang学习笔记(四):array、slice、map
  9. Mysql——查看数据库,表占用磁盘大小
  10. 思科最模拟器Cisco Packet Tracer 7.3.0安装配置
  11. 解决数据库不能更新或数据库或对象为只读
  12. python爬取b站弹幕分析_B站直播弹幕获取 - 用python写一个B站弹幕姬吧
  13. 鼠标光标变成方块怎么办
  14. OneStep 移植
  15. 使用 Learner Lab 建立 WordPress 网站 (EC2)
  16. 从vivo Photo Lab“影像实验室”透视门店新价值
  17. quantopian寻找策略之mean_reversion
  18. 宿松中学2021高考成绩查询,宿松2018高考成绩公布
  19. Unskilled in English is looked down on by people (composition)
  20. 北朝皇帝简介-20170610

热门文章

  1. 使用python将freemind转化成excel
  2. 让文化与大数据 离婚吧
  3. 联合利华投资10亿欧元,致力到2030年淘汰清洁产品中的化石燃料
  4. scala之类型参数
  5. SASS的概念和使用
  6. akka 与kafka
  7. hdu6217 - BBP Formula
  8. 谷歌与百度的搜索技巧
  9. 解决小程序自定义导航栏和右边胶囊高度一致
  10. 12.关于uniapp小程序设置页面背景色无效的问题及解决方案