原文链接:提问的智慧
十分有用的文章,希望每一个程序员都能看一看,学习下提问的智慧。欢迎大家留言讨论。
本文中的“黑客”是指优秀的程序员。
黑客世界里,你提问的方法,挖出答案的难度,决定了你能得到怎样的提问。
提问须知:
- 黑客们只偏爱艰巨的任务,或者能激发他们思维的好问题
- 黑客蔑视不愿思考,或是在发问前不去完成他们应该做的事的人【
失败者
/lusers
】 - 回答问题的人,大多属于志愿者,所以请去掉自以为有资格得到答案的想法
- 既然没有为别人回答问题的服务支付任何报酬,那你需要自己去“挣”回一个答案
- 如何不能接受这种“歧视”,要么放弃当
失败者
,像一个成功者
一样提问,要么放弃请求黑客帮助,转向商业有偿帮助 - 常怀感恩之心,提问的时候和得到答案的时候,都感谢,常用“请”,“谢谢”等词
- 从问题的回答中汲取教训。如果收到的是
RTFM
、STFW
,就长点心吧 - 如果好好提问还是找不到答案,这不代表你被忽视,可能是看到你问题的人也不知道答案【虽然这个差别很难分辨】
提问之前:
- 通读手册,尝试去找到答案,或者确定问题
- 在FAQ中寻找答案(一份维护得好的FAQ应该包罗万象)
- 利用搜索工具(大事不决问谷歌,小事不决问百度;先在Stack Overflow / SegmentFault这两个网站搜索一下)
- 向身边精通此道的人请教(同事,朋友)
- 尝试阅读源码以找到答案
如何提问:
1. 谨慎选择提问的场合
- 注意主题相关性
避免在风马牛不相及的论坛提问 - 注意难度
避免在探讨高级技巧的论坛贴出非常初级的问题;反之亦然 - 避免重复提问
避免在一个论坛太多不同的组重复提问 - 避免给既非熟人也没有义务解决你问题的人发送私人的电邮
别像机关枪似的一次性“扫射”所有的帮助渠道,这就像大喊大叫一样会令人不快,温柔地一个一个来。
2. 用词精确,语法正确,拼写无误,标点符号无误
经验:粗心的写作者通常也是马虎的思考者
如何是非母语的论坛提问,可以犯拼写和语法上的小错,但绝不能再思考上马虎【这个回答者会很清楚哒~~~】
同时,除非你知道回答者使用的语言,否则请使用英语书写。在互联网上英语是工作语言,用英语书写可以将你的问题不被阅读就被直接删除的可能性降到最低。
3. 使用含义丰富,描述精确的标题
放弃用“帮帮忙”,“救命啊”这种让人反感的话来描述。
妄想用痛苦程度来打动黑客,是不切实际的。
用空格代替问题描述,是不理智的。
把问题标记为“紧急”,即使对你而言的确如此,也是不合时宜的。
错误示例
救命啊!!!我的系统不能正常运行了
正确示例
ThinkPad P40 Yoga,Win10 家庭版,无法正常开机
4. 精确有物得描述,尽可能多提供信息
尽量想象黑客会怎样反问你,提问的时候预先给出答案
1> 谨慎精确地描述症状
2> 提供问题发生的环境(机器配置,操作系统,应用程序等)
3> 说明你在提问前是怎么研究和理解这个问题的
4> 说明你在提问前采取了什么步骤去解决它
5> 如果尝试去解决了,请列出你解决依据的出处
6> 罗列最近做过的可能有影响硬件,软件变更或者其他操作
强烈推荐你看一下 如何有效地报告 Bug
5. 简化问题
提供精确有效的资讯,同时尽可能精简裁剪你的问题
这样的好处至少有三点:
- 表现出你为简化问题付出了努力,提高得到回答的可能性
- 简化问题使得到有价值的答案的机会增加
- 在提炼bug报告中的过错
6. 明确事实和猜测
要设法搞清什么是事实(例如:“我在电脑旁”和“XX出现了”)什么是推测(例如:“我想问题可能是出在……”)。
可以加上自己的猜测,但是一定要确定明确清晰的描述了问题症状
7. 按照时间顺序列出症状
也就是重现步骤
按照时间顺序,说明每一步执行了什么操作,电脑的反应是什么。
8. 优化问题的结构:明确表述需要得到什么帮助
定出一个时间和精力的上限,便于回答者集中精力来帮助你。(提供建议,发送一段代码,检查补丁,或者是别的)
要理解专家们生活的世界,要把专业技能想像成充足的资源,而回复时间则是贫乏的资源——尽可能减少专家们解决问题需要的时间。解决你的问题需要的时间越少,越能从从忙碌的专家口中掏出答案。
“你能解释一下xx吗?”
优化问题的结构:“我想更好的理解xx,能给点提示吗?”
对于问题代码,寻求别人提示,比要求别人替你修改要明智
9. 去除无意义的疑问
别用无意义的话结束提问。例如:“有人能帮我吗?”、“有答案吗?”
- 如果你对问题的描述并不合适,这样问是画蛇添足
- 画蛇添足会引起黑客们的厌烦——所以你收到的回答通常是逻辑正确的无意义答案,如——“没错,有人能帮你。”、“不,没答案”、“你猜”
10. 表明愿意在找答案的过程中做点什么
这样会增加你得到有效回复的概率。因为你表现出了只要有人指点正确的方向,你就有完成它的能力和决心。“谁能给点提示?”,“我这个例子缺了什么?”,“我应该检查了什么地方?”比“请把确切的过程贴出来”更容易得到答复
11. 代码类如何提问
要求他人给你出问题的代码排错的时候,不应该贴出几百行的代码,然后只说“它不能运行”,毫不提及应该从何入手。而是,只贴几十行代码,然后说一句“在第七行以后,本应该显示<x>,但实际出现的是<y>”,才会非常有可能让你得到回复。
最精确描述代码问题的方法是提供一个能展示问题的最小测试样例。、
什么是最小测试样例?它是对问题的展现,只需要刚好能够重现非预期行为的代码即可。
如何生成一个最小测试样例?如果你知道哪一行或哪一段代码会产生问题,将其复制并提供刚好够用的外围支撑代码以构成一个完整的样例(够用是指源码刚好能被编译器、解释器或任何处理它的程序所接受)。如果你不能将问题缩小到特定的段落,复制源码并去除那些与问题无关的代码段。你能提供的最小测试样例越小越好
12. 保持谦逊礼貌感恩
多用“请”,“先道个谢啦”,“多谢帮忙解决”
建议提问前得到答案后都道谢~~~
请大家都知道你对他们花费时间志愿提供帮助心存感激
增加得到有用答案的机会
13. 问题解决后,加以简单说明
除非结论很有技术含量,否则补充说明不必很长或很深入
如果可以,尽量说明问题是怎么解决的。
- 帮助他人了解解决方案,可能适用他人的问题
- 有助于所有提供过帮助的人从中得到问题解决的满足感
14. 还是不懂问题答案
先按照自己解决问题是那样(手册,FAQ,搜索,身边高手)去理解答案。
如果真的需要对方解释,记得表现出你已经学习到了什么。
例如:
回答者:“看起来似乎是zEntry被阻塞了,你应该先清除它”
提问者【糟糕回答】:“zEntry是什么?”
提问者【聪明回答】:“哦~~~我看过帮助文档了,但是只有-z和-p两个参数中提到了zEntry,而且都没有有清楚的解释,你是指这两个中的哪一个吗?还是我看漏了什么?”
附录
三思而后问——谨慎不要触到雷区
以下是几个景点蠢问题,以及黑客在拒绝回答时的心中所想.
Q:我能在哪找到X程式?
A:就在我能找到他们的地方啊!就在搜素引擎的第一个!!!天哪,竟然还有人不会搜索吗?
.
Q:我的程式(配置、声明)没有用
A:这不是问题吧,我对找到你的真正问题没兴趣;
你还有什么要补充的吗?难道要问你二十个问题才能找出你的真正问题吗;
真糟糕,希望你能搞定;
这跟我有什么关系;
.
Q:我的win有问题,谁能帮帮我?
A:我可以啊,扔掉win,换成linux吧
.
Q:我在安装Linxu/xx时有问题,有人能帮帮我?
A:并不能,我只有亲自在你电脑上动手才能找到毛病
.
Q:我怎么能破解root账号 / 窃取别人的密码 ?
A:想要这么做,说明你是个卑鄙小人;想找黑客帮你,说明你是个白痴
好问题 VS 坏问题
举例说明怎样是从好的提问
坏问题:我在哪可以找到关于Foonly Flurbamatic
的资料 【可能只能得到STFW
的回复】
好问题:我用谷歌搜索过Foonly Flurbamatic 2600
,但是没有有用的结果,谁知道上哪找对这种编程的资料【STFW
过了,看起来是真的遇到麻烦了】
坏问题:我从FOO项目找来的源码无法编译。它怎么这么烂?【他觉得都是别人的错,这家伙真是傲慢无礼】
好问题:FOO代码在Nulix 6.2版下无法编译通过,FAQ上面没有提到跟Nulix有关的问题。以下是我编程过程的记录,和报错情况,我有什么做的不对的地方吗?麻烦帮忙看一下,多谢啦【说明环境,也读过FAQ,并且指明了错误,并且并无推卸责任,值得留意】
RTFM和STFW:别烦我啦
“RTFM (Read The Fucking Manual)
”:回答者认为你要去读读手冊。当然,基本上,他是对的,你应该去读一读。
RTFM有一个年轻的亲戚。“STFW (Search The Fucking Web)
”:回答者认为你应该去网上搜索一下。基本上,他也是对的,你就去找吧。
通常,用这两句之一回答你的人会给你一份包含你需要內容的手册或者一个网址,
而且他们打这些字的時候正在阅读着。
這些答復意味著回答者認為
这些答复意味着回答者认为
1> 你需要的资讯非常容易获得
2> 你自己去搜索这些资讯比灌给你能让你学到更多
别为这个不爽。依照黑客的标准,他能回复你就代表某种关注,你应该感谢他热切地想要帮助你。
Copyright (C) 2001 by Eric S. Raymond
中文版 Copyleft 2001 by D.H.Grand(nOBODY/Ginux)
英文版:http://www.tuxedo.org/~esr/faqs/smart-questions.html
感谢Eric
的耐心指点和同意,本文才得以完成並发布,
本指南 英文版版权为 Eric Steven Raymond
所有,
中文版版权由 D.H.Grand[nOBODY/Ginux]
所有。