大学教育
想创业?申请 Y Combinator 的资助。
2005年3月
(本文部分内容源于对给我写信提问的学生们的回复。)
最近我收到几封计算机科学专业本科生的邮件,询问在大学里应该做什么。我可能不是最好的建议来源,因为我在大学主修的是哲学。不过我选修了那么多计算机科学课程,以至于大多数CS专业的学生都以为我是他们专业的。至少,我确实是个黑客。
黑客技能
在大学里要如何成为一名优秀的黑客?主要有两件事要做:成为非常优秀的程序员,以及学习大量具体而有趣的问题。这两件事其实是等价的,因为其中一件会推动你去完成另一件。
要成为优秀的程序员,你需要(a)大量练习(b)解决困难的问题。而让自己去解决困难问题的方法,就是去做一些非常吸引人的项目。
“想象力比知识更重要"的一阶导数是"好奇心比纪律更重要”。[1] 没有什么比一个引人入胜的项目能让你更快地变得聪明。这个项目很可能不是课堂作业。我的朋友罗伯特在本科时就通过编写网络软件学到了很多。他的一个项目是连接哈佛大学到阿帕网;哈佛曾是阿帕网的原始节点之一,但到1984年时连接已经中断了。[1] 这项工作不仅不是课程作业,而且因为他把所有时间都花在这上面而忽视了学业,结果被学校停学一年。[2] 最终一切都得到了平衡,现在他是麻省理工学院的教授。不过你最好不要走这个极端;这让他当时非常担心。
另一种成为优秀程序员的方法是找到其他优秀的程序员,学习他们的知识。程序员往往会根据他们所做的工作类型和使用的工具形成不同的群体,有些群体比其他群体更聪明。观察你周围的人,看看聪明的人都在做什么;这通常是有原因的。
你周围最聪明的人可能是教授。所以找到有趣工作的一个方法是自愿担任研究助理。教授们特别需要能解决繁琐的系统管理类问题的人,这是进入他们实验室的一个途径。他们最担心的是那些不靠谱的人和只是为了简历好看的人。助理反而增加工作量的情况太常见了。所以你必须清楚地表明你会带来净收益。
如果他们拒绝你,别灰心。拒绝通常没有被拒绝者想象的那么个人化。继续找下一个就是了。(这个建议也适用于约会。)
要小心,因为虽然大多数教授都很聪明,但并不是所有人都研究有趣的东西。教授必须发表新颖的研究成果才能晋升,但在更有趣的研究领域竞争更激烈。所以一些不太有野心的教授会发表一系列论文,其结论之所以新颖是因为没有人在乎这些研究。你最好避开这些。
我从未当过研究助理,所以推荐这条路让我感觉有点不诚实。我是通过编写自己的程序来学习编程的,特别是尝试逆向工程 Winograd 的 SHRDLU。我对那个程序的痴迷程度就像妈妈对自己宝宝一样。
独自工作的缺点虽然很多,但优点是项目完全属于你自己。你永远不需要妥协或征求任何人的许可,如果你有新想法,可以直接坐下来开始实现。
在自己的项目中,你不需要担心新颖性(像教授那样)或盈利能力(像企业那样)。唯一重要的是项目在技术上的难度,这与应用的性质无关。“严肃"的应用如数据库在技术上往往是简单而乏味的(如果你失眠,可以试试阅读数据库方面的技术文献),而"轻浮"的应用如游戏往往非常复杂。我敢肯定,有些游戏公司开发的产品比大学计算机系底层90%的研究都更具创新性和技术含量。
如果我现在还在上大学,我可能会研究图形学:比如网络游戏,或者3D动画工具。我上大学时计算机的计算能力还不够强大,无法让图形学变得有趣,但现在很难想象还有什么比这更有趣的工作了。
数学
当我在大学时,很多教授都相信(或者至少希望)计算机科学是数学的一个分支。这种想法在哈佛最为强烈,那里直到1980年代才设立计算机科学专业;在那之前,学生必须主修应用数学。但在康奈尔大学也差不多。当我告诉可怕的康威教授我对人工智能感兴趣时(当时这是个热门话题),他告诉我应该主修数学。我到现在也不确定他是认为AI需要数学,还是认为AI是胡扯,学点严谨的东西能治好我这种愚蠢的抱负。
事实上,作为黑客所需的数学知识比大多数大学院系愿意承认的要少得多。我认为你只需要高中水平的数学,再加上一些计算理论的概念就够了。(如果你想避免写出n^2算法,你必须知道什么是n^2算法。)当然,除非你打算编写数学应用程序。比如机器人技术就全是数学。
但虽然对于大多数类型的黑客工作来说,你并不真正需要数学(就掌握1001个求导公式的意义而言),数学仍然非常值得学习。它是几乎所有工作的宝贵隐喻来源。[3] 我后悔在大学时没有多学一些数学。
和很多人一样,我在童年时被数学虐待过。我学会了把数学看作是一堆既不好看又与我的生活毫无关系(尽管试图把它们翻译成"应用题”)的公式,但为了考试必须死记硬背。
在大学里你能做的最有价值的事情之一就是了解数学的真正含义。这可能不容易,因为很多优秀的数学家都是糟糕的教师。虽然有很多关于数学的通俗读物,但似乎很少有好的。我能想到最好的有 W.W.Sawyer 的书。当然还有欧几里得的著作。[4]
全面发展
托马斯·赫胥黎说:“试着了解一切中的一些,和一些中的一切。“大多数大学都以此为目标。
但什么是"一切”?对我来说,它意味着人们在诚实地解决困难问题时所学到的一切。所有这样的工作都是相互关联的,因为一个领域的想法和技术往往可以成功地移植到其他领域。甚至是那些看起来相距甚远的领域。例如,我写文章的方式和我写软件一样:我先坐下来快速写出一个糟糕的1.0版本,然后花几周时间重写它。
仅仅解决困难问题是不够的。中世纪的炼金术士也在解决困难问题,但他们的方法太荒谬了,除了可能了解人们自我欺骗的能力外,几乎没有什么可学的。不幸的是,我在大学时试图学习的AI也有同样的缺陷:一个非常困难的问题,却用完全不够格的方法轻率地处理。大胆?更接近欺诈。这种荒谬的东西比比皆是。例如,文学理论领域几乎完全是荒谬的。他们似乎有时在写一些困难的问题,但该领域的标准如此之低,以至于只要用足够复杂的方式说出来,就不必说任何有趣的东西。[6]
顺便说一下,我并不是说文学是荒谬的,只是说研究它的方式应该像它的实践者那样。小说家诚实地解决困难问题。事实上,正是因为这项工作如此困难,才会出现文学理论。大多数文学理论家如果能的话都会成为作家,就像大多数艺术评论家如果能的话都会成为艺术家一样。
社会科学也相当荒谬,因为它们太受学术思潮的影响。如果一个物理学家遇到100年前的同事,他可以教他一些新东西;如果一个心理学家遇到100年前的同事,他们只会陷入意识形态的争论。是的,当然,上心理学课你会学到一些东西。关键是,上其他院系的课你会学到更多。
在我看来,值得学习的院系有:数学、硬科学、工程、历史(特别是经济史、社会史和科学史)、建筑和古典学。艺术史概览课程可能值得一上。现代文学很重要,但学习它的方式就是阅读。我对音乐了解不够,无法评论。
你可以跳过社会科学、哲学,以及最近因政治压力而创建的各种院系。这些领域当然都在谈论重要的问题。但他们谈论问题的方式是无用的。例如,哲学谈论(除其他外)我们彼此之间的义务;但你可以从一位明智的祖母或 E.B.White 那里学到更多,而不是从学术哲学家那里。
我在这里说的是经验之谈。当人们嘲笑克林顿说"这取决于’是’这个词的含义是什么"时,我可能应该感到被冒犯。我在大学里上了大约五节课来研究"是"这个词的含义是什么。
另一种找出哪些领域值得学习的方法是创建退学图谱。例如,我知道很多人从数学转到计算机科学是因为他们觉得数学太难了,而没有人做相反的事情。人们不会无缘无故地做困难的事情;除非回报成比例(或至少是log(n))更高,否则没有人会去解决更困难的问题。所以数学可能比计算机科学更值得学习。通过类似的比较,你可以为大学里的所有院系创建一个图谱。在底部你会发现技术含量(智力要求)最低的学科。
如果你用这种方法,你会得到和我刚才给出的差不多的答案。
语言课程是个特例。我认为它们更像是课外活动,就像陶艺课一样。如果能在说这种语言的国家生活一段时间,它们会更有用。我一时兴起在大一时学了阿拉伯语。这花了很多功夫,唯一持久的收获是能识别闪米特语词根的能力,以及一些关于人们如何识别单词的见解。
工作室艺术和创意写作课程是未知数。通常你学不到什么:你只是(或不)做任何你想做的事情,然后在老师的模糊指导下坐在一起互相"批评"对方的作品。但写作和艺术都是非常困难的问题,有些人诚实地努力解决这些问题,所以值得去做,特别是如果你能找到一位好老师。
工作
当然,大学生要考虑的不只是学习。还有两个实际问题需要考虑:工作和研究生院。
理论上,通识教育不应该提供职业培训。但每个人都知道这有点自欺欺人。每个大学的黑客都在学习实用技能,而且不是偶然的。
你应该学习什么来获得工作取决于你想要什么样的工作。如果你想在大公司工作,学习如何在Windows上用Blub语言编程。如果你想在酷酷的小公司或研究实验室工作,学习如何在Linux 上用 Ruby 写代码会更好。如果你想创办自己的公司(我认为这种情况会越来越普遍),掌握你能找到的最强大的工具,因为你要和竞争对手赛跑,它们就是你的马。
你在大学里应该学习的技能和你工作中会使用的技能之间没有直接关联。你在大学里应该瞄准稍高一点的目标。
在训练中,橄榄球运动员可能会卧推140公斤,即使他在比赛中可能永远不需要使出那么大的力量。同样,如果你的教授试图让你学习比工作中需要的更高级的东西,这可能不仅仅是因为他们是脱离现实的学者。他们可能是在试图让你的大脑举重。
你在课堂上写的程序与你在现实世界中写的程序有三个关键区别:它们很小;你可以从头开始;问题通常是人为的、预设的。在现实世界中,程序更大,往往涉及现有代码,而且经常需要你先弄清楚问题是什么才能解决它。
你不必等到离开(或甚至进入)大学才学习这些技能。例如,如果你想学习如何处理现有代码,你可以为开源项目做贡献。你想要的雇主会像重视课堂作业的好成绩一样重视这一点。
在现有的开源项目中,你在第三个技能(决定解决什么问题)方面得不到太多练习。但没有什么能阻止你开始自己的新项目。而且好雇主会更重视这一点。
你应该尝试解决什么样的问题?回答这个问题的一个方法是问你自己作为用户需要什么。例如,我偶然发现了一个好的垃圾邮件过滤算法,是因为我想停止收到垃圾邮件。现在我希望能有一个邮件阅读器,能以某种方式防止我的收件箱被填满。我倾向于用收件箱作为待办事项列表。但这就像用螺丝刀开瓶子;人们真正想要的是一个开瓶器。
研究生院
关于研究生院呢?你应该去吗?如何进入一个好的研究生院?
原则上,研究生院是研究方面的专业培训,除非你想把研究作为职业,否则不应该去。然而,获得计算机科学博士学位的人中有一半并没有进入研究领域。我去研究生院不是为了成为教授。我去是因为我想学习更多。
所以,如果你对技术技巧特别感兴趣,去读研究生时,你会发现很多人和你一样感到不适应。如果你周围有一半的人都感到无所适从,那么你的不知所措,就不应该是你的错吧?
‘计算机科学’有一个根本性的问题,在这种情况下尤为明显。没有人能明确界定‘研究’的真正含义。许多研究只是为了发表而被迫写成学术论文,实际上不过是一些临时拼凑的技巧。
所以问你在研究生院是否会感到自在其实有些误导,因为在计算机科学领域,很少有人真正感到舒适。整个领域都让人感到不安。因此,如果你对编程感兴趣,这不该阻止你去读研究生。只是要提醒你,可能会有很多你不喜欢的事情需要去做。
第一件就是你的论文。几乎每个人在完成论文时都讨厌它。这个过程本质上倾向于产生一个不愉快的结果,就像用全麦面粉烤了十二个小时的蛋糕。很少有人会愉快地阅读论文,尤其是作者自己。
但成千上万的人在你之前都熬过了写论文的痛苦。除此之外,研究生院几乎是天堂。许多人把它记作他们一生中最快乐的时光。几乎所有其他人,包括我,都把它记作一个如果没有论文就会很美好的时期。[5]
研究生院的危险在于你看不到可怕的部分。博士项目开始时是大学的第二部分,有几年的课程。所以当你面对写论文的恐怖时,你已经投入了几年时间。如果你现在退出,你就会成为研究生院的辍学生,你可能不会喜欢这个想法。当罗伯特因为编写1988年的互联网蠕虫而被研究生院开除时,我非常羡慕他找到了一个没有失败耻辱的出路。而他却因为康奈尔开除他而不高兴,这个不知感恩的家伙。
总的来说,研究生院可能比大多数替代选择都要好。你遇到很多聪明的人,你的沮丧拖延至少会成为一个强大的共同纽带。当然最后你还会有一个博士学位。我差点忘了这个。我想这应该值点什么。
博士学位最大的优势(除了是学术界的工会卡之外)可能是它给你一些基本的自信。例如,我家的霍尼韦尔恒温器有最糟糕的用户界面。我母亲有同样的型号,她认真地花了一天时间阅读用户手册来学习如何操作。她认为问题出在她身上。但我可以对自己说"如果连计算机科学博士都搞不懂这个恒温器,那一定是设计得太糟糕了。”
如果你在听完这个模棱两可的建议后仍然想去研究生院,我可以给你一些关于如何进入的可靠建议。我有很多朋友现在是CS教授,所以我有关于录取的内部消息。这和本科很不一样。在大多数大学,招生官决定谁被录取。对于博士项目,是教授们决定。他们试图做好这件事,因为他们录取的人将为他们工作。
显然在最好的学校只有推荐信真正重要。标准化考试毫无意义,成绩也几乎不重要。论文主要是让你说些蠢话来取消自己资格的机会。教授们唯一信任的是推荐信,最好是来自他们认识的人。[6]
所以如果你想进入博士项目,关键是给你的教授留下深刻印象。从我那些现在是教授的朋友那里,我知道什么会给他们留下深刻印象:不仅仅是试图给他们留下深刻印象。他们不会被那些为了进入研究生院而想成为研究助理的好学生打动。他们会被那些因为真正对主题感兴趣而想成为研究助理的好学生打动。
所以在大学里你能做的最好的事情,无论你是想进入研究生院还是想成为优秀的黑客,就是找出你真正喜欢什么。你很难骗教授让你进入研究生院,更不可能骗问题让你解决它们。大学是假装不再起作用的地方。从这一点开始,除非你想去大公司工作(这就像回到高中),否则前进的唯一方式就是做你热爱的事情。
注释
[1] 当我在大学时,很多人都有爱因斯坦的海报,上面印着"想象力比知识更重要"。我想对许多人来说这是愿望思维;它似乎意味着人们不必学习。事实上,爱因斯坦可能的意思是:知识极其重要,但在两个都有丰富知识的人中,想象力更强的人会做得更好。不过这样说的话就不那么朗朗上口了。[1] 似乎没有人介意,这表明阿帕网(后来成为互联网)直到1984年仍然多么不重要。
[2] 这就是为什么当我成为雇主时,我不在乎GPA。事实上,我们主动寻找那些被学校开除的人。我们曾在哈佛周围贴海报说"你是否因为把所有时间都花在自己的项目上而成绩不好被开除?来为我们工作吧!“我们找到了一个这样的孩子,他是个很棒的黑客。
当哈佛让本科生停学一年时,他们必须找工作。这个想法是向他们展示真实世界有多糟糕,这样他们就会明白在大学里有多幸运。这个计划对我们雇用的那个人适得其反,因为他在那一年比在学校里玩得更开心,而且从股票期权中赚的钱比他的任何教授从工资中赚的都多。所以他没有在年底悔恨地爬回来,而是又休了一年去欧洲。他最终在26岁左右毕业。
[3] Eric Raymond说黑客最好的隐喻来自集合论、组合学和图论。
Trevor Blackwell提醒你要上为数学专业设计的数学课。"‘工程数学’课程糟糕透顶。事实上任何’x for engineers’都很糟糕,其中x包括数学、法律、写作和视觉设计。”
[4] 其他强烈推荐的书:Courant和Robbins的《什么是数学?》;Hilbert和Cohn-Vossen的《几何与想象》。对于那些对图形设计感兴趣的人,还有Byrne的欧几里得。
[6] 你不可能比发表安慰剂更低级,就像索卡尔事件中发生的那样。[5] 如果你想过完美的人生,最好的做法是去研究生院,在前一两年秘密写完论文,然后在接下来的三年里尽情享受,一点一点地交出一章。这个前景会让研究生们流口水,但我知道没有人有足够的纪律性来做到这一点。
[6] 一位教授朋友说,他们每年录取的研究生中有15-20%是"长线"。但他说的长线是指那些申请在各方面都完美,只是录取委员会中没有人认识写推荐信的教授的人。
所以如果你想进入科学领域的研究生院,你需要去一所拥有真正研究教授的大学。否则,无论你多优秀,对录取委员会来说你都会显得风险太大。
这暗示了一个令人惊讶但似乎不可避免的后果:小型文理学院注定要失败,除了那些有意识地努力在科学领域出类拔萃的少数学校。大多数聪明的高中生至少会考虑进入科学领域,即使他们最终选择不这样做。为什么要去一所限制他们选择的大学?
感谢Trevor Blackwell、Alex Lewin、Jessica Livingston、Robert Morris、Eric Raymond和几位匿名的CS教授阅读本文的草稿,感谢那些提出问题的学生们,是他们的提问促成了这篇文章。
英文版:paulgraham.com/college.html|中文版:HiJiangChuan.com/paulgraham/041-undergraduation
更新记录:
- 2025-03-31 HiJiangChuan 初稿翻译,术语待验证;