本科生涯

想开始一家创业公司吗? 获得Y Combinator的资助。


2005年3月

(本文的部分内容源于我回复学生们提问的邮件。)

最近我收到了几封来自计算机科学专业本科生的邮件,询问在大学里应该做什么。我可能不是最佳的建议提供者,因为我大学时是哲学专业的。但我修了太多的计算机科学课程,以至于大多数计算机科学专业的学生都认为我也是其中之一。至少,我肯定是个黑客。

黑客技术

在大学里,你应该做些什么才能成为一个优秀的黑客? 你可以做两件主要的事情:变得非常擅长编程,并学习很多关于特定、酷炫的问题。 事实证明,这两者是等价的,因为每一个都会驱动你去做另一个。

要擅长编程,就要(a)投入大量时间(b)解决难题。而让自己解决难题的方法是,从事一些非常吸引人的项目。

这个项目很可能不是课堂作业。我的朋友 Robert 在本科时通过编写网络软件学到了很多东西。他的一个项目是将哈佛大学连接到 Arpanet;它曾经是最初的节点之一,但到 1984 年连接已经中断。[1] 这项工作不仅不是为了上课,而且因为他把所有时间都花在了上面,忽略了学业,所以他被学校开除了一年。[2] 最终一切都变得顺利,现在他是 MIT 的教授。但是,如果你不走极端,你可能会更快乐;当时这让他非常担心。

另一种擅长编程的方法是找到其他擅长编程的人,并学习他们所知道的。程序员倾向于根据他们所做的工作类型和他们使用的工具将自己分成不同的部落,而有些部落比其他部落更聪明。环顾四周,看看聪明人似乎在做什么;通常是有原因的。

你周围最聪明的人之一是教授。因此,找到有趣工作的一种方法是自愿担任研究助理。教授们对那些能够为他们解决繁琐的系统管理类型问题的人特别感兴趣,所以这是一种入门的方式。他们害怕的是靠不住的人和简历造假者。助理的结果通常是净增加工作量。所以你必须明确表示你会带来净减少。

如果他们拒绝了,不要灰心。拒绝几乎总是没有被拒绝者想象的那么个人化。继续下一个。(这也适用于约会。)

要小心,因为虽然大多数教授都很聪明,但并非所有教授都在从事有趣的工作。教授们必须发表新颖的成果才能提升自己的职业生涯,但在更有趣的研究领域,竞争更加激烈。因此,一些不那么雄心勃勃的教授所做的是发表一系列论文,这些论文的结论之所以新颖,是因为没有人关心它们。你最好避开这些。

我从来没有做过研究助理,所以我推荐这条路有点不诚实。我通过自己编写东西来学习编程,特别是通过尝试逆向工程 Winograd 的 SHRDLU。我对那个程序的痴迷就像母亲对新生婴儿一样。

无论独自工作有什么缺点,优点是项目完全属于你自己的。你永远不必妥协或征求任何人的许可,如果你有一个新的想法,你可以直接坐下来开始实施。

在你自己的项目中,你不必担心新颖性(像教授那样)或盈利能力(像企业那样)。重要的是项目在技术上的难度,而这与应用程序的性质无关。“严肃”的应用程序(如数据库)在技术上通常是琐碎而乏味的(如果你患有失眠症,可以尝试阅读有关数据库的技术文献),而“轻浮”的应用程序(如游戏)通常非常复杂。我确信有很多游戏公司正在开发的产品,其智力含量高于大学计算机科学系中后 90% 的研究。

如果我现在还在上大学,我可能会从事图形方面的工作:例如,网络游戏或 3D 动画工具。当我还是本科生时,没有足够的周期来使图形变得有趣,但很难想象现在有什么比这更有趣的工作了。

数学

当我在大学时,很多教授认为(或至少希望)计算机科学是数学的一个分支。这种想法在哈佛大学最为强烈,那里直到 20 世纪 80 年代才开设计算机科学专业;在那之前,人们必须主修应用数学。但在康奈尔大学也差不多。当我告诉可怕的康威教授我对人工智能(当时的热门话题)感兴趣时,他告诉我应该主修数学。我仍然不确定他是否认为人工智能需要数学,或者他是否认为人工智能是无稽之谈,而主修一些严谨的东西可以治愈我这种愚蠢的野心。

事实上,作为一个黑客,你需要的数学量比大多数大学部门喜欢承认的要少得多。我认为你需要的数学知识不超过高中数学加上计算理论中的一些概念。(如果你想避免编写 n^2 算法,你必须知道什么是 n^2 算法。)当然,除非你计划编写数学应用程序。例如,机器人技术完全是数学。

但是,虽然你实际上不需要数学来做大多数类型的黑客工作,但在知道 1001 个区分公式的技巧的意义上,数学本身非常值得研究。它是几乎任何类型工作的宝贵隐喻来源。[3] 我希望我在大学里学更多的数学,就是因为这个原因。

像很多人一样,我小时候在数学方面受到了虐待。我开始认为数学是一系列公式,这些公式既不优美,也与我的生活没有任何关系(尽管试图将它们翻译成“文字问题”),但必须记住才能在考试中取得好成绩。

在大学里,你可以做的最有价值的事情之一就是了解数学的真正含义。这可能不容易,因为很多优秀的数学家都是糟糕的老师。虽然有很多关于数学的流行书籍,但似乎很少有好的。我能想到的最好的是 W. W. Sawyer 的。当然还有欧几里得。[4]

一切

托马斯·赫胥黎说:“尝试了解关于一切的一些知识,以及关于某些事的一切知识。” 大多数大学的目标都是这个理想。

但什么是一切?对我来说,这意味着人们在诚实地解决难题的过程中所学到的一切。所有这些工作往往是相关的,因为一个领域的想法和技术通常可以成功地移植到其他领域。即使是那些看起来很遥远的领域。例如,我写文章的方式和我写软件的方式相同:我坐下来,尽快写出一个蹩脚的 1.0 版本,然后花几个星期重写它。

仅仅解决难题是不够的。中世纪的炼金术士正在解决一个难题,但他们的方法是如此虚假,以至于从研究中几乎学不到什么,除了可能了解人们自我欺骗的能力。不幸的是,我试图在大学里学习的那种人工智能也有同样的缺陷:一个非常困难的问题,却以绝望的、不充分的技术轻率地处理。大胆?更接近欺诈。

社会科学也相当虚假,因为它们受到知识时尚的很大影响。如果一位物理学家遇到一位 100 年前的同事,他可以教他一些新东西;如果一位心理学家遇到一位 100 年前的同事,他们只会陷入一场意识形态的争论。是的,当然,通过参加心理学课程,你会学到一些东西。关键是,通过参加另一个系的课程,你会学到更多。

在我看来,值得学习的系是数学、硬科学、工程、历史(特别是经济和社会史,以及科学史)、建筑和古典文学。艺术史概论课程可能是有价值的。现代文学很重要,但了解它的方法是阅读。我对音乐了解不够,无法评论。

你可以跳过社会科学、哲学以及最近为应对政治压力而创建的各个系。当然,这些领域中的许多领域都在谈论重要的问题。但他们谈论这些问题的方式毫无用处。例如,哲学除了其他事情之外,还谈论我们彼此的义务;但你可以从一位明智的祖母或 E. B. White 那里学到更多关于这方面的东西,而不是从一位学术哲学家那里。

我在这里是从经验出发说的。当人们嘲笑克林顿说“这取决于‘是’这个词的含义是什么”时,我可能应该感到冒犯。我在大学里上了大约五节关于“是”的含义是什么的课。

另一种找出哪些领域值得学习的方法是创建_辍学图_。例如,我知道很多人因为觉得数学太难而从数学转到计算机科学,但没有人做相反的事情。人们不会无缘无故地做困难的事情;除非它成比例地(或至少 log(n))更有回报,否则没有人会解决更困难的问题。因此,数学可能比计算机科学更值得学习。通过类似的比较,你可以制作一张大学所有系的图表。在底部,你会发现智力含量最少的科目。

如果你使用这种方法,你将得到与我刚才给出的答案大致相同的答案。

语言课程是一种反常现象。我认为它们最好被视为课外活动,比如陶艺课。当与在说该语言的国家生活一段时间相结合时,它们会更有用。作为一名新生,我一时兴起学习了阿拉伯语。这需要大量的工作,而且唯一持久的好处是识别闪米特语词根的奇怪能力以及对人们如何识别单词的一些见解。

工作室艺术和创意写作课程是通配符。通常你学不到太多东西:你只是在你想要的任何东西上工作(或不工作),然后在老师的模糊监督下,围坐在一起互相提供“评论”。但是写作和艺术都是非常困难的问题,(有些人)诚实地致力于解决这些问题,所以它们值得做,特别是如果你能找到一位好老师。

工作

当然,大学生必须考虑的不仅仅是学习。还有两个实际问题需要考虑:工作和研究生院。

从理论上讲,博雅教育不应该提供就业培训。但每个人都知道这有点虚伪。每所大学的黑客都会学习实用技能,而且不是偶然的。

你应该学习什么才能找到工作取决于你想要什么样的工作。如果你想在大公司工作,学习如何在 Windows 上破解 Blub。如果你想在一家很酷的小公司或研究实验室工作,你最好学习 Linux 上的 Ruby。如果你想创办自己的公司,我认为这会越来越普遍,那么掌握你能找到的最强大的工具,因为你将与你的竞争对手赛跑,而它们将是你的马。

你应该在大学里学习的技能与你在工作中使用的技能之间没有直接的关联。你应该在大学里把目标定得稍微高一点。

在训练中,一名足球运动员可能会卧推 300 磅,即使他在比赛过程中可能永远不需要施加那么大的力量。同样,如果你的教授试图让你学习比你在工作中需要的更高级的东西,这可能不仅仅是因为他们是脱离现实世界的学者。他们可能是在试图让你用你的大脑举重。

你在课堂上编写的程序与你在现实世界中编写的程序在三个关键方面有所不同:它们很小;你可以从头开始;而且问题通常是人为的和预先确定的。在现实世界中,程序更大,往往涉及现有代码,并且通常需要你在解决问题之前弄清楚问题是什么。

你不必等到离开(甚至进入)大学才能学习这些技能。例如,如果你想学习如何处理现有代码,你可以为开源项目做出贡献。你想要为之工作的雇主会对这一点印象深刻,就像对课堂作业的好成绩一样。

在现有的开源项目中,你没有太多机会练习第三项技能,即决定要解决什么问题。但是没有什么可以阻止你开始自己的新项目。好的雇主会对这一点印象更深刻。

你应该尝试解决什么样的问题?回答这个问题的一种方法是问你作为用户需要什么。例如,我偶然发现了一种很好的垃圾邮件过滤算法,因为我想停止收到垃圾邮件。现在我希望拥有的是一个邮件阅读器,它可以以某种方式防止我的收件箱被填满。我倾向于将我的收件箱用作待办事项列表。但这就像用螺丝刀打开瓶子;人们真正想要的是开瓶器。

研究生院

研究生院怎么样?你应该去吗?你如何进入一所好的研究生院?

原则上,研究生院是研究方面的专业培训,除非你想以研究为职业,否则你不应该去。然而,在计算机科学领域获得博士学位的人中,有一半没有从事研究工作。我没有去研究生院当教授。我去是因为我想学更多的东西。

因此,如果你主要对黑客技术感兴趣,并且你去研究生院,你会发现很多其他人在同样的情况下也格格不入。如果你周围有一半的人和你一样格格不入,你真的格格不入吗?

“计算机科学”中存在一个根本问题,它在这种情况下浮出水面。没有人确定“研究”应该是什么。很多研究都是必须塞进学术论文形式的黑客技术,以产生更多的出版物。

因此,问你是否能在研究生院找到归属感有点误导,因为很少有人能在计算机科学领域找到真正的归属感。整个领域都对自己的处境感到不舒服。因此,你主要对黑客技术感兴趣不应该阻止你进入研究生院。只是要警告你,你必须做很多你不喜欢的事情。

第一件事将是你的论文。几乎每个人在完成论文时都讨厌它。这个过程本质上倾向于产生令人不快的结果,就像用全麦面粉制成并烘烤十二个小时的蛋糕一样。很少有人会愉快地阅读论文,尤其是作者。

但是,在你之前,已经有成千上万的人经历了撰写论文的痛苦。除此之外,研究生院几乎是天堂。很多人都记得这是他们一生中最快乐的时光。几乎所有其他人,包括我,都记得这是一个本来可以是的时期,如果他们不必写论文的话。[5]

研究生院的危险在于你没有预先看到可怕的部分。博士课程一开始就像大学第二部分,有几年的课程。因此,当你面对撰写论文的恐怖时,你已经过去了几年。如果你现在退出,你将成为一名研究生院辍学生,你可能不会喜欢这个想法。当 Robert 因为编写 1988 年的互联网蠕虫而被研究生院开除时,我非常羡慕他找到了一种摆脱困境的方法,而没有失败的耻辱。

总的来说,研究生院可能比大多数其他选择更好。你会遇到很多聪明人,而你忧郁的拖延至少会是一种强大的共同纽带。当然,你最终会获得博士学位。我忘了这件事。我想这值一些钱。

博士学位最大的优势(除了是学术界的工会卡之外)可能是它给你带来了一些基本的信心。例如,我家里的 Honeywell 温控器具有最糟糕的用户界面。我的母亲也有同样的型号,她认真地花了一天时间阅读用户手册,以学习如何操作她的温控器。她认为问题出在她身上。但我可以这样想:“如果一个拥有计算机科学博士学位的人都无法理解这个温控器,那么它_一定_设计得很糟糕。”

如果你在听了这份模棱两可的建议后仍然想去研究生院,我可以给你关于如何进入研究生院的可靠建议。我的很多朋友现在都是计算机科学教授,所以我了解招生方面的内幕消息。这与大学截然不同。在大多数大学里,招生人员决定谁可以进入。对于博士课程,教授们会做出决定。他们会努力做好这件事,因为他们招收的人将为他们工作。

显然,在最好的学校里,只有推荐信才真正重要。标准化考试毫无价值,成绩也无关紧要。文章主要是通过说一些愚蠢的话来取消自己资格的机会。教授们唯一信任的是推荐信,最好是来自他们认识的人。[6]

因此,如果你想进入博士课程,关键是要给你的教授留下深刻的印象。从我的教授朋友那里,我知道什么会给他们留下深刻的印象:不仅仅是试图给他们留下深刻的印象。他们不会对那些成绩好或想成为他们的研究助理以便进入研究生院的学生留下深刻的印象。他们会对那些成绩好并且想成为他们的研究助理的学生留下深刻的印象,因为他们对这个话题真正感兴趣。

因此,无论你是想进入研究生院还是只是擅长黑客技术,你在大学里能做的最好的事情就是弄清楚你真正喜欢什么。很难欺骗教授让你进入研究生院,也不可能欺骗问题让你解决它们。大学是伪装停止工作的地方。从这一点开始,除非你想去一家大公司工作,这就像回到高中一样,否则前进的唯一方法是通过做你热爱的事情。

注释

[1] 似乎没有人介意,这表明早在 1984 年,Arpanet(后来成为互联网)是多么的不重要。

[2] 这就是为什么,当我成为雇主时,我不在乎 GPA。事实上,我们积极寻找那些因在课堂上表现不佳而被学校开除的人。我们曾经在哈佛大学周围张贴海报,上面写着:“你是否因为把所有时间都花在自己的某个项目上而因课堂表现不佳而被开除?来为我们工作吧!” 我们设法找到一个被开除的孩子,他是一个伟大的黑客。

当哈佛大学将本科生开除一年时,他们必须找到工作。这样做的目的是让他们了解现实世界是多么的可怕,这样他们就会明白自己能上大学是多么的幸运。这个计划对来我们公司工作的那个家伙适得其反,因为他比在学校里更开心,而且那一年从股票期权中赚到的钱比他的任何一位教授的工资都多。因此,他没有在年底忏悔地爬回来,而是又休了一年假去了欧洲。他最终在 26 岁左右毕业。

[3] Eric Raymond 说,黑客最好的隐喻来自集合论、组合学和图论。

Trevor Blackwell 提醒你参加为数学专业学生开设的数学课程。“‘为工程师开设的数学’课程非常糟糕。事实上,任何‘为工程师开设的 x’课程都很糟糕,其中 x 包括数学、法律、写作和视觉设计。”

[4] 其他强烈推荐的书籍:什么是数学?,作者 Courant 和 Robbins;几何与想象,作者 Hilbert 和 Cohn-Vossen。对于那些对平面设计感兴趣的人,Byrne's Euclid

[5] 如果你想拥有完美的生活,你应该做的事情是去研究生院,在第一年或两年秘密地写完你的论文,然后在接下来的三年里尽情享受,一次滴出一章。这个前景会让研究生们垂涎三尺,但我不知道有谁有纪律性来完成它。

[6] 一位教授朋友说,他们每年招收的研究生中有 15-20% 是“冷门”。但他所说的冷门是指那些申请在各个方面都很完美,只是招生委员会中没有人认识写推荐信的教授的人。

因此,如果你想进入科学领域的研究生院,你需要去一所有真正的研究教授的大学。否则,无论你有多优秀,在招生委员会看来,你都是一个有风险的赌注。

这意味着一个令人惊讶但显然不可避免的后果:小型文理学院注定要失败。大多数聪明的孩子至少会考虑进入科学领域,即使他们最终选择不进入。为什么要上一所限制他们选择的大学呢?

感谢 Trevor Blackwell、Alex Lewin、Jessica Livingston、Robert Morris、Eric Raymond 和几位匿名计算机科学教授 阅读了本文的草稿,并感谢那些提出问题的学生。