如何成为优秀计算机学生
January 24, 2021

本文亦见载于知乎关于迟先生的问题下,戳此链接

前段时间有一个复旦计算机的学弟问我,计算机学的好的学生有哪些特质。我觉得这个问题非常值得深入地探讨与总结,并没有当即回复他,而是许诺了这样一篇文章。

我并不认为自己是非常顶尖的计算机学生,但自从我 13 年在雅礼中学开始做信息学竞赛以来,我见识过太多优异的计算机学生,在方方面面透露出“我是大佬”的气息。子曰:“见贤思齐”,在这个过程中,我并没有产生自卑的情绪,而是发自内心地佩服他们,并想向他们靠齐。为此,我有过一些深刻的观察,究竟是什么塑造了一位计算机大佬,如何才能培养一名优秀的计算机学生。

在这篇文章中,我将会分享这些观察,并给出宏观上的见解,至于实操性的建议,则留待之后的文章分解。我自己仍在成为更优秀的计算机学生的路上前进,希望能与各位共勉。

培养能力而非其他

无论你是否承认,计算机世界是慕强的。能力的高低在计算机面前一眼就能看出——能否快速解决问题是评价的唯一标准,而学历、分数则都是衍生的(derived)、辅助的指标。但很可惜,很多人倒置了这一判断标准,以成绩的追求掩盖了能力的提升。

这或许是导致【卷】的重要因素。

我的第一个观察是,这些大佬们,无一不把培养能力的优先级提到所有其他事项之前。

计算机类的专业,培养学生的目的实际上只有一个,那就是解决问题。无论是进入工业界造产品,还是在学术界做科研,你被需求的本质原因是你能解决问题,这也是计算机学生能力范畴里最重要的一环。

从消除编译错误,到提高分布式系统的吞吐;从复现一篇前人论文,到站在已知的科研工作上创造新的洞见,这一系列活动中充满了需要被解决的问题。而为了解决这些问题,你必须在本科期间努力培养自己这方面的能力——打好知识体系基础,真正地理解现有的设计,并在这个基础上动手重造轮子、hack 甚至是改良。

大佬之所以为大佬,不是因为他们功课成绩好,而是因为他们持续地在提高自己的能力——而这个过程,可以是非常令人享受的。

反过来说,诸君不妨扪心自问,你奋力追逐的有限资源,真的对你的能力提升有重大价值吗?

我知道的很多大佬,在学校的成绩并不好——因为他们会翘掉那些明显粗制滥造、毫无营养的学业课,而谋求自学优秀的公开课[^1: 这里并不是在鼓励你不要上学校的课,而是提醒你明白你的目的是提高能力,而不是上课,如果学校的课可以满足这个目的,那么你应该积极主动地投入]。

而对于升学,如果你没有想清楚更高的学历究竟能带给你什么,只是随大流或者逃避你终要面对的问题,这种战略上的怠惰只会令你更加痛苦。

见识决定了你的上限

我的第二个观察是,好的计算机学生,都对这个领域拥有着强烈的好奇,有着广泛的兴趣,并对前沿和潮流拥有敏锐的嗅觉和认知。

从主观上说,叫见识广,从客观来讲,叫拥有足够的 exposure(原谅我不知道怎么翻译这个词)。 我从两个方面叙述。

第一个方面是,在学习计算机的初期阶段,需要尽可能地对这个学科产生大局观。计算机世界的一切,都围绕着计算展开的。从计算的本质——算法、数据结构、计算复杂性出发,落到实践上就是从二进制指令到 CPU 的工作原理,从编译到操作系统,从网络到分布式系统,再推而广之到各种计算机应用,整个计算机领域会在你面前形成一幅广阔的图景,而你则是整个世界的主人。

拥有大局观的好处在于,你不会钻牛角尖,不会产生【学计算机就是炼丹】的狭隘观感,你知道世界很大,天地广阔,万物可爱。

并且,你会保持谦逊,激发好奇——这就是蜕变的开始。

第二个方面是需要提升自己对这门学科的【品味】。学计算机的人,就像学做菜的厨师,品味(taste)是最重要的素质,而【过时的东西】则是对品味最严重的破坏。

须知,计算机科学是一个蓬勃发展的学科,新的技术层出不穷,升级、变革、颠覆无时不刻不在发生。你需要培养自己在这个领域的嗅觉和见识——不一定要追逐潮流,但你一定要知道潮流的方向。 软件之于硬件,最重大的优势在于极低的迭代成本(相对而言,这个优势的背面是极高的复杂度和历史的重演),老的技术被淘汰的速度远远超过其他任何一门学科。这个特征的结果是,学校里教的东西很多都过时了,你必须要自己花时间来考虑自己究竟要学什么,你必须突破语言的屏障,你必须广泛阅读。

何以培养品味?唯有广泛的见闻。去了解,去探索,去品尝,去对比,去总结。

优秀的计算机学生,会对整个领域都有一定的了解,并且对新兴的技术保持极高的热情——而不是故纸堆里的往年考题。

努力决定了你的下限

我的第三个观察是,那些计算机大佬往往付出了比你想象得多的努力。

当你见识了这个广阔的图景,了解到了很多时髦词汇(buzzwords),你不应该只停留于此,而是在打好基础后朝着一个方向去深入,这个过程需要卓绝的努力。

见识广的计算机学生并不少,但如果只是流于侃侃而谈,而没有做事,则只会积攒你的焦虑。

打基础的方式很简单。

计算机科学发展这么些年来,已经涌现出了非常多优秀的教材,比如计算机系统导论的 CSAPP(Compter System: An Programmer's Perspective)、编程理论入门的 SICP(Structure and Interpretation of Computer Program)、操作系统的 OSTEP(Operating System Three Easy Pieces)、计算机网络的自顶向下方法(Computer Networking: A Top-down Approach)、数据库系统的 DBSC(Database System Concepts)、分布式系统的 DDIA(Design Data Intensive Application)等等[^: 这里的视角更偏向 system 一些,但 system 应当是其他应用方向的基础]。 这些教材每一本拿出来都是一块砖,但却是绕不过的学科基石。如果在打基础阶段你不付出努力来真正吃透这些内容,你会在未来无数次地后悔。

读书是苦功夫,但需要佐以聪明的方法、灵活的实践,这些也是努力的一部分。

强者之所以强,天赋或智商可能有一定作用。但我很喜欢陈立杰说过的一句话:

“以大多数人努力程度之低,根本轮不到拼智商。”

计算机科学,特别是应用方向,在我看来,纯粹是技能的训练,意即【只要肯花时间就一定能学会】。

这并不是鼓吹死读书,而是想说明,努力是不可绕过的。

你可能看到了交大的迟先生能力过人,但你没看到他大一就自己刷完了 CSAPP、造过 CPU、写过操作系统和光线追踪;你可能看到了陈立杰初三开始搞信息学竞赛,高一就能进国家集训队,但你没看到他废寝忘食、高强度的刷题训练。

而你究竟投入了多少时间到计算机之中呢?

自驱:让这个过程更加美好

上面的论述似乎在塑造一种【超人观】,似乎对人过于苛求。毕竟如迟先生、陈老师这种超一流的计算机科学学生只是少数。对于大部分人来说,目的可能只是学好计算机,找到好工作——为什么要这么苦呢?

实际上,如王小波所言:“人的一切痛苦,本质上都是对自己无能的愤怒。”

不得不说,从零开始冷启动学习计算机的确是差异极大的体验。为学计算机而感到痛苦的,往往是那些还没有越过某个坎的学生。

有些人很快就完成了冷启动的历程,并感受到了计算机科学内在的逻辑与美感,在学习之中收获了正面的反馈,从而把学习作为了一种享受。

而有很多学生则长时间无法完成这一步蜕变,始终在琐碎、迷茫与挫败的泥泞之中挣扎。

之所以会造成这样的分野,在我看来与一种【接受灌输】的惰性思维习惯有关。如果你仍在挣扎之中,你可能需要反思一下自己长期以来的学习和思考习惯是否足够【自驱】。

我们的教育中有着太多表象性的灌输,缺乏对深层次的原理的探究,这对于计算机科学的学习来说,是致命的坏实践。有多少次,你只是记住了答案,而不知道原因?有多少次,你只看到了表象,而忽视了深挖其本质?

你可以在那些优秀的计算机学生身上看到一种闪着光的对于探究的自驱力。这是一种超越教材和考试的要求的对【为什么】的追问。为此也是因此,他们拥有了强大的资料搜索能力、信息分辨能力以及动手实践的能力,日积月累下来,差距就是这么被拉开的。

分享:与世界一起成长

探索与求证的结果,往往是较为独到的新见解,因此另一个观察是,这些大佬们非常乐于分享自己在这个过程中的收获。

在线下,他们可能会很乐于帮助身边的同学,而在线上,则会是积极的优质内容生产者。

从知识点的讲解,到一次探究经历的记录;从一道算法题的题解,到一篇论文的读后笔记。计算机科学的学习与成长之路上有太多可以记录与分享的美好景色。

我自己正是在实践这个模式——各位能看到这篇文章正是因为我希望分享自己的观察与思考。一方面,把自己的想法正式地整理成文字的过程是对思维的再次提升,可以形成更加体系化的见解;另一方面,分享后收获的认可与鼓励可以反过来激励自己学习更多、思考更多、产出更多。如果自己分享的内容能真正地帮到别人,则会给自己带来极大的成就感与幸福感!

创造:本质幸福的来源

上面关于分享的说法已经触及到了超越【学习计算机科学】的更本质的人生哲学话题。

人生来是为创造的。我们是天生的创作者,从工具到艺术品,创造是充满美感的体验。如果说学会编程给人带来最重要的意义,那必然是赋予了你用程序来创造的能力。简单如复刻一个已有的轮子,复杂如构建一个分布式数据库,创造是非常美妙的体验。

那些找到了对计算机科学的热爱的人,无一不是善于创造、乐于创造的。

须知,资源竞争是零和的残酷游戏,而创造则是有着广阔无垠可能性的自由之疆!

让我们一起用代码来改变世界吧!

后记:科班教育能带给我们什么

我于去年(2020 届)本科毕业于复旦大学计算机科学技术专业。和交大不同,复旦计算机的许多课程,简直是张牙舞爪地在告诉你,别来上,没用的,自己学,丝毫不会掩饰(借此机会重点点名批评:计算机图形学、计算机视觉。因为我特意避免了一些课,没有亲身上过,如果你有特别的认知,欢迎找我补充)。这样的好处在于,有心之人可以很快领悟到,学校是在锻炼我们的自学能力——which turns out to be the most critical and helpful quality for computer science students.

不过从我这届开始,也涌现出了非常多的希望改革、谋求进步的本科生助教。我有幸担任了 2019 年模式识别与机器学习、2020 年数据库、2020 年计算机系统导论的助教,类似我这样的还有倾心数据结构的高大爷、计算机系统导论和操作系统的蔡大师和俊逸爷等等。更令人激动的,是这种本科生助教的传承,17 级担任操作系统助教的罗翔和洪钦是我们的学生,而 18 级担任计算机系统导论助教的薛大爷则是他们的学生。

而这种学生内部的改良和传承,效果是非常明显的——学生一届比一届强。譬如去年罗翔和马逸君带队和 18 级的几个小朋友代表复旦大学首次参加龙芯杯就力压清华斩获特等奖(这个牛我替他们能吹一辈子),这在过去是完全不可想象的;而对于 18 级和 19 级的学生,我只觉得他们深不可测,未来会更好。

回到这个小节的标题,究竟本科的计算机科班教育能带给我们什么?

我觉得最重要的,是一种氛围,人塑造的氛围,是大家一同学习、协作、挑战、创造的氛围。

实际上,对于清北复交等高水平院校,最重要的是生源。你把优秀的学生聚集在一起,给他们提供良好的自由生长的环境,并佐以资源(一些好的老师、出国交流、加入实验室的机会等等),他们就会茁壮成长。从这一点上说,复旦是及格的。而交大,如果说激烈的竞争是减分项、更优质的资源是加分项,考虑到他更好的氛围,这个成绩应该是稍高于复旦的。

所以,复旦可能只输在【因为人文气息过于浓厚导致技术氛围的式微】上,liberal arts (通识)的教育的确会给学生沾染上诗人的气质,但这和技术并不矛盾,只是需要额外的培育——毕竟本质上说,code is poetry(代码是诗歌)。

于是我集结了不少复旦大学的计算机相关专业的学生,成立了一个名为 FDUCSLG 的组织,希望能够为复旦带来更多技术氛围,也希望能帮助大家实践我上述提到的那些关于如何学好计算机的想法。如果你是就读于或者毕业于复旦的技术爱好者,欢迎用你的复旦学号邮箱写邮件(mailto: [email protected])给我们,告诉我们你的年级、专业、兴趣方向和其他想介绍的基本信息,我们就会拉你进入我们的 slack 组织!

我们成立了很多特别兴趣小组,你可以在这里找到志同道合的小伙伴;我们也特别关注成长、效率与创造,会组织公开课学习、论文阅读分享等活动。

欢迎你的加入!