提问的智慧

艾瑞克.史蒂文.雷蒙德(Eric Steven Raymond)

瑞克.莫恩(Rick Moen)

版权©2001, 2006 Eric S. Raymond, Rick Moen

 

修订历史
修订版 3.9 2013年4月23日 esr
修正链接
修订版 3.8 2012年6月19日 esr
修正链接
修订版 3.7 2010年12月6日 esr
对于英语为第二语言人士的有益建议
修订版 3.7 2010年11月2日 esr
几种翻译不见了
修订版 3.6 2008年3月19日 esr
小更新及新链接
修订版 3.5 2008年1月2日 esr
勘误及一些翻译链接
修订版 3.4 2007年3月24日 esr
新章节:“关于代码的问题”
修订版 3.3 2006年9月29日 esr
增加凯.尼格曼(Kai Niggemann)的一个好建议
修订版 3.2 2006年1月10日 esr
加入瑞克.莫恩(Rick Moen)编写的内容
修订版 3.1 2004年10月28日 esr
文档“谷歌是你的朋友!”
修订版 3.0 2004年2月2日 esr
主要新增在网页论坛应有的礼节

 


原文How To Ask Questions The Smart Way

翻译:王刚 <yafrank at 126 dot com>    
时间:2013年10月26日

内容

译文
弃权申明
引言
提问前
提问时
仔细挑选论坛
面向新手的论坛和互联网中继聊天(IRC)通常响应最快
第二步,使用项目的邮件列表
使用有意义且明确的主题
使问题容易回复
用清晰、语法、拼写正确的语句书写
使用易于读取且标准的文件格式发送问题
描述问题应准确且有内容
量不在多,精炼则灵
别急于宣称找到臭虫
低声下气代替不了做自己的家庭作业
描述问题症状而不是猜测
按时间先后罗列问题症状
描述目标而不是过程
别要求私下回复电邮
提问应明确
关于代码的问题
别张贴家庭作业式问题
删除无意义的要求
不要把问题标记为“紧急”, 即使对你而言的确如此
礼貌总是有益的
问题解决后追加一条简要说明
如何解读回答
“读读该死的手册”(RTFM)和“搜搜该死的网络”(STFW):如何明白你已完全搞砸
如果还不明白……
对待无礼
别象失败者那样反应
提问禁忌
好问题与坏问题
如果得不到回答
如何更好地回答
相关资源
鸣谢

弃权申明

 

 

 

许多项目的网站在如何取得帮助的部分链接了本文,这没有关系,也正是我们想要的。但如果你是该项目生成此链接的网管,请在链接附近显著位置注明:我们不提供该项目的服务支持!

我们已经领教了没有此说明带来的痛苦,我们将不停地被一些白痴纠缠,他们认为既然我们发布了本文,那么我们就有责任解决世上所有的技术问题。

如果你是因为需要帮助正在阅读本文,然后就带着可以直接从作者那取得帮助的印象离开,那么 就不幸成了我们所说的白痴之一。 别向 我们 提问,我们不会理睬的。 我们只是在这教你如何从那些真正懂得你软硬件问题的人那里取得帮助,但 99.9% 的时间我们不会是那些人。除非你非常地 确定 本文的作者是你遇到问题方面的专家,请不要打搅,这样大家都更开心一点。

 

引言

 

 

 

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

开源程序的应用已经很广,你通常可以从其他更有经验的用户而不是黑客那里得到解答。这是好事,他们一般对新手常有的毛病更容忍一点。然尔,使用我们推荐的方法,象对待黑客那样对待这些有经验的用户,通常能最有效地得到问题的解答。

第一件需要明白的事是黑客喜欢难题和激发思考的好问题。假如不是这样,我们也不会写本文了。如果你能提出一个有趣的问题让我们咀嚼玩味,我们会感激你。好问题是种激励与礼物,帮助我们发展认知,揭示没有注意或想到的问题。在黑客中,“好问题!” 是非常热烈而真挚的赞许。

此外,黑客还有遇到简单问题就表现出敌视或傲慢的名声。有时,我们看起来还对新手和愚蠢的家伙有条件反射式的无礼,但事情并不真是这样。

我们只是毫无歉意地敌视那些提问前不愿思考、不做自己家庭作业的人。这种人就象时间无底洞──他们只知道索取,不愿意付出,他们浪费了时间,这些时间本可用于其它更有趣的问题或更值得回答的人。我们将这种人叫做 “失败者(loser)” (由于历史原因,我们有时将“loser”拼写为“lusers” 。)

我们意识到许多人只是想使用我们写的软件,他们对学习技术细节没有兴趣。对大多数人而言,计算机只是种工具,是种达到目的的手段而已。他们有自己的生活并且有更要紧的事要做,我们承认这点,也从不指望每个人都对这些让我们着迷的技术问题感兴趣。不过,我们回答问题的风格是为了适应那些真正对此有兴趣并愿意主动参与解决问题的人,这一点不会变,也不该变。如果连这都变了,我们就会在自己能做得最好的事情上不再那么犀利。

我们(大多数)是自愿者, 从自己繁忙的生活中抽时间来回答问题,有时会力不从心。因此,我们会毫不留情地滤除问题,特别是那些看起来象是失败者提的,以便更有效地把回答问题的时间留给那些胜利者。

如果你认为这种态度令人反感、以施惠者自居或傲慢自大,请检查你的假设,我们并未要求你屈服──事实上,假如你做了该做的努力,我们中的大多数将非常乐意平等地与你交流,并欢迎你接纳我们的文化。试图去帮助那些不愿自救的人对我们简直没有效率。不懂没有关系,但愚蠢地做事不行。

所以,你不必在技术上很在行才能吸引我们的注意,但你 必须 表现出能引导你在行的姿态──机 敏、有想法、善于观察、乐于主动参与问题的解决。如果你做不到这些使你与众不同的事情,我们建议你付钱跟别人签商业服务合同,而不是要求黑客无偿帮助。

如果你决定向我们求助,你不会想成为一名失败者,你也不想被看成一个失败者。得到快速有效回答的最好方法是使提问者看起来象个聪明、自信和有想法的人,并且暗示只是碰巧在某一特别问题上需要帮助。

(欢迎对本文指正,可以将建议发至 [email protected][email protected]
请注意,本文不想成为一般性的 网络礼仪 指南,我一般会拒绝那些与引出技术论坛中有用的回答不特别相关的建议。)

 

提问

 

 

 

在通过电邮、新闻组或论坛提技术问题以前,做以下事情:

  1. 尝试在你准备提问论坛的历史文档中搜索答案

  2. 尝试搜索互联网以找到答案

  3. 尝试阅读手册以找到答案

  4. 尝试阅读“常见问题文档”(FAQ)以找到答案

  5. 尝试自己检查或试验以找到答案

  6. 尝试请教懂行的朋友以找到答案

  7. 如果你是程序员,尝试阅读源代码以找到答案

提问时,请先表明你已做了上述事情,这将有助于建立你不是寄生虫与浪费别人时间的印象。最好再表述你从中 学到的东西 ,我们喜欢回答那些表现出能从答案中学习的人。

运用某些策略,比如用谷歌(Google)搜索你遇到的各种错误提示(既搜索 谷歌论坛,也搜索网页), 这样很可能直接就找到了解决问题的文档或邮件列表线索。 即使没有结果,在邮件列表或新闻组寻求帮助时提一句“我在谷歌中搜过下列句子但没有找到什么有用的东西” 也是件好事,至少它表明了搜索引擎不能提供哪些帮助。将搜索关键词与你的问题及可能的解决方案联系起来,还有助于引导其他有类似问题的人。

别着急,不要指望几秒钟的谷歌搜索就能解决一个复杂的问题。读一下常见问题文档。在向专家提问之前,先向后靠靠放松一下,再思考一下问题。相信我们,他们能从你的提问看出你做了多少阅读与思考,如果你是有备而来,将更有可能得到解答。不要将所有问题一股脑抛出,只因你的第一次搜索没有结果(或者结果太多)。

认真地思考,准备好你的问题。轻率的提问只能得到轻率的回答,或者压根没有。在提问时,你越是表现出在此前做过思考与努力去解决自己的问题,你越有可能得到真正的帮助。

注意别提错问题。如果提问基于错误的假设,某黑客多半会一边想 “愚蠢的问题……”,一边按将错就错的答案回复你,并且希望这种只是得到你自己“问的问题”而非真正所需的解答,给你一个教训。

永远不要假设你 有资格 得到解答。你没有这种资格,毕竟你没有为此服务付费。如果你能够提出有内容、有趣和激励思考的问题──那种毫无疑问能够向社区贡献经验,而不仅仅是消极地要求从别人那获取知识的问题,你将“挣到”答案。

另一方面,表明你有能力也乐意参与问题的解决是个很好的开端。“有没有人能指个方向?”,我这还差点什么?”,“我应该查哪个网站?”,通常要比 “请给出我可以用的完整步骤”更容易得到回复,因为你表明了只要有人能指个方向,你就很乐意完成剩下的过程。

 

提问时

 

 

 

仔细挑选论坛

 

 

 

要对在哪提问留心,如果你做了下述事情,多半会被一笔勾销或被看成“失败者”:

  • 张贴与论坛主题无关的问题

  • 在面向高级技术问题的论坛上张贴肤浅的问题,或者反之。

  • 在太多不同的新闻组同时张贴

  • 给既非熟人也没有义务解决你问题的人发送你私人的电邮

为保护通信的渠道不被无关的东西淹没,黑客会除掉那些没有找对地方的问题,你不会想让这种事落到自己头上的。

因此,第一步是找对论坛。谷歌和其它搜索引擎还是你的朋友,可以用它们搜索你遇到困难的软硬件问题最相关的项目网站。那里通常都有项目的常见问题(FAQ)、邮件列表及文档的链接。如果你的努力(包括 阅读 FAQ)都没有结果,这些邮件列表就是最后能取得帮助的地方。项目的网站也许还有报告臭虫的流程或链接,如果是这样,去看看。

向陌生的人或论坛发送邮件极有可能是在冒险。譬如,不要假设一个内容丰富的网页的作者想充当你的免费顾问,不要对你的问题是否会受到欢迎做太乐观的估计──如果你不确定,向别处发或者压根别发。

在选择论坛、新闻组或邮件列表时,别太相信名字,先看看 FAQ 或者许可书以明确你的问题是否切题。发贴前先翻翻已有的帖子,这样可以让你感受一下那里行事的方式。事实上,张贴前在新闻组或邮件列表的历史文档中搜索与你问题相关的关键词是个极好的主意,也许就找到答案了。即使没有,也能帮助你归纳出更好的问题。

别象机关枪似的一次性“扫射”所有的帮助渠道,这就象大喊大叫一样会令人不快,温柔地一个一个来。

弄懂主题!最典型的错误之一是在某种致立于跨平台可移植的语言、库或工具的论坛中提关于 Unix 或 Windows 操作系统程序接口的问题。如果你不明白为什么这是大错,最好在搞清楚概念前什么也别问。

一般来说,在仔细挑选的公共论坛中提问比在私有论坛中提同样的问题更容易得到有用的回答。有几个道理支持这点,一是看潜在的回复者有多少,二是看论坛的参与者有多少,黑客更愿回答能启发多数人的问题。

可以理解,老练的黑客和一些流行软件的作者正在承受过多的不当消息。就象那根最后压垮骆驼背的稻草一样,你的加入也有可能使情况走向极端──已经好几次了,一些流行软件的作者退出了对自己软件的支持,因为伴随而来的涌入其私人邮箱的垃圾邮件变得无法忍受。

 

面向新手的论坛和互联网中继聊天(IRC)通常响应最快

 

 

 

本地的用户组织或者你所用的 Linux 发行版也许正在宣传新手取得帮助的论坛或 IRC 通道(在一些非英语国家,新手论坛很可能还是邮件列表),这些地方是开始提问的好去处,特别是当你觉得遇到的也许只是相对简单或者很普通的问题时。经过宣传的 IRC 通道是公开邀请提问的地方,通常可以得到实时的回复。

事实上,如果出问题的程序来自某发行版(这很常见),最好先去该发行版的论坛或邮件列表中提问,再到程序本身的项目论坛或邮件列表,(否则)该项目的黑客可能仅仅回复“ 我们的 代码”。

在任何论坛发贴以前,先看看有没有搜索功能。如果有,就试着用问题的几个关键词搜索一下,也许就有帮助。如果在此之前你已做过全面的网页搜索(你应该这样去做),还是再搜索一下论坛,搜索引擎有可能没来得及索引此论坛的全部内容。

通过论坛或 IRC 通道提供项目的用户支持有增长的趋势,电子邮件交流则更多地为项目开发者保留。所以先在论坛或 IRC 中寻求与该项目相关的帮助。

 

第二步,使用项目的邮件列表

 

 

 

当某个项目存在开发者邮件列表时,要向列表而不是其中的个别成员提问,即使你确信他能最好地回答你的问题。查一查项目的文档和主页,找到项目的邮件列表并使用它。采用这种办法有几个很好的理由:

  • 向个别开发者提的问题(如果)足够好,也将对整个项目组有益。相反,如果你认为自己的问题对整个项目组来说太愚蠢,这也不能成为骚扰个别开发者的理由。

  • 向列表提问可以分散开发者的负担,个别开发者(尤其是项目领导)也许太忙以至于没法回答你的问题。

  • 大多数邮件列表都要存档,那些存档将被搜索引擎索引,如果你向列表提问并得到解答,将来其它人可以通过网页搜索找到你的问题和答案,也就不用再次发问了。

  • 如果某些问题经常被问到,开发者可以利用此信息改进文档或软件本身,以使其更清楚。如果只是私下提问,就没有人能看到最常见问题的完整场景。

如果一个项目既有 “用户” 也有“开发者”(或 “黑客”)邮件列表或论坛,而你又不摆弄那些代码,向“用户”列表或论坛提问。不要假设自己会在开发者列表中受到欢迎,那些人多半会遭受你的噪音干扰。

然尔,如果你 确信 你的问题不一般,而且在“用户” 列表或论坛中几天都没有回复,可以试试“开发者”列表或论坛。建议你在张贴前最好先暗暗地观察几天,至少看看最近几天保存的帖子,以了解那的行事方式(事实上这是参与任何私有或半私有列表的好主意)

如果你找不到一个项目的邮件列表,而只能查到项目维护者的地址,只管向其发信。即便在这种情况下,也别假设(项目)邮件列表不存在。在你的电子邮件中陈述你已经试过但没有找到合适的邮件列表,也提及你不反对将自己的邮件转发给他人(许多人认为,即使没什么秘密,私人电子邮件也不应该被公开。通过允许将你的电子邮件转发他人,你给了相应人员处置你邮件的选择)。

 

使用有意义且明确的主题

 

 

 

在邮件列表、新闻组或论坛中,主题是你在五十个或更少的字以内吸引有资格专家注意的黄金机会,不要用诸如 “请帮我” (更别提大写的 “请帮我!!!!”,这种主题的消息会被条件反射式地删掉)之类的唠叨浪费机会。不要用你痛苦的深度来打动我们,相反,要在这点空间中使用超级简明扼要的问题描述。

使用主题的好惯例是“对象──偏差”(式的描述),许多技术支持组织就是这样做的。在“对象”部分指明是哪一个或哪一组东西有问题,在“偏差”部分则描述与期望的行为不一致的地方。

愚蠢:

救命啊!我的笔记本视频工作不正常!

明智:

X.org 6.8.1 扭曲鼠标光标,MV1005 型号的某显卡芯片组

更明智:

使用 MV1005 型号的某显卡芯片组在 X.org 6.8.1 的鼠标光标被扭曲

编写 “对象──偏差”式描述的过程有助于你组织对问题的细致思考。是什么被影响了?仅仅是鼠标光标或者还有其它图形?只在 X.org 中出现?或只是在其 6.8.1 版中?是针对某显卡芯片组?或者只是其中的 MV1005 型号?一个黑客只需描一眼就能够立即明白什么是你遇到的问题,什么是你自己的问题。

更一般地,想象一下在一个只显示主题的文档索引中查找。让你的主题更好地反映问题,可以使下一个搜索类似问题的人能够在文档中直接就找到答案的线索,而不用再次发贴提问。

如果你想在回复中提问,确保改变主题以表明你是在问一个问题,一个主题象 “Re: 测试” 或者 “Re: 新臭虫”的消息不太可能引起足够的注意。同时,将回复中与新主题不甚相关的引用内容尽量删除。

对于列表消息,不要直接点击回复(按钮)来开始一个全新的线索,这将限制你的观众。有些邮件阅读程序,比如 mutt,允许用户按线索排序并通过折叠线索来隐藏消息,这样做的人永远看不到你发的消息。

仅仅改变主题还不够。mutt 和其它一些邮件阅读程序还要检查邮件头主题以外的其它信息,以便为其指定线索,所以宁可发一个全新的邮件。

在论坛,因为消息与特定的线索紧密结合,并且通常在线索之外不可见,好的提问方式略有不同,通过回复提问并不要紧。不是所有论坛都允许在回复中出现分离的主题,而且这样做了基本上没有人会去看。不过,通过回复提问本身就是令人怀疑的做法,因为它们只会被正在查看该线索的人读到。所以,除非你 只想 在该线索当前活跃的人群中提问,还是另起炉灶比较好。

 

使问题容易回复

 

 

 

以“请向……回复”来结束问题多半会使你得不到回答。如果你觉得花几秒钟在邮件客户端设置一下回复地址都麻烦,我们也觉得花几秒钟考虑你的问题更麻烦。如果你的邮件客户端程序不支持这样做,换个好点的;如果是操作系统不支持所有这种邮件客户端程序,也换个好点的。

在论坛,要求通过电子邮件回复是完全无礼的,除非你确信回复的信息也许是敏感的(而且有人会为了某些未知的原因,只让你而不是整个论坛知道答案)。如果你只是想在有人回复线索时得到电子邮件提醒,可以要求论坛发送。几乎所有论坛都支持诸如“留意本线索”、“有回复发送邮件”等功能。

 

用清晰、语法、拼写正确的语句书写

 

 

 

经验告诉我们,粗心与草率的作者通常也粗心与草率地思考和编程(我敢打赌)。为这些粗心与草率的思考者回答问题没有什么好处,我们宁可将时间花在其它地方。

清楚、良好地表达你的问题非常重要。如果你觉得这样做麻烦,我们也觉得注意(你的问题)麻烦。花点额外的精力斟酌一下字句,用不着太僵硬与正式──事实上,黑客文化很看重能准确地使用非正式、俚语和幽默的语句。但它 必须 很准确,而且有迹象表明你是在思考和关注问题。

正确地拼写、使用标点和大小写,不要将“its”混淆为“it's”,“loose”搞成“lose”或者将“discrete”弄成 “discreet”。不要全部用大写,这会被视为无礼的大声嚷嚷 (全部小写也好不到哪去,因为不易阅读。Alan Cox [注:著名黑客,Linux 内核的重要参与者] 也许可以这样做,但你不行。)

一般而言,如果你写得象个半文盲似的傻子,多半得不到理睬。也不要使用即时通讯中的简写,如将“you”简化为“u”会使你看起来象一个为了节约二次击键的半文盲式的傻子。更糟的是,如果象个小孩似地鬼画桃符那绝对是在找死,可以肯定没人会理你(或者最多是给你一大堆指责与挖苦)。

如果在非母语论坛提问,你的拼写与语法错误会得到有限的宽容,但懒惰完全不会被容忍(是的,我们通常看得出其中的差别)。同时,除非你知道回复者使用的语言,请使用英语书写。繁忙的黑客一般会直接删除用他们看不懂语言写的消息。在互联网上英语是工作语言,用英语书写可以将你的问题不被阅读就被直接删除的可能性降到最低。

 

如果你用英语书写但它是你的第二语言,最好提醒潜在的回复者语言上可能的困难以便绕过这个问题,比如:

  • 英语不是我的母语,请谅解拼写错误。

  • 如果您使用某某语言,请电邮/私聊我,也许我需要您的协助翻译我的问题。

  • 对于这个技术术语本身我很熟悉,但对于它的一些俚语或习惯表达方式就不太明白了。

  • 我已经同时用某某语及英语提问,如果您使用两者之一回复,我很乐意翻译。

 

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

 

 

 

如果你人为地将问题搞得难以阅读,它多半会被忽略,人们更愿读易懂的问题,所以:

  • 使用纯文本而不是 HTML(超文本标注语言)( 关闭HTML 并不难)

  • 使用 MIME(多用途互联网邮件扩展)附件通常没有问题,前提是真正有内容(譬如附带的源文件或补丁),而不仅仅是邮件客户端程序生成的模板(譬如只是消息内容的拷贝)。

  • 不要发送整段只是单行句子但多次折回的邮件(这使得回复部分内容非常困难)。设想你的读者是在80个字符宽的文本终端阅读邮件,设置你的行折回点小于 80 列。

  • 但是,也 不要 用任何固定列折回数据(譬如日志文件拷贝或会话记录)。数据应该原样包含,使回复者确信他们看到的是与你看到的一样的东西。

  • 在英语论坛中,不要使用'Quoted-Printable' MIME 编码发送消息。这种编码对于张贴非 ASCII 语言可能是必须的,但很多邮件程序并不支持。当它们分断时,那些文本中四处散布的 “=20”符号既难看也分散注意力,甚至有可能破坏内容的语意。

  • 永远不要 指望黑客们阅读使用封闭的专用格式编写的文档,诸如微软公司的 Word 或 Excel 文件等。大多数黑客对此的反应就象有人将还在冒热气的猪粪倒在你门口时你的反应一样。即使他们能够处理,也很厌恶这么做。

  • 如果你从使用视窗的电脑发送电子邮件,关闭问题颇多的微软“聪明引用”功能(在“工具” -> “自动纠正选项”的“输入时自动格式化”下去掉聪明引用的选框),以免在你的邮件中到处散布垃圾字符。

  • 在论坛,勿滥用“表情符号”和“HTML”功能(当它们提供时)。一两个表情符号通常没有问题,但花哨的彩色文本倾向于使人认为你是个无能之辈。过滥地使用表情符号、色彩和字体会使你看来象个傻笑的小姑娘。这通常不是个好主意,除非你只是对性而不是有用的回复更有兴趣。

如果你使用图形用户界面的邮件客户端程序(如网景公司的 Messenger、微软公司的 Outlook 或者其它类似的),注意它们的缺省配置不一定满足这些要求。大多数这类程序有基于菜单的“查看源码”命令,用它来检查发送文件夹中的消息,以确保发送的是没有多余杂质的纯文本文件。

 

描述问题应准确且有内容

 

 

 

  • 仔细、清楚地描述问题的症状

  • 描述问题发生的环境(主机、操作系统、应用程序,任何相关的),提供销售商的发行版和版本号(如:“Fedora Core 7”、“Slackware 9.1”等)

  • 描述提问前做过的研究及其理解。

  • 描述提问前为确定问题而采取的诊断步骤。

  • 描述最近对计算机或软件配置的任何相关改变。

  • 如果可能,提供在可控环境下重现问题的方法。

尽最大努力预测黑客会提到的问题,并提前备好答案。

如果你认为是代码有问题,向黑客提供在可控环境下重现问题的方法尤其重要。当你这么做时,得到有用且及时回复的可能性将大大增加。

西蒙.泰瑟姆(Simon Tatham)写过一篇 如何有效报告臭虫 的文章,我强烈推荐各位阅读。

 

量不在多,精炼则灵

 

 

 

你应该(写得)精炼且有内容,简单地将一大堆代码或数据罗列在求助消息中达不到目的。如果你有一个很大且复杂的测试样例让程序崩溃,尝试将其裁剪得越小越好。

至少有三个理由支持这点。第一,让别人看到你在努力简化问题使你更有可能得到回复。第二,简化问题使你更有可能得到 有用的 回复。第三,在提纯臭虫报告的过程中,你可能自己就找到了解决办法或权宜之计。

 

别急于宣称找到臭虫

 

 

 

当你在一个软件中遇到问题,除非你 非常、非常 的有根据,不要动辄声称找到了臭虫。提示:除非你能提供解决问题的源代码补丁,或者对前一版本的回归测试表现出不正确的行为,否则你都多半不够完全确信。对于网页和文档也如此,如果你(声称)发现了文档的“臭虫”,你应该能提供相应位置的替代文本。

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

编写软件的人总是非常辛苦地使它尽可能完美。如果你声称找到了臭虫,也就置疑了他们的能力,即使你是对的,也有可能会使其中的部分人感到不快。(此外,)在主题中嚷嚷“臭虫”也是特别不老练的。

提问时,即使你私下非常确信已经发现一个真正的臭虫,最好写得象是做错了什么。如果真的有臭虫,你会在回复中看到这点。这样做的话,如果真有虫子,维护者就会向你道歉,这总比你弄砸了然后欠别人一个道歉要强。

 

低声下气代替不了做自己的家庭作业

 

 

 

有些人明白他们不应该粗鲁或傲慢地行事并要求得到答复,但他们退到相反的低声下气的极端:“我知道我只是个可怜的新丁,一个失败者,但……”。这既使人困扰,也没有用,当伴随着对实际问题含糊的描述时还特别令人反感。

别用低级灵长类动物的办法浪费你我的时间,相反,尽可能清楚地描述背景情况和你的问题,这比低声下气更好地摆正了你的位置。

有时,论坛设有单独的初学者提问版面,如果你真的认为遇到了肤浅的问题,到那去就是了,但一样别低声下气。

 

描述问题症状而不是猜测

 

 

 

告诉黑客是什么导致了问题是没用的(如果你的诊断理论是了不起的东西,你还会向别人咨询求助吗?)。所以,确保只是告诉他们问题的原始症状,而不是你的解释和理论,让他们来解释和诊断。如果你认为陈述自己的猜测很重要,应清楚地说明这只是你的猜测并描述为什么它们不起作用。

愚蠢:

我在编译内核时接连遇到 SIG11 错误,怀疑主板上的某根电路丝断了,找到它们的最好办法是什么?

明智:

我组装的电脑(K6/233 CPU、FIC-PA2007 主板[威盛 Apollo VP2 芯片组]、Corsair PC133 SDRAM 256Mb 内存)最近在开机 20 分钟左右、做内核编译时频繁地报 SIG11 错,但在头 20 分钟内从不出问题。重启动不会复位时钟,但整夜关机会。更换所有内存未解决问题,相关的典型编译会话日志附后。

由于以上这点许多人似乎难以掌握,这里有句话可以提醒你:“所有的诊断专家都来自密苏里州”。美国国务院的官方座右铭则是“让我看看”(出自国会议员威勒德.D.范迪弗[Willard D. Vandiver]在1899年时的讲话:“我来自一个出产玉米、棉花、牛蒡和民主党人的国家,滔滔雄辩既不能说服我,也不会让我满意。我来自密苏里州,你必须让我看看。”)针对诊断者而言,这并不是怀疑,而只是一种真实而有用的需求,以便让他们看到与你看到的原始证据尽可能一致的东西,而不是你的猜测与总结。(所以,)让我们看看。

按时间先后罗列问题症状

 

刚出问题之前发生的事情通常包含有解决问题最有效的线索。所以,记录中应准确地描述你、电脑和软件在崩溃前都做了什么。在命令行处理的情况下,有会话日志(如运行脚本工具生成的)并引用相关的若干(如20)行记录会非常有帮助。

如果崩溃的程序有诊断选项(如-v详述开关),试着选择这些能在记录中增加排错信息的选项。记住,“多”不等于“好”。试着选取适当的排错级别以便提供有用的信息而不是将阅读者淹没在垃圾中。

如果你的记录很长(如超过四段),在开头简述问题随后按时间先后罗列详细过程也许更有用。这样,黑客在读你的记录时就知道该注意哪些内容了。

 

描述目标而不是过程

 

 

 

如果你想弄清楚如何做某事(而不是报告一个臭虫),在开头就描述你的目标,然后才陈述遇到问题的特定步骤。

经常出现这种情况,寻求技术帮助的人在脑袋里有个更高层次的目标,他们在自以为能达到目标的特定道路上被卡住了,然后跑来问该怎么走,但没有意识到这条路本身有问题,结果要费很大的劲才能通过。

愚蠢:

我怎样才能让某图形程序的颜色拾取器取得十六进制的 RGB 值?

明智:

我正试着用自己选定数值的颜色替换一幅图片的色表,我现在知道的唯一方法是编辑每个表槽,但却无法让某图形程序的颜色拾取器取得十六进制的 RGB 值。

第二种提法是明智的,它使得建议采用更合适的工具以完成任务的回复成为可能。

 

别要求私下回复电邮

 

 

 

黑客们认为问题的解决过程应该公开、透明,此过程中如果更有才能的人注意到不完整或者不当之处,最初的回复才能够、也应该被纠正。同时,作为回复者也因为能力和学识被其它同行看到而得到某种回报。

当你要求私下回复时,此过程和回报都被中止。别这样做,让 回复者 来决定是否私下回答──如果他真这么做了,通常是因为他认为问题编写太差或者太肤浅,以至于对其它人毫无意义。

对这条规则存在一条有限的例外,如果你确信提问可能会引来大量雷同的回复时,那么“向我发电邮,我将为论坛归纳这些回复”将是神奇的句子。试着将邮件列表或新闻组从洪水般雷同的回复中解救出来是非常有礼貌的──但你必须信守诺言。

 

提问应明确

 

 

 

漫无边际的问题通常也被视为没有明确限制的时间无底洞。最有可能给你有用答案的人通常也是最忙的人(假如只是因为他们承担了太多工作的话),这些人对于没有止境的时间无底洞极其敏感,所以他们也倾向于讨厌那些漫无边际的问题。

如果你明确了想让回复者做的事(如指点方向、发送代码、检查补丁或其它),你更有可能得到有用的回复。(因为)这样可以让他们集中精力并间接地设定了他们为帮助你需要花费的时间和精力上限,这很好。

要想理解专家生活的世界,可以这样设想:那里有丰富的专长资源但稀缺的响应时间。你暗中要求他们奉献的时间越少,你越有可能从这些真正懂行也真正很忙的专家那里得到解答。

所以限定你的问题以使专家回答时需要付出的时间最少──这通常与简化问题还不太一样。举个例,“请问可否指点一下哪有好一点的 X 解释?”通常要比“请解释一下 X”明智。如果你的代码不运行了,通常请别人看看哪有问题比叫他们帮你改正更明智。

 

关于代码的问题

 

 

 

别要求他人给你出问题的代码排错而不提及应该从何入手。张贴几百行的代码,然后说一声“它不能运行”会让你得不到理睬。只贴几十行代码,然后说一句“在第七行以后,本应该显示<x>,但实际出现的是<y>”非常有可能让你得到回复。

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

生成一个非常小的最小测试样例并不总是可能,但尽力去做是很好的锻练,这有可能帮助你找到需要自己解决的问题。即使你找不到,黑客们喜欢看到你努力过,这将使他们更合作。

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

 

别张贴家庭作业式问题

 

 

 

黑客们善于发现“家庭作业”式的问题。我们中的大多数人已经做了自己的家庭作业,那是该做的,以便从中学到东西。问一下提示没有关系,但不是要求完整的解决方案。

如果你怀疑自己碰到了一个家庭作业式的问题,但仍然无法解决,试试在用户组、论坛或(作为最后一招)在项目的“用户”邮件列表或论坛中提问。尽管黑客们看出来,一些老用户也许仍会给你提示。

 

删除无意义的要求

 

 

 

抵制这种诱惑,即在求助消息末尾加上诸如“有人能帮我吗?”或“有没有答案?”之类在语义上毫无意义的东西。第一,如果问题描述还不完整,这些附加的东西最多也只能是多余的。第二,因为它们是多余的,黑客们会认为这些东西烦人──就很有可能用逻辑上无误但打发人的回复,诸如“是的,你可以得到帮助”和“不,没有给你的帮助”。

一般来说,避免提“是或否”类型的问题,除非你想得到 “是或否”类型的回答

 

不要把问题标记为“紧急”, 即使对你而言的确如此

 

 

 

这是你的问题,不要我们的。宣称“紧急”极有可能事与愿违:大多数黑客会直接删除这种消息,他们认为这是无礼和自私地企图得到即时与特殊的关照。而且“紧急”或其它有类似含义的主题有可能触发垃圾过滤规则,潜在的回复者可能永远看不到你的问题!

有一点点局部的例外,如果你是在一些知名度很高、会使黑客们激动的地方使用程序,也许值得这样去做。在这种情况下,如果你有期限压力,也很有礼貌地提到这点,人们也许会有足够的兴趣快一点回答。

当然,这是非常冒险的,因为黑客们对什么是令人激动的标准多半与你的不同。譬如从国际空间站这样张贴没有问题,但代表感觉良好的慈善或政治原因这样做几乎肯定不行。事实上,张贴诸如“紧急:帮我救救这个毛绒绒的小海豹!”肯定会被黑客回避或光火,即使他们认为毛绒绒的小海豹很重要。

如果你觉得这不可思议,再把剩下的内容多读几遍,直到弄懂了再发贴也不迟。

 

礼貌总是有益的

 

 

 

礼貌一点,使用“”和“谢谢你的关注”或者“谢谢你的关照”,让别人明白你感谢他们无偿花时间帮助你。

坦率地讲,这一点没有语法正确、文字清晰、准确、有内容和避免使用专用格式重要(同时也不能替代它们)。黑客们一般宁可读有点唐突但技术鲜明的臭虫报告,而不是那种有礼但含糊的报告。(如果这点让你不解,记住我们是按问题能教我们什么来评价它的)

然尔,如果你已经谈清楚了技术问题,客气一点肯定会增加你得到有用回复的机会。

(我们必须指出,本文唯一受到一些老黑客认真反对的地方是以前曾经推荐过的“提前谢了”,一些黑客认为这隐含着事后不用再感谢任何人的暗示。我们的建议是要么先说 “提前谢了”,事后对回复者表示感谢,要么换种方式表达,譬如用“谢谢你的关注”或“谢谢你的关照”)。

 

问题解决后追加一条简要说明

 

 

 

问题解决后向所有帮助过的人追加一条消息,让他们知道问题是如何解决的并再次感谢。如果问题在邮件列表或新闻组中受到广泛关注,在那里追加此消息比较恰当。

最理想的方式是向最初提问的线索回复此消息,并在主题中包含“已解决”、“已搞定”或其它同等含义的明显标记。在人来人往的邮件列表里,一个看见线索 “问题 X”和“问题 X-已解决”的潜在回复者就明白不用再浪费时间了(除非他个人觉得“问题 X”有趣),因此可以利用此时间去解决其它问题。

追加的消息用不着太长或太复杂,一句简单的“你好──是网线坏了!谢谢大家──比尔”就比什么都没有要强。事实上,除非解决问题的技术真正高深,一条简短而亲切的总结比长篇大论要好。说明是什么行动解决了问题,用不着重演整个排错的故事。

对于有深度的问题,张贴排错历史的摘要是恰当的。描述问题的最终状态,说明是什么解决了问题,在此之后 才指明可以避免的弯路。应避免的弯路部分应放在正确的解决方案和其它总结材料之后,而不要将此消息搞成侦探推理小说。列出那些帮助过你的名字,那样你会交到朋友的。

除了有礼貌、有内容以外,这种类型的追帖将帮助其他人在邮件列表、新闻组或论坛文档中搜索到真正解决你问题的方案,从而也让他们受益。

最后,此类追帖还让每位参与协助的人因问题的解决而产生一种满足感。如果你自己不是技术专家或黑客,相信我们,这种感觉对于你寻求帮助的老手和专家是非常重要的。问题叙述到最后不知所终总是令人沮丧的,黑客们痒痒地渴望它们被解决。“挠痒痒”为你挣到的信誉将对你下次再次张贴提问非常非常的有帮助。

考虑一下怎样才能避免他人将来也遇到类似的问题,问问自己编一份文档或 FAQ 补丁会不会有帮助,如果是的话就将补丁发给维护者。

在黑客中,这种良好的后继行动实际上比传统的礼貌更重要,也是你善待他人而赢得声誉的方式,这是非常有价值的财富。

 

继续阅读提问的智慧

山坡羊·十不足

山坡羊·十不足

  (明)朱载堉

  逐日奔忙只为饥,才得有食思为衣。

  置下绫罗身上穿,抬头又嫌房屋低。

  盖下高楼并大厦,床前缺少美貌妻。

  娇妻美妾都娶下,又虑出门没马骑。

  将钱买下高头马,马前马后少跟随。

  家人招下十数个,有钱没势被人欺。

  一铨铨到知县位,又说官小势位卑。

  一攀攀到阁老位,每日思想要登基。

  一日南面坐天下,又想神仙下象棋。

  洞宾与他把棋下,又问哪是上天梯?

  上天梯子未做下,阎王发牌鬼来催。

  若非此人大限到,上到天下还嫌低。

PHP生成QR二维码的几种方法

直接调用Google Chart API接口

调用演示:
<form method=”post” action=”googleqr.php”>
<input type=”text” name=”urlToEncode” value=”” />
<input type=”submit” name=”submit” value=”生成” />
</form>
<?php
//google API
function generateQRfromGoogle($chl,$widhtHeight =‘150’,$EC_level=‘L’,$margin=‘0’)
{
$url = urlencode($url);
echo ‘<img src=”http://chart.apis.google.com/chart?chs=’.$widhtHeight.‘x’.$widhtHeight.‘&cht=qr&chld=’.$EC_level.‘|’.$margin.‘&chl=’.$chl.‘” alt=”QR code” widhtHeight=”‘.$size.‘” widhtHeight=”‘.$size.‘”/>’;
}if(isset($_POST[‘urlToEncode’])){
generateQRfromGoogle($_POST[‘urlToEncode’]);
echo “<br />”;
}else{
echo “请输入要生成二维码的内容<br />”;
}?>
效果图:
Google Chart API 更多信息:https://developers.google.com/chart/?csw=1

使用开源类库生成二维码——PHP QR Code

PHP QR Code 是一个生成QR码、二维条形码的开源(LGPL)库。它基于libqrencode C库,提供了生成QR条码图像(PNG, JPEG thanks to GD2)的API接口。不依赖其他扩展(不包括GD2),纯粹用PHP实现QR条码的生成。
云盘共享地址(备用):http://pan.baidu.com/s/1o6Bd28y
调用演示:

<?php
include(‘./phpqrcode/phpqrcode.php’); //加载类库
$data=‘https://www.yclimw.com’; // 要生成二维码数据 
$errorCorrectionLevel=‘L’;// 纠错级别:L、M、Q、H 
$matrixPointSize = 4;// 点的大小:1到10 
// 生成的文件名 
$filename = $errorCorrectionLevel.“_”.$matrixPointSize.‘.png’;
QRcode::png($data,$filename,$errorCorrectionLevel,$matrixPointSize,2);
echo “<img src=”.$filename.” />”;
?>

 

客户端生成工具——Psytec QR Code Editor

    Psytec QR Code Editor是一款用于在PC端生成二维码的工具,当然网上还有很多类似软件,可以找度娘要。
Psytec QR Code Editor下载地址:

我和权威的故事

我和权威的故事

每个人小时候心里都是没有权威的,就像每个人小时候也都不相信广告一样。可是权威就像广告,它埋伏在你的潜意识里。听一遍不信,听两遍不信,……,直到一千遍的时候,它忽然开始起作用了,而且这作用越来越强。

消灭广告所造成的幻觉,最好的办法就是去尝试,去实地的考察它。有些虚幻的东西只要你第一次尝试就会像肥皂泡一样破灭掉。可是如果你不主动去接触它,它就会一直在你脑海里造成一种美好神圣的假象。越是得不到的越是觉得美好。很神奇的一个现象就是,权威对人思想的作用其实也跟广告一样。

上大学以前的人因为没有专业,所以还不怎么崇拜权威,大不了追追歌星,影星,球星啥的。而进了大学之后,就会开始对本领域的权威耳濡目染。一遍,两遍,一千遍的听到同学们仰慕某“牛人”或者“大师”的名字,虽然从来没亲身见过,不知不觉就对这人产生了崇拜心理,然后自愧不如。Donald Knuth, Dennis Ritchie, Ken Thompson, Rob Pike, … 就是通过这些途径成为了很多计算机学生的权威。以至于几十年以后,他们的一些历史遗留下来的糟糕设计和错误思想还被很多人奉为神圣。

Donald Knuth

很多人(包括我)都曾经对 Knuth 和他的 The Art of Computer Programming (TAOCP) 极度崇拜。在我大学和研究生的时候,有些同学花了不少钱买回精装的 TAOCP 全三卷,说是大概不会看,但要供在书架上,镇场子。当时我本着“书非借不能读也”的原则,再加上搬家的时候书是最费力气的东西,所以坚决不买书。我就从图书馆把 TAOCP 借了来。说实话我哪里看的下去啊?那里面的程序都是用一个叫 MIX 的处理器的汇编语言写的。一个字节只有6位,每位里面可以放一个十进制数(不是二进制)!还没开始写程序呢,就开始讲数学,然后就是几十页的公式推导,证明…… 接着我就睡着了。但我总是听说有人真的看完过 TAOCP,然后就成为了大师。比尔盖茨也宣称:“要是谁看完了 TAOCP,请把简历投给我!” 在这一系列的号召和鼓吹之下,我好几次的把 TAOCP 借回来,下定决心这次一定看完这旷世奇书。每次都是雄心勃勃的开始,可从来就没看完过开头那段 MIX 机器语言和数学公式。

看不懂 TAOCP 总是感觉很失败,因为看不懂 TAOCP 就成不了“大师”,可我仍然认为 Knuth 就是计算机科学的神,总能从他那学点什么吧,所以又开始折腾他的其他作品。这就是为什么我开始用 TeX,并且成为中国 TeX 界的主要“传教士”之一。为了 TeX,我把 Knuth 的 TeXbook 借回来,从头到尾看了两遍,做完所有的习题,包括最难最刁钻的那种“double bend”习题。接着又开始看 MetaFont Book。开头还挺有成就感,可是不多久就发现学会的那些 TeX 技巧到了临场的时候就不知道该怎么用,然后就全都忘记了。这就是为什么我把 TeXbook 看了两遍,可是看完第二遍之后不久还是忘记得一干二净。

师兄师姐看到我用 TeX,说怎么折腾这么过时的玩意儿。我很气愤他们以及国内学术界居然都用 Word 排版论文,就开始针锋相对,写出一系列煽动文章鼓吹 TeX 的种种好处,打击“所见即所得排版”这种低智商玩意儿。这还不够,又开始折腾 Knuth 设计的 MMIX 处理器,并且认为 MMIX 的寄存器环就是世界上最先进的设计。有几次发现一些无关紧要的小错,就给 Knuth 发 email,居然拿到两张传说中的“Knuth 支票”,并且一度引以为豪。当然像所有拿到 Knuth 支票的人一样,你是不会去兑现它的,甚至有人把它们像奖状一样放在相框里。我还没那么疯狂,那两张支票一直在它们原来的信封里。多年以后我到美国想兑现那支票的时候,发现它们已经过期了。

当你心里有了这样的权威,其他人的话你是不可能听得进去的,就算他们其实比你心目中的权威更具智慧也一样。在清华的时候我很喜欢一门叫做“计算几何”的课,就经常跟那门课的老师交流思想。有一次我在 email 里面提到 Donald Knuth 是我的偶像,那位老师很委婉的回复道:“有偶像很好啊,Knuth 也曾经是我的偶像。” 我对“曾经”这两个字感到惊讶:难道这意味着 Knuth 现在不是他的偶像了?在我执意的询问之下他才委婉的告诉我,世界上还有很多很聪明的人,Knuth 并不是计算机科学的一切。你应该多看看其他人的作品,特别是一些数学家的。然后他给了我几个他觉得不错的人的名字。

现在回想起来,这些话对我是有深远作用的。那位老师虽然在系里的“牛人”们眼里是个“研究能力(也就是发paper能力)不强”的人,但是他却对我的人生转折有着强有力的作用。他引导了我去追寻自己真正的兴趣,而不是去追寻虚无的名气。我发现很多人都在为着名气而进行一些自己其实不感兴趣的事情,去做一些别人觉得“牛气”的事情。我真希望他们遇到跟我一样的好老师。

在现在看来,Knuth 的 TAOCP 就是所谓的“神圣的白象”(white elephant)。大家都把它供起来,其实很少有人真的看过,却要显得好像看过一样,并且看得津津有味。这就让试图看懂它的人更加自卑和着急,甚至觉得自己智商有问题。别人都看过了,我怎么就看不懂呢?其实 TAOCP 里面的大部分算法都不是 Knuth 自己设计的,而且他对别人算法的解释经常把简单的问题搞得很复杂。再加上他执意要用汇编语言,又让程序的理解难度加倍。有一句名言说:“跟真正的大师学习,而不是跟他们的徒弟。”如果你真的要学一个算法,就应该直接去读那算法的发明者的论文,而不是转述过来的“二手知识”。二手的知识往往把发明者原来的动机和思路都给去掉了,只留下苍白无味,没有什么启发意义的“最后结果”。

TeX 其实也是异常糟糕的设计。它过度的复杂,很少有人搞得懂怎么配置。经常为了一个简单的效果折腾很久,然后不久就忘了当时怎么做的,回头来又得重新折腾。原因就是因为 TeX 的设计没有“一致性”,不可以“compose”,所以你需要学太多东西,而不是学习几个简单的东西,然后把它们组合起来。在程序语言设计者看来,TeX 的语言是世界上最恶劣的设计之一。Knuth 的作品里面有他的贡献和价值,TeX 的排版算法(而不是语言)也许仍然是不错的东西。可是如果因为这些好东西爱屋及乌,而把他所推崇的那些乱七八糟的设计当成神圣的话,那你自己的设计就逃脱不出同样的思维模式,让简单的事情变得复杂。仍然对 TeX 顶礼膜拜的人应该看一下 TeXmacs,看看它的作者是如何默默无闻的,彻彻底底的超越了 TeX 和 Knuth。

在我看来,Knuth 是个典型的精英主义者,他觉得自己做的都是最好的。他利用自己的权威和特立独行来让用户屈服于自己的设计。TeX 的版本号每次更新都趋近于圆周率π,意思是“完美”,可是它完美吗?更奇怪的是,“TeX”这个词居然不按照正常的英语发音逻辑读成”teks”。每当有人把它“读错”,就有人打心眼里认为你是菜鸟,然后纠正你:“那个词不读 teks,而要读‘特喝’,就像希腊语里的 chi,又像是苏格兰语的 loch,德语的 ach,西班牙语的 j 和俄语的 kh。”也许这就叫做附庸风雅吧,我是纯种的欧洲人!;-) 当一个软件连名字的发音都这么别扭,这么难掌握,那这个软件用起来会怎样?每当你提到 TeX 太不直观,就有人跟你说:“TeX 是所想即所得,比你的所见即所得好多了!”可事实是这样吗?看看 TeXmacs 吧,理解一下什么是“所见即所得+所想即所得”二位一体。

我跟 Knuth 的最后一次“联系”是在我就要离开清华的时候。我从 email 告诉他我觉得中国的研究环境太浮躁了,不是做学问的好地方,想求点建议。结果他回纸信说:“可我为什么看到中国学者做出那么多的杰出研究?计算机科学不是每个人都可以做的。如果你试了这么久还不行,那你可能注定不是干这行的料。”还好,我从来没有相信他的这段话,我下定了决心要证明这是错的。多年的努力还真没有白费,今天我可以放心的说,Knuth 你错了,因为我已经在你引以为豪的多个方面超过了你。

Cornell

可是权威和名气的威力还是很大的。虽然 Knuth 在我心目中的位置不再处于“垄断地位”,世界上可以占据我心里那个位置的人和事物还很多。在离开清华之后我申请了美国的大学。也许是天意也许是巧合,只有两所大学给了我 offer:Cornell 和 Indiana,而我竟然先后到了这两所大学就读。

说实话,Indiana 给了我比 Cornell 更好的 offer。Cornell 给我的是一个 TA 的半工读职位,而 Indiana 给我的是一个不需要工作白拿钱的 fellowship。说实话我从来没有搞明白 Cornell 这样的“牛校”怎么会给我这样的人 offer,GPA 一般,paper 很菜,而 Indiana 却是真正在乎我的。Indiana 的 fellowship 来自 GEB 的作者 Doug Hofstadter。他从 email 了解到我的处境和我渴求真知的愿望之后,毅然决定给我,一个素不相识的人写推荐信。后来我才发现那 fellowship 的资金也是他提供的。

可是 Indiana 和 Hofstadter 的名气哪里能跟 Cornell 的号称 “CS前五” 相比啊?Indiana 的 offer 晚来了几天。当收到 Indiana 的 offer 时,我已经接受了 Cornell。Hofstadter 很惊讶也很失望,因为他以为我一定会做他的学生,可是听说我接受了 Cornell 的 offer,他也不知道该怎么办。我只隐约的记得他告诉我,学校的排名并不是最重要的东西……

名气和权威的力量是如此之大,它让我不去选择真正欣赏我并且能给我真知的人。有时候回想起来,我当时真的是在寻找真知吗?我明白什么叫做真知吗?

Cornell 给了我什么呢?到现在想起来,它给我的东西恐怕只有教训,很多的教训。我在一篇老的博文里面提到过,Cornell 的学生一上课就抄笔记,一天到晚都在赶作业。可其实 Cornell 不只是爱抄笔记的学生的天堂,而且是崇拜权威者的天堂。即使你不是那么的崇拜权威,你不可避免的会被一群像朝圣者一样的人围在中间,在你耳边谈论某某人多么多么的牛。不管你向同学打听哪一个教授,得到的回答总是:“哇,他很牛的!” 然后你就去上了他的几节课,觉得不咋的嘛,可是人家就说那是因为你不理解他的价值。这种气氛我好像在另一个地方感觉到过呢?啊对了,那是在 Google。这样的气氛也许并不是偶然,Cornell 的大部分 PhD 同学当时的最大愿望,就是毕业后能去 Google 工作。当然,后来 Facebook 上升成为了他们的首选。值得一提的是,Indiana 其实是更有个性的地方。我在 Indiana 的同学们一般都把去 Google 工作作为最后的选择之一。有一次一个刚来不久的学生问,如何才能进入 Google 工作?有个老教授说,那个容易,Google 招收任何能做出他们题目的人!

Cornell 的研究可以用“与时俱进”来形容,什么热门搞什么。当时 Facebook 和社交网络正在崛起,所以系里最热门的一个教授就是研究社交网络的。我去听过他几堂课,他用最容易的一些图论算法分析一些社交网络数据,然后得出一些“理论”。其中好些结论实在太显然了,我觉得根本不需要数据就能猜到,真是不觉得有什么特别的。可是 Facebook 名气之大,跟着这位教授必然有出路啦,再加上有人在耳边煽风点火,所以有好多的学生为做他的 PhD 挤破了头皮,被刷下来的就只好另投门路了。每次新来一个教授都会被吹捧上天,说是多么多么的聪明,甚至称为天才。然后就有一群的人去上他的课,试图做他的学生。结果人家每节课都是背对学生面朝黑板,喃喃自语,写下一堆堆的公式和证明,一堂课总共就没回过几次头。下面的人当然就是狂抄笔记,有的人甚至带着录音笔,生怕漏掉一句话。上这样的课还不如干脆把板书打印出来让大家自己回家看。人多了竞争也就难免了。上课的同学们就开始勾心斗角,三国演义的战术都拿出来了。作业做不出来就来找你讨论,等你想讨论了就说自己也没做出来。没听懂偏要故作点头状,显得听懂了,让你觉得有压力。自己越是喜欢的教授就越是说他不咋的,扯淡,然后就自己去跟他。自己不喜欢的教授就告诉你他真是厉害啊,只可惜人家不要我。直到两年后我离开 Cornell 之前,还有好些同学因为没找到教授而焦头烂额。因为两年内没有找到导师的 PhD 学生,基本上等于必须退学。

当我离开 Cornell 之后,有一位国内的学生给我发 email 套磁(从系里主页上找到我的地址),问我 Cornell 情况如何。我告诉他我都已经走人了,并且告诉了他我的感觉,一天到晚抄笔记赶作业之类的。然后又问我一个刚毕业的 PhD 的情况,我说他水平不咋的,博士论文我看过了,很扯淡,解决一个根本不存在的问题。他对我说的话有点惊讶,但还是将信将疑。为了确保万无一失,他在 visiting day 的时候专程去 Cornell 考察了一下。回去又给我 email,说见到好多牛人啊,大开眼界,哪里像你说的那么不堪。还说跟那位 PhD 的导师谈过话,真是世界级的牛人那,他的博士论文也是世界一流的。我就无话可说了,仁者见仁,智者见智,随他去吧,哎。

结果两年之后,我又收到这位同学的 email,说他在 Cornell 还没找到导师,走投无路了,问我有没有办法转学。

图灵奖

说到这里应该有人会问这个问题,我是不是也属于那种没找到导师走投无路的人。答案是,对的,我确实没有在 Cornell 找到可以做我导师的人。然后我就猜到有人会说,就知道王垠水平不行嘛,没搞定导师,被迫退学,哈哈!可是事情其实没他们想象的那么简单。作为一个 PhD 学生,不仅必须精通学术,而且要懂得政治和行情。哦错了,其实不精通学术也行的,但是一定要懂得政治和行情!可是由于学生之间的窝里斗,他们之间的信息互通程度,是没法和教授之间的信息互通程度相比的。这就造成了“学生阶级”在这场信息战上的劣势,总是被动的被教授挑选,而不能有效地挑选适合自己的教授。

进入 Cornell 之后我上了一门程序语言的课,就开始对这些东西入迷。可是由于“与时俱进”,Cornell 的研究方向并不是那么平衡的发展的,其实是很畸形的发展。程序语言领域的专家们早已因为受到忽视而转移阵地,剩下一群用纸和笔做扯淡理论的。说实话,在历史上程序语言方向曾经是 Cornell 的强项,出现了一些很厉害的成果。可是当我在 Cornell 的时候,只剩下两个名不见经传的教员,一个助理教授,一个副教授。其实 Robert Constable 也在那里,可惜的是他做了 dean 之后已经没空理学生了,以至于我两年之后都不知道这个人的存在。我当时也不知道 Cornell 有过这段历史,看不到它的研究重心的移动趋势。

我不喜欢那个副教授搞的项目,大部分是在 Java 上面加上一些函数式语言早就有的功能。可是人家做的是热门语言,所以拉得到资金,备受系里亲睐,他的学生们也比较趾高气昂。初次见面的时候,我跟他的一个学生说了我的一个想法,他说:“你那也能叫研究吗?待会儿我给你看看什么是真正的研究!” 其实那只是我的一个微不足道的想法,我也没说那是研究啊。只是随便聊一下而已就这么激动 -_- 何况你们那些 Java 的东西能算是研究?我是不可能跟那样的人合作的,所以我就跟那个助理教授做了一点静态分析的项目。当然我们分析的也不是什么好东西,是用 Fortran 写的 MPI 程序。不过说实话,那个助理教授其实挺有点真知灼见,他有几句话现在仍然在指引我,防止我误入歧途。其中一句话是针对我对 π-calculus 的盲目崇拜 说的:“那些理论其实不管用的。最好是针对自己的问题,自己动脑筋想。” 他也是很谦虚很善良的人,可是好人不一定有好报的。后来他没有拿到 tenure 职位,不得不离开 Cornell 加入了工业界,而我就失去了最后一个有可能在程序语言方向做我的导师的人。

没办法,我就开始探索其它相关领域的教授,比如做数据库的,做系统的,看他们对相关的语言设计是否感兴趣。可惜他们都不感兴趣,而且告诉我程序语言领域太狭窄了。我当时还将信将疑,甚至附和他们的说法,可是现在我断定他们都是一知半解胡说八道。如果这些人虚心向程序语言专家请教,现在数据库和操作系统的设计也不会那么垃圾,关系式,SQL,NoSQL,…… 一个比一个扯淡。没有办法,我就开始探索其他的方向,开始了解图形学和数值分析等东西,进展很不错。可是终究我还是发现,我不喜欢图形学和数值分析所用的语言。我想制造出更好的程序语言来解决这些问题。可是跟教授们谈这些想法的时候就感觉是在对牛弹琴,他们完全不能理解。后来我发现,教授们貌似不喜欢有自己想法的学生,他们更希望找到愿意“打下手”的学生,帮助实现他们自己的想法。

这就让我走到了跟那位向我打听 Cornell 情况的同学差不多的局面,真是心里有许多的苦却没有人可以理解。这时候我想到了系里的一些德高望重的教授,比如得过图灵奖的人,也许这些顶级的大牛会给我指出方向。于是我就联系到一位图灵奖得主,说想找他聊聊。我说我感兴趣的东西 Cornell 貌似并不重视和发展。Cornell 的校训是“any person, any study”,而我想 study 的东西却得不到支持。最后我谈了一下我对 Cornell 的总体感受。我说我觉得大家上课死记硬背,不是很 intellectual,我不是很确定学术界是否还保留有它原来的对智慧和真知的向往。

我真的是很诚恳的告诉了他这些,只是希望得到一些建议。结果他不但没有理解任何一点,而且立马开始用质问的语气问我,你成绩怎么样?考试都通过了没有?哎,说白了就是想搞清楚你是不是成绩不好没人要。怎么就跟高中教导主任一样。于是乎那次谈话就这样不了了之。可是没有想到,这次谈话就造成了我最后的离别。在学生们互相之间勾心斗角,不通信息的同时,系里的教授们其实背后都是“通气”的。他们根本不懂得如何教学,就知道拿作业和考试往学生头上砸,幸存下来的就各自挑去做徒弟,挨不住的就打发掉。这算盘打得真是妙啊。我也不知道他们是什么机制,每个学生对哪些教授感兴趣,表现如何,他们貌似都了如指掌,貌似背后有个什么情报网。然后系里的教授们不知道怎么的,仿佛就都知道有这样一个不知趣的学生,居然敢说学术界的坏话!

大地震前夕的天空总是异常的美。我竟然在过道里看到那位图灵奖教授对我点头致意并且微笑,以前做 TA 时把我呼来唤去还横竖不满意的教授也对我笑脸相迎。我仿佛觉得,我推心置腹的一席话打动了那位德高望重的教授,再加上在图形学和数值计算的扎实进展,给我的学术生涯带来了转机。可是,我那一次真正的领悟了什么叫做所谓的“笑里藏刀”。

由于那个学期上的图形学还有矩阵计算的课成绩都不错,我心想应该能找这两门课的授课教授的其中一个做导师吧。再加上那些貌似友好的笑容…… 所以没想很多,居然过了一个非常快乐的寒假。没有任何前兆,没有任何直接的通知(email,电话),一封纸信不知道是什么时候默默地进到了我在系里的“信箱”—一个我基本上从来不看的,系里用来塞广告信息的信夹子里,直到下一个学期开始的时候(2月份)我才发现。信是系主任写的,大概就是说,由于你的表现,我们觉得 Cornell 不是适合你的地方……

说得对,我也觉得 Cornell 不适合我。我本来就有想走的意思,可我一般呆在一个地方就懒得动。如果你们早一点告诉我这个,比如12月以前,我还可以申请转学到其它学校。可是都 2 月份了才收到这样的东西,Cornell 啊 Cornell,你让我现在怎么办?我想我可以说你不仁不义吧?

在这个万分窘迫的时候,我想起了曾经关心过我却又很失望的 Hofstadter。我告诉他我在 Cornell 很不开心,我很想研究程序语言,可是 Cornell 不理解也不在乎这个领域。他回信说,没有关系,你能找到自己喜欢的东西就应该去追寻它。Indiana 的 Dan Friedman 正好是做程序语言的,你可以联系他,就说是我介绍你去的。

于是给 Friedman 发了 email,很快得到了回信说:“Yin,两年前我们都看过你的材料,我们觉得你是非常出众的学生,可惜你最后没有选择我们。你要明白,人生最重要的事情不是名利,而是找到你愿意合作的人。你的材料都还在我们这里。现在招生已经快结束了,但是我会把你的材料提交给招生委员会,让他们破例再次考虑你的申请。” 我和 Dan Friedman 的故事就从这里开始了。

由于曾经与多位图灵奖得主发生不大愉快的遭遇,再加上在自己的研究中多次受到其它图灵奖得主的理论的误导,图灵奖这个被许多计算机学生膜拜的神物,其实在我心里已经没有任何效力了。很多人可能对此难以想象,可是对图灵奖是这种态度的不只我一个人。我认识的几乎所有程序语言专家几乎都不拿图灵奖当回事,而且其中很多人甚至不拿图灵本人当回事,觉得他设计了一些非常丑陋的东西。所以跟这样的人混了几年之后,拿图灵奖来开玩笑就成了我的家常便饭。可惜的是很多仍然膜拜图灵奖的人不能理解,还以为我是自大狂。

常青藤联盟和“世界一流大学”

我在 Cornell 的经历应该不是偶然,不是因为我比较特殊。跟我同时进入 Cornell 的博士生有好几个没有拿学位就离开了。其中有一个是非常聪明的少年班,18岁就读 PhD 了,我根本听不懂的理论课他还能拿A。可是四年后他退学去了 Facebook,说真是太难毕业了,神马都是扯淡。有些本科生也告诉我类似的经历,说被一个叫做“笑面虎”的教授“整了”。Cornell 的自杀率居美国大学前列。离开以后的有一天,忽然看到新闻报道说一周之类有三个 Cornell 学生从瀑布旁边的那座桥跳下去,结果派了警察在桥上日夜巡逻。我觉得自己在 Cornell 所感受到的压力确实超乎想象,是有可能把人逼上绝路的。现在回想起来真是可笑,因为下意识里在乎权威和名气,我给予了一群根本没有资格来教育我的人莫大的权力,让他们可以向我施加无端的压力。

应该指出,这种现象应该不是 Cornell 所特有的。我对清华,还有 Princeton,Harvard,MIT,Stanford,Berkeley,CMU 等学校的学生都有了解。这些所谓的“世界一流大学”或者“世界一流大学 wannabee”差不多都是类似的气氛。你冲着它们的名气和“关系网”挤破了头皮进去,然后就每天有人在你耳边对其它人感叹:哇,他好牛啊!发了好多 paper,还得了XX奖。跟参加传销大会似的,让你怀疑这些人还有没有自尊。然后就是填鸭式的教育,无止境的作业和考试,让你感觉他们不是在“教育”你,而是在“筛选”你。这种筛选总是筛掉最差的,但也筛掉最好的。因为最好的学生能意识到你在干什么,他们不给你筛选他们的机会。一旦发现其实没学到东西,中途就辍学出去创业了。所以剩下来的就是最一般的,循规蹈矩听话的。在这样的环境里,你感觉不到真正的智慧和真知的存在。GRE 考试所鼓吹的什么“批判性思维”(critical thinking )在美国大学里其实是相当缺乏的。学生们只不过是在被培训成为某些其他人的工具,他们具有固定的思维定势,像是一个模子倒出来的。他们不是真正的创造者和开拓者。

人们在这些大学里的时候都是差不多感受的,可是一旦他们出来了,就会对此绝口不提。自己身上挂着这些学校的镀金牌子,怎么能砸了自己的品牌,长别人的威风?所以每当我批判 Cornell 就有些以前的同学一脸的着急相,好像自己没有吃过那苦头一样。

再见了,权威们

亲爱的同胞们,如果你们觉得有了可以在背后说王垠“被Cornell 退学”的机会,那么你们就错了。是我首先从心理上抛弃了 Cornell。Cornell 还有资格来评价我吗?我之所以可以告诉你们这些貌似不可告人的故事,是因为你们可能也会经历这些事情。对权威和名校的崇拜,让你们成为了被“教授阶级”摆布的傀儡和他们在学术战场上的牺牲品。我很幸运的遇到了像 Hofstadter 和 Friedman 这样的好人,而你们也许就没有这么幸运。

几经颠簸的求学生涯,让我获得了异常强大的力量。我的力量不仅来自于 Friedman,Dybvig 等老师的教诲,而且在于我自己不懈的追求。机会只亲睐有准备的头脑,并不是每个 Friedman 的学生都可以像我一样在一个星期之内解决别人十多年才完成的研究。现在这种事情对我来说已经是家常便饭了。让人惊讶的应该不是我有多么聪明,而是这些研究者们十年来到底在干什么。我从来不认为自己比别人聪明,我只是觉得很多人的脑子被禁锢了而已。我有非常简单的头脑,我看不懂复杂的公式,听不懂高深的术语。可正是因为这一点,让我脱离了已有理论的困扰。

可以说,这个领域在过去一个多世纪的研究,很少有逃脱过我的洞察力和直觉的。这些研究最早可以追溯到1870年代。我一般很少看论文,因为自己想清楚一个问题其实花不了那么多时间的。看别人的论文一般都枯燥乏味,所以与其花那么多时间读论文还不如自己思考。当我看论文的时候,一般是想搞清楚自己琢磨出来的问题有没有人已经研究过了,所以很多论文只需要扫一下就够了。我看到一个东西一般很快就会知道它到底会不会管用。我经常发现一些被认为很艰深的理论其实是在解决根本不存在的问题,甚至是在制造问题,而真正的问题却没有得到有效的解决。很多问题其实是权威的阴影造成的,它让人们不敢否认这些大牛思想的价值,不敢揭穿它们,抛弃它们,所以很多的时间花在了解决一些历史遗留问题,而不是真正的问题。这就是为什么我的英文blog标题叫做“Surely I Am Joking”,因为它记录了一些我认为根本不存在,或者是人为造成的问题。

曾经 Knuth 是我心中唯一的权威。后来我又屈服于 Cornell 和常青藤联盟的权威和名气。我因为图灵的威名而误以为图灵奖得主都是德高望重的前辈。应该说,在 Indiana 的日子里,权威主义的影子也是经常出现的。Indiana 学生们的权威比较特殊一点,不然就是 Dan Friedman,不然就是 Kent Dybvig,不然就是 Tony Hoare 之类的。所以你有时就会发现有人想这样来压倒你:“Kent 说……” 我很尊敬 Dan 和 Kent,但我也看到他们的一些思维方式并不是那么的正确,我从来不引用他们的话作为理论依据。我不喜欢 Indiana 一些同学这种抬出权威来镇压异议的行为。应该指出的是,权威们自己很多时候对这种行为的产生是不知情的。谁能防止你引用我的话去压倒跟你辩论的人呢?所以这很多时候不能归咎于权威自己,而应该归咎于那些盲目崇拜他们的人。对权威的崇拜其实现实了一个人心理的弱小。如果你对自己有信心,有自己的想法和判断力,又何必抬出个名人来压制别人呢?

在一而再再而三的上当受骗之后,我终于把所有的权威们从我的脑子里轰了下去。这些权威包括所有大学的所有教授,所有的图灵奖得主,Unix 和类似操作系统的设计者,所有的程序语言设计者,图灵,他的导师邱奇,他的师兄 Kleene,被程序语言研究者奉为神圣的逻辑学家们比如 Per Martin Lof,各大 IT 界“牛公司”,美国国防部,美国宇航局,…… 在我的心中,他们与我完全处于平起平坐的地位。所以如果你觉得你的超级偶像在我之上的话,请先问问我对他们的博士论文或者图灵奖作品有何评价 🙂

不再是我心目中的权威并不等于我鄙视他们或者不尊敬他们。他们在我的脑子里失去的只是他们在很多其他人脑子里的那种被膜拜的地位,那种你可以用“XX人说过……”来压倒理性分析的地位。现在他们在我心目中是一群普通的,有血有肉,有好心肠或者坏心眼的,高傲,谦虚或者虚伪的人。他们设计的东西,好的地方我可以借鉴,但是没有任何人的东西我是不加批判全盘接受的。我深深地知道接受错误想法的危害性,所以我也希望大家都具有批判的思维,不要盲目的接受我说的话。我不喜欢“大神”或者“牛人”这种称呼。

最后我希望国内的同学们,不要盲目的崇拜国外的所谓“大师”,“牛校”或者“牛公司”。祝你们早日消灭掉心里的各种权威以及对他们的畏惧心理,认识到自己和自己国家的价值和力量。

新年快乐!

原文  http://www.yinwang.org/blog-cn/2014/01/04/authority/

解决CHM文件无法显示的办法

最简单解决CHM文件无法显示的办法

看到这个,你烦吗?!
这几天遇到了几次这个问题,某些chm文件即使下载到本地,都提示“取消操作”而不能显示页面,只好google之。原来是微软为了防止CHM利用某漏洞,而出了一个安全补丁,导致页面无法显示。网上很多人都研究过这个问题,有些改注册表、有些搞安全级别、有些盯上了itss.dll……虽然解决方法很多,但是我尝试过以上的方法,麻烦不说,而且还有几个文件死活无法显示,无耐中的时候,试了一个非常简单的操作,搞定了~

解决方法:

在CHM文件右键——属性——解除锁定!万事大吉!

看图: