我为什么选择计算机专业
凡是 LUG 的活跃会员,都早晚会被吸引进码农的圈子。
这个谣言的出处及真假暂不考证。到底是 LUG 的氛围把小伙伴们引上了码农这条不归路,还是打定了主意走码农路的才会长期活跃在 LUG,我说不清。
为什么选择计算机专业,事实上是两个命题:
- 为什么选择计算机作为未来的职业?
- 为什么本科期间选择计算机专业?
我试图用自己的经历来解读这两个命题。少年时代,我曾把科学家作为自己的梦想,高三那会儿想的是做理论计算机研究。在大一升大二的关头,我曾在数学和计算机之间徘徊抉择,还曾考虑过学物理。因为想不清楚,大一下学期的时候我并没有申请转专业。在大二上学期开学一周后,我感觉不能继续混沌下去了,于是提交了转专业申请,从第二周开始,踏上了码农的不归路。
少年的科学家之梦
小时候,跟很多人一样,我的梦想是成为一个科学家。直到高中,我的偶像一直是钱学森。我喜欢前总理的一句诗:“我仰望星空,它是那样寥廓而深邃;那无穷的真理,让我苦苦地求索、追随。” 自然科学领域有太多美妙而值得探索的东西,小时候看的各种科普更是让我感觉与科学相见恨晚。
为了能学到更多的知识,我不顾老师和家长 “要集中精力” 的劝阻,除了生物竞赛以外全报了,周六周日的上午下午都排满了。反正不用交钱,不听白不听。现在还不到评判当年的选择是否正确的时候,但我确实很享受这段充实的时光。自然科学还在很大程度上影响了我的三观。高一的时候,通过物理竞赛听说了热力学第二定律,听说了 “熵增” 的原理和 “热寂论”,就开始思考人生的意义了,当然现在看来都是虚无缥缈的。高中毕业的时候,我对数学、物理和计算机并没有特别的倾向。
刚进科大的时候,我的想法是在本科阶段打好数学基础,然后去搞理论计算机研究(就是可计算性理论、算法之类的),其实我也不懂理论计算机到底是个什么玩意。科大保送生有个先修大学课程的计划,“义务劳动” 老师给我的建议是:本科打好数学基础,以后从事各种研究都比较方便。理论计算机虽说是数学和计算机的交叉学科,其研究方法很多还是从数学里继承过来的,对计算机工程方面的技术反而不需要太多了解。
于是,我进入了华罗庚班学习数学。还加入了新生的物理社团——格物致知社,因为听说科大的物理专业很好,就不想放弃这个优势条件。但我没有参加 ACM,因为我当时看到网络上一些 “码农” 的自嘲,不想再编程序了(我当时不知道码农跟码农也是有很大差别的);也听说科大计算机专业的排名不是很靠前,感觉在科大学计算机,还不如当初选择上海交大呢(这是被沉没成本束缚,掉进了思维陷阱)。
如果我一直在华罗庚班老老实实地学数学,也许我会成为学霸,在美帝过着幸福的读博生活。可惜,在格物致知社,我遇到了一群有理想有追求的小伙伴,搭建了学习资料共享和物理讨论的论坛,我也因此阴差阳错地掉进了 Linux 的坑。现在回首四年前搭建的论坛,这些星空图片和物理图像仍然引我遐想:我抛弃诱人而深邃的自然科学而掉进计算机的坑,是偶然的,还是冥冥中存在某种必然?
数学与计算机的抉择
由于没有刷吉米多维奇,我一直没学会积分。大一下学期的数学分析,很多内容是以积分为基础的,我已经感觉有些吃力了。那次期中考试,我由于睡过头,迟到了一个小时,但我做了一个小时的题,到交卷的时间,剩下的题就基本不会做了;助教带我到他办公室给我延长了一个小时时间,但那一个小时我愣是只做出了一道题。这种头脑一片空白的失落感,是我之前从未遇到过的。(当然大二挂科的数理方程考试比这种感觉更甚,所以说大学要挂科还是蛮困难的)
大一下学期,数学分析的史济怀老师利用最后一次习题课的时间回答我们的问题。我问:“我想从事理论计算机方面的研究,但对连续数学不是很感兴趣,觉得离散数学还比较好玩,但现在数学课学习的都是连续数学,是不是跟理论计算机关系不大呢?我是不是应该转计算机专业?” 史老师说,连续数学是基础,离散数学的很多问题不方便处理,要用连续数学来逼近(这一点我现在越来越有感触了),所以连续数学是必须学好的。至于学数学专业还是计算机专业,要看你个人的兴趣。
学习连续数学的失败,让我开始怀疑自己的能力。大一快结束的时候,我去线性代数老师的办公室,咨询我是否适合数学专业。他说,并不是有 “天分” 的人才能学好数学,没有谁适合或者不适合数学研究,只要认真学、下功夫,这些东西都能学会的。老师的话是对的。现在想来,还是因为搞社团和网站分心太多,如果当年静下心来好好刷题,也许能把连续数学学好呢。
不过,经过了一年的荒废,我的数学优势已然转变为劣势,对计算机的兴趣却不断上升——计算机总能给我即时反馈的满足感,而很少有搞不定的东西。不管是搭建 LAMP 服务器,还是让 Discuz! 论坛支持 LaTeX,还是 PDF、Word 文档在线预览,都是通过 Google 和各种文档资料,在一周左右的时间里能折腾出来的。但数学问题却很难搜索到答案,寝室里又没有其他人学数学专业,遇到难题的时候挫败感很强。
暑假的时候,我还觉得有跟上数学系节奏的希望。大二开学,我拿到数学分析和常微分方程的教科书,看到里面那些令人恐怖的数学符号,就感觉此地不宜久留了。在转专业的申请上,我写的是 “由于兴趣改变”,不过真实原因是数学学不下去了……真是一件悲伤的事情。到计算机系之后,还是有一些数学和物理课的,不过这些课程相比数学专业和物理专业简单了很多,学起来就没有那么吃力了。
计算机:戴着镣铐跳舞
数学专业的一个好基友跟我说,数学是研究世界的本质,自然科学是研究上帝的意志,而计算机则是揣摩屌丝人类的意志。计算机的很多设计没有为什么,只是某个屌丝程序员或者研究生廉价劳动力在赶 deadline 的时候拼凑出来的。他今早吃饱了喝足了,就给你设计好看点;要是早上没睡醒或者跟女朋友吵了一架,那就把无尽的痛苦留给子孙后代了。想到这里,顿时感觉码农的逼格降低了好多,我们所做的事情都是戴着路径依赖的镣铐跳舞。
从探索自然的科学家降级为一个戴着镣铐跳舞的码农,其实是认识到了自己的卑微和渺小。2011 年 6 月,《中国计算机学会通讯》刊出了一则对图灵奖得主姚期智的访谈,尽管我转专业的时候没有看到这篇文章,但我当时恰巧也是这么想的,摘录如下。
问:您于 1972 年在哈佛大学获得了物理学博士学位。但您并没有从事物理学研究而改变了自己的专业,去伊利诺伊大学香槟分校学习计算机专业,并于 1975 年获得了计算机博士学位。当年您为什么要改变自己的专业呢?计算机的魅力何在?
姚期智:我那时学的是理论物理学。当时大家觉得要了解宇宙的基本物理方向,尤其用数学推导出来,都是比较悲观的。我当时感觉物理学研究与我原来想象的有些不同。恰在那个时期计算机刚刚兴起,有很多有意思的问题等着解决。当时计算机也不像现在有专业不专业之分。我恰巧遇上这一学科,我认为这个选择是对的,也很顺利。
关于姚期智还有一个传言,说是 “我做理论物理的时候觉得太难了,但转到计算机之后就发现没有什么难题了”。这里面的原因我觉得是这样的。自然科学面对的是上帝的创造,而计算机科学面对的是人类的创造。如果我对一个人类的创造感觉不爽,比如我发现现在的关系型数据库限制太多,我可以造一个非关系数据库,创造一个新的轮子出来。但如果我对一个物理定律不爽,我不可能向上帝祈祷,“光速为什么这么快,能不能慢一点,等我看清楚?”
也就是说,尽管搞计算机的人是在戴着镣铐跳舞,但可以在不同的镣铐之间作出选择(比如选择 Windows 或者 Linux,选择 x86 或者 ARM)。选择的多样性使领域变得细化,大家不是在追求相同的目标、解决相同的问题,而是在创造问题并尝试解决。在计算机研究中,最重要的事情是发现问题,当问题被形式化后,解决一般只是时间的问题,因为计算机领域不要求 “完美” 的解答,只要给出在现实中可以接受的解决方案即可,有各种各样的方法做妥协和折中。
码农与科学家
相比计算机科学,我其实更倾向的是计算机技术,也就是那些已经成熟、能够用来改变世界的工程技术。搞技术相比搞研究,免除了很大的一个烦恼:对数学家的妒忌。各种研究领域之间的鄙视链,上一节开头已经说过了。不仅是计算机领域的科学家,各种领域的科学家为了让自己的工作看起来更 “专业” 一些,往往喜欢把很浅显的道理用严谨而生涩的数学公式表达出来,最好再用上些拉丁字母。这种 “数学情结” 使得科学家们倾向于解决易于形式化的问题,而非真正需要的问题。因此,很多研究基础科学的科学家自嘲说,他们事实上不是在为 “人类” 做贡献,而是在满足自己的好奇心。
码农(攻城狮,程序猿/媛)则与科学家有本质的区别。他们跟建筑师、设计师一样,是在遵循一定的科学原理和成本控制的前提下,发挥自己的想象力创造东西。也就是说,码农不再需要妒忌数学家了。不同于建筑师,码农能够更自由地发挥想象力。建一座大楼需要很多钱,一个建筑师纵使再有想法,没有工程项目,也不可能看到自己的设计付诸实现。但计算机行业较低的进入门槛和信息的低复制成本使得 “屌丝逆袭” 成为可能,也就是一个人可以凭借自己的力量实现一个不错的想法,如果产品受到欢迎的话,它会以指数的速度传播发展。
我不希望自己的发展受到环境限制,也就是不希望我的发展轨迹被限制在某个预设的常规路线上。我希望能够自由地实现自己的想法,并把这个想法推广出去。作为一个屌丝,只有低门槛的互联网行业能够实现这个梦想。互联网是 “手工业者” 的时代,也就是互联网发展的主要动力不是大公司和大权在握的决策者,而是千千万万有想法的年轻创业者,他们中的一部分脱颖而出,刷新着人类的生活方式和互联网的运行模式。顺便说一句,开源硬件运动和 3D 打印技术正在悄然改变制造业,随着进入门槛(制造成本)和物流成本的降低,制造业也将迎来 “手工业者” 的春天。
说到自由,很多码农一定会跳出来:你 too young too simple 了!那是因为我们对 “找工作” 的理解不同。从大学到公司,表面上只是个头衔的变化,但事实上地位已经从主人变成了仆人。上大学我们是交了学费的,某种意义上说学校是在为学生服务,为学生提供各种资源来帮助学生成长。但在公司是老板给我们付钱,我们在为公司服务。因此当我们说 “要找一份工作” 的时候,就暗示了自己要出售自己的知识和时间来换取公司的报酬。因此我对 “找工作” 的理解是 “找一家公司来实现自己的价值”,也就是利用公司的平台和资源来做有价值的事情。这个心态的转变可以让我们摆脱打工者的自我定位,追求自己真正想要的东西。
我转投计算机专业,本质上还是源于心态的转变。即使我没有加入格物致知社,后面少院学生会做网站的事情也会找到我。也就是说,这不是巧合而几乎是必然。我遇见计算机专业,遇见科大 LUG(Linux User Group),一系列机缘巧合,看起来像是小概率事件全让我碰上了,但就像生物进化一样,有一种 “自然选择的压力” 在幕后推动着这个进程。
总结一下我是如何掉进码农这个坑的:
- 少年科学家之梦的破碎
- 数学没学好,转投计算机
- 计算机研究是在戴着镣铐跳舞
- 计算机技术与研究的区别
- 自由实现想法的计算机行业
本科为什么选择计算机专业
下面谈谈如果打算成为码农,为什么要在本科阶段选择计算机专业。这一部分的框架是这样:
要系统地学习计算机专业课
- 不要重复低层次的项目实践
- 基础知识不会过时
选择其他专业,不如直接学计算机
- 其他专业课程有多少用
- 课余学习的潜在问题
- 毕业专业的现实因素
计算机专业课重要吗
有这么一种说法,码农的技术主要是通过实践习得,而不是通过正规的计算机课程,在 “理论指导” 下学会的。对于一些应用技术,确实是这样。但要脱离北大青鸟的水平,重复低层次的项目实践,帮助是不大的。一些人花了很多时间学习,但成绩总是不见提高,很可能是因为他们总是在重复已经学会的东西,而不敢挑战有困难的问题,在解决简单问题的时间陷阱里麻醉自己。那些整日做外包项目的码农也是一样,他们或者是没有兴趣挑战更难的东西,或者是没有机会挑战更难的东西,从而总是停留在那个层次。
要提高姿势水平,就要系统地学习该领域的基本原理,这就是计算机专业开设的专业课。程序员不懂数据结构与算法、操作系统、计算机网络、计算机体系结构,就像建筑师不懂力学,倒是能干活,但做设计的时候可能想不到一些潜在的问题而给以后带来无穷无尽的麻烦。计算机历史上的无数坏设计,大多是因为程序员的姿势水平不够高,而由于某种商业原因这个设计成为了行业标准。如果我们人人都提高一点鉴赏能力,整个计算机世界就会变得更加美好。鉴赏能力显然是要专业知识和经验作为支撑的。
当然,我读本科的时候,计算机学院的课程设置还是有很多可吐槽的,我在瀚海星云 BBS 上就发了一篇引起激烈口水战的文章《关于计算机学院部分非专业课程实行弹性选修的建议》。我发完帖那几天突然忙起来了,于是没有参加这场口水战。不过直到现在,我支持弹性选修的观点仍然没有改变。
有人也许说,计算机发展太快,学的东西很快就过时了。事实上,本科计算机专业课的大多数内容都是经过了至少二三十年的考验仍未过时,比如经典数据结构、UNIX 操作系统的设计、TCP/IP 网络、编译器的语法和语义分析,尽管在新的时代条件下出现了这样那样的问题,进行了这样那样的改进,但基本原理是不变的。容易过时的东西恰恰是那些通过实践习得的应用技术,比如 MFC 窗口编程、Java 的 Web 框架、Apache 服务器的配置,一旦技术不流行了,就又要赶紧充电了。
数理基础的迷思
很多优秀的程序员并非计算机专业出身,这似乎是个有力的反面论据。但我们应当看到,更多的优秀程序员是计算机专业(所谓 “科班”)出身。
从进入科大开始,我们就被灌输 “重视数理基础” 的观念。很多同学,包括大一的我,认为本科四年应该专心学习数学和物理,这样以后的发展是 “宽口径”、“有潜力” 的。在科学研究领域也许是这样的。但对计算机工程来说,恕我不才,我实在看不到实分析和四大力学有什么应用,或者能给我们的代码带来什么启发。
我们不应该把 “数理基础” 和 “选择数学或物理专业” 相混淆。大一大二不管是哪个专业,都要学一些数学、物理的基础课。然而数学或物理专业的后续课程,尤其是分了专业小方向之后的课程,就是进入那个专业领域研究的入门训练了。这些训练确实能给我们带来思维能力的提升,也确实能带来一些跨学科的灵感,但人的时间是有限的,投入这些时间成本的价值,相比直接学习计算机相关专业知识的价值,哪个更高呢?
我们不妨逆向思维一下:如果一个人将来打算从事物理学研究,那么本科学习计算机专业有多少帮助?学计算机专业的人编程能力会比较强,但他在最初几年需要恶补物理学的基础知识,开组会各种听不懂;日后他会逐渐发现,除了帮着实验室修电脑和架设主页方面可以让大家 Wow 一下以外,本科学的那些操作系统、编译原理、体系结构似乎都用不上了。也许最有用的课程是算法与数据结构,因为有了这个可以高效地处理数据——事实上数学和物理专业也需要学这门课,当然难度比计算机专业低多了。
有些同学会想,既然计算机专业比较 “简单”,我本科学习其他专业,课余时间学计算机,不行吗?毕竟现在网络上有这么多计算机的学习资源。这里有三个问题。第一,时间分配的问题。第二,自学没有督促,拖延症往往会犯(MOOC 确实有课程作业,不过学校学分的强制力可比 MOOC 证书大多了)。第三,大学的作用不仅仅是上课,结识朋友、交流思想也是很重要的,自己窝在寝室、图书馆看计算机课程,肯定不如身边有一群计算机专业的小伙伴。当然,对没有打定主意从事计算机行业的同学来说,这是个蛮不错的折中选择。
还有一个很现实的因素:求职面试的时候,毕业专业对很多面试官来说是重要的参考条件。计算机专业毕业,就意味着计算机基本原理的各个方面都至少达到了及格水平;而如果没有计算机专业的学位,就必须通过其他方式证明自己,或者是通过简历上的项目,或者是让面试官对你进行一次全方位的考查。一些编程能力很强的同学就是在专业这一项上被面试官鄙视,以致后面的表现都被打了折扣,血泪教训啊。
我思考要不要读博士的时候其实也考虑到了这个方面:如果我拥有一个网络方向的博士学位,那么我就会自动被认为是这方面的专家;如果我没有博士学位,那么就要花很多心思来证明自己在网络方向的能力。尽管证书、学历一类的东西往往为高水平的人所不齿,但既然有获得它的能力,为什么不给自己增加一个筹码呢?
写在最后
如果你希望站在信息时代的浪潮之巅,如果你希望自由地把想法变成现实,如果你怀揣屌丝逆袭、改变世界的梦想,选择计算机专业吧,你将不虚此行。身在曹营心在汉的朋友们,不要再在专业选择上徘徊、犹豫、浪费生命了,follow your heart。
写着写着我就有预感,这篇文章是一定会被喷的。就让暴风雨来得更猛烈些吧!