引用的链接均采用 CC BY-NC-SA 4.0 许可协议

计算机科学(Computer Science)到底学什么?

很多在校的CS学生入学一两年了,还不知道CS到底是什么,也很疑惑CS到底能学到什么?
看到身边很多读专科或者三本院校的学生,已经会很多的技术——比如用PHP做个网页、写个Android App等等,再加上各种IT培训机构、网站铺天盖地的洗脑——“一个月学会××,16K”……
自己连个简单的MFC小管理系统都写不出来,于是疯狂的在网上下载教学视频,学习各种牛逼的技术;认为学校教授的知识没有什么用处,出来什么也不会,甚至翘课。

什么是计算机科学

我们系统地看看,计算机科学到底是干什么的。

CS大体可以分成以下几个大领域:硬件、系统、软件、网络、计算理论、计算方法。

  • 硬件 —— 数字电路、集成电路、存储器、各种硬件设计和验证方法等。
  • 系统 —— 计算机架构(指令集、串/并行、网格、云端之类)、嵌入式、实时系统等。
  • 软件 —— 操作系统、虚拟机、编程语言、软件设计/开发/验证的工具和方法论等。
  • 网络 —— 计算机网络的架构、协议、组件、路径算法、性能分析等。
  • 计算理论 —— 可计算性、形式语言和自动机、密码、逻辑、算法分析等。
  • 计算方法 —— 数值计算、符号计算、并行计算、计算机图形学、人工智能、机器学习等。

你可以按这个提纲,查看你大学学习的课程,逐个了解一下CS是干什么的。但是有的学生认为:大学学的太杂,又不深入,出来能有什么用。这恰恰是中国大学教育与美国教育的不同。美国教育大多是先让学生发现自己的兴趣所在,再选择自己的倾向方向;而国内教育多是每个学生学习一样的课程,研究生再选择自己的方向,深入研究。

然而很多的大学生醉心于炫酷的Web界面、功能齐全的手机App,那么这些算哪个领域呢?

答案是,哪个也不属于。你看整个计算机科学,研究的都是非常底层或基础的东西,与你说的“现实中的产品开发”,基本上是没有关系的。即使有些名称看着和开发有关,其实也不是一回事。比如这里所说的“编程语言”,就好比语言学,是研究各种语言结构的,而不是教你用语言写作的。就像天文学不是教你制造望远镜的,机械动力学不是教你开挖掘机的。

实际上,国内大学极少有独立的CS专业,都是加个“与技术”,全称叫“计算机科学与技术”。顾名思义,这就包括计算机科学、计算机技术两部分。你想学的这些,就属于那个“与技术”。你想学的是技术方向,学校教授的是科学方向的知识,仅仅只涉及简单的计算机技术,远远达不到工作的要求,这个就是你困惑的根本原因。另外,大学精英教育的目的是:发掘人才、培养人才、提高科学与文化素养。而你所醉心的——是技能,这不是本科院校所给你的,那是职业学校或者培训机构所给你的。

写到这里,我想你应该已经理解了:计算机科学是干什么的,以及为什么在学校学完了还是做不出来网站和APP。

CS大学生应该怎么办

当然,每个人的发展目标不同,人生道路也不同,世界上没有那么多科学家,也培养不出那么多科学家。大学生可以选择走技术路线,也可以选择继续研究真正的科学。


接下来,你可能会有这样的问题:

  1. 如果我想搞技术,那么学习科学部分还有没有必要?
    我的观点是:这不是有没有必要的问题。
    这两者之间的区别,是追求的目标不同:科学追求尽量深入,探索原理;而技术追求尽量封装,提高效率。各种高级技术都是力求隐藏细节,以提高效率。
    而你选择学习内容的标准,就看它能否显著提高你的生产力。有些技术高度依赖底层细节或原理,造成了效率瓶颈,就应该学,并且学这些底层原理(基础知识)更有利于你对技术的理解,所谓知其然知其所以然。
    具体到Web、APP开发,最能提高你生产力的,就是那些前/后端框架和脚本,学完了你马上就能做产品,而不是《计算机程序的构造和解释》什么的。
    当然,可能会有人告诉你,你要学挖掘机,一定要先学机械动力学,否则你就没有内功,永远不可能成为挖掘机高手,机械动力学才是真正的知识,只是现在社会太浮躁,没人愿意花时间学。然而,我并没否认机械动力学的价值,它能让你把挖掘机分析得头头是道,甚至设计制造挖掘机。但是,如果你的目标是开挖掘机,那你就不该这样入门,因为这是两回事。我曾经看过一个培训机构老师的故事,人家高中没毕业,就去网吧当网管了,结果不满足现状,决定自学软件开发,人家用了不到一年的时间,就把.NET搞的很牛逼。可这一年人家的付出是常人难以坚持的,人家为了控制自己出门,把眉毛剃了,等技术学会了,眉毛也长出来了。你说他科学底蕴很深厚?
    还是那句话:追求不同,方法不同;努力不同,结果不同。

  2. 如果我想搞科学研究,那么我还需要特别牛的技术吗?
    这要看你的精力和兴趣了。有的人醉心于科学研究,人家仍然对炫酷的技术感兴趣,享受做出产品的乐趣,并且人家努力、专心,两样搞的都很牛。如果你没有那么多的精力把两样都搞的很牛。你可以选择其中一样,然而你又能力不够,又想两手抓,那我劝你——量力而为。

  3. 我现在应该如何提高技术水平?
    学技术的关键思路是两点:一个是模仿,一个是边实践边学。比如说学挖掘机,首先你要知道基本操作,然后看别人是怎么开的,最后自己上去开。遇到问题,比如跑偏了,你研究一下,挖掘无力,你再研究一下,弄明白了就继续开。具体到你说的做网站为例,首先你可以看看《Head First HTML5》和《Head First PHP & MySQL》,学会基本操作。然后找一些作品,比如WordPress,和它的一些经典模板,去看别人是怎么做的。然后,你就可以自己设计一个小网站, 尝试把它做出来像本网站一样 千万不要等什么都学会了再开始做。做的过程中,你遇到什么障碍,再有针对性地去学习和解决。这种边实践边学习的模式,才是学技术的正确思路,这跟搞理论研究的思路是不一样的。

如果你是大学生,不想考研,想以后毕业更有竞争力,那么你不必过分在意学习成绩,可以选择在成绩良好的基础之上,精钻技术,成为技术牛人。如果你想上研究生,专心搞研究,以后想读博士,那么你需要成绩优异,但是你又对技术感兴趣,那么你可以选择在学校的时候,主攻计算机科学部分,而在假期努力学习计算机技术部分。我就是这么做的,上次暑假我一天7、8个小时在网上看视频,读文档学习Web,不到一个月,便可以独立的开发小型的Web程序了。如果你想上研究生,只是为了日后找个更好的工作,那么我认为你应该专心于学习,等到研究生的时候,多增加自己实习的机会,这样才能找到更好的工作,由于我仍然是个普通本科生,还没有读研,没有切身的体会,不好多谈。

我在知乎上看见别人说过这样的经历:面试一个前端,问他最喜欢什么书,他说TAOCP,连QQ签名都是“只盼TAOCP出第五卷”。然后问这对前端有何帮助,他说这是内功。后来考查写代码,他写不出来,说这个不是内功,而他擅长内功。然后向他提问 证明一下辗转相除法,他又强调他擅长的是计算机内功,而不是数学。但其实这个证明,就是TAOCP第一卷、第一章的第一道例题。

所以说学习不可浮躁,无论是搞技术,还是搞研究。