本科
Original2005 年 3 月
(本文的部分内容最初是为回复那些写信给我提出问题的学生。)
最近我收到几封计算机科学本科生发来的电子邮件,询问在大学里应该做什么。我可能不是最好的建议来源,因为我在大学主修哲学。但我选修了太多计算机科学课程,以至于大多数计算机科学专业的学生都认为我是其中的一员。至少我肯定是个黑客。
黑客攻击
要想成为一名优秀的黑客,在大学里你应该做什么?你可以做两件主要的事情:精通编程,并学习很多关于特定、酷的问题。这两件事其实是等价的,因为每一件事都会促使你去做另一件事。
擅长编程的方法是 (a) 大量 (b) 解决难题。而让自己解决难题的方法是从事一些非常有趣的项目。
这个项目很可能不会成为课堂作业。我的朋友罗伯特在读本科时通过编写网络软件学到了很多东西。他的一个项目是将哈佛大学连接到阿帕网;它曾是最初的节点之一,但到 1984 年,该连接已中断。[1] 这项工作不仅不适合上课,而且由于他把所有时间都花在了这上面而忽视了学业,他被学校开除一年。[2] 最终一切都平息了,现在他是麻省理工学院的教授。但如果你不走极端,你可能会更快乐;当时这让他很担心。
另一个擅长编程的方法是找到其他擅长编程的人,并学习他们所知道的知识。程序员倾向于根据他们所从事的工作类型和使用的工具将自己分成不同的群体,有些群体比其他群体更聪明。环顾四周,看看聪明的人似乎在做什么;通常都是有原因的。
你周围最聪明的人中有些是教授。所以找到有趣工作的一个方法是自愿担任研究助理。教授们对能为他们解决繁琐的系统管理问题的人特别感兴趣,所以这是一种入门的方法。他们害怕的是那些不靠谱的人和简历造假者。助理导致工作量净增加的情况太常见了。所以你必须明确表示你的意思是工作量净减少。
如果他们拒绝,不要气馁。拒绝几乎总是比被拒绝者想象的更不私人。继续下一个吧。(这也适用于约会。)
要当心,因为虽然大多数教授都很聪明,但并不是所有教授都在研究有趣的东西。教授必须发表新颖的成果来提升自己的职业生涯,但在更有趣的研究领域竞争更激烈。因此,野心较小的教授会发表一系列论文,这些论文的结论是新颖的,因为没有人关心它们。你最好避免这些。
我从未担任过研究助理,因此我建议我走这条路有点不诚实。我通过编写自己的程序来学习编程,特别是通过尝试对 Winograd 的 SHRDLU 进行逆向工程。我对这个程序的痴迷程度就像一个刚出生的婴儿的母亲一样。
不管独自工作有什么缺点,优点是项目完全属于你自己。你永远不必妥协或征求任何人的许可,如果你有新想法,你可以坐下来开始实施。
在您自己的项目中,您不必担心新颖性(教授们需要担心)或盈利能力(企业需要担心)。重要的是项目在技术上的难度,这与应用程序的性质无关。数据库等“严肃”的应用程序在技术上往往是琐碎和枯燥的(如果您曾经失眠,请尝试阅读有关数据库的技术文献),而游戏等“轻浮”的应用程序通常非常复杂。我相信有些游戏公司正在开发的产品比大学计算机科学系底层十分之九的研究更有智力含量。
如果我现在在上大学,我可能会从事图形设计工作:例如网络游戏或 3D 动画工具。当我还是一名本科生时,没有足够的周期来使图形变得有趣,但现在很难想象还有什么比这更有趣的工作了。
数学
我上大学的时候,很多教授都认为(或者至少希望)计算机科学是数学的一个分支。这种想法在哈佛大学最为强烈,直到 20 世纪 80 年代,哈佛大学才开设了计算机科学专业;在那之前,学生必须主修应用数学。但康奈尔大学的情况也差不多一样糟糕。当我告诉令人敬畏的康威教授我对人工智能感兴趣(当时人工智能是一个热门话题)时,他告诉我应该主修数学。我仍然不确定他是否认为人工智能需要数学,或者他是否认为人工智能是无稽之谈,主修某种严谨的东西会让我摆脱这种愚蠢的野心。
事实上,作为一名黑客,你需要的数学知识量比大多数大学部门愿意承认的要少得多。我认为你只需要高中数学加上一些计算理论的概念。(如果你想避免编写它们,你必须知道什么是 n^2 算法。)当然,除非你打算编写数学应用程序。例如,机器人技术全是数学。
虽然大多数黑客攻击并不需要数学,但从掌握 1001 种区分公式的技巧的角度来看,数学本身非常值得学习。对于几乎任何类型的工作来说,它都是一个宝贵的隐喻来源。[3] 出于这个原因,我希望自己在大学时学过更多数学。
和很多人一样,我小时候也受过数学方面的虐待。我学会了把数学看作一堆公式,这些公式既不漂亮,也与我的生活没有任何关系(尽管我试图把它们转化为“应用题”),但为了在考试中取得好成绩,我必须死记硬背。
在大学里你能做的最有价值的事情之一就是了解数学的真正含义。这可能并不容易,因为很多优秀的数学家都是糟糕的老师。虽然有很多关于数学的流行书籍,但似乎没有几本是好的。我能想到的最好的是 WW Sawyer 的。当然还有欧几里得。[4]
一切
托马斯·赫胥黎曾说过:“努力学习关于万事万物的知识,并学习关于某事的一切知识。”大多数大学都以这一理想为目标。
但什么是一切?对我来说,一切意味着人们在诚实地解决难题的过程中所学到的一切。所有这些工作往往是相关的,因为一个领域的思想和技术往往可以成功地移植到其他领域。即使是那些看起来相当遥远的领域。例如,我写论文的方式与编写软件的方式相同:我坐下来,尽可能快地写出一个蹩脚的 1 版,然后花几个星期重写它。
仅靠解决难题是不够的。中世纪的炼金术士们正在研究一个难题,但他们的方法太过虚假,以至于从中学到的东西很少,除了可能了解人们欺骗自己的能力。不幸的是,我在大学里试图学习的那种人工智能也有同样的缺陷:一个非常困难的问题,却用完全不合适的技术轻率地去解决。大胆?更接近欺诈。
社会科学也相当虚伪,因为它们受思想潮流的影响太大了。如果一个物理学家遇到一个 100 年前的同事,他可以教他一些新东西;如果一个心理学家遇到一个 100 年前的同事,他们只会陷入一场意识形态争论。是的,当然,通过上心理学课你会学到一些东西。关键是,通过上其他系的课你会学到更多。
我认为值得学习的科系有数学、自然科学、工程学、历史(尤其是经济和社会史以及科学史)、建筑学和古典学。艺术史概论课程可能值得学习。现代文学很重要,但学习现代文学的方法就是阅读。我对音乐了解不多,就不多说了。
你可以跳过社会科学、哲学和最近为应对政治压力而设立的各种部门。当然,这些领域中有许多都在讨论重要问题。但他们谈论这些问题的方式毫无用处。例如,哲学除了讨论我们彼此之间的义务之外,还讨论我们对彼此的义务;但你可以从一位睿智的祖母或 E.B. 怀特那里学到更多,而不是从一位学术哲学家那里学到。
我在这里说的是自己的亲身经历。当人们嘲笑克林顿说“这取决于‘是’这个词的含义”时,我可能应该感到被冒犯了。我在大学里上过大约五门关于“是”含义的课。
另一种找出哪些领域值得研究的方法是创建*辍学图。*例如,我知道很多人从数学转到计算机科学,因为他们觉得数学太难了,但没有人做相反的事情。人们不会无缘无故地做困难的事情;没有人会研究更难的问题,除非它能成比例地(或至少 log(n))获得更多回报。所以数学可能比计算机科学更值得研究。通过类似的比较,你可以制作一张大学里所有院系的图表。在底部,你会发现智力含量最少的科目。
如果您使用此方法,您将获得与我刚才给出的大致相同的答案。
语言课程是一种异常现象。我认为最好将它们视为课外活动,例如陶艺课。如果将它们与在使用该语言的国家生活一段时间结合起来,效果会更好。大一时,我一时兴起学习了阿拉伯语。这需要付出很多努力,唯一持久的好处是能够识别闪族语词根,并了解人们如何识别单词。
工作室艺术和创意写作课程都是不确定因素。通常你学不到多少东西:你只是做(或不做)你想做的事情,然后在老师的模糊监督下坐下来对彼此的作品提出“批评”。但写作和艺术都是非常困难的问题,(有些)人会诚实地努力,所以它们值得一做,特别是如果你能找到一个好老师。
工作
当然大学生要考虑的不只是学习,还有两个实际问题需要考虑:就业和读研。
理论上,通识教育不应该提供职业培训。但每个人都知道这有点儿像谎言。每所大学的黑客都学习实用技能,而且并非偶然。
你需要学习什么才能找到工作取决于你想要什么样的工作。如果你想在一家大公司工作,那就学习如何在 Windows 上破解Blub 。如果你想在一家很酷的小公司或研究实验室工作,你最好在 Linux 上学习 Ruby。如果你想创办自己的公司(我认为这将越来越普遍),那就掌握你能找到的最强大的工具,因为你将与竞争对手竞争,而他们将成为你的坐骑。
你在大学里应该学习的技能和你在工作中需要用到的技能之间并没有直接的联系。你在大学里应该把目标定得稍微高一些。
在训练中,一名足球运动员可能会卧推 300 磅,尽管他在比赛过程中可能永远不需要施加这么大的力量。同样,如果你的教授试图让你学习比工作需要更高级的东西,这可能不仅仅是因为他们是学者,脱离了现实世界。他们可能试图让你用大脑举重。
你在课堂上编写的程序与你在现实世界中编写的程序在三个关键方面有所不同:它们很小;你可以从头开始;问题通常是人为的和预先确定的。在现实世界中,程序更大,往往涉及现有代码,并且通常需要你先弄清楚问题是什么,然后才能解决问题。
你不必等到离开(甚至进入)大学后才学习这些技能。例如,如果你想学习如何处理现有代码,你可以为开源项目做出贡献。你想要为之工作的雇主会对此印象深刻,就像课堂作业的优异成绩一样。
在现有的开源项目中,你很少练习第三项技能,即决定要解决什么问题。但没有什么可以阻止你开始自己的新项目。而好的雇主会对此更加印象深刻。
你应该尝试解决什么样的问题?回答这个问题的一种方法是问问自己作为用户需要什么。例如,我偶然发现了一个很好的垃圾邮件过滤算法,因为我想停止接收垃圾邮件。现在我希望有一个邮件阅读器,可以防止我的收件箱被塞满。我倾向于将收件箱用作待办事项列表。但这就像用螺丝刀开瓶子一样;人们真正想要的是开瓶器。
研究生院
那研究生院呢?你应该去吗?你怎样才能进入一所好的研究生院?
原则上,研究生院是专业的研究培训,除非你想把研究作为职业,否则你不应该去读研究生。然而,获得计算机科学博士学位的人中有一半并没有从事研究。我读研究生不是为了当教授。我读研究生是因为我想学更多东西。
因此,如果你主要对黑客感兴趣,并且你去读研究生,你会发现很多人也同样不适应黑客环境。如果你身边有一半人都和你一样不适应黑客环境,那么你真的不适应黑客环境吗?
“计算机科学”中有一个根本问题,它在这种情况下浮现出来。没有人确定“研究”应该是什么。许多研究都是黑客行为,必须塞进学术论文的形式才能产生更多的出版量。
因此,问自己读研究生是否感觉自在是一种误导,因为很少有人对计算机科学很熟悉。整个领域都不太适应。因此,你主要对黑客感兴趣这一事实不应该阻止你读研究生。只是要注意,你将不得不做很多你不喜欢的事情。
第一个就是你的论文。几乎每个人在写完论文后都会讨厌它。这个过程本质上往往会产生不愉快的结果,就像用全麦面粉烤了 12 个小时的蛋糕一样。很少有论文读起来让人感到愉快,尤其是作者读的。
但是,在你之前,已有数千人经历过写论文的痛苦。除此之外,研究生院几乎就是天堂。许多人都记得那是他们一生中最快乐的时光。几乎所有其他人,包括我在内,都记得那段时光,如果他们不必写论文的话,那将是一段美好的时光。[5]
读研的危险在于你不会提前意识到可怕的部分。博士课程是大学的第二部分,需要几年的课程。所以当你面对写论文的恐惧时,你已经读了好几年了。如果你现在放弃,你就会成为研究生辍学者,你可能不喜欢这个想法。当罗伯特因编写 1988 年的互联网蠕虫而被研究生院开除时,我非常羡慕他找到了一条没有失败耻辱的出路。
总体而言,研究生院可能比大多数替代方案都要好。你会遇到很多聪明人,而你的忧郁拖延至少会成为一种强大的共同纽带。当然,你最后会获得博士学位。我忘了这一点。我想这还是值得的。
博士学位的最大优势(当然,除了是学术界的名片之外)可能是它能给你一些基本的信心。例如,我家的霍尼韦尔恒温器拥有最恶劣的用户界面。我母亲也拥有同样的型号,她花了一天时间认真阅读用户手册,学习如何操作她的恒温器。她以为问题出在她身上。但我心里想:“如果一个拥有计算机科学博士学位的人都看不懂这个恒温器,那它一定是设计得很糟糕。”
如果你在听完这个模棱两可的推荐后仍然想读研究生,我可以给你一些关于如何入学的可靠建议。我的很多朋友现在都是计算机科学教授,所以我对招生有内幕消息。这与大学完全不同。在大多数大学,招生官决定谁能入学。对于博士项目,教授们决定。他们试图把这件事做好,因为他们录取的人将为他们工作。
显然,在最好的学校里,只有推荐信才是真正重要的。标准化考试毫无意义,成绩也无足轻重。论文主要是让你通过说一些蠢话来取消自己的申请资格。教授们唯一信任的就是推荐信,最好是来自他们认识的人。[6]
所以,如果你想进入博士学位课程,关键是要给你的教授留下深刻印象。从我那些当教授的朋友那里,我知道什么能给他们留下深刻印象:不仅仅是试图给他们留下深刻印象。他们不会对那些成绩好或想成为他们的研究助理以便进入研究生院的学生留下深刻印象。他们对那些成绩好并想成为他们的研究助理的学生印象深刻,因为他们真的对这个主题感兴趣。
因此,无论你是想读研还是想成为一名出色的黑客,你在大学里能做的最好的事情就是弄清楚你真正喜欢什么。很难欺骗教授让你读研,也不可能欺骗问题让你解决。大学是伪装失效的地方。从这一点来看,除非你想去大公司工作,这就像回到高中时代,否则唯一的出路就是做你喜欢的事情。
笔记
[1] 似乎没人介意,这表明阿帕网(后来成为互联网)直到 1984 年还不重要。
[2] 这就是为什么当我成为雇主时,我并不关心 GPA。事实上,我们积极寻找辍学学生。我们曾在哈佛大学周围张贴海报,上面写着“你是不是因为把所有时间都花在自己的项目上,成绩不好而被开除?来为我们工作吧!”我们设法找到了一个辍学的孩子,他是一个很棒的黑客。
当哈佛大学开除本科生一年后,他们必须找份工作。这样做的目的是让他们看看现实世界有多么糟糕,这样他们就会明白上大学是多么幸运。这个计划对来我们这里工作的那个人适得其反,因为他比在学校时玩得更开心,那一年从股票期权中赚到的钱比他任何一位教授的薪水都多。所以,他没有在年底后悔地爬回来,而是又休了一年假,去了欧洲。他最终在 26 岁左右毕业了。
[3] Eric Raymond 表示,对黑客来说最好的比喻是集合论、组合学和图论。
Trevor Blackwell 提醒你选修专为数学专业的学生开设的数学课程。“‘工程师数学’课程非常糟糕。事实上,任何‘工程师数学’课程都很糟糕,其中‘数学’包括数学、法律、写作和视觉设计。”
[4] 其他强烈推荐的书籍: 《什么是数学? 》(作者:库兰特和罗宾斯); 《几何与想象力》 (作者:希尔伯特和科恩-沃森)。对平面设计感兴趣的人可以阅读伯恩的《欧几里得》 。
[5] 如果你想拥有完美的人生,那么你应该去读研究生,在头一两年偷偷写论文,然后在接下来的三年里尽情享受,一次写出一章。这个前景会让研究生们垂涎欲滴,但据我所知,没有人有这样的自律来实现这一点。
[6] 一位教授朋友说,他们每年录取的研究生中,有 15% 到 20% 是“不合格学生”。但他所说的不合格学生是指那些申请材料各方面都很完美的人,只是招生委员会中没有人认识写推荐信的教授。
所以如果你想进入科学研究生院,你需要去有真正研究教授的大学。否则,无论你有多优秀,招生委员会都会认为你是一个冒险的选择。
这意味着一个令人惊讶但似乎不可避免的后果:小型文理学院注定要失败。大多数聪明的高中生至少会考虑进入科学领域,即使他们最终选择不这样做。为什么要去一所限制他们选择的大学呢?
感谢Trevor Blackwell、Alex Lewin、Jessica Livingston、Robert Morris、Eric Raymond 以及几位匿名计算机科学教授阅读本文草稿,也感谢提出本文问题的学生。