Commit 75f92752 by pengkai_kai

上传一篇值得阅读的文章——如何聪明地提出和解决一个问题

parent 48eab1b1
The MIT License (MIT)
The MIT License (MIT)
Copyright (c) 2016 Ryan Wu
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# 提问的智慧
# 提问的智慧
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/pulls)
**How To Ask Questions The Smart Way**
Copyright © 2001,2006,2014 Eric S. Raymond, Rick Moen
本指南英文版版权为 Eric S. Raymond, Rick Moen 所有。
原文网址:[http://www.catb.org/~esr/faqs/smart-questions.html](http://www.catb.org/~esr/faqs/smart-questions.html)
Copyleft 2001 by D.H.Grand(nOBODY/Ginux), 2010 by Gasolin, 2015 by Ryan Wu
本中文指南是基于原文 3.10 版以及 2010 年由 [Gasolin](https://github.com/gasolin) 所翻译版本的最新翻译;
协助指出翻译问题,**请[发 Issue](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/issues/new),或直接[发 Pull Request](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/compare) 给我。**
本文另有[繁體中文版](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README.md)
## [原文版本历史](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/history.md)
## 目录
* [声明](#声明)
* [简介](#简介)
* [在提问之前](#在提问之前)
* [当你提问时](#当你提问时)
* [慎选提问的论坛](#慎选提问的论坛)
* [Stack Overflow](#stack-overflow)
* [网站和 IRC 论坛](#网站和-irc-论坛)
* [第二步,使用项目邮件列表](#第二步使用项目邮件列表)
* [使用有意义且描述明确的标题](#使用有意义且描述明确的标题)
* [使问题容易回复](#使问题容易回复)
* [用清晰、正确、精准且语法正确的语句](#用清晰、正确、精准且语法正确的语句)
* [使用易于读取且标准的文件格式发送问题](#使用易于读取且标准的文件格式发送问题)
* [精确地描述问题并言之有物](#精确地描述问题并言之有物)
* [话不在多而在精](#话不在多而在精)
* [别动辄声称找到 Bug](#别动辄声称找到-bug)
* [低声下气不能代替你的功课](#低声下气不能代替你的功课)
* [描述问题症状而非你的猜测](#描述问题症状而非你的猜测)
* [按发生时间先后列出问题症状](#按发生时间先后列出问题症状)
* [描述目标而不是过程](#描述目标而不是过程)
* [别要求使用私人电邮回复](#别要求使用私人电邮回复)
* [清楚明确的表达你的问题以及需求](#清楚明确的表达你的问题以及需求)
* [询问有关代码的问题时](#询问有关代码的问题时)
* [别把自己家庭作业的问题贴上来](#别把自己家庭作业的问题贴上来)
* [去掉无意义的提问句](#去掉无意义的提问句)
* [即使你很急也不要在标题写紧急](#即使你很急也不要在标题写紧急)
* [礼多人不怪,而且有时还很有帮助](#礼多人不怪而且有时还很有帮助)
* [问题解决后,加个简短的补充说明](#问题解决后加个简短的补充说明)
* [如何解读答案](#如何解读答案)
* [RTFM 和 STFW:如何知道你已完全搞砸了](#rtfm-和-stfw如何知道你已完全搞砸了)
* [如果还是搞不懂](#如果还是搞不懂)
* [处理无礼的回应](#处理无礼的回应)
* [如何避免扮演失败者](#如何避免扮演失败者)
* [不该问的问题](#不该问的问题)
* [好问题与蠢问题](#好问题与蠢问题)
* [如果得不到回答](#如果得不到回答)
* [如何更好地回答问题](#如何更好地回答问题)
* [相关资源](#相关资源)
* [鸣谢](#鸣谢)
## 声明
许多项目在他们的使用协助/说明网页中链接了本指南,这么做很好,我们也鼓励大家都这么做。但如果你是负责管理这个项目网页的人,请在超链接附近的显著位置上注明:
**本指南不提供此项目的实际支持服务!**
我们已经深刻领教到少了上述声明所带来的痛苦。因为少了这点声明,我们不停地被一些白痴纠缠。这些白痴认为既然我们发布了这本指南,那么我们就有责任解决世上所有的技术问题。
如果你是因为需要某些协助而正在阅读这本指南,并且最后离开是因为发现从本指南作者们身上得不到直接的协助,那么你就是我们所说的那些白痴之一。别问我们问题,我们只会忽略你。我们在这本指南中是教你如何从那些真正懂得你所遇到软件或硬件问题的人取得协助,而 99% 的情况下那不会是我们。除非你确定本指南的作者之一刚好是你所遇到的问题领域的专家,否则请不要打扰我们,这样大家都会开心一点。
## 简介
[黑客](http://www.catb.org/~esr/faqs/hacker-howto.html)的世界里,当你拋出一个技术问题时,最终是否能得到有用的回答,往往取决于你所提问和追问的方式。本指南将教你如何正确的提问以获得你满意的答案。
不只是黑客,现在开源(Open Source)软件已经相当盛行,你常常也可以由其他有经验的使用者身上得到好答案,这是件**好事**;使用者比起黑客来,往往对那些新手常遇到的问题更宽容一些。然而,将有经验的使用者视为黑客,并采用本指南所提的方法与他们沟通,同样也是能从他们身上得到满意回答的最有效方式。
首先你应该明白,黑客们喜爱有挑战性的问题,或者能激发他们思维的好问题。如果我们并非如此,那我们也不会成为你想询问的对象。如果你给了我们一个值得反复咀嚼玩味的好问题,我们自会对你感激不尽。好问题是激励,是厚礼。好问题可以提高我们的理解力,而且通常会暴露我们以前从没意识到或者思考过的问题。对黑客而言,"好问题!"是诚挚的大力称赞。
尽管如此,黑客们有着蔑视或傲慢面对简单问题的坏名声,这有时让我们看起来对新手、无知者似乎较有敌意,但其实不是那样的。
我们不讳言我们对那些不愿思考、或者在发问前不做他们该做的事的人的蔑视。那些人是时间杀手 —— 他们只想索取,从不付出,消耗我们可用在更有趣的问题或更值得回答的人身上的时间。我们称这样的人为 `失败者(撸瑟)` (由于历史原因,我们有时把它拼作 `lusers`)。
我们意识到许多人只是想使用我们写的软件,他们对学习技术细节没有兴趣。对大多数人而言,电脑只是种工具,是种达到目的的手段而已。他们有自己的生活并且有更要紧的事要做。我们了解这点,也从不指望每个人都对这些让我们着迷的技术问题感兴趣。尽管如此,我们回答问题的风格是指向那些真正对此有兴趣并愿意主动参与解决问题的人,这一点不会变,也不该变。如果连这都变了,我们就是在降低做自己最擅长的事情上的效率。
我们(在很大程度上)是自愿的,从繁忙的生活中抽出时间来解答疑惑,而且时常被提问淹没。所以我们无情的滤掉一些话题,特别是拋弃那些看起来像失败者的家伙,以便更高效的利用时间来回答`赢家(winner)`的问题。
如果你厌恶我们的态度,高高在上,或过于傲慢,不妨也设身处地想想。我们并没有要求你向我们屈服 —— 事实上,我们大多数人非常乐意与你平等地交流,只要你付出小小努力来满足基本要求,我们就会欢迎你加入我们的文化。但让我们帮助那些不愿意帮助自己的人是没有效率的。无知没有关系,但装白痴就是不行。
所以,你不必在技术上很在行才能吸引我们的注意,但你必须表现出能引导你变得在行的特质 —— 机敏、有想法、善于观察、乐于主动参与解决问题。如果你做不到这些使你与众不同的事情,我们建议你花点钱找家商业公司签个技术支持服务合同,而不是要求黑客个人无偿地帮助你。
如果你决定向我们求助,当然你也不希望被视为失败者,更不愿成为失败者中的一员。能立刻得到快速并有效答案的最好方法,就是像赢家那样提问 —— 聪明、自信、有解决问题的思路,只是偶尔在特定的问题上需要获得一点帮助。
(欢迎对本指南提出改进意见。你可以 email 你的建议至 [esr@thyrsus.com](esr@thyrsus.com)[respond-auto@linuxmafia.com](respond-auto@linuxmafia.com)。然而请注意,本文并非[网络礼节](http://www.ietf.org/rfc/rfc1855.txt)的通用指南,而我们通常会拒绝无助于在技术论坛得到有用答案的建议)。
## 在提问之前
在你准备要通过电子邮件、新闻群组或者聊天室提出技术问题前,请先做到以下事情:
1. 尝试在你准备提问的论坛的旧文章中搜索答案。
2. 尝试上网搜索以找到答案。
3. 尝试阅读手册以找到答案。
4. 尝试阅读常见问题文件(FAQ)以找到答案。
5. 尝试自己检查或试验以找到答案。
6. 向你身边的强者朋友打听以找到答案。
7. 如果你是程序开发者,请尝试阅读源代码以找到答案。
当你提出问题的时候,请先表明你已经做了上述的努力;这将有助于树立你并不是一个不劳而获且浪费别人的时间的提问者。如果你能一并表达在做了上述努力的过程中所**学到**的东西会更好,因为我们更乐于回答那些表现出能从答案中学习的人的问题。
运用某些策略,比如先用 Google 搜索你所遇到的各种错误信息(搜索 [Google 论坛](http://groups.google.com/)和网页),这样很可能直接就找到了能解决问题的文件或邮件列表线索。即使没有结果,在邮件列表或新闻组寻求帮助时加上一句 `我在 Google 中搜过下列句子但没有找到什么有用的东西` 也是件好事,即使它只是表明了搜索引擎不能提供哪些帮助。这么做(加上搜索过的字串)也让遇到相似问题的其他人能被搜索引擎引导到你的提问来。
别着急,不要指望几秒钟的 Google 搜索就能解决一个复杂的问题。在向专家求助之前,再阅读一下常见问题文件(FAQ)、放轻松、坐舒服一些,再花点时间思考一下这个问题。相信我们,他们能从你的提问看出你做了多少阅读与思考,如果你是有备而来,将更有可能得到解答。不要将所有问题一股脑拋出,只因你的第一次搜索没有找到答案(或者找到太多答案)。
准备好你的问题,再将问题仔细的思考过一遍,因为草率的发问只能得到草率的回答,或者根本得不到任何答案。越是能表现出在寻求帮助前你为解决问题所付出的努力,你越有可能得到实质性的帮助。
小心别问错了问题。如果你的问题基于错误的假设,某个普通黑客(J. Random Hacker)多半会一边在心里想着`蠢问题…`, 一边用无意义的字面解释来答复你,希望着你会从问题的回答(而非你想得到的答案)中汲取教训。
绝不要自以为**够格**得到答案,你没有;你并没有。毕竟你没有为这种服务支付任何报酬。你将会是自己去**挣到**一个答案,靠提出有内涵的、有趣的、有思维激励作用的问题 —— 一个有潜力能贡献社区经验的问题,而不仅仅是被动的从他人处索取知识。
另一方面,表明你愿意在找答案的过程中做点什么是一个非常好的开端。`谁能给点提示?``我的这个例子里缺了什么?`以及`我应该检查什么地方``请把我需要的确切的过程贴出来`更容易得到答复。因为你表现出只要有人能指个正确方向,你就有完成它的能力和决心。
## 当你提问时
### 慎选提问的论坛
小心选择你要提问的场合。如果你做了下述的事情,你很可能被忽略掉或者被看作失败者:
* 在与主题不合的论坛上贴出你的问题。
* 在探讨进阶技术问题的论坛张贴非常初级的问题;反之亦然。
* 在太多的不同新闻群组上重复转贴同样的问题(cross-post)。
* 向既非熟人也没有义务解决你问题的人发送私人电邮。
黑客会剔除掉那些搞错场合的问题,以保护他们沟通的渠道不被无关的东西淹没。你不会想让这种事发生在自己身上的。
因此,第一步是找到对的论坛。再说一次,Google 和其它搜索引擎还是你的朋友,用它们来找到与你遭遇到困难的软硬件问题最相关的网站。通常那儿都有常见问题(FAQ)、邮件列表及相关说明文件的链接。如果你的努力(包括**阅读** FAQ)都没有结果,网站上也许还有报告 Bug(Bug-reporting)的流程或链接,如果是这样,链过去看看。
向陌生的人或论坛发送邮件最可能是风险最大的事情。举例来说,别假设一个提供丰富内容的网页的作者会想充当你的免费顾问。不要对你的问题是否会受到欢迎做太乐观的估计 —— 如果你不确定,那就向别处发送,或者压根别发。
在选择论坛、新闻群组或邮件列表时,别太相信名字,先看看 FAQ 或者许可书以弄清楚你的问题是否切题。发文前先翻翻已有的话题,这样可以让你感受一下那里的文化。事实上,事先在新闻组或邮件列表的历史记录中搜索与你问题相关的关键词是个极好的主意,也许这样就找到答案了。即使没有,也能帮助你归纳出更好的问题。
别像机关枪似的一次"扫射"所有的帮助渠道,这就像大喊大叫一样会使人不快。要一个一个地来。
搞清楚你的主题!最典型的错误之一是在某种致力于跨平台可移植的语言、套件或工具的论坛中提关于 Unix 或 Windows 操作系统程序界面的问题。如果你不明白为什么这是大错,最好在搞清楚这之间差异之前什么也别问。
一般来说,在仔细挑选的公共论坛中提问,会比在私有论坛中提同样的问题更容易得到有用的回答。有几个理由可以支持这点,一是看潜在的回复者有多少,二是看观众有多少。黑客较愿意回答那些能帮助到许多人的问题。
可以理解的是,老练的黑客和一些热门软件的作者正在接受过多的错发信息。就像那根最后压垮骆驼背的稻草一样,你的加入也有可能使情况走向极端 —— 已经好几次了,一些热门软件的作者从自己软件的支持中抽身出来,因为伴随而来涌入其私人邮箱的无用邮件变得无法忍受。
### Stack Overflow
搜索,**然后** 在 Stack Exchange 问。
近年来,Stack Exchange community 社区已经成为回答技术及其他问题的主要渠道,尤其是那些开放源码的项目。
因为 Google 索引是即时的,在看 Stack Exchange 之前先在 Google 搜索。有很高的机率某人已经问了一个类似的问题,而且 Stack Exchange 网站们往往会是搜索结果中最前面几个。如果你在 Google 上没有找到任何答案,你再到特定相关主题的网站去找。用标签(Tag)搜索能让你更缩小你的搜索结果。
Stack Exchange 已经成长到[超过一百个网站](http://stackexchange.com/sites),以下是最常用的几个站:
* Super User 是问一些通用的电脑问题,如果你的问题跟代码或是写程序无关,只是一些网络连线之类的,请到这里。
* Stack Overflow 是问写程序有关的问题。
* Server Fault 是问服务器和网管相关的问题。
### 网站和 IRC 论坛
本地的使用者群组(user group),或者你所用的 Linux 发行版本也许正在宣传他们的网页论坛或 IRC 频道,并提供新手帮助(在一些非英语国家,新手论坛很可能还是邮件列表), 这些地方是开始提问的好首选,特别是当你觉得遇到的也许只是相对简单或者很普通的问题时。有广告赞助的 IRC 频道是公开欢迎提问的地方,通常可以即时得到回应。
事实上,如果程序出的问题只发生在特定 Linux 发行版提供的版本(这很常见),最好先去该发行版的论坛或邮件列表中提问,再到程序本身的论坛或邮件列表提问。(否则)该项目的黑客可能仅仅回复 "用**我们的**版本"。
在任何论坛发文以前,先确认一下有没有搜索功能。如果有,就试着搜索一下问题的几个关键词,也许这会有帮助。如果在此之前你已做过通用的网页搜索(你也该这样做),还是再搜索一下论坛,搜索引擎有可能没来得及索引此论坛的全部内容。
通过论坛或 IRC 频道来提供使用者支持服务有增长的趋势,电子邮件则大多为项目开发者间的交流而保留。所以最好先在论坛或 IRC 中寻求与该项目相关的协助。
在使用 IRC 的时候,首先最好不要发布很长的问题描述,有些人称之为频道洪水。最好通过一句话的问题描述来开始聊天。
### 第二步,使用项目邮件列表
当某个项目提供开发者邮件列表时,要向列表而不是其中的个别成员提问,即使你确信他能最好地回答你的问题。查一查项目的文件和首页,找到项目的邮件列表并使用它。有几个很好的理由支持我们采用这种办法:
* 任何好到需要向个别开发者提出的问题,也将对整个项目群组有益。反之,如果你认为自己的问题对整个项目群组来说太愚蠢,也不能成为骚扰个别开发者的理由。
* 向列表提问可以分散开发者的负担,个别开发者(尤其是项目领导人)也许太忙以至于没法回答你的问题。
* 大多数邮件列表都会被存档,那些被存档的内容将被搜索引擎索引。如果你向列表提问并得到解答,将来其它人可以通过网页搜索找到你的问题和答案,也就不用再次发问了。
* 如果某些问题经常被问到,开发者可以利用此信息来改进说明文件或软件本身,以使其更清楚。如果只是私下提问,就没有人能看到最常见问题的完整场景。
如果一个项目既有"使用者" 也有"开发者"(或"黑客")邮件列表或论坛,而你又不会动到那些源代码,那么就向"使用者"列表或论坛提问。不要假设自己会在开发者列表中受到欢迎,那些人多半会将你的提问视为干扰他们开发的噪音。
然而,如果你**确信**你的问题很特别,而且在"使用者" 列表或论坛中几天都没有回复,可以试试前往"开发者"列表或论坛发问。建议你在张贴前最好先暗地里观察几天以了解那里的行事方式(事实上这是参与任何私有或半私有列表的好主意)
如果你找不到一个项目的邮件列表,而只能查到项目维护者的电子邮件地址,尽管向他发信。即使是在这种情况下,也别假设(项目)邮件列表不存在。在你的电子邮件中,请陈述你已经试过但没有找到合适的邮件列表,也提及你不反对将自己的邮件转发给他人(许多人认为,即使没什么秘密,私人电子邮件也不应该被公开。通过允许将你的电子邮件转发他人,你给了相应人员处置你邮件的选择)。
### 使用有意义且描述明确的标题
在邮件列表、新闻群组或论坛中,大约 50 字以内的标题是抓住资深专家注意力的好机会。别用喋喋不休的`帮帮忙``跪求``急`(更别说`救命啊!!!!`这样让人反感的话,用这种标题会被条件反射式地忽略)来浪费这个机会。不要妄想用你的痛苦程度来打动我们,而应该是在这点空间中使用极简单扼要的描述方式来提出问题。
一个好标题范例是`目标 —— 差异`式的描述,许多技术支持组织就是这样做的。在`目标`部分指出是哪一个或哪一组东西有问题,在`差异`部分则描述与期望的行为不一致的地方。
> 蠢问题:救命啊!我的笔记本电脑不能正常显示了!
> 聪明问题:X.org 6.8.1 的鼠标光标会变形,某牌显卡 MV1005 芯片组。
> 更聪明问题:X.org 6.8.1 的鼠标光标,在某牌显卡 MV1005 芯片组环境下 - 会变形。
编写`目标 —— 差异` 式描述的过程有助于你组织对问题的细致思考。是什么被影响了? 仅仅是鼠标光标或者还有其它图形?只在 X.org 的 X 版中出现?或只是出现在 6.8.1 版中? 是针对某牌显卡芯片组?或者只是其中的 MV1005 型号? 一个黑客只需瞄一眼就能够立即明白你的环境**和**你遇到的问题。
总而言之,请想像一下你正在一个只显示标题的存档讨论串(Thread)索引中查寻。让你的标题更好地反映问题,可使下一个搜索类似问题的人能够关注这个讨论串,而不用再次提问相同的问题。
如果你想在回复中提出问题,记得要修改内容标题,以表明你是在问一个问题, 一个看起来像 `Re: 测试` 或者 `Re: 新 bug` 的标题很难引起足够重视。另外,在不影响连贯性之下,适当引用并删减前文的内容,能给新来的读者留下线索。
对于讨论串,不要直接点击回复来开始一个全新的讨论串,这将限制你的观众。因为有些邮件阅读程序,比如 mutt ,允许使用者按讨论串排序并通过折叠讨论串来隐藏消息,这样做的人永远看不到你发的消息。
仅仅改变标题还不够。mutt 和其它一些邮件阅读程序还会检查邮件标题以外的其它信息,以便为其指定讨论串。所以宁可发一个全新的邮件。
在网页论坛上,好的提问方式稍有不同,因为讨论串与特定的信息紧密结合,并且通常在讨论串外就看不到里面的内容,故通过回复提问,而非改变标题是可接受的。不是所有论坛都允许在回复中出现分离的标题,而且这样做了基本上没有人会去看。不过,通过回复提问,这本身就是暧昧的做法,因为它们只会被正在查看该标题的人读到。所以,除非你**只想**在该讨论串当前活跃的人群中提问,不然还是另起炉灶比较好。
### 使问题容易回复
`请将你的回复发送到……`来结束你的问题多半会使你得不到回答。如果你觉得花几秒钟在邮件客户端设置一下回复地址都麻烦,我们也觉得花几秒钟思考你的问题更麻烦。如果你的邮件程序不支持这样做,[换个好点的](http://linuxmafia.com/faq/Mail/muas.html);如果是操作系统不支持这种邮件程序,也换个好点的。
在论坛,要求通过电子邮件回复是非常无礼的,除非你认为回复的信息可能比较敏感(有人会为了某些未知的原因,只让你而不是整个论坛知道答案)。如果你只是想在有人回复讨论串时得到电子邮件提醒,可以要求网页论坛发送给你。几乎所有论坛都支持诸如`追踪此讨论串``有回复时发送邮件提醒`等功能。
### 用清晰、正确、精准且语法正确的语句
我们从经验中发现,粗心的提问者通常也会粗心的写程序与思考(我敢打包票)。回答粗心大意者的问题很不值得,我们宁愿把时间耗在别处。
正确的拼写、标点符号和大小写是很重要的。一般来说,如果你觉得这样做很麻烦,不想在乎这些,那我们也觉得麻烦,不想在乎你的提问。花点额外的精力斟酌一下字句,用不着太僵硬与正式 —— 事实上,黑客文化很看重能准确地使用非正式、俚语和幽默的语句。但它**必须很**准确,而且有迹象表明你是在思考和关注问题。
正确地拼写、使用标点和大小写,不要将`its`混淆为`it's``loose`搞成`lose`或者将`discrete`弄成`discreet`。不要**全部用大写**,这会被视为无礼的大声嚷嚷(全部小写也好不到哪去,因为不易阅读。[Alan Cox](http://en.wikipedia.org/wiki/Alan_Cox) 也许可以这样做,但你不行)。
更白话的说,如果你写得像是个半文盲[译注:[小白](http://zh.wikipedia.org/wiki/小白)],那多半得不到理睬。也不要使用即时通信中的简写或[火星文](http://zh.wikipedia.org/wiki/火星文),如将`的`简化为`d`会使你看起来像一个为了少打几个键而省字的小白。更糟的是,如果像个小孩似地鬼画符那绝对是在找死,可以肯定没人会理你(或者最多是给你一大堆指责与挖苦)。
如果在使用非母语的论坛提问,你可以犯点拼写和语法上的小错,但决不能在思考上马虎(没错,我们通常能弄清两者的分别)。同时,除非你知道回复者使用的语言,否则请使用英语书写。繁忙的黑客一般会直接删除用他们看不懂语言写的消息。在网络上英语是通用语言,用英语书写可以将你的问题在尚未被阅读就被直接删除的可能性降到最低。
如果英文是你的外语(Second language),提示潜在回复者你有潜在的语言困难是很好的:
[译注:以下附上原文以供使用]
> English is not my native language; please excuse typing errors.
* 英文不是我的母语,请原谅我的错字或语法。
> If you speak $LANGUAGE, please email/PM me;
> I may need assistance translating my question.
* 如果你说**某语言**,请寄信/私讯给我;我需要有人协助我翻译我的问题。
> I am familiar with the technical terms,
> but some slang expressions and idioms are difficult for me.
* 我对技术名词很熟悉,但对于俗语或是特别用法比较不甚了解。
> I've posted my question in $LANGUAGE and English.
> I'll be glad to translate responses, if you only use one or the other.
* 我把我的问题用**某语言**和英文写出来,如果你只用一种语言回答,我会乐意将其翻译成另一种。
### 使用易于读取且标准的文件格式发送问题
如果你人为地将问题搞得难以阅读,它多半会被忽略,人们更愿读易懂的问题,所以:
* 使用纯文字而不是 HTML ([关闭 HTML](http://archive.birdhouse.org/etc/evilmail.html) 并不难)。
* 使用 MIME 附件通常是可以的,前提是真正有内容(譬如附带的源代码或 patch),而不仅仅是邮件程序生成的模板(譬如只是信件内容的拷贝)。
* 不要发送一段文字只是一行句子但自动换行后会变成多行的邮件(这使得回复部分内容非常困难)。设想你的读者是在 80 个字符宽的终端机上阅读邮件,最好设置你的换行分割点小于 80 字。
* 但是,对一些特殊的文件**不要**设置固定宽度(譬如日志档案拷贝或会话记录)。数据应该原样包含,让回复者有信心他们看到的是和你看到的一样的东西。
* 在英语论坛中,不要使用`Quoted-Printable` MIME 编码发送消息。这种编码对于张贴非 ASCII 语言可能是必须的,但很多邮件程序并不支持这种编码。当它们处理换行时,那些文本中四处散布的`=20`符号既难看也分散注意力,甚至有可能破坏内容的语意。
* 绝对,**永远**不要指望黑客们阅读使用封闭格式编写的文档,像微软公司的 Word 或 Excel 文件等。大多数黑客对此的反应就像有人将还在冒热气的猪粪倒在你家门口时你的反应一样。即便他们能够处理,他们也很厌恶这么做。
* 如果你从使用 Windows 的电脑发送电子邮件,关闭微软愚蠢的`智能引号`功能 (从[选项] > [校订] > [自动校正选项],勾选掉`智能引号`单选框),以免在你的邮件中到处散布垃圾字符。
* 在论坛,勿滥用`表情符号``HTML`功能(当它们提供时)。一两个表情符号通常没有问题,但花哨的彩色文本倾向于使人认为你是个无能之辈。过滥地使用表情符号、色彩和字体会使你看来像个傻笑的小姑娘。这通常不是个好主意,除非你只是对性而不是对答案感兴趣。
如果你使用图形用户界面的邮件程序(如微软公司的 Outlook 或者其它类似的),注意它们的默认设置不一定满足这些要求。大多数这类程序有基于选单的`查看源代码`命令,用它来检查发送文件夹中的邮件,以确保发送的是纯文本文件同时没有一些奇怪的字符。
### 精确地描述问题并言之有物
* 仔细、清楚地描述你的问题或 Bug 的症状。
* 描述问题发生的环境(机器配置、操作系统、应用程序、以及相关的信息),提供经销商的发行版和版本号(如:`Fedora Core 4``Slackware 9.1`等)。
* 描述在提问前你是怎样去研究和理解这个问题的。
* 描述在提问前为确定问题而采取的诊断步骤。
* 描述最近做过什么可能相关的硬件或软件变更。
* 尽可能的提供一个可以`重现这个问题的可控环境`的方法。
尽量去揣测一个黑客会怎样反问你,在你提问之前预先将黑客们可能遇到的问题回答一遍。
以上几点中,当你报告的是你认为可能在代码中的问题时,给黑客一个可以重现你的问题的环境尤其重要。当你这么做时,你得到有效的回答的机会和速度都会大大的提升。
[Simon Tatham](http://www.chiark.greenend.org.uk/~sgtatham/) 写过一篇名为《[如何有效的报告 Bug](http://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html)》的出色文章。强力推荐你也读一读。
### 话不在多而在精
你需要提供精确有内容的信息。这并不是要求你简单的把成堆的出错代码或者资料完全转录到你的提问中。如果你有庞大而复杂的测试样例能重现程序挂掉的情境,尽量将它剪裁得越小越好。
这样做的用处至少有三点。
第一,表现出你为简化问题付出了努力,这可以使你得到回答的机会增加;
第二,简化问题使你更有可能得到**有用**的答案;
第三,在精炼你的 bug 报告的过程中,你很可能就自己找到了解决方法或权宜之计。
### 别动辄声称找到 Bug
当你在使用软件中遇到问题,除非你非常、**非常**的有根据,不要动辄声称找到了 Bug。提示:除非你能提供解决问题的源代码补丁,或者提供回归测试来表明前一版本中行为不正确,否则你都多半不够完全确信。这同样适用在网页和文件,如果你(声称)发现了文件的`Bug`,你应该能提供相应位置的修正或替代文件。
请记得,还有许多其它使用者没遇到你发现的问题,否则你在阅读文件或搜索网页时就应该发现了(你在抱怨前[已经做了这些,是吧](#在提问之前)?)。这也意味着很有可能是你弄错了而不是软件本身有问题。
编写软件的人总是非常辛苦地使它尽可能完美。如果你声称找到了 Bug,也就是在质疑他们的能力,即使你是对的,也有可能会冒犯到其中某部分人。当你在标题中嚷嚷着有`Bug`时,这尤其严重。
提问时,即使你私下非常确信已经发现一个真正的 Bug,最好写得像是**你**做错了什么。如果真的有 Bug,你会在回复中看到这点。这样做的话,如果真有 Bug,维护者就会向你道歉,这总比你惹恼别人然后欠别人一个道歉要好一点。
### 低声下气不能代替你的功课
有些人明白他们不该粗鲁或傲慢的提问并要求得到答复,但他们选择另一个极端 —— 低声下气:`我知道我只是个可悲的新手,一个撸瑟,但...`。这既使人困扰,也没有用,尤其是伴随着与实际问题含糊不清的描述时更令人反感。
别用原始灵长类动物的把戏来浪费你我的时间。取而代之的是,尽可能清楚地描述背景条件和你的问题情况。这比低声下气更好地定位了你的位置。
有时网页论坛会设有专为新手提问的版面,如果你真的认为遇到了初学者的问题,到那去就是了,但一样别那么低声下气。
### 描述问题症状而非你的猜测
告诉黑客们你认为问题是怎样造成的并没什么帮助。(如果你的推断如此有效,还用向别人求助吗?),因此要确信你原原本本告诉了他们问题的症状,而不是你的解释和理论;让黑客们来推测和诊断。如果你认为陈述自己的猜测很重要,清楚地说明这只是你的猜测,并描述为什么它们不起作用。
**蠢问题**
> 我在编译内核时接连遇到 SIG11 错误,
> 我怀疑某条飞线搭在主板的走线上了,这种情况应该怎样检查最好?
**聪明问题**
> 我的组装电脑是 FIC-PA2007 主机板搭载 AMD K6/233 CPU(威盛 Apollo VP2 芯片组),
> 256MB Corsair PC133 SDRAM 内存,在编译内核时,从开机 20 分钟以后就频频产生 SIG11 错误,
> 但是在头 20 分钟内从没发生过相同的问题。重新启动也没有用,但是关机一晚上就又能工作 20 分钟。
> 所有内存都换过了,没有效果。相关部分的标准编译记录如下…。
由于以上这点似乎让许多人觉得难以配合,这里有句话可以提醒你:`所有的诊断专家都来自密苏里州。` 美国国务院的官方座右铭则是:`让我看看`(出自国会议员 Willard D. Vandiver 在 1899 年时的讲话:`我来自一个出产玉米,棉花,牛蒡和民主党人的国家,滔滔雄辩既不能说服我,也不会让我满意。我来自密苏里州,你必须让我看看。`) 针对诊断者而言,这并不是一种怀疑,而只是一种真实而有用的需求,以便让他们看到的是与你看到的原始证据尽可能一致的东西,而不是你的猜测与归纳的结论。所以,大方的展示给我们看吧!
### 按发生时间先后列出问题症状
问题发生前的一系列操作,往往就是对找出问题最有帮助的线索。因此,你的说明里应该包含你的操作步骤,以及机器和软件的反应,直到问题发生。在命令行处理的情况下,提供一段操作记录(例如运行脚本工具所生成的),并引用相关的若干行(如 20 行)记录会非常有帮助。
如果挂掉的程序有诊断选项(如 -v 的详述开关),试着选择这些能在记录中增加调试信息的选项。记住,`多`不等于`好`。试着选取适当的调试级别以便提供有用的信息而不是让读者淹没在垃圾中。
如果你的说明很长(如超过四个段落),在开头简述问题,接下来再按时间顺序详述会有所帮助。这样黑客们在读你的记录时就知道该注意哪些内容了。
### 描述目标而不是过程
如果你想弄清楚如何做某事(而不是报告一个 Bug),在开头就描述你的目标,然后才陈述重现你所卡住的特定步骤。
经常寻求技术帮助的人在心中有个更高层次的目标,而他们在自以为能达到目标的特定道路上被卡住了,然后跑来问该怎么走,但没有意识到这条路本身就有问题。结果要费很大的劲才能搞定。
**蠢问题**
> 我怎样才能从某绘图程序的颜色选择器中取得十六进制的的 RGB 值?
**聪明问题**
> 我正试着用替换一幅图片的色码(color table)成自己选定的色码,我现在知道的唯一方法是编辑每个色码区块(table slot),
> 但却无法从某绘图程序的颜色选择器取得十六进制的的 RGB 值。
第二种提问法比较聪明,你可能得到像是```建议采用另一个更合适的工具```的回复。
### 别要求使用私人电邮回复
黑客们认为问题的解决过程应该公开、透明,此过程中如果更有经验的人注意到不完整或者不当之处,最初的回复才能够、也应该被纠正。同时,作为提供帮助者可以得到一些奖励,奖励就是他的能力和学识被其他同行看到。
当你要求私下回复时,这个过程和奖励都被中止。别这样做,让**回复者**来决定是否私下回答 —— 如果他真这么做了,通常是因为他认为问题编写太差或者太肤浅,以至于对其它人没有兴趣。
这条规则存在一条有限的例外,如果你确信提问可能会引来大量雷同的回复时,那么这个神奇的提问句会是`向我发电邮,我将为论坛归纳这些回复`。试着将邮件列表或新闻群组从洪水般的雷同回复中解救出来是非常有礼貌的 —— 但你必须信守诺言。
### 清楚明确的表达你的问题以及需求
漫无边际的提问是近乎无休无止的时间黑洞。最有可能给你有用答案的人通常也正是最忙的人(他们忙是因为要亲自完成大部分工作)。这样的人对无节制的时间黑洞相当厌恶,所以他们也倾向于厌恶那些漫无边际的提问。
如果你明确表述需要回答者做什么(如提供指点、发送一段代码、检查你的补丁、或是其他等等),就最有可能得到有用的答案。因为这会定出一个时间和精力的上限,便于回答者能集中精力来帮你。这么做很棒。
要理解专家们所处的世界,请把专业技能想像为充裕的资源,而回复的时间则是稀缺的资源。你要求他们奉献的时间越少,你越有可能从真正专业而且很忙的专家那里得到解答。
所以,界定一下你的问题,使专家花在辨识你的问题和回答所需要付出的时间减到最少,这技巧对你有用答案相当有帮助 —— 但这技巧通常和简化问题有所区别。因此,问`我想更好的理解 X,可否指点一下哪有好一点说明?`通常比问`你能解释一下 X 吗?`更好。如果你的代码不能运作,通常请别人看看哪里有问题,比要求别人替你改正要明智得多。
### 询问有关代码的问题时
别要求他人帮你调试有问题的代码,不提示一下应该从何入手。张贴几百行的代码,然后说一声:`它不能工作`会让你完全被忽略。只贴几十行代码,然后说一句:`在第七行以后,我期待它显示 <x>,但实际出现的是 <y>`比较有可能让你得到回应。
最有效描述程序问题的方法是提供最精简的 Bug 展示测试用例(bug-demonstrating test case)。什么是最精简的测试用例?那是问题的缩影;一小个程序片段能**刚好**展示出程序的异常行为,而不包含其他令人分散注意力的内容。怎么制作最精简的测试用例?如果你知道哪一行或哪一段代码会造成异常的行为,复制下来并加入足够重现这个状况的代码(例如,足以让这段代码能被编译/直译/被应用程序处理)。如果你无法将问题缩减到一个特定区块,就复制一份代码并移除不影响产生问题行为的部分。总之,测试用例越小越好(查看[话不在多而在精](#话不在多而在精)一节)。
一般而言,要得到一段相当精简的测试用例并不太容易,但永远先尝试这样做的是种好习惯。这种方式可以帮助你了解如何自行解决这个问题 —— 而且即使你的尝试不成功,黑客们也会看到你在尝试取得答案的过程中付出了努力,这可以让他们更愿意与你合作。
如果你只是想让别人帮忙审查(Review)一下代码,在信的开头就要说出来,并且一定要提到你认为哪一部分特别需要关注以及为什么。
### 别把自己家庭作业的问题贴上来
黑客们很擅长分辨哪些问题是家庭作业式的问题;因为我们中的大多数都曾自己解决这类问题。同样,这些问题得由**你**来搞定,你会从中学到东西。你可以要求给点提示,但别要求得到完整的解决方案。
如果你怀疑自己碰到了一个家庭作业式的问题,但仍然无法解决,试试在使用者群组,论坛或(最后一招)在项目的**使用者**邮件列表或论坛中提问。尽管黑客们**会**看出来,但一些有经验的使用者也许仍会给你一些提示。
### 去掉无意义的提问句
避免用无意义的话结束提问,例如`有人能帮我吗?`或者`这有答案吗?`
首先:如果你对问题的描述不是很好,这样问更是画蛇添足。
其次:由于这样问是画蛇添足,黑客们会很厌烦你 —— 而且通常会用逻辑上正确,但毫无意义的回答来表示他们的蔑视, 例如:`没错,有人能帮你`或者`不,没答案`
一般来说,避免用 `是或否``对或错``有或没有`类型的问句,除非你想得到[是或否类型的回答](http://homepage.ntlworld.com./jonathan.deboynepollard/FGA/questions-with-yes-or-no-answers.html)
### 即使你很急也不要在标题写`紧急`
这是你的问题,不是我们的。宣称`紧急`极有可能事与愿违:大多数黑客会直接删除无礼和自私地企图即时引起关注的问题。更严重的是,`紧急`这个字(或是其他企图引起关注的标题)通常会被垃圾信过滤器过滤掉 —— 你希望能看到你问题的人可能永远也看不到。
有半个例外的情况是,如果你是在一些很高调,会使黑客们兴奋的地方,也许值得这样去做。在这种情况下,如果你有时间压力,也很有礼貌地提到这点,人们也许会有兴趣回答快一点。
当然,这风险很大,因为黑客们兴奋的点多半与你的不同。譬如从 NASA 国际空间站(International Space Station)发这样的标题没有问题,但用自我感觉良好的慈善行为或政治原因发肯定不行。事实上,张贴诸如`紧急:帮我救救这个毛绒绒的小海豹!`肯定让你被黑客忽略或惹恼他们,即使他们认为毛绒绒的小海豹很重要。
如果你觉得这点很不可思议,最好再把这份指南剩下的内容多读几遍,直到你弄懂了再发文。
### 礼多人不怪,而且有时还很有帮助
彬彬有礼,多用`请``谢谢您的关注`,或`谢谢你的关照`。让大家都知道你对他们花时间免费提供帮助心存感激。
坦白说,这一点并没有比清晰、正确、精准并合法语法和避免使用专用格式重要(也不能取而代之)。黑客们一般宁可读有点唐突但技术上鲜明的 Bug 报告,而不是那种有礼但含糊的报告。(如果这点让你不解,记住我们是按问题能教给我们什么来评价问题的价值的)
然而,如果你有一串的问题待解决,客气一点肯定会增加你得到有用回应的机会。
(我们注意到,自从本指南发布后,从资深黑客那里得到的唯一严重缺陷反馈,就是对预先道谢这一条。一些黑客觉得`先谢了`意味着事后就不用再感谢任何人的暗示。我们的建议是要么先说`先谢了`**然后**事后再对回复者表示感谢,或者换种方式表达感激,譬如用`谢谢你的关注``谢谢你的关照`。)
### 问题解决后,加个简短的补充说明
问题解决后,向所有帮助过你的人发个说明,让他们知道问题是怎样解决的,并再一次向他们表示感谢。如果问题在新闻组或者邮件列表中引起了广泛关注,应该在那里贴一个说明比较恰当。
最理想的方式是向最初提问的话题回复此消息,并在标题中包含`已修正``已解决`或其它同等含义的明显标记。在人来人往的邮件列表里,一个看见讨论串`问题 X``问题 X - 已解决`的潜在回复者就明白不用再浪费时间了(除非他个人觉得`问题 X`的有趣),因此可以利用此时间去解决其它问题。
补充说明不必很长或是很深入;简单的一句`你好,原来是网线出了问题!谢谢大家 – Bill`比什么也不说要来的好。事实上,除非结论真的很有技术含量,否则简短可爱的小结比长篇大论更好。说明问题是怎样解决的,但大可不必将解决问题的过程复述一遍。
对于有深度的问题,张贴调试记录的摘要是有帮助的。描述问题的最终状态,说明是什么解决了问题,在此**之后**才指明可以避免的盲点。避免盲点的部分应放在正确的解决方案和其它总结材料之后,而不要将此信息搞成侦探推理小说。列出那些帮助过你的名字,会让你交到更多朋友。
除了有礼貌和有内涵以外,这种类型的补充也有助于他人在邮件列表/新闻群组/论坛中搜索到真正解决你问题的方案,让他们也从中受益。
至少,这种补充有助于让每位参与协助的人因问题的解决而从中得到满足感。如果你自己不是技术专家或者黑客,那就相信我们,这种感觉对于那些你向他们求助的大师或者专家而言,是非常重要的。问题悬而未决会让人灰心;黑客们渴望看到问题被解决。好人有好报,满足他们的渴望,你会在下次提问时尝到甜头。
思考一下怎样才能避免他人将来也遇到类似的问题,自问写一份文件或加个常见问题(FAQ)会不会有帮助。如果是的话就将它们发给维护者。
在黑客中,这种良好的后继行动实际上比传统的礼节更为重要,也是你如何透过善待他人而赢得声誉的方式,这是非常有价值的资产。
## 如何解读答案
<a id="RTFM"></a>
### RTFM 和 STFW:如何知道你已完全搞砸了
有一个古老而神圣的传统:如果你收到`RTFM (Read The Fucking Manual)`的回应,回答者认为你**应该去读他妈的手册**。当然,基本上他是对的,你应该去读一读。
RTFM 有一个年轻的亲戚。如果你收到`STFW(Search The Fucking Web)`的回应,回答者认为你**应该到他妈的网上搜索**。那人多半也是对的,去搜索一下吧。(更温和一点的说法是 **[Google 是你的朋友](http://lmgtfy.com/)**!)
在论坛,你也可能被要求去爬爬论坛的旧文。事实上,有人甚至可能热心地为你提供以前解决此问题的讨论串。但不要依赖这种关照,提问前应该先搜索一下旧文。
通常,用这两句之一回答你的人会给你一份包含你需要内容的手册或者一个网址,而且他们打这些字的时候也正在读着。这些答复意味着回答者认为
* **你需要的信息非常容易获得**
* **你自己去搜索这些信息比灌给你,能让你学到更多**
你不应该因此不爽;**依照黑客的标准,他已经表示了对你一定程度的关注,而没有对你的要求视而不见**。你应该对他祖母般的慈祥表示感谢。
### 如果还是搞不懂
如果你看不懂回应,别立刻要求对方解释。像你以前试着自己解决问题时那样(利用手册,FAQ,网络,身边的高手),先试着去搞懂他的回应。如果你真的需要对方解释,记得表现出你已经从中学到了点什么。
比方说,如果我回答你:`看来似乎是 zentry 卡住了;你应该先清除它。`,然后,这是一个**很糟的**后续问题回应:`zentry 是什么?` **好**的问法应该是这样:`哦~~~我看过说明了但是只有 -z 和 -p 两个参数中提到了 zentries,而且还都没有清楚的解释如何清除它。你是指这两个中的哪一个吗?还是我看漏了什么?`
### 处理无礼的回应
很多黑客圈子中看似无礼的行为并不是存心冒犯。相反,它是直接了当,一针见血式的交流风格,这种风格更注重解决问题,而不是使人感觉舒服而却模模糊糊。
如果你觉得被冒犯了,试着平静地反应。如果有人真的做了出格的事,邮件列表、新闻群组或论坛中的前辈多半会招呼他。如果这**没有**发生而你却发火了,那么你发火对象的言语可能在黑客社区中看起来是正常的,而**你**将被视为有错的一方,这将伤害到你获取信息或帮助的机会。
另一方面,你偶尔真的会碰到无礼和无聊的言行。与上述相反,对真正的冒犯者狠狠地打击,用犀利的语言将其驳得体无完肤都是可以接受的。然而,在行事之前一定要非常非常的有根据。纠正无礼的言论与开始一场毫无意义的口水战仅一线之隔,黑客们自己莽撞地越线的情况并不鲜见。如果你是新手或外人,避开这种莽撞的机会并不高。如果你想得到的是信息而不是消磨时光,这时最好不要把手放在键盘上以免冒险。
(有些人断言很多黑客都有轻度的自闭症或亚斯伯格综合症,缺少用于润滑人类社会**正常**交往所需的神经。这既可能是真也可能是假的。如果你自己不是黑客,兴许你认为我们脑袋有问题还能帮助你应付我们的古怪行为。只管这么干好了,我们不在乎。我们**喜欢**我们现在这个样子,并且通常对病患标记都有站得住脚的怀疑)。
Jeff Bigler 的观察总结和这个相关也值得一读 (**[tact filters](http://www.mit.edu/~jcb/tact.html)**)。
在下一节,我们会谈到另一个问题,当**你**行为不当时所会受到的`冒犯`
## 如何避免扮演失败者
在黑客社区的论坛中有那么几次你可能会搞砸 —— 以本指南所描述到的或类似的方式。而你会在公开场合中被告知你是如何搞砸的,也许攻击的言语中还会带点夹七夹八的颜色。
这种事发生以后,你能做的最糟糕的事莫过于哀嚎你的遭遇、宣称被口头攻击、要求道歉、高声尖叫、憋闷气、威胁诉诸法律、向其雇主报怨、忘了关马桶盖等等。相反地,你该这么做:
熬过去,这很正常。事实上,它是有益健康且合理的。
社区的标准不会自行维持,它们是通过参与者积极而**公开地**执行来维持的。不要哭嚎所有的批评都应该通过私下的邮件传送,它不是这样运作的。当有人评论你的一个说法有误或者提出不同看法时,坚持声称受到个人攻击也毫无益处,这些都是失败者的态度。
也有其它的黑客论坛,受过高礼节要求的误导,禁止参与者张贴任何对别人帖子挑毛病的消息,并声称`如果你不想帮助用户就闭嘴。` 结果造成有想法的参与者纷纷离开,这么做只会使它们沦为毫无意义的唠叨与无用的技术论坛。
夸张的讲法是:你要的是“友善”(以上述方式)还是有用?两个里面挑一个。
记着:当黑客说你搞砸了,并且(无论多么刺耳)告诉你别再这样做时,他正在为关心**你****他的社区**而行动。对他而言,不理你并将你从他的生活中滤掉更简单。如果你无法做到感谢,至少要表现得有点尊严,别大声哀嚎,也别因为自己是个有戏剧性超级敏感的灵魂和自以为有资格的新来者,就指望别人像对待脆弱的洋娃娃那样对你。
有时候,即使你没有搞砸(或者只是在他的想像中你搞砸了),有些人也会无缘无故地攻击你本人。在这种情况下,抱怨倒是**真的**会把问题搞砸。
这些来找麻烦的人要么是毫无办法但自以为是专家的不中用家伙,要么就是测试你是否真会搞砸的心理专家。其它读者要么不理睬,要么用自己的方式对付他们。这些来找麻烦的人在给他们自己找麻烦,这点你不用操心。
也别让自己卷入口水战,最好不要理睬大多数的口水战 —— 当然,这是在你检验它们只是口水战,并且未指出你有搞砸的地方,同时也没有巧妙地将问题真正的答案藏于其后(这也是有可能的)。
## 不该问的问题
以下是几个经典蠢问题,以及黑客没回答时心中所想的:
问题:[我能在哪找到 X 程序或 X 资源?](#q1)
问题:[我怎样用 X 做 Y?](#q2)
问题:[如何设定我的 shell 提示?](#q3)
问题:[我可以用 Bass-o-matic 文件转换工具将 AcmeCorp 档案转换为 TeX 格式吗?](#q4)
问题:[我的程序/设定/SQL 语句没有用](#q5)
问题:[我的 Windows 电脑有问题,你能帮我吗?](#q6)
问题:[我的程序不会动了,我认为系统工具 X 有问题](#q7)
问题:[我在安装 Linux(或者 X )时有问题,你能帮我吗?](#q8)
问题:[我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢?](#q9)
---
<a id="q1"></a>
> 问题:我能在哪找到 X 程序或 X 资源?
回答:就在我找到它的地方啊,白痴 —— 搜索引擎的那一头。天哪!难道还有人不会用 [Google](http://www.google.com) 吗?
<a id="q2"></a>
> 问题:我怎样用 X 做 Y?
回答:如果你想解决的是 Y ,提问时别给出可能并不恰当的方法。这种问题说明提问者不但对 X 完全无知,也对 Y 要解决的问题糊涂,还被特定形势禁锢了思维。最好忽略这种人,等他们把问题搞清楚了再说。
<a id="q3"></a>
>问题:如何设定我的 shell 提示??
回答:如果你有足够的智慧提这个问题,你也该有足够的智慧去 [RTFM](#RTFM),然后自己去找出来。
<a id="q4"></a>
> 问题:我可以用 Bass-o-matic 文件转换工具将 AcmeCorp 档案转换为 TeX 格式吗?
回答:试试看就知道了。如果你试过,你既知道了答案,就不用浪费我的时间了。
<a id="q5"></a>
> 问题:我的{程序/设定/SQL 语句}不工作
回答:这不算是问题吧,我对要我问你二十个问题才找得出你真正问题的问题没兴趣 —— 我有更有意思的事要做呢。在看到这类问题的时候,我的反应通常不外如下三种
* 你还有什么要补充的吗?
* 真糟糕,希望你能搞定。
* 这关我屁事?
<a id="q6"></a>
> 问题:我的 Windows 电脑有问题,你能帮我吗?
回答:能啊,扔掉微软的垃圾,换个像 Linux 或 BSD 的开源操作系统吧。
注意:如果程序有官方版 Windows 或者与 Windows 有互动(如 Samba),你**可以**问与 Windows 相关的问题, 只是别对问题是由 Windows 操作系统而不是程序本身造成的回复感到惊讶, 因为 Windows 一般来说实在太烂,这种说法通常都是对的。
<a id="q7"></a>
> 问题:我的程序不会动了,我认为系统工具 X 有问题
回答:你完全有可能是第一个注意到被成千上万用户反复使用的系统调用与函数库档案有明显缺陷的人,更有可能的是你完全没有根据。不同凡响的说法需要不同凡响的证据,当你这样声称时,你必须有清楚而详尽的缺陷说明文件作后盾。
<a id="q8"></a>
> 问题:我在安装 Linux(或者 X )时有问题,你能帮我吗?
回答:不能,我只有亲自在你的电脑上动手才能找到毛病。还是去找你当地的 Linux 使用群组者寻求实际的指导吧(你能在[这儿](http://www.linux.org/groups/index.html)找到使用者群组的清单)。
注意:如果安装问题与某 Linux 的发行版有关,在它的邮件列表、论坛或本地使用者群组中提问也许是恰当的。此时,应描述问题的准确细节。在此之前,先用 `Linux`**所有**被怀疑的硬件作关键词仔细搜索。
<a id="q9"></a>
> 问题:我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢?
回答:想要这样做,说明了你是个卑鄙小人;想找个黑客帮你,说明你是个白痴!
## 好问题与蠢问题
最后,我将透过举一些例子,来说明怎样聪明的提问;同一个问题的两种问法被放在一起,一种是愚蠢的,另一种才是明智的。
**蠢问题**
> 我可以在哪儿找到关于 Foonly Flurbamatic 的资料?
这种问法无非想得到 [STFW](#RTFM) 这样的回答。
**聪明问题**
> 我用 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` 并附上一个链接一点用都没有。
**帮助你的社区从问题中学习**。当回复一个好问题时,问问自己`如何修改相关文件或常见问题文件以免再次解答同样的问题?`,接着再向文件维护者发一份补丁。
如果你是在研究一番后才做出的回答,**展现你的技巧而不是直接端出结果**。毕竟`授人以鱼不如授人以渔`
## 相关资源
如果你需要个人电脑、Unix 系统和网络如何运作的基础知识,参阅 [Unix 系统和网络基本原理](http://en.tldp.org/HOWTO/Unix-and-Internet-Fundamentals-HOWTO/)
当你发布软件或补丁时,试着按[软件发布实践](http://en.tldp.org/HOWTO/Software-Release-Practice-HOWTO/index.html)操作。
## 鸣谢
Evelyn Mitchel 贡献了一些愚蠢问题例子并启发了编写`如何更好地回答问题`这一节, Mikhail Ramendik 贡献了一些特别有价值的建议和改进。
# 提問的智慧
# 提問的智慧
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/pulls)
**How To Ask Questions The Smart Way**
Copyright © 2001, 2006, 2014 Eric S. Raymond, Rick Moen
本指南英文版版權為 Eric S. Raymond, Rick Moen 所有。
原文網址 (Translated from):[http://www.catb.org/~esr/faqs/smart-questions.html](http://www.catb.org/~esr/faqs/smart-questions.html)
Copyleft 2001 by D.H.Grand(nOBODY/Ginux), 2010 by Gasolin, 2015-present by [Ryan Wu](https://github.com/ryanhanwu)
本中文指南是基於原文 3.10 版以及 2010 年由 [Gasolin](https://github.com/gasolin) 所翻譯版本的最新翻譯;
協助指出翻譯問題,__請[發Issue](https://github.com/ryanhanwu/smartquestions/issues/new),或直接[發Pull Request](https://github.com/ryanhanwu/smartquestions/compare/)給我。__
本文另有:[简体中文版](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md)
## [原文版本歷史](https://github.com/ryanhanwu/smartquestions/blob/master/history.md)
## 目錄
* [聲明](#聲明)
* [簡介](#簡介)
* [在提問之前](#在提問之前)
* [當你提問時](#當你提問時)
* [慎選提問的論壇](#慎選提問的論壇)
* [Stack Overflow](#stack-overflow)
* [網站和IRC論壇](#網站和irc論壇)
* [第二步,使用專案郵件列表](#第二步使用專案郵件列表)
* [使用有意義且描述明確的標題](#使用有意義且描述明確的標題)
* [使問題容易回覆](#使問題容易回覆)
* [用清晰、正確、精準並合法文法的語句](#用清晰正確精準並合法文法的語句)
* [使用易於讀取且標準的文件格式發送問題](#使用易於讀取且標準的文件格式發送問題)
* [精確的描述問題並言之有物](#精確的描述問題並言之有物)
* [話不在多而在精](#話不在多而在精)
* [別動輒聲稱找到Bug](#別動輒聲稱找到bug)
* [別用低聲下氣取代你真正該做的事](#別用低聲下氣取代你真正該做的事)
* [描述問題症狀而非猜測](#描述問題症狀而非猜測)
* [按發生時間先後列出問題症狀](#按發生時間先後列出問題症狀)
* [描述目標而不是過程](#描述目標而不是過程)
* [別要求使用私人電郵回覆](#別要求使用私人電郵回覆)
* [清楚明確的表達你的問題以及需求](#清楚明確的表達你的問題以及需求)
* [詢問有關程式碼的問題時](#詢問有關程式碼的問題時)
* [別把自己家庭作業的問題貼上來](#別把自己家庭作業的問題貼上來)
* [去掉無意義的提問句](#去掉無意義的提問句)
* [即使你很急也不要在標題寫```緊急```](#即使你很急也不要在標題寫緊急)
* [禮多人不怪,而且有時還很有幫助](#禮多人不怪而且有時還很有幫助)
* [問題解決後,加個簡短的補充說明](#問題解決後加個簡短的補充說明)
* [如何解讀答案](#如何解讀答案)
* [RTFM和STFW:如何知道你已完全搞砸了](#rtfm和stfw如何知道你已完全搞砸了)
* [如果還是搞不懂](#如果還是搞不懂)
* [處理無禮的回應](#處理無禮的回應)
* [如何避免扮演失敗者](#如何避免扮演失敗者)
* [不該問的問題](#不該問的問題)
* [好問題與蠢問題](#好問題與蠢問題)
* [如果得不到回答](#如果得不到回答)
* [如何更好地回答問題](#如何更好地回答問題)
* [相關資源](#相關資源)
* [鳴謝](#鳴謝)
## 聲明
許多專案在他們的使用協助/說明網頁中連結了本指南,這麼做很好,我們也鼓勵大家都這麼做。但如果你是負責管理這個專案網頁的人,請在超連結附近的顯著位置上註明:
__本指南不提供此專案的實際支援服務!__
我們已經深刻領教到少了上述聲明所帶來的痛苦。因為少了這點聲明,我們不停地被一些白痴糾纏。這些白痴認為既然我們發布了這本指南,那麼我們就有責任解決世上所有的技術問題。
如果你是因為需要某些協助而正在閱讀這本指南,並且最後離開是因為發現從本指南作者們身上得不到直接的協助,那麼你就是我們所說的那些白痴之一。別問我們問題,我們只會忽略你。我們在這本指南中是教你如何從那些真正懂得你所遇到軟體或硬體問題的人取得協助,而99%的情況下那不會是我們。除非你確定本指南的作者之一剛好是你所遇到的問題領域的專家,否則請不要打擾我們,這樣大家都會開心一點。
## 簡介
[黑客](http://www.catb.org/~esr/faqs/hacker-howto.html)的世界裡,當你拋出一個技術問題時,最終是否能得到有用的回答,往往取決於你所提問和追問的方式。本指南將教你如何正確的提問以獲得你滿意的答案。
不只是黑客,現在開放原始碼(Open Source)軟體已經相當盛行,你常常也可以由其他有經驗的使用者身上得到好答案,這是件**好事**;使用者比起黑客來,往往對那些新手常遇到的問題更寬容一些。然而,將有經驗的使用者視為黑客,並採用本指南所提的方法與他們溝通,同樣也是能從他們身上得到滿意回答的最有效方式。
首先你應該明白,黑客們喜愛有挑戰性的問題,或者能激發他們思維的好問題。如果我們並非如此,那我們也不會成為你想詢問的對象。如果你給了我們一個值得反覆咀嚼玩味的好問題,我們自會對你感激不盡。好問題是激勵,是厚禮。好問題可以提高我們的理解力,而且通常會暴露我們以前從沒意識到或者思考過的問題。對黑客而言,"好問題!"是誠摯的大力稱讚。
儘管如此,黑客們有著蔑視或傲慢面對簡單問題的壞名聲,這有時讓我們看起來對新手、無知者似乎較有敵意,但其實不是那樣的。
我們不諱言我們對那些不願思考、或者在發問前不做他們該做的事的人的蔑視。那些人是時間殺手──他們只想索取,從不付出,消耗我們可用在更有趣的問題或更值得回答的人身上的時間。我們稱這樣的人為 ```失敗者(魯蛇)``` (由於歷史原因,我們有時把它拼作 ```lusers```)。
我們意識到許多人只是想使用我們寫的軟體,他們對學習技術細節沒有興趣。對大多數人而言,電腦只是種工具,是種達到目的的手段而已。他們有自己的生活並且有更要緊的事要做。我們了解這點,也從不指望每個人都對這些讓我們著迷的技術問題感興趣。儘管如此,我們回答問題的風格是指向那些真正對此有興趣並願意主動參與解決問題的人,這一點不會變,也不該變。如果連這都變了,我們就是在降低做自己最擅長的事情上的效率。
我們(在很大程度上)是自願的,從繁忙的生活中抽出時間來解答疑惑,而且時常被提問淹沒。所以我們無情的濾掉一些話題,特別是拋棄那些看起來像失敗者的傢伙,以便更高效的利用時間來回答```贏家(溫拿)```的問題。
如果你厭惡我們的態度,高高在上,或過於傲慢,不妨也設身處地想想。我們並沒有要求你向我們屈服──事實上,我們大多數人非常樂意與你平等地交流,只要你付出小小努力來滿足基本要求,我們就會歡迎你加入我們的文化。但讓我們幫助那些不願意幫助自己的人是沒有效率的。無知沒有關係,但裝白痴就是不行。
所以,你不必在技術上很在行才能吸引我們的注意,但你必須表現出能引導你變得在行的特質──機敏、有想法、善於觀察、樂於主動參與解決問題。如果你做不到這些使你與眾不同的事情,我們建議你花點錢找家商業公司簽個技術支援服務契約,而不是要求黑客個人無償地幫助你。
如果你決定向我們求助,當然你也不希望被視為失敗者,更不願成為失敗者中的一員。能立刻得到快速並有效答案的最好方法,就是像贏家那樣提問──聰明、自信、有解決問題的思路,只是偶爾在特定的問題上需要獲得一點幫助。
(歡迎對本指南提出改進意見。你可以 email 你的建議至 [esr@thyrsus.com](esr@thyrsus.com)[respond-auto@linuxmafia.com](respond-auto@linuxmafia.com)。然而請注意,本文並非[網路禮節](http://www.ietf.org/rfc/rfc1855.txt)的通用指南,而我們通常會拒絕無助於在技術論壇得到有用答案的建議。)
## 在提問之前
在你準備要通過電子郵件、新聞群組或者聊天室提出技術問題前,請先做到以下事情:
1. 嘗試在你準備提問的論壇的舊文章中搜尋答案。
1. 嘗試上網搜尋來找到答案。
1. 嘗試閱讀手冊來找到答案。
1. 嘗試閱讀常見問題文件(FAQ)來找到答案。
1. 嘗試自己檢查或試驗來找到答案
1. 向你身邊的強者朋友打聽來找到答案。
1. 如果你是程式開發者,請嘗試閱讀原始碼來找到答案
當你提出問題的時候,請先表明你已經做了上述的努力;這將有助於樹立你並不是一個不勞而獲且浪費別人的時間的提問者。如果你能一併表達在做了上述努力的過程中所**學到**的東西會更好,因為我們更樂於回答那些表現出能從答案中學習的人的問題。
運用某些策略,比如先用 Google 搜尋你所遇到的各種錯誤訊息(既搜尋 [Google論壇](http://groups.google.com/),也搜尋網頁),這樣很可能直接就找到了能解決問題的文件或郵件列表線索。即使沒有結果,在郵件列表或新聞組尋求幫助時加上一句 ```我在 Google 中搜過下列句子但沒有找到什麼有用的東西``` 也是件好事,即使它只是表明了搜尋引擎不能提供哪些幫助。這麼做(加上搜尋過的字串)也讓遇到相似問題的其他人能被搜尋引擎引導到你的提問來。
別著急,不要指望幾秒鐘的 Google 搜尋就能解決一個複雜的問題。在向專家求助之前,再閱讀一下常見問題文件(FAQ)、放輕鬆、坐舒服一些,再花點時間思考一下這個問題。相信我們,他們能從你的提問看出你做了多少閱讀與思考,如果你是有備而來,將更有可能得到解答。不要將所有問題一股腦拋出,只因你的第一次搜尋沒有找到答案(或者找到太多答案)。
準備好你的問題,再將問題仔細的思考過一遍,因為草率的發問只能得到草率的回答,或者根本得不到任何答案。越是能表現出在尋求幫助前你為解決問題所付出的努力,你越有可能得到實質性的幫助。
小心別問錯了問題。如果你的問題基於錯誤的假設,某個普通黑客(J. Random Hacker)多半會一邊在心裏想著```蠢問題…```, 一邊用無意義的字面解釋來答覆你,希望著你會從問題的回答(而非你想得到的答案)中汲取教訓。
絕不要自以為**夠格**得到答案,你沒有;你並沒有。畢竟你沒有為這種服務支付任何報酬。你將會是自己去**掙到**一個答案,靠提出有內涵的、有趣的、有思維激勵作用的問題──一個有潛力能貢獻社群經驗的問題,而不僅僅是被動的從他人處索取知識。
另一方面,表明你願意在找答案的過程中做點什麼是一個非常好的開始。```誰能給點提示?``````我的這個例子裏缺了什麼?```以及```我應該檢查什麼地方``````請把我需要的確切的過程貼出來```更容易得到答覆。因為你表現出只要有人能指出一個正確方向,你就有完成它的能力和決心。
## 當你提問時
### 慎選提問的論壇
小心選擇你要提問的場合。如果你做了下述的事情,你很可能被忽略掉或者被看作失敗者:
* 在與主題不合的論壇上貼出你的問題
* 在探討進階技術問題的論壇張貼非常初級的問題;反之亦然
* 在太多的不同新聞群組上重複轉貼同樣的問題(cross-post)
* 向既非熟人也沒有義務解決你問題的人發送私人電郵
黑客會剔除掉那些搞錯場合的問題,以保護他們溝通的管道不被無關的東西淹沒。你不會想讓這種事發生在自己身上的。
因此,第一步是找到對的論壇。再說一次,Google 和其它搜尋引擎還是你最好的朋友,用它們來找到與你遭遇到困難的軟硬體問題最相關的網站。通常在那裡都有常見問題(FAQ)、郵件列表及相關說明文件的連結。如果你的努力(包括**閱讀** FAQ)都沒有結果,網站上也許還有回報臭蟲(Bug-reporting)的流程或連結,如果是這樣,連過去看看。
向陌生的人或論壇發送郵件最可能是風險最大的事情。舉例來說,別假設一個提供豐富內容的網頁的作者會想充當你的免費顧問。不要對你的問題是否會受到歡迎做太樂觀的估計──如果你不確定,那就向別處發送,或者根本別發。
在選擇論壇、新聞群組或郵件列表時,別太相信名字,先看看 FAQ 或者許可書以弄清楚你的問題是否切題。發文前先翻翻已有的話題,這樣可以讓你感受一下那裡的文化。事實上,事先在新聞組或郵件列表的歷史記錄中搜尋與你問題相關的關鍵詞是個極好的主意,也許這樣就找到答案了。即使沒有,也能幫助你歸納出更好的問題。
別像機關槍似的一次"掃射"所有的幫助管道,這就像大喊大叫一樣會使人不愉快。要一個一個地來。
搞清楚你的主題!最典型的錯誤之一是在某種致力於跨平台可移植的語言、套件或工具的論壇中提關於 Unix 或 Windows 作業系統程序介面的問題。如果你不明白為什麼這是大錯,最好在搞清楚這之間差異之前什麼也別問。
一般來說,在仔細挑選的公共論壇中提問,會比在私有論壇中提同樣的問題更容易得到有用的回答。有幾個理由可以支持這點,一是看潛在的回覆者有多少,二是看觀眾有多少。黑客較願意回答那些能幫助到許多人的問題。
可以理解的是,老練的黑客和一些熱門軟體的作者正在接受過多的錯發訊息。就像那根最後壓垮駱駝背的稻草一樣,你的加入也有可能使情況走向極端──已經好幾次了,一些熱門軟體的作者從自己軟體的支援中抽身出來,因為伴隨而來湧入其私人信箱的無用郵件變得無法忍受。
### Stack Overflow
搜尋,**然後** 才在 Stack Exchange 發問。
近年來,Stack Exchange community 社群已經成為回答技術及其他問題的主要管道,尤其是那些開放源碼的專案。
因為 Google 索引是即時的,在看 Stack Exchange 之前先在 Google 搜尋。有很高的機率某人已經問了一個類似的問題,而且 Stack Exchange 網站們往往會是搜尋結果中最前面幾個。如果你在 Google 上沒有找到任何答案,你再到特定相關主題的網站去找。用標籤(Tag)搜尋能讓你更縮小你的搜尋結果。
Stack Exchange 已經成長到[超過一百個網站](http://stackexchange.com/sites),以下是最常用的幾個站:
* Super User 是問一些通用的電腦問題,如果你的問題跟程式碼或是寫程式無關,只是一些網路連線之類的,請到這裡。
* Stack Overflow 是問寫程式有關的問題。
* Server Fault 是問伺服器和網管相關的問題。
### 網站和IRC論壇
在地的使用者群組(user group),或者你所用的 Linux 發行版本也許正在宣傳他們的網頁論壇或 IRC 頻道,並提供新手幫助(在一些非英語國家,新手論壇很可能還是郵件列表), 這些地方是開始提問的好首選,特別是當你覺得遇到的也許只是相對簡單或者很普通的問題時。有廣告贊助的 IRC 頻道是公開歡迎提問的地方,通常可以即時得到回應。
事實上,如果程式出的問題只發生在特定 Linux 發行版提供的版本(這很常見),最好先去該發行版的論壇或郵件列表中提問,再到程式本身的論壇或郵件列表提問。(否則)該項目的黑客可能僅僅回覆 "用**我們的**版本"。
在任何論壇發文以前,先確認一下有沒有搜尋功能。如果有,就試著搜尋一下問題的幾個關鍵詞,也許這會有幫助。如果在此之前你已做過通用的網頁搜尋(你也該這樣做),還是再搜尋一下論壇,搜尋引擎有可能沒來得及索引此論壇的全部內容。
通過論壇或 IRC 頻道來提供使用者支援服務有增長的趨勢,電子郵件則大多為專案開發者間的交流而保留。所以最好先在論壇或 IRC 中尋求與該專案相關的協助。
### 第二步,使用專案郵件列表
當某個專案提供開發者郵件列表時,要向列表而不是其中的個別成員提問,即使你確信他能最好地回答你的問題。查一查專案的文件和首頁,找到專案的郵件列表並使用它。有幾個很好的理由支持我們採用這種辦法:
* 任何好到需要向個別開發者提出的問題,也將對整個專案群組有益。反之,如果你認為自己的問題對整個專案群組來說太愚蠢,也不能成為騷擾個別開發者的理由。
* 向列表提問可以分散開發者的負擔,個別開發者(尤其是專案領導人)也許太忙以至於沒法回答你的問題。
* 大多數郵件列表都會被封存,那些被封存的內容將被搜尋引擎索引。如果你向列表提問並得到解答,將來其它人可以通過網頁搜尋找到你的問題和答案,也就不用再次發問了。
* 如果某些問題經常被問到,開發者可以利用此資訊來改進說明文件或軟體本身,以使其更清楚。如果只是私下提問,就沒有人能看到最常見問題的完整場景。
如果一個項目既有"使用者" 也有"開發者"(或"黑客")郵件列表或論壇,而你又不會動到那些原始碼,那麼就向"使用者"列表或論壇提問。不要假設自己會在開發者列表中受到歡迎,那些人多半會將你的提問視為干擾他們開發的噪音。
然而,如果你**確信**你的問題很特別,而且在"使用者" 列表或論壇中幾天都沒有回覆,可以試試前往"開發者"列表或論壇發問。建議你在張貼前最好先暗地裡觀察幾天以了解那裡的行事方式(事實上這是參與任何私有或半私有列表的好主意)
如果你找不到一個專案的郵件列表,而只能查到專案維護者的電子信箱地址,儘管向他發信。即使是在這種情況下,也別假設(專案)郵件列表不存在。在你的電子郵件中,請陳述你已經試過但沒有找到合適的郵件列表,也提及你不反對將自己的郵件轉發給他人(許多人認為,即使沒什麼秘密,私人電子郵件也不應該被公開。通過允許將你的電子郵件轉發他人,你給了相應人員處置你郵件的選擇)。
### 使用有意義且描述明確的標題
在郵件列表、新聞群組或論壇中,大約50字以內的標題是抓住資深專家注意力的好機會。別用喋喋不休的```幫幫忙``````跪求``````急```(更別說```救命啊!!!!```這樣讓人反感的話,用這種標題會被條件反射式地忽略)來浪費這個機會。不要妄想用你的痛苦程度來打動我們,而是在這點空間中使用極簡單扼要的描述方式來提出問題。
一個好標題範例是```目標 -- 差異```式的描述,許多技術支援組織就是這樣做的。在```目標```部分指出是哪一個或哪一組東西有問題,在```差異```部分則描述與期望的行為不一致的地方。
> 蠢問題:救命啊!我的筆電不能正常顯示了!
> 聰明問題:X.org 6.8.1的滑鼠游標會變形,某牌顯示卡 MV1005 晶片組。
> 更聰明問題:X.org 6.8.1的滑鼠游標,在某牌顯示卡 MV1005 晶片組環境下 - 會變形。
編寫```目標 -- 差異``` 式描述的過程有助於你組織對問題的細緻思考。是什麼被影響了? 僅僅是滑鼠游標或者還有其它圖形?只在 X.org 的 X 版中出現?或只是出現在6.8.1版中? 是針對某牌顯示卡晶片組?或者只是其中的 MV1005 型號? 一個黑客只需瞄一眼就能夠立即明白你的環境**和**你遇到的問題。
總而言之,請想像一下你正在一個只顯示標題的封存討論串(Thread)索引中查尋。讓你的標題更好地反映問題,可使下一個搜尋類似問題的人能夠關注這個討論串,而不用再次提問相同的問題。
如果你想在回覆中提出問題,記得要修改內容標題,以表明你是在問一個問題, 一個看起來像 ```Re: 測試``` 或者 ```Re: 新bug``` 的標題很難引起足夠重視。另外,在不影響連貫性之下,適當引用並刪減前文的內容,能給新來的讀者留下線索。
對於討論串,不要直接點擊回覆來開始一個全新的討論串,這將限縮你的觀眾。因為有些郵件閱讀程序,比如 mutt ,允許使用者按討論串排序並通過折疊討論串來隱藏消息,這樣做的人永遠看不到你發的消息。
僅僅改變標題還不夠。mutt 和其它一些郵件閱讀程式還會檢查郵件標題以外的其它訊息,以便為其指定討論串。所以寧可發一個全新的郵件。
在網頁論壇上,好的提問方式稍有不同,因為討論串與特定的訊息緊密結合,並且通常在討論串外就看不到裡面的內容,故通過回覆提問,而非改變標題是可接受的。不是所有論壇都允許在回覆中出現分離的標題,而且這樣做了基本上沒有人會去看。不過,通過回覆提問,這本身就是曖昧的做法,因為它們只會被正在查看該標題的人讀到。所以,除非你**只想**在該討論串當前活躍的人群中提問,不然還是另起爐灶比較好。
### 使問題容易回覆
```請將你的回覆寄到……```來結束你的問題多半會使你得不到回答。如果你覺得花幾秒鐘在電子信箱客戶端設置一下回覆地址都麻煩,我們也覺得花幾秒鐘思考你的問題更麻煩。如果你的電子信箱程式不支援這樣做,[換個好點的](http://linuxmafia.com/faq/Mail/muas.html);如果是作業系統不支援這種電子信箱程式,也換個好點的。
在論壇,要求通過電子郵件回覆是非常無禮的,除非你相信回覆的訊息可能比較敏感(而且有人會為了某些未知的原因,只讓你而不是整個論壇知道答案)。如果你只是想在有人回覆討論串時得到電子郵件提醒,可以要求網頁論壇發送給你。幾乎所有論壇都支援諸如```追蹤此討論串``````有回覆時發送郵件提醒```等功能。
### 用清晰、正確、精準並合法文法的語句
我們從經驗中發現,粗心的提問者通常也會粗心的寫程式與思考(我敢打包票)。回答粗心大意者的問題很不值得,我們寧願把時間耗在別處。
正確的拼字、標點符號和大小寫是很重要的。一般來說,如果你覺得這樣做很麻煩,不想在乎這些,那我們也覺得麻煩,不想在乎你的提問。花點額外的精力斟酌一下字句,用不著太僵硬與正式──事實上,黑客文化很看重能準確地使用非正式、俚語和幽默的語句。但它**必須很**準確,而且有跡象表明你是在思考和關注問題。
正確地拼寫、使用標點和大小寫,不要將```its```混淆為```it's``````loose```搞成```lose```或者將```discrete```弄成```discreet```。不要**全部用大寫**,這會被視為無禮的大聲嚷嚷(全部小寫也好不到哪去,因為不易閱讀。[Alan Cox](http://en.wikipedia.org/wiki/Alan_Cox)也許可以這樣做,但你不行。)
更白話的說,如果你寫得像是個半文盲[譯註:[小白](http://zh.wikipedia.org/zh-tw/小白)]),那多半得不到理睬。也不要使用即時通訊中的簡寫或[火星文](http://zh.wikipedia.org/zh-tw/火星文),如將```的```簡化為```ㄉ```會使你看起來像一個為了少打幾個鍵而省字的小白。更糟的是,如果像個小孩似地鬼畫符那絕對是在找死,可以肯定沒人會理你(或者最多是給你一大堆指責與挖苦)。
如果在使用非母語的論壇提問,你可以犯點拼寫和語法上的小錯,但決不能在思考上馬虎(沒錯,我們通常能弄清兩者的分別)。同時,除非你知道回覆者使用的語言,否則請使用英語書寫。繁忙的黑客一般會直接刪除用他們看不懂語言寫的消息。在網路上英語是通用語言,用英語書寫可以將你的問題在尚未被閱讀就被直接刪除的可能性降到最低。
如果英文是你的第一外語(Second language),提示潛在回覆者你有潛在的語言困難是很好的:
[譯註:以下附上原文以供使用]
> English is not my native language; please excuse typing errors.
* 英文不是我的母語,請原諒我的錯字或文法
> If you speak $LANGUAGE, please email/PM me;
> I may need assistance translating my question.
* 如果你說**某語言**,請寄信/私訊給我;我需要有人協助我翻譯我的問題
> I am familiar with the technical terms,
> but some slang expressions and idioms are difficult for me.
* 我對技術名詞很熟悉,但對於俗語或是特別用法比較不甚了解。
> I've posted my question in $LANGUAGE and English.
> I'll be glad to translate responses, if you only use one or the other.
* 我把我的問題用**某語言**和英文寫出來,如果你只用一種語言回答,我會樂意將其翻譯成另一種。
### 使用易於讀取且標準的文件格式發送問題
如果你人為地將問題搞得難以閱讀,它多半會被忽略,人們更願讀易懂的問題,所以:
* 使用純文字而不是 HTML ([關閉 HTML ](http://archive.birdhouse.org/etc/evilmail.html)並不難)
* 使用 MIME 附件通常是可以的,前提是真正有內容(譬如附帶的原始碼或patch),而不僅僅是信箱程式生成的模板(譬如只是信件內容的拷貝)。
* 不要發送一段文字只是單行句子但多次斷行的郵件(這使得回覆部分內容非常困難)。設想你的讀者是在80個字符寬的終端機上閱讀郵件,最好設置你的斷行點小於80字。
* 但是,也**不要**用任何固定斷行資料(譬如日誌檔案拷貝或會話記錄)。檔案應該原樣包含,讓回覆者有信心他們看到的是和你看到的一樣的東西。
* 在英語論壇中,不要使用```Quoted-Printable``` MIME編碼發送消息。這種編碼對於張貼非 ASCII 語言可能是必須的,但很多電子信箱程式並不支援這種編碼。當它們分斷時,那些文本中四處散佈的```=20```符號既難看也分散注意力,甚至有可能破壞內容的語意。
* 絕對,**永遠**不要指望黑客們閱讀使用封閉格式編寫的文檔,像是微軟公司的 Word 或 Excel 文件等。大多數黑客對此的反應就像有人將還在冒熱氣的豬糞倒在你門口階梯上時你的反應一樣。即便他們能夠處理,他們也很厭惡這麼做。
* 如果你從使用 Windows 的電腦發送電子郵件,關閉微軟愚蠢的```智慧引號```功能 (從[選項] > [校訂] > [自動校正選項], 按掉```智慧引號```核取方塊),以免在你的郵件中到處散佈垃圾字符。
* 在論壇,勿濫用```表情符號``````HTML```功能(當它們提供時)。一兩個表情符號通常沒有問題,但花哨的彩色文本傾向於使人認為你是個無能之輩。過濫地使用表情符號、色彩和字體會使你看來像個傻笑的小姑娘。這通常不是個好主意,除非你只是對性而不是有用的回覆更有興趣。
如果你使用圖形用戶界面的電子信箱程式(如微軟公司的 Outlook 或者其它類似的),注意它們的預設配置不一定滿足這些要求。大多數這類程式有基於選單的```查看原始碼```命令,用它來檢查發送文件夾中的消息,以確保發送的是沒有多餘雜質的純文本文件。
### 精確的描述問題並言之有物
* 仔細、清楚地描述你的問題或臭蟲的症狀。
* 描述問題發生的環境(機器配置、作業系統、應用程式、以及相關的資訊),提供經銷商的發行版和版本號(如:```Fedora Core 4``````Slackware 9.1```等)。
* 描述在提問前你是怎樣去研究和理解這個問題的。
* 描述在提問前為確定問題而採取的診斷步驟。
* 描述最近做過什麼可能相關的硬體或軟體變更。
* 盡可能的提供一個可以```重製這個問題的既定環境```的方法
儘量去揣測一個黑客會怎樣反問你,在他提問的時候預先給他答案。
以上幾點中,當你回報的是你認為可能在程式碼中的問題時,給黑客一個可以重製你的問題的環境尤其重要。當你這麼做時,你得到有效的回答的機會和速度都會大大的提升。
[Simon Tatham](http://www.chiark.greenend.org.uk/~sgtatham/) 寫過一篇名為〈[如何有效的回報Bug](http://www.chiark.greenend.org.uk/~sgtatham/bugs-tw.html)〉的出色文章。強力推薦你也讀一讀。
### 話不在多而在精
你需要提供精確有內容的資訊。這並不是要求你簡單的把成堆的出錯程式碼或者資料完全轉錄到你的提問中。如果你有龐大而複雜的測試樣例能重現程式當掉的情境,儘量將它剪裁得越小越好。
這樣做的用處至少有三點。
第一,表現出你為簡化問題付出了努力,這可以使你得到回答的機會增加;
第二,簡化問題使你更有可能得到**有用**的答案;
第三,在精鍊你的bug報告的過程中,你很可能就自己找到了解決方法或權宜之計。
### 別動輒聲稱找到Bug
當你在使用軟體中遇到問題,除非你非常、**非常**的有根據,不要動輒聲稱找到了Bug。提示:除非你能提供解決問題的原始碼補丁,或者對前一版本的回歸測試表現出不正確的行為,否則你都多半不夠完全確信。這同樣適用在網頁和文件,如果你(聲稱)發現了文件的```Bug```,你應該能提供相應位置的修正或替代文件。
請記得,還有許多其它使用者沒遇到你發現的問題,否則你在閱讀文件或搜尋網頁時就應該發現了(你在抱怨前[已經做了這些,是吧](#在提問之前)?)。這也意味著很有可能是你弄錯了而不是軟體本身有問題。
編寫軟體的人總是非常辛苦地使它盡可能完美。如果你聲稱找到了Bug,也就是在質疑他們的能力,即使你是對的,也有可能會冒犯到其中某部分人。這尤其嚴重當你在標題中嚷嚷著有```Bug```
提問時,即使你私下非常確信已經發現一個真正的臭蟲,最好寫得像是**你**做錯了什麼。如果真的有臭蟲,你會在回覆中看到這點。這樣做的話,如果真有臭蟲,維護者就會向你道歉,這總比你惹惱別人然後欠別人一個道歉要好一點。
### 別用低聲下氣取代你真正該做的事
有些人明白他們不該粗魯或傲慢的提問並要求得到答覆,但他們選擇另一個極端 -- 低聲下氣:```我知道我只是個可悲的新手,一個魯蛇,但...```。這既使人困擾,也沒有用,尤其是伴隨著與實際問題含糊不清的描述時更令人反感。
別用原始靈長類動物的把戲來浪費你我的時間。取而代之的是,盡可能清楚地描述背景條件和你的問題情況。這比低聲下氣更好地定位了你的位置。
有時網頁論壇會設有專為新手提問的版面,如果你真的認為遇到了初學者的問題,到那去就是了,但一樣別那麼低聲下氣。
### 描述問題症狀而非猜測
告訴黑客們你認為問題是怎樣造成的並沒什麼幫助。(如果你的推斷如此有效,還用向別人求助嗎?),因此要確信你原原本本告訴了他們問題的症狀,而不是你的解釋和理論;讓黑客們來推測和診斷。如果你認為陳述自己的猜測很重要,清楚地說明這只是你的猜測,並描述為什麼它們不起作用。
***蠢問題***
> 我在編譯內核時接連遇到 SIG11 錯誤,
> 我懷疑某條飛線搭在主板的走線上了,這種情況應該怎樣檢查最好?
***聰明問題***
> 我的組裝電腦是 FIC-PA2007 主機板搭載 AMD K6/233 CPU(威盛 Apollo VP2晶片組),
> 256MB Corsair PC133 SDRAM記憶體,在編譯內核時,從開機20分鐘以後就頻頻產生 SIG11 錯誤,
> 但是在頭20分鐘內從沒發生過相同的問題。重新啟動也沒有用,但是關機一晚上就又能工作20分鐘。
> 所有記憶體都換過了,沒有效果。相關部分的標準編譯記錄如下…。
由於以上這點似乎讓許多人覺得難以配合,這裡有句話可以提醒你:```所有的診斷專家都來自密蘇里州。``` 美國國務院的官方座右銘則是:```讓我看看```(出自國會議員 Willard D. Vandiver 在1899年時的講話:```我來自一個出產玉米,棉花,牛蒡和民主黨人的國家,滔滔雄辯既不能說服我,也不會讓我滿意。我來自密蘇里州,你必須讓我看看。```) 針對診斷者而言,這並不是一種懷疑,而只是一種真實而有用的需求,以便讓他們看到的是與你看到的原始證據盡可能一致的東西,而不是你的猜測與歸納的結論。所以,大方的展示給我們看吧!
### 按發生時間先後列出問題症狀
問題發生前的一系列操作,往往就是對找出問題最有幫助的線索。因此,你的說明裡應該包含你的操作步驟,以及機器和軟體的反應,直到問題發生。在命令列處理的情況下,提供一段操作記錄(例如運行腳本工具所生成的),並引用相關的若干行(如20行)記錄會非常有幫助。
如果當掉的程式有診斷選項(如 -v 的詳述開關),試著選擇這些能在記錄中增加除錯資訊的選項。記住,```多```不等於```好```。試著選取適當的除錯級別以便提供有用的訊息而不是讓讀者淹沒在垃圾中。
如果你的說明很長(如超過四個段落),在開頭簡述問題,接下來再按時間順序詳述會有所幫助。這樣黑客們在讀你的記錄時就知道該注意哪些內容了。
### 描述目標而不是過程
如果你想弄清楚如何做某事(而不是報告一個Bug),在開頭就描述你的目標,然後才陳述重現你所卡住的特定步驟。
經常尋求技術幫助的人在心中有個更高層次的目標,而他們在自以為能達到目標的特定道路上被卡住了,然後跑來問該怎麼走,但沒有意識到這條路本身就有問題。結果要費很大的勁才能搞定。
**蠢問題**
> 我怎樣才能從某繪圖程式的顏色選擇器中取得十六進制的的 RGB 值?
**聰明問題**
> 我正試著用替換一幅圖片的色碼成自己選定的色碼,我現在知道的唯一方法是編輯每個色碼區塊,
> 但卻無法從某繪圖程式的顏色選擇器取得十六進制的的 RGB 值。
第二種提問法比較聰明,你可能得到像是```建議採用另一個更適任的工具```的回覆。
### 別要求使用私人電郵回覆
黑客們認為問題的解決過程應該公開、透明,此過程中如果更有經驗的人注意到不完整或者不當之處,最初的回覆才能夠、也應該被糾正。同時,作為提供幫助者也能因為能力和學識被其它同行看到而得到某種獎勵。
當你要求私下回覆時,這個過程和獎勵都被中止。別這樣做,讓**回覆者**來決定是否私下回答 -- 如果他真這麼做了,通常是因為他認為問題編寫太差或者太膚淺,以至於對其它人沒有興趣。
這條規則存在一條有但書的例外,如果你確信提問可能會引來大量雷同的回覆時,那麼這個神奇的提問句會是```向我發電郵,我將為論壇歸納這些回覆```。試著將郵件列表或新聞群組從洪水般的雷同回覆中解救出來是非常有禮貌的 -- 但你必須信守諾言。
### 清楚明確的表達你的問題以及需求
漫無邊際的提問近乎無休無止的時間黑洞。最有可能給你有用答案的人通常也正是最忙的人(他們忙是因為要親自完成大部分工作)。這樣的人對無節制的時間黑洞相當厭惡,所以他們也傾向於厭惡那些漫無邊際的提問。
如果你明確表述需要回答者做什麼(如提供指點、發送一段程式碼、檢查你的補丁、或是其他等等),就最有可能得到有用的答案。因為這會定出一個時間和精力的上限,便於回答者能集中精力來幫你。這麼做很棒。
要理解專家們所處的世界,請把專業技能想像為充裕的資源,而回覆的時間則是稀缺的資源。你要求他們奉獻的時間越少,你越有可能從真正專業而且很忙的專家那裡得到解答。
所以,界定一下你的問題,使專家花在辨識你的問題和回答所需要付出的時間減到最少,這技巧對你有用答案相當有幫助──但這技巧通常和簡化問題有所區別。因此,問```我想更好的理解X,可否指點一下哪裡有好一點的說明?```通常比問```你能解釋一下X嗎?```更好。如果你的程式碼不能運作,通常請別人看看哪裡有問題,比要求別人替你改正要明智得多。
### 詢問有關程式碼的問題時
別要求他人幫你有問題的程式碼除錯而不提示一下應該從何入手。張貼幾百行的程式碼,然後說一聲:```它不會動```會讓你完全被忽略。只貼幾十行程式碼,然後說一句:```在第七行以後,我期待它顯示 <x>,但實際出現的是 <y>```比較有可能讓你得到回應。
最有效描述程式問題的方法是提供最精簡的臭蟲展示測試示例(bug-demonstrating test case)。什麼是最精簡的測試示例? 那是問題的縮影;一小個程式片段能**剛好**展示出程式的異常行為,而不包含其他令人分散注意力的內容。怎麼製作最精簡的測試示例?如果你知道哪一行或哪一段程式碼會造成異常的行為,複製下來並加入足夠重現這個狀況的程式碼(例如,足以讓這段程式碼能被編譯/直譯/被應用程式處理)。如果你無法將問題縮減到一個特定區塊,就複製一份程式碼並移除不影響產生問題行為的部分。總之,測試示例越小越好(查看[話不在多而在精](#話不在多而在精)一節)。
一般而言,要得到一段相當精簡的測試示例並不太容易,但永遠先嘗試這樣做的是種好習慣。這種方式可以幫助你了解如何自行解決這個問題──而且即使你的嘗試不成功,黑客們也會看到你在嘗試取得答案的過程中付出了努力,這可以讓他們更願意與你合作。
如果你只是想讓別人幫忙審(Review)一下程式碼,在信的開頭就要說出來,並且一定要提到你認為哪一部分特別需要關注以及為什麼。
### 別把自己家庭作業的問題貼上來
黑客們很擅長分辨哪些問題是家庭作業式的問題;因為我們中的大多數都曾自己解決這類問題。同樣,這些問題得由**你**來搞定,你會從中學到東西。你可以要求給點提示,但別要求得到完整的解決方案。
如果你懷疑自己碰到了一個家庭作業式的問題,但仍然無法解決,試試在使用者群組,論壇或(最後一招)在專案的**使用者**郵件列表或論壇中提問。儘管黑客們**會**看出來,但一些有經驗的使用者也許仍會給你一些提示。
### 去掉無意義的提問句
避免用無意義的話結束提問,例如```有人能幫我嗎?```或者```這有答案嗎?```
首先:如果你對問題的描述不是很好,這樣問更是畫蛇添足。
其次:由於這樣問是畫蛇添足,黑客們會很厭煩你──而且通常會用邏輯上正確,但毫無意義的回答來表示他們的蔑視, 例如:```沒錯,有人能幫你```或者```不,沒答案```
一般來說,避免用 ```是或否``````對或錯``````有或沒有```類型的問句,除非你想得到[是或否類型的回答](http://homepage.ntlworld.com./jonathan.deboynepollard/FGA/questions-with-yes-or-no-answers.html)
### 即使你很急也不要在標題寫```緊急```
這是你的問題,不是我們的。宣稱```緊急```極有可能事與願違:大多數黑客會直接刪除無禮和自私地企圖即時引起關注的問題。更嚴重的是,```緊急```這個字(或是其他企圖引起關注的標題)通常會被垃圾信過濾器過濾掉 -- 你的問題可能永遠將無法得到解答。
有半個例外的情況是,如果你是在一些很高調,會使黑客們興奮的地方,也許值得這樣去做。在這種情況下,如果你有時間壓力,也很有禮貌地提到這點,人們也許會有興趣回答快一點。
當然,這風險很大,因為黑客們興奮的點多半與你的不同。譬如從 NASA 國際空間站(International Space Station)發這樣的標題沒有問題,但用自我感覺良好的慈善行為或政治原因發肯定不行。事實上,張貼諸如```緊急:幫我救救這個毛絨絨的小海豹!```肯定讓你被黑客忽略或惹惱他們,即使他們認為毛絨絨的小海豹很重要。
如果你覺得這點很不可思議,最好再把這份指南剩下的內容多讀幾遍,直到你弄懂了再發文。
### 禮多人不怪,而且有時還很有幫助
彬彬有禮,多用```請``````謝謝您的關注```,或```謝謝你的關照```。讓大家都知道你對他們花時間免費提供幫助心存感激。
坦白說,這一點並沒有比清晰、正確、精準並合法文法和避免使用專用格式重要(也不能取而代之)。黑客們一般寧可讀有點唐突但技術上鮮明的臭蟲報告,而不是那種有禮但含糊的報告。(如果這點讓你不解,記住我們是按問題能教我們什麼來評價問題的價值的)
然而,如果你有一串的問題待解決,客氣一點肯定會增加你得到有用回應的機會。
(我們注意到,自從本指南發佈後,從資深黑客那裡得到的唯一嚴重缺陷反饋,就是對預先道謝這一條。一些黑客覺得```先謝了```意味著事後就不用再感謝任何人的暗示。我們的建議是要麼先說```先謝了```**然後**事後再對回覆者表示感謝,或者換種方式表達感激,譬如用```謝謝你的關注``````謝謝你的關照```。)
### 問題解決後,加個簡短的補充說明
問題解決後,向所有幫助過你的人發個說明,讓他們知道問題是怎樣解決的,並再一次向他們表示感謝。如果問題在新聞組或者郵件列表中引起了廣泛關注,應該在那裡貼一個說明比較恰當。
最理想的方式是向最初提問的話題回覆此消息,並在標題中包含```已修正``````已解決```或其它同等含義的明顯標記。在人來人往的郵件列表裡,一個看見討論串```問題 X``````問題的X - 已解決```的潛在回覆者就明白不用再浪費時間了(除非他個人覺得```問題 X```的有趣),因此可以利用此時間去解決其它問題。
補充說明不必很長或是很深入;簡單的一句```你好,原來是網路線出了問題!謝謝大家 – Bill```比什麼也不說要來的好。事實上,除非結論真的很有技術含量,否則簡短可愛的小結比長篇大論更好。說明問題是怎樣解決的,但大可不必將解決問題的過程複述一遍。
對於有深度的問題,張貼除錯記錄的摘要是有幫助的。描述問題的最終狀態,說明是什麼解決了問題,在此**之後**才指明可以避免的盲點。避免盲點的部分應放在正確的解決方案和其它總結材料之後,而不要將此訊息搞成偵探推理小說。列出那些幫助過你的名字,會讓你交到更多朋友。
除了有禮貌和有內涵以外,這種類型的補充也有助於他人在郵件列表/新聞群組/論壇中搜尋到真正解決你問題的方案,讓他們也從中受益。
至少,這種補充有助於讓每位參與協助的人因問題的解決而從中得到滿足感。如果你自己不是技術專家或者黑客,那就相信我們,這種感覺對於那些你向他們求助的大師或者專家而言,是非常重要的。問題懸而未決會讓人灰心;黑客們渴望看到問題被解決。好人有好報,滿足他們的渴望,你會在下次提問時嘗到甜頭。
思考一下怎樣才能避免他人將來也遇到類似的問題,自問寫一份文件或加個常見問題(FAQ)會不會有幫助。如果是的話就將它們發給維護者。
在黑客中,這種良好的後繼行動實際上比傳統的禮節更為重要,也是你如何透過善待他人而贏得聲譽的方式,這是非常有價值的資產。
## 如何解讀答案
<a id="rtfm"></a>
### RTFM和STFW:如何知道你已完全搞砸了
有一個古老而神聖的傳統:如果你收到```RTFM (Read The Fucking Manual)```的回應,回答者認為你**應該去讀那該死的手冊**。當然,基本上他是對的,你應該去讀一讀。
RTFM 有一個年輕的親戚。如果你收到```STFW(Search The Fucking Web)```的回應,回答者認為你**應該到該死的網路上搜索**過了。那人多半也是對的,去搜尋一下吧。(更溫和一點的說法是 **[Google是你的朋友](http://lmgtfy.com/)**!)
在論壇,你也可能被要求去爬爬論壇的舊文。事實上,有人甚至可能熱心地為你提供以前解決此問題的討論串。但不要依賴這種關照,提問前應該先搜索一下舊文。
通常,用這兩句之一回答你的人會給你一份包含你需要內容的手冊或者一個網址,而且他們打這些字的時候也正在讀著。這些答覆意味著回答者認為
* **你需要的資訊非常容易獲得**
 * **你自己去搜尋這些資訊比灌給你能讓你學到更多**
你不應該因此不爽;**依照黑客的標準,他已經表示了對你一定程度的關注,而沒有對你的要求視而不見**。你應該對他祖母般的慈祥表示感謝。
### 如果還是搞不懂
如果你看不懂回應,別立刻要求對方解釋。像你以前試著自己解決問題時那樣(利用手冊,FAQ,網路,身邊的高手),先試著去搞懂他的回應。如果你真的需要對方解釋,記得表現出你已經從中學到了點什麼。
比方說,如果我回答你:```看來似乎是 zentry 卡住了;你應該先清除它。```,然後,這是一個**很糟的**後續問題回應:```zentry是什麼?``` **好**的問法應該是這樣:```哦~~~我看過說明了但是只有 -z 和 -p 兩個參數中提到了 zentries,而且還都沒有清楚的解釋如何清除它。你是指這兩個中的哪一個嗎?還是我看漏了什麼?```
### 處理無禮的回應
很多黑客圈子中看似無禮的行為並不是存心冒犯。相反,它是直接了當,一針見血式的交流風格,這種風格更注重解決問題,而不是使人感覺舒服而卻模模糊糊。
如果你覺得被冒犯了,試著平靜地反應。如果有人真的做了出格的事,郵件列表、新聞群組或論壇中的前輩多半會招呼他。如果這**沒有**發生而你卻發火了,那麼你發火對象的言語可能在黑客社區中看起來是正常的,而**你**將被視為有錯的一方,這將傷害到你獲取訊息或幫助的機會。
另一方面,你偶而真的會碰到無禮和無聊的言行。與上述相反,對真正的冒犯者狠狠地打擊,用犀利的語言將其駁得體無完膚都是可以接受的。然而,在行事之前一定要非常非常的有根據。糾正無禮的言論與開始一場毫無意義的口水戰僅一線之隔,黑客們自己莽撞地越線的情況並不鮮見。如果你是新手或外人,避開這種莽撞的機會並不高。如果你想得到的是訊息而不是消磨時光,這時最好不要把手放在鍵盤上以免冒險。
(有些人斷言很多黑客都有輕度的自閉症或亞斯伯格綜合症,缺少用於潤滑人類社會**正常**交往所需的神經。這既可能是真也可能是假的。如果你自己不是黑客,興許你認為我們腦袋有問題還能幫助你應付我們的古怪行為。只管這麼幹好了,我們不在乎。我們**喜歡**我們現在這個樣子,並且通常對病患標記都有站得住腳的懷疑。)
在下一節,我們會談到另一個問題,當**你**行為不當時所會受到的```冒犯```
## 如何避免扮演失敗者
在黑客社區的論壇中有那麼幾次你可能會搞砸──以本指南所描述到的或類似的方式。而你會在公開場合中被告知你是如何搞砸的,也許攻擊的言語中還會帶點雜七雜八的顏色。
這種事發生以後,你能做的最糟糕的事莫過於哀嚎你的遭遇、宣稱被口頭攻擊、要求道歉、高聲尖叫、憋悶氣、威脅訴諸法律、向其雇主報怨、忘了關馬桶蓋等等。相反地,你該這麼做:
熬過去,這很正常。事實上,它是有益健康且合理的。
社區的標準不會自行維持,它們是通過參與者積極而**公開地**執行來維持的。不要哭嚎所有的批評都應該通過私下的郵件傳送,它不是這樣運作的。當有人評論你的一個說法有誤或者提出不同看法時,堅持聲稱受到個人攻擊也毫無益處,這些都是失敗者的態度。
也有其它的黑客論壇,受過高禮節要求的誤導,禁止參與者張貼任何對別人帖子挑毛病的消息,並聲稱```如果你不想幫助用戶就閉嘴。``` 結果造成有想法的參與者紛紛離開,這麼做只會使它們淪為毫無意義的嘮叨與無用的技術論壇。
誇張的講法是:你要的是**友善**(以上述方式)還是有用?兩個裡面挑一個。
記著:當黑客說你搞砸了,並且(無論多麼刺耳)告訴你別再這樣做時,他正在為關心**你****他的社群**而行動。對他而言,不理你並將你從他的生活中濾掉更簡單。如果你無法做到感謝,至少要表現地有點尊嚴,別大聲哀嚎,也別因為自己是個有戲劇性超級敏感的靈魂和自以為有資格的新來者,就指望別人像對待脆弱的洋娃娃那樣對你。
有時候,即使你沒有搞砸(或者只是在他的想像中你搞砸了),有些人也會無緣無故地攻擊你本人。在這種情況下,抱怨倒是**真的**會把問題搞砸。
這些來找麻煩的人要麼是毫無辦法但自以為是專家的不中用傢伙,要麼就是測試你是否真會搞砸的心理專家。其它讀者要麼不理睬,要麼用自己的方式對付他們。這些來找麻煩的人在給他們自己找麻煩,這點你不用操心。
也別讓自己捲入口水戰,最好不要理睬大多數的口水戰 -- 當然,是在你檢驗它們只是口水戰,而並未指出你有搞砸的地方,且也沒有巧妙地將問題真正的答案藏於其後(這也是有可能的)。
## 不該問的問題
以下是幾個經典蠢問題,以及黑客沒回答時心中所想的:
問題:[我能在哪找到 X 程式或 X 資源?](#q1)
問題:[我怎樣用 X 做 Y?](#q2)
問題:[如何設定我的 shell 提示?](#q3)
問題:[我可以用 Bass-o-matic 文件轉換工具將 AcmeCorp 檔案轉換為 TeX 格式嗎?](#q4)
問題:[我的程式/設定/SQL語句沒有用](#q5)
問題:[我的 Windows 電腦有問題,你能幫我嗎?](#q6)
問題:[我的程式不會動了,我認為系統工具 X 有問題](#q7)
問題:[我在安裝 Linux(或者 X )時有問題,你能幫我嗎?](#q8)
問題:[我怎麼才能破解 root 帳號/竊取 OP 特權/讀別人的郵件呢?](#q9)
---
<a id="q1"></a>
> 問題:我能在哪找到 X 程式或 X 資源?
回答:就在我找到它的地方啊,白痴 -- 搜尋引擎的那一頭。天哪!難道還有人不會用 [Google](http://www.google.com) 嗎?
<a id="q2"></a>
> 問題:我怎樣用 X 做 Y?
回答:如果你想解決的是 Y ,提問時別給出可能並不恰當的方法。這種問題說明提問者不但對 X 完全無知,也對 Y 要解決的問題糊塗,還被特定形勢禁錮了思維。最好忽略這種人,等他們把問題搞清楚了再說。
<a id="q3"></a>
>問題:如何設定我的 shell 提示??
回答:如果你有足夠的智慧提這個問題,你也該有足夠的智慧去 [RTFM](#rtfm),然後自己去找出來。
<a id="q4"></a>
> 問題:我可以用 Bass-o-matic 文件轉換工具將 AcmeCorp 檔案轉換為 TeX 格式嗎?
回答:試試看就知道了。如果你試過,你既知道了答案,就不用浪費我的時間了。
<a id="q5"></a>
> 問題:我的程式/設定/SQL語句沒有用
回答:這不算是問題吧,我對要我問你二十個問題才找得出你真正問題的問題沒興趣 -- 我有更有意思的事要做呢。在看到這類問題的時候,我的反應通常不外如下三種
* 你還有什麼要補充的嗎?
* 真糟糕,希望你能搞定。
* 這關我屁事?
<a id="q6"></a>
> 問題:我的 Windows 電腦有問題,你能幫我嗎?
回答:能啊,扔掉微軟的垃圾,換個像 Linux 或 BSD 的開放原始碼作業系統吧。
注意:如果程式有官方版 Windows 或者與 Windows 有互動(如Samba),你**可以**問與Windows相關的問題, 只是別對問題是由 Windows 作業系統而不是程式本身造成的回覆感到驚訝, 因為 Windows 一般來說實在太爛,這種說法通常都是對的。
<a id="q7"></a>
> 問題:我的程式不會動了,我認為系統工具 X 有問題
回答:你完全有可能是第一個注意到被成千上萬用戶反覆使用的系統呼叫與函式庫檔案有明顯缺陷的人,更有可能的是你完全沒有根據。不同凡響的說法需要不同凡響的證據,當你這樣聲稱時,你必須有清楚而詳盡的缺陷說明文件作後盾。
<a id="q8"></a>
> 問題:我在安裝 Linux(或者 X )時有問題,你能幫我嗎?
回答:不能,我只有親自在你的電腦上動手才能找到毛病。還是去找你當地的 Linux 使用群組者尋求實際的指導吧(你能在[這兒](http://www.linux.org/groups/index.html)找到使用者群組的清單)。
注意:如果安裝問題與某 Linux 的發行版有關,在它的郵件列表、論壇或本地使用者群組中提問也許是恰當的。此時,應描述問題的準確細節。在此之前,先用 ```Linux```**所有**被懷疑的硬體作關鍵詞仔細搜尋。
<a id="q9"></a>
> 問題:我怎麼才能破解 root 帳號/竊取 OP 特權/讀別人的郵件呢?
回答:想要這樣做,說明了你是個卑鄙小人;想找個黑客幫你,說明你是個白癡!
## 好問題與蠢問題
最後,我將透過舉一些例子,來說明怎樣聰明的提問;同一個問題的兩種問法被放在一起,一種是愚蠢的,另一種才是明智的。
**蠢問題**
> 我可以在哪兒找到關於 Foonly Flurbamatic 的資料?
這種問法無非想得到 [STFW](#rtfm) 這樣的回答。
**聰明問題**
> 我用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``` 並附上一個連結一點用都沒有。
**幫助你的社群從問題中學習**。當回覆一個好問題時,問問自己```如何修改相關文件或常見問題文件以免再次解答同樣的問題?```,接著再向文件維護者發一份補丁。
如果你是在研究一番後才做出的回答,**展現你的技巧而不是直接端出結果**。畢竟```授人以魚不如授人以漁```
## 相關資源
如果你需要個人電腦、Unix 系統和網路如何運作的基礎知識,參閱[Unix系統和網路基本原理](http://en.tldp.org/HOWTO/Unix-and-Internet-Fundamentals-HOWTO/)
當你發布軟體或補丁時,試著按[軟體發布實踐](http://en.tldp.org/HOWTO/Software-Release-Practice-HOWTO/index.html)操作。
## 鳴謝
Evelyn Mitchel 貢獻了一些愚蠢問題例子並啟發了編寫```如何更好地回答問題```這一節, Mikhail Ramendik 貢獻了一些特別有價值的建議和改進。
{
{
"structure": {
"readme": "README.md"
}
}
<table>
<table>
<tbody>
<tr>
<td align="left">Revision 3.10</td>
<td align="left">21 May 2014</td>
<td align="left">esr</td>
</tr>
<tr>
<td align="left" colspan="3">
新增 Stack Overflow 段落
</td>
</tr>
<tr>
<td align="left">Revision 3.9</td>
<td align="left">23 Apr 2013</td>
<td align="left">esr</td>
</tr>
<tr>
<td align="left" colspan="3">
修正 URL
</td>
</tr>
<tr>
<td align="left">Revision 3.8</td>
<td align="left">19 Jun 2012</td>
<td align="left">esr</td>
</tr>
<tr>
<td align="left" colspan="3">
修正 URL
</td>
</tr>
<tr>
<td align="left">Revision 3.7</td>
<td align="left">06 Dec 2010</td>
<td align="left">esr</td>
</tr>
<tr>
<td align="left" colspan="3">
新增非英文母語者的提示
</td>
</tr>
<tr>
<td align="left">Revision 3.7</td>
<td align="left">02 Nov 2010</td>
<td align="left">esr</td>
</tr>
<tr>
<td align="left" colspan="3">
數個翻譯版本消失了
</td>
</tr>
<tr>
<td align="left">Revision 3.6</td>
<td align="left">19 Mar 2008</td>
<td align="left">esr</td>
</tr>
<tr>
<td align="left" colspan="3">
小更新以及新增連結
</td>
</tr>
<tr>
<td align="left">Revision 3.5</td>
<td align="left">2 Jan 2008</td>
<td align="left">esr</td>
</tr>
<tr>
<td align="left" colspan="3">
更新翻譯連結
</td>
</tr>
<tr>
<td align="left">Revision 3.4</td>
<td align="left">24 Mar 2007</td>
<td align="left">esr</td>
</tr>
<tr>
<td align="left" colspan="3">
新增"當詢問有關程式碼的問題時"段落
</td>
</tr>
<tr>
<td align="left">Revision 3.3</td>
<td align="left">29 Sep 2006</td>
<td align="left">esr</td>
</tr>
<tr>
<td align="left" colspan="3">
加入 Kai Niggemann 編寫的好建議
</td>
</tr>
<tr>
<td align="left">Revision 3.2</td>
<td align="left">10 Jan 2006</td>
<td align="left">esr</td>
</tr>
<tr>
<td align="left" colspan="3">
加入 Rick Moen 編寫的內容
</td>
</tr>
<tr>
<td align="left">Revision 3.1</td>
<td align="left">28 Oct 2004</td>
<td align="left">esr</td>
</tr>
<tr>
<td align="left" colspan="3">
新增 'Google 是你的好朋友' 文件
</td>
</tr>
<tr>
<td align="left">Revision 3.0</td>
<td align="left">2 Feb 2004</td>
<td align="left">esr</td>
</tr>
<tr>
<td align="left" colspan="3">
關於在網路論壇上適當禮儀主要版本
</td>
</tr>
</tbody>
</table>
(function(window) {
(function(window) {
String.prototype.repeat = function(num) {
return new Array(num + 1).join(this);
};
var url = document.URL,
headers = jQuery("article :header"),
result;
for (var i = 3; i < headers.length; i++) { //skip H1, history, and toc
var header = headers[i],
headerText = header.textContent.trim();
var anchorText = headerText.toLowerCase();
anchorText = anchorText.replace(" ", "-");
anchorText = anchorText.replace(/,|:|、/g, "");
var hIndex = parseInt(header.nodeName.substring(1)) - 1,
indent = " ".repeat(hIndex),
link = ['<pre>', indent, '* [', headerText, '](', '#', anchorText, ')', '\n', '</pre>'];
result += link.join('');
}
var win = window.open("", "win");
win.document.body.innerHTML = result;
})(window);
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment