跳到主要内容

提问的艺术

· 阅读需 13 分钟
Vstay
Sometimes coding, sometimes thinking

在资深技术专家的世界里,你所提技术问题的解答很大程度上取决于你提问的方式与解决此问题的难度,本文将教你如何提问才更有可能得到满意的答复。

提问前

在通过电子邮件、社交群或论坛提技术问题以前,务必先做以下事情:

  • 尝试在你准备提问论坛的历史文档中搜索答案
  • 尝试搜索互联网以找到答案(基本上可以解决 90% 的问题)
  • 尝试阅读手册以找到答案
  • 尝试阅读 “常见问题文档”(FAQ)以找到答案
  • 尝试自己检查或试验以找到答案
  • 尝试请教懂行的朋友以找到答案
如果你是程序员,尝试阅读源代码以找到答案。

提问时

仔细挑选论坛

第一步是找对论坛,可以利用搜索引擎查询你遇到困难的软硬件问题最相关的项目网站。那里通常有项目的常见问题(FAQ)及文档;如果你的努力没有结果,项目的网站也许还有报告 Bug 的流程或链接。

不要轻易向陌生的人或论坛求助,更不要假设别人会充当你的免费顾问。因为你愚蠢的提问可能会迎来攻击!确定好提问的论坛,务必再搜索一下论坛,搜索引擎有可能没来得及索引此论坛的全部内容。

最后请先翻阅已有的帖子,了解社区文化后再发帖提问。

社交群通常响应最快

在国内可以选择 QQ 群;

使用有意义且明确的主题

在论坛或社交群中,大约 50 字以内的标题是抓住资深专家注意力的好机会,别用喋喋不休的帮帮忙跪求(更别说救命啊!!!!这样让人反感的话,用这种标题会被条件反射式地忽略)来浪费这个机会。

一个好标题范例是目标 —— 差异式的描述,在目标部分指出是哪一个或哪一组东西有问题,在差异部分则描述与期望的行为不一致的地方。

蠢问题:救命啊!我的笔记本电脑不能正常显示了!
聪明问题:X.org 6.8.1 的鼠标光标会变形,某牌显卡 MV1005 芯片组。
更聪明问题:X.org 6.8.1 的鼠标光标,在某牌显卡 MV1005 芯片组环境下 - 会变形。

去掉无意义的提问句

避免用无意义的话结束提问,例如有人能帮我吗?或者这有答案吗?

即使你很急也不要在标题写紧急

用清晰、正确、精准且语法正确的语句

正确的拼写、标点符号和大小写是很重要的!如果你写得像是个半文盲,那多半得不到理睬。

使用易于读取且标准的文件格式发送问题

绝对,永远不要指望资深专家们阅读使用封闭格式编写的文档,像微软公司的 Word 或 Excel 文件等。大多数资深专家对此的反应就像有人将还在冒热气的猪粪倒在你家门口时你的反应一样。

精确地描述问题并言之有物

  • 仔细、清楚地描述你的问题或 Bug 的症状。
  • 描述问题发生的环境(机器配置、操作系统、应用程序、以及相关的信息),提供经销商的发行版和版本号(如:Fedora Core 4Slackware 9.1等)。
  • 描述在提问前你是怎样去研究和理解这个问题的。
  • 描述在提问前为确定问题而采取的诊断步骤。
  • 描述最近做过什么可能相关的硬件或软件变更。
  • 尽可能的提供一个可以重现这个问题的可控环境的方法。

话不在多而在精

别动辄声称找到 Bug

编写软件的人总是非常辛苦地使它尽可能完美。如果你声称找到了 Bug,也就是在质疑他们的能力,即使你是对的,也有可能会冒犯到其中某部分人。

描述问题症状而非你的猜测

告诉资深专家们你认为问题是怎样造成的并没什么帮助。(如果你的推断如此有效,还用向别人求助吗?)

蠢问题

我在编译内核时接连遇到 SIG11 错误, 我怀疑某条飞线搭在主板的走线上了,这种情况应该怎样检查最好?

聪明问题

我的组装电脑是 FIC-PA2007 主机板搭载 AMD K6/233 CPU(威盛 Apollo VP2 芯片组), 256MB Corsair PC133 SDRAM 内存,在编译内核时,从开机 20 分钟以后就频频产生 SIG11 错误, 但是在头 20 分钟内从没发生过相同的问题。重新启动也没有用,但是关机一晚上就又能工作 20 分钟。 所有内存都换过了,没有效果。相关部分的标准编译记录如下…。

按发生时间先后列出问题症状

描述目标而不是过程

如果你想弄清楚如何做某事,在开头就描述你的目标,然后才陈述重现你所卡住的特定步骤。

蠢问题

我怎样才能从某绘图程序的颜色选择器中取得十六进制的的 RGB 值?

聪明问题

我正试着用替换一幅图片的色码(color table)成自己选定的色码,我现在知道的唯一方法是编辑每个色码区块(table slot), 但却无法从某绘图程序的颜色选择器取得十六进制的的 RGB 值。

清楚明确的表达你的问题以及需求

如果你明确表述需要回答者做什么(如提供指点、发送一段代码、检查你的补丁、或是其他等等),就最有可能得到有用的答案。因为这会定出一个时间和精力的上限,便于回答者能集中精力来帮你。这么做很棒。

礼多人不怪,而且有时还很有帮助

彬彬有礼,多用谢谢您的关注,或谢谢你的关照。让大家都知道你对他们花时间免费提供帮助心存感激。

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

最理想的方式是向最初提问的话题回复此消息,并在标题中包含已修正已解决或其它同等含义的明显标记。在人来人往的邮件列表里,一个看见讨论串问题 X问题 X - 已解决的潜在回复者就明白不用再浪费时间了。

如何解读答案

RTFM 和 STFW

有一个古老而神圣的传统:如果你收到RTFM (Read The Fucking Manual)的回应,回答者认为你应该去读他妈的手册。当然,基本上他是对的,你应该去读一读。

RTFM 有一个年轻的亲戚。如果你收到STFW(Search The Fucking Web)的回应,回答者认为你应该到他妈的网上搜索。那人多半也是对的,去搜索一下吧。(更温和一点的说法是 Google 是你的朋友!)

你不应该因此不爽;依照黑客的标准,他已经表示了对你一定程度的关注,而没有对你的要求视而不见。

你应该对他祖母般的慈祥表示感谢。

如果还是搞不懂

如果你看不懂回应,别立刻要求对方解释。像你以前试着自己解决问题时那样(利用手册,FAQ,网络,身边的高手),先试着去搞懂他的回应。如果你真的需要对方解释,记得表现出你已经从中学到了点什么。

处理无礼的回应

如果你觉得被冒犯了,试着平静地反应。如果有人真的做了出格的事,前辈多半会招呼他。

不该问的问题

问题:我能在哪找到 X 程序或 X 资源?

问题:我怎样用 X 做 Y?

问题:我的 Windows 电脑有问题,你能帮我吗?

问题:我的程序不会动了,我认为系统工具 X 有问题

问题:我在安装 Linux(或者 X )时有问题,你能帮我吗?

问题:我怎么才能破解 root 帐号/窃取 QQ 账号/游戏开挂呢?


问题:我能在哪找到 X 程序或 X 资源?

回答:就在我找到它的地方啊,白痴 —— 搜索引擎的那一头。天哪!难道还有人不会用 Google 吗?

问题:我怎样用 X 做 Y?

回答:如果你想解决的是 Y ,提问时别给出可能并不恰当的方法。这种问题说明提问者不但对 X 完全无知,也对 Y 要解决的问题糊涂,还被特定形势禁锢了思维。

问题:我的 Windows 电脑有问题,你能帮我吗?

回答:能啊,扔掉微软的垃圾,换个像 Linux 或 BSD 的开源操作系统吧。

问题:我的程序不会动了,我认为系统工具 X 有问题

回答:你完全有可能是第一个注意到被成千上万用户反复使用的系统调用与函数库档案有明显缺陷的人,更有可能的是你完全没有根据。不同凡响的说法需要不同凡响的证据,当你这样声称时,你必须有清楚而详尽的缺陷说明文件作后盾。

问题:我在安装 Linux(或者 X )时有问题,你能帮我吗?

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

问题:我怎么才能破解 root 帐号/窃取 QQ 账号/游戏开挂呢?

回答:想要这样做,说明了你是个沙壁;想找个资深专家帮你,说明你是个大沙壁!

好问题与蠢问题

蠢问题

我可以在哪儿找到关于 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 的原因是什么?有谁知道接下来我该做些什么测试才能找出问题?

如果得不到回答

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

你仍然可以通过其他渠道获得帮助,例如商业公司。别为要付费才能获得帮助而感到沮丧!毕竟,假使你的汽车发动机汽缸密封圈爆掉了 —— 完全可能如此 —— 你还得把它送到修车铺,并且为维修付费。

就算软件没花费你一分钱,你也不能强求技术支持总是免费的

如何更好地回答问题

态度和善一点。问题带来的压力常使人显得无礼或愚蠢,其实并不是这样。

对初犯者私下回复。对那些坦诚犯错之人没有必要当众羞辱,一个真正的新手也许连怎么搜索或在哪找常见问题都不知道。

如果你不确定,一定要说出来!一个听起来权威的错误回复比没有还要糟,别因为听起来像个专家很好玩,就给别人乱指路。要谦虚和诚实,给提问者与同行都树个好榜样。

如果帮不了忙,也别妨碍他。不要在实际步骤上开玩笑,那样也许会毁了使用者的设置 —— 有些可怜的呆瓜会把它当成真的指令(例如 sudo rm -rf /*)。

试探性的反问以引出更多的细节。如果你做得好,提问者可以学到点东西 —— 你也可以。试试将蠢问题转变成好问题,别忘了我们都曾是新手。

尽管对那些懒虫抱怨一声 RTFM 是正当的,能指出文件的位置(即使只是建议个 Google 搜索关键词)会更好。

如果你决定回答,就请给出好的答案。当别人正在用错误的工具或方法时别建议笨拙的权宜之(wordaround),应推荐更好的工具,重新界定问题。

正面的回答问题!如果这个提问者已经很深入的研究而且也表明已经试过 X 、 Y 、 Z 、 A 、 B 、 C 但没得到结果,回答 试试看 A 或是 B 或者 试试 X 、 Y 、 Z 、 A 、 B 、 C 并附上一个链接一点用都没有。

帮助你的社区从问题中学习。当回复一个好问题时,问问自己如何修改相关文件或常见问题文件以免再次解答同样的问题?,接着再向文件维护者发一份补丁。

如果你是在研究一番后才做出的回答,展现你的技巧而不是直接端出结果。毕竟授人以鱼不如授人以渔

声明

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

Copyleft 2001 by D.H.Grand(nOBODY/Ginux), 2010 by Gasolin, 2015 by Ryan Wu

本中文指南是基于原文 3.10 版以及 2010 年由 Gasolin 所翻译版本的最新翻译;

协助指出翻译问题,发 Issue,或直接发 Pull Request 给我。

本文另有:简体中文版

浅谈个人服务器架构

· 阅读需 4 分钟
Vstay
Sometimes coding, sometimes thinking

大一上学年购买了第一台服务器,并且搭建了网站。当时购买的腾讯云学生主机,搭建了一个 WordPress 个人博客网站。后续购买并备案了域名,服务器系统也由 Windows 转为 Linux,也第一次接触到了服务器管理面板……

直至今天,服务器配置也是由当初的 1 核心 1G 内存 1M 带宽升级到 2 核心 4G 内存 5M 带宽;博客也由 WordPress 更换成 Typecho。熬了数不清的夜晚,折腾了不少的时间,经过不断地打怪升级,经验宝宝也含泪成为了天线宝宝。简单总结了个人服务器的痛点如下:

  • 服务器性能底下
  • 服务器续费太贵
  • 网站域名备案繁琐
  • 网站访问速度过慢
  • 容易遇到各种各样的攻击
  • 更换服务器,网站各种问题

服务器架构

现如今也设计并搭建了个人认为较为完善、成熟、轻便的服务器架构。

个人服务器架构图.png

推荐将把服务器与安全组、COS、镜像备份、服务器监控合理搭配使用,这将省掉我们大部分的麻烦与痛点。然后服务器完全 Docker 化,所有程序都使用 Docker 部署,省掉了我们网站环境的麻烦,同时可以随时打包带走任意站点。其次由于使用反向代理服务器控制所有流量,加以部署防火墙便可以控制整个服务器站点的流量。

痛点解决方法

遇到问题不好解决怎么办?那就把提出问题的人解决掉!

服务器性能低下

在我们只有学生云主机的情况下,推荐服务器仅部署一个网站;推荐使用宝塔云面板,方便整个服务器的运维和网站的部署。

服务器续费太贵

这个我们只能努力工作改变现状,或者退而求其次选择性能较次的服务器。

网站域名备案繁琐

由于国内相关政策,网站必须备案以后才可以正确解析。备案方面目前相对比较轻松,时间上大约要一个月时间。如果不想备案,可以选择使用国外主机及域名,不过访问速度可能有所影响。

如果你在一家云服务厂商备案了域名,然后使用另外一家云服务厂商主机;需要进行域名转移,相当于重新备案,比较麻烦。所以在进行域名备案之前,一定要选择好云服务厂商。

网站访问速度过慢

可以选择使用 CDN 或者部署静态网站。

容易遇到各种各样的攻击

很多时候站点容易遭受各种各样的攻击,我们要怎么防御这些攻击?

  • 设置网站访问策略。

  • 自己动手搭建服务器防火墙。

  • 宝塔面板搭建免费的网站防火墙。

  • 腾讯云安全组严格控制服务器出入端口。

更换服务器,网站各种问题

合理利用云服务器镜像,COS 备份等。一劳永逸可以参考上述服务器架构。

个人服务器推荐程序

gitea

Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证.

兰空图床

Your photo album on the cloud. 一款优秀的个人图床。

Bitwarden

解决您的密码管理问题。

个人,团队和业务组织存储,共享和同步敏感数据的最简单,最安全的方法。

Nextcloud

Nextcloud 是一个免费专业的私有云存储网盘「开源」项目,可以让你简单快速地在个人/公司电脑、服务器甚至是树莓派等设备上架设一套属于自己或团队专属的云同步网盘,从而实现跨平台跨设备文件同步、共享、版本控制、团队协作等功能。

开源软件之道

· 阅读需 5 分钟
Vstay
Sometimes coding, sometimes thinking

源代码开放的软件并不一定是开源软件,开源软件有着严格统一的的定义,封闭软件(Closed Software)、自由软件(Free software)和开源软件(Open source software)有着显著地区别。

开源软件的定义

开源软件促进协会 OSI 对开源软件有明确的定义,OSI 对开源软件的定义一共有十个条款:

1. 自由再发布(Free Redistribution)
2. 源代码(Source Code)
3. 派生作品(Derived Works)
4. 作者源代码的完整性(Integrity of The Author's Source Code)
5. 不能歧视任何个人和团体(No Discrimination Against Persons or Groups)
6. 不能歧视任何领域(No Discrimination Against Fields of Endeavor)
7. 许可证的发布(Distribution of License)
8. 许可证不能针对某个产品(License Must Not Be Specific to a Product)
9. 许可证不能约束其他软件(License Must Not Restrict Other Software)
10. 许可证必须技术中立(License Must Be Technology-Neutral)

通过开源软件定义的十个条款,可以清楚的看到 OSI 所坚持的原则:

  • 坚持开放,鼓励最大化地参与和协作
  • 尊重作者权利,同时保证程序的完整性
  • 尊重独立和中立,避免任何可能影响这种独立性的事物

有了这样一个清晰而又完整的定义,在法律层面保证了开源软件的开放性,独立性和继承性。

开源软件的优点

  • 高质量
  • 零许可证费用
  • 开放和自由
  • 灵活可定制
  • 公开透明
  • 良好的学习平台

开源软件的风险

开源软件主要风险在于管理维护技术支持以及许可证法律纠纷,由于开源软件采用的协作方式,你可能无法追究某一处代码的作者(部分协议要求作者著名)。以及如果出现问题,你可能无法寻找官方的技术支持,更多的支持可能来自于社区,可这种支持不是每次都有好人跳出来帮忙。还有如果你不了解许可证可能会带来的法律风险(部分国家法律不同,如果源代码无许可证,默认著作权属于作者)。

开源许可证简介

开源许可证并不只是保护作者的权利,更多是赋予用户各项权利,许可证规定了使用主体,方式,用途。明确说明了用户可以是个人或者公司等,怎么修改和运行以及是否可以用来进行其他合法用途。

在使用开源软件要做的第一步就是找出开源软件中所涉及的所有许可证。每个开源软件的不同版本可能会使用不同的许可证,同时还有注意许可证的版本,以及有些开源软件会采用双重或多重许可(dual-license)的模式。

在 OSI 的网站上列出的 流行并广泛使用且拥有广泛社区的许可证,分别是:

许可证的兼容性

目前经过 ISO 认证的许可证多达 70 多种,被自由软件基金会认可的自由软件许可证也有数十种,而它们的条款又各不相同,有些甚至互相矛盾。这种兼容性问题被称为许可证增值问题(License proliferation)

怎么样才算兼容呢?如果使用许可证 A 的代码和使用许可证 B 的代码能在一个广域作品中结合在一起,那么 A 和 B 就是兼容的,否则就是不兼容的。更近一步,如果结合后的广义作品可以用许可证 A 发布,那么许可证 B 就是许可证 A 兼容的(A-compatible)。反之亦然,但需要注意的是兼容性并不可逆

如何选择许可证

开源许可证.png

开源许可证选择工具

如今开源软件早已经成为了软件领域不可或缺的重要组成部分,要以辨证的观点看待开源软件。它自由,平等,协作的精神实践了信息和知识共享的理念,并且实现了知识产权保护和分享之间的微妙平衡。同时开源带来的自由,免费有可能也是最贵的。


参考: 《开源软件之道》 开源社——开源许可证选择器 Open Source Initiative 阮一峰《如何选择开源许可证》