写代码的工作领悟

别急于宣称找到bug

当你在一个软件中遇到问题时,除非你非常、非常的有根据,否则不要动辄声称找到了bug。提示:除非你能提供解决问题的源代码补丁,或者在前一版本的回归测试收集了足够的证据,否则你都不能够完全确信。对于网页和文档也如此,如果你声称发现了文档的「bug」,你应该提供可以替代的解决方案。

记住,还有许多用户并未经历你遇到的问题,否则你在阅读文档或搜索网页时早应该发现了(疑问:你在报怨前已经搜索过了,是吧?)。这也意味着很有可能是你弄错了,而不是软件本身有问题。

编写软件的人总会非常努力地优化修正这个软件。所以,如果你声称找到了bug,这是对他们能力的质疑,即使你是对的,也有可能会使某些人人感到不爽。此外,在标题中寻找「bug」也是相当不厚道的行为。

即使你私下已经非常确信发现一个真正的bug,你在提交问题时最好也写得像是你做错了什么。这样,如果是真有bug,你会在回复中获知,同时,维护者会向你道歉,这总比你无心破坏而欠下一个道歉要好。

如何提问关于代码的问题

不要直接要求别人给你修正代码,而应该提问如何入手解决这个问题,如果你一上来就一段几百行的代码,说你这里有bug提示出错,你能帮我找出来吗?这样的请求只会被直接无视,而如果你精简代码,明确地描述问题:在第七行以后,本应该显示,但实际出现的是,如何处理?这样就大大提高问题被回答的几率。

最精确描述代码问题的方法是提供一个能展现问题的最小测试样本。什么是最小测试样本?它是可以集中展现问题,只需要能够刚好重现问题的代码即可。如何生成一个最小测试样本?如果你知道哪一行或哪一段代码会产生问题,将其复制并提供刚好够用的外围支撑代码以构成一个完整的样本(够用是指源码刚好能被编译器、解释器或任何处理它的程序所接受)。如果你不能将问题缩小到特定的段落,复制源代码并去除那些与问题无关的代码段。你能提供的最小测试样例本越小越好(参见《浓缩精华》这一章节 )。

用最小测试样本去测试bug也并不是万能的,但这毕竟是一个很好的尝试,这有助于帮助你独立去解决问题,即使你找不到,黑客们也喜欢看到曾经你努力过,这将使他们跟你合作去解决这个问题。

如果你只是想让别人帮忙审核一下代码,在最开头就要说出来,并且一定要提到你认为哪一部分特别需要关注以及为什么

删除无意义的疑问

有的人喜欢在求助信息的末尾加上「有人能帮我吗?」或者「有没有答案?」这一类无意义的提问,应该在提问中尽量删除这些废话,理由如下:第一,如果问题本身描述的不完整,这些附加的东西就是废话。第二,因为它们提问的方式不对,黑客们会认为这些东西很烦,很有可能就会用逻辑上无误回复来敷衍你,诸如「是的,你可以得到帮助」和「不好意思,没有人能帮你」。

一般来说,避免提「是或非」问题,除非你想得到「是或非」回答。

不要把问题标记为「紧急」,即使你真的很紧急

「紧急」只是你的「紧急」,跟我们无关。同时,这些动辄「紧急」的提问往往欲速而不达,而且多数会被黑客们删掉,因为他们认为这是一种自私与鲁莽的提问方式:企图通过文字的简单修饰来引起别人注意而获得特殊的关照。

当然也有例外,如果你在知名度很高使用某些程序出现问题,你的提问很有可能让黑客们兴奋,在这种情况下,如果你有时间压力,并且很有礼貌地提出请求,黑客们会有兴趣尽快地回复你。

不过需要注意的一点是:这样提问是非常冒险的,因为黑客兴奋的标准和你的不同。譬如发个主题关于「国际空间站」帖子就可以得到关注,但是如果转发关于慈善或政治的帖子就几乎没人理你。再如「紧急:帮我救救这个毛绒绒的小海豹!」这样帖子在专业技术论坛让黑客看到了肯定会相当抓狂,即使他们认为拯救毛绒绒的小海豹很重要。

如果你觉得以上的解释难以理解,把剩下的内容多读几遍,直到弄懂了再发帖也不迟。

谦逊没害,而且有益

礼貌一点,使用「请」和「谢谢你的关注」或者「谢谢你的帮助」,让别人明白你的真诚,让他们觉得这样无偿的帮助你是值得的。

坦白讲,对黑客而言,在提问中使用正确的语法、清晰的文字、准确的内容,标准的格式远比使用礼节重要。黑客们一般宁可看文字锋利直白但技术鲜明的bug报告,也不要看那种彬彬有礼有礼但内容空洞含糊其辞的报告。(如果你不明黑客们为什么喜欢这样,那么你就要明白:黑客评价一个提问价值的标准在于这个问题能给他带来什么样的成长。)

然而,如果你已经清楚地描述了一个问题,客气礼貌一点肯定会增加你得到回复的机会。

(本文曾受到一些老黑客的指责,这也是本文的唯一受指责的地方,所以我们必须指出,我们曾经推荐使用「提前谢了」的感谢方式,这种感谢方式在一些黑客看来有一种事后不用再感谢任何人暗示和过河拆桥的味道,所以,我们现在的建议是:一、先说「提前谢了」,事后再表示对回复者的感谢;二、换一种表达方式,譬如用「谢谢你的关注」或「谢谢你的帮助」等。)

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

在问题解决后向所有帮助过的人回复一条信息,让他们知道问题是如何解决的并再次感谢。如果问题在论坛中受到广泛关注,在那里追加此信息比较恰当。

最理想的方式是向最初提问的主题中回复此消息,并在主题中注明「已解决」、「已搞定」或其它同等含义的字样[17]。这样,在信息快速流动的论坛中,一个注明「已解决」或「已搞定」的主题就会让别人节省很多时间,回复者不用再点进去重复回复(除非他觉得这个问题值得再商榷),因此他就可以用这些时间去解决其他问题。

追加的信息无须太冗厂繁复,一句简单的「你好,问题已解决,是网线坏了!谢谢大家──比尔」就比什么都没有要好。事实上,除非解决问题的过程很复杂,需要用得很高深的技术,否则就用一条简短亲切的总结来回复就好了,总结中说明用了什么方法,解决了什么问题,无需将整个解决问题的过程给写下来。

对于有深度的问题,建议给出一份完整解决该问题的方案,方案包括:问题的最终状态、用了什么方法、列出具体的步骤和和易出错的地方,这样才可以给到后来者一个完整的指引,注意不要将此方案搞成什么侦探推理小说。最后列出那些帮助过你的人的名字,那样你有可能会交到朋友。

这种后续的跟进信息不仅是礼貌的回复,而且是内容的分享,因为这些后续的解决方案会帮助其他有同样问题的人,他们会在论坛中找到你的解决方案,并因此受益。

最后,此类后续的信息跟进还让每位参与协助的人因问题的解决而产生一种满足感。如果你自己不是技术专家或黑客,相信我们,这种感觉对于你寻求帮助的老手和专家是非常重要的。问题的不了了之总会令人沮丧,但黑客们有强迫症,总渴望它们被解决,你的后续跟进就像是为他们消灭了一个眼中钉,并因此获得了一定的信誉的威望,这对你的下次提问非常有帮助。

考虑到将来也会有人面临类似的问题,如何避免重蹈覆辙呢?你可以自己写一篇文章或者对FAQ进行补充,然后发给项目的维护者。

在黑客交流的过程中,这种良好的后续跟踪行为比传统的礼貌更重要,这也是你善待他人赢得声誉的方式,这是非常有价值的经验和财富。

如何解读回答

RTFM[18]和STFW[19]:你为什么不去试一试?

有一个古老而神圣的惯例:如果你收到RTFM的回复,你就应该去「Read The Fucking Manual」,他说得对,去读一下吧。

「Read The Fucking Manual」(RTFM)有个年轻点的亲戚,如果你收到「Search The Fucking Web」(STFW)的回复,你也应该去「Search The Fucking Web」,他说得也对,去搜一下吧。(更温和一点的说法是「善用Google」)

在论坛,你也可能被要求去搜索论坛的存档记录。事实上,有人甚至可能热心到为你提供以前解决此问题的线索。但千万不要依赖这种帮助,你应该在提问前搜索一下存档。

通常的情况是,要求你主动去搜索的人已经打开了能解决你问题的手册或网页,他那时可能是一边在看屏幕一边敲着键盘回复「RTFM」或「STFW」,这些回复意味着:第一,你要的信息很容易找到。第二,自己动手,丰衣足食。

这不是一种是鄙视,按黑客的标准,回复者没有不理你,反而在耐心地回复你,这是对你提问的尊敬,你应该感谢他还像一个老奶奶一样唠唠叨叨地回复你。

如果还不明白……

如果你看不懂回答,不要马上发帖要求别人进行解释说明,你应该回过头去看看你提问时候试用过的工具(如手册、FAQ、网页、行业内朋友等),如果检查过后,你发现还是需要解释说明,你就要将已学的东西展现出来。

譬如,我告诉你:「看起来像是输入项有问题,你需要清除它」,接着是个不好的回帖示范:「什么是输入项?」(因为你没有主动在搜索引擎中搜查什么是输入项)。而以下就是一个很好的跟帖:「是的,我读了手册,某某输入项只在 -z 和 -p 开关中被提到,但都没有涉及到如何清除它们,你指的是哪一个还是我弄错了什么?」

对待无礼

很多黑客圈子中看似无礼的行为并不是存心冒犯。相反,它是直接了当、一针见血式的交流风格,这种风格对于更关注解决问题而不是使别人感觉舒服。

如果你觉得被冒犯了,试着平静地对待。如果有人真的做了过分的事,论坛中的老前辈会教训他。如果这些没有发生而你却恼火了,那么这些致使你恼火的言语可能在黑客社区中看来是正常的,而你将被视为有错的一方,这会让你丧失进一步获得信息或帮助的机会。

另一方面,如果你真的偶然地遇到了无礼和无聊的冲撞,你就要对真正的冒犯者予以狠狠的反击了,用犀利的语言将其驳得体无完肤都是可以接受的,然而,在行事之前一定要有非常肯定的证据。因为纠正无礼的言论与一场毫无意义的口水战仅一线之隔,黑客们自己莽撞地越线的情况也屡见不鲜。新手可能难免中枪。但如果你想得到的是信息和帮助,就不要浪费时间参与到口水战之中。

(有些人断言很多黑客都有轻度的自闭症或阿斯伯格综合症[20],缺少用于润滑人类社会「正常」社交所需的人脑回路。这既可能是真也可能是假。如果你不是黑客,也许你会认为我们脑袋有问题,以为还能帮助我们纠正那些古怪行为。如果你真的以为这么做会有效,你就只管这么做好了,我们不在乎。我们就喜欢现在这个样子,因我们会对那些所谓的「诊断」拥有正常的科学的健康的怀疑精神。

在下一节,我们会谈到另一个主题,当你犯错遭受到的指责该怎么办。

20、阿斯伯格综合症,是一种泛自闭症障碍,其重要特征是社交困难,伴随着兴趣狭隘及重复特定行为,但相较于其他泛自闭症障碍,仍相对保有语言及认知发展。

不要像loser那样去行事

常在河边走,哪有不湿鞋。在黑客论坛混,总有有犯错的时候,你的错误会被别人长篇大论的公开地揭露,或许在言语之中还会透露着鄙视和得意。

事后你能做的最坏的事莫过于哀怨你的遭遇、四处哭喊着被人诽谤、要求道歉、竭斯底里的呼喊、忍隐不做声、威胁诉诸法律、向他公司投诉、忘了关马桶盖等等,但实际上,以下的的几件事才是你应该去做的:

就让它这样过去,这是一件很正常的事情。事实上,这样的被人指出错误也没什么大不了,对自己反而是好事。

论坛社区的规则不会自行运转,它们是只能通过参与者通过积极公开的方式来执行维持。不要哭诉着要求将所有的批评和指责通过私下的邮件传达,这不是行之有效的运作方式,当有人在评论你的一个说法有误或者提出不同看法时,你坚持声称受到人身攻击,这也是没用的,这也是loser对待事情的态度。

也有一些黑客论坛愚蠢地执行过「高礼节要求」的规则,禁止参与者公开发表任何对别人观点挑错的文章,并发出「如果你不想帮助用户就闭嘴」的言论,结果造成大批有思想的参与者逃离此论坛,这个论坛就变成了一个毫无意义,絮絮叨叨,没有价值的技术论坛。

是要夸张的不切实际的「友好」还是坦诚直白的「实用」?你自己挑一个吧。

记着:当黑客说你犯错了,并且(无论说得多么尖锐地)告诉你别再这样做时,这表明他在为关心你和这个社区。对他而言,无视并拉黑要容易得多,如果你无法做到感谢,至少要有点自尊,别大声哀怨,别以一个敏感而莽撞的新手自居,更别指望别人能像对待一个波大无脑的女人一样去抚慰你。

有时候,即使你没有犯错(或者只是别人的臆想),有些人也会以莫须有的名义来指责你。在这种情况下,你的报怨倒是真的会把事情弄得更糟。

这些无事生非的人其实也没有多大的能耐,不是在吹牛逼的专家,就是一天到晚在唱反调的心理预测专家。总有读者有能力分辨,并想办法去对付他们,这些人在玩火自焚,你就不用操心了。

如果你在网络上不得不要面对一场争论,你得首先去确认一下自己是否犯错,如果你没有犯错,那么你就可以断定这是一场无聊的口水战,不要将自己卷入口水战之中,也最好不要理睬其他与你无关的口水战,因为这样争论不会有一个明确的结果。

三思而后问

下面是些典型的愚蠢问题和黑客不回答它们的原因和想法。

问:1、我到哪可以找到某程序或X资源?
问:2、我怎样用X做Y?
问:3、如何配置我的shell提示?
问:4、我可以用Bass-o-matic文件转换工具将AcmeCorp文档转为TeX格式吗?
问:5、我的{程序、配置、SQL 语句}不运行了。
问:6、我的Windows系统出问题了,你能帮个忙吗?
问:7、我的程序运行不了,我认为是系统工具X有问题。
问:8、我在安装Linux或X是遇到困难,你能帮个忙吗?
问:9、我如何才能破解超级用户口令/盗取操作员的特权/查看某人的电子邮件?
问:1、我到哪可以找到某程序或X资源?

答: 在我找到的地方啊,笨蛋!──你就不会在网页找么,真抓狂,难道还有人不知道如何使用Google吗?

问:2、我怎样用X做Y?

答:如果你想得出Y的结果,那么请不要在想得出Y的结果前提供X的方法,这样的问题表明提问者不但对X完全无知,也对Y了解不深,这个问题还表明提问者已经被某种思维定势禁锢住了,最好让他们将问题整理好再来提问。

问:3、如何配置我的shell提示?

答:如果你有足够的智慧提这个问题,你也该有足够的智慧去「Read The Fucking Manual」(RTFM),然后自己去找出来。

问:4、我可以用Bass-o-matic文件转换工具将AcmeCorp文档转为TeX格式吗?

答: 试试就知道了。如果你试过,你既知道答案,又不用浪费我的时间。

问:5、我的{程序、配置、SQL 语句}不运行了。

答: 这不是一个问题,我也没有兴趣去猜你有什么问题──我有更要紧的事要做。看到这种东西,我的反应一般如下:

你还有什么补充吗?
oh,太可惜了,希望你能搞定。
这跟我有什么关系?
问:6、我的Window系统出问题了,你能帮个忙吗?

答:可以,将Windows系统给卸了,装个开源操作系统,例如Linux或BSD[21]。

注意:你可以问与Windows系统相关的问题,前提是这个程序有Windows的官方版,不是我对Windows系统有偏见,而是Windows系统与大部分的软件存在兼容问题,而实际上Windows系统实在很差。

问:7、我的程序运行不了,我认为是系统工具X有问题。

答:这个程序被成千上万用户反复使用,你有可能是第一个提出这个程序有缺陷的人,不过你得要拿出具体的证明,最后有一份详细清晰的缺陷说明。

问:8、我在安装Linux或X是遇到困难,你能帮个忙吗?

答:不好意思,我帮不了你,我需要亲手操作你的电脑才能帮你排错,去向当地的Linux论坛寻求帮助吧。

注意:如果安装问题与某Linux发行版有关,请首先在论坛中提问。同时,应准确描述问题的细节。在此之前,先用 「linux」和所有被怀疑出问题的硬件 [作关键词] 仔细搜索。

问:9、我如何才能破解超级用户口令/盗取操作员的特权/查看某人的电子邮件?

答:想做这种事情说明你是个人品恶劣的家伙,想让黑客教你做这种事情说明你是个傻逼。

【本章注释】

21、这个回答可以视为一句吐槽,也可以视为一个建议,毕竟大多数黑客都是使用开源系统的。

好问题与坏问题

最后,我将通过举例来演示提问的智慧。同样的问题两种提法,一种愚蠢,另一种明智。

愚蠢:我在哪能找到关于Foonly Flurbamatic设备的东西?

这个问题在请求一个「Search The Fucking Web」(STFW) 式的回复。

明智:我用谷歌搜索过「Foonly Flurbamatic 2600」,但没有找到什么有用的信息,有谁知道在哪能找到这种设备的编程信息吗?

这个人已经搜索过网络了,而且听起来他可能真的遇到了问题。

愚蠢:我不能编译某项目的源代码,它为什么这么烂?

提问者预提了一个假设:是别人搞砸了,太狂妄自大了。

明智:某项目的源代码不能在某Linux 6.2版下编译。我读了常见问题文档,但其中没有与某Linux相关的内容。这是编译时的记录,我做错了什么吗?

提问者已经指明了运行环境,读了常见问题文档(FAQ),列出了错误,也没有假设问题是别人的过错,值得留意一下。

愚蠢:我的主板有问题,谁能帮我?

某黑客管理员对此的反应可能是:「是的,还需要帮你拍背和换尿布吗?」,然后是敲下删除键。

明智:我在S2464主板上试过X、Y和Z方法,当它们都失败后,又试了A、B和C方法。注意我试C时的奇怪症状,显然某某东西正在做某某事情,这并不是正常的现象。通常在Athlon MP主板上导致某某事情的原因是什么?有谁知道我还能再尝试什么方法以确定问题?

相反地,这个人的问题看来值得回答。他或她展现了解决问题的能力而不是坐等天上掉馅饼。

在最后那个问题中,注意「给我一个答案」与「请帮我看看我还能再做点什么测试以得到启发」之间细微但重要的差别。

事实上,最后那个问题基本上源于2001年8月Linux内核邮件列表(lkml)上的真实事件,是我(Eric)当时提了那个问题,我发现Tyan S2462主板有神秘的死机现象,邮件列表成员给我提供了解决此问题的关键信息。

通过这种提问方式,我给了别人可以深思玩味的东西。我设法使之对参与者既轻松又有吸引力,也表明了对同行能力的尊敬并邀请他们与我一起协商。通过告诉他们我已经走过的弯路,我还表明了对他们宝贵时间的尊重。

事后,当我感谢大家并评论这次良好的经历时,一个Linux内核邮件列表的成员谈到,他认为我得到答案并不是因为我的名字挂在列表上,而只是因为我正确的提问方式。

黑客们在某种层面上貌似是非常冷漠无情的精英分子。我想在这事上他是对的,如果我表现得像个不劳而获的寄生虫,不管我是谁都会被忽略或斥责。他建议将整个事件作为对其它人提问的指导,这直接导致了本文的编写。

如果得不到回答

如果得不到回答,请不要认为我们不想帮你,有时的确是因为被问到的小组成员不知道答案。没有回复不等于不被无视,当然,必须承认从外部很难看出两者的差别。

一般而言,不要在再重复发表这个问题,这会被视为毫无意义的骚扰。耐心一点,知道你问题答案的人可能生活在不同的时区,有可能正在睡觉,也有可能你的问题一开始就没有组织好。

还有其它信息源可以寻求帮助,例如一些面向新手的资源区。

有许多在线与本地的用户组织,虽然他们自己不编写任何软件,但是他们对软件很忠诚热心。这些用户组通常因互助和帮助新手而形成。

还有众多大小商业公司提供签约支持服务(红帽与SpikeSource是两家最出名的,还有许多其它的)。别因为要付点钱才有支持就感到沮丧!毕竟,如果你车子的汽缸垫烧坏了,你还是得花钱找个修理店把它弄好。同理,即使软件没花你一分钱,你总不能指望他的服务支持都是免费的。

象Linux这样流行的软件,每个开发版至少有一万个以上的用户,一个人不可能应付这么多用户的服务要求。即使你必须付费才能得到支持,也比你还得额外花钱买软件要少得多(封闭源代码软件的服务支持与开源软件相比通常还要贵一点,也要差一点)。

如何更好地回答

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

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

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

如果你帮不了忙,也不要帮倒忙。不要在具体步骤上开玩笑,有些可怜的新手会把它当成真的指令,那样也许会毁了用户的安装进程。

探索性的疑问可以引出更多的细节。如果你问题问得好,你也可以学到点东西。试试将很差的问题转变成好问题,别忘了我们曾经都是新手。

尽管对那些懒人敷衍一句「Read The Fucking Manual」(RTFM)是正当的,但是指出文档的位置(或者给出一个搜索关键词)会更好

如果你决定回答一个问题,请尽可能详尽地提供一个好答案。当别人正在用错误的工具或方法时,别给出一个权宜之计,应推荐一个更好的工具,重新组织这个问题。

提供一个可操作的回答建议!如果回答者已经详细地研究过问题,并且已经测试过X、 Y, Z, A、B、和C方法,均没有得出一个满意的结果,这表明简单地回复「请尝试X或者Y方法」或提供一个链接是没有用的,你要给出一个可操作的详细的操作步骤。

让你所在的社区或论坛也从学习中获益。当回复一个好问题时,问问自己「如何修改相关文件或FAQ文档以免再次解答同样的问题?」,接着再向社区或论坛维护者发一份补充说明。

如果你的答案是在研究一番后得出的,请展现你的解题技巧而不是直接端出结果,毕竟「授人以鱼,不如授人以渔」。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值